282 lines
6.4 KiB
ArmAsm
282 lines
6.4 KiB
ArmAsm
;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*-
|
|
|
|
;;We have named the parts of the circle as such.
|
|
;; |
|
|
;; qbb (7) | qab (8)
|
|
;; |
|
|
;; qba (2) | qaa (1)
|
|
;;---------------X-----------------> X
|
|
;; qca (4) | qda (3)
|
|
;; |
|
|
;; qcb (5) | qdb (6)
|
|
;; |
|
|
;; v Y
|
|
|
|
;; The q stands for quarter, whe have 4 quarter, and each quarter is split into 2
|
|
|
|
.proc circle
|
|
.include "circle.inc"
|
|
|
|
;; Because loop is so big, We need to save position in pointer
|
|
LDA #<while_x_bigger_then_y
|
|
STA jmp_location_pointer
|
|
LDA #>while_x_bigger_then_y
|
|
STA jmp_location_pointer + 1
|
|
LDA #<endif
|
|
STA jmp_location_pointer_two
|
|
LDA #>endif
|
|
STA jmp_location_pointer_two + 1
|
|
|
|
|
|
;; X_rel = radius (share the same address)
|
|
;;Y_rel =0
|
|
LDA #$00
|
|
STA Y_rel
|
|
|
|
;; t1 = radius >> 4
|
|
LDA radius
|
|
LSR
|
|
LSR
|
|
LSR
|
|
LSR
|
|
STA t1
|
|
|
|
draw_upper_px_in_circle:
|
|
SEC
|
|
LDA Y_pos
|
|
STA temp_
|
|
SBC radius
|
|
STA Y_pos
|
|
|
|
JSR pixel_draw
|
|
LDA btp_mem_pos
|
|
STA btp_mem_pos_qbb
|
|
STA btp_mem_pos_qab
|
|
LDA btp_mem_pos + 1
|
|
STA btp_mem_pos_qbb + 1
|
|
STA btp_mem_pos_qab + 1
|
|
LDA byte_to_paint
|
|
STA byte_to_paint_qca
|
|
|
|
STY Y_qbb
|
|
|
|
LDA temp_
|
|
STA Y_pos
|
|
draw_left_px_in_circle:
|
|
SEC
|
|
LDA X_pos
|
|
STA temp_
|
|
SBC radius
|
|
STA X_pos
|
|
|
|
JSR pixel_draw
|
|
LDA btp_mem_pos
|
|
STA btp_mem_pos_qca
|
|
STA btp_mem_pos_qba
|
|
LDA btp_mem_pos + 1
|
|
STA btp_mem_pos_qca + 1
|
|
STA btp_mem_pos_qba + 1
|
|
LDA byte_to_paint
|
|
STA byte_to_paint_qca
|
|
|
|
|
|
LDA temp_
|
|
STA X_pos
|
|
draw_lower_px_in_circle:
|
|
CLC
|
|
LDA Y_pos
|
|
STA temp_
|
|
ADC radius
|
|
STA Y_pos
|
|
|
|
JSR pixel_draw
|
|
|
|
LDA btp_mem_pos
|
|
STA btp_mem_pos_qdb
|
|
STA btp_mem_pos_qcb
|
|
LDA btp_mem_pos + 1
|
|
STA btp_mem_pos_qdb + 1
|
|
STA btp_mem_pos_qcb + 1
|
|
|
|
LDA byte_to_paint
|
|
STA byte_to_paint_qdb
|
|
STA byte_to_paint_qcb
|
|
|
|
STY Y_qdb
|
|
STY Y_qaa
|
|
|
|
LDA temp_
|
|
STA Y_pos
|
|
draw_right_px_in_circle:
|
|
CLC
|
|
LDA X_pos
|
|
ADC radius
|
|
STA X_pos
|
|
;; We only draw the first pixel using absolute position.
|
|
;; After that we use relative position.
|
|
JSR pixel_draw
|
|
;; This sets byte_to_paint, btp_mem_pos and Y
|
|
|
|
LDA btp_mem_pos
|
|
STA btp_mem_pos_qda
|
|
LDA btp_mem_pos + 1
|
|
STA btp_mem_pos_qda + 1
|
|
|
|
STY Y_qda
|
|
STY Y_qaa
|
|
while_x_bigger_then_y:
|
|
|
|
draw_qaa:
|
|
LDY Y_qaa
|
|
LDA byte_to_paint ;A byte containing a single 1. Coresponds to X position in the chunk.
|
|
ORA (btp_mem_pos), Y
|
|
STA (btp_mem_pos), Y
|
|
draw_qba:
|
|
LDA byte_to_paint_qca
|
|
ORA (btp_mem_pos_qba), Y
|
|
STA (btp_mem_pos_qba), Y
|
|
draw_qda:
|
|
LDY Y_qda
|
|
LDA byte_to_paint
|
|
ORA (btp_mem_pos_qda), Y
|
|
STA (btp_mem_pos_qda), Y
|
|
draw_qca:
|
|
LDA byte_to_paint_qca
|
|
ORA (btp_mem_pos_qca), Y
|
|
STA (btp_mem_pos_qca), Y
|
|
draw_qcb:
|
|
LDY Y_qdb
|
|
LDA byte_to_paint_qcb
|
|
ORA (btp_mem_pos_qcb), Y
|
|
STA (btp_mem_pos_qcb), Y
|
|
draw_qdb:
|
|
LDA byte_to_paint_qdb
|
|
ORA (btp_mem_pos_qdb), Y
|
|
STA (btp_mem_pos_qdb), Y
|
|
draw_qbb:
|
|
LDY Y_qbb
|
|
LDA byte_to_paint_qcb
|
|
ORA (btp_mem_pos_qbb), Y
|
|
STA (btp_mem_pos_qbb), Y
|
|
draw_qab:
|
|
LDA byte_to_paint_qdb
|
|
ORA (btp_mem_pos_qab), Y
|
|
STA (btp_mem_pos_qab), Y
|
|
|
|
|
|
|
|
change_Y:
|
|
INC Y_rel ; y++
|
|
qaa_y:
|
|
DEC Y_qaa
|
|
BPL qaa_y_end
|
|
qaa_y_underflow:
|
|
LDA #$07
|
|
STA Y_qaa
|
|
;; Switch to chunk bellow
|
|
; So we subtract #$0140
|
|
Sub_16 btp_mem_pos, btp_mem_pos + 1, #$40, #$01 ;-320
|
|
Sub_16 btp_mem_pos_qba, btp_mem_pos_qba + 1, #$40, #$01,!
|
|
qaa_y_end:
|
|
qda_y:
|
|
INC Y_qda
|
|
LDA Y_qda
|
|
CMP #$08
|
|
BCC qda_y_end
|
|
qda_y_overflow:
|
|
Add_16 btp_mem_pos_qda, btp_mem_pos_qda + 1, #$3f, #$01,! ;+319 + C
|
|
Add_16 btp_mem_pos_qca, btp_mem_pos_qca + 1, #$40, #$01,! ;+320
|
|
LDA #$00
|
|
STA Y_qda
|
|
qda_y_end:
|
|
qdb_x:
|
|
LSR byte_to_paint_qdb
|
|
BCC qdb_x_end
|
|
qdb_x_overflow:
|
|
ROR byte_to_paint_qdb
|
|
Add_16 btp_mem_pos_qdb, btp_mem_pos_qdb + 1, #$08, #$00, !
|
|
Add_16 btp_mem_pos_qab, btp_mem_pos_qab + 1, #$08, #$00, !
|
|
qdb_x_end:
|
|
|
|
qcb_x:
|
|
ASL byte_to_paint_qcb
|
|
BCC qcb_x_end
|
|
qcb_x_overflow:
|
|
INC byte_to_paint_qcb
|
|
LDA #$01
|
|
STA byte_to_paint_qcb
|
|
Sub_16 btp_mem_pos_qcb, btp_mem_pos_qcb + 1, #$08, #$00,!
|
|
Sub_16 btp_mem_pos_qbb, btp_mem_pos_qbb + 1, #$08, #$00,!
|
|
qcb_x_end:
|
|
|
|
;;t1 += y
|
|
CLC
|
|
LDA t1
|
|
ADC Y_rel
|
|
STA t1
|
|
;; t2 = t1 - x
|
|
SEC
|
|
SBC X_rel
|
|
STA t2
|
|
;; if t2 < 0 then skip to endif
|
|
;; we can skipp CMP #$00 because SBC above do the same
|
|
BPL if
|
|
JMP (jmp_location_pointer_two)
|
|
if:
|
|
change_x:
|
|
DEC X_rel
|
|
LDA t2
|
|
STA t1 ; t1 = t2
|
|
qaa_x:
|
|
ASL byte_to_paint
|
|
BCC qaa_x_end
|
|
qaa_x_overflow:
|
|
|
|
|
|
Sub_16 btp_mem_pos, btp_mem_pos + 1, #$08, #$00, ! ;+8
|
|
Sub_16 btp_mem_pos_qda, btp_mem_pos_qda + 1, #$08, #$00, ! ;+8
|
|
;; Restores byte to paint
|
|
INC byte_to_paint
|
|
qaa_x_end:
|
|
|
|
qca_x:
|
|
LSR byte_to_paint_qca
|
|
BCC qca_x_end
|
|
qca_x_overflow:
|
|
ROR byte_to_paint_qca
|
|
Add_16 btp_mem_pos_qca, btp_mem_pos_qca + 1, #$08, #$00, !
|
|
Add_16 btp_mem_pos_qba, btp_mem_pos_qba + 1, #$08, #$00, !
|
|
qca_x_end:
|
|
|
|
qdb_y:
|
|
DEC Y_qdb
|
|
BPL qdb_y_end
|
|
qdb_overflow:
|
|
Sub_16 btp_mem_pos_qdb, btp_mem_pos_qdb + 1, #$3f, #$01, ! ;+320
|
|
Sub_16 btp_mem_pos_qcb, btp_mem_pos_qcb + 1, #$40, #$01, ! ;+320
|
|
LDA #$07
|
|
STA Y_qdb
|
|
qdb_y_end:
|
|
|
|
qbb_y:
|
|
INC Y_qbb
|
|
LDA Y_qbb
|
|
CMP #$08
|
|
BCC qbb_y_end
|
|
qbb_y_overflow:
|
|
|
|
Add_16 btp_mem_pos_qbb, btp_mem_pos_qbb + 1, #$3f, #$01, ! ;+320
|
|
Add_16 btp_mem_pos_qab, btp_mem_pos_qab + 1, #$40, #$01, !;+320
|
|
LDA #$00
|
|
STA Y_qbb
|
|
qbb_y_end:
|
|
|
|
endif:
|
|
;; repeat if X > Y
|
|
LDA X_rel
|
|
CMP Y_rel
|
|
BCC end
|
|
JMP (jmp_location_pointer)
|
|
end:
|
|
RTS
|
|
.endproc
|