mirror of
https://github.com/irmen/prog8.git
synced 2024-12-25 08:29:25 +00:00
reimplemented sys.memcopy and sys.memset on cx16 to work without kernal too
This commit is contained in:
parent
6a0551cea1
commit
406658a10f
@ -823,16 +823,61 @@ sys {
|
|||||||
|
|
||||||
asmsub memcopy(uword source @R0, uword target @R1, uword count @AY) clobbers(A,X,Y) {
|
asmsub memcopy(uword source @R0, uword target @R1, uword count @AY) clobbers(A,X,Y) {
|
||||||
; note: can't be inlined because is called from asm as well
|
; note: can't be inlined because is called from asm as well
|
||||||
|
; also: doesn't use cx16 ROM routine so this always works even when ROM is not banked in.
|
||||||
%asm {{
|
%asm {{
|
||||||
sta cx16.r2
|
cpy #0
|
||||||
sty cx16.r2+1
|
bne _longcopy
|
||||||
jmp cx16.memory_copy
|
|
||||||
|
; copy <= 255 bytes
|
||||||
|
tay
|
||||||
|
bne _copyshort
|
||||||
|
rts ; nothing to copy
|
||||||
|
|
||||||
|
_copyshort
|
||||||
|
; decrease source and target pointers so we can simply index by Y
|
||||||
|
lda cx16.r0
|
||||||
|
bne +
|
||||||
|
dec cx16.r0+1
|
||||||
|
+ dec cx16.r0
|
||||||
|
lda cx16.r1
|
||||||
|
bne +
|
||||||
|
dec cx16.r1+1
|
||||||
|
+ dec cx16.r1
|
||||||
|
|
||||||
|
- lda (cx16.r0),y
|
||||||
|
sta (cx16.r1),y
|
||||||
|
dey
|
||||||
|
bne -
|
||||||
|
rts
|
||||||
|
|
||||||
|
_longcopy
|
||||||
|
pha ; lsb(count) = remainder in last page
|
||||||
|
tya
|
||||||
|
tax ; x = num pages (1+)
|
||||||
|
ldy #0
|
||||||
|
- lda (cx16.r0),y
|
||||||
|
sta (cx16.r1),y
|
||||||
|
iny
|
||||||
|
bne -
|
||||||
|
inc cx16.r0+1
|
||||||
|
inc cx16.r1+1
|
||||||
|
dex
|
||||||
|
bne -
|
||||||
|
ply
|
||||||
|
bne _copyshort
|
||||||
|
rts
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline asmsub memset(uword mem @R0, uword numbytes @R1, ubyte value @A) clobbers(A,X,Y) {
|
asmsub memset(uword mem @R0, uword numbytes @R1, ubyte value @A) clobbers(A,X,Y) {
|
||||||
%asm {{
|
%asm {{
|
||||||
jsr cx16.memory_fill
|
ldy cx16.r0
|
||||||
|
sty P8ZP_SCRATCH_W1
|
||||||
|
ldy cx16.r0+1
|
||||||
|
sty P8ZP_SCRATCH_W1+1
|
||||||
|
ldx cx16.r1
|
||||||
|
ldy cx16.r1+1
|
||||||
|
jmp prog8_lib.memset
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,8 +3,6 @@ TODO
|
|||||||
|
|
||||||
For next release
|
For next release
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
- move memcopy() logic to prog8_lib and call this from sys.memcopy() the same for all targets (so cx16 now also works when kernal is disabled!)
|
|
||||||
- same for memset()
|
|
||||||
- get rid of RAW_LOAD_ADDRESS and make specifying the load address for RAW launcher mode required
|
- get rid of RAW_LOAD_ADDRESS and make specifying the load address for RAW launcher mode required
|
||||||
...
|
...
|
||||||
|
|
||||||
@ -12,7 +10,7 @@ For next release
|
|||||||
Need help with
|
Need help with
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
- c128 target: various machine specific things (free zp locations, how banking works, getting the floating point routines working, ...)
|
- c128 target: various machine specific things (free zp locations, how banking works, getting the floating point routines working, ...)
|
||||||
- other targets such as Atari 800XL: all required details about the machine, I have no clue whatsoever
|
- atari target: more details details about the machine, fixing library routines. I have no clue whatsoever.
|
||||||
- see the :ref:`portingguide` for details on what information is needed.
|
- see the :ref:`portingguide` for details on what information is needed.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,11 +1,48 @@
|
|||||||
%launcher none
|
%import textio
|
||||||
|
%zeropage kernalsafe
|
||||||
|
|
||||||
main {
|
main {
|
||||||
sub start() {
|
sub start() {
|
||||||
uword @shared names_buffer = memory("filenames", 200, 0)
|
ubyte[20] array1 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
|
||||||
|
ubyte[20] array2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
|
||||||
|
|
||||||
do {
|
sys.set_irqd()
|
||||||
ubyte @shared char = '*'
|
|
||||||
} until true
|
cx16.rombank(9)
|
||||||
|
sys.memset(array1, 20, 255)
|
||||||
|
|
||||||
|
cx16.rombank(0)
|
||||||
|
ubyte ii
|
||||||
|
for ii in array1 {
|
||||||
|
txt.print_ubhex(ii, false)
|
||||||
|
txt.spc()
|
||||||
|
}
|
||||||
|
txt.nl()
|
||||||
|
for ii in array2 {
|
||||||
|
txt.print_ubhex(ii, false)
|
||||||
|
txt.spc()
|
||||||
|
}
|
||||||
|
txt.nl()
|
||||||
|
|
||||||
|
cx16.rombank(9)
|
||||||
|
sys.memset(array1, 20, 255)
|
||||||
|
array2=array1
|
||||||
|
|
||||||
|
cx16.rombank(0)
|
||||||
|
for ii in array1 {
|
||||||
|
txt.print_ubhex(ii, false)
|
||||||
|
txt.spc()
|
||||||
|
}
|
||||||
|
txt.nl()
|
||||||
|
for ii in array2 {
|
||||||
|
txt.print_ubhex(ii, false)
|
||||||
|
txt.spc()
|
||||||
|
}
|
||||||
|
txt.nl()
|
||||||
|
|
||||||
|
cx16.rombank(4)
|
||||||
|
|
||||||
|
repeat {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user