****************************************************************** * * * FP Command Handler * * * *----------------------------------------------------------------* * * * The FP command selects the Applesoft language and then * * does a coldstart. * * The execution pattern of the coldstart depends on the * * kind of machine that is being used. If an old AppleII (with * * Integer in ROM) is being used, the FP-coldstart routines * * assume that the System Master disk is in the drive. * * Eventually an attempt is made to run an INTEGER program * * (confusingly called "APPLESOFT") that loads a file called * * "FPBASIC". FPBASIC is a binary file which contains an image * * of the Applesoft Floating Point Basic language. * * The execution pattern associated with machines that have * * Applesoft in ROM (Apple II+/IIe) is much simpler. Because few * * of the old AppleII machines are presently in use, THE FOLLOWING* * DISASSEMBLY APPLIES ONLY TO THE II+ AND IIe MACHINES. A brief * * description of the execution pattern of this disassembly * * follows: * * - Select the device with Applesoft in ROM and then jump * * into DOS's cold start routine (DOSCOLD, $9884). * * - Put slot & drive values in the table of parsed options. * * - Copy an image of the Applesoft basic entry point vector * * table to the ACTIVE basic entry point vector table. * * - Initialize the I/O hooks to point to DOS so that DOS * * intercepts all input and output. * * - Simulate a NOMON command and set OPUTCOND: #$00 and * * CONDNFLG: #$80 to signal doing a coldstart. * * - Jump into BASIC's coldstart routine (BSCOLDST, $F128) * * via BASICCLD ($E000). * * - Set the immediate mode flag (CURLIN+1: #$FF) and * * simulate the NORMAL, NOTRACE and SPEED statements. * * - Copy an image of Applesoft's parsing routine (CHRGET, * * $00B1) and random number seed ($00C9) to page one. * * - Do a bunch of zero-page homework and then print a * * carriage return through BASIC, DOS's output handler * * (OPUTINCP, $9EBD) and monitor ROM. * * - Return to Applesoft and set MEMSIZ ($73,$74) and TXTTAB * * ($67,$68). * * - Turn off the $D6 run-protection flag and PUT A $00 IN * * $800. * * - Simulate a NEW (and CLEAR) statement (thereby wiping * * out any program in memory). * * - Set the USR ($0A - $0C) and GOWARM ($00 - $02) vectors. * * - Jump into BASIC's main command loop and warmstart entry * * point (RESTART, $D43C). * * - Print a carriage return through BASIC, DOS's output * * handler (OPUTINCP, $9EBD) and monitor ROM. * * - Print an Applesoft prompt (RH bracket) through BASIC, * * DOS's output handler (OPUTINCP, $9EBD) and monitor ROM. * * - Intercept an input request at DOS's input intercept * * routine (INPTINCP, $9E81) and divert execution to build * * the DOS buffers. * * - Put a flashing cursor on the screen and request input * * from the keyboard. * * - Display the character typed in from the keyboard and * * repeatedly request more input until a carriage return * * is encountered. * * - Once a carriage return is detected, go to DOS's command * * parsing routine (PARSECMD, $9FCD). (If a DOS or * * Applesoft command is parsed, go execute the command. * * If neither type of command is detected, issue a syntax- * * error message. * * * ****************************************************************** * On entry - CUMLOPTN ($AA65) has been updated * to reflect any parsed option words. * - the option words have been checked * to make sure they apply to the type * of command issued. (Only drive and * slot parameters are optional with * the FP command.) * - the numeric values issued with the * option words have been checked for * validity. (A57A) CMDFP LDA #$4C ;(a) = opcode for "JMP". (A57C) JSR SETROM * Test card or motherboard to insure that * device containing the ROM version we want * is selected. * BASICCLD ($E000) contains a "JMP" or "JSR" * instruction if dealing with FP or INTEGER * ROM respectively. (A5B2) SETROM CMP BASICCLD ;Test card or motherboard ;(ie. test whichever device is up). (A5B5) BEQ DVICERTN ;Language wanted is on present ROM device. * Language was not on device selected above, * so specifically test card in slot 0. * (P.S. Could change addresses if want card * in different slot.) (A5B7) STA $C080 ;Read enable slot 0. CMP BASICCLD ;Check identifying byte. (A5BD) BEQ DVICERTN ;Branch if ROM wanted is on card. * Rom wanted was not on card. * We may have just tested card twice, * so now specifically test motherboard. (A5BF) STA $C081 ;Test motherboard. CMP BASICCLD ;Check identifying byte. DVICERTN RTS ;Exit with the switches pointing at (AC5C) ;the last device tested. If the desired ;language is present, the switches are left pointing ;at the appropriate device. (A57F) BEQ TODOSCLD ;ROM version of Applesoft was present on ;either card or motherboard, so go do a ;coldstart. TODOSCLD JMP DOSCOLD ;Go into DOS's coldstart routine. (A5AF) ------------ * NOTE: THE REMAINING DISASSEMBLY IS INCOMPLETE. * Only those portions of the routines applicable * to the FP command are shown. Also note that not * all possible ramifications associated with the * FP command are covered. * DOS'S COLDSTART ROUTINE * (P.S. Don't confuse with Basic's * coldstart routine, BASICCLD.) * Get slot and drive numbers & store them * as default values in case no such parameters * were issued with command. (9D84) DOSCOLD LDA IBSLOT ;Slot # * 16 from RWTS's I/O block. LSR ;Divide by 16. LSR LSR LSR STA SLOTPRSD ;Put slot in parsed table. LDA IBDRVN ;Drive # from RWTS's IOB. (9D91) STA DRVPRSD ;Put drive # in parsed table. * Check which basic is in ROM. (9D94) LDA BASICCLD ;Get identifying byte. EOR #$20 ;BASICCLD=$20 for integer or $40 for A(ROM). (9D99) BNE ISFPROM * Copy the Applesoft entry point vector table * to the ACTIVE basic entry point vector table. (9DAC) ISFPROM LDA #$40 ;Set active basic flag to #$40 STA ACTBSFLG ;to signal Applesoft ROM. LDX #12 AROM2BSC LDA IMGFPV-1,X ;Get image of vector table. STA CHAINTRY-1,X ;Put it in page 3. DEX BNE AROM2BSC BYPASWRM SEC ;(c) = 1, signal for coldstart. (9DBC) ;(c) = 0, signal for warmstart. (9DBD) BCS CMWRMCLD ;Force branch to bypass part of ;the warmstart routine. ;ALWAYS. (9DD1) CMWRMCLD PHP ;Save status denoting warm or cold on stack. ;(Set carry = signal for coldstarting.) (9DD2) JSR INITIOHK ;Initialize the DOS hooks. * Initialize the I/O hooks so that DOS * intercepts all input and output. For * instance, if a routine encounters a * "COUT JMP (CSW)" then execution will * actually flow to DOS's output handler * 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. * The intercepts are then set as follows: * ADINPTCP: INPTINCP --> KSW: INPTINCP. * ADOPUTCP: OPUTINCP --> CSW: OPUTINCP. * Check if the input hook needs to be reset. (A851) INITIOHK LDA KSW+1 CMP ADINPTCP+1 (A856) BEQ CKOUTHK ;Input hook already points to DOS's ;input handler so go check output hook. * Reset the input hook to point to DOS. (A858) STA KSWTRUE+1 ;KSW: KEYIN --> KSWTRUE: KEYIN. LDA KSW STA KSWTRUE LDA ADINPTCP ;ADINPTCP: INPTINCP --> KSW: INPTINCP. STA KSW LDA ADINPTCP+1 (A868) STA KSW+1 * Check if the output hook needs to be reset. (A86A) CKOUTHK LDA CSW+1 CMP ADOPUTCP+1 (A86F) BEQ SETHKRTN ;Output hook already points to DOS's ;output handler routine, so exit. * Reset the output hook to point to DOS. (A871) 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 (A883) (9DD5) LDA #0 STA CIOCUMUL ;Simulate a "NOMON" command. STA OPUTCOND ;Set conditon 0. PLP ;Get saved status off stack and rotate (c) ROR ;into hi bit of (a) to set CONDNFLG=$00 for STA CONDNFLG ;warmstart or CONDNFLG=$80 for coldstart. (9DE2) BMI LANGCOLD ;Branch if doing coldstart. LANGCOLD JMP (TOCLDVEC) ;Jumps to BASIC's coldstart routine (9DE7) ------------ ;(BASICCLD) at $E000. * NOTE: YOU ARE LEAVING THE COMFORTABLE WORLD * OF DOS & ENTERING THE MURKY REALM OF BASIC. * From now on, execution bounces back and forth * between Basic, DOS and monitor ROM. BASICCLD JMP BSCOLDST ;Jumps to BASIC's coldstart. (E000) ---------- * BASIC's coldstart routine. (F128) BSCOLDST . . - set CURLIN+1 to $FF in order to denote immediate mode. - adjust stack pointer to point at $1FB. - simulate a "NORMAL" statement. - simulate a "NOTRACE" statement. - simulate a "SPEED" statement. - copy Applesoft's character parsing routine (CHRGET) and random number seed to page zero. - do a bunch of zero-page homework. . . * PRINT A THRU BASIC, DOS's OUTPUT * HANDLER (OPUTINCP) AND MONITOR ROM. (F168) JSR CRDO (DAFB) CRDO LDA #$0D ;Positive ASCII carriage return. (DB5C) OUTDO ORA #$80 ;Translate to negative ASCII. CMP #" " ;Is it a ctrl char? (BD60) BCC GODOPUT ;Yes. (DB64) GODOPUT JSR COUT (FDED) COUT JMP (CSW) ;DOS intercepts output via CSW hook. ------------ * DOS's output intercept routine. * (Intercepts all output to screen * or other peripherals.) (9EBD) OPUTINCP JSR PREP4DOS * Save registers & stack pointer. * Restore the I/O hooks. (9ED1) PREP4DOS STA ASAVED ;Save (a), (y) & (x) STX XSAVED ;registers. (9ED7) STY YSAVED * Adjust stack pointer and save it so * when later restore it and hit and * "RTS", we can return to the routine * that called the routine that * contained the "JSR PREP4DOS" * instruction. (In this case, set * to return to $DB67.) (9EDA) TSX INX INX (9EDD) STX STKSAVED * Restore the I/O hooks to point to: * KSWTRUE: KEYIN --> KSW: KEYIN. * CSWTRUE: COUT1 --> CSW: COUT1. (9EE0) UNCONDOS LDX #3 SETRUHKS LDA CSWTRUE,X STA CSW,X DEX BPL SETRUHKS ;4 bytes to move. (9EE8) RTS * Use current condition to index table * containing addresses of oput handlers. * Do a "stack jump" to appropriate handler * (condition 0 for coldstart). (9EC0) LDA OPUTCOND ;Get current condition. ASL ;Times 2 cause 2 bytes / address. TAX ;Set (x) to index table of addresses. LDA OUTHNDTB+1,X ;Put adr of output handler on stack PHA ;(hi byte first) and then do a "stack jump". LDA OUTHNDTB,X PHA LDA ASAVED ;Save char to be printed. (9ED0) RTS ;Execute the "stack jump". . . DO STACK JUMP. . . * Output handler 0. * (Evaluate start of line.) (9EEB) OPUTHDL0 LDX RUNTRUPT ;Contains a non-zero value if DOS ;RUN cmd is presently being interrupted ;to accommodate a LOAD. ;($00 = no interruption, ;$40 = A(ROM) interrupted, ;$80 = A(RAM) interrupted) (9EEE) BEQ NONTRUPT ;ALWAYS branch when using FP command. * File not being read. (9EF3) NONTRUPT LDX CONDNFLG ;Get condition flag. ;Are we doing a warmstart ($00), ;coldstart ($80), using A(RAM) ($C0) ;or doing a read ($01)? (9EF6) BEQ SETIGNOR ;Branch if warmstarting. * Doing coldstart, reading file or using A(RAM)? * Check (a) to see if using "?" prompt associated * with reading an INPUT statement. (9EFB) CMP #"?" ;If reading, then using "?" as prompt. BEQ OPUTHDL6 ;Go display input conditionally if reading. CMP PROMPT ;Are we printing a prompt? BEQ SET2EVAL ;Branch if about to print prompt. SETIGNOR LDX #2 ;SET CONDITION 2 for default to signal STX OPUTCOND ;should ignore non-DOS commands. CMP DCTRLCHR ;Is char = DOS's control char? (9F08) BNE OPUTHDL2 ;No. * Output handler 2. * (Ignore non-DOS commands.) (9F23) OPUTHDL2 CMP #$8D ;? BNE DSPLYALL ;No - (was an RH brackett?) SET2EVAL LDX #0 ;SET CONDITION 0 - evaluate start of line. STX OPUTCOND (9F2C) JMP DSPLYALL ;Go display char unconditionally. ------------ * Send char to output device. (9FA4) DSPLYALL JSR RESTOREG * Restore (a), (y) and (x) registers. (9FBA) RESTOREG LDA ASAVED LDY YSAVED LDX XSAVED SEC ;Why????? (9FC4) RTS (9FA7) JSR GODSPLY * Print thru true output * handler (COUT1). (9FC5) GODSPLY JMP (CSW) ------------ (FDF0) COUT1 . . (See dis'mbly in APPLE II REFERENCE MANUAL.) . . (RTS) * Save registers & set hooks. (9FAA) STA ASAVED ;Save (a), (y) & (x) registers. STY YSAVED (9FB0) STX XSAVED * Routine to exit DOS. (9FB3) DOSEXIT JSR INITIOHK * Initialize the I/O hooks so that * DOS intercepts all input & output. (AB51) INITIOHK . . (See dis'mbly above.) . . (RTS) * Reset the stk pointer & retrieve registers. (9FB6) LDX STKSAVED ;Retrieve saved stack pointer. TXS RESTOREG LDA ASAVED ;Restore (a), (y) and (x) registers. LDY YSAVED LDX XSAVED SEC ;Why????? (9FC4) RTS ;Return to the routine that called ;the routine that contained the ;"JSR PREP4DOS" instruction. (DB67) AND #%01111111 ;Convert char back into positive ASCII. PHA ;Save it on stack. LDA SPEEDFLG ;Get speed setting. (DB6C) JSR WAIT * Delay in accordance with speed setting. (FCA8) WAIT SEC ;Prepare for subtraction. WAIT2 PHA ;Save original (a) on stk. WAIT3 SBC #1 BNE WAIT3 ;Count (a) down to zero. PLA ;Do it again. SBC #1 BNE WAIT2 (FCB3) RTS (DB6F) PLA ;Get char back from stack. (DB70) RTS (DAFD) EOR #$FF ;Why??? (DAFF) RTS (F1B6) . . . - find highest RAM location in machine - put highest memory available to Applesoft program (plus 1) in MEMSIZ ($73,$74). - set end of free space/top of string storage (FRETOP, $6F,$70). - turn off $D6 run protection switch. - put a $00 in $800. - make sure there is at least one page of free space between start of Applesoft program (TXTTAB, $67,$68) and end of free space (FRETOP, $6F,$70). - simulate NEW (and CLEAR) commands. (Adjusts almost all major page zero pointers). - set USR jump vector ($0A - $0C). - set GOWARM jump vector ($00 - $02). . . (F1D2) JMP (GOWARM) ;Jump to BASIC's main command loop ------------ ;known as RESTART. * BASIC'S WARMSTART ROUTINE. * (Enter with OPUTCOND = $00 and * CONDNFLG = $80 for coldstart * or $00 for warmstart.) (D43C) RESTART JSR CRDO * PRINT A THRU BASIC, DOS'S OUTPUT * HANDLER (OPUTINCP) AND MONITOR ROM. (DAFB) CRDO . . (See dis'mbly above.) . . (RTS) * PRINT A PROMPT THRU BASIC, DOS'S OUTPUT * HANDLER (OPUTINCP) AND MONITOR ROM. * Then, intercept input thru DOS's input * handler (INPTINCP). (D43F) LDX #$DD ;RH brackett for applesoft prompt. (D441) JSR INLINPL2 (D52E) INLINPL2 STX PROMPT (D530) JSR GETLN (FD6A) GETLN LDA PROMPT (FD6C) JSR COUT * Print prompt via DOS intercepts. (FDED) COUT JMP (CSW) ;Jump to DOS's output handler. ------------ * DOS's output intercept routine. * (Intercepts all output to screen * or other peripherals.) (9EBD) OPUTINCP JSR PREP4DOS * Save registers & stack pointer. * Restore the I/O hooks. (9ED1) PREP4DOS STA ASAVED ;Save (a), (y) & (x) STX XSAVED ;registers. (9ED7) STY YSAVED * Adjust stack pointer and save it so * when later restore it and hit an * "RTS", we can return to the routine * that called the routine that * contained the "JSR PREP4DOS" * instruction. (In this case, set * it to return to $FD6F.) (9EDA) TSX INX INX (9EDD) STX STKSAVED * Restore the I/O hooks to point to * the true I/O handlers, ex: * KSWTRUE: KEYIN --> KSW: KEYIN. * CSWTRUE: COUT1 --> CSW: COUT1. (9EE0) UNCONDOS LDX #3 SETRUHKS LDA CSWTRUE,X STA CSW,X DEX BPL SETRUHKS ;4 bytes to move. (9EE8) RTS * Use current condition to index table * containing addresses of output handlers. * Do a "stack jump" to appropriate handler * (condition 0 for coldstart). (9EC0) LDA OPUTCOND ;Get current condition. ASL ;Times 2 cause 2 bytes / address. TAX ;Set (x) to index table of addresses. LDA OUTHNDTB+1,X ;Put adr of output handler on stack PHA ;(hi byte first) and then do a "stack jump". LDA OUTHNDTB,X PHA LDA ASAVED ;Save char to be printed. (9ED0) RTS ;Execute the "stack jump". . . DO STACK JUMP. . . * Output handler 0. * (Evaluate start of line.) (9EEB) OPUTHDL0 LDX RUNTRUPT ;Contains a non-zero value if DOS ;RUN cmd is presently being interrupted ;to accommodate a LOAD. ;($00 = no interruption, ;$40 = A(ROM) interrupted, ;$80 = A(RAM) interrupted) (9EEE) BEQ NONTRUPT ;Branch when using FP command. * File not being read. (9EF3) NONTRUPT LDX CONDNFLG ;Get condition flag. ;Are we doing a warmstart ($00), ;coldstart ($80), using A(RAM) ($C0) ;or doing a read ($01). (9EF6) BEQ SETIGNOR ;Branch if warmstarting. * Doing coldstart, reading file or using A(RAM). * Check (a) to see if using "?" associated with * reading an INPUT statement. (9EF8) CMP #"?" ;If reading, then using "?" as prompt. BEQ OPUTHDL6 ;Go display input conditionally if reading. CMP PROMPT ;Is (a) = prompt char? (9EFE) BEQ SET2EVAL ;Branch if about to print prompt. * Output handler 2. * (Ignore non-DOS commands.) (9F27) SET2EVAL LDX #0 ;SET CONDITION 0 - evaluate start of line. STX OPUTCOND (9F2C) JMP DSPLYALL ;Go display char unconditionally. ------------ * Send char to output device. (9FA4) DSPLYALL JSR RESTOREG * Restore (a), (y) & (x) registers. (9FBA) RESTOREG LDA ASAVED LDY YSAVED LDX XSAVED SEC ;Why????? (9FC4) RTS JSR GODSPLY * PRINT APPLESOFT PROMPT through * the true output handler (COUT1). (9FC5) GODSPLY JMP (CSW) ----------- (FDF0) COUT1 . . (See dis'mbly in APPLE II REFERENCE MANUAL.) . . (RTS) * Save registers & set hooks. (9FAA) STA ASAVED ;Save (a), (y) & (x) registers. STY YSAVED (9FB0) STX XSAVED * Routine to exit DOS. (9FB3) DOSEXIT JSR INITIOHK * Initialize the I/O hooks so that * DOS intercepts all input & output. (AB51) INITIOHK . . (See dis'mbly above.) . . (RTS) (9FB6) LDX STKSAVED ;Retrieve saved stack pointer. TXS RESTOREG LDA ASAVED ;Restore (a), (y) and (x) registers. LDY YSAVED LDX XSAVED SEC ;Why????? (9FC4) RTS ;Return to the routine that called ;the routine that contained the ;"JSR PREP4DOS" instruction. * Get a single byte of input. (FD6F) LDX #1 BCKSPC TXA ;Force fall thru of next instruc. BEQ GETLNZ DEX ;Initialize (x) = index to input buf. NXTCHAR JSR RDCHAR (FD75) * Routine to read an input byte. (FD35) RDCHAR JSR RDKEY (FD0C) RDKEY LDY CH LDA (BASL),Y ;Get char in nxt (FD10) PHA ;anticipated pos'n ;& put it on stk ;for safekeeping. (FD11) AND #$3F ;Now chng image of ORA #$40 ;nxt anticipated (FD15) STA (BASL),Y ;pos'n to flashing ;& put it back on ;the screen. (FD17) PLA ;Pull nxt anticipated ;char off stk. (FD18) JMP (KSW) ;Follow the input hk. ------------ * DOS intercepts input. (9E81) INPTINCP JSR PREP4DOS * Adjust & save * the stack ptr. * (In this case, * set it to rtn * to $FD38.) * Reset hooks to * point at true * I/O handlers. (9ED1) PREP4DOS . . (See dis'mbly above.) . . (RTS) (9E84) LDA CONDNFLG ; = $80 if cold. (9E87) BEQ INPUTWRM ;Branch if warm. * Reading file or coldstarting. (9E89) PHA ;Save (a) on stack. LDA ASAVED ;Put char on screen. STA (BASL),Y PLA (9E90) BMI INPUTCLD ;Branch for cold. * Doing a coldstart. (9E95) INPUTCLD JSR KEYCOLD (9DEA) KEYCOLD . . ...................................................... . . . * Test if using A(RAM) or not. . * On entry, (a) = contents of CONDNFLG. . * = $00 = warmstart. . * = $01 = reading. . * = $80 = coldstart. . * = $C0 = using A(RAM). . (9DEA) . KEYCOLD ASL ;(a) * 2 to drop out hi bit. . (9DEB) BPL SKPDARAM ;Branch if not using A(RAM). . . (9E06) . SKPDARAM LDA MAXDFLT ;Set MXFILVAL to default val of 3. . (9E09) STA MXFILVAL ;Note: Default value can be changed . ;by setting MAXDFLT to a value . ;between 1 and 16 & then INITing a disk. . (9E0C) JSR BILDBUFS ;Go build the DOS buffers. . . (A7D4) . BILDBUFS . . . . (long routine, see dis'mbly . in maxfiles command.) . . . . . (RTS) . . (9E0F) LDA EXECFLAG ;Check if an exec file is running. . (9E12) BEQ SKPDEXEC ;Branch if not EXECing. . . SKPDEXEC JSR RESTAT0 . (9E1D) . . * Reset CONDNFLG and OPUTCOND to zero . * to signal warmstart (ie. file not being . * read) & set condition to evaluate start . * of line on rtn to output intercepts. . (A75B) . RESTAT0 LDY #0 . STY CONDNFLG . STY OPUTCOND . (A763) RTS . . * Check if disk was just booted. . * (If just booted disk, NDX2CMD contains . * a $00 which was etched on the disk when . * the disk was originally INITed.) . (9E20) LDA NDX2CMD ;Was last command an "INIT"? . (9E23) BNE OLDBOOT ;No - take branch. . . * Check to see if a command is pending. . (9E45) . OLDBOOT LDA NEXTCMD . (9E48) BEQ NOPEND ;Branch if no pending command. . ;(ALWAYS TAKE WITH FP CMD.) . ...................................................... . . (9E50) NOPEND RTS ======== * Put cursor (flashing spc) on screen. (9E98) LDY CH ;Horiz pos'n. LDA #$60 ;Flashing spc. (9E9C) STA (BASL),Y * At this point both CONDNFLG * & OPUTCOND = 0 for both * cold- and warm-starts. (9E9E) INPUTWRM LDA EXECFLAG ;Are we EXECing? (9EA1) BEQ INPTNOXC ;No. (9EA6) INPTNOXC LDA #3 ;SET CONDITION 3. (9EA8) STA OPUTCOND ;(WANT TO PROCESS ;INPUT INORMATION.) (9EAB) JSR RESTOREG * Restore regs. (9FBA) RESTOREG LDA ASAVED LDY YSAVED LDX XSAVED SEC (9FC4) RTS (9EAE) JSR TOTRUIN (9EBA) TOTRUIN JMP (KSW) --------- * Monitor ROM's * true input * handler. (FD1B) KEYIN . . - WAIT FOR KEYPRESS . . (See dis'mbly in APPLE II REFERENCE MANUAL.) . . (RTS) (9EB1) STA ASAVED ;Save char & (x). STX XSAVED (9EB7) JMP DOSEXIT ;Exit DOS. ------------ (9FBE) DOSEXIT JSR INITIOHK * Reset I/O hooks * to point to DOS. (AB51) INITIOHK . . (See dis'mbly above.) . . (RTS) * Reset stack pointer to return to caller * and restore registers. (9FB6) LDX STKSAVED ;Reset the stack TXS ;pointer. RESTOREG LDA ASAVED ;Restore regs. LDY YSAVED LDX XSAVED SEC ;Why????? (9FC4) RTS (FD38) CMP #$9B ;Was the key pressed? BEQ ESC ;Yes - go handle escape. (FD3C) RTS ;No (FD78) . . - Continue on to print char input from keyboard & then go back to NXTCHAR to get more input. - When detects a , goes to DOS's parsing routine (see PARSECMD, $9FCD listed in formatted disassembly titled "DOSCMDPARSINGANDPROCESSING"). - If a DOS command is parsed, goes on to execute command, else goes back to check for an Applesoft command. If neither a DOS or an Applesoft command is detected, a syntax-error message is generated.