* THIS VERSION MODIFIED FOR TEESSIDE X68K PC-2.2 CROSS ASSEMBLER * ftp://nyquist.ee.ualberta.ca/pub/motorola/m68k/x68k.zip * CHANGES FROM ORIGINAL MOTOROLA SOURCE: * MANY "MOVE.L" CHANGED TO "MOVEQ" * SIMILAR CHANGES ON A FEW OTHER COMMANDS WHERE * X68K DOES NOT AUTOMATICALLY MOTOROLA-IZE. * X68K HANDLES CHARACTER CONSTANTS DIFFERENTLY * DC.W '1' --> $3100 (GOOD) * DC.W '1'+0 --> $0031 (WHAT!) * ONE DIFFERENCE REMAINS IN A "DON'T CARE" BYTE * $008FE0 1A3C00FF MOVE.B #-1,D5 * ^^ $00 INSTEAD OF $FF *=======================================================================* * MOTOROLA EDUCATION COMPUTER BOARD ROM PROGRAM "TUTOR" REVISION # 1.3 * *=======================================================================* * MACROS ADDR2MEM: .MACRO a1,a2 PEA \a1(%PC) | MOVE ADDRESS TO MEMORY; POSITION MOVE.L (%A7)+,\a2 | INDEPENDANT = TO "MOVE.L #\1,\2" .ENDM SAVEREGS: .MACRO TEMP = 0x04d6 MOVE.L %A7,REGA7 | SAVE STACK POINTER LEA SV\@(%PC),%A7 | A7 = RETURN ADDRESS (FOR CALL TO SAVE) MOVE.L %A7,TEMP | TEMP = RETURN ADDRESS JRA SAVE | BSR WITHOUT USING STACK SV\@: .ENDM *------------------------------------------------------------------------- * EQUATES (in alphabetical order) BELL = 0x07 BLANK = 0x20 BKPOINT = 0x4AFB BUFFSIZE = 0x80 BUFSIZE = 80 CR = 0x0D CTLD = 0x04 CTLH = 0x08 CTLW = 0x17 CTLX = 0x18 DEL = 0x7F DELAYC1 = 0x1000 EOT = 0x04 LF = 0x0A LOCVARSZ = 16 RESET = 0x43 | MASTER RESET FOR ACIA *------------------------------------------------------------------------- * File ARAM DATA VARIABLES 05/10/82 **************************************************************** * N O T E: Ram locations: starting at zero * **************************************************************** .ORG 0x000000 * DEC HEX DESCRIPTION DS.L 1 | 0 $00 AREA OVERLAID BY ROM SR DS.L 1 | 1 $01 AND PC _AV2: DS.L 1 | 2 $02 BUS ERROR "BUS " _AV3: DS.L 1 | 3 $03 ADDRESS ERROR "ADDR" _AV4: DS.L 1 | 4 $04 ILL INSTRUCTION "OPCO" DS.L 1 | 5 $05 DIVIDE BY ZERO "DIV0" DS.L 1 | 6 $06 CHECK TRAP "CHCK" DS.L 1 | 7 $07 TRAP V "TP V" AV8: DS.L 1 | 8 $08 PRIVILEDGE VIOLATION "PRIV" _AV9: DS.L 1 | 9 $09 TRACE DS.L 1 | 10 $0A 1010 LINE EMULATION "1010" _AV11: DS.L 1 | 11 $0B 1111 LINE EMULATION "1111" _AV12: DS.L 1 | 12 $0C USED AS TEMPORARY STORAGE FOR VECTOR MSGS. DS.L 1 | 13 $0D NOT USED DS.L 1 | 14 $0E DS.L 1 | 15 $0F DS.L 1 | 16 $10 DS.L 1 | 17 $11 DS.L 1 | 18 $12 DS.L 1 | 19 $13 DS.L 1 | 20 $14 DS.L 1 | 21 $15 DS.L 1 | 22 $16 DS.L 1 | 23 $17 _AV24: DS.L 1 | 24 $18 0 AUTO VECTORS "SPUR" DS.L 1 | 25 $19 1 "AV#1" DS.L 1 | 26 $1A 2 "AV#2" TEST BUTTON DS.L 1 | 27 $1B 3 "AV#3" DS.L 1 | 28 $1C 4 "AV#4" DS.L 1 | 29 $1D 5 "AV#5" DS.L 1 | 30 $1E 6 "AV#6" _AV31: DS.L 1 | 31 $1F 7 "AV#7 [ABORT BUTTON] DS.L 1 | 32 $20 TRAP 0 "UT 0" DS.L 1 | 33 $21 TRAP 1 "UT 1" DS.L 1 | 34 $22 TRAP 2 "UT 2" DS.L 1 | 35 $23 TRAP 3 "UT 3" DS.L 1 | 36 $24 TRAP 4 "UT 4" DS.L 1 | 37 $25 TRAP 5 "UT 5" DS.L 1 | 38 $26 TRAP 6 "UT 6" DS.L 1 | 39 $27 TRAP 7 "UT 7" DS.L 1 | 40 $28 TRAP 8 "UT 8" DS.L 1 | 41 $29 TRAP 9 "UT 9" DS.L 1 | 42 $2A TRAP 10 "UT A" DS.L 1 | 43 $2B TRAP 11 "UT B" DS.L 1 | 44 $2C TRAP 12 "UT C" DS.L 1 | 45 $2D TRAP 13 "UT D" _AV46: DS.L 1 | 46 $2E TRAP 14 "UT E" AV47: DS.L 1 | 47 $2F TRAP 15 "UT F" _AV48: DS.L 1 | 48 $30 DS.L 1 | 49 $31 DS.L 1 | 50 $32 DS.L 1 | 51 $33 DS.L 1 | 52 $34 DS.L 1 | 53 $35 DS.L 1 | 54 $36 DS.L 1 | 55 $37 DS.L 1 | 56 $38 DS.L 1 | 57 $39 DS.L 1 | 58 $3A DS.L 1 | 59 $3B DS.L 1 | 60 $3C DS.L 1 | 61 $3D DS.L 1 | 62 $3E DS.L 1 | 63 $3F DS.L 1 | 64 $40 DS.L 1 | 65 $41 DS.L 1 | 66 $42 DS.L 1 | 67 $43 DS.L 1 | 68 $44 DS.L 1 | 69 $45 DS.L 1 | 70 $46 DS.L 1 | 71 $47 DS.L 1 | 72 $48 DS.L 1 | 73 $49 DS.L 1 | 74 $4A DS.L 1 | 75 $4B DS.L 1 | 76 $4C DS.L 1 | 77 $4D DS.L 1 | 78 $4E DS.L 1 | 79 $4F DS.L 1 | 80 $50 DS.L 1 | 81 $51 DS.L 1 | 82 $52 DS.L 1 | 83 $53 DS.L 1 | 84 $54 DS.L 1 | 85 $55 DS.L 1 | 86 $56 DS.L 1 | 87 $57 DS.L 1 | 88 $58 DS.L 1 | 89 $59 DS.L 1 | 90 $5A DS.L 1 | 91 $5B DS.L 1 | 92 $5C DS.L 1 | 93 $5D DS.L 1 | 94 $5E DS.L 1 | 95 $5F DS.L 1 | 96 $60 DS.L 1 | 97 $61 DS.L 1 | 98 $62 DS.L 1 | 99 $63 DS.L 1 | 100 $64 DS.L 1 | 101 $65 DS.L 1 | 102 $66 DS.L 1 | 103 $67 DS.L 1 | 104 $68 DS.L 1 | 105 $69 DS.L 1 | 106 $6A DS.L 1 | 107 $6B DS.L 1 | 108 $6C DS.L 1 | 109 $6D DS.L 1 | 110 $6E DS.L 1 | 111 $6F DS.L 1 | 112 $70 DS.L 1 | 113 $71 DS.L 1 | 114 $72 DS.L 1 | 115 $73 DS.L 1 | 116 $74 DS.L 1 | 117 $75 DS.L 1 | 118 $76 DS.L 1 | 119 $77 DS.L 1 | 120 $78 DS.L 1 | 121 $79 DS.L 1 | 122 $7A DS.L 1 | 123 $7B DS.L 1 | 124 $7C DS.L 1 | 125 $7D DS.L 1 | 126 $7E DS.L 1 | 127 $7F DS.L 1 | 128 $80 DS.L 1 | 129 $81 DS.L 1 | 130 $82 DS.L 1 | 131 $83 DS.L 1 | 132 $84 DS.L 1 | 133 $85 DS.L 1 | 134 $86 DS.L 1 | 135 $87 DS.L 1 | 136 $88 DS.L 1 | 137 $89 DS.L 1 | 138 $8A DS.L 1 | 139 $8B DS.L 1 | 140 $8C DS.L 1 | 141 $8D DS.L 1 | 142 $8E DS.L 1 | 143 $8F DS.L 1 | 144 $90 DS.L 1 | 145 $91 DS.L 1 | 146 $92 DS.L 1 | 147 $93 DS.L 1 | 148 $94 DS.L 1 | 149 $95 DS.L 1 | 150 $96 DS.L 1 | 151 $97 DS.L 1 | 152 $98 DS.L 1 | 153 $99 DS.L 1 | 154 $9A DS.L 1 | 155 $9B DS.L 1 | 156 $9C DS.L 1 | 157 $9D DS.L 1 | 158 $9E DS.L 1 | 159 $9F DS.L 1 | 160 $A0 DS.L 1 | 161 $A1 DS.L 1 | 162 $A2 DS.L 1 | 163 $A3 DS.L 1 | 164 $A4 DS.L 1 | 165 $A5 DS.L 1 | 166 $A6 DS.L 1 | 167 $A7 DS.L 1 | 168 $A8 DS.L 1 | 169 $A9 DS.L 1 | 170 $AA DS.L 1 | 171 $AB DS.L 1 | 172 $AC DS.L 1 | 173 $AD DS.L 1 | 174 $AE DS.L 1 | 175 $AF DS.L 1 | 176 $B0 DS.L 1 | 177 $B1 DS.L 1 | 178 $B2 DS.L 1 | 179 $B3 DS.L 1 | 180 $B4 DS.L 1 | 181 $B5 DS.L 1 | 182 $B6 DS.L 1 | 183 $B7 DS.L 1 | 184 $B8 DS.L 1 | 185 $B9 DS.L 1 | 186 $BA DS.L 1 | 187 $BB DS.L 1 | 188 $BC DS.L 1 | 189 $BD DS.L 1 | 190 $BE DS.L 1 | 191 $BF DS.L 1 | 192 $C0 DS.L 1 | 193 $C1 DS.L 1 | 194 $C2 DS.L 1 | 195 $C3 DS.L 1 | 196 $C4 DS.L 1 | 197 $C5 DS.L 1 | 198 $C6 DS.L 1 | 199 $C7 DS.L 1 | 200 $C8 DS.L 1 | 201 $C9 DS.L 1 | 202 $CA DS.L 1 | 203 $CB DS.L 1 | 204 $CC DS.L 1 | 205 $CD DS.L 1 | 206 $CE DS.L 1 | 207 $CF DS.L 1 | 208 $D0 DS.L 1 | 209 $D1 DS.L 1 | 210 $D2 DS.L 1 | 211 $D3 DS.L 1 | 212 $D4 DS.L 1 | 213 $D5 DS.L 1 | 214 $D6 DS.L 1 | 215 $D7 DS.L 1 | 216 $D8 DS.L 1 | 217 $D9 DS.L 1 | 218 $DA DS.L 1 | 219 $DB DS.L 1 | 220 $DC DS.L 1 | 221 $DD DS.L 1 | 222 $DE DS.L 1 | 223 $DF DS.L 1 | 224 $E0 DS.L 1 | 225 $E1 DS.L 1 | 226 $E2 DS.L 1 | 227 $E3 DS.L 1 | 228 $E4 DS.L 1 | 229 $E5 DS.L 1 | 230 $E6 DS.L 1 | 231 $E7 DS.L 1 | 232 $E8 DS.L 1 | 233 $E9 DS.L 1 | 234 $EA DS.L 1 | 235 $EB DS.L 1 | 236 $EC DS.L 1 | 237 $ED DS.L 1 | 238 $EE DS.L 1 | 239 $EF DS.L 1 | 240 $F0 DS.L 1 | 241 $F1 DS.L 1 | 242 $F2 DS.L 1 | 243 $F3 DS.L 1 | 244 $F4 DS.L 1 | 245 $F5 DS.L 1 | 246 $F6 DS.L 1 | 247 $F7 DS.L 1 | 248 $F8 DS.L 1 | 249 $F9 DS.L 1 | 250 $FA DS.L 1 | 251 $FB DS.L 1 | 252 $FC DS.L 1 | 253 $FD 3RD DS.L 1 | 254 $FE 2ND DS.L 1 | 255 $FF VECTOR FOR 1ST IPC DISK CONTROLLER * PSEUDO REGISTERS _REGPC: DS.L 1 | USERS PROGRAM COUNTER _REGSR: DS.L 1 | USERS CONDITION CODES _REGS: DS.L 8 | D REGISTERS DS.L 7 | A0 THROUGH A6 REGISTERS _REGA7: DS.L 1 | A7 REGISTER _REGUS: DS.L 1 | USER STACK **************************************************************** * WORKING STORAGE * * NOTE: SUBROUTINE "INITHRAM" ZEROES RAM... * * FROM "BEGHRAM" THROUGH "ENDHRAM" WHEN IT IS EXECUTED * **************************************************************** _BEGHRAM: .align 4 | INITIALIZE STARTS HERE _OFFSET: DS.L 8 | ASSUMED OFFSETS (VIA "R@" FORMAT) MEMSIZE: DS.L 1 | MEMORY SIZE IN BYTES _BPADD: DS.L 8 | BREAKPOINT ADDRESSES _BPTILL: DS.L 1 | TEMPORARY BREAKPOINT _BPCNT: DS.L 9 | BREAKPOINT COUNTS _BPDATA: DS.W 9 | HOLD USER WORDS REPLACED BY TRAP IN SET BP _BERRD: DS.L 2 | SPECIAL DATA FOR BUS AND ADDR ERROR EXCEPTIONS _SAVEAV4: DS.L 1 | HOLDS USER'S AV4 VECTOR (WE USE FOR BP) _TEMP: DS.L 1 | TEMP _TRACECNT:DS.L 1 | TRACE COUNTER (-1=TRACE 1 & RUN) _TRACEON: DS.W 1 | FLAG FOR TRACE ON _BPSTATUS:DS.W 1 | 1=PB ARE IN 0=ARE OUT OF MEMORY _ECHOPT1:DS.L 1 | ECHO FLAG TO PORT ONE * THE FOLLOWING MUST REMAIN AS IS * User docomentation DEPENDS upon it! * _OPTIONS: .align 2 | FORCE WORD BOUNDRY DS.B 1 | X-ON CHARACTER DS.B 1 | X-OFF CHARACTER DS.B 1 | NO NO-AUTO LINEFEED DS.B 1 | SHORT FORM REGISTER DISPLAY DS.B 1 | TM trailing character DS.B 1 | TM exit character _XONOFF = OPTIONS _TMCHARS = OPTIONS+4 * END of as is section *************************** * TARGET SUPERVISOR STACK * *************************** DS.L 20 SSA7: DS.L 1 ************** * I/O BUFFER * ************** _BUFFER: DS.B BUFFSIZE _DUMPTEMP:DS.B 80 | HEADER TEMP BUFFER _SCREEN1: DS.L 1 | PRINT THIS BEFORE TRACE DISPLAY _SCREEN2: DS.L 1 | PRINT THIS AFTER TRACE DISPLAY _NULLPADS:DS.B 2 | CHARACTER NULL PADS _CRPADS: DS.B 2 | CARRIAGE RETURN NULL PADS _OUTTO: DS.L 1 | HOLDS ADDRESS OF OUTPUT ROUTINE _INFROM: DS.L 1 | HOLDS ADDRESS OF INPUT ROUTINE _ALTSER1: DS.L 1 | ALTERNATE SERIAL PORT#1 _ALTSER2: DS.L 1 | ALTERNATE SERIAL PORT#2 _INPORT1: DS.L 1 | INPUT ROUTINE ADDRESS _OUTPORT1:DS.L 1 | ADDRESS FOR OUPUT ROUTINE _INPORT2: DS.L 1 | ADDRESS FOR INPUT ROUTINE _OUTPORT2:DS.L 1 | FOR OUTPURT ROUTINE _INPORT3: DS.L 1 | THIS MIGHT BE FOR TAPE _OUTPORT3:DS.L 1 | THIS MIGHT BE FOR PRINTER _INPORT4: DS.L 1 | CASSETTE _OUTPORT4:DS.L 1 | CASSETTE _MD1CON: DS.W 1 | ACIA PROFILE (PORT1/PORT2) _PDIPORT: DS.L 1 | PDIPORT ADDRESS _CRTPNT: DS.W 1 | OUTPUT TO PRINTER AND CRT _TAPENULS:DS.B 1 | NULLS FOR CASSETTE DS.B 1 | PAD BYTE _CTLINK: DS.L 1 | POINTER TO FIRST TABLE _ENDHRAM: .align 2 | MUST START ON WORD BOUNDRY ********************* * SYSTEM STACK AREA * ********************* .align 2 | FORCE ON WORD BOUNDRY DS.B 300 | ROOM FOR STACK _SYSTACK: DS.W 1 | START OF STACK (ADDRESS DECREASES) DS.B 4 | STRETCHED STACK (USED BY 'SAVE') DS.B 120 | EXTENDED AREA USED IF DISASSEMBLER .align 1 | LAST LOW MEMORY LOCATION USED + 1 *------------------------------------------------------------------------- *CODE68K * OFFSET 0 ESKB = 0x00000000 | DS 0 TDATA = 0x00000000 | DS.B 10 TNB = 0x0000000A | DS.B 1 TLSPEC = 0x0000000B | DS.B 1 TLENGTH = 0x0000000C | DS.W 1 PCOUNTER = 0x0000000E | DS.L 1 PTROP = 0x00000012 | DS.L 1 POINTER TO OPERAND PENDOP = 0x00000016 | DS.L 1 POINTER END OF OPERAND PTRBUFE = 0x0000001A | DS.L 1 POINTER TO END OF FORMATED SOURCE LINK = 0x0000001E | DS.L 1 SAVE FOR UNLINK ESKE = 0x00000022 | DS.B 0 *DCODE68K * OFFSET -LOCVARSZ DDATA = 0xFFFFFFF0 | DS.L 3 HISPC = 0xFFFFFFFC | DS.L 1 *LOAD * OFFSET -((BUFFSIZE/2)+4) CC = 0xFFFFFFBC | DS.L 1 CC (BYTE COUNT) ADDRESS = 0xFFFFFFC0 | DS.L 1 ADDRESS + OFFSET LDATA = 0xFFFFFFC4 | DS.B 1 *------------------------------------------------------------------------- * File B Init Vectors+Ram 05/29/82 .ORG 0x008000 REGA7 = 0x444 FIRST: DC.L REGA7 | SUPERVISOR STACK START = 0x8146 DC.L START | PROGRAM COUNTER V2: BRA TRACE ********************************** * INITIALIZE HIGH RAM SUBROUTINE * ********************************** BEGHRAM = 0x044c ENDHRAM = 0x065a INITHRAM:LEA BEGHRAM,%A0 | START OF WORK RAM (PAST REGISTERS) MOVE.L #(ENDHRAM-BEGHRAM),%D0 | BYTES TO ZERO CLR.L %D1 INIT: MOVE.B %D1,(%A0)+ | ZERO MEMORY SUBQ.L #1,%D0 BNE.S INIT AV2 = 0x0008 ADDR2MEM BERRMSG,AV2 | POINT AT BUS TRAP ERROR MESSAGE ROUTINE AV3 = 0x000c ADDR2MEM ADDRMSG,AV3 | POINT AT ADDRESS TRAP ERROR MESSAGE ROUTINE RTS **************************************************** * SPECIAL HANDLING FOR BUS ERROR AND ADDRESS ERROR * **************************************************** BERRMSG: MOVE.L #0x42555320,0x30 | "BUS " BRA.S VECTBE ADDRMSG: MOVE.L #0x41444452,0x30 | "ADDR" BERRD = 0x04ca VECTBE: MOVE.L (%A7)+,BERRD MOVE.L (%A7)+,BERRD+4 SAVEREGS BSR FIXBUF MOVE.W #0xD0A,(%A6)+ MOVE.W BERRD,%D0 BSR PNT4HX | FORMAT FUNCTION CODE MOVE.B #BLANK,(%A6)+ | SPACE MOVE.L BERRD+2,%D0 BSR PNT8HX | FORMAT ACCESS ADDRESS MOVE.B #BLANK,(%A6)+ | SPACE MOVE.W BERRD+6,%D0 BSR PNT4HX | FORMAT INSTRUCTION REGISTER BSR OUTPUT BRA EVECT2 | GO DISPLAY REGISTERS & PROMPT MSG008: .ascii "SYNTAX " MSG008E: .ascii "ERROR " MSGEOT: DC.B EOT MSG021: .ascii "WHAT" DC.B EOT DC.B 0 | PAD BYTE * PRINT WHAT .align 2 WHAT: LEA MSG021(%PC),%A5 | PRINT 'WHAT' AND ENTER MACSBUG WHAT93: BSR.S FIXDATA TRACEON = 0x04de CLR.W TRACEON MSG: BSR OUT1CR BRA MACSBUG * PRINT ERROR ERROR: LEA MSG008E(%PC),%A5 BRA.S WHAT93 SYNTAX: LEA MSG008(%PC),%A5 | 'SYNTAX ERROR' BRA.S WHAT93 * FORMAT PHYSICAL ADDRESS FROM (D0) PPHY: LEA MSG019(%PC),%A5 BSR.S FIXDATA BRA.S P2PHY2 * FORMAT TWO PHYSICAL ADDRESSES FROM (A0) & (A1) P2PHY: LEA MSG019(%PC),%A5 | 'PHYSICAL ADDRESS=' BSR.S FIXDATA MOVE.L %A0,%D0 BSR PNT8HX | FORMAT ADDR1 MOVE.B #BLANK,(%A6)+ | SPACE FOR FORMATING MOVE.L %A1,%D0 P2PHY2: BSR PNT8HX | FORMAT ADDR2 BSR OUT1CR | DISPLAY IT RTS MSG019: .ascii "PHYSICAL ADDRESS=" DC.B EOT ************************************************************* * -FIXDATA- SUBROUTINE... MOVES MESSAGE POINTED TO BY (A5) * * INTO "BUFFER". EOT, ($04), ENDS * * THE MOVE. AT COMPLETION (A5) IS * * POINTING AT THE BEGINNING, (A6) * * POINTS AT END. * ************************************************************* BUFFER = 0x0540 FIXDATA: LEA BUFFER,%A6 FIXDADD: CMPI.B #EOT,(%A5) BEQ.S FIXD2 MOVE.B (%A5)+,(%A6)+ BRA.S FIXDADD FIXD2: LEA BUFFER,%A5 RTS ************************************************************ * -FIXDCRLF- SUBROUTINE INSERTS A CARRIAGE RETURN AND LINE * * FEED IN FRONT OF THE TEXT, THEN * * USES THE REMAINING PORTION OF THE * * FIXDATA. * ************************************************************ FIXDCRLF:LEA BUFFER,%A6 MOVE.W #0x0D0A,(%A6)+ | CR,LF BRA.S FIXDADD *------------------------------------------------------------------------- * File E VERSAbug entry point 01/08/81 ********************** * INITIALIZE VECTORS * ********************** * Set most vectors to point at "????" routine INITVECT:LEA 8,%A0 | Skip (Restart) STACK & ADDRESS vectors LEA ABORTE(%PC),%A1 | A1 = "Default" TRAP ERROR routine address INIT0: MOVE.L %A1,(%A0)+ | INITIALIZE VECTOR CMPA.L #0x400,%A0 | Done? BMI.S INIT0 | * RTS * SPECIAL ENTRY THAT DOES NOT CHANGE VECTORS REGSR = 0x00000404 START1S: MOVEM.W %D0,REGSR+2 | Assure good parity. MOVE.W %SR,REGSR+2 | SAVE TARGET'S STATUS REGISTER MOVE.L %A7,REGA7 | SAVE TARGET'S STACK REGPC = 0x0400 MOVE.L (%A7),REGPC | .PROGRAM COUNTER LEA REGA7,%A7 MOVEM.L %D0-%D7/%A0-%A6,-(%A7) | .REGISTERS SYSTACK = 0x0786 LEA SYSTACK,%A7 BRA START11 ************************ * INITIALIZATION * ************************ * SAVE PROCESSOR REGISTERS (EXCEPT A7 & PC) .align 2 START: MOVEM.W %D0,REGSR+2 | Assure good parity MOVE.W %SR,REGSR+2 | SAVE STATUS REGISTER MOVEM.L %D0-%D7/%A0-%A6,-(%A7) LEA SYSTACK,%A7 | SET UP STACK MOVE.L %A7,REGA7 CLR.L %D1 MOVE.L %D1,REGPC | PC = 000000 BSR.S INITVECT START11: MOVE.W #0x2700,%SR | MASK OFF INTERRUPTS MOVE.L %USP,%A0 REGUS = 0x0448 MOVE.L %A0,REGUS | USER STACK BSR INITHRAM | ZERO (INITIALIZE) HIGH RAM * VECTMSG.SA BSR INITVMSG * H.SA AV4 = 0x0010 ADDR2MEM CHKBP,AV4 | ILLEGAL INSTRUCTION * TM.SA TMCHARS = 0x04ea MOVE.W #0x1801,TMCHARS | CNTLX,CNTL/A * W.SA AV31 = 0x007c ADDR2MEM ABORTB,AV31 | ABORT * Y.SA OUTPORT1 = 0x0630 ADDR2MEM OUT1CR0,OUTPORT1 | INITIALIZE I/O ROUTINES OUTPORT2 = 0x0638 ADDR2MEM OUTPUT20,OUTPORT2 OUTPORT3 = 0x0640 ADDR2MEM PRCRLF,OUTPORT3 | PRINTER DRIVER OUTPORT4 = 0x0648 ADDR2MEM TAPEOUT,OUTPORT4 | CASSETTE INPORT1 = 0x062c ADDR2MEM PORTIN10,INPORT1 INPORT2 = 0x0634 ADDR2MEM PORTIN20,INPORT2 INPORT3 = 0x063c ADDR2MEM PORTIN10,INPORT3 INPORT4 = 0x0644 ADDR2MEM TAPEIN,INPORT4 | CASSETTE TAPENULS = 0x0654 MOVE.B #8,TAPENULS | NULLS FOR CASSETTE PDIPORT = 0x064E MOVE.L #PDI1,PDIPORT | PRINTER * INITIALIZE MC68230 PI/T MOVE.L #PDI1,%A0 | BASE ADDRESS OF PI/T MOVE.L #0x0000FF00,%D0 MOVEP.L %D0,1(%A0) * SELECT MODE 0 * IRQ'S INACTIVATED * PORT A--ALL BITS OUTPUTS * PORT B--ALL BITS INPUTS MOVE.B #0x60,13(%A0) | SUBMODE 01 FOR PORT A; INTERLOCKED HANDS MOVE.B #0xA0,15(%A0) | SUBMODE 1X FOR PORT B MOVE.B #0x30,1(%A0) | ENABLE HANDSHAKE LINES MOVE.B #0xA8,15(%A0) | RESET AND INIT PRINTER MOVE.L #PDI1+0x10,PDIPORT MOVE.B #0xA0,15(%A0) | CLEAR INIT * INITIALIZE THE PDI'S MD1CON = 0x064c MOVE.W #0x1515,MD1CON BSR INITSER | RESET & PROGRAM PDI * INITIALIZE XON/XOFF (READER ON / READER OFF) * AUTO-LINE FEED OVERRIDE XONOFF = 0x04e6 MOVE.L #0x00000000,XONOFF * TRAP14.SA AV46 = 0x00b8 ADDR2MEM TRAP14,AV46 CTLINK = 0x0656 * MOVE.L #(254<<24)+CT,CTLINK MOVE.L #0xfe00bf14,CTLINK ************************************************************************ * V E R S I O N N U M B E R A N D P R O M P T * ************************************************************************ MACSBUG: MOVE.W #0x2700,%SR | MASK OFF INTERRUPTS LEA SYSTACK,%A7 | RESTORE SYSTEM STACK BSR SWAPOUT | GET BP OUT OF USER MEMORY BPTILL = 0x0490 CLR.L BPTILL | GET RID OF 'TILL' BREAKPOINT OUTTO = 0x061c CLR.L OUTTO | INITIALIZE I/O TO DEFAULT INFROM = 0x0620 CLR.L INFROM | INITIALIZE I/O TO DEFAULT ECHOPT1 = 0x04e2 CLR.B ECHOPT1 | NO ECHO TO PORT1 LEA MSG001(%PC),%A5 | > (Prompt) BSR FIXDATA TST.W TRACEON | SEE IF IN TRACE MODE BEQ.S MACSBUG1 MOVE.B #':',(%A6)+ | IN TRACE MODE MACSBUG1:MOVE.B #'>',(%A6)+ | PROMPT MOVE.B #BLANK,(%A6)+ | .. SPACE BSR OUTPUT | GO PRINT IT * INPUT LINE BSR FIXBUF | GET READY FOR INPUT BSR PORTIN1 | GET A COMMAND DECODE6: MOVE.B #BLANK,(%A6) | BLANK OUT END+1 * DECODE A COMMAND * * DECODE SPECIAL CHARACTER USAGE: * LEADING SPACES IGNORED * LEADING NULLS IGNORED * IF SECOND CHAR * CHAR CAN BE ANY CHAR CMP.L %A6,%A5 | SEE IF ANYTHING ENTERED BMI.S DECODE1 TST.W TRACEON | SEE IF IN TRACE MODE BNE TCMDHOT | DIRECT TO TRACE 1 COMMAND DECODE1: CMP.L %A6,%A5 | SEE IF AT END OF BUFFER BHI WHAT | GO TO 'WHAT' IF CONFUSED MOVE.B (%A5),%D0 | GRAB FIRST CHARACTER CMPI.B #'*',%D0 | SEND LINE COMMAND BNE.S DECODE10 ADDQ.L #1,%A5 | GET PAST PHOENY PROMPT BSR OUTPUT2 | SEND LINE+CR (NO LF) TO PORT2 BRA.S MACSBUG | REENTER COMMAND MODE DECODE10:CMPI.B #0x20,%D0 | IGNORE LEADING SPACES BNE.S DECODE2 | WHERE TO GO IF NOT A SPACE ADDQ.L #1,%A5 | BUMP START OF BUFFER BRA.S DECODE1 | TRY NEXT CHARACTER * DECODE2: MOVE.B (%A5),%D1 | GET 2 LETTERS OF COMMAND LSL.W #8,%D1 | MAKE ROOM FOR SECOND CHAR MOVE.B 1(%A5),%D1 | GET SECOND CHAR CLR.L %D3 | D3 = CLEAR "NO" SWITCH DECODE21:LEA SOLIST(%PC),%A1 | A1 = COMMAND LIST ADDRESS DECODE4: MOVE.W (%A1)+,%D2 | D2 = 2 CHAR COMMAND FROM LIST CLR.L %D0 | CLEAR HIGH BITS MOVE.W (%A1)+,%D0 | D0 = OFFSET FROM START OF ROM TST.L %D3 BEQ.S DECODE41 | NOT A "NO" TST.B %D2 | IS "NO" OPTION SUPPORTED THIS COMMAND? BPL.S DECODE4 | NO...THEN RUN OUT OF COMMANDS DECODE41:ANDI.W #0x7F7F,%D2 | CLEAR "INVISABLE" & "NO" BITS CMPI.W #0x7F7F,%D2 | END OF LIST? BEQ WHAT | Command not found CMPI.B #'*',%D2 | SEE IF DON'T CARE CHARACTER BNE.S DECODE3 MOVE.B %D1,%D2 | DEFAULT DECODE3: CMP.W %D1,%D2 | Command from table = the input? BNE.S DECODE4 | COMMAND NOT FOUND CLR.W TRACEON | TURN OFF TRACE MODE ADDQ.L #2,%A5 | POINT A5 PAST 2 DIGIT COMMAND PEA FIRST(%PC) | BUILD GO TO ADDRESS ADD.L %D0,(%A7) | ON STACK. ADD.L %D3,(%A7) MOVE.L (%A7)+,%A0 | GO TO COMMAND JSR (%A0) | * SAVE MARK FOR RETURN BRA MACSBUG | * RETURN HERE * * NO COMMAND * NOCMD: MOVEQ #-4,%D3 | SET "NO" SWITCH MOVE.B (%A5),%D1 | MOVE CHAR #3 ASL.W #8,%D1 | MOVE OVER 1 CHAR MOVE.B 1(%A5),%D1 | MOVE CHAR #4 BRA.S DECODE21 | WHICH "NO" COMMAND? *------------------------------------------------------------------------- * File COMMANDS Command list 06/20/82 MSG001: DC.B CR,LF .ascii "TUTOR 1.3 " DC.B EOT | "PROMPT" ******************************************************* * C O P Y R I G H T . 1 9 8 1 . B Y . M O T O R O L A * ****************************************************** * VERSAbug command generation macro CMD: .MACRO a1,a2,a3,a4 FLAG = 0 | .IFC "\a2","HELP=NO" FLAG = FLAG+0x8000 | "Help" will not display this command .ENDIF .IFC "\a3","HELP=NO" FLAG = FLAG+0x8000 | "Help" will not display this command .ENDIF .IFC "\a2","NORTN=YES" FLAG = FLAG+0x80 | "NO\1".Command .ENDIF .IFC "\a3","NORTN=YES" FLAG = FLAG+0x80 | "NO\1".Command .ENDIF .IFC "\a1","PER" | Check for the "PER" command .ascii ".*" | +FLAG | Reg commands (.A2 .D6 .PC .R0 etc.) DC.W PERCMD-FIRST |************************************* .ENDIF .IFNC "\a1","PER" | If not PERCMD... .IFEQ "\a1"&(0xFF00) | If 1 digit code, 2nd will be a blank. .ascii "\a1 " | +FLAG | "\1"....Command - - (Single Digit) .ENDIF .IFNE "\a1"&(0xFF00) | If 2 digit code, leave as is. .ascii "\a1" | +FLAG | "\1"...Command .ENDIF DC.W \a1\()CMD-FIRST |************************************ .ENDIF .ENDM SOLIST: .align 2 | Start Of LIST * CMD PER,"HELP=NO",X,X DC.B 0xAE, 0x2A, 0x15, 0x8C * CMD NO,"HELP=NO",X,X DC.B 0xCE, 0x4F, 0x02, 0xEE * CMD BF,X,X DC.B 0x42, 0x46, 0x04, 0xE4 * CMD BM,X,X DC.B 0x42, 0x4D, 0x05, 0x36 * CMD BR,"NORTN=YES",X,X DC.B 0x42, 0xD2, 0x06, 0x52 * CMD BS,X,X DC.B 0x42, 0x53, 0x07, 0x18 * CMD BT,X,X DC.B 0x42, 0x54, 0x08, 0x52 * CMD DC,X,X DC.B 0x44, 0x43, 0x08, 0xA4 * CMD DF,X,X DC.B 0x44, 0x46, 0x09, 0x02 * CMD DU,X,X DC.B 0x44, 0x55, 0x0A, 0x20 * CMD G,X,X DC.B 0x47, 0x20, 0x06, 0x24 * CMD GD,X,X DC.B 0x47, 0x44, 0x06, 0x32 * CMD GO,X,X DC.B 0x47, 0x4F, 0x06, 0x24 * CMD GT,X,X DC.B 0x47, 0x54, 0x05, 0xD8 * CMD HE,X,X DC.B 0x48, 0x45, 0x0E, 0x82 * CMD LO,X,X DC.B 0x4C, 0x4F, 0x0F, 0xC6 * CMD M,X,X DC.B 0x4D, 0x20, 0x13, 0x14 * CMD MD,X,X DC.B 0x4D, 0x44, 0x11, 0x64 * CMD MM,X,X DC.B 0x4D, 0x4D, 0x13, 0x14 * CMD MS,X,X DC.B 0x4D, 0x53, 0x14, 0x98 * CMD OF,X,X DC.B 0x4F, 0x46, 0x16, 0xBC * CMD PA,"NORTN=YES",X,X DC.B 0x50, 0xC1, 0x21, 0xBC * CMD PF,X,X DC.B 0x50, 0x46, 0x17, 0x3A * CMD T,X,X DC.B 0x54, 0x20, 0x05, 0x88 * CMD TM,X,X DC.B 0x54, 0x4D, 0x18, 0x70 * CMD TR,X,X DC.B 0x54, 0x52, 0x05, 0x88 * CMD TT,X,X DC.B 0x54, 0x54, 0x05, 0xA4 * CMD VE,X,X DC.B 0x56, 0x45, 0x0F, 0xC0 DC.W 0xFFFF | End of list indicator *------------------------------------------------------------------------- * File VECTMSG Messages for vectors 05/29/82 ************************************************************ *Reprogram some VECTORS to specific ERROR handler routines * ************************************************************ INITVMSG:LEA VECT(%PC),%A0 | A0 = START OF VECTOR TABLE LEA AV4,%A1 | A1 = FIRST VECTOR TO INITIALIZE MOVEQ #10,%D0 | D0 = COUNT VECTI: MOVE.L %A0,(%A1)+ | MOVE ADDRESS TO VECTOR ADD.L %D0,%A0 | BUMP ADDRESS AV11 = 0x002C CMPA.L #AV11+4,%A1 BNE.S VECTI AV24 = 0x0060 LEA AV24,%A1 | A1 = NEXT VECTOR TO INITIALIZE VECTI2: MOVE.L %A0,(%A1)+ | MOVE ADDRESS TO VECTOR ADD.L %D0,%A0 | BUMP ADDRESS AV48 = 0x00c0 CMPA.L #AV48,%A1 BNE.S VECTI2 RTS ************************************************************************* * STANDARD VECTOR "MESSAGE" HANDLING ROUTINE ($30 IS TEMP STORAGE AREA) * ************************************************************************* VECT: MOVE.L #0x4f50434f,0x30 | "OPCO" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT5 MOVE.L #0x44495630,0x30 | "DIV0" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT5 MOVE.L #0x4348434b,0x30 | "CHCK" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT5 MOVE.L #0x54502056,0x30 | "TP V" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT5 MOVE.L #0x50524956,0x30 | "PRIV" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT5 MOVE.L #0x54524143,0x30 | "TRAC" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT5 MOVE.L #0x31303130,0x30 | "1010" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT5 MOVE.L #0x31313131,0x30 | "1111" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT5 MOVE.L #0x53505552,0x30 | "SPUR" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT EVECT5: BRA.S EVECT6 MOVE.L #0x41562331,0x30 | "AV#1" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT6 MOVE.L #0x41562332,0x30 | "AV#2" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT6 MOVE.L #0x41562333,0x30 | "AV#3" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT6 MOVE.L #0x41562334,0x30 | "AV#4" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT6 MOVE.L #0x41562335,0x30 | "AV#5" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT6 MOVE.L #0x41562336,0x30 | "AV#6" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT6 MOVE.L #0x41562337,0x30 | "AV#7" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT EVECT6: BRA.S EVECT7 MOVE.L #0x55542030,0x30 | "UT 0" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT7 MOVE.L #0x55542031,0x30 | "UT 1" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT7 MOVE.L #0x55542032,0x30 | "UT 2" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT7 MOVE.L #0x55542033,0x30 | "UT 3" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT7 MOVE.L #0x55542034,0x30 | "UT 4" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT7 MOVE.L #0x55542035,0x30 | "UT 5" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT7 MOVE.L #0x55542036,0x30 | "UT 6" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT7 MOVE.L #0x55542037,0x30 | "UT 7" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT EVECT7: BRA.S EVECT MOVE.L #0x55542038,0x30 | "UT 8" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT MOVE.L #0x55542039,0x30 | "UT 9" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT MOVE.L #0x55542041,0x30 | "UT A" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT MOVE.L #0x55542042,0x30 | "UT B" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT MOVE.L #0x55542043,0x30 | "UT C" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT MOVE.L #0x55542044,0x30 | "UT D" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BRA.S EVECT MOVE.L #0x55542045,0x30 | "UT E" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT BSR.S EVECT MOVE.L #0x55542046,0x30 | "UE F" MOVE TO $30, USE SHORT BRANCHES AND PRINT IT * * SAVE REGISTERS AND PRINT VECTOR MSG * EVECT: BRA EVECTL *------------------------------------------------------------------------- * File BF Block Fill command 06/16/82 * BLOCK FILL ADDRESS1 ADDRESS2 WORD-DATA BFCMD: LEA SYNTAX(%PC),%A0 BSR FNEXTF BSR GETA BSR CKWADR | CHECK WORD BOUNDRY ADDRESS MOVE.L %D0,%D6 | D6 = FROM BEGIN ADDRESS BSR FNEXTF BSR GETA BSR CKWADR | CHECK WORD BOUNDRY ADDRESS MOVE.L %D0,%A1 | A1 = FROM END ADDRESS BSR FNEXTF | FIND NEXT FIELD BSR GETNUMA | D0 = VALUE MOVE.L %D0,%D7 MOVE.L %D6,%A0 | A0 = FROM BEGIN ADDRESS BSR P2PHY | DISPLAY ADDRESSES CMP.L %A0,%A1 BCS SYNTAX | END ADDR TOO SMALL CMPI.L #0x10000,%D7 BCC SYNTAX | WORD OVERFLOW BFCMD11: MOVE.W %D7,(%A0) | STORE DATA MOVE.W (%A0)+,%D1 CMP.W %D7,%D1 | VERIFY DATA BNE MM90 | 'DATA DID NOT STORE' CMP.L %A0,%A1 BCC.S BFCMD11 BRA MACSBUG *------------------------------------------------------------------------- * File BM BM (Block Move) Command 11/27/81 * BLOCK MOVE BMCMD: LEA SYNTAX(%PC),%A0 BSR FNEXTF BSR GETA MOVE.L %D0,%A3 | A3 = FROM BEGIN ADDRESS BSR FNEXTF BSR GETA MOVE.L %D0,%A1 | A1 = FROM END ADDRESS BSR FNEXTF BSR GETA MOVE.L %D0,%A2 | A2 = TO BEGIN ADDRESS MOVE.L %A3,%A0 BSR P2PHY | PRINT ADDRESSES (A0) & (A1) MOVE.L %A2,%D0 BSR PPHY | PRINT TO ADDRESS MOVE.L %A1,%D1 SUB.L %A3,%D1 | D1 = SIZE - 1 BCS SYNTAX | END LESS THAN BEGIN ADDQ.L #1,%D1 | D1 = COUNT (SIZE) CMP.L %A3,%A2 BCC.S BM122 | MOVING LOW TO HIGH BM112: MOVE.B (%A3)+,(%A2)+ | MOVING HIGH TO LOW SUBQ.L #1,%D1 | COUNT BNE.S BM112 BRA.S BM142 BM122: ADD.L %D1,%A3 | MOVING LOW TO HIGH ADD.L %D1,%A2 BM132: MOVE.B -(%A3),-(%A2) SUBQ.L #1,%D1 BNE.S BM132 BM142: BRA MACSBUG *------------------------------------------------------------------------- * File BR BR, GD, GT, TR, TT, PER Commands 12/04/81 * ***T*** TRACE COMMAND TCMD: .align 2 | "T" Alias for "TR" command TRCMD: LEA TCMDHOT(%PC),%A0 | IF NO PARAMTERS BSR FNEXTF | FIND NEXT FIELD BSR GETNUMA | FIND NUMBER OF INST TO TRACE BSR CKADDR | INSURE 24 BITS OR LESS TST.L %D0 BNE.S TCMD15 TCMDHOT: .align 2 | SPECIAL ENTRY FROM DECODE MOVEQ #1,%D0 | ZERO; MAKE TRACE ONE TRACECNT = 0x04da TCMD15: MOVE.L %D0,TRACECNT BRA.S TRACE2 * ** TT ** "TRACE TILL" COMMAND * TTCMD: LEA SYNTAX(%PC),%A0 BSR FNEXTF | FIND NEXT FIELD BSR GETA | GET ADDRESS BSR CKWADR | CHECK WORD BOUNDRY ADDRESS MOVE.L %D0,%D6 BSR PPHY | DISPLAY TILL ADDRESS MOVE.L %D6,BPTILL | 9TH BP MOVE.L #0xFFFF,TRACECNT | SET FOR A VERY LONG TIME TRACE2: MOVE.W #-1,TRACEON | FOR DECODE OF NEXT COMMAND MOVE.L REGPC,%D0 BSR PPHY | DISPLAY START (PC) ADDRESS BRA UNTRACE * * ***GT*** RUN PROGRAM TO TEMP BREAKPOINT * GTCMD: LEA SYNTAX(%PC),%A0 | GET NUMBER ELSE PRINT "WHAT" BSR FNEXTF | FIND NEXT FIELD BSR GETA | GET ADDRESS BSR CKWADR | CHECK WORD BOUNDRY ADDRESS MOVE.L %D0,%D6 | D6 = UNTIL ADDRESS BSR PPHY | PRINT PHYSICAL ADDRESS * IF TILL ADDRESS IN BREAKPOINT TABLE; DISPLAY WHAT BPADD = 0x0470 LEA BPADD,%A0 | A0 = POINTER TO BP ADDRESSES MOVEQ #8,%D7 | D7 = # OF ADDRESS ALLOWED GT21: CMP.L (%A0)+,%D6 BEQ BCMD55 | ALREADY IN TABLE -SHOW TABLE- SUBQ.L #1,%D7 BNE.S GT21 MOVE.L %D6,BPTILL | 9TH BREAKPOINT BSR.S GOCMD1A | NORMAL STARTUP BRA.S GOCMD1 GOSET1: LEA GOCMD1A(%PC),%A0 | WHERE TO GO IF NO PARAMERS BSR FNEXTF | FIND NEXT FIELD BSR GETA | GET ADDRESS BSR CKWADR | CHECK WORD BOUNDRY ADDRESS MOVE.L %D0,REGPC GOCMD1A: MOVE.L REGPC,%D0 | (ALSO SUBROUTINE ENTRY) BSR PPHY | PRINT ".PC" PHYSICAL ADDRESS RTS GCMD: .align 2 | "G" ALIAS FOR "GO" GOCMD: BSR.S GOSET1 | "GO" (AFTER TRACING ONE INST) GOCMD1: MOVE.L #-1,TRACECNT | "FLAG" COUNTER AS SPECIAL BRA UNTRACE GDCMD: BSR.S GOSET1 | "GO DIRECT" Command BRA UNSTACK * ***BR*** SET AND PRINT BREAKPOINTS * DELETE ALL BREAKPOINTS NOBRCMD: BSR.S FIXBP | GET POINTERS BCMD01: CLR.L (%A0)+ | CLEAR THE ADDRESS TABLE SUBQ.L #1,%D7 | DO IT 8 TIMES BNE.S BCMD01 BRA.S BCMD7 | DISPLAY EMPTY TABLE FIXBP: LEA BPADD,%A0 | SET UP ADDRESS & COUNTER MOVEQ #8,%D7 | COUNTER BPCNT = 0x0494 LEA BPCNT,%A2 | COUNTS RTS ************************************************************ * THIS COMMAND SUPPORTS THE "NO" OPTION. COMMANDS THAT ALLOW * THE "NO" OPTION PROVIDE A HARD BRANCH 4 BYTES BEFORE THE * REGULAR COMMAND. ************************************************************ BRA NOBR0 | ENTRY FOR "NOBR" (IT LOOKS FOR PARMS OR NOT) BRCMD: LEA BCMD7(%PC),%A0 | WHERE TO GO IF NO PARMS BCMD0: BSR FNEXTF | FIND NEXT FIELD BSR GETA | GET ADDRESS BSR CKWADR | CHECK WORD BOUNDRY ADDRESS BSR.S FIXBP | SET UP COUNTER & ADDRESS BCMD00: CMP.L (%A0),%D0 | SEE IF ALREADY IN TABLE BEQ.S BCMD33 | GO CHECK FOR COUNT ADDQ.L #4,%A2 | BUMP OTHER POINTER ADDQ.L #4,%A0 | BUMP MAIN POINTER SUBQ.L #1,%D7 BNE.S BCMD00 BSR.S FIXBP | GET ADDRESS & POINTERS BCMD3: TST.L (%A0) | FIND AN EMPTY STOP BNE.S BCMD5 MOVE.L %D0,(%A0) | PUT NEW ADDRESS IN TABLE BCMD33: CLR.L (%A2) | CLEAR CURRENT COUNT MOVE.B (%A5),%D1 | CHECK INPUT FOR COUNT CMPI.B #';',%D1 BNE.S BCMD6 | NO COUNT ADDQ.L #1,%A5 | BUMP THE BUFFER SCANNER BSR GETNUMA | GO GET THE COUNT MOVE.L %D0,(%A2) | MOVE TO TABLE BCMD6: LEA BCMD7(%PC),%A0 | WHERE TO GO IF NO MORE PARAMETERS BRA.S BCMD0 BCMD5: ADDQ.L #4,%A0 | BUMP TABLE POINTER ADDQ.L #4,%A2 | BUMP POINTER TO COUNTS SUBQ.L #1,%D7 | LOOP AROUND BNE.S BCMD3 BCMD55: LEA MSG008E(%PC),%A5 | TABLE FULL; ERROR MESSAGE BSR FIXDATA BRA.S BCMD77 BCMD7: LEA MSGBR(%PC),%A5 | "BREAKPOINTS" BSR FIXDCRLF BCMD77: BSR OUT1CR BSR.S FIXBP | SET ADDRESS & COUNTER BCMD8: MOVE.L (%A2)+,%D6 | D6 = COUNT MOVE.L (%A0),%D0 | D0 = ADDRESS BEQ.S BCMD9 | ZERO ADDRESS BSR FRELADDR | FORMAT RELATIVE ADDRESS MOVE.B #BLANK,(%A6)+ MOVE.L (%A0),%D0 | FORMAT ABSOLUTE ADDRESS BSR PNT6HX MOVE.L %D6,%D0 BEQ.S BCMD81 | DON'T PRINT ZERO COUNT MOVE.B #';',(%A6)+ BSR PNTZHX | PRINT WITH ZERO SURPRESS BCMD81: BSR OUT1CR BCMD9: ADDQ.L #4,%A0 SUBQ.L #1,%D7 | LOOP AROUND BNE.S BCMD8 BRA MACSBUG MSGBR: .ascii "BREAKPOINTS" DC.B EOT * NOBR COMMAND NOBR0: LEA NOBRCMD(%PC),%A0 | WHERE TO GO IF NO PARAMETERS NOBR1: BSR FNEXTF | FIND NEXT FIELD BSR GETA | GO DECODE NUMBER/ADDRESS TST.L %D0 BEQ.S BCMD55 | ZERO NOT VALID BREAKPOINT BSR CKWADR | CHECK WORD BOUNDRY ADDRESS LEA BPADD,%A0 | SET UP TABLE POINTER MOVEQ #8,%D7 | COUNTER NOBR3: MOVE.L (%A0),%D1 | GET BREAKPOINT IN TABLE CMP.L %D1,%D0 | SEE IF SAME BEQ.S NOBR4 ADDQ.L #4,%A0 SUBQ.L #1,%D7 BNE.S NOBR3 NOBR4: CLR.L (%A0) | CLEAR THIS BREAKPOINT LEA BCMD7(%PC),%A0 | WHERE TO GO IF NO PARAMETER BRA.S NOBR1 *------------------------------------------------------------------------- * File BS BS (Block Search) Command 11/27/81 * * BLOCK SEARCH BS 'LITERAL STRING' * BS [] [;