URL
https://opencores.org/ocsvn/thor/thor/trunk
Subversion Repositories thor
[/] [thor/] [trunk/] [software/] [source/] [Debugger.asm] - Rev 24
Compare with Previous | Blame | View Log
; ============================================================================; __; \\__/ o\ (C) 2015 Robert Finch, Stratford; \ __ / All rights reserved.; \/_// robfinch<remove>@finitron.ca; ||;;; This source file is free software: you can redistribute it and/or modify; it under the terms of the GNU Lesser General Public License as published; by the Free Software Foundation, either version 3 of the License, or; (at your option) any later version.;; This source file is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with this program. If not, see <http://www.gnu.org/licenses/>.;;; ============================================================================DBG_DS = $5000DBG_ATTR = %000011000_111111110_0000000000bssDBGBuf fill.b 84,0DBGBufndx db 0codealign 256;------------------------------------------------------------------------------; r2 = text output column; r6 = text output row; r5 = disassembly address;------------------------------------------------------------------------------public Debugger:sys #190 ; save contextldi sp,#$2bf8addui sp,sp,#-24sws c1,[sp]sws ds,8[sp]sws ds.lmt,16[sp]ldis ds,#0ldis ds.lmt,#-1sws ds,zs:IOFocusNdx_syncbsr KeybdClearBufbsr VideoInit2bsr VBClearScreenmov r1,r0 ; row = 0mov r2,r0 ; col = 0ldi r6,#2 ; set cursor possys #10 ; call video BIOS; bsr DBGRamTestlla r1,cs:msgDebugger ; convert address to linearldi r6,#$14 ; Try display stringsys #10 ; call video BIOSmov r6,r0mov r2,r0ldi r5,#$FFFF8000bsr DBGDisassem20; br Debugger_exitpromptAgain:; Clear input buffersb r0,DBGBufndxldis lc,#$14 ; (21-1)*4ldi r1,#DBGBufldi r2,#0 ;stset.hi r2,[r1] ; clear the bufferldi r6,#30 ; move cursor pos to row 30bsr DBGPrompt; Get character loop.0001:bsr KeybdGetCharWaitcmpi p0,r1,#CRp0.eq br .processInputcmpi p0,r1,#_BSp0.eq br .backspacecmpi p0,r1,#' 'p0.ltu br .0001; some other character, store in buffer if it will fitlbu r3,DBGBufndxcmpi p3,r3,#80 ; max 80 charsp3.ltu bsr DBGDispCharp3.ltu sb r1,DBGBuf[r3]p3.ltu addui r3,r3,#1p3.ltu sb r3,DBGBufndxbr .0001.backspace:lbu r1,DBGBufndxtst p0,r1 ; is is even possible to backspace ?p0.eq br .0001ldi r7,#$80subu r7,r7,r1addui r7,r7,#-1 ; loop count is one lessmtspr lc,r7addui r1,r1,#DBGBufmov r4,r1addui r1,r1,#-1mov r3,r0stmov.bi [r4],[r1],r3br .0001.processInput:mov r4,r0.0002:lbu r1,DBGBuf[r4]tst p0,r1p0.eq br promptAgaincmpi p0,r1,#' 'p0.leu addui r4,r4,#1p0.leu br .0002cmpi p0,r1,#'D'p0.eq addui r4,r4,#1p0.eq br DoDisassemcmpi p0,r1,#'M'p0.eq br DBGDumpMemcmpi p0,r1,#'x'p0.eq br Debugger_exitbr promptAgainDebugger_exit:lws c1,[sp]lws ds,8[sp]lws ds.lmt,16[sp]sws ds,zs:IOFocusNdx_sys #191 ; restore contextrtsendpublic;------------------------------------------------------------------------------;------------------------------------------------------------------------------DoDisassem:bsr DBGGetHexNumbertst p0,r8p0.eq br promptAgainmov r5,r1bsr VBClearScreen2bsr DBGDisassem20br promptAgain;------------------------------------------------------------------------------; Dump memory bytes; M <start address>;------------------------------------------------------------------------------DBGDumpMem:addui r4,r4,#1 ; advance a character past 'M'bsr DBGGetHexNumbermov r12,r1tst p0,r8p0.eq jmp promptAgainbsr VBClearScreen2addui r13,r12,#200ldi r6,#2mov r2,r0.0002:mov r14,r0ldi r1,#'>'bsr DBGDispCharmov r4,r12bsr DBGDisplayHalf.0001:bsr space1lbu r4,zs:[r12+r14]bsr DBGDisplayByteaddui r14,r14,#1cmpi p0,r14,#8p0.ltu br .0001bsr space1mov r14,r0bsr ReverseVideo ; reverse video attribute.0003:lbu r1,zs:[r12+r14]cmpi p0,r1,#' 'p0.ltu ldi r1,#'.'bsr DBGDispCharaddui r14,r14,#1cmpi p0,r14,#8p0.ltu br .0003bsr ReverseVideo ; put video back to normaladdui r6,r6,#1addu r12,r12,r14cmp p0,r12,r13p0.ltu br .0002jmp promptAgain;------------------------------------------------------------------------------; DBGGetHexNumber:; Get a hexi-decimal number from the input buffer.;; Parameters:; r4 = text pointer (updated); Returns:; r1 = number; r8 = number of digits;------------------------------------------------------------------------------DBGGetHexNumber:addui sp,sp,#-8sws c1,[sp]ldis lc,#80 ; max 80 charsmov r7,r0 ; working accum.mov r8,r0 ; number of digits.0003:lbu r1,[r4] ; skip leading spacescmpi p0,r1,#' 'p0.leu addui r4,r4,#1p0.leu br .0003.0002:lbu r1,[r4]bsr DBGCharToHextst p0,r3p0.eq br .0001shli r7,r7,#4or r7,r7,r1addui r4,r4,#1addui r8,r8,#1loop .0002.0001:mov r1,r7lws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------; DBGCharToHex:; Convert a single ascii character to hex nybble.; Parameters:; r1 = ascii character to convert; Returns:; r1 = binary nybble; r3 = 1 if conversion successful, 0 otherwise;------------------------------------------------------------------------------DBGCharToHex:cmpi p0,r1,#'0'p0.ltu br .0004cmpi p0,r1,#'9'p0.gtu br .0001addui r1,r1,#-'0'ldi r3,#1rts.0001:cmpi p0,r1,#'A'p0.ltu br .0004cmpi p0,r1,#'F'p0.gtu br .0003subui r1,r1,#'A'-10ldi r3,#1rts.0003:cmpi p0,r1,#'a'p0.ltu br .0004cmpi p0,r1,#'f'p0.gtu br .0004subui r1,r1,#'a'-10ldi r3,#1rts.0004:mov r3,r0.exit:rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------public DebugIRQ:sw sp,reg_save+8*27ldi sp,#$2bf8addui sp,sp,#-104sws c1,[sp]sws ds,8[sp]sws ds.lmt,16[sp]sw r1,24[sp]sw r2,32[sp]sw r3,40[sp]sw r4,48[sp]sw r5,56[sp]sw r6,64[sp]sw r7,72[sp]sw r8,80[sp]sw r9,88[sp]sw r10,96[sp]ldis ds,#DBG_DSldis ds.lmt,#$8000syncbsr VBClearScreen2mov r2,r0mov r6,r0ldi r1,#msgDebuggerbsr DBGDispStringmfspr r5,dpcbsr DBGDisassem20lws c1,[sp]lws ds,8[sp]lws ds.lmt,16[sp]lw r1,24[sp]lw r2,32[sp]lw r3,40[sp]lw r4,48[sp]lw r5,56[sp]lw r6,64[sp]lw r7,72[sp]lw r8,80[sp]lw r9,88[sp]lw r10,96[sp]lw sp,reg_save+8*27rtdendpublic;------------------------------------------------------------------------------; Disassemble 20 lines of code.;------------------------------------------------------------------------------DBGDisassem20:addui sp,sp,#-8sws c1,[sp]ldis lc,#19ldi r6,#3.0001:bsr Disassemaddu r5,r5,r10addui r6,r6,#1loop .0001lws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------DBGPrompt:addui sp,sp,#-8sws c1,[sp]mov r2,r0ldi r1,#'D'bsr DBGDispCharldi r1,#'B'bsr DBGDispCharldi r1,#'G'bsr DBGDispCharldi r1,#'>'bsr DBGDispCharlws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------Disassem:addui sp,sp,#-16sws c1,[sp]sws c2,8[sp]ldi r2,#1 ; column onebsr DisplayAddrbsr DisplayBytesldi r2,#38 ; tab to column 38bsr DBGDisplayPredldi r2,#46 ; tab to column 46mov r3,r0lbu r1,zs:[r5]cmpi p0,r1,#$00p0.eq ldi r3,#mne_brkcmpi p0,r1,#$10p0.eq ldi r3,#mne_nopcmpi p0,r1,#$11p0.eq ldi r3,#mne_rtscmpi p0,r1,#$20p0.eq ldi r3,#mne_immcmpi p0,r1,#$30p0.eq ldi r3,#mne_immcmpi p0,r1,#$40p0.eq ldi r3,#mne_immcmpi p0,r1,#$50p0.eq ldi r3,#mne_immcmpi p0,r1,#$60p0.eq ldi r3,#mne_immcmpi p0,r1,#$70p0.eq ldi r3,#mne_immcmpi p0,r1,#$80p0.eq ldi r3,#mne_immtst p0,r3p0.ne bsr DBGDisplayMnep0.eq br .0001br .exit.0001:lbu r1,zs:1[r5] ; get the opcodeshli r1,r1,#1lcu r1,cs:DBGInsnMne[r1]cmpi p0,r1,#$FFF0p0.geu br .0002.dispMne:ori r3,r1,#Debugger & $FFFF0000 ; set high order address bitsbsr DBGDisplayMnebr .dispOper.0002:andi r1,r1,#15lcu r3,cs:DBGInsnMneT[r1]ori r3,r3,#Debugger & $FFFF0000bsr DBGGetFunclcu r3,cs:[r3+r1*2]br .dispMne.dispOper:lbu r1,zs:1[r5]lbu r1,cs:DBGOperFmt[r1]jci c1,cs:DBGOperFmtT[r1]ldi r1,#48sc r1,hs:LEDS; lcu r1,cs:DBGOperFmtT[r1]; ori r1,r1,#Debugger & $FFFF0000; mtspr c2,r1; jsr [c2].exit:lws c1,[sp]lws c2,8[sp]addui sp,sp,#16rts;------------------------------------------------------------------------------; Display the disassembly address.;------------------------------------------------------------------------------DisplayAddr:addui sp,sp,#-8sws c1,[sp]mov r4,r5bsr DBGDisplayHalfbsr space3lws c1,[sp]addui sp,sp,#8rtsspace1:addui sp,sp,#-8sws c1,[sp]ldi r1,#' 'bsr DBGDispCharlws c1,[sp]addui sp,sp,#8rtsspace3:addui sp,sp,#-8sws c1,[sp]bsr space1bsr space1bsr space1lws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------DBGDisplayHalf:addui sp,sp,#-8sws c1,[sp]rori r4,r4,#16bsr DBGDisplayCharrroli r4,r4,#16bsr DBGDisplayCharrlws c1,[sp]addui sp,sp,#8rtsDBGDisplayCharr:addui sp,sp,#-8sws c1,[sp]rori r4,r4,#8bsr DBGDisplayByteroli r4,r4,#8bsr DBGDisplayBytelws c1,[sp]addui sp,sp,#8rtsDBGDisplayByte:addui sp,sp,#-8sws c1,[sp]rori r4,r4,#4bsr DBGDisplayNybbleroli r4,r4,#4bsr DBGDisplayNybblelws c1,[sp]addui sp,sp,#8rtsDBGDisplayNybble:addui sp,sp,#-8sws c1,[sp]andi r1,r4,#15cmpi p0,r1,#9p0.gtu addui r1,r1,#7addui r1,r1,#'0'bsr DBGDispCharlws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------; DBGDispChar:;; Display a character on the debug screen.;; Parameters:; r1 = character to display; r2 = text column; r6 = text row; Returns:; r2 incremented;------------------------------------------------------------------------------DBGDispChar:addui sp,sp,#-16sws c1,[sp] ; save return addresssw r7,8[sp] ; save r7 work registerandi r1,r1,#$7F ; make sure in rangebsr VBAsciiToScreen ; convert to screen charori r1,r1,#DBG_ATTR ; add in attributelcu r7,Textcols ; figure out memory indexmulu r7,r6,r7 ; row * num cols_4addui r7,r7,#$10000 ; + text base + (row * num cols) * 4_4addu r7,r2,r7 ; + column * 4sh r1,hs:[r7] ; store the charaddui r2,r2,#1 ; increment text positionlws c1,[sp] ; restore return addresslw r7,8[sp]addui sp,sp,#16rts;------------------------------------------------------------------------------; Display a string of text on the debug screen.;------------------------------------------------------------------------------DBGDispString:addui sp,sp,#-16sws c1,[sp]sw r7,8[sp]mov r7,r1.0001:lbu r1,zs:[r7]tst p0,r1p0.eq br .0002bsr DBGDispCharaddui r7,r7,#1br .0001.0002:lws c1,[sp]lw r7,8[sp]addui sp,sp,#16rts;------------------------------------------------------------------------------; Get the length of an instruction.;------------------------------------------------------------------------------public DBGGetInsnLength:addui r31,r31,#-8sws c1,[r31]lbu r1,zs:[r5]; Test for special predicate values which are one byte long.cmpi p0,r1,#$00 ; BRKp0.eq ldi r1,#1p0.eq br .0001cmpi p0,r1,#$10 ; NOPp0.eq ldi r1,#1p0.eq br .0001cmpi p0,r1,#$11 ; RTSp0.eq ldi r1,#1p0.eq br .0001; Test for special immediate predicates these vary in length.cmpi p0,r1,#$20p0.eq ldi r1,#2p0.eq br .0001cmpi p0,r1,#$30p0.eq ldi r1,#3p0.eq br .0001cmpi p0,r1,#$40p0.eq ldi r1,#4p0.eq br .0001cmpi p0,r1,#$50p0.eq ldi r1,#5p0.eq br .0001cmpi p0,r1,#$60p0.eq ldi r1,#6p0.eq br .0001cmpi p0,r1,#$70p0.eq ldi r1,#7p0.eq br .0001cmpi p0,r1,#$80p0.eq ldi r1,#8p0.ne lbu r1,zs:1[r5]p0.ne lbu r1,cs:DBGInsnLength[r1].0001:lws c1,[r31]addui r31,r31,#8rtsendpublic;------------------------------------------------------------------------------; Display the bytes associated with an instruction. There may be up to eight; bytes displayed.; r7 = offset from r5 the dump address;------------------------------------------------------------------------------DisplayBytes:addui sp,sp,#-24sws c1,[sp]sws lc,8[sp]sw r7,16[sp]seildi r31,#INT_STACKbsr DBGGetInsnLengthmov r10,r1cliaddui r1,r1,#-1 ; loop count is one lessmtspr lc,r1mov r7,r0.next:lbu r4,zs:[r5+r7]bsr DBGDisplayBytebsr space1 ; skip a spaceaddui r7,r7,#1 ; increment offset to next byteloop .nextlws c1,[sp]lws lc,8[sp]lw r7,16[sp]addui sp,sp,#24rts;------------------------------------------------------------------------------; Display a predicate.;; The always true predicate and special predicate values don't display.;------------------------------------------------------------------------------DBGDisplayPred:addui sp,sp,#-8sws c1,[sp]lbu r1,zs:[r5]cmpi p0,r1,#$00 ; brk specialp0.eq br .noDispcmpi p0,r1,#$01 ; always true predicate doesn't displayp0.eq br .noDispcmpi p0,r1,#$11 ; rts specialp0.eq br .noDispcmpi p0,r1,#$10 ; nop specialp0.eq br .noDispcmpi p0,r1,#$20p0.eq br .noDispcmpi p0,r1,#$30p0.eq br .noDispcmpi p0,r1,#$40p0.eq br .noDispcmpi p0,r1,#$50p0.eq br .noDispcmpi p0,r1,#$60p0.eq br .noDispcmpi p0,r1,#$70p0.eq br .noDispcmpi p0,r1,#$80p0.eq br .noDispldi r1,#'p'bsr DBGDispCharlbu r4,zs:[r5]shrui r4,r4,#4bsr DBGDisplayNybbleldi r1,#'.'bsr DBGDispCharlbu r1,zs:[r5]bsr DBGDispCondbr .exit.noDisp:addui r2,r2,#7.exitlws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------; Display the condition portion of the predicate.;------------------------------------------------------------------------------DBGDispCond:addui sp,sp,#-8sws c1,[sp]andi r7,r1,#15addu r7,r7,r7addu r7,r7,r1lbu r1,cs:DBGPredCons[r7]bsr DBGDispCharlbu r1,cs:DBGPredCons+1[r7]bsr DBGDispCharlbu r1,cs:DBGPredCons+2[r7]bsr DBGDispCharlws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------; Display a mnemonic.; Parameters:; r3 = pointer to mnemonic string;------------------------------------------------------------------------------DBGDisplayMne:addui sp,sp,#-8sws c1,[sp]bsr space1; Mnemonics are always at least 2 charslbu r1,cs:[r3]bsr DBGDispChar; second charlbu r1,cs:1[r3]biti p1,r1,#$80 ; test high bitbsr DBGDispCharp1.ne br .exit; third charlbu r1,cs:2[r3]biti p1,r1,#$80 ; test high bitbsr DBGDispCharp1.ne br .exit; fourth charlbu r1,cs:3[r3]biti p1,r1,#$80 ; test high bitbsr DBGDispCharp1.ne br .exit; fifth charlbu r1,cs:4[r3]bsr DBGDispChar.exit:addui r2,r2,#1 ; 1 spacelws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------; Display a register;------------------------------------------------------------------------------DBGDispReg:addui sp,sp,#-16sws c1,[sp]sw r7,8[sp]mov r7,r1ldi r1,#'r'DBGDispBx1:bsr DBGDispCharcmpi p0,r7,#10p0.geu divui r1,r7,#10p0.geu addui r1,r1,#'0'p0.geu bsr DBGDispCharmodui r1,r7,#10addui r1,r1,#'0'bsr DBGDispCharlws c1,[sp]lw r7,8[sp]addui sp,sp,#16rts;------------------------------------------------------------------------------; Display a bit number;------------------------------------------------------------------------------DBGDispBReg:addui sp,sp,#-16sws c1,[sp]sw r7,8[sp]mov r7,r1ldi r1,#'b'br DBGDispBx1;------------------------------------------------------------------------------; Display a special purpose register;------------------------------------------------------------------------------DBGDispSpr:addui sp,sp,#-16sws c1,[sp]sw r7,8[sp]addu r7,r1,r1addu r7,r7,r1 ; r7 = r1 * 3lbu r1,cs:DBGSpr[r7]bsr DBGDispCharlbu r1,cs:DBGSpr+1[r7]bsr DBGDispCharlbu r1,cs:DBGSpr+2[r7]cmpi p0,r1,#' 'p0.ne bsr DBGDispCharlws c1,[sp]lw r7,8[sp]addui sp,sp,#16rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------DBGComma:addui sp,sp,#-8sws c1,[sp]ldi r1,#','bsr DBGDispCharlws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------; Display registers for TST instruction.;------------------------------------------------------------------------------DBGDispTstregs:addui sp,sp,#-8sws c1,[sp]ldi r2,#54 ; tab out to column 54lbu r1,zs:1[r5]andi r1,r1,#15bsr DBGDispSprbsr DBGCommalbu r1,zs:2[r5]andi r1,r1,#$3fbsr DBGDispReglws c1,[sp]addui sp,sp,#8rtsDBGDispCmpregs:addui sp,sp,#-8sws c1,[sp]ldi r2,#54 ; tab out to column 54lbu r1,zs:1[r5]andi r1,r1,#15bsr DBGDispSprbsr DBGCommalbu r1,zs:2[r5]andi r1,r1,#$3fbsr DBGDispRegbsr DBGCommalbu r1,zs:2[r5]shrui r1,r1,#6lbu r7,zs:3[r5]andi r7,r7,#15shli r7,r7,#2or r1,r7,r1bsr DBGDispReglws c1,[sp]addui sp,sp,#8rtsDBGDispBrDisp:addui sp,sp,#-8sws c1,[sp]ldi r2,#54 ; tab out to column 54lbu r1,zs:1[r5]lbu r7,zs:2[r5]andi r1,r1,#15shli r7,r7,#4or r1,r7,r1addui r1,r1,#3 ; instruction sizeaddu r4,r1,r5 ; instruction addressldi r1,#'$'bsr DBGDispCharbsr DBGDisplayHalflws c1,[sp]addui sp,sp,#8rtsDBGDispCmpimm:addui sp,sp,#-8sws c1,[sp]ldi r2,#54 ; tab out to column 54lbu r1,zs:1[r5]andi r1,r1,#15bsr DBGDispSprbsr DBGCommalbu r1,zs:2[r5]andi r1,r1,#$3fbsr DBGDispRegbsr DBGCommalbu r1,zs:2[r5]shrui r1,r1,#6lbu r7,zs:3[r5]shli r7,r7,#2or r4,r7,r1ldi r1,#'#'bsr DBGDispCharldi r1,#'$'bsr DBGDispCharbsr DBGDisplayHalflws c1,[sp]addui sp,sp,#8rts; Used by mtsprDBGDispSprRx:addui sp,sp,#-16sws c1,[sp]sw r7,8[sp]ldi r2,#54 ; tab out to column 54lbu r1,zs:2[r5]lbu r7,zs:3[r5]shrui r1,r1,#6andi r7,r7,#15shli r7,r7,#2or r1,r7,r1bsr DBGDispSprbsr DBGCommalbu r1,zs:2[r5]andi r1,r1,#63bsr DBGDispReglws c1,[sp]lw r7,8[sp]addui sp,sp,#16rts; Format #4;DBGDispRxRxRx:addui sp,sp,#-16sws c1,[sp]sw r7,8[sp]ldi r2,#54 ; tab out to column 54lbu r1,zs:3[r5]shrui r1,r1,#4lbu r7,zs:4[r5]andi r7,r7,#3shli r7,r7,#4or r1,r7,r1bsr DBGDispRegbsr DBGCommalbu r1,zs:2[r5]andi r1,r1,#63bsr DBGDispRegbsr DBGCommalbu r1,zs:2[r5]shrui r1,r1,#6lbu r7,zs:3[r5]andi r7,r7,#15shli r7,r7,#2or r1,r7,r1bsr DBGDispReglws c1,[sp]lw r7,8[sp]addui sp,sp,#16rts; Format #5;DBGDispRxRx:addui sp,sp,#-16sws c1,[sp]sw r7,8[sp]ldi r2,#54 ; tab out to column 54lbu r1,zs:2[r5]shrui r1,r1,#6lbu r7,zs:3[r5]andi r7,r7,#15shli r7,r7,#2or r1,r7,r1bsr DBGDispRegbsr DBGCommalbu r1,zs:2[r5]andi r1,r1,#63bsr DBGDispReglws c1,[sp]lw r7,8[sp]addui sp,sp,#16rts; Format #6;DBGDispPxPxPx:addui sp,sp,#-16sws c1,[sp]sw r7,8[sp]ldi r2,#54 ; tab out to column 54lbu r1,zs:3[r5]shrui r1,r1,#4lbu r7,zs:4[r5]andi r7,r7,#3shli r7,r7,#4or r1,r7,r1bsr DBGDispBRegbsr DBGCommalbu r1,zs:2[r5]andi r1,r1,#63bsr DBGDispBRegbsr DBGCommalbu r1,zs:2[r5]shrui r1,r1,#6lbu r7,zs:3[r5]andi r7,r7,#15shli r7,r7,#2or r1,r7,r1bsr DBGDispBReglws c1,[sp]lw r7,8[sp]addui sp,sp,#16rts; Format #7;DBGDispNone:rts; Format #8 (biti);DBGDispPxRxImm:addui sp,sp,#-16sws c1,[sp]ldi r2,#54 ; tab out to column 54lbu r1,zs:2[r5]shrui r1,r1,#6lbu r7,zs:3[r5]andi r7,r7,#3_4addu r1,r7,r1bsr DBGDispSprbsr DBGCommalbu r1,zs:2[r5]andi r1,r1,#63bsr DBGDispRegbsr DBGCommalbu r1,zs:3[r5]shrui r1,r1,#4lbu r7,zs:4[r5]_16addu r1,r7,r1bsr DBGDispImmlws c1,[sp]addui sp,sp,#16rts; Format #9 (adduis);DBGDispRxImm:addui sp,sp,#-8sws c1,[sp]lbu r1,zs:2[r5]andi r1,r1,#63bsr DBGDispRegbsr DBGCommalbu r1,zs:2[r2]shrui r1,r1,#6lbu r7,zs:3[r2]_4addu r1,r7,r1bsr DBGDispImmlws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------; Display an immediate value.;------------------------------------------------------------------------------DBGDispImm:addui sp,sp,#-16sws c1,[sp]sw r4,8[sp]mov r4,r1ldi r1,#'#'bsr DBGDispCharldi r1,#'$'bsr DBGDispCharcmpi p0,r4,#$FFFFp0.gtu bsr DBGDisplayHalfp0.gtu br .exitcmpi p0,r4,#$FFp0.gtu bsr DBGDisplayCharrp0.gtu br .exitbsr DBGDisplayByte.exit:lw c1,[sp]lw r4,8[sp]addui sp,sp,#16rts;------------------------------------------------------------------------------; DBGGetFunc:; Get the function code bits from the instruction. These come from one of; four different locations depending on the opcode.;; Parameters:; r1 = opcode group (0 to 15); Returns:; r1 = function code;------------------------------------------------------------------------------DBGGetFunc:jci c0,cs:DBGFuncT[r1]gf0:gf2:gf3:gf4:gf6:gfB:lbu r1,zs:4[r5]shrui r1,r1,#2rtsgf1:gf5:gf7:gf8:lbu r1,zs:3[r5]shrui r1,r1,#4rtsgf9:lbu r1,zs:5[r5]andi r1,r1,#15rtsgfA:lbu r1,zs:2[r5]andi r1,r1,#15rts;------------------------------------------------------------------------------; Checker-board RAM testing routine.;; Ram is tested from $6000 to $7FFFFFF. The first 24k of RAM is not tested,; as 16k underlays the scratchpad RAM and is unaccessible and 8kb is used by; the kernel.;; First uses the pattern AAAAAAAA to memory; 55555555;; Then uses the pattern 55555555 to memory; AAAAAAAA;------------------------------------------------------------------------------DBGRamTest:addui sp,sp,#-8sws c1,[sp]ldi r10,#$AAAAAAAAldi r11,#$55555555bsr DBGRamTest1ldi r10,#$55555555ldi r11,#$AAAAAAAAbsr DBGRamTest1lws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------DBGRamTest1:addui sp,sp,#-8sws c1,[sp]mov r1,r10mov r3,r11ldi r5,#$6000ldi lc,#$3FF3FF ; (32MB - 24kB)/8 - 1mov r8,r0.0001:sh r1,zs:[r5]sh r3,zs:4[r5]addui r5,r5,#8andi r4,r5,#$FFFtst p0,r4p0.eq shrui r4,r5,#12p0.eq ldi r2,#0p0.eq ldi r6,#1p0.eq bsr DBGDisplayCharrloop .0001ldi r5,#$6000ldi lc,#$3FF3FF ; (32MB - 24kB)/8 - 1.0002:lh r1,zs:[r5]lh r3,zs:4[r5]cmp p0,r1,r10p0.ne mov r7,r1p0.ne bsr DBGBadRamcmp p0,r3,r11p0.ne mov r7,r3p0.ne bsr DBGBadRamaddui r5,r5,#8andi r4,r5,#$FFFtst p0,r4p0.eq shrui r4,r5,#12p0.eq ldi r2,#0p0.eq ldi r6,#1p0.eq bsr DBGDisplayCharrloop .0002lws c1,[sp]addui sp,sp,#8rts;------------------------------------------------------------------------------; Dispay bad ram nessage with address and data.;------------------------------------------------------------------------------DBGBadRam:addui sp,sp,#-8sws c1,[sp]lla r1,cs:msgBadRamldi r2,#0ldi r6,#2addu r6,r6,r8bsr DBGDispStringmov r4,r5bsr DBGDisplayHalfbsr space1mov r4,r7bsr DBGDisplayHalfaddui r8,r8,#1andi r8,r8,#15cmpi p0,r8,#15p0.eq ldis lc,#1lws c1,[sp]addui sp,sp,#8rtsmsgBadRam:byte "Menory failed at: ",0;------------------------------------------------------------------------------; Reverse the video attribute.;------------------------------------------------------------------------------ReverseVideo:lhu r1,NormAttrshrui r2,r1,#9shli r3,r1,#9andi r2,r2,#%111111111_0000000000andi r3,r3,#%111111111_000000000_0000000000or r1,r2,r3rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------; Tables;------------------------------------------------------------------------------;------------------------------------------------------------------------------align 2DBGFuncT:dc gf0,gf1,gf2,gf3,gf4,gf5,gf6,gf7,gf8,gf9,gfA,gfB,gf0,gf0,gf0,gf0align 2DBGLineTbl:dc 0dc 1*84dc 2*84dc 3*84dc 4*84dc 5*84dc 6*84dc 7*84dc 8*84dc 9*84dc 10*84dc 11*84dc 12*84dc 13*84dc 14*84dc 15*84dc 16*84dc 17*84dc 18*84dc 19*84dc 20*84dc 21*84dc 22*84dc 23*84dc 24*84dc 25*84dc 26*84dc 27*84dc 28*84dc 29*84dc 30*84dc 31*84; Table of the length of each instruction.;DBGInsnLength:byte 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3 ; TSTbyte 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4 ; CMPbyte 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4 ; CMPIbyte 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3 ; BRbyte 5,4,5,1, 1,1,5,4, 5,5,5,5, 5,5,5,5byte 5,5,1,5, 5,5,1,1, 5,1,1,1, 1,1,1,1byte 1,1,1,1, 1,1,1,1, 1,1,1,5, 5,5,5,4byte 1,1,5,1, 1,1,1,4, 5,4,1,1, 1,1,1,1byte 5,5,5,5, 5,5,5,1, 1,1,1,5, 5,1,5,5byte 5,5,5,5, 1,1,5,6, 5,5,5,5, 1,4,5,4byte 3,5,6,3, 3,4,4,4, 4,4,6,4, 5,5,5,5byte 5,5,5,5, 5,5,5,1, 1,1,1,1, 1,1,1,1byte 5,5,5,5, 1,1,5,6, 3,5,3,5, 3,1,1,1byte 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1byte 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1byte 4,2,4,2, 2,5,4,2, 2,2,2,2, 2,1,1,2; Table of operand format indexes;; 0 = px,rx; 1 = px,rx,rx; 2 = px,rx,#imm; 3 = disp12; 4 = rx,rx,rx; 5 = rx,rx; 6 = px,px,px; 7 = none; 8 = px,rx,#imm (biti); 9 = rx,#imm (addui short); 10 = rx,rx,#imm; 11 = mlo; 12 = shift; 13 = rx,#imm (ldi); 14 = rx,rx,rx,rx (mux format); 15 = rx,mem (load/store); 16 = rx,rx,rx,[rx] (cas); 17 = rx,[rx] (stset); 18 = [rx],[rx],rx (stmov/stcmp); 19 = rx,#imm (cache); 20 = [cx] jsr; 21 = jsr; 22 = jsr; 23 = rts; 24 = loop; 25 = sys/int; 26 = rx,spr; 27 = spr,rx; 28 = bitfield; 29 = spr,spr; 30 = rx,[rx+rx*sc] (load/store); 31 = stix; 32 = inc; 33 = tlb; 34 = rts; 35 = bcd; 36 = stp; 37 = immDBGOperFmt:byte 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 ; TST px,rxbyte 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1 ; CMP px,rx,rxbyte 2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2 ; CMPI px,rx,#immbyte 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3 ; BRbyte 4,5,6,7, 7,7,8,9, 10,10,10,10, 10,10,10,10byte 4,11,7,10, 10,10,7,7, 12,7,7,7, 7,7,7,7byte 7,7,7,7, 7,7,7,7, 7,7,7,10, 10,10,10,13byte 7,7,14,7, 7,7,7,5, 4,6,7,7, 7,7,7,7byte 15,15,15,15, 15,15,15,7, 7,7,7,15, 15,7,15,15byte 15,15,15,15, 7,7,15,16, 17,18,18,17, 7,38,15,19byte 20,21,22,23, 24,25,25,5, 26,27,28,29, 15,15,15,15byte 30,30,30,30, 30,30,30,7, 7,7,7,7, 7,7,7,7byte 30,30,30,30, 7,7,31,32, 7,7,7,7, 7,7,7,7byte 7,7,7,7, 7,7,7,7, 7,7,7,7, 7,7,7,7byte 7,7,7,7, 7,7,7,7, 7,7,7,7, 7,7,7,7byte 33,7,34,7, 7,35,36,7, 7,7,7,7, 7,7,7,37align 2DBGOperFmtT:dc DBGDispTstregs,DBGDispCmpregs,DBGDispBrDisp,DBGDispCmpimm,DBGDispRxRxRx,DBGDispRxRx,DBGDispPxPxPx,DBGDispNonedc DBGDispPxRxImm,DBGDispRxImm,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispRxImm,DBGDispNone,DBGDispNonedc DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNonedc DBGDispNone,DBGDispNone,DBGDispNone,DBGDispSprRx,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNonedc DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNone,DBGDispNone; Table of instruction mnemonic string addresses; If the most signficant 12 bits are $FFF then a second table is referred to.;align 2DBGInsnMne:dc mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tst,mne_tstdc mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmp,mne_cmpdc mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpi,mne_cmpidc mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_br,mne_brdc $FFF0,$FFF1,$FFF2,mne_q,mne_q,mne_q,mne_biti,mne_addui,mne_addi,mne_subi,mne_muli,mne_divi,mne_addui,mne_subui,mne_mului,mne_divuidc $FFF3,mne_mlo,mne_q,mne_andi,mne_ori,mne_eori,mne_q,mne_q,$FFF4,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_2addui,mne_4addui,mne_8addui,mne_16addui,mne_ldidc mne_q,mne_q,mne_mux,mne_q,mne_q,mne_q,mne_q,$FFF5,$FFF6,$FFF7,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_lb,mne_lbu,mne_lc,mne_lcu,mne_lh,mne_lhu,mne_lw,mne_q,mne_q,mne_q,mne_q,mne_lvwar,mne_swcr,mne_q,mne_lws,mne_lcldc mne_sb,mne_sc,mne_sh,mne_sw,mne_q,mne_q,mne_sti,mne_cas,mne_stset,mne_stmov,mne_stcmp,mne_stfnd,mne_q,mne_ldis,mne_sws,mne_cachedc mne_jsr,mne_jsr,mne_jsr,mne_rts,mne_loop,mne_sys,mne_int,$FFF8,mne_mfspr,mne_mtspr,$FFF9,mne_movs,mne_lvb,mne_lvc,mne_lvh,mne_lvwdc mne_lb,mne_lbu,mne_lc,mne_lcu,mne_lh,mne_lhu,mne_lw,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_sbx,mne_scx,mne_sh,mne_sw,mne_q,mne_q,mne_sti,mne_inc,mne_push,mne_pea,mne_pop,mne_link,mne_unlink,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc $FFFA,mne_nop,mne_rts,mne_rte,mne_rti,$FFFB,mne_stp,mne_sync,mne_memsb,mne_memdb,mne_cli,mne_sei,mne_rtd,mne_q,mne_q,mne_immDBGInsnMne0:dc mne_add,mne_sub,mne_mul,mne_div,mne_addu,mne_subu,mne_mulu,mne_divu,mne_2addu,mne_4addu,mne_8addu,mne_16addu,mne_q,mne_q,mne_q,mne_qdc mne_min,mne_max,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qDBGInsnMne1:dc mne_cpuid,mne_redor,mne_redand,mne_par,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qDBGInsnMne2:dc mne_pand,mne_por,mne_peor,mne_pnand,mne_pnor,mne_penor,mne_pandc,mne_porc,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qDBGInsnMne3:dc mne_and,mne_or,mne_eor,mne_nand,mne_nor,mne_enor,mne_andc,mne_orc,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qDBGInsnMne4:dc mne_shl,mne_shr,mne_shlu,mne_shru,mne_rol,mne_ror,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_shli,mne_shri,mne_shlui,mne_shrui,mne_roli,mne_rori,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qDBGInsnMne5:dc mne_fmov,mne_q,mne_ftoi,mne_itof,mne_fneg,mne_fabs,mne_fsign,mne_fman,mne_fnabs,mne_q,mne_q,mne_q,mne_fstat,mne_frm,mne_q,mne_qDBGInsnMne6:dc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_fcmp,mne_fadd,mne_fsub,mne_fmul,mne_fdiv,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_fcmp,mne_fadd,mne_fsub,mne_fmul,mne_fdiv,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qdc mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qDBGInsnMne7:DBGInsnMne8:dc mne_mov,mne_neg,mne_not,mne_abs,mne_sign,mne_cntlz,mne_cntlo,mne_cntpop,mne_sxb,mne_sxc,mne_sxh,mne_com,mne_zxb,mne_zxc,mne_zxh,mne_qDBGInsnMne9:dc mne_bfins,mne_bfset,mne_bfclr,mne_bfchg,mne_bfextu,mne_bfext,mne_bfinsi,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qDBGInsnMneA:dc mne_q,mne_q,mne_tlbrdreg,mne_tlbwrreg,mne_tlbwi,mne_tlben,mne_tlbdis,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qDBGInsnMneB:dc mne_bcdadd,mne_bcdsub,mne_bcdmul,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_q,mne_qDBGInsnMneT:dc DBGInsnMne0,DBGInsnMne1,DBGInsnMne2,DBGInsnMne3,DBGInsnMne4,DBGInsnMne5,DBGInsnMne6,DBGInsnMne7,DBGInsnMne8,DBGInsnMne9,DBGInsnMneA,DBGInsnMneB; Table of predicate conditions;DBGPredCons:byte "f ","f ","eq ","ne ","le ","gt ","lt ","ge ","leu","gtu","ltu","geu"," "," "," "," "; Special purpose register names;DBGSpr:byte "p0 ","p1 ","p2 ","p3 ","p4 ","p5 ","p6 ","p7 ","p8 ","p9 ","p10","p11","p12","p13","p14","p15"byte "c0 ","c1 ","c2 ","c3 ","c4 ","c5 ","c6 ","c7 ","c8 ","c9 ","c10","c11","c12","c13","c14","c15"byte "zs ","ds ","es ","fs ","gs ","hs ","ss ","cs ","zsl","dsl","esl","fsl","gsl","hsl","ssl","csl"byte "pra"," ","tck","lc "," "," ","asd","sr "," "," "," "," "," "," "," "," "; Table of mnemonics;mne_16addu: byte "16add",'u'|$80mne_2addu: byte "2add",'u'|$80mne_4addu: byte "4add",'u'|$80mne_8addu: byte "8add",'u'|$80mne_16addui: byte "16addu",'i'|$80mne_2addui: byte "2addu",'i'|$80mne_4addui: byte "4addu",'i'|$80mne_8addui: byte "8addu",'i'|$80mne_abs: byte "ab",'s'|$80mne_add: byte "ad",'d'|$80mne_addi: byte "add",'i'|$80mne_addu: byte "add",'u'|$80mne_addui: byte "addu",'i'|$80mne_and: byte "an",'d'|$80mne_andc: byte "and",'c'|$80mne_andi: byte "and",'i'$80mne_bfchg: byte "bfch",'g'|$80mne_bfclr: byte "bfcl",'r'|$80mne_bfext: byte "bfex",'t'|$80mne_bfextu: byte "bfext",'u'|$80mne_bfins: byte "bfin",'s'|$80mne_bfinsi: byte "bfins",'i'|$80mne_bfset: byte "bfse",'t'|$80mne_biti: byte "bit",'i'|$80mne_br: byte "b",'r'|$80mne_brk: byte "br",'k'|$80mne_bsr: byte "bs",'r'|$80mne_cli: byte "cl",'i'|$80mne_cmp: byte "cm",'p'|$80mne_cmpi: byte "cmp",'i'|$80mne_div: byte "di",'v'|$80mne_divi: byte "div",'i'|$80mne_divu: byte "div",'u'|$80mne_divui: byte "divu",'i'|$80mne_eor: byte "eo",'r'|$80mne_eori: byte "eor",'i'|$80mne_imm: byte "im",'m'|$80mne_jsr byte "js",'r'|$80mne_lb: byte "l",'b'|$80mne_lbu: byte "lb",'u'|$80mne_lc: byte "l",'c'|$80mne_lcu: byte "lc",'u'|$80mne_ldi: byte "ld",'i'|$80mne_ldis: byte "ldi",'s'|$80mne_lh: byte "l",'h'|$80mne_lhu: byte "lh",'u'|$80mne_loop: byte "loo",'p'|$80mne_lvb: byte "lv",'b'|$80mne_lvc: byte "lv",'c'|$80mne_lvh: byte "lv",'h'|$80mne_lvw: byte "lv",'w'|$80mne_lvwar: byte "lvwa",'r'|$80mne_lw: byte "l",'w'|$80mne_lws: byte "lw",'s'|$80mne_mfspr: byte "mfsp",'r'|$80mne_mtspr: byte "mtsp",'r'|$80mne_mov: byte "mo",'v'|$80mne_movs: byte "mov",'s'|$80mne_mul: byte "mu",'l'|$80mne_muli: byte "mul",'i'|$80mne_mulu: byte "mul",'u'|$80mne_mului: byte "mulu",'i'|$80mne_nop: byte "no",'p'|$80mne_or: byte "o",'r'|$80mne_ori: byte "or",'i'|$80mne_q: byte "??",'?'|$80mne_rol: byte "ro",'l'|$80mne_roli: byte "rol",'i'|$80mne_ror: byte "ro",'r'|$80mne_rori: byte "ror",'i'|$80mne_rtd: byte "rt",'d'|$80mne_rte: byte "rt",'e'|$80mne_rti: byte "rt",'i'|$80mne_rts: byte "rt",'s'|$80mne_sb: byte "s",'b'|$80mne_sc: byte "s",'c'|$80mne_sei: byte "se",'i'|$80mne_sh: byte "s",'h'|$80mne_shl: byte "sh",'l'|$80mne_shli: byte "shl",'i'|$80mne_shr: byte "sh",'r'|$80mne_shri: byte "shr",'i'|$80mne_shru: byte "shr",'u'|$80mne_shrui: byte "shru",'i'|$80mne_stp: byte "st",'p'|$80mne_sub: byte "su",'b'|$80mne_subu: byte "sub",'u'|$80mne_sw: byte "s",'w'|$80mne_sync: byte "syn",'c'|$80mne_sys: byte "sy",'s'|$80mne_tlben: byte "tlbe",'n'|$80mne_tlbdis: byte "tlbdi",'s'|$80mne_tlbrdreg: byte "tlbrdre",'g'|$80mne_tlbwi: byte "tlbw",'i'|$80mne_tlbwrreg: byte "tlbwrre",'g'|$80mne_tst: byte "ts",'t'|$80msgDebugger:byte "Thor Debugger (C) 2015 Robert Finch",0
