*====================================== * THE MON AND NOMON COMMAND HANDLERS. *====================================== * NOTE: THE MON & NOMON COMMANDS AND * THEIR ALPHABETIC ARGUMENTS (C,I,O) * ARE FIRST DETECTED VIA COMMAND * PARSING. CIOCUMUL IS TESTED AT THE * DSPLYCHR ($9F9F) PORTION OF THE VIDEO * PARSING ROUTINE TO SEE IF A CHAR * SHOULD BE SENT TO THE SCREEN OR * NOT. IT IS EASY TO BECOME CONFUSED * OVER THE DISTINCTION BETWEEN * CIOCUMUL AND MONPRSD. THE FORMER * REPRESENTS THE CUMMULATIVE UPDATED * RECORD OF THE C, I, O ARGUMENTS * WHEREAS THE LATER DESCRIBES THE * MOST RECENT ADDITIONS OF THE * C, I, O ARGUMENTS PRESENT IN THE * TABLE OF PARSED VALUES. * THE ALPHABETIC ARUMENTS (C, I, O) * ARE REPRESENTED BY THE FOLLOWING * SPECIFIC BITS: * C = $40 = %01000000 * I = $20 = %00100000 * O = $10 = %00010000 * COMBINATION OF ARGUMENTS ARE SIMPLY * DESCRIBED BY THE APPROPRIATE BIT * SETTINGS: EX. CIO = $70 = $01110000 CMDMON LDA CIOCUMUL ;GET PREV CUMMULATIVE RECORD AND ORA MONPRSD ;MERGE WITH THE LATEST PARSED VAL STA CIOCUMUL ;TO UPDATE CUMMULATIVE RECORD. RTS ;RTN 2 THE CALLER OF THE MON CMD. ;(OFTEN RETURNS 2 AFTRCMD ($A17D) ;ASSOCIATED WITH THE COMMAND ;PARSING & PROCESSING ROUTINES.) CMDNOMON BIT MONPRSD ;TEST BIT6 IN PARSED TBL TO SEE IF ;"NOMON C" IS SELECTED. BVC CLRMON ;BRANCH IF "C" NOT INCLUDED. JSR CRVIADOS ;"C" WAS INCLUDED, SO PRT ;CAUSE CMD (BUT NOT ) WAS ;ALREADY PRINTED. CLRMON LDA #%01110000 ;SHUT OFF BITS IN PARSED TABLE EOR MONPRSD ;THAT CORRESPOND 2 THE ALPHABETIC ;ARGUMENTS ISSUED WITH NOMON CMD. AND CIOCUMUL ;NOW MAKE SURE THAT THOSE BITS STA CIOCUMUL ;ARE OFF IN CUMMULATIVE RECORD. RTS ;RTN TO CALLER OF THE NOMON CMD. ;(OFTEN RETURNS 2 AFTRCMD ($A17D) ;ASSOCIATED WITH THE COMMAND ;PARSING & PROCESSING ROUTINES.) *================================== * THE MAXFILES COMMAND HANDLER. *================================== * THE MAXFILES COMMAND IS USED TO * DEFINE THE # OF FILES THAT MAY * BE OPENED AT ONE TIME (IE. 1-16). * A DEFAULT VALUE OF 3 IS USED FOR * COLDSTARTS (IE, WHEN THE DISK IS * BOOTED) OR WHEN THE FP OR INT * COMMANDS ARE ISSUED. THIS VALUE * CAN BE CHANGED BY ALTERING THE * CONTENTS OF $AAB1. (THE MAXFILES * CMD CAN BE TRICKED INTO BUILDING * ITS BUFFERS AT A LOWER LOCATION * IN ORDER TO CREATE A SANCTUARY * WHERE CUSTOM MACHINE LANGUAGE * ROUTINES CAN'T BE OVERWRITTEN BY * BASIC. SEE FORMATTED DIS'MBLY * OF MAXFILES CMD FOR DETAILS.) CMDMXFIL LDA #0 ;SHUT OFF THE EXEC FLG. STA EXECFLAG LDA A5L ;GET ARGUMENT ISSUED WITH CMD AND PHA ;SAVE IT ON THE STK. ;NOTE: ARGUMENT WAS PREVIOUSLY ;SCREENED TO INSURE THAT IS IS ;BTWN 1 AND 16 ($A0AA - $A0C7). JSR CLOSEALL ;CLOSE ALL OPEN FILES. PLA ;RETRIEVE ARGUEMENT ISSUED WITH STA MXFILVAL ;CMD & STORE IT IN THE MAIN ;VARIABLES TABLE. JMP BILDBUFS ;GO BUILD MXFILVAL # OF DOS BUFS. ;RTNS 2 CALLER OF MAXFILES CMD. ;(OFTEN RETURNS 2 AFTRCMD ($A17D) ;ASSOCIATED WITH THE COMMAND ;PARSING & PROCESSING ROUTINES.) *================================= * THE DELETE COMMAND HANDLER. *================================= CMDELETE LDA #5 ;OPCODE FOR DELETE. JSR HNDLCMD1 ;CLOSE THE FILE & RLEASE ITS BUF. ;REASSIGN A DOS BUF TO THE FILE. ;CHNG FILE DESCRP IN DIR SEC BUF. ;WRITE UPDATED DIR SEC BUF 2 DSK. ;FREE UP DATA & T/S LIST SECTORS. ;WRITE UPDATED VTOC TO DISK. JSR GETBUFF ;FIND REASSIGNED DOS BUF. LDY #0 ;FREE UP DOS BUF OF FILE BY TYA ;STORING A $00 IN 1RST BYTE OF STA (A3L),Y ;THE DOS FILE NAME BUFFER. RTS ;EXIT 2 CALLER OF THE DELETE CMD. ;(OFTEN RETURNS 2 AFTRCMD ($A17D) ;ASSOCIATED WITH THE COMMAND ;PARSING & PROCESSING ROUTINES.) *================================== * THE LOCK AND UNLOCK CMD HANDLERS. *================================== CMDLOCK LDA #7 ;LOCK OPCODE. BNE LOKUNLOK ;ALWAYS. CMDUNLOK LDA #8 ;UNLOCK OPCODE. *--------------------------------- * ROUTINE COMMON TO LOCK, UNLOCK * AND VERIFY COMMAND HANDLERS. *--------------------------------- LOKUNLOK JSR HNDLCMD1 ;CALL PART OF THE MAIN COMMAND ;HANDLER ROUTINE TO LOCK, UNLOCK ;OR VERIFY THE FILE. JMP CMDCLOSE ;EXIT COMMAND VIA CLOSE. ;RTN 2 THE CALLER OF THE COMMAND. ;(OFTEN RETURNS 2 AFTRCMD ($A17D) ;ASSOCIATED WITH THE COMMAND ;PARSING & PROCESSING ROUTINES.) *================================= * THE VERIFY COMMAND HANDLER. *================================= CMDVERFY LDA #12 ;VERIFY OPCODE. BNE LOKUNLOK ;GO CALL THE CMD HNDLR TO VERIFY ;FILE & THEN EXIT VIA CLOSE CMD. *================================= * THE RENAME COMMAND HANDLER. *================================= CMDRENAM LDA ADRSFNBF ;COPY ADR OF SECONDARY FILENAME 2 STA RENAMBUF ;RENAME BUF IN FM PARAMETER LIST. LDA ADRSFNBF+1 STA RENAMBUF+1 LDA #9 ;RENAME OPCODE. STA TEMPBYT JSR CLOSIFOP ;CLOSE FILE IF IT IS ALREADY OPEN ;AND THEN DO THE RENAME FUNCTION: ; -COPY NEW FILE NAME 2 DIRECTORY ; SECTOR BUFFER & THEN WRITE THE ; UPDATED DIREC SEC BACK 2 DISK. JMP CMDCLOSE ;EXIT RENAME CMD VIA CLOSE CMD. ;(OFTEN RETURNS 2 AFTRCMD ($A17D) ;ASSOCIATED WITH THE COMMAND ;PARSING & PROCESSING ROUTINES.) *================================= * THE APPEND COMMAND HANDLER. *================================= CMDAPPND JSR CMDOPEN ;GO OPEN THE FILE TO BE APPENDED. READ2END JSR RDTXTBYT ;GO READ A TEXT FILE BYTE. (USE ;THE READ FUNCTION AND READ-ONE- ;BYTE SUBFUNCTION.) BNE READ2END ;TAKE BRANCH IF DEALING WITH A ;VALID (IE. NON-ZERO) DATA BYTE. ;HAVEN'T ENCOUNTERED AN END-OF- ;FILE MARKER ($00) YET,SO GO BACK ;TO READ THE REST OF THE FILE. JMP CKAPFLG ;FOUND END OF FILE,SO NOW GO BACK ;UP THE FILE POINTER IF NECESSARY ;AND EVENTUALLY EXIT THE APPEND ;CMD HANDLER VIA RSETPTRS ($B6B3) ;AND FMEXIT ($B386). NOTE THAT ;RSETPTRS RESETS THE SAVED STACK ;POINTER (STKSAV, $B39B) SO WE ;EVENTUALLY RETURN TO THE CALLER ;OF THE APPEND COMMAND. EXECUTION ;OFTEN RETURNS TO AFTRCMD ($A17D) ;LOCATED IN THE COMMAND PARSING ;AND PROCESSING ROUTINES. *================================= * THE OPEN COMMAND HANDLER. *================================= CMDOPEN LDA #0 ;CODE FOR TEXT FILE. JMP OPNCKTYP ;GO OPEN THE FILE & CHK ITS TYPE. ;RTN 2 THE CALLER OF THE OPEN CMD ;(OFTEN RETURNS 2 AFTRCMD ($A17D) ;ASSOCIATED WITH THE COMMAND ;PARSING & PROCESSING ROUTINES.) *==================================== * COMMON FILE MANAGER CMD HNDLR CODE. *==================================== HNDLCMD LDA #1 ;OPEN OPCODE. HNDLCMD1 STA TEMPBYT ;STORE OPCODE IN TEMPBYT. LDA LENPRSD ;GET L-PARAMETER FROM PARSED TBL. BNE SAVLENFM ;CHECK IF A NON-ZERO L-PARM WAS ;ISSUED WITH THE COMMAND. LDA LENPRSD+1 BNE SAVLENFM LDA #1 ;LNGTH WAS 0 SO MAKE IT 1 INSTEAD STA LENPRSD SAVLENFM LDA LENPRSD ;PUT LENGTH IN FM PARAMETER LIST. STA RECLENFM ;NOTE: RECORD LENGTH = 1 FOR LDA LENPRSD+1 ;SEQUENTIAL FILES, ELSE PARSED STA RECLENFM+1 ;LENGTH FOR RANDOM ACCESS FILES. *---------------------------------- * CLOSE FILE IF IT IS ALREADY OPEN. *---------------------------------- CLOSIFOP JSR CMDCLOSE ;CLOSE IF ALREADY OPEN. LDA A5L+1 ;A5L/H POINTS AT HIGHEST NUMBERED ;(LOWEST IN MEMORY) FREE DOS BUF. BNE SAVFNPTR ;BRANCH IF FOUND A FREE BUFFER. JMP NOBUFERR ;COULDN'T LOCATE A FREE BUFFER SO ;GO ISSUE OUT OF BUF'S MSG. SAVFNPTR STA A3L+1 ;RESET A3L/H TO POINT AT DOS BUF LDA A5L ;THAT WILL USE 4 FILENAME FIELD. STA A3L JSR CPYPFN ;REASSIGN A DOS BUFFER 2 THE FILE ;WE WANT TO OPEN. JSR BUFS2PRM ;GET ADDR'S OF THE VARIOUS DOS ;BUFFERS FROM THE CHAIN BUFFER & ;PUT THEM IN THE FM PARM LIST. JSR CPY2PARM ;PUT VOL, DRV, SLOT & ADDR OF THE ;PRIMARY FILENAME BUFFER IN THE ;FM PARAMETER LIST. LDA TEMPBYT ;GET OPCODE BACK FROM TEMPBYT AND STA OPCODEFM ;STICK IT IN THE FM PARM LIST. JMP FMDRIVER ;USE FILE MANAGER TO DO FUNCTION. *================================= * THE CLOSE COMMAND HANDLER. *================================= CMDCLOSE LDA PRIMFNBF ;GET 1RST CHR FRM PRMRY NAME BUF. CMP #" " ;DON'T ALLOW LEADING SPACES. BEQ CLOSEALL ;LEADING SPC = SIGNAL 2 CLOSE ALL ;FILES. (A CLOSE CMD WAS ISSUED ;WITH NO ACCOMPANYING FILE NAME.) JSR GETBUFF ;LOCATE A DOS BUFFER WITH SAME ;NAME, ELSE LOCATE A FREE BUFFER. EVENTXIT BCS CLOSERTS ;EVENTUALLY EXIT VIA THIS ROUTE!! JSR CLOSEONE ;MATCHING FILENAME WAS FOUND SO ;GO CLOSE THAT FILE. JMP CMDCLOSE ;GO BACK TO POINT A5L/H AT A FREE ;DOS BUFFER & EXIT VIA EVENTXIT ;($A2F4) AND CLOSERTS ($A330). *--------------------------------- * CLOSE A SPECIFIC FILE * (& FREE ITS BUFFER). *--------------------------------- CLOSEONE JSR CKEXCBUF ;CHK IF CURRENT FILENAME BUFFER ;BELONGS TO AN EXEC FILE. BNE FREEBUFF ;BRANCH IF NOT EXECING FROM THIS ;PARTICULAR FILE. NOTE, ALWAYS ;TAKE BRANCH IF CLOSEONE ($A2FC) ;IS ACCESSED VIA CLOSEALL ($A316) LDA #0 ;CLOSING AN EXEC FILE SO SHUT OFF STA EXECFLAG ;THE EXEC FLAG. NOTE:THIS INSTRUC ;IS NEVER CARRIED OUT IF ACCESSED ;VIA CLOSEALL. (AN ACTIVE EXEC ;FILE WAS ALREADY DETECTED AND ;SKIPPED BY THE "BEQ CHKNXBUF" ;INSTRUCTION AT $A323.) FREEBUFF LDY #0 ;FREE UP DOS BUF BY POKING A $00 TYA ;IN 1RST BYT OF DOS FILENAME BUF. STA (A3L),Y JSR BUFS2PRM ;GET ADDR'S OF THE VARIOUS DOS ;BUFS FROM THE CHAIN BUF & PUT ;THEM IN THE FM PARAMETER LIST. LDA #2 ;PUT OPCODE FOR CLOSE FUNCTION STA OPCODEFM ;IN THE FM PARAMETER LIST. JMP FMDRIVER ;GO TO THE FILE MANAGER DRIVER TO ;DO THE CLOSE FUNCTION. *--------------------------------------- * CLOSE ALL FILES (EXCEPT AN EXEC FILE). * ENTER CLOSEALL WHEN IT IS ACCESSED VIA * A DIRECT CALL OR IF THE FIRST CHAR IN * THE PRIMAY FILENAME FIELD WAS A SPACE. *--------------------------------------- CLOSEALL JSR GETFNBF1 ;PUT ADR OF 1RST DOS FILENAME BUF ;(LOCATED IN CHAIN OF DOS BUFS) ;IN THE A3L/H POINTER. BNE CKIFEXEC ;ALWAYS. CHKNXBUF JSR GETNXBUF ;GET ADR OF NEXT DOS FILENAME BUF ;FROM DOS CHAIN POINTERS BUFFER ;(OFFSET 37 & 36 BYTES FROM 1RST ;CHR OF PRESENT DOS FILENAME BUF) BEQ CLOSERTS ;LNK ZEROED OUT -ALL FILES CLOSED ;(EXIT CLOSEALL VIA THIS ROUTE.) CKIFEXEC JSR CKEXCBUF ;CHK IF CURRENT DOS FILENAME BUF ;BELONGS TO TO AN EXEC FILE. BEQ CHKNXBUF ;EXEC ACTIVE SO DON'T CLOSE ITS ;BUFFER OUT OR WILL END UP ;IN NEVER-NEVER LAND. AFTER ALL, ;DON'T WANT TO CLOSE BUFFER IF WE ;ARE USING IT 2 EXEC (IE. WOULD ;BE LIKE BURYING SELVES ALIVE)!! JSR GETFNBY1 ;GET 1RST BYTE IN DOS NAME BUF. BEQ CHKNXBUF ;THIS FILE IS ALREADY CLOSED SO ;GO BACK TO CLOSE REST OF FILES. JSR CLOSEONE ;FILE WAS OPEN SO GO CLOSE IT. JMP CLOSEALL ;GO TO CLOSERTS VIA CLOSEALL!!! CLOSERTS RTS ;EXIT TO CALLER OF THE CLOSE CMD. ;(OFTEN EXITS TO AFTRCMD ($A17D) ;LOCATED IN THE COMMAND PARSING & ;PROCESSING ROUTINES.) *================================= * THE BSAVE COMMAND HANDLER. *================================= CMDBSAVE LDA #%00001001 ;TEST BITS0 & 3 OF CUMLOPTN 2 SEE AND CUMLOPTN ;IF A(DDR) & L(ENGTH) PARAMETERS CMP #%00001001 ;WERE ISSUED WITH THE BSAVE CMD. BEQ DOBSAV ;BOTH A- & L-PARMS PRESENT. JMP CKIFCTRL ;GOT A SYNTAX ERROR. DOBSAV LDA #4 ;CODE FOR BINARY FILE. JSR OPNCKTYP ;CLOSE (IF NECESSARY) & THEN OPN. LDA ADRPRSD+1 ;PREPARE TO WRITE ADDR TO DISK. LDY ADRPRSD JSR WRADRLEN ;CALL WRITE-ONE-BYTE SUBFUNCTION ;TWICE TO PUT A(DDR)-PARAMETER IN ;DATA SEC BUF. (NOTE: LEN2RDWR IS ;USED AS A TEMPORAY BUFFER FOR ;FOR DATA TRANSFER.) LDA LENPRSD+1 ;PREPARE TO WRITE FILE LENGTH. LDY LENPRSD JSR WRADRLEN ;CALL WRITE-ONE-BYTE SUFUNCTION 2 ;WRITE LENGTH AS THE 3RD & 4TH ;BYTES IN THE DATA SEC BUF. ;(LATER BUF WRITTEN AS 1RST SEC ;OF FILE. LEN2RDWR IS AGAIN USED ;AS A TEMP BUF 4 DATA TRANSFER.) * NOW PREPARE TO WRITE THE REST * OF THE BINARY FILE TO THE DISK. LDA ADRPRSD+1 ;PUT ADDR OF SOURCE BUFFER IN LDY ADRPRSD ;THE FM PARAMETER LIST. JMP RDWRANGE ;GO TO WRITE-RANGE ROUTINE TO ;WRITE REST OF FILE TO THE DISK. ;(FILE IS ALSO VERIFIED AND THEN ;EXITED VIA THE CLOSE COMMAND.) ;EXECUTION EVENTUALLY RETURNS TO ;THE CALLER OF THE BSAVE COMMAND. ;OFTEN, RETURNS 2 AFTRCMD ($A17D) ;LOCATED IN THE CMD PARSING AND ;PROCESSING ROUTINES. *================================= * BLOAD COMMAND HANDLER *================================= CMDBLOAD JSR HNDLCMD ;CALL THE FM COMMAND HANDLER TO ;OPEN THE FILE. * COMPARE FILE TYPE WANTED * WITH FILE TYPE FOUND. LDA #$7F ;STRIP LOCK BIT FROM FILE TYPE AND FILTYPFM ;FOUND (VIA OPEN FUNCTION). CMP #4 ;WAS FILE FOUND A BINARY FILE? BEQ ADR4BLOD ;YES. JMP TYPMISM ;NO - GO ISSUE FILE-MISMATCH MSG. * REDUNDANT CODE! CLOSE (IF NECESSARY) * AND THEN OPEN THE FILE AGAIN. ADR4BLOD LDA #4 ;CODE FOR BINARY FILE. JSR OPNCKTYP ;CLOSE & REOPEN FILE. JSR RDADRLEN ;READ THE BLOAD ADR FROM THE DISK ;INTO LEN2RDWR. TAX ;X=LOW BYTE OF BLOAD ADR FRM DSK LDA CUMLOPTN ;CHK CUMLOPTN TO SEE IF AN A(DDR) AND #%00000001 ;WAS ISSUED WITH THE BLOAD CMD. BNE LEN4BLOD ;YES -SO IGNORE ADR READ FROM DSK ; & USE THE ACTUAL PARSED ; A-PARAMETER INSTEAD. STX ADRPRSD ;STORE ADR READ FRM DSK IN PARSED STY ADRPRSD+1 ;TABLE. (THIS WAY CAN ALWAYS USE ;VAL IN TABLE FOR BLOAD ADR.) LEN4BLOD JSR RDADRLEN ;READ THE BLOAD LENGTH OFF DSK. ;(PUT RESULTS IN LEN2RDWR.) LDX ADRPRSD ;SET (X)/(Y) = EITHER ORIG PARSED LDY ADRPRSD+1 ;A-PARM ADR OR BLOAD ADR FRM DSK. JMP LODINTFP ;GO READ THE REST OF THE FILE IN. ;EXITS VIA THE CLOSE COMMAND. ;RETURNS TO CALLER OF THE BLOAD ;CMD. (IF BLOAD CMD NOT CALLED BY ;BRUN, THEN OFTEN RTNS TO AFTRCMD ;($A17D) LOCATED IN THE COMMAND ;PARSING & PROCESSING ROUTINES.) *================================= * BRUN COMMAND HANDLER *================================= CMDBRUN JSR CMDBLOAD ;BLOAD THE PRGM. JSR INITIOHK ;POINT THE I/O HOOKS AT DOS. ;NOTE: THIS CAN CREATE SOME ;EXOTIC BUGS IF THE BRUNED PRGM ;PRINTS ANY INFO OR IF "MON" IS ;ACTIVE. SEE FORMATTED DIS'MBLY ;OF BRUN CMD FOR EXPLANATION.) JMP (ADRPRSD) ;BEGIN EXECUTION OF BINARY PRGM. ;EXECUTION NORMALLY RETURNS TO ;AFTRCMD ($A17D) LOCATED IN THE ;CMD PARSING AND PROCESSING ;ROUTINES. ALSO NOTE THAT ;THE COMPUTER MAY HANG ON CERTAIN ;OCCASSIONS. (SEE THE FORMATTED ;DISASSEMBLY OF THE BRUN CMD FOR ;EXPLANATION.) *================================= * SAVE COMMAND HANDLER *================================= CMDSAVE LDA ACTBSFLG ;CHK WHICH BASIC IS ACTIVE. BEQ SAVINTGR ;BRANCH IF USING INTEGER. ;INT=$00, A(ROM)=$40, A(RAM)=$80. LDA PROTFLG ;IF PROTECTION FLAG IS ON (IE. IS ;NEGATIVE), THEN ALL APPLESOFT ;CMDS CAUSE RUN & DOS'S SAVE CMD ;CAUSES A PHONY PROGRAM-TOO-LARGE ;MESSAGE TO BE GENERATED. BPL SAVAPSFT ;BRANCH IF PROTECTION FLG IS OFF. JMP TOOLARGE ;PROTECTED!!! - SPIT OUT PHONY ;PROGRAM-TOO-LARGE MESSAGE & XIT. *--------------------------------- * SAVE AN APPLESOFT FILE *--------------------------------- SAVAPSFT LDA #2 ;CODE FOR APPLESOFT FILE. JSR OPNCKTYP ;GO OPEN THE NAMED FILE & CHECK ;ITS TYPE. SEC ;CALC THE LNGTH OF THE PRGM SO WE LDA PRGEND ;CAN WRITE IT AS 1RST TWO BYTES: SBC TXTTAB ; LENGTH = PRGEND - TXTTAB TAY LDA PRGEND+1 SBC TXTTAB+1 JSR WRADRLEN ;WRITE THE LENGTH OF THE FP FILE ;BY USING THE WRITE-ONE-BYTE ;SUBFUNCTION TWICE. * PREPARE TO WRITE REST OF FILE. LDA TXTTAB+1 ;PRGM START = START OF OUTPUT BUF LDY TXTTAB JMP RDWRANGE ;GO TO THE WRITE-RANGE-OF-BYTES ;ROUTINE 2 WRITE THE REST OF FILE ;AND THEN VERIFY IT. ;AFTER VERIFICATION, THE SAVE CMD ;IS EXITED VIA THE CLOSE CMD. ;EXECUTION THEN RETURNS TO CALLER ;OF THE SAVE CMD. (OFTEN RTNS TO ;AFTRCMD ($A17D) LOCATED IN THE ;DOS CMD PARSING AND PROCESSING ;ROUTINES.) *--------------------------------- * SAVE AN INTEGER FILE *--------------------------------- SAVINTGR LDA #1 ;CODE FOR INTEGER FILE. JSR OPNCKTYP ;GO OPEN THE INTEGER FILE. SEC ;CALC LENGTH OF FILE. LDA HIMEM SBC INTPGMST TAY LDA HIMEM+1 SBC INTPGMST+1 JSR WRADRLEN ;WRITE LNGTH 2 DSK BY CALLING THE ;WRITE-ONE-BYTE SUBFUNCTION TWICE LDA INTPGMST+1 LDY INTPGMST JMP RDWRANGE ;WRITE THE REST OF FILE TO DSK. *================================= * OPEN NAMED FILE & CHECK ITS TYPE *================================= OPNCKTYP STA FILTYPFM ;PUT CODE FOR FILE TYPE IN THE PHA ;FM PARAMETER LIST & SAVE ON STK. ;($00=TXT, $01=INT, $02=FP, ;$04=BIN, $08=S-TYPE, $10=RELOC, ;$20=A-TYPE AND $40=B-TYPE.) JSR HNDLCMD ;USE THE FM CMD HANDLER TO OPEN. PLA ;PULL THE FILE TYPE CODE FRM STK. JMP CHKFTYPE ;GO CHK IF TYPE WNTD = TYPE FOUND *============================================ * WRITE TWO BYTES. *-------------------------------------------- * CODE WHICH WRITES ADDRESS AND LENGTH VALUES * TO THE DATA SECTOR BUFFER. (LATER, THE * DATA SEC BUF IS WRITTEN TO THE DISK.) * CALLS WRITE-ONE-BYTE SUBFUNCTION TWICE. * NOTE THAT LEN2RDWR IS USED AS A TEMPORARY * BUFFER FOR DATA TRANSFER AS SHOWN BELOW: * - LOW BYTE OF ADR OR LENGTH --> LEN2RDWR * --> ONEIOBUF --> DATA SECTOR BUFFER. * - HI BYTE OF ADR OR LENGTH --> LEN2RDWR+1 * --> ONEIOBUF --> DATA SECTOR BUFFER. *============================================ WRADRLEN STY LEN2RDWR ;PUT LOW BYTE IN FM PARM LIST IN ;CASE THIS IS A L-PARM & WE NEED ;IT AS A COUNTER WHEN LATER WRITE ;RANGE OF BYTES TO DISK. STY ONEIOBUF ;PUT BYTE TO WRITE IN PARM LIST. STA LEN2RDWR+1 ;PUT HI BYTE IN FM PARM LIST IN ;CASE THIS IS A L-PARM & WE NEED ;IT AS COUNTER WHEN LATER WRITE ;RANGE OF BYTES TO DISK. LDA #4 ;PUT WRITE OPCODE IN FM PARM LIST STA OPCODEFM LDA #1 ;PUT ONE-BYTE SUBCODE IN PARM LST STA SUBCODFM JSR FMDRIVER ;CALL FM DRV TO WRITE 1RST BYTE. LDA LEN2RDWR+1 ;PUT HI BYTE TO WRITE IN PARM LST STA ONEIOBUF JMP FMDRIVER ;GO WRITE HI BYTE TO FILE. *================================= * READ/WRITE A RANGE OF BYTES *================================= RDWRANGE STY CURIOBUF ;PUT ADR OF OUTPUT BUF IN PRM LST STA CURIOBUF+1 LDA #2 ;SET SUBCODE FOR RANGE OF BYTES. JMP VRFYRWNG ;GO CALL THE FILE MANAGER TO WRITE ;DATA TO THE DISK. NEXT VERIFY ;THE INFO & CLOSE THE FILE. *================================= * CALL FM DRIVER & THEN CLOSE FILE *================================= CLOSEFM JSR FMDRIVER ;CALL THE FM DRIVER 2 READ/WRITE. JMP CMDCLOSE ;GO CLOSE THE FILE. *======================================== * GO ISSUE A FILE-TYPE-MISMATCH ERROR MSG *======================================== TOTYPMIS JMP TYPMISM ;GO HANDLE MISMATCH ERROR. *================================= * LOAD COMMAND HANDLER *================================= CMDLOAD JSR CLOSEALL ;CLOSE ALL FILES (EXCEPT ACTIVE ;EXEC FILE). OPENLOAD JSR HNDLCMD ;GO OPEN THE FILE. LDA #%00100011 ;SET BITS IN (A) TO RESTRICT LOAD ;CMD 2 APLSFT ($02), INTGR ($01) ;OR A-TYPE ($20) FILES. AND FILTYPFM ;TYPE FOUND (VIA OPEN FUNCTION). BEQ TOTYPMIS ;ERR -NOT ONE OF THE ABOVE TYPES. ;GO ISSUE TYPE-MISMATCH ERR MSG. STA FILTYPFM ;SAVE TYPE WANTED IN FM PARM LIST LDA ACTBSFLG ;CHK WHICH LANG IS ACTIVE: ; INT=$00, FP=$40, A(RAM)=$80) BEQ LODINTGR ;BRANCH IF USING INTEGER. LDA #2 ;CODE FOR APPLESOFT (FP). JSR SELCTBSC ;CHK IF TYPE WANTED IS APPLESOFT. JSR RDADRLEN ;READ LENGTH OF THE FP PRGM FROM ;THE 1RST 2 BYTES OF THE FILE. * CHK TO SEE IF THERE IS ENOUGH ROOM * BETWEEN PRGM START POS'N & MEMSIZ * TO ACCOMODATE FILE. CLC ;ADD LNGTH OF FILE 2 START OF PGM ADC TXTTAB ;(NORMALLY, $801). TAX ;SAVE LOW BYTE OF PRGEND IN (X). TYA ;RETRIEVE HI BYTE OF LEN FROM (Y) ADC TXTTAB+1 CMP MEMSIZ+1 BCS TOTOOLRG ;BRANCH IF NOT ENOUGH ROOM. ;(GO ISSUE PRGM-TOO-LARGE MSG.) * PRGM IS SHORT ENOUGH TO BE * ACCOMODATED IN FREE MEMORY SPACE. * * SET ZERO-PAGE POINTERS. STA PRGEND+1 ;SET END OF PRGM POINTER. STA VARTAB+1 ;SET START OF VARIABLE SPACE. STX PRGEND ;PRGEND: VAL IN TXTTAB + LENGTH. STX VARTAB ;VARTAB: VAL IN TXTTAB + LENGTH. LDX TXTTAB LDY TXTTAB+1 JSR LODINTFP ;DESIGNATE WHERE IN FREE MEMORY 2 ;LOAD PRGM & THEN GO LOAD IT. JSR INITIOHK ;POINT THE I/O HOOKS AT DOS. JMP (RLOCNTRY) ;NORMALLY PTS TO SETLINKS ($D4F2) ;ROUTINE IN BASIC WHICH SETS ;IMPORTANT Z-PAGE POINTERS, ;CLEARS OUT VARIABLES, RESETS STK ;PTR & THEN ADJUSTS LINKS IN EACH ;PROGRAM LINE. ;EVENTUALLY, EXECUTION FLOWS INTO ;BSC'S WRMSTART (RESTART, $D43C). ;IF THE LOAD CMD WAS CALLED VIA ;THE RUN CMD, EXECUTION BRANCHES ;BACK 2 THE RUNFPINT ($A4DC) PART ;OF THE RUN CMD (AFTER ADJUSTING ;THE STACK). ;IF LOAD WAS NOT CALLED FROM RUN, ;THEN THE THE RESTART ($D43C) ;PORTION OF BASIC EVENTUALLY ;REQUESTS FURTHER PRGM OR KEYBRD ;INPUT & ANOTHER CMD IS PARSED. *--------------------------------- * LOAD AN INTEGER PROGRAM *--------------------------------- LODINTGR LDA #1 ;CODE 4 INTEGER BASIC FILE TYPE. JSR SELCTBSC ;CHK IF INTEGER BASIC IS ACTIVE. ;IF NOT, SWTCH FROM FP 2 INTEGER. JSR RDADRLEN ;READ 1RST 2 BYTES OF FILE TO GET ;LENGTH OF PRGM TO LOAD. SEC ;CALC START OF PRGRM. LDA HIMEM ;(HIMEM - LENADRBF.) SBC LENADRBF TAX LDA HIMEM+1 SBC LENADRBF+1 BCC TOTOOLRG ;LENGTH > HIMEM SO ISSUE ERR MSG. TAY CPY LOMEM+1 ;CHK IF PRGM < = LOMEM. BCC TOTOOLRG ;START OF PRGM TOO LOW, SO GO BEQ TOTOOLRG ;ISSUE PRGM-TOO-LARGE ERROR MSG. STY INTPGMST+1 ;SET START-OF-PRGM POINTER. STX INTPGMST *================================= * GO DO THE ACTUAL LOAD. * (COMMON LOAD ROUT'N FOR * FP OR INTEGER LOAD CMDS.) *================================= LODINTFP STX CURIOBUF ;DESIGNATE LOAD ADDR AS I/O BUF STY CURIOBUF+1 ;IN THE FM PARAMETER LIST. JMP CLOSEFM ;USE FILE MANAGER TO LOAD PRGM. *================================= * COMMON CODE USED TO READ THE * BLOAD ADDRESS, BLOAD LENGTH * OR LOAD LENGTH FROM THE DISK. *================================= RDADRLEN LDA ADLENADR ;GET ADR OF TWO-BYTE INPUT BUFFER STA CURIOBUF ;(LENADRBF, $AA60) FRM RELOCATBL LDA ADLENADR+1 ;CONSTANTS TBL & DESIGNATE IT AS STA CURIOBUF+1 ;THE I/O BUF IN THE FM PARM LIST. LDA #0 ;PUT LENGTH TO READ = 2 BYTES IN STA LEN2RDWR+1 ;THE FM PARM LIST. LDA #2 STA LEN2RDWR LDA #3 ;PUT READ OPCODE IN FM PARM LIST. STA OPCODEFM LDA #2 ;INDICATE WANT 2 READ RNG OF BYTS STA SUBCODFM JSR FMDRIVER ;GO READ IN THE ADDR (OR LENGTH). LDA LENADRBF+1 ;GET HI BYTE OF ADR (OR LENGTH) ;JUST READ FROM DISK. STA LEN2RDWR+1 ;PUT VAL JUST RD IN PARM LIST IN ;CASE JUST READ LENGTH (SO KNOW ;HOW MUCH TO READ WHEN READ MAIN ;BODY OF FILE). TAY ;SAVE HI BYTE IN (Y). LDA LENADRBF ;DO LIKEWISE WITH LOW BYTE. STA LEN2RDWR RTS *================================= * CLOSE FILE & ISSUE A PROGRAM- * TOO-LARGE ERROR MESSAGE. *================================= TOTOOLRG JSR CMDCLOSE ;CLOSE FILE. JMP TOOLARGE ;ISSUE ERROR MSG. *================================= * SELECT DESIRED BASIC *================================= * CHK IF DESIRED BASIC IS UP OR NOT * (SWITCH BASIC IF NECESSARY). SELCTBSC CMP FILTYPFM ;TYPE WANTED = TYPE FOUND? BEQ SELBSRTN ;YES - BASIC WANTED IS ACTIVE. LDX NDX2CMD ;SAVE INDEX 2 PRESENT CMD IN CASE STX NEXTCMD ;WE ARE USING INTEGER & MUST LOAD ;INTEGER FILE CALLED "APPLESOFT" ;IN ORDER TO LOAD A(RAM). LSR ;SHIFT TYPE WANTED TO SEE WHICH ;BASIC TO SWITCH INTO. BEQ SWTCH2FP ;SWITCH FROM INTEGER 2 APPLESOFT. JMP CMDINT ;SWITCH FROM APPLESOFT 2 INTEGER. * SWITCHING FROM INT TO APPLESOFT * SO COPY NAME OF FILE FROM PRIMARY * TO SECONDARY NAME BUF IN CASE WE * HAVE TO USE RAM-BASED APPLESOFT. SWTCH2FP LDX #29 ;30 BYTES TO COPY (0 TO 29). PRIM2SND LDA PRIMFNBF,X ;GET BYTE FROM PRIMARY. STA SCNDFNBF,X ;COPY IT TO SECONDARY. DEX BPL PRIM2SND ;BRANCH IF MORE BYTES TO COPY. JMP CMDFP ;EXECUTE THE FP COMMAND. SELBSRTN RTS ;DESIRED BASIC WAS ACTIVE. *================================= * RUN COMMAND HANDLER *================================= CMDRUN LDA ACTBSFLG ;CHK WHICH BASIC IS CURRENT. BEQ LOAD4RUN ;BRANCH IF USING INTEGER BASIC. STA RUNTRUPT ;SET THE RUN INTERCEPT FLAG TO ;SIGNAL THAT WE ARE ABOUT TO ;INTERRUPT THE RUN COMMAND TO DO ;LOAD. ($40=A(ROM), $80=A(RAM).) LOAD4RUN JSR CMDLOAD ;GO LOAD THE PROGRAM. ;************* NOTE ************* ;* THE "JSR" IS ACTUALLY A * ;* PLACEBO BECAUSE AFTER FILE * ;* IS LOADED, EXECUTION GOES IN2* ;* BASIC & THEN RE-ENTERS DOS * ;* THRU THE DOS INTERCEPTS. ONCE* ;* DOS GETS ITS MITTS BACK INTO * ;* THINGS, THE RUNTRUPT FLAG IS * ;* TESTED & THEN EXECUTION FLOWS* ;* TO THE NEXT INSTRUCTION (AT * ;* RUNFPINT). THE MACHINE DOES * ;* NOT GET LOST BECAUSE THE STK * ;* PTR GETS RESET ACCORDINDLY. * ;******************************** RUNFPINT JSR CRVIADOS ;PRINT A . JSR INITIOHK ;RESET THE I/O HKS TO PT TO DOS. JMP (RUNTRY) ;GO EXECUTE THE PRGM. ;(RUNTRY PTS TO RUNFPROM IF USING ;A(ROM) OR POINTS TO FPRAMRUN ;IF USING A(RAM).) *======================================= * INTEGER BASIC'S RUN CMD ENTRY POINT. * (RUNTRY PTS HERE WHEN INTEGER ACTIVE.) *======================================= RUNINTGR LDA LOMEM ;CLEAR OUT ALL VARIABLES. STA INTVRLND ;ZERO OUT INTEGER BASIC'S CURRENT LDA LOMEM+1 ;VARIABLE POINTER. STA INTVRLND+1 JMP (CHAINTRY) ;GO INTO INTEGER BASIC 2 EXECUTE. *================================= * CHAIN COMMAND HANDLER *================================= CMDCHAIN JSR OPENLOAD ;LOAD THE INTEGER PRGM. JSR CRVIADOS ;PRINT A . JSR INITIOHK ;POINT I/O HOOKS AT DOS. JMP (CHAINTRY) ;GO INTO INTEGER BASIC 2 EXECUTE. *================================= * A(ROM)'S RUN ENTRY POINT. * (RUNTRY POINTS HERE IF A(ROM) * BASIC IS ACTIVE.) *================================= RUNFPROM JSR SETZPTRS ;CLEAR OUT ALL VARIABLES. STA PROMPT ;ZERO OUT PROMPT & ON-ERROR FLAG. STA ERRFLG JMP NEWSTT ;JUMP INTO BASIC TO EXECUTE PRGM. *================================= * A(RAM)'S RUN ENTRY POINT. * (RUNTRY POINTS HERE IF A(RAM) * VERSION OF BASIC IS UP.) *================================= FPRAMRUN JSR CLRFPRAM ;CLEAR ALL VARIABLES. STA PROMPT ;ZERO OUT PROMPT & ON ERROR FLAG. STA ERRFLG JMP RUNFPRAM ;GO RUN THE PROGRAM. #