 ]AF
     RET

DRAW.B
     BC=(BAN.X) (CHR.LOC.X)=BC !XY.POINT (CHR.PUT.ADD)=HL
     DE=BAN.TB.1 (CHR.DATA.START)=DE A=1 (CHR.MODE)=A
     DO B=9
     [BC
      DO B=9
      [BC A=(DE+) (CHR.NO)=A !DRAW.CHR.1 HL=(CHR.PUT.ADD) BC=4 HL=HL+BC
       (CHR.PUT.ADD)=HL
      ]BC
      UNTIL DEC(B)=0 BC=(CHR.LOC.X) C++ C++ (CHR.LOC.X)=BC !XY.POINT
     ]BC
     UNTIL DEC(B)=0
     RET









DRAW.ARCON.WINDOWS   DINT
     DE=$0F06 BC=$2005 HL=ARCON.WIN.X1
     (HL+)=E (HL+)=D (HL+)=C (HL)=B
     HL=MOVE.X (HL)=0 HL+ (HL)=$1C
     DO B=ARCON.WIN.LNG.X
     [BC !DRAW.Y
      B=$9 HL=(ARCON.WIN.X1) A=H A=A+B H=A A=L A=A+B L=A (ARCON.WIN.X1)=HL
     ]BC
     UNTIL DEC(B)=0  EINT
     RET
DRAW.Y
     !POP.LINE !CALL.ARCON.WINDOW
     DO B=ARCON.WIN.LNG.Y-1
     [BC !MOVE.ARCON.WINDOW
     ]BC
     UNTIL DEC(B)=0
     RET
PUSH.LINE
     HL=LINE.X1 DE=ARCON.WIN.X1 BC=4 LDIR
     RET
POP.LINE
     HL=ARCON.WIN.X1 DE=LINE.X1 BC=4 LDIR
     RET
MOVE.ARCON.WINDOW
     HL=(LINE.X1) DE=(LINE.Y1) A=(MOVE.X)
     [AF A=A+L L=A ]AF A=A+H H=A
     A=(MOVE.Y)
     [AF A=A+E E=A ]AF A=A+D D=A
     (LINE.Y1)=DE (LINE.X1)=HL
CALL.ARCON.WINDOW
     A=1 (WINDOW.MODE)=A
     !LNGSCAL !WIN.LOC
     !Open.Draw.Window.Pat
     RET

Close.Draw.Window
     A=(WINDOW.MODE) IF A<>1 THEN RET ;Mode Check
     !LNGSCAL !WIN.LOC
     DE=(SHEL.POINT.ST) (SHEL.POINT.ED)=DE
     BC=(LNGX) A=4 A=A+B B=A C++
     A=(COLOR) ; COLOR 0000:0RGB
     BIT(0,A) IF NZ THEN !*BANKB !Close.Draw.Sub
     BIT(1,A) IF NZ THEN !*BANKG !Close.Draw.Sub
     BIT(2,A) IF NZ THEN !*BANKR !Close.Draw.Sub
     !*BANKT
     RET
Close.Draw.Sub
     [AF HL=(WIN.STAD)
     !WIN.HORIZ
     [BC
     DO
      [BC [HL B=0 C-
      A=(DE+) (HL)=A HL=HL+BC
      A=(DE+) (HL)=A BC=VRAMDOWN
          ]HL HL=HL+BC
      ]BC
     UNTIL DEC(B)=0
     ]BC
     !WIN.HORIZ
     ]AF
     RET
WIN.HORIZ
     [BC [HL
     DO B=C
      A=(DE+) (HL+)=A
     UNTIL DEC(B)=0
     ]HL BC=VRAMDOWN HL=HL+BC
     ]BC
     RET

Move.Draw.Window
     !Close.Draw.Window
     HL=(LINE.X1) DE=(LINE.Y1) A=(MOVE.X)
     [AF A=A+L L=A ]AF A=A+H H=A
     A=(MOVE.Y)
     [AF A=A+E E=A ]AF A=A+D D=A
     (LINE.Y1)=DE (LINE.X1)=HL
     A=1 (WINDOW.MODE)=A
     !LNGSCAL !WIN.LOC
     !Open.Draw.Window
     RET

