A82: My link routines.. what's wrong?


[Prev][Next][Index][Thread]

A82: My link routines.. what's wrong?




Here are the routines I wrote a while ago which worked on both the 85 and
82.  These fail when the batteries are low.  Is there any way to make them
more reliable?

;Based on routines by Pascal Bouron
;and by Jimmy Mrdell

;*****
SendBytes:
;IN  : hl=(first byte),
;      bc=# of bytes to send
;      e=1 (wait for euit key)
;      e=0 use timer
;OUT : if carry then NOT SENT,
;      destroyed: BC, DE, HL, A
;*****
  ld a,(hl)
  push hl
  call SendByte
  pop hl
  ret c
  inc hl
  dec bc
  jr nz,SendBytes
  or a
  ret

;*****
ReceiveBytes:
;IN  : hl=(first byte),
;      bc=# of bytes to receive
;OUT : if carry then NOT RECEIVED,
;      destroyed: BC, DE, HL, A
;*****
  call ReceiveByte
  ret c
  ld (hl),a  
  inc hl
  dec bc
  jr nz,ReceiveBytes
  or a
  ret

;*****
SendByte:
;IN  : A=byte to send
;OUT : if carry then NOT SENT,
;      destroyed: HL, DE, BC, A
;*****
  ld hl,30000		;Timer
  ld b,8		;bits to send
  ld c,a		;save byte to send in c
  ld a,$C0
  out (7),a		;11=ready to send
WaitSend:
  call TestON
  in a,(7)
  and 3
  cp 3
  jr nz,WaitSend		;if calc ready (11), send bit
CalcBit:
  srl c			;push bit to send into carry
  jr nc,SendZero
  ld a,$E8		;set bit to 0
  jr SB_SetPort
SendZero:
  ld a,$D4		;set bit to 1
SB_SetPort:
  out (7),a		;write bit to port
WaitNextSend:
  call TestON
  in a,(7)
  and 3
  jr nz,WaitNextSend	;Wait for port=00 (means bit was recieved
  ld a,$C0
  out (7),a		;set local to 11 (ready to send next)
  djnz WaitSend		;if more bits, send another
  or a			;carry=0
  ret			;return success

TestON:
  ld a,e
  cp 0
  jr z,DoCountdown
  call GET_KEY
  cp K_EXIT
  ret nz
  pop hl
LinkFailed:
  ld a,$C0
  out (7),a		;Make sure port is off
  scf
  ret
DoCountdown:
  dec hl
  ld de,0		;e is set to 0 again (but already was 0)
  call CP_HL_DE
  ret nz
  pop hl
  jr LinkFailed


;*****
ReceiveByte:
;IN  : Nothing
;OUT : a=received byte,
;      if carry then NOT RECEIVED,
;      destroyed: DE, BC, A
;*****
  ld e,0
  ld b,8
  ld a,$C0
  out (7),a		;set port to 11 (ready to recieve)
RB_Wait:
  dec e
  jr z,LinkFailed
  in a,(7)
  and 3
  cp 3
  jr z,RB_Wait		;if remote not 11 then get the bit
RB_GetBit:
  cp 2
  jr z,RB_GetZero
  scf
;  rra			;Push sent bit into carry
  rr c
  ld a,$D4
  jr RB_WaitStop
RB_GetZero:
  or a
  rr c
  ld a,$E8		;will aways give other calc 00
  out (7),a
RB_WaitStop:
  dec e
  jr z,LinkFailed
  in a,(7)
  and 3
  jr z,RB_WaitStop	;wait for remote = 11
  ld a,$C0
  out (7),a
  djnz RB_Wait
  ld a,c
  or a			;carry=0 (success)
  ret


I'd rather not rely on any ROM routines because I want to be able to
easily port this game.
Thanks in advance for any help.

-Humberto Yeverino Jr.