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

View file

@ -67,6 +67,7 @@ end_selfmod:
STA byte_to_paint
;; X = X_end - X_pos
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
INY
for_x:

View file

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

View file

@ -8,6 +8,8 @@
X_pos_ = $0E
Y_end_ = $0F
X_end_ = $0C
full_angle_test:
LDA #$d2
STA X_pos_
LDA #$62
@ -36,14 +38,43 @@
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:
LDA #$00
LDA #$01
STA X_pos_
LDA #$60
STA Y_pos_
LDA #$ff
STA X_end_
LDA #$0
LDA #$00
STA Y_end_
@loop:
LDA Y_pos_
@ -64,7 +95,7 @@ long_line_test_a:
jsr clear_screen
long_line_test_b:
LDA #$00
LDA #$01
STA X_pos_
LDA #$00
STA Y_pos_
@ -90,7 +121,7 @@ long_line_test_b:
jsr clear_screen
long_line_test_b_pos_end_swapped:
LDA #$00
LDA #$01
STA X_end_
LDA #$00
STA Y_end_

View file

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

View file

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