Ian Redmond
/
cpm_8080
8080 emulator for mbed. Will run CP/M v2.0 from disk image on local file system. hopefully.
main.cpp
- Committer:
- roving99
- Date:
- 2010-05-07
- Revision:
- 0:a9f6f3aea58f
File content as of revision 0:a9f6f3aea58f:
//------------------------------------CP/M on MBED----------------------------------- // Emulate an 8080 and run CP/M v2.0 from a disk image saved on local storage. // // Inspired by excellent CP/M-on-AVR by Sprite_tm : http://spritesmods.com/?art=avrcpm // and by // // Basically a C reworking of Sprite's AVR machinecode. #include "mbed.h" 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); typedef void (*ptr2function)(void); const ptr2function function[] = { &do_op_00,&do_op_01,&do_op_02,&do_op_03,&do_op_04,&do_op_05,&do_op_06,&do_op_07, &do_op_08,&do_op_09,&do_op_0A,&do_op_0B,&do_op_0C,&do_op_0D,&do_op_0E,&do_op_0F, &do_op_10,&do_op_11,&do_op_12,&do_op_13,&do_op_14,&do_op_15,&do_op_16,&do_op_17, &do_op_18,&do_op_19,&do_op_1A,&do_op_1B,&do_op_1C,&do_op_1D,&do_op_1E,&do_op_1F, &do_op_20,&do_op_21,&do_op_22,&do_op_23,&do_op_24,&do_op_25,&do_op_26,&do_op_27, &do_op_28,&do_op_29,&do_op_2A,&do_op_2B,&do_op_2C,&do_op_2D,&do_op_2E,&do_op_2F, &do_op_30,&do_op_31,&do_op_32,&do_op_33,&do_op_34,&do_op_35,&do_op_36,&do_op_37, &do_op_38,&do_op_39,&do_op_3A,&do_op_3B,&do_op_3C,&do_op_3D,&do_op_3E,&do_op_3F, &do_op_40,&do_op_41,&do_op_42,&do_op_43,&do_op_44,&do_op_45,&do_op_46,&do_op_47, &do_op_48,&do_op_49,&do_op_4A,&do_op_4B,&do_op_4C,&do_op_4D,&do_op_4E,&do_op_4F, &do_op_50,&do_op_51,&do_op_52,&do_op_53,&do_op_54,&do_op_55,&do_op_56,&do_op_57, &do_op_58,&do_op_59,&do_op_5A,&do_op_5B,&do_op_5C,&do_op_5D,&do_op_5E,&do_op_5F, &do_op_60,&do_op_61,&do_op_62,&do_op_63,&do_op_64,&do_op_65,&do_op_66,&do_op_67, &do_op_68,&do_op_69,&do_op_6A,&do_op_6B,&do_op_6C,&do_op_6D,&do_op_6E,&do_op_6F, &do_op_70,&do_op_71,&do_op_72,&do_op_73,&do_op_74,&do_op_75,&do_op_76,&do_op_77, &do_op_78,&do_op_79,&do_op_7A,&do_op_7B,&do_op_7C,&do_op_7D,&do_op_7E,&do_op_7F, &do_op_80,&do_op_81,&do_op_82,&do_op_83,&do_op_84,&do_op_85,&do_op_86,&do_op_87, &do_op_88,&do_op_89,&do_op_8A,&do_op_8B,&do_op_8C,&do_op_8D,&do_op_8E,&do_op_8F, &do_op_90,&do_op_91,&do_op_92,&do_op_93,&do_op_94,&do_op_95,&do_op_96,&do_op_97, &do_op_98,&do_op_99,&do_op_9A,&do_op_9B,&do_op_9C,&do_op_9D,&do_op_9E,&do_op_9F, &do_op_A0,&do_op_A1,&do_op_A2,&do_op_A3,&do_op_A4,&do_op_A5,&do_op_A6,&do_op_A7, &do_op_A8,&do_op_A9,&do_op_AA,&do_op_AB,&do_op_AC,&do_op_AD,&do_op_AE,&do_op_AF, &do_op_B0,&do_op_B1,&do_op_B2,&do_op_B3,&do_op_B4,&do_op_B5,&do_op_B6,&do_op_B7, &do_op_B8,&do_op_B9,&do_op_BA,&do_op_BB,&do_op_BC,&do_op_BD,&do_op_BE,&do_op_BF, &do_op_C0,&do_op_C1,&do_op_C2,&do_op_C3,&do_op_C4,&do_op_C5,&do_op_C6,&do_op_C7, &do_op_C8,&do_op_C9,&do_op_CA,&do_op_CB,&do_op_CC,&do_op_CD,&do_op_CE,&do_op_CF, &do_op_D0,&do_op_D1,&do_op_D2,&do_op_D3,&do_op_D4,&do_op_D5,&do_op_D6,&do_op_D7, &do_op_D8,&do_op_D9,&do_op_DA,&do_op_DB,&do_op_DC,&do_op_DD,&do_op_DE,&do_op_DF, &do_op_E0,&do_op_E1,&do_op_E2,&do_op_E3,&do_op_E4,&do_op_E5,&do_op_E6,&do_op_E7, &do_op_E8,&do_op_E9,&do_op_EA,&do_op_EB,&do_op_EC,&do_op_ED,&do_op_EE,&do_op_EF, &do_op_F0,&do_op_F1,&do_op_F2,&do_op_F3,&do_op_F4,&do_op_F5,&do_op_F6,&do_op_F7, &do_op_F8,&do_op_F9,&do_op_FA,&do_op_FB,&do_op_FC,&do_op_FD,&do_op_FE,&do_op_FF } ; char rA; // 8080 registers char rB; char rC; char rD; char rE; char rH; char rL; char rSPH; // stack pointer (stack grows down in memory) char rSPL; char rPCH; // Program counter char rPCL; int pc; // 16 bit versions of pc/sp for convienience. int sp; //Flag bits in rF #define FL_S 7 #define FL_Z 6 #define FL_H 4 #define FL_P 2 #define FL_N 1 #define FL_C 0 char rF; // Status flags char oph; // operating registers when decoding instruction char opl; int op; // 16 bit version used for 16 bit arithmetic and setting status bits. char temp; bool nostore; // true if we need to skip the store phase (for conditional instructions). char RAM[20*1024]; int track; int sector; int dma; // DMA address for disk read/write Serial serial(USBTX, USBRX); // tx, rx LocalFileSystem local("local"); // access to local file system. void clear(char bit) { rF=rF&((0xFEF<<bit)>>8); } void set(char bit) { rF = rF|(0x01<<bit); } void set_flags(int result, char bits) { int mask = 0xff; char b = 1; if (bits==16) mask = 0xffff; rF = 0x00; if ((result>>bits)&0x01) set(FL_C); // Carry flag = bit 8 or bit 16, depending. if ((result>>3)&0x01) set(FL_H); // half-carry = bit 3 if ((result&mask)==0) set(FL_Z); // Zero flag 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 if ((result>>(bits-1))&0x01) set(FL_S); // Sign flag = bit 7 or 15 } void sync_rpc() { // make rPCL and rPCH match PC rPCL = (char)(pc&0xff); rPCH = (char)((pc>>8)&0xff); } void sync_rsp() { // make rSPL and rSPH match SP rSPL = (char)(sp&0xff); rSPH = (char)((sp>>8)&0xff); } void sync_op() { opl = (char)(op&0xff); oph = (char)((op>>8)&0xff); } void push(char h, char l) { // push 16 bits RAM[--sp] = h; RAM[--sp] = l; sync_rsp(); } int pop() { // pop 16 bits. int r; r = RAM[sp++]; r = r + RAM[sp++]<<8; sync_rsp(); return r; } void read_sector(char *buffer, int t, int s) { // read 128 bytes from track/sector to buffer. 26 sectors to a track. FILE *fp = fopen("/local/cpm_disk", "r"); fseek( fp, (26*t+s)*128, SEEK_SET ); fread( buffer, sizeof(char), 128, fp ); fclose(fp); } void write_sector(char *buffer, int t, int s) { // write 128 bytes from buffer to sector. FILE *fp = fopen("/local/cpm_disk", "w"); fseek( fp, (26*t+s)*128, SEEK_SET ); fwrite( buffer, sizeof(int), 128, fp ); fclose(fp); } //================================================================================= // BIOS routines. // HW accessed via IN / OUT instructions. // // The hw is modelled to make writing a CPM BIOS easier. // Ports: // 0 - Con status. Returns 0xFF if the UART has a byte, 0 otherwise. // 1 - Console input, aka UDR. // 2 - Console output // 16 - Track select // 18 - Sector select (26 sectors to a track) // 20 - Write addr l // 21 - Write addr h // 22 - Trigger - write 1 to read, 2 to write a sector using the above info. // This will automatically move track, sector and dma addr to the next sector. void out_command(char p) { switch(p) { case (2) : serial.putc(rA); break; case (16) : track = rA; break; case (18) : sector = rA; break; case (20) : dma = (dma&0xff00)|rA; break; case (21) : dma = (dma&0x00ff)|(rA<<8); break; case (22) : switch(rA) { case(1) : read_sector(&RAM[dma],track, sector); break; case(2) : write_sector(&RAM[dma],track, sector); break; } sector = (sector+1)%26; if (sector==0) track++; dma = dma+128; break; } } //================================================================================= // BIOS routines. // HW accessed via IN / OUT instructions. // // The hw is modelled to make writing a CPM BIOS easier. // Ports: // 0 - Con status. Returns 0xFF if the UART has a byte, 0 otherwise. // 1 - Console input, aka UDR. // 2 - Console output // 16 - Track select // 18 - Sector select (26 sectors to a track) // 20 - Write addr l // 21 - Write addr h // 22 - Trigger - write 1 to read, 2 to write a sector using the above info. // This will automatically move track, sector and dma addr to the next sector. char in_command(char p) { char r = 0; switch(p) { case(0) : if (serial.readable()) r = 0xff; else r = 0x00; break; case(1) : r = serial.getc(); break; } return r; } //================================================================================= // MAIN. // load IPL from sector 0 (128 bytes) to 0x2000 and execute. // int main() { read_sector(&RAM[0x2000], 0, 0); // read in first sector, contains IPL. pc = 0x2000; sync_rpc(); while(1) { function[RAM[pc]](); } } //================================================================================= // FETCH operations. // fetch registers or memory contents into op registers ahead of an operation. void FETCH_NOP() {} void FETCH_A() { opl = rA; } void FETCH_B() { opl = rB; } void FETCH_C() { opl = rC; } void FETCH_D() { opl = rD; } void FETCH_E() { opl = rE; } void FETCH_H() { opl = rH; } void FETCH_L() { opl = rL; } void FETCH_AF() { opl = rF; oph = rA; } // Assumes flags are correct!! void FETCH_BC() { opl = rC; oph = rB; } void FETCH_DE() { opl = rE; oph = rD; } void FETCH_HL() { opl = rL; oph = rH; } void FETCH_SP() { opl = rSPL; oph = rSPH; } void FETCH_DIR8() { opl = RAM[pc++]; sync_rpc(); } void FETCH_DIR16() { opl = RAM[pc++]; oph = RAM[pc++]; sync_rpc(); } void FETCH_RST() { opl = RAM[pc]&0x38; oph = 0; } void FETCH_MBC() { opl = RAM[rB<<8+rC]; } void FETCH_MDE() { opl = RAM[rD<<8+rE]; } void FETCH_MHL() { opl = RAM[rH<<8+rL]; } void FETCH_MSP() { opl = RAM[rSPH<<8+rSPL]; } //================================================================================= // STORE operations. // store op to registers or memory locations after operation. void STORE_NOP() {}; void STORE_A() { rA = opl; } void STORE_B() { rB = opl; } void STORE_C() { rC = opl; } void STORE_D() { rD = opl; } void STORE_E() { rE = opl; } void STORE_H() { rH = opl; } void STORE_L() { rL = opl; } void STORE_AF() { rF = opl; rA = oph; } // Assumes flags are correct!! void STORE_BC() { rC = opl; rB = oph; } void STORE_DE() { rE = opl; rD = oph; } void STORE_HL() { rL = opl; rH = oph; } void STORE_SP() { rSPL = opl; rSPH = oph; } void STORE_MBC() { RAM[rB<<8+rC] = opl; } void STORE_MDE() { RAM[rD<<8+rE] = opl; } void STORE_MHL() { RAM[rH<<8+rL] = opl; } void STORE_AM() { RAM[opl + oph<<8] = rA; } void STORE_PC() { rPCL = opl; rPCH = oph; pc = opl+(oph<<8); } void STORE_CALL(){ sync_rpc(); push(rPCH, rPCL); rPCL = opl; rPCH = oph; pc = rPCH<<8 + rPCL; } void STORE_RET() { pc = pop(); sync_rpc(); } void STORE_MSP() { sp = (rSPH<<8)+rSPL; RAM[sp] = opl; RAM[sp+1] = oph; } //================================================================================= // OPerations. // store op to registers or memory locations after operation. void OP_NOP() {} void OP_INC() { op = opl; op++; set_flags(op,8); sync_op(); } void OP_DEC() { op = opl; op--; set_flags(op,8); sync_op(); } void OP_INC16() { op = opl + oph<<8; op++; sync_op(); } // no flags void OP_DEC16() { op = opl + oph<<8; op--; sync_op(); } // no flags void OP_RRC() { clear(FL_C); if (opl&0x01) set(FL_C); opl=(opl>>1); if ((rF>>FL_C)&0x01) opl = opl|0x80; } void OP_RLC() { clear(FL_C); if (opl&0x80) set(FL_C); opl=(opl<<1); if ((rF>>FL_C)&0x01) opl = opl|0x01; } 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; } 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; } void OP_ADDA() { op = opl; op = op + rA; set_flags(op,8); sync_op(); } void OP_ADCA() { op = opl; op = op + rA + (rF>>FL_C)&0x01; set_flags(op,8); sync_op(); } void OP_SUBFA() { op = rA - opl; set_flags(op,8); sync_op(); } void OP_SBCFA() { op = rA - opl -(rF>>FL_C)&0x01; set_flags(op,8); sync_op(); } void OP_ANDA() { opl = opl&rA; set_flags(opl,8); } void OP_ORA() { opl = opl|rA; set_flags(opl,8); } void OP_XORA() { opl = opl^rA; set_flags(opl,8); } void OP_ADDHL() { op = opl + oph<<8; op +=(rH<<8)+rL; set_flags(op, 16); } void OP_STHL() { op = opl + oph<<8; RAM[op] = rL; RAM[op+1] = rH; } void OP_RMEM16(){ temp = (rH<<8)+rL; opl = RAM[temp]; oph = RAM[temp+1]; } void OP_RMEM8() { temp = (rH<<8)+rL; opl = RAM[temp]; } void OP_SCF() { set(FL_C); } // set Carry void OP_CCF() { rF = rF^(1<<FL_C); } // compliement Carry void OP_CPL() { opl = !opl; rF = rF|(1<<FL_N|1<<FL_H); } void OP_PUSH16(){ sp = (rSPH<<8)+rSPL; RAM[--sp] = oph; RAM[--sp] = opl; sync_rsp(); } void OP_POP16() { sp = (rSPH<<8)+rSPL; opl = RAM[sp++]; oph = RAM[sp++]; sync_rsp(); } void OP_EXHL() { temp = rL; rL = opl; opl = temp; temp = rH; rH = oph; oph = temp; } void OP_IFNZ() { if (rF&(1<<FL_Z)) nostore = true; } void OP_IFZ() { if (!(rF&(1<<FL_Z))) nostore = true; } void OP_IFNC() { if (rF&(1<<FL_C)) nostore = true; } void OP_IFC() { if (!(rF&(1<<FL_C))) nostore = true; } void OP_IFPO() { if (!(rF&(1<<FL_P))) nostore = true; } void OP_IFPE() { if (rF&(1<<FL_P)) nostore = true; } void OP_IFP() { if (!(rF&(1<<FL_S))) nostore = true; } void OP_IFM() { if (rF&(1<<FL_S)) nostore = true; } void OP_OUTA() { out_command(opl); } void OP_INA() { rA = in_command(opl); } void OP_INV() { serial.printf("Invalid opcode at %04X : %02X.\n", pc, RAM[pc]); while(1); } void OP_DI() { OP_INV(); } void OP_EI() { OP_INV(); } void OP_DA() { OP_INV(); } // to implement!! //================================================================================= // Operations broken down into fetch/op/store phases. // void do_op_00() { FETCH_NOP(); OP_NOP(); STORE_NOP(); } // 00 NOP void do_op_01() { FETCH_DIR16(); OP_NOP(); STORE_BC(); } // 01 nnnnLDBC,nn void do_op_02() { FETCH_A(); OP_NOP(); STORE_MBC(); } // 02 LD(BC),A void do_op_03() { FETCH_BC(); OP_INC16(); STORE_BC(); } // 03 INCBC void do_op_04() { FETCH_B(); OP_INC(); STORE_B(); } // 04 INCB void do_op_05() { FETCH_B(); OP_DEC(); STORE_B(); } // 05 DECB void do_op_06() { FETCH_DIR8(); OP_NOP(); STORE_B(); } // 06 nnLDB,n void do_op_07() { FETCH_A(); OP_RLC(); STORE_A(); } // 07 RLCA void do_op_08() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 08 EXAF,AF'(Z80) void do_op_09() { FETCH_BC(); OP_ADDHL(); STORE_HL(); } // 09 ADDHL,BC void do_op_0A() { FETCH_MBC(); OP_NOP(); STORE_A(); } // 0A LDA,(BC) void do_op_0B() { FETCH_BC(); OP_DEC16(); STORE_BC(); } // 0B DECBC void do_op_0C() { FETCH_C(); OP_INC(); STORE_C(); } // 0C INCC void do_op_0D() { FETCH_C(); OP_DEC(); STORE_C(); } // 0D DECC void do_op_0E() { FETCH_DIR8(); OP_NOP(); STORE_C(); } // 0E nnLDC,n void do_op_0F() { FETCH_A(); OP_RRC(); STORE_A(); } // 0F RRCA void do_op_10() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 10 ooDJNZo(Z80) void do_op_11() { FETCH_DIR16(); OP_NOP(); STORE_DE(); } // 11 nnnnLDDE,nn void do_op_12() { FETCH_A(); OP_NOP(); STORE_MDE(); } // 12 LD(DE),A void do_op_13() { FETCH_DE(); OP_INC16(); STORE_DE(); } // 13 INCDE void do_op_14() { FETCH_D(); OP_INC(); STORE_D(); } // 14 INCD void do_op_15() { FETCH_D(); OP_DEC(); STORE_D(); } // 15 DECD void do_op_16() { FETCH_DIR8(); OP_NOP(); STORE_D(); } // 16 nnLDD,n void do_op_17() { FETCH_A(); OP_RL(); STORE_A(); } // 17 RLA void do_op_18() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 18 ooJRo(Z80) void do_op_19() { FETCH_DE(); OP_ADDHL(); STORE_HL(); } // 19 ADDHL,DE void do_op_1A() { FETCH_MDE(); OP_NOP(); STORE_A(); } // 1A LDA,(DE) void do_op_1B() { FETCH_DE(); OP_DEC16(); STORE_DE(); } // 1B DECDE void do_op_1C() { FETCH_E(); OP_INC(); STORE_E(); } // 1C INCE void do_op_1D() { FETCH_E(); OP_DEC(); STORE_E(); } // 1D DECE void do_op_1E() { FETCH_DIR8(); OP_NOP(); STORE_E(); } // 1E nnLDE,n void do_op_1F() { FETCH_A(); OP_RR(); STORE_A(); } // 1F RRA void do_op_20() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 20 ooJRNZ,o(Z80) void do_op_21() { FETCH_DIR16(); OP_NOP(); STORE_HL(); } // 21 nnnnLDHL,nn void do_op_22() { FETCH_DIR16(); OP_STHL(); STORE_NOP(); } // 22 nnnnLD(nn),HL void do_op_23() { FETCH_HL(); OP_INC16(); STORE_HL(); } // 23 INCHL void do_op_24() { FETCH_H(); OP_INC(); STORE_H(); } // 24 INCH void do_op_25() { FETCH_H(); OP_DEC(); STORE_H(); } // 25 DECH void do_op_26() { FETCH_DIR8(); OP_NOP(); STORE_H(); } // 26 nnLDH,n void do_op_27() { FETCH_A(); OP_DA(); STORE_A(); } // 27 DAA void do_op_28() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 28 ooJRZ,o(Z80) void do_op_29() { FETCH_HL(); OP_ADDHL(); STORE_HL(); } // 29 ADDHL,HL void do_op_2A() { FETCH_DIR16(); OP_RMEM16(); STORE_HL(); } // 2A nnnnLDHL,(nn) void do_op_2B() { FETCH_HL(); OP_DEC16(); STORE_HL(); } // 2B DECHL void do_op_2C() { FETCH_L(); OP_INC(); STORE_L(); } // 2C INCL void do_op_2D() { FETCH_L(); OP_DEC(); STORE_L(); } // 2D DECL void do_op_2E() { FETCH_DIR8(); OP_NOP(); STORE_L(); } // 2E nnLDL,n void do_op_2F() { FETCH_A(); OP_CPL(); STORE_A(); } // 2F CPL void do_op_30() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 30 ooJRNC,o(Z80) void do_op_31() { FETCH_DIR16(); OP_NOP(); STORE_SP(); } // 31 nnnnLDSP,nn void do_op_32() { FETCH_DIR16(); OP_NOP(); STORE_AM(); } // 32 nnnnLD(nn),A void do_op_33() { FETCH_SP(); OP_INC16(); STORE_SP(); } // 33 INCSP void do_op_34() { FETCH_MHL(); OP_INC(); STORE_MHL(); } // 34 INC(HL) void do_op_35() { FETCH_MHL(); OP_DEC(); STORE_MHL(); } // 35 DEC(HL) void do_op_36() { FETCH_DIR8(); OP_NOP(); STORE_MHL(); } // 36 nnLD(HL),n void do_op_37() { FETCH_NOP(); OP_SCF(); STORE_NOP(); } // 37 SCF void do_op_38() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // 38 ooJRC,o(Z80) void do_op_39() { FETCH_SP(); OP_ADDHL(); STORE_HL(); } // 39 ADDHL,SP void do_op_3A() { FETCH_DIR16(); OP_RMEM8(); STORE_A(); } // 3A nnnnLDA,(nn) void do_op_3B() { FETCH_SP(); OP_DEC16(); STORE_SP(); } // 3B DECSP void do_op_3C() { FETCH_A(); OP_INC(); STORE_A(); } // 3C INCA void do_op_3D() { FETCH_A(); OP_DEC(); STORE_A(); } // 3D DECA void do_op_3E() { FETCH_DIR8(); OP_NOP(); STORE_A(); } // 3E nnLDA,n void do_op_3F() { FETCH_NOP(); OP_CCF(); STORE_NOP(); } // 3F CCF(ComplementCarryFlag,gvd) void do_op_40() { FETCH_B(); OP_NOP(); STORE_B(); } // 40 LDB,r void do_op_41() { FETCH_C(); OP_NOP(); STORE_B(); } // 41 LDB,r void do_op_42() { FETCH_D(); OP_NOP(); STORE_B(); } // 42 LDB,r void do_op_43() { FETCH_E(); OP_NOP(); STORE_B(); } // 43 LDB,r void do_op_44() { FETCH_H(); OP_NOP(); STORE_B(); } // 44 LDB,r void do_op_45() { FETCH_L(); OP_NOP(); STORE_B(); } // 45 LDB,r void do_op_46() { FETCH_MHL(); OP_NOP(); STORE_B(); } // 46 LDB,r void do_op_47() { FETCH_A(); OP_NOP(); STORE_B(); } // 47 LDB,r void do_op_48() { FETCH_B(); OP_NOP(); STORE_C(); } // 48 LDC,r void do_op_49() { FETCH_C(); OP_NOP(); STORE_C(); } // 49 LDC,r void do_op_4A() { FETCH_D(); OP_NOP(); STORE_C(); } // 4A LDC,r void do_op_4B() { FETCH_E(); OP_NOP(); STORE_C(); } // 4B LDC,r void do_op_4C() { FETCH_H(); OP_NOP(); STORE_C(); } // 4C LDC,r void do_op_4D() { FETCH_L(); OP_NOP(); STORE_C(); } // 4D LDC,r void do_op_4E() { FETCH_MHL(); OP_NOP(); STORE_C(); } // 4E LDC,r void do_op_4F() { FETCH_A(); OP_NOP(); STORE_C(); } // 4F LDC,r void do_op_50() { FETCH_B(); OP_NOP(); STORE_D(); } // 50 LDD,r void do_op_51() { FETCH_C(); OP_NOP(); STORE_D(); } // 51 LDD,r void do_op_52() { FETCH_D(); OP_NOP(); STORE_D(); } // 52 LDD,r void do_op_53() { FETCH_E(); OP_NOP(); STORE_D(); } // 53 LDD,r void do_op_54() { FETCH_H(); OP_NOP(); STORE_D(); } // 54 LDD,r void do_op_55() { FETCH_L(); OP_NOP(); STORE_D(); } // 55 LDD,r void do_op_56() { FETCH_MHL(); OP_NOP(); STORE_D(); } // 56 LDD,r void do_op_57() { FETCH_A(); OP_NOP(); STORE_D(); } // 57 LDD,r void do_op_58() { FETCH_B(); OP_NOP(); STORE_E(); } // 58 LDE,r void do_op_59() { FETCH_C(); OP_NOP(); STORE_E(); } // 59 LDE,r void do_op_5A() { FETCH_D(); OP_NOP(); STORE_E(); } // 5A LDE,r void do_op_5B() { FETCH_E(); OP_NOP(); STORE_E(); } // 5B LDE,r void do_op_5C() { FETCH_H(); OP_NOP(); STORE_E(); } // 5C LDE,r void do_op_5D() { FETCH_L(); OP_NOP(); STORE_E(); } // 5D LDE,r void do_op_5E() { FETCH_MHL(); OP_NOP(); STORE_E(); } // 5E LDE,r void do_op_5F() { FETCH_A(); OP_NOP(); STORE_E(); } // 5F LDE,r void do_op_60() { FETCH_B(); OP_NOP(); STORE_H(); } // 60 LDH,r void do_op_61() { FETCH_C(); OP_NOP(); STORE_H(); } // 61 LDH,r void do_op_62() { FETCH_D(); OP_NOP(); STORE_H(); } // 62 LDH,r void do_op_63() { FETCH_E(); OP_NOP(); STORE_H(); } // 63 LDH,r void do_op_64() { FETCH_H(); OP_NOP(); STORE_H(); } // 64 LDH,r void do_op_65() { FETCH_L(); OP_NOP(); STORE_H(); } // 65 LDH,r void do_op_66() { FETCH_MHL(); OP_NOP(); STORE_H(); } // 66 LDH,r void do_op_67() { FETCH_A(); OP_NOP(); STORE_H(); } // 67 LDH,r void do_op_68() { FETCH_B(); OP_NOP(); STORE_L(); } // 68 LDL,r void do_op_69() { FETCH_C(); OP_NOP(); STORE_L(); } // 69 LDL,r void do_op_6A() { FETCH_D(); OP_NOP(); STORE_L(); } // 6A LDL,r void do_op_6B() { FETCH_E(); OP_NOP(); STORE_L(); } // 6B LDL,r void do_op_6C() { FETCH_H(); OP_NOP(); STORE_L(); } // 6C LDL,r void do_op_6D() { FETCH_L(); OP_NOP(); STORE_L(); } // 6D LDL,r void do_op_6E() { FETCH_MHL(); OP_NOP(); STORE_L(); } // 6E LDL,r void do_op_6F() { FETCH_A(); OP_NOP(); STORE_L(); } // 6F LDL,r void do_op_70() { FETCH_B(); OP_NOP(); STORE_MHL(); } // 70 LD(HL),r void do_op_71() { FETCH_C(); OP_NOP(); STORE_MHL(); } // 71 LD(HL),r void do_op_72() { FETCH_D(); OP_NOP(); STORE_MHL(); } // 72 LD(HL),r void do_op_73() { FETCH_E(); OP_NOP(); STORE_MHL(); } // 73 LD(HL),r void do_op_74() { FETCH_H(); OP_NOP(); STORE_MHL(); } // 74 LD(HL),r void do_op_75() { FETCH_L(); OP_NOP(); STORE_MHL(); } // 75 LD(HL),r void do_op_76() { FETCH_NOP(); OP_NOP(); STORE_NOP(); } // 76 HALT void do_op_77() { FETCH_A(); OP_NOP(); STORE_MHL(); } // 77 LD(HL),r void do_op_78() { FETCH_B(); OP_NOP(); STORE_A(); } // 78 LDA,r void do_op_79() { FETCH_C(); OP_NOP(); STORE_A(); } // 79 LDA,r void do_op_7A() { FETCH_D(); OP_NOP(); STORE_A(); } // 7A LDA,r void do_op_7B() { FETCH_E(); OP_NOP(); STORE_A(); } // 7B LDA,r void do_op_7C() { FETCH_H(); OP_NOP(); STORE_A(); } // 7C LDA,r void do_op_7D() { FETCH_L(); OP_NOP(); STORE_A(); } // 7D LDA,r void do_op_7E() { FETCH_MHL(); OP_NOP(); STORE_A(); } // 7E LDA,r void do_op_7F() { FETCH_A(); OP_NOP(); STORE_A(); } // 7F LDA,r void do_op_80() { FETCH_B(); OP_ADDA(); STORE_A(); } // 80 ADDA,r void do_op_81() { FETCH_C(); OP_ADDA(); STORE_A(); } // 81 ADDA,r void do_op_82() { FETCH_D(); OP_ADDA(); STORE_A(); } // 82 ADDA,r void do_op_83() { FETCH_E(); OP_ADDA(); STORE_A(); } // 83 ADDA,r void do_op_84() { FETCH_H(); OP_ADDA(); STORE_A(); } // 84 ADDA,r void do_op_85() { FETCH_L(); OP_ADDA(); STORE_A(); } // 85 ADDA,r void do_op_86() { FETCH_MHL(); OP_ADDA(); STORE_A(); } // 86 ADDA,r void do_op_87() { FETCH_A(); OP_ADDA(); STORE_A(); } // 87 ADDA,r void do_op_88() { FETCH_B(); OP_ADCA(); STORE_A(); } // 88 ADCA,r void do_op_89() { FETCH_C(); OP_ADCA(); STORE_A(); } // 89 ADCA,r void do_op_8A() { FETCH_D(); OP_ADCA(); STORE_A(); } // 8A ADCA,r void do_op_8B() { FETCH_E(); OP_ADCA(); STORE_A(); } // 8B ADCA,r void do_op_8C() { FETCH_H(); OP_ADCA(); STORE_A(); } // 8C ADCA,r void do_op_8D() { FETCH_L(); OP_ADCA(); STORE_A(); } // 8D ADCA,r void do_op_8E() { FETCH_MHL(); OP_ADCA(); STORE_A(); } // 8E ADCA,r void do_op_8F() { FETCH_A(); OP_ADCA(); STORE_A(); } // 8F ADCA,r void do_op_90() { FETCH_B(); OP_SUBFA(); STORE_A(); } // 90 SUBA,r void do_op_91() { FETCH_C(); OP_SUBFA(); STORE_A(); } // 91 SUBA,r void do_op_92() { FETCH_D(); OP_SUBFA(); STORE_A(); } // 92 SUBA,r void do_op_93() { FETCH_E(); OP_SUBFA(); STORE_A(); } // 93 SUBA,r void do_op_94() { FETCH_H(); OP_SUBFA(); STORE_A(); } // 94 SUBA,r void do_op_95() { FETCH_L(); OP_SUBFA(); STORE_A(); } // 95 SUBA,r void do_op_96() { FETCH_MHL(); OP_SUBFA(); STORE_A(); } // 96 SUBA,r void do_op_97() { FETCH_A(); OP_SUBFA(); STORE_A(); } // 97 SUBA,r void do_op_98() { FETCH_B(); OP_SBCFA(); STORE_A(); } // 98 SBCA,r void do_op_99() { FETCH_C(); OP_SBCFA(); STORE_A(); } // 99 SBCA,r void do_op_9A() { FETCH_D(); OP_SBCFA(); STORE_A(); } // 9A SBCA,r void do_op_9B() { FETCH_E(); OP_SBCFA(); STORE_A(); } // 9B SBCA,r void do_op_9C() { FETCH_H(); OP_SBCFA(); STORE_A(); } // 9C SBCA,r void do_op_9D() { FETCH_L(); OP_SBCFA(); STORE_A(); } // 9D SBCA,r void do_op_9E() { FETCH_MHL(); OP_SBCFA(); STORE_A(); } // 9E SBCA,r void do_op_9F() { FETCH_A(); OP_SBCFA(); STORE_A(); } // 9F SBCA,r void do_op_A0() { FETCH_B(); OP_ANDA(); STORE_A(); } // A0 ANDA,r void do_op_A1() { FETCH_C(); OP_ANDA(); STORE_A(); } // A1 ANDA,r void do_op_A2() { FETCH_D(); OP_ANDA(); STORE_A(); } // A2 ANDA,r void do_op_A3() { FETCH_E(); OP_ANDA(); STORE_A(); } // A3 ANDA,r void do_op_A4() { FETCH_H(); OP_ANDA(); STORE_A(); } // A4 ANDA,r void do_op_A5() { FETCH_L(); OP_ANDA(); STORE_A(); } // A5 ANDA,r void do_op_A6() { FETCH_MHL(); OP_ANDA(); STORE_A(); } // A6 ANDA,r void do_op_A7() { FETCH_A(); OP_ANDA(); STORE_A(); } // A7 ANDA,r void do_op_A8() { FETCH_B(); OP_XORA(); STORE_A(); } // A8 XORA,r void do_op_A9() { FETCH_C(); OP_XORA(); STORE_A(); } // A9 XORA,r void do_op_AA() { FETCH_D(); OP_XORA(); STORE_A(); } // AA XORA,r void do_op_AB() { FETCH_E(); OP_XORA(); STORE_A(); } // AB XORA,r void do_op_AC() { FETCH_H(); OP_XORA(); STORE_A(); } // AC XORA,r void do_op_AD() { FETCH_L(); OP_XORA(); STORE_A(); } // AD XORA,r void do_op_AE() { FETCH_MHL(); OP_XORA(); STORE_A(); } // AE XORA,r void do_op_AF() { FETCH_A(); OP_XORA(); STORE_A(); } // AF XORA,r void do_op_B0() { FETCH_B(); OP_ORA(); STORE_A(); } // B0 ORA,r void do_op_B1() { FETCH_C(); OP_ORA(); STORE_A(); } // B1 ORA,r void do_op_B2() { FETCH_D(); OP_ORA(); STORE_A(); } // B2 ORA,r void do_op_B3() { FETCH_E(); OP_ORA(); STORE_A(); } // B3 ORA,r void do_op_B4() { FETCH_H(); OP_ORA(); STORE_A(); } // B4 ORA,r void do_op_B5() { FETCH_L(); OP_ORA(); STORE_A(); } // B5 ORA,r void do_op_B6() { FETCH_MHL(); OP_ORA(); STORE_A(); } // B6 ORA,r void do_op_B7() { FETCH_A(); OP_ORA(); STORE_A(); } // B7 ORA,r void do_op_B8() { FETCH_B(); OP_SUBFA(); STORE_NOP(); } // B8 CPA,r void do_op_B9() { FETCH_C(); OP_SUBFA(); STORE_NOP(); } // B9 CPA,r void do_op_BA() { FETCH_D(); OP_SUBFA(); STORE_NOP(); } // BA CPA,r void do_op_BB() { FETCH_E(); OP_SUBFA(); STORE_NOP(); } // BB CPA,r void do_op_BC() { FETCH_H(); OP_SUBFA(); STORE_NOP(); } // BC CPA,r void do_op_BD() { FETCH_L(); OP_SUBFA(); STORE_NOP(); } // BD CPA,r void do_op_BE() { FETCH_MHL(); OP_SUBFA(); STORE_NOP(); } // BE CPA,r void do_op_BF() { FETCH_A(); OP_SUBFA(); STORE_NOP(); } // BF CPA,r void do_op_C0() { FETCH_NOP(); OP_IFNZ(); STORE_RET(); } // C0 RETNZ void do_op_C1() { FETCH_NOP(); OP_POP16(); STORE_BC(); } // C1 POPBC void do_op_C2() { FETCH_DIR16(); OP_IFNZ(); STORE_PC(); } // C2 nnnnJPNZ,nn void do_op_C3() { FETCH_DIR16(); OP_NOP(); STORE_PC(); } // C3 nnnnJPnn void do_op_C4() { FETCH_DIR16(); OP_IFNZ(); STORE_CALL(); } // C4 nnnnCALLNZ,nn void do_op_C5() { FETCH_BC(); OP_PUSH16(); STORE_NOP(); } // C5 PUSHBC void do_op_C6() { FETCH_DIR8(); OP_ADDA(); STORE_A(); } // C6 nnADDA,n void do_op_C7() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // C7 RST0 void do_op_C8() { FETCH_NOP(); OP_IFZ(); STORE_RET(); } // C8 RETZ void do_op_C9() { FETCH_NOP(); OP_NOP(); STORE_RET(); } // C9 RET void do_op_CA() { FETCH_DIR16(); OP_IFZ(); STORE_PC(); } // CA nnnnJPZ,nn void do_op_CB() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // CB (Z80specific) void do_op_CC() { FETCH_DIR16(); OP_IFZ(); STORE_CALL(); } // CC nnnnCALLZ,nn void do_op_CD() { FETCH_DIR16(); OP_NOP(); STORE_CALL(); } // CD nnnnCALLnn void do_op_CE() { FETCH_DIR8(); OP_ADCA(); STORE_A(); } // CE nnADCA,n void do_op_CF() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // CF RST8H void do_op_D0() { FETCH_NOP(); OP_IFNC(); STORE_RET(); } // D0 RETNC void do_op_D1() { FETCH_NOP(); OP_POP16(); STORE_DE(); } // D1 POPDE void do_op_D2() { FETCH_DIR16(); OP_IFNC(); STORE_PC(); } // D2 nnnnJPNC,nn void do_op_D3() { FETCH_DIR8(); OP_OUTA(); STORE_NOP(); } // D3 nnOUT(n),A void do_op_D4() { FETCH_DIR16(); OP_IFNC(); STORE_CALL(); } // D4 nnnnCALLNC,nn void do_op_D5() { FETCH_DE(); OP_PUSH16(); STORE_NOP(); } // D5 PUSHDE void do_op_D6() { FETCH_DIR8(); OP_SUBFA(); STORE_A(); } // D6 nnSUBn void do_op_D7() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // D7 RST10H void do_op_D8() { FETCH_NOP(); OP_IFC(); STORE_RET(); } // D8 RETC void do_op_D9() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // D9 EXX(Z80) void do_op_DA() { FETCH_DIR16(); OP_IFC(); STORE_PC(); } // DA nnnnJPC,nn void do_op_DB() { FETCH_DIR8(); OP_INA(); STORE_A(); } // DB nnINA,(n) void do_op_DC() { FETCH_DIR16(); OP_IFC(); STORE_CALL(); } // DC nnnnCALLC,nn void do_op_DD() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // DD (Z80) void do_op_DE() { FETCH_DIR8(); OP_SBCFA(); STORE_A(); } // DE nnSBCA,n void do_op_DF() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // DF RST18H void do_op_E0() { FETCH_NOP(); OP_IFPO(); STORE_RET(); } // E0 RETPO void do_op_E1() { FETCH_NOP(); OP_POP16(); STORE_HL(); } // E1 POPHL void do_op_E2() { FETCH_DIR16(); OP_IFPO(); STORE_PC(); } // E2 nnnnJPPO,nn void do_op_E3() { FETCH_MSP(); OP_EXHL(); STORE_MSP(); } // E3 EX(SP),HL void do_op_E4() { FETCH_DIR16(); OP_IFPO(); STORE_CALL(); } // E4 nnnnCALLPO,nn void do_op_E5() { FETCH_HL(); OP_PUSH16(); STORE_NOP(); } // E5 PUSHHL void do_op_E6() { FETCH_DIR8(); OP_ANDA(); STORE_A(); } // E6 nnANDn void do_op_E7() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // E7 RST20H void do_op_E8() { FETCH_NOP(); OP_IFPE(); STORE_RET(); } // E8 RETPE void do_op_E9() { FETCH_HL(); OP_NOP(); STORE_PC(); } // E9 JP(HL) void do_op_EA() { FETCH_DIR16(); OP_IFPE(); STORE_PC(); } // EA nnnnJPPE,nn void do_op_EB() { FETCH_DE(); OP_EXHL(); STORE_DE(); } // EB EXDE,HL void do_op_EC() { FETCH_DIR16(); OP_IFPE(); STORE_CALL(); } // EC nnnnCALLPE,nn void do_op_ED() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // ED (Z80specific) void do_op_EE() { FETCH_DIR8(); OP_XORA(); STORE_A(); } // EE nnXORn void do_op_EF() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // EF RST28H void do_op_F0() { FETCH_NOP(); OP_IFP(); STORE_RET(); } // F0 RETP void do_op_F1() { FETCH_NOP(); OP_POP16(); STORE_AF(); } // F1 POPAF void do_op_F2() { FETCH_DIR16(); OP_IFP(); STORE_PC(); } // F2 nnnnJPP,nn void do_op_F3() { FETCH_NOP(); OP_DI(); STORE_NOP(); } // F3 DI void do_op_F4() { FETCH_DIR16(); OP_IFP(); STORE_CALL(); } // F4 nnnnCALLP,nn void do_op_F5() { FETCH_AF(); OP_PUSH16(); STORE_NOP(); } // F5 PUSHAF void do_op_F6() { FETCH_DIR8(); OP_ORA(); STORE_A(); } // F6 nnORn void do_op_F7() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // F7 RST30H void do_op_F8() { FETCH_NOP(); OP_IFM(); STORE_RET(); } // F8 RETM void do_op_F9() { FETCH_HL(); OP_NOP(); STORE_SP(); } // F9 LDSP,HL void do_op_FA() { FETCH_DIR16(); OP_IFM(); STORE_PC(); } // FA nnnnJPM,nn void do_op_FB() { FETCH_NOP(); OP_EI(); STORE_NOP(); } // FB EI void do_op_FC() { FETCH_DIR16(); OP_IFM(); STORE_CALL(); } // FC nnnnCALLM,nn void do_op_FD() { FETCH_NOP(); OP_INV(); STORE_NOP(); } // FD (Z80specific) void do_op_FE() { FETCH_DIR8(); OP_SUBFA(); STORE_NOP(); } // FE nnCPn void do_op_FF() { FETCH_RST(); OP_NOP(); STORE_CALL(); } // FF RST38H