PALETTE
     HL=P.S.
     A=(HL+) B=$54 A=A+B C=A
     A=(HL)
     PORT(C)=A
     RET


Open.Draw.Window
     A=(WINDOW.MODE) IF A=1 THEN HL=(SHEL.POINT.ST) (SHEL.POINT.ED)=HL
     A=(COLOR) ; COLOR 0000:0RGB
     BIT(0,A) IF NZ THEN !*BANKB !Write.Window
     BIT(1,A) IF NZ THEN !*BANKG !Write.Window
     BIT(2,A) IF NZ THEN !*BANKR !Write.Window
     !*BANKT
     RET

Write.Window
     [AF IX=0
     HL=(WIN.STAD)
     DE=(WINTB1) !WINSUB1
     DE=(WINTB2) !WINSUB2
     A=(LNGX) A+
     (JPSET1+2)=A (JPSET2+2)=A
     B=0 C=A
    [BC
     !WINSUB3
     DE=(WINTB4) A=(LNGY)
     DO B=A
      [BC !SHEL.SUB2 A=A.OR.D
      (HL)=A
      [HL ]IX
JPSET1  A=(IX+0) !SHEL.SUB1 A=A.OR.E
JPSET2  (IX+0)=A
      BC=VRAMDOWN
      HL=HL+BC
      ]BC
     UNTIL DEC(B)=0
    ]BC
     !WINSUB3
     DE=(WINTB2) !WINSUB2
     DE=(WINTB1) !WINSUB1
     ]AF
     RET
WINSUB1
     A=(WINDOW.MODE)
     [HL [DE HL=WINSUB1.DATA DE=WINSUB1.SET
     IF A=0 THEN [AF A=0 (DE+)=A (DE+)=A (DE)=A ]AF
     IF A=1 THEN A=(HL+) B=(HL+) C=(HL) (DE+)=A (DE+)=B (DE)=C
    ]DE ]HL [HL
     !SHEL.SUB2 A=A.OR.
     (HL+)=A A=(LNGX)
     [DE B=A DE=(SHEL.POINT.ED)
      DO
WINSUB1.SET
        A=(HL) (DE+)=A (HL)=$FF HL+
      UNTIL DEC(B)=0 (SHEL.POINT.ED)=DE
     ]DE
     !SHEL.SUB2 A=A.OR.E
     (HL)=A
    ]HL
     BC=VRAMDOWN
     HL=HL+BC
     RET
WINSUB1.DATA
     A=(HL) (DE+)=A ;Frame Save Then Write Mchine Code ELSE Nop Code
WINSUB3
     DE=(WINTB3)
     JR WINSUB3'
WINSUB2
     A=(LNGX) A+
     C=A B=0
WINSUB3'
     [HL
      !SHEL.SUB2 A=A.OR.D
      (HL)=A HL=HL+BC
      !SHEL.SUB2 A=A.OR.E
      (HL)=A
     ]HL
     BC=VRAMDOWN
     HL=HL+BC
     RET
SHEL.SUB2 A=(HL)
SHEL.SUB1
     [AF A=(WINDOW.MODE) IF A<>1 THEN ]AF RET ;Mode Check
     ]AF
     [DE DE=(SHEL.POINT.ED)
      (DE+)=A (SHEL.POINT.ED)=DE
     ]DE
     RET

Open.Draw.Window.Pat
     !WIN.MODE.SET IF CY=1 RET ;Mode Check
     !LNGSCAL !WIN.LOC
     A=(COLOR) ; COLOR 0000:0RGB
     BIT(0,A) IF NZ THEN !*BANKB !Write.Window.Pat
     BIT(1,A) IF NZ THEN !*BANKG !Write.Window.Pat
     BIT(2,A) IF NZ THEN !*BANKR !Write.Window.Pat
     !*BANKT
     RET
