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

717 lines
14 KiB
NASM
Raw Blame History

; -----------------------------
; MZ-800 BASIC Graphic command
; FI:GRPH ver 1.0B 9.21.84
; Programed by T.Miho
; -----------------------------
;
INCLD MACRO
;
BITFU2: DEFB 0 ;Default W0/W1
COL: ENT ;Color code
DEFB 03H
;
;;;;;;;;;;;;;;;
;
; SET/RESET [c,w]x,y
;
SET: ENT
DEFB F6H
RESET: ENT
XOR A
PUSH AF
CALL COORD0
SVC .POSSV
RST 3
DEFB .POSSV
ENDM
POP AF ;SET/RESET
PUSH HL
EXX
SVC .PSET
RST 3
DEFB .PSET
ENDM
POP HL
RET
;
;;;;;;;;;;;;;;;;;;
;
; LINE/BLINE [c,w] x0,y0,x1,y1,.....
;
LINE: ENT
DEFB F6H
BLINE: ENT
XOR A
LD (LINE4+1),A
CALL COORD0
CALL HCH2CH
LINE2: EXX
PUSH HL ;YS
PUSH DE ;XS
EXX
CALL COORD
POP DE ;XS
EX (SP),HL ;YS,Text
EXX
LINE4: LD A,0 ;LINE/BLINE
SVC .LINE
RST 3
DEFB .LINE
ENDM
POP HL
TEST1 ","
CALL TEST1
DEFB ","
ENDM
JR Z,LINE2
SVC .POSSV
RST 3
DEFB .POSSV
ENDM
RET
SKP H
;
;;;;;;;;;;;;;;;;;;;;;;;;
;
; PATTERN [C,W] N,X$
;
PATTER: ENT
CALL COLCON
CALL IDEEXP
XOR A
BIT 7,D
JR Z,GRDSP4
PUSH HL
LD H,A
LD L,A
SBC HL,DE
EX DE,HL
POP HL
LD A,1
GRDSP4: EX AF,AF'
LD A,D
OR A
JR NZ,ER03A
LD A,E
PUSH AF
EX AF,AF'
PUSH AF
CALL HCH2CH
CALL STREXP
POP AF
LD C,A
POP AF
PUSH HL
LD H,C
SVC .PATTR
RST 3
DEFB .PATTR
ENDM
POP HL
CALL ENDCHK
JR NZ,PATTER
RET
SKP H
;;;;;;;;;;;;;;;;;;;
;
; POSITION x,y
;
POSITI: ENT
CALL COORD
SVC .POSSV
RST 3
DEFB .POSSV
ENDM
RET
;
; Get X-Y coordinate
;
COORD0: CALL COLCON
COORD: CALL COORD1 ;Get x,y coordinate
PUSH DE
TEST1 ','
CALL TEST1
DEFB ','
ENDM
CALL COORD1
PUSH DE
EXX
POP HL
POP DE
EXX
RET
;
;
COORD1: CALL IDEEXP
LD A,D ;0000 ... 3FFF
ADD A,40H ;C000 ... FFFF
RET P
ER03A: JP ER03
SKP H
;;;;;;;;;;;;;;;;;;;;;;;
;
; color palette
;
PALET: ENT
CALL ENDCHK
JP Z,ER01
CALL PALRD
CALL COLCK2
AND 03H
PUSH AF
LD A,(PALBK)
LD D,E
SRL D
SRL D
CP D
JP NZ,ER22
TESTX ','
CALL TESTX
DEFB ','
ENDM
CALL PALRD
LD B,A
POP AF
SVC .DPLST
RST 3
DEFB .DPLST
ENDM
RET
;
PALRD: CALL IBYTE
CP 16 ;0 .. 15 check
JR NC,ER03A
RET
;
SKP H
;;;;;;;;;;;;;;;;;;;;
;
; BOX [c,w] xs,ys,xe,ye
BOX: ENT
CALL COORD0
EXX
PUSH HL ;YS
PUSH DE ;XS
EXX
CALL HCH2CH
CALL COORD
EXX
PUSH HL ;YE
PUSH DE ;XE
EXX
CALL ENDCHK
JR Z,BOX9
CALL CH2CH
CALL ENDCHK
LD A,(COL)
CALL NZ,COLCHK
SCF
BOX9: EXX
POP DE
POP HL
EXX
POP DE
EX (SP),HL
SVC .BOX
RST 3
DEFB .BOX
ENDM
POP HL
RET
SKP H
;
;;;;;;;;;;;;;;;;;;
;
; COLOR c,w
;
COLOR: ENT
CALL COLSUB
LD A,(COL)
SVC .DCOL
RST 3
DEFB .DCOL
ENDM
LD (SELCOL),A
LD A,(PWMODE)
LD (BITFU2),A
CALL ENDZ
RET
;
;;;;;;;;;;;;;;;;
;
; COLOR CONTROL EXP
;
COLCON: ENT
TEST1 ","
CALL TEST1
DEFB ","
ENDM
TEST1 "["
CALL TEST1
DEFB "["
ENDM
JR NZ,COLCN1
CALL COLSUB
LD A,(COL)
SVC .DGCOL
RST 3
DEFB .DGCOL
ENDM
TESTX "]"
CALL TESTX
DEFB "]"
ENDM
TEST1 ","
CALL TEST1
DEFB ","
ENDM
RET
;
COLCN1: LD A,(SELCOL)
LD (COL),A
SVC .DGCOL
RST 3
DEFB .DGCOL
ENDM
COLCN2: LD A,(BITFU2)
LD (PWMODE),A
RET
;
COLSUB: TEST1 ","
CALL TEST1
DEFB ","
ENDM
JR Z,COLC8
CALL COLCHK
LD (COL),A
TEST1 ','
CALL TEST1
DEFB ','
ENDM
JR NZ,COLCN2
COLC9: CALL IBYTE
CP 2
JR NC,ER03B
LD (PWMODE),A
RET
;
COLC8: LD A,(SELCOL)
LD (COL),A
JR COLC9
;
COLCHK: ENT
PUSH BC
CALL IBYTE
POP BC
COLCK2: LD A,(CRTMD1)
RRA
JR C,CMD1
RRA
JR C,CMD2
RRA
JR C,CMD3
CMD1: LD A,E
CP 4
JR NC,ER03B
RET
CMD2: LD A,E
CP 16
JR NC,ER03B
RET
CMD3: LD A,E
CP 2
RET C
ER03B: JP ER03
;
SKP H
;;;;;;;;;;;;;;;;;;;;
;
;PAINT COMMAND
;
PAINT: ENT
CALL COLCON
CALL POSITI
LD B,0
LD DE,PAINTB
PUSH DE
CALL ENDCHK
JR Z,PAINT3
PAINT1: CALL CH2CH
PUSH DE
CALL COLCHK
POP DE
LD (DE),A
INC DE
INC B
LD A,B
CP 16
JP Z,ER01
CALL ENDCHK
JR NZ,PAINT1
PAINT2: EX (SP),HL ;data adrs
PUSH HL
LD HL,-527
ADD HL,SP
LD (PAIWED),HL
POP HL
SVC .PAINT
RST 3
DEFB .PAINT
ENDM
JP C,ER06
POP HL
RET
;
PAINT3: LD A,(COL)
LD (DE),A
INC B ; data count
JR PAINT2
PAINTB: DEFS 16
SKP H
;;;;;;;;;;;;;;;;;;;;
;
;CIRCLE COMMAND
;
CIRCLE: ENT
PUSH HL
LD HL,0
LD (CW.H+1),HL
LD (CW.XS+1),HL
LD (CW.YS+1),HL
LD (CW.XE+1),HL
LD (CW.YE+1),HL
LD HL,KK
CALL CLRFAC
LD HL,FLT2PI
LD DE,SK ;\<5C>mßám\l=2PAI
CALL LDIR5
POP HL
;\s\ºl yÝ-Ä
CALL COORD0
SVC .POSSV
RST 3
DEFB .POSSV
ENDM
CALL HCH2CH
CALL IDEEXP
PUSH HL
LD A,D
AND C0H
JP NZ,ER03
EX DE,HL
LD (CW.R+2),HL ;ÞÙZs
LD (CW.XS+1),HL
LD (CW.XE+1),HL
LD HL,(INTFAC)
LD DE,CIR.R
CALL LDIR5
POP HL
CALL ENDCHK
JP Z,CW
CALL CH2CH
TEST1 ','
CALL TEST1
DEFB ','
ENDM
JR Z,CIRCL2
CALL HIRIT
CALL ENDCHK
JP Z,CW
CALL CH2CH
CIRCL2: TEST1 ','
CALL TEST1
DEFB ','
ENDM
JR Z,CIRCL8
LD IX,CW.XS+1
LD IY,KK
CALL STX
CALL ENDCHK
JP Z,CW
CALL CH2CH
CIRCL8: TEST1 ','
CALL TEST1
DEFB ','
ENDM
JR Z,CIRCL4
LD IX,CW.XE+1
LD IY,SK
CALL STX
CALL ENDCHK
JP Z,CW
CALL CH2CH
CIRCL4: TESTX 'O'
CALL TESTX
DEFB 'O'
ENDM
SCF
JR +3
CW: XOR A
PUSH HL
PUSH AF
LD HL,KK
LD DE,SK
CALL SUB
CALL LDIR5
LD A,(KK)
OR A
LD B,0
JR Z,CW2 ;KK=SK
LD HL,KK+1
RES 7,M
DEC HL ;HL:= ABS(KK-SK)
LD DE,FLTPAI
CALL CMP
LD B,1
JR C,CW2 ; ABS() < PI
LD DE,FLT2PI
CALL CMP
LD B,2
JR C,CW2 ; PI <= ABS() < 2*PI
LD B,3 ;2*PI <= ABS()
CW2: LD A,(SK+1)
AND 80H
OR B
LD B,A
POP AF ;CF='O'
LD A,B
EXX
CW.XS: LD DE,0 ;Start X
CW.YS: LD HL,0 ;Start Y
CW.H: LD BC,0 ;HIRITU
EXX
CW.XE: LD DE,0 ;End X
CW.YE: LD HL,0 ;End Y
CW.R: LD IX,0 ;R
SVC .CIRCL
RST 3
DEFB .CIRCL
ENDM
POP HL
OR A
RET
;
HIRIT: CALL IDEEXP
CALL PUSHR
LD HL,(INTFAC)
INC HL
BIT 7,M
JP NZ,ER03
DEC HL
LD DE,FLONE
CALL CMP
RET Z
LD A,1
JR C,HI
LD HL,FLONE
LD DE,CIRW3
PUSH DE
CALL LDIR5
POP HL
LD DE,(INTFAC)
CALL DIV
LD A,2
HI: LD (CW.H+1),A
LD DE,256DT
CALL MUL
LD DE,0.5DT
CALL ADD
CALL HLFLT
LD A,L
LD (CW.H+2),A
BIT 0,H
RET Z
XOR A
LD (CW.H+1),A
RET
;
STX: PUSH IX
PUSH IY
CALL IDEEXP
POP DE ;KK/SK
POP IX
PUSH HL
PUSH IX
LD HL,(INTFAC)
CALL LDIR5
LD HL,(INTFAC)
LD DE,HL
REP5 INC,DE
INC DE
INC DE
INC DE
INC DE
INC DE
ENDM
CALL LDIR5
CALL COS ;HL=(INTFAC)+5
LD DE,CIR.R
CALL MUL
CALL STXSUB
LD HL,(INTFAC)
CALL SIN
LD DE,CIR.R
CALL MUL
CALL NEG
CALL STXSUB
POP IX
POP HL
RET
;
STXSUB: INC HL
BIT 7,M
PUSH AF
RES 7,M
DEC HL
LD DE,0.5DT
CALL ADD
POP AF
INC HL
JR Z,+4
SET 7,M
DEC HL
CALL HLFLT
EX DE,HL
POP HL ;RET ADRS
EX (SP),HL ;Save coordinate
LD M,E
INC HL
LD M,D
INC HL
INC HL
EX (SP),HL
JP (HL)
;
;
;CIRCLE WORK AREA PART-2
;
CIR.R: DEFS 5
;
CIRW3: DEFS 5
;
256DT: DEF5 89,00,00,00,00
DEFW 0089H
DEFW 0000H
DEFB 00H
ENDM
0.5DT: DEF5 80,00,00,A7,C6
DEFW 0080H
DEFW A700H
DEFB C6H
ENDM
;
KK: DEFS 5
SK: DEFS 5
;
; SYMBOL command
;
DIRARE: EQU 27D0H
;
SMBOL: ENT
CALL COORD0 ;position load
SVC .POSSV ;position input
RST 3
DEFB .POSSV
ENDM
CALL HCH2CH
;string pointer load
CALL STREXP
;string zero check
LD A,B
OR A
PUSH BC
PUSH HL
LD C,B
LD B,0
LD HL,DIRARE
EX DE,HL
JR Z,SMBL2
LDIR ;string data xfer
SMBL2: POP HL
CALL HCH2CH
CALL IBYTE ;yoko bairitsu
LD A,D
OR E
JR Z,ERJP3 ;zero error
PUSH DE
CALL HCH2CH
CALL IBYTE ;tate bairitsu
LD A,D
OR E
ERJP3: JP Z,ER03 ;zero error
LD A,E
POP DE
LD D,A
CALL ENDCHK ;end check
PUSH DE
JR Z,SMBL1
CALL HCH2CH
CALL IBYTE ;angle load
LD A,3
CP E
JP C,ER03
LD A,E
DEFB 06H
SMBL1: XOR A
POP DE
POP BC
LD C,A ;angle push
LD A,B ;string length
OR A
RET Z ;zero return
LD A,C ;angle pop
PUSH HL
EX DE,HL
LD DE,DIRARE
SVC .SYMBL
RST 3
DEFB .SYMBL
ENDM
POP HL
RET
;
SKP H
;
;;;;;;;;;;;;;;
;
; HCOPY 1/2/3
; CLS 1/2/3
;
HCOPY: ENT
CALL ENDZ
PUSH HL
LD A,00H ;ASAHI modify
SVC .HCPY
RST 3
DEFB .HCPY
ENDM
POP HL
RET
;
CLS: ENT
CALL ENDZ
PUSH HL
SVC .CLS
RST 3
DEFB .CLS
ENDM
POP HL
RET
;
END