2 * Fast486 386/486 CPU Emulation Library
5 * Copyright (C) 2013 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27 /* DEFINES ********************************************************************/
29 #define FAST486_NUM_OPCODE_HANDLERS 256
30 #define FAST486_OPCODE_WRITE_REG (1 << 1)
31 #define FAST486_OPCODE_HANDLER(x) \
32 BOOLEAN FASTCALL x(PFAST486_STATE State, UCHAR Opcode)
34 typedef BOOLEAN (FASTCALL
*FAST486_OPCODE_HANDLER_PROC
)(PFAST486_STATE
, UCHAR
);
37 FAST486_OPCODE_HANDLER_PROC
38 Fast486OpcodeHandlers
[FAST486_NUM_OPCODE_HANDLERS
];
40 FAST486_OPCODE_HANDLER(Fast486OpcodePrefix
);
41 FAST486_OPCODE_HANDLER(Fast486OpcodeIncrement
);
42 FAST486_OPCODE_HANDLER(Fast486OpcodeDecrement
);
43 FAST486_OPCODE_HANDLER(Fast486OpcodePushReg
);
44 FAST486_OPCODE_HANDLER(Fast486OpcodePopReg
);
45 FAST486_OPCODE_HANDLER(Fast486OpcodeNop
);
46 FAST486_OPCODE_HANDLER(Fast486OpcodeExchangeEax
);
47 FAST486_OPCODE_HANDLER(Fast486OpcodeShortConditionalJmp
);
48 FAST486_OPCODE_HANDLER(Fast486OpcodeClearCarry
);
49 FAST486_OPCODE_HANDLER(Fast486OpcodeSetCarry
);
50 FAST486_OPCODE_HANDLER(Fast486OpcodeComplCarry
);
51 FAST486_OPCODE_HANDLER(Fast486OpcodeClearInt
);
52 FAST486_OPCODE_HANDLER(Fast486OpcodeSetInt
);
53 FAST486_OPCODE_HANDLER(Fast486OpcodeClearDir
);
54 FAST486_OPCODE_HANDLER(Fast486OpcodeSetDir
);
55 FAST486_OPCODE_HANDLER(Fast486OpcodeHalt
);
56 FAST486_OPCODE_HANDLER(Fast486OpcodeInByte
);
57 FAST486_OPCODE_HANDLER(Fast486OpcodeIn
);
58 FAST486_OPCODE_HANDLER(Fast486OpcodeOutByte
);
59 FAST486_OPCODE_HANDLER(Fast486OpcodeOut
);
60 FAST486_OPCODE_HANDLER(Fast486OpcodeShortJump
);
61 FAST486_OPCODE_HANDLER(Fast486OpcodeMovRegImm
);
62 FAST486_OPCODE_HANDLER(Fast486OpcodeMovByteRegImm
);
63 FAST486_OPCODE_HANDLER(Fast486OpcodeAddByteModrm
);
64 FAST486_OPCODE_HANDLER(Fast486OpcodeAddModrm
);
65 FAST486_OPCODE_HANDLER(Fast486OpcodeAddAl
);
66 FAST486_OPCODE_HANDLER(Fast486OpcodeAddEax
);
67 FAST486_OPCODE_HANDLER(Fast486OpcodeOrByteModrm
);
68 FAST486_OPCODE_HANDLER(Fast486OpcodeOrModrm
);
69 FAST486_OPCODE_HANDLER(Fast486OpcodeOrAl
);
70 FAST486_OPCODE_HANDLER(Fast486OpcodeOrEax
);
71 FAST486_OPCODE_HANDLER(Fast486OpcodeAndByteModrm
);
72 FAST486_OPCODE_HANDLER(Fast486OpcodeAndModrm
);
73 FAST486_OPCODE_HANDLER(Fast486OpcodeAndAl
);
74 FAST486_OPCODE_HANDLER(Fast486OpcodeAndEax
);
75 FAST486_OPCODE_HANDLER(Fast486OpcodeXorByteModrm
);
76 FAST486_OPCODE_HANDLER(Fast486OpcodeXorModrm
);
77 FAST486_OPCODE_HANDLER(Fast486OpcodeXorAl
);
78 FAST486_OPCODE_HANDLER(Fast486OpcodeXorEax
);
79 FAST486_OPCODE_HANDLER(Fast486OpcodeTestByteModrm
);
80 FAST486_OPCODE_HANDLER(Fast486OpcodeTestModrm
);
81 FAST486_OPCODE_HANDLER(Fast486OpcodeTestAl
);
82 FAST486_OPCODE_HANDLER(Fast486OpcodeTestEax
);
83 FAST486_OPCODE_HANDLER(Fast486OpcodeXchgByteModrm
);
84 FAST486_OPCODE_HANDLER(Fast486OpcodeXchgModrm
);
85 FAST486_OPCODE_HANDLER(Fast486OpcodePushEs
);
86 FAST486_OPCODE_HANDLER(Fast486OpcodePopEs
);
87 FAST486_OPCODE_HANDLER(Fast486OpcodePushCs
);
88 FAST486_OPCODE_HANDLER(Fast486OpcodeAdcByteModrm
);
89 FAST486_OPCODE_HANDLER(Fast486OpcodeAdcModrm
);
90 FAST486_OPCODE_HANDLER(Fast486OpcodeAdcAl
);
91 FAST486_OPCODE_HANDLER(Fast486OpcodeAdcEax
);
92 FAST486_OPCODE_HANDLER(Fast486OpcodePushSs
);
93 FAST486_OPCODE_HANDLER(Fast486OpcodePopSs
);
94 FAST486_OPCODE_HANDLER(Fast486OpcodeSbbByteModrm
);
95 FAST486_OPCODE_HANDLER(Fast486OpcodeSbbModrm
);
96 FAST486_OPCODE_HANDLER(Fast486OpcodeSbbAl
);
97 FAST486_OPCODE_HANDLER(Fast486OpcodeSbbEax
);
98 FAST486_OPCODE_HANDLER(Fast486OpcodePushDs
);
99 FAST486_OPCODE_HANDLER(Fast486OpcodePopDs
);
100 FAST486_OPCODE_HANDLER(Fast486OpcodeDaa
);
101 FAST486_OPCODE_HANDLER(Fast486OpcodeCmpSubByteModrm
);
102 FAST486_OPCODE_HANDLER(Fast486OpcodeCmpSubModrm
);
103 FAST486_OPCODE_HANDLER(Fast486OpcodeCmpSubAl
);
104 FAST486_OPCODE_HANDLER(Fast486OpcodeCmpSubEax
);
105 FAST486_OPCODE_HANDLER(Fast486OpcodeDas
);
106 FAST486_OPCODE_HANDLER(Fast486OpcodeAaa
);
107 FAST486_OPCODE_HANDLER(Fast486OpcodeAas
);
108 FAST486_OPCODE_HANDLER(Fast486OpcodePushAll
);
109 FAST486_OPCODE_HANDLER(Fast486OpcodePopAll
);
110 FAST486_OPCODE_HANDLER(Fast486OpcodeBound
);
111 FAST486_OPCODE_HANDLER(Fast486OpcodeArpl
);
112 FAST486_OPCODE_HANDLER(Fast486OpcodePushImm
);
113 FAST486_OPCODE_HANDLER(Fast486OpcodeImulModrmImm
);
114 FAST486_OPCODE_HANDLER(Fast486OpcodePushByteImm
);
115 FAST486_OPCODE_HANDLER(Fast486OpcodeMovByteModrm
);
116 FAST486_OPCODE_HANDLER(Fast486OpcodeMovModrm
);
117 FAST486_OPCODE_HANDLER(Fast486OpcodeMovStoreSeg
);
118 FAST486_OPCODE_HANDLER(Fast486OpcodeLea
);
119 FAST486_OPCODE_HANDLER(Fast486OpcodeMovLoadSeg
);
120 FAST486_OPCODE_HANDLER(Fast486OpcodeCwde
);
121 FAST486_OPCODE_HANDLER(Fast486OpcodeCdq
);
122 FAST486_OPCODE_HANDLER(Fast486OpcodeCallAbs
);
123 FAST486_OPCODE_HANDLER(Fast486OpcodeWait
);
124 FAST486_OPCODE_HANDLER(Fast486OpcodePushFlags
);
125 FAST486_OPCODE_HANDLER(Fast486OpcodePopFlags
);
126 FAST486_OPCODE_HANDLER(Fast486OpcodeSahf
);
127 FAST486_OPCODE_HANDLER(Fast486OpcodeLahf
);
128 FAST486_OPCODE_HANDLER(Fast486OpcodeRet
);
129 FAST486_OPCODE_HANDLER(Fast486OpcodeLdsLes
);
130 FAST486_OPCODE_HANDLER(Fast486OpcodeEnter
);
131 FAST486_OPCODE_HANDLER(Fast486OpcodeLeave
);
132 FAST486_OPCODE_HANDLER(Fast486OpcodeRetFarImm
);
133 FAST486_OPCODE_HANDLER(Fast486OpcodeRetFar
);
134 FAST486_OPCODE_HANDLER(Fast486OpcodeInt
);
135 FAST486_OPCODE_HANDLER(Fast486OpcodeIret
);
136 FAST486_OPCODE_HANDLER(Fast486OpcodeAam
);
137 FAST486_OPCODE_HANDLER(Fast486OpcodeAad
);
138 FAST486_OPCODE_HANDLER(Fast486OpcodeXlat
);
139 FAST486_OPCODE_HANDLER(Fast486OpcodeLoop
);
140 FAST486_OPCODE_HANDLER(Fast486OpcodeJecxz
);
141 FAST486_OPCODE_HANDLER(Fast486OpcodeCall
);
142 FAST486_OPCODE_HANDLER(Fast486OpcodeJmp
);
143 FAST486_OPCODE_HANDLER(Fast486OpcodeJmpAbs
);
144 FAST486_OPCODE_HANDLER(Fast486OpcodeMovAlOffset
);
145 FAST486_OPCODE_HANDLER(Fast486OpcodeMovEaxOffset
);
146 FAST486_OPCODE_HANDLER(Fast486OpcodeMovOffsetAl
);
147 FAST486_OPCODE_HANDLER(Fast486OpcodeMovOffsetEax
);
148 FAST486_OPCODE_HANDLER(Fast486OpcodeSalc
);
149 FAST486_OPCODE_HANDLER(Fast486OpcodeMovs
);
150 FAST486_OPCODE_HANDLER(Fast486OpcodeCmps
);
151 FAST486_OPCODE_HANDLER(Fast486OpcodeStos
);
152 FAST486_OPCODE_HANDLER(Fast486OpcodeLods
);
153 FAST486_OPCODE_HANDLER(Fast486OpcodeScas
);
154 FAST486_OPCODE_HANDLER(Fast486OpcodeIns
);
155 FAST486_OPCODE_HANDLER(Fast486OpcodeOuts
);
157 #endif // _OPCODES_H_