;license:MIT ;(c) 2018-9 by 4am & qkumba ; ; ProRWTS2 glue functions ; ; Public functions ; - LoadFile ; - LoadDHRFile ; - SaveSmallFile ; - SaveOrRestoreScreenHoles ; ; A general note about paths: ; ; LoadFile, LoadDHRFile, and SaveSmallFile 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. gRootDirectory !word $FDFD ;------------------------------------------------------------------------------ ; 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 +LDPARAM 5 +STAY ldrlo ; set load address +LDADDR gPathname +STAY namlo ; set filename +READ_RAM2_WRITE_RAM2 jsr traverse ; go to subdirectory, set up filename for read lda #cmdread ; read (instead of write) sta reqcmd lda #0 ; 0 = read into main memory sta auxreq lda ldrlo+1 bne + ; if caller provided a load address, use it sta sizelo ; otherwise query the load address from file metadata sta sizehi ; 0 = query load address jsr hddopendir ; call ProRWTS2 +LDAY ldrlo2 +STAY ldrlo + lda #$FF ; read entire file (ProRWTS2 will figure out exact size) sta sizehi jsr hddopendir ; exit via ProRWTS2 +READ_RAM1_WRITE_RAM1 rts ;------------------------------------------------------------------------------ ; 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 +LDADDR gPathname +STAY namlo ; set filename +READ_RAM2_WRITE_RAM2 jsr traverse ; go to subdirectory, set up filename for read lda #$00 ; read first $2000 bytes sta sizelo sta ldrlo lda #$20 sta sizehi asl sta ldrhi ; into $4000 lda #1 ; 1 = read into aux memory sta auxreq lda #cmdread ; read (instead of write) sta reqcmd jsr hddopendir ; call ProRWTS2 lda #$20 ; read next $2000 bytes sta sizehi asl sta ldrhi ; into $4000 dec auxreq ; 0 = read into main memory clc ; not a subdirectory jsr hddrdwrpart ; call ProRWTS2 +READ_RAM1_WRITE_RAM1 rts ;------------------------------------------------------------------------------ ; SaveSmallFile ; Save a file into memory all at once, using ProRWTS2. ; /!\ Only first block (512 bytes) is written. Keep those files small. /!\ ; /!\ All 512 bytes are written to disk. Clear buffer before calling. /!\ ; ; supports paths, see note ; ; in: stack contains 2 bytes of parameters: ; +1 address of data buffer ; out: all flags clobbered ; all registers clobbered ; stack set to next instruction after parameters ;------------------------------------------------------------------------------ SaveSmallFile +PARAMS_ON_STACK 2 +LDPARAM 1 +STAY ldrlo ; set data buffer address for ProRWTS2 +LDADDR gPathname +STAY namlo ; set filename for ProRWTS2 +READ_RAM2_WRITE_RAM2 jsr traverse ; go to subdirectory, set up filename for read ;;if the write address is always a fixed value then we can discard the query lda #cmdread ; read (instead of write) sta reqcmd lda #0 ; 0 = read into main memory sta sizelo sta sizehi ; 0 = query load address jsr hddopendir ; call ProRWTS2 lda ldrlo2 sta ldrlo lda ldrhi2 sta ldrhi lda #cmdwrite ; write (instead of read) sta reqcmd sta sizelo ; non-zero jsr hddopendir ; exit via ProRWTS2 (must re-open the file after query) +READ_RAM1_WRITE_RAM1 rts