******************************** * Start Qforth file system ******************************** * * Word "fcreate" - creates file or directory * WORD99 ASC 'fcreate ' DW FCREATE FCREATE LDA #07 ; 7 parameters STA WPARMS STZ WPARMS+$0B ; Set up creation time STZ WPARMS+$0A STZ WPARMS+9 ; Set up creation date STZ WPARMS+8 LDA #01 ; Storage type (seedling file) STA WPARMS+7 JSR POPDATA ; Set up auxiliary filetype STY WPARMS+5 STX WPARMS+6 JSR POPDATA ; Set up filetype STY WPARMS+4 LDA #$C3 ; Set up access privileges for file STA WPARMS+3 JSR POPDATA ; Set up address of pathname STY PNTR STX PNTR+1 LDA #FILENM3 STA WPARMS+1 STA PNTR2 LDA #/FILENM3 STA WPARMS+2 STA PNTR2+1 JSR CONVFNAM ; Convert filename to ProDOS format JSR MLI DFB $C0 ; Create code DW WPARMS ; Execution falls through into HANDLERR * * Handle ProDOS errors * HANDLERR BCS :ERR LDY #00 ; No error - push 0 on stack LDX #00 JMP PUSHDATA :ERR TAY ; Error, so push error # on stack LDX #00 JMP PUSHDATA * * Convert filename to ProDOS format * CONVFNAM LDY #00 ; Convert filename to ProDOS format :LOOP LDA (PNTR),Y BEQ :FINIS INY STA (PNTR2),Y BRA :LOOP :FINIS TYA ; Set up length byte of filename STA (PNTR2) RTS * * Table of filename buffers * FNAMTBLL DFB #FILENM0,#FILENM1,#FILENM2 FNAMTBLH DFB #/FILENM0,#/FILENM1,#/FILENM2 * * Table of file buffers * FBUFTBLL DFB #FILEBUF0,#FILEBUF1,#FILEBUF2 FBUFTBLH DFB #/FILEBUF0,#/FILEBUF1,#/FILEBUF2 * * Table of reference #s * CFILE DS 1 FREFTBL DS 3 * * MLI parameter storage area * WPARMS DS 20 ; MLI parameters used by words * * Word "fdestroy" - destory file or directory * WORD100 ASC 'fdestroy ' DW FDESTROY FDESTROY LDA #01 ; Only one parameter STA WPARMS JSR POPDATA ; Set up address of pathname STY PNTR STX PNTR+1 LDA #FILENM3 STA WPARMS+1 STA PNTR2 LDA #/FILENM3 STA WPARMS+2 STA PNTR2+1 JSR CONVFNAM ; Convert filename to ProDOS format JSR MLI ; Call MLI DFB $C1 ; Destroy code DW WPARMS JMP HANDLERR ; Handle error, if any * * Word "fstat" - find out various things about file * WORD101 ASC 'fstat ' DW FSTAT FSTAT LDA #10 ; Ten parameters STA WPARMS JSR POPDATA ; Get address of pathname STY WPARMS+1 STX WPARMS+2 JSR MLI ; Call MLI with GET_FILE_INFO DFB $C4 DW WPARMS PHP PHA LDY WPARMS+4 ; Push filetype LDX #00 JSR PUSHDATA LDY WPARMS+5 ; Push auxiliary filetype LDX WPARMS+6 JSR PUSHDATA LDY WPARMS+8 ; Disk blocks used LDX WPARMS+9 JSR PUSHDATA PLA PLP JMP HANDLERR * * Word "fopen" - open a file * WORD102 ASC 'fopen ' DW FOPEN FOPEN LDA #03 ; Three parameters STA WPARMS JSR POPDATA ; Set up address of pathname STY PNTR STX PNTR+1 JSR POPDATA ; Set up filename buffer STY CFILE LDA FNAMTBLL,Y STA WPARMS+1 STA PNTR2 LDA FNAMTBLH,Y STA WPARMS+2 STA PNTR2+1 LDA FBUFTBLL,Y ; Set up address of file buffer STA WPARMS+3 LDA FBUFTBLH,Y STA WPARMS+4 JSR CONVFNAM ; Convert filename JSR MLI ; Call MLI DFB $C8 ; Open code DW WPARMS PHP PHA LDA WPARMS+5 ; Store reference # for future use LDY CFILE STA FREFTBL,Y PLA PLP JMP HANDLERR ; Handle error, if any * * Word "fposition" - set current file marker position * WORD103 ASC 'fposition ' DW FPOSIT FPOSIT LDA #02 ; Two parameters STA WPARMS JSR POPDATA ; Set up file position STY WPARMS+2 STX WPARMS+3 JSR POPDATA STY WPARMS+4 JSR POPDATA ; Set up reference number LDA FREFTBL,Y STA WPARMS+1 JSR MLI DFB $CE ; Set_Mark call DW WPARMS JMP HANDLERR ; Handle error, if any * * Word "fread" - read a file * WORD104 ASC 'fread ' DW FREAD FREAD LDA #04 ; Four parameters STA WPARMS JSR POPDATA ; Set up requested length STY WPARMS+4 STX WPARMS+5 JSR POPDATA ; Set up address of data buffer STY WPARMS+2 STX WPARMS+3 JSR POPDATA ; Set up reference number LDA FREFTBL,Y STA WPARMS+1 JSR MLI ; Call MLI DFB $CA ; Read code DW WPARMS PHP PHA LDY WPARMS+6 ; Return actual read length LDX WPARMS+7 JSR PUSHDATA PLA PLP JMP HANDLERR ; Handle error, if any * * Word "fwrite" - write a file * WORD105 ASC 'fwrite ' DW FWRITE FWRITE LDA #04 ; Four parameters STA WPARMS JSR POPDATA ; Set up requested length STY WPARMS+4 STX WPARMS+5 JSR POPDATA ; Set up address of data buffer STY WPARMS+2 STX WPARMS+3 JSR POPDATA ; Set up reference number LDA FREFTBL,Y STA WPARMS+1 JSR MLI ; Call MLI DFB $CB ; Write code DW WPARMS PHP PHA LDY WPARMS+6 ; Return actual write length LDX WPARMS+7 JSR PUSHDATA PLA PLP JMP HANDLERR ; Handle error, if any * * Word "fclose" - close file * WORD106 ASC 'fclose ' DW FCLOSE FCLOSE LDA #01 ; One parameter STA WPARMS JSR POPDATA ; Set up reference number LDA FREFTBL,Y STA WPARMS+1 JSR MLI ; Call MLI DFB $CC ; Close code DW WPARMS JMP HANDLERR ; Handle error, if any ******************************** * End Qforth file system ********************************