2D-Studio/TOOLS.ASM
2025-07-11 00:23:19 +10:00

1509 lines
18 KiB
NASM

WORK_ LD A,(CRTOOL)
SUB #0A
JP Z,WINDS
DEC A
JP Z,ZOOMX
DEC A
JP Z,WORKA
DEC A
JP Z,LINES
DEC A
JP Z,SQUAR
DEC A
JP Z,ELIPS
DEC A
JP Z,FILLS
XOR A
RET
ZOOMX CALL READCRD
RET NZ
LD A,(ZOOMMOD)
OR A
JP NZ,UNZOOM ;ZOOMX4
LD BC,(SHIFTX)
ADD HL,BC
LD BC,33/2
AND A
SBC HL,BC
JR NC,ZOOMX2
LD HL,0
ZOOMX2 LD (SHIFTX),HL
EX DE,HL
LD BC,(SHIFTY)
ADD HL,BC
LD BC,23/2
AND A
SBC HL,BC
JR NC,ZOOMX3
LD HL,0
ZOOMX3 LD (SHIFTY),HL
EX DE,HL
JP ZOOM
ZOOMX4 LD HL,(SHIFTX)
LD BC,33*8
ADD HL,BC
EX DE,HL
LD HL,(X_SIZE)
SBC HL,DE
JR NC,ZOOMX5
LD HL,(X_SIZE)
LD BC,33*8
AND A
SBC HL,BC
JR NC,ZOOMX6
LD HL,0
ZOOMX6 LD (SHIFTX),HL
ZOOMX5 LD HL,(SHIFTY)
LD BC,23*8
ADD HL,BC
EX DE,HL
LD HL,(Y_SIZE)
SBC HL,DE
JR NC,ZOOMX7
LD HL,(Y_SIZE)
LD BC,23*8
AND A
SBC HL,BC
JR NC,ZOOMX8
LD HL,0
ZOOMX8 LD (SHIFTY),HL
ZOOMX7 JP UNZOOM
READCRD LD C,3
CALL INTMOUS
CP 1
LD A,1
RET NZ
PUSH HL
PUSH DE
CALL LOBJECT
LD DE,#0401
AND A
SBC HL,DE
POP DE
POP HL
LD A,0
RET NZ
LD BC,(X_)
AND A
SBC HL,BC
EX DE,HL
LD BC,(Y_)
AND A
SBC HL,BC
EX DE,HL
XOR A
RET
PIXEL LD A,#00
OR A
JP NZ,PIXEL2
PIXEL1 PUSH DE
PUSH BC
CALL PUTPNT2
POP BC
POP DE
RET
PIXEL2 DEC A
JP NZ,PIXEL3
PUSH DE
PUSH BC
CALL PUTPIX
POP BC
POP DE
RET
PIXEL3 PUSH DE
PUSH BC
CALL GETPIX
CALL PUTPNT3
POP BC
POP DE
RET
REAL_XY LD BC,(SHIFTX)
ADD HL,BC
LD BC,(SHIFTY)
EX DE,HL
ADD HL,BC
EX DE,HL
RET
HARD_XY LD BC,(X_)
ADD HL,BC
EX DE,HL
LD BC,(Y_)
ADD HL,BC
EX DE,HL
RET
WRT_PIX PUSH HL
PUSH DE
CALL PIXOPEN
LD IX,AREAPIX
LD BC,(X_SIZE)
WRTPIX1 LD A,D
OR E
JR Z,WRTPIX2
DEC DE
ADD IX,BC
CALL C,PIXNEXT
JR WRTPIX1
WRTPIX2 EX DE,HL
ADD IX,DE
CALL C,PIXNEXT
LD A,(COLOR)
LD (IX),A
CALL RETBANK
POP DE
POP HL
RET
RD_PIX PUSH HL
PUSH DE
CALL PIXOPEN
LD IX,AREAPIX
LD BC,(X_SIZE)
RDRPIX1 LD A,D
OR E
JR Z,RDRPIX2
DEC DE
ADD IX,BC
CALL C,PIXNEXT
JR RDRPIX1
RDRPIX2 EX DE,HL
ADD IX,DE
CALL C,PIXNEXT
LD D,(IX)
CALL RETBANK
LD A,D
POP DE
POP HL
RET
WINDS LD C,3
CALL INTMOUS
LD BC,(X_)
AND A
SBC HL,BC
EX DE,HL
LD BC,(Y_)
AND A
SBC HL,BC
EX DE,HL
XOR A
LD (PREVX),HL
LD (PREV2X),HL
LD (PREVY),DE
LD (PREV2Y),DE
LD (STARX),HL
LD (STARY),DE
LD HL,(STARX)
LD DE,(PREV2X)
EXX
LD HL,(STARY)
LD DE,(PREV2Y)
EXX
CALL WINDSEL
WINDS2 CALL READCRD
JP NZ,WINDSS
LD A,(ZOOMMOD)
PUSH HL
LD BC,(PREVX)
AND A
SBC HL,BC
JP NZ,WIND2
LD HL,(PREVY)
AND A
SBC HL,DE
JP NZ,WIND2
POP HL
JP WINDS2
WIND2 POP HL
LD (PREVX),HL
LD (PREVY),DE
CALL OUTWIND
JP WINDS2
WINDSS OR A
RET Z
LD HL,(STARX)
LD DE,(PREVX)
EXX
LD HL,(STARY)
LD DE,(PREVY)
EXX
CALL WINDSEL
XOR A
RET
OUTWIND
LD HL,(STARX)
LD DE,(PREV2X)
EXX
LD HL,(STARY)
LD DE,(PREV2Y)
EXX
CALL WINDSEL
LD HL,(STARX)
LD DE,(PREVX)
LD (PREV2X),DE
EXX
LD HL,(STARY)
LD DE,(PREVY)
LD (PREV2Y),DE
EXX
CALL WINDSEL
RET
; HL - X1 HL'- Y1
; DE - X2 DE'- Y2
WINDSEL AND A
LD B,H
LD C,L
SBC HL,DE
JR NC,WS1
LD H,B
LD L,C
EX DE,HL
AND A
SBC HL,DE
WS1 RET Z
LD (SQRLEN),HL
LD (SQR_X1),DE
EXX
AND A
LD B,H
LD C,L
SBC HL,DE
JR NC,WS2
LD H,B
LD L,C
EX DE,HL
AND A
SBC HL,DE
WS2 RET Z
LD (SQRHGT),HL
LD (SQR_Y1),DE
LD BC,(SQRHGT)
EXX
LD HL,(SQR_X1)
LD DE,(SQR_Y1)
CALL HARD_XY
LD BC,(SQRLEN)
JP XFRAME
FILLS CALL READCRD
RET NZ
LD A,(ZOOMMOD)
OR A
JP Z,FUZZS
SRL H
RR L
SRL H
RR L
SRL H
RR L
SRL D
RR E
SRL D
RR E
SRL D
RR E
FUZZS CALL GETPIX
LD (XOLOR),A
LD C,A
LD A,(COLOR)
CP C
RET Z
CALL REAL_XY
CALL FILL
CALL REFRWIN
; LD HL,(SHIFTX)
; LD DE,(SHIFTY)
; LD BC,33
; CALL DATAPIX
XOR A
RET
FILL LD (BUFFER),DE
LD (BUFFER+2),HL
LD (TEMP_Y),DE
LD (TEMP_X),HL
LD BC,ENDBF ;END
PUSH BC
INC BC
INC BC
INC BC
INC BC
LD (CONMAX),BC
POP BC
LD (CONMIN),BC
MAIN_FF LD HL,(CONMIN)
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
DEC HL ;X-1
CALL PLOT
LD HL,(CONMIN)
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
INC DE ;Y+1
CALL PLOT
LD HL,(CONMIN)
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
INC HL ;X+1
CALL PLOT
LD HL,(CONMIN)
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
DEC DE ;Y-1
CALL PLOT
LD HL,(CONMIN)
INC HL
INC HL
INC HL
INC HL
PUSH HL
LD BC,LIMIT ;LIMIT!!!
AND A
SBC HL,BC
JR NZ,PASS
POP HL
LD HL,BUFFER
PUSH HL
PASS POP HL
LD (CONMIN),HL
LD BC,(CONMAX)
AND A
SBC HL,BC
RET Z
JP MAIN_FF
PLOT LD (TEMP_Y),DE
LD (TEMP_X),HL
LD B,H
LD C,L
LD HL,(X_SIZE)
DEC HL
AND A
SBC HL,BC
RET C
LD HL,(Y_SIZE)
DEC HL
AND A
SBC HL,DE
RET C
LD H,B
LD L,C
CALL RD_PIX
LD C,A
LD A,(XOLOR)
CP C
RET NZ
CALL WRT_PIX
LD HL,(CONMAX)
LD DE,(TEMP_Y)
LD BC,(TEMP_X)
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
INC HL
PUSH HL
LD BC,LIMIT
AND A
SBC HL,BC
JR NZ,PASS_1
POP HL
LD HL,ENDBF ;END
PUSH HL
PASS_1 POP HL
LD (CONMAX),HL
RET
XOLOR DB 0
CONMIN DW 0
CONMAX DW 0
TEMP_Y DW 0
TEMP_X DW 0
ENDBF
BUFFER DW 0,0
DS 1600 ;/4!!! 2000
LIMIT
SQRLEN DW 0
SQR_X1 DW 0
SQRHGT DW 0
SQR_Y1 DW 0
SQUAR LD C,3
CALL INTMOUS
LD BC,(X_)
AND A
SBC HL,BC
EX DE,HL
LD BC,(Y_)
AND A
SBC HL,BC
EX DE,HL
XOR A
LD (PREVX),HL
LD (PREVY),DE
LD (STARX),HL
LD (STARY),DE
SQUAR2 CALL READCRD
JP NZ,SQUARR
LD A,(ZOOMMOD)
PUSH HL
LD BC,(PREVX)
AND A
SBC HL,BC
JP NZ,SQUR2
LD HL,(PREVY)
AND A
SBC HL,DE
JP NZ,SQUR2
POP HL
JP SQUAR2
SQUR2 POP HL
LD (PREVX),HL
LD (PREVY),DE
CALL OUTSQUR
JP SQUAR2
SQUARR OR A
RET Z
LD HL,(STARX)
LD DE,(PREVX)
EXX
LD HL,(STARY)
LD DE,(PREVY)
EXX
CALL SQUAR_3
XOR A
RET
OUTSQUR
LD HL,(STARX)
LD DE,(PREV2X)
EXX
LD HL,(STARY)
LD DE,(PREV2Y)
EXX
CALL SQUAR_1
LD HL,(STARX)
LD DE,(PREVX)
LD (PREV2X),DE
EXX
LD HL,(STARY)
LD DE,(PREVY)
LD (PREV2Y),DE
EXX
CALL SQUAR_2
RET
SQUAR_1 LD A,2
LD (PIXEL+1),A
JP SQUARD
SQUAR_2 LD A,0
LD (PIXEL+1),A
JP SQUARD
SQUAR_3 LD A,1
LD (PIXEL+1),A
JP SQUARD
; HL - X1 HL'- Y1
; DE - X2 DE'- Y2
SQUARD AND A
LD B,H
LD C,L
SBC HL,DE
JR NC,SQ1
LD H,B
LD L,C
EX DE,HL
AND A
SBC HL,DE
SQ1 RET Z
LD (SQRLEN),HL
LD (SQR_X1),DE
EXX
AND A
LD B,H
LD C,L
SBC HL,DE
JR NC,SQ2
LD H,B
LD L,C
EX DE,HL
AND A
SBC HL,DE
SQ2 RET Z
LD (SQRHGT),HL
LD (SQR_Y1),DE
EXX
LD HL,(SQR_X1)
LD DE,(SQR_Y1)
LD BC,(SQRLEN)
SQQ1 PUSH HL
CALL PIXEL
POP HL
INC HL
DEC BC
LD A,B
OR C
JP NZ,SQQ1
LD BC,(SQRHGT)
SQQ2 PUSH HL
CALL PIXEL
POP HL
INC DE
DEC BC
LD A,B
OR C
JP NZ,SQQ2
LD BC,(SQRLEN)
SQQ3 PUSH HL
CALL PIXEL
POP HL
DEC HL
DEC BC
LD A,B
OR C
JP NZ,SQQ3
LD BC,(SQRHGT)
SQQ4 PUSH HL
CALL PIXEL
POP HL
DEC DE
DEC BC
LD A,B
OR C
JP NZ,SQQ4
RET
LINES LD C,3
CALL INTMOUS
LD BC,(X_)
AND A
SBC HL,BC
EX DE,HL
LD BC,(Y_)
AND A
SBC HL,BC
EX DE,HL
XOR A
LD (PREVX),HL
LD (PREVY),DE
LD (STARX),HL
LD (STARY),DE
LINES2 CALL READCRD
JP NZ,ELINR
LD A,(ZOOMMOD)
PUSH HL
LD BC,(PREVX)
AND A
SBC HL,BC
JP NZ,PLIN2
LD HL,(PREVY)
AND A
SBC HL,DE
JP NZ,PLIN2
POP HL
JP LINES2
PLIN2 POP HL
LD (PREVX),HL
LD (PREVY),DE
CALL OUTXLIN
JP LINES2
ELINR OR A
RET Z
LD HL,(STARX)
LD DE,(STARY)
LD H,E
; EXX
LD DE,(PREVX)
LD BC,(PREVY)
LD D,C
CALL LINEW
XOR A
RET
OUTXLIN
LD HL,(STARX)
LD DE,(STARY)
LD H,E
; EXX
LD DE,(PREV2X)
LD BC,(PREV2Y)
LD D,C
CALL LINER
LD HL,(STARX)
LD DE,(STARY)
LD H,E
; EXX
LD DE,(PREVX)
LD BC,(PREVY)
LD (PREV2X),DE
LD (PREV2Y),BC
LD D,C
CALL LINE
; EXX
RET
LINEW PUSH HL
PUSH DE
PUSH BC
LD A,1
LD (DOT+1),A
JP LINN
LINER PUSH HL
PUSH DE
PUSH BC
LD A,2
LD (DOT+1),A
JP LINN
LINE PUSH HL ; line from p1(l,h) to p2(e,d)
PUSH DE
PUSH BC
XOR A
LD (DOT+1),A
LINN PUSH IX
LD B,#15
LD C,#1D
LD A,E
SUB L
JR NC,M1LIN
NEG
EX DE,HL
M1LIN LD L,A
LD A,D
SUB H
JR NC,M2LIN
NEG
DEC B
M2LIN LD H,A
CP L
JR C,M3LIN
LD A,B
LD B,C
LD C,A
LD A,H
LD H,L
LD L,A
M3LIN LD A,B
LD (DEPENC),A
LD A,C
LD (INDEPC),A
PUSH DE
LD C,L
LD E,L
LD L,H
CALL DIVB
LD A,E
LD (SIMLIN+1),A
LD L,C
LD A,L
LD (LDLIN+1),A
LD A,D
LD (DECLIN+1),A
OR A
LD B,E
RR B
INC B
OR A
RR C
POP DE
INC L
JR L4LIN
SIMLIN LD B,#FF
L4LIN PUSH HL
CALL DOT
POP HL
INDEPC DEC D
DEC L
JR Z,RETLIN
LD A,C
DECLIN SUB #02
LD C,A
JR C,LDLIN
DJNZ L4LIN
DEPENC DEC E
JR SIMLIN
LDLIN ADD A,#FF
LD C,A
JR L4LIN
RETLIN POP IX
POP BC
POP DE
POP HL
RET
DOT LD A,#00
OR A
JP NZ,DOT2
DOT1 PUSH DE
PUSH BC
LD L,E
LD H,0
LD E,D
LD D,0
CALL PUTPNT2
POP BC
POP DE
RET
DOT2 DEC A
JP NZ,DOT3
PUSH DE
PUSH BC
LD L,E
LD H,0
LD E,D
LD D,0
CALL PUTPIX
POP BC
POP DE
RET
DOT3 PUSH DE
PUSH BC
LD L,E
LD H,0
LD E,D
LD D,0
CALL GETPIX
CALL PUTPNT3
POP BC
POP DE
RET
DIVB LD D,0 ;E/L--E (MOD in D)
DIVB2 PUSH HL ;DE/L--E
PUSH BC
LD B,8
EX DE,HL
LD D,E
LD E,0
DIV1B OR A
RR D
RR E
SBC HL,DE
JR NC,MDIVB
ADD HL,DE
MDIVB RLA
DJNZ DIV1B
CPL
LD D,L
LD E,A
POP BC
POP HL
RET
ELIPS LD C,3
CALL INTMOUS
LD BC,(X_)
AND A
SBC HL,BC
EX DE,HL
LD BC,(Y_)
AND A
SBC HL,BC
EX DE,HL
XOR A
LD (PREVX),HL
LD (PREVY),DE
LD (STARX),HL
LD (STARY),DE
ELIPS2 CALL READCRD
JP NZ,ELIPR
LD A,(ZOOMMOD)
PUSH HL
LD BC,(PREVX)
AND A
SBC HL,BC
JP NZ,PELP2
LD HL,(PREVY)
AND A
SBC HL,DE
JP NZ,PELP2
POP HL
JP ELIPS2
PELP2 POP HL
LD (PREVX),HL
LD (PREVY),DE
CALL OUTELIP
JP ELIPS2
ELIPR OR A
RET Z
LD HL,(STARX)
LD DE,(PREVX)
EXX
LD HL,(STARY)
LD DE,(PREVY)
EXX
CALL ELLIPS3
XOR A
RET
OUTELIP
LD HL,(STARX)
LD DE,(PREV2X)
EXX
LD HL,(STARY)
LD DE,(PREV2Y)
EXX
CALL ELLIPS1
LD HL,(STARX)
LD DE,(PREVX)
LD (PREV2X),DE
EXX
LD HL,(STARY)
LD DE,(PREVY)
LD (PREV2Y),DE
EXX
CALL ELLIPS2
RET
ELLIPS1 LD A,2
LD (PIXEL+1),A
JP ELLIPSE
ELLIPS2 LD A,0
LD (PIXEL+1),A
JP ELLIPSE
ELLIPS3 LD A,1
LD (PIXEL+1),A
JP ELLIPSE
; HL - X1 HL'- Y1
; DE - X2 DE'- Y2
ELLIPSE AND A
LD B,H
LD C,L
SBC HL,DE
JR NC,EL1
LD H,B
LD L,C
EX DE,HL
AND A
SBC HL,DE
EL1 SRL H
RR L
LD A,H
OR L
RET Z
INC HL
LD (minor),HL
ADD HL,DE
LD (Xo),HL
EXX
AND A
LD B,H
LD C,L
SBC HL,DE
JR NC,EL2
LD H,B
LD L,C
EX DE,HL
AND A
SBC HL,DE
EL2 SRL H
RR L
LD A,H
OR L
RET Z
INC HL
LD (major),HL
ADD HL,DE
LD (Yo),HL
EXX
JP START
;+-------------------------------------------------------+
;| MACHINE CODE ELLIPSE DRAWING ROUTINES (TURBO VERSION!)|
;+-------------------------------------------------------+
;(Xo),(Yo) = centre of ellipse
;(major),(minor) = the axes of the ellipse
;MULTIPLICATION ROUTINE :
;
;Multiplies BC by HL-DE
;giving 32 bit result in HL-IX
mul32
LD IX,0
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
ADD IX,IX
ADC HL,HL
RL E
RL D
JP NC,$+9
ADD IX,BC
JP NC,$+4
INC HL
RET
;WORKSPACE :
;
;Ellipse axes:
minor DW 95
major DW 95
;Ellipse centre:
Xo DW 127
Yo DW 96
;Current plot point:
Xi DS 2
Yi DS 2
;Work variables:
a2 DS 4
a2s DS 4
b2 DS 4
b2s DS 4
DELTAi DS 4
START LD HL,#0000
LD (Xi),HL
LD HL,(major)
LD (Yi),HL
;Initialise work variables:
LD B,H ; a2=a*a
LD C,L
LD DE,#0000
CALL mul32
LD (a2),IX
LD (a2+2),HL
LD (a2s),IX ; a2s=a2
LD (a2s+2),HL
LD HL,(minor)
LD B,H ; b2=b*b
LD C,L
LD DE,#0000
CALL mul32
LD (b2),IX
LD (b2s),HL
LD HL,(Yi) ; b2s=b2*(2*Yi+1)
ADD HL,HL
INC HL
LD B,H
LD C,L
LD HL,(b2)
LD DE,(b2+2)
CALL mul32
LD (b2s),IX
LD (b2s+2),HL
LD HL,#0001 ;DELTAi=2*(1-b)
LD DE,(minor)
OR A
SBC HL,DE
ADD HL,HL
LD (DELTAi),HL
;Sign extend to 32 bit (requires b>0)
LD HL,#FFFF
LD (DELTAi+2),HL
;Main calculation loop:
MLOOOP
LD HL,(Yi) ;While Yi>0
BIT 7,H
RET NZ
LD DE,(Xi)
;HL already has (Yi)
;
;Plot four points of the ellipse (by symmetry)
;
;We actually plot (Xi,Yi),(-Xi,Yi),(-Xi,-Yi),(Xi,-Yi)
PUSH DE
PUSH DE
PUSH HL
CALL SPOINT ; (Xi,Yi)
POP HL
POP DE
PUSH HL
LD A,D ;Negate Xi
CPL
LD D,A
LD A,E
CPL
LD E,A
INC DE
PUSH DE
CALL SPOINT ; (-Xi,Yi)
POP DE
POP HL
LD A,H ;Negate Yi
CPL
LD H,A
LD A,L
CPL
LD L,A
INC HL
PUSH HL
CALL SPOINT ; (-Xi,-Yi)
POP HL
POP DE
CALL SPOINT ; (Xi,-Yi)
LD DE,(DELTAi) ; if DELTAi>0
LD HL,(DELTAi+2)
CALL TSDEHL
JP Z,godiag
JP NC,gohoriz
LD HL,(DELTAi) ;DELTAi=DELTAi+DELTAi+a2s
ADD HL,HL
EX DE,HL
LD HL,(DELTAi+2)
ADC HL,HL
EX DE,HL
LD BC,(a2s)
OR A
SBC HL,BC
EX DE,HL
LD BC,(a2s+2)
SBC HL,BC
CALL TSDEHL ;if DELTAi<=0
JP Z,godiag
JP NC,godiag
CALL VERTIC
JP MLOOOP
gohoriz
LD HL,(DELTAi) ;DELTAi=DELTAi+DELTAi+b2s
ADD HL,HL
EX DE,HL
LD HL,(DELTAi+2)
ADC HL,HL
EX DE,HL
LD BC,(b2s)
ADD HL,BC
EX DE,HL
LD BC,(b2s+2)
ADC HL,BC
CALL TSDEHL ;if DELTAi<=0
JP Z,horiz
JP NC,horiz
godiag
;Make a diagonal step (go up ten along)
CALL VERTIC
;Make a horizontal step
horiz
LD HL,(Xi)
INC HL
LD (Xi),HL
;a2s=a2s+a2+a2
LD HL,(a2s)
LD DE,(a2)
ADD HL,DE
LD (ceil1+1),HL
LD HL,(a2s+2)
LD DE,(a2+2)
ADC HL,DE
PUSH HL
ceil1 LD HL,0
LD DE,(a2)
ADD HL,DE
LD (a2s),HL
POP HL
LD DE,(a2+2)
ADC HL,DE
LD (a2s+2),HL
;DELTAi=DELTAi+a2s
PUSH HL
LD HL,(DELTAi)
LD DE,(a2s)
ADD HL,DE
LD (DELTAi),HL
LD HL,(DELTAi+2)
POP DE
ADC HL,DE
LD (DELTAi+2),HL
JP MLOOOP
VERTIC
;Make a vertical step
LD HL,(Yi)
DEC HL
LD (Yi),HL
;b2s=b2s-b2-b2
LD HL,(b2s)
LD DE,(b2)
OR A
SBC HL,DE
LD (ceil2+1),HL
LD HL,(b2s+2)
LD DE,(b2+2)
SBC HL,DE
PUSH HL
ceil2 LD HL,0
LD DE,(b2)
OR A
SBC HL,DE
LD (b2s),HL
POP HL
LD DE,(b2+2)
SBC HL,DE
LD (b2s+2),HL
;DELTAi=DELTAi-b2s
PUSH HL
LD HL,(DELTAi)
LD DE,(b2s)
OR A
SBC HL,DE
LD (DELTAi),HL
LD HL,(DELTAi+2)
POP DE
SBC HL,DE
LD (DELTAi+2),HL
RET
;Test the 32-bit number in HL-DE for its sign
TSDEHL
OR A
BIT 7,H
;NC,NZ means les than zero
RET NZ
LD A,D
OR E
SCF
;C,NZ means greater than zero
RET NZ
LD A,H
OR L
SCF
RET
;Plot routine:
SPOINT LD BC,(Yo)
ADD HL,BC
EX DE,HL
LD BC,(Xo)
ADD HL,BC
CALL PIXEL
RET