Ian Redmond
/
cpm_8080
8080 emulator for mbed. Will run CP/M v2.0 from disk image on local file system. hopefully.
main.cpp@0:a9f6f3aea58f, 2010-05-07 (annotated)
- Committer:
- roving99
- Date:
- Fri May 07 15:15:26 2010 +0000
- Revision:
- 0:a9f6f3aea58f
Who changed what in which revision?
User | Revision | Line number | New 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 |