Archipelago/worlds/ladx/LADXR/patches/bank3e.asm/link.asm

90 lines
1.8 KiB
NASM

; Handle the serial link cable
#IF HARDWARE_LINK
; FF> = Idle
; D6> = Read: D0><[L] D1><[H] [HL]>
; D9> = Write: D8><[L] D9><[H] DA><[^DATA] DB><[DATA]
; DD> = OrW: D8><[L] D9><[H] DA><[^DATA] DB><[DATA] (used to set flags without requiring a slow read,modify,write race condition)
handleSerialLink:
; Check if we got a byte from hardware
ldh a, [$01]
cp $D6
jr z, serialReadMem
cp $D9
jr z, serialWriteMem
cp $DD
jr z, serialOrMem
finishSerialLink:
; Do a new idle transfer.
ld a, $E4
ldh [$01], a
ld a, $81
ldh [$02], a
ret
serialReadMem:
ld a, $D0
call serialTransfer
ld h, a
ld a, $D1
call serialTransfer
ld l, a
ld a, [hl]
call serialTransfer
jr finishSerialLink
serialWriteMem:
ld a, $D8
call serialTransfer
ld h, a
ld a, $D9
call serialTransfer
ld l, a
ld a, $DA
call serialTransfer
cpl
ld c, a
ld a, $DB
call serialTransfer
cp c
jr nz, finishSerialLink
ld [hl], a
jr finishSerialLink
serialOrMem:
ld a, $D8
call serialTransfer
ld h, a
ld a, $D9
call serialTransfer
ld l, a
ld a, $DA
call serialTransfer
cpl
ld c, a
ld a, $DB
call serialTransfer
cp c
jr nz, finishSerialLink
ld c, a
ld a, [hl]
or c
ld [hl], a
jr finishSerialLink
; Transfer A to the serial link and wait for it to be done and return the result in A
serialTransfer:
ldh [$01], a
ld a, $81
ldh [$02], a
.loop:
ldh a, [$02]
and $80
jr nz, .loop
ldh a, [$01]
ret
#ENDIF