;license:MIT ;(c) 2018-2021 by 4am & qkumba ; ; ProRWTS2 glue functions ; ; Public functions ; - LoadFile ; - LoadAuxFile ; - LoadDHRFile ; - LoadIndexedFile ; ; Public variables ; - gRootDirectory ; ; A general note about paths: ; ; Load[*]File routines support subdirectories. Directories are delimited by '/' ; like ProDOS. At program startup, we get the current directory and save it; ; that is the PROGRAM ROOT DIRECTORY. All pathnames are relative to the PROGRAM ; ROOT DIRECTORY. There is no concept of setting or changing the 'current' ; directory. ; ; The PROGRAM ROOT DIRECTORY is not guaranteed to be the root directory of the ; underlying ProDOS disk (although it can be). But it doesn't matter, because ; these functions provide no access to any directory above the PROGRAM ROOT ; DIRECTORY. You can't use '..' to access the parent directory, and you can't ; start a pathname with '/' to access the root directory of the underlying ; ProDOS disk. ; ; Examples: ; 'PREFS.CONF' points to a file named 'PREFS.CONF' in the PROGRAM ROOT ; DIRECTORY. ; ; 'FX/RIPPLE' points to a file named 'RIPPLE' in a directory named 'FX' in the ; PROGRAM ROOT DIRECTORY. ;------------------------------------------------------------------------------ ; LoadFile ; Load a file into memory all at once, using ProRWTS2 ; ; supports paths, see note ; ; in: stack contains 6 bytes of parameters: ; +1 [word] address of length-prefixed pathname ; +3 [word] address of length-prefixed filename ; +5 [word] address to load file, or 0 to use file's default address ; out: all flags clobbered ; all registers clobbered ; gPathname clobbered ;------------------------------------------------------------------------------ LoadFile +PARAMS_ON_STACK 6 +LDPARAM 1 jsr SetPath +LDPARAM 3 jsr AddToPath +LDPARAMPTR 5, ldrlo ; set load address jsr SwitchToBank2 jsr LoadFileInternal jmp SwitchToBank1 ;------------------------------------------------------------------------------ ; LoadAuxFile ; Load a file into aux memory all at once, using ProRWTS2 ; ; supports paths, see note ; ; in: stack contains 6 bytes of parameters: ; +1 [word] address of length-prefixed pathname ; +3 [word] address of length-prefixed filename ; +5 [word] address to load file, or 0 to use file's default address ; out: all flags clobbered ; all registers clobbered ; gPathname clobbered ;------------------------------------------------------------------------------ LoadAuxFile +PARAMS_ON_STACK 6 +LDPARAM 1 jsr SetPath +LDPARAM 3 jsr AddToPath +LDPARAMPTR 5, ldrlo ; set load address jsr SwitchToBank2 lda #1 ; request aux memory jsr LoadFileAuxInternal jmp SwitchToBank1 ;------------------------------------------------------------------------------ ; LoadDHRFile ; load .A2FC file (uncompressed double hi-res graphics) into memory ; all at once, using ProRWTS2 ; first $2000 bytes of file are loaded into auxiliary memory $4000..$5FFF ; second $2000 bytes of file are loaded into main memory $4000..$4FFF ; ; supports paths, see note ; ; in: stack contains 4 bytes of parameters: ; +1 [word] address of length-prefixed pathname ; +3 [word] address of length-prefixed filename ; out: all flags clobbered ; all registers clobbered ; stack set to next instruction after parameters ;------------------------------------------------------------------------------ LoadDHRFile +PARAMS_ON_STACK 4 +LDPARAM 1 jsr SetPath +LDPARAM 3 jsr AddToPath jsr SwitchToBank2 jsr LoadDHRFileInternal jmp SwitchToBank1 ;------------------------------------------------------------------------------ ; LoadIndexedFile ; Load a file from inside an indexed file, all at once ; ; To save disk space, some collections of small, related files (e.g. per-game ; help files) are merged into a single data file with an associated index file. ; The index stores the original filename along with an offset (into the merged ; data file) and a length. ; ; Callers are responsible for loading the index file and finding the relevant ; record within the index. Most callers use okvs_find() for this. ; ; in: stack contains 6 bytes of parameters: ; +1 [word] pointer to filename of merged data file ; +3 [word] address of load destination ; +5 [word] pointer to index record (see note) ; out: all flags clobbered ; all registers clobbered ;------------------------------------------------------------------------------ LoadIndexedFile +PARAMS_ON_STACK 6 +LDPARAM 1 +ST16 @filename +LDPARAM 3 +ST16 @address +LDPARAM 5 +ST16 zpword inc $BF0E ; disable ROM mapping on return ldx #2 ldy #0 lda (zpword), y tay - iny lda (zpword), y sta @offset, x dex bpl - dex - iny lda (zpword), y sta @size - $fe, x inx bmi - jsr $bf00 ; yes, ProDOS abstraction !byte $c8 !word @c8_parms jsr $bf00 !byte $ce !word @ce_parms jsr $bf00 !byte $ca !word @ca_parms jsr $bf00 !byte $cc !word @cc_parms dec $BF0E ; re-enable ROM mapping on return jmp SwitchToBank1 @c8_parms !byte 3 @filename !word $DFDF ; SMC !byte 0 @ce_parms !byte $d0 !byte 1 @offset !byte 0, 0, 0 ; SMC !byte $ff @ca_parms !byte $ff @cc_parms !byte 1 @address !word $DFDF ; SMC @size !word $DFDF ; SMC !word $ffff gRootDirectory !word $FDFD