|
|
1.1 root 1: /*
2: Hatari - m68000.h
3:
4: This file is distributed under the GNU Public License, version 2 or at
5: your option any later version. Read the file gpl.txt for details.
6: */
7:
8: /* 2007/11/10 [NP] Add pairing for lsr / dbcc (and all variants */
9: /* working on register, not on memory). */
10: /* 2008/01/07 [NP] Use PairingArray to store all valid pairing */
11: /* combinations (in m68000.c) */
12: /* 2010/04/05 [NP] Rework the pairing code to take BusCyclePenalty */
13: /* into account when using d8(an,ix). */
14: /* 2010/05/07 [NP] Add BusCyclePenalty to LastInstrCycles to detect*/
15: /* a possible pairing between add.l (a5,d1.w),d0 */
16: /* and move.b 7(a5,d1.w),d5. */
17:
18:
19: #ifndef HATARI_M68000_H
20: #define HATARI_M68000_H
21:
22: #ifdef __cplusplus
23: extern "C" {
24: #endif /* __cplusplus */
25:
26: #include "sysdeps.h"
27: #include "memory.h"
28: #include "newcpu.h" /* for regs */
29: #include "cycInt.h"
30: #include "log.h"
31: #include "host.h"
32: #include "configuration.h"
33:
34: /* 68000 Register defines */
35: enum {
36: REG_D0, /* D0.. */
37: REG_D1,
38: REG_D2,
39: REG_D3,
40: REG_D4,
41: REG_D5,
42: REG_D6,
43: REG_D7, /* ..D7 */
44: REG_A0, /* A0.. */
45: REG_A1,
46: REG_A2,
47: REG_A3,
48: REG_A4,
49: REG_A5,
50: REG_A6,
51: REG_A7, /* ..A7 (also SP) */
52: };
53:
54: /* 68000 Condition code's */
55: #define SR_AUX 0x0010
56: #define SR_NEG 0x0008
57: #define SR_ZERO 0x0004
58: #define SR_OVERFLOW 0x0002
59: #define SR_CARRY 0x0001
60:
61: #define SR_CLEAR_AUX 0xffef
62: #define SR_CLEAR_NEG 0xfff7
63: #define SR_CLEAR_ZERO 0xfffb
64: #define SR_CLEAR_OVERFLOW 0xfffd
65: #define SR_CLEAR_CARRY 0xfffe
66:
67: #define SR_CCODE_MASK (SR_AUX|SR_NEG|SR_ZERO|SR_OVERFLOW|SR_CARRY)
68: #define SR_MASK 0xFFE0
69:
70: #define SR_TRACEMODE 0x8000
71: #define SR_SUPERMODE 0x2000
72: #define SR_IPL 0x0700
73:
74: #define SR_CLEAR_IPL 0xf8ff
75: #define SR_CLEAR_TRACEMODE 0x7fff
76: #define SR_CLEAR_SUPERMODE 0xdfff
77:
78: /* Exception vectors */
79: #define EXCEPTION_BUSERROR 0x00000008
80: #define EXCEPTION_ADDRERROR 0x0000000c
81: #define EXCEPTION_ILLEGALINS 0x00000010
82: #define EXCEPTION_DIVZERO 0x00000014
83: #define EXCEPTION_CHK 0x00000018
84: #define EXCEPTION_TRAPV 0x0000001c
85: #define EXCEPTION_TRACE 0x00000024
86: #define EXCEPTION_LINE_A 0x00000028
87: #define EXCEPTION_LINE_F 0x0000002c
88: #define EXCEPTION_TRAP0 0x00000080
89: #define EXCEPTION_TRAP1 0x00000084
90: #define EXCEPTION_TRAP2 0x00000088
91: #define EXCEPTION_TRAP13 0x000000B4
92: #define EXCEPTION_TRAP14 0x000000B8
93:
94:
95: /* Size of 68000 instructions */
96: #define MAX_68000_INSTRUCTION_SIZE 10 /* Longest 68000 instruction is 10 bytes(6+4) */
97: #define MIN_68000_INSTRUCTION_SIZE 2 /* Smallest 68000 instruction is 2 bytes(ie NOP) */
98:
99: /* Illegal Opcode used to help emulation. eg. free entries are 8 to 15 inc' */
100: #define GEMDOS_OPCODE 8 /* Free op-code to intercept GemDOS trap */
101: #define SYSINIT_OPCODE 10 /* Free op-code to initialize system (connected drives etc.) */
102: #define VDI_OPCODE 12 /* Free op-code to call VDI handlers AFTER Trap#2 */
103:
104:
105:
106: /* Ugly hacks to adapt the main code to the different CPU cores: */
107:
108: #define Regs regs.regs
109:
110: # define M68000_GetPC() m68k_getpc()
111: # define M68000_SetPC(val) m68k_setpc(val)
112:
113: static inline Uint16 M68000_GetSR(void)
114: {
115: MakeSR();
116: return regs.sr;
117: }
118: static inline void M68000_SetSR(Uint16 v)
119: {
120: regs.sr = v;
121: MakeFromSR();
122: }
123:
124: # define M68000_SetSpecial(flags) set_special(flags)
125: # define M68000_UnsetSpecial(flags) unset_special(flags)
126:
127:
128: /* bus error mode */
129: #define BUS_ERROR_WRITE 0
130: #define BUS_ERROR_READ 1
131:
132:
133: /* bus access mode */
134: #define BUS_MODE_CPU 0 /* bus is owned by the cpu */
135: #define BUS_MODE_BLITTER 1 /* bus is owned by the blitter */
136:
137:
138: extern Uint32 BusErrorAddress;
139: extern Uint32 BusErrorPC;
140: extern bool bBusErrorReadWrite;
141: extern int BusMode;
142:
143: extern int LastOpcodeFamily;
144: extern int LastInstrCycles;
145: extern int Pairing;
146: extern char PairingArray[ MAX_OPCODE_FAMILY ][ MAX_OPCODE_FAMILY ];
147: extern const char *OpcodeName[];
148:
149:
150: /*-----------------------------------------------------------------------*/
151: /**
152: * Add CPU cycles.
153: */
154: static inline void M68000_AddCycles(int cycles) {
155: nCyclesOver += cycles;
156:
157: if(PendingInterrupt.type == CYC_INT_CPU)
158: PendingInterrupt.time -= cycles;
159:
160: if(usCheckCycles < 0) {
161: if(!(CycInt_SetNewInterruptUs())) {
162: usCheckCycles = 100 * ConfigureParams.System.nCpuFreq;
163: }
164: } else
165: usCheckCycles -= cycles;
166: nCyclesMainCounter += cycles;
167: }
168:
169: void M68000_Init(void);
170: void M68000_Reset(bool bCold);
171: void M68000_Stop(void);
172: void M68000_Start(void);
173: void M68000_CheckCpuSettings(void);
174: void M68000_BusError(Uint32 addr, bool bReadWrite);
175: void M68000_Exception(Uint32 ExceptionVector , int ExceptionSource);
176:
177: #ifdef __cplusplus
178: }
179: #endif /* __cplusplus */
180:
181: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.