cal _puts
cal receive
cp WormVersion
- jp nz,linkiniterror
+; jp nz,linkiniterror
cal send
+ jr c,linkiniterror
; cal sendname
; cal receivename
ld a,$18
- jr nc,multiplayer
+ jr multiplayer
linkiniterror:
pop hl
cal send
pop hl
pop bc
- dnz sendnameloop
+; dnz sendnameloop
ret
receivename:
ld hl,worm2+name
pop bc
ld (hl),a
inc hl
- dnz recvnameloop
+; dnz recvnameloop
ret
client:
cal Qreceive
jp c,linkiniterror
cp WormVersion
- jp nz,linkiniterror
+; jp nz,linkiniterror
; cal receivename
; cal sendname
Exit:
ld sp,0 ;pop all
SpSave = $-2
+ ld a,D0HD1H
+ out (7),a
cal _clrWindow
ld hl,txtGO
cal _puts
TIMEOUT = $1000
-receive:
- cal GET_KEY
- cp K_EXIT
- jp z,LinkBreak
+checklink:
+ pop hl
+ dec de
+ ld a,d
+ or e
+ jr z,LinkFailed
+
+ ld a,$BF
+ out (1),a
+; nop \ nop
+ in a,(1)
+ psh af
+ ld a,%11111111
+ out (1),a
+ pop af
+ bit 6,a
+ jp z,Exit
+
in a,(7)
and %11
-; jr z,LinkBreak
+ jp (hl)
+
+;--------------
+;---- SEND ---- 8 bits in a
+;-------------- destr:bcdehl
+send:
+ ld c,a
+ ld b,8+1 ;bits to send
+ jr checksend
+sendloop:
+ rr c ;bit to send (in cf)
+ ld a,D0LD1H ;0: lower white
+ jr nc,sendbit
+ ld a,D0HD1L ;1: lower red
+sendbit:
+ out (7),a ;lower one (send bit)
+ ld de,TIMEOUT
+waitacksend:
+ cal checklink ;other calc must lower other whire
+ jr nz,waitacksend
+checksend:
+ ld a,D0HD1H ;ok to raise both
+ out (7),a
+ ld de,TIMEOUT
+finishsend:
+ cal checklink
+ cp %11 ;both raised (by other calc)
+ jr nz,finishsend
+ dnz sendloop ;repeat for all bits
+ .db $F6 ;or NN ;nc
+LinkFailed:
+ scf ;c=error
+ ret
+
+;--------------
+;---- RECV ---- 8 bits to a
+;-------------- destr:bcdehl
+receive:
+ halt ;&&&
+ ld de,TIMEOUT
+ cal checklink
+ jr z,receive
cp %11
jr z,receive
- ld b,8
- cal ReceiveCont
+ cal Qreceive
jr c,receive
ret
Qreceive:
- ld b,8
+ ld b,8 ;bits to receive
receiveloop:
ld de,TIMEOUT
WaitRecBit:
- cal CheckLink
- jr z,LinkFailed
+ cal checklink
+ jr z,LinkFailed ;both low = error
cp %11
- jr z,WaitRecBit
-ReceiveCont:
- sub %10
+ jr z,WaitRecBit ;both on = nothing sent
+recvbit:
+ rra ;received bit in cf
ld a,%10
- ld d,D0LD1H ;01
- jr c,ReceiveLow
+ ld d,D0LD1H
+ jr c,savebit ;lower white as well
rra ;ld a,%01
- ld d,D0HD1L ;10
-ReceiveLow:
- rr c
+ ld d,D0HD1L ;lower red
+savebit:
+ rr c ;save bit
ld (AckBit),a
ld a,d
- out (7),a
+ out (7),a ;lower other (both low)
ld de,TIMEOUT
-WaitAckRec:
- cal CheckLink
+waitackrecv:
+ cal checklink
+; jr z,waitackrecv ;wait for one to go high
cp 0
AckBit =$-1
- jr nz,WaitAckRec
- ld a,D0HD1H ;11
- out (7),a
- ld d,4
-WaitReadyRec:
- dec d
- jr z,ReadyRec
- in a,(7)
- cp %11
- jr nz,WaitReadyRec
-ReadyRec:
- dnz receiveloop
- ld a,c
- ret
-
-LinkBreak:
- ld a,D0HD1L
- out (7),a
- jp Exit
-
-send:
- ld c,a
- ld b,8+1
- jr SendAcked
-sendloop:
- rr c
- ld a,D0LD1H ;%01
- jr nc,SendLow
- ld a,D0HD1L ;%10
-SendLow:
- out (7),a
- ld de,TIMEOUT
-WaitAckSend:
- cal CheckLink
- jr nz,WaitAckSend
-SendAcked:
- ld a,D0HD1H ;%11
- out (7),a
- ld de,TIMEOUT
-WaitReadySend:
- cal CheckLink
- cp %11
- jr nz,WaitReadySend
- dnz sendloop
- ld a,c
- ret
-
-LinkSuccess:
- .db $F6 ;or NN (skip scf)
-LinkFailed:
- scf
- ld a,c
+ jr nz,waitackrecv
+ ld a,D0HD1H
+ out (7),a ;raise both
+ dnz receiveloop ;repeat for all bits
+ or a ;nc
+ ld a,c ;a=byte received
ret
-CheckLink:
- pop hl
- dec de
- ld a,d
- or e
- jr z,LinkFailed
-
- ld a,$BF
- out (1),a
-; nop \ nop
- in a,(1)
- psh af
- ld a,%11111111
- out (1),a
- pop af
- bit 6,a
- jr z,LinkBreak
-
- in a,(7)
- and %11
- jp (hl)
-
;-----------------------------
;---------- levels -----------
;-----------------------------