 RN
     A=2 !COMMAND.OUT
     A=16  !DATA.OUT
     A=D   !DATA.OUT
     A=E   !DATA.OUT
     A=1   !DATA.OUT
     !ERROR.CHECK IF CY=1 RETURN
     A=$12 !COMMAND.OUT
     C=$10 !READ.DATA
     CY=0
     RET
;
;
;------------------------------
; 1TRACK WRITE ROUTINE
;
;  IN   HL = WRITE ADDRESS
;       D  = DRIVE NUMBER
;       E  = TRACK NUMBER
;
;  OUT  NO ERROR - CY=0
;       ERROR    - CY=1
;------------------------------
;
WRITE
     !DATA.CHECK IF CY=1 RETURN
     A=$11 !COMMAND.OUT
     A=$10 !DATA.OUT
     A=D   !DATA.OUT
     A=E   !DATA.OUT
     A=1   !DATA.OUT
     C=$10 !WRITE.DATA
     !ERROR.CHECK
     RET
;
;
;-------------------------------
;
READ.DATA
     DO
       DO B=$80
         A=$B PORT(CM)=A
         DO
           A=PORT(PC) A=A.&.1
         UNTIL NZ
         A=$A PORT(CM)=A
         A=PORT(PA) (HL+)=A
         A=$D PORT(CM)=A
         DO
           A=PORT(PC) A=A.&.1
         UNTIL Z
         A=PORT(PA) (HL+)=A
         A=$C PORT(CM)=A
       UNTIL DEC(B)=0
     UNTIL DEC(C)=0
     RET
;
;
WRITE.DATA
     DO
       DO B=$80
         DO
           A=PORT(PC) A=A.&.2
         UNTIL NZ
         A=(HL+) PORT(PB)=A
         A=9 PORT(CM)=A
         DO
           A=PORT(PC) A=A.&.4
         UNTIL NZ
         A=(HL+) PORT(PB)=A
         A=8 PORT(CM)=A
         DO
           A=PORT(PC) A=A.&.4
         UNTIL Z
       UNTIL DEC(B)=0
     UNTIL DEC(C)=0
     RET
;
;
COMMAND.OUT
     AF<>AF'
     A=$F PORT(CM)=A GOTO D0001
DATA.OUT
     AF<>AF'
D0001
     DO
       A=PORT(PC) A=A.&.2
     UNTIL NZ
     A=$E PORT(CM)=A
     AF<>AF'
     PORT(PB)=A
     A=9 PORT(CM)=A
     DO
       A=PORT(PC) A=A.&.4
     UNTIL NZ
     A=8 PORT(CM)=A
     DO
       A=PORT(PC) A=A.&.4
     UNTIL Z
     RET
;
;
DATA.INPUT
     A=$B PORT(CM)=A
     DO
       A=PORT(PC) A=A.&.1
     UNTIL NZ
     A=$A PORT(CM)=A
     A=PORT(PA)
     AF<>AF'
     A=$D PORT(CM)=A
     DO
       A=PORT(PC) A=A.&.1
     UNTIL Z
     A=$C PORT(CM)=A
     AF<>AF'
     RET
;
;
ERROR.CHECK
     A=6 !COMMAND.OUT !DATA.INPUT A=A.&.1
     IF Z THEN CY=0 RETURN
     CY=1 RETURN
;
;
DATA.CHECK
     A=E IF A>=80 THEN CY=1 RET
     A=D IF A>=6  THEN CY=1 RET
     CY=0 RET

SPRITE.BUFF    DEFS 260

 T
     DE=(M.NEXT.POINT) HL=(M.BUFF.POINT) (HL+)=E (HL+)=D
     (M.BUFF.POINT)=HL
     A=(M.COUNT) A+ (M.COUNT)=A
     RET

M.CMP
     HL=(M.BUFF.POINT) HL-- HL-- E=(HL+) D=(HL) HL=(M.NEXT.POINT)
     HL=HL-DE IF Z THEN CY=1 RET
     CY=0
     RET

W.TRACK.EX     !(00)   ;EXIT FLAG
W.DIREC        !(0000) ;SAVE BC
MESS.OUCH.MIKATA         RET
MESS.BATTLE              RET
MESS.MOVE.LIMIT          RET


VRAMSTAC       EQU $BFFF
                ; L R -- Left & Right
WINTB1         !(F81F)
WINTB2         !(0420)
WINTB3         !(0660)
WINTB4         !(0180)
WIN.MODE.0     !(FF3F 0120 0120 0120 00)
WIN.MODE.1     !(F81F 0420 0660 0180 00)
WIN.MODE.2     !(F81F E42E EE7E EFEE EE)
WIN.MODE.3     !(F81F A82A AC6A AAAA AA)
WIN.MODE.4     !(F81F 8828 8C68 8A88 88)
WIN.MODE.5     !(F81F FC3F FE7F FFFF FF)
VRAMDOWN       EQU $50
GRAMSTART      EQU $C000
WIN.STAD       !(0000