8080 emulator for mbed. Will run CP/M v2.0 from disk image on local file system. hopefully.

Dependencies:   mbed

Committer:
roving99
Date:
Fri May 07 15:15:26 2010 +0000
Revision:
0:a9f6f3aea58f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
roving99 0:a9f6f3aea58f 1 //------------------------------------CP/M on MBED-----------------------------------
roving99 0:a9f6f3aea58f 2 // Emulate an 8080 and run CP/M v2.0 from a disk image saved on local storage.
roving99 0:a9f6f3aea58f 3 //
roving99 0:a9f6f3aea58f 4 // Inspired by excellent CP/M-on-AVR by Sprite_tm : http://spritesmods.com/?art=avrcpm
roving99 0:a9f6f3aea58f 5 // and by
roving99 0:a9f6f3aea58f 6 //
roving99 0:a9f6f3aea58f 7 // Basically a C reworking of Sprite's AVR machinecode.
roving99 0:a9f6f3aea58f 8
roving99 0:a9f6f3aea58f 9 #include "mbed.h"
roving99 0:a9f6f3aea58f 10
roving99 0:a9f6f3aea58f 11 void do_op_00(); void do_op_01(); void do_op_02(); void do_op_03(); void do_op_04(); void do_op_05(); void do_op_06(); void do_op_07();
roving99 0:a9f6f3aea58f 12 void do_op_08(); void do_op_09(); void do_op_0A(); void do_op_0B(); void do_op_0C(); void do_op_0D(); void do_op_0E(); void do_op_0F();
roving99 0:a9f6f3aea58f 13 void do_op_10(); void do_op_11(); void do_op_12(); void do_op_13(); void do_op_14(); void do_op_15(); void do_op_16(); void do_op_17();
roving99 0:a9f6f3aea58f 14 void do_op_18(); void do_op_19(); void do_op_1A(); void do_op_1B(); void do_op_1C(); void do_op_1D(); void do_op_1E(); void do_op_1F();
roving99 0:a9f6f3aea58f 15 void do_op_20(); void do_op_21(); void do_op_22(); void do_op_23(); void do_op_24(); void do_op_25(); void do_op_26(); void do_op_27();
roving99 0:a9f6f3aea58f 16 void do_op_28(); void do_op_29(); void do_op_2A(); void do_op_2B(); void do_op_2C(); void do_op_2D(); void do_op_2E(); void do_op_2F();
roving99 0:a9f6f3aea58f 17 void do_op_30(); void do_op_31(); void do_op_32(); void do_op_33(); void do_op_34(); void do_op_35(); void do_op_36(); void do_op_37();
roving99 0:a9f6f3aea58f 18 void do_op_38(); void do_op_39(); void do_op_3A(); void do_op_3B(); void do_op_3C(); void do_op_3D(); void do_op_3E(); void do_op_3F();
roving99 0:a9f6f3aea58f 19 void do_op_40(); void do_op_41(); void do_op_42(); void do_op_43(); void do_op_44(); void do_op_45(); void do_op_46(); void do_op_47();
roving99 0:a9f6f3aea58f 20 void do_op_48(); void do_op_49(); void do_op_4A(); void do_op_4B(); void do_op_4C(); void do_op_4D(); void do_op_4E(); void do_op_4F();
roving99 0:a9f6f3aea58f 21 void do_op_50(); void do_op_51(); void do_op_52(); void do_op_53(); void do_op_54(); void do_op_55(); void do_op_56(); void do_op_57();
roving99 0:a9f6f3aea58f 22 void do_op_58(); void do_op_59(); void do_op_5A(); void do_op_5B(); void do_op_5C(); void do_op_5D(); void do_op_5E(); void do_op_5F();
roving99 0:a9f6f3aea58f 23 void do_op_60(); void do_op_61(); void do_op_62(); void do_op_63(); void do_op_64(); void do_op_65(); void do_op_66(); void do_op_67();
roving99 0:a9f6f3aea58f 24 void do_op_68(); void do_op_69(); void do_op_6A(); void do_op_6B(); void do_op_6C(); void do_op_6D(); void do_op_6E(); void do_op_6F();
roving99 0:a9f6f3aea58f 25 void do_op_70(); void do_op_71(); void do_op_72(); void do_op_73(); void do_op_74(); void do_op_75(); void do_op_76(); void do_op_77();
roving99 0:a9f6f3aea58f 26 void do_op_78(); void do_op_79(); void do_op_7A(); void do_op_7B(); void do_op_7C(); void do_op_7D(); void do_op_7E(); void do_op_7F();
roving99 0:a9f6f3aea58f 27 void do_op_80(); void do_op_81(); void do_op_82(); void do_op_83(); void do_op_84(); void do_op_85(); void do_op_86(); void do_op_87();
roving99 0:a9f6f3aea58f 28 void do_op_88(); void do_op_89(); void do_op_8A(); void do_op_8B(); void do_op_8C(); void do_op_8D(); void do_op_8E(); void do_op_8F();
roving99 0:a9f6f3aea58f 29 void do_op_90(); void do_op_91(); void do_op_92(); void do_op_93(); void do_op_94(); void do_op_95(); void do_op_96(); void do_op_97();
roving99 0:a9f6f3aea58f 30 void do_op_98(); void do_op_99(); void do_op_9A(); void do_op_9B(); void do_op_9C(); void do_op_9D(); void do_op_9E(); void do_op_9F();
roving99 0:a9f6f3aea58f 31 void do_op_A0(); void do_op_A1(); void do_op_A2(); void do_op_A3(); void do_op_A4(); void do_op_A5(); void do_op_A6(); void do_op_A7();
roving99 0:a9f6f3aea58f 32 void do_op_A8(); void do_op_A9(); void do_op_AA(); void do_op_AB(); void do_op_AC(); void do_op_AD(); void do_op_AE(); void do_op_AF();
roving99 0:a9f6f3aea58f 33 void do_op_B0(); void do_op_B1(); void do_op_B2(); void do_op_B3(); void do_op_B4(); void do_op_B5(); void do_op_B6(); void do_op_B7();
roving99 0:a9f6f3aea58f 34 void do_op_B8(); void do_op_B9(); void do_op_BA(); void do_op_BB(); void do_op_BC(); void do_op_BD(); void do_op_BE(); void do_op_BF();
roving99 0:a9f6f3aea58f 35 void do_op_C0(); void do_op_C1(); void do_op_C2(); void do_op_C3(); void do_op_C4(); void do_op_C5(); void do_op_C6(); void do_op_C7();
roving99 0:a9f6f3aea58f 36 void do_op_C8(); void do_op_C9(); void do_op_CA(); void do_op_CB(); void do_op_CC(); void do_op_CD(); void do_op_CE(); void do_op_CF();
roving99 0:a9f6f3aea58f 37 void do_op_D0(); void do_op_D1(); void do_op_D2(); void do_op_D3(); void do_op_D4(); void do_op_D5(); void do_op_D6(); void do_op_D7();
roving99 0:a9f6f3aea58f 38 void do_op_D8(); void do_op_D9(); void do_op_DA(); void do_op_DB(); void do_op_DC(); void do_op_DD(); void do_op_DE(); void do_op_DF();
roving99 0:a9f6f3aea58f 39 void do_op_E0(); void do_op_E1(); void do_op_E2(); void do_op_E3(); void do_op_E4(); void do_op_E5(); void do_op_E6(); void do_op_E7();
roving99 0:a9f6f3aea58f 40 void do_op_E8(); void do_op_E9(); void do_op_EA(); void do_op_EB(); void do_op_EC(); void do_op_ED(); void do_op_EE(); void do_op_EF();
roving99 0:a9f6f3aea58f 41 void do_op_F0(); void do_op_F1(); void do_op_F2(); void do_op_F3(); void do_op_F4(); void do_op_F5(); void do_op_F6(); void do_op_F7();
roving99 0:a9f6f3aea58f 42 void do_op_F8(); void do_op_F9(); void do_op_FA(); void do_op_FB(); void do_op_FC(); void do_op_FD(); void do_op_FE(); void do_op_FF();
roving99 0:a9f6f3aea58f 43
roving99 0:a9f6f3aea58f 44 typedef void (*ptr2function)(void);
roving99 0:a9f6f3aea58f 45
roving99 0:a9f6f3aea58f 46 const ptr2function function[] = {
roving99 0:a9f6f3aea58f 47 &do_op_00,&do_op_01,&do_op_02,&do_op_03,&do_op_04,&do_op_05,&do_op_06,&do_op_07,
roving99 0:a9f6f3aea58f 48 &do_op_08,&do_op_09,&do_op_0A,&do_op_0B,&do_op_0C,&do_op_0D,&do_op_0E,&do_op_0F,
roving99 0:a9f6f3aea58f 49 &do_op_10,&do_op_11,&do_op_12,&do_op_13,&do_op_14,&do_op_15,&do_op_16,&do_op_17,
roving99 0:a9f6f3aea58f 50 &do_op_18,&do_op_19,&do_op_1A,&do_op_1B,&do_op_1C,&do_op_1D,&do_op_1E,&do_op_1F,
roving99 0:a9f6f3aea58f 51 &do_op_20,&do_op_21,&do_op_22,&do_op_23,&do_op_24,&do_op_25,&do_op_26,&do_op_27,
roving99 0:a9f6f3aea58f 52 &do_op_28,&do_op_29,&do_op_2A,&do_op_2B,&do_op_2C,&do_op_2D,&do_op_2E,&do_op_2F,
roving99 0:a9f6f3aea58f 53 &do_op_30,&do_op_31,&do_op_32,&do_op_33,&do_op_34,&do_op_35,&do_op_36,&do_op_37,
roving99 0:a9f6f3aea58f 54 &do_op_38,&do_op_39,&do_op_3A,&do_op_3B,&do_op_3C,&do_op_3D,&do_op_3E,&do_op_3F,
roving99 0:a9f6f3aea58f 55 &do_op_40,&do_op_41,&do_op_42,&do_op_43,&do_op_44,&do_op_45,&do_op_46,&do_op_47,
roving99 0:a9f6f3aea58f 56 &do_op_48,&do_op_49,&do_op_4A,&do_op_4B,&do_op_4C,&do_op_4D,&do_op_4E,&do_op_4F,
roving99 0:a9f6f3aea58f 57 &do_op_50,&do_op_51,&do_op_52,&do_op_53,&do_op_54,&do_op_55,&do_op_56,&do_op_57,
roving99 0:a9f6f3aea58f 58 &do_op_58,&do_op_59,&do_op_5A,&do_op_5B,&do_op_5C,&do_op_5D,&do_op_5E,&do_op_5F,
roving99 0:a9f6f3aea58f 59 &do_op_60,&do_op_61,&do_op_62,&do_op_63,&do_op_64,&do_op_65,&do_op_66,&do_op_67,
roving99 0:a9f6f3aea58f 60 &do_op_68,&do_op_69,&do_op_6A,&do_op_6B,&do_op_6C,&do_op_6D,&do_op_6E,&do_op_6F,
roving99 0:a9f6f3aea58f 61 &do_op_70,&do_op_71,&do_op_72,&do_op_73,&do_op_74,&do_op_75,&do_op_76,&do_op_77,
roving99 0:a9f6f3aea58f 62 &do_op_78,&do_op_79,&do_op_7A,&do_op_7B,&do_op_7C,&do_op_7D,&do_op_7E,&do_op_7F,
roving99 0:a9f6f3aea58f 63 &do_op_80,&do_op_81,&do_op_82,&do_op_83,&do_op_84,&do_op_85,&do_op_86,&do_op_87,
roving99 0:a9f6f3aea58f 64 &do_op_88,&do_op_89,&do_op_8A,&do_op_8B,&do_op_8C,&do_op_8D,&do_op_8E,&do_op_8F,
roving99 0:a9f6f3aea58f 65 &do_op_90,&do_op_91,&do_op_92,&do_op_93,&do_op_94,&do_op_95,&do_op_96,&do_op_97,
roving99 0:a9f6f3aea58f 66 &do_op_98,&do_op_99,&do_op_9A,&do_op_9B,&do_op_9C,&do_op_9D,&do_op_9E,&do_op_9F,
roving99 0:a9f6f3aea58f 67 &do_op_A0,&do_op_A1,&do_op_A2,&do_op_A3,&do_op_A4,&do_op_A5,&do_op_A6,&do_op_A7,
roving99 0:a9f6f3aea58f 68 &do_op_A8,&do_op_A9,&do_op_AA,&do_op_AB,&do_op_AC,&do_op_AD,&do_op_AE,&do_op_AF,
roving99 0:a9f6f3aea58f 69 &do_op_B0,&do_op_B1,&do_op_B2,&do_op_B3,&do_op_B4,&do_op_B5,&do_op_B6,&do_op_B7,
roving99 0:a9f6f3aea58f 70 &do_op_B8,&do_op_B9,&do_op_BA,&do_op_BB,&do_op_BC,&do_op_BD,&do_op_BE,&do_op_BF,
roving99 0:a9f6f3aea58f 71 &do_op_C0,&do_op_C1,&do_op_C2,&do_op_C3,&do_op_C4,&do_op_C5,&do_op_C6,&do_op_C7,
roving99 0:a9f6f3aea58f 72 &do_op_C8,&do_op_C9,&do_op_CA,&do_op_CB,&do_op_CC,&do_op_CD,&do_op_CE,&do_op_CF,
roving99 0:a9f6f3aea58f 73 &do_op_D0,&do_op_D1,&do_op_D2,&do_op_D3,&do_op_D4,&do_op_D5,&do_op_D6,&do_op_D7,
roving99 0:a9f6f3aea58f 74 &do_op_D8,&do_op_D9,&do_op_DA,&do_op_DB,&do_op_DC,&do_op_DD,&do_op_DE,&do_op_DF,
roving99 0:a9f6f3aea58f 75 &do_op_E0,&do_op_E1,&do_op_E2,&do_op_E3,&do_op_E4,&do_op_E5,&do_op_E6,&do_op_E7,
roving99 0:a9f6f3aea58f 76 &do_op_E8,&do_op_E9,&do_op_EA,&do_op_EB,&do_op_EC,&do_op_ED,&do_op_EE,&do_op_EF,
roving99 0:a9f6f3aea58f 77 &do_op_F0,&do_op_F1,&do_op_F2,&do_op_F3,&do_op_F4,&do_op_F5,&do_op_F6,&do_op_F7,
roving99 0:a9f6f3aea58f 78 &do_op_F8,&do_op_F9,&do_op_FA,&do_op_FB,&do_op_FC,&do_op_FD,&do_op_FE,&do_op_FF } ;
roving99 0:a9f6f3aea58f 79
roving99 0:a9f6f3aea58f 80 char rA; // 8080 registers
roving99 0:a9f6f3aea58f 81 char rB;
roving99 0:a9f6f3aea58f 82 char rC;
roving99 0:a9f6f3aea58f 83 char rD;
roving99 0:a9f6f3aea58f 84 char rE;
roving99 0:a9f6f3aea58f 85 char rH;
roving99 0:a9f6f3aea58f 86 char rL;
roving99 0:a9f6f3aea58f 87 char rSPH; // stack pointer (stack grows down in memory)
roving99 0:a9f6f3aea58f 88 char rSPL;
roving99 0:a9f6f3aea58f 89 char rPCH; // Program counter
roving99 0:a9f6f3aea58f 90 char rPCL;
roving99 0:a9f6f3aea58f 91
roving99 0:a9f6f3aea58f 92 int pc; // 16 bit versions of pc/sp for convienience.
roving99 0:a9f6f3aea58f 93 int sp;
roving99 0:a9f6f3aea58f 94
roving99 0:a9f6f3aea58f 95 //Flag bits in rF
roving99 0:a9f6f3aea58f 96 #define FL_S 7
roving99 0:a9f6f3aea58f 97 #define FL_Z 6
roving99 0:a9f6f3aea58f 98 #define FL_H 4
roving99 0:a9f6f3aea58f 99 #define FL_P 2
roving99 0:a9f6f3aea58f 100 #define FL_N 1
roving99 0:a9f6f3aea58f 101 #define FL_C 0
roving99 0:a9f6f3aea58f 102 char rF; // Status flags
roving99 0:a9f6f3aea58f 103
roving99 0:a9f6f3aea58f 104 char oph; // operating registers when decoding instruction
roving99 0:a9f6f3aea58f 105 char opl;
roving99 0:a9f6f3aea58f 106 int op; // 16 bit version used for 16 bit arithmetic and setting status bits.
roving99 0:a9f6f3aea58f 107
roving99 0:a9f6f3aea58f 108 char temp;
roving99 0:a9f6f3aea58f 109
roving99 0:a9f6f3aea58f 110 bool nostore; // true if we need to skip the store phase (for conditional instructions).
roving99 0:a9f6f3aea58f 111
roving99 0:a9f6f3aea58f 112 char RAM[20*1024];
roving99 0:a9f6f3aea58f 113
roving99 0:a9f6f3aea58f 114 int track;
roving99 0:a9f6f3aea58f 115 int sector;
roving99 0:a9f6f3aea58f 116 int dma; // DMA address for disk read/write
roving99 0:a9f6f3aea58f 117
roving99 0:a9f6f3aea58f 118 Serial serial(USBTX, USBRX); // tx, rx
roving99 0:a9f6f3aea58f 119 LocalFileSystem local("local"); // access to local file system.
roving99 0:a9f6f3aea58f 120
roving99 0:a9f6f3aea58f 121 void clear(char bit) {
roving99 0:a9f6f3aea58f 122 rF=rF&((0xFEF<<bit)>>8);
roving99 0:a9f6f3aea58f 123 }
roving99 0:a9f6f3aea58f 124
roving99 0:a9f6f3aea58f 125 void set(char bit) {
roving99 0:a9f6f3aea58f 126 rF = rF|(0x01<<bit);
roving99 0:a9f6f3aea58f 127 }
roving99 0:a9f6f3aea58f 128
roving99 0:a9f6f3aea58f 129 void set_flags(int result, char bits) {
roving99 0:a9f6f3aea58f 130 int mask = 0xff;
roving99 0:a9f6f3aea58f 131 char b = 1;
roving99 0:a9f6f3aea58f 132 if (bits==16) mask = 0xffff;
roving99 0:a9f6f3aea58f 133 rF = 0x00;
roving99 0:a9f6f3aea58f 134 if ((result>>bits)&0x01) set(FL_C); // Carry flag = bit 8 or bit 16, depending.
roving99 0:a9f6f3aea58f 135 if ((result>>3)&0x01) set(FL_H); // half-carry = bit 3
roving99 0:a9f6f3aea58f 136 if ((result&mask)==0) set(FL_Z); // Zero flag
roving99 0:a9f6f3aea58f 137 for(int i=0; i<bits; i++) if ((result>>i)&0x01) b++; if (b&0x01) set(FL_P); // Set Parity if num of ones is EVEN
roving99 0:a9f6f3aea58f 138 if ((result>>(bits-1))&0x01) set(FL_S); // Sign flag = bit 7 or 15
roving99 0:a9f6f3aea58f 139 }
roving99 0:a9f6f3aea58f 140
roving99 0:a9f6f3aea58f 141 void sync_rpc() { // make rPCL and rPCH match PC
roving99 0:a9f6f3aea58f 142 rPCL = (char)(pc&0xff);
roving99 0:a9f6f3aea58f 143 rPCH = (char)((pc>>8)&0xff);
roving99 0:a9f6f3aea58f 144 }
roving99 0:a9f6f3aea58f 145
roving99 0:a9f6f3aea58f 146 void sync_rsp() { // make rSPL and rSPH match SP
roving99 0:a9f6f3aea58f 147 rSPL = (char)(sp&0xff);
roving99 0:a9f6f3aea58f 148 rSPH = (char)((sp>>8)&0xff);
roving99 0:a9f6f3aea58f 149 }
roving99 0:a9f6f3aea58f 150
roving99 0:a9f6f3aea58f 151 void sync_op() {
roving99 0:a9f6f3aea58f 152 opl = (char)(op&0xff);
roving99 0:a9f6f3aea58f 153 oph = (char)((op>>8)&0xff);
roving99 0:a9f6f3aea58f 154 }
roving99 0:a9f6f3aea58f 155
roving99 0:a9f6f3aea58f 156 void push(char h, char l) { // push 16 bits
roving99 0:a9f6f3aea58f 157 RAM[--sp] = h;
roving99 0:a9f6f3aea58f 158 RAM[--sp] = l;
roving99 0:a9f6f3aea58f 159 sync_rsp();
roving99 0:a9f6f3aea58f 160 }
roving99 0:a9f6f3aea58f 161
roving99 0:a9f6f3aea58f 162 int pop() { // pop 16 bits.
roving99 0:a9f6f3aea58f 163 int r;
roving99 0:a9f6f3aea58f 164 r = RAM[sp++];
roving99 0:a9f6f3aea58f 165 r = r + RAM[sp++]<<8;
roving99 0:a9f6f3aea58f 166 sync_rsp();
roving99 0:a9f6f3aea58f 167 return r;
roving99 0:a9f6f3aea58f 168 }
roving99 0:a9f6f3aea58f 169
roving99 0:a9f6f3aea58f 170 void read_sector(char *buffer, int t, int s) { // read 128 bytes from track/sector to buffer. 26 sectors to a track.
roving99 0:a9f6f3aea58f 171 FILE *fp = fopen("/local/cpm_disk", "r");
roving99 0:a9f6f3aea58f 172 fseek( fp, (26*t+s)*128, SEEK_SET );
roving99 0:a9f6f3aea58f 173 fread( buffer, sizeof(char), 128, fp );
roving99 0:a9f6f3aea58f 174 fclose(fp);
roving99 0:a9f6f3aea58f 175 }
roving99 0:a9f6f3aea58f 176
roving99 0:a9f6f3aea58f 177 void write_sector(char *buffer, int t, int s) { // write 128 bytes from buffer to sector.
roving99 0:a9f6f3aea58f 178 FILE *fp = fopen("/local/cpm_disk", "w");
roving99 0:a9f6f3aea58f 179 fseek( fp, (26*t+s)*128, SEEK_SET );
roving99 0:a9f6f3aea58f 180 fwrite( buffer, sizeof(int), 128, fp );
roving99 0:a9f6f3aea58f 181 fclose(fp);
roving99 0:a9f6f3aea58f 182 }
roving99 0:a9f6f3aea58f 183
roving99 0:a9f6f3aea58f 184 //=================================================================================
roving99 0:a9f6f3aea58f 185 // BIOS routines.
roving99 0:a9f6f3aea58f 186 // HW accessed via IN / OUT instructions.
roving99 0:a9f6f3aea58f 187 //
roving99 0:a9f6f3aea58f 188 // The hw is modelled to make writing a CPM BIOS easier.
roving99 0:a9f6f3aea58f 189 // Ports:
roving99 0:a9f6f3aea58f 190 // 0 - Con status. Returns 0xFF if the UART has a byte, 0 otherwise.
roving99 0:a9f6f3aea58f 191 // 1 - Console input, aka UDR.
roving99 0:a9f6f3aea58f 192 // 2 - Console output
roving99 0:a9f6f3aea58f 193 // 16 - Track select
roving99 0:a9f6f3aea58f 194 // 18 - Sector select (26 sectors to a track)
roving99 0:a9f6f3aea58f 195 // 20 - Write addr l
roving99 0:a9f6f3aea58f 196 // 21 - Write addr h
roving99 0:a9f6f3aea58f 197 // 22 - Trigger - write 1 to read, 2 to write a sector using the above info.
roving99 0:a9f6f3aea58f 198 // This will automatically move track, sector and dma addr to the next sector.
roving99 0:a9f6f3aea58f 199
roving99 0:a9f6f3aea58f 200 void out_command(char p) {
roving99 0:a9f6f3aea58f 201 switch(p) {
roving99 0:a9f6f3aea58f 202 case (2) :
roving99 0:a9f6f3aea58f 203 serial.putc(rA);
roving99 0:a9f6f3aea58f 204 break;
roving99 0:a9f6f3aea58f 205 case (16) :
roving99 0:a9f6f3aea58f 206 track = rA;
roving99 0:a9f6f3aea58f 207 break;
roving99 0:a9f6f3aea58f 208 case (18) :
roving99 0:a9f6f3aea58f 209 sector = rA;
roving99 0:a9f6f3aea58f 210 break;
roving99 0:a9f6f3aea58f 211 case (20) :
roving99 0:a9f6f3aea58f 212 dma = (dma&0xff00)|rA;
roving99 0:a9f6f3aea58f 213 break;
roving99 0:a9f6f3aea58f 214 case (21) :
roving99 0:a9f6f3aea58f 215 dma = (dma&0x00ff)|(rA<<8);
roving99 0:a9f6f3aea58f 216 break;
roving99 0:a9f6f3aea58f 217 case (22) :
roving99 0:a9f6f3aea58f 218 switch(rA) {
roving99 0:a9f6f3aea58f 219 case(1) :
roving99 0:a9f6f3aea58f 220 read_sector(&RAM[dma],track, sector);
roving99 0:a9f6f3aea58f 221 break;
roving99 0:a9f6f3aea58f 222 case(2) :
roving99 0:a9f6f3aea58f 223 write_sector(&RAM[dma],track, sector);
roving99 0:a9f6f3aea58f 224 break;
roving99 0:a9f6f3aea58f 225 }
roving99 0:a9f6f3aea58f 226 sector = (sector+1)%26;
roving99 0:a9f6f3aea58f 227 if (sector==0) track++;
roving99 0:a9f6f3aea58f 228 dma = dma+128;
roving99 0:a9f6f3aea58f 229 break;
roving99 0:a9f6f3aea58f 230 }
roving99 0:a9f6f3aea58f 231 }
roving99 0:a9f6f3aea58f 232
roving99 0:a9f6f3aea58f 233 //=================================================================================
roving99 0:a9f6f3aea58f 234 // BIOS routines.
roving99 0:a9f6f3aea58f 235 // HW accessed via IN / OUT instructions.
roving99 0:a9f6f3aea58f 236 //
roving99 0:a9f6f3aea58f 237 // The hw is modelled to make writing a CPM BIOS easier.
roving99 0:a9f6f3aea58f 238 // Ports:
roving99 0:a9f6f3aea58f 239 // 0 - Con status. Returns 0xFF if the UART has a byte, 0 otherwise.
roving99 0:a9f6f3aea58f 240 // 1 - Console input, aka UDR.
roving99 0:a9f6f3aea58f 241 // 2 - Console output
roving99 0:a9f6f3aea58f 242 // 16 - Track select
roving99 0:a9f6f3aea58f 243 // 18 - Sector select (26 sectors to a track)
roving99 0:a9f6f3aea58f 244 // 20 - Write addr l
roving99 0:a9f6f3aea58f 245 // 21 - Write addr h
roving99 0:a9f6f3aea58f 246 // 22 - Trigger - write 1 to read, 2 to write a sector using the above info.
roving99 0:a9f6f3aea58f 247 // This will automatically move track, sector and dma addr to the next sector.
roving99 0:a9f6f3aea58f 248
roving99 0:a9f6f3aea58f 249 char in_command(char p) {
roving99 0:a9f6f3aea58f 250 char r = 0;
roving99 0:a9f6f3aea58f 251 switch(p) {
roving99 0:a9f6f3aea58f 252 case(0) :
roving99 0:a9f6f3aea58f 253 if (serial.readable()) r = 0xff; else r = 0x00;
roving99 0:a9f6f3aea58f 254 break;
roving99 0:a9f6f3aea58f 255 case(1) :
roving99 0:a9f6f3aea58f 256 r = serial.getc();
roving99 0:a9f6f3aea58f 257 break;
roving99 0:a9f6f3aea58f 258 }
roving99 0:a9f6f3aea58f 259 return r;
roving99 0:a9f6f3aea58f 260 }
roving99 0:a9f6f3aea58f 261
roving99 0:a9f6f3aea58f 262 //=================================================================================
roving99 0:a9f6f3aea58f 263 // MAIN.
roving99 0:a9f6f3aea58f 264 // load IPL from sector 0 (128 bytes) to 0x2000 and execute.
roving99 0:a9f6f3aea58f 265 //
roving99 0:a9f6f3aea58f 266
roving99 0:a9f6f3aea58f 267 int main() {
roving99 0:a9f6f3aea58f 268 read_sector(&RAM[0x2000], 0, 0); // read in first sector, contains IPL.
roving99 0:a9f6f3aea58f 269 pc = 0x2000;
roving99 0:a9f6f3aea58f 270 sync_rpc();
roving99 0:a9f6f3aea58f 271 while(1) {
roving99 0:a9f6f3aea58f 272 function[RAM[pc]]();
roving99 0:a9f6f3aea58f 273 }
roving99 0:a9f6f3aea58f 274 }
roving99 0:a9f6f3aea58f 275
roving99 0:a9f6f3aea58f 276 //=================================================================================
roving99 0:a9f6f3aea58f 277 // FETCH operations.
roving99 0:a9f6f3aea58f 278 // fetch registers or memory contents into op registers ahead of an operation.
roving99 0:a9f6f3aea58f 279
roving99 0:a9f6f3aea58f 280 void FETCH_NOP() {}
roving99 0:a9f6f3aea58f 281
roving99 0:a9f6f3aea58f 282 void FETCH_A() { opl = rA; }
roving99 0:a9f6f3aea58f 283 void FETCH_B() { opl = rB; }
roving99 0:a9f6f3aea58f 284 void FETCH_C() { opl = rC; }
roving99 0:a9f6f3aea58f 285 void FETCH_D() { opl = rD; }
roving99 0:a9f6f3aea58f 286 void FETCH_E() { opl = rE; }
roving99 0:a9f6f3aea58f 287 void FETCH_H() { opl = rH; }
roving99 0:a9f6f3aea58f 288 void FETCH_L() { opl = rL; }
roving99 0:a9f6f3aea58f 289
roving99 0:a9f6f3aea58f 290 void FETCH_AF() { opl = rF; oph = rA; } // Assumes flags are correct!!
roving99 0:a9f6f3aea58f 291 void FETCH_BC() { opl = rC; oph = rB; }
roving99 0:a9f6f3aea58f 292 void FETCH_DE() { opl = rE; oph = rD; }
roving99 0:a9f6f3aea58f 293 void FETCH_HL() { opl = rL; oph = rH; }
roving99 0:a9f6f3aea58f 294 void FETCH_SP() { opl = rSPL; oph = rSPH; }
roving99 0:a9f6f3aea58f 295
roving99 0:a9f6f3aea58f 296 void FETCH_DIR8() { opl = RAM[pc++]; sync_rpc(); }
roving99 0:a9f6f3aea58f 297 void FETCH_DIR16() { opl = RAM[pc++]; oph = RAM[pc++]; sync_rpc(); }
roving99 0:a9f6f3aea58f 298 void FETCH_RST() { opl = RAM[pc]&0x38; oph = 0; }
roving99 0:a9f6f3aea58f 299
roving99 0:a9f6f3aea58f 300 void FETCH_MBC() { opl = RAM[rB<<8+rC]; }
roving99 0:a9f6f3aea58f 301 void FETCH_MDE() { opl = RAM[rD<<8+rE]; }
roving99 0:a9f6f3aea58f 302 void FETCH_MHL() { opl = RAM[rH<<8+rL]; }
roving99 0:a9f6f3aea58f 303 void FETCH_MSP() { opl = RAM[rSPH<<8+rSPL]; }
roving99 0:a9f6f3aea58f 304
roving99 0:a9f6f3aea58f 305 //=================================================================================
roving99 0:a9f6f3aea58f 306 // STORE operations.
roving99 0:a9f6f3aea58f 307 // store op to registers or memory locations after operation.
roving99 0:a9f6f3aea58f 308
roving99 0:a9f6f3aea58f 309 void STORE_NOP() {};
roving99 0:a9f6f3aea58f 310
roving99 0:a9f6f3aea58f 311 void STORE_A() { rA = opl; }
roving99 0:a9f6f3aea58f 312 void STORE_B() { rB = opl; }
roving99 0:a9f6f3aea58f 313 void STORE_C() { rC = opl; }
roving99 0:a9f6f3aea58f 314 void STORE_D() { rD = opl; }
roving99 0:a9f6f3aea58f 315 void STORE_E() { rE = opl; }
roving99 0:a9f6f3aea58f 316 void STORE_H() { rH = opl; }
roving99 0:a9f6f3aea58f 317 void STORE_L() { rL = opl; }
roving99 0:a9f6f3aea58f 318
roving99 0:a9f6f3aea58f 319 void STORE_AF() { rF = opl; rA = oph; } // Assumes flags are correct!!
roving99 0:a9f6f3aea58f 320 void STORE_BC() { rC = opl; rB = oph; }
roving99 0:a9f6f3aea58f 321 void STORE_DE() { rE = opl; rD = oph; }
roving99 0:a9f6f3aea58f 322 void STORE_HL() { rL = opl; rH = oph; }
roving99 0:a9f6f3aea58f 323 void STORE_SP() { rSPL = opl; rSPH = oph; }
roving99 0:a9f6f3aea58f 324
roving99 0:a9f6f3aea58f 325 void STORE_MBC() { RAM[rB<<8+rC] = opl; }
roving99 0:a9f6f3aea58f 326 void STORE_MDE() { RAM[rD<<8+rE] = opl; }
roving99 0:a9f6f3aea58f 327 void STORE_MHL() { RAM[rH<<8+rL] = opl; }
roving99 0:a9f6f3aea58f 328
roving99 0:a9f6f3aea58f 329 void STORE_AM() { RAM[opl + oph<<8] = rA; }
roving99 0:a9f6f3aea58f 330
roving99 0:a9f6f3aea58f 331 void STORE_PC() { rPCL = opl; rPCH = oph; pc = opl+(oph<<8); }
roving99 0:a9f6f3aea58f 332 void STORE_CALL(){ sync_rpc(); push(rPCH, rPCL); rPCL = opl; rPCH = oph; pc = rPCH<<8 + rPCL; }
roving99 0:a9f6f3aea58f 333 void STORE_RET() { pc = pop(); sync_rpc(); }
roving99 0:a9f6f3aea58f 334 void STORE_MSP() { sp = (rSPH<<8)+rSPL; RAM[sp] = opl; RAM[sp+1] = oph; }
roving99 0:a9f6f3aea58f 335
roving99 0:a9f6f3aea58f 336 //=================================================================================
roving99 0:a9f6f3aea58f 337 // OPerations.
roving99 0:a9f6f3aea58f 338 // store op to registers or memory locations after operation.
roving99 0:a9f6f3aea58f 339
roving99 0:a9f6f3aea58f 340 void OP_NOP() {}
roving99 0:a9f6f3aea58f 341 void OP_INC() { op = opl; op++; set_flags(op,8); sync_op(); }
roving99 0:a9f6f3aea58f 342 void OP_DEC() { op = opl; op--; set_flags(op,8); sync_op(); }
roving99 0:a9f6f3aea58f 343 void OP_INC16() { op = opl + oph<<8; op++; sync_op(); } // no flags
roving99 0:a9f6f3aea58f 344 void OP_DEC16() { op = opl + oph<<8; op--; sync_op(); } // no flags
roving99 0:a9f6f3aea58f 345 void OP_RRC() { clear(FL_C); if (opl&0x01) set(FL_C); opl=(opl>>1); if ((rF>>FL_C)&0x01) opl = opl|0x80; }
roving99 0:a9f6f3aea58f 346 void OP_RLC() { clear(FL_C); if (opl&0x80) set(FL_C); opl=(opl<<1); if ((rF>>FL_C)&0x01) opl = opl|0x01; }
roving99 0:a9f6f3aea58f 347 void OP_RR() { temp = rF; clear(FL_C); if (opl&0x01) set(FL_C); opl= opl>>1; if ((temp>>FL_C)&0x01) opl = opl|0x80; }
roving99 0:a9f6f3aea58f 348 void OP_RL() { temp = rF; clear(FL_C); if (opl&0x80) set(FL_C); opl= opl<<1; if ((temp>>FL_C)&0x01) opl = opl|0x01; }
roving99 0:a9f6f3aea58f 349 void OP_ADDA() { op = opl; op = op + rA; set_flags(op,8); sync_op(); }
roving99 0:a9f6f3aea58f 350 void OP_ADCA() { op = opl; op = op + rA + (rF>>FL_C)&0x01; set_flags(op,8); sync_op(); }
roving99 0:a9f6f3aea58f 351 void OP_SUBFA() { op = rA - opl; set_flags(op,8); sync_op(); }
roving99 0:a9f6f3aea58f 352 void OP_SBCFA() { op = rA - opl -(rF>>FL_C)&0x01; set_flags(op,8); sync_op(); }
roving99 0:a9f6f3aea58f 353 void OP_ANDA() { opl = opl&rA; set_flags(opl,8); }
roving99 0:a9f6f3aea58f 354 void OP_ORA() { opl = opl|rA; set_flags(opl,8); }
roving99 0:a9f6f3aea58f 355 void OP_XORA() { opl = opl^rA; set_flags(opl,8); }
roving99 0:a9f6f3aea58f 356 void OP_ADDHL() { op = opl + oph<<8; op +=(rH<<8)+rL; set_flags(op, 16); }
roving99 0:a9f6f3aea58f 357 void OP_STHL() { op = opl + oph<<8; RAM[op] = rL; RAM[op+1] = rH; }
roving99 0:a9f6f3aea58f 358 void OP_RMEM16(){ temp = (rH<<8)+rL; opl = RAM[temp]; oph = RAM[temp+1]; }
roving99 0:a9f6f3aea58f 359 void OP_RMEM8() { temp = (rH<<8)+rL; opl = RAM[temp]; }
roving99 0:a9f6f3aea58f 360 void OP_SCF() { set(FL_C); } // set Carry
roving99 0:a9f6f3aea58f 361 void OP_CCF() { rF = rF^(1<<FL_C); } // compliement Carry
roving99 0:a9f6f3aea58f 362 void OP_CPL() { opl = !opl; rF = rF|(1<<FL_N|1<<FL_H); }
roving99 0:a9f6f3aea58f 363 void OP_PUSH16(){ sp = (rSPH<<8)+rSPL; RAM[--sp] = oph; RAM[--sp] = opl; sync_rsp(); }
roving99 0:a9f6f3aea58f 364 void OP_POP16() { sp = (rSPH<<8)+rSPL; opl = RAM[sp++]; oph = RAM[sp++]; sync_rsp(); }
roving99 0:a9f6f3aea58f 365 void OP_EXHL() { temp = rL; rL = opl; opl = temp; temp = rH; rH = oph; oph = temp; }
roving99 0:a9f6f3aea58f 366 void OP_IFNZ() { if (rF&(1<<FL_Z)) nostore = true; }
roving99 0:a9f6f3aea58f 367 void OP_IFZ() { if (!(rF&(1<<FL_Z))) nostore = true; }
roving99 0:a9f6f3aea58f 368 void OP_IFNC() { if (rF&(1<<FL_C)) nostore = true; }
roving99 0:a9f6f3aea58f 369 void OP_IFC() { if (!(rF&(1<<FL_C))) nostore = true; }
roving99 0:a9f6f3aea58f 370 void OP_IFPO() { if (!(rF&(1<<FL_P))) nostore = true; }
roving99 0:a9f6f3aea58f 371 void OP_IFPE() { if (rF&(1<<FL_P)) nostore = true; }
roving99 0:a9f6f3aea58f 372 void OP_IFP() { if (!(rF&(1<<FL_S))) nostore = true; }
roving99 0:a9f6f3aea58f 373 void OP_IFM() { if (rF&(1<<FL_S)) nostore = true; }
roving99 0:a9f6f3aea58f 374 void OP_OUTA() { out_command(opl); }
roving99 0:a9f6f3aea58f 375 void OP_INA() { rA = in_command(opl); }
roving99 0:a9f6f3aea58f 376 void OP_INV() { serial.printf("Invalid opcode at %04X : %02X.\n", pc, RAM[pc]); while(1); }
roving99 0:a9f6f3aea58f 377 void OP_DI() { OP_INV(); }
roving99 0:a9f6f3aea58f 378 void OP_EI() { OP_INV(); }
roving99 0:a9f6f3aea58f 379 void OP_DA() { OP_INV(); } // to implement!!
roving99 0:a9f6f3aea58f 380
roving99 0:a9f6f3aea58f 381 //=================================================================================
roving99 0:a9f6f3aea58f 382 // Operations broken down into fetch/op/store phases.
roving99 0:a9f6f3aea58f 383 //
roving99 0:a9f6f3aea58f 384
roving99 0:a9f6f3aea58f 385 void do_op_00() { FETCH_NOP(); OP_NOP(); STORE_NOP(); } // 00 NOP
roving99 0:a9f6f3aea58f 386 void do_op_01() { FETCH_DIR16(); OP_NOP(); STORE_BC(); } // 01 nnnnLDBC,nn
roving99 0:a9f6f3aea58f 387 void do_op_02() { FETCH_A(); OP_NOP(); STORE_MBC(); } // 02 LD(BC),A
roving99 0:a9f6f3aea58f 388 void do_op_03() { FETCH_BC(); OP_INC16(); STORE_BC(); } // 03 INCBC
roving99 0:a9f6f3aea58f 389 void do_op_04() { FETCH_B(); OP_INC(); STORE_B(); } // 04 INCB
roving99 0:a9f6f3aea58f 390 void do_op_05() { FETCH_B(); OP_DEC(); STORE_B(); } // 05 DECB
roving99 0:a9f6f3aea58f 391 void do_op_06() { FETCH_DIR8(); OP_NOP(); STORE_B(); } // 06 nnLDB,n
roving99 0:a9f6f3aea58f 392 void do_op_07() { FETCH_A(); OP_RLC(); STORE_A(); } // 07 RLCA
roving99 0:a9f6f3aea58f 393 void do_op_08() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 08 EXAF,AF'(Z80)
roving99 0:a9f6f3aea58f 394 void do_op_09() { FETCH_BC(); OP_ADDHL(); STORE_HL(); } // 09 ADDHL,BC
roving99 0:a9f6f3aea58f 395 void do_op_0A() { FETCH_MBC(); OP_NOP(); STORE_A(); } // 0A LDA,(BC)
roving99 0:a9f6f3aea58f 396 void do_op_0B() { FETCH_BC(); OP_DEC16(); STORE_BC(); } // 0B DECBC
roving99 0:a9f6f3aea58f 397 void do_op_0C() { FETCH_C(); OP_INC(); STORE_C(); } // 0C INCC
roving99 0:a9f6f3aea58f 398 void do_op_0D() { FETCH_C(); OP_DEC(); STORE_C(); } // 0D DECC
roving99 0:a9f6f3aea58f 399 void do_op_0E() { FETCH_DIR8(); OP_NOP(); STORE_C(); } // 0E nnLDC,n
roving99 0:a9f6f3aea58f 400 void do_op_0F() { FETCH_A(); OP_RRC(); STORE_A(); } // 0F RRCA
roving99 0:a9f6f3aea58f 401 void do_op_10() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 10 ooDJNZo(Z80)
roving99 0:a9f6f3aea58f 402 void do_op_11() { FETCH_DIR16(); OP_NOP(); STORE_DE(); } // 11 nnnnLDDE,nn
roving99 0:a9f6f3aea58f 403 void do_op_12() { FETCH_A(); OP_NOP(); STORE_MDE(); } // 12 LD(DE),A
roving99 0:a9f6f3aea58f 404 void do_op_13() { FETCH_DE(); OP_INC16(); STORE_DE(); } // 13 INCDE
roving99 0:a9f6f3aea58f 405 void do_op_14() { FETCH_D(); OP_INC(); STORE_D(); } // 14 INCD
roving99 0:a9f6f3aea58f 406 void do_op_15() { FETCH_D(); OP_DEC(); STORE_D(); } // 15 DECD
roving99 0:a9f6f3aea58f 407 void do_op_16() { FETCH_DIR8(); OP_NOP(); STORE_D(); } // 16 nnLDD,n
roving99 0:a9f6f3aea58f 408 void do_op_17() { FETCH_A(); OP_RL(); STORE_A(); } // 17 RLA
roving99 0:a9f6f3aea58f 409 void do_op_18() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 18 ooJRo(Z80)
roving99 0:a9f6f3aea58f 410 void do_op_19() { FETCH_DE(); OP_ADDHL(); STORE_HL(); } // 19 ADDHL,DE
roving99 0:a9f6f3aea58f 411 void do_op_1A() { FETCH_MDE(); OP_NOP(); STORE_A(); } // 1A LDA,(DE)
roving99 0:a9f6f3aea58f 412 void do_op_1B() { FETCH_DE(); OP_DEC16(); STORE_DE(); } // 1B DECDE
roving99 0:a9f6f3aea58f 413 void do_op_1C() { FETCH_E(); OP_INC(); STORE_E(); } // 1C INCE
roving99 0:a9f6f3aea58f 414 void do_op_1D() { FETCH_E(); OP_DEC(); STORE_E(); } // 1D DECE
roving99 0:a9f6f3aea58f 415 void do_op_1E() { FETCH_DIR8(); OP_NOP(); STORE_E(); } // 1E nnLDE,n
roving99 0:a9f6f3aea58f 416 void do_op_1F() { FETCH_A(); OP_RR(); STORE_A(); } // 1F RRA
roving99 0:a9f6f3aea58f 417 void do_op_20() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 20 ooJRNZ,o(Z80)
roving99 0:a9f6f3aea58f 418 void do_op_21() { FETCH_DIR16(); OP_NOP(); STORE_HL(); } // 21 nnnnLDHL,nn
roving99 0:a9f6f3aea58f 419 void do_op_22() { FETCH_DIR16(); OP_STHL(); STORE_NOP(); } // 22 nnnnLD(nn),HL
roving99 0:a9f6f3aea58f 420 void do_op_23() { FETCH_HL(); OP_INC16(); STORE_HL(); } // 23 INCHL
roving99 0:a9f6f3aea58f 421 void do_op_24() { FETCH_H(); OP_INC(); STORE_H(); } // 24 INCH
roving99 0:a9f6f3aea58f 422 void do_op_25() { FETCH_H(); OP_DEC(); STORE_H(); } // 25 DECH
roving99 0:a9f6f3aea58f 423 void do_op_26() { FETCH_DIR8(); OP_NOP(); STORE_H(); } // 26 nnLDH,n
roving99 0:a9f6f3aea58f 424 void do_op_27() { FETCH_A(); OP_DA(); STORE_A(); } // 27 DAA
roving99 0:a9f6f3aea58f 425 void do_op_28() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 28 ooJRZ,o(Z80)
roving99 0:a9f6f3aea58f 426 void do_op_29() { FETCH_HL(); OP_ADDHL(); STORE_HL(); } // 29 ADDHL,HL
roving99 0:a9f6f3aea58f 427 void do_op_2A() { FETCH_DIR16(); OP_RMEM16(); STORE_HL(); } // 2A nnnnLDHL,(nn)
roving99 0:a9f6f3aea58f 428 void do_op_2B() { FETCH_HL(); OP_DEC16(); STORE_HL(); } // 2B DECHL
roving99 0:a9f6f3aea58f 429 void do_op_2C() { FETCH_L(); OP_INC(); STORE_L(); } // 2C INCL
roving99 0:a9f6f3aea58f 430 void do_op_2D() { FETCH_L(); OP_DEC(); STORE_L(); } // 2D DECL
roving99 0:a9f6f3aea58f 431 void do_op_2E() { FETCH_DIR8(); OP_NOP(); STORE_L(); } // 2E nnLDL,n
roving99 0:a9f6f3aea58f 432 void do_op_2F() { FETCH_A(); OP_CPL(); STORE_A(); } // 2F CPL
roving99 0:a9f6f3aea58f 433 void do_op_30() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 30 ooJRNC,o(Z80)
roving99 0:a9f6f3aea58f 434 void do_op_31() { FETCH_DIR16(); OP_NOP(); STORE_SP(); } // 31 nnnnLDSP,nn
roving99 0:a9f6f3aea58f 435 void do_op_32() { FETCH_DIR16(); OP_NOP(); STORE_AM(); } // 32 nnnnLD(nn),A
roving99 0:a9f6f3aea58f 436 void do_op_33() { FETCH_SP(); OP_INC16(); STORE_SP(); } // 33 INCSP
roving99 0:a9f6f3aea58f 437 void do_op_34() { FETCH_MHL(); OP_INC(); STORE_MHL(); } // 34 INC(HL)
roving99 0:a9f6f3aea58f 438 void do_op_35() { FETCH_MHL(); OP_DEC(); STORE_MHL(); } // 35 DEC(HL)
roving99 0:a9f6f3aea58f 439 void do_op_36() { FETCH_DIR8(); OP_NOP(); STORE_MHL(); } // 36 nnLD(HL),n
roving99 0:a9f6f3aea58f 440 void do_op_37() { FETCH_NOP(); OP_SCF(); STORE_NOP(); } // 37 SCF
roving99 0:a9f6f3aea58f 441 void do_op_38() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 38 ooJRC,o(Z80)
roving99 0:a9f6f3aea58f 442 void do_op_39() { FETCH_SP(); OP_ADDHL(); STORE_HL(); } // 39 ADDHL,SP
roving99 0:a9f6f3aea58f 443 void do_op_3A() { FETCH_DIR16(); OP_RMEM8(); STORE_A(); } // 3A nnnnLDA,(nn)
roving99 0:a9f6f3aea58f 444 void do_op_3B() { FETCH_SP(); OP_DEC16(); STORE_SP(); } // 3B DECSP
roving99 0:a9f6f3aea58f 445 void do_op_3C() { FETCH_A(); OP_INC(); STORE_A(); } // 3C INCA
roving99 0:a9f6f3aea58f 446 void do_op_3D() { FETCH_A(); OP_DEC(); STORE_A(); } // 3D DECA
roving99 0:a9f6f3aea58f 447 void do_op_3E() { FETCH_DIR8(); OP_NOP(); STORE_A(); } // 3E nnLDA,n
roving99 0:a9f6f3aea58f 448 void do_op_3F() { FETCH_NOP(); OP_CCF(); STORE_NOP(); } // 3F CCF(ComplementCarryFlag,gvd)
roving99 0:a9f6f3aea58f 449 void do_op_40() { FETCH_B(); OP_NOP(); STORE_B(); } // 40 LDB,r
roving99 0:a9f6f3aea58f 450 void do_op_41() { FETCH_C(); OP_NOP(); STORE_B(); } // 41 LDB,r
roving99 0:a9f6f3aea58f 451 void do_op_42() { FETCH_D(); OP_NOP(); STORE_B(); } // 42 LDB,r
roving99 0:a9f6f3aea58f 452 void do_op_43() { FETCH_E(); OP_NOP(); STORE_B(); } // 43 LDB,r
roving99 0:a9f6f3aea58f 453 void do_op_44() { FETCH_H(); OP_NOP(); STORE_B(); } // 44 LDB,r
roving99 0:a9f6f3aea58f 454 void do_op_45() { FETCH_L(); OP_NOP(); STORE_B(); } // 45 LDB,r
roving99 0:a9f6f3aea58f 455 void do_op_46() { FETCH_MHL(); OP_NOP(); STORE_B(); } // 46 LDB,r
roving99 0:a9f6f3aea58f 456 void do_op_47() { FETCH_A(); OP_NOP(); STORE_B(); } // 47 LDB,r
roving99 0:a9f6f3aea58f 457 void do_op_48() { FETCH_B(); OP_NOP(); STORE_C(); } // 48 LDC,r
roving99 0:a9f6f3aea58f 458 void do_op_49() { FETCH_C(); OP_NOP(); STORE_C(); } // 49 LDC,r
roving99 0:a9f6f3aea58f 459 void do_op_4A() { FETCH_D(); OP_NOP(); STORE_C(); } // 4A LDC,r
roving99 0:a9f6f3aea58f 460 void do_op_4B() { FETCH_E(); OP_NOP(); STORE_C(); } // 4B LDC,r
roving99 0:a9f6f3aea58f 461 void do_op_4C() { FETCH_H(); OP_NOP(); STORE_C(); } // 4C LDC,r
roving99 0:a9f6f3aea58f 462 void do_op_4D() { FETCH_L(); OP_NOP(); STORE_C(); } // 4D LDC,r
roving99 0:a9f6f3aea58f 463 void do_op_4E() { FETCH_MHL(); OP_NOP(); STORE_C(); } // 4E LDC,r
roving99 0:a9f6f3aea58f 464 void do_op_4F() { FETCH_A(); OP_NOP(); STORE_C(); } // 4F LDC,r
roving99 0:a9f6f3aea58f 465 void do_op_50() { FETCH_B(); OP_NOP(); STORE_D(); } // 50 LDD,r
roving99 0:a9f6f3aea58f 466 void do_op_51() { FETCH_C(); OP_NOP(); STORE_D(); } // 51 LDD,r
roving99 0:a9f6f3aea58f 467 void do_op_52() { FETCH_D(); OP_NOP(); STORE_D(); } // 52 LDD,r
roving99 0:a9f6f3aea58f 468 void do_op_53() { FETCH_E(); OP_NOP(); STORE_D(); } // 53 LDD,r
roving99 0:a9f6f3aea58f 469 void do_op_54() { FETCH_H(); OP_NOP(); STORE_D(); } // 54 LDD,r
roving99 0:a9f6f3aea58f 470 void do_op_55() { FETCH_L(); OP_NOP(); STORE_D(); } // 55 LDD,r
roving99 0:a9f6f3aea58f 471 void do_op_56() { FETCH_MHL(); OP_NOP(); STORE_D(); } // 56 LDD,r
roving99 0:a9f6f3aea58f 472 void do_op_57() { FETCH_A(); OP_NOP(); STORE_D(); } // 57 LDD,r
roving99 0:a9f6f3aea58f 473 void do_op_58() { FETCH_B(); OP_NOP(); STORE_E(); } // 58 LDE,r
roving99 0:a9f6f3aea58f 474 void do_op_59() { FETCH_C(); OP_NOP(); STORE_E(); } // 59 LDE,r
roving99 0:a9f6f3aea58f 475 void do_op_5A() { FETCH_D(); OP_NOP(); STORE_E(); } // 5A LDE,r
roving99 0:a9f6f3aea58f 476 void do_op_5B() { FETCH_E(); OP_NOP(); STORE_E(); } // 5B LDE,r
roving99 0:a9f6f3aea58f 477 void do_op_5C() { FETCH_H(); OP_NOP(); STORE_E(); } // 5C LDE,r
roving99 0:a9f6f3aea58f 478 void do_op_5D() { FETCH_L(); OP_NOP(); STORE_E(); } // 5D LDE,r
roving99 0:a9f6f3aea58f 479 void do_op_5E() { FETCH_MHL(); OP_NOP(); STORE_E(); } // 5E LDE,r
roving99 0:a9f6f3aea58f 480 void do_op_5F() { FETCH_A(); OP_NOP(); STORE_E(); } // 5F LDE,r
roving99 0:a9f6f3aea58f 481 void do_op_60() { FETCH_B(); OP_NOP(); STORE_H(); } // 60 LDH,r
roving99 0:a9f6f3aea58f 482 void do_op_61() { FETCH_C(); OP_NOP(); STORE_H(); } // 61 LDH,r
roving99 0:a9f6f3aea58f 483 void do_op_62() { FETCH_D(); OP_NOP(); STORE_H(); } // 62 LDH,r
roving99 0:a9f6f3aea58f 484 void do_op_63() { FETCH_E(); OP_NOP(); STORE_H(); } // 63 LDH,r
roving99 0:a9f6f3aea58f 485 void do_op_64() { FETCH_H(); OP_NOP(); STORE_H(); } // 64 LDH,r
roving99 0:a9f6f3aea58f 486 void do_op_65() { FETCH_L(); OP_NOP(); STORE_H(); } // 65 LDH,r
roving99 0:a9f6f3aea58f 487 void do_op_66() { FETCH_MHL(); OP_NOP(); STORE_H(); } // 66 LDH,r
roving99 0:a9f6f3aea58f 488 void do_op_67() { FETCH_A(); OP_NOP(); STORE_H(); } // 67 LDH,r
roving99 0:a9f6f3aea58f 489 void do_op_68() { FETCH_B(); OP_NOP(); STORE_L(); } // 68 LDL,r
roving99 0:a9f6f3aea58f 490 void do_op_69() { FETCH_C(); OP_NOP(); STORE_L(); } // 69 LDL,r
roving99 0:a9f6f3aea58f 491 void do_op_6A() { FETCH_D(); OP_NOP(); STORE_L(); } // 6A LDL,r
roving99 0:a9f6f3aea58f 492 void do_op_6B() { FETCH_E(); OP_NOP(); STORE_L(); } // 6B LDL,r
roving99 0:a9f6f3aea58f 493 void do_op_6C() { FETCH_H(); OP_NOP(); STORE_L(); } // 6C LDL,r
roving99 0:a9f6f3aea58f 494 void do_op_6D() { FETCH_L(); OP_NOP(); STORE_L(); } // 6D LDL,r
roving99 0:a9f6f3aea58f 495 void do_op_6E() { FETCH_MHL(); OP_NOP(); STORE_L(); } // 6E LDL,r
roving99 0:a9f6f3aea58f 496 void do_op_6F() { FETCH_A(); OP_NOP(); STORE_L(); } // 6F LDL,r
roving99 0:a9f6f3aea58f 497 void do_op_70() { FETCH_B(); OP_NOP(); STORE_MHL(); } // 70 LD(HL),r
roving99 0:a9f6f3aea58f 498 void do_op_71() { FETCH_C(); OP_NOP(); STORE_MHL(); } // 71 LD(HL),r
roving99 0:a9f6f3aea58f 499 void do_op_72() { FETCH_D(); OP_NOP(); STORE_MHL(); } // 72 LD(HL),r
roving99 0:a9f6f3aea58f 500 void do_op_73() { FETCH_E(); OP_NOP(); STORE_MHL(); } // 73 LD(HL),r
roving99 0:a9f6f3aea58f 501 void do_op_74() { FETCH_H(); OP_NOP(); STORE_MHL(); } // 74 LD(HL),r
roving99 0:a9f6f3aea58f 502 void do_op_75() { FETCH_L(); OP_NOP(); STORE_MHL(); } // 75 LD(HL),r
roving99 0:a9f6f3aea58f 503 void do_op_76() { FETCH_NOP(); OP_NOP(); STORE_NOP(); } // 76 HALT
roving99 0:a9f6f3aea58f 504 void do_op_77() { FETCH_A(); OP_NOP(); STORE_MHL(); } // 77 LD(HL),r
roving99 0:a9f6f3aea58f 505 void do_op_78() { FETCH_B(); OP_NOP(); STORE_A(); } // 78 LDA,r
roving99 0:a9f6f3aea58f 506 void do_op_79() { FETCH_C(); OP_NOP(); STORE_A(); } // 79 LDA,r
roving99 0:a9f6f3aea58f 507 void do_op_7A() { FETCH_D(); OP_NOP(); STORE_A(); } // 7A LDA,r
roving99 0:a9f6f3aea58f 508 void do_op_7B() { FETCH_E(); OP_NOP(); STORE_A(); } // 7B LDA,r
roving99 0:a9f6f3aea58f 509 void do_op_7C() { FETCH_H(); OP_NOP(); STORE_A(); } // 7C LDA,r
roving99 0:a9f6f3aea58f 510 void do_op_7D() { FETCH_L(); OP_NOP(); STORE_A(); } // 7D LDA,r
roving99 0:a9f6f3aea58f 511 void do_op_7E() { FETCH_MHL(); OP_NOP(); STORE_A(); } // 7E LDA,r
roving99 0:a9f6f3aea58f 512 void do_op_7F() { FETCH_A(); OP_NOP(); STORE_A(); } // 7F LDA,r
roving99 0:a9f6f3aea58f 513 void do_op_80() { FETCH_B(); OP_ADDA(); STORE_A(); } // 80 ADDA,r
roving99 0:a9f6f3aea58f 514 void do_op_81() { FETCH_C(); OP_ADDA(); STORE_A(); } // 81 ADDA,r
roving99 0:a9f6f3aea58f 515 void do_op_82() { FETCH_D(); OP_ADDA(); STORE_A(); } // 82 ADDA,r
roving99 0:a9f6f3aea58f 516 void do_op_83() { FETCH_E(); OP_ADDA(); STORE_A(); } // 83 ADDA,r
roving99 0:a9f6f3aea58f 517 void do_op_84() { FETCH_H(); OP_ADDA(); STORE_A(); } // 84 ADDA,r
roving99 0:a9f6f3aea58f 518 void do_op_85() { FETCH_L(); OP_ADDA(); STORE_A(); } // 85 ADDA,r
roving99 0:a9f6f3aea58f 519 void do_op_86() { FETCH_MHL(); OP_ADDA(); STORE_A(); } // 86 ADDA,r
roving99 0:a9f6f3aea58f 520 void do_op_87() { FETCH_A(); OP_ADDA(); STORE_A(); } // 87 ADDA,r
roving99 0:a9f6f3aea58f 521 void do_op_88() { FETCH_B(); OP_ADCA(); STORE_A(); } // 88 ADCA,r
roving99 0:a9f6f3aea58f 522 void do_op_89() { FETCH_C(); OP_ADCA(); STORE_A(); } // 89 ADCA,r
roving99 0:a9f6f3aea58f 523 void do_op_8A() { FETCH_D(); OP_ADCA(); STORE_A(); } // 8A ADCA,r
roving99 0:a9f6f3aea58f 524 void do_op_8B() { FETCH_E(); OP_ADCA(); STORE_A(); } // 8B ADCA,r
roving99 0:a9f6f3aea58f 525 void do_op_8C() { FETCH_H(); OP_ADCA(); STORE_A(); } // 8C ADCA,r
roving99 0:a9f6f3aea58f 526 void do_op_8D() { FETCH_L(); OP_ADCA(); STORE_A(); } // 8D ADCA,r
roving99 0:a9f6f3aea58f 527 void do_op_8E() { FETCH_MHL(); OP_ADCA(); STORE_A(); } // 8E ADCA,r
roving99 0:a9f6f3aea58f 528 void do_op_8F() { FETCH_A(); OP_ADCA(); STORE_A(); } // 8F ADCA,r
roving99 0:a9f6f3aea58f 529 void do_op_90() { FETCH_B(); OP_SUBFA(); STORE_A(); } // 90 SUBA,r
roving99 0:a9f6f3aea58f 530 void do_op_91() { FETCH_C(); OP_SUBFA(); STORE_A(); } // 91 SUBA,r
roving99 0:a9f6f3aea58f 531 void do_op_92() { FETCH_D(); OP_SUBFA(); STORE_A(); } // 92 SUBA,r
roving99 0:a9f6f3aea58f 532 void do_op_93() { FETCH_E(); OP_SUBFA(); STORE_A(); } // 93 SUBA,r
roving99 0:a9f6f3aea58f 533 void do_op_94() { FETCH_H(); OP_SUBFA(); STORE_A(); } // 94 SUBA,r
roving99 0:a9f6f3aea58f 534 void do_op_95() { FETCH_L(); OP_SUBFA(); STORE_A(); } // 95 SUBA,r
roving99 0:a9f6f3aea58f 535 void do_op_96() { FETCH_MHL(); OP_SUBFA(); STORE_A(); } // 96 SUBA,r
roving99 0:a9f6f3aea58f 536 void do_op_97() { FETCH_A(); OP_SUBFA(); STORE_A(); } // 97 SUBA,r
roving99 0:a9f6f3aea58f 537 void do_op_98() { FETCH_B(); OP_SBCFA(); STORE_A(); } // 98 SBCA,r
roving99 0:a9f6f3aea58f 538 void do_op_99() { FETCH_C(); OP_SBCFA(); STORE_A(); } // 99 SBCA,r
roving99 0:a9f6f3aea58f 539 void do_op_9A() { FETCH_D(); OP_SBCFA(); STORE_A(); } // 9A SBCA,r
roving99 0:a9f6f3aea58f 540 void do_op_9B() { FETCH_E(); OP_SBCFA(); STORE_A(); } // 9B SBCA,r
roving99 0:a9f6f3aea58f 541 void do_op_9C() { FETCH_H(); OP_SBCFA(); STORE_A(); } // 9C SBCA,r
roving99 0:a9f6f3aea58f 542 void do_op_9D() { FETCH_L(); OP_SBCFA(); STORE_A(); } // 9D SBCA,r
roving99 0:a9f6f3aea58f 543 void do_op_9E() { FETCH_MHL(); OP_SBCFA(); STORE_A(); } // 9E SBCA,r
roving99 0:a9f6f3aea58f 544 void do_op_9F() { FETCH_A(); OP_SBCFA(); STORE_A(); } // 9F SBCA,r
roving99 0:a9f6f3aea58f 545 void do_op_A0() { FETCH_B(); OP_ANDA(); STORE_A(); } // A0 ANDA,r
roving99 0:a9f6f3aea58f 546 void do_op_A1() { FETCH_C(); OP_ANDA(); STORE_A(); } // A1 ANDA,r
roving99 0:a9f6f3aea58f 547 void do_op_A2() { FETCH_D(); OP_ANDA(); STORE_A(); } // A2 ANDA,r
roving99 0:a9f6f3aea58f 548 void do_op_A3() { FETCH_E(); OP_ANDA(); STORE_A(); } // A3 ANDA,r
roving99 0:a9f6f3aea58f 549 void do_op_A4() { FETCH_H(); OP_ANDA(); STORE_A(); } // A4 ANDA,r
roving99 0:a9f6f3aea58f 550 void do_op_A5() { FETCH_L(); OP_ANDA(); STORE_A(); } // A5 ANDA,r
roving99 0:a9f6f3aea58f 551 void do_op_A6() { FETCH_MHL(); OP_ANDA(); STORE_A(); } // A6 ANDA,r
roving99 0:a9f6f3aea58f 552 void do_op_A7() { FETCH_A(); OP_ANDA(); STORE_A(); } // A7 ANDA,r
roving99 0:a9f6f3aea58f 553 void do_op_A8() { FETCH_B(); OP_XORA(); STORE_A(); } // A8 XORA,r
roving99 0:a9f6f3aea58f 554 void do_op_A9() { FETCH_C(); OP_XORA(); STORE_A(); } // A9 XORA,r
roving99 0:a9f6f3aea58f 555 void do_op_AA() { FETCH_D(); OP_XORA(); STORE_A(); } // AA XORA,r
roving99 0:a9f6f3aea58f 556 void do_op_AB() { FETCH_E(); OP_XORA(); STORE_A(); } // AB XORA,r
roving99 0:a9f6f3aea58f 557 void do_op_AC() { FETCH_H(); OP_XORA(); STORE_A(); } // AC XORA,r
roving99 0:a9f6f3aea58f 558 void do_op_AD() { FETCH_L(); OP_XORA(); STORE_A(); } // AD XORA,r
roving99 0:a9f6f3aea58f 559 void do_op_AE() { FETCH_MHL(); OP_XORA(); STORE_A(); } // AE XORA,r
roving99 0:a9f6f3aea58f 560 void do_op_AF() { FETCH_A(); OP_XORA(); STORE_A(); } // AF XORA,r
roving99 0:a9f6f3aea58f 561 void do_op_B0() { FETCH_B(); OP_ORA(); STORE_A(); } // B0 ORA,r
roving99 0:a9f6f3aea58f 562 void do_op_B1() { FETCH_C(); OP_ORA(); STORE_A(); } // B1 ORA,r
roving99 0:a9f6f3aea58f 563 void do_op_B2() { FETCH_D(); OP_ORA(); STORE_A(); } // B2 ORA,r
roving99 0:a9f6f3aea58f 564 void do_op_B3() { FETCH_E(); OP_ORA(); STORE_A(); } // B3 ORA,r
roving99 0:a9f6f3aea58f 565 void do_op_B4() { FETCH_H(); OP_ORA(); STORE_A(); } // B4 ORA,r
roving99 0:a9f6f3aea58f 566 void do_op_B5() { FETCH_L(); OP_ORA(); STORE_A(); } // B5 ORA,r
roving99 0:a9f6f3aea58f 567 void do_op_B6() { FETCH_MHL(); OP_ORA(); STORE_A(); } // B6 ORA,r
roving99 0:a9f6f3aea58f 568 void do_op_B7() { FETCH_A(); OP_ORA(); STORE_A(); } // B7 ORA,r
roving99 0:a9f6f3aea58f 569 void do_op_B8() { FETCH_B(); OP_SUBFA(); STORE_NOP(); } // B8 CPA,r
roving99 0:a9f6f3aea58f 570 void do_op_B9() { FETCH_C(); OP_SUBFA(); STORE_NOP(); } // B9 CPA,r
roving99 0:a9f6f3aea58f 571 void do_op_BA() { FETCH_D(); OP_SUBFA(); STORE_NOP(); } // BA CPA,r
roving99 0:a9f6f3aea58f 572 void do_op_BB() { FETCH_E(); OP_SUBFA(); STORE_NOP(); } // BB CPA,r
roving99 0:a9f6f3aea58f 573 void do_op_BC() { FETCH_H(); OP_SUBFA(); STORE_NOP(); } // BC CPA,r
roving99 0:a9f6f3aea58f 574 void do_op_BD() { FETCH_L(); OP_SUBFA(); STORE_NOP(); } // BD CPA,r
roving99 0:a9f6f3aea58f 575 void do_op_BE() { FETCH_MHL(); OP_SUBFA(); STORE_NOP(); } // BE CPA,r
roving99 0:a9f6f3aea58f 576 void do_op_BF() { FETCH_A(); OP_SUBFA(); STORE_NOP(); } // BF CPA,r
roving99 0:a9f6f3aea58f 577 void do_op_C0() { FETCH_NOP(); OP_IFNZ(); STORE_RET(); } // C0 RETNZ
roving99 0:a9f6f3aea58f 578 void do_op_C1() { FETCH_NOP(); OP_POP16(); STORE_BC(); } // C1 POPBC
roving99 0:a9f6f3aea58f 579 void do_op_C2() { FETCH_DIR16(); OP_IFNZ(); STORE_PC(); } // C2 nnnnJPNZ,nn
roving99 0:a9f6f3aea58f 580 void do_op_C3() { FETCH_DIR16(); OP_NOP(); STORE_PC(); } // C3 nnnnJPnn
roving99 0:a9f6f3aea58f 581 void do_op_C4() { FETCH_DIR16(); OP_IFNZ(); STORE_CALL(); } // C4 nnnnCALLNZ,nn
roving99 0:a9f6f3aea58f 582 void do_op_C5() { FETCH_BC(); OP_PUSH16(); STORE_NOP(); } // C5 PUSHBC
roving99 0:a9f6f3aea58f 583 void do_op_C6() { FETCH_DIR8(); OP_ADDA(); STORE_A(); } // C6 nnADDA,n
roving99 0:a9f6f3aea58f 584 void do_op_C7() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // C7 RST0
roving99 0:a9f6f3aea58f 585 void do_op_C8() { FETCH_NOP(); OP_IFZ(); STORE_RET(); } // C8 RETZ
roving99 0:a9f6f3aea58f 586 void do_op_C9() { FETCH_NOP(); OP_NOP(); STORE_RET(); } // C9 RET
roving99 0:a9f6f3aea58f 587 void do_op_CA() { FETCH_DIR16(); OP_IFZ(); STORE_PC(); } // CA nnnnJPZ,nn
roving99 0:a9f6f3aea58f 588 void do_op_CB() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // CB (Z80specific)
roving99 0:a9f6f3aea58f 589 void do_op_CC() { FETCH_DIR16(); OP_IFZ(); STORE_CALL(); } // CC nnnnCALLZ,nn
roving99 0:a9f6f3aea58f 590 void do_op_CD() { FETCH_DIR16(); OP_NOP(); STORE_CALL(); } // CD nnnnCALLnn
roving99 0:a9f6f3aea58f 591 void do_op_CE() { FETCH_DIR8(); OP_ADCA(); STORE_A(); } // CE nnADCA,n
roving99 0:a9f6f3aea58f 592 void do_op_CF() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // CF RST8H
roving99 0:a9f6f3aea58f 593 void do_op_D0() { FETCH_NOP(); OP_IFNC(); STORE_RET(); } // D0 RETNC
roving99 0:a9f6f3aea58f 594 void do_op_D1() { FETCH_NOP(); OP_POP16(); STORE_DE(); } // D1 POPDE
roving99 0:a9f6f3aea58f 595 void do_op_D2() { FETCH_DIR16(); OP_IFNC(); STORE_PC(); } // D2 nnnnJPNC,nn
roving99 0:a9f6f3aea58f 596 void do_op_D3() { FETCH_DIR8(); OP_OUTA(); STORE_NOP(); } // D3 nnOUT(n),A
roving99 0:a9f6f3aea58f 597 void do_op_D4() { FETCH_DIR16(); OP_IFNC(); STORE_CALL(); } // D4 nnnnCALLNC,nn
roving99 0:a9f6f3aea58f 598 void do_op_D5() { FETCH_DE(); OP_PUSH16(); STORE_NOP(); } // D5 PUSHDE
roving99 0:a9f6f3aea58f 599 void do_op_D6() { FETCH_DIR8(); OP_SUBFA(); STORE_A(); } // D6 nnSUBn
roving99 0:a9f6f3aea58f 600 void do_op_D7() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // D7 RST10H
roving99 0:a9f6f3aea58f 601 void do_op_D8() { FETCH_NOP(); OP_IFC(); STORE_RET(); } // D8 RETC
roving99 0:a9f6f3aea58f 602 void do_op_D9() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // D9 EXX(Z80)
roving99 0:a9f6f3aea58f 603 void do_op_DA() { FETCH_DIR16(); OP_IFC(); STORE_PC(); } // DA nnnnJPC,nn
roving99 0:a9f6f3aea58f 604 void do_op_DB() { FETCH_DIR8(); OP_INA(); STORE_A(); } // DB nnINA,(n)
roving99 0:a9f6f3aea58f 605 void do_op_DC() { FETCH_DIR16(); OP_IFC(); STORE_CALL(); } // DC nnnnCALLC,nn
roving99 0:a9f6f3aea58f 606 void do_op_DD() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // DD (Z80)
roving99 0:a9f6f3aea58f 607 void do_op_DE() { FETCH_DIR8(); OP_SBCFA(); STORE_A(); } // DE nnSBCA,n
roving99 0:a9f6f3aea58f 608 void do_op_DF() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // DF RST18H
roving99 0:a9f6f3aea58f 609 void do_op_E0() { FETCH_NOP(); OP_IFPO(); STORE_RET(); } // E0 RETPO
roving99 0:a9f6f3aea58f 610 void do_op_E1() { FETCH_NOP(); OP_POP16(); STORE_HL(); } // E1 POPHL
roving99 0:a9f6f3aea58f 611 void do_op_E2() { FETCH_DIR16(); OP_IFPO(); STORE_PC(); } // E2 nnnnJPPO,nn
roving99 0:a9f6f3aea58f 612 void do_op_E3() { FETCH_MSP(); OP_EXHL(); STORE_MSP(); } // E3 EX(SP),HL
roving99 0:a9f6f3aea58f 613 void do_op_E4() { FETCH_DIR16(); OP_IFPO(); STORE_CALL(); } // E4 nnnnCALLPO,nn
roving99 0:a9f6f3aea58f 614 void do_op_E5() { FETCH_HL(); OP_PUSH16(); STORE_NOP(); } // E5 PUSHHL
roving99 0:a9f6f3aea58f 615 void do_op_E6() { FETCH_DIR8(); OP_ANDA(); STORE_A(); } // E6 nnANDn
roving99 0:a9f6f3aea58f 616 void do_op_E7() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // E7 RST20H
roving99 0:a9f6f3aea58f 617 void do_op_E8() { FETCH_NOP(); OP_IFPE(); STORE_RET(); } // E8 RETPE
roving99 0:a9f6f3aea58f 618 void do_op_E9() { FETCH_HL(); OP_NOP(); STORE_PC(); } // E9 JP(HL)
roving99 0:a9f6f3aea58f 619 void do_op_EA() { FETCH_DIR16(); OP_IFPE(); STORE_PC(); } // EA nnnnJPPE,nn
roving99 0:a9f6f3aea58f 620 void do_op_EB() { FETCH_DE(); OP_EXHL(); STORE_DE(); } // EB EXDE,HL
roving99 0:a9f6f3aea58f 621 void do_op_EC() { FETCH_DIR16(); OP_IFPE(); STORE_CALL(); } // EC nnnnCALLPE,nn
roving99 0:a9f6f3aea58f 622 void do_op_ED() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // ED (Z80specific)
roving99 0:a9f6f3aea58f 623 void do_op_EE() { FETCH_DIR8(); OP_XORA(); STORE_A(); } // EE nnXORn
roving99 0:a9f6f3aea58f 624 void do_op_EF() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // EF RST28H
roving99 0:a9f6f3aea58f 625 void do_op_F0() { FETCH_NOP(); OP_IFP(); STORE_RET(); } // F0 RETP
roving99 0:a9f6f3aea58f 626 void do_op_F1() { FETCH_NOP(); OP_POP16(); STORE_AF(); } // F1 POPAF
roving99 0:a9f6f3aea58f 627 void do_op_F2() { FETCH_DIR16(); OP_IFP(); STORE_PC(); } // F2 nnnnJPP,nn
roving99 0:a9f6f3aea58f 628 void do_op_F3() { FETCH_NOP(); OP_DI(); STORE_NOP(); } // F3 DI
roving99 0:a9f6f3aea58f 629 void do_op_F4() { FETCH_DIR16(); OP_IFP(); STORE_CALL(); } // F4 nnnnCALLP,nn
roving99 0:a9f6f3aea58f 630 void do_op_F5() { FETCH_AF(); OP_PUSH16(); STORE_NOP(); } // F5 PUSHAF
roving99 0:a9f6f3aea58f 631 void do_op_F6() { FETCH_DIR8(); OP_ORA(); STORE_A(); } // F6 nnORn
roving99 0:a9f6f3aea58f 632 void do_op_F7() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // F7 RST30H
roving99 0:a9f6f3aea58f 633 void do_op_F8() { FETCH_NOP(); OP_IFM(); STORE_RET(); } // F8 RETM
roving99 0:a9f6f3aea58f 634 void do_op_F9() { FETCH_HL(); OP_NOP(); STORE_SP(); } // F9 LDSP,HL
roving99 0:a9f6f3aea58f 635 void do_op_FA() { FETCH_DIR16(); OP_IFM(); STORE_PC(); } // FA nnnnJPM,nn
roving99 0:a9f6f3aea58f 636 void do_op_FB() { FETCH_NOP(); OP_EI(); STORE_NOP(); } // FB EI
roving99 0:a9f6f3aea58f 637 void do_op_FC() { FETCH_DIR16(); OP_IFM(); STORE_CALL(); } // FC nnnnCALLM,nn
roving99 0:a9f6f3aea58f 638 void do_op_FD() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // FD (Z80specific)
roving99 0:a9f6f3aea58f 639 void do_op_FE() { FETCH_DIR8(); OP_SUBFA(); STORE_NOP(); } // FE nnCPn
roving99 0:a9f6f3aea58f 640 void do_op_FF() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // FF RST38H