dos33fsprogs/games/mist_hgr/vgi_circles.s

304 lines
3.0 KiB
ArmAsm

; VGI_Circles
XX = TEMP0
MINUSXX = TEMP1
YY = TEMP2
MINUSYY = TEMP3
D = TEMP4
COUNT = TEMP5
;========================
; VGI circle
;========================
VGI_CCOLOR = P0
VGI_CX = P1
VGI_CY = P2
VGI_CR = P3
vgi_circle:
ldx VGI_CCOLOR
lda COLORTBL,X
sta HGR_COLOR
;===============================
; draw circle
;===============================
; draw circle at (CX,CY) of radius R
; signed 8-bit math so problems if R > 64?
; XX=0 YY=R
; D=3-2*R
; GOTO6
lda #0
sta XX
lda VGI_CR
sta YY
lda #3
sec
sbc VGI_CR
sbc VGI_CR
sta D
jmp do_plots
circle_loop:
; X=X+1
inc XX
; IF D>0 THEN Y=Y-1:D=D+4*(X-Y)+10
lda D
bmi else
dec YY
lda XX
sec
sbc YY
asl
asl
clc
adc D
adc #10
jmp store_D
else:
; ELSE D=D+4*X+6
lda XX
asl
asl
clc
adc D
adc #6
store_D:
sta D
do_plots:
; setup constants
lda XX
eor #$FF
sta MINUSXX
inc MINUSXX
lda YY
eor #$FF
sta MINUSYY
inc MINUSYY
; HPLOT CX+X,CY+Y
; HPLOT CX-X,CY+Y
; HPLOT CX+X,CY-Y
; HPLOT CX-X,CY-Y
; HPLOT CX+Y,CY+X
; HPLOT CX-Y,CY+X
; HPLOT CX+Y,CY-X
; HPLOT CX-Y,CY-X
; calc X co-ord
lda #7
sta COUNT
pos_loop:
lda COUNT
and #$4
lsr
tay
lda COUNT
lsr
bcc xnoc
iny
xnoc:
lda VGI_CX
clc
adc XX,Y
tax
; calc y co-ord
lda COUNT
lsr
eor #$2
tay
lda VGI_CY
clc
adc XX,Y
ldy #0
jsr HPLOT0 ; plot at (Y,X), (A)
dec COUNT
bpl pos_loop
; IFY>=XTHEN4
lda YY
cmp XX
bcs circle_loop
jmp vgi_loop
;========================
; VGI circle
;========================
; VGI_CCOLOR = P0
; VGI_CX = P1
; VGI_CY = P2
; VGI_CR = P3
vgi_filled_circle:
ldx VGI_CCOLOR
lda COLORTBL,X
sta HGR_COLOR
;===============================
; draw filled circle
;===============================
; draw filled circle at (CX,CY) of radius R
; signed 8-bit math so problems if R > 64?
; XX=0 YY=R
; D=3-2*R
; GOTO6
lda #0
sta XX
lda VGI_CR
sta YY
lda #3
sec
sbc VGI_CR
sbc VGI_CR
sta D
jmp do_filled_plots
filled_circle_loop:
; X=X+1
inc XX
; IF D>0 THEN Y=Y-1:D=D+4*(X-Y)+10
lda D
bmi filled_else
dec YY
lda XX
sec
sbc YY
asl
asl
clc
adc D
adc #10
jmp store_filled_D
filled_else:
; ELSE D=D+4*X+6
lda XX
asl
asl
clc
adc D
adc #6
store_filled_D:
sta D
do_filled_plots:
; setup constants
lda XX
eor #$FF
sta MINUSXX
inc MINUSXX
lda YY
eor #$FF
sta MINUSYY
inc MINUSYY
; HPLOT CX+X,CY+Y
; HPLOT CX-X,CY+Y
; HPLOT CX+X,CY-Y
; HPLOT CX-X,CY-Y
; HPLOT CX+Y,CY+X
; HPLOT CX-Y,CY+X
; HPLOT CX+Y,CY-X
; HPLOT CX-Y,CY-X
lda #3
sta COUNT
filled_pos_loop:
; calc left side
; calc X co-ord
lda COUNT
ora #$1
eor #$2
tay
lda VGI_CX
clc
adc XX,Y
tax
; calc y co-ord
ldy COUNT
lda VGI_CY
clc
adc XX,Y
ldy #0
; pha ; save Y value for later
jsr HPLOT0 ; plot at (Y,X), (A)
; calc right side
lda COUNT
and #$2
eor #$2
tay
lda XX,Y
asl
ldy #0
ldx #0
jsr HLINRL ; plot relative (X,A), (Y)
; so in our case (0,XX*2),0
dec COUNT
bpl filled_pos_loop
; IFY>=XTHEN4
lda YY
cmp XX
bcs filled_circle_loop
jmp vgi_loop