fix most of by one errors of linedraw.

This commit is contained in:
hugova 2025-07-26 19:42:57 +02:00
parent 185f37dccc
commit 8eb5ff855b
6 changed files with 52 additions and 20 deletions

View file

@ -5,26 +5,24 @@
.include "line.inc" .include "line.inc"
;; Fix line that is too long ;; Fix line that is too long
LDA Y_pos LDA #$C8 ;y_max = $C8
CMP #$C8 ;;y_max = $C8 CMP Y_pos
BCC do_not_fix_y_pos BCS do_not_fix_y_pos
LDA #$C8
STA Y_pos STA Y_pos
do_not_fix_y_pos: do_not_fix_y_pos:
LDA Y_end
CMP #$C8 ;;y_max = $C8
BCC do_not_fix_y_end
LDA #$C8 LDA #$C8
CMP Y_pos ;y_max = $C8
BCS do_not_fix_y_end
STA Y_end STA Y_end
do_not_fix_y_end: do_not_fix_y_end:
;;dx ;;dx
SEC SEC
LDA X_end LDA X_end
SBC X_pos SBC X_pos
BCS dx_no_underflow;; X_end >= X_pos BCS dx_no_underflow;; X_end >= X_pos
EOR #$ff ; Fix bit underflow EOR #$ff ; Fix bit underflow
ADC #$01
STA dx STA dx
;; line_* expect X_pos < X_end and now its not the case. ;; line_* expect X_pos < X_end and now its not the case.
;; Lets move them around ;; Lets move them around
@ -36,28 +34,27 @@ do_not_fix_y_end:
LDY Y_end LDY Y_end
STX Y_end STX Y_end
STY Y_pos STY Y_pos
dx_no_underflow: dx_no_underflow:
STA dx STA dx
SEC SEC
LDA Y_pos LDA Y_end
SBC Y_end SBC Y_pos
STA dy BCS down ;normal Y_pos < Y_end
BCC down ;normal Y_pos < Y_end
up:; Y_pos > Y_end up:; Y_pos > Y_end
EOR #$ff ; Fix bit underflow
ADC #$01
STA dy STA dy
CMP dx CMP dx
BCC shallow; dy < dx BCC shallow; dy < dx
steep: steep:
jsr line_up_inv jsr line_up_inv
RTS RTS
shallow: ;dy =< dx shallow: ;dy =< dx
lda dx
jsr line_up jsr line_up
RTS RTS
down: down:
EOR #$ff ; Fix bit underflow
STA dy STA dy
CMP dx CMP dx
BCC shallow_; dy < dx BCC shallow_; dy < dx

View file

@ -67,6 +67,7 @@ end_selfmod:
STA byte_to_paint STA byte_to_paint
;; X = X_end - X_pos ;; X = X_end - X_pos
LDX dx LDX dx
INX ; okay if it overflow to $00 because it will go back to $ff in loop.
Sub_16 btp_mem_pos, btp_mem_pos + 1, #$00, #$00,! ;; Y has always a offset of at least 1 = C + $0000 Sub_16 btp_mem_pos, btp_mem_pos + 1, #$00, #$00,! ;; Y has always a offset of at least 1 = C + $0000
INY INY
for_x: for_x:

View file

@ -55,6 +55,7 @@ end_selfmod:
INY INY
Sub_16 btp_mem_pos, btp_mem_pos + 1, #$00, #$00, ! Sub_16 btp_mem_pos, btp_mem_pos + 1, #$00, #$00, !
LDX dy LDX dy
INX
CLC CLC
for_y: ; C =0 for_y: ; C =0
LDA byte_to_paint LDA byte_to_paint

View file

@ -8,6 +8,8 @@
X_pos_ = $0E X_pos_ = $0E
Y_end_ = $0F Y_end_ = $0F
X_end_ = $0C X_end_ = $0C
full_angle_test:
LDA #$d2 LDA #$d2
STA X_pos_ STA X_pos_
LDA #$62 LDA #$62
@ -36,14 +38,43 @@
jsr clear_screen jsr clear_screen
full_angle_test_pos_end_swapped:
LDA #$d2
STA X_end_
LDA #$62
STA Y_end_
LDA #$ff
STA X_pos_
LDA #$0
STA Y_pos_
;; Full angle test
@loop:
LDA Y_end_
STA Y_end
LDA X_end_
STA X_end
LDA X_pos_
STA X_pos
LDA Y_pos_
STA Y_pos
jsr line
INC Y_pos_
LDA Y_pos_
CMP #$ff
bne @loop
jsr clear_screen
long_line_test_a: long_line_test_a:
LDA #$00 LDA #$01
STA X_pos_ STA X_pos_
LDA #$60 LDA #$60
STA Y_pos_ STA Y_pos_
LDA #$ff LDA #$ff
STA X_end_ STA X_end_
LDA #$0 LDA #$00
STA Y_end_ STA Y_end_
@loop: @loop:
LDA Y_pos_ LDA Y_pos_
@ -64,7 +95,7 @@ long_line_test_a:
jsr clear_screen jsr clear_screen
long_line_test_b: long_line_test_b:
LDA #$00 LDA #$01
STA X_pos_ STA X_pos_
LDA #$00 LDA #$00
STA Y_pos_ STA Y_pos_
@ -90,7 +121,7 @@ long_line_test_b:
jsr clear_screen jsr clear_screen
long_line_test_b_pos_end_swapped: long_line_test_b_pos_end_swapped:
LDA #$00 LDA #$01
STA X_end_ STA X_end_
LDA #$00 LDA #$00
STA Y_end_ STA Y_end_

View file

@ -50,6 +50,7 @@ end_selfmod:
;LDY #$01 ;LDY #$01
INY INY
LDX dx LDX dx
INX
for_x: for_x:
LDA byte_to_paint LDA byte_to_paint
ORA (btp_mem_pos), Y ORA (btp_mem_pos), Y

View file

@ -52,6 +52,7 @@ end_selfmod:
Sub_16 btp_mem_pos, btp_mem_pos + 1, #$00, #$00,! Sub_16 btp_mem_pos, btp_mem_pos + 1, #$00, #$00,!
CLC CLC
LDX dy LDX dy
INX
for_y: for_y:
LDA byte_to_paint LDA byte_to_paint
ORA (btp_mem_pos), Y ORA (btp_mem_pos), Y