958 lines
27 KiB
Plaintext
958 lines
27 KiB
Plaintext
*=================================
|
||
* READ FUNCTION HANDLER.
|
||
*=================================
|
||
|
||
FNREAD LDA SUBCODFM ;CHK IF SUBCODE IS LEGAL.
|
||
CMP #5 ;(MUST BE < = 5.)
|
||
BCS TOERRSUB ;RANGE ERROR - ILLEGAL SUBCODE.
|
||
|
||
ASL ;SUBCODE*2, CAUSE 2 BYTES/ADR.
|
||
TAX ;INDEX TABLE OF SUBFUNCTION ADRS.
|
||
LDA RDSUBTBL+1,X;GET ADDR (MINUS 1) OF SUBFUNCT
|
||
PHA ;ENTRY POINT & PUT IT ON THE STK
|
||
LDA RDSUBTBL,X ;(HI BYTE FIRST). THEN DO A STACK
|
||
PHA ;JUMP TO EXECUTE THE GIVEN READ
|
||
RTS ;SUBFUNCTION.
|
||
|
||
TOERRSUB JMP RNGERRSB ;GO HANDLE RANGE ERROR.
|
||
|
||
TOFILOCK JMP FILELOKD ;GO HANDLE LOCKED FILE ERROR.
|
||
|
||
|
||
*=================================
|
||
* WRITE FUNCTION HANDLER.
|
||
*=================================
|
||
|
||
FNWRITE LDA FILTYPWA ;CHK IF FILE IS LOCKED.
|
||
BMI TOFILOCK ;ERROR - CAN'T WRITE 2 LCKD FILE.
|
||
|
||
LDA SUBCODFM ;CHK IF SUBCODE IS LEGAL.
|
||
CMP #5 ;(MUST BE < = 5.)
|
||
BCS TOERRSUB ;ERROR - ILLEGAL SUBCODE.
|
||
|
||
ASL ;SUBCODE*2, CAUSE 2 BYTES/ADR.
|
||
TAX ;INDEX TABLE OF SUBFUNCTION ADRS.
|
||
LDA WRSUBTBL+1,X;GET ADR (MINUS 1) OF SUBFUNCT
|
||
PHA ;ENTRY POINT & STICK ON THE STACK
|
||
LDA WRSUBTBL,X ;(HI BYTE FIRST). THEN DO A STACK
|
||
PHA ;JUMP TO EXECUTE THE GIVEN WRITE
|
||
RTS ;SUBFUNCTION.
|
||
|
||
|
||
*=================================
|
||
* POSITION AND READ-ONE-BYTE
|
||
* SUBFUNCTION HANDLER.
|
||
*=================================
|
||
|
||
PSNRDONE JSR CALCFPTR ;USING R-, L- & B-PARAMETERS,CALC
|
||
;THE POS'N OF FILE PTR WANTED.
|
||
|
||
|
||
*==================================
|
||
* READ-ONE-BYTE SUBFUNCTION HANDLER
|
||
*==================================
|
||
|
||
READONE JSR RDDATA ;GET DATA BYTE FROM DATA SEC BUF.
|
||
;(IF DESIRED DATA SECTOR IS NOT
|
||
;ALREADY IN MEMORY, THEN READ IT
|
||
;IN. HOWEVER, 1RST CHK IF PRESENT
|
||
;INFO IN DATA SEC NEEDS TO BE
|
||
;UPDATED SO DON'T OVERWRITE DATA
|
||
;IN BUF & LOOSE INFO.)
|
||
|
||
STA ONEIOBUF ;PUT BYTE READ IN THE 1-BYTE BUF
|
||
;CONTAINED IN THE FM PARM LIST.
|
||
JMP GOODFMXT ;EXIT THE FILE MGR. EVENTUALLY
|
||
;RTNS TO AFTRFUNC ($A6AB) LOCATED
|
||
;IN THE FMDRIVER ROUTINE ($A6A8).
|
||
|
||
|
||
*=================================
|
||
* POSITION & READ-A-RANGE-OF-BYTES
|
||
* SUBFUNCTION HANDLER.
|
||
*=================================
|
||
|
||
PSNRDRNG JSR CALCFPTR ;USING R-, L- & B-PARMS, CALC THE
|
||
;POS'N OF FILE POINTER WANTED.
|
||
|
||
|
||
*=================================
|
||
* READ-RANGE-OF-BYTES
|
||
* SUBFUNCTION HANDLER.
|
||
*=================================
|
||
|
||
READRNG JSR DECRWLEN ;DECREMENT THE # OF BYTES 2 READ.
|
||
;(DONE READING WHEN LEN2RDWR=0.)
|
||
JSR RDDATA ;GET DATA BYTE FROM DATA SEC BUF.
|
||
;(IF DESIRED DATA SECTOR IS NOT
|
||
;ALREADY IN MEMORY, THEN READ IT
|
||
;IN. HOWEVER, 1RST CHK IF PRESENT
|
||
;INFO IN DATA SEC NEEDS TO BE
|
||
;UPDATED SO DON'T OVERWRITE DATA
|
||
;IN BUF & LOOSE INFO.)
|
||
PHA ;SAVE SINGLE BYTE READ ON STK.
|
||
JSR INCIOBUF ;INC THE CUR'NT TARGET RAM MEMORY
|
||
;LOCATION (BYTRNG) & POINT A4L/H
|
||
;AT TARGET LOCATION IN I/O BUF.
|
||
LDY #0 ;INITIALIZE (Y) INDEX.
|
||
PLA ;RETRIEVE BYTE READ.
|
||
STA (A4L),Y ;PUT SINGLE BYTE READ INTO THE
|
||
;TARGET MEMORY LOCATION.
|
||
JMP READRNG ;GO BK TO READ NEXT BYTE OF DATA.
|
||
|
||
|
||
*=================================
|
||
* SUBROUTINE TO READ A DATA BYTE.
|
||
*=================================
|
||
|
||
RDDATA JSR NXTDATRD ;CHK IF DATA SEC WE WANT TO READ
|
||
;IS ALREADY IN MEMORY. IF NOT,
|
||
;READ DATA SEC INTO DATA SEC BUF.
|
||
;HOWEVER, 1RST CHK IF DAT SEC BUF
|
||
;NEEDS UPDATING SO DON'T OVRWRITE
|
||
;DATA SEC BUF & LOSE INFO.
|
||
BCS NDATERR ;BRANCH IF RAN OUT OF DATA SECS
|
||
;WHILE READING.
|
||
LDA (A4L),Y ;GET SINGLE BYTE FRM DATA SEC BUF
|
||
PHA ;SAVE IT ON STK.
|
||
JSR INCREC ;EITHER INC REC # OR BYTE OFFSET
|
||
;INTO RECORD.
|
||
JSR INCFILPT ;INC BYTE OFFSET INTO CURRENT
|
||
;DATA SEC OR, IF AT END OF SEC,
|
||
;INC THE SECTOR OFFSET INTO THE
|
||
;ENTIRE FILE.
|
||
PLA ;GET DATA BYTE RD (BACK OFF STK).
|
||
RTS
|
||
|
||
NDATERR JMP ENDOFDAT ;RAN OUT OF DATA WHILE READING.
|
||
|
||
|
||
*=================================
|
||
* POSITION & WRITE-ONE-BYTE
|
||
* SUBFUNCTION HANDLER.
|
||
*=================================
|
||
|
||
PSNWRONE JSR CALCFPTR ;USING R-, L- & B-PARMS, CALC
|
||
;POS'N OF FILE POINTER WANTED.
|
||
|
||
|
||
*=================================
|
||
* WRITE-ONE-BYTE SUBFUNCTION HNDLR
|
||
*=================================
|
||
|
||
WRITEONE LDA ONEIOBUF ;GET BYTE TO WRITE FROM ONE-BYTE
|
||
;BUFFER IN FM PARAMETER LIST.
|
||
JSR WRTDATA ;STORE DATA TO WRITE IN THE DATA
|
||
;SECTOR BUFFER. IF DATA SEC BUF
|
||
;IS FULL, THEN WRITE IT TO DISK
|
||
;AND UPDATE T/S LIST BUF.
|
||
JMP GOODFMXT ;EXIT FILE MANAGER. EVENTUALLY
|
||
;RTNS TO AFTRFUNC ($A6AB) LOCATED
|
||
;IN THE FMDRIVER ROUTINE ($A6A8).
|
||
|
||
|
||
*=================================
|
||
* POSITION & WRITE-RANGE-OF-BYTES
|
||
* SUBFUNCTION HANDLER.
|
||
*=================================
|
||
|
||
PSNWRRNG JSR CALCFPTR ;USING R-, L- & B-PARMS, CALC
|
||
;POS'N OF FILE POINTER WANTED.
|
||
|
||
|
||
*=================================
|
||
* WRITE RANGE-OF-DATA-BYTES
|
||
* SUBFUNCTION HANDLER.
|
||
*=================================
|
||
|
||
WRITERNG JSR INCIOBUF ;POINT A4L/H AT SOURCE BYTE.
|
||
LDY #0 ;SET (Y) TO INDEX SOURCE BUF.
|
||
LDA (A4L),Y ;GET BYTE TO WRITE.
|
||
JSR WRTDATA ;PUT DATA BYTE IN DATA SEC BUF.
|
||
;(WRITE DATA SEC BUF TO DISK IF
|
||
;NECESSARY. )
|
||
JSR DECRWLEN ;CHECK IF DONE WRITING. IF NOT,
|
||
;REDUCE COUNTER FOR # OF BYTES
|
||
;LEFT TO WRITE.
|
||
JMP WRITERNG ;GO BACK TO WRITE NEXT DATA BYTE.
|
||
|
||
|
||
*=================================
|
||
* SUBROUTINE WHICH WRITES BYTE.
|
||
*=================================
|
||
|
||
WRTDATA PHA ;SAVE BYTE TO WRITE ON STK.
|
||
JSR NXTDATRD ;READ NXT DATA SEC BUF IF NEEDED.
|
||
PLA ;GET DATA BYTE TO WRITE OFF STK.
|
||
STA (A4L),Y ;PUT DATA BYTE IN DATA SEC BUF.
|
||
LDA #%01000000 ;SET BIT6 TO SIGNAL DATA SEC BUF
|
||
ORA UPDATFLG ;HAS CHANGED & THEREFOR, THE DISK
|
||
STA UPDATFLG ;REQUIRES UPDATING.
|
||
JSR INCREC ;EITHER INC THE RECORD NUMBER OR
|
||
;INC THE BYTE OFFSET INTO RECORD.
|
||
JMP INCFILPT ;INC THE BYTE OFFSET INTO THE
|
||
;CURRENT DATA SECTOR. IF AT THE
|
||
;END OF SECTOR, INC THE OFFSET
|
||
;INTO THE ENTIRE FILE INSTEAD.
|
||
|
||
|
||
*=================================
|
||
* LOCK & UNLOCK FUNCTION HANDLERS.
|
||
*=================================
|
||
|
||
FNLOCK LDA #$80 ;SET HI BIT IN LOCK/UNLOCK MASK.
|
||
STA LOKUNMSK
|
||
BNE COMNLOCK ;ALWAYS.
|
||
|
||
|
||
FNUNLOCK LDA #0 ;MAKE SURE HI BIT CLR IN LOKUNMSK
|
||
STA LOKUNMSK
|
||
|
||
COMNLOCK JSR COMNOPEN ;LOCATE THE FILE WITH THE SAME
|
||
;NAME & OPEN IT.
|
||
LDX CURDIRNX ;(X) = INDEX TO FILE DESCRIPTION
|
||
;ENTRY IN THE DIRECTORY SEC BUF.
|
||
LDA FIL1TYPE,X ;GET OLD FILE TYPE.
|
||
AND #$7F ;SHUT HI BIT OFF.
|
||
ORA LOKUNMSK ;MERGE WITH LOKUNMSK 2 SET OR CLR
|
||
;(LOCK OR UNLOCK) HI BIT.
|
||
STA FIL1TYPE,X ;STICK MODIFIED FILE TYPE BACK IN
|
||
;FILE DESCRIP PART OF DIR SEC BUF
|
||
JSR WRDIRECT ;WRITE UPDATED DIREC SEC TO DISK.
|
||
|
||
TOOKFMXT JMP GOODFMXT ;EXIT FM CLEANLY. EVENTUALLY RTNS
|
||
;TO AFTRFUNC ($A6AB) LOCATED IN
|
||
;THE FMDRIVER ROUTINE ($A6A8).
|
||
|
||
|
||
*=================================
|
||
* POSITION FUNCTION HANDLER.
|
||
*=================================
|
||
|
||
FNPOSN JSR CALCFPTR ;USE R-, B- & L-PARAMETERS 2 CALC
|
||
;POSITION OF FILE POINTER WANTED.
|
||
JMP GOODFMXT ;EXIT FILE MANAGER CLEANLY.
|
||
;EVENTUALLY RETURNS TO AFTRFUNC
|
||
;($A6AB) LOCATED IN THE FMDRIVER
|
||
;ROUTINE ($A6A8).
|
||
|
||
|
||
*=================================
|
||
* VERIFY FUNCTION HANDLER.
|
||
*=================================
|
||
|
||
FNVERIFY JSR COMNOPEN ;LOCATE FILE WITH SAME NAME
|
||
;& OPEN IT.
|
||
VRFYREAD JSR NXTDATRD ;READ NEXT DATA SEC IN. (ASSUME
|
||
;DATA SEC WE WANT NOT PRESENTLY
|
||
;IN MEMORY.)
|
||
BCS TOOKFMXT ;END OF FILE DETECTED - EXIT FM.
|
||
;EVENTUALLT RETURNS TO AFTRFUNC
|
||
;($A6AB) LOCATED IN THE FMDRIVER
|
||
;ROUTINE ($A6A8).
|
||
INC FILPTSEC ;KICK UP FILE POINTER POS'N
|
||
BNE VRFYREAD ;AND THEN GO BACK TO READ NEXT
|
||
INC FILPTSEC+1 ;DATA SECTOR UNTIL ENCOUNTER END
|
||
JMP VRFYREAD ;OF FILE MARKER.
|
||
|
||
|
||
*=================================
|
||
* DELETE FUNCTION HANDLER.
|
||
*=================================
|
||
|
||
FNDELETE JSR COMNOPEN ;LOCATE FILE WITH SAME NAME AND
|
||
;THEN OPEN IT.
|
||
LDX CURDIRNX ;(X) = INDEX TO FILE DESCRIPTION
|
||
;IN DIRECTORY SECTOR BUFFER.
|
||
LDA FIL1TYPE,X ;GET FILE TYPE FROM DIR SEC BUF.
|
||
BPL ALTRNTRY ;BRANCH IF FILE NOT LOCKED.
|
||
JMP FILELOKD ;ERR - CAN'T DELETE A LOCKED FILE
|
||
;SO GO HANDLE ERR & EXIT.
|
||
|
||
* GET TRK # OF FILES 1RST T/S LIST
|
||
* FROM FILE DESCRIP ENTRY IN DIR
|
||
* SEC BUF. PUT IT IN THE WRK AREA
|
||
* & WRITE IT OVER THE LAST CHAR
|
||
* POS'N IN THE APPROPRIATE FILE
|
||
* NAME FIELD IN DIRECTORY SECTOR.
|
||
|
||
ALTRNTRY LDX CURDIRNX ;(X) = INDEX TO FILE DESCRIPTION
|
||
;ENTRY IN DIRECTORY SEC BUFFER.
|
||
LDA FIL1TSTK,X ;GET TRK # OF 1RST T/S LIST SEC.
|
||
STA FIRSTSTK ;COPY IT IN2 WORK AREA & LAST CHR
|
||
STA FIL1NAME+29,X ;POS'N OF FILE NAME FLD DSCRP
|
||
LDA #$FF ;REPLACE ORIG TRK # OF T/S LIST
|
||
STA FIL1TSTK,X ;WITH $FF TO SIGNAL FILE DELETED.
|
||
LDY FIL1TSSC,X ;PUT SEC # OF FILE'S 1RST T/S LST
|
||
STY FIRTSSEC ;IN THE WORK AREA.
|
||
JSR WRDIRECT ;WRITE MODIFIED DIREC SEC 2 DISK.
|
||
|
||
* READ T/S LIST SEC INTO T/S LIST BUF.
|
||
* (NEED THIS INFO SO KNOW WHAT SECS
|
||
* TO RELEASE.)
|
||
|
||
CLC ;(C)=0, SIGNAL 1RST T/S LIST SEC.
|
||
RDTS4DEL JSR READTS ;GO READ IN T/S LIST.
|
||
BCS DONEDEL ;BRNCH IF JUST READ LAST T/S LIST
|
||
;SEC ASSOCIATED WITH THIS FILE.
|
||
JSR SELTSBUF ;POINT A4L/H AT T/S LIST SECTOR
|
||
;BUFFER.(GET ADR FRM FM PRM LST.)
|
||
|
||
* FREE ALL SECS LISTED IN THE T/S
|
||
* LIST THAT CURRENTLY OCCUPIES THE
|
||
* T/S LIST BUFFER.
|
||
|
||
LDY #12 ;1RST DATA SEC PAIR LISTED IS
|
||
;OFFSET 12 BYTES FROM START OF
|
||
;T/S LIST BUFFER.
|
||
DELFREE STY CURDIRNX ;SET (Y) = INDEX TO THE DATA PAIR
|
||
;LISTED IN THE T/S LIST BUFFER.
|
||
LDA (A4L),Y ;GET TRK # OF DATA SEC.
|
||
BMI BYPASDEL ;NEG TRK # ILLEGAL. (CAN USE AS
|
||
;A PROTECTION SCHEME.)
|
||
BEQ BYPASDEL ;TRK # OF 0 = NO MORE DATA SECS
|
||
;LISTED IN CURRENT T/S LIST.
|
||
PHA ;SAVE TRK # OF DATA SEC ON STK.
|
||
INY ;GET SEC # OF DATA SEC.
|
||
LDA (A4L),Y
|
||
TAY ;CONDITION (Y)=SEC & (A)=TRK FOR
|
||
PLA ;ENTRY IN2 ROUT'N 2 FREE UP SECS.
|
||
JSR FREESEC ;FREE UP SECTOR FROM DELETED FILE
|
||
BYPASDEL LDY CURDIRNX ;SET (Y) 2 INDEX START DATA PAIR.
|
||
INY ;KICK UP (Y) 2 PT AT NXT DATA PR.
|
||
INY
|
||
BNE DELFREE ;IF (Y) < > 0, THEN NEVER RAN OFF
|
||
;END OF T/S LIST SEC BUF YET, SO
|
||
;GO CHK IF MORE DATA PRS TO DO.
|
||
|
||
* FREE UP SECTOR CONTAINING THE
|
||
* T/S LIST.
|
||
|
||
LDA CURTSTRK ;TRK # OF CURRENT T/S LIST SEC.
|
||
LDY CURTSSEC ;SEC # OF CURRENT T/S LIST SEC.
|
||
JSR FREESEC ;GO FREE UP THE T/S LIST SEC.
|
||
SEC
|
||
BCS RDTS4DEL ;ALWAYS.
|
||
|
||
* DONE FREEING UP ALL SECTORS
|
||
* ASSOCIATED WITH THIS FILE, SO
|
||
* NOW WRITE MODIFIED VTOC BACK
|
||
* TO THE DISK.
|
||
|
||
DONEDEL JSR WRITVTOC ;WRITE UPDATED VTOC TO DISK.
|
||
JMP GOODFMXT ;GO EXIT FM CLEANLY. EVENTUALLY
|
||
;RTNS TO AFTRFUNC ($A6AB) LOCATED
|
||
;IN THE FMDRIVER ROUTINE ($A6A8).
|
||
|
||
|
||
*=================================
|
||
* SUBROUTINE TO FREE UP A SECTOR
|
||
* IN A TRKMAP OF THE VTOC.
|
||
*=================================
|
||
|
||
FREESEC SEC ;SET CARRY SO FREE UP PRESENT SEC
|
||
;WHEN START ROTATING ASSIGNMENT
|
||
;MAP.
|
||
JSR SUB2FREE ;ADJUST ASSIGNMENT MAP TO FREE UP
|
||
;SEC BY SETTING BIT CORRESPONDING
|
||
;TO SEC #. NEXT, MERGE ASIGNMAP
|
||
;WITH THE APPROP BIT MAP IN VTOC.
|
||
LDA #0 ;ZERO OUT ASIGNSEC, ASIGNTRK
|
||
LDX #5 ;& ASIGNMAP (6 BYTES) IN WRK AREA
|
||
RELEASEC STA ASIGNSEC,X
|
||
DEX
|
||
BPL RELEASEC
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* CATALOG FUNCTION HANDLER.
|
||
*=================================
|
||
|
||
FNCATLOG JSR ZWRKAREA ;INITIALISE THE FM WORK AREA.
|
||
LDA #$FF ;ALLOW ANY VOL TO BE CATALOGED.
|
||
STA VOLWA ;(WHEN RWTS LATER ENTERED, THIS
|
||
;VALUE IS EORED WITH #$FF TO
|
||
;SIMULATED A COMPLEMENTED VOL #
|
||
;OF 0 (IE. #$FF EOR #$FF = #$00).
|
||
;AFTER RWTS READS THE ADDRESS
|
||
;CHECKSUM, IT CHECKS 2 SEE IF THE
|
||
;CORRECT VOL # WAS READ OFF THE
|
||
;DISK. IF THE COMPLEMENT OF THE
|
||
;VOL # IS 0, OR IF IT MATCHES THE
|
||
;VOL # READ OFF DSK, EXECUTION
|
||
;PROCEEDS AS IF THE CORRECT VOL
|
||
;WAS FOUND.)
|
||
JSR READVTOC ;READ VOLUME TABLE OF CONTENTS.
|
||
LDA #22 ;SET INDEX TO ALLOW 22 SCREEN
|
||
STA SCRNSRCH ;LINES BETWEEN PAUSES.
|
||
|
||
* PRINT 2 <CR>'S & THE WORDS
|
||
* "DISK VOLUME".
|
||
JSR CRCATLOG ;PRT <CR> & TEST IF PAUSE NEEDED.
|
||
JSR CRCATLOG ;DO IT AGAIN.
|
||
LDX #11 ;12 CHARS TO PRT (11 TO 0).
|
||
PRDSKVOL LDA DSKVOLUM,X ;GET CHAR OF REVERSE STRING.
|
||
JSR COUT ;PRINT CHAR.
|
||
DEX
|
||
BPL PRDSKVOL ;MORE CHARS IN STRING.
|
||
STX A5L+1 ;NONSENSE INSTRUCTION (CAUSE THE
|
||
;HI BYTE IS NOT USED IN THE
|
||
;PRVOLNMB ROUTINE ($AE42).)
|
||
LDA IBSMOD ;GET VOL# FOUND (FROM RWTS'S IOB)
|
||
STA A5L ;AND PUT IT IN A5L.
|
||
JSR PRVOLNMB ;GO PRINT VOL # (BUGGY ROUTINE).
|
||
JSR CRCATLOG ;PRT <CR> & TEST IF PAUSE NEEDED.
|
||
JSR CRCATLOG ;DO IT AGAIN.
|
||
|
||
* READ DIRECTORY SECTOR INTO THE
|
||
* DIRECTORY SECTOR BUFFER.
|
||
|
||
CLC ;(C)=0, READ 1RST DIR SEC.
|
||
;(C)=1, READ NEXT DIR SEC.
|
||
RDDIRSEC JSR RDDIRECT ;GO READ DIRECTORY SECTOR.
|
||
BCS TOFMXTOK ;RAN OUT OF DIR SECS SO GO EXIT.
|
||
LDX #0 ;INITIALIZE INDEX INTO DIR SEC.
|
||
|
||
* ANALYZE THE TRACK NUMBER.
|
||
|
||
DESCRPTK STX CURDIRNX ;SAVE NDEX TO ENTRIES IN DIR SEC.
|
||
LDA FIL1TSTK,X ;TRK # OF FILE'S 1RST T/S LIST
|
||
;(FROM THE FILE'S DESCRIPTION IN
|
||
;THE DIRECTORY SECTOR).
|
||
BEQ TOFMXTOK ;TRK # = 0, SO NO MORE ENTRIES IN
|
||
;CURRENT DIRECTORY BUFFER.
|
||
BMI NXDESCRP ;TRK#=$FF=DELETED FILE SO SKIP IT
|
||
|
||
* CHK FILE STATUS & PRINT LOCKED
|
||
* SYMBOL ("*") OR SPACE.
|
||
|
||
LDY #" " ;DEFAULT (Y)=<SPC> N CASE NOT LCK
|
||
LDA FIL1TYPE,X ;GET FILE TYPE.
|
||
BPL PRLOCODE ;HI BIT CLR SO FILE UNLOCKED.
|
||
LDY #"*" ;RESET (Y) = LOCKED SYMBOL.
|
||
PRLOCODE TYA ;EITHER PRINT "*" OR <SPC>.
|
||
JSR COUT
|
||
|
||
* PRINT CHAR CODE FOR FILE TYPE &
|
||
* A TRAILING <SPC>.
|
||
|
||
LDA FIL1TYPE,X ;GET FILE TYPE AGAIN & MAKE SURE
|
||
AND #$7F ;HI BYTE IS OFF SO CAN INDEX TBL
|
||
;THAT CONTAINS SYMBOLS FOR TYPES.
|
||
LDY #7 ;SET (Y) TO INDICATE 7 RELEVANT
|
||
;BITS AFTER SHIFT OUT HI BIT.
|
||
ASL ;THROW AWAY HI BIT.
|
||
CHRTYPIX ASL ;SHIFT REST OF BITS UNTIL HI SET.
|
||
BCS PRTFTYPE ;# OF SHIFTS 2 SET (C) DESIGNATES
|
||
;INDEX TO TYPE CHAR TABLE.
|
||
DEY ;REDUCE COUNT OF SHIFTS.
|
||
BNE CHRTYPIX ;NO SET BITS ENCOUNTERED YET, SO
|
||
;GO BACK TO DO MORE SHIFTS.
|
||
PRTFTYPE LDA FTYPETBL,Y ;GOT A SET BIT SO NOW GET CHAR
|
||
;FROM TABLE OF TYPE SYMBOLS.
|
||
JSR COUT ;PRINT TYPE SYMBOL.
|
||
LDA #" " ;PRINT TRAILING <SPC>.
|
||
JSR COUT
|
||
|
||
* PRINT FILE SIZE (EXPRESSED IN
|
||
* TERMS OF SECTORS).
|
||
|
||
LDA FIL1SIZE,X ;GET LOW & HI BYTES OF FILE SIZE
|
||
STA A5L ;(IN SECTORS) FROM FILE DESCRIP
|
||
LDA FIL1SIZE+1,X ;IN CUR DIR SEC & STICK THEM IN
|
||
STA A5L+1 ;IN A5L/H.
|
||
JSR PRVOLNMB ;PRINT FILE SIZE.
|
||
;*** NOTE *** - ROUTINE IS BUGGY.
|
||
;(DOESN'T USE HI BYTE, SO FILES
|
||
;> 255 SECS LONG ARE EXPRESSED
|
||
;AS 256 MOD.)
|
||
LDA #" " ;PRINT <SPC> AFTER SIZE.
|
||
JSR COUT
|
||
|
||
* PRINT THE FILE NAME.
|
||
|
||
INX ;KICK (X) UP CAUSE NAME STARTS AT
|
||
INX ;4TH BYTE FROM START OF FILE
|
||
INX ;DESCRIPTION ENTRY.
|
||
LDY #29 ;COUNTER FOR 30 CHRS/NAME (0-29).
|
||
PRTFNAME LDA FIL1TSTK,X ;GET CHR 4 FILE NAME & PRINT IT.
|
||
JSR COUT ;(P.S. BECAUSE THE OUTPUT HOOK
|
||
;STILL PTS TO DOS'S OUTPUT HNDLR,
|
||
;CTRL-D AND A SUBSUBSEQUENT DOS
|
||
;CMD CAN BE EMBEDDED IN THE FILE
|
||
;NAME AS A PROTECTION SCHEME.)
|
||
INX ;KICK UP INDEX INTO FILE DESCRIP.
|
||
DEY ;REDUCE THE CHARACTER COUNTER.
|
||
BPL PRTFNAME ;BRANCH IF MORE CHARS TO PRT.
|
||
JSR CRCATLOG ;PRT <CR> AFTR NAME, TEST 4 PAUS.
|
||
|
||
* KICK UP INDEX INTO CURRENT DIRECTORY
|
||
* SECTOR BUF TO PT AT START OF NEXT
|
||
* FILE DESCRIPTION ENTRY.
|
||
|
||
NXDESCRP JSR NXPLUS35 ;ADD 35 BYTES TO INDEX SO IT PTS
|
||
;TO NEXT ENTRY IN CURRENT DIR SEC.
|
||
BCC DESCRPTK ;(C) = 0, SO GO LOOK FOR MORE
|
||
;ENTRIES IN THIS PARTICULAR
|
||
;DIRECTORY SECTOR.
|
||
BCS RDDIRSEC ;(C) = 1, SO THERE AREN'T MORE
|
||
;ENTRIES IN THIS DIRECT SECTOR.
|
||
;THERE4, GO BACK TO READ IN
|
||
;ANOTHER DIRECTORY SECTOR.
|
||
|
||
|
||
*=================================
|
||
* EXIT FILE MANAGER CLEANLY.
|
||
*=================================
|
||
|
||
TOFMXTOK JMP GOODFMXT ;EVENTUALY RETURNS TO AFTRFUNC
|
||
;($A6AB) LOCATED IN THE FMDRIVER
|
||
;ROUTINE ($A6A8).
|
||
|
||
|
||
*=================================
|
||
* PRINT <CR> & CHK FOR PAUSE.
|
||
*=================================
|
||
|
||
CRCATLOG LDA #$8D ;PRINT A <CR>.
|
||
JSR COUT
|
||
DEC SCRNSRCH ;DEC INDEX 2 SEE IF PAUSE NEEDED.
|
||
BNE CRCATRTN ;PAUSE NOT REQUIRED.
|
||
JSR RDKEY ;PAUSE SO INFO CAN BE ABSORBED
|
||
LDA #21 ;BEFORE SCROLLED OFF SCRN.
|
||
STA SCRNSRCH ;RESET INDEX FOR FRESH SCRN INFO.
|
||
CRCATRTN RTS
|
||
|
||
|
||
*=================================
|
||
* CONVERT 1 HEX BYTE TO 3-DIGIT
|
||
* DECIMAL (WITH LEADING ZEROES IF
|
||
* APPLICABLE).
|
||
*=================================
|
||
|
||
* NOTE: THIS IS A BUGGY ROUTINE
|
||
* - DOESN'T USE HI BYTE SO NUMBERS
|
||
* GREATER THAN 255 ARE EXPRESSED
|
||
* AS 256 MOD.
|
||
*
|
||
* (PS. TO USE AS A STAND-ALONE
|
||
* ROUTINE, LOAD A5L WITH HEX & CALL
|
||
* PRVOLNMB. DESTROYS (A) & (Y) REGS.
|
||
* CONVERSION DONE BY SIMULATING
|
||
* DIVISION VIA SUCCESSIVE SUBTRACTIONS
|
||
* OF POWERS OF 10.)
|
||
|
||
PRVOLNMB LDY #2 ;INDEX TO # OF CONVERSION FACTORS
|
||
;AND DIGITS.
|
||
ZONSTK LDA #0 ;INIT COUNT OF # OF SUBTR'S DONE.
|
||
PHA ;SAVE COUNT ON STACK.
|
||
GETVNMB LDA A5L ;GET LOW BTE HEX AND CMP IT TO
|
||
CMP BASETEN,Y ;TABLE OF CONVERSION FACTORS.
|
||
;CONVERSION TABLE CONTAINS POWERS
|
||
;OF 10: 10^2=100, 10^1=10, 10^0=1
|
||
BCC TONEGASC ;BRANCH IF # < CONVERSION FACTOR.
|
||
SBC BASETEN,Y ;SUBTRACT THE CONVERSION FACTOR.
|
||
STA A5L ;STORE THE REMAINDER.
|
||
LDA A5L+1 ;NONSENSE - NOT USED.
|
||
SBC #0 ;NONSENSE - NOT USED.
|
||
STA A5L+1 ;NONSENSE - NOT USED.
|
||
PLA ;GET COUNTER OF # OF SUBT'S AND
|
||
ADC #0 ;ADD (C). IF REMAIN. > CONVERSION
|
||
PHA ;FACTOR, ADD 1, ELSE ADD NOTHING.
|
||
JMP GETVNMB ;GO BACK TO DO MORE SUBT'S WITH
|
||
;SAME CONVERSION FACTOR.
|
||
TONEGASC PLA ;GET RESULT OF DIV (IE. WHOLE #
|
||
;OF SUBTRACTIONS).
|
||
ORA #$B0 ;CONVERT COUNT TO NEG ASCII CHAR.
|
||
JSR COUT ;PRT CHAR.
|
||
DEY ;3 CHARS/VOL# (IE. 2 TO 0).
|
||
BPL ZONSTK ;(3 CONVERSION FACTORS.)
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* COPY CONTENTS OF FM WORK BUFFER
|
||
* (IN DOS CHAIN) TO FM WORK AREA
|
||
* (NOT IN DOS CHAIN).
|
||
*=================================
|
||
|
||
RSTRFMWA JSR SELWKBUF ;PT A4L/H AT FM WORK BUF.
|
||
;(GET ADR FRM FM PARAMETER LIST.)
|
||
LDY #0 ;ZERO OUT RETURN CODE IN FM PARM
|
||
STY RTNCODFM ;LIST TO SIGNAL NO ERORS.
|
||
STORFMWK LDA (A4L),Y ;COPY FM WORK BUF 2 FM WORK AREA.
|
||
STA FMWKAREA,Y
|
||
INY
|
||
CPY #45 ;45 BYTES TO COPY (0 TO 44).
|
||
BNE STORFMWK
|
||
CLC ;WHY?????
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* COPY FM WORK AREA TO FM WORK BUF
|
||
* (LOCATED IN CHAIN OF DOS BUFS).
|
||
*=================================
|
||
|
||
CPYFMWA JSR SELWKBUF ;PT A4L/H AT FM WORK BUF (CHAIN).
|
||
;(GET ADR FROM FM PARM LIST.)
|
||
LDY #0 ;INITIALIZE INDEX.
|
||
STORWRK LDA FMWKAREA,Y ;COPY WORK AREA -----> WORK BUF.
|
||
STA (A4L),Y
|
||
INY
|
||
CPY #45 ;45 BYTES TO COPY (0 TO 44).
|
||
BNE STORWRK
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* INIT FUNCTION HANDLER.
|
||
*=================================
|
||
|
||
FNINIT JSR ZWRKAREA ;INIT THE FM WRK AREA (NON-CHAIN)
|
||
LDA #4 ;OPCODE FOR FORMAT.
|
||
|
||
* GO FORMAT THE DISK.
|
||
|
||
JSR RWTSDRV1 ;CALL RWTS DRIVER TO FORMAT DISK.
|
||
|
||
* PUT VOL#, # OF NEXT TRK TO BE
|
||
* ASSIGNED & ASSIGNMENT DIRECTION
|
||
* IN THE VTOC SECTOR BUFFER.
|
||
|
||
LDA VOLWA ;COMPLEMENTED VOL# (FRM WRK AREA)
|
||
EOR #$FF ;UNCOMPL. IT & PUT VOL# IN VTOC.
|
||
STA VOLUSED
|
||
LDA #$11 ;USE TRK # 17 FOR CATALOG TRK.
|
||
STA NXTRKUSE ;SET CAT TRK AS NXT TRK TO ALLOC.
|
||
;(NXTRKUSE IS LOCATED IN VTOC.)
|
||
LDA #1 ;ALLOCATION DIRECTION = FORWARD.
|
||
STA DRECTION
|
||
|
||
* ZERO OUT VTOC FROM TRKMAP0 TO
|
||
* END OF SECTOR. (NOTE: THIS
|
||
* ASSIGNS ALL TRACKS.)
|
||
|
||
LDX #56 ;OFFSET INTO VTOC TO TRKMAP0.
|
||
LDA #0
|
||
ZVTOC STA VTOCBUFF,X ;ZERO OUT A TRKMAP BYTE.
|
||
INX
|
||
BNE ZVTOC
|
||
|
||
* FREE UP ALL TRKS EXCEPT TRKS 0,
|
||
* 1, 2 & CAT TRK (#17).
|
||
*
|
||
* NOTE: DOS ONLY OCCUPIES SECTORS
|
||
* 0 TO 4 ON TRK 2, BUT ROUTINE
|
||
* TAKES REST OF SECS ON TRK 2 OUT
|
||
* OF CIRCULATION.
|
||
|
||
LDX #$0C ;OFFSET TO START OF TRKMAP3.
|
||
FREETRK CPX #$8C ;OFFSET 1 PAST END OF TRKMAP34.
|
||
BEQ FREEDTKS ;DONE UP TO END OF TRKMAP34.
|
||
LDY #3 ;INIT INDEX TO END OF FRETKMSK.
|
||
FREEIT LDA FRETKMSK,Y ;FREE MOST TRKMAPS. (STARTING
|
||
;WITH TRKMAP3).
|
||
;NOTE: NOT FREEING UP VTOC SEC
|
||
;OR TRKS USED BY DOS.
|
||
STA TRKMAP0,X ;FREE TRKS BY PLACING FOLLOWING
|
||
;BYTES IN @ TRKMAP: "FF FF 00 00"
|
||
INX ;KICK UP INDEX TO BYTE IN TRKMAP.
|
||
DEY ;REDUCE INDEX TO FRETKMSK CAUSE
|
||
;LOADING FROM END OF FRETKMSK:
|
||
; "00 00 FF FF".
|
||
BPL FREEIT ;(4BYTES/TRKMAP & 4BYTS/FRETKMSK)
|
||
CPX #$44 ;OFFSET TO START OF TRKMAP17
|
||
;(IE. CATALOG TRACK).
|
||
BNE FREETRK ;HAVE WE FREED TRKS 3 TO 16 YET?
|
||
;IF NOT - BRANCH.
|
||
LDX #$48 ;OFFSET TO TRK 18 (IE. SKIP THE
|
||
;CATALOG TRACK).
|
||
BNE FREETRK ;ALWAYS - GO FREE TRKS 18 TO 34.
|
||
FREEDTKS JSR WRITVTOC ;WRITE FREED UP VTOC TO DISK.
|
||
|
||
* CLEAR OUT THE DIRECTORY SEC BUF.
|
||
|
||
LDX #0
|
||
TXA
|
||
CLRDIREC STA DIRECBUF,X
|
||
INX
|
||
BNE CLRDIREC
|
||
JSR PT2DIRBF ;DESIGNATE DIR SEC BUF AS I/O BUF
|
||
LDA #$11 ;(A) = # OF CAT TRK.
|
||
LDY SECPERTK ;# OF SECS/TRK = 16.
|
||
DEY
|
||
DEY
|
||
STA IBTRK ;PUT CAT TRK IN IOB.
|
||
|
||
* WRITE DIRECTORY SECS (TRK17,
|
||
* SECS 15 TO 1) TO DISK.
|
||
|
||
SETLNKTK STA DIRLNKTK ;SET TRK/SEC VALS FOR LINK 2 NEXT
|
||
SETLNKSC STY DIRLNKSC ;DIRECTORY SECTOR.
|
||
INY ;GET SEC # TO WRITE & PUT IT IN
|
||
STY IBSECT ;RWTS'S IOB.
|
||
LDA #2 ;WRITE OPCODE.
|
||
JSR RWTSDRV1 ;WRITE DIRECTORY SEC TO DISK.
|
||
LDY DIRLNKSC ;SEC VAL OF NEXT DIR SEC 2 WRITE.
|
||
DEY ;KICK IT DWN (WILL INC IT LATER).
|
||
BMI DOIMAGE ;DON'T DO SEC 0 CAUSE THAT'S VTOC
|
||
BNE SETLNKSC ;GO WRITE SECS 2 TO 15.
|
||
TYA
|
||
BEQ SETLNKTK ;GO BACK TO WRITE SEC 1 AND ZERO
|
||
;OUT THE DIRECTORY SECTOR LINKS.
|
||
|
||
* ROUTINE TO WRITE THE DOS
|
||
* IMAGE ON TRACKS 0 TO 2.
|
||
|
||
DOIMAGE JSR PRPWRDOS ;GET READY TO WRITE DOS IMAGE.
|
||
JSR WRDOSIMG ;WRITE DOS IMAGE TO DISK.
|
||
JMP GOODFMXT ;EXIT FM CLEANLY. EVENTUALLY RTNS
|
||
;TO AFTRFUNC ($A6AB) LOCATED IN
|
||
;THE FMDRIVER ROUTINE ($A6A8).
|
||
|
||
|
||
*=================================
|
||
* POINT A4L/H AT A SPECIFIC
|
||
* SECTION OF A DOS BUFFER.
|
||
*=================================
|
||
|
||
SELWKBUF LDX #0 ;SELECT WORK BUFFER.
|
||
BEQ PT2FMBUF ;ALWAYS.
|
||
SELTSBUF LDX #2 ;SELECT T/S LIST BUFFER.
|
||
BNE PT2FMBUF ;ALWAYS.
|
||
SELDABUF LDX #4 ;SELECT DATA BUFFER.
|
||
PT2FMBUF LDA WRKBUFFM,X ;GET ADDR OF SELECTED BUF FROM
|
||
STA A4L ;FM PARM LST & PUT IT IN POINTER.
|
||
LDA WRKBUFFM+1,X
|
||
STA A4L+1
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* CHK IF DATA SEC BUF HAS CHANGED
|
||
* SINCE LAST READ OR WRITE.
|
||
*=================================
|
||
|
||
CKDATUP BIT UPDATFLG ;CHK BIT6 SO SEE IF CHANGED.
|
||
BVS WRITDATA ;TAKE BRANCH IF CHANGED.
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* WRITE PRESENT DATA SECTOR BUFFER
|
||
* TO THE DISK. (UPDATES DISK SO
|
||
* CAN READ IN NEXT DATA SEC WITH-
|
||
* OUT OVERWRITING AND THEREFORE
|
||
* LOSING PREVIOUS DATA.)
|
||
*---------------------------------
|
||
|
||
WRITDATA JSR PRPDAIOB ;PREPARE RWTS'S IOB FOR WRITING
|
||
;DATA SEC BUF TO DISK.
|
||
LDA #2 ;OPCODE FOR WRITE CMD.
|
||
JSR RWTSDRVR ;CALL DRIVER 2 WRT DATA SEC BUF.
|
||
LDA #%10111111 ;SHUT BIT6 OFF IN UPDATE FLAG TO
|
||
AND UPDATFLG ;SIGNAL THAT THE DATA SECTOR BUF
|
||
STA UPDATFLG ;IS UP TO DATE.
|
||
RTS
|
||
|
||
|
||
*===================================
|
||
* CHK IF T/S LIST REQUIRES UPDATING.
|
||
* (HAS T/S LIST BUF CHANGED SINCE
|
||
* LAST READ OR WRITE?)
|
||
*===================================
|
||
|
||
CKTSUPDT LDA UPDATFLG
|
||
BMI WRITETS ;IF BIT7 SET, UPDATING REQUIRED.
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* UPDATE T/S LIST SEC BUF ON DISK.
|
||
*---------------------------------
|
||
|
||
WRITETS JSR SETTSIOB ;PREPARE RWTS'S IOB FOR WRITING
|
||
;T/S LIST BUFFER TO DISK.
|
||
LDA #2 ;RWTS'S WRITE OPCODE.
|
||
JSR RWTSDRVR ;CALL RWTS DRIVER 2 WRITE T/S LST
|
||
LDA #$7F ;CLR BIT7 OF UPDATE FLAG 2 SIGNAL
|
||
AND UPDATFLG ;THAT T/S LIST IS UP TO DATE.
|
||
STA UPDATFLG
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* PREPARE RWTS'S IOB FOR READING
|
||
* OR WRITING T/S LIST SEC.
|
||
*=================================
|
||
|
||
SETTSIOB LDA TSBUFFM ;GET ADR OF T/S LIST BUF FROM
|
||
STA IBBUFP ;FM PARM LIST & DESIGNATE AS I/O
|
||
LDA TSBUFFM+1 ;BUF IN RWTS'S IOB.
|
||
STA IBBUFP+1
|
||
LDX CURTSTRK ;SET (X)/(Y) = TRK/SEC OF CURRENT
|
||
LDY CURTSSEC ;T/S LIST SECTOR.
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* READ T/S LIST SEC TO BUFFER.
|
||
*=================================
|
||
|
||
READTS PHP ;SAVE CARRY ON STK.
|
||
;(C)=0=READ 1RST T/S LIST SEC.
|
||
;(C)=1=READ NEXT T/S LIST SEC.
|
||
JSR CKTSUPDT ;WRITE T/S LIST SEC BUF IF
|
||
;UPDATING REQUIRED. (IF T/S LST
|
||
;BUF HAS CHANGED SINCE LAST READ
|
||
;OR WRITE, THEN WRITE IT BACK TO
|
||
;DISK SO DON'T OVERWRITE BUF AND
|
||
;LOSE INFO WHEN RD NEW T/S LIST.)
|
||
JSR SETTSIOB ;PREP RWTS'S IOB FOR READING T/S
|
||
;LIST SEC.
|
||
JSR SELTSBUF ;POINT A4L/H AT T/S LIST BUF.
|
||
;(GETS ADR FROM FM PARM LIST.)
|
||
PLP ;GET SAVED (C) BACK FROM STK.
|
||
BCS RDNXTTS ;IF (C)=1, ALREADY READ 1RST T/S
|
||
;LIST SEC, SO GO READ NEXT ONE.
|
||
|
||
* READ 1RST T/S LIST SEC.
|
||
* (CARRY WAS CLR.)
|
||
|
||
RDFIRSTS LDX FIRSTSTK ;SET (X)/(Y)=TRK/SEC OF 1RST T/S
|
||
LDY FIRTSSEC ;LIST SECTOR.
|
||
JMP RDTSLST ;GO READ T/S LIST SEC INTO BUF.
|
||
* ---
|
||
|
||
* READ NEXT T/S LIST SEC.
|
||
* (CARRY WAS SET.)
|
||
|
||
RDNXTTS LDY #1 ;INDEX INTO T/S LIST BUF.
|
||
LDA (A4L),Y ;TRK FOR LNK 2 NEXT T/S LIST SEC.
|
||
BEQ TSLNKZRO ;LINK ZEROED OUT SO NO MORE
|
||
;T/S LIST SECS FOR FILE.
|
||
TAX ;(X) = NEXT T/S LIST TRK.
|
||
INY
|
||
LDA (A4L),Y ;SEC# FOR LNK 2 NXT T/S LIST SEC.
|
||
TAY ;(Y) = NEXT T/S LIST SEC.
|
||
JMP RDTSLST ;GO READ NEXT T/S LIST SEC IN.
|
||
* ---
|
||
|
||
* T/S LINK ZEROED OUT SO
|
||
* DECIDE IF ERROR OR NOT.
|
||
|
||
TSLNKZRO LDA OPCODEFM ;CHK R/W STATUS TO SEE IF WANT TO
|
||
CMP #4 ;ADD ANOTHER T/S LIST.
|
||
BEQ UPDATETS ;WRITING - GO UPDATE LINK.
|
||
SEC ;WERE READING & LNK ZEROED OUT,
|
||
RTS ;SO RTN WITH (C)=1 SO GENERATE AN
|
||
* === ;ERROR. (REMEMBER, PREVIOUSLY SET
|
||
;RTN CODE TO A DEFAULT VALUE FOR
|
||
;FILE-NOT-FOUND.) HOWEVER, IF
|
||
;READING IS BEING DONE FOR AN
|
||
;APPEND OR VERIFICATION, THEN THE
|
||
;SET (C) JUST DENOTES THAT HAVE
|
||
;REACHED THE END OF THE FILE.
|
||
|
||
* WRITING & LNK ZEROED OUT SO MUST
|
||
* ALLOCATE A NEW T/S LIST SECTOR.
|
||
|
||
UPDATETS JSR ASGNTKSC ;FIND & RESERVE TRK/SEC VALS FOR
|
||
;A NEW T/S LIST SECTOR.
|
||
|
||
* LINK THE NEW T/S LIST SECTOR TO
|
||
* THE LAST T/S LIST SECTOR AND
|
||
* THEN WRITE THE UPDATED VERSION
|
||
* OF THE LAST T/S LIST SECTOR TO
|
||
* THE DISK.
|
||
|
||
LNKOLDNW LDY #2 ;OFFSET TO SEC# LINK BYTE.
|
||
STA (A4L),Y ;PUT NEW SEC VAL IN LINK AND THEN
|
||
PHA ;SAVE IT ON STK.
|
||
DEY ;OFFSET TO TRK BYTE OF LINK.
|
||
LDA ASIGNTRK ;PUT NEW TRK VAL IN LINK.
|
||
STA (A4L),Y
|
||
PHA ;SAVE TRK VAL ON STK.
|
||
JSR WRITETS ;WRITE UPDATED T/S LIST TO DISK.
|
||
|
||
* SET UP A BRAND NEW T/S LIST
|
||
* SECTOR & WRITE IT TO DISK.
|
||
|
||
ZOUTTS JSR ZCURBUF ;ZERO OUT T/S LIST BUF.
|
||
LDY #5 ;AT OFFSETS 5 & 6 IN2 THE NEW T/S
|
||
LDA RELASTP1 ;LIST, PUT REL SEC # PLUS 1 (IN
|
||
STA (A4L),Y ;RELATION TO THE ENTIRE FILE) OF
|
||
INY ;THE 1RST DATA PAIR THAT WILL BE
|
||
LDA RELASTP1+1 ;DESCRIBED IN THIS NEW T/S LIST.
|
||
STA (A4L),Y ;(POSSIBLE VALUES ARE: $007A,
|
||
;2*$007A, 3*$007A AND 4*$007A.
|
||
PLA ;GET (X)/(Y)=TRK/SEC VALS 4 THIS
|
||
TAX ;NEW T/S LIST SEC OFF STACK.
|
||
PLA
|
||
TAY
|
||
LDA #2 ;WRITE OPCODE FOR RWTS.
|
||
BNE RDWRTS ;ALWAYS - GO WRITE T/S LIST SEC.
|
||
* ---
|
||
|
||
* SUBROUTINE TO READ T/S LIST SEC.
|
||
|
||
RDTSLST LDA #1 ;READ OPCODE FOR RWTS.
|
||
|
||
* COMMON TO READ/WRITE T/S LIST.
|
||
|
||
RDWRTS STX CURTSTRK ;NEW T/S LIST SECTOR TRK/SEC VALS
|
||
STY CURTSSEC ;BECOME CURRENT TRK/SEC VALS.
|
||
JSR RWTSDRVR ;CALL RWTS DRIVER 2 READ OR WRITE
|
||
;THE CURRENT T/S LIST SECTOR.
|
||
|
||
* UPDATE FM WORK AREA BUF (NON-CHAIN).
|
||
|
||
LDY #5 ;OFFSET IN2 CURRENT T/S LIST BUF.
|
||
LDA (A4L),Y ;STORE REL SEC # OF 1RST DAT PAIR
|
||
STA RELFIRST ;THAT CAN BE DESCRIBED IN THIS
|
||
;T/S LIST. (POSSIBLE VALUES ARE:
|
||
;$0000, $007A, 2*$007A, 3*$007A
|
||
;AND 4*$007A.)
|
||
CLC ;ADD THE MAXIMUM # OF DATA SECS
|
||
ADC MXSCURTS ;THAT CAN POSSIBLY BE DESCRIBED
|
||
;IN THIS T/S LIST.
|
||
STA RELASTP1 ;STORE THE MAXIMUM RELATIVE SEC #
|
||
INY ;(PLUS 1) OF THE LAST DATA PAIR
|
||
;THAT CAN POSSIBLY BE DESCRIBED
|
||
;IN THIS T/S LIST.
|
||
LDA (A4L),Y
|
||
STA RELFIRST+1
|
||
ADC MXSCURTS+1
|
||
STA RELASTP1+1 ;(RELASTP1/+1 IS ALWAYS SET TO
|
||
;$007A BY FNOPEN. (POSSIBLE VALS
|
||
;ARE: $007A, 2*$007A, 3*$007A,
|
||
;4*$007A OR 5*$007A.)
|
||
CLC ;RETURN WITH NO ERRORS SIGNAL.
|
||
RTS
|
||
|
||
|
||
*=================================
|
||
* READ DATA SEC TO DATA SEC BUF.
|
||
*=================================
|
||
|
||
READDATA JSR PRPDAIOB ;SET UP RWTS'S IOB 2 RD DATA SEC.
|
||
LDA #1 ;READ OPCODE FOR RWTS.
|
||
JMP RWTSDRVR ;CALL RWTS DRIVER 2 READ DAT SEC.
|
||
|
||
|
||
*=================================
|
||
* PREP RWTS'S IOB TO READ
|
||
* OR WRITE THE DATA SECTOR.
|
||
*==================================
|
||
|
||
PRPDAIOB LDY DATBUFFM ;GET ADR OF DATA SEC BUF FROM THE
|
||
LDA DATBUFFM+1 ;FM PARM LIST & DESIGNATE IT AS
|
||
STY IBBUFP ;THE I/O BUF FOR RWTS'S IOB.
|
||
STA IBBUFP+1
|
||
LDX CURDATRK ;ENTER RWTS DRIVER WITH (X)/(Y)
|
||
LDY CURDATSC ;CONTAINING THE TRK/SEC VALUES OF
|
||
RTS ;THE DATA SECTOR.
|
||
|