Files
TZFS/asm/mz-xz009/MON-GRPH.ASM

2984 lines
60 KiB
NASM
Raw Blame History

; -------------------------------
; MZ-800 Monitor Graphic-package
; FI:MON-GRPH ver 1.0A 9.05.84
;
; -------------------------------
;
;
INCLD MACRO
KEYBF: EQU 11A4H ;KEYBUF label
;-------------------------------
;
; INIT "CRT:
;
;-------------------------------
CRTINI: ENT
TEST1 'M'
CALL TEST1
DEFB 'M'
ENDM
JR Z,CRMD
OR A
JR Z,ICRT
CP 'B'
JP NZ,ER03
;-------------------------------
;
; CRT palette block
;
;-------------------------------
;
PBLOCK: XOR A
LD (PALBK),A
LD A,(CRTMD2)
CP 2
JP NZ,ER68
INC HL
LD B,4
CALL DEVASC
LD (PALBK),A
SVC .DPLBK
RST 3
DEFB .DPLBK
ENDM
JR CRTLP
;
;---------------------------------
;
; CRT mode
;
; 1.....320x200 4 Color
; 2.....320x200 16 Color
; 3.....640x200 2 Color
; 4.....640x200 4 Color
;
;---------------------------------
;
CRMD: LD B,5
CALL DEVASC
OR A
JR Z,ER3JP
LD B,A
SVC .DSMOD
RST 3
DEFB .DSMOD
ENDM
JP C,ER68
LD A,B
LD (CRTMD2),A
XOR A
LD (INPFLG),A
SCF
ADC A,A
DJNZ -1
LD (CRTMD1),A
CALL ICRT2
;
CRTLP: TEST1 0
CALL TEST1
DEFB 0
ENDM
RET Z
CP ','
INC HL
JR Z,CRTINI
ER3JP: JP ER03
;
ICRT: ENT
LD A,(CRTMD2)
SVC .DSMOD
RST 3
DEFB .DSMOD
ENDM
ICRT2: CALL COLINI
XOR A
LD (PALBK),A
SVC .DPLBK
RST 3
DEFB .DPLBK
ENDM
RET
;
COLINI: LD A,(CRTMD1)
LD B,3
RRA
JR C,CI1
LD B,15
RRA
JR C,CI1
LD B,1
RRA
JR C,CI1
LD B,3
CI1: LD A,B
LD (SELCOL),A
SVC .DCOL
RST 3
DEFB .DCOL
ENDM
RET
SKP H
;------------------------
;
;
; BYTE CONVERT TABLE
;
;-----------------------
TDOTL: ENT
DEFB FFH
DEFB FEH
DEFB FCH
DEFB F8H
DEFB F0H
DEFB E0H
DEFB C0H
DEFB 80H
;
TDOTR: ENT
DEFB 01H
DEFB 03H
DEFB 07H
DEFB 0FH
DEFB 1FH
DEFB 3FH
DEFB 7FH
DEFB FFH
;
TDOTN: ENT
DEFB 01H
DEFB 02H
DEFB 04H
DEFB 08H
DEFB 10H
DEFB 20H
DEFB 40H
DEFB 80H
;-------------------------------
;
; // 64 - 32 TRANS //
;
;-------------------------------
;
CHGRPH: ENT
LD BC,703H
LD HL,CHGTBL
JP PATCH
;
;
CHGTBL:
; word patch table
;
DEFW SYMS42+1
DEFW BE80H
DEFW 9F40H
;
DEFW RNGCK0+1
DEFW -640
DEFW -320
;
DEFW LRBSR
DEFW 640
DEFW 320
;
DEFW BFL0+1
DEFW 80
DEFW 40
;
DEFW BFL1+1
DEFW 80
DEFW 40
;
DEFW BFC0+1
DEFW -640
DEFW -320
;
DEFW BFC1+1
DEFW 639
DEFW 319
;
; byte patch table
;
DEFW ADCH ;adrs
DEFB 29H ;640 ADD HL,HL
DEFB 00H ;320
;
DEFW SYMS21+1
DEFB 80
DEFB 40
;
DEFW SYMS41+1
DEFB 80
DEFB 40
;
SKP H
;----------------------------------
;
; address calc
;
;
; ent. de=x (0-13FH,27FH)
; hl=y (0-C7H)
;
; ext. hl=vram addr
; a=vram bit
; c=de/8
;----------------------------------
ADCH: ADD HL,HL ;NOP
LD A,E
AND 7
LD B,A
;
LD A,E
AND F8H
ADD A,D
RRCA
RRCA
RRCA
LD C,A
LD A,B
LD B,80H ;vramh
LD D,H
LD E,L
ADD HL,HL
ADD HL,HL
ADD HL,DE
ADD HL,HL
ADD HL,HL
ADD HL,HL ;HL=HL*40
ADD HL,BC
RET
;-----------------------------
;
; READ POINT
;
; Ent:DE=X (0-13FH,27EH)
; HL=Y (0-C7H)
;
;-----------------------------
?POINT: ENT
CALL RNGCK
JP C,OVER
CALL ADCH
;
RLCA
RLCA
RLCA
OR 46H
LD (PNT2+1),A
LD C,LSRF
LD A,(MAXCF)
LD B,A
;
DI
IN A,(LSE0)
XOR A
PNT1: RR B
JR C,PNT4
OUT (C),B
OR A
PNT2: BIT 0,(HL) ;bit n,(hl)
JR Z,PNT3
SCF
PNT3: RLA
JR PNT1
;
PNT4: LD B,A
IN A,(LSE1)
EI
LD A,(CPLANE)
AND B
LD B,A
LD A,(DMD)
CP 6
LD A,B
RET NZ
;
CP 4
RET C
;
SUB 2
RET
SKP H
;---------------------------------
;
;
; MODE SET (PWMODE,GMODE)
;
; ent. A= 0 RESET
; A<>0 SET
;---------------------------------
SETW: LD A,FFH
MODSET: PUSH BC
OR A
LD A,(GMODE)
LD C,A
LD A,(PWMODE)
JR Z,RESET
;
SET: OR A
LD A,C0H ;w0 pset
JR Z,SET1
LD A,40H ;w1 or
;
SET1: OR C
OUT (LSWF),A ;Write mode set
POP BC
RET
;
;
RESET: OR A
LD A,60H ;w1 reset
JR NZ,SET1
;
LD A,(CPLANE)
LD B,A
LD A,C ;reverse color
CPL
AND B ;mask color
OR C0H ;w0 pset mode
OUT (LSWF),A ;Write mode set
POP BC
RET
SKP H
;-----------------------------
;
; Point Write/Erase
;
; Ent:DE=X (0-13FH,27EH)
; HL=Y (0-C7H)
;
;-----------------------------
PSET: ENT
CALL MODSET
PSET0: CALL RNGCK
JP C,OVER
CALL ADCH
EX DE,HL
LD HL,TDOTN
LD B,0
LD C,A
ADD HL,BC
DI
IN A,(LSE0)
LDI
IN A,(LSE1)
EI
XOR A
RET
;
;
;--------------------------------
;
; RANGE CHECK
;
; Ent:DE=X (0-13FH,27EH)
; HL=Y (0-C7H)
;
; ext:if over then CF=1
;
;--------------------------------
RNGCK: ENT
PUSH BC
PUSH DE
PUSH HL
LD A,H
RLCA
JR C,RNGER
;
LD BC,-200
ADD HL,BC
JR C,RNGER
;
LD A,D
RLCA
JR C,RNGER
;
EX DE,HL
RNGCK0: LD BC,-640 ;-320
ADD HL,BC
RNGER: POP HL
POP DE
POP BC
RET
;
;
SKP H
;------------------------------
;
; Draw line
;
; ent DE':X0, DE:X
; HL':Y0, HL:Y
; A := 0 BLINE
; <>0 LINE
;
; ext DE':X
; HL':Y
;-------------------------------
;
;
X0: EQU KEYBF ;2
DX: EQU X0+2 ;2
XDIRE: EQU DX+2 ;1
Y0: EQU XDIRE+1 ;2
DY: EQU Y0+2 ;2
YDIRE: EQU DY+2 ;1
;
;
WLINE0: LD A,FFH
WLINE: ENT
CALL MODSET
PUSH DE
PUSH HL
EXX
LD (X0),DE
LD (Y0),HL
EXX
PUSH HL ;y
PUSH DE ;x
EX DE,HL
LD HL,(Y0)
CALL PLS
LD (YDIRE),A
LD (DY),HL
POP DE ;x
JP NC,WYLIN ;skip if y=y0
PUSH HL ;dy
LD HL,(X0)
CALL PLS
LD (XDIRE),A
LD (DX),HL
POP BC ;dy
POP DE ;y
JP NC,WTLIN ;skip if x=x0
XOR A
SBC HL,BC
JR NC,WLIN04 ;skip if dx>dy
LD HL,X0 ;parameter change
LD DE,Y0
LD B,5
WLIN02: LD A,(DE)
LD C,M
LD M,A
LD A,C
LD (DE),A
INC HL
INC DE
DJNZ WLIN02
;
LD A,0EBH ;ex de,hl
WLIN04: LD (PLOT),A
LD (PLOT1),A
LD A,(YDIRE)
AND A
LD A,23H ;inc hl
JR Z,DIRE1
LD A,2BH ;dec hl
DIRE1: LD (PP2),A
;
LD A,(XDIRE)
AND A
LD A,13H ;inc de
JR Z,DIRE2
LD A,1BH ;dec de
DIRE2: LD (PP1),A
;
EXX
LD HL,(DX) ;initial parm set
LD D,H
LD E,L
SRL H
RR L
LD BC,(DY)
EXX
;
LD HL,(Y0) ;first point set
LD DE,(X0)
LD BC,(DX)
;
PLOT: EX DE,HL ;nop
PUSH HL
PUSH DE
PUSH BC
CALL PSET0
POP BC
POP DE
POP HL
PLOT1: EX DE,HL ;nop
;
;
DEC BC
LD A,B
INC A
JR Z,FINW ;skip if end of line
;
; pointer calc .
;
PP1: DEFS 1 ;inc de/dec de
EXX
OR A
SBC HL,BC
EXX
JP NC,PLOT
EXX
ADD HL,DE
EXX
PP2: DEFS 1 ;inc hl/dec hl
JP PLOT
;
;
FINW: EXX
POP HL
POP DE
EXX
RET
;
WYLIN: POP HL ;Y
WYLIN0: CALL WBOXSB
CALL WBOXSB
CALL YLINE
JR FINW
;
WTLIN: EX DE,HL
LD DE,(X0)
JR WYLIN0
;
;
;
PLS: LD A,H
ADD A,40H
LD H,A
LD A,D
ADD A,40H
LD D,A
;
OR A
SBC HL,DE
JR C,PLS1
LD A,H
OR L
RET Z
OVER: LD A,FFH
SCF
RET
;
PLS1: OR A
EX DE,HL
LD HL,0
SBC HL,DE
XOR A
SCF
RET
SKP H
;-------------------------
;
;
; Write sector
;
;-------------------------
;
WSECTR: CALL WSPUT
LD HL,(POINTX)
PUSH HL
PUSH BC ;POINTY
EXX
CALL WSPUT
LD B,2
JP WBOX2
;
WSPUT: POP IX ;Ret adrs
EX DE,HL
CP 2
CALL Z,WSCTRH
LD BC,(POINTX)
ADD HL,BC
PUSH HL ;X
EX DE,HL
CP 1
CALL Z,WSCTRH
LD BC,(POINTY)
ADD HL,BC
PUSH HL ;Y
JP (IX)
;
WSCTRH: BIT 7,H
JP Z,HIRITU
CALL WSCTRV
CALL HIRITU
WSCTRV: EX AF,AF'
CALL NEGHL
EX AF,AF'
RET
SKP H
;
;-----------------------------
;
; Circle Write
; ent DE:End X DE':Start X
; HL:End Y HL':Start Y
; IX:R BC':Hiritu
; A:Angle flag
; if CF then sector
;
; uses KEYBUF
;-----------------------------
WCIRCL: ENT
PUSH AF
CALL SETW ;set pwmode
POP AF
PUSH AF
LD (CIR3+1),IX ;R
LD (SYUX),DE
LD (SYUY),HL
EXX
LD (CIR.HF),BC
LD (KAIX),DE
LD (KAIY),HL
LD A,C ;CIR.HF
CALL C,WSECTR
LD HL,(KAIX)
LD DE,(KAIY)
;Å BLOCK NO."Ù\<5C>Ü/BL \ÄÙ
CALL BLCKRU
LD (KBL),A
LD HL,(SYUX)
LD DE,(SYUY)
;Å BLOCK NO."Ù\<5C>Ü/SBL \<5C>mÄÙ
CALL BLCKRU
LD (SBL),A
;
LD HL,CIR.BK
LD B,8
CALL ?CLRHL
LD HL,KBL
POP AF
LD B,A
AND 0FH
JR Z,CIR4 ;KK=SK
CP 3
JR Z,CIR15 ;2PI <= ABS(KK-SK)
LD A,M
INC HL
CP M
JR NZ,CIR4
LD A,B
CP 81H
JR Z,CIR4
JR CIR14
;
CIR15: LD A,9
LD M,A
INC HL
LD M,A
CIR14: LD B,8
LD HL,CIR.BK
INC A
CALL ?SETHL
LD A,B0H ;OR B
CALL CHENGE
JR CIR3
;
CIR4: LD A,A0H ;AND B
CALL CHENGE
LD D,00H
LD HL,(KBL)
LD B,H
LD A,L
CIR2: LD HL,CIR.BK-1
LD E,A
ADD HL,DE
LD M,1
CP B ;\s\ÛÛÚjlÄ \<5C>mÛÛÚjli Ã\l
JR Z,CIR3
AND 7
INC A
JR CIR2
CIR3: LD HL,0 ;;;R
LD (DYY),HL
LD (XX),HL
LD HL,1
LD (CI.D),HL
LD (YY),HL
CIR7: LD HL,(DYY)
LD DE,(CI.D)
XOR A
SBC HL,DE
LD (DYY),HL
;
LD HL,(YY)
DEC HL
LD (CYE),HL
LD A,(CIR.HF)
OR A
LD DE,HL
CALL NZ,HIRITU
CP 1
JR Z,+3
EX DE,HL
LD (YYY),DE
LD (YYHI),HL
;
LD HL,(XX)
OR A
LD DE,HL
CALL NZ,HIRITU
CP 1
JR Z,+3
EX DE,HL
LD (XXX),DE
LD (XXHI),HL
;
LD HL,(XXX)
CALL NEGHL
LD (FUXX),HL ;FUXX = -XXX
LD HL,(YYY)
CALL NEGHL
LD (FUYE),HL ;FUYE = -YYY
LD HL,(YYHI)
CALL NEGHL
LD (FUYYHI),HL ;FUYYHI = -YYHI
LD HL,(XXHI)
CALL NEGHL
LD (FUXXHI),HL ;FUXXHI = -XXHI
LD HL,(CYE)
CALL NEGHL
LD (FUNOYE),HL ;FUNOYE = -YE
;
LD HL,CIR.BK
LD A,M ;BLOCK NO.1
OR A
INC HL
JR Z,P222
EXX
LD HL,(XXX)
LD (PL1+1),HL
LD B,0
LD DE,(FUNOYE)
BIT 7,D
JR Z,P12
LD A,(KBL)
CP 1
JR NZ,P11
LD HL,(KAIY)
XOR A
SBC HL,DE
JR Z,P11
JR C,P12
P11: INC B
P12: LD A,(SBL)
CP 1
JR NZ,P13
LD HL,(SYUY)
XOR A
SBC HL,DE
JR Z,P13
JR NC,P14
P13: LD A,1
P14: AND B
JR Z,P15
LD HL,(FUYYHI)
CALL PLALL
P15: EXX
;
P222: LD A,M ;BLOCK NO.2
OR A
INC HL
JR Z,P3
EXX
LD B,0
LD HL,(YYY)
LD (PL1+1),HL
LD DE,(CYE)
LD A,(KBL)
CP 2
JR NZ,P21
LD HL,(KAIX)
XOR A
SBC HL,DE
JR Z,P21
JR C,P22
P21: INC B
P22: LD A,(SBL)
CP 2
JR NZ,P23
LD HL,(SYUX)
XOR A
SBC HL,DE
JR Z,P23
JR NC,P24
P23: LD A,1
P24: AND B
JR Z,P25
LD HL,(FUXXHI)
CALL PLALL
P25: EXX
;
P3: LD A,M ;BLOCK NO.3
OR A
INC HL
JR Z,P4
EXX
LD B,0
LD HL,(FUYE)
LD (PL1+1),HL
LD DE,(FUNOYE)
BIT 7,D
JR Z,P32
LD A,(KBL)
CP 3
JR NZ,P31
LD HL,(KAIX)
XOR A
SBC HL,DE
JR Z,P31
JR C,P32
P31: INC B
P32: LD A,(SBL)
CP 3
JR NZ,P33
LD HL,(SYUX)
XOR A
SBC HL,DE
JR Z,P33
JR NC,P34
P33: LD A,1
P34: AND B
JR Z,P35
LD HL,(FUXXHI)
CALL PLALL
P35: EXX
;
P4: LD A,M ;BLOCK NO.4
OR A
INC HL
JR Z,P5
EXX
LD B,0
LD HL,(FUXX)
LD (PL1+1),HL
LD DE,(FUNOYE)
LD A,(KBL)
CP 4
JR NZ,P41
LD HL,(KAIY)
XOR A
SBC HL,DE
JR Z,P41
JR NC,P42
P41: INC B
P42: XOR A
BIT 7,D
JR Z,P44
LD A,(SBL)
CP 4
JR NZ,P43
LD HL,(SYUY)
XOR A
SBC HL,DE
JR Z,P43
JR C,P44
P43: LD A,1
P44: AND B
JR Z,P45
LD HL,(FUYYHI)
CALL PLALL
P45: EXX
;
P5: LD A,M ;BLOCK NO.5
OR A
INC HL
JR Z,P6
EXX
LD B,0
LD HL,(FUXX)
LD (PL1+1),HL
LD DE,(CYE)
LD A,(KBL)
CP 5
JR NZ,P51
LD HL,(KAIY)
XOR A
SBC HL,DE
JR Z,P51
JR NC,P52
P51: INC B
P52: LD A,(SBL)
CP 5
JR NZ,P53
LD HL,(SYUY)
XOR A
SBC HL,DE
JR Z,P53
JR C,P54
P53: LD A,1
P54: AND B
JR Z,P55
LD HL,(YYHI)
CALL PLALL
P55: EXX
;
P6: LD A,M ;BLOCK NO.6
OR A
INC HL
JR Z,P7
EXX
LD B,0
LD HL,(FUYE)
LD (PL1+1),HL
LD DE,(FUNOYE)
LD A,(KBL)
CP 6
JR NZ,P61
LD HL,(KAIX)
XOR A
SBC HL,DE
JR Z,P61
JR NC,P62
P61: INC B
P62: XOR A
BIT 7,D
JR Z,P64
LD A,(SBL)
CP 6
JR NZ,P63
LD HL,(SYUX)
XOR A
SBC HL,DE
JR Z,P63
JR C,P64
P63: LD A,1
P64: AND B
JR Z,P65
LD HL,(XXHI)
CALL PLALL
P65: EXX
;
P7: LD A,M ;BLOCK NO.7
OR A
INC HL
JR Z,P8
EXX
LD HL,(YYY)
LD (PL1+1),HL
LD DE,(CYE)
LD B,0
LD A,(KBL)
CP 7
JR NZ,P71
LD HL,(KAIX)
XOR A
SBC HL,DE
JR Z,P71
JR NC,P72
P71: INC B
P72: LD A,(SBL)
CP 7
JR NZ,P73
LD HL,(SYUX)
XOR A
SBC HL,DE
JR Z,P73
JR C,P74
P73: LD A,1
P74: AND B
JR Z,P75
LD HL,(XXHI)
CALL PLALL
P75: EXX
;
P8: LD A,M ;BLOCK NO.8
OR A
INC HL
JR Z,PE
EXX
LD HL,(XXX)
LD (PL1+1),HL
LD DE,(CYE)
LD B,0
LD A,(KBL)
CP 8
JR NZ,P81
LD HL,(KAIY)
XOR A
SBC HL,DE
JR Z,P81
JR C,P82
P81: INC B
P82: LD A,(SBL)
CP 8
JR NZ,P83
LD HL,(SYUY)
XOR A
SBC HL,DE
JR Z,P83
JR NC,P84
P83: LD A,1
P84: AND B
JR Z,P85
LD HL,(YYHI)
CALL PLALL
P85: EXX
;
PE: LD HL,(DYY) ;Zs"Ù\o
BIT 7,H
JR Z,CIR10
LD DE,(YY)
LD HL,(XX)
DEC HL
LD (XX),HL
BIT 7,H
RET NZ
XOR A
SBC HL,DE
RET C
LD HL,(XX)
ADD HL,HL
LD DE,(DYY)
ADD HL,DE
LD (DYY),HL
CIR10: LD HL,(YY)
INC HL
LD (YY),HL
LD HL,(CI.D)
INC HL
INC HL
LD (CI.D),HL
JP CIR7
;
;CIRCLE "ÛÛÜ-ÞÙ
;
;BLOCK NUMBER ZÙ\<5C>Ü "ÛÛÜ-ÞÙ
BLCKRU: PUSH HL
PUSH DE
CALL ABSHL
EX DE,HL
CALL ABSHL
EX DE,HL
OR A
SBC HL,DE
POP DE
POP HL
JR C,BLCK1
BIT 7,H
JR NZ,BLCK2
BIT 7,D
LD A,8
RET Z
LD A,1
RET
BLCK2: BIT 7,D
LD A,5
RET Z
LD A,4
RET
BLCK1: BIT 7,H
JR NZ,BLCK5
BIT 7,D
LD A,7
RET Z
LD A,2
RET
BLCK5: BIT 7,D
LD A,6
RET Z
LD A,3
RET
;
ABSHL: BIT 7,H
RET Z
NEGHL: LD A,H
CPL
LD H,A
LD A,L
CPL
LD L,A
INC HL
RET
;
;PLOT Ü-ÞÙ
PLALL: LD DE,(POINTY)
ADD HL,DE
LD DE,65336
LD B,H
LD C,L
ADD HL,DE
RET C
PL1: LD HL,0000H ;LKD HL,XXXXH
LD DE,(POINTX)
ADD HL,DE
EX DE,HL
LD HL,64896
ADD HL,DE
RET C
LD H,B
LD L,C
JP PSET0
;
;
;ÃßÜ Zs"Ù Ü-ÞÙ
HIRITU: ENT
PUSH AF
PUSH DE
LD B,8
LD C,L
LD E,H
XOR A
LD D,A
LD H,A
LD L,A
EX AF,AF'
LD A,(CIR.HD)
HR1: RRA
JR NC,HR2
ADD HL,DE
EX AF,AF'
ADD A,C
JR NC,HR3
INC HL
HR3: EX AF,AF'
HR2: SLA C
RL E
RL D
DJNZ HR1
EX AF,AF'
BIT 7,A
JR Z,+3
INC HL
POP DE
POP AF
RET
;
CHENGE: LD (P14),A
LD (P24),A
LD (P34),A
LD (P44),A
LD (P54),A
LD (P64),A
LD (P74),A
LD (P84),A
RET
;
; work area
;
CI.D: EQU KEYBF ;2
DYY: EQU CI.D+2 ;2
XX: EQU DYY+2 ;2
YY: EQU XX+2 ;2
CYE: EQU YY+2 ;2
KBL: EQU CYE+2 ;1 \ÄÙÛ BLOCK NO.
SBL: EQU KBL+1 ;1 \<5C>mÄÙÛ BLOCK NO.
;
;
;ÛÛ CYE oÛºlym ÀÙ\
FUYE: EQU SBL+1 ;2
;ÛÛ XX oÛºlym ÀÙ\
FUXX: EQU FUYE+2 ;2
;ÛÛ CYE ÃßÜ oÛºlym ÀÙ\
FUYYHI: EQU FUXX+2 ;2
;ÛÛ XX ÃßÜ oÛºlym ÀÙ\
FUXXHI: EQU FUYYHI+2 ;2
;
FUNOYE: EQU FUXXHI+2 ;2
;
CIR.BK: EQU FUNOYE+2 ;9 Block data
;
;
KAIX: EQU CIR.BK+9 ;2 \ÄÙ X
KAIY: EQU KAIX+2 ;2 \ÄÙ Y
SYUX: EQU KAIY+2 ;2 \<5C>mÄÙ X
SYUY: EQU SYUX+2 ;2 \<5C>mÄÙ Y
XXHI: EQU SYUY+2 ;2 XXÛ ÃßÜ DATA
YYHI: EQU XXHI+2 ;2 YEÛ ÃßÜ DATA
;
XXX: EQU YYHI+2 ;2
YYY: EQU XXX+2 ;2
;
CIR.HF: EQU YYY+2 ;1
CIR.HD: EQU CIR.HF+1 ;1
;
SKP H
; ----------------------------
;
; Box Write
; ext DE':xs, DE:xe
; HL':ys, HL:ye
;
; if CF then A:fill color
;
; ----------------------------
LSTA: EQU KEYBF
RSTA: EQU LSTA+2
SPBOX: EQU RSTA+2
;
WBOX: ENT
LD (SPBOX),SP
EX AF,AF'
CALL WBOXSB
CALL WBOXSB
EXX
PUSH DE ;XS Upper
PUSH HL ;YS
PUSH DE ;XS Lower
EXX
PUSH HL ;YE
PUSH DE ;XE Lower
PUSH HL ;YE
PUSH DE ;XE Upper
EXX
PUSH HL ;YS
PUSH DE ;XS Upper Left
PUSH HL ;YS
EXX
EX AF,AF'
CALL C,BOXF ;Box fill
LD B,4
WBOX2: EXX
POP HL
POP DE
EXX
WBOX4: POP HL
POP DE
PUSH BC
CALL WLINE0 ;Box bound
POP BC
DJNZ WBOX4
RET
;
WBOXSB: EX DE,HL
LD A,H ;Compare HL,HL'
EXX
EX DE,HL
CP H
EXX
JR Z,WBOXS2
RET P
JR WBOXS4
WBOXS2: LD A,L
EXX
CP L
EXX
RET NC
WBOXS4: PUSH HL
EXX
EX (SP),HL
EXX
POP HL
RET
;
;--------------------------
;
; BOX FILL
;
; ent DE':xs, DE:xe
; HL':ys, HL:ye
; A:fill color
;
;--------------------------
BOXF:
CALL COLS ;Fill Color Set
LD B,A
LD A,(GMODE)
CP B
JR NZ,BOXC
LD SP,(SPBOX) ;line routions pop
BOXC: LD A,(PWMODE)
OR A
LD A,C0H ;w0 pset
JR Z,BOXF0
LD A,40H ;w0 or
BOXF0: OR B
OUT (LSWF),A ;Write mode set
;
YLINE: LD A,H
OR D
RET M
CALL BFCHK
LD A,L ;ye
;
EXX ;hl=ys,de=xs
BIT 7,H
JR Z,+5
LD HL,0
BIT 7,D
JR Z,+5
;
LD DE,0
EX AF,AF'
CALL BFCHK
RET C
EX AF,AF' ;ye
;
INC A
SUB L ;acc=lines(ye-ys+1)
RET C
RET Z
EX AF,AF' ;acc'=lines
;
PUSH HL ;ye
CALL ADCH
LD (LSTA),HL
EXX
POP HL ;ye
LD B,A ;left
PUSH BC
CALL ADCH
POP BC
LD (RSTA),HL
LD C,A ;right
LD DE,(LSTA)
;
HLINE: OR A
SBC HL,DE
JR Z,BOXI
DEC HL
INC DE ;next point
LD A,L
OR A
CALL NZ,BOXL ;a' reserve
;
BOXH: LD HL,TDOTR
LD A,B
LD B,0
ADD HL,BC
LD L,(HL)
LD C,A
LD A,L
LD HL,TDOTL
ADD HL,BC
LD B,(HL)
;
;
LD DE,(RSTA)
PUSH BC
CALL BOXW
POP BC
LD DE,(LSTA)
LD A,B
JR BOXW
;
;
;
;
BOXI: LD HL,TDOTR
LD A,B
LD B,0
ADD HL,BC
LD C,A
LD A,FFH
AND (HL)
LD HL,TDOTL
ADD HL,BC
AND (HL)
;
;
BOXW:
LD C,A
EX AF,AF'
LD B,A
EX AF,AF'
EX DE,HL
DI
BFL0: LD DE,80 ;40
IN A,(LSE0)
BOXW1: LD (HL),C
ADD HL,DE
DJNZ BOXW1
IN A,(LSE1)
EI
RET
;
;
;
;
BOXL: PUSH BC
EX DE,HL ;hl=start
LD B,A ;yoko counter
EX AF,AF'
LD C,A ;tate counter
EX AF,AF'
BFL1: LD DE,80 ;40
DI
BOXL1: PUSH HL
PUSH BC
IN A,(LSE0)
LD A,FFH
BOXL0: LD (HL),A
INC HL
DJNZ BOXL0
IN A,(LSE1)
POP BC
POP HL
ADD HL,DE
DEC C
JR NZ,BOXL1
EI
POP BC
RET
;
;
SKP H
;-----------------------------
;
; box fill range check
;
;-----------------------------
;
BFCHK: LD A,H
OR A
JR NZ,BFCHK0
LD A,199
CP L
JR NC,BFCHK1 ;skip if hl>199
BFCHK0: LD HL,199
SCF
BFCHK1: RRA ;push cf
PUSH HL
BFC0: LD HL,-640 ;-320
ADD HL,DE
POP HL
JR NC,BFCHK3 ;skip if de>639,319
BFC1: LD DE,639 ;319
RET
;
BFCHK3: RLA ;pop cf
RET
;-----------------------------
;
; Position check
;
;-----------------------------
POSCK: ENT
EXX
CALL RNGCK
EXX
RET NC ;OK
LD A,3
JP ERRORJ
;-----------------------------
;
; Position save
;
;-----------------------------
POSSV: ENT
EXX ;Position save
LD (POINTX),DE
LD (POINTY),HL
EXX
RET
SKP H
;----------------------------
;
; SYMBOL
;
; Ent. A:angle
; B:string length
; H:Y ratio
; L:X ratio
; DE:string address
;
;----------------------------
;
;
SBDTAP: DEFS 8
;
SDT0: EQU 1200H
SDT7: EQU 1207H
;
SCNT: EQU 1208H ;1
HCNT: EQU SCNT+1 ;1
VCNT: EQU HCNT+1 ;1
BCNT: EQU VCNT+1 ;1
;
STRAP: EQU BCNT+1 ;2
SDTAP: EQU STRAP+2 ;2
BDTAP: EQU SDTAP+2 ;2
;
DEFX0: EQU BDTAP+2 ;1
DEFY0: EQU DEFX0+1 ;1
DEFX8: EQU DEFY0+1 ;2
DEFY8: EQU DEFX8+2 ;2
;
PX: EQU DEFY8+2 ;2
PY: EQU PX+2 ;2
;
VADD: EQU PY+2 ;2
LDOT: EQU VADD+2 ;1
;
DEFX: EQU LDOT+1 ;1
DEFY: EQU DEFX+1 ;1
DEF8: EQU DEFY+1 ;2
;
NSDT: EQU DEF8+2 ;2
;
;
CLLADD: DEFW LOD00
DEFW LOD90
DEFW LOD18
DEFW LOD27
;
;
SYMBOL: ENT
PUSH BC ;string length
PUSH DE ;string address
LD BC,PX
LD D,L
LD E,H
BIT 0,A
JR Z,SYMB10 ;skip acc=0,2
;
EX DE,HL ;exchange milti
INC BC
INC BC ;bc=py
;
SYMB10: LD (SYMB18+1),BC
LD (DEFX0),HL
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL ;defx8=defx*8
LD (DEFX8),HL
;
LD L,E
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL ;defy8=defy*8
LD (DEFY8),HL
;
;
; set py ,def8
;
LD DE,0
EX DE,HL ;de=defy8
SBC HL,DE ;hl=-defy8
LD (DEF8),HL ;def8=-defy8
BIT 1,A
JR Z,SYMB11 ;skip if acc=0,1
;
LD (DEF8),DE ;def8=defy8
SYMB11: OR A ;HL=-defy8
JP PO,SYMB12 ;skip if acc=1,2
;
LD HL,0
SYMB12: LD DE,(POINTY)
ADD HL,DE ;pointy or pointy-defy8
LD (PY),HL ;set py
;
;
; set px def8
;
;
LD DE,(DEFX8)
LD HL,0
OR A ;de=defx8
SBC HL,DE ;hl=-defx8
BIT 0,A
JR NZ,SYMB13 ;skip if acc=1,3
BIT 1,A
LD (DEF8),DE ;DE=defx8
JR Z,SYMB13 ;skip if acc=0
LD (DEF8),HL ;hl=-defx8
SYMB13: EX DE,HL ;de=-defx8
LD HL,(POINTX)
BIT 1,A
JR Z,SYMB15 ;skip if acc=0,1
ADD HL,DE ;pointx or pointx-defx8
SYMB15: LD (PX),HL ;set px
;
; calc rotation program addr
;
ADD A,A
LD HL,CLLADD
LD D,0
LD E,A
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD (SYMS10+1),DE
;
CALL SETW ;set pwmode
POP HL
POP BC
;
SYMB17: DEC B ;string count down
RET M
;
PUSH HL
PUSH BC
CALL SYMS
SYMB18: LD HL,PX ;py
LD E,(HL) ;calc px(py)=px(py)+def8
INC HL
LD D,(HL)
PUSH HL
LD HL,(DEF8)
ADD HL,DE
EX DE,HL
POP HL
LD (HL),D
DEC HL
LD (HL),E ;set next disp addr
POP BC
POP HL
INC HL ;next string pointer
JR SYMB17
SKP H
;
; // SYMBOL SUB. //
;
;
;
SYMS: LD IY,SCNT
LD A,(HL) ;mz ascii -> display
SVC .?ADCN ;font addr calc
RST 3
DEFB .?ADCN
ENDM
LD H,0
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD A,10H
ADD A,H
LD H,A ;hl=hl+1000H
;
LD DE,SBDTAP ;xfer cg data
LD BC,8
DI
IN A,(LSE0)
LDIR
IN A,(LSE1)
EI
;
LD B,8 ;rotation pro.
SYMS10: CALL LOD00 ;LODXX
;
;
LD HL,808H
LD (HCNT),HL ;set hcnt,vcnt
LD DE,(DEFX0)
LD (DEFX),DE
LD HL,(PX)
BIT 7,H
JR Z,SYMS20 ;skip if PX>=0
;
CALL SSYMB
RET C ;error position
;
;
SYMS11: EXX ;data area rotate
LD B,8
LD HL,SDT0
SYMS12: RLC (HL)
INC HL
DJNZ SYMS12
EXX
DJNZ SYMS11
;
LD HL,0
SYMS20: LD (SYMS23+1),HL
LD A,F8H
AND L
OR H
RRC A
RRC A
RRC A
SYMS21: SUB 80 ;40
RET NC ;buffer full check?
;
LD L,A ;SEND DATA ADD.
LD H,11H
LD (BDTAP),HL
LD HL,(PY)
XOR A
BIT 7,H
JR Z,SYMS22
;
INC IY
CALL SSYMB
DEC IY
RET C ;error position
;
;
LD HL,0
LD A,8
SUB B
SYMS22: LD (SYMS24+1),A
SYMS23: LD DE,0 ;XXH
PUSH HL
PUSH DE
CALL RNGCK
POP DE
POP HL
RET C ;error position
;
CALL ADCH
LD (VADD),HL
LD HL,TDOTN
LD D,0
LD E,A
ADD HL,DE
LD A,(HL)
LD (LDOT),A
SYMS24: LD HL,SDT0
SYMS25: LD DE,(BDTAP)
LD BC,(LDOT) ;b defx c ldot
XOR A
EXX
LD B,(IY+1) ;hcnt
;
SYMS30: EXX
LD (DE),A
XOR A
;
RRC (HL)
JR NC,SYMS31
;
LD A,B1H ;OR C
SYMS31: LD (SYMS32),A
LD A,(DE)
;
SYMS32: OR C ;nop
RLC C
JR NC,SYMS33
LD (DE),A
INC E ;next data addr
JR Z,SYMS34 ;skip if buffer full
XOR A
SYMS33: DJNZ SYMS32
;
SYMS3A: LD B,(IY+0AH) ;defx0
EXX
DJNZ SYMS30 ;hcnt
;
EXX
LD (DE),A
INC E
;
SYMS34: DEC E
INC L
LD (SDTAP),HL
LD HL,(BDTAP)
EX DE,HL
XOR A
SBC HL,DE
INC HL
LD (NSDT),HL
LD A,(DEFY)
LD B,A ;loop counter set
;
SYMS40: EXX
LD DE,(VADD)
LD HL,(BDTAP)
LD BC,(NSDT)
DI
IN A,(LSE0)
OUT (LSE0),A
LDIR
IN A,(LSE1)
EI
SYMS41: LD DE,80 ;40
LD HL,(VADD)
ADD HL,DE
LD (VADD),HL ;next disp addr
SYMS42: LD DE,BE80H ;9F40H
OR A
SBC HL,DE
RET NC ;position error check
;
EXX
DJNZ SYMS40
;
SYMS43: LD A,(DEFY0) ;
LD (DEFY),A ;set loop counter
LD HL,(SDTAP)
DEC (IY+2) ;VCNT
JP NZ,SYMS25
RET
SKP H
;
; // rotation sub . //
;
LOD00: LD HL,SBDTAP
LD DE,SDT0
LD C,B
LD B,0
LDIR
RET
;
;
LOD90: LD DE,SDT0
LOD901: EXX
LD HL,SBDTAP
LD B,8
XOR A
;
LOD902: RLC (HL)
RRA
INC HL
DJNZ LOD902
;
EXX
LD (DE),A
INC DE
DJNZ LOD901
;
RET
;
;
LOD18: LD DE,SDT7
LD HL,SBDTAP
;
LOD181: LD A,(HL)
EXX
LD C,A
LD B,8
XOR A
;
LOD182: RR C
RL A
DJNZ LOD182
;
EXX
LD (DE),A
INC HL
DEC DE
DJNZ LOD181
;
RET
;
;
LOD27: LD DE,SDT7
LOD271: EXX
LD HL,SBDTAP
XOR A
LD B,8
;
LOD272: RLC (HL)
RLA
INC HL
DJNZ LOD272
;
EXX
LD (DE),A
DEC DE
DJNZ LOD271
RET
;
; calc position
;
;
SSYMB: LD B,8
LD E,(IY+0AH) ;defx0,defy0
LD D,0
;
SSYMB1: ADD HL,DE
BIT 7,H
JR Z,SSYMB2
DJNZ SSYMB1
SSYMB4: SCF
RET
;
SSYMB2: LD A,H
OR L
JR NZ,SSYMB3
LD L,E
DEC B
JR Z,SSYMB4
SSYMB3: LD (IY+17H),L ;defx,defy
LD (IY+1),B ;HCNT,VCNT
OR A
RET
SKP H
;
;-------------------------------
;
;
; PATTERN
; ent A:Heighth
; B:String length
; H:Direction
; DE:String adrs
;
;-------------------------------
POINTW: EQU KEYBF ;2
STRAD: EQU POINTW+2 ;2
PATDA1: EQU POINTW+250
PATDA2: EQU POINTW+251
PATDA3: EQU POINTW+252
PATDA4: EQU POINTW+263
;
;
CHARW: ENT
OR A ;no mode ?
RET Z ;yes
LD (STRAD),DE
LD E,A ;E'=Height
LD C,A ;C'=Height(work)
LD A,H
OR A
LD A,23H ;INC HL
JR NZ,PATT1 ;DOWN
;
LD A,2BH ;DEC HL
PATT1: LD (PATTA),A
LD (PATTC),A
LD A,B
OR A ;no string ?
RET Z ;yes
;
LD HL,(POINTX)
LD A,07H
AND L
LD D,A
EXX ;keep c',e',b',d'
LD HL,TDOTL
LD D,0
LD E,A
ADD HL,DE
LD A,(HL)
;
LD (PATTB+1),A ;MASK DATA
;
PATT3: LD HL,(POINTY)
PATT4: LD (POINTW),HL ;save (POINTY)
;
PATTB: LD C,FFH ;C=mask data
LD HL,(STRAD) ;read DATA
LD A,(HL)
;
EXX ;keep c',e',b',d'
LD H,A
LD A,D
OR A ;X=0 ?
JR Z,PATT6 ;yeS
PATT7: RRC H
DEC A
JR NZ,PATT7
PATT6: LD A,H
EXX ;A=pattern data
;
LD HL,PATDA1
;
LD B,8 ;DATA sift
LD D,A
PATT80: SRL D
RLA
DJNZ PATT80
;
LD D,A ;C^D
AND C
LD (HL),A ;left set data
;
LD A,D
CPL
LD B,A ;B=CPL(D)=CPL(STRAD)
AND C ;C^CPL(D)
INC HL
LD (HL),A ;left reset data
;
LD A,C
CPL
LD C,A
AND D ;CPL(C)^D
INC HL
LD (HL),A ;right set data
;
LD A,C
AND B ;CPL(C)^CPL(D)
INC HL
LD (HL),A ;right reset data
;
LD DE,(POINTX)
LD HL,(POINTW)
;
;
PUSH DE
PUSH HL
EX DE,HL ;X=X+1
LD BC,8
ADD HL,BC
EX DE,HL
LD A,1 ;right mode
CALL PATT90
POP HL
POP DE
;
XOR A ;left mode
CALL PATT90
;
;
LD HL,(STRAD) ;next data
INC HL
LD (STRAD),HL
EXX
DJNZ PATT5 ;B'
;
DEC C ;C' X-->END
EXX
JP Z,PATT70 ;X=X+8 & END
LD HL,(POINTW)
PATTC: INC HL ;DEC HL
LD (POINTY),HL
;
XOR A ;end
RET
;
PATT5: DEC C ;C'
JR NZ,PATT2 ;next Xposition
LD C,E ;C' E'
EXX
CALL PATT70 ;X=X+8
JR PATT3
;
;
PATT2: EXX
LD HL,(POINTW)
PATTA: INC HL ;DEC HL
JR PATT4
;
; pointx+8
;
PATT70: LD HL,(POINTX)
LD BC,8
ADD HL,BC
LD (POINTX),HL
RET
;
;---------------------------
;
; V-RAM write
; non keep
;
; A=0 ---->left
; 1 ---->right
; DE=X positin
; HL=y position
;---------------------------
ATT90: EX AF,AF' ;push AF
CALL RNGCK
RET C ;address err
;
CALL ADCH ;get V-RAM address
LD B,A ;B=0 -->no right data
; HL=V-RAM address
;
LD DE,PATDA1 ;(DE)=write data
EX AF,AF' ;pop AF
OR A ;left data ?
JR Z,PATT91 ;yes
;
LD A,B ;non right data
OR A
RET Z
;
INC DE ;DE,PATDA3
INC DE
PATT91: CALL SETW ;mode set
DI
IN A,(LSE0)
OUT (LSE0),A ;get V-RAM
LD A,(DE) ;B=right data
LD (HL),A
LD A,(PWMODE)
OR A ;OR mode ?
JR NZ,PATT92 ;YES
;
LD A,(CPLANE) ;read color data
OR 60H
OUT (LSWF),A
INC DE
LD A,(DE) ;C=reset data
LD (HL),A
PATT92: IN A,(LSE1)
EI
RET
;
LIST
INCLD PAINT
;
; --------------------------------
;
; PAINT ROUTINE ( 9.5/84 )
;
;
; HL: COLOR ADD.
; B : NUM. of COLOR
;
; -------------------------------
;
DIRAR: EQU 27D0H
ENKYB: EQU 12A0H
NDSP: EQU KEYBF ;2
DSP: EQU NDSP+2 ;2
NSSP: EQU DSP+2 ;1
SSP: EQU NSSP+1 ;2
PBXL: EQU SSP+2 ;2
PBXR: EQU PBXL+2 ;2
;
Y: EQU PBXR+2 ;2
BXL: EQU Y+2 ;2
BXR: EQU BXL+2 ;2
DIRECT: EQU BXR+2 ;1
JCONT: EQU DIRECT+1 ;1
JSAVE: EQU JCONT+1 ;1
JSAVE1: EQU JSAVE+1 ;1
BUFF: EQU JSAVE1+1 ;11 DATA BUFF.
;
PEEK: EQU DIRAR ;PROGRAM AREA
;
WORK: EQU Y
;
;
; // MAIN ROUTINE //
;
;
WPAINT: ENT
LD A,(GMODE)
OR C0H
OUT (LSWF),A ;Write mode set
EXX
LD DE,PEEK ;MAKE PEEK ROUTINE
LD HL,DPEEK
LD BC,DPEEK1-DPEEK
LDIR
EXX
;
PAIN0: LD A,(HL) ; COLOR SELECT
CALL COLS ;Bound Color Set
OR 80H ;SEARCH MODE SET
LD (DPEEK1+1),A
INC HL
EXX
LD HL,DPEEK1
LD BC,DPEEK2-DPEEK1
LDIR
EXX
DJNZ PAIN0
;
EXX
LD BC,DPEEK3-DPEEK2+1
LDIR
LD HL,(TMPEND)
LD (DSP),HL
LD (CSAVE+2),HL
LD HL,(PAIWED)
LD DE,-6
ADD HL,DE
LD (SVDT0+1),HL
;
;
LD HL,(POINTX)
DEC HL
LD (BXL),HL ;BXL=POINTX-1
INC HL
INC HL
LD (BXR),HL ;BXR=POINTX+1
DEC HL
EX DE,HL
LD HL,0
LD (NDSP),HL
LD HL,(POINTY)
LD (Y),HL
CALL RNGCK
CCF
RET NC ;START OUT RANGE
;
LD (SOVER1),SP
LD SP,DIRAR+700H
;
;
CALL ADCH
LD DE,TDOTN
PUSH HL
LD H,0
LD L,A
ADD HL,DE
LD C,(HL)
POP HL
CALL PEEK
AND C
JP NZ,PAINCE ;ON BOUND
;
CALL RBSR
LD (BXR),IX ;SET R.BOUND
CALL LBSR
LD (BXL),IX ;SET L.BOUND
LD A,FFH
LD (DIRECT),A ;DOWN
CALL SVDT
LD HL,ENKYB
LD (SSP),HL
XOR A
LD (DIRECT),A
LD (NSSP),A
;
PAIN1: LD A,(DIRECT)
CALL CHDIR0
LD A,199
CP L
JR C,PAINA ;OUT RANGE
;
CALL NBSRCH
JR C,PAINA ;CLOSE
;
LD (JCONT),A
AND 9
CALL NZ,PAIND
;
CALL CSAVE
LD A,(JSAVE)
OR A
JR NZ,PAINA
;
PAIN3: CALL PSRCH
JR Z,PAIN1
;
LD HL,(BXR)
PUSH HL
PUSH DE
CALL RBSR0
LD (BXR),IX
CALL SVDT
POP HL
LD (BXL),HL
POP HL
LD (BXR),HL
JR PAIN1
;
;
PAINA: LD HL,(DSP)
DEC HL
LD DE,-7
LD BC,(NDSP)
PAINA1: LD A,B
OR C
JR Z,PAINC
;
LD A,0FH
DEC BC
CP (HL)
ADD HL,DE
JR Z,PAINA1
;
INC HL
PUSH HL
LD (PAINA2+1),HL
LD DE,WORK
LD BC,7
LDIR
EX DE,HL
LD HL,(DSP)
XOR A
POP BC
LD (DSP),BC
SBC HL,DE
JR Z,PAINA3
;
LD B,H
LD C,L
PAINA2: LD HL,00H ;XXH
EX DE,HL
LDIR
LD (DSP),DE
;
PAINA3: LD HL,(NDSP)
DEC HL
LD (NDSP),HL
JP PAIN3
;
;
PAINC: LD HL,(NDSP)
LD A,L
OR H
JR NZ,PAINC0
;
PAINCE: LD SP,(SOVER1) ;END JOB
RET
;
;
PAINC0: DEC HL
LD (NDSP),HL
LD HL,(DSP)
DEC HL
LD DE,WORK+6
LD BC,7
LDDR
INC HL
LD (DSP),HL
;
PAINC1: CALL PSRCH
JR Z,PAINC
;
CALL RBSR0
LD (BXR),IX
JR PAINC1
;
;
PAIND: LD HL,PBXL ;DATA SAVE
LD DE,BUFF
CALL PAIND3
LD A,(JCONT)
BIT 0,A
JR Z,PAIND1
;
LTW: LD HL,(PBXL)
LD (BXR),HL
CALL TWR
JR C,LTW1 ;CLOSE
;
BIT 0,A
JR NZ,LTW
;
LTW1: CALL PAIND2
LD A,(JCONT)
CP 9
RET NZ
;
PAIND1: LD HL,(PBXR)
LD (BXL),HL
CALL TWR
JR C,PAIND2
;
BIT 3,A
JR NZ,PAIND1
;
PAIND2: LD HL,BUFF
LD DE,PBXL
PAIND3: LD BC,11
LDIR
RET
;
;
;
; CHECK SAVE DATA
;
;
CSAVE: LD IY,00H ;XXH
LD BC,(NDSP)
LD HL,00H
LD (JSAVE),HL ;STATUS CLEAR
;
CSAVE1: CALL DSAVE
LD A,(NSSP)
OR A
RET Z
;
DEC A
LD (NSSP),A
LD (CSAVE2+1),SP
LD SP,(SSP)
POP IY
POP BC
POP HL
LD (BXR),HL
POP HL
LD (BXL),HL
LD (SSP),SP
CSAVE2: LD SP,00H ;XXH
JR CSAVE1
;
;
DSAVE: LD A,B
OR C
LD (DSAVEC+1),BC
JP Z,DSAVE3
;
LD HL,(Y)
LD E,(IY+0)
LD D,(IY+1)
XOR A
SBC HL,DE
JR NZ,DSAVE2
;
CALL COMP
CP 5
JR Z,DSAVE1
;
CP 0FH
JR NZ,DSAVE4
;
LD L,(IY+2) ;SBXL
LD H,(IY+3)
LD DE,(BXR)
XOR A
SBC HL,DE
JR NC,DSAVE2
;
LD HL,(BXL)
PUSH HL
LD L,(IY+2)
LD H,(IY+3)
PUSH HL
LD (BXL),HL
LD A,3
CALL ESAVE
POP HL
LD (BXR),HL
POP HL
LD (BXL),HL
CALL RBSR
LD (BXR),IX
JR DSAVE2
;
DSAVE1: LD E,(IY+4) ;SBXR
LD D,(IY+5)
LD HL,(BXL)
XOR A
SBC HL,DE
JR NC,DSAVE2
;
LD HL,(BXR)
PUSH HL
LD L,(IY+4)
LD H,(IY+5)
PUSH HL
LD (BXR),HL
LD A,4
CALL ESAVE
POP HL
LD (BXL),HL
POP HL
LD (BXR),HL
CALL LBSR
LD (BXL),IX
;
DSAVE2: LD DE,7
ADD IY,DE
DSAVEC: LD BC,00H ;XXH
DEC BC
JP DSAVE
;
DSAVE3: LD A,(JSAVE1)
OR A
CALL NZ,SVDT
RET
;
DSAVE4: EX AF,AF'
LD A,0FH
LD (JSAVE),A
EX AF,AF'
OR A
JR NZ,DSAVE5
;
LD A,0FH
LD (IY+6),A
RET
;
DSAVE5: CP 1
JR NZ,DSAVE6
;
LD L,(IY+4) ;SBXR
LD H,(IY+5)
LD (BXL),HL
CALL LBSR
LD (BXL),IX
JR DSAVE8
;
DSAVE6: CP 0CH
JR NZ,DSAVE9
;
DSAVE7: LD L,(IY+2) ;SBXL
LD H,(IY+3)
LD (BXR),HL
CALL RBSR
LD (BXR),IX
DSAVE8: LD A,0FH
LD (IY+6),A
LD (JSAVE1),A ;SAVE DATA AFTER JOB
JR DSAVE2
;
;
DSAVE9: CP 0DH
JP NZ,ESAVE
;
LD A,(NSSP)
INC A
CP 27
CCF
JP C,SOVER ;STACK OVER
;
LD (NSSP),A
LD HL,(BXL)
PUSH HL ;SAVE BXL
LD L,(IY+4)
LD H,(IY+5)
LD (BXL),HL
CALL LBSR
LD (DSAVEB+2),IY
LD DE,7
ADD IY,DE
LD BC,(DSAVEC+1)
DEC BC
LD (DSAVEA+1),SP
LD SP,(SSP)
PUSH IX ;BXL
LD DE,(BXR)
PUSH DE
PUSH BC
PUSH IY
LD (SSP),SP
DSAVEA: LD SP,00H ;XXH
DSAVEB: LD IY,00H ;XXH
POP HL
LD (BXL),HL
JP DSAVE7
;
;
ESAVE: EX AF,AF'
CALL SVDT
DEC DE
LD A,0FH
LD (DE),A
EX AF,AF'
CP 3
JR NZ,ESAVE2
;
ESAVE1: LD HL,(BXR)
LD (BXL),HL
LD L,(IY+4)
LD H,(IY+5) ;SBXR
LD (BXR),HL
CALL LBSR
PUSH IX
POP HL
LD (IY+2),L
LD (IY+3),H
RET
;
ESAVE2: CP 4
JR Z,ESAVE3
;
LD HL,(DSP)
PUSH HL
LD (SVDT1+1),IY
CALL SVDT
LD HL,WORK
LD (SVDT1+1),HL
LD HL,(BXL)
PUSH HL
CALL ESAVE1
POP HL
LD (BXR),HL
POP IY
JR ESAVE4
;
;
ESAVE3: LD HL,(BXL)
LD (BXR),HL
ESAVE4: LD L,(IY+2)
LD H,(IY+3)
LD (BXL),HL
CALL RBSR
PUSH IX
POP HL
LD (IY+4),L
LD (IY+5),H
RET
;
;
; NEXT BOUNS SEARCH
;
;
NBSRCH: LD HL,(BXL)
LD (PBXL),HL
LD HL,(BXR)
LD (PBXR),HL
CALL LBSR
RET C ;CLOSE
;
LD (BXL),IX
CALL RBSR
LD (BXR),IX
CALL CONT ;CF=0
LD A,B
RET
;
; CHANGE Y DIRECTON
; &
; NEXT Y CO-ORDINATE
;
CHDIR: LD A,(DIRECT)
CPL
LD (DIRECT),A
CHDIR0: LD HL,(Y)
INC L
OR A
JR NZ,CHDIR1
;
DEC L
DEC L
CHDIR1: LD (Y),HL
RET
;
;
TWR: CALL CHDIR
CALL NBSRCH
RET C
;
PUSH AF
LD HL,(BXL)
PUSH HL
LD HL,(BXR)
PUSH HL
CALL CSAVE
LD A,(JSAVE)
OR A
CALL Z,SVDT
;
POP HL
LD (BXR),HL
POP HL
LD (BXL),HL
POP AF
RET
;
;
; *** BOUND SEARCH ****
;
;
;
; // LEFT BOUNS SEARCH //
;
LBSR: LD DE,(BXR)
LD HL,(BXL)
PUSH HL
LD (BSRCH4+1),DE
LD HL,00H
LD (BSRCH6+1),HL
LD A,2BH ;DEC IX
LD (BSRCH3+1),A
LD A,2FH ;CPL
LD (BSRCH5),A
XOR A
LD (BSRCH7),A
LD HL,BSRCHL
LD (BSRCH1+1),HL
LD HL,BSRCHR
LD (BSRCH2+1),HL
POP DE
INC DE
JR BSRCH
;
; // RIGHT BOUNS SEARCH //
;
RBSR: LD DE,(BXR)
RBSR0: LD HL,(BXL)
LD (BSRCH6+1),HL
DEFB 21H ;LD HL,640 or 320
LRBSR: ENT
DEFW 8002H
LD (BSRCH4+1),HL
LD A,23H ;INC IX
LD (BSRCH3+1),A
LD A,2FH ;CPL
LD (BSRCH7),A
XOR A
LD (BSRCH5),A
LD HL,BSRCHR
LD (BSRCH1+1),HL
LD HL,BSRCHL
LD (BSRCH2+1),HL
DEC DE
;
;
; // SEARCH ROUTINE //
;
BSRCH: LD HL,(Y)
PUSH DE
POP IX
CALL ADCH
LD DE,TDOTN
PUSH HL
LD H,0
LD L,A
ADD HL,DE
LD C,(HL)
POP HL
CALL PEEK
LD E,A
AND C
BSRCH1: JP Z,BSRCHL ;JP BSRCHR
;
BSRCH2: CALL BSRCHR ;CALL BSRCHL
BSRCH3: DEC IX ;INC IX
RET
;
; ++ SEARCH LEFT +++
;
BSRCHL: DEC IX
RRC C
JR NC,BSRCHC
;
PUSH IX
EXX
POP DE
INC DE
BSRCH6: LD HL,00H ;BX
INC HL
SBC HL,DE
EXX
RET NC
;
DEC HL
CALL PEEK
LD E,A
BSRCHC: LD A,E
BSRCH7: NOP ;CPL
AND C
JP Z,BSRCHL
RET
;
; ++ SEARCH RIGHT +++
;
BSRCHR: INC IX
RLC C
JR NC,BSRCHA
;
CALL BSRCHD
RET C
;
INC HL
CALL PEEK
LD E,A
BSRCHA: LD A,E
BSRCH5: CPL ;NOP
AND C
JR Z,BSRCHR
BSRCHD: PUSH IX
EXX
POP HL
BSRCH4: LD DE,BXR
XOR A
SBC HL,DE
EXX
CCF
RET
;
;
;
; // CONT. CHECK //
;
CONT: LD B,0H
LD HL,(PBXR)
LD DE,(BXR)
CALL CONT1
LD HL,(PBXL)
LD DE,(BXL)
INC HL ;FOR HL=FFH
INC DE ;FOR DE=FFH
;
CONT1: PUSH HL
XOR A
INC HL
SBC HL,DE
POP HL
RL B
INC DE
EX DE,HL
SBC HL,DE
RL B
RET
;
;
; *** POINT DATA
;
; SAVE & LOAD ****
;
;
; // DATA SAVE //
;
SVDT: LD DE,(DSP)
SVDT0: LD HL,0000 ; XX END ADD
XOR A
SBC HL,DE
JR NC,SVDT1
;
SOVER: ENT
DEFB 31H ;STACK POINTER
SOVER1: ENT ;LD SP,XXH
DEFW 00H
SCF
RET
;
SVDT1: LD HL,WORK
LD BC,0007H
LDIR
LD (DSP),DE
LD HL,(NDSP)
INC HL
LD (NDSP),HL
RET
;
;
; *** PAINT & SEARCH ****
;
;
PSRCH: LD HL,(Y)
LD DE,(BXR)
DEC DE
CALL ADCH
LD DE,TDOTR
PUSH HL
LD H,0
LD L,A
ADD HL,DE
INC C
LD B,C
LD C,(HL)
POP HL
;
PSRCH1: CALL PEEK
AND C
JR NZ,PSRCH2 ;BOUND
;
DI
IN A,(LSE0)
LD (HL),C
IN A,(LSE1)
EI
LD C,FFH
DEC HL
DJNZ PSRCH1
;
LD DE,-1
JR PSRCH5
;
PSRCH2: LD E,B
LD B,7H
LD D,00H
PSRCH3: RLC A
JR C,PSRCH4
;
SCF
RR D
DJNZ PSRCH3
;
PSRCH4: IN A,(LSE0)
LD A,C
AND D
LD (HL),A
IN A,(LSE1)
;
LD A,E
DEC A
RLC A
RLC A
RLC A
LD C,A
LD A,07H
AND C
LD D,A
LD A,F8H
AND C
OR B
LD E,A
PSRCH5: XOR A
LD HL,(BXL)
SBC HL,DE
RET
;
;
; // PEEK DATA //
;
DPEEK: PUSH HL
EXX
POP HL
DI
IN A,(LSE0)
LD C,LSRF
XOR A
;
DPEEK1: LD B,00H ;RE DATA
OUT (C),B
OR (HL)
;
DPEEK2: LD E,A
IN A,(LSE1)
EI
LD A,E
EXX
DPEEK3: RET
;
;
; // COMP. BXL,BXR //
;
COMP: LD HL,(BXL)
LD E,(IY+2)
LD D,(IY+3)
INC HL
INC DE
XOR A
CALL COMP1
LD HL,(BXR)
LD E,(IY+4)
LD D,(IY+5)
;
COMP1: SBC HL,DE
RLA
RLA
RET Z
;
OR 1
RET
;
END
;
END