diff options
author | hap <happppp@users.noreply.github.com> | 2015-03-07 02:41:47 +0100 |
---|---|---|
committer | hap <happppp@users.noreply.github.com> | 2015-03-07 02:41:47 +0100 |
commit | e85b10a655238bcaee55625f027955ef6c60ed2c (patch) | |
tree | e325159ea37704f7d59b60f94c902363286e7e17 | |
parent | 877b3bb9bbc3638a6df6567ee97898704abfb657 (diff) |
opcode table WIP
-rw-r--r-- | src/emu/cpu/hmcs40/hmcs40.c | 211 | ||||
-rw-r--r-- | src/emu/cpu/hmcs40/hmcs40.h | 19 | ||||
-rw-r--r-- | src/emu/cpu/hmcs40/hmcs40d.c | 195 | ||||
-rw-r--r-- | src/emu/cpu/hmcs40/hmcs40op.inc | 66 | ||||
-rw-r--r-- | src/mess/drivers/hh_hmcs40.c | 6 |
5 files changed, 439 insertions, 58 deletions
diff --git a/src/emu/cpu/hmcs40/hmcs40.c b/src/emu/cpu/hmcs40/hmcs40.c index 95f679842f0..9422ce7db07 100644 --- a/src/emu/cpu/hmcs40/hmcs40.c +++ b/src/emu/cpu/hmcs40/hmcs40.c @@ -7,6 +7,7 @@ References: - 1985 #AP1 Hitachi 4-bit Single-Chip Microcomputer Data Book - 1988 HMCS400 Series Handbook (note: *400 is a newer MCU series, with similarities) + - opcode decoding by Tatsuyuki Satoh, Olivier Galibert, Kevin Horton, Lord Nightmare */ @@ -316,5 +317,215 @@ void hmcs40_cpu_device::execute_run() debugger_instruction_hook(this, m_pc); m_op = m_program->read_word(m_pc << 1) & 0x3ff; increment_pc(); + + // handle opcode + switch (m_op) + { + /* 0x000 */ + + case 0x000: case 0x001: case 0x002: case 0x003: + op_xsp(); break; + case 0x004: case 0x005: case 0x006: case 0x007: + op_sem(); break; + case 0x008: case 0x009: case 0x00a: case 0x00b: + op_lam(); break; + case 0x010: case 0x011: case 0x012: case 0x013: case 0x014: case 0x015: case 0x016: case 0x017: + case 0x018: case 0x019: case 0x01a: case 0x01b: case 0x01c: case 0x01d: case 0x01e: case 0x01f: + op_lmiiy(); break; + case 0x020: case 0x021: case 0x022: case 0x023: + op_lbm(); break; + case 0x030: + op_amc(); break; + case 0x03c: + op_lta(); break; + + case 0x040: + op_lxa(); break; + case 0x04b: + op_rec(); break; + case 0x04f: + op_sec(); break; + case 0x050: + op_lya(); break; + case 0x054: + op_iy(); break; + case 0x060: + op_lba(); break; + case 0x064: + op_ib(); break; + case 0x070: case 0x071: case 0x072: case 0x073: case 0x074: case 0x075: case 0x076: case 0x077: + case 0x078: case 0x079: case 0x07a: case 0x07b: case 0x07c: case 0x07d: case 0x07e: case 0x07f: + op_lai(); break; + + case 0x080: case 0x081: case 0x082: case 0x083: case 0x084: case 0x085: case 0x086: case 0x087: + case 0x088: case 0x089: case 0x08a: case 0x08b: case 0x08c: case 0x08d: case 0x08e: case 0x08f: + op_ai(); break; + case 0x090: + op_sed(); break; + case 0x094: + op_td(); break; + case 0x0a0: + op_seif1(); break; + case 0x0a1: + op_secf(); break; + case 0x0a2: + op_seif0(); break; + case 0x0a4: + op_seie(); break; + case 0x0a5: + op_setf(); break; + + case 0x0c0: case 0x0c1: case 0x0c2: case 0x0c3: case 0x0c4: case 0x0c5: case 0x0c6: case 0x0c7: + op_lar(); break; + case 0x0d0: case 0x0d1: case 0x0d2: case 0x0d3: case 0x0d4: case 0x0d5: case 0x0d6: case 0x0d7: + case 0x0d8: case 0x0d9: case 0x0da: case 0x0db: case 0x0dc: case 0x0dd: case 0x0de: case 0x0df: + op_sedd(); break; + case 0x0e0: case 0x0e1: case 0x0e2: case 0x0e3: case 0x0e4: case 0x0e5: case 0x0e6: case 0x0e7: + op_lbr(); break; + case 0x0f0: case 0x0f1: case 0x0f2: case 0x0f3: case 0x0f4: case 0x0f5: case 0x0f6: case 0x0f7: + case 0x0f8: case 0x0f9: case 0x0fa: case 0x0fb: case 0x0fc: case 0x0fd: case 0x0fe: case 0x0ff: + op_xamr(); break; + + + /* 0x100 */ + + case 0x110: case 0x111: + op_lmaiy(); break; + case 0x114: case 0x115: + op_lmady(); break; + case 0x120: + op_or(); break; + + case 0x140: case 0x141: case 0x142: case 0x143: case 0x144: case 0x145: case 0x146: case 0x147: + case 0x148: case 0x149: case 0x14a: case 0x14b: case 0x14c: case 0x14d: case 0x14e: case 0x14f: + op_lxi(); break; + case 0x150: case 0x151: case 0x152: case 0x153: case 0x154: case 0x155: case 0x156: case 0x157: + case 0x158: case 0x159: case 0x15a: case 0x15b: case 0x15c: case 0x15d: case 0x15e: case 0x15f: + op_lyi(); break; + case 0x160: case 0x161: case 0x162: case 0x163: case 0x164: case 0x165: case 0x166: case 0x167: + case 0x168: case 0x169: case 0x16a: case 0x16b: case 0x16c: case 0x16d: case 0x16e: case 0x16f: + op_lbi(); break; + case 0x170: case 0x171: case 0x172: case 0x173: case 0x174: case 0x175: case 0x176: case 0x177: + case 0x178: case 0x179: case 0x17a: case 0x17b: case 0x17c: case 0x17d: case 0x17e: case 0x17f: + op_lti(); break; + + case 0x1a0: + op_tif1(); break; + case 0x1a1: + op_ti1(); break; + case 0x1a2: + op_tif0(); break; + case 0x1a3: + op_ti0(); break; + case 0x1a5: + op_ttf(); break; + + case 0x1c0: case 0x1c1: case 0x1c2: case 0x1c3: case 0x1c4: case 0x1c5: case 0x1c6: case 0x1c7: + case 0x1c8: case 0x1c9: case 0x1ca: case 0x1cb: case 0x1cc: case 0x1cd: case 0x1ce: case 0x1cf: + case 0x1d0: case 0x1d1: case 0x1d2: case 0x1d3: case 0x1d4: case 0x1d5: case 0x1d6: case 0x1d7: + case 0x1d8: case 0x1d9: case 0x1da: case 0x1db: case 0x1dc: case 0x1dd: case 0x1de: case 0x1df: + case 0x1e0: case 0x1e1: case 0x1e2: case 0x1e3: case 0x1e4: case 0x1e5: case 0x1e6: case 0x1e7: + case 0x1e8: case 0x1e9: case 0x1ea: case 0x1eb: case 0x1ec: case 0x1ed: case 0x1ee: case 0x1ef: + case 0x1f0: case 0x1f1: case 0x1f2: case 0x1f3: case 0x1f4: case 0x1f5: case 0x1f6: case 0x1f7: + case 0x1f8: case 0x1f9: case 0x1fa: case 0x1fb: case 0x1fc: case 0x1fd: case 0x1fe: case 0x1ff: + op_br(); break; + + + /* 0x200 */ + + case 0x200: case 0x201: case 0x202: case 0x203: + op_tm(); break; + case 0x204: case 0x205: case 0x206: case 0x207: + op_rem(); break; + case 0x208: case 0x209: case 0x20a: case 0x20b: + op_xma(); break; + case 0x210: case 0x211: case 0x212: case 0x213: case 0x214: case 0x215: case 0x216: case 0x217: + case 0x218: case 0x219: case 0x21a: case 0x21b: case 0x21c: case 0x21d: case 0x21e: case 0x21f: + op_mnei(); break; + case 0x220: case 0x221: case 0x222: case 0x223: + op_xmb(); break; + case 0x224: + op_rotr(); break; + case 0x225: + op_rotl(); break; + case 0x230: + op_smc(); break; + case 0x23c: + op_lat(); break; + + case 0x240: + op_laspx(); break; + case 0x24f: + op_tc(); break; + case 0x250: + op_laspy(); break; + case 0x254: + op_dy(); break; + case 0x260: + op_lab(); break; + case 0x264: + op_db(); break; + case 0x270: case 0x271: case 0x272: case 0x273: case 0x274: case 0x275: case 0x276: case 0x277: + case 0x278: case 0x279: case 0x27a: case 0x27b: case 0x27c: case 0x27d: case 0x27e: case 0x27f: + op_alei(); break; + + case 0x280: case 0x281: case 0x282: case 0x283: case 0x284: case 0x285: case 0x286: case 0x287: + case 0x288: case 0x289: case 0x28a: case 0x28b: case 0x28c: case 0x28d: case 0x28e: case 0x28f: + op_ynei(); break; + case 0x290: + op_red(); break; + case 0x2a0: + op_reif1(); break; + case 0x2a1: + op_recf(); break; + case 0x2a2: + op_reif0(); break; + case 0x2a4: + op_reie(); break; + case 0x2a5: + op_retf(); break; + + case 0x2c0: case 0x2c1: case 0x2c2: case 0x2c3: case 0x2c4: case 0x2c5: case 0x2c6: case 0x2c7: + op_lra(); break; + case 0x2d0: case 0x2d1: case 0x2d2: case 0x2d3: case 0x2d4: case 0x2d5: case 0x2d6: case 0x2d7: + case 0x2d8: case 0x2d9: case 0x2da: case 0x2db: case 0x2dc: case 0x2dd: case 0x2de: case 0x2df: + op_redd(); break; + case 0x2e0: case 0x2e1: case 0x2e2: case 0x2e3: case 0x2e4: case 0x2e5: case 0x2e6: case 0x2e7: + op_lrb(); break; + + + /* 0x300 */ + case 0x320: + op_comb(); break; + + case 0x340: case 0x341: case 0x342: case 0x343: case 0x344: case 0x345: case 0x346: case 0x347: + case 0x348: case 0x349: case 0x34a: case 0x34b: case 0x34c: case 0x34d: case 0x34e: case 0x34f: + case 0x350: case 0x351: case 0x352: case 0x353: case 0x354: case 0x355: case 0x356: case 0x357: + case 0x358: case 0x359: case 0x35a: case 0x35b: case 0x35c: case 0x35d: case 0x35e: case 0x35f: + op_lpu(); break; + case 0x360: case 0x361: case 0x362: case 0x363: case 0x364: case 0x365: case 0x366: case 0x367: + op_tbr(); break; + case 0x368: case 0x369: case 0x36a: case 0x36b: case 0x36c: case 0x36d: case 0x36e: case 0x36f: + op_p(); break; + + case 0x3a4: + op_rtni(); break; + case 0x3a7: + op_rtn(); break; + + case 0x3c0: case 0x3c1: case 0x3c2: case 0x3c3: case 0x3c4: case 0x3c5: case 0x3c6: case 0x3c7: + case 0x3c8: case 0x3c9: case 0x3ca: case 0x3cb: case 0x3cc: case 0x3cd: case 0x3ce: case 0x3cf: + case 0x3d0: case 0x3d1: case 0x3d2: case 0x3d3: case 0x3d4: case 0x3d5: case 0x3d6: case 0x3d7: + case 0x3d8: case 0x3d9: case 0x3da: case 0x3db: case 0x3dc: case 0x3dd: case 0x3de: case 0x3df: + case 0x3e0: case 0x3e1: case 0x3e2: case 0x3e3: case 0x3e4: case 0x3e5: case 0x3e6: case 0x3e7: + case 0x3e8: case 0x3e9: case 0x3ea: case 0x3eb: case 0x3ec: case 0x3ed: case 0x3ee: case 0x3ef: + case 0x3f0: case 0x3f1: case 0x3f2: case 0x3f3: case 0x3f4: case 0x3f5: case 0x3f6: case 0x3f7: + case 0x3f8: case 0x3f9: case 0x3fa: case 0x3fb: case 0x3fc: case 0x3fd: case 0x3fe: case 0x3ff: + op_cal(); break; + + + default: + op_illegal(); break; + } /* big switch */ } } diff --git a/src/emu/cpu/hmcs40/hmcs40.h b/src/emu/cpu/hmcs40/hmcs40.h index 96405e0d6a8..301cbb2ba92 100644 --- a/src/emu/cpu/hmcs40/hmcs40.h +++ b/src/emu/cpu/hmcs40/hmcs40.h @@ -15,13 +15,13 @@ // I/O ports setup // max 8 4-bit R ports -#define MCFG_HMCS40_READ_R_CB(_r, _devcb) \ - hmcs40_cpu_device::set_read_r##_r_callback(*device, DEVCB_##_devcb); -#define MCFG_HMCS40_WRITE_R_CB(_r, _devcb) \ - hmcs40_cpu_device::set_write_r##_r_callback(*device, DEVCB_##_devcb); +#define MCFG_HMCS40_READ_R_CB(R, _devcb) \ + hmcs40_cpu_device::set_read_r##R##_callback(*device, DEVCB_##_devcb); +#define MCFG_HMCS40_WRITE_R_CB(R, _devcb) \ + hmcs40_cpu_device::set_write_r##R##_callback(*device, DEVCB_##_devcb); // 16-bit discrete -#define MCFG_HMCS40_READ_A_CB(_devcb) \ +#define MCFG_HMCS40_READ_D_CB(_devcb) \ hmcs40_cpu_device::set_read_d_callback(*device, DEVCB_##_devcb); #define MCFG_HMCS40_WRITE_D_CB(_devcb) \ hmcs40_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb); @@ -143,6 +143,8 @@ protected: virtual void write_d(int index, int state); // opcode handlers + void op_illegal(); + void op_lab(); void op_lba(); void op_lay(); @@ -158,9 +160,7 @@ protected: void op_dy(); void op_ayy(); void op_syy(); - void op_xspx(); - void op_xspy(); - void op_xspxy(); + void op_xsp(); void op_lam(); void op_lbm(); @@ -238,9 +238,6 @@ protected: void op_lra(); void op_lrb(); void op_p(); - - void op_nop(); - void op_illegal(); }; diff --git a/src/emu/cpu/hmcs40/hmcs40d.c b/src/emu/cpu/hmcs40/hmcs40d.c index 287ecf77b55..37934578d5d 100644 --- a/src/emu/cpu/hmcs40/hmcs40d.c +++ b/src/emu/cpu/hmcs40/hmcs40d.c @@ -11,15 +11,196 @@ #include "hmcs40.h" -CPU_DISASSEMBLE(hmcs40) +enum e_mnemonics +{ + mLAB, mLBA, mLAY, mLASPX, mLASPY, mXAMR, + mLXA, mLYA, mLXI, mLYI, mIY, mDY, mAYY, mSYY, mXSP, + mLAM, mLBM, mXMA, mXMB, mLMAIY, mLMADY, + mLMIIY, mLAI, mLBI, + mAI, mIB, mDB, mAMC, mSMC, mAM, mDAA, mDAS, mNEGA, mCOMB, mSEC, mREC, mTC, mROTL, mROTR, mOR, + mMNEI, mYNEI, mANEM, mBNEM, mALEI, mALEM, mBLEM, + mSEM, mREM, mTM, + mBR, mCAL, mLPU, mTBR, mRTN, + mSEIE, mSEIF0, mSEIF1, mSETF, mSECF, mREIE, mREIF0, mREIF1, mRETF, mRECF, mTI0, mTI1, mTIF0, mTIF1, mTTF, mLTI, mLTA, mLAT, mRTNI, + mSED, mRED, mTD, mSEDD, mREDD, mLAR, mLBR, mLRA, mLRB, mP, + mNOP, mILL +}; + +static const char *const s_mnemonics[] = +{ + "LAB", "LBA", "LAY", "LASPX", "LASPY", "XAMR", + "LXA", "LYA", "LXI", "LYI", "IY", "DY", "AYY", "SYY", "XSP", + "LAM", "LBM", "XMA", "XMB", "LMAIY", "LMADY", + "LMIIY", "LAI", "LBI", + "AI", "IB", "DB", "AMC", "SMC", "AM", "DAA", "DAS", "NEGA", "COMB", "SEC", "REC", "TC", "ROTL", "ROTR", "OR", + "MNEI", "YNEI", "ANEM", "BNEM", "ALEI", "ALEM", "BLEM", + "SEM", "REM", "TM", + "BR", "CAL", "LPU", "TBR", "RTN", + "SEIE", "SEIF0", "SEIF1", "SETF", "SECF", "REIE", "REIF0", "REIF1", "RETF", "RECF", "TI0", "TI1", "TIF0", "TIF1", "TTF", "LTI", "LTA", "LAT", "RTNI", + "SED", "RED", "TD", "SEDD", "REDD", "LAR", "LBR", "LRA", "LRB", "P", + "NOP", "?" +}; + +// number of bits per opcode parameter, -3 means (XY) parameter +static const INT8 s_bits[] = +{ + 0, 0, 0, 0, 0, 4, + 0, 0, 4, 4, 0, 0, 0, 0, -3, + -3, -3, -3, -3, -3, -3, + 4, 4, 4, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 0, 0, 4, 0, 0, + 2, 2, 2, + 6, 6, 5, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 4, 4, 3, 3, 3, 3, 3, + 0, 0 +}; + +#define _OVER DASMFLAG_STEP_OVER +#define _OUT DASMFLAG_STEP_OUT + +static const UINT32 s_flags[] = +{ + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + 0, _OVER, 0, 0, _OUT, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _OUT, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 +}; + + +static const UINT8 hmcs40_mnemonic[0x400] = { - int pos = 1;//0; -// UINT16 op = (oprom[pos] | oprom[pos + 1] << 8) & 0x3ff; -// pos += 2; -// UINT8 instr = hmcs40_mnemonic[op]; +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0x000 */ + mNOP, mXSP, mXSP, mXSP, mSEM, mSEM, mSEM, mSEM, mLAM, mLAM, mLAM, mLAM, mILL, mILL, mILL, mILL, + mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, + mLBM, mLBM, mLBM, mLBM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mAMC, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLTA, mILL, mILL, mILL, + /* 0x040 */ + mLXA, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mREC, mILL, mILL, mILL, mSEC, + mLYA, mILL, mILL, mILL, mIY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLBA, mILL, mILL, mILL, mIB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, + /* 0x080 */ + mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, + mSED, mILL, mILL, mILL, mTD, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mSEIF1, mSECF, mSEIF0, mILL, mSEIE, mSETF, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + /* 0x0c0 */ + mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, + mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, + +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0x100 */ + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLMAIY, mLMAIY, mILL, mILL, mLMADY, mLMADY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mOR, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + /* 0x140 */ + mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, + mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, + mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, + mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, + /* 0x180 */ + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mTIF1, mTI1, mTIF0, mTI0, mILL, mTTF, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + /* 0x1c0 */ + mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, + mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, + mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, + mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, + +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0x200 */ + mTM, mTM, mTM, mTM, mREM, mREM, mREM, mREM, mXMA, mXMA, mXMA, mXMA, mILL, mILL, mILL, mILL, + mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, + mXMB, mXMB, mXMB, mXMB, mROTR, mROTL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mSMC, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLAT, mILL, mILL, mILL, + /* 0x240 */ + mLASPX, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mTC, + mLASPY, mILL, mILL, mILL, mDY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLAB, mILL, mILL, mILL, mDB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, + /* 0x280 */ + mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, + mRED, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mREIF1, mRECF, mREIF0, mILL, mREIE, mRETF, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + /* 0x2c0 */ + mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, + mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + /* 0x300 */ + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mCOMB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + /* 0x340 */ + mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, + mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, + mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mP, mP, mP, mP, mP, mP, mP, mP, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + /* 0x380 */ + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mRTNI, mILL, mILL, mRTN, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + /* 0x3c0 */ + mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, + mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, + mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, + mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL +}; + + +CPU_DISASSEMBLE(hmcs40) +{ + int pos = 0; + UINT16 op = (oprom[pos] | oprom[pos + 1] << 8) & 0x3ff; + pos++; char *dst = buffer; - dst += sprintf(dst, "ABC"); + UINT8 instr = hmcs40_mnemonic[op]; + INT8 bits = s_bits[instr]; + + // special case for (XY) opcode + if (bits == -3) + { + dst += sprintf(dst, "%s", s_mnemonics[instr]); + + if (op & 1) + dst += sprintf(dst, "X"); + if (op & 2) + dst += sprintf(dst, "Y"); + } + else + dst += sprintf(dst, "%-6s ", s_mnemonics[instr]); + + // opcode parameter + if (bits > 0) + { + UINT8 param = op & ((1 << bits) - 1); + + if (bits > 5) + dst += sprintf(dst, "$%02X", param); + else + dst += sprintf(dst, "%d", param); + } - return pos | 0 | DASMFLAG_SUPPORTED; + return pos | s_flags[instr] | DASMFLAG_SUPPORTED; } diff --git a/src/emu/cpu/hmcs40/hmcs40op.inc b/src/emu/cpu/hmcs40/hmcs40op.inc index 496a4b14015..5945df5ac4b 100644 --- a/src/emu/cpu/hmcs40/hmcs40op.inc +++ b/src/emu/cpu/hmcs40/hmcs40op.inc @@ -170,6 +170,12 @@ void hmcs45_cpu_device::write_r(int index, UINT8 data) // instruction set +void hmcs40_cpu_device::op_illegal() +{ + logerror("%s unknown opcode $%03X at $%04X\n", tag(), m_op, m_prev_pc << 1); +} + + // Register-to-Register Instruction void hmcs40_cpu_device::op_lab() @@ -273,27 +279,21 @@ void hmcs40_cpu_device::op_syy() m_y &= 0xf; } -void hmcs40_cpu_device::op_xspx() -{ - // XSPX: Exchange X and SPX - UINT8 old_x = m_x; - m_x = m_spx; - m_spx = old_x; -} - -void hmcs40_cpu_device::op_xspy() +void hmcs40_cpu_device::op_xsp() { - // XSPY: Exchange Y and SPY - UINT8 old_y = m_y; - m_y = m_spy; - m_spy = old_y; -} - -void hmcs40_cpu_device::op_xspxy() -{ - // XSPXY: Exchange X and SPX, Y and SPY - op_xspx(); - op_xspy(); + // XSP (XY): Exchange X and SPX, Y and SPY, or NOP if 0 + if (m_op & 1) + { + UINT8 old_x = m_x; + m_x = m_spx; + m_spx = old_x; + } + if (m_op & 2) + { + UINT8 old_y = m_y; + m_y = m_spy; + m_spy = old_y; + } } @@ -303,14 +303,14 @@ void hmcs40_cpu_device::op_lam() { // LAM (XY): Load A from Memory m_a = ram_r(); - op_xspxy(); + op_xsp(); } void hmcs40_cpu_device::op_lbm() { // LBM (XY): Load B from Memory m_b = ram_r(); - op_xspxy(); + op_xsp(); } void hmcs40_cpu_device::op_xma() @@ -319,7 +319,7 @@ void hmcs40_cpu_device::op_xma() UINT8 old_a = m_a; m_a = ram_r(); ram_w(old_a); - op_xspxy(); + op_xsp(); } void hmcs40_cpu_device::op_xmb() @@ -328,7 +328,7 @@ void hmcs40_cpu_device::op_xmb() UINT8 old_b = m_b; m_b = ram_r(); ram_w(old_b); - op_xspxy(); + op_xsp(); } void hmcs40_cpu_device::op_lmaiy() @@ -336,7 +336,7 @@ void hmcs40_cpu_device::op_lmaiy() // LMAIY (X): Load Memory from A, Increment Y ram_w(m_a); op_iy(); - op_xspx(); + op_xsp(); } void hmcs40_cpu_device::op_lmady() @@ -344,7 +344,7 @@ void hmcs40_cpu_device::op_lmady() // LMADY (X): Load Memory from A, Decrement Y ram_w(m_a); op_dy(); - op_xspx(); + op_xsp(); } @@ -796,17 +796,3 @@ void hmcs40_cpu_device::op_p() write_r(3, o & 0xf); } } - - -// Control Instruction - -void hmcs40_cpu_device::op_nop() -{ - // NOP: No Operation -} - - -void hmcs40_cpu_device::op_illegal() -{ - logerror("%s unknown opcode $%03X at $%04X\n", tag(), m_op, m_prev_pc << 1); -} diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 1c1673f2571..3bef2d87e27 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -257,6 +257,12 @@ static MACHINE_CONFIG_START( alnattck, hh_hmcs40_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", HD38800, 400000) // approximation - RC osc. + MCFG_HMCS40_WRITE_R_CB(0, WRITE8(hh_hmcs40_state, alnattck_plate_w)) + MCFG_HMCS40_WRITE_R_CB(1, WRITE8(hh_hmcs40_state, alnattck_plate_w)) + MCFG_HMCS40_WRITE_R_CB(2, WRITE8(hh_hmcs40_state, alnattck_plate_w)) + MCFG_HMCS40_WRITE_R_CB(3, WRITE8(hh_hmcs40_state, alnattck_plate_w)) + MCFG_HMCS40_READ_D_CB(READ16(hh_hmcs40_state, alnattck_d_r)) + MCFG_HMCS40_WRITE_D_CB(WRITE16(hh_hmcs40_state, alnattck_d_w)) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_alnattck) |