textfiles/apple/ANATOMY/t.dos.a851.ac57.txt

843 lines
25 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

*===================================
* 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).
F