💾 Archived View for mirrors.apple2.org.za › archive › www.textfiles.com › apple › ANATOMY › cmdint.t… captured on 2024-08-19 at 03:01:46.
View Raw
More Information
⬅️ Previous capture (2023-01-29)
-=-=-=-=-=-=-
- *****************************************************************
- *
- 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.
(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.
=======================================