Write.Window.Pat
     [AF
     HL=(WIN.STAD)
     !WIN1 !WIN2 !WIN3
     DE=(WIN.AC4) BC=(LNGX)
     DO
      [BC
      [HL A=(HL) A=A.OR.D (HL+)=D
      A=(WIN.PAT)
      DO B=C
       (HL+)=A
      UNTIL DEC(B)=0 RLC(A) (WIN.PAT)=A
      A=(HL) A=A.OR.E (HL)=E
      ]HL
      BC=VRAMDOWN
      HL=HL+BC
      ]BC
     UNTIL DEC(B)=0
     !WIN3 !WIN2 !WIN1
     ]AF
     RET
WIN1
     DE=(WIN.AC1)
     [HL
     A=(HL) A=A.OR.D (HL+)=D
      A=(LNGX)
      DO B=A
       (HL)=$FF HL+
      UNTIL DEC(B)=0
     A=(HL) A=A.OR.E (HL)=E
    ]HL
     BC=VRAMDOWN
     HL=HL+BC
     RET
WIN3
     DE=(WIN.AC3) GOTO WIN'
WIN2
     DE=(WIN.AC2)
WIN'
     [HL
     A=(HL) A=A.OR.D (HL+)=D A=(LNGX) B=A A=(WIN.PAT)
     DO
      (HL+)=A
     UNTIL DEC(B)=0
     A=(HL) A=A.OR.E (HL)=E
     ]HL
     BC=VRAMDOWN
     HL=HL+BC
     RET
WIN.MODE.SET
     A=(WIN.AC.MODE) IF A>=5 THEN CY=1 RET
     HL=WIN.MODE.0 DE=9
     IF A=0 GOTO WIN.MODE.SET.JP
     DO B=A
      HL=HL+DE
     UNTIL DEC(B)=0
WIN.MODE.SET.JP
     BC=9 DE=WIN.AC1 LDIR A=A.OR.A
     RET

Window.Area.Push
     A=0 (WINDOW.MODE)=A
     BC=$1312 DE=$237E ;Set Machine Code
     !WINDOW.AREA.SUB (WINDOW.PUSH.ED)=DE
     RET
Window.Area.Pop
     A=(WINDOW.MODE) IF A<>0 THEN RET
     BC=$2377 DE=$131A ;Set Machine Code
WINDOW.AREA.SUB
     !LNGSCAL !WIN.LOC
     HL=SAVE.SET (HL+)=E (HL+)=D (HL+)=C (HL)=B
     DE=(WINDOW.PUSH.ST) (WINDOW.PUSH.ED)=DE
     A=(COLOR)
     BIT(0,A) IF NZ THEN !*BANKR !SAVE.SUB
     BIT(1,A) IF NZ THEN !*BANKG !SAVE.SUB
     BIT(2,A) IF NZ THEN !*BANKB !SAVE.SUB
     !*BANKT
     RET
SAVE.SUB
     [AF
     HL=LINE.X1 !AREA.CAL A=B B=C C=A
     HL=(WIN.STAD)
     DO
      [BC [HL
       DO B=C
SAVE.SET
        A=(DE+) (HL+)=A
       UNTIL DEC(B)=0
          ]HL BC=VRAMDOWN HL=HL+BC
      ]BC
     UNTIL DEC(B)=0
     ]AF
     RET

DRAW.CHR.XY
     (CHR.LOC.X)=HL
DRAW.CHR
     BC=(CHR.LOC.X)
     !XY.POINT (CHR.PUT.ADD)=HL
DRAW.CHR.1 ;in (CHR.PUT.ADD),(CHR.NO),(CHR.MODE),(CX,CY)
     !CHR.DATA.SEARCH (CHR.DATA.POINT)=HL
     DE=(CHR.DATA.POINT)
DRAW.CHR.2 ;in DE:DATA.ADD,(CHR.PUT.ADD),---- AND UP DATA
     DINT
     !*BANKB HL=(CHR.PUT.ADD) BC=(CX) A=(CHR.MODE) !Chr.Put
     !*BANKR HL=(CHR.PUT.ADD) BC=(CX) A=(CHR.MODE) !Chr.Put
     !*BANKG HL=(CHR.PUT.ADD) BC=(CX) A=(CHR.MODE) !Chr.Put
     !*BANKT EINT
     RET
