/* DISAM68K.c Copyright (C) 2010 Paul C. Pratt You can redistribute this file and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. You should have received a copy of the license along with this file; see the file COPYING. This 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 license for more details.*/ /* DISAssemble Motorola 68K instructions.*/ #ifndef AllFiles#include "SYSDEPNS.h" #include "ENDIANAC.h"#include "MYOSGLUE.h"#include "EMCONFIG.h"#include "GLOBGLUE.h" #include "M68KITAB.h"#endif #include "DISAM68K.h" LOCALVAR ui5r Disasm_pc; /* don't use get_vm_byte/get_vm_word/get_vm_long so as to be sure of no side effects (if pc points to memory mapped device)*/ LOCALVAR ui3p Disasm_pcp;LOCALVAR ui5r Disasm_pc_blockmask;LOCALVAR ui3b Disasm_pcp_dummy[2] = { 0, 0}; IMPORTFUNC ATTep FindATTel(CPTR addr); LOCALPROC Disasm_Find_pcp(void){ ATTep p; p = FindATTel(Disasm_pc); if (0 == (p->Access & kATTA_readreadymask)) { Disasm_pcp = Disasm_pcp_dummy; Disasm_pc_blockmask = 0; } else { Disasm_pc_blockmask = p->usemask & ~ p->cmpmask; Disasm_pc_blockmask = Disasm_pc_blockmask & ~ (Disasm_pc_blockmask + 1); Disasm_pcp = p->usebase + (Disasm_pc & p->usemask); }} LOCALFUNC ui4r Disasm_nextiword(void)/* NOT sign extended */{ ui4r r = do_get_mem_word(Disasm_pcp); Disasm_pcp += 2; Disasm_pc += 2; if (0 == (Disasm_pc_blockmask & Disasm_pc)) { Disasm_Find_pcp(); } return r;} LOCALINLINEFUNC ui3r Disasm_nextibyte(void){ return (ui3b) Disasm_nextiword();} LOCALFUNC ui5r Disasm_nextilong(void){ ui5r hi = Disasm_nextiword(); ui5r lo = Disasm_nextiword(); ui5r r = ((hi << 16) & 0xFFFF0000) | (lo & 0x0000FFFF); return r;} LOCALPROC Disasm_setpc(CPTR newpc){ if (newpc != Disasm_pc) { Disasm_pc = newpc; Disasm_Find_pcp(); }} LOCALVAR ui5b Disasm_opcode; LOCALVAR ui5b Disasm_opsize; #define Disasm_b76 ((Disasm_opcode >> 6) & 3)#define Disasm_b8 ((Disasm_opcode >> 8) & 1)#define Disasm_mode ((Disasm_opcode >> 3) & 7)#define Disasm_reg (Disasm_opcode & 7)#define Disasm_md6 ((Disasm_opcode >> 6) & 7)#define Disasm_rg9 ((Disasm_opcode >> 9) & 7) LOCALPROC DisasmOpSizeFromb76(void){ Disasm_opsize = 1 << Disasm_b76; switch (Disasm_opsize) { case 1 : dbglog_writeCStr(".B"); break; case 2 : dbglog_writeCStr(".W"); break; case 4 : dbglog_writeCStr(".L"); break; }} LOCALPROC DisasmModeRegister(ui5b themode, ui5b thereg){ switch (themode) { case 0 : dbglog_writeCStr("D"); dbglog_writeHex(thereg); break; case 1 : dbglog_writeCStr("A"); dbglog_writeHex(thereg); break; case 2 : dbglog_writeCStr("(A"); dbglog_writeHex(thereg); dbglog_writeCStr(")"); break; case 3 : dbglog_writeCStr("(A"); dbglog_writeHex(thereg); dbglog_writeCStr(")+"); break; case 4 : dbglog_writeCStr("-(A"); dbglog_writeHex(thereg); dbglog_writeCStr(")"); break; case 5 : dbglog_writeHex(Disasm_nextiword()); dbglog_writeCStr("(A"); dbglog_writeHex(thereg); dbglog_writeCStr(")"); break; case 6 : dbglog_writeCStr("???");#if 0 ArgKind = AKMemory; ArgAddr.mem = get_disp_ea(m68k_areg(thereg));#endif break; case 7 : switch (thereg) { case 0 : dbglog_writeCStr("("); dbglog_writeHex(Disasm_nextiword()); dbglog_writeCStr(")"); break; case 1 : dbglog_writeCStr("("); dbglog_writeHex(Disasm_nextilong()); dbglog_writeCStr(")"); break; case 2 : { ui5r s = Disasm_pc; s += ui5r_FromSWord(Disasm_nextiword()); dbglog_writeCStr("("); dbglog_writeHex(s); dbglog_writeCStr(")"); } break; case 3 : dbglog_writeCStr("???");#if 0 ArgKind = AKMemory; s = get_disp_ea(Disasm_pc);#endif break; case 4 : dbglog_writeCStr("#"); if (Disasm_opsize == 2) { dbglog_writeHex(Disasm_nextiword()); } else if (Disasm_opsize < 2) { dbglog_writeHex(Disasm_nextibyte()); } else { dbglog_writeHex(Disasm_nextilong()); } break; } break; case 8 : dbglog_writeCStr("#"); dbglog_writeHex(thereg); break; }} LOCALPROC DisasmStartOne(char *s){ dbglog_writeCStr(s);} LOCALPROC Disasm_xxxxxxxxssmmmrrr(char *s){ DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeReturn();} LOCALPROC DisasmEaD_xxxxdddxssmmmrrr(char *s){ DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeCStr(", "); dbglog_writeCStr("D"); dbglog_writeHex(Disasm_rg9); dbglog_writeReturn();} LOCALPROC DisasmI_xxxxxxxxssmmmrrr(char *s){ DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" #"); if (Disasm_opsize == 2) { dbglog_writeHex(ui5r_FromSWord(Disasm_nextiword())); } else if (Disasm_opsize < 2) { dbglog_writeHex(ui5r_FromSByte(Disasm_nextibyte())); } else { dbglog_writeHex(ui5r_FromSLong(Disasm_nextilong())); } dbglog_writeCStr(", "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeReturn();} LOCALPROC DisasmsAA_xxxxdddxssxxxrrr(char *s){ DisasmStartOne(s); DisasmOpSizeFromb76(); DisasmModeRegister(3, Disasm_reg); dbglog_writeCStr(", "); DisasmModeRegister(3, Disasm_rg9); dbglog_writeReturn();} LOCALFUNC ui5r Disasm_octdat(ui5r x){ if (x == 0) { return 8; } else { return x; }} LOCALPROC Disasm_xxxxnnnxssmmmrrr(char *s){ DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" #"); dbglog_writeHex(Disasm_octdat(Disasm_rg9)); dbglog_writeCStr(", "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeReturn();} LOCALPROC DisasmDEa_xxxxdddxssmmmrrr(char *s){ DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" D"); dbglog_writeHex(Disasm_rg9); dbglog_writeCStr(", "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeReturn();} LOCALPROC DisasmEaA_xxxxdddsxxmmmrrr(char *s){ DisasmStartOne(s); Disasm_opsize = Disasm_b8 * 2 + 2; if (Disasm_opsize == 2) { dbglog_writeCStr(".W"); } else { dbglog_writeCStr(".L"); } dbglog_writeCStr(" "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeCStr(", A"); dbglog_writeHex(Disasm_rg9); dbglog_writeReturn();} LOCALPROC DisasmDD_xxxxdddxssxxxrrr(char *s){ DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" "); DisasmModeRegister(0, Disasm_reg); dbglog_writeCStr(", "); DisasmModeRegister(0, Disasm_rg9); dbglog_writeReturn();} LOCALPROC DisasmAAs_xxxxdddxssxxxrrr(char *s){ DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" "); DisasmModeRegister(4, Disasm_reg); dbglog_writeCStr(", "); DisasmModeRegister(4, Disasm_rg9); dbglog_writeReturn();} LOCALPROCUSEDONCE DisasmTst(void){ /* Tst 01001010ssmmmrrr */ Disasm_xxxxxxxxssmmmrrr("TST");} LOCALPROCUSEDONCE DisasmCompare(void){ /* Cmp 1011ddd0ssmmmrrr */ DisasmEaD_xxxxdddxssmmmrrr("CMP");} LOCALPROCUSEDONCE DisasmCmpI(void){ /* CMPI 00001100ssmmmrrr */ DisasmI_xxxxxxxxssmmmrrr("CMP");} LOCALPROCUSEDONCE DisasmCmpM(void){ /* CmpM 1011ddd1ss001rrr */ DisasmsAA_xxxxdddxssxxxrrr("CMP");} LOCALPROC DisasmCC(void){ switch ((Disasm_opcode >> 8) & 15) { case 0: dbglog_writeCStr("T"); break; case 1: dbglog_writeCStr("F"); break; case 2: dbglog_writeCStr("HI"); break; case 3: dbglog_writeCStr("LS"); break; case 4: dbglog_writeCStr("CC"); break; case 5: dbglog_writeCStr("CS"); break; case 6: dbglog_writeCStr("NE"); break; case 7: dbglog_writeCStr("EQ"); break; case 8: dbglog_writeCStr("VC"); break; case 9: dbglog_writeCStr("VS"); break; case 10: dbglog_writeCStr("P"); break; case 11: dbglog_writeCStr("MI"); break; case 12: dbglog_writeCStr("GE"); break; case 13: dbglog_writeCStr("LT"); break; case 14: dbglog_writeCStr("GT"); break; case 15: dbglog_writeCStr("LE"); break; default: break; /* shouldn't get here */ }} LOCALPROCUSEDONCE DisasmBcc(void){ /* Bcc 0110ccccnnnnnnnn */ ui5b src = ((ui5b)Disasm_opcode) & 255; ui5r s = Disasm_pc; if (0 == ((Disasm_opcode >> 8) & 15)) { DisasmStartOne("BRA"); } else { DisasmStartOne("B"); DisasmCC(); } dbglog_writeCStr(" "); if (src == 0) { s += ui5r_FromSWord(Disasm_nextiword()); } else#if Use68020 if (src == 255) { s += ui5r_FromSLong(Disasm_nextilong()); /* ReportAbnormal("long branch in DoCode6"); */ /* Used by various Apps */ } else#endif { s += ui5r_FromSByte(src); } dbglog_writeHex(s); dbglog_writeReturn();} LOCALPROCUSEDONCE DisasmDBcc(void){ /* DBcc 0101cccc11001ddd */ ui5r s = Disasm_pc; DisasmStartOne("DB"); DisasmCC(); dbglog_writeCStr(" D"); dbglog_writeHex(Disasm_reg); dbglog_writeCStr(", "); s += (si5b)(si4b)Disasm_nextiword(); dbglog_writeHex(s); dbglog_writeReturn();} LOCALPROCUSEDONCE DisasmSwap(void){ /* Swap 0100100001000rrr */ DisasmStartOne("SWAP D"); dbglog_writeHex(Disasm_reg); dbglog_writeReturn();} LOCALPROC DisasmMove(void) /* MOVE */{ DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeCStr(", "); DisasmModeRegister(Disasm_md6, Disasm_rg9); dbglog_writeReturn();} LOCALPROCUSEDONCE DisasmMoveL(void){ DisasmStartOne("MOVE.L "); Disasm_opsize = 4; DisasmMove();} LOCALPROCUSEDONCE DisasmMoveW(void){ DisasmStartOne("MOVE.W "); Disasm_opsize = 2; DisasmMove();} LOCALPROCUSEDONCE DisasmMoveB(void){ DisasmStartOne("MOVE.B "); Disasm_opsize = 1; DisasmMove();} LOCALPROCUSEDONCE DisasmMoveAL(void){ DisasmStartOne("MOVEA.L "); Disasm_opsize = 4; DisasmMove();} LOCALPROCUSEDONCE DisasmMoveAW(void){ DisasmStartOne("MOVEA.W "); Disasm_opsize = 2; DisasmMove();} LOCALPROCUSEDONCE DisasmMoveQ(void){ /* MoveQ 0111ddd0nnnnnnnn */ DisasmStartOne("MOVEQ #"); dbglog_writeHex(ui5r_FromSByte(Disasm_opcode)); dbglog_writeCStr(", D"); dbglog_writeHex(Disasm_rg9); dbglog_writeReturn();} LOCALPROCUSEDONCE DisasmAddEaR(void){ DisasmEaD_xxxxdddxssmmmrrr("ADD");}Lines 1–500 of 2940. Load more
/* DISAM68K.c Copyright (C) 2010 Paul C. Pratt You can redistribute this file and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. You should have received a copy of the license along with this file; see the file COPYING. This 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 license for more details. */ /* DISAssemble Motorola 68K instructions. */ #ifndef AllFiles #include "SYSDEPNS.h" #include "ENDIANAC.h" #include "MYOSGLUE.h" #include "EMCONFIG.h" #include "GLOBGLUE.h" #include "M68KITAB.h" #endif #include "DISAM68K.h" LOCALVAR ui5r Disasm_pc; /* don't use get_vm_byte/get_vm_word/get_vm_long so as to be sure of no side effects (if pc points to memory mapped device) */ LOCALVAR ui3p Disasm_pcp; LOCALVAR ui5r Disasm_pc_blockmask; LOCALVAR ui3b Disasm_pcp_dummy[2] = { 0, 0 }; IMPORTFUNC ATTep FindATTel(CPTR addr); LOCALPROC Disasm_Find_pcp(void) { ATTep p; p = FindATTel(Disasm_pc); if (0 == (p->Access & kATTA_readreadymask)) { Disasm_pcp = Disasm_pcp_dummy; Disasm_pc_blockmask = 0; } else { Disasm_pc_blockmask = p->usemask & ~ p->cmpmask; Disasm_pc_blockmask = Disasm_pc_blockmask & ~ (Disasm_pc_blockmask + 1); Disasm_pcp = p->usebase + (Disasm_pc & p->usemask); } } LOCALFUNC ui4r Disasm_nextiword(void) /* NOT sign extended */ { ui4r r = do_get_mem_word(Disasm_pcp); Disasm_pcp += 2; Disasm_pc += 2; if (0 == (Disasm_pc_blockmask & Disasm_pc)) { Disasm_Find_pcp(); } return r; } LOCALINLINEFUNC ui3r Disasm_nextibyte(void) { return (ui3b) Disasm_nextiword(); } LOCALFUNC ui5r Disasm_nextilong(void) { ui5r hi = Disasm_nextiword(); ui5r lo = Disasm_nextiword(); ui5r r = ((hi << 16) & 0xFFFF0000) | (lo & 0x0000FFFF); return r; } LOCALPROC Disasm_setpc(CPTR newpc) { if (newpc != Disasm_pc) { Disasm_pc = newpc; Disasm_Find_pcp(); } } LOCALVAR ui5b Disasm_opcode; LOCALVAR ui5b Disasm_opsize; #define Disasm_b76 ((Disasm_opcode >> 6) & 3) #define Disasm_b8 ((Disasm_opcode >> 8) & 1) #define Disasm_mode ((Disasm_opcode >> 3) & 7) #define Disasm_reg (Disasm_opcode & 7) #define Disasm_md6 ((Disasm_opcode >> 6) & 7) #define Disasm_rg9 ((Disasm_opcode >> 9) & 7) LOCALPROC DisasmOpSizeFromb76(void) { Disasm_opsize = 1 << Disasm_b76; switch (Disasm_opsize) { case 1 : dbglog_writeCStr(".B"); break; case 2 : dbglog_writeCStr(".W"); break; case 4 : dbglog_writeCStr(".L"); break; } } LOCALPROC DisasmModeRegister(ui5b themode, ui5b thereg) { switch (themode) { case 0 : dbglog_writeCStr("D"); dbglog_writeHex(thereg); break; case 1 : dbglog_writeCStr("A"); dbglog_writeHex(thereg); break; case 2 : dbglog_writeCStr("(A"); dbglog_writeHex(thereg); dbglog_writeCStr(")"); break; case 3 : dbglog_writeCStr("(A"); dbglog_writeHex(thereg); dbglog_writeCStr(")+"); break; case 4 : dbglog_writeCStr("-(A"); dbglog_writeHex(thereg); dbglog_writeCStr(")"); break; case 5 : dbglog_writeHex(Disasm_nextiword()); dbglog_writeCStr("(A"); dbglog_writeHex(thereg); dbglog_writeCStr(")"); break; case 6 : dbglog_writeCStr("???"); #if 0 ArgKind = AKMemory; ArgAddr.mem = get_disp_ea(m68k_areg(thereg)); #endif break; case 7 : switch (thereg) { case 0 : dbglog_writeCStr("("); dbglog_writeHex(Disasm_nextiword()); dbglog_writeCStr(")"); break; case 1 : dbglog_writeCStr("("); dbglog_writeHex(Disasm_nextilong()); dbglog_writeCStr(")"); break; case 2 : { ui5r s = Disasm_pc; s += ui5r_FromSWord(Disasm_nextiword()); dbglog_writeCStr("("); dbglog_writeHex(s); dbglog_writeCStr(")"); } break; case 3 : dbglog_writeCStr("???"); #if 0 ArgKind = AKMemory; s = get_disp_ea(Disasm_pc); #endif break; case 4 : dbglog_writeCStr("#"); if (Disasm_opsize == 2) { dbglog_writeHex(Disasm_nextiword()); } else if (Disasm_opsize < 2) { dbglog_writeHex(Disasm_nextibyte()); } else { dbglog_writeHex(Disasm_nextilong()); } break; } break; case 8 : dbglog_writeCStr("#"); dbglog_writeHex(thereg); break; } } LOCALPROC DisasmStartOne(char *s) { dbglog_writeCStr(s); } LOCALPROC Disasm_xxxxxxxxssmmmrrr(char *s) { DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeReturn(); } LOCALPROC DisasmEaD_xxxxdddxssmmmrrr(char *s) { DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeCStr(", "); dbglog_writeCStr("D"); dbglog_writeHex(Disasm_rg9); dbglog_writeReturn(); } LOCALPROC DisasmI_xxxxxxxxssmmmrrr(char *s) { DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" #"); if (Disasm_opsize == 2) { dbglog_writeHex(ui5r_FromSWord(Disasm_nextiword())); } else if (Disasm_opsize < 2) { dbglog_writeHex(ui5r_FromSByte(Disasm_nextibyte())); } else { dbglog_writeHex(ui5r_FromSLong(Disasm_nextilong())); } dbglog_writeCStr(", "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeReturn(); } LOCALPROC DisasmsAA_xxxxdddxssxxxrrr(char *s) { DisasmStartOne(s); DisasmOpSizeFromb76(); DisasmModeRegister(3, Disasm_reg); dbglog_writeCStr(", "); DisasmModeRegister(3, Disasm_rg9); dbglog_writeReturn(); } LOCALFUNC ui5r Disasm_octdat(ui5r x) { if (x == 0) { return 8; } else { return x; } } LOCALPROC Disasm_xxxxnnnxssmmmrrr(char *s) { DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" #"); dbglog_writeHex(Disasm_octdat(Disasm_rg9)); dbglog_writeCStr(", "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeReturn(); } LOCALPROC DisasmDEa_xxxxdddxssmmmrrr(char *s) { DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" D"); dbglog_writeHex(Disasm_rg9); dbglog_writeCStr(", "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeReturn(); } LOCALPROC DisasmEaA_xxxxdddsxxmmmrrr(char *s) { DisasmStartOne(s); Disasm_opsize = Disasm_b8 * 2 + 2; if (Disasm_opsize == 2) { dbglog_writeCStr(".W"); } else { dbglog_writeCStr(".L"); } dbglog_writeCStr(" "); DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeCStr(", A"); dbglog_writeHex(Disasm_rg9); dbglog_writeReturn(); } LOCALPROC DisasmDD_xxxxdddxssxxxrrr(char *s) { DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" "); DisasmModeRegister(0, Disasm_reg); dbglog_writeCStr(", "); DisasmModeRegister(0, Disasm_rg9); dbglog_writeReturn(); } LOCALPROC DisasmAAs_xxxxdddxssxxxrrr(char *s) { DisasmStartOne(s); DisasmOpSizeFromb76(); dbglog_writeCStr(" "); DisasmModeRegister(4, Disasm_reg); dbglog_writeCStr(", "); DisasmModeRegister(4, Disasm_rg9); dbglog_writeReturn(); } LOCALPROCUSEDONCE DisasmTst(void) { /* Tst 01001010ssmmmrrr */ Disasm_xxxxxxxxssmmmrrr("TST"); } LOCALPROCUSEDONCE DisasmCompare(void) { /* Cmp 1011ddd0ssmmmrrr */ DisasmEaD_xxxxdddxssmmmrrr("CMP"); } LOCALPROCUSEDONCE DisasmCmpI(void) { /* CMPI 00001100ssmmmrrr */ DisasmI_xxxxxxxxssmmmrrr("CMP"); } LOCALPROCUSEDONCE DisasmCmpM(void) { /* CmpM 1011ddd1ss001rrr */ DisasmsAA_xxxxdddxssxxxrrr("CMP"); } LOCALPROC DisasmCC(void) { switch ((Disasm_opcode >> 8) & 15) { case 0: dbglog_writeCStr("T"); break; case 1: dbglog_writeCStr("F"); break; case 2: dbglog_writeCStr("HI"); break; case 3: dbglog_writeCStr("LS"); break; case 4: dbglog_writeCStr("CC"); break; case 5: dbglog_writeCStr("CS"); break; case 6: dbglog_writeCStr("NE"); break; case 7: dbglog_writeCStr("EQ"); break; case 8: dbglog_writeCStr("VC"); break; case 9: dbglog_writeCStr("VS"); break; case 10: dbglog_writeCStr("P"); break; case 11: dbglog_writeCStr("MI"); break; case 12: dbglog_writeCStr("GE"); break; case 13: dbglog_writeCStr("LT"); break; case 14: dbglog_writeCStr("GT"); break; case 15: dbglog_writeCStr("LE"); break; default: break; /* shouldn't get here */ } } LOCALPROCUSEDONCE DisasmBcc(void) { /* Bcc 0110ccccnnnnnnnn */ ui5b src = ((ui5b)Disasm_opcode) & 255; ui5r s = Disasm_pc; if (0 == ((Disasm_opcode >> 8) & 15)) { DisasmStartOne("BRA"); } else { DisasmStartOne("B"); DisasmCC(); } dbglog_writeCStr(" "); if (src == 0) { s += ui5r_FromSWord(Disasm_nextiword()); } else #if Use68020 if (src == 255) { s += ui5r_FromSLong(Disasm_nextilong()); /* ReportAbnormal("long branch in DoCode6"); */ /* Used by various Apps */ } else #endif { s += ui5r_FromSByte(src); } dbglog_writeHex(s); dbglog_writeReturn(); } LOCALPROCUSEDONCE DisasmDBcc(void) { /* DBcc 0101cccc11001ddd */ ui5r s = Disasm_pc; DisasmStartOne("DB"); DisasmCC(); dbglog_writeCStr(" D"); dbglog_writeHex(Disasm_reg); dbglog_writeCStr(", "); s += (si5b)(si4b)Disasm_nextiword(); dbglog_writeHex(s); dbglog_writeReturn(); } LOCALPROCUSEDONCE DisasmSwap(void) { /* Swap 0100100001000rrr */ DisasmStartOne("SWAP D"); dbglog_writeHex(Disasm_reg); dbglog_writeReturn(); } LOCALPROC DisasmMove(void) /* MOVE */ { DisasmModeRegister(Disasm_mode, Disasm_reg); dbglog_writeCStr(", "); DisasmModeRegister(Disasm_md6, Disasm_rg9); dbglog_writeReturn(); } LOCALPROCUSEDONCE DisasmMoveL(void) { DisasmStartOne("MOVE.L "); Disasm_opsize = 4; DisasmMove(); } LOCALPROCUSEDONCE DisasmMoveW(void) { DisasmStartOne("MOVE.W "); Disasm_opsize = 2; DisasmMove(); } LOCALPROCUSEDONCE DisasmMoveB(void) { DisasmStartOne("MOVE.B "); Disasm_opsize = 1; DisasmMove(); } LOCALPROCUSEDONCE DisasmMoveAL(void) { DisasmStartOne("MOVEA.L "); Disasm_opsize = 4; DisasmMove(); } LOCALPROCUSEDONCE DisasmMoveAW(void) { DisasmStartOne("MOVEA.W "); Disasm_opsize = 2; DisasmMove(); } LOCALPROCUSEDONCE DisasmMoveQ(void) { /* MoveQ 0111ddd0nnnnnnnn */ DisasmStartOne("MOVEQ #"); dbglog_writeHex(ui5r_FromSByte(Disasm_opcode)); dbglog_writeCStr(", D"); dbglog_writeHex(Disasm_rg9); dbglog_writeReturn(); } LOCALPROCUSEDONCE DisasmAddEaR(void) { DisasmEaD_xxxxdddxssmmmrrr("ADD"); }