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 <cr> 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 <cr> 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 <cr> 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-