AVAILABLE' DCI 'RANGE ERROR' DCI 'WRITE PROTECTED' DCI 'END OF DATA' DCI 'FILE NOT FOUND' DCI 'VOLUME MISMATCH' DCI 'I/O ERROR' DCI 'DISK FULL' DCI 'FILE LOCKED' DCI 'SYNTAX ERROR' DCI 'NO BUFFERS AVAILABLE' DCI 'FILE TYPE MISMATCH' DCI 'PROGRAM TOO LARGE' DCI 'NOT DIRECT COMMAND' HEX 8D * * * EMSGOFFS HEX 0003191924333E4C5B646D788498AABB * * * * VARIABLES * * BUFADR DS 2 CURSTAT DS 1 CSWSTATE DS 1 CSWL DS 2 KSWL DS 2 MAXFILES DS 2 SSAVE DS 1 XSAVE DS 1 YSAVE DS 1 ASAVE DS 1 CMDLNIDX DS 1 MONFLGS DS 1 CMDINDX DS 1 LOADLEN DS 2 PENDCMD DS 1 TEMP1 DS 1 KYWRDIDX DS 1 KYWRDFND DS 1 VOLVAL DS 2 DRVAL DS 2 SLOTVAL DS 2 LENVAL DS 2 RECVAL DS 2 BYTVAL DS 2 ADRVAL DS 2 MONVAL DS 1 FNAME DS 30 SFNAME DS 30 MXFLS HEX 03 CTLD HEX 84 EXFLG DS 1 EXCBUF DS 2 WHCBASIC DS 1 RUNINTRC DS 1 LAAB7 ASC "APPLESOFT" * * * The following are overlapping * with the equivalent defs in * the FILE.MNGR file. * LAAC1 DA $B7E8 LAAC3 DA $B3BB LAAC5 DA $B4BB LACC7 DA $C000 RV = $B7EA IOBSLOT = $B7E9 AJUSTBYT = $BFDC SETWARM = $BFE6 ROM = $C081 RAM = $C080 * * * * APPLESOFT EQUATES * JMPFPST = $D43C SETFPPR = $D4F2 NEWSTT = $D7D2 JPFPERR = $D865 * * * INTEGER EQUATES * BASWRM = $E003 BASCLD = $E000 INTERR = $E3E3 IRUN = $E836 * * MONITOR EQUATES * OLDBRK = $FA59 INPRT = $FE8B OUTPRT = $FE95 RTS = $FF58 MON = $FF65 * ORG $9D00 * * DBUFP DA DBUF-1 DOSKBD DA KBDINTR DOSVID DA VIDINTRC PFNADR DA FNAME SFNADR DA SFNAME LDRNGLEN DA LOADLEN LOADADR DA $9D00 FMPARMS DA FMOP * * * CSW STATE HANDLER ADDRESSES * CSWSTADR DA CSWST-1 DA CSWST3-1 DA CSWST4-1 DA CSWST5-1 DA CSWST6-1 DA CSWST7-1 DA CSWST8-1 * ORG $9D1E * *COMMAND ADDRESSES * CMDTBL DA DOINIT-1 DA DOLOAD-1 DA DOSAVE-1 DA DORUN-1 DA DOCHAIN-1 DA DODELETE-1 DA DOLOCK-1 DA DOUNLCK-1 DA DOCLOSE-1 DA DOREAD-1 DA DOEXEC-1 DA DOWRITE-1 DA DOPTION-1 DA DOOPEN-1 DA DOAPND-1 DA DORENAME-1 DA DOCAT-1 DA DOMON-1 DA DONOMON-1 DA DOPRNUM-1 DA DOINNUM-1 DA DOMXFLS-1 DA DOFP-1 DA DOINT-1 DA DOBSAVE-1 DA DOBLOAD-1 DA DOBRUN-1 DA DOVERIFY-1 * ORG $9D55 * * ACTIVE BASIC TABLE * CHNADR DA IRUN RUNADR DA DOSIRUN BASERR DA INTERR BASCOLD DA BASCLD BASWARM DA BASWRM ASFTREL DA SETFPPR * * INTEGER STUFF * INTTBL DA IRUN DA DOSIRUN DA INTERR DA BASCLD DA BASWRM * * ROM APPLESOFT STUFF * FPTBL DA DOSARUN DA DOSARUN DA JPFPERR DA BASCLD DA JMPFPST DA SETFPPR * * RAM APPLESOFT STUFF * RAMASTBL DA DOSA2RUN DA DOSA2RUN DA L1067 DA DOSSTRT DA LC3C DA LCF2 * ORG $9D84 * * * * DOS COLDSTART ADDRESS * * * * INIT DEFAULT SLOT & DRIVE * DOSSTRT LDA IOBSLOT LSR LSR LSR LSR STA SLOTVAL LDA IOBDRV STA DRVAL * * * See which BASIC is active * LDA BASCLD EOR #$20 BNE LDFPBAS * * * Integer BASIC is active, * move all required addresses * down there. * STA WHCBASIC LDX #$A LDINT LDA INTTBL-1,X STA CHNADR-1,X DEX BNE LDINT JMP CHSBASIC * * * Applesoft BASIC is active, * move A/S addresses to the * active BASIC addresses area. * LDFPBAS LDA #$40 STA WHCBASIC LDX #$C LDFPTBL LDA FPTBL-1,X STA CHNADR-1,X DEX BNE LDFPTBL CHSBASIC SEC BCS INITDOS * ORG $9DBF * * DOS Warmstart * DOSWARM LDA WHCBASIC BNE DOSWARM1 * * Cause integer BASIC to be * selected. * LDA #$20 BNE DOSWARM2 DOSWARM1 ASL BPL DOSWARM3 * * * Select Applesoft BASIC. * LDA #$4C DOSWARM2 JSR SETBASIC DOSWARM3 CLC * ORG $9DD1 * * * Initialize DOS. * INITDOS PHP JSR INITPTR LDA #$0 ;set NOMON O,I,C STA MONFLGS STA CSWSTATE ;init to state 0 PLP ROR STA CURSTAT BMI INITDOS1 JMP (BASWARM) INITDOS1 JMP (BASCOLD) * * * * FRSTIME is call after a DOS coldstart * it checks for RAM A/S and takes * care of other coldstart stuff * that must be done after BASIC * is initialized. * FRSTIME ASL ;check for RAM or ROM A/S BPL MVRAMAS2 * * * If RAM A/S, move required pointers * into the active BASIC area. * STA WHCBASIC LDX #$C MVRAMAS LDA RAMASTBL-1,X STA CHNADR-1,X DEX BNE MVRAMAS LDX #$1D MVRAMAS1 LDA SFNAME,X STA FNAME,X DEX BPL MVRAMAS1 * ORG $9E06 * * Init MAXFILES to the default * value (usually 3) * MVRANAS2 LDA MXFLS STA MAXFILES * * set up the DOS buffers chain * JSR INITBUFS * * * if EXEC is active, cause it to * become inactive on the next * character input * LDA EXFLG BEQ MVRAMAS3 PHA JSR PNTEXEC PLA LDY #0 STA (FILEBUF),Y * * * reset the CSW state to 0, set * warmstart status. * MVRAMAS3 JSR RSET0 * * * check to see if we are in the * middle of a command. * LDA CMDINDX BNE TSTPEND * * * If not, copy the page 3 stuff * down to $3D0 * LDX #$2F MOV3D0 LDA PAG3,X STA DOSRST,X DEX BPL MOV3D0 LDA PAG3+2 STA SOFTEV+1 EOR #$A5 STA PWREDUP LDA PAG3+1 STA SOFTEV LDA #$6 BNE TSTPEND1 * * * If there is a command pending * (because RAM A/S was loaded?) * then execute it, otherwise * return to BASIC. * TSTPEND LDA PENDCMD BEQ TSTPEND2 TSTPEND1 STA CMDINDX JMP DOCMD TSTPEND2 RTS * ORG $9E51 * * Stuff that gets moved down to * $3D0 * PAG3 JMP DOSWARM JMP DOSSTRT JMP FMGR2 JMP CALLRWTS LDA FMPARMS+1 LDY FMPARMS RTS LDA LAAC1+1 LDY LAAC1 RTS JMP INITPTR NOP NOP JMP OLDBRK JMP MON JMP RTS JMP MON JMP MON DA $FF65 * ORG $9E81 * * Keyboard intercept routine. * Called each time a character * is requested. * "HOOKS" at $38 and $39 point * at this routine. * KBDINTR JSR SAVREG LDA CURSTAT ;reading from a file? BEQ KBDINTR2 * * If so, remove cursor from screen * PHA LDA ASAVE STA (BASE),Y PLA BMI KBDINTR1 ;doing coldstart? JMP READBYTE * ORG $9E95 * * special case for coldstart * KBDINTR1 JSR FRSTIME LDY CH LDA #$60 STA (BASE),Y KBDINTR2 LDA EXFLG BEQ KBDINTR3 JSR EXECRD KBDINTR3 LDA #3 STA CSWSTATE JSR REGRST JSR RDCHAR STA ASAVE STX XSAVE JMP DOSXIT RDCHAR JMP (KSW) * ORG $9EBD * * Video input state handler. * Transfers control to the * proper output handler. * VIDINTRC JSR SAVREG LDA CSWSTATE ASL TAX LDA CSWSTADR+1,X PHA LDA CSWSTADR,X PHA LDA ASAVE RTS ;Funny JMP (--) * ORG $9ED1 * * Register save routine * SAVREG STA ASAVE STX XSAVE STY YSAVE TSX INX INX STX SSAVE LDX #3 SAVREG1 LDA CSWL,X STA CSW,X DEX BPL SAVREG1 RTS * ORG $9EEB * * CSW STATE 0: Start of line. * Check for control-D at * beginning of line. * * If RUN command was delayed while * loading A/S, continue RUN cmd. * CSWST LDX RUNINTRC BEQ CSWST1 JMP RUNDONE * * Check to see if a file is * being read. * CSWST1 LDX CURSTAT BEQ CSWST2 * * If a file is being read, check * to see if "?" prompt was output * CMP #"?" ;A/S PROMPT BEQ CSWST8 * * * See if at beginning of line * CMP PROMPT BEQ CSWST4A * * If not control-D at beginning * of line, goto state 2, * * otherwise go to state one and * collect possible DOS command. * CSWST2 LDX #2 STX CSWSTATE CMP CTLD BNE CSWST4 DEX STX CSWSTATE DEX STX CMDLNIDX * * Collect DOS command from * input line and parse * CSWST3 LDX CMDLNIDX C1LP STA IN,X INX STX CMDLNIDX CMP #$8D BNE ECHOC JMP PARSE * ORG $9F23 * * * CSW STATE 2 handler, Non-DOS * command. * * If current input character isn't * a return, exit DOS through ECHO, * otherwise reset command state * to zero. * CSWST4 CMP #$8D BNE ECHO CSWST4A LDX #0 STX CSWSTATE JMP ECHO * ORG $9F2F * * STATE 3 handler- INPUT statement * handler. * * * set the command state to zero * as a default (in case input * ends). * CSWST5 LDX #0 STX CSWSTATE CMP #$8D BEQ CSWST5A * * If not at end of input, check * the exec flag. * If set, echo character only if * MON I is set or exec is active * In either case the state will be * reset to three. * * C3CHKEXC LDA EXFLG BEQ ECHO BNE ECHOI * * * Come here if EOLN encountered. * If BASIC is not running, or * EXECing a file goto state one * and check for a possible DOS * command. Otherwise exit DOS * echoing character as appropriate * after switching to state 1 * * * CSWST5A PHA SEC LDA EXFLG BNE CSWST5B JSR ISBASRUN CSWST5B PLA BCC C3CHKEXC LDX XSAVE JMP C1LP * ORG $9F52 * * STATE 4 handler. * Write data to a file. * * check for EOLN, switch to * state 5 if encountered. * CSWST6 CMP #$8D BNE CSWST6A LDA #5 STA CSWSTATE CSWST6A JSR WRTBYTE JMP ECHOO * ORG $9F61 * * STATE 5 handler, start of * write data line; check for CTL-D * CSWST7 CMP CTLD BEQ CSWST * * treat any linefeeds as a * continuation of the previous * line. * CMP #$8A BEQ CSWST6A * * Otherwise revert to state 4 * LDX #4 STX CSWSTATE BNE CSWST6 * ORG $9F71 * * STATE 6 handler, skip output of * prompt character. * CSWST8 LDA #0 STA CSWSTATE BEQ ECHOI * ORG $9F78 * * * Finish RUN command interrupted * by RAM A/S load. * RUNDONE LDA #0 STA RUNINTRC JSR INITPTR JMP DORUN2 * * * End of DOS cmd scan. * Remove DOS command and pretend * the user only pressed return * SCNXIT LDA IN CMP CTLD BEQ ECHOC LDA #$8D STA IN LDX #0 STX XSAVE * ORG $9F95 * * Echo character conditionally to * the screen: * * ECHOC - IF MON C * ECHOO - IF MON O * ECHOI - IF MON I * * ECHO - UNCONDITIONALLY * ECHOC LDA #$40 BNE ECHOI1 ECHOO LDA #$10 BNE ECHOI1 ECHOI LDA #$20 ECHOI1 AND MONFLGS BEQ DOSXIT ECHO JSR REGRST JSR COUT STA ASAVE STY YSAVE STX XSAVE * ORG $9FB3 * * Restore registers and exit DOS * DOSXIT JSR INITPTR LDX SSAVE TXS REGRST LDA ASAVE LDY YSAVE LDX XSAVE SEC RTS * ORG $9FC5 * * COUT and CRLF routines * COUT JMP (CSW) CRLF LDA #$8D JMP COUT * ORG $9FCD * * Parse DOS command and check * syntax * PARSE LDY #$FF STY CMDINDX ;set to 0 (see ADDCHR) INY STY PENDCMD * * get successive characters from * input buffer and compare against * current command in table * ADDCHR INC CMDINDX LDX #0 PHP ;assume "=" LDA IN,X ;skip any control-D's CMP CTLD BNE ADDCHR1 INX ADDCHR1 STX CMDLNIDX ADDCHR2 JSR FLSHCMDL ;skip blanks AND #$7F EOR DOSCMDS,Y ;compare to char in table INY * * the following code is a tricky * way of determining if the entire * string is equal to one of the * DOS commands * ASL BEQ ADDCHR3 PLA PHP ADDCHR3 BCC ADDCHR2 PLP BEQ COMPIDX LDA DOSCMDS,Y BNE ADDCHR ;at last command? * * If command was not found, see if * first character on the line was * control-D, if so SYNTAX ERROR!!! * GETFRST LDA IN CMP CTLD BEQ GETFRST1 JMP ECHO GETFRST1 LDA IN+1 CMP #$8D BNE GETFRST2 JSR RSET0 JMP ECHOC GETFRST2 JMP CSYNERR * ORG $A01B * * Valid DOS command, get its * address and execute it. * COMPIDX ASL CMDINDX LDY CMDINDX JSR ISBASRUN BCC COMPIDX1 * * Certain commands (such as OPEN, * etc.) can only be executed if * BASIC is running. If such a * command is executed and BASIC * is not running, fall through * to here. * LDA #2 AND KWRDPRMS,Y BEQ COMPIDX1 * * NOT A DIRECT COMMAND * LDA #$F JMP DOERROR * * COMPIDX1 CPY #6 BNE COMPIDX2 STY PROMPT * * * See if a filename is required * COMPIDX2 LDA #$20 AND KWRDPRMS,Y BEQ FNDNNAM * * If a filename is needed, blank * out the filename arrays and * collect a filename (if found) * JSR BLKNAME PHP * * skip any leading blanks * CMDINP JSR FLSHCMDL BEQ CLRNAME3 ASL BCC CMDINP1 BMI CMDINP1 JMP GETFRST CMPINP1 ROR JMP CLRNAME1 CLRNAME JSR GNXTCHR BEQ CLRNAME3 CLRNAME1 STA FNAME,Y INY CPY #$3C BCC CLRNAME CLRNAME2 JSR GNXTCHR BNE CLRNAME2 CLRNAME3 PLP BNE CLRNAME4 LDY CMDINDX LDA #$10 AND KWRDPRMS,Y BEQ CLRNAME5 LDY #$1E PHP BNE CMDINP CLRNAME4 LDA SFNAME CMP #$A0 BEQ CHKFRST CLRNAME5 LDA FNAME CMP #$A0 BNE SETDFLTS LDY CMDINDX LDA #$C0 AND KWRDPRMS,Y BEQ CHKFRST BPL SETDFLTS CHKFRST JMP GETFRST * ORG $A095 * * subroutine to blank out the * filenames. * BLKNAME LDY #$3C LDA #$A0 BLKNAME1 STA MONVAL,Y DEY BNE BLKNAME1 RTS * ORG $A0A0 * * Branch here if no filename * is required. * FNDNNAM STA FNAME * * check parameter table to see * if a positional parameter is * required. * LDA #$C AND KWRDPRMS,Y BEQ SETDFLTS * * If so, read in the number * JSR GETNUM * * was number ommitted? * BCS FNDNNAM3 TAY BNE FNDNNAM2 * * check the range of the number * CPX #$11 BCS FNDNNAM2 LDY CMDINDX LDA #8 AND KWRDPRMS,Y BEQ FNDNNAM1 CPX #8 BCS CHKFRST * * if # within range, set defaults * BCC SETDFLTS FNDNNAM1 TXA BNE SETDFLTS FNDNNAM2 LDA #2 JMP DOERROR FNDNNAM3 JMP CSYNERR * ORG $A0D1 * * Set up defaults for the * positional values * SETDFLTS LDA #0 STA KYWRDFND STA MONVAL STA VOLVAL STA LENVAL STA LENVAL+1 JSR AJUSTBYT LDA CMDLNIDX * * Come here if positionals are * required. * * * First, skip any leading blanks * GETNXT JSR FLSHCMDL BNE GETNXT1 CMP #$8D BNE GETNXT * * If at EOLN, make sure we * have all the arguements * we need. * LDX CMDINDX LDA KYWRDFND ORA KWRDPRMS+1,X EOR KWRDPRMS+1,X BNE CHKFRST LDX TEMP1 BEQ PROCMD STA TEMP1 STX CMDLNIDX BNE GETNXT GETNXT1 LDX #$A GETNXT2 CMP PPARMS-1,X BEQ ISLE1 DEX BNE GETNXT2 ISLE BEQ FNDNNAM3 * * As each positional arguement * is encountered, make it as * present in KYWRDFND * ISLE1 LDA PARMBITS-1,X BMI UPDATMON ORA KYWRDFND STA KYWRDFND DEX STX KYWRDIDX * * get numeric value associated * with the keyword. * JSR GETNUM BCS FNDNNAM3 * * check the range of the value * following the keyword. * LDA KYWRDIDX ASL ASL TAY LDA OPRND+1 BNE ISLE2 LDA OPRND CMP KWRANGE,Y BCC FNDNNAM2 LDA OPRND+1 ISLE2 CMP KWRANGE+3,Y BCC ISLE4 ISLE3 BNE FNDNNAM2 LDA OPRND CMP KWRANGE+2,Y BCC ISLE4 BNE ISLE3 ISLE4 LDA TEMP1 BNE GETNXT * * save value parsed in the keyword * parameters table. * TYA LSR TAY LDA OPRND+1 STA VOLVAL+1,Y LDA OPRND STA VOLVAL,Y GNISLE JMP GETNXT * ORG $A164 * * If O,I, or C was encountered in * MON or NOMON, set appropriate * bits. * UPDATMON PHA LDA #$80 ORA KYWRDFND STA KYWRDFND PLA AND #$7F ORA MONVAL STA MONVAL BNE GNISLE BEQ ISLE * ORG $A17A * * * Process valid DOS command * PROCMD JSR DOCMD JMP SCNXIT DOCMD JSR RSET0 JSR CLRFMP LDA CMDINDX TAX LDA CMDTBL+1,X PHA LDA CMDTBL,X PHA RTS * ORG $A193 * * Get next character from command * line and check for a or * a comma. * GNXTCHR LDX CMDLNIDX LDA IN,X CMP #$8D BEQ GNXTCHR1 INX STX CMDLNIDX CMP #"," GNXTCHR1 RTS * ORG $A1A4 * * FLSHCMDL- deletes leading blanks * from command line. Z-flag is * returned set if "," or is * first non-blank encountered. * * FLSHCMDL JSR GNXTCHR BEQ GNXTCHR1 CMP #$A0 BEQ FLSHCMDL RTS * ORG $A1AE * * CLRFMP- clears file manager's * parameter area. * CLRFMP LDA #0 LDY #$16 CLRFMP1 STA FMOP-1,Y DEY BNE CLRFMP1 RTS * ORG $A1B9 * * GETNUM- converts numeric (in * ASCII) arguement to binary. * * DECIMAL and HEX are supported. * GETNUM LDA #0 STA OPRND STA OPRND+1 JSR FLSHCMDL PHP CMP #"$" BEQ HEXCONV PLP JMP GETNUM2 * * Decimal input routine here * GETNUM1 JSR FLSHCMDL GETNUM2 BNE GETNUM3 LDX OPRND LDA OPRND+1 CLC RTS * * get current character, multiply * OPRND by 10, and add in numeric * value for current digit * GETNUM3 SEC SBC #"0" BMI BADNUM CMP #$A BCS BADNUM * * multiply OPRND by 10 * (OPRND*2 + OPRND*8) * * and add in digit value * * JSR MUL2 ADC OPRND TAX LDA #0 ADC OPRND+1 TAY JSR MUL2 JSR MUL2 TXA ADC OPRND STA OPRND TYA ADC OPRND+1 STA OPRND+1 BCC GETNUM1 BADNUM SEC RTS * * multiply OPRND by 2. * MUL2 ASL OPRND ROL OPRND+1 RTS * ORG $A203 * * HEX number here. * HEXCONV PLP HEXLOOP JSR FLSHCMDL BEQ GETNUM2 SEC SBC #$B0 BMI BADNUM CMP #$A BCC HEXLOOP1 SBC #7 BMI BADNUM CMP #$10 BCS BADNUM HEXLOOP1 LDX #4 HEXLOOP2 JSR MUL2 DEX BNE HEXLOOP2 ORA OPRND STA OPRND JMP HEXLOOP * ORG $A229 * * Do PR#n command * DOPRNUM LDA OPRND JMP OUTPRT * ORG $A22E * * Do IN# command * DOINNUM LDA OPRND JMP INPRT * ORG $A233 * * Do MON and NOMON commands * DOMON LDA MONFLGS ORA MONVAL STA MONFLGS RTS * DONOMON BIT MONVAL BVC DONOMON1 JSR CRLF DONOMON1 LDA #$70 EOR MONVAL AND MONFLGS STA MONFLGS RTS * ORG $A251 * * Handle MAXFILES commmand * DOMXFLS LDA #0 STA EXFLG LDA OPRND PHA JSR CLOSALL PLA STA MAXFILES JMP INITBUFS * ORG $A263 * * Handle DOS DELETE command * DODELETE LDA #5 JSR CMDHNDL1 ;perform the delete. * * Free up the buffer used by * the delete command. * JSR LOCBUF LDY #0 TYA STA (FILEBUF),Y RTS * ORG $A271 * * Handle LOCK and UNLOCK * DOLOCK LDA #7 BNE DOUNLCK1 DOUNLCK LDA #8 DOUNLCK1 JSR CMDHNDL1 JMP DOCLOSE * ORG $A27D * * Handle DOS verify command * DOVERIFY LDA #$C BNE DOUNLCK1 * ORG $A281 * * Handle DOS RENAME command * DORENAME LDA SFNADR STA NEWNAME LDA SFNADR+1 STA NEWNAME+1 LDA #9 STA TEMP1 JSR CLOSOPN JMP DOCLOSE * ORG $A298 * * APPEND command is handled here. * Just do an open and then read * the file until a $00 is * encountered. * DOAPND JSR DOOPEN DOAPND1 JSR RDTEXT BNE DOAPND1 JMP APTCH2 * ORG $A2A3 * * OPEN a text file here * DOOPEN LDA #0 JMP OPENTST * ORG $A2A8 * * File manager setup used by the * various DOS commands * CMDHNDLR LDA #1 CMDHNDL1 STA TEMP1 LDA LENVAL BNE CMDHNDL2 LDA LENVAL+1 BNE CMDHNDL2 LDA #1 STA LENVAL CMDHNDL2 LDA LENVAL STA RECNUM LDA LENVAL+1 STA RECNUM+1 * * Close a file if already open. * CLOSOPN JSR DOCLOSE LDA OPRND+1 BNE CLOSOPN1 JMP NOBUF CLOSOPN1 STA FILEBUF+1 LDA OPRND STA FILEBUF JSR COPFNAM JSR COPPTRS JSR COPYPARM LDA TEMP1 STA FMOP JMP FMDRVR * ORG $A2EA * * DOS CLOSE command * DOCLOSE LDA FNAME CMP #$A0 BEQ CLOSALL JSR LOCBUF BCS RTS0 JSR CLOSFRE JMP DOCLOSE * ORG $A2FC * * FREE any buffers used by file * being closed. * CLOSFRE JSR ISEXBUF BNE CLOSFRE1 LDA #0 STA EXFLG CLOSFRE1 LDY #0 TYA STA (FILEBUF),Y JSR COPPTRS LDA #2 STA FMOP JMP FMDRVR * ORG $A316 * * Close all open files * CLOSALL JSR FRSTBUF BNE CLOSALL2 CLOSALL1 JSR PTNXTBF BEQ RTS0 CLOSALL2 JSR ISEXBUF BEQ CLOSALL1 JSR GFBFNAM BEQ CLOSALL1 JSR CLOSFRE JMP CLOSALL RTS0 RTS * ORG $A331 * * DOS BSAVE COMMAND * DOBSAVE LDA #9 ;check parameters AND KYWRDFND CMP #9 BEQ DOBSAVE1 JMP GETFRST * * Open file and make sure it's * Binary. * DOBSAVE1 LDA #4 JSR OPENTST * * Init address parameters * LDA ADRVAL+1 LDY ADRVAL JSR WRT2 LDA LENVAL+1 LDY LENVAL JSR WRT2 LDA ADRVAL+1 LDY ADRVAL JMP RWRANGE * ORG $A35D * * DOS BLOAD COMMAND * DOBLOAD JSR CMDHNDLR * * Make sure it is a binary file * LDA #$7F AND FILETYPE CMP #4 BEQ DOBLOAD1 JMP FMISMTCH DOBLOAD1 LDA #4 JSR OPENTST * * Read in length and address * values. * JSR READDBYT TAX LDA KYWRDFND AND #1 BNE DOBLOAD2 STX ADRVAL STY ADRVAL+1 DOBLOAD2 JSR READDBYT LDX ADRVAL LDY ADRVAL+1 JMP RWSETUP * ORG $A38E * * Handle BRUN command * DOBRUN JSR DOBLOAD JSR INITPTR JMP (ADRVAL) * ORG $A397 * * Handle DOS SAVE command * DOSAVE LDA WHCBASIC BEQ ISINT * * Applesoft BASIC at this point * * * Is source protected? * LDA PROTECT BPL DOSAVE1 JMP PTOOBIG DOSAVE1 LDA #2 JSR OPENTST SEC LDA ASPEND SBC ASPGMST TAY LDA ASPEND+1 SBC ASPGMST+1 JSR WRT2 LDA ASPGMST+1 LDY ASPGMST JMP RWRANGE * * Saving integer BASIC * ISINT LDA #1 JSR OPENTST SEC LDA INTHIMEM SBC INTSTRT TAY LDA INTHIMEM+1 SBC INTSTRT+1 JSR WRT2 LDA INTSTRT+1 LDY INTSTRT JMP RWRANGE * ORG $A3BC * * Open a file and check its type * OPENTST STA FILETYPE PHA JSR CMDHNDLR PLA JMP CHKTYPE * * Write two bytes out to a file * WRT2 STY RANGELEN STY DATARANG STA RANGELEN+1 LDA #4 STA FMOP LDA #1 STA FMSUBOP JSR FMDRVR LDA RANGELEN+1 STA DATARANG JMP FMDRVR * * * Read or Write a range of bytes * RWRANGE STY DATARANG STA DATARANG+1 LDA #2 JMP VFYPTCH RWRANGE1 JSR FMDRVR JMP DOCLOSE FTMIS JMP FMISMTCH * ORG $A413 * * Do BASIC LOAD * DOLOAD JSR CLOSALL JSR CMDHNDLR LDA #$23 ;is type INT, RAM A/S or ROM A/S? AND FILETYPE BEQ FTMIS STA FILETYPE LDA WHCBASIC BEQ DOLOAD2 * * select Applesoft * LDA #2 JSR SLBASIC * * * Read in length of A/S program * JSR READDBYT * * * compute A/S pointer values * CLC ADC ASPGMST TAX TYA ADC ASPGMST+1 CMP ASHIMEM+1 BCS PTOOLRG STA ASPEND+1 STA ASVARS+1 STX ASPEND STX ASVARS LDX ASPGMST LDY ASPGMST+1 JSR RWSETUP JSR INITPTR JMP (ASFTREL) * * select integer BASIC and load * integer program * DOLOAD2 LDA #1 JSR SLBASIC JSR READDBYT SEC LDA INTHIMEM SBC LOADLEN TAX LDA INTHIMEM+1 SBC LOADLEN+1 BCC PTOOLRG TAY CPY INTLOMEM+1 BCC PTOOLRG BEQ PTOOLRG STY INTSTRT+1 STX INTSTRT * * * Read or Write the range of bytes * required. * RWSETUP STX DATARANG STY DATARANG+1 JMP RWRANGE1 * * * Read two bytes from the * specified file. * READDBYT LDA LDRNGLEN STA DATARANG LDA LDRNGLEN+1 STA DATARANG+1 LDA #0 STA RANGELEN+1 LDA #2 STA RANGELEN LDA #3 STA FMOP LDA #2 STA FMSUBOP JSR FMDRVR LDA LOADLEN+1 STA RANGELEN+1 TAY LDA LOADLEN STA RANGELEN RTS * ORG $A4AB * * Print "PROGRAM TOO LARGE" * PTOOLRG JSR DOCLOSE JMP PTOOBIG * * Select a BASIC. * If BASIC matches filetype, quit. * If not, select alternate BASIC. * * * See if the proper BASIC is * already selected. * SLBASIC CMP FILETYPE BEQ RTS1 * * If not, save CMDINDX and * change BASICs * LDX CMDINDX STX PENDCMD LSR BEQ SLBASIC1 JMP DOINT * * If changing to Applesoft, * save filename in case RAM * A/S is loading (remember, * RAM A/S is an integer program * called "APPLESOFT", during * its load it will wipe out * FNAME). * SLBASIC1 LDX #$1D SLBASIC2 LDA FNAME,X STA SFNAME,X DEX BPL SLBASIC2 JMP DOFP RTS1 RTS * ORG $A4D1 * * Handle DOS RUN command * DORUN LDA WHCBASIC BEQ DORUN1 STA RUNINTRC DORUN1 JSR DOLOAD DORUN2 JSR CRLF JSR INITPTR JMP (RUNADR) * ORG $A4E5 * * If integer BASIC, handle RUN * command here. * DOSIRUN LDA INTLOMEM STA INTVEND LDA INTLOMEM+1 STA INTVEND+1 JMP (CHNADR) * ORG $A4F0 * * Handle CHAIN command * DOCHAIN JSR DOLD2 JSR CRLF JSR INITPTR JMP (CHNADR) * * * * * Applesoft CHAIN is simply a RUN * DOSARUN JSR LD665 STA PROMPT STA ASONERR JMP NEWSTT DOSA2RUN JSR LE65 STA PROMPT STA ASONERR JMP LFD4 * ORG $A510 * * Handle the DOS write command * DOWRITE JSR RWCOMON LDA #5 STA CSWSTATE JMP SCNXIT * ORG $A51B * * DOS READ command * DOREAD JSR RWCOMON LDA #1 STA CURSTAT JMP SCNXIT * * Code common to both read and * write. * * * First, see if a buffer is * already allocated to the * file. * RWCOMON JSR LOCBUF BCC RWCOMON1 * * If not, open a file * JSR DOOPEN JMP RWCOMON2 * * If so, copy file buffer workspc * to the file manager workspace * RWCOMON1 JSR COPPTRS * * check to see if "R" or "B" * parameters were specified. * RWCOMON2 LDA KYWRDFND AND #6 BEQ RTS2 * * If so, copy numeric operands * to the parameter list. * LDX #3 RWCOMON3 LDA RECVAL,X STA RECNUM,X DEX BPL RWCOMON3 * * Because R or B parameter was * specified, a POSITION command * must be issued before the * read or write command. * LDA #$A STA FMOP JSR FMDRVR RTS2 RTS * ORG $A54F * * INIT command * * * If "V" parameter not specified, * or it was specified as 0, * default to 254 * DOINIT LDA #$40 AND KYWRDFND BEQ DOINIT1 LDA VOLVAL BNE DOINIT2 DOINIT1 LDA #254 STA VOLVAL * * Get page # of DOS ($9D for * 48K) and store in subcode * field. * DOINIT2 LDA LOADADR+1 STA FMSUBOP * * Do the INIT. * LDA #$B JSR CMDHNDL2 JMP DOSAVE * ORG $A56E * * Catalog function handler * DOCAT LDA #6 JSR CMDHNDL2 * * Set default volume to the * volume number of the disk * just cataloged. -end of file-