Chr.Put ;in DE:DATA.ADD,HL:WRITE.ADD,BC:CHR.LNG.X,A:CHR.MODE
     [HL [DE [BC BC=13 HL=CHR.PUT.1 [HL ]DE DE--
      IF A=0 GOTO CHR.PUT.SET.2
      DO
       HL=HL+BC
      UNTIL DEC(A)=0
CHR.PUT.SET.2
     HL<>DE (HL+)=E (HL)=D HL<>DE
     ]BC ]DE ]HL
 ;IN BC=YX DE->HL DE:SRC HL:DST
     DO
      [BC [HL
      DO B=C
      JMP CHR.PUT.1
CHR.PUT.1
  PORT($5F)=A A=(DE+) !*BANK (HL+)=A              JMP CHR.PUT.2 NOP
  PORT($5F)=A A=(DE+) !*BANK A=A.OR.(HL)  (HL+)=A JMP CHR.PUT.2
  PORT($5F)=A A=(DE+) !*BANK A=A.AND.(HL) (HL+)=A JMP CHR.PUT.2
  PORT($5F)=A A=(DE+) !*BANK A=A.XOR.(HL) (HL+)=A JMP CHR.PUT.2
  PORT($5F)=A A=(HL+) !*BANK (DE+)=A              JMP CHR.PUT.2 NOP
  PORT($5F)=A A=(DE)  !*BANK A=A.OR.(HL)  HL+ (DE+)=A JMP CHR.PUT.2
  PORT($5F)=A A=(DE)  !*BANK A=A.AND.(HL) HL+ (DE+)=A JMP CHR.PUT.2
  PORT($5F)=A A=(DE)  !*BANK A=A.XOR.(HL) HL+ (DE+)=A ;JMP CHR.PUT.2
CHR.PUT.2
      UNTIL DEC(B)=0
      ]HL BC=VRAMDOWN HL=HL+BC ]BC
     UNTIL DEC(B)=0
     RET
CHR.DATA.SEARCH ;OUT HL:DATA.POINT
     HL=(CHR.DATA.START) A=(CHR.NO) IF A=0 RET
     !CXY.LNGS
     DO B=A
      HL=HL+DE
     UNTIL DEC(B)=0
     RET
CXY.LNGS
     [HL [AF
      HL=(CX) !@MULT.HL.HL [HL ]DE
      HL=HL+HL HL=HL+DE (CHR.DATA.STEP)=HL [HL ]DE
     ]AF ]HL
     RET

INIT.CURSOR
     [BC [DE [HL
     HL=CUR.TB.1
SET.CUR.JP
     DE=CUR.TB.COPY BC=CUR.TB.LNG
     LDIR
     ]HL ]DE ]BC
     RET

SET.CURSOR
     BC=(CUR.X) !XY.POINT
     !*BANKR [HL DE=CUR.TB.COPY BC=(CUR.X) A=1 !GRAPH.SAVE !DRAW.CHR ]HL
     !*BANKG [HL DE=CUR.TB.COPY BC=(CUR.X) A=1 !GRAPH.SAVE !DRAW.CHR ]HL
     !*BANKB [HL DE=CUR.TB.COPY BC=(CUR.X) A=1 !GRAPH.SAVE !DRAW.CHR ]HL
     RET

GRAPH.SAVE
     [AF [BC [DE [HL
     !DRAW.CHR
     ]AF ]BC ]DE ]HL
     RET



















BIT.TO.HEX ;IN HL:POINT OUT A:HEX
     [DE [BC
     E=0
     DO B=4
      [BC A=0
      DO B=2
       RLD [AF RRC(A) RL(E) ]AF
      UNTIL DEC(B)=0 RLD
      ]BC HL+
     UNTIL DEC(B)=0 A=E
     ]BC ]DE
     RET

LNGSCAL
     [HL [BC [AF
     HL=LINE.X1
     !AREA.CAL B-- A=C A=A-6 C=A
     (HL+)=B (HL)=C
     ]AF ]BC ]HL
     RET

AREA.CAL
     B=(HL+) A=(HL+) A=A-B B=A
     C=(HL+) A=(HL+) A=A-C C=A
     RET

WIN.LOC
     [AF [BC [DE [HL
     A=(LINE.X1) C=A
     A=(LINE.Y1) B=A
     !XY.POINT
     (WIN.STAD)=HL
     ]HL ]DE ]BC ]AF
     RET
