2253 lines
30 KiB
Plaintext
2253 lines
30 KiB
Plaintext
LST OFF
|
||
* *
|
||
* F I L E M A N A G E R *
|
||
* *
|
||
* from the D O S - Source 1982 *
|
||
* *
|
||
**********************************
|
||
*
|
||
*
|
||
*
|
||
SCRATCH = $27
|
||
BOOTSLOT = $2B
|
||
ROMRWTS = $3E
|
||
SECNUM = $3D
|
||
OPRND = $44
|
||
BUFADR = $42
|
||
DOSIMG = $40
|
||
IOBADR = $48
|
||
DRV0TRAK = $478
|
||
DRV1TRAK = $4F8
|
||
DOSSTRT = $9D84
|
||
DOVERIFY = $A27D
|
||
DOCLOSE = $A2EA
|
||
RWC2 = $A546
|
||
FMDRVR = $A6A8
|
||
FMDRVR0 = $A6BC
|
||
DOERROR = $A6D2
|
||
LOCBUF = $A764
|
||
KWDRPRMS = $A909
|
||
CURSTAT = $AA51
|
||
CMDINDX = $AA5F
|
||
RWTSENT = $BD00
|
||
REBOOT = $BFC8
|
||
DISKFULL = $BFED
|
||
MEMTOP = $C000
|
||
MONINIT = $FB2F
|
||
CLRHOME = $FC58
|
||
RDCHAR = $FD0C
|
||
PRBYTE = $FDDA
|
||
COUT = $FDED
|
||
SETKBD = $FE89
|
||
SETVID = $FE93
|
||
*
|
||
ORG $AAC1
|
||
*
|
||
*
|
||
* THE FOLLOWING ADDRESSES ARE
|
||
* SHARED WITH THE CDI FILE
|
||
*
|
||
RWTSPADR DA TBLTYPE
|
||
VTOCPADR DA VTOCSB
|
||
DIRPADR DA DIRSECBF
|
||
DA MEMTOP
|
||
*
|
||
*
|
||
* File manager subroutine table.
|
||
*
|
||
*
|
||
FMFTBL DA NOERROR-1
|
||
DA OPNHNDLR-1
|
||
DA CLSHDLR-1
|
||
DA RDHNDLR-1
|
||
DA WRTHNDLR-1
|
||
DA DELHNDL-1
|
||
DA CATHNDL-1
|
||
DA LCKHNDLR-1
|
||
DA UNLKHDL-1
|
||
DA RENHNDLR-1
|
||
DA POSHNDLR-1
|
||
DA INITHDL-1
|
||
DA VFYHNDL-1
|
||
DA NOERROR-1
|
||
*
|
||
* Read Subcode table.
|
||
*
|
||
*
|
||
FMRSUB DA NOERROR-1
|
||
DA RD1BYTE-1
|
||
DA RDRANGE-1
|
||
DA POSRD1B-1
|
||
DA POSRDR-1
|
||
DA NOERROR-1
|
||
*
|
||
* Write subcode table.
|
||
*
|
||
FMWSUB DA NOERROR-1
|
||
DA WRT1BYTE-1
|
||
DA WRTRANGE-1
|
||
DA POSWRT1B-1
|
||
DA POSWRTR-1
|
||
DA NOERROR-1
|
||
*
|
||
ORG $AAFD
|
||
*
|
||
*
|
||
*
|
||
* EXTERNAL ENTRY POINT FOR FILE
|
||
* MANGER.
|
||
*
|
||
* X=0, allocate a new file if
|
||
* file not found in dir.
|
||
*
|
||
* X=1, do not allocate a new file
|
||
* if file not found.
|
||
*
|
||
*
|
||
*
|
||
FMEXT CPX #0
|
||
BEQ FMEXT1
|
||
LDX #2
|
||
FMEXT1 STX CMDINDX
|
||
*
|
||
*
|
||
*
|
||
* NORMAL ENTRY FOR FILE MANAGER
|
||
*
|
||
*
|
||
FILEMGR TSX
|
||
STX STKSAVE
|
||
*
|
||
* GET FM PARMS
|
||
*
|
||
JSR LDFMW
|
||
*
|
||
* CHECK TO SEE IF WE HAVE A VALID
|
||
* FM OPCODE..
|
||
*
|
||
LDA FMOPCOD
|
||
CMP #$D
|
||
BCS FILEMGR1
|
||
*
|
||
* USING OPCODE AS INDEX INTO
|
||
* FMFTBL, JMP TO APPROPRIATE
|
||
* ROUTINE.
|
||
*
|
||
ASL
|
||
TAX
|
||
LDA FMFTBL+1,X
|
||
PHA
|
||
LDA FMFTBL,X
|
||
PHA
|
||
RTS
|
||
*
|
||
ORG $AB1F
|
||
*
|
||
* JMP TO OPCODE RANGE ERROR
|
||
* HANDLER
|
||
*
|
||
FILEMGR1 JMP RANGERR
|
||
*
|
||
*
|
||
*
|
||
* OPNHNDLR- OPENS A FILE
|
||
*
|
||
OPNHNDLR JSR CMNOPN
|
||
JMP NOERROR
|
||
*
|
||
*
|
||
* CMNOPN- USED TO OPEN A FILE,
|
||
* CALLED BY VARIOUS FILE MANAGER
|
||
* ROUTINES.
|
||
*
|
||
ORG $AB28
|
||
*
|
||
*
|
||
* INIT FILE MANAGER WORK AREA
|
||
*
|
||
CMNOPN JSR INITFMW
|
||
*
|
||
* SET SECTOR LENGTH TO 256 BYTEST
|
||
*
|
||
LDA #$1
|
||
STA SECTLEN+1
|
||
*
|
||
* IF RECORD LEN = 0, SET TO 1
|
||
*
|
||
LDX RECNUM+1
|
||
LDA RECNUM
|
||
BNE CMNOPN1
|
||
CPX #0
|
||
BNE CMNOPN1
|
||
INX
|
||
CMNOPN1 STA OPNRCLEN
|
||
STX OPNRCLEN+1
|
||
*
|
||
* SEARCH FOR THE FILENAME IN THE
|
||
* DIRECTORY, ALLOCATE IF NOT FOUND
|
||
*
|
||
JSR LCDIRENT
|
||
BCC PLTSDIR
|
||
*
|
||
* FILE NOT FOUND IN DIRECTORY,
|
||
* SEE IF A FILE IS REQUIRED.
|
||
*
|
||
STX DIRINDX
|
||
LDX CMDINDX
|
||
LDA KWDRPRMS,X
|
||
LDX DIRINDX
|
||
LSR
|
||
BCS CMNOPN3
|
||
*
|
||
*
|
||
* AT THIS POINT, THE FILE MUST BE
|
||
* PRESENT, SEE IF WE ARE LOADING
|
||
* APPLESOFT FROM DISK.
|
||
*
|
||
LDA CURSTAT
|
||
CMP #$C0
|
||
BNE CMNOPN2
|
||
*
|
||
* LOADING AS. ERROR= LANG NOT AVL
|
||
*
|
||
JMP LNOTAVL
|
||
*
|
||
* LOADING A NORMAL PROGRAM, PRINT
|
||
* FILE NOT FOUND.
|
||
*
|
||
CMNOPN2 JMP FNOTFND
|
||
*
|
||
ORG $AB64
|
||
*
|
||
* FILE WAS NOT REQUIRED TO BE
|
||
* IN THE DIRECTORY, SET IT
|
||
* UP
|
||
*
|
||
*
|
||
* SET SECTOR COUNT TO 1
|
||
*
|
||
CMNOPN3 LDA #0
|
||
STA FILESIZE+1,X
|
||
LDA #$1
|
||
STA FILESIZE,X
|
||
STX DIRINDX
|
||
*
|
||
* ALLOCATE A SECTOR FOR T/S LIST
|
||
*
|
||
JSR ALLOCSEC
|
||
*
|
||
* SET UP T/S LIST AND WORK BUFFER
|
||
*
|
||
LDX DIRINDX
|
||
STA TSSECTOR,X
|
||
STA FTSS
|
||
STA CURTSS
|
||
LDA SCALAREA+1
|
||
STA TSTRACK,X
|
||
STA FTSTS
|
||
STA CURTSTS
|
||
LDA FILETYPE
|
||
STA FILTYP,X
|
||
*
|
||
* WRITE DIRECTORY BACK TO DISK
|
||
*
|
||
JSR WRTDIRSC
|
||
*
|
||
* INIT THE WORK BUFFER, DATA
|
||
* BUFFER, AND T/S BUFFERS
|
||
*
|
||
JSR SELTSBUF
|
||
JSR ZEROBUF
|
||
JSR SETUPRW
|
||
*
|
||
* SET RETURN CODE TO FILE NOT FND
|
||
*
|
||
LDX DIRINDX
|
||
LDA #6
|
||
STA RTNCODE
|
||
*
|
||
*
|
||
*
|
||
* FALL THROUGH FROM ABOVE (FILE
|
||
* CREATED AND ENTERED INTO DIR)
|
||
*
|
||
* -OR-
|
||
*
|
||
* COME FROM DIR LOOKUP IF FILE
|
||
* WAS FOUND IN DIRECTORY.
|
||
*
|
||
*
|
||
*
|
||
* COPY T/S LIST INFO TO WORK
|
||
* BUFFER
|
||
*
|
||
PLTSDIR LDA TSTRACK,X
|
||
STA FTSTS
|
||
LDA TSSECTOR,X
|
||
STA FTSS
|
||
LDA FILTYP,X
|
||
*
|
||
* COPY FILE TYPE TO WORK BUFFER
|
||
*
|
||
STA FILETYPE
|
||
STA FTYPE
|
||
*
|
||
* COPY FILE SIZE TO WORK BUFFER
|
||
*
|
||
LDA FILESIZE,X
|
||
STA SECCNT
|
||
LDA FILESIZE+1,X
|
||
STA SECCNT+1
|
||
STX DIRSECIX+1
|
||
*
|
||
* INIT EOF TO 65535 (INFINITY)
|
||
*
|
||
LDA #$FF
|
||
STA RELSLRD
|
||
STA RELSLRD+1
|
||
*
|
||
* SET UP # OF ENTRIES IN T/S LIST
|
||
*
|
||
LDA NUMTSENT
|
||
STA SECPERTS
|
||
*
|
||
* READ IN THE FIRST T/S LIST
|
||
* (IF THERE IS ONE)
|
||
*
|
||
CLC
|
||
JMP RDTSLST
|
||
*
|
||
ORG $ABDC
|
||
*
|
||
* INITIALIZE FILE MANAGER WORK
|
||
* AREA.
|
||
*
|
||
*
|
||
* ZERO OUT T/S LIST
|
||
*
|
||
INITFMW LDA #0
|
||
TAX
|
||
INITFMW1 STA FTSTS,X
|
||
INX
|
||
CPX #$2D
|
||
BNE INITFMW1
|
||
*
|
||
* INIT VOLUME # (COMPLIMENTED),
|
||
* SLOT, AND DRIVE #.
|
||
*
|
||
LDA VOLVAL
|
||
EOR #$FF
|
||
STA VOLNUMBR
|
||
LDA DRVVAL
|
||
STA DRVNUMBR
|
||
LDA SLOTVAL
|
||
ASL
|
||
ASL
|
||
ASL
|
||
ASL
|
||
TAX
|
||
STX SLOT16
|
||
*
|
||
* SET UP FOR DIRECTORY TRACK
|
||
*
|
||
LDA #$11
|
||
STA TRKNUMBR
|
||
RTS
|
||
*
|
||
ORG $AC06
|
||
*
|
||
* CLOSE FILE HANDLER.
|
||
*
|
||
*
|
||
* CHECK TO SEE IF DATA BUFFER OR
|
||
* T/S BUFFER NEEDS TO BE WRITTEN
|
||
* TO DISK.
|
||
*
|
||
CLSHDLR JSR CHKBUF
|
||
JSR CHKTS
|
||
*
|
||
* RELEASE ANY UNALLOCATED SECTORS
|
||
*
|
||
JSR RLSALLC
|
||
*
|
||
* CHECK TO SEE IF FILE SIZE
|
||
* HAS CHANGED.
|
||
*
|
||
LDA #2
|
||
AND FLAGS
|
||
BEQ CLSHDLR2
|
||
*
|
||
* IF SO, READ VTOC, UPDATE IT,
|
||
* READ DIR, AND UPDATE FILE SIZE
|
||
*
|
||
JSR RWVTOC
|
||
LDA #0
|
||
CLC
|
||
CLSHDLR1 JSR RDDIRSC
|
||
SEC
|
||
DEC DIRSECIX
|
||
BNE CLSHDLR1
|
||
LDX DIRSECIX+1
|
||
LDA SECCNT
|
||
STA FILESIZE,X
|
||
LDA SECCNT+1
|
||
STA FILESIZE+1,X
|
||
JSR WRTDIRSC
|
||
*
|
||
* NORMAL CLOSE EXIT PT.
|
||
*
|
||
CLSHDLR2 JMP NOERROR
|
||
*
|
||
ORG $AC3A
|
||
*
|
||
* RENAME HANDLER.
|
||
*
|
||
RENHNDLR JSR CMNOPN ;LOOKUP FILE
|
||
*
|
||
* SEE IF THE FILE IS LOCKED
|
||
*
|
||
LDA FTYPE
|
||
BMI FILOCKED
|
||
*
|
||
*
|
||
* IF NOT, POINT BUFADR AT THE
|
||
* SECOND FILENAME AND COPY IT
|
||
* INTO THE DIRECTORY
|
||
*
|
||
LDA RECNUM
|
||
STA BUFADR
|
||
LDA RECNUM+1
|
||
STA BUFADR+1
|
||
LDX DIRINDX
|
||
JSR COPFNAM
|
||
*
|
||
* WRITE THE DIRECTORY BACK TO
|
||
* DISK
|
||
*
|
||
JSR WRTDIRSC
|
||
JMP NOERROR
|
||
*
|
||
ORG $AC58
|
||
*
|
||
* READ FUNCTION HANDLER.
|
||
*
|
||
RDHNDLR LDA SUBCODE
|
||
*
|
||
* MAKE SURE SUBCODE IS < 5
|
||
*
|
||
CMP #5
|
||
BCS RDHNDLR1
|
||
*
|
||
* USE SUBCODE AS INDEX INTO FMRSUB
|
||
* TABLE, JUMP TO THAT ADDRESS
|
||
*
|
||
ASL
|
||
TAX
|
||
LDA FMRSUB+1,X
|
||
PHA
|
||
LDA FMRSUB,X
|
||
PHA
|
||
RTS
|
||
RDHNDLR1 JMP RANGERR2
|
||
*
|
||
* ERROR EXIT POINT IF THE
|
||
* FILE WAS LOCKED
|
||
*
|
||
FILOCKED JMP FILELOCK
|
||
*
|
||
ORG $AC70
|
||
*
|
||
* WRITE FUNCTION HANDLER.
|
||
*
|
||
*
|
||
* MAKE SURE THE FILE IS NOT LOCKED
|
||
*
|
||
WRTHNDLR LDA FTYPE
|
||
BMI FILOCKED
|
||
*
|
||
* CHECK SUBCODE (< 5)
|
||
*
|
||
LDA SUBCODE
|
||
CMP #5
|
||
BCS RDHNDLR1
|
||
*
|
||
* USE SUBCODE AS INDEX INTO
|
||
* FMWSUB TABLE
|
||
*
|
||
ASL
|
||
TAX
|
||
LDA FMWSUB+1,X
|
||
PHA
|
||
LDA FMWSUB,X
|
||
PHA
|
||
RTS
|
||
*
|
||
ORG $AC87
|
||
*
|
||
* POSITION AND READ 1 BYTE HANDLER
|
||
*
|
||
* (POSITIONS AND DROPS THROUGH TO
|
||
* READ ONE BYTE)
|
||
*
|
||
POSRD1B JSR CALPOSN
|
||
*
|
||
* READ ONE BYTE ROUTINE
|
||
*
|
||
RD1BYTE JSR RDABYTE
|
||
STA DATABYTE
|
||
JMP NOERROR
|
||
*
|
||
ORG $AC93
|
||
*
|
||
* POSITION AND READ A RANGE OF
|
||
* BYTES
|
||
*
|
||
POSRDR JSR CALPOSN
|
||
*
|
||
* READ A RANGE OF BYTES
|
||
*
|
||
RDRANGE JSR DECRNG
|
||
JSR RDABYTE
|
||
PHA
|
||
JSR MOVRANG
|
||
LDY #0
|
||
PLA
|
||
STA (BUFADR),Y
|
||
JMP RDRANGE
|
||
*
|
||
ORG $ACA8
|
||
*
|
||
* RDABYTE READS A DATA BYTE FROM
|
||
* THE FILE, READING IN ADDITIONAL
|
||
* SECTORS AS NECESSARY.
|
||
*
|
||
RDABYTE JSR RDNXTDA
|
||
BCS RDABYTE1
|
||
LDA (BUFADR),Y
|
||
PHA
|
||
JSR INCREC
|
||
JSR INCPOS
|
||
PLA
|
||
RTS
|
||
RDABYTE1 JMP ENDATA
|
||
*
|
||
ORG $ACBB
|
||
*
|
||
* POSITION AND WRITE ONE BYTE
|
||
* HANDLER.
|
||
*
|
||
POSWRT1B JSR CALPOSN
|
||
*
|
||
*
|
||
* WRITE ONE BYTE HANDLER
|
||
*
|
||
WRT1BYTE LDA DATABYTE
|
||
JSR WRTBYTE
|
||
JMP NOERROR
|
||
*
|
||
ORG $ACC7
|
||
*
|
||
* POSITION AND WRITE RANGE
|
||
*
|
||
POSWRTR JSR CALPOSN
|
||
*
|
||
*
|
||
* WRITE A RANGE OF BYTES
|
||
*
|
||
WRTRANGE JSR MOVRANG
|
||
LDY #0
|
||
LDA (BUFADR),Y
|
||
JSR WRTBYTE
|
||
JSR DECRNG
|
||
JMP WRTRANGE
|
||
*
|
||
ORG $ACDA
|
||
*
|
||
* WRITE A SINGLE BYTE TO A FILE
|
||
*
|
||
WRTBYTE PHA
|
||
JSR RDNXTDA
|
||
PLA
|
||
STA (BUFADR),Y
|
||
LDA #$40
|
||
ORA FLAGS
|
||
STA FLAGS
|
||
JSR INCREC
|
||
JMP INCPOS
|
||
*
|
||
ORG $ACEF
|
||
*
|
||
* LOCK FUNCTION HANDLER
|
||
*
|
||
LCKHNDLR LDA #$80
|
||
STA ALLCFLG
|
||
BNE UNLKHDL1
|
||
*
|
||
ORG $ACF6
|
||
*
|
||
* UNLOCK FUNCTION HANDLER
|
||
*
|
||
UNLKHDL LDA #0
|
||
STA ALLCFLG
|
||
UNLKHDL1 JSR CMNOPN
|
||
LDX DIRINDX
|
||
LDA FILTYP,X
|
||
AND #$7F
|
||
ORA ALLCFLG
|
||
STA FILTYP,X
|
||
JSR WRTDIRSC
|
||
UNLKHDL2 JMP NOERROR
|
||
*
|
||
ORG $AD12
|
||
*
|
||
* POSITION FUNCTION HANDLER
|
||
*
|
||
POSHNDLR JSR CALPOSN
|
||
VFYHNDL2 JMP NOERROR
|
||
*
|
||
ORG $AD18
|
||
*
|
||
* VERIFY HANDLER
|
||
*
|
||
VFYHNDL JSR CMNOPN
|
||
*
|
||
* READ UNTIL EOF
|
||
*
|
||
VFYHNDL1 JSR RDNXTDA
|
||
BCS VFYHNDL2
|
||
INC FILEPOSN
|
||
BNE VFYHNDL1
|
||
INC FILEPOSN+1
|
||
JMP VFYHNDL1
|
||
*
|
||
ORG $AD2B
|
||
*
|
||
* DELETE HANDLER
|
||
*
|
||
DELHNDL JSR CMNOPN
|
||
*
|
||
* SEE IF THE FILE IS LOCKED
|
||
*
|
||
LDX DIRINDX
|
||
LDA FILTYP,X
|
||
BPL DELHNDL1
|
||
JMP FILELOCK
|
||
*
|
||
* IF THE FILE IS NOT LOCKED,
|
||
* COPY THE T/S LIST POINTER
|
||
* AND PUT $FF IN THE OLD
|
||
* T/S LIST POINTER SPOT
|
||
*
|
||
DELHNDL1 LDX DIRINDX
|
||
LDA TSTRACK,X
|
||
STA FTSTS
|
||
STA FILESIZE-1,X
|
||
LDA #$FF
|
||
STA TSTRACK,X
|
||
LDY TSSECTOR,X
|
||
STY FTSS
|
||
*
|
||
* WRITE DIRECTORY BACK TO DISK
|
||
*
|
||
JSR WRTDIRSC
|
||
*
|
||
* READ THE T/S LIST SECTORS AND
|
||
* UPDATE VTOC UNTIL THERE ARE
|
||
* NO MORE T/S SECTORS
|
||
*
|
||
CLC
|
||
RDNXTS JSR RDTSLST
|
||
BCS RDNXTS3
|
||
JSR SELTSBUF
|
||
LDY #$C
|
||
RDNXTS1 STY DIRINDX
|
||
LDA (BUFADR),Y
|
||
*
|
||
* IF TRACK NUMBER IS ZERO OR
|
||
* MINUS, SKIP IT
|
||
*
|
||
BMI RDNXTS2
|
||
BEQ RDNXTS2
|
||
*
|
||
* OTHERWISE UPDATE VTOC
|
||
*
|
||
PHA
|
||
INY
|
||
LDA (BUFADR),Y
|
||
TAY
|
||
PLA
|
||
JSR FREESCT
|
||
*
|
||
* GET NEXT T/S PAIR
|
||
*
|
||
RDNXTS2 LDY DIRINDX
|
||
INY
|
||
INY
|
||
BNE RDNXTS1
|
||
*
|
||
* IF AT END OF T/S SECTOR, FREE
|
||
* THE SECTOR IT USES AND TRY
|
||
* TO GET THE NEXT SECTOR
|
||
*
|
||
LDA CURTSTS
|
||
LDY CURTSS
|
||
JSR FREESCT
|
||
SEC
|
||
BCS RDNXTS
|
||
RDNXTS3 JSR WRTVTOC
|
||
JMP NOERROR
|
||
*
|
||
ORG $AD89
|
||
*
|
||
* FREESCT, DEALLOCATES A SECTOR
|
||
* IN THE TRACK BIT MAP
|
||
*
|
||
FREESCT SEC
|
||
JSR RRBITMP
|
||
LDA #0
|
||
LDX #5
|
||
FREESCT1 STA SCALAREA,X
|
||
DEX
|
||
BPL FREESCT1
|
||
RTS
|
||
*
|
||
ORG $AD98
|
||
*
|
||
*
|
||
* CATALOG HANDLER
|
||
*
|
||
CATHNDL JSR INITFMW
|
||
*
|
||
* ALLOW ANY VOLUME OF DISK
|
||
* ($FF COMPLIMENTED = VOL 0)
|
||
*
|
||
LDA #$FF
|
||
STA VOLNUMBR
|
||
*
|
||
* READ VTOC TO FIND OUT WHERE
|
||
* THE CATALOG IS
|
||
*
|
||
JSR RWVTOC
|
||
*
|
||
* SET UP COUNTER TO STOP EVERY 22
|
||
* LINES
|
||
*
|
||
LDA #$16
|
||
STA CNTR
|
||
*
|
||
*
|
||
* SKIP TWO LINES AND PRINT
|
||
* "DISK VOLUME"
|
||
*
|
||
JSR SKIPLN
|
||
JSR SKIPLN
|
||
LDX #$B
|
||
CATHNDL1 LDA DISKVOL,X
|
||
JSR COUT
|
||
DEX
|
||
BPL CATHNDL1
|
||
*
|
||
* PRINT THE VOLUME NUMBER
|
||
*
|
||
STX OPRND+1
|
||
LDA VOLFND
|
||
STA OPRND
|
||
JSR PRTDEC
|
||
JSR SKIPLN
|
||
JSR SKIPLN
|
||
*
|
||
*
|
||
* PRINT ALL THE DIRECTORY ENTRIES
|
||
*
|
||
CLC
|
||
RDNXTDIR JSR RDDIRSC
|
||
BCS DONEXT2
|
||
LDX #0
|
||
GTRKNUM STX DIRINDX
|
||
LDA TSTRACK,X
|
||
*
|
||
* IF TRACK BYTE IS ZERO, END OF
|
||
* DIRECTORY HAS BEEN REACHED,
|
||
* IF MINUS, FILE WAS DELETED AND
|
||
* SHOULD NOT BE LISTED.
|
||
*
|
||
BEQ DONEXT2
|
||
BMI DONEXT
|
||
*
|
||
* SEE IF THE FILE IS LOCKED
|
||
*
|
||
LDY #" "
|
||
LDA FILTYP,X
|
||
BPL GTRKNUM1
|
||
LDY #"*"
|
||
GTRKNUM1 TYA
|
||
JSR COUT
|
||
*
|
||
*
|
||
* OUTPUT FILE TYPE
|
||
*
|
||
LDA FILTYP,X
|
||
AND #$7F
|
||
LDY #7
|
||
ASL
|
||
GTRKNUM2 ASL
|
||
BCS GTRKNUM3
|
||
DEY
|
||
BNE GTRKNUM2
|
||
GTRKNUM3 LDA FTTBL,Y
|
||
JSR COUT
|
||
LDA #$A0
|
||
JSR COUT
|
||
*
|
||
* OUTPUT FILE SIZE
|
||
*
|
||
LDA FILESIZE,X
|
||
STA OPRND
|
||
LDA FILESIZE+1,X
|
||
STA OPRND+1
|
||
JSR PRTDEC
|
||
LDA #$A0
|
||
JSR COUT
|
||
INX
|
||
INX
|
||
INX
|
||
*
|
||
* OUTPUT FILE NAME
|
||
*
|
||
LDY #$1D
|
||
GTRKNUM4 LDA TSTRACK,X
|
||
JSR COUT
|
||
INX
|
||
DEY
|
||
BPL GTRKNUM4
|
||
JSR SKIPLN
|
||
*
|
||
* GET NEXT DIR ENTRY (READING A
|
||
* DIR SECTOR IF REQ'D)
|
||
*
|
||
DONEXT JSR NXTDIREN
|
||
BCC GTRKNUM
|
||
BCS RDNXTDIR
|
||
*
|
||
* DIR ALL DONE
|
||
*
|
||
DONEXT2 JMP NOERROR
|
||
*
|
||
* SKIPLN- PRINTS A <CR> AND
|
||
* CHECKS TO SEE IF THE CNTR
|
||
* HAS BECOME ZERO OR NOT
|
||
*
|
||
SKIPLN LDA #$8D
|
||
JSR COUT
|
||
DEC CNTR
|
||
BNE SKIPLN1
|
||
JSR RDCHAR
|
||
LDA #$15
|
||
STA CNTR
|
||
SKIPLN1 RTS
|
||
*
|
||
ORG $AE42
|
||
*
|
||
* PRTDEC- PRINTS (OPRAND,OPRAND+1)
|
||
* AS A DECIMAL INTEGER.
|
||
*
|
||
PRTDEC LDY #2
|
||
PRTDEC1 LDA #0
|
||
PHA
|
||
PRTDEC2 LDA OPRND
|
||
CMP DECTBL,Y
|
||
BCC PRTDEC3
|
||
SBC DECTBL,Y
|
||
STA OPRND
|
||
LDA OPRND+1
|
||
SBC #0
|
||
STA OPRND+1
|
||
PLA
|
||
ADC #0
|
||
PHA
|
||
JMP PRTDEC2
|
||
PRTDEC3 PLA
|
||
ORA #$B0
|
||
JSR COUT
|
||
DEY
|
||
BPL PRTDEC1
|
||
RTS
|
||
*
|
||
ORG $AE6A
|
||
*
|
||
* LOAD FILE MANAGER WORK AREA
|
||
* FROM THE FILE BUFFER.
|
||
*
|
||
LDFMW JSR SELBUF
|
||
LDY #0
|
||
STY RTNCODE
|
||
LDFMW1 LDA (BUFADR),Y
|
||
STA FTSTS,Y
|
||
INY
|
||
CPY #$2D
|
||
BNE LDFMW1
|
||
CLC
|
||
RTS
|
||
*
|
||
ORG $AE7E
|
||
*
|
||
* SAVE FILE MANAGER WORK AREA INTO
|
||
* FILE BUFFER
|
||
*
|
||
SAVFMW JSR SELBUF
|
||
LDY #0
|
||
SAVFMW1 LDA FTSTS,Y
|
||
STA (BUFADR),Y
|
||
INY
|
||
CPY #$2D
|
||
BNE SAVFMW1
|
||
RTS
|
||
*
|
||
ORG $AE8E
|
||
*
|
||
* INIT FUNCTION HANDLER.
|
||
*
|
||
INITHDL JSR INITFMW
|
||
LDA #4
|
||
*
|
||
*
|
||
* INIT VTOC INFO
|
||
*
|
||
JSR STCMDCD
|
||
*
|
||
* Volume # must be complimented.
|
||
*
|
||
LDA VOLNUMBR
|
||
EOR #$FF
|
||
STA DSKVOL
|
||
*
|
||
* Set up next track to allocate
|
||
* at track 17.
|
||
*
|
||
LDA #$11
|
||
STA NXTTOALC
|
||
*
|
||
* Allocate sectors in positive
|
||
* direction (from $11 up).
|
||
*
|
||
LDA #$1
|
||
STA ALLCDIR
|
||
*
|
||
* Mark the "possible" 56 tracks
|
||
* as all being used.
|
||
*
|
||
LDX #$38
|
||
LDA #0
|
||
INITHDL1 STA VTOCSB,X
|
||
INX
|
||
BNE INITHDL1
|
||
*
|
||
* Mark the Apple's 35 tracks as
|
||
* unused.
|
||
*
|
||
* Track 0 is not marked as unused
|
||
*
|
||
*
|
||
LDX #$C
|
||
INITHDL2 CPX #$8C
|
||
BEQ INITHDL4
|
||
LDY #3
|
||
INITHDL3 LDA FREEMASK,Y
|
||
STA BITMAP,X
|
||
INX
|
||
DEY
|
||
BPL INITHDL3
|
||
CPX #$44
|
||
BNE INITHDL2
|
||
LDX #$48
|
||
BNE INITHDL2
|
||
INITHDL4 JSR WRTVTOC
|
||
*
|
||
* INIT DIRECTORY INFO
|
||
*
|
||
LDX #0
|
||
TXA
|
||
INITHDL5 STA DIRSECBF,X
|
||
INX
|
||
BNE INITHDL5
|
||
JSR PRWTSDIR
|
||
*
|
||
* Set up for directory track
|
||
*
|
||
LDA #$11
|
||
*
|
||
* Set up for dir sector.
|
||
*
|
||
LDY NUMSCTRS
|
||
DEY
|
||
DEY
|
||
STA TNUM
|
||
*
|
||
* Write directory sectors out to
|
||
* disk.
|
||
*
|
||
INITHDL6 STA TSNXTDIR
|
||
INITHDL7 STY TSNXTDIR+1
|
||
INY
|
||
STY SNUM
|
||
LDA #2
|
||
JSR STCMDCD
|
||
LDY TSNXTDIR+1
|
||
DEY
|
||
BMI INITHDL8
|
||
BNE INITHDL7
|
||
TYA
|
||
BEQ INITHDL6
|
||
INITHDL8 JSR RWTSPRMS
|
||
*
|
||
* WRITE DOS OUT TO DISK
|
||
*
|
||
JSR PUTDOS
|
||
JMP NOERROR
|
||
*
|
||
ORG $AF08
|
||
*
|
||
* SELECT A BUFFER,
|
||
*
|
||
* FILE MANAGER WORK BUFFER
|
||
*
|
||
SELBUF LDX #0
|
||
BEQ SELDABUF1
|
||
*
|
||
* SELECT T/S LIST BUFFER
|
||
*
|
||
SELTSBUF LDX #2
|
||
BNE SELDABUF1
|
||
*
|
||
*
|
||
* SELECT DATA BUFFER
|
||
*
|
||
SLDABUF LDX #4
|
||
SELDABUF1 LDA WBADR,X
|
||
STA BUFADR
|
||
LDA WBADR+1,X
|
||
STA BUFADR+1
|
||
RTS
|
||
*
|
||
ORG $AF1D
|
||
*
|
||
* CHECK DATA BUFFER TO SEE IF IT
|
||
* NEEDS TO BE WRITTEN TO DISK
|
||
*
|
||
CHKBUF BIT FLAGS
|
||
BVS CHKBUF1
|
||
RTS
|
||
CHKBUF1 JSR PREPDATA
|
||
LDA #2
|
||
JSR RWTSDRVR
|
||
LDA #$BF
|
||
AND FLAGS
|
||
STA FLAGS
|
||
RTS
|
||
*
|
||
ORG $AF34
|
||
*
|
||
* CHECK T/S LIST BUFFER TO SEE
|
||
* IF IT MUST BE WRITTEN TO DISK
|
||
*
|
||
CHKTS LDA FLAGS
|
||
BMI SETUPRW
|
||
RTS
|
||
SETUPRW JSR PREPRWTS
|
||
LDA #2
|
||
JSR RWTSDRVR
|
||
LDA #$7F
|
||
AND FLAGS
|
||
STA FLAGS
|
||
RTS
|
||
*
|
||
ORG $AF4B
|
||
*
|
||
* SET UP IOB FOR RWTS CALL
|
||
*
|
||
PREPRWTS LDA TSLSTADR
|
||
STA USRBUF
|
||
LDA TSLSTADR+1
|
||
STA USRBUF+1
|
||
LDX CURTSTS
|
||
LDY CURTSS
|
||
RTS
|
||
*
|
||
ORG $AF5E
|
||
*
|
||
* READ A T/S LIST INTO THE FILE
|
||
* BUFFER.
|
||
*
|
||
* ON ENTRY C=0 IF FIRST T/S SECTOR
|
||
* IS DESIRED, C=1 IF THE NEXT
|
||
* T/S SECTOR IS DESIRED.
|
||
*
|
||
RDTSLST PHP
|
||
*
|
||
* First, check to see if the
|
||
* current T/S list must be
|
||
* written to disk.
|
||
*
|
||
JSR CHKTS
|
||
JSR PREPRWTS
|
||
JSR SELTSBUF
|
||
PLP
|
||
BCS RDTSLST1
|
||
*
|
||
* If the carry flag is cleared,
|
||
* read the first sector of the
|
||
* T/S list.
|
||
*
|
||
LDX FTSTS
|
||
LDY FTSS
|
||
JMP OLDRWTS
|
||
*
|
||
* If the carry flag was set read
|
||
* in the next sector of the
|
||
* T/S list.
|
||
*
|
||
RDTSLST1 LDY #$1
|
||
*
|
||
* If the track number of the next
|
||
* sector is zero, there isn't
|
||
* another T/S sector available.
|
||
*
|
||
LDA (BUFADR),Y
|
||
BEQ RDTSLST2
|
||
*
|
||
* If there is another T/S list
|
||
* available read it in.
|
||
*
|
||
TAX
|
||
INY
|
||
LDA (BUFADR),Y
|
||
TAY
|
||
JMP OLDRWTS
|
||
*
|
||
* If the File Manager Opcode is
|
||
* isn't write, exit with error
|
||
* status passed in carry.
|
||
*
|
||
RDTSLST2 LDA FMOPCOD
|
||
CMP #4
|
||
BEQ RDTSLST3
|
||
SEC
|
||
RTS
|
||
*
|
||
* If writing to disk, simply
|
||
* allocate another sector for
|
||
* the T/S list and continue.
|
||
*
|
||
RDTSLST3 JSR ALLOCSEC
|
||
LDY #2
|
||
STA (BUFADR),Y
|
||
PHA
|
||
DEY
|
||
LDA SCALAREA+1
|
||
STA (BUFADR),Y
|
||
PHA
|
||
JSR SETUPRW
|
||
JSR ZEROBUF
|
||
LDY #5
|
||
LDA RELSLAST
|
||
STA (BUFADR),Y
|
||
INY
|
||
LDA RELSLAST+1
|
||
STA (BUFADR),Y
|
||
PLA
|
||
TAX
|
||
PLA
|
||
TAY
|
||
LDA #2
|
||
BNE OLDRWTS1
|
||
*
|
||
* If Acc=1, read old T/S list.
|
||
* If Acc=2, write new sector for
|
||
* T/S list.
|
||
*
|
||
OLDRWTS LDA #$1
|
||
OLDRWTS1 STX CURTSTS
|
||
STY CURTSS
|
||
JSR RWTSDRVR
|
||
*
|
||
* Compute relative sector number
|
||
* of the last sector represented
|
||
* in this T/S list and store
|
||
* in workarea.
|
||
*
|
||
LDY #5
|
||
LDA (BUFADR),Y
|
||
STA RELSFRST
|
||
CLC
|
||
ADC SECPERTS
|
||
STA RELSLAST
|
||
INY
|
||
LDA (BUFADR),Y
|
||
STA RELSFRST+1
|
||
ADC SECPERTS+1
|
||
STA RELSLAST+1
|
||
CLC
|
||
RTS
|
||
*
|
||
ORG $AFDC
|
||
*
|
||
* READ A DATA SECTOR
|
||
*
|
||
RDDASEC JSR PREPDATA
|
||
LDA #$1
|
||
JMP RWTSDRVR
|
||
*
|
||
* PREP RWTS' IOB FOR READING
|
||
* A DATA SECTOR.
|
||
*
|
||
PREPDATA LDY DATASADR
|
||
LDA DATASADR+1
|
||
STY USRBUF
|
||
STA USRBUF+1
|
||
LDX CURDATS
|
||
LDY CURDAS
|
||
RTS
|
||
*
|
||
ORG $AFF7
|
||
*
|
||
* READ OR WRITE THE VTOC
|
||
*
|
||
RWVTOC LDA #$1
|
||
BNE WRTVTOC1
|
||
WRTVTOC LDA #2
|
||
WRTVTOC1 LDY VTOCPADR
|
||
STY USRBUF
|
||
LDY VTOCPADR+1
|
||
STY USRBUF+1
|
||
LDX TRKNUMBR
|
||
LDY #0
|
||
JMP RWTSDRVR
|
||
*
|
||
ORG $B011
|
||
*
|
||
* READ A DIRECTORY SECTOR
|
||
*
|
||
* If C=0 read first dir sector.
|
||
* If C=1 read next dir sector.
|
||
*
|
||
*
|
||
RDDIRSC PHP
|
||
JSR PRWTSDIR
|
||
PLP
|
||
BCS RDDIRSC1
|
||
*
|
||
* Read first directory sector here
|
||
*
|
||
LDY FRSTTS+1
|
||
LDX FRSTTS
|
||
BNE RDDIRSC3
|
||
RDDIRSC1 LDX TSNXTDIR
|
||
BNE RDDIRSC2
|
||
*
|
||
*
|
||
* If there are no more dir
|
||
* sectors, exit with error flag
|
||
* (carry) set.
|
||
*
|
||
SEC
|
||
RTS
|
||
*
|
||
* Read next dir sector in chain
|
||
* here.
|
||
*
|
||
RDDIRSC2 LDY TSNXTDIR+1
|
||
RDDIRSC3 STX DIRTS
|
||
STY DIRTS+1
|
||
LDA #$1
|
||
JSR RWTSDRVR
|
||
CLC
|
||
RTS
|
||
*
|
||
ORG $B037
|
||
*
|
||
* WRITE A DIRECTORY SECTOR
|
||
*
|
||
WRTDIRSC JSR PRWTSDIR
|
||
LDX DIRTS
|
||
LDY DIRTS+1
|
||
LDA #2
|
||
JMP RWTSDRVR
|
||
*
|
||
*
|
||
* PREP RWTS FOR DIRECTORY READ/WRT
|
||
*
|
||
PRWTSDIR LDA DIRPADR
|
||
STA USRBUF
|
||
LDA DIRPADR+1
|
||
STA USRBUF+1
|
||
RTS
|
||
*
|
||
ORG $B052
|
||
*
|
||
* RWTS DRIVER, FINISHES UP THE IOB
|
||
* AND CALLS THE RWTS ROUTINE
|
||
*
|
||
RWTSDRVR STX TNUM
|
||
STY SNUM
|
||
STCMDCD STA CMDCODE
|
||
CMP #2
|
||
BNE STCMDCD1
|
||
*
|
||
* If writing to disk, note this
|
||
* in "FLAGS".
|
||
*
|
||
ORA FLAGS
|
||
STA FLAGS
|
||
*
|
||
* Compliment the volume number
|
||
*
|
||
STCMDCD1 LDA VOLNUMBR
|
||
EOR #$FF
|
||
STA VOLEXPT
|
||
*
|
||
* Init such niceties as slot,
|
||
* drive, sector, etc.
|
||
*
|
||
LDA SLOT16
|
||
STA SNUM16
|
||
LDA DRVNUMBR
|
||
STA DNUM
|
||
LDA SECTLEN
|
||
STA BYTCNT
|
||
LDA SECTLEN+1
|
||
STA BYTCNT+1
|
||
LDA #$1
|
||
STA TBLTYPE
|
||
*
|
||
* Call the RWTS subroutine
|
||
*
|
||
LDY RWTSPADR
|
||
LDA RWTSPADR+1
|
||
JSR CLLRWTS
|
||
*
|
||
* Fiddle with the volume numbers
|
||
* before checking for an error
|
||
*
|
||
*
|
||
LDA VOLFND
|
||
STA VOLVAL
|
||
LDA #$FF
|
||
STA VOLEXPT
|
||
*
|
||
* If no error, quit
|
||
*
|
||
BCS STCMDCD2
|
||
RTS
|
||
*
|
||
ORG $B0A1
|
||
*
|
||
* Convert RWTS error # to an
|
||
* error number usable by the
|
||
* file manager.
|
||
*
|
||
STCMDCD2 LDA ERRRCODE
|
||
LDY #7
|
||
CMP #$20
|
||
BEQ STCMDCD3
|
||
LDY #4
|
||
CMP #$10
|
||
BEQ STCMDCD3
|
||
LDY #8
|
||
STCMDCD3 TYA
|
||
JMP SETERRR
|
||
*
|
||
ORG $B0B6
|
||
*
|
||
* READ NEXT DATA SECTOR IF REQ'D
|
||
*
|
||
*
|
||
* Check to see if the current file
|
||
* position is in the current data
|
||
* sector buffered up in memory.
|
||
*
|
||
RDNXTDA LDA FILEPOSN
|
||
CMP RELSLRD
|
||
BNE RDNXTDA1
|
||
LDA FILEPOSN+1
|
||
CMP RELSLRD+1
|
||
BEQ SLDBUF2
|
||
*
|
||
* If not, see if the current
|
||
* sector needs to be written to
|
||
* disk.
|
||
*
|
||
RDNXTDA1 JSR CHKBUF
|
||
*
|
||
*
|
||
* Is the desired file position
|
||
* within the range of sectors
|
||
* represented by the T/S list
|
||
* currently buffered in memory?
|
||
*
|
||
RDNXTDA2 LDA FILEPOSN+1
|
||
CMP RELSFRST+1
|
||
BCC RDNXTDA4 ;go if <
|
||
BNE RDNXTDA3 ;go if >
|
||
LDA FILEPOSN
|
||
CMP RELSFRST
|
||
BCC RDNXTDA4
|
||
*
|
||
RDNXTDA3 LDA FILEPOSN+1
|
||
CMP RELSLAST+1
|
||
BCC FNDTS
|
||
BNE RDNXTDA4
|
||
LDA FILEPOSN
|
||
CMP RELSLAST
|
||
BCC FNDTS
|
||
*
|
||
* Read in new T/S list, Carry is
|
||
* set or cleared from CMP's above.
|
||
*
|
||
*
|
||
RDNXTDA4 JSR RDTSLST
|
||
BCC RDNXTDA2
|
||
RTS
|
||
*
|
||
ORG $B0F3
|
||
*
|
||
* DATA WAS FOUND IN CURRENT T/S
|
||
* LIST, GET ENTRY IN THIS T/S LIST
|
||
*
|
||
FNDTS SEC
|
||
LDA FILEPOSN
|
||
SBC RELSFRST
|
||
ASL
|
||
ADC #$C
|
||
TAY
|
||
JSR SELTSBUF
|
||
LDA (BUFADR),Y
|
||
BNE READOLD
|
||
LDA FMOPCOD
|
||
CMP #4
|
||
BEQ FNDTS1
|
||
SEC
|
||
RTS
|
||
FNDTS1 JSR ADDATA
|
||
JMP SAVSECNM
|
||
*
|
||
ORG $B114
|
||
*
|
||
* READ EXISTING DATA USING CURRENT
|
||
* T/S LIST
|
||
*
|
||
READOLD STA CURDATS
|
||
INY
|
||
LDA (BUFADR),Y
|
||
STA CURDAS
|
||
JSR RDDASEC
|
||
*
|
||
* SAVE SECTOR NUMBER OF SECTOR
|
||
* LAST READ IN THE WORKAREA
|
||
*
|
||
SAVSECNM LDA FILEPOSN
|
||
STA RELSLRD
|
||
LDA FILEPOSN+1
|
||
STA RELSLRD+1
|
||
*
|
||
*
|
||
* SELECT DATA BUFFER
|
||
*
|
||
SLDBUF2 JSR SLDABUF
|
||
LDY FILEPOSN+2
|
||
CLC
|
||
RTS
|
||
*
|
||
ORG $B134
|
||
*
|
||
* ADD A NEW DATA SECTOR TO THE
|
||
* FILE
|
||
*
|
||
ADDATA STY CNTR
|
||
*
|
||
* Allocate a sector for the data.
|
||
*
|
||
JSR ALLOCSEC
|
||
*
|
||
* Put T/S numbers into T/S list.
|
||
*
|
||
LDY CNTR
|
||
INY
|
||
STA (BUFADR),Y
|
||
STA CURDAS
|
||
DEY
|
||
LDA SCALAREA+1
|
||
STA (BUFADR),Y
|
||
STA CURDATS
|
||
*
|
||
* Select data buffer and zero it
|
||
* out.
|
||
*
|
||
JSR SLDABUF
|
||
JSR ZEROBUF
|
||
*
|
||
* set up flags noting that the
|
||
* current data and T/S sectors
|
||
* must be written to disk.
|
||
*
|
||
LDA #$C0
|
||
ORA FLAGS
|
||
STA FLAGS
|
||
RTS
|
||
*
|
||
ORG $B15B
|
||
*
|
||
*
|
||
* VARIOUS UTILITIES USED ALL OVER
|
||
* THE PLACE
|
||
*
|
||
*
|
||
* INCREMENT RECORD NUMBER AND
|
||
* BYTE OFFSET INTO THE FILE
|
||
*
|
||
INCREC LDX RECNUMBR
|
||
STX RECNUM
|
||
LDX RECNUMBR+1
|
||
STX RECNUM+1
|
||
LDX BYTEOFFS
|
||
LDY BYTEOFFS+1
|
||
STX VOLVAL
|
||
STY DRVVAL
|
||
INX
|
||
BNE INCREC1
|
||
INY
|
||
INCREC1 CPY OPNRCLEN+1
|
||
BNE INCREC2
|
||
CPX OPNRCLEN
|
||
BNE INCREC2
|
||
LDX #0
|
||
LDY #0
|
||
INC RECNUMBR
|
||
BNE INCREC2
|
||
INC RECNUMBR+1
|
||
INCREC2 STX BYTEOFFS
|
||
STY BYTEOFFS+1
|
||
RTS
|
||
*
|
||
ORG $B194
|
||
*
|
||
* INCREMENT FILE POSITION
|
||
* OFFSET
|
||
*
|
||
INCPOS INC FILEPOSN+2
|
||
BNE INCPOS1
|
||
INC FILEPOSN
|
||
BNE INCPOS1
|
||
INC FILEPOSN+1
|
||
INCPOS1 RTS
|
||
*
|
||
ORG $B1A2
|
||
*
|
||
* COPY AND ADVANCE RANGE ADDRESS
|
||
*
|
||
MOVRANG LDY DATABYTE
|
||
LDX DATABYTE+1
|
||
STY BUFADR
|
||
STX BUFADR+1
|
||
INC DATABYTE
|
||
BNE MOVRANG1
|
||
INC DATABYTE+1
|
||
MOVRANG1 RTS
|
||
*
|
||
ORG $B1B5
|
||
*
|
||
* DECREMENT RANGE ADDRESS
|
||
*
|
||
DECRNG LDY SLOTVAL
|
||
BNE DECRNG1
|
||
LDX FILETYPE
|
||
BEQ DECRNG2
|
||
DEC FILETYPE
|
||
DECRNG1 DEC SLOTVAL
|
||
RTS
|
||
DECRNG2 JMP NOERROR
|
||
*
|
||
ORG $B1C9
|
||
*
|
||
* LOCATE A DIRECTORY ENTRY.
|
||
* LOOKS UP A FILENAME IN THE
|
||
* DIRECTORY.
|
||
*
|
||
*
|
||
* Read VTOC to get track and
|
||
* sector number of first dir
|
||
* sector.
|
||
*
|
||
LCDIRENT JSR RWVTOC
|
||
LDA FNADR
|
||
STA BUFADR
|
||
LDA FNADR+1
|
||
STA BUFADR+1
|
||
*
|
||
* Set up for two passes through
|
||
* the directory.
|
||
*
|
||
LDA #$1
|
||
INITDIR STA CNTR
|
||
*
|
||
* Set up index into VTOC for
|
||
* the dir track.
|
||
*
|
||
LDA #0
|
||
STA DIRSECIX
|
||
CLC
|
||
*
|
||
* Read in the current dir sector.
|
||
*
|
||
INCSECOF INC DIRSECIX
|
||
JSR RDDIRSC
|
||
BCS PASS2
|
||
*
|
||
* Check for end of dir (if first
|
||
* byte is zero) or a deleted
|
||
* file (if minus, really should
|
||
* be $FF).
|
||
*
|
||
LDX #0
|
||
GETRACK STX DIRINDX
|
||
LDA TSTRACK,X
|
||
BEQ DOPASS2
|
||
BMI CHKPASS
|
||
LDY #0
|
||
INX
|
||
INX
|
||
*
|
||
* Compare the filename against
|
||
* the current dir entry.
|
||
*
|
||
GETRACK1 INX
|
||
LDA (BUFADR),Y
|
||
CMP TSTRACK,X
|
||
BNE GETRACK2
|
||
INY
|
||
CPY #$1E
|
||
BNE GETRACK1
|
||
*
|
||
* If found, return with index
|
||
* into sector in the X register
|
||
* and the carry flag cleared.
|
||
*
|
||
LDX DIRINDX
|
||
CLC
|
||
RTS
|
||
*
|
||
ORG $B20B
|
||
*
|
||
* If filename doesn't match
|
||
* current entry, on to the next 1.
|
||
*
|
||
GETRACK2 JSR NXTDIREN
|
||
BCC GETRACK
|
||
BCS INCSECOF
|
||
DOPASS2 LDY CNTR
|
||
BNE INITDIR
|
||
CHKPASS LDY CNTR
|
||
BNE GETRACK2
|
||
*
|
||
ORG $B21C
|
||
*
|
||
* COPY FILE NAME TO DIRECTORY
|
||
* ENTRY.
|
||
*
|
||
COPFNAM LDY #0
|
||
INX
|
||
INX
|
||
COPFNAM1 INX
|
||
LDA (BUFADR),Y
|
||
STA TSTRACK,X
|
||
INY
|
||
CPY #$1E
|
||
BNE COPFNAM1
|
||
LDX DIRINDX
|
||
SEC
|
||
RTS
|
||
*
|
||
ORG $B230
|
||
*
|
||
* MOVE ON TO THE NEXT DIRECTORY
|
||
* ENTRY.
|
||
*
|
||
NXTDIREN CLC
|
||
LDA DIRINDX
|
||
ADC #$23
|
||
TAX
|
||
CPX #$F5
|
||
RTS
|
||
PASS2 LDA #0
|
||
LDY CNTR
|
||
BNE INITDIR
|
||
JMP DSKFULL
|
||
*
|
||
ORG $B244
|
||
*
|
||
* ALLOCATE A DISK SECTOR.
|
||
*
|
||
* This routine finds a track in
|
||
* the track bit map stored in
|
||
* memory that has some empty
|
||
* sectors left.
|
||
* ALLOCSEC then allocates the
|
||
* rest of those sectors and
|
||
* gives them to the requesting
|
||
* file.
|
||
*
|
||
*
|
||
* First, see if there is a
|
||
* track already allocated to this
|
||
* file.
|
||
*
|
||
ALLOCSEC LDA SCALAREA+1
|
||
BEQ NOTRKAVL
|
||
*
|
||
* If so, decrement sector count
|
||
* to find the next possible
|
||
* sector #.
|
||
*
|
||
TSTNXT DEC SCALAREA
|
||
BMI NOSECAVL
|
||
*
|
||
* If a valid sector, rotate the
|
||
* bit map to see if it is free.
|
||
*
|
||
CLC
|
||
LDX #4
|
||
TSTNXT1 ROL SCALAREA+1,X
|
||
DEX
|
||
BNE TSTNXT1
|
||
*
|
||
* If not free, repeat for next
|
||
* sector.
|
||
*
|
||
BCC TSTNXT
|
||
*
|
||
* If free, allocate and increment
|
||
* file size by one.
|
||
*
|
||
INC SECCNT
|
||
BNE TSTNXT2
|
||
INC SECCNT+1
|
||
TSTNXT2 LDA SCALAREA
|
||
RTS
|
||
*
|
||
ORG $B265
|
||
*
|
||
* Indicate that a track is not
|
||
* currently allocated.
|
||
*
|
||
NOSECAVL LDA #0
|
||
STA SCALAREA+1
|
||
*
|
||
* Reset allocation flag to
|
||
* allow a complete scan of the
|
||
* bit map for available sectors.
|
||
*
|
||
NOTRKAVL LDA #0
|
||
STA ALLCFLG
|
||
JSR RWVTOC
|
||
*
|
||
* Add allocation director to
|
||
* NXTTOALLC and see if we are
|
||
* at track zero, or past
|
||
* track 34.
|
||
*
|
||
ADDIRCTN CLC
|
||
LDA NXTTOALC
|
||
ADC ALLCDIR
|
||
BEQ SCNDTIME
|
||
CMP NUMTRKS
|
||
BCC ADIRTRK1
|
||
*
|
||
* If past track 34, set allocation
|
||
* direction to -1.
|
||
*
|
||
LDA #$FF
|
||
BNE ADIRTRK
|
||
SCNDTIME LDA ALLCFLG
|
||
BNE DODSKFUL
|
||
LDA #$1
|
||
STA ALLCFLG
|
||
*
|
||
* Start at the dir track and
|
||
* work backwards.
|
||
*
|
||
ADIRTRK STA ALLCDIR
|
||
CLC
|
||
ADC #$11
|
||
ADIRTRK1 STA NXTTOALC
|
||
STA SCALAREA+1
|
||
TAY
|
||
ASL
|
||
ASL
|
||
TAY
|
||
LDX #4
|
||
CLC
|
||
ADIRTRK2 LDA BTMPEND,Y
|
||
STA SCALAREA+1,X
|
||
BEQ ADIRTRK3
|
||
SEC
|
||
LDA #0
|
||
STA BTMPEND,Y
|
||
ADIRTRK3 DEY
|
||
DEX
|
||
BNE ADIRTRK2
|
||
BCC ADDIRCTN
|
||
*
|
||
* Allocated an entire track,
|
||
* write out the VTOC so other
|
||
* files don't use 'em
|
||
*
|
||
JSR WRTVTOC
|
||
LDA NUMSCTRS
|
||
STA SCALAREA
|
||
BNE TSTNXT
|
||
DODSKFUL JMP DSKFULL
|
||
*
|
||
ORG $B2C3
|
||
*
|
||
* RELEASE ANY ALLOCATED SECTORS
|
||
* THAT WERE NOT USED.
|
||
*
|
||
RLSALLC LDA SCALAREA+1
|
||
BNE RLSALLC1
|
||
RTS
|
||
RLSALLC1 PHA
|
||
JSR RWVTOC
|
||
LDY SCALAREA
|
||
PLA
|
||
CLC
|
||
JSR RRBITMP
|
||
LDA #0
|
||
STA SCALAREA+1
|
||
JMP WRTVTOC
|
||
*
|
||
ORG $B2DD
|
||
*
|
||
* ROTATE THE BIT MAP RIGHT ONE
|
||
* BIT.
|
||
* THIS CHECKS FOR AVAILABLE SECS
|
||
*
|
||
RRBITMP LDX #$FC
|
||
RRBITMP1 ROR TMPBITMP,X
|
||
INX
|
||
BNE RRBITMP1
|
||
INY
|
||
CPY NUMSCTRS
|
||
BNE RRBITMP
|
||
ASL
|
||
ASL
|
||
TAY
|
||
BEQ RRBITMP3
|
||
LDX #4
|
||
RRBITMP2 LDA SCALAREA+1,X
|
||
ORA BTMPEND,Y
|
||
STA BTMPEND,Y
|
||
DEY
|
||
DEX
|
||
BNE RRBITMP2
|
||
RRBITMP3 RTS
|
||
*
|
||
ORG $B300
|
||
*
|
||
* CALCULATE FILE POSITION.
|
||
*
|
||
* GIVEN A RECORD NUMBER, A FILE
|
||
* LENGTH, AND A BYTE OFFSET THIS
|
||
* ROUTINE CALCULATES THE OFFSET
|
||
* INTO THE FILE TO FIND THE
|
||
* DESIRED RECORD.
|
||
*
|
||
CALPOSN LDA RECNUM
|
||
STA FILEPOSN+2
|
||
STA RECNUMBR
|
||
LDA RECNUM+1
|
||
STA FILEPOSN
|
||
STA RECNUMBR+1
|
||
LDA #0
|
||
STA FILEPOSN+1
|
||
LDY #$10
|
||
CALPOSN1 TAX
|
||
LDA FILEPOSN+2
|
||
LSR
|
||
BCS CALPOSN2
|
||
TXA
|
||
BCC CALPOSN3
|
||
CALPOSN2 CLC
|
||
LDA FILEPOSN+1
|
||
ADC OPNRCLEN
|
||
STA FILEPOSN+1
|
||
TXA
|
||
ADC OPNRCLEN+1
|
||
CALPOSN3 ROR
|
||
ROR FILEPOSN+1
|
||
ROR FILEPOSN
|
||
ROR FILEPOSN+2
|
||
DEY
|
||
BNE CALPOSN1
|
||
LDA VOLVAL
|
||
STA BYTEOFFS
|
||
ADC FILEPOSN+2
|
||
STA FILEPOSN+2
|
||
LDA DRVVAL
|
||
STA BYTEOFFS+1
|
||
ADC FILEPOSN
|
||
STA FILEPOSN
|
||
LDA #0
|
||
ADC FILEPOSN+1
|
||
STA FILEPOSN+1
|
||
RTS
|
||
*
|
||
ORG $B35F
|
||
*
|
||
* MULTIPLY CALLED ERROR MESSAGES
|
||
*
|
||
LNOTAVL LDA #$1
|
||
BNE SETERRR
|
||
RANGERR LDA #2
|
||
BNE SETERRR
|
||
RANGERR2 LDA #3
|
||
BNE SETERRR
|
||
LDA #4
|
||
BNE SETERRR
|
||
ENDATA LDA #5
|
||
BNE SETERRR
|
||
FNOTFND LDA #6
|
||
BNE SETERRR
|
||
DSKFULL JMP DISKFULL
|
||
NOP
|
||
FILELOCK LDA #$A
|
||
BNE SETERRR
|
||
NOERROR LDA RTNCODE
|
||
CLC
|
||
BCC SETERRR1
|
||
*
|
||
ORG $B385
|
||
*
|
||
* STANDARD ERROR ENTRY POINT
|
||
*
|
||
SETERRR SEC
|
||
SETERRR1 PHP
|
||
STA RTNCODE
|
||
LDA #0
|
||
STA IOBADR
|
||
JSR SAVFMW
|
||
PLP
|
||
LDX STKSAVE
|
||
TXS
|
||
RTS
|
||
*
|
||
ORG $B397
|
||
*
|
||
* VARIABLES ETC.
|
||
*
|
||
DIRTS DS 2
|
||
DS 2
|
||
STKSAVE DS 1
|
||
DIRINDX DS 1
|
||
CNTR DS 1
|
||
ALLCFLG DS 2
|
||
FREEMASK DS 4
|
||
DECTBL HEX 010A64
|
||
FTTBL ASC "TIABSRAB"
|
||
DISKVOL ASC " EMULOV KSID"
|
||
VTOCSB DS 1
|
||
FRSTTS DS 2
|
||
DOSRLS HEX 03
|
||
DS 2
|
||
DSKVOL DS $21
|
||
NUMTSENT DS 9
|
||
NXTTOALC DS 1
|
||
ALLCDIR DS 3
|
||
NUMTRKS DS 1
|
||
NUMSCTRS DS 3
|
||
BITMAP DS 3
|
||
BTMPEND DS $C5
|
||
DIRSECBF DS 1
|
||
TSNXTDIR DS 10
|
||
TSTRACK DS 1
|
||
TSSECTOR DS 1
|
||
FILTYP DS $1F
|
||
FILESIZE DS $F
|
||
TMPBITMP DS $AE
|
||
PTCHSAV DS $17
|
||
*
|
||
*
|
||
*
|
||
FMOPCOD DS 1
|
||
SUBCODE DS 1
|
||
RECNUM DS 2
|
||
VOLVAL DS 1
|
||
DRVVAL DS 1
|
||
SLOTVAL DS 1
|
||
FILETYPE DS 1
|
||
DATABYTE = *
|
||
FNADR DS 2
|
||
RTNCODE DS 2
|
||
WBADR DS 2
|
||
TSLSTADR DS 2
|
||
DATASADR DS 2
|
||
DS 4
|
||
FTSTS DS 1
|
||
FTSS DS 1
|
||
CURTSTS DS 1
|
||
CURTSS DS 1
|
||
FLAGS DS 1
|
||
CURDATS DS 1
|
||
CURDAS DS 1
|
||
DIRSECIX DS 2
|
||
SECPERTS DS 2
|
||
RELSFRST DS 2
|
||
RELSLAST DS 2
|
||
RELSLRD DS 2
|
||
SECTLEN DS 2
|
||
FILEPOSN DS 3
|
||
DS 1
|
||
OPNRCLEN DS 2
|
||
RECNUMBR DS 2
|
||
BYTEOFFS DS 2
|
||
SECCNT DS 2
|
||
SCALAREA DS 1
|
||
DS 5
|
||
FTYPE DS 1
|
||
SLOT16 DS 1
|
||
DRVNUMBR DS 1
|
||
VOLNUMBR DS 1
|
||
TRKNUMBR DS 6
|
||
*
|
||
ORG $800
|
||
*
|
||
* START OF 2ND STAGE BOOTSTRAP
|
||
*
|
||
BOOT HEX 01
|
||
LDA SCRATCH
|
||
CMP #9
|
||
BNE BOOT1
|
||
LDA BOOTSLOT
|
||
LSR
|
||
LSR
|
||
LSR
|
||
LSR
|
||
ORA #$C0
|
||
STA ROMRWTS+1
|
||
LDA #$5C
|
||
STA ROMRWTS
|
||
CLC
|
||
LDA FRSTPAG
|
||
ADC NUMSECS
|
||
STA FRSTPAG
|
||
BOOT1 LDX NUMSECS
|
||
BMI BOOT2
|
||
LDA SECTABL,X
|
||
STA SECNUM
|
||
DEC NUMSECS
|
||
LDA FRSTPAG
|
||
STA SCRATCH
|
||
DEC FRSTPAG
|
||
LDX BOOTSLOT
|
||
JMP (ROMRWTS)
|
||
BOOT2 INC FRSTPAG
|
||
INC FRSTPAG
|
||
JSR SETKBD
|
||
JSR SETVID
|
||
JSR MONINIT
|
||
LDX BOOTSLOT
|
||
JMP (JMP2BOOT)
|
||
*
|
||
*
|
||
SECTABL HEX 000D0B0907
|
||
HEX 0503010E0C
|
||
HEX 0A080604
|
||
HEX 02
|
||
HEX 0F
|
||
*
|
||
*
|
||
* THE FOLLOWING ARE ALL PATCHES
|
||
* FOR APPEND AND VERIFY
|
||
*
|
||
*
|
||
APPFLG DFB 0
|
||
APDPTCH JSR LOCBUF
|
||
BCS APDPTCH1
|
||
LDA #0
|
||
TAY
|
||
STA APPFLG
|
||
STA (DOSIMG),Y
|
||
APDPTCH1 LDA RTNCODE
|
||
JMP DOERROR
|
||
LDA APPFLG
|
||
BEQ APDPTCH2
|
||
INC RECNUM
|
||
BNE APDPTCH2
|
||
INC RECNUM+1
|
||
APDPTCH2 LDA #0
|
||
STA APPFLG
|
||
JMP RWC2
|
||
STA SUBCODE
|
||
JSR FMDRVR
|
||
JSR DOCLOSE
|
||
JMP DOVERIFY
|
||
LDY #$13
|
||
APDPTCH3 LDA (BUFADR),Y
|
||
BNE APDPTCH6
|
||
INY
|
||
CPY #$17
|
||
BNE APDPTCH3
|
||
LDY #$19
|
||
APDPTCH4 LDA (BUFADR),Y
|
||
STA PTCHSAV,Y
|
||
INY
|
||
CPY #$1D
|
||
BNE APDPTCH4
|
||
APDPTCH5 JMP FMDRVR0
|
||
APDPTCH6 LDX #$FF
|
||
STX APPFLG
|
||
BNE APDPTCH5
|
||
*
|
||
*
|
||
DS 19
|
||
DS 24
|
||
DS 31
|
||
*
|
||
JMP2BOOT DS 1
|
||
FRSTPAG HEX 36
|
||
NUMSECS HEX 09
|
||
*
|
||
ORG $3600
|
||
*
|
||
* DOS SECOND STAGE BOOT PGM
|
||
*
|
||
STX SNUM16
|
||
STX SLOTFND
|
||
LDA #$1
|
||
STA DRVFND
|
||
STA DNUM
|
||
LDA NUMPGS
|
||
STA NSECSRW
|
||
LDA #2
|
||
STA TNUM
|
||
LDA #4
|
||
STA SNUM
|
||
LDY FRSTBOOT+1
|
||
DEY
|
||
STY USRBUF+1
|
||
LDA #$1
|
||
STA CMDCODE
|
||
TXA
|
||
LSR
|
||
LSR
|
||
LSR
|
||
LSR
|
||
TAX
|
||
LDA #0
|
||
STA DRV1TRAK,X
|
||
STA DRV0TRAK,X
|
||
JSR RWPAGES
|
||
LDX #$FF
|
||
TXS
|
||
STX VOLEXPT
|
||
JMP REBOOT
|
||
JSR SETKBD
|
||
JMP DOSSTRT
|
||
*
|
||
* PUTDOS- WRITES DOS ON FIRST
|
||
* TWO TRACKS OF DISK
|
||
*
|
||
PUTDOS LDA FRSTBOOT+1
|
||
SEC
|
||
SBC USRBUF+1
|
||
STA NSECSRW
|
||
LDA FRSTBOOT+1
|
||
STA USRBUF+1
|
||
DEC USRBUF+1
|
||
LDA #2
|
||
STA TNUM
|
||
LDA #4
|
||
STA SNUM
|
||
LDA #2
|
||
STA CMDCODE
|
||
JSR RWPAGES
|
||
LDA FRSTBOOT+1
|
||
STA FRSTPAG
|
||
CLC
|
||
ADC #9
|
||
STA USRBUF+1
|
||
LDA #$A
|
||
STA NSECSRW
|
||
SEC
|
||
SBC #$1
|
||
STA NUMSECS
|
||
STA SNUM
|
||
JSR RWPAGES
|
||
RTS
|
||
DS 6
|
||
RWPAGES LDA RWTSPPTR+1
|
||
LDY RWTSPPTR
|
||
JSR CLLRWTS
|
||
LDY SNUM
|
||
DEY
|
||
BPL RWPAGES1
|
||
LDY #$F
|
||
NOP
|
||
NOP
|
||
DEC TNUM
|
||
RWPAGES1 STY SNUM
|
||
DEC USRBUF+1
|
||
DEC NSECSRW
|
||
BNE RWPAGES
|
||
RTS
|
||
*
|
||
ORG $B7B5
|
||
*
|
||
CLLRWTS PHP
|
||
SEI
|
||
JSR RWTSENT
|
||
BCS CLLRWTS1
|
||
PLP
|
||
CLC
|
||
RTS
|
||
CLLRWTS1 PLP
|
||
SEC
|
||
RTS
|
||
RWTSPRMS LDA SUBCODE
|
||
STA USRBUF+1
|
||
LDA #0
|
||
STA USRBUF
|
||
LDA VOLNUMBR
|
||
EOR #$FF
|
||
STA VOLEXPT
|
||
RTS
|
||
ZEROBUF LDA #0
|
||
TAY
|
||
ZEROBUF1 STA (BUFADR),Y
|
||
INY
|
||
BNE ZEROBUF1
|
||
RTS
|
||
HEX 00
|
||
NUMPGS HEX 1B
|
||
NSECSRW HEX 000A1B
|
||
RWTSPPTR DA $B7E8
|
||
FRSTBOOT DA $B600
|
||
IOB = *
|
||
TBLTYPE HEX 01
|
||
SNUM16 HEX 60
|
||
DNUM HEX 01
|
||
VOLEXPT HEX FF
|
||
TNUM HEX 0C
|
||
SNUM HEX 08
|
||
DA DVCTBL
|
||
USRBUF DA $9600
|
||
BYTCNT DA $100
|
||
CMDCODE HEX 02
|
||
ERRRCODE HEX 07
|
||
VOLFND HEX FE
|
||
SLOTFND HEX 60
|
||
DRVFND HEX 01
|
||
UNUSED HEX 000000
|
||
DVCTBL HEX 01EFD800
|
||
000000
|
||
DVCTBL HEX 01EFD800
|
||
|