add alternate version of memset (probably slower (only for testing))
This commit is contained in:
parent
44ac08950a
commit
b8df5cb84b
4 changed files with 125 additions and 16 deletions
|
@ -8,14 +8,14 @@
|
|||
t2 = $E1
|
||||
X_math = radius
|
||||
Y_math = $E2
|
||||
;; E9 - EA is used by pixel.inc
|
||||
byte_to_paint_qaa = $E8
|
||||
byte_to_paint_qcb = $E3
|
||||
byte_to_paint_qca = $E4
|
||||
byte_to_paint_qdb = $E5
|
||||
byte_to_paint_qaa = $E3
|
||||
byte_to_paint_qcb = $E4
|
||||
byte_to_paint_qca = $E5
|
||||
byte_to_paint_qdb = $E6
|
||||
|
||||
btp_mem_pos_qaa = btp_mem_pos
|
||||
btp_mem_pos_qcb = $E6 ; 16bit value (uses E7)
|
||||
btp_mem_pos_qcb = $E7 ; 16bit value (uses E8)
|
||||
; E9 - EA is used by pixel.inc
|
||||
btp_mem_pos_qdb = $EB ; 16bit value (uses EC)
|
||||
btp_mem_pos_qda = $ED ; 16bit value (uses EE)
|
||||
btp_mem_pos_qab = $D0 ; 16bit value (uses D1)
|
||||
|
|
|
@ -3,4 +3,9 @@
|
|||
;; public args
|
||||
A_start = $D0 ; 16-bit value (uses D1)
|
||||
B_start = $D2 ; 16-bit value (uses D3)
|
||||
length = $D4 ; 16-bit value (uses D5), this is the number of bytes
|
||||
length = $D4 ; 16-bit value (uses D5), this is the number of bytes
|
||||
|
||||
RTS_pointer = $D6 ; 16-bit value (uses D7)
|
||||
data_to_write = $D8
|
||||
length_copy = $d9 ; 16-bit vale (uses da)
|
||||
instruction_backup = $db
|
||||
|
|
|
@ -18,6 +18,8 @@ big_set: ;sets $ff of memory
|
|||
DEY
|
||||
.endrepeat
|
||||
STA (A_start), Y ; dont forget Y =0
|
||||
NOP
|
||||
NOP
|
||||
big_set_end:
|
||||
;;set all hole $ff memory chunks!
|
||||
INC A_start + 1
|
||||
|
@ -26,15 +28,46 @@ big_set_end:
|
|||
JMP big_set
|
||||
|
||||
|
||||
|
||||
;;sets the rest of the memory
|
||||
;; note that this can use code above (smc) or the same method. may implement later.
|
||||
small_set:
|
||||
LDY length
|
||||
small_set_loop:
|
||||
STA (A_start), Y
|
||||
DEY
|
||||
BNE small_set_loop
|
||||
STA (A_start), Y
|
||||
STA data_to_write
|
||||
LDA length
|
||||
STA length_copy
|
||||
|
||||
;; calculate rts-position
|
||||
LDA #$00
|
||||
STA length + 1
|
||||
;; 4 bytes = STA DEY NOP = seting 1 byte of memory.
|
||||
;; So we need to calculate: length*4
|
||||
Mult_16 length, length + 1
|
||||
Add_16 length, length + 1, length_copy, #$00
|
||||
;; Now RTS_pointer = length*4 + big_set_label
|
||||
CLC
|
||||
LDA #<big_set
|
||||
ADC length
|
||||
STA RTS_pointer
|
||||
LDA #>big_set
|
||||
ADC length + 1
|
||||
STA RTS_pointer + 1
|
||||
|
||||
;; read data we will change to RTS
|
||||
LDY #$00
|
||||
LDA (RTS_pointer), Y
|
||||
STA instruction_backup
|
||||
|
||||
;; set RTS in big_set
|
||||
LDA #$60
|
||||
STA (RTS_pointer), Y
|
||||
|
||||
;; JSR to modified big_set
|
||||
LDY length_copy
|
||||
DEY ; because we want to count to Y=0 :)
|
||||
LDA data_to_write
|
||||
JSR big_set
|
||||
|
||||
;; revert changes
|
||||
LDY #$00
|
||||
LDA instruction_backup
|
||||
STA (RTS_pointer), Y
|
||||
|
||||
RTS
|
||||
.endproc
|
||||
|
|
71
wip-hugo/routines/memory/memset_alt.s
Executable file
71
wip-hugo/routines/memory/memset_alt.s
Executable file
|
@ -0,0 +1,71 @@
|
|||
;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*-
|
||||
|
||||
;; Sets memory in 'A'-registry to all addresses from 'A_start' until 'A_start' + 'length'
|
||||
;; Modifies A, X and A_start
|
||||
.proc memset
|
||||
.include "mem.inc"
|
||||
|
||||
;; big_set sets the memory in $ff chunks.
|
||||
;; skipp if length >= $ff
|
||||
LDX length +1
|
||||
BNE big_set
|
||||
JMP small_set
|
||||
|
||||
big_set: ;sets $ff of memory
|
||||
;; Y value do not matter, will go through all anyway!
|
||||
.repeat $ff
|
||||
STA (A_start), Y
|
||||
DEY
|
||||
.endrepeat
|
||||
STA (A_start), Y ; dont forget Y =0
|
||||
big_set_end:
|
||||
;;set all hole $ff memory chunks!
|
||||
INC A_start + 1
|
||||
DEX ;; length +1 --
|
||||
BEQ small_set
|
||||
JMP big_set
|
||||
|
||||
|
||||
small_set:
|
||||
STA data_to_write
|
||||
LDA length
|
||||
STA length_copy
|
||||
|
||||
;; calculate rts-position
|
||||
LDA #$00
|
||||
STA length + 1
|
||||
;; 4 bytes = STA DEY NOP = seting 1 byte of memory.
|
||||
;; So we need to calculate: length*4
|
||||
Mult_16 length, length + 1
|
||||
Add_16 length, length + 1, length_copy, #$00
|
||||
;; Now RTS_pointer = length*4 + big_set_label
|
||||
CLC
|
||||
LDA #<big_set
|
||||
ADC length
|
||||
STA RTS_pointer
|
||||
LDA #>big_set
|
||||
ADC length + 1
|
||||
STA RTS_pointer + 1
|
||||
|
||||
;; read data we will change to RTS
|
||||
LDY #$00
|
||||
LDA (RTS_pointer), Y
|
||||
STA instruction_backup
|
||||
|
||||
;; set RTS in big_set
|
||||
LDA #$60
|
||||
STA (RTS_pointer), Y
|
||||
|
||||
;; JSR to modified big_set
|
||||
LDY length_copy
|
||||
DEY ; because we want to count to Y=0 :)
|
||||
LDA data_to_write
|
||||
JSR big_set
|
||||
|
||||
;; revert changes
|
||||
LDY #$00
|
||||
LDA instruction_backup
|
||||
STA (RTS_pointer), Y
|
||||
|
||||
RTS
|
||||
.endproc
|
Loading…
Add table
Reference in a new issue