hr.Put
; Modefid Sep/23/1985 Powered Chr.Put Debug
; Modefid Sep/30/1985 Archon Base
;
; FILE NAME:WINDOW.REUSE
;
;    START $7200
;    OFFSET $2700

;***** WORKAREA & STAC AREA *****

     !(00000000000000000000)
     !(00000000000000000000)
     !(00000000000000000000)
     !(00000000000000000000)
     !(00000000000000000000)
STAC !(0000)

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)
WIN.AC1        !(0000)
WIN.AC2        !(0000)
WIN.AC3        !(0000)
WIN.AC4        !(0000)
WIN.PAT        !(00)
WIN.AC.MODE    !(00)
VRAMDOWN       EQU $50
VRAMSTART      EQU $C000
WIN.STAD       !(0000)
SHEL.POINT.ST  !(0070)
SHEL.POINT.ED  !(0000)
WINDOW.PUSH.ST !(3072)
WINDOW.PUSH.ED !(3072)
LINE.X1         !(01)
LINE.X2         !(20)
LINE.Y1         !(01)
LINE.Y2         !(40)
LNGX           !(00)
LNGY           !(00)
LINEBIT        !(FF)
WINDOW.MODE    !(00) ;0:Rect Save 1:Frame Save
COLOR          !(07) ;0000 0RGB COLOR BIT
P.S.           !(02)
P.D.           !(03)
MOVE.X         !(00)
MOVE.Y         !(00)
SCREEN.MODE    !(00) ;0:*DMA.ON.OFF 1:H.N.MODE
CHR.NO         !(00) ;Chr No.
CHR.MODE       !(03)
CHR.LOC.X      !(00)
CHR.LOC.Y      !(00)
CX             !(04)
CY             !(10)
CHR.DATA.START !(00C0)
CHR.DATA.STEP  !(0000)
CHR.DATA.POINT !(0000)
CHR.PUT.ADD    !(0000)
CUR.TB.1       !(0000 0000 0000 0000 0000 0000 0000 0000)
CUR.TB.2       !(0000 0000 0000 0000 0000 0000 0000 0000)
CUR.TB.3       !(0000 0000 0000 0000 0000 0000 0000 0000)
CUR.TB.4       !(0000 0000 0000 0000 0000 0000 0000 0000)
CUR.TB.5       !(0000 0000 0000 0000 0000 0000 0000 0000)
CUR.TB.COPY    !(0000 0000 0000 0000 0000 0000 0000 0000)
CUR.TB.LNG     EQU 16
CUR.X          !(00)
CUR.Y          !(00)
ARCON.WIN.X1   !(00)
ARCON.WIN.X2   !(00)
ARCON.WIN.Y1   !(00)
ARCON.WIN.Y2   !(00)
ARCON.WIN.LNG.X EQU 7
ARCON.WIN.LNG.Y EQU 7
BAN.XY         !(0410)
BAN.X          !(16)
BAN.Y          !(20)
BAN.X1         !(00)
BAN.Y1         !(00)
BAN.PUT        !(0000)
W.ADD.X        !(0000) ;ADD X,Y
TB.POINT       !(0000)
TB.START       ;0:ｼﾛ 1:ｸﾛ 2:ﾍﾝｶ
     !(010001020002010001000102000200020100)
     !(010200010201000201020001000200010002)
     !(020202020202020202)
     !(020100010201000102000201000200010200)
     !(010002010201020001000100020102000100)
BAN.FONT       !(FFFEEE330100)
BAN.FONT.COUNT !(00)
#BANK.F        !(00) ;*BANK SCREEN FLAG 0:TEXT 1:R 2:G 3:B
BAN.TB.1       !(010101010101010101)
BAN.TB.2       !(020202020202020202)
BAN.TB.3       !(000000000000000000)
BAN.TB.4       !(000000000000000000)
BAN.TB.5       !(000000000000000000)
BAN.TB.6       !(000000000000000000)
BAN.TB.7       !(000000000000000000)
BAN.TB.8       !(030303030303030303)
BAN.TB.9       !(040404040404040404)
BASE.CHR.TB
     !(0C0A00000000000206)
     !(0B0F00000000000703)
     !(090F00000000000701)
     !(0D0F00000000000704)
     !(080F00000000000700)
     !(0E0F00000000000705)
     !(090F00000000000701)
     !(0B0F00000000000703)
     !(0C0A00000000000206)

BASE.DRAW.CHR
     [AF A=1 (CHR.MODE)=A HL=$5000 (CHR.DATA.START)=HL
     BC=BAN.X !XY.POINT DE=BASE.CHR.TB
     DO BC=$0909
     [BC [HL
      DO A=C
       AF<>AF' A=(DE+) (CHR.NO)=A (CHR.PUT.ADD)=HL [HL !DRAW.CHR.1 ]HL
       BC=4 HL=HL+BC
       AF<>AF'
      UNTIL DEC(A)=0
     ]HL BC=1280 HL=HL+BC ]BC
     UNTIL DEC(B)=0
     ]AF
     RET

