mirror of
https://github.com/Tolik-Trek/2D-Studio.git
synced 2026-06-15 01:21:33 +03:00
1509 lines
18 KiB
NASM
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
|
|
|
|
|