2021-12-04 22:23:10 +00:00
|
|
|
; Cx16 specific disk drive I/O routines.
|
|
|
|
;
|
|
|
|
; Written by Irmen de Jong (irmen@razorvine.net) - license: GNU GPL 3.0
|
|
|
|
|
|
|
|
%import diskio
|
|
|
|
|
|
|
|
cx16diskio {
|
|
|
|
|
|
|
|
; Use kernal LOAD routine to load the given program file in memory.
|
2022-01-03 21:44:27 +00:00
|
|
|
; This is similar to Basic's LOAD "filename",drive / LOAD "filename",drive,1
|
2021-12-04 22:23:10 +00:00
|
|
|
; If you don't give an address_override, the location in memory is taken from the 2-byte file header.
|
|
|
|
; If you specify a custom address_override, the first 2 bytes in the file are ignored
|
|
|
|
; and the rest is loaded at the given location in memory.
|
2021-12-14 22:54:42 +00:00
|
|
|
; Returns the end load address+1 if successful or 0 if a load error occurred.
|
|
|
|
; You can use the load_size() function to calcuate the size of the file that was loaded.
|
2021-12-04 22:23:10 +00:00
|
|
|
sub load(ubyte drivenumber, uword filenameptr, ubyte bank, uword address_override) -> uword {
|
|
|
|
cx16.rambank(bank)
|
2021-12-14 22:54:42 +00:00
|
|
|
return diskio.load(drivenumber, filenameptr, address_override)
|
2021-12-04 22:23:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
; Use kernal LOAD routine to load the given file in memory.
|
|
|
|
; INCLUDING the first 2 bytes in the file: no program header is assumed in the file.
|
|
|
|
; This is different from Basic's LOAD instruction which always skips the first two bytes.
|
|
|
|
; The load address is mandatory. Returns the number of bytes loaded.
|
2021-12-14 22:54:42 +00:00
|
|
|
; Returns the end load address+1 if successful or 0 if a load error occurred.
|
|
|
|
; You can use the load_size() function to calcuate the size of the file that was loaded.
|
2021-12-04 22:23:10 +00:00
|
|
|
sub load_raw(ubyte drivenumber, uword filenameptr, ubyte bank, uword address) -> uword {
|
|
|
|
cx16.rambank(bank)
|
2021-12-14 22:54:42 +00:00
|
|
|
return diskio.load_raw(drivenumber, filenameptr, address)
|
2021-12-04 22:23:10 +00:00
|
|
|
}
|
|
|
|
|
2021-12-14 22:54:42 +00:00
|
|
|
; For use directly after a load or load_raw call (don't mess with the ram bank yet):
|
|
|
|
; Calculates the number of bytes loaded (files > 64Kb ar truncated to 16 bits)
|
|
|
|
sub load_size(ubyte startbank, uword startaddress, uword endaddress) -> uword {
|
|
|
|
return $2000 * (cx16.getrambank() - startbank) + endaddress - startaddress
|
|
|
|
}
|
2022-01-24 17:31:18 +00:00
|
|
|
|
|
|
|
asmsub vload(str name @R0, ubyte device @Y, ubyte bank @A, uword address @R1) -> ubyte @A {
|
|
|
|
; -- like the basic command VLOAD "filename",device,bank,address
|
|
|
|
; loads a file into Vera's video memory in the given bank:address, returns success in A
|
|
|
|
%asm {{
|
|
|
|
; -- load a file into video ram
|
|
|
|
phx
|
|
|
|
pha
|
|
|
|
tya
|
|
|
|
tax
|
|
|
|
lda #1
|
|
|
|
ldy #0
|
|
|
|
jsr c64.SETLFS
|
|
|
|
lda cx16.r0
|
|
|
|
ldy cx16.r0+1
|
|
|
|
jsr prog8_lib.strlen
|
|
|
|
tya
|
|
|
|
ldx cx16.r0
|
|
|
|
ldy cx16.r0+1
|
|
|
|
jsr c64.SETNAM
|
|
|
|
pla
|
|
|
|
clc
|
|
|
|
adc #2
|
|
|
|
ldx cx16.r1
|
|
|
|
ldy cx16.r1+1
|
|
|
|
stz P8ZP_SCRATCH_B1
|
|
|
|
jsr c64.LOAD
|
|
|
|
bcs +
|
|
|
|
inc P8ZP_SCRATCH_B1
|
|
|
|
+ jsr c64.CLRCHN
|
|
|
|
lda #1
|
|
|
|
jsr c64.CLOSE
|
|
|
|
plx
|
|
|
|
lda P8ZP_SCRATCH_B1
|
|
|
|
rts
|
|
|
|
}}
|
|
|
|
}
|
|
|
|
|
2021-12-04 22:23:10 +00:00
|
|
|
}
|