mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-01 01:06:33 +00:00
304 lines
3.0 KiB
ArmAsm
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
|