Sigrid Haflínudóttirfirst dirty version of the portd7ad0686 years agoHistory
2940 lines · 52.9 KB · C
RawDownload
/*	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.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t