********************************** * * * ADDRESSES REFERRED TO BY DOS * * * ********************************** *--------------------------------* * ZERO-PAGE ADDRESSES * *--------------------------------* CH = $24 ;OFFSET FROM LEFT EDGE OF WINDOW ;TO NEXT CHR POS'N ON SCRN LINE. ;(RANGE: $00-$23.) PT2BTBUF = $26 ;PTR ($26,$27) TO TARGET BUF USED ;WHEN READING IN DOS DURING BOOT. HOLDNIBL = $26 ;TEMP REG USED FOR HOLDING TWO- ;ENCODED NIBBLES WHEN WRITING ;A SECTOR DURING RWTS'S FORMAT OR ;WRITE OPERATIONS. PROSCRTH = $26 ;TEMP REG USED FOR: ;- DECODING ODD/EVEN ADDR FIELD ; BYTES. ;- CNTR AND INDEX TO RWTS BUFFERS ; (1 & 2) WHEN POSTNIBBLING. ;- CNTR FOR # OF CHANCES TO FIND ; THE CORRECT ADDR PROLOGUE. STPSDONE = $26 ;- CNTR FOR # OF HALFTRKS MOVED. ;- CURRENT DISTANCE (EXPRESSED IN ; HALFTRACKS) FROM THE START OR ; DESTINATION HALFTRACK POS'NS. FRMTSLOT = $27 ;SLOT * 16 USED TO INDEX DRIVE ;BASE ADDRESSES. HOLDPRES = $27 ;HOLDS CURRENT HALFTRACK POSITION ;WHEN SEEKING. CKSUMCAL = $27 ;RUNNING CHKSUM CALCULATION USED ;WHEN READING ODD-EVEN ENCODED ;ADDRESS FIELD BYTES. BASL = $28 ;PTR ($28,$29) TO THE LEFT END OF ;THE SCREEN LINE. DESTRK = $2A ;DESTINATION HALFTRACK POS'N WHEN ;SEEKING. SLT16ZPG = $2B ;SLOT*16 USED TO INDEX DRIVE ;FUNCTIONS. CKSUMDSK = $2C ;DECODED CHECKUSM VAL READ FROM ;ADDR FIELD (RWTS). SECDSK = $2D ;PHYS SEC # FOUND IN ADDR FIELD. TRKDSK = $2E ;TRK # FOUND IN ADDR FIELD. VOLDSK = $2F ;VOL # FOUND IN ADDR FIELD. PROMPT = $33 ;PROMPT CHAR USED TO SIGNAL INPUT ;IS REQUIRED. ALSO USED AS A FLG ;IN THE CMD PARSING & PROCESSING ;ROUTINES. DRVZPG = $35 ;DENOTES DRIVE SELECTED: ; NEG = DRIVE 1, POS = DRIVE 2. CSW = $36 ;MAIN OUTPUT HOOK (ALSO KNOWN AS ;THE CHARACTER OUTPUT SWITCH). ;PTR ($36,$37) TO DEVICE/ROUTINE ;WHICH HANDLES OUTPUT CHARACTERS. KSW = $38 ;MAIN INPUT HOOK (ALSO KNOWN AS ;THE KEYBOARD SWITCH). ;PTR ($38,$39) TO DEVICE/ROUTINE ;THAT HANDLES INPUT CHARACTERS. PTR2DCT = $3C ;PTR ($3C,$3D) TO RWTS'S DEVICE ;CHARACTERISTIC TABLE. BOOTSEC = $3D ;PHYS SEC # WANTED WHEN BOOTING. PTR2RDSC = $3E ;PTR ($3E,$3F) TO BOOT0'S READ- ;SECTOR SUBROUT'N (BTRDSEC, $CS5C ;WHERE S=SLOT #, NORMALLY=$C65C.) PTR2BUF = $3E ;PTR ($3E,$EF) TO RWTS'S CURRENT ;DATA BUFFER. HOLDAA = $3E ;- HOLDS A CONSTANT ($AA) FOR ; PROLOGUE AND EPILOGUE BYTES ; USED WHEN FORMATTING. ;- ALSO USED AS A TEMP REG WHEN ; CREATING ODD-EVEN ENCODED BYTS ; ASSOC WITH THE ADDR FIELD. FRMTSEC = $3F ;HOLDS # OF SEC TO BE FORMATTED & ;ALSO ACTS AS CNTR FOR # OF SECS ;VERIFIED WHEN CHECKING TRK JUST ;FORMATTED. A3L = $40 ;MULTIPURPOSE REG & PTR ($40,$41) FRMTVOL = $41 ;VOL # TO WRITE WHEN FORMATTING. A4L = $42 ;MULTIPURPOSE REG & PTR ($42,$43) A5L = $44 ;MULTIPURPOSE REG & PTR ($44,$45) FRMTKCTR = $44 ;TRK# TO WRITE/READ WHEN FORMAT- ;TING/VERIFYING. ALSO ACTS AS A ;CNTR OF THE # OF TRKS FORMATTED/ ;VERIFIED. SYNCNTR = $45 ;# OF SYNC BYTES 2 WRT BTWN SECS ;& DELAY CNTR TO LET SOME SYNCS ;PASS BY READ HEAD WHEN VERIFYING ;A TRK JUST FORMATTED. MTRTIME = $46 ;MOTOR-ON-TIME COUNT ($46,$47). ;CNTR USED TO DETERMINE IF THE ;DRIVE MOTOR HAS BEEN ON LONG ;ENOUGH TO DO RELIABLE READING. ;THE MOTOR IS CONSIDERED TO BE UP ;TO SPEED AFTER APPROX. 1 SECOND ;(AT WHICH TIME, MTRTIME = 0000). PTR2IOB = $48 ;PTR ($48,49) TO RWTS'S INPUT/ ;OUTPUT BLOCK (IOB). STATUS = $48 ;STATUS REGISTER SAVE AREA. LOMEM = $4A ;PTR ($4A,$4B) 2 START OF INTEGER ;BASIC'S VARIABLE TABLE. HIMEM = $4C ;PTR ($4C,$4D) TO END OF INTEGER ;BASIC PRGM. TXTTAB = $67 ;PTR ($67,$68) TO START OF THE ;APPLESOFT PRGM TEXT. DEFAULTS TO ;$801 ON A COLDSTART (ONCE EXECU- ;TION FLOWS INTO APPLESOFT). ;PTR'S CONTENTS CAN BE CHANGED TO ;ACCOMMODATE THE LOADING OF AN ;APPLESOFT PRGM IN A NON-STANDARD ;POSITION. VARTAB = $69 ;PTR ($69,$6A) TO START OF SIMPLE ;VARIABLE TABLE. FRETOP = $6F ;PTR ($6F,$70) TO START OF FREE ;SPACE (LOCATED BTWN THE END OF ;THE VARIABLE TBL & THE START OF ;THE STRING VALUES). MEMSIZ = $73 ;PTR ($73,$74) TO HIGHEST MEMORY ;LOCATION (PLUS 1) THAT IS AVAIL- ;ABLE TO AN APPLESOFT PRGM. (NOT ;TO BE CONFUSED WITH THE END OF ;THE APPLESOFT PRGM). CAN ALSO BE ;EXPRESSED AS A PTR TO THE FIRST ;BYTE OF THE DOS BUFFER REGION. CURLIN = $75 ;CURRENT APPLESOFT PROGRAM LINE ;NUMBER ( $75,$76). USED BY DOS ;2 DETERMINE IF BASIC IS RUNNING. ;(CURLIN+1 CONTAINS AN $FF WHEN ;COMPUTER IS IN THE IMMED MODE.) PRGEND = $AF ;PTR ($AF,$B0) 2 END OF APPLESOFT ;PRGM (PLUS 1) IF FP CMD WAS USED ;OR TO END OF PRGM (PLUS 2) IF A ;NEW CMD WAS USED. INTPGMST = $CA ;PTR ($CA,$CB) TO START OF THE ;INTEGER PRGM. INTVRLND = $CC ;INTEGER BASIC'S CURRENT END-OF- ;VARIABLE PTR ($CC,$CD). PROTFLG = $D6 ;PRGM PROTECTION FLAG. ;IF PROTECTION FLAG IS ON (NEG), ;ALL APPLESOFT CMDS CAUSE A RUN & ;DOS'S SAVE CMD CAUSE A PHONY ;PROGRAM-TOO-LARGE ERROR MSG 2 BE ;GENERATED. ERRFLG = $D8 ;ON-ERROR FLAG. EQUALS $80 IF ;ON-ERR IS ACTIVE. RUNMODE = $D9 ;INTEGER BASIC'S MODE FLAG. ;CONTAINS A NEG VALUE IF INTEGER ;IS IN THE DEFERRED MODE. *--------------------------------* * PAGES TWO TO EIGHT * *--------------------------------* BUF200 = $200 ;THE INPUT BUFFER ($200-$2FF). ;(ALSO KNOWN AS KEYBOARD BUFFER.) PG3DOSVT = $3D0 ;START OF PAGE-3 DOS VECTOR TBL. RESETVEC = $3F2 ;RESET VECTOR. CONTAINS ADDR OF ;ROUT'N WHERE EXECUT'N DIVERTS TO ;WHEN THE RESET KEY IS PRESSED. VLDBYTE = $3F4 ;RESET VALIDATION BYTE. ;IF $3F3 EOR #$A5 IS NOT EQUAL TO ;$3F4, THEN DISK REBOOTS AND A ;COLDSTART IS DONE. OTHERWISE, ;EXECUTION GOES TO THE ADDR IN ;$3F2/$3F3. TRK4DRV1 = $478 ;BASE ADR USED TO REFERENCE THE ;LOCATION THAT CONTAINS THE LAST ;HALFTRACK ON WHICH DRIVE 1 WAS ;ALIGNED. PRESTRK = $478 ;- CURRENT HALFTRACK NUMBER. ;- SAVE REG FOR WHOLE TRK# WANTED ; WHEN HAVE TO GO RECALIBRATE. TRK4DRV2 = $4F8 ;BASE ADR USED TO REFERENCE THE ;LOCATION THAT CONTAINS THE LAST ;HALFTRACK ON WHICH DRIVE 2 WAS ;ALIGNED. RSEEKCNT = $4F8 ;CNTR FOR # OF RE-SEEKS ALLOWED ;BETWEEN RECALIBRATIONS (4 --> 1, ;DO RECALIBRATION WHEN CNTR = 0.) READCNTR = $578 ;CNTR FOR # OF ATTEMPTS ALLOWED 2 ;GET A GOOD ADDR OR DATA READ. SLOTPG5 = $5F8 ;SLOT*16 USED WHEN DOS WAS BOOTED SLOTPG6 = $678 ;SLOT*16 USED WHEN FORMATTING & ;WRITING. RECLBCNT = $6F8 ;CNTR FOR # OF RECALIBRATIONS ;ALLOWED BEFORE RWTS GIVES UP. BT1LDADR = $8FD ;BOOT1 LOAD ADDRESS ($8FD,$8FE). ;VARIES FROM $B600 TO $BF00. ;EVENTUALLY POINTS 2 THE START OF ;BOOT2 ($B700). BT1PG2RD = $8FF ;INITIALLY CONTAINS # OF SECS TO ;READ IN WHEN EXECUTING BOOT1. ;ALSO DOUBLES AS LOGICAL SEC #. ;(VARIES FROM $09 --> $00 -->$FF) ;(SEE DISCUSSION IN FORMATTED ;DIS'MBLY "THE BOOT PROCESS".) *--------------------------------* * RAM-BASED APPLESOFT ADDRESSES * * A(RAM) * *--------------------------------* CLRFPRAM = $E65 ;ENTRY POINT TO CLEAR VARIABLES ;FROM A RAM-BASED APPLESOFT PRGM. RUNFPRAM = $FD4 ;ENTRY POINT 2 EXECUTE RAM-BASED ;APPLESOFT PRGM. *--------------------------------* * DOS BUFFER START * *--------------------------------* DOSNMBF1 = $9CD3 ;ADDR OF FIRST DOS NAME BUFFER. *--------------------------------* * DRIVE FUNCTION BASE ADDRS * *--------------------------------* * NOTE: THE ACTUAL ADDRESSES * * USED ARE DEPENDENT UPON WHICH * * SLOT HOUSES THE DSK CONTROLLER * * CARD. (SEE COMMENTS IN ANY ONE * * OF THE FORMATTED DISASSEMBLIES * * OF RWTS FOR MORE DETAILS.) * MAG0FF = $C080 ;BASE ADDR TO TURN STEPPER MOTOR ;MAGNET ON OR OFF. MTROFF = $C088 ;BASE ADDR TO TURN DRV MOTOR OFF. MTRON = $C089 ;BASE ADR TO TURN DRV MOTOR ON. SELDRV1 = $C08A ;BASE ADR TO SELECT DRIVE 1. SELDRV2 = $C08B ;BASE ADR TO SELECT DRIVE 2. Q6L = $C08C ;SHIFT BYTE IN OR OUT OF LATCH. Q6H = $C08D ;LOAD LATCH FROM DATA BUS. Q7L = $C08E ;PREPARE TO READ. Q7H = $C08F ;PREPARE TO WRITE. BTRDSEC = $C65C ;BOOT0'S READ SECTOR SUBROUTINE. ;(ACTUALLY=$CS5C, WHERE S=SLOT#.) *--------------------------------* * APPLESOFT ADDRESSES * *--------------------------------* RESTART = $D43C ;APLSFT BASIC'S WRMSTART ROUTINE. SETLINKS = $D4F2 ;ROUT'N THAT CLEARS ALL VAR'BLES, ;RESETS THE STK PTR & RECALCS THE ;LINKS IN @ APPLESOFT PRGM LINE. ;(THIS ROUTINE IS WHAT ENABLES ;APLSFT PRGMS TO BE RELOCATABLE.) SETZPTRS = $D665 ;APPLESOFT ROUTINE THAT SIMULATES ;CLEAR & RESTORE STATEMENTS. NEWSTT = $D7D2 ;ROUTINE TO COLLECT & EXECUTE THE ;APPLESOFT PRGM STATEMENT. BSCERHLR = $D865 ;BASIC'S ERROR-HANDLING ROUTINE. BASICCLD = $E000 ;BASIC'S COLDSTART ROUTINE. *--------------------------------* * MONITOR ROM ROUTINES * *--------------------------------* OLDBRK = $FA59 ;DEFAULT BREAK INTERRUPT HANDLER. INIT = $FB2F ;SCREEN INITIALIZATION ROUTINE. ;(SET FULL SCREEN TEXT.) HOME = $FC58 ;BLANK OUT CURRENT SCROLL WINDOW ;& PUT THE CURSOR IN THE TOP LEFT ;CORNER OF THE WINDOW. (DOES NOT ;RESET THE WINDOW SIZE.) RDKEY = $FD0C ;REQUEST INPUT VIA INPUT HOOK. KEYIN = $FD1B ;WAIT FOR INPUT FROM KEYBOARD. PRBYTE = $FDDA ;PRINT CONTENTS OF (A) AS HX VAL. COUT = $FDED ;ROUTE OUTPUT VIA THE OUTPUT HK. COUT1 = $FDF0 ;MONITOR ROM (TRUE) OUTPUT HNDLR. SETKBD = $FE89 ;SELECT KEYBOARD AS INPUT DEVICE. INPORT = $FE8B ;ENTRY POINT TO SELECT INPUT ;DEVICE OTHER THAN KEYBOARD. SETVID = $FE93 ;SELECT SCREEN AS OUTPUT DEVICE. OUTPORT = $FE95 ;ENTRY POINT TO SELECT OUTPUT ;DEVICE OTHER THAN SCREEN. MONRTS = $FF58 ;AN RTS INSTRUC LOC'D IN MONITOR ;ROM. MANY RELOCATABLE PGMS "JSR" ;TO HERE IN ORDER TO LOAD UP THE ;STACK WITH THE ADDR OF THE "JSR" ;SO THEY CAN FIND OUT THE PRGM'S ;PRESENT LOCATION. MON = $FF65 ;NORM ENTRY ROUTE 2 MONITOR ROM. ;("CALL -151" GOES HERE.) * ==================================== * RELOCATABLE ADDRESS CONSTANTS TABLE. * ($9D00 - $9D0F) * (ADRS CAN BE CHANGED TO POINT TO * CUSTOMIZED ROUTINES, TABLES, ETC.) * ==================================== ADOSFNB1 DA DOSNMBF1 ;PTS TO FIRST DOS BUFFER AT ITS ;FILE NAME FIELD. ADINPTCP DA INPTINCP ;PTS TO DOS'S INPUT INTERCEPT ;ROUTINE. ADOPUTCP DA OPUTINCP ;PTS TO DOS'S OUTPUT INTERCEPT ;ROUTINE. ADRPFNBF DA PRIMFNBF ;PTS TO PRIMARY FILENAME BUFFER. ADRSFNBF DA SCNDFNBF ;PTS TO SECONDARY FILENAME BUFFER. ADLENADR DA LENADRBF ;PTS TO 2-BYTE BUF THAT RECEIVES ;BLOAD ADR & LENGTH READ FROM DSK ADOSTART DA ADOSFNB1 ;PTS TO 1RST BYTE OF DOS. ADFMPARM DA OPCODEFM ;PTS TO FM PARAMETER LIST. *===================================== * TABLE OF OUTPUT HANDLER ENTRY POINTS * ($9D10 - $9D1D) * (ADR-1 OF ROUT'NS WHICH HANDLE PRINT * STATEMENTS CONTAINING DOS CMDS.) *===================================== OUTHNDTB DA OPUTHDL0-1 ;EVALUATE START OF INPUT LINE. DA OPUTHDL1-1 ;COLLECT THE DOS COMMAND. DA OPUTHDL2-1 ;PRINT A AND RETURN. DA OPUTHDL3-1 ;PROCESS THE INPUT INFORMATION. DA OPUTHDL4-1 ;WRITE DATA TO DISK. DA OPUTHDL5-1 ;ANALYZE 1RST CHR OF DATA FRM DSK DA OPUTHDL6-1 ;IGNORE INPUT PROMPT ("?"). *======================================= * COMMAND HANDLER ENTRY POINT TABLE * ($9D1E - $9D55) * ALL ADRS ARE ONE LESS THAN THE ACTUAL * ENTRY POINTS BECAUSE THESE ROUT'NS ARE * ENTERED VIA A "STACK JUMP". IF YOU * CREATE A NEW DOS CMD, PLACE THE ADR-1 * OF THE NEW CMD IN THE FOLLOWING TABLE. * (ALSO MAKE SURE THAT THE FIRST CMD IN * THE TABLE CAN CREATE A NEW FILE.) * SOME AUTHORS DISABLE SPECIFIC DOS * CMDS BY POINTING THE CMD'S TABLE ADR * AT DOS'S COLDSTART ROUTINE OR BY * PLACING AN "RTS" OPCODE AT THE CMD'S * ENTRY POINT. *======================================= CMDTBL DA CMDINIT-1 ; $A54F-1 DA CMDLOAD-1 ; $A413-1 DA CMDSAVE-1 ; $A397-1 DA CMDRUN-1 ; $A4D1-1 DA CMDCHAIN-1 ; $A4F0-1 DA CMDELETE-1 ; $A263-1 DA CMDLOCK-1 ; $A271-1 DA CMDUNLOK-1 ; $A275-1 DA CMDCLOSE-1 ; $A2EA-1 DA CMDREAD-1 ; $A51B-1 DA CMDEXEC-1 ; $A5C6-1 DA CMDWRITE-1 ; $A510-1 DA CMDPOSN-1 ; $A5DD-1 DA CMDOPEN-1 ; $A2A3-1 DA CMDAPPND-1 ; $A298-1 DA CMDRENAM-1 ; $A281-1 DA CMDCATLG-1 ; $A56E-1 DA CMDMON-1 ; $A233-1 DA CMDNOMON-1 ; $A23D-1 DA CMDPR-1 ; $A229-1 DA CMDIN-1 ; $A22E-1 DA CMDMXFIL-1 ; $A251-1 DA CMDFP-1 ; $A57A-1 DA CMDINT-1 ; $A59E-1 DA CMDBSAVE-1 ; $A331-1 DA CMDBLOAD-1 ; $A35D-1 DA CMDBRUN-1 ; $A38E-1 DA CMDVERFY-1 ; $A27D-1 *=========================================== * ACTIVE BASIC ENTRY POINT VECTOR TABLE * ($9D56 - $9D61) * (NOTE: TBL CUTOMIZED BY DOS ACCORDING TO * THE CURRENT VERSION OF BASIC THAT IS BEING * USED. ADRS SHOWN AS OPERANDS BELOW, * ASSUME THAT APPLESOFT BASIC IS ACTIVE.) *=========================================== CHAINTRY DA RUNFPROM ;ADR OF CHAIN ENTRY PT TO BASIC. RUNTRY DA RUNFPROM ;ADR OF BASIC'S RUN CMD. ADBSCERR DA BSCERHLR ;ADR OF BASIC'S ERROR HANDLER. TOCLDVEC DA BASICCLD ;ADR OF BASIC'S COLD START ROUT'N TOWRMVEC DA RESTART ;ADR OF BASIC'S WARM START ROUT'N RLOCNTRY DA SETLINKS ;ADR OF ROUT'N THAT ENABLES BASIC ;PRGMS TO BE RELOCATABLE. *==================================== * IMAGE OF INTEGER BASIC'S ENTRY * POINT VECTOR TABLE ($9D62 - $9D6B). *==================================== IMGINTV DA $E836 DA $A4E5 DA $E3E3 DA $E000 DA $E003 *======================================= * IMAGE OF ROM APPLESOFT BASIC'S ENTRY * POINT VECTOR TABLE ($9D6C - $9D77). *======================================= IMGFPV DA RUNFPROM DA RUNFPROM DA BSCERHLR DA BASICCLD DA RESTART DA SETLINKS *======================================== * IMAGE OF RAM APPLESOFT BASIC'S ENTRY * POINT VECTOR TABLE ($9D78 - $9D83). * (NOTE: A(RAM) REFERS TO A DISK-BASED * VERSION OF APPLESOFT BASIC THAT IS * HOUSED ON THE "SYSTEMS MASTER" DISK.) *======================================== IMGARAMV DA FPRAMRUN DA FPRAMRUN DA $1067 DA $9D84 DA $C3C DA $CF2 *================================= * DOS'S COLD START ROUTINE. * (PS. DON'T CONFUSE WITH BASIC'S * COLD START ROUTINE - BASICCLD.) *================================= * GET SLOT & DRV #'S & STORE THEM AS * DEFAULT VALS IN CASE NO SUCH PARMS * WERE ISSUED WITH THE COMMAND. DOSCOLD LDA IBSLOT ;SLOT# * 16 FROM RWTS'S IOB TBL. LSR ;DIVIDE BY 16. LSR LSR LSR STA SLOTPRSD ;PUT SLOT IN PARSED TABLE. LDA IBDRVN ;DRV # FROM RWTS'S IOB. STA DRVPRSD ;PUT DRIVE # IN PARSED TABLE. * CHK WHICH BASIC IS IN ROM. LDA BASICCLD ;SET IDENTIFYING BYTE WITH EOR #$20 ;$20 = INTEGER OR $40 = A(ROM). BNE ISFPROM ;BRANCH IF APPLESOFT IS IN ROM. * INTEGER BASIC IS ACTIVE. ISINT STA ACTBSFLG ;SET ACTIVE BASIC FLAG ;TO DENOTE INTEGER (#$00). * COPY IMAGE OF INTEGER BASIC'S * ENTRY POINT VECTOR TABLE TO THE * ACTIVE BASIC ENTRY VECTOR TABLE. LDX #10 INT2BSIC LDA IMGINTV-1,X STA CHAINTRY-1,X DEX BNE INT2BSIC ;10 BYTES TO COPY (10 --> 1). JMP BYPASWRM * COPY IMAGE OF APPLESOFT'S ENTRY * POINT VECTOR TABLE TO THE ACTIVE * BASIC ENTRY POINT VECTOR TABLE. ISFPROM LDA #$40 ;SET ACTIVE BASIC FLAG TO #$40 STA ACTBSFLG ;SO SIGNAL APPLESOFT ROM. LDX #12 AROM2BSC LDA IMGFPV-1,X STA CHAINTRY-1,X DEX BNE AROM2BSC BYPASWRM SEC ;(C) = 1, SIGNAL FOR COLDSTART. ;(C) = 0, SIGNAL FOR WARMSTART. BCS CMWRMCLD ;FORCE BRANCH TO BYPASS PART OF ;THE WARMSTART ROUTINE. *================================= * DOS'S WARMSTART ROUTINE. * (PS. DON'T CONFUSE WITH BASIC'S * WARMSTART ROUTINE - RESTART.) *================================= DOSWARM LDA ACTBSFLG ;SEE WHICH LANGUAGE IS UP. BNE CKBASIC ;IF A(ROM), #$40 OR A(RAM), #$80. * INTEGER WAS UP. LDA #$20 ;(A) = OPCODE FOR "JSR" INSTRUC. BNE DTRMNBSC ;ALWAYS. * ACTIVE BASIC FLAG DENOTED THAT A * VERSION OF APPLESOFT WAS ACTIVE, * SO NOW CHECK IF DEALING WITH * A(RAM) OR A(ROM). CKBASIC ASL ;MULTIPLY CODE TIMES 2. BPL FORWARM ;BRANCH IF A(RAM). ;(IE. A(RAM) YEILDS $40 * 2 = $80 ;& A(ROM) YEILDS $80 * 2 = $00.) * USING A(ROM). LDA #$4C ;(A) = OPCODE FOR "JMP" INSTRUC. DTRMNBSC JSR SETROM ;GO TEST CARD OR MOTHERBOARD TO ;INSURE THAT DEVICE CONTAINING ;ROM VERSION WE WANT IS SELECTED. FORWARM CLC ;(C) = 0, SIGNAL FOR WARMSTART. CMWRMCLD PHP ;SAVE (C) DENOTING WARM OR COLD. JSR INITIOHK ;INITIALIZE THE I/O HOOKS SO THAT ;DOS INTERCEPTS ALL IN/OUTPUT. LDA #0 STA CIOCUMUL ;SIMULATE A "NOMON" COMMAND. ;NOTE: CAN "NOP" OUT THIS INSTRUC ;TO DEFEAT "NOMONCIO" WHEN COLD- ;OR WARMSTARTING. STA OPUTCOND ;SET CONDITION 0. PLP ;GET SAVED STATUS BACK OFF STK & ROR ;ROTATE (C) INTO HI BIT OF (A) TO STA CONDNFLG ;SET CONDNFLG = $00 FOR WARMSTART ;OR CONDNFLG = $80 FOR COLDSTART. BMI LANGCOLD ;BRANCH IF DOING COLDSTART. LANGWARM JMP (TOWRMVEC) ;JMPS TO BASIC'S WARMSTART ROUT'N ;(RESTART) AT $D43C. LANGCOLD JMP (TOCLDVEC) ;JMPS TO BASIC'S COLDSTART ROUT'N ;(BASICCLD) AT $E000. *================================= * INITIAL PROCESSING WHEN FIRST * KEYBOARD INPUT REQUEST IS MADE * BY BASIC AFTER A COLDSTART. *================================= * TEST IF USING A(RAM) OR NOT. * ON ENTRY, (A) = CONTENTS OF CONDNFLG. * = $00 = WARM START. * = $01 = READING. * = $80 = COLD START. * = $C0 = USING A(RAM). KEYCOLD ASL ;(A) * 2 TO DROP OUT HI BIT. BPL SKPDARAM ;BRANCH IF NOT USING A(RAM). STA ACTBSFLG ;USING A(RAM) - WAS LOADED BY ; INTEGER BASIC ROM ; - ACTV BSC FLG=$80 * COPY IMAGE OF A(RAM)'S ENTRY * POINT VECTOR TABLE TO THE * ACTIVE BASIC ENTRY POINT VECTOR * TABLE. LDX #12 ARAM2BSC LDA IMGARAMV-1,X STA CHAINTRY-1,X DEX BNE ARAM2BSC * BLANK OUT THE PRIMARY FILENAME * BUFFER TO MAKE SURE A "HELLO" * FILE WON'T BE RUN. LDX #29 ;30 BYTES TO BLANK (29 --> 00). BLNKPRIM LDA SCNDFNBF,X ;COPY BLANK SECONDARY TO PRIMARY. STA PRIMFNBF,X DEX BPL BLNKPRIM * BUILD DOS BUFS & SET CONDITION. SKPDARAM LDA MAXDFLT ;SET MXFILVAL TO DEFAULT VAL OF 3 STA MXFILVAL ;NOTE: DEFAULT VAL CAN BE CHANGED ;BY SETTING MAXDFLT BTW'N 1 - 16 ;AND THEN INITING A DISK. JSR BILDBUFS ;GO BUILD THE DOS BUFFERS. LDA EXECFLAG ;CHK IF AN EXEC FILE IS RUNNING. BEQ SKPDEXEC ;BRANCH IF NOT EXECING. PHA ;YES - WE ARE EXECING. JSR PT2EXEC ;GET ADR OF BUF WE'RE EXECING IN. PLA ;RETRIEVE EXEC FLG FROM STK. LDY #0 ;RESERVE DOS BUFFER FOR EXECING STA (A3L),Y ;IN CASE WE WANT TO MODIFY DOS TO ;EXEC ON THE BOOT? SKPDEXEC JSR RESTAT0 ;SET CONDNFLG=0 SO SIGNAL FILE ;NOT BEING READ. ;RESET OPUTCOND=0 (TO SIGNAL WANT ;TO EVALU8 START OF LINE ON RTN). * 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.) LDA NDX2CMD ;WAS LAST CMD AN "INIT"? BNE OLDBOOT ;NO - TAKE BRANCH. * DISK WAS JUST BOOTED SO COPY IMAGE * OF DOS'S ENTRY POINT VECTOR TABLE * TO PAGE 3. LDX #47 ;48 BYTES TO COPY (47 --> 0). STOR3DOS LDA IMGDOSVT,X ;COPY IMAGE TO PAGE 3. STA PG3DOSVT,X DEX BPL STOR3DOS * PROGRAM THE RESET KEY TO POINT AT * DOS'S WARMSTART ROUTINE. * * NOTE THAT THE RESET KEY CAN BE * PROGRAMMED TO PT AT ANY LOCATION * SIMPLY BY PUTTING THE ADR OF THE * TARGET ROUTINE (IN LOW/HI FORMAT) * IN $3F2/$3F3. NEXT, EOR THE * CONTENTS OF $3F3 WITH THE NUMBER * #$A5 AND PUT THE RESULT IN $3F4. * (IF $3F3 EOR #$A5 < > $3F4, THEN * DISK REBOOTS & A COLDSTART IS DONE.) LDA IMGDOSVT+2 ;WRITE OVER OLD (OUT-DATED) IMAGE STA RESETVEC+1 ;WHICH CONTAINED A "JSR MON" EOR #$A5 ;INSTRUC APPLIC TO NON-AUTOSTART. STA VLDBYTE ;SET VALIDATION (POWER UP) BYTE. LDA IMGDOSVT+1 STA RESETVEC * SET THE COMMAND INDEX TO RUN * THE "HELLO" FILE. LDA #6 ;CMD INDEX FOR "RUN". ;(CAN BE CHANGED TO "BRUN", ETC.) BNE DOPENDNG ;ALWAYS. * CHECK IF A COMMAND IS PENDING. OLDBOOT LDA NEXTCMD BEQ NOPEND ;NO CMD PENDING. * GO DO THE PENDING COMMAND. IF THE * DISK WAS JUST BOOTED, THEN RUN THE * "HELLO" FILE. NOTE THAT THE ACTUAL * NAME OF THE HELLO FILE RESIDES IN * THE PRIMARY FILENAME BUFFER. IT * WAS WRITTEN TO THE DISK AS PART OF * THE DOS IMAGE WHEN THE DISK WAS INITED. * THERE4, IF YOU WANT TO CHANGE THE * NAME OF THE HELLO FILE, YOU MUST: * (1) CHNG NAME IN FILENAME FIELD * OF DIRECTORY SEC. (EASIEST JUST * TO USE THE RENAME CMD.) * (2) ZAP PRIMARY NAME BUF ON DISK * (TRK$01/SEC$09/OFFSETS$75-$92). DOPENDNG STA NDX2CMD ;SET CMD INDEX & GO DO CMD. JMP DODOSCMD NOPEND RTS *================================= * IMAGE OF DOS VECTOR TABLE. * (COPIED TO PAGE 3, $3D0 - $3FF.) *================================= ; PAGE-3 ADDR & FUNCTION IMGDOSVT JMP DOSWARM ;$3D0 - GO TO DOS'S WARM START ;ROUTINE. LEAVE PGRM INTACT. JMP DOSCOLD ;$3D3 - GO TO DOS'S COLD START ;ROUT'N. RESET HIMEM, REBUILD DOS ;BUFS & WIPE OUT PRGM. JMP FMXTNTRY ;$3D6 - ALLOW USER TO ACCESS FM ;VIA HIS OWN ASSEMBLY LANG PRGMS. JMP ENTERWTS ;$3D9 - ALLOW USER TO ACCESS RWTS ;VIA HIS OWN ASSEMBLY LANG PRGMS. LDA ADFMPARM+1 ;$3DC - LOCATE FM PARAMETER LIST. LDY ADFMPARM RTS LDA ADRIOB+1 ;$3E3 - LOCATE RWTS'S I/O BLOCK. LDY ADRIOB RTS JMP INITIOHK ;$3EA - PT I/O HOOKS AT DOS'S ;INTERCEPT HANDLERS. NOP NOP JMP OLDBRK ;$3EF - GOES TO MONITOR'S ROUTINE ;WHICH HANDLES "BRK" INSTRUC'S. JMP MON ;AFTER THIS INSTRUCTION IS COPIED ;TO PAGE 3 (AT $3F2 - $3F4), THE ;ROUTINE AT $9E30 OVERWRITES THE ;PAGE-3 IMAGE 2 PROGRAM THE RESET ;KEY. THIS OVERWRITTING IS DONE 2 ;ACCOMMODATE NEWER "AUTOSTART" ;ROM USED IN THE APPLE II+, IIE & ;IIC MACHINES. THE PAGE-3 LOC'S ;ARE DESCRIBED BELOW: ;$3F2/$3F3 - ADR OF RESET HNDLING ;ROUT'N (IN LOW/HI FORMAT). ;NORMALLY=ADR OF DOSWARM ($9DBF). ;$3F4 - IMG OF VALIDATION BYTE. ;NORMALLY CONTAINS #$38 CAUSE: ; #$9D EOR #$A5 = #$38. JMP MONRTS ;$3F5 - DISABLE &-VECTOR. JMP MON ;$3F8 - LET CTL-Y ENTER MONITOR. JMP MON ;$3FB - HNDL NON-MASK INTERUPTS. DA MON ;ROUT'N 2 HNDL MASKABLE INTERUPTS *================================== * DOS'S INPUT INTERCEPT ROUTINE. * (INTERCEPTS ALL INPUT FROM * KEYBOARD OR DISK.) *================================== INPTINCP JSR PREP4DOS ;SAVE THE REGS & RESTORE I/O HKS ;TO PT TO THE TRUE I/O HANDLERS. ;ADJUST STK PTR & SAVE IT SO WE ;CAN LATER RTN 2 THE ROUTINE THAT ;CALLED ROUTINE THAT CONTAINED ;THE "JSR PREP4DOS" INSTRUCTION. LDA CONDNFLG ;TEST IF DOING WARMSTART. BEQ INPUTWRM ;YES - BRANCH IF WARM. * READING FILE OR COLDSTARTING. PHA ;SAVE THE CONDITION FLAG. LDA ASAVED ;GET THE SUBSTITUTE CURSOR & PUT STA (BASL),Y ;IT BACK ON THE SCREEN. PLA ;GET CONDITION FLAG BACK IN (A). BMI INPUTCLD ;BRANCH FOR COLD. JMP READTEXT ;READ FILE BYTE. * DOING A COLDSTART. INPUTCLD JSR KEYCOLD ;SET IMPORTANT PAGE 3 VECTORS. ;SET MXFILVAL=3 & BUILD DOS BUFS. ;SET WARMSTART FLAG. ;EXECUTE PENDING COMMAND. LDY CH ;GET HORZ CURSOR POS'N. LDA #$60 ;GET CURSOR. STA (BASL),Y ;REINSTATE CURSOR ON SCREEN. * USING WARMSTART STATUS. * AT THIS POINT IN TIME, BOTH * CONDNFLG & OPUTCOND = 0 FOR * WARM- & COLDSTARTS. INPUTWRM LDA EXECFLAG ;ARE WE EXECING? BEQ INPTNOXC ;NO. JSR READEXEC ;YES - GO READ AN EXEC FILE BYTE. INPTNOXC LDA #3 ;SET OUTPUT CONDITION = 3 CAUSE STA OPUTCOND ;WANT TO PROCESS INPUT INFO. JSR RESTOREG ;RESTORE (A), (Y) & (X) REGS. JSR TOTRUIN ;GET CHAR & PUT IT ON SCREEN VIA ;THE TRUE OUTPUT HANDLER (COUT1). STA ASAVED ;SAVE CHAR & (X). STX XSAVED JMP DOSEXIT ;EXIT DOS. TOTRUIN JMP (KSW) ;JUMP TO THE TRUE INPUT HANDLER. *================================= * DOS'S OUTPUT INTERCEPT ROUTINE. * (INTERCEPTS ALL OUPUT TO SCREEN * OR OTHER PERIPHERALS.) *================================= OPUTINCP JSR PREP4DOS ;SAVE REGS & RESTORE I/O HKS 2 PT ;2 TRUE I/O HANDLERS. ADJUST STK ;PTR & SAVE IT SO CAN LATER RTN ;TO THE ROUTINE THAT CALLED THE ;ROUTINE THAT CONTAINED THE ;"JSR PREP4DOS" INSTRUCTION. * USE CURRENT OPUTCOND TO INDEX * TABLE CONTAINING ADDRS (MINUS 1) * OF THE OUTPUT CONDITION HANDLERS. * DO A "STACK JUMP" TO THE APPROPRIATE * HANDLER. LDA OPUTCOND ASL ;TIMES 2 CAUSE 2 BYTES / ADDRESS. TAX ;SET (X) TO INDEX TABLE OF ADRS. LDA OUTHNDTB+1,X ;PUT ADR OF OUTPUT HNDLR ON STK PHA ;(HI BYTE FIRST) & THEN DO A LDA OUTHNDTB,X ;"STACK JUMP" TO THE APPROPRIATE PHA ;HANDLER. LDA ASAVED ;GET CHAR TO BE PRINTED. RTS ;EXECUTE THE STACK JUMP. *================================ * PREPARE FOR PROCESSING BY DOS. * SAVE THE REGS & RESET THE I/O * HOOKS TO POINT TO THE TRUE I/O * HANDLERS. *================================ PREP4DOS STA ASAVED ;SAVE (A), (Y) & (X) REGS. STX XSAVED STY YSAVED TSX ;ADJUST STK PTR & SAVE IT SO WHEN INX ;WE LATER RESTORE IT & HIT AN INX ;RTS, WE CAN RTN 2 ROUTINE THAT STX STKSAVED ;CALLED ROUTINE THAT CONTAINED ;THE "JSR PREP4DOS" INSTRUCTION. * DISCONNECT DOS - THIS ENTRY POINT * IS FREQUENTLY USED BY ASSEMBLY * LANGUAGE PROGRAMMERS TO DISCONNECT * DOS COMPLETELY. UNCONDOS LDX #3 ;RESTORE THE I/O HKS TO PT TO THE ;TRUE I/O HANDLERS, EX: SETRUHKS LDA CSWTRUE,X ; KSWTRUE: KEYIN --> KSW: KEYIN STA CSW,X ; CSWTRUE: COUT1 --> CSW: COUT1 DEX BPL SETRUHKS ;4 BYTES (0 TO 3) TO MOVE. RTS *================================= * OUTPUT HANDLER 0. * (EVALUATE START OF LINE.) *================================= OPUTHDL0 LDX RUNTRUPT ;CONTAINS A NONZERO VALUE IF RUN BEQ NONTRUPT ;CMD WAS INTERRUPTED TO DO A LOAD JMP FINSHRUN ;FINISH OFF THE RUN COMMAND. * FILE NOT BEING READ. NONTRUPT LDX CONDNFLG ;GET CONDITION FLAG. CHECK IF WE ;ARE DOING A WARMSTART ($00), ;COLDSTART ($80), USING A(RAM) ;($C0) OR DOING A READ ($01). 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. CMP #"?" ;IF READING, USING "?" AS PROMPT. BEQ OPUTHDL6 ;GO DSPLY INPUT CONDITIONALLY IF ;GETTING READY 2 READ A TEXT FILE ;BYTE. CMP PROMPT ;ARE WE PRINTING A PROMPT? BEQ SET2EVAL ;BRANCH IF ABOUT TO PRINT PROMPT. SETIGNOR LDX #2 ;SET CONDITION 2 FOR DEFAULT TO STX OPUTCOND ;SIGNAL SHOULD IGNORE NON-DOS ;COMMANDS. CMP DCTRLCHR ;IS CHAR = DOS'S CTRL CHAR? BNE OPUTHDL2 ;NO. DEX ;LINE STARTED WITH DOS'S CTRL CHR STX OPUTCOND ;SO SET CONDITION 1. DEX ;(X) = 1 --> 0. STX NDX2INBF ;INDEX TO 1RST POS'N IN INPUT BUF *================================= * OUTPUT HANDLER 1. * - COLLECT THE DOS COMMAND. * (IE. - STICK CHAR IN THE INPUT * BUF & THEN GO DISPLAY CHAR OR * ELSE GO PARSE CMD.) *================================= OPUTHDL1 LDX NDX2INBF ;GET INDEX TO INPUT BUFFER. PUTINBUF STA BUF200,X ;PUT CHAR IN INPUT BUFFER. INX ;KICK UP INDEX 4 NEXT BUF POS'N. STX NDX2INBF CMP #$8D ;WAS CHAR A ? BNE DSPLYCMD ;NO. JMP PARSECMD ;YES - GOT END OF INPUT, SO NOW ; SEE IF IT IS A DOS CMD.