XY.POINT ;IN B:Y C:X OUT HL:VRAM.ADD
     [AF [DE HL=VRAMSTART A=B IF A=0 GOTO XY.EX
     DE=VRAMDOWN
     DO
      HL=HL+DE
     UNTIL DEC(B)=0
XY.EX
     B=0 HL=HL+BC
     ]DE ]AF
     RET

;**************************
;*                        *
;*   SPRITE PUT ROUTINE   *
;*                        *
;* Copyright(C) 1985/11/5 *
;*                        *
;*       BY Y.NAGOSHI     *
;*                        *
;**************************
;
;    START $6000
;
;------------------------------------
; SPRITE ROUTINE
;
;  IN   HL = V-RAM ADDRESS
;       DE = GRAPHIC DATA ADDRESS
;       A  = MIRROR FLAG 0:NORMAL 1:MIRROR
;------------------------------------
;
SPRITE
     (VADRS)=HL (GRAPH)=DE
     IF A<>0 GOSUB MIRROR
     HL=(VADRS) GOSUB PUT
     RETURN
;
;
;-------------------------------------
; MIRROR ROUTINE
;
;  IN   (GRAPH)=DE
;
;  OUT  (GRAPH)=NEW BUFFER ADDRESS
;
;  BREAK
;-------------------------------------
;
MIRROR
     DE=(GRAPH) HL=BUFFER
     A=(DE+) (MIX+1)=A (HL+)=A
     C=A C- A=A+A (MIIX+1)=A
     A=(DE+) (MIY+1)=A (HL+)=A
     B=0 HL=HL+BC
;
     DO A=4
       AF<>AF'
       EXX
MIY
       DO B=16
         EXX
MIX
         DO B=4
           A=(DE+)
           RL(A) RR(C) RL(A) RR(C)
           RL(A) RR(C) RL(A) RR(C)
           RL(A) RR(C) RL(A) RR(C)
           RL(A) RR(C) RL(A) RR(C)
           (HL-)=C
         UNTIL DEC(B)=0
MIIX
         C=0 B=0 HL=HL+BC
         EXX
       UNTIL DEC(B)=0
       EXX
       AF<>AF'
     UNTIL DEC(A)=0
     HL=BUFFER (GRAPH)=HL
     RETURN
;
;
;---------------------------------------
; SPRITE PUT ROUTINE
;
;  IN   (GRAPH)=GRAPHIC DATA ADDRESS
;       HL    = V-RAM ADDRESS
;
;  BREAK
;---------------------------------------
;
PUT
     (GRAMAD+1)=HL DE=(GRAPH)
     A=(DE+) (PUTX+1)=A (PUTX2+1)=A (PUTX3+1)=A (PUTX4+1)=A
     A=(DE+) (PUTY+1)=A (PUTY2+1)=A
     EXX
PUTY
     DO B=0
       EXX
PUTX
       DO B=4
         PORT($5C)=A A=(DE+) C=A A=A.AND.(HL) (HL)=A
         PORT($5D)=A A=C A=A.AND.(HL) (HL)=A
         PORT($5E)=A A=C A=A.AND.(HL) (HL+)=A
       UNTIL DEC(B)=0
       A=$50
PUTX2
       A=A-0 B=0 C=A HL=HL+BC
       EXX
     UNTIL DEC(B)=0
     EXX
;
     DO A=$5C
       C=A PORT(C)=A
       AF<>AF'
GRAMAD
       HL=0
       EXX
PUTY2
       DO B=0
         EXX
PUTX3
         DO B=0
           A=(DE+) A=A.OR.(HL) (HL+)=A
         UNTIL DEC(B)=0
         A=$50
PUTX4
         A=A-0 B=0 C=A HL=HL+BC
       EXX
       UNTIL DEC(B)=0
       EXX
       AF<>AF'
       A+
     UNTIL A=$5F
     PORT($5F)=A
     RETURN
;
;
GRAPH DEFW 0
VADRS DEFW 0
;
;
BUFFER DEFS 200
       DEFS 60

  U
VADRS DEFW 0
;
;
BUFFER DEFS 200
       DEFS 60
