843 lines
25 KiB
Plaintext
843 lines
25 KiB
Plaintext
|
*===================================
|
|||
|
* INITIALIZE THE I/O HOOKS SO THAT
|
|||
|
* DOS INTERCEPTS ALL INPUT & OUTPUT.
|
|||
|
*===================================
|
|||
|
|
|||
|
* FOR INSTANCE, IF A ROUTINE ACCESSES
|
|||
|
* "COUT: JMP (CSW)" THEN EXECUTION
|
|||
|
* WILL ACTUALLY FLOW TO DOS'S
|
|||
|
* OUTPUT ROUTINE (OPUTINCP, $9EBD).
|
|||
|
* SIMILARLY, ANY ROUTINE THAT REFERS
|
|||
|
* TO "RDKEY: JMP (KSW)" WILL ACTUALLY
|
|||
|
* JUMP TO DOS'S INPUT ROUTINE
|
|||
|
* (INPTINCP, $9E81).
|
|||
|
*
|
|||
|
* THE TRUE (IE. NORMAL) HOOKS ARE SAVED,
|
|||
|
* EX. KSW: KEYIN --> KSWTRUE: KEYIN.
|
|||
|
* CSW: COUT1 --> CSWTRUE: COUT1.
|
|||
|
* THEN THE INTERCEPTS ARE SET AS FOLLOWS:
|
|||
|
* ADINPTCP: INPTINCP --> KSW: INPTINCP.
|
|||
|
* ADOPUTCP: OPUTINCP --> CSW: OPUTINCP.
|
|||
|
|
|||
|
* CHECK IF INPUT HOOK NEEDS TO BE RESET.
|
|||
|
INITIOHK LDA KSW+1
|
|||
|
CMP ADINPTCP+1
|
|||
|
BEQ CKOUTHK ;INPUT HK ALREADY POINTS 2 DOS'S
|
|||
|
;INPUT HNDLER SO GO CHK OUTPUT HK
|
|||
|
|
|||
|
* RESET INPUT HOOK TO POINT TO DOS.
|
|||
|
|
|||
|
STA KSWTRUE+1 ;KSW: KEYIN --> KSWTRUE: KEYIN.
|
|||
|
LDA KSW
|
|||
|
STA KSWTRUE
|
|||
|
LDA ADINPTCP ;ADINPTCP:INPTINCP-->KSW:INPTINCP
|
|||
|
STA KSW
|
|||
|
LDA ADINPTCP+1
|
|||
|
STA KSW+1
|
|||
|
|
|||
|
* CHECK IF OUTPUT HOOK NEEDS TO BE RESET.
|
|||
|
|
|||
|
CKOUTHK LDA CSW+1
|
|||
|
CMP ADOPUTCP+1
|
|||
|
BEQ SETHKRTN ;OUTPUT HK ALREADY PTS TO DOS'S
|
|||
|
;OUTPUT HANDLER, SO EXIT.
|
|||
|
|
|||
|
* RESET OUTPUT HOOK TO POINT TO DOS.
|
|||
|
|
|||
|
STA CSWTRUE+1 ;CSW: COUT1 --> CSWTRUE: COUT1.
|
|||
|
LDA CSW
|
|||
|
STA CSWTRUE
|
|||
|
LDA ADOPUTCP ;ADOPUTCP:OPUTINCP-->CSW:OPUTINCP
|
|||
|
STA CSW
|
|||
|
LDA ADOPUTCP+1
|
|||
|
STA CSW+1
|
|||
|
SETHKRTN RTS
|
|||
|
|
|||
|
|
|||
|
|
|||
|
*========================================
|
|||
|
* DOS COMMAND TEXT TABLE ($A884 - $A908).
|
|||
|
*========================================
|
|||
|
* THE NAMES OF THE DIFFERENT DOS COMMANDS
|
|||
|
* CAN READILY BE CHANGED BY ALTERING THE
|
|||
|
* INFORMATION IN THIS TABLE. IF YOU
|
|||
|
* DECIDE TO MESS AROUND WITH THIS TABLE,
|
|||
|
* BE SURE TO:
|
|||
|
* - LET THE 1RST CMD CREATE A NEW FILE.
|
|||
|
* (FOR EXPLANATION, SEE FMXTNTRY
|
|||
|
* ROUTINE ($AAFD) IN LINEAR DIS'MBLY.)
|
|||
|
* - AVOID CREATING NEW DOS CMD NAMES
|
|||
|
* THAT DUPLICATE BASIC CMD NAMES.
|
|||
|
* - USE POSITIVE ASCII CHARS FOR ALL BUT
|
|||
|
* THE LAST CHAR OF EACH NAME.
|
|||
|
* - ENTER THE LAST CHAR IN EACH NAME IN
|
|||
|
* NEGATIVE ASCII FORM.
|
|||
|
* - SHIFT SUBSEQUENT NAMES TO KEEP ALL
|
|||
|
* CHARS CONTIGUOUS IF YOU CREATE
|
|||
|
* SHORTER NAMES.
|
|||
|
* - DON'T EXPAND THE TABLE BEYOND $A908.
|
|||
|
* - END THE TABLE WITH A $00 BYTE.
|
|||
|
*========================================
|
|||
|
|
|||
|
CMDTXTBL DCI 'INIT' ; ($A884 - $A887)
|
|||
|
DCI 'LOAD' ; ($A888 - $A88B)
|
|||
|
DCI 'SAVE' ; ($A88C - $A88F)
|
|||
|
DCI 'RUN' ; ($A890 - $A892)
|
|||
|
DCI 'CHAIN' ; ($A893 - $A897)
|
|||
|
DCI 'DELETE' ; ($A898 - $A89D)
|
|||
|
DCI 'LOCK' ; ($A89E - $A8A1)
|
|||
|
DCI 'UNLOCK' ; ($A8A2 - $A8A7)
|
|||
|
DCI 'CLOSE' ; ($A8A8 - $A8AC)
|
|||
|
DCI 'READ' ; ($A8AD - $A8B0)
|
|||
|
DCI 'EXEC' ; ($A8B1 - $A8B4)
|
|||
|
DCI 'WRITE' ; ($A8B5 - $A8B9)
|
|||
|
DCI 'POSITION' ; ($A8BA - $A8C1)
|
|||
|
DCI 'OPEN' ; ($A8C2 - $A8C5)
|
|||
|
DCI 'APPEND' ; ($A8C6 - $A8CB)
|
|||
|
DCI 'RENAME' ; ($A8CC - $A8D1)
|
|||
|
DCI 'CATALOG' ; ($A8D2 - $A8D8)
|
|||
|
DCI 'MON' ; ($A8D9 - $A8DB)
|
|||
|
DCI 'NOMON' ; ($A8DC - $A8E0)
|
|||
|
DCI 'PR#' ; ($A8E1 - $A8E3)
|
|||
|
DCI 'IN#' ; ($A8E4 - $A8E6)
|
|||
|
DCI 'MAXFILES' ; ($A8E7 - $A8EE)
|
|||
|
DCI 'FP' ; ($A8EF - $A8F0)
|
|||
|
DCI 'INT' ; ($A8F1 - $A8F3)
|
|||
|
DCI 'BSAVE' ; ($A8F4 - $A8F8)
|
|||
|
DCI 'BLOAD' ; ($A8F9 - $A8FD)
|
|||
|
DCI 'BRUN' ; ($A8FE - $A901)
|
|||
|
DCI 'VERIFY' ; ($A902 - $A907)
|
|||
|
HEX 00 ; ($A908)
|
|||
|
;$00 BYTE DENOTES END OF TABLE.
|
|||
|
|
|||
|
|
|||
|
*========================================
|
|||
|
* TABLE OF ATTRIBUTES & VALID OPTIONS
|
|||
|
* THAT ARE ASSOCIATED WITH EACH COMMAND.
|
|||
|
* ($A909 - $A940)
|
|||
|
*========================================
|
|||
|
|
|||
|
* NOTE: ANY ALTERATIONS TO THIS TABLE
|
|||
|
* SHOULD BE DONE WITH A DEGREE OF CAUTION
|
|||
|
* BECAUSE SEVERAL PARAMETERS ACQUIRE
|
|||
|
* CERTAIN DEFAULT VALUES IN THE ACTUAL
|
|||
|
* COMMAND-HANDLING ROUTINES. WITH JUST
|
|||
|
* A BIT OF INSPECTION OF THE HANDLING
|
|||
|
* ROUTINES HOWEVER, YOU SHOULD BE ABLE TO
|
|||
|
* SAFELY MAKE EXTENSIVE CHANGES IF YOU SO
|
|||
|
* DESIRE.
|
|||
|
*
|
|||
|
* THIS TABLE IS INDEXED BY A VALUE
|
|||
|
* CORRESPONDING TO THE PARSED DOS
|
|||
|
* COMMAND. TWO BYTES OF INFORMATION
|
|||
|
* ARE ASSOC WITH @ CMD. A SET BIT
|
|||
|
* DENOTES THE FOLLOWING:
|
|||
|
*
|
|||
|
* FIRST BYTE
|
|||
|
* 7 6 5 4 3 2 1 0
|
|||
|
* . . . . . . . .
|
|||
|
* . . . . . . . ...CMD CAN CREATE NEW FILE IF FILE
|
|||
|
* . . . . . . . NOT FOUND.
|
|||
|
* . . . . . . ......CMD RESTRICTED TO DEFERRED MODE.
|
|||
|
* . . . . . .........VALUE FOR MAXFILES REQUIRED.
|
|||
|
* . . . . ............VALUE FOR PR# OR IN# REQUIRED.
|
|||
|
* . . . ...............2ND FILENAME NEEDED (RENAME CMD)
|
|||
|
* . . ..................FILE NAME APPLICABLE TO CMD
|
|||
|
* . . (EXPECTED BUT NOT NECESSARILY
|
|||
|
* . . REQUIRED.)
|
|||
|
* . .................... DO DOS CMD EVEN IF NO NAME GIVEN
|
|||
|
* ....................... INTERPRET AS BASIC CMD IF NO NAM
|
|||
|
|
|||
|
* SECOND BYTE
|
|||
|
* 7 6 5 4 3 2 1 0
|
|||
|
* . . . . . . . .
|
|||
|
* . . . . . . . ...A(DDRESS) PARAMETER ALLOWED.
|
|||
|
* . . . . . . ......B(YTE) PARAMETER ALLOWED.
|
|||
|
* . . . . . .........R(ECORD) # OR R(EL FIELD POS'N)
|
|||
|
* . . . . . PARAMETER ALLOWED.
|
|||
|
* . . . . ............L(ENGTH) PARAMETER ALLOWED.
|
|||
|
* . . . ...............S(LOT) PARAMETER ALLOWED.
|
|||
|
* . . ..................D(RIVE) PARAMETER ALLOWED.
|
|||
|
* . .....................V(OLUME) PARAMETER ALLOWED.
|
|||
|
* ........................C, I, OR O PARAMETER ALLOWED.
|
|||
|
|
|||
|
CMDATTRB HEX 2170 ;INIT 00100001 01110000
|
|||
|
HEX A070 ;LOAD 10100000 01110000
|
|||
|
HEX A170 ;SAVE 10100001 01110000
|
|||
|
HEX A070 ;RUN 10100000 01110000
|
|||
|
HEX 2070 ;CHAIN 00100000 01110000
|
|||
|
HEX 2070 ;DELETE 00100000 01110000
|
|||
|
HEX 2070 ;LOCK 00100000 01110000
|
|||
|
HEX 2070 ;UNLOCK 00100000 01110000
|
|||
|
HEX 6000 ;CLOSE 01100000 00000000
|
|||
|
HEX 2206 ;READ 00100010 00000110
|
|||
|
HEX 2074 ;EXEC 00100000 01110100
|
|||
|
HEX 2206 ;WRITE 00100010 00000110
|
|||
|
HEX 2204 ;POSITION 00100010 00000100
|
|||
|
HEX 2378 ;OPEN 00100011 01111000
|
|||
|
HEX 2270 ;APPEND 00100010 01110000
|
|||
|
HEX 3070 ;RENAME 00110000 01110000
|
|||
|
HEX 4070 ;CATALOG 01000000 01110000
|
|||
|
HEX 4080 ;MON 01000000 10000000
|
|||
|
HEX 4080 ;NOMON 01000000 10000000
|
|||
|
HEX 0800 ;PR# 00001000 00000000
|
|||
|
HEX 0800 ;IN# 00001000 00000000
|
|||
|
HEX 0400 ;MAXFILES 00000100 00000000
|
|||
|
HEX 4070 ;FP 01000000 01110000
|
|||
|
HEX 4000 ;INT 01000000 00000000
|
|||
|
HEX 2179 ;BSAVE 01000001 01111001
|
|||
|
HEX 2071 ;BLOAD 01000000 01110001
|
|||
|
HEX 2071 ;BRUN 01000000 01110001
|
|||
|
HEX 2070 ;VERIFY 00100000 01110000
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* OPTION CHARACTER SYMBOL TABLE.
|
|||
|
* ($A941 - $A94A)
|
|||
|
* THESE CHARACTERS ARE FREQUENTLY
|
|||
|
* CHANGED AS PART OF A PROTECTION
|
|||
|
* SCHEME.
|
|||
|
*=================================
|
|||
|
|
|||
|
OPTNTXT ASC "VDSLRBACIO"
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* OPTIONS ISSUED TABLE
|
|||
|
* ($A94B - $A954)
|
|||
|
* A SET BIT IN THE FOLLOWING BIT
|
|||
|
* POSITIONS (OF CUMLOPTN) DENOTE
|
|||
|
* THE OPTIONS THAT WERE ISSUED
|
|||
|
* WITH THE COMMAND.
|
|||
|
*=================================
|
|||
|
|
|||
|
OPTNISSD HEX 40 ;V(OLUME) PARAMETER.
|
|||
|
HEX 20 ;D(RIVE) PARAMETER.
|
|||
|
HEX 10 ;S(LOT) PARAMETER.
|
|||
|
HEX 08 ;L(ENGTH) PARAMETER.
|
|||
|
HEX 04 ;R(ECORD # OR R(EL FIELD POS'N).
|
|||
|
HEX 02 ;B(YTE) PARAMETER.
|
|||
|
HEX 01 ;A(DDRESS) PARAMETER.
|
|||
|
HEX C0 ;C(OMMAND).
|
|||
|
HEX A0 ;I(NPUT).
|
|||
|
HEX 90 ;O(UTPUT).
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* TABLE OF VALID RANGES ASSOC
|
|||
|
* WITH EACH OPTION CHARACTER.
|
|||
|
* ($A955 - $A970)
|
|||
|
* (THESE VALUES ARE FREQUENTLY
|
|||
|
* CHANGED IN AN EFFORT TO
|
|||
|
* "ENCHANCE" DOS OR IMPLEMENT
|
|||
|
* A PROTECTION SCHEME. FOR
|
|||
|
* EXAMPLE, THE UPPER RANGE ASSOC
|
|||
|
* WITH THE L-PARAMETER IS OFTEN
|
|||
|
* CHANGED TO ALLOW DOS TO HANDLE
|
|||
|
* LARGER FILES.
|
|||
|
*=================================
|
|||
|
|
|||
|
OPTNRNG HEX 0000FE00 ;($A955 - $A958) V: (0 - 254).
|
|||
|
HEX 01000200 ;($A959 - $A95C) D: (1 - 2).
|
|||
|
HEX 01000700 ;($A95D - $A960) S: (1 - 7).
|
|||
|
HEX 0100FF7F ;($A961 - $A964) L: (1 - 32767).
|
|||
|
HEX 0000FF7F ;($A965 - $A968) R: (0 - 32767).
|
|||
|
HEX 0000FF7F ;($A969 - $A96C) B: (0 - 32767).
|
|||
|
HEX 0000FFFF ;($A96D - $A970) A: (0 - 65535).
|
|||
|
|
|||
|
|
|||
|
*==================================
|
|||
|
* TEXT TABLE OF DOS ERROR MESSAGES.
|
|||
|
* ($A971 - $AA3E)
|
|||
|
* NOTE THAT ONLY THE LAST CHARACTER
|
|||
|
* OF EACH TEXT MESSAGE IS WRITTEN
|
|||
|
* IN NEGATIVE ASCII FORM. (THESE
|
|||
|
* MESSAGES ARE FREQUENTLY ALTERED
|
|||
|
* IN COMMERCIAL PROGRAMS.)
|
|||
|
*==================================
|
|||
|
|
|||
|
;CORRESPONDING ERROR CODE & ADDRS
|
|||
|
ERRTXTBL HEX 0D078D ; 0 ($A971 - $A973)
|
|||
|
;<CR>, <BELL>, <CR>
|
|||
|
DCI 'LANGUAGE NOT AVAILABLE' ;1 ($A974 - $A989)
|
|||
|
DCI 'RANGE ERROR' ; 2&3 ($A98A - $A994)
|
|||
|
;BAD FM OPCODE OR SUBCODE ELSE,
|
|||
|
;ILLEGAL ARGUMENTS ISSUED 4 IN#,
|
|||
|
;PR#, MAXFILES CMDS OR FOR A, B,
|
|||
|
;R, L, S, D, V, C, I, OR O OPT'NS
|
|||
|
DCI 'WRITE PROTECTED' ; 4 ($A995 - $A9A3)
|
|||
|
DCI 'END OF DATA' ; 5 ($A9A4 - $A9AE)
|
|||
|
DCI 'FILE NOT FOUND' ; 6 ($A9AF - $A9BC)
|
|||
|
DCI 'VOLUME MISMATCH' ; 7 ($A9BD - $A9CB)
|
|||
|
DCI 'I/O ERROR' ; 8 ($A9CC - $A9D4)
|
|||
|
DCI 'DISK FULL' ; 9 ($A9D5 - $A9DD)
|
|||
|
DCI 'FILE LOCKED' ; 10 ($A9DE - $A9E8)
|
|||
|
DCI 'SYNTAX ERROR' ; 11 ($A9E9 - $A9F4)
|
|||
|
DCI 'NO BUFFERS AVAILABLE' ; 12 ($A9F5 - $AA08)
|
|||
|
DCI 'FILE TYPE MISMATCH' ; 13 ($AA09 - $AA1A)
|
|||
|
DCI 'PROGRAM TOO LARGE' ; 14 ($AA1B - $AA2B)
|
|||
|
DCI 'NOT DIRECT COMMAND' ; 15 ($AA2C - $AA3D)
|
|||
|
HEX 8D ;<CR> NO CODE ($AA3E)
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* TABLE OF OFFSETS TO THE ERROR
|
|||
|
* MSG TEXT TABLE ($AA3F - $AA4E).
|
|||
|
* (HACKERS OFTEN SWAP THESE BYTES
|
|||
|
* AROUND SO ERRONEOUS ERROR MSGS
|
|||
|
* WILL BE USED.)
|
|||
|
*=================================
|
|||
|
|
|||
|
OFF2ERR HEX 00 ;ERROR CODE - 0
|
|||
|
HEX 03 ; - 1
|
|||
|
HEX 19 ; - 2
|
|||
|
HEX 19 ; - 3
|
|||
|
HEX 24 ; - 4
|
|||
|
HEX 33 ; - 5
|
|||
|
HEX 3E ; - 6
|
|||
|
HEX 4C ; - 7
|
|||
|
HEX 5B ; - 8
|
|||
|
HEX 64 ; - 9
|
|||
|
HEX 6D ; - 10
|
|||
|
HEX 78 ; - 11
|
|||
|
HEX 84 ; - 12
|
|||
|
HEX 98 ; - 13
|
|||
|
HEX AA ; - 14
|
|||
|
HEX BB ; - 15
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* DOS MAIN ROUTINE VARIABLES.
|
|||
|
* ($AA4F - $AA65)
|
|||
|
*=================================
|
|||
|
|
|||
|
CURFNADR DS 2 ;PTS TO CURRENT FILENAME BUF
|
|||
|
;(USUALLY PRIMFNBF, $AA75).
|
|||
|
;(NORMALLY LOADED FROM FNAMBUFM
|
|||
|
;$B5C3, IN FM PARM LIST).
|
|||
|
CONDNFLG DS 1 ;STATUS FLAG:
|
|||
|
;$00 = WARMSTART, $01 = READ
|
|||
|
;$80 = COLDSTART, $C0 = A(RAM).
|
|||
|
OPUTCOND DS 1 ;CHAR SWITCH OUTPUT CONDITION FLG
|
|||
|
; $00 = EVALUATE START OF INPUT
|
|||
|
; LINE.
|
|||
|
; $01 = GOT A DOS CTRL CHAR SO
|
|||
|
; COLLECT DOS COMMAND.
|
|||
|
; $02 = NOT A DOS CMD, SO JUST
|
|||
|
; PRT CHAR & RTN TO CALLER.
|
|||
|
; $03 = HANDLING INPUT OR GET
|
|||
|
; STATMENTS WHILE READING.
|
|||
|
; $04 = WRITING DATA TO DISK.
|
|||
|
; $05 = EVALUATE 1RST CHAR OF
|
|||
|
; DATA LINE READ FROM DSK.
|
|||
|
; $06 = IGNORE "?" PRMPT & RESET
|
|||
|
; TO CONDITION 0.
|
|||
|
CSWTRUE DA COUT1 ;ADR OF TRUE OUTPUT HANDLER.
|
|||
|
KSWTRUE DA KEYIN ;ADR OF TRUE INPUT HANDLER.
|
|||
|
MXFILVAL HEX 0303 ;CURRENT # OF DOS BUFS IN CHAIN
|
|||
|
;(SECOND BYTE IS IRRELEVANT).
|
|||
|
STKSAVED DS 1 ;($AA59) 1RST STACK PTR SAV AREA.
|
|||
|
;(P.S. DON'T CONFUSE WITH THE
|
|||
|
;2ND STK POINTER SAVE AREA KNOWN
|
|||
|
;AS "STKSAV" ($B39B).
|
|||
|
XSAVED DS 1 ;(X) SAVE AREA.
|
|||
|
YSAVED DS 1 ;(Y) SAVE ARE.
|
|||
|
ASAVED DS 1 ;(A) SAVE AREA.
|
|||
|
NDX2INBF DS 1 ;INDEX TO CMD LINE IN INPUT BUF.
|
|||
|
CIOCUMUL DS 1 ;MON/NOMON FLAG.
|
|||
|
;CUMMULATIVE UPDATED RECORD OF
|
|||
|
;C/I/O ARGUMENTS:
|
|||
|
; C=$40, I=$20, O=$10, IO=$30,
|
|||
|
; CO=$50, CI=$60, CIO=$70.
|
|||
|
NDX2CMD DS 1 ;INDEX TO COMMAND.
|
|||
|
LENADRBF DS 2 ;2-BYTE BUF USED 2 HOLD BLOAD ADR
|
|||
|
;& LENGTH READ FROM DISK.
|
|||
|
;(LEFT WITH LNGTH OF LAST BLOAD.)
|
|||
|
NEXTCMD DS 1 ;CODE FOR PENDING COMMAND.
|
|||
|
TEMPBYT DS 1 ;TEMPORARY STORAGE AREA.
|
|||
|
NDX2OPTN DS 1 ;INDEX TO OPTION (USED TO INDEX
|
|||
|
;OPTNTXT, OPTNISSD & OPTNRNG).
|
|||
|
CUMLOPTN DS 1 ;HOLDS CUMMULTIVE RECORD OF
|
|||
|
;OPTIONS PARSED ON CMD LINE.
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* OPTION PARSED VALUES TABLE.
|
|||
|
* ($AA66 - $AA74)
|
|||
|
* (CONTAINS A RECORD OF THE OPTION
|
|||
|
* VALUES THAT WERE ISSUED WITH THE
|
|||
|
* COMMAND. SOME OF THESE BYTES
|
|||
|
* ARE DEFAULTED TO NON-ZERO VALS.)
|
|||
|
*=================================
|
|||
|
|
|||
|
VOLPRSD DS 2 ;PARSED VOLUME NUMBER.
|
|||
|
DRVPRSD DS 2 ;PARSED DRIVE NUMBER.
|
|||
|
SLOTPRSD DS 2 ;PARSED SLOT NUMBER.
|
|||
|
LENPRSD DS 2 ;PARSED LENGTH VALUE.
|
|||
|
RECPRSD DS 2 ;PARSED RECORD OR RELATIVE FIELD
|
|||
|
;POSITION NUMBER.
|
|||
|
BYTPRSD DS 2 ;PARSED BYTE VALUE.
|
|||
|
ADRPRSD DS 2 ;PARSED ADDRESS PARAMETER.
|
|||
|
MONPRSD DS 1 ;PARSED MON/NOMON CHR CODE VALS.
|
|||
|
|
|||
|
|
|||
|
*==================================
|
|||
|
* NON-CHAIN FILE NAME BUFFERS.
|
|||
|
* (PS. DON'T CONFUSE WITH THE
|
|||
|
* VARIOUS FILENAME BUFS ASSOC
|
|||
|
* WITH THE CHAIN OF DOS BUFFERS.)
|
|||
|
*==================================
|
|||
|
|
|||
|
* PRIMARY FILE NAME BUFFER.
|
|||
|
|
|||
|
PRIMFNBF DS 30 ;($AA75 - $AA92)
|
|||
|
|
|||
|
* SECONDARY FILE NAME BUFFER.
|
|||
|
|
|||
|
SCNDFNBF DS 30 ;($AA93 - $AAB0)
|
|||
|
|
|||
|
|
|||
|
*====================================
|
|||
|
* MAIN ROUTINE CONSTANTS & VARIABLES.
|
|||
|
* ($AAB1 - $AAB7)
|
|||
|
*====================================
|
|||
|
|
|||
|
MAXDFLT DS 1 ;DEFAULT VALUE FOR # OF DOS BUFS.
|
|||
|
;(OFTEN ALTERED N COM'CIAL PRGMS)
|
|||
|
DCTRLCHR HEX 84 ;DOS'S CTRL CHAR:
|
|||
|
; NORMALLY = CTRL-D, $84.
|
|||
|
;(OFTEN CHNGD IN COM'CIAL PRGMS)
|
|||
|
EXECFLAG DS 1 ;EXEC FLAG: $00 = NOT EXECING,
|
|||
|
;(ELSE CONTAINS 1RST CHAR OF NAME
|
|||
|
;OF EXEC FILE).
|
|||
|
EXECBUFF DS 2 ;PTS TO EXEC FILE'S BUFFER.
|
|||
|
ACTBSFLG DS 1 ;ACTIVE BASIC FLAG (INT=$00,
|
|||
|
;A(ROM)=$40, A(RAM)=$80).
|
|||
|
RUNTRUPT DS 1 ;RUN INTERCEPTED FLAG:
|
|||
|
;$00 = RUN NOT INTECEPTED.
|
|||
|
;NON-ZERO = RUN INTERCEPTED TO DO
|
|||
|
; A LOAD.
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* TEXT OF THE WORD "APPLESOFT".
|
|||
|
* ($AAB8 - $AAC0)
|
|||
|
*=================================
|
|||
|
|
|||
|
APLSFTXT ASC "APPLESOFT"
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* FILE MANAGER'S CONSTANTS TABLE.
|
|||
|
* ($AAC1 - $AAC8)
|
|||
|
*=================================
|
|||
|
|
|||
|
ADRIOB DA IBTYPE ;PTS TO RWTS'S IOB. NOTE:THE $3E3
|
|||
|
;VECTOR LOADS FROM ADRIOB.
|
|||
|
ADRVTOC DA VTOCBUFF ;PTS TO VTOC SECTOR BUFFER.
|
|||
|
ADRDIRBF DA DIRECBUF ;PTS TO DIRECTORY SECTOR BUFFER.
|
|||
|
DOSNDPL1 DA $C000 ;PTS TO LAST BYTE OF DOS PLUS 1.
|
|||
|
|
|||
|
|
|||
|
*======================================
|
|||
|
* FILE MANAGER'S FUNCTION HNDLR ENTRY
|
|||
|
* POINT TABLE ($AAC9 - $AAE4).
|
|||
|
* (ALL ADDRS ARE 1 LESS THAN THE ACTUAL
|
|||
|
* ENTRY POINT BECAUSE THE THE FUNCTIONS
|
|||
|
* ARE ENTERED VIA A "STACK JUMP".)
|
|||
|
*======================================
|
|||
|
|
|||
|
FMFUNCTB DA $B37F-1 ;NULL - EXIT WITH NO ERRORS.
|
|||
|
DA $AB22-1 ;FNOPEN-1
|
|||
|
DA $AC06-1 ;FNCLOSE-1
|
|||
|
DA $AC58-1 ;FNREAD-1
|
|||
|
DA $AC70-1 ;FNWRITE-1
|
|||
|
DA $AD2B-1 ;FNDELETE-1
|
|||
|
DA $AD98-1 ;FNCATLOG-1
|
|||
|
DA $ACEF-1 ;FNLOCK-1
|
|||
|
DA $ACF6-1 ;FNUNLOCK-1
|
|||
|
DA $AC3A-1 ;FNRENAME-1
|
|||
|
DA $AD12-1 ;FNPOSN-1
|
|||
|
DA $AE8E-1 ;FNINIT-1
|
|||
|
DA $AD18-1 ;FNERIFY-1
|
|||
|
DA $B37F-1 ;NULL - EXIT WITH NO ERRORS.
|
|||
|
|
|||
|
|
|||
|
*====================================
|
|||
|
* FILE MANAGER READ-SUBFUNCTION ENTRY
|
|||
|
* POINT TABLE ($AAE5 - $AAF0).
|
|||
|
* (P.S. SUBFUNCTIONS EMPLOYING THE
|
|||
|
* POSITION OPTION ARE AVAILABLE TO
|
|||
|
* THE USER BUT NEVER CALLED BY DOS.)
|
|||
|
*====================================
|
|||
|
|
|||
|
;SUBFUNCTION INDEX.
|
|||
|
RDSUBTBL DA GOODFMXT-1 ;(0), EXIT.
|
|||
|
DA READONE-1 ;(1), READ ONE BYTE.
|
|||
|
DA READRNG-1 ;(2), READ A RANGE OF BYTES.
|
|||
|
DA PSNRDONE-1 ;(3), POSITION & READ ONE BYTE.
|
|||
|
DA PSNRDRNG-1 ;(4), POS'N & READ RNGE OF BYTES.
|
|||
|
DA GOODFMXT-1 ;(5), EXIT.
|
|||
|
|
|||
|
|
|||
|
*=====================================
|
|||
|
* FILE MANAGER WRITE SUBFUNCTION ENTRY
|
|||
|
* POINT TABLE ($AAF1 - $AAFC).
|
|||
|
* (P.S. SUBFUNCTIONS EMPLOYING THE
|
|||
|
* POSITION OPTION ARE AVAILABLE TO
|
|||
|
* THE USER BUT NEVER CALLED BY DOS.)
|
|||
|
*=====================================
|
|||
|
|
|||
|
;SUBFUNCTION INDEX.
|
|||
|
WRSUBTBL DA GOODFMXT-1 ;(0), EXIT.
|
|||
|
DA WRITEONE-1 ;(1), WRITE ONE BYTE.
|
|||
|
DA WRITERNG-1 ;(2), WRITE A RANGE OF BYTES.
|
|||
|
DA PSNWRONE-1 ;(3), POSITION & WRITE ONE BYTE.
|
|||
|
DA PSNWRRNG-1 ;(4), POS'N & WRITE RNG OF BYTES.
|
|||
|
DA GOODFMXT-1 ;(5), EXIT.
|
|||
|
|
|||
|
|
|||
|
*=========================================
|
|||
|
* FILE MANAGER EXTERNAL ENTRY POINT.
|
|||
|
* -NOTE: THE $3D6 VECTOR LOADS FROM HERE!!
|
|||
|
* -ENABLES USER TO ACCESS FILE MANAGER
|
|||
|
* FROM CUSTOM ASSEMBLY LANGUAGE ROUTINES.
|
|||
|
*=========================================
|
|||
|
|
|||
|
FMXTNTRY CPX #0
|
|||
|
BEQ FMXTCMD ;ALLOW NEW FILE-SIMUL8 AN "INIT".
|
|||
|
LDX #02 ;REQUIRES OLD FILE (SIMUL8 LOAD).
|
|||
|
FMXTCMD STX NDX2CMD ;SET INDEX TO COMMAND.
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* FILE MANAGER PROPER.
|
|||
|
*---------------------------------
|
|||
|
|
|||
|
FILEMGR TSX ;SAVE STK PTR SO WE CAN LATER RTN
|
|||
|
STX STKSAV ;TO AFTRFUNC ($A6AB) LOCATED IN
|
|||
|
;THE FMDRIVER ROUTINE ($A6A8).
|
|||
|
;(NOTE THAT APPEND CMD EMPLOYS
|
|||
|
;THE RSETPTRS ROUTINE ($B6B3) TO
|
|||
|
;RE-ADJUST STKSAV ($B39B) SO THAT
|
|||
|
;EXECUTION ACTUALLY RETURNS TO
|
|||
|
;AFTRCMD ($A6AB) LOCATED IN THE
|
|||
|
;DOS CMD PARSING AND PROCESSING
|
|||
|
;ROUTINES.)
|
|||
|
JSR RSTRFMWA ;COPY FM WRK BUF (IN DOS CHAIN) 2
|
|||
|
;FM WRK AREA (NOT IN DOS CHAIN).
|
|||
|
LDA OPCODEFM ;CHK IF OPCODE IS LEGAL.
|
|||
|
CMP #13 ;(MUST BE LESS THAN 13.)
|
|||
|
BCS TOERROP ;OPCODE TOO LARGE - RANGE ERROR.
|
|||
|
ASL ;DOUBLE VAL OF OPCODE & PUT IT IN
|
|||
|
TAX ;(X) SO IT INDEXES TABLE OF ADRS.
|
|||
|
LDA FMFUNCTB+1,X ;STICK ADDRESS (MINUS 1) OF THE
|
|||
|
PHA ;FUNCTION HANDLER ON THE STACK
|
|||
|
LDA FMFUNCTB,X ;(HI BYTE FIRST).
|
|||
|
PHA
|
|||
|
RTS ;DO A STACK JMP TO THE FUNCTION'S
|
|||
|
;ENTRY POINT.
|
|||
|
|
|||
|
TOERROP JMP RNGERROP ;GO HANDLE RANGE ERROR.
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* OPEN FUNCTION HANDLER.
|
|||
|
*=================================
|
|||
|
|
|||
|
FNOPEN JSR COMNOPEN ;OPEN PREEXISTING FILE OR CREATE
|
|||
|
;NEW FILE IF CMD ALLOWS NEW FILES
|
|||
|
JMP GOODFMXT ;EXIT CLEANLY. EVENTUALLY RTNS TO
|
|||
|
;AFTRFUNC ($A6AB) LOCATED IN THE
|
|||
|
;FM DRIVER ROUTINE ($A6A8).
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* COMMON OPEN ROUTINE.
|
|||
|
*=================================
|
|||
|
|
|||
|
COMNOPEN JSR ZWRKAREA ;INITIALIZE THE FM WORK AREA WITH
|
|||
|
;DEFAULT VALUES.
|
|||
|
;(DON'T CONFUSE WITH FM WRK BUF
|
|||
|
;WHICH IS IN DOS BUF CHAIN.)
|
|||
|
LDA #1 ;DESCRIBE SECTOR LENGTH AS 256
|
|||
|
STA SECSIZWA+1 ;BYTES (IN FM WORK AREA).
|
|||
|
|
|||
|
* GET RECORD LENGTH FROM FM PARM
|
|||
|
* LIST & PUT IT IN FM WORK AREA.
|
|||
|
* (DON'T ALLOW A 0 LENGTH. IF
|
|||
|
* ZERO, CHANGE IT TO ONE.)
|
|||
|
|
|||
|
LDX RECLENFM+1
|
|||
|
LDA RECLENFM
|
|||
|
BNE STRECLEN ;NON-ZERO REC LENGTH IS OK.
|
|||
|
CPX #0
|
|||
|
BNE STRECLEN
|
|||
|
INX ;WAS ZERO, MAKE IT ONE INSTEAD.
|
|||
|
STRECLEN STA RECLENWA ;PUT LENGTH IN FM WORK AREA.
|
|||
|
STX RECLENWA+1
|
|||
|
JSR GETFNTRY ;TRY 2 FIND DIRECTORY SEC 4 FILE.
|
|||
|
BCC FILLINWA ;BRNCH IF FOUND DIR SEC WITH SAME
|
|||
|
;NAME IN FILE DESCRIPTION ENTRY.
|
|||
|
|
|||
|
* THE NAMED FILE WAS NOT FOUND IN
|
|||
|
* THE DIRECTORY, SO PREPARE A NEW
|
|||
|
* FILE ENTRY IN CASE THE CMD CAN
|
|||
|
* LEGALLY CREATE A NEW FILE.
|
|||
|
|
|||
|
STX CURDIRNX ;OFFSET TO NEW DESCRIP ENTRY IN
|
|||
|
;CASE WANT TO CREATE A NEW FILE.
|
|||
|
|
|||
|
* CHECK TO SEE IF CMD CAN
|
|||
|
* LEGALLY CREATE A NEW FILE.
|
|||
|
|
|||
|
LDX NDX2CMD ;(X) = INDEX REPRESENTING CMD.
|
|||
|
LDA CMDATTRB,X ;GET 1RST BYTE CONTAINING DESCRIP
|
|||
|
;OF THE COMMAND'S ATTRIBUTES.
|
|||
|
LDX CURDIRNX ;(X)=INDEX FOR A NEW FILE DESCRIP
|
|||
|
;ENTRY INTO DIRECTORY SEC.
|
|||
|
LSR ;(C)=BIT0 OF 1RST ATTRIBUTE BYTE.
|
|||
|
BCS CREATNEW ;IF (C)=1 CMD CAN MAKE NEW FILE.
|
|||
|
|
|||
|
* COMMAND CAN'T CREATE NEW FILE.
|
|||
|
* SEE WHICH LANGUAGE WE'RE USING
|
|||
|
* & EXIT WITH APPROPRIATE ERROR.
|
|||
|
|
|||
|
NEWILLGL LDA CONDNFLG ;$00=WARMSTART, $01=READING,
|
|||
|
;$40=A(RAM), $80=COLDSTART,
|
|||
|
;$C0=INTEGER.
|
|||
|
CMP #$C0 ;IS INTEGER IN ROM?
|
|||
|
BNE TOFILNOT ;NO.
|
|||
|
JMP LNGNOTAV ;HANDLE LANGUAGE-NOT-AVAIL ERROR.
|
|||
|
|
|||
|
TOFILNOT JMP FILENOT ;HANDLE FILE-NOT-FOUND ERROR.
|
|||
|
|
|||
|
|
|||
|
*---------------------------------
|
|||
|
* CREATE A NEW FILE:
|
|||
|
* - INIT FILE SIZE = 1 SEC LONG.
|
|||
|
* - ALLOCATE SECS FOR DATA SECS
|
|||
|
* & UPDATE FILE SIZE.
|
|||
|
* - WRITE UPDATED VTOC TO DISK.
|
|||
|
* - PUT LINK IN FILE DESCRIPTION
|
|||
|
* ENTRY & UPDATE FILE SIZE.
|
|||
|
* - WRITE UPDATED VTOC TO DISK.
|
|||
|
* - WRITE NEW T/S LIST TO DISK.
|
|||
|
*--------------------------------
|
|||
|
|
|||
|
CREATNEW LDA #0 ;INITIALIZE FILE SIZE = 1 SECTOR.
|
|||
|
STA FIL1SIZE+1,X ;(CAUSE AT 1RST, ONLY STARTING
|
|||
|
LDA #1 ;OUT WITH A T/S LIST SECTOR.)
|
|||
|
STA FIL1SIZE,X
|
|||
|
STX CURDIRNX ;SAVE BYTE OFFSET INTO DIR SEC
|
|||
|
;FOR FILE DESCRIPTION.
|
|||
|
JSR ASGNTKSC ;FIND TRK/SEC VALS FOR NEW FILE.
|
|||
|
|
|||
|
* FINISH SETTING UP PARAMETERS
|
|||
|
* IN THE FILE MANAGER'S WORK AREA.
|
|||
|
* (P.S. DON'T CONFUSE FM WORK AREA
|
|||
|
* WITH THE VARIOUS WORK BUFFERS
|
|||
|
* LOCATED IN THE DOS BUFFER CHAIN.)
|
|||
|
|
|||
|
LDX CURDIRNX ;OFFSET IN DIR SEC 4 NEW DESCRIP
|
|||
|
STA FIL1TSSC,X ;PUT SEC VAL IN DIRECTORY SECTOR.
|
|||
|
STA FIRTSSEC ;PUT SEC VALUE OF 1RST T/S LIST
|
|||
|
;SECTOR IN THE FM WORK AREA.
|
|||
|
STA CURTSSEC ;PUT CUR SEC VAL IN FM WRK AREA.
|
|||
|
LDA ASIGNTRK ;DO THE SAME FOR TRACK VALUE.
|
|||
|
STA FIL1TSTK,X
|
|||
|
STA FIRSTSTK
|
|||
|
STA CURTSTRK
|
|||
|
LDA FILTYPFM ;(FROM FM PARM LIST.)
|
|||
|
STA FIL1TYPE,X ;PUT FILE TYPE IN DIREC SEC BUF.
|
|||
|
|
|||
|
* WRITE DIRECTORY SECTOR BUFFER.
|
|||
|
|
|||
|
JSR WRDIRECT ;WRITE DIRECTORY SEC BUF IN CAT.
|
|||
|
|
|||
|
* WRITE T/S LIST SECTOR BUFFER.
|
|||
|
|
|||
|
JSR SELTSBUF ;GET ADR OF T/S LIST SEC BUF FROM
|
|||
|
;THE FM PARM LIST.
|
|||
|
JSR ZCURBUF ;ZERO OUT T/S LIST SECTOR BUF.
|
|||
|
JSR WRITETS ;WRITE ZEROED OUT T/S LIST SEC.
|
|||
|
;(IF THE WRITE SUBFUNCTION IS
|
|||
|
;LATER ENTERED TO WRITE NEW DATA
|
|||
|
;TO THE DISK, THE ZERO BYTES ARE
|
|||
|
;DETECTED & USED AS SIGNALS THAT
|
|||
|
;NEW DATA PAIR SHOULD BE WRITTEN
|
|||
|
;INTO THE T/S LIST SECTOR.)
|
|||
|
LDX CURDIRNX ;OFFSET IN DIREC SEC 4 NEW FILE.
|
|||
|
LDA #6 ;DEFAULT RETURN CODE VALUE 2 THAT
|
|||
|
STA RTNCODFM ;FOR A FILE-NOT-FOUND ERROR.
|
|||
|
|
|||
|
* FILL IN THE FM WORK AREA BUFFER.
|
|||
|
* (ROUTINE COMMON TO OPENING A
|
|||
|
* NEW OR PRE-EXISTING FILE.)
|
|||
|
|
|||
|
FILLINWA LDA FIL1TSTK,X ;T/S LIST TRK (FRM DIRECTORY SEC)
|
|||
|
STA FIRSTSTK
|
|||
|
LDA FIL1TSSC,X ;T/S LIST SEC (FRM DIRECTORY SEC)
|
|||
|
STA FIRTSSEC
|
|||
|
LDA FIL1TYPE,X ;FILE TYPE (FROM DIRECTORY SEC).
|
|||
|
STA FILTYPFM
|
|||
|
STA FILTYPWA
|
|||
|
LDA FIL1SIZE,X ;FILE SIZE (FROM DIRECTORY SEC).
|
|||
|
STA FILENSEC
|
|||
|
LDA FIL1SIZE+1,X
|
|||
|
STA FILENSEC+1
|
|||
|
STX BYTNXD1R ;INDEX IN2 DIREC SEC FOR DESCRIP.
|
|||
|
LDA #$FF ;PRETEND THAT THE LAST DATA SEC
|
|||
|
STA RELPREV ;USED HAD A RELATIVE SECTOR #
|
|||
|
STA RELPREV+1 ;(IN RELATION TO THE ENTIRE FILE)
|
|||
|
;OF #$FFFF. NOTE: THIS VALUE IS
|
|||
|
;LATER USED TO TRICK THE READ AND
|
|||
|
;WRITE SUBFUNCTIONS INTO IGNORING
|
|||
|
;THE DATA SECTOR CURRENTLY IN
|
|||
|
;MEMORY.
|
|||
|
LDA MXIN1TSL ;DICTATE THAT A T/S LIST CAN ONLY
|
|||
|
STA MXSCURTS ;DESCRIBE $7A (#122) DATA SECS.
|
|||
|
;NOTE: THIS VAL IS LATER USED BY
|
|||
|
;THE READ AND WRITE SUBFUNCTIONS
|
|||
|
;TO DECIDE WHETHER OR NOT THE T/S
|
|||
|
;LIST CURRENTLY IN MEMORY SHOULD
|
|||
|
;BE USED.
|
|||
|
|
|||
|
* READ FIRST T/S LIST SECTOR TO
|
|||
|
* THE T/S LIST SEC BUFFER.
|
|||
|
* (EVENTHOUGH IT IS NOT NEEDED BY
|
|||
|
* THE RENAME, LOCK OR UNLOCK
|
|||
|
* FUNCTIONS, THE FIRST T/S LIST IS
|
|||
|
* AUTOMATICALLY READ INTO THE T/S
|
|||
|
* LIST BUFFER IF THE FILE WAS
|
|||
|
* FOUND.)
|
|||
|
|
|||
|
CLC ;(C)=0 =SIGNAL 1RST T/S LIST SEC.
|
|||
|
JMP READTS ;GO READ IN THE T/S LIST SEC.
|
|||
|
|
|||
|
|
|||
|
*==================================
|
|||
|
* INITIALIZE (IE. ZERO OUT) THE FM
|
|||
|
* WORK AREA SO IT CAN BE CUSTOMIZED
|
|||
|
* IN ACCORDANCE WITH THE CALLING
|
|||
|
* FUNCTION. (ALTHOUGH SOME WORK
|
|||
|
* BYTES MAY NOT BE SUBSEQUENTLY
|
|||
|
* ALTERED, DON'T BE LULLED INTO
|
|||
|
* THINKING THAT THEY ARE NOT
|
|||
|
* IMPORTANT. ZERO VALUES ARE JUST
|
|||
|
* AS RELEVANT AS NON-ZERO VALUES.
|
|||
|
* ALSO BE CAUTIONED NOT TO CONFUSE
|
|||
|
* THE FM WORK AREA WITH ITS IMAGE
|
|||
|
* (DOS WORK BUFFER) THAT IS HOUSED
|
|||
|
* IN THE CHAIN OF DOS BUFFERS.)
|
|||
|
*==================================
|
|||
|
|
|||
|
* ZERO OUT THE FM WORK AREA.
|
|||
|
|
|||
|
ZWRKAREA LDA #0
|
|||
|
TAX ;INITIALIZE X-INDEX.
|
|||
|
ZEROWRKA STA FMWKAREA,X ;PUT $00 BYTE IN WORK AREA.
|
|||
|
INX
|
|||
|
CPX #45 ;WORK AREA IS 45 BYTES LONG.
|
|||
|
BNE ZEROWRKA
|
|||
|
|
|||
|
* BEGIN CUSTOMIZING THE WORK AREA.
|
|||
|
* GET VOL, DRV, SLOT & CATALOG TRK
|
|||
|
* VALUES FROM THE FM PARM LIST.
|
|||
|
* PUT DRV, SLOT*16, CAT TRK AND
|
|||
|
* COMPLEMENTED VOL # IN THE WORK
|
|||
|
* AREA.
|
|||
|
|
|||
|
LDA VOLFM ;VOLUME #.
|
|||
|
EOR #$FF ;CALC 1'S COMPLEMENT OF VOL #.
|
|||
|
STA VOLWA
|
|||
|
LDA DRVFM ;DRIVE #.
|
|||
|
STA DRVWA
|
|||
|
LDA SLOTFM ;GET SLOT #.
|
|||
|
ASL ;CALC SLOT * 16.
|
|||
|
ASL
|
|||
|
ASL
|
|||
|
ASL
|
|||
|
TAX ;SET (X) = SLOT*16.
|
|||
|
STX SLOT16WA
|
|||
|
LDA #$11 ;NORMAL CAT TRK = #17.
|
|||
|
STA TRKWA
|
|||
|
RTS
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* CLOSE FUNCTION HANDLER.
|
|||
|
*=================================
|
|||
|
|
|||
|
FNCLOSE JSR CKDATUP ;WRITE DATA SEC BUF IF NECESSARY.
|
|||
|
JSR CKTSUPDT ;WRITE T/S LIST SEC BUF IF NEC.
|
|||
|
JSR FIXMAP ;FREE UP SECS THAT WERE ALLOCATED
|
|||
|
;BUT NOT USED. WHENEVER SOMETHING
|
|||
|
;IS WRITTEN 2 THE DISK, THE WHOLE
|
|||
|
;TRK IS ALLOCATED IN THE VTOC
|
|||
|
;WHETHER IT IS NEEDED OR NOT.
|
|||
|
;THERE4, ONCE DONE WRITING, GO
|
|||
|
;BACK & FREE UP UNNEEDED SECS.
|
|||
|
|
|||
|
* WAS LAST OPERATION A WRITE?
|
|||
|
|
|||
|
LDA #%00000010 ;IF BIT 1 SET, THEN WAS WRITE.
|
|||
|
AND UPDATFLG
|
|||
|
BEQ TOGDFMXT ;WASN'T A WRITE SO CAN JUST EXIT
|
|||
|
;CAUSE NO NEED TO UPDATE DIR SEC.
|
|||
|
|
|||
|
* LAST OPERATION WAS A WRITE, SO
|
|||
|
* BETTER PREPARE TO FIX UP THE
|
|||
|
* FILE-SIZE BYTES AND T/S LINKS
|
|||
|
* IN DIRECTORY SECTORS, ETC.
|
|||
|
|
|||
|
JSR READVTOC ;READ VOLUME TABLE OF CONTENTS.
|
|||
|
|
|||
|
* READ IN ALL DIR SECS UP TO THE
|
|||
|
* ONE CONTAINING THE FILE DESCRIP
|
|||
|
* ENTRY FOR THE FILE WE ARE CLOSING.
|
|||
|
|
|||
|
LDA #0
|
|||
|
CLC ;(C)=0=SIGNAL 2 READ 1RST DIR SEC
|
|||
|
PURGEDIR JSR RDDIRECT ;GO READ A DIRECTORY SEC.
|
|||
|
SEC ;(C)=1, 1RST DIR SEC ALREADY READ
|
|||
|
DEC SECNXD1R ;INDEX FOR # OF DIRECTORY SECS.
|
|||
|
BNE PURGEDIR ;IF 0, THEN JUST READ DIREC SEC
|
|||
|
;PERTAINING TO THE FILE WANTED.
|
|||
|
|
|||
|
* UPDATE THE FILE SIZE & WRITE THE
|
|||
|
* DIRECTORY SECTOR TO THE DISK.
|
|||
|
|
|||
|
LDX BYTNXD1R ;(X) = OFFSET OF FILE DESCRIPTION
|
|||
|
;IN THE DIRECTORY SECTOR.
|
|||
|
LDA FILENSEC ;# SECS IN FILE (FRM FM WRK AREA)
|
|||
|
STA FIL1SIZE,X
|
|||
|
LDA FILENSEC+1
|
|||
|
STA FIL1SIZE+1,X
|
|||
|
JSR WRDIRECT ;WRITE UPDATED DIRECTORY SECTOR.
|
|||
|
|
|||
|
TOGDFMXT JMP GOODFMXT ;CLEAN EXIT. EVENTUALLY RTNS TO
|
|||
|
;AFTRFUNC ($A6AB) LOCATED IN THE
|
|||
|
;FMDRIVER ROUTINE ($A6A8).
|
|||
|
|
|||
|
|
|||
|
*=================================
|
|||
|
* RENAME FUNCTION HANDLER.
|
|||
|
*=================================
|
|||
|
|
|||
|
FNRENAME JSR COMNOPEN ;LOCATE FILE WITH SAME NAME & OPN
|
|||
|
;IT IF ITS NOT ALREADY OPEN.
|
|||
|
LDA FILTYPWA ;GET FILE TYPE (FROM WORK AREA).
|
|||
|
BMI TOFILOCK ;ERROR-CAN'T RENAME A LOCKED FILE
|
|||
|
LDA RENAMBUF ;GET ADR OF SECONDARY NAME BUFFER
|
|||
|
STA A4L ;FROM FM PARM LIST & PUT IN A4L/H
|
|||
|
LDA RENAMBUF+1
|
|||
|
STA A4L+1
|
|||
|
LDX CURDIRNX (X) = INDEX INTO CURRENT DIR SEC.
|
|||
|
JSR NWDESCRP ;COPY NEW NAME TO DIREC SEC BUF.
|
|||
|
JSR WRDIRECT ;WRIT MODIFIED DIR SEC BUF 2 DSK.
|
|||
|
JMP GOODFMXT ;TAKE THE GOOD ROUTE HOME.
|
|||
|
;EVENTUALLY RETURNS TO AFTRFUNC
|
|||
|
;LOCATED IN FMDRIVER RTN ($A6A8).
|
|||
|
|