graphics: lines_small, more compact

This commit is contained in:
Vince Weaver 2021-03-27 23:43:31 -04:00
parent 094141a7d3
commit 244e0ea558

View File

@ -16,6 +16,9 @@
; 161 -- merge absolute_value/negative code ; 161 -- merge absolute_value/negative code
; 159 -- merging init X/Y paths ; 159 -- merging init X/Y paths
; 156 -- more merging X/Y init ; 156 -- more merging X/Y init
; 154 -- note PLOT doesn't touch Y
; 152 -- merge into common_inc
; 151 -- share an RTS
B_X1 = $F0 B_X1 = $F0
B_Y1 = $F1 B_Y1 = $F1
@ -43,7 +46,6 @@ lines_loop:
lda #0 lda #0
sta B_X1 sta B_X1
lda #36 lda #36
; lda #35
sta B_Y2 sta B_Y2
lda COUNT lda COUNT
@ -99,17 +101,20 @@ init_bresenham:
adc B_DX adc B_DX
sta B_ERR sta B_ERR
;======================
; iterative plot points
line_loop: line_loop:
; plot X1,Y1 ; plot X1,Y1
ldy B_X1 ldy B_X1
lda B_Y1 lda B_Y1
jsr PLOT ; PLOT AT Y,A jsr PLOT ; PLOT AT Y,A (A colors output, Y preserved)
; check if hit end ; check if hit end
ldy B_X1 ; ldy B_X1
cpy B_X2 cpy B_X2
bne line_no_end bne line_no_end
@ -133,32 +138,32 @@ step_bresenham:
; err = err + dy ; err = err + dy
; x1 = x1 + sx ; x1 = x1 + sx
; signed compare ; signed compare
ldx #0
clc clc
cmp B_DY cmp B_DY
beq do_x beq do_x
sbc B_DY sbc B_DY
bvc blah2 bvc blah2
eor #$80 eor #$80
blah2: blah2:
bmi skip_x ; ble bmi skip_x ; ble
do_x:
lda B_ERR
clc
adc B_DY
sta B_ERR
lda B_X1
clc do_x:
adc B_SX lda B_DY
sta B_X1
jsr common_inc
skip_x: skip_x:
; if err2 <= dx: ; if err2 <= dx:
; err = err + dx ; err = err + dx
; y1 = y1 + sy ; y1 = y1 + sy
pla ; pop err2 pla ; pop err2
inx
clc ; signed compare clc ; signed compare
sbc B_DX sbc B_DX
@ -167,28 +172,37 @@ skip_x:
blah: blah:
bpl skip_y bpl skip_y
do_inc_y: do_y:
clc lda B_DX
lda B_ERR jsr common_inc
adc B_DX
sta B_ERR
clc
lda B_Y1
adc B_SY
sta B_Y1
skip_y: skip_y:
jmp line_loop jmp line_loop
;=====================================
; common increment
;=====================================
common_inc:
clc
adc B_ERR
sta B_ERR
lda B_X1,X
clc
adc B_SX,X
sta B_X1,X
done_line: done_line:
rts rts
; take just subtracted value ;=====================================
; if negative, negate it, X=-1 ; init, do the abs and sx calculations
; if positive, fine, X=1 ; x=0, for X
; x=1, for Y
;=====================================
do_abs: do_abs:
sec sec
lda B_X1,X lda B_X1,X