+;--------------
+;---- SEND ---- 8 bits in a
+;-------------- destr:bcdehl
+send:
+ halt
+ cal Qsend
+ ret nc
+ jr send
+
+Qsend:
+ 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 ;raise one, ok to raise other
+ 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
+ ret ;nc=ok
+
+;--------------
+;---- RECV ---- 8 bits to a
+;-------------- destr:bcdehl
+receive:
+ cal Qreceive
+ ret nc
+ jr receive
+
+Qreceive:
+ ld b,8 ;bits to receive
+receiveloop:
+ ld de,TIMEOUT
+WaitRecBit:
+ cal checklink
+ scf
+ ret z ;both low = error
+ cp %11
+ jr z,WaitRecBit ;both on = nothing sent
+recvbit:
+ rra ;received bit in cf
+ ld a,%10
+ ld d,D0LD1H
+ jr c,savebit ;lower white as well
+ rra ;ld a,%01
+ ld d,D0HD1L ;lower red
+savebit:
+ rr c ;save bit
+ ld (AckBit),a
+ ld a,d
+ out (7),a ;lower other (both low)
+ ld de,TIMEOUT
+waitackrecv: ;same will be raised again by other calc
+ cal checklink
+ cp 0
+AckBit =$-1
+ 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