*=================================== * 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) ;, , 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 ; 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