| Previous | 199869 Revisions | Next |
| r36299 Saturday 7th March, 2015 at 01:41:47 UTC by hap |
|---|
| opcode table WIP |
| [src/emu/cpu/hmcs40] | hmcs40.c hmcs40.h hmcs40d.c hmcs40op.inc |
| [src/mess/drivers] | hh_hmcs40.c |
| r244810 | r244811 | |
|---|---|---|
| 7 | 7 | References: |
| 8 | 8 | - 1985 #AP1 Hitachi 4-bit Single-Chip Microcomputer Data Book |
| 9 | 9 | - 1988 HMCS400 Series Handbook (note: *400 is a newer MCU series, with similarities) |
| 10 | - opcode decoding by Tatsuyuki Satoh, Olivier Galibert, Kevin Horton, Lord Nightmare | |
| 10 | 11 | |
| 11 | 12 | */ |
| 12 | 13 | |
| r244810 | r244811 | |
| 316 | 317 | debugger_instruction_hook(this, m_pc); |
| 317 | 318 | m_op = m_program->read_word(m_pc << 1) & 0x3ff; |
| 318 | 319 | increment_pc(); |
| 320 | ||
| 321 | // handle opcode | |
| 322 | switch (m_op) | |
| 323 | { | |
| 324 | /* 0x000 */ | |
| 325 | ||
| 326 | case 0x000: case 0x001: case 0x002: case 0x003: | |
| 327 | op_xsp(); break; | |
| 328 | case 0x004: case 0x005: case 0x006: case 0x007: | |
| 329 | op_sem(); break; | |
| 330 | case 0x008: case 0x009: case 0x00a: case 0x00b: | |
| 331 | op_lam(); break; | |
| 332 | case 0x010: case 0x011: case 0x012: case 0x013: case 0x014: case 0x015: case 0x016: case 0x017: | |
| 333 | case 0x018: case 0x019: case 0x01a: case 0x01b: case 0x01c: case 0x01d: case 0x01e: case 0x01f: | |
| 334 | op_lmiiy(); break; | |
| 335 | case 0x020: case 0x021: case 0x022: case 0x023: | |
| 336 | op_lbm(); break; | |
| 337 | case 0x030: | |
| 338 | op_amc(); break; | |
| 339 | case 0x03c: | |
| 340 | op_lta(); break; | |
| 341 | ||
| 342 | case 0x040: | |
| 343 | op_lxa(); break; | |
| 344 | case 0x04b: | |
| 345 | op_rec(); break; | |
| 346 | case 0x04f: | |
| 347 | op_sec(); break; | |
| 348 | case 0x050: | |
| 349 | op_lya(); break; | |
| 350 | case 0x054: | |
| 351 | op_iy(); break; | |
| 352 | case 0x060: | |
| 353 | op_lba(); break; | |
| 354 | case 0x064: | |
| 355 | op_ib(); break; | |
| 356 | case 0x070: case 0x071: case 0x072: case 0x073: case 0x074: case 0x075: case 0x076: case 0x077: | |
| 357 | case 0x078: case 0x079: case 0x07a: case 0x07b: case 0x07c: case 0x07d: case 0x07e: case 0x07f: | |
| 358 | op_lai(); break; | |
| 359 | ||
| 360 | case 0x080: case 0x081: case 0x082: case 0x083: case 0x084: case 0x085: case 0x086: case 0x087: | |
| 361 | case 0x088: case 0x089: case 0x08a: case 0x08b: case 0x08c: case 0x08d: case 0x08e: case 0x08f: | |
| 362 | op_ai(); break; | |
| 363 | case 0x090: | |
| 364 | op_sed(); break; | |
| 365 | case 0x094: | |
| 366 | op_td(); break; | |
| 367 | case 0x0a0: | |
| 368 | op_seif1(); break; | |
| 369 | case 0x0a1: | |
| 370 | op_secf(); break; | |
| 371 | case 0x0a2: | |
| 372 | op_seif0(); break; | |
| 373 | case 0x0a4: | |
| 374 | op_seie(); break; | |
| 375 | case 0x0a5: | |
| 376 | op_setf(); break; | |
| 377 | ||
| 378 | case 0x0c0: case 0x0c1: case 0x0c2: case 0x0c3: case 0x0c4: case 0x0c5: case 0x0c6: case 0x0c7: | |
| 379 | op_lar(); break; | |
| 380 | case 0x0d0: case 0x0d1: case 0x0d2: case 0x0d3: case 0x0d4: case 0x0d5: case 0x0d6: case 0x0d7: | |
| 381 | case 0x0d8: case 0x0d9: case 0x0da: case 0x0db: case 0x0dc: case 0x0dd: case 0x0de: case 0x0df: | |
| 382 | op_sedd(); break; | |
| 383 | case 0x0e0: case 0x0e1: case 0x0e2: case 0x0e3: case 0x0e4: case 0x0e5: case 0x0e6: case 0x0e7: | |
| 384 | op_lbr(); break; | |
| 385 | case 0x0f0: case 0x0f1: case 0x0f2: case 0x0f3: case 0x0f4: case 0x0f5: case 0x0f6: case 0x0f7: | |
| 386 | case 0x0f8: case 0x0f9: case 0x0fa: case 0x0fb: case 0x0fc: case 0x0fd: case 0x0fe: case 0x0ff: | |
| 387 | op_xamr(); break; | |
| 388 | ||
| 389 | ||
| 390 | /* 0x100 */ | |
| 391 | ||
| 392 | case 0x110: case 0x111: | |
| 393 | op_lmaiy(); break; | |
| 394 | case 0x114: case 0x115: | |
| 395 | op_lmady(); break; | |
| 396 | case 0x120: | |
| 397 | op_or(); break; | |
| 398 | ||
| 399 | case 0x140: case 0x141: case 0x142: case 0x143: case 0x144: case 0x145: case 0x146: case 0x147: | |
| 400 | case 0x148: case 0x149: case 0x14a: case 0x14b: case 0x14c: case 0x14d: case 0x14e: case 0x14f: | |
| 401 | op_lxi(); break; | |
| 402 | case 0x150: case 0x151: case 0x152: case 0x153: case 0x154: case 0x155: case 0x156: case 0x157: | |
| 403 | case 0x158: case 0x159: case 0x15a: case 0x15b: case 0x15c: case 0x15d: case 0x15e: case 0x15f: | |
| 404 | op_lyi(); break; | |
| 405 | case 0x160: case 0x161: case 0x162: case 0x163: case 0x164: case 0x165: case 0x166: case 0x167: | |
| 406 | case 0x168: case 0x169: case 0x16a: case 0x16b: case 0x16c: case 0x16d: case 0x16e: case 0x16f: | |
| 407 | op_lbi(); break; | |
| 408 | case 0x170: case 0x171: case 0x172: case 0x173: case 0x174: case 0x175: case 0x176: case 0x177: | |
| 409 | case 0x178: case 0x179: case 0x17a: case 0x17b: case 0x17c: case 0x17d: case 0x17e: case 0x17f: | |
| 410 | op_lti(); break; | |
| 411 | ||
| 412 | case 0x1a0: | |
| 413 | op_tif1(); break; | |
| 414 | case 0x1a1: | |
| 415 | op_ti1(); break; | |
| 416 | case 0x1a2: | |
| 417 | op_tif0(); break; | |
| 418 | case 0x1a3: | |
| 419 | op_ti0(); break; | |
| 420 | case 0x1a5: | |
| 421 | op_ttf(); break; | |
| 422 | ||
| 423 | case 0x1c0: case 0x1c1: case 0x1c2: case 0x1c3: case 0x1c4: case 0x1c5: case 0x1c6: case 0x1c7: | |
| 424 | case 0x1c8: case 0x1c9: case 0x1ca: case 0x1cb: case 0x1cc: case 0x1cd: case 0x1ce: case 0x1cf: | |
| 425 | case 0x1d0: case 0x1d1: case 0x1d2: case 0x1d3: case 0x1d4: case 0x1d5: case 0x1d6: case 0x1d7: | |
| 426 | case 0x1d8: case 0x1d9: case 0x1da: case 0x1db: case 0x1dc: case 0x1dd: case 0x1de: case 0x1df: | |
| 427 | case 0x1e0: case 0x1e1: case 0x1e2: case 0x1e3: case 0x1e4: case 0x1e5: case 0x1e6: case 0x1e7: | |
| 428 | case 0x1e8: case 0x1e9: case 0x1ea: case 0x1eb: case 0x1ec: case 0x1ed: case 0x1ee: case 0x1ef: | |
| 429 | case 0x1f0: case 0x1f1: case 0x1f2: case 0x1f3: case 0x1f4: case 0x1f5: case 0x1f6: case 0x1f7: | |
| 430 | case 0x1f8: case 0x1f9: case 0x1fa: case 0x1fb: case 0x1fc: case 0x1fd: case 0x1fe: case 0x1ff: | |
| 431 | op_br(); break; | |
| 432 | ||
| 433 | ||
| 434 | /* 0x200 */ | |
| 435 | ||
| 436 | case 0x200: case 0x201: case 0x202: case 0x203: | |
| 437 | op_tm(); break; | |
| 438 | case 0x204: case 0x205: case 0x206: case 0x207: | |
| 439 | op_rem(); break; | |
| 440 | case 0x208: case 0x209: case 0x20a: case 0x20b: | |
| 441 | op_xma(); break; | |
| 442 | case 0x210: case 0x211: case 0x212: case 0x213: case 0x214: case 0x215: case 0x216: case 0x217: | |
| 443 | case 0x218: case 0x219: case 0x21a: case 0x21b: case 0x21c: case 0x21d: case 0x21e: case 0x21f: | |
| 444 | op_mnei(); break; | |
| 445 | case 0x220: case 0x221: case 0x222: case 0x223: | |
| 446 | op_xmb(); break; | |
| 447 | case 0x224: | |
| 448 | op_rotr(); break; | |
| 449 | case 0x225: | |
| 450 | op_rotl(); break; | |
| 451 | case 0x230: | |
| 452 | op_smc(); break; | |
| 453 | case 0x23c: | |
| 454 | op_lat(); break; | |
| 455 | ||
| 456 | case 0x240: | |
| 457 | op_laspx(); break; | |
| 458 | case 0x24f: | |
| 459 | op_tc(); break; | |
| 460 | case 0x250: | |
| 461 | op_laspy(); break; | |
| 462 | case 0x254: | |
| 463 | op_dy(); break; | |
| 464 | case 0x260: | |
| 465 | op_lab(); break; | |
| 466 | case 0x264: | |
| 467 | op_db(); break; | |
| 468 | case 0x270: case 0x271: case 0x272: case 0x273: case 0x274: case 0x275: case 0x276: case 0x277: | |
| 469 | case 0x278: case 0x279: case 0x27a: case 0x27b: case 0x27c: case 0x27d: case 0x27e: case 0x27f: | |
| 470 | op_alei(); break; | |
| 471 | ||
| 472 | case 0x280: case 0x281: case 0x282: case 0x283: case 0x284: case 0x285: case 0x286: case 0x287: | |
| 473 | case 0x288: case 0x289: case 0x28a: case 0x28b: case 0x28c: case 0x28d: case 0x28e: case 0x28f: | |
| 474 | op_ynei(); break; | |
| 475 | case 0x290: | |
| 476 | op_red(); break; | |
| 477 | case 0x2a0: | |
| 478 | op_reif1(); break; | |
| 479 | case 0x2a1: | |
| 480 | op_recf(); break; | |
| 481 | case 0x2a2: | |
| 482 | op_reif0(); break; | |
| 483 | case 0x2a4: | |
| 484 | op_reie(); break; | |
| 485 | case 0x2a5: | |
| 486 | op_retf(); break; | |
| 487 | ||
| 488 | case 0x2c0: case 0x2c1: case 0x2c2: case 0x2c3: case 0x2c4: case 0x2c5: case 0x2c6: case 0x2c7: | |
| 489 | op_lra(); break; | |
| 490 | case 0x2d0: case 0x2d1: case 0x2d2: case 0x2d3: case 0x2d4: case 0x2d5: case 0x2d6: case 0x2d7: | |
| 491 | case 0x2d8: case 0x2d9: case 0x2da: case 0x2db: case 0x2dc: case 0x2dd: case 0x2de: case 0x2df: | |
| 492 | op_redd(); break; | |
| 493 | case 0x2e0: case 0x2e1: case 0x2e2: case 0x2e3: case 0x2e4: case 0x2e5: case 0x2e6: case 0x2e7: | |
| 494 | op_lrb(); break; | |
| 495 | ||
| 496 | ||
| 497 | /* 0x300 */ | |
| 498 | case 0x320: | |
| 499 | op_comb(); break; | |
| 500 | ||
| 501 | case 0x340: case 0x341: case 0x342: case 0x343: case 0x344: case 0x345: case 0x346: case 0x347: | |
| 502 | case 0x348: case 0x349: case 0x34a: case 0x34b: case 0x34c: case 0x34d: case 0x34e: case 0x34f: | |
| 503 | case 0x350: case 0x351: case 0x352: case 0x353: case 0x354: case 0x355: case 0x356: case 0x357: | |
| 504 | case 0x358: case 0x359: case 0x35a: case 0x35b: case 0x35c: case 0x35d: case 0x35e: case 0x35f: | |
| 505 | op_lpu(); break; | |
| 506 | case 0x360: case 0x361: case 0x362: case 0x363: case 0x364: case 0x365: case 0x366: case 0x367: | |
| 507 | op_tbr(); break; | |
| 508 | case 0x368: case 0x369: case 0x36a: case 0x36b: case 0x36c: case 0x36d: case 0x36e: case 0x36f: | |
| 509 | op_p(); break; | |
| 510 | ||
| 511 | case 0x3a4: | |
| 512 | op_rtni(); break; | |
| 513 | case 0x3a7: | |
| 514 | op_rtn(); break; | |
| 515 | ||
| 516 | case 0x3c0: case 0x3c1: case 0x3c2: case 0x3c3: case 0x3c4: case 0x3c5: case 0x3c6: case 0x3c7: | |
| 517 | case 0x3c8: case 0x3c9: case 0x3ca: case 0x3cb: case 0x3cc: case 0x3cd: case 0x3ce: case 0x3cf: | |
| 518 | case 0x3d0: case 0x3d1: case 0x3d2: case 0x3d3: case 0x3d4: case 0x3d5: case 0x3d6: case 0x3d7: | |
| 519 | case 0x3d8: case 0x3d9: case 0x3da: case 0x3db: case 0x3dc: case 0x3dd: case 0x3de: case 0x3df: | |
| 520 | case 0x3e0: case 0x3e1: case 0x3e2: case 0x3e3: case 0x3e4: case 0x3e5: case 0x3e6: case 0x3e7: | |
| 521 | case 0x3e8: case 0x3e9: case 0x3ea: case 0x3eb: case 0x3ec: case 0x3ed: case 0x3ee: case 0x3ef: | |
| 522 | case 0x3f0: case 0x3f1: case 0x3f2: case 0x3f3: case 0x3f4: case 0x3f5: case 0x3f6: case 0x3f7: | |
| 523 | case 0x3f8: case 0x3f9: case 0x3fa: case 0x3fb: case 0x3fc: case 0x3fd: case 0x3fe: case 0x3ff: | |
| 524 | op_cal(); break; | |
| 525 | ||
| 526 | ||
| 527 | default: | |
| 528 | op_illegal(); break; | |
| 529 | } /* big switch */ | |
| 319 | 530 | } |
| 320 | 531 | } |
| r244810 | r244811 | |
|---|---|---|
| 15 | 15 | // I/O ports setup |
| 16 | 16 | |
| 17 | 17 | // max 8 4-bit R ports |
| 18 | #define MCFG_HMCS40_READ_R_CB(_r, _devcb) \ | |
| 19 | hmcs40_cpu_device::set_read_r##_r_callback(*device, DEVCB_##_devcb); | |
| 20 | #define MCFG_HMCS40_WRITE_R_CB(_r, _devcb) \ | |
| 21 | hmcs40_cpu_device::set_write_r##_r_callback(*device, DEVCB_##_devcb); | |
| 18 | #define MCFG_HMCS40_READ_R_CB(R, _devcb) \ | |
| 19 | hmcs40_cpu_device::set_read_r##R##_callback(*device, DEVCB_##_devcb); | |
| 20 | #define MCFG_HMCS40_WRITE_R_CB(R, _devcb) \ | |
| 21 | hmcs40_cpu_device::set_write_r##R##_callback(*device, DEVCB_##_devcb); | |
| 22 | 22 | |
| 23 | 23 | // 16-bit discrete |
| 24 | #define MCFG_HMCS40_READ_ | |
| 24 | #define MCFG_HMCS40_READ_D_CB(_devcb) \ | |
| 25 | 25 | hmcs40_cpu_device::set_read_d_callback(*device, DEVCB_##_devcb); |
| 26 | 26 | #define MCFG_HMCS40_WRITE_D_CB(_devcb) \ |
| 27 | 27 | hmcs40_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb); |
| r244810 | r244811 | |
| 143 | 143 | virtual void write_d(int index, int state); |
| 144 | 144 | |
| 145 | 145 | // opcode handlers |
| 146 | void op_illegal(); | |
| 147 | ||
| 146 | 148 | void op_lab(); |
| 147 | 149 | void op_lba(); |
| 148 | 150 | void op_lay(); |
| r244810 | r244811 | |
| 158 | 160 | void op_dy(); |
| 159 | 161 | void op_ayy(); |
| 160 | 162 | void op_syy(); |
| 161 | void op_xspx(); | |
| 162 | void op_xspy(); | |
| 163 | void op_xspxy(); | |
| 163 | void op_xsp(); | |
| 164 | 164 | |
| 165 | 165 | void op_lam(); |
| 166 | 166 | void op_lbm(); |
| r244810 | r244811 | |
| 238 | 238 | void op_lra(); |
| 239 | 239 | void op_lrb(); |
| 240 | 240 | void op_p(); |
| 241 | ||
| 242 | void op_nop(); | |
| 243 | void op_illegal(); | |
| 244 | 241 | }; |
| 245 | 242 | |
| 246 | 243 |
| r244810 | r244811 | |
|---|---|---|
| 11 | 11 | #include "hmcs40.h" |
| 12 | 12 | |
| 13 | 13 | |
| 14 | enum e_mnemonics | |
| 15 | { | |
| 16 | mLAB, mLBA, mLAY, mLASPX, mLASPY, mXAMR, | |
| 17 | mLXA, mLYA, mLXI, mLYI, mIY, mDY, mAYY, mSYY, mXSP, | |
| 18 | mLAM, mLBM, mXMA, mXMB, mLMAIY, mLMADY, | |
| 19 | mLMIIY, mLAI, mLBI, | |
| 20 | mAI, mIB, mDB, mAMC, mSMC, mAM, mDAA, mDAS, mNEGA, mCOMB, mSEC, mREC, mTC, mROTL, mROTR, mOR, | |
| 21 | mMNEI, mYNEI, mANEM, mBNEM, mALEI, mALEM, mBLEM, | |
| 22 | mSEM, mREM, mTM, | |
| 23 | mBR, mCAL, mLPU, mTBR, mRTN, | |
| 24 | mSEIE, mSEIF0, mSEIF1, mSETF, mSECF, mREIE, mREIF0, mREIF1, mRETF, mRECF, mTI0, mTI1, mTIF0, mTIF1, mTTF, mLTI, mLTA, mLAT, mRTNI, | |
| 25 | mSED, mRED, mTD, mSEDD, mREDD, mLAR, mLBR, mLRA, mLRB, mP, | |
| 26 | mNOP, mILL | |
| 27 | }; | |
| 28 | ||
| 29 | static const char *const s_mnemonics[] = | |
| 30 | { | |
| 31 | "LAB", "LBA", "LAY", "LASPX", "LASPY", "XAMR", | |
| 32 | "LXA", "LYA", "LXI", "LYI", "IY", "DY", "AYY", "SYY", "XSP", | |
| 33 | "LAM", "LBM", "XMA", "XMB", "LMAIY", "LMADY", | |
| 34 | "LMIIY", "LAI", "LBI", | |
| 35 | "AI", "IB", "DB", "AMC", "SMC", "AM", "DAA", "DAS", "NEGA", "COMB", "SEC", "REC", "TC", "ROTL", "ROTR", "OR", | |
| 36 | "MNEI", "YNEI", "ANEM", "BNEM", "ALEI", "ALEM", "BLEM", | |
| 37 | "SEM", "REM", "TM", | |
| 38 | "BR", "CAL", "LPU", "TBR", "RTN", | |
| 39 | "SEIE", "SEIF0", "SEIF1", "SETF", "SECF", "REIE", "REIF0", "REIF1", "RETF", "RECF", "TI0", "TI1", "TIF0", "TIF1", "TTF", "LTI", "LTA", "LAT", "RTNI", | |
| 40 | "SED", "RED", "TD", "SEDD", "REDD", "LAR", "LBR", "LRA", "LRB", "P", | |
| 41 | "NOP", "?" | |
| 42 | }; | |
| 43 | ||
| 44 | // number of bits per opcode parameter, -3 means (XY) parameter | |
| 45 | static const INT8 s_bits[] = | |
| 46 | { | |
| 47 | 0, 0, 0, 0, 0, 4, | |
| 48 | 0, 0, 4, 4, 0, 0, 0, 0, -3, | |
| 49 | -3, -3, -3, -3, -3, -3, | |
| 50 | 4, 4, 4, | |
| 51 | 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 52 | 4, 4, 0, 0, 4, 0, 0, | |
| 53 | 2, 2, 2, | |
| 54 | 6, 6, 5, 3, 0, | |
| 55 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, | |
| 56 | 0, 0, 0, 4, 4, 3, 3, 3, 3, 3, | |
| 57 | 0, 0 | |
| 58 | }; | |
| 59 | ||
| 60 | #define _OVER DASMFLAG_STEP_OVER | |
| 61 | #define _OUT DASMFLAG_STEP_OUT | |
| 62 | ||
| 63 | static const UINT32 s_flags[] = | |
| 64 | { | |
| 65 | 0, 0, 0, 0, 0, 0, | |
| 66 | 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 67 | 0, 0, 0, 0, 0, 0, | |
| 68 | 0, 0, 0, | |
| 69 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 70 | 0, 0, 0, 0, 0, 0, 0, | |
| 71 | 0, 0, 0, | |
| 72 | 0, _OVER, 0, 0, _OUT, | |
| 73 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _OUT, | |
| 74 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 75 | 0, 0 | |
| 76 | }; | |
| 77 | ||
| 78 | ||
| 79 | static const UINT8 hmcs40_mnemonic[0x400] = | |
| 80 | { | |
| 81 | /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ | |
| 82 | /* 0x000 */ | |
| 83 | mNOP, mXSP, mXSP, mXSP, mSEM, mSEM, mSEM, mSEM, mLAM, mLAM, mLAM, mLAM, mILL, mILL, mILL, mILL, | |
| 84 | mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, | |
| 85 | mLBM, mLBM, mLBM, mLBM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 86 | mAMC, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLTA, mILL, mILL, mILL, | |
| 87 | /* 0x040 */ | |
| 88 | mLXA, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mREC, mILL, mILL, mILL, mSEC, | |
| 89 | mLYA, mILL, mILL, mILL, mIY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 90 | mLBA, mILL, mILL, mILL, mIB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 91 | mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, | |
| 92 | /* 0x080 */ | |
| 93 | mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, | |
| 94 | mSED, mILL, mILL, mILL, mTD, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 95 | mSEIF1, mSECF, mSEIF0, mILL, mSEIE, mSETF, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 96 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 97 | /* 0x0c0 */ | |
| 98 | mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 99 | mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, | |
| 100 | mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 101 | mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, | |
| 102 | ||
| 103 | /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ | |
| 104 | /* 0x100 */ | |
| 105 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 106 | mLMAIY, mLMAIY, mILL, mILL, mLMADY, mLMADY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 107 | mOR, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 108 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 109 | /* 0x140 */ | |
| 110 | mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, | |
| 111 | mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, | |
| 112 | mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, | |
| 113 | mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, | |
| 114 | /* 0x180 */ | |
| 115 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 116 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 117 | mTIF1, mTI1, mTIF0, mTI0, mILL, mTTF, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 118 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 119 | /* 0x1c0 */ | |
| 120 | mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, | |
| 121 | mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, | |
| 122 | mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, | |
| 123 | mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, | |
| 124 | ||
| 125 | /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ | |
| 126 | /* 0x200 */ | |
| 127 | mTM, mTM, mTM, mTM, mREM, mREM, mREM, mREM, mXMA, mXMA, mXMA, mXMA, mILL, mILL, mILL, mILL, | |
| 128 | mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, | |
| 129 | mXMB, mXMB, mXMB, mXMB, mROTR, mROTL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 130 | mSMC, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLAT, mILL, mILL, mILL, | |
| 131 | /* 0x240 */ | |
| 132 | mLASPX, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mTC, | |
| 133 | mLASPY, mILL, mILL, mILL, mDY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 134 | mLAB, mILL, mILL, mILL, mDB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 135 | mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, | |
| 136 | /* 0x280 */ | |
| 137 | mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, | |
| 138 | mRED, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 139 | mREIF1, mRECF, mREIF0, mILL, mREIE, mRETF, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 140 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 141 | /* 0x2c0 */ | |
| 142 | mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 143 | mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, | |
| 144 | mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 145 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 146 | ||
| 147 | /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ | |
| 148 | /* 0x300 */ | |
| 149 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 150 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 151 | mCOMB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 152 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 153 | /* 0x340 */ | |
| 154 | mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, | |
| 155 | mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, | |
| 156 | mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mP, mP, mP, mP, mP, mP, mP, mP, | |
| 157 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 158 | /* 0x380 */ | |
| 159 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 160 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 161 | mILL, mILL, mILL, mILL, mRTNI, mILL, mILL, mRTN, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 162 | mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, | |
| 163 | /* 0x3c0 */ | |
| 164 | mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, | |
| 165 | mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, | |
| 166 | mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, | |
| 167 | mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL | |
| 168 | }; | |
| 169 | ||
| 170 | ||
| 171 | ||
| 14 | 172 | CPU_DISASSEMBLE(hmcs40) |
| 15 | 173 | { |
| 16 | int pos = 1;//0; | |
| 17 | // UINT16 op = (oprom[pos] | oprom[pos + 1] << 8) & 0x3ff; | |
| 18 | // pos += 2; | |
| 19 | // UINT8 instr = hmcs40_mnemonic[op]; | |
| 20 | ||
| 174 | int pos = 0; | |
| 175 | UINT16 op = (oprom[pos] | oprom[pos + 1] << 8) & 0x3ff; | |
| 176 | pos++; | |
| 21 | 177 | char *dst = buffer; |
| 22 | dst += sprintf(dst, "ABC"); | |
| 178 | UINT8 instr = hmcs40_mnemonic[op]; | |
| 179 | INT8 bits = s_bits[instr]; | |
| 180 | ||
| 181 | // special case for (XY) opcode | |
| 182 | if (bits == -3) | |
| 183 | { | |
| 184 | dst += sprintf(dst, "%s", s_mnemonics[instr]); | |
| 23 | 185 | |
| 24 | return pos | 0 | DASMFLAG_SUPPORTED; | |
| 186 | if (op & 1) | |
| 187 | dst += sprintf(dst, "X"); | |
| 188 | if (op & 2) | |
| 189 | dst += sprintf(dst, "Y"); | |
| 190 | } | |
| 191 | else | |
| 192 | dst += sprintf(dst, "%-6s ", s_mnemonics[instr]); | |
| 193 | ||
| 194 | // opcode parameter | |
| 195 | if (bits > 0) | |
| 196 | { | |
| 197 | UINT8 param = op & ((1 << bits) - 1); | |
| 198 | ||
| 199 | if (bits > 5) | |
| 200 | dst += sprintf(dst, "$%02X", param); | |
| 201 | else | |
| 202 | dst += sprintf(dst, "%d", param); | |
| 203 | } | |
| 204 | ||
| 205 | return pos | s_flags[instr] | DASMFLAG_SUPPORTED; | |
| 25 | 206 | } |
| r244810 | r244811 | |
|---|---|---|
| 170 | 170 | |
| 171 | 171 | // instruction set |
| 172 | 172 | |
| 173 | void hmcs40_cpu_device::op_illegal() | |
| 174 | { | |
| 175 | logerror("%s unknown opcode $%03X at $%04X\n", tag(), m_op, m_prev_pc << 1); | |
| 176 | } | |
| 177 | ||
| 178 | ||
| 173 | 179 | // Register-to-Register Instruction |
| 174 | 180 | |
| 175 | 181 | void hmcs40_cpu_device::op_lab() |
| r244810 | r244811 | |
| 273 | 279 | m_y &= 0xf; |
| 274 | 280 | } |
| 275 | 281 | |
| 276 | void hmcs40_cpu_device::op_xsp | |
| 282 | void hmcs40_cpu_device::op_xsp() | |
| 277 | 283 | { |
| 278 | // XSPX: Exchange X and SPX | |
| 279 | UINT8 old_x = m_x; | |
| 280 | m_x = m_spx; | |
| 281 | m_spx = old_x; | |
| 284 | // XSP (XY): Exchange X and SPX, Y and SPY, or NOP if 0 | |
| 285 | if (m_op & 1) | |
| 286 | { | |
| 287 | UINT8 old_x = m_x; | |
| 288 | m_x = m_spx; | |
| 289 | m_spx = old_x; | |
| 290 | } | |
| 291 | if (m_op & 2) | |
| 292 | { | |
| 293 | UINT8 old_y = m_y; | |
| 294 | m_y = m_spy; | |
| 295 | m_spy = old_y; | |
| 296 | } | |
| 282 | 297 | } |
| 283 | 298 | |
| 284 | void hmcs40_cpu_device::op_xspy() | |
| 285 | { | |
| 286 | // XSPY: Exchange Y and SPY | |
| 287 | UINT8 old_y = m_y; | |
| 288 | m_y = m_spy; | |
| 289 | m_spy = old_y; | |
| 290 | } | |
| 291 | 299 | |
| 292 | void hmcs40_cpu_device::op_xspxy() | |
| 293 | { | |
| 294 | // XSPXY: Exchange X and SPX, Y and SPY | |
| 295 | op_xspx(); | |
| 296 | op_xspy(); | |
| 297 | } | |
| 298 | ||
| 299 | ||
| 300 | 300 | // Ram Register Instruction |
| 301 | 301 | |
| 302 | 302 | void hmcs40_cpu_device::op_lam() |
| 303 | 303 | { |
| 304 | 304 | // LAM (XY): Load A from Memory |
| 305 | 305 | m_a = ram_r(); |
| 306 | op_xsp | |
| 306 | op_xsp(); | |
| 307 | 307 | } |
| 308 | 308 | |
| 309 | 309 | void hmcs40_cpu_device::op_lbm() |
| 310 | 310 | { |
| 311 | 311 | // LBM (XY): Load B from Memory |
| 312 | 312 | m_b = ram_r(); |
| 313 | op_xsp | |
| 313 | op_xsp(); | |
| 314 | 314 | } |
| 315 | 315 | |
| 316 | 316 | void hmcs40_cpu_device::op_xma() |
| r244810 | r244811 | |
| 319 | 319 | UINT8 old_a = m_a; |
| 320 | 320 | m_a = ram_r(); |
| 321 | 321 | ram_w(old_a); |
| 322 | op_xsp | |
| 322 | op_xsp(); | |
| 323 | 323 | } |
| 324 | 324 | |
| 325 | 325 | void hmcs40_cpu_device::op_xmb() |
| r244810 | r244811 | |
| 328 | 328 | UINT8 old_b = m_b; |
| 329 | 329 | m_b = ram_r(); |
| 330 | 330 | ram_w(old_b); |
| 331 | op_xsp | |
| 331 | op_xsp(); | |
| 332 | 332 | } |
| 333 | 333 | |
| 334 | 334 | void hmcs40_cpu_device::op_lmaiy() |
| r244810 | r244811 | |
| 336 | 336 | // LMAIY (X): Load Memory from A, Increment Y |
| 337 | 337 | ram_w(m_a); |
| 338 | 338 | op_iy(); |
| 339 | op_xsp | |
| 339 | op_xsp(); | |
| 340 | 340 | } |
| 341 | 341 | |
| 342 | 342 | void hmcs40_cpu_device::op_lmady() |
| r244810 | r244811 | |
| 344 | 344 | // LMADY (X): Load Memory from A, Decrement Y |
| 345 | 345 | ram_w(m_a); |
| 346 | 346 | op_dy(); |
| 347 | op_xsp | |
| 347 | op_xsp(); | |
| 348 | 348 | } |
| 349 | 349 | |
| 350 | 350 | |
| r244810 | r244811 | |
| 796 | 796 | write_r(3, o & 0xf); |
| 797 | 797 | } |
| 798 | 798 | } |
| 799 | ||
| 800 | ||
| 801 | // Control Instruction | |
| 802 | ||
| 803 | void hmcs40_cpu_device::op_nop() | |
| 804 | { | |
| 805 | // NOP: No Operation | |
| 806 | } | |
| 807 | ||
| 808 | ||
| 809 | void hmcs40_cpu_device::op_illegal() | |
| 810 | { | |
| 811 | logerror("%s unknown opcode $%03X at $%04X\n", tag(), m_op, m_prev_pc << 1); | |
| 812 | } |
| r244810 | r244811 | |
|---|---|---|
| 257 | 257 | |
| 258 | 258 | /* basic machine hardware */ |
| 259 | 259 | MCFG_CPU_ADD("maincpu", HD38800, 400000) // approximation - RC osc. |
| 260 | MCFG_HMCS40_WRITE_R_CB(0, WRITE8(hh_hmcs40_state, alnattck_plate_w)) | |
| 261 | MCFG_HMCS40_WRITE_R_CB(1, WRITE8(hh_hmcs40_state, alnattck_plate_w)) | |
| 262 | MCFG_HMCS40_WRITE_R_CB(2, WRITE8(hh_hmcs40_state, alnattck_plate_w)) | |
| 263 | MCFG_HMCS40_WRITE_R_CB(3, WRITE8(hh_hmcs40_state, alnattck_plate_w)) | |
| 264 | MCFG_HMCS40_READ_D_CB(READ16(hh_hmcs40_state, alnattck_d_r)) | |
| 265 | MCFG_HMCS40_WRITE_D_CB(WRITE16(hh_hmcs40_state, alnattck_d_w)) | |
| 260 | 266 | |
| 261 | 267 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) |
| 262 | 268 | MCFG_DEFAULT_LAYOUT(layout_alnattck) |
| https://github.com/mamedev/mame/commit/e85b10a655238bcaee55625f027955ef6c60ed2c |
| Previous | 199869 Revisions | Next |