+ ; First, verify that this is an ARP packet that we can handle.
+ ld c, 7
+ ld de, .expectedarp
+.cklp: xor a
+ cp c
+ jr z, .ckdone
+ ld a, [de]
+ cp [hl]
+ jr nz, .badarp
+ inc de
+ inc hl
+ dec c
+ jr .cklp
+.ckdone:
+ ld a, [hli]
+ cp 1
+ jr z, .req
+ cp 2
+ jp z, .resp
+.badarp:
+ PUTSIL "arp_input: Unknown protocol hardware or request"
+ ret
+.expectedarp:
+ db $00, $01, $08, $00, $06, $04, $00
+
+.req:
+ PUTSIL "arp_input.req: Request"
+ ; Is it asking about us?
+ push hl
+ ld b, 0
+ ld c, $10 ; SHA + SPA + THA
+ add hl, bc
+ ld de, myIP
+ ld c, 4
+.iplp: ld a, [de]
+ cp [hl]
+ jp nz, .notourip
+ inc de
+ inc hl
+ dec c
+ jr nz, .iplp
+ PUTSIL "arp_input.req: Aimed at us."
+ pop hl ; Now synthesize a response packet.
+ push hl
+ dec hl
+ ld a, $02 ; Reply!
+ ld [hli], a
+ ld d, h
+ ld e, l
+ ld hl, 10 ; SHA + SPA
+ add hl, de ; Now DE points at SHA, and HL points at THA
+ ld c, 10
+.dcl: ld a, [de]
+ ld [hli], a
+ inc de
+ dec c
+ jr nz, .dcl
+ pop hl ; HL now points at SHA
+ ld de, myMAC
+ ld c, $06
+.mcl: ld a, [de]
+ ld [hli], a
+ inc de
+ dec c
+ jr nz, .mcl
+ ld de, myIP ; HL now points at SPA
+ ld c, $04
+.icl: ld a, [de]
+ ld [hli], a
+ inc de
+ dec c
+ jr nz, .icl
+ ld d, h
+ ld e, l ; HL now points at THA
+ ld hl, -32
+ add hl, de ; HL has now been backed up to the start of the ethernet header.
+ ld d, h
+ ld e, l ; DE now points at the dest
+ ld hl, 6
+ add hl, de ; HL now points at the source
+ ld c, $06
+.sdcl: ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .sdcl
+ ld hl, myMAC ; DE now points at the source
+ ld c, $06
+.smcl: ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .smcl
+ ld hl, -12
+ add hl, de ; HL now points at the start of the packet -- should be C000!
+ ld b, 0
+ ld c, 64 ; Minimum size packet; avoid transmitting a runt
+ call packet_send
+ PUTSIL "arp_input.req: sent response!"
+ ret
+.notourip:
+ PUTSIL "arp_input.req: Not aimed at us; ignoring."
+ pop hl
+ ret
+
+.resp:
+ PUTSIL "arp_input.resp: Response"