ETH_STATUS EQU $FF68 ETH_DATA EQU $FF69 PUTC: MACRO ld a, \1 call putc ENDM PUTS: MACRO ld hl, \1 call puts ENDM PUTSI: MACRO push hl call putsi db \1, 0 pop hl ENDM PUTSIL: MACRO push hl call putsi db \1, 13, 10, 0 pop hl ENDM PUTHEX: MACRO ld a, \1 call puthex ENDM SECTION "config", HOME[$0] myMAC: db $12, $34, $56, $78, $9A, $00 myIP: db $0A, $00, $00, $02 myMask: db $FF, $00, $00, $00 myGW: db $0A, $00, $00, $01 SECTION "boot", HOME[$100] jr start nop nop db $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83 ;<<< no $00,$c3,$50,$01 db $00,$0C,$00,$0D,$00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6 db $DD,$DD,$D9,$99,$BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F db $BB,$B9,$33,$3E ; Standard Nintendo DO NOT CHANGE... db "GB Ethernet " ; Cart name 16bytes db $00,$00,$00 ; Not used db $00 ; Cart type ROM Only db $00 ; ROM Size 32k db $00 ; RAM Size 0k db $cf,$08 ; Maker ID Matthew Johnson db $01 ; Version =1 db $87 ; Complement check (Important) db $ff,$ff ; Cheksum, fix this if you are going to start: ld sp, $D800 call zerobss PUTSIL "Ethernet test ROM" .lp: xor a ; Reset state machines ld [ETH_STATUS], a ld a, [ETH_STATUS] ; Load current status ld [$FF51], a and $02 ; New packet? call nz, getpacket jr .lp zerobss: ld hl, bssstart ld bc, bssend - bssstart .lp: ld a, b or c ret z dec bc xor a ld [hli], a ld a, h jr .lp getpacket: ld a, [ETH_DATA] ld b, a ld a, [ETH_DATA] ld c, a push bc ld hl, packet .cplp: ld a, b or c jr z, .done dec bc ld a, [ETH_DATA] ld [hli], a jr .cplp .done: pop bc PUTSI "getpacket: Got " PUTHEX b PUTHEX c PUTSIL " byte packet from hardware." ld hl, $D000 call ether_input ret ether_input: push hl PUTSI "ether_input: Packet to " PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTSI " from " PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTC $3A PUTHEX [hli] PUTSI " protocol " PUTHEX [hli] PUTHEX [hli] PUTSIL "." pop hl ; Verify the destination MAC. push hl ld de, myMAC ld c, $06 .maclp: ld a, [de] cp [hl] jr nz, .notus inc de inc hl dec c jr nz, .maclp ; Done? Then it was to us! jr .us .notus: ; Was it to broadcast? pop hl push hl ld c, $06 .bclp: ld a, [hli] cp $FF jr nz, .notbc dec c jr nz, .bclp .us: PUTSIL "ether_input: It's to us!" ; Which protocol does it belong to? pop hl ld b, $00 ld c, 12 add hl, bc ; Skip source and dest MAC. ld a, [hli] cp $08 jr nz, .unknownproto ld a, [hli] cp $06 jr z, .arp cp $00 jp z, .ip jr .unknownproto .notbc: pop hl PUTSIL "ether_input: Not addressed to us and not broadcast." ret .unknownproto: PUTSIL "ether_input: Unknown protocol; dropping" ret .arp: PUTSIL "ether_input: ARP packet" call arp_input ret .ip: PUTSIL "ether_input: IP packet" call ip_input ret arp_input: ret ip_input: ret SECTION "ethdata", BSS bssstart DS 0 packet DS 1552 bssend DS 0 ; SERIAL ROUTINES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SECTION "serial", HOME putc: push af .waitport: ld a,[$FF53] and $01 jr nz,.waitport pop af ld [$FF52],a ret puts: ld a, [hli] cp $00 ret z call putc jr puts EX_SP_HL: MACRO push de di add sp, 2 pop de push hl ld l, e ld h, d add sp, -2 ei pop de ENDM putsi: pop hl push af push bc push de .lp: ld a, [hli] or a jr z, .done call putc jr .lp .done: pop de pop bc pop af push hl ret puthex: ; Put two hex nibbles to the serial console. push bc push hl push af swap a and $0F ld hl,hex ld b,0 ld c,a add hl,bc ld a, [hl] call putc pop af and $0F ld hl,hex ld c,a add hl,bc ld a, [hl] call putc pop hl pop bc ret hex: db "0123456789ABCDEF"