trunk/src/emu/cpu/tms0980/tms0980.c
| r18797 | r18798 | |
| 235 | 235 | UINT8 sr; /* subroutine return register is a 7 bit register */ |
| 236 | 236 | UINT8 pb; /* page buffer register is a 4 bit register */ |
| 237 | 237 | UINT8 a; /* Accumulator is a 4 bit register (?) */ |
| 238 | | UINT8 x; /* X-register is a 2 bit register */ |
| 238 | UINT8 x; /* X-register is a 2, 3, or 4 bit register */ |
| 239 | 239 | UINT8 y; /* Y-register is a 4 bit register */ |
| 240 | 240 | UINT8 dam; /* DAM register is a 4 bit register */ |
| 241 | 241 | UINT8 ca; /* Chapter address bit */ |
| r18797 | r18798 | |
| 265 | 265 | UINT16 r_mask; /* mask to determine the number of R outputs */ |
| 266 | 266 | UINT8 pc_size; /* how bits in the PC register */ |
| 267 | 267 | UINT8 byte_size; /* 8 or 9 bit bytes */ |
| 268 | UINT8 m_x_bits; /* determine the number of bits in the X register */ |
| 268 | 269 | const UINT32 *decode_table; |
| 269 | 270 | const tms0980_config *config; |
| 270 | 271 | address_space *program; |
| r18797 | r18798 | |
| 280 | 281 | { |
| 281 | 282 | 0x00, 0x02, 0x01, 0x03 |
| 282 | 283 | }; |
| 284 | static const UINT8 tms0980_c3_value[8] = |
| 285 | { |
| 286 | 0x00, 0x04, 0x02, 0x06, 0x01, 0x05, 0x03, 0x07 |
| 287 | }; |
| 283 | 288 | static const UINT8 tms0980_c4_value[16] = |
| 284 | 289 | { |
| 285 | 290 | 0x00, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x0F |
| r18797 | r18798 | |
| 493 | 498 | ADDRESS_MAP_END |
| 494 | 499 | |
| 495 | 500 | |
| 496 | | static void cpu_init_tms_common( legacy_cpu_device *device, const UINT32* decode_table, UINT16 o_mask, UINT16 r_mask, UINT8 pc_size, UINT8 byte_size ) |
| 501 | static void cpu_init_tms_common( legacy_cpu_device *device, const UINT32* decode_table, UINT16 o_mask, UINT16 r_mask, UINT8 pc_size, UINT8 byte_size, UINT8 x_bits ) |
| 497 | 502 | { |
| 498 | 503 | tms0980_state *cpustate = get_safe_token( device ); |
| 499 | 504 | |
| r18797 | r18798 | |
| 506 | 511 | cpustate->r_mask = r_mask; |
| 507 | 512 | cpustate->pc_size = pc_size; |
| 508 | 513 | cpustate->byte_size = byte_size; |
| 514 | cpustate->m_x_bits = x_bits; |
| 509 | 515 | |
| 510 | 516 | cpustate->program = &device->space( AS_PROGRAM ); |
| 511 | | cpustate->data = &device->space( AS_PROGRAM ); |
| 517 | cpustate->data = &device->space( AS_DATA ); |
| 512 | 518 | |
| 513 | 519 | cpustate->m_read_k.resolve(cpustate->config->read_k, *device); |
| 514 | 520 | cpustate->m_write_o.resolve(cpustate->config->write_o, *device); |
| r18797 | r18798 | |
| 552 | 558 | |
| 553 | 559 | static CPU_INIT( tms0980 ) |
| 554 | 560 | { |
| 555 | | cpu_init_tms_common( device, tms0980_decode, 0x00ff, 0x07ff, 7, 9 ); |
| 561 | cpu_init_tms_common( device, tms0980_decode, 0x00ff, 0x07ff, 7, 9, 4 ); |
| 556 | 562 | } |
| 557 | 563 | |
| 558 | 564 | |
| 559 | 565 | static CPU_INIT( tms1000 ) |
| 560 | 566 | { |
| 561 | | cpu_init_tms_common( device, tms1000_default_decode, 0x00ff, 0x07ff, 6, 8 ); |
| 567 | cpu_init_tms_common( device, tms1000_default_decode, 0x00ff, 0x07ff, 6, 8, 2 ); |
| 562 | 568 | } |
| 563 | 569 | |
| 564 | 570 | |
| 565 | 571 | static CPU_INIT( tms1070 ) |
| 566 | 572 | { |
| 567 | | cpu_init_tms_common( device, tms1000_default_decode, 0x00ff, 0x07ff, 6, 8 ); |
| 573 | cpu_init_tms_common( device, tms1000_default_decode, 0x00ff, 0x07ff, 6, 8, 2 ); |
| 568 | 574 | } |
| 569 | 575 | |
| 570 | 576 | |
| 571 | 577 | static CPU_INIT( tms1200 ) |
| 572 | 578 | { |
| 573 | | cpu_init_tms_common( device, tms1000_default_decode, 0x00ff, 0x1fff, 6, 8 ); |
| 579 | cpu_init_tms_common( device, tms1000_default_decode, 0x00ff, 0x1fff, 6, 8, 2 ); |
| 574 | 580 | } |
| 575 | 581 | |
| 576 | 582 | |
| 577 | 583 | static CPU_INIT( tms1270 ) |
| 578 | 584 | { |
| 579 | | cpu_init_tms_common( device, tms1000_default_decode, 0x03ff, 0x1fff, 6, 8 ); |
| 585 | cpu_init_tms_common( device, tms1000_default_decode, 0x03ff, 0x1fff, 6, 8, 2 ); |
| 580 | 586 | } |
| 581 | 587 | |
| 582 | 588 | |
| 583 | 589 | static CPU_INIT( tms1100 ) |
| 584 | 590 | { |
| 585 | | cpu_init_tms_common( device, tms1100_default_decode, 0x00ff, 0x07ff, 6, 8 ); |
| 591 | cpu_init_tms_common( device, tms1100_default_decode, 0x00ff, 0x07ff, 6, 8, 3 ); |
| 586 | 592 | } |
| 587 | 593 | |
| 588 | 594 | |
| 589 | 595 | static CPU_INIT( tms1300 ) |
| 590 | 596 | { |
| 591 | | cpu_init_tms_common( device, tms1100_default_decode, 0x00ff, 0xffff, 6, 8 ); |
| 597 | cpu_init_tms_common( device, tms1100_default_decode, 0x00ff, 0xffff, 6, 8, 3 ); |
| 592 | 598 | } |
| 593 | 599 | |
| 594 | 600 | |
| r18797 | r18798 | |
| 831 | 837 | case 1: |
| 832 | 838 | /* fetch: rom address 1 */ |
| 833 | 839 | if ( cpustate->pc_size == 6 ) |
| 834 | | cpustate->rom_address = ( cpustate->pa << 6 ) | tms1000_pc_decode[ cpustate->pc ]; |
| 840 | // cpustate->rom_address = ( cpustate->pa << 6 ) | tms1000_pc_decode[ cpustate->pc ]; |
| 841 | cpustate->rom_address = ( cpustate->pa << 6 ) | cpustate->pc; |
| 835 | 842 | else |
| 836 | 843 | cpustate->rom_address = ( cpustate->pa << 7 ) | cpustate->pc; |
| 837 | 844 | /* execute: k input valid */ |
| r18797 | r18798 | |
| 979 | 986 | } |
| 980 | 987 | if ( cpustate->decode & F_LDX ) |
| 981 | 988 | { |
| 982 | | cpustate->x = tms0980_c2_value[ cpustate->opcode & 0x03 ]; |
| 989 | switch( cpustate->m_x_bits ) |
| 990 | { |
| 991 | case 2: |
| 992 | cpustate->x = tms0980_c2_value[ cpustate->opcode & 0x03 ]; |
| 993 | break; |
| 994 | case 3: |
| 995 | cpustate->x = tms0980_c3_value[ cpustate->opcode & 0x07 ]; |
| 996 | break; |
| 997 | case 4: |
| 998 | cpustate->x = tms0980_c4_value[ cpustate->opcode & 0x0f ]; |
| 999 | break; |
| 1000 | } |
| 983 | 1001 | } |
| 984 | 1002 | if ( cpustate->decode & F_COMX ) |
| 985 | 1003 | { |
| r18797 | r18798 | |
| 1041 | 1059 | else |
| 1042 | 1060 | { |
| 1043 | 1061 | debugger_instruction_hook( device, cpustate->rom_address ); |
| 1044 | | cpustate->opcode = cpustate->program->read_word( cpustate->rom_address ) & 0xFF; |
| 1062 | cpustate->opcode = cpustate->program->read_byte( cpustate->rom_address ); |
| 1045 | 1063 | } |
| 1046 | 1064 | tms0980_next_pc( cpustate ); |
| 1047 | 1065 | if (LOG) |
| r18797 | r18798 | |
| 1263 | 1281 | case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 11; break; |
| 1264 | 1282 | case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA: info->i = 7; break; |
| 1265 | 1283 | case CPUINFO_INT_PREVIOUSPC: info->i = ( cpustate->prev_pa << 6 ) | tms1000_pc_decode[ cpustate->prev_pc ]; break; |
| 1266 | | case CPUINFO_INT_PC: info->i = ( cpustate->pa << 6 ) | tms1000_pc_decode[ cpustate->pc ]; break; |
| 1284 | case CPUINFO_INT_PC: info->i = ( cpustate->pa << 6 ) | cpustate->pc; break; |
| 1267 | 1285 | case CPUINFO_PTR_INTERNAL_MEMORY_MAP + AS_PROGRAM: info->internal_map8 = ADDRESS_MAP_NAME( program_11bit_8 ); break; |
| 1268 | 1286 | case CPUINFO_PTR_INTERNAL_MEMORY_MAP + AS_DATA: info->internal_map8 = ADDRESS_MAP_NAME( data_7bit ); break; |
| 1269 | 1287 | case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME( tms1100 ); break; |
trunk/src/emu/cpu/tms0980/tms0980d.c
| r18797 | r18798 | |
| 17 | 17 | enum e_mnemonics { |
| 18 | 18 | zA10AAC=0, zA6AAC, zA8AAC, zAC1AC, zACACC, zACNAA, zALEC, zALEM, zAMAAC, zBRANCH, zCALL, zCCLA, |
| 19 | 19 | zCLA, zCLO, zCOMC, zCOMX, zCOMX8, zCPAIZ, zCTMDYN, zDAN, zDMAN, zDMEA, zDNAA, |
| 20 | | zDYN, zIA, zIMAC, zIYC, zKNE, zKNEZ, zLDP, zLDX, zLDX4, zMNEA, zMNEZ, |
| 20 | zDYN, zIA, zIMAC, zIYC, zKNE, zKNEZ, zLDP, zLDX, zLDX3, zLDX4, zMNEA, zMNEZ, |
| 21 | 21 | zNDMEA, zOFF, zRBIT, zREAC, zRETN, zRSTR, zSAL, zSAMAN, zSBIT, |
| 22 | 22 | zSBL, zSEAC, zSETR, zTAM, zTAMACS, zTAMDYN, zTAMIY, zTAMIYC, zTAMZA, |
| 23 | 23 | zTAY, zTBIT, zTCMIY, zTCY, zTDO, zTKA, zTKM, zTMA, |
| r18797 | r18798 | |
| 27 | 27 | |
| 28 | 28 | |
| 29 | 29 | enum e_addressing { |
| 30 | | zB0=0, zB2, zI2, zI4, zB7 |
| 30 | zB0=0, zB2, zI2, zI3, zI4, zB7 |
| 31 | 31 | }; |
| 32 | 32 | |
| 33 | 33 | |
| 34 | 34 | static const char *const s_mnemonic[] = { |
| 35 | 35 | "a10aac", "a6aac", "a8aac", "ac1ac", "acacc", "acnaa", "alec", "alem", "amaac", "branch", "call", "ccla", |
| 36 | 36 | "cla", "clo", "comc", "comx", "comx8", "cpaiz", "ctmdyn", "dan", "dman", "dmea", "dnaa", |
| 37 | | "dyn", "ia", "imac", "iyc", "kne", "knez", "ldp", "ldx", "ldx", "mnea", "mnez", |
| 37 | "dyn", "ia", "imac", "iyc", "kne", "knez", "ldp", "ldx", "ldx", "ldx", "mnea", "mnez", |
| 38 | 38 | "ndmea", "off", "rbit", "reac", "retn", "rstr", "sal", "saman", "sbit", |
| 39 | 39 | "sbl", "seac", "setr", "tam", "tamacs", "tamdyn", "tamiy", "tamiyc", "tamza", |
| 40 | 40 | "tay", "tbit", "tcmiy", "tcy", "tdo", "tka", "tkm", "tma", |
| r18797 | r18798 | |
| 58 | 58 | static const UINT8 s_addressing[] = { |
| 59 | 59 | zB0, zB0, zB0, zI4, zI4, zI4, zI4, zB0, zB0, zB7, zB7, zB0, |
| 60 | 60 | zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, |
| 61 | | zB0, zB0, zB0, zB0, zB0, zB0, zI4, zI2, zI4, zB0, zB0, |
| 61 | zB0, zB0, zB0, zB0, zB0, zB0, zI4, zI2, zI3, zI4, zB0, zB0, |
| 62 | 62 | zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, zB0, |
| 63 | 63 | zB0, zB0, zB0, zB0, zI4, zB0, zB0, zB0, zB2, |
| 64 | 64 | zB0, zB2, zI4, zI4, zB0, zB0, zB0, zB0, |
| r18797 | r18798 | |
| 201 | 201 | zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, zLDP, |
| 202 | 202 | /* 0x20 */ |
| 203 | 203 | zTAY, zTMA, zTMY, zTYA, zTAMDYN, zTAMIYC, zTAMZA, zTAM, |
| 204 | | zLDX, zLDX, zLDX, zLDX, zLDX, zLDX, zLDX, zLDX, |
| 204 | zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, zLDX3, |
| 205 | 205 | zSBIT, zSBIT, zSBIT, zSBIT, zRBIT, zRBIT, zRBIT, zRBIT, |
| 206 | 206 | zTBIT, zTBIT, zTBIT, zTBIT, zSAMAN, zCPAIZ, zIMAC, zMNEZ, |
| 207 | 207 | /* 0x40 */ |
| r18797 | r18798 | |
| 238 | 238 | { |
| 239 | 239 | 0x00, 0x02, 0x01, 0x03 |
| 240 | 240 | }; |
| 241 | static const UINT8 tms0980_i3_value[8] = |
| 242 | { |
| 243 | 0x00, 0x04, 0x02, 0x06, 0x01, 0x05, 0x03, 0x07 |
| 244 | }; |
| 241 | 245 | static const UINT8 tms0980_i4_value[16] = |
| 242 | 246 | { |
| 243 | 247 | 0x00, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x0F |
| r18797 | r18798 | |
| 332 | 336 | case zI2: |
| 333 | 337 | dst += sprintf( dst, "#$%01X", tms0980_i2_value[ op & 0x03 ] ); |
| 334 | 338 | break; |
| 339 | case zI3: |
| 340 | dst += sprintf( dst, "#$%01X", tms0980_i3_value[ op & 0x07 ] ); |
| 341 | break; |
| 335 | 342 | case zI4: |
| 336 | 343 | dst += sprintf( dst, "#$%01X", tms0980_i4_value[ op & 0x0F ] ); |
| 337 | 344 | break; |