[comp.binaries.apple2] QF.FILESYS.S

tm@polari.UUCP (Toshi Morita) (08/01/90)

Include file for QForth...


********************************
* 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
********************************