Compare commits

...

3 commits

Author SHA1 Message Date
hugova
9768287b86 Change macro here 2025-03-30 16:16:47 +02:00
hugova
1144fd01ca Rewrite macros to be more flexible 2025-03-30 16:15:07 +02:00
hugova
abcac12471 Add test for memcpy 2025-03-30 16:14:41 +02:00
3 changed files with 86 additions and 57 deletions

View file

@ -7,64 +7,82 @@
;;Se below for some fast 16bit logic
;;http://6502.org/tutorials/compare_beyond.html
;; Addition uses the A register
;; Addition always uses the A register
;; a = a + b
.macro Add_16 a_low, a_hi, b_low, b_hi, fast_unsafe
;; IF to run it fast
.ifblank fast_unsafe
CLC
.endif
.if .not .match ({b_low}, a)
LDA b_low
.endif ;;untested
ADC a_low
STA a_low
.if .match ({b_hi}, x) ;;Untested
TXA
.else
LDA b_hi
.endif
ADC a_hi
STA a_hi
.endmacro
;; Untested!
;; Addition uses the A register
;; a = a + b. b_low = A, b_hi = X
.macro Add_16_AX low, hi, fast_unsafe
;; IF to run it fast
.ifblank fast_unsafe
CLC
.endif
ADC low
STA low
TXA
ADC hi
STA hi
.endmacro
.macro Add_16_A a_low, a_hi, b_low, b_hi, fast_unsafe
;; IF to run it fast
.ifblank fast_unsafe
CLC
.endif
LDA a_low
ADC b_low
STA a_low
LDA b_hi
ADC a_hi
STA a_hi
.endmacro
;; Subtraction uses the A register
;; Subtraction uses always uses A register
;; a = a - b
.macro Sub_16 a_low, a_hi, b_low, b_hi, fast_unsafe
;; IF to run it fast
.ifblank fast_unsafe
SEC
.endif
;; if b_low = A and b_hi =A
.if .match({b_low}, a) .and .match({b_hi}, a) ;;untested
.LOCAL rewrite
.LOCAL rewrite2
STA rewrite +1
STA rewrite2 + 1
LDA a_low
rewrite:
SBC #b_low
STA a_low
LDA a_hi
rewrite2:
SBC #b_hi
STA a_hi
;; if b_low = A
.elseif .match({b_low}, a) ;;untested
.LOCAL rewrite
STA rewrite +1
LDA a_low
rewrite:
SBC #b_low
STA a_low
LDA a_hi
SBC b_hi
STA a_hi
.elseif .match({b_hi}, a) ;;untested
.LOCAL rewrite
STA rewrite +1
LDA a_low
SBC b_low
STA a_low
LDA a_hi
rewrite:
SBC #b_hi
STA a_hi
.else
LDA a_low
SBC b_low
STA a_low
LDA a_hi
SBC b_hi
STA a_hi
.endif
.endmacro
;; Subtraction uses always uses A register
;; a = (A, a_hi) - b
.macro Sub_16_A a_low, a_hi, b_low, b_hi, fast_unsafe
;; IF to run it fast
.ifblank fast_unsafe
@ -77,20 +95,6 @@
STA a_hi
.endmacro
;; Untested
;; Subtraction uses the A register
;; a = a - b. b_low = A, b_hi = X
.macro Sub_16_AX low, hi, fast_unsafe
;; IF to run it fast
.ifblank fast_unsafe
SEC
.endif
SBC low
STA low
TXA
SBC hi
STA hi
.endmacro
;; Multiplication of 2
;; a = a*2
@ -112,29 +116,25 @@
STA a_hi
.endmacro
;;http://www.6502.org/tutorials/compare_beyond.html
;;Larger then operation, uses the A register
;;IF a < b then: jump to label
; C =0 if jump to LABEL
.macro Lag_16 a_low, a_hi, b_low, b_hi, label
.LOCAL LABEL
LDA a_hi
CMP b_hi
BCC label
BNE LABEL
LDA a_low
CMP b_low
BCC label
LABEL:
.endmacro
.macro Lag_16y a_low, a_hi, b_hi, label
LDA a_hi
CMP b_hi
BCC label
BNE LABEL
LDA a_low
.if .match ({b_low}, a)
.LOCAL next
STY next +1
next:
CMP #$ff
.else
CMP b_low
.endif
BCC label
LABEL:
.endmacro

View file

@ -18,9 +18,7 @@
LDA #$00
STA >B_start
loop:
;Lag_16 >B_end, <B_end, >B_start, <B_start, end_loop
Lag_16y >B_end, <B_end, <B_start, end_loop
;Lag_16y <B_start, >B_end, <B_end, end_loop ; IF B_end >B_start stop the loop
Lag_16 >B_end, <B_end, A, <B_start, end_loop
LDA (>B_start), Y
STA (>A_start), Y
;Tip save time by counting downward, fast to check if Y ==0 // hugo

View file

@ -0,0 +1,31 @@
;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*-
memcpy_test:
;; TESTING OF MEMCPY TEMPERARLY HERE BECAUSE IT WILL USE THAT :)
X_pos = $FA
A_start = $FAFB
Y_pos = $F9
B_start = $FCFD
charset = $FB
B_end = $FEFF
code = $FE
petski_position = $FEFF ;reuses code:s memory
screen_position = $FCFD
Mov_16 >B_start, <B_start, #<$D000, #>$D000
;#### TEMP INIT DATA ####
Mov_16 >B_end, <B_end, #<($D000+$1F3F), #>($D000 +$1F3F)
LDA #$10
STA code
LDA #$10
STA X_pos
STA Y_pos
Mov_16 >A_start, <A_start, #<VIC_bank, #>VIC_bank
;We first need to clear some memory
;Mov_16 >A_end, >A_end, #<(VIC_bank+100), #>(VIC_bank +100)
LDA #$00
JSR memcpy
STA <petski_position
jmp exit