Sigrid Haflínudóttirfirst dirty version of the portd7ad0686 years agoHistory
3072 lines · 69.4 KB · C
RawDownload
/*	M68KITAB.c 	Copyright (C) 2007 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.*/ /*	Motorola 68K Instructions TABle*/ #ifndef AllFiles#include "SYSDEPNS.h"#endif #include "MYOSGLUE.h"#include "EMCONFIG.h"#include "GLOBGLUE.h" #include "M68KITAB.h" struct WorkR {	/* expected size : 8 bytes */	ui5b opcode;	ui5b opsize;	ui4r MainClass;#if WantCycByPriOp	ui4r Cycles;#endif	DecOpR DecOp;};typedef struct WorkR WorkR; #define b76(p) ((p->opcode >> 6) & 3)#define b8(p) ((p->opcode >> 8) & 1)#define mode(p) ((p->opcode >> 3) & 7)#define reg(p) (p->opcode & 7)#define md6(p) ((p->opcode >> 6) & 7)#define rg9(p) ((p->opcode >> 9) & 7) enum {	kAddrValidAny,	kAddrValidData,	kAddrValidDataAlt,	kAddrValidControl,	kAddrValidControlAlt,	kAddrValidAltMem,	kAddrValidDataNoCn, /* no constants (immediate data) */ 	kNumAddrValids}; #define kAddrValidMaskAny        (1 << kAddrValidAny)#define kAddrValidMaskData       (1 << kAddrValidData)#define kAddrValidMaskDataAlt    (1 << kAddrValidDataAlt)#define kAddrValidMaskControl    (1 << kAddrValidControl)#define kAddrValidMaskControlAlt (1 << kAddrValidControlAlt)#define kAddrValidMaskAltMem     (1 << kAddrValidAltMem)#define kAddrValidMaskDataNoCn   (1 << kAddrValidDataNoCn) #define CheckInSet(v, m) (0 != ((1 << (v)) & (m))) #define kMyAvgCycPerInstr (10 * kCycleScale + (40 * kCycleScale / 64)) LOCALFUNC ui3r GetAMdRegSz(WorkR *p){	ui3r CurAMd; 	switch (p->opsize) {		case 1:			CurAMd = kAMdRegB;			break;		case 2:		default: /* keep compiler happy */			CurAMd = kAMdRegW;			break;		case 4:			CurAMd = kAMdRegL;			break;	} 	return CurAMd;} LOCALFUNC ui3r GetAMdIndirectSz(WorkR *p){	ui3r CurAMd; 	switch (p->opsize) {		case 1:			CurAMd = kAMdIndirectB;			break;		case 2:		default: /* keep compiler happy */			CurAMd = kAMdIndirectW;			break;		case 4:			CurAMd = kAMdIndirectL;			break;	} 	return CurAMd;} #if WantCycByPriOpLOCALFUNC ui4r OpEACalcCyc(WorkR *p, ui3r m, ui3r r){	ui4r v; 	switch (m) {		case 0:		case 1:			v = 0;			break;		case 2:			v = ((4 == p->opsize)				? (8 * kCycleScale + 2 * RdAvgXtraCyc)				: (4 * kCycleScale + RdAvgXtraCyc));			break;		case 3:			v = ((4 == p->opsize)				? (8 * kCycleScale + 2 * RdAvgXtraCyc)				: (4 * kCycleScale + RdAvgXtraCyc));			break;		case 4:			v = ((4 == p->opsize)				? (10 * kCycleScale + 2 * RdAvgXtraCyc)				: (6 * kCycleScale + RdAvgXtraCyc));			break;		case 5:			v = ((4 == p->opsize)				? (12 * kCycleScale + 3 * RdAvgXtraCyc)				: (8 * kCycleScale + 2 * RdAvgXtraCyc));			break;		case 6:			v = ((4 == p->opsize)				? (14 * kCycleScale + 3 * RdAvgXtraCyc)				: (10 * kCycleScale + 2 * RdAvgXtraCyc));			break;		case 7:			switch (r) {				case 0:					v = ((4 == p->opsize)						? (12 * kCycleScale + 3 * RdAvgXtraCyc)						: (8 * kCycleScale + 2 * RdAvgXtraCyc));					break;				case 1:					v = ((4 == p->opsize)						? (16 * kCycleScale + 4 * RdAvgXtraCyc)						: (12 * kCycleScale + 3 * RdAvgXtraCyc));					break;				case 2:					v = ((4 == p->opsize)						? (12 * kCycleScale + 3 * RdAvgXtraCyc)						: (8 * kCycleScale + 2 * RdAvgXtraCyc));					break;				case 3:					v = ((4 == p->opsize)						? (14 * kCycleScale + 3 * RdAvgXtraCyc)						: (10 * kCycleScale + 2 * RdAvgXtraCyc));					break;				case 4:					v = ((4 == p->opsize)						? (8 * kCycleScale + 2 * RdAvgXtraCyc)						: (4 * kCycleScale + RdAvgXtraCyc));					break;				default:					v = 0;					break;			}			break;		default: /* keep compiler happy */			v = 0;			break;	} 	return v;}#endif #if WantCycByPriOpLOCALFUNC ui4r OpEADestCalcCyc(WorkR *p, ui3r m, ui3r r){	ui4r v; 	switch (m) {		case 0:		case 1:			v = 0;			break;		case 2:			v = ((4 == p->opsize)				? (8 * kCycleScale + 2 * WrAvgXtraCyc)				: (4 * kCycleScale + WrAvgXtraCyc));			break;		case 3:			v = ((4 == p->opsize)				? (8 * kCycleScale + 2 * WrAvgXtraCyc)				: (4 * kCycleScale + WrAvgXtraCyc));			break;		case 4:			v = ((4 == p->opsize)				? (8 * kCycleScale + 2 * WrAvgXtraCyc)				: (4 * kCycleScale + WrAvgXtraCyc));			break;		case 5:			v = ((4 == p->opsize)				? (12 * kCycleScale + RdAvgXtraCyc + 2 * WrAvgXtraCyc)				: (8 * kCycleScale + RdAvgXtraCyc + WrAvgXtraCyc));			break;		case 6:			v = ((4 == p->opsize)				? (14 * kCycleScale + RdAvgXtraCyc + 2 * WrAvgXtraCyc)				: (10 * kCycleScale + RdAvgXtraCyc + WrAvgXtraCyc));			break;		case 7:			switch (r) {				case 0:					v = ((4 == p->opsize)						? (12 * kCycleScale							+ RdAvgXtraCyc + 2 * WrAvgXtraCyc)						: (8 * kCycleScale							+ RdAvgXtraCyc + WrAvgXtraCyc));					break;				case 1:					v = ((4 == p->opsize)						? (16 * kCycleScale							+ 2 * RdAvgXtraCyc + 2 * WrAvgXtraCyc)						: (12 * kCycleScale							+ 2 * RdAvgXtraCyc + WrAvgXtraCyc));					break;				default:					v = 0;					break;			}			break;		default: /* keep compiler happy */			v = 0;			break;	} 	return v;}#endif LOCALPROC SetDcoArgFields(WorkR *p, blnr src,	ui3r CurAMd, ui3r CurArgDat){	if (src) {		p->DecOp.y.v[0].AMd = CurAMd;		p->DecOp.y.v[0].ArgDat = CurArgDat;	} else {		p->DecOp.y.v[1].AMd = CurAMd;		p->DecOp.y.v[1].ArgDat = CurArgDat;	}} LOCALFUNC blnr CheckValidAddrMode(WorkR *p,	ui3r m, ui3r r, ui3r v, blnr src){	ui3r CurAMd = 0; /* init to keep compiler happy */	ui3r CurArgDat = 0;	blnr IsOk; 	switch (m) {		case 0:			CurAMd = GetAMdRegSz(p);			CurArgDat = r;			IsOk = CheckInSet(v,				kAddrValidMaskAny | kAddrValidMaskData					| kAddrValidMaskDataAlt | kAddrValidMaskDataNoCn);			break;		case 1:			CurAMd = GetAMdRegSz(p);			CurArgDat = r + 8;			IsOk = CheckInSet(v, kAddrValidMaskAny);			break;		case 2:			CurAMd = GetAMdIndirectSz(p);			CurArgDat = r + 8;			IsOk = CheckInSet(v,				kAddrValidMaskAny | kAddrValidMaskData					| kAddrValidMaskDataAlt | kAddrValidMaskControl					| kAddrValidMaskControlAlt | kAddrValidMaskAltMem					| kAddrValidMaskDataNoCn);			break;		case 3:			switch (p->opsize) {				case 1:					if (7 == r) {						CurAMd = kAMdAPosInc7B;					} else {						CurAMd = kAMdAPosIncB;					}					break;				case 2:				default: /* keep compiler happy */					CurAMd = kAMdAPosIncW;					break;				case 4:					CurAMd = kAMdAPosIncL;					break;			}			CurArgDat = r + 8;			IsOk = CheckInSet(v,				kAddrValidMaskAny | kAddrValidMaskData					| kAddrValidMaskDataAlt | kAddrValidMaskAltMem					| kAddrValidMaskDataNoCn);			break;		case 4:			switch (p->opsize) {				case 1:					if (7 == r) {						CurAMd = kAMdAPreDec7B;					} else {						CurAMd = kAMdAPreDecB;					}					break;				case 2:				default: /* keep compiler happy */					CurAMd = kAMdAPreDecW;					break;				case 4:					CurAMd = kAMdAPreDecL;					break;			}			CurArgDat = r + 8;			IsOk = CheckInSet(v,				kAddrValidMaskAny | kAddrValidMaskData					| kAddrValidMaskDataAlt | kAddrValidMaskAltMem					| kAddrValidMaskDataNoCn);			break;		case 5:			switch (p->opsize) {				case 1:					CurAMd = kAMdADispB;					break;				case 2:				default: /* keep compiler happy */					CurAMd = kAMdADispW;					break;				case 4:					CurAMd = kAMdADispL;					break;			}			CurArgDat = r + 8;			IsOk = CheckInSet(v,				kAddrValidMaskAny | kAddrValidMaskData					| kAddrValidMaskDataAlt | kAddrValidMaskControl					| kAddrValidMaskControlAlt | kAddrValidMaskAltMem					| kAddrValidMaskDataNoCn);			break;		case 6:			switch (p->opsize) {				case 1:					CurAMd = kAMdAIndexB;					break;				case 2:				default: /* keep compiler happy */					CurAMd = kAMdAIndexW;					break;				case 4:					CurAMd = kAMdAIndexL;					break;			}			CurArgDat = r + 8;			IsOk = CheckInSet(v,				kAddrValidMaskAny | kAddrValidMaskData					| kAddrValidMaskDataAlt | kAddrValidMaskControl					| kAddrValidMaskControlAlt | kAddrValidMaskAltMem					| kAddrValidMaskDataNoCn);			break;		case 7:			switch (r) {				case 0:					switch (p->opsize) {						case 1:							CurAMd = kAMdAbsWB;							break;						case 2:						default: /* keep compiler happy */							CurAMd = kAMdAbsWW;							break;						case 4:							CurAMd = kAMdAbsWL;							break;					}					IsOk = CheckInSet(v,						kAddrValidMaskAny | kAddrValidMaskData							| kAddrValidMaskDataAlt							| kAddrValidMaskControl							| kAddrValidMaskControlAlt							| kAddrValidMaskAltMem							| kAddrValidMaskDataNoCn);					break;				case 1:					switch (p->opsize) {						case 1:							CurAMd = kAMdAbsLB;							break;						case 2:						default: /* keep compiler happy */							CurAMd = kAMdAbsLW;							break;						case 4:							CurAMd = kAMdAbsLL;							break;					}					IsOk = CheckInSet(v,						kAddrValidMaskAny | kAddrValidMaskData							| kAddrValidMaskDataAlt							| kAddrValidMaskControl							| kAddrValidMaskControlAlt							| kAddrValidMaskAltMem							| kAddrValidMaskDataNoCn);					break;				case 2:					switch (p->opsize) {						case 1:							CurAMd = kAMdPCDispB;							break;						case 2:						default: /* keep compiler happy */							CurAMd = kAMdPCDispW;							break;						case 4:							CurAMd = kAMdPCDispL;							break;					}					IsOk = CheckInSet(v,						kAddrValidMaskAny | kAddrValidMaskData							| kAddrValidMaskControl							| kAddrValidMaskDataNoCn);					break;				case 3:					switch (p->opsize) {						case 1:							CurAMd = kAMdPCIndexB;							break;						case 2:						default: /* keep compiler happy */							CurAMd = kAMdPCIndexW;							break;						case 4:							CurAMd = kAMdPCIndexL;							break;					}					IsOk = CheckInSet(v,						kAddrValidMaskAny | kAddrValidMaskData							| kAddrValidMaskControl							| kAddrValidMaskDataNoCn);					break;				case 4:					switch (p->opsize) {						case 1:							CurAMd = kAMdImmedB;							break;						case 2:						default: /* keep compiler happy */							CurAMd = kAMdImmedW;							break;						case 4:							CurAMd = kAMdImmedL;							break;					}					IsOk = CheckInSet(v,						kAddrValidMaskAny | kAddrValidMaskData);					break;				default:					IsOk = falseblnr;					break;			}			break;		default: /* keep compiler happy */			IsOk = falseblnr;			break;	} 	if (IsOk) {		SetDcoArgFields(p, src, CurAMd, CurArgDat);	} 	return IsOk;} #if WantCycByPriOpLOCALFUNC blnr LeaPeaEACalcCyc(WorkR *p, ui3r m, ui3r r){	ui4r v; 	UnusedParam(p);

Lines 1–500 of 3072.

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