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