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