;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 ldx #7 bne .loadcommon ;------------------------------------------------------------------------------ ; 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 ldx #6 bne .loadcommon ;------------------------------------------------------------------------------ ; 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 ldx #$84 .loadcommon pla sta PARAM txa pha and #6 clc adc PARAM tay pla tax pla sta PARAM+1 adc #0 pha tya pha txa pha +LDPARAM 1 jsr SetPath +LDPARAM 3 jsr AddToPath plp php bmi + +LDPARAMPTR 5, ldrlo ; set load address + jsr SwitchToBank2 plp bmi ++ bcc + jsr LoadFileInternal jmp SwitchToBank1 + ldx #1 ; request aux memory jsr LoadFileAuxInternal jmp SwitchToBank1 ++ jsr LoadDHRFileInternal jmp SwitchToBank1 ;------------------------------------------------------------------------------ ; LoadAuxIndexedFile ; Load a file from inside an indexed file, all at once into auxiliary memory ; ; 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 ;------------------------------------------------------------------------------ LoadAuxIndexedFile lda #$EE ; INC +HIDE_NEXT_2_BYTES ;------------------------------------------------------------------------------ ; 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 lda #$8D ; STA sta @iauxreq +PARAMS_ON_STACK 6 jsr @set_nameaddr +LDPARAMPTR 5, zpword inc $BF0E ; disable ROM mapping on return jsr SwitchToBank2 jsr resetRoot 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 @iauxreq sta SavedZP + auxreq - first_zp ; SMC jsr $bf00 !byte $ca !word @ca_parms sta auxreq jsr $bf00 !byte $cc !word @cc_parms jsr swap_zpg ; restore sizelo2/hi2 dec $BF0E ; re-enable ROM mapping on return jmp SwitchToBank1 @set_nameaddr ldx #0 ldy #1 jsr + iny ldx #@address - @filename + lda (PARAM), y sta @filename, x iny lda (PARAM), y sta @filename + 1, x rts @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