4 * Copyright (C) 2018-2019 Alan R. Baldwin
\r
6 * This program is free software: you can redistribute it and/or modify
\r
7 * it under the terms of the GNU General Public License as published by
\r
8 * the Free Software Foundation, either version 3 of the License, or
\r
9 * (at your option) any later version.
\r
11 * This program is distributed in the hope that it will be useful,
\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 * GNU General Public License for more details.
\r
16 * You should have received a copy of the GNU General Public License
\r
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
\r
28 char *cpu = "Intel 8008 MCS-8";
\r
32 * Opcode Cycle Definitions
\r
34 #define OPCY_SDP ((char) (0xFF))
\r
35 #define OPCY_ERR ((char) (0xFE))
\r
37 /* OPCY_NONE ((char) (0x80)) */
\r
38 /* OPCY_MASK ((char) (0x7F)) */
\r
40 #define UN ((char) (OPCY_NONE | 0x00))
\r
45 * opcycles = i80pg1[opcode]
\r
47 static char i80pg1[256] = {
\r
48 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
\r
49 /*--*--* - - - - - - - - - - - - - - - - */
\r
50 /*00*/ 1,UN, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, 3, 1,
\r
51 /*10*/ 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, 3, 1,
\r
52 /*20*/ 1, 1,UN, 1, 2, 1, 3,UN, 1, 1,UN, 1, 2, 1, 3,UN,
\r
53 /*30*/ 1, 1,UN, 1, 2, 1, 3, 1,UN,UN,UN, 1, 2, 1, 3, 1,
\r
54 /*40*/ 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2,UN, 2,UN, 2,
\r
55 /*50*/ 3, 2, 3, 2,UN, 2,UN, 2, 3, 2, 3, 2,UN, 2,UN, 2,
\r
56 /*60*/ 3, 2, 3, 2,UN, 2,UN, 2, 3, 2, 3, 2,UN, 2,UN, 2,
\r
57 /*70*/ 3, 2, 3, 2,UN, 2,UN, 2, 3, 2, 3, 2,UN, 2,UN, 2,
\r
58 /*80*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2,
\r
59 /*90*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2,
\r
60 /*A0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2,
\r
61 /*B0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2,
\r
62 /*C0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2,
\r
63 /*D0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2,
\r
64 /*E0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2,
\r
65 /*F0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2
\r
69 * Process machine ops.
\r
82 op = (int) mp->m_valu;
\r
83 switch (mp->m_type) {
\r
92 if ((t1 == S_REG) && (v1 > 0) && (v1 < 7)) {
\r
93 outab(op | (v1<<3));
\r
110 if (e1.e_addr & ~0x07) {
\r
113 v1 = (e1.e_addr & 0x07) << 3;
\r
116 outrbm(&e1, R_RST, op);
\r
129 outab(op | (v1<<3));
\r
147 if (e1.e_addr & ~0x07) {
\r
151 outab(op | (e1.e_addr<<1));
\r
154 outrbm(&e1, R_IN, op);
\r
161 if ((e1.e_addr & ~0x1F) || (e1.e_addr < 0x08)) {
\r
165 outab(op | (e1.e_addr<<1));
\r
168 outrbm(&e1, R_OUT, op);
\r
179 case 0x80: outab(0x04); break; /* ADD # -> ADI */
\r
180 case 0x88: outab(0x0C); break; /* ADC # -> ACI */
\r
181 case 0x90: outab(0x14); break; /* SUB # -> SUI */
\r
182 case 0x98: outab(0x1C); break; /* SUB # -> SBI */
\r
183 case 0xA0: outab(0x24); break; /* ANA # -> ANI */
\r
184 case 0xA8: outab(0x2C); break; /* XRA # -> XRI */
\r
185 case 0xB0: outab(0x34); break; /* ORA # -> ORI */
\r
186 case 0xB8: outab(0x3C); break; /* CMP # -> CPI */
\r
206 if ((t1 == S_REG) && (t2 == S_REG)) {
\r
207 outab(op | (v1<<3) | v2);
\r
209 if ((t1 == S_REG) && (t2 == S_IMMED)) {
\r
211 case A: outab(0x06); break; /* MVI A,X */
\r
212 case B: outab(0x0E); break; /* MVI B,X */
\r
213 case C: outab(0x16); break; /* MVI C,X */
\r
214 case D: outab(0x1E); break; /* MVI D,X */
\r
215 case E: outab(0x26); break; /* MVI E,X */
\r
216 case H: outab(0x2E); break; /* MVI H,X */
\r
217 case L: outab(0x36); break; /* MVI L,X */
\r
218 case M: outab(0x3E); break; /* MVI M,X */
\r
228 opcycles = OPCY_ERR;
\r
232 if (opcycles == OPCY_NONE) {
\r
233 opcycles = i80pg1[cb[0] & 0xFF];
\r
238 *Machine specific initialization.
\r