************************************* * COPYRIGHT (C) MOTOROLA, INC. 1979 * ************************************* ************************************* * THIS IS THE BASE ASSIST09 ROM. * IT MAY RUN WITH OR WITHOUT THE * EXTENSION ROM WHICH * WHEN PRESENT WILL BE AUTOMATICALLY * INCORPORATED BY THE BLDVTR * SUBROUTINE. ************************************* ********************************************* * GLOBAL MODULE EQUATES ******************************************** ROMBEG EQU $F800 ; ROM START ASSEMBLY ADDRESS RAMOFS EQU -$1900 ; ROM OFFSET TO RAM WORK PAGE ROMSIZ EQU 2048 ; ROM SIZE ROM2OF EQU ROMBEG-ROMSIZ ; START OF EXTENSION ROM ACIA EQU $E008 ; DEFAULT ACIA ADDRESS PTM EQU $E000 ; DEFAULT PTM ADDRESS DFTCHP EQU 0 ; DEFAULT CHARACTER PAD COUNT DFTNLP EQU 5 ; DEFAULT NEW LINE PAD COUNT PROMPT EQU '> ; PROMPT CHARACTER NUMBKP EQU 8 ; NUMBER OF BREAKPOINTS ********************************************* ********************************************* * MISCELANEOUS EQUATES ********************************************* EOT EQU $04 ; END OF TRANSMISSION BELL EQU $07 ; BELL CHARACTER LF EQU $0A ; LINE FEED CR EQU $0D ; CARRIAGE RETURN DLE EQU $10 ; DATA LINK ESCAPE CAN EQU $18 ; CANCEL (CTL-X) * PTM ACCESS DEFINITIONS PTMSTA EQU PTM+1 ; READ STATUS REGISTER PTMC13 EQU PTM ; CONTROL REGISTERS 1 AND 3 PTMC2 EQU PTM+1 ; CONTROL REGISTER 2 PTMTM1 EQU PTM+2 ; LATCH 1 PTMTM2 EQU PTM+4 ; LATCH 2 PTMTM3 EQU PTM+6 ; LATCH 3 SKIP2 EQU $8C ; "CMPX #" OPCODE - SKIPS TWO BYTES ******************************************* * ASSIST09 MONITOR SWI FUNCTIONS * THE FOLLOWING EQUATES DEFINE FUNCTIONS PROVIDED * BY THE ASSIST09 MONITOR VIA THE SWI INSTRUCTION. ****************************************** INCHNP EQU 0 ; INPUT CHAR IN A REG - NO PARITY OUTCH EQU 1 ; OUTPUT CHAR FROM A REG PDATA1 EQU 2 ; OUTPUT STRING PDATA EQU 3 ; OUTPUT CR/LF THEN STRING OUT2HS EQU 4 ; OUTPUT TWO HEX AND SPACE OUT4HS EQU 5 ; OUTPUT FOUR HEX AND SPACE PCRLF EQU 6 ; OUTPUT CR/LF SPACE EQU 7 ; OUTPUT A SPACE MONITR EQU 8 ; ENTER ASSIST09 MONITOR VCTRSW EQU 9 ; VECTOR EXAMINE/SWITCH BRKPT EQU 10 ; USER PROGRAM BREAKPOINT PAUSE EQU 11 ; TASK PAUSE FUNCTION NUMFUN EQU 11 ; NUMBER OF AVAILABLE FUNCTIONS * NEXT SUB-CODES FOR ACCESSING THE VECTOR TABLE. * THEY ARE EQUIVALENT TO OFFSETS IN THE TABLE. * RELATIVE POSITIONING MUST BE MAINTAINED _AVTBL EQU 0 ; ADDRESS OF VECTOR TABLE _CMDL1 EQU 2 ; FIRST COMMAND LIST _RSVD EQU 4 ; RESERVED HARDWARE VECTOR _SWI3 EQU 6 ; SWI3 ROUTINE _SWI2 EQU 8 ; SWI2 ROUTINE _FIRQ EQU 10 ; FIRQ ROUTINE _IRQ EQU 12 ; IRQ ROUTINE _SWI EQU 14 ; SWI ROUTINE _NMI EQU 16 ; NMI ROUTINE _RESET EQU 18 ; RESET ROUTINE _CION EQU 20 ; CONSOLE ON _CIDTA EQU 22 ; CONSOLE INPUT DATA _CIOFF EQU 24 ; CONSOLE INPUT OFF _COON EQU 26 ; CONSOLE OUTPUT ON _CODTA EQU 28 ; CONSOLE OUTPUT DATA _COOFF EQU 30 ; CONSOLE OUTPUT OFF _HSDTA EQU 32 ; HIGH SPEED PRINTDATA _BSON EQU 34 ; PUNCH/LOAD ON _BSDTA EQU 36 ; PUNCH/LOAD DATA _BSOFF EQU 38 ; PUNCH/LOAD OFF _PAUSE EQU 40 ; TASK PAUSE ROUTINE _EXPAN EQU 42 ; EXPRESSION ANALYZER _CMDL2 EQU 44 ; SECOND COMMAND LIST _ACIA EQU 46 ; ACIA ADDRESS _PAD EQU 48 ; CHARACTER PAD AND NEW LINE PAD _ECHO EQU 50 ; ECHO/LOAD AND NULL BKPT FLAG _PTM EQU 52 ; PTM ADDRESS NUMVTR EQU 52/2+1 ; NUMBER OF VECTORS HIVTR EQU 52 ; HIGHEST VECTOR OFFSET ****************************************** * WORK AREA * THIS WORK AREA IS ASSIGNED TO THE PAGE ADDRESSED BY * -$1800,PCR FROM THE BASE ADDRESS OF THE ASSIST09 * ROM. THE DIRECT PAGE REGISTER DURING MOST ROUTINE * OPERATIONS WILL POINT TO THIS WORK AREA. THE STACK * INITIALLY STARTS UNDER THE RESERVED WORK AREAS AS * DEFINED HEREIN. ****************************************** WORKPG EQU ROMBEG+RAMOFS ; SETUP DIRECT PAGE ADDRESS SETDP WORKPG!>8 ; NOTIFY ASSEMBLER ORG WORKPG+256 ; READY PAGE DEFINITIONS * THE FOLLOWING THRU BKPTOP MUST RESIDE IN THIS ORDER * FOR PROPER INITIALIZATION ORG *-4 PAUSER EQU * ; PAUSE ROUTINE ORG *-1 SWIBFL EQU * ; BYPASS SWI AS BREAKPOINT FLAG ORG *-1 BKPTCT EQU * ; BREAKPOINT COUNT ORG *-2 ; SLEVEL EQU SLEVEL EQU * ; STACK TRACE LEVEL ORG -NUMVTR*2+* VECTAB EQU * ; VECTOR TABLE ORG -2*NUMBKP+* BKPTBL EQU * ; BREAKPOINT TABLE ORG -2*NUMBKP+* BKPTOP EQU * ; BREAKPOINT OPCODE TABLE ORG *-2 WINDOW EQU * ; WINDOW ORG *-2 ADDR EQU * ; ADDRESS POINTER VALUE ORG *-1 BASEPG EQU * ; BASE PAGE VALUE ORG *-2 NUMBER EQU * ; BINARY BUILD AREA ORG *-2 LASTOP EQU * ; LAST OPCODE TRACED ORG *-2 RSTACK EQU * ; RESET STACK POINTER ORG *-2 PSTACK EQU * ; COMMAND RECOVERY STACK ORG *-2 PCNTER EQU * ; LAST PROGRAM COUNTER ORG *-2 TRACEC EQU * ; TRACE COUNT ORG *-1 SWICNT EQU * ; TRACE "SWI" NEST LEVEL COUNT ORG *-1 ; (MISFLG MUST FOLLOW SWICNT) MISFLG EQU * ; LOAD CMD/THRU BREAKPOINT FLAG ORG *-1 DELIM EQU * ; EXPRESSION DELIMITER/WORK BYTE ORG *-40 ROM2WK EQU * ; EXTENSION ROM RESERVED AREA ORG *-21 TSTACK EQU * ; TEMPORARY STACK HOLD STACK EQU * ; START OF INITIAL STACK ****************************************** * DEFAULT THE ROM BEGINNING ADDRESS TO 'ROMBEG' * ASSIST09 IS POSITION ADDRESS INDEPENDENT, HOWEVER * WE ASSEMBLE ASSUMING CONTROL OF THE HARDWARE VECTORS. * NOTE THAT THE WORK RAM PAGE MUST BE 'RAMOFS' * FROM THE ROM BEGINNING ADDRESS. ******************************************** ORG ROMBEG ; ROM ASSEMBLY/DEFAULT ADDRESS ***************************************************** * BLDVTR - BUILD ASSIST09 VECTOR TABLE * HARDWARE RESET CALLS THIS SUBROUTINE TO BUILD THE * ASSIST09 VECTOR TABLE. THIS SUBROUTINE RESIDES AT * THE FIRST BYTE OF THE ASSIST09 ROM, AND CAN BE * CALLED VIA EXTERNAL CONTROL CODE FOR REMOTE * ASSIST09 EXECUTION. * INPUT: S->VALID STACK RAM * OUTPUT: U->VECTOR TABLE ADDRESS * DPR->ASSIST09 WORK AREA PAGE * THE VECTOR TABLE AND DEFAULTS ARE INITIALIZED * ALL REGISTERS VOLATILE ************************************************* BLDVTR LEAX VECTAB,PCR ; ADDRESS VECTOR TABLE TFR X,D ; OBTAIN BASE PAGE ADDRESS TFR A,DP ; SETUP DPR STA WORK AREA PAGE * D,Y,U=UNRELIABLE X=AS CALLED FROM USER * S=AS FROM SWI INTERRUPT ********************************************* ************************************************** * [SWI FUNCTION 8] * MONITOR ENTRY * FIREUP THE ASSIST09 MONITOR. * THE STACK WITH ITS VALUES FOR THE DIRECT PAGE * REGISTER AND CONDITION CODE FLAGS ARE USED AS IS. * 1) INITIALIZE CONSOLE I/O * 2) OPTIONALLY PRINT SIGNON * 3) INITIALIZE PTM FOR SINGLE STEPPING * 4) ENTER COMMAND PROCESSOR * INPUT: A=0 INIT CONSOLE AND PRINT STARTUP MESSAGE * A#0 OMIT CONSOLE INIT AND STARTUP MESSAGE ************************************************* SIGNON FCC /ASSIST09/ ; SIGNON EYE-CATCHER FCB EOT ZMONTR STS =0 VALID)/COMPARE CNT * U-3=CARRIAGE RETURN FLAG (0=CR HAS BEEN DONE) * U-4=START OF COMMAND STORE * S+0=END OF COMMAND STORE *********************************************** CMD SWI ; TO NEW LINE FCB PCRLF ; FUNCTION * DISARM THE BREAKPOINTS CMDNEP LBSR CBKLDR ; OBTAIN BREAKPOINT POINTERS BPL CMDNOL ; BRANCH IF NOT ARMED OR NONE NEGB ; MAKE POSITIVE STB ASSIST09 DIRECT PAGE WORK AREA ** Z=1 CARRIAGE RETURN ENTERED ** Z=0 NON CARRIAGE RETURN DELIMITER ** S=NORMAL RETURN ADDRESS ** THE LABEL "CMDBAD" MAY BE ENTERED TO ISSUE AN ** AN ERROR FLAG (*). ************************************************** * ASSIST09 COMMAND TABLES * THESE ARE THE DEFAULT COMMAND TABLES. EXTERNAL * TABLES OF THE SAME FORMAT MAY EXTEND/REPLACE * THESE BY USING THE VECTOR SWAP FUNCTION. * * ENTRY FORMAT: * +0...TOTAL SIZE OF ENTRY (INCLUDING THIS BYTE) * +1...COMMAND STRING * +N...TWO BYTE OFFSET TO COMMAND (ENTRYADDR-*) * * THE TABLES TERMINATE WITH A ONE BYTE -1 OR -2. * THE -1 CONTINUES THE COMMAND SEARCH WITH THE * SECOND COMMAND TABLE. * THE -2 TERMINATES COMMAND SEARCHES. ***************************************************** * THIS IS THE DEFAULT LIST FOR THE SECOND COMMAND * LIST ENTRY. CMDTB2 FCB -2 ; STOP COMMAND SEARCHES * THIS IS THE DEFAULT LIST FOR THE FIRST COMMAND * LIST ENTRY. CMDTBL EQU * ; MONITOR COMMAND TABLE FCB 4 FCC /B/ ; 'BREAKPOINT' COMMAND FDB CBKPT-* FCB 4 FCC /C/ ; 'CALL' COMMAND FDB CCALL-* FCB 4 FCC /D/ ; 'DISPLAY' COMMAND FDB CDISP-* FCB 4 FCC /E/ ; 'ENCODE' COMMAND FDB CENCDE-* FCB 4 FCC /G/ ; 'GO' COMMAND FDB CGO-* FCB 4 FCC /L/ ; 'LOAD' COMMAND FDB CLOAD-* FCB 4 FCC /M/ ; 'MEMORY' COMMAND FDB CMEM-* FCB 4 FCC /N/ ; 'NULLS' COMMAND FDB CNULLS-* FCB 4 FCC /O/ ; 'OFFSET' COMMAND FDB COFFS-* FCB 4 FCC /P/ ; 'PUNCH' COMMAND FDB CPUNCH-* FCB 4 FCC /R/ ; 'REGISTERS' COMMAND FDB CREG-* FCB 4 FCC /S/ ; 'STLEVEL' COMMAND FDB CSTLEV-* FCB 4 FCC /T/ ; 'TRACE' COMMAND FDB CTRACE-* FCB 4 FCC /V/ ; 'VERIFY' COMMAND FDB CVER-* FCB 4 FCC /W/ ; 'WINDOW' COMMAND FDB CWINDO-* FCB -1 ; END, CONTINUE WITH THE SECOND ************************************************* * [SWI FUNCTIONS 4 AND 5] * 4 - OUT2HS - DECODE BYTE TO HEX AND ADD SPACE * 5 - OUT4HS - DECODE WORD TO HEX AND ADD SPACE * INPUT: X->BYTE OR WORD TO DECODE * OUTPUT: CHARACTERS SENT TO OUTPUT HANDLER * X->NEXT BYTE OR WORD ************************************************* ZOUT2H LDA ,X+ ; LOAD NEXT BYTE PSHS D ; SAVE - DO NOT REREAD LDB #16 ; SHIFT BY 4 BITS MUL ; WITH MULTIPLY BSR ZOUTHX ; SEND OUT AS HEX PULS D ; RESTORE BYTES ANDA #$0F ; ISOLATE RIGHT HEX ZOUTHX ADDA #$90 ; PREPARE A-F ADJUST DAA ; ADJUST ADCA #$40 ; PREPARE CHARACTER BITS DAA ; ADJUST SEND JMP [VECTAB+_CODTA,PCR] ; SEND TO OUT HANDLER ZOT4HS BSR ZOUT2H ; CONVERT FIRST BYTE ZOT2HS BSR ZOUT2H ; CONVERT BYTE TO HEX STX 4,S ; UPDATE USERS X REGISTER * FALL INTO SPACE ROUTINE ************************************************* * [SWI FUNCTION 7] * SPACE - SEND BLANK TO OUTPUT HANDLER * INPUT: NONE * OUTPUT: BLANK SEND TO CONSOLE HANDLER ************************************************* ZSPACE LDA #' ; LOAD BLANK BRA ZOTCH2 ; SEND AND RETURN *********************************************** * [SWI FUNCTION 9] * SWAP VECTOR TABLE ENTRY * INPUT: A=VECTOR TABLE CODE (OFFSET) * X=0 OR REPLACEMENT VALUE * OUTPUT: X=PREVIOUS VALUE *********************************************** ZVSWTH LDA 1,S ; LOAD REQUESTERS A CMPA #HIVTR ; ? SUB-CODE TOO HIGH BHI ZOTCH3 ; IGNORE CALL IF SO LDY STRING * OUTPUT: CR/LF AND STRING SENT TO OUTPUT CONSOLE * HANDLER. * C=0 NO CTL-X, C=1 CTL-X RECEIVED * NOTE: LINE FEED MUST FOLLOW CARRIAGE RETURN FOR * PROPER PUNCH DATA. ************************************************** ZPDATA LDA #CR ; LOAD CARRIAGE RETURN BSR SEND ; SEND IT LDA #LF ; LOAD LINE FEED * FALL INTO PDATA1 ************************************************* * [SWI FUNCTION 2] * PDATA1 - OUTPUT STRING TILL EOT ($04) * THIS ROUTINE PAUSES IF AN INPUT BYTE BECOMES * AVAILABLE DURING OUTPUT TRANSMISSION UNTIL A * SECOND IS RECEIVED. * INPUT: X->STRING * OUTPUT: STRING SENT TO OUTPUT CONSOLE DRIVER * C=0 NO CTL-X, C=1 CTL-X RECEIVED ************************************************* ZPDTLP BSR SEND ; SEND CHARACTER TO DRIVER ZPDTA1 LDA ,X+ ; LOAD NEXT CHARACTER CMPA #EOT ; ? EOT BNE ZPDTLP ; LOOP IF NOT * FALL INTO PAUSE CHECK FUNCTION ******************************************** * [SWI FUNCTION 12] * PAUSE - RETURN TO TASK DISPATCHING AND CHECK * FOR FREEZE CONDITION OR CTL-X BREAK * THIS FUNCTION ENTERS THE TASK PAUSE HANDLER SO * OPTIONALLY OTHER 6809 PROCESSES MAY GAIN CONTROL. * UPON RETURN, CHECK FOR A 'FREEZE' CONDITION * WITH A RESULTING WAIT LOOP, OR CONDITION CODE * RETURN IF A CONTROL-X IS ENTERED FROM THE INPUT * HANDLER. * OUTPUT: C=1 IF CTL-X HAS ENTERED, C=0 OTHERWISE ****************************************** ZPAUSE BSR XQPAUS ; RELEASE CONTROL AT EVERY LINE BSR CHKABT ; CHECK FOR FREEZE OR ABORT TFR CC,B ; PREPARE TO REPLACE CC STB ,S ; OVERLAY OLD ONE ON STACK BRA ZOTCH3 ; RETURN FROM "SWI" * CHKABT - SCAN FOR INPUT PAUSE/ABORT DURING OUTPUT * OUTPUT: C=0 OK, C=1 ABORT (CTL-X ISSUED) * VOLATILE: U,X,D CHKABT BSR XQCIDT ; ATTEMPT INPUT BCC CHKRTN ; BRANCH NO TO RETURN CMPA #CAN ; ? CTL-X FOR ABORT BNE CHKWT ; BRANCH NO TO PAUSE CHKSEC COMB ; SET CARRY CHKRTN RTS ; RETURN TO CALLER WITH CC SET CHKWT BSR XQPAUS ; PAUSE FOR A MOMENT BSR XQCIDT ; ? KEY FOR START BCC CHKWT ; LOOP UNTIL RECEIVED CMPA #CAN ; ? ABORT SIGNALED FROM WAIT BEQ CHKSEC ; BRANCH YES CLRA ; SET C=0 FOR NO ABORT RTS ; AND RETURN * SAVE MEMORY WITH JUMPS XQPAUS JMP [VECTAB+_PAUSE,PCR] ; TO PAUSE ROUTINE XQCIDT JSR [VECTAB+_CIDTA,PCR] ; TO INPUT ROUTINE ANDA #$7F ; STRIP PARITY RTS ; RETURN TO CALLER ******************************************** * NMI DEFAULT INTERRUPT HANDLER * THE NMI HANDLER IS USED FOR TRACING INSTRUCTIONS. * TRACE PRINTOUTS OCCUR ONLY AS LONG AS THE STACK * TRACE LEVEL IS NOT BREACHED BY FALLING BELOW IT. * TRACING CONTINUES UNTIL THE COUNT TURNS ZERO OR * A CTL-X IS ENTERED FROM THE INPUT CONSOLE DEVICE. ********************************************* MSHOWP FCB 'O,'P,'-,EOT ; OPCODE PREP NMIR BSR LDDP ; LOAD PAGE AND VERIFY STACK TST REGISTER TO PRINT TST ,S ; ? CHANGE OPTION BNE REGCNG ; BRANCH YES TST -1,Y ; ? ONE OR TWO BYTES BEQ REGP3 ; BRANCH ZERO MEANS ONE SWI ; PERFORM WORD HEX FCB OUT4HS ; FUNCTION FCB SKIP2 ; SKIP BYTE PRINT REGP3 SWI ; PERFORM BYTE HEX FCB OUT2HS ; FUNCTION REG4 LDD ,Y+ ; TO FRONT OF NEXT ENTRY TSTB ; ? END OF ENTRIES BNE REGP1 ; LOOP IF MORE SWI ; FORCE NEW LINE FCB PCRLF ; FUNCTION REGRTN PULS PC,Y,X,A ; RESTORE STACK AND RETURN REGCNG BSR BLDNNB ; INPUT BINARY NUMBER BEQ REGNXC ; IF CHANGE THEN JUMP CMPA #CR ; ? NO MORE DESIRED BEQ REGAGN ; BRANCH NOPE LDB -1,Y ; LOAD SIZE FLAG DECB ; MINUS ONE NEGB ; MAKE POSITIVE ASLB ; TIMES TWO (=2 OR =4) REGSKP SWI ; PERFORM SPACES FCB SPACE ; FUNCTION DECB BNE REGSKP ; LOOP IF MORE BRA REG4 ; CONTINUE WITH NEXT REGISTER REGNXC STA ,S ; SAVE DELIMITER IN OPTION * ; (ALWAYS > 0) LDD