****************************************************************** * * * INT Command Handler * * * *----------------------------------------------------------------* * * * The INT command tries to select the Integer language and * * then coldstart both DOS and BASIC. * * Language selection is done by throwing the appropriate * * switches to activate either the language card or motherboard. * * If you are using an old AppleII machine, Integer is found on * * the motherboad. On newer model Apples however, the Integer * * language can SOMETIMES be found on the language card. If you * * have a an AppleII+ with a language card or an Apple IIe with a * * built in language card, AND IF, AND ONLY IF, you boot with the * * System Master Disk, the Integer language will be located. If * * all of these conditions aren't met, a language-not-found error * * message will be generated. (Booting with the System Master * * Disk is necessary because its greeting program (called "HELLO")* * loads a file called "INTBASIC" onto the language card. * * INTBASIC is a binary file which contains an image of the * * Integer basic language.) * * Once the INT command handler discovers the presence of the * * Integer language, it zeroes out the run interrupt flag * * (RUNTRUPT, $AAB7) and jumps into DOS's cold start routine * * (DOSCOLD, $9D84). The cold start routine sets the drive and * * slot values and then loads the active basic flag (ACTBSFLG, * * $AAB6) with a #$00 to signal that the Integer language is * * being used. Next an image of the Integer basic entry point * * vector table is copied to the ACTIVE basic entry point vector * * table. The I/O hooks are then set to point to DOS's input and * * output handlers (INPTINCP, $9E81 and OPUTINCP, $9EBD) so that * * DOS can intercept all input and output. Finally, a "NOMON" * * command is simulated, the condition flag (CONDFLG, $AA51) is * * set to indicate a coldstart is being done (#$00) and execution * * jumps into BASIC's cold start routine (BASICCLD, $E000). * * BASICCLD wipes out any programs in memory and configures the * * machine for running Integer programs. * * * ****************************************************************** * On Entry - No file name or other options * are applicable to the INT command. (A59E) CMDINT LDA #$20 ;Opcode for "JSR". (A5A0) JSR SETROM ;Test if language wanted is present on the ;language card or motherboard. * Test card or motherboard to insure that the * 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 address if want to use * 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 switches pointing at last tested (A5C5) ;device. If desired language present, ;switches are left with appropriate device ;selected. (A5A3) BEQ INTPRSNT ;Integer basic is present either ;on card or motherboard. * Integer basic not present. (A5A5) NOLNGINT LDA #1 ;Set error code for "language not available". (A5A7) JMP ERRHNDLR ;Go print error message & exit. ------------ ;(See dis'mbly of errors.) * Integer basic present on device. (A5AA) INTPRSNT LDA #0 ;Desired basic is present, so zero out (A5AC) STA RUNTRUPT ;the run interrupt flag cause we won't ;be doing an interrupt to load a language. TODOSCLD JMP DOSCOLD ;Go into DOS's coldstart routine. (A5AF) ------------ * DOS's coldstart routine. (P.S. Don't confuse * with basic's coldstart routine - BASICCLD). * NOTE: THE FOLLOWING DISASSEMBLY IS INCOMPLETE. * Only those portions of the coldstart routine * applicable to the INT cmd are shown. * Set the slot & drive default parameters. (9D84) DOSCOLD LDA IBSLOT ;Slot # * 16 from RWTS's IOB table. 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 ;FALL THRU FOR INTEGER. * Integer basic is active. (9D9B) ISINT STA ACTBSFLG ;Set active basic flag to denote integer ($00). * Copy INTEGER basic's entry point vector table * to the ACTIVE basic entry point vector table. (9D9E) LDX #10 INT2BSIC LDA IMGINTV-1,X STA CHAINTRY-1,X DEX BNE INT2BSIC ;10 bytes to copy (10 --> 1). (9DA9) JMP BYPASWRM ------------ (9DBC) BYPASWRM SEC ;(c) = 1 = signal for coldstarting. (9DBD) BCS CMWRMCLD ;Force branch to bypass part ;of the warmstart routine. (9DD1) CMWRMCLD PHP ;Save (c) denoting warm or cold on stack. (9DD2) JSR INITIOHK ;Initialize the 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 handle 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 CONDITION 0. PLP ;Get saved status back off stack & rotate ROR ;(c) into (a) to set CONDNFLG=$00 for STA CONDNFLG ;warmstart or CONDNFLG=$80 for coldstart. (9DE2) BMI LANGCOLD ;Branch if doing coldstart. (9DE7) LANGCOLD JMP (TOCLDVEC) ;Actually a "JMP (9D5C)" which points to ------------ ;BASIC's coldstart routine (BASICCLD) at $E000. ********** NOW IN INTEGER BASIC ********** (E000) BASICCLD JSR BSCOLDST ;JSR's to INTEGER basic's cold start. . . - wipes out any programs presently in memory and configures RAM for running Integer programs. =======================================