DRAW.ARCHON
     A=1 (CHR.MODE)=A HL=$7000 (CHR.DATA.START)=HL
     BC=$0500 !XY.POINT (CHR.PUT.ADD)=HL A=0 DE=4
     DO B=6
      (CHR.NO)=A [HL !DRAW.CHR.1 ]HL HL=HL+DE
      (CHR.PUT.ADD)=HL
     UNTIL DEC(B)=0
     RET






DRAW.ARC.BASE
     (STAC)=SP SP=STAC
     !DRAW.BAN
     SP=(STAC)
     RET

MOVE.CHR
     (STAC)=SP SP=STAC
     !MOVE.ARC
     SP=(STAC)
     RET

MOVE.ARC
     HL=$A000 (CHR.DATA.START)=HL HL=$1004 (CX)=HL
     A=3 (CHR.MODE)=A A=0 (CHR.NO)=A
     BC=$1010 (CHR.LOC.X)=BC
MOVE.ARC.LOOP
     BC=(CHR.LOC.X) !XY.POINT (CHR.PUT.ADD)=HL DE=$A000
     !DRAW.CHR.2 ;Write Charactor
MOVE.NEXT
     !*GET.SOON IF CY=1 GOTO MOVE.NEXT
     HL=#KEY.BUFF BC=0
     DO A=10
     AF<>AF' A=(HL+) ;IF A=$F THEN AF<>AF' RET
     IF A=72 THEN AF<>AF' RET
    ;IF A=$FF THEN AF<>AF' JMP MOVE.NEXT
     IF A=1 THEN B+ C-
     IF A=2 THEN B+
     IF A=3 THEN B+ C+
     IF A=4 THEN C-
     IF A=6 THEN C+
     IF A=7 THEN B- C-
     IF A=8 THEN B-
     IF A=9 THEN B- C+
     A=C A=A.OR.C IF Z GOTO MOVE.U
     A=20 A=A+C IF CY=1 THEN C=0-1
     IF CY=0 THEN C=1
MOVE.U
     A=B A=A.OR.B IF Z GOTO MOVE.UNTIL
     A=20 A=A+B IF CY=1 THEN B=0-4
     IF CY=0 THEN B=4
MOVE.UNTIL AF<>AF'
     UNTIL DEC(A)=0
     A=B A=A.OR.C IF Z GOTO MOVE.NEXT
     (W.ADD.X)=BC DE=$A000 !DRAW.CHR DE=CHR.LOC.X ;Erace Charactor
     BC=(W.ADD.X) A=(DE) A=A+C (DE)=A A=(+DE) A=A+B (DE-)=A
     JMP MOVE.ARC.LOOP

DRAW.BAN
     !*BANKR !DRAW.BAN.1
     !*BANKG !DRAW.BAN.1
     !*BANKB !DRAW.BAN.1
     !*BANKT A=(BAN.FONT.COUNT)
BAN.SET
     A+ IF A=6 THEN !(3E) A- (BAN.SET)=A A=4
     IF A=$FF THEN !(3E) A+ (BAN.SET)=A A=1
     (BAN.FONT.COUNT)=A
     RET

DRAW.BAN.1
     BC=$1004 (BAN.XY)=BC
     A=(BAN.X) (BAN.X1)=A A=(BAN.Y) (BAN.Y1)=A HL=TB.START (TB.POINT)=HL
     BC=(BAN.X1) !XY.POINT (BAN.PUT)=HL
     DO B=9
      [BC [HL
      DO B=9
      [BC !GET.PAT !DRAW.FILL.PAT ]BC
      UNTIL DEC(B)=0
     ]HL BC=4 HL=HL+BC ]BC
     UNTIL DEC(B)=0
     RET
GET.PAT
     [HL HL=BAN.FONT A=(BAN.FONT.COUNT) B=0 C=A
      DE=(TB.POINT) A=(DE+) (TB.POINT)=DE [HL ]DE HL=HL+BC
      IF A=2 THEN A=(HL) GOTO GET.PAT.EX
      IF A=1 THEN HL=BAN.FONT+5 A=(HL) GOTO GET.PAT.EX
      A=(DE)
GET.PAT.EX
     ]HL
     RET
DRAW.FILL.PAT
     BC=(BAN.XY)
     [AF
     DO
      [BC [HL
      DO B=C
       (HL+)=A
      UNTIL DEC(B)=0
      RRC(A) ]HL BC=VRAMDOWN HL=HL+BC ]BC
     UNTIL DEC(B)=0
     ]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)