From 0b93402dcf218a5872b29a8c9508ea867e77c4b8 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 14 Apr 2023 21:57:13 +0200 Subject: smc1102: add lcd and interrupt handling Systems promoted to working --------------------------- K28: Talking Learning Computer (model 7-232) [hap, Sean Riddle] --- hash/k28m2.xml | 12 +-- hash/lanteach.xml | 2 +- hash/lantrans.xml | 40 ++++---- hash/snread.xml | 16 +-- hash/snspell.xml | 26 ++--- hash/tntell.xml | 14 +-- src/devices/bus/msx/cart/easi_speech.cpp | 2 +- src/devices/cpu/tms1000/smc1102.cpp | 164 ++++++++++++++++++++++++++++--- src/devices/cpu/tms1000/smc1102.h | 41 +++++++- src/devices/cpu/tms1000/tms0980.cpp | 66 ++++++------- src/devices/cpu/tms1000/tms1000.cpp | 30 +++--- src/devices/cpu/tms1000/tms2100.cpp | 76 +++++++------- src/devices/cpu/tms1000/tms2100.h | 18 ++-- src/devices/cpu/tms1000/tp0320.cpp | 36 +++---- src/mame/layout/k28m2.lay | 6 +- src/mame/misc/eva.cpp | 4 +- src/mame/ti/snspell.cpp | 48 ++++----- src/mame/ti/snspellc.cpp | 18 ++-- src/mame/ti/spellb.cpp | 10 +- src/mame/tiger/k28.cpp | 6 +- src/mame/tiger/k28m2.cpp | 69 ++++++++++--- 21 files changed, 457 insertions(+), 247 deletions(-) diff --git a/hash/k28m2.xml b/hash/k28m2.xml index c176906ebf3..bf9bb76ac7e 100644 --- a/hash/k28m2.xml +++ b/hash/k28m2.xml @@ -31,7 +31,7 @@ CM62215 was confirmed to be the same as CM62087. - + @@ -43,7 +43,7 @@ CM62215 was confirmed to be the same as CM62087. - + @@ -55,7 +55,7 @@ CM62215 was confirmed to be the same as CM62087. - + @@ -67,7 +67,7 @@ CM62215 was confirmed to be the same as CM62087. - + @@ -80,7 +80,7 @@ CM62215 was confirmed to be the same as CM62087. - + @@ -93,7 +93,7 @@ CM62215 was confirmed to be the same as CM62087. - + diff --git a/hash/lanteach.xml b/hash/lanteach.xml index 321cd0cf4df..fe2421cdba8 100644 --- a/hash/lanteach.xml +++ b/hash/lanteach.xml @@ -12,7 +12,7 @@ license:CC0-1.0 Texas Instruments - + diff --git a/hash/lantrans.xml b/hash/lantrans.xml index a7df80425f7..7f7c7edc16c 100644 --- a/hash/lantrans.xml +++ b/hash/lantrans.xml @@ -13,10 +13,10 @@ license:CC0-1.0 Texas Instruments - - - - + + + + @@ -28,10 +28,10 @@ license:CC0-1.0 Texas Instruments - - - - + + + + @@ -43,10 +43,10 @@ license:CC0-1.0 Texas Instruments - - - - + + + + @@ -58,10 +58,10 @@ license:CC0-1.0 Texas Instruments - - - - + + + + @@ -73,10 +73,10 @@ license:CC0-1.0 Texas Instruments - - - - + + + + diff --git a/hash/snread.xml b/hash/snread.xml index 067eae53811..458f48c11d9 100644 --- a/hash/snread.xml +++ b/hash/snread.xml @@ -13,7 +13,7 @@ license:CC0-1.0 - + @@ -25,7 +25,7 @@ license:CC0-1.0 - + @@ -37,7 +37,7 @@ license:CC0-1.0 - + @@ -49,7 +49,7 @@ license:CC0-1.0 - + @@ -61,7 +61,7 @@ license:CC0-1.0 - + @@ -73,7 +73,7 @@ license:CC0-1.0 - + @@ -85,7 +85,7 @@ license:CC0-1.0 - + @@ -97,7 +97,7 @@ license:CC0-1.0 - + diff --git a/hash/snspell.xml b/hash/snspell.xml index 32e6e3e2037..799a2d392e4 100644 --- a/hash/snspell.xml +++ b/hash/snspell.xml @@ -15,7 +15,7 @@ license:CC0-1.0 - + @@ -27,7 +27,7 @@ license:CC0-1.0 - + @@ -39,7 +39,7 @@ license:CC0-1.0 - + @@ -51,7 +51,7 @@ license:CC0-1.0 - + @@ -63,7 +63,7 @@ license:CC0-1.0 - + @@ -75,7 +75,7 @@ license:CC0-1.0 - + @@ -87,7 +87,7 @@ license:CC0-1.0 - + @@ -100,7 +100,7 @@ license:CC0-1.0 - + @@ -112,7 +112,7 @@ license:CC0-1.0 - + @@ -124,7 +124,7 @@ license:CC0-1.0 - + @@ -140,7 +140,7 @@ license:CC0-1.0 - + @@ -153,7 +153,7 @@ license:CC0-1.0 - + @@ -165,7 +165,7 @@ license:CC0-1.0 - + diff --git a/hash/tntell.xml b/hash/tntell.xml index 2c33e909c2d..c3716637eac 100644 --- a/hash/tntell.xml +++ b/hash/tntell.xml @@ -13,7 +13,7 @@ license:CC0-1.0 - + @@ -25,7 +25,7 @@ license:CC0-1.0 - + @@ -37,7 +37,7 @@ license:CC0-1.0 - + @@ -49,7 +49,7 @@ license:CC0-1.0 - + @@ -61,7 +61,7 @@ license:CC0-1.0 - + @@ -73,7 +73,7 @@ license:CC0-1.0 - + @@ -85,7 +85,7 @@ license:CC0-1.0 - + diff --git a/src/devices/bus/msx/cart/easi_speech.cpp b/src/devices/bus/msx/cart/easi_speech.cpp index 1faf57538e7..e55655ee9cb 100644 --- a/src/devices/bus/msx/cart/easi_speech.cpp +++ b/src/devices/bus/msx/cart/easi_speech.cpp @@ -41,7 +41,7 @@ const tiny_rom_entry *msx_cart_easispeech_device::device_rom_region() const void msx_cart_easispeech_device::device_add_mconfig(machine_config &config) { - SP0256(config, m_speech, 3120000); // frequency unknown (R/C osc) + SP0256(config, m_speech, DERIVED_CLOCK(1, 1)); // appears to be connected to slot CLOCK pin if (parent_slot()) m_speech->add_route(ALL_OUTPUTS, soundin(), 1.0); } diff --git a/src/devices/cpu/tms1000/smc1102.cpp b/src/devices/cpu/tms1000/smc1102.cpp index 9f8ae066ff9..f0827a9949f 100644 --- a/src/devices/cpu/tms1000/smc1102.cpp +++ b/src/devices/cpu/tms1000/smc1102.cpp @@ -18,10 +18,10 @@ SMC1112 die notes (SMC1102 is assumed to be the same): - no output PLA TODO: -- row(pc) order is unknown - each opcode is 4 cycles instead of 6 -- does it have CL (call latch) -- everything else +- LCD refresh timing is unknown +- add timer +- add halt opcode */ @@ -36,7 +36,8 @@ DEFINE_DEVICE_TYPE(SMC1112, smc1112_cpu_device, "smc1112", "Suwa Seikosha SMC111 smc1102_cpu_device::smc1102_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, u8 stack_levels, int rom_width, address_map_constructor rom_map, int ram_width, address_map_constructor ram_map) : - tms1100_cpu_device(mconfig, type, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, stack_levels, rom_width, rom_map, ram_width, ram_map) + tms1100_cpu_device(mconfig, type, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, stack_levels, rom_width, rom_map, ram_width, ram_map), + m_write_segs(*this) { } smc1102_cpu_device::smc1102_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : @@ -59,6 +60,58 @@ std::unique_ptr smc1102_cpu_device::create_disassembler( void smc1102_cpu_device::device_start() { tms1100_cpu_device::device_start(); + + m_write_segs.resolve_safe(); + + // zerofill + memset(m_lcd_ram, 0, sizeof(m_lcd_ram)); + m_lcd_sr = 0; + m_inten = false; + m_selin = 0; + m_k_line = false; + + memset(m_stack, 0, sizeof(m_stack)); + m_sp = 0; + m_pb_stack = 0; + m_cb_stack = 0; + m_x_stack = 0; + m_y_stack = 0; + m_s_stack = 0; + + // register for savestates + save_item(NAME(m_lcd_ram)); + save_item(NAME(m_lcd_sr)); + save_item(NAME(m_inten)); + save_item(NAME(m_selin)); + save_item(NAME(m_k_line)); + + save_item(NAME(m_stack)); + save_item(NAME(m_sp)); + save_item(NAME(m_pb_stack)); + save_item(NAME(m_cb_stack)); + save_item(NAME(m_x_stack)); + save_item(NAME(m_y_stack)); + save_item(NAME(m_s_stack)); +} + +void smc1102_cpu_device::device_reset() +{ + tms1100_cpu_device::device_reset(); + + m_inten = false; + m_selin = 0; + + // changed/added fixed instructions (mostly handled in op_extra) + m_fixed_decode[0x0a] = F_EXTRA; + m_fixed_decode[0x71] = F_EXTRA; + m_fixed_decode[0x74] = F_EXTRA; + m_fixed_decode[0x75] = F_EXTRA; + m_fixed_decode[0x76] = F_RETN; + m_fixed_decode[0x78] = F_EXTRA; + m_fixed_decode[0x7b] = F_EXTRA; + + m_fixed_decode[0x72] = m_fixed_decode[0x73] = F_EXTRA; + m_fixed_decode[0x7c] = m_fixed_decode[0x7d] = F_EXTRA; } u32 smc1102_cpu_device::decode_micro(offs_t offset) @@ -100,48 +153,127 @@ u32 smc1102_cpu_device::decode_micro(offs_t offset) return decode; } -void smc1102_cpu_device::device_reset() + +// interrupt/timer +void smc1102_cpu_device::execute_set_input(int line, int state) { - tms1100_cpu_device::device_reset(); + switch (line) + { + case SMC1102_INPUT_LINE_K: + m_k_line = bool(state); + break; - // changed/added fixed instructions (mostly handled in op_extra) - m_fixed_decode[0x0a] = F_EXTRA; - m_fixed_decode[0x71] = F_EXTRA; - m_fixed_decode[0x74] = F_EXTRA; - m_fixed_decode[0x75] = F_EXTRA; - m_fixed_decode[0x76] = F_RETN; - m_fixed_decode[0x78] = F_EXTRA; - m_fixed_decode[0x7b] = F_EXTRA; + default: + break; + } +} - m_fixed_decode[0x72] = m_fixed_decode[0x73] = F_EXTRA; - m_fixed_decode[0x7c] = m_fixed_decode[0x7d] = F_EXTRA; +void smc1102_cpu_device::read_opcode() +{ + // return from interrupt + if (m_opcode == 0x76) + { + // restore registers + m_pb = m_pb_stack; + m_cb = m_cb_stack; + m_x = m_x_stack; + m_y = m_y_stack; + m_status = m_s_stack; + } + + // check interrupts (blocked after INTEN) + if (m_inten && m_opcode != 0x74) + { + bool taken = (m_selin & 2) ? false : m_k_line; + + if (taken) + { + interrupt(); + return; + } + } + + tms1100_cpu_device::read_opcode(); +} + +void smc1102_cpu_device::interrupt() +{ + standard_irq_callback(0, m_rom_address); + + // save registers + m_pb_stack = m_pb; + m_cb_stack = m_cb; + m_x_stack = m_x; + m_y_stack = m_y; + m_s_stack = m_status; + + // insert CALL to 0 on page 14 + m_opcode = 0xc0; + m_c4 = 0; + m_fixed = m_fixed_decode[m_opcode]; + m_micro = m_micro_decode[m_opcode]; + + m_pb = 0xe; + m_cb = 0; + m_status = 1; + m_inten = false; } // opcode deviations +void smc1102_cpu_device::op_call() +{ + // CALL: call subroutine + if (!m_status) + return; + + m_stack[m_sp] = m_ca << 10 | m_pa << 6 | m_pc; + m_sp = (m_sp + 1) % m_stack_levels; + + m_pc = m_opcode & m_pc_mask; + m_pa = m_pb; + m_ca = m_cb; +} + +void smc1102_cpu_device::op_retn() +{ + // RETN: return from subroutine + m_sp = (m_stack_levels + m_sp - 1) % m_stack_levels; + + m_pc = m_stack[m_sp] & m_pc_mask; + m_pa = m_pb = m_stack[m_sp] >> 6 & 0xf; + m_ca = m_stack[m_sp] >> 10 & 1; // not CB +} + void smc1102_cpu_device::op_tasr() { // TASR: transfer A to LCD S/R + m_lcd_sr = m_lcd_sr << 4 | m_a; } void smc1102_cpu_device::op_tsg() { // TSG: transfer LCD S/R to RAM + m_lcd_ram[m_opcode & 3] = m_lcd_sr; + m_write_segs(m_opcode & 3, m_lcd_sr); } void smc1102_cpu_device::op_intdis() { // INTDIS: disable interrupt + m_inten = false; } void smc1102_cpu_device::op_inten() { // INTEN: enable interrupt after next instruction + m_inten = true; } void smc1102_cpu_device::op_selin() { // SELIN: select interrupt + m_selin = m_a & 3; } void smc1102_cpu_device::op_tmset() diff --git a/src/devices/cpu/tms1000/smc1102.h b/src/devices/cpu/tms1000/smc1102.h index 3c55ccd33fa..1727e6a32b8 100644 --- a/src/devices/cpu/tms1000/smc1102.h +++ b/src/devices/cpu/tms1000/smc1102.h @@ -13,6 +13,11 @@ #include "tms1100.h" +enum +{ + SMC1102_INPUT_LINE_K = 0 +}; + // pinout reference (brief) @@ -40,26 +45,36 @@ class smc1102_cpu_device : public tms1100_cpu_device public: smc1102_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + // LCD segment outputs: COM pins in offset, D pins in data + auto write_segs() { return m_write_segs.bind(); } + protected: smc1102_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, u8 stack_levels, int rom_width, address_map_constructor rom_map, int ram_width, address_map_constructor ram_map); // overrides virtual void device_start() override; virtual void device_reset() override; - virtual void device_add_mconfig(machine_config &config) override { } + + virtual u32 execute_input_lines() const noexcept override { return 1; } + virtual void execute_set_input(int line, int state) override; + virtual std::unique_ptr create_disassembler() override; virtual u32 decode_micro(offs_t offset) override; + virtual void read_opcode() override; + void interrupt(); virtual void write_o_reg(u8 index) override { } // no O pins + virtual void op_extra() override; + virtual void op_retn() override; + virtual void op_call() override; + virtual void op_setr() override { tms1k_base_device::op_setr(); } // no anomaly with MSB of X register virtual void op_rstr() override { tms1k_base_device::op_rstr(); } // " - virtual void op_extra() override; - -private: + // extra opcodes void op_halt(); void op_intdis(); void op_inten(); @@ -67,6 +82,24 @@ private: void op_tasr(); void op_tmset(); void op_tsg(); + + devcb_write32 m_write_segs; + + // internal state + u32 m_lcd_ram[4]; + u32 m_lcd_sr; + bool m_inten; + u8 m_selin; + bool m_k_line; + + // stack + u16 m_stack[4]; + u8 m_sp; + u8 m_pb_stack; + u8 m_cb_stack; + u8 m_x_stack; + u8 m_y_stack; + u8 m_s_stack; }; class smc1112_cpu_device : public smc1102_cpu_device diff --git a/src/devices/cpu/tms1000/tms0980.cpp b/src/devices/cpu/tms1000/tms0980.cpp index 20923550985..b04b5288215 100644 --- a/src/devices/cpu/tms1000/tms0980.cpp +++ b/src/devices/cpu/tms1000/tms0980.cpp @@ -80,6 +80,39 @@ std::unique_ptr tms0980_cpu_device::create_disassembler( // device_reset +void tms0980_cpu_device::device_reset() +{ + // common reset + tms1k_base_device::device_reset(); + + // pre-decode instructionset + m_fixed_decode.resize(0x200); + memset(&m_fixed_decode[0], 0, 0x200*sizeof(u64)); + m_micro_decode.resize(0x200); + memset(&m_micro_decode[0], 0, 0x200*sizeof(u32)); + + for (u16 op = 0; op < 0x200; op++) + { + // upper half of the opcodes is always branch/call + if (op & 0x100) + m_fixed_decode[op] = (op & 0x80) ? F_CALL: F_BR; + + // 6 output bits select a microinstruction index + m_micro_decode[op] = m_decode_micro.isnull() ? decode_micro(m_ipla->read(op) & 0x3f) : m_decode_micro(op); + + // the other ipla terms each select a fixed instruction + m_fixed_decode[op] |= decode_fixed(op); + } + + // like on TMS0970, one of the terms directly select a microinstruction index (via R4-R8), + // but it can't be pre-determined when it's active + m_micro_direct.resize(0x40); + memset(&m_micro_decode[0], 0, 0x40*sizeof(u32)); + + for (int op = 0; op < 0x40; op++) + m_micro_direct[op] = m_decode_micro.isnull() ? decode_micro(op) : m_decode_micro(op + 0x200); +} + u32 tms0980_cpu_device::decode_fixed(offs_t offset) { u32 decode = 0; @@ -114,39 +147,6 @@ u32 tms0980_cpu_device::decode_micro(offs_t offset) return decode; } -void tms0980_cpu_device::device_reset() -{ - // common reset - tms1k_base_device::device_reset(); - - // pre-decode instructionset - m_fixed_decode.resize(0x200); - memset(&m_fixed_decode[0], 0, 0x200*sizeof(u64)); - m_micro_decode.resize(0x200); - memset(&m_micro_decode[0], 0, 0x200*sizeof(u32)); - - for (u16 op = 0; op < 0x200; op++) - { - // upper half of the opcodes is always branch/call - if (op & 0x100) - m_fixed_decode[op] = (op & 0x80) ? F_CALL: F_BR; - - // 6 output bits select a microinstruction index - m_micro_decode[op] = m_decode_micro.isnull() ? decode_micro(m_ipla->read(op) & 0x3f) : m_decode_micro(op); - - // the other ipla terms each select a fixed instruction - m_fixed_decode[op] |= decode_fixed(op); - } - - // like on TMS0970, one of the terms directly select a microinstruction index (via R4-R8), - // but it can't be pre-determined when it's active - m_micro_direct.resize(0x40); - memset(&m_micro_decode[0], 0, 0x40*sizeof(u32)); - - for (int op = 0; op < 0x40; op++) - m_micro_direct[op] = m_decode_micro.isnull() ? decode_micro(op) : m_decode_micro(op + 0x200); -} - // program counter/opcode decode u32 tms0980_cpu_device::read_micro() diff --git a/src/devices/cpu/tms1000/tms1000.cpp b/src/devices/cpu/tms1000/tms1000.cpp index 75faa0279ca..02120756353 100644 --- a/src/devices/cpu/tms1000/tms1000.cpp +++ b/src/devices/cpu/tms1000/tms1000.cpp @@ -110,21 +110,6 @@ std::unique_ptr tms1000_cpu_device::create_disassembler( // device_reset -u32 tms1000_cpu_device::decode_micro(offs_t offset) -{ - // _____ _____ ______ _____ ______ _____ _____ _____ _____ - const u32 md[16] = { M_STSL, M_AUTY, M_AUTA, M_CIN, M_C8, M_NE, M_CKN, M_15TN, M_MTN, M_NATN, M_ATN, M_MTP, M_YTP, M_CKP, M_CKM, M_STO }; - u16 mask = m_mpla->read(offset); - mask ^= 0x3fc8; // invert active-negative - u32 decode = 0; - - for (int bit = 0; bit < 16; bit++) - if (mask & (1 << bit)) - decode |= md[bit]; - - return decode; -} - void tms1000_cpu_device::device_reset() { // common reset @@ -156,3 +141,18 @@ void tms1000_cpu_device::device_reset() for (int i = 0x80; i < 0xc0; i++) m_fixed_decode[i] = F_BR; for (int i = 0xc0; i < 0x100; i++) m_fixed_decode[i] = F_CALL; } + +u32 tms1000_cpu_device::decode_micro(offs_t offset) +{ + // _____ _____ ______ _____ ______ _____ _____ _____ _____ + const u32 md[16] = { M_STSL, M_AUTY, M_AUTA, M_CIN, M_C8, M_NE, M_CKN, M_15TN, M_MTN, M_NATN, M_ATN, M_MTP, M_YTP, M_CKP, M_CKM, M_STO }; + u16 mask = m_mpla->read(offset); + mask ^= 0x3fc8; // invert active-negative + u32 decode = 0; + + for (int bit = 0; bit < 16; bit++) + if (mask & (1 << bit)) + decode |= md[bit]; + + return decode; +} diff --git a/src/devices/cpu/tms1000/tms2100.cpp b/src/devices/cpu/tms1000/tms2100.cpp index 367b5ec9ee2..5169aedb855 100644 --- a/src/devices/cpu/tms1000/tms2100.cpp +++ b/src/devices/cpu/tms1000/tms2100.cpp @@ -100,15 +100,15 @@ void tms2100_cpu_device::device_start() m_int_pin = 0; m_ec1_pin = 0; - m_pb_save = 0; - m_cb_save = 0; - m_a_save = 0; - m_ac2_save = 0; - m_x_save = 0; - m_y_save = 0; - m_s_save = 0; - m_sl_save = 0; - m_o_save = 0; + m_pb_stack = 0; + m_cb_stack = 0; + m_a_stack = 0; + m_ac2_stack = 0; + m_x_stack = 0; + m_y_stack = 0; + m_s_stack = 0; + m_sl_stack = 0; + m_o_stack = 0; // register for savestates save_item(NAME(m_ac2)); @@ -120,15 +120,15 @@ void tms2100_cpu_device::device_start() save_item(NAME(m_int_pin)); save_item(NAME(m_ec1_pin)); - save_item(NAME(m_pb_save)); - save_item(NAME(m_cb_save)); - save_item(NAME(m_a_save)); - save_item(NAME(m_ac2_save)); - save_item(NAME(m_x_save)); - save_item(NAME(m_y_save)); - save_item(NAME(m_s_save)); - save_item(NAME(m_sl_save)); - save_item(NAME(m_o_save)); + save_item(NAME(m_pb_stack)); + save_item(NAME(m_cb_stack)); + save_item(NAME(m_a_stack)); + save_item(NAME(m_ac2_stack)); + save_item(NAME(m_x_stack)); + save_item(NAME(m_y_stack)); + save_item(NAME(m_s_stack)); + save_item(NAME(m_sl_stack)); + save_item(NAME(m_o_stack)); state_add(++m_state_count, "AC2", m_ac2).formatstr("%01X"); // 9 } @@ -215,15 +215,15 @@ void tms2100_cpu_device::read_opcode() m_il = 0; // restore registers - m_pb = m_pb_save; - m_cb = m_cb_save; - m_a = m_a_save; - m_ac2 = m_ac2_save; - m_x = m_x_save; - m_y = m_y_save; - m_status = m_s_save; - m_status_latch = m_sl_save; - write_o_reg(m_o_save); + m_pb = m_pb_stack; + m_cb = m_cb_stack; + m_a = m_a_stack; + m_ac2 = m_ac2_stack; + m_x = m_x_stack; + m_y = m_y_stack; + m_status = m_s_stack; + m_status_latch = m_sl_stack; + write_o_reg(m_o_stack); } // interrupt pending (blocked during jump opcodes) @@ -247,17 +247,17 @@ void tms2100_cpu_device::interrupt() standard_irq_callback(0, m_rom_address); // save registers - m_pb_save = m_pb; - m_cb_save = m_cb; - m_a_save = m_a; - m_ac2_save = m_ac2; - m_x_save = m_x; - m_y_save = m_y; - m_s_save = m_status; - m_sl_save = m_status_latch; - m_o_save = m_o_index; - - // insert CALL to 0 + m_pb_stack = m_pb; + m_cb_stack = m_cb; + m_a_stack = m_a; + m_ac2_stack = m_ac2; + m_x_stack = m_x; + m_y_stack = m_y; + m_s_stack = m_status; + m_sl_stack = m_status_latch; + m_o_stack = m_o_index; + + // insert CALL to 0 on page 0 m_opcode = 0xc0; m_c4 = 0; m_fixed = m_fixed_decode[m_opcode]; diff --git a/src/devices/cpu/tms1000/tms2100.h b/src/devices/cpu/tms1000/tms2100.h index 019e831ee06..c72edc4952f 100644 --- a/src/devices/cpu/tms1000/tms2100.h +++ b/src/devices/cpu/tms1000/tms2100.h @@ -117,15 +117,15 @@ protected: int m_ec1_pin; // EC1 pin state // interrupt stack - u8 m_pb_save; - u8 m_cb_save; - u8 m_a_save; - u8 m_ac2_save; - u8 m_x_save; - u8 m_y_save; - u8 m_s_save; - u8 m_sl_save; - u8 m_o_save; + u8 m_pb_stack; + u8 m_cb_stack; + u8 m_a_stack; + u8 m_ac2_stack; + u8 m_x_stack; + u8 m_y_stack; + u8 m_s_stack; + u8 m_sl_stack; + u8 m_o_stack; }; class tms2170_cpu_device : public tms2100_cpu_device diff --git a/src/devices/cpu/tms1000/tp0320.cpp b/src/devices/cpu/tms1000/tp0320.cpp index 38140d29566..e4ad6e8f3f4 100644 --- a/src/devices/cpu/tms1000/tp0320.cpp +++ b/src/devices/cpu/tms1000/tp0320.cpp @@ -58,24 +58,6 @@ std::unique_ptr tp0320_cpu_device::create_disassembler() // device_reset -u32 tp0320_cpu_device::decode_micro(offs_t offset) -{ - u32 decode = 0; - - offset = bitswap<6>(offset,0,1,2,3,4,5); // lines are reversed - u32 mask = m_mpla->read(offset); - mask ^= 0x0bff0; // invert active-negative - - // _____ _______ ______ _____ _____ ______ _____ _____ ______ _____ _____ - const u32 md[22] = { M_AUTA, M_AUTY, M_SSS, M_STO, M_YTP, M_NDMTP, M_DMTP, M_MTP, M_CKP, M_15TN, M_CKN, M_MTN, M_NATN, M_ATN, M_CME, M_CIN, M_SSE, M_CKM, M_NE, M_C8, M_SETR, M_RSTR }; - - for (int bit = 0; bit < 22 && bit < m_mpla->outputs(); bit++) - if (mask & (1 << bit)) - decode |= md[bit]; - - return decode; -} - void tp0320_cpu_device::device_reset() { // common reset @@ -97,3 +79,21 @@ void tp0320_cpu_device::device_reset() for (int i = 0xa0; i < 0xa4; i++) m_fixed_decode[i] = F_SBIT; for (int i = 0xa4; i < 0xa8; i++) m_fixed_decode[i] = F_RBIT; } + +u32 tp0320_cpu_device::decode_micro(offs_t offset) +{ + u32 decode = 0; + + offset = bitswap<6>(offset,0,1,2,3,4,5); // lines are reversed + u32 mask = m_mpla->read(offset); + mask ^= 0x0bff0; // invert active-negative + + // _____ _______ ______ _____ _____ ______ _____ _____ ______ _____ _____ + const u32 md[22] = { M_AUTA, M_AUTY, M_SSS, M_STO, M_YTP, M_NDMTP, M_DMTP, M_MTP, M_CKP, M_15TN, M_CKN, M_MTN, M_NATN, M_ATN, M_CME, M_CIN, M_SSE, M_CKM, M_NE, M_C8, M_SETR, M_RSTR }; + + for (int bit = 0; bit < 22 && bit < m_mpla->outputs(); bit++) + if (mask & (1 << bit)) + decode |= md[bit]; + + return decode; +} diff --git a/src/mame/layout/k28m2.lay b/src/mame/layout/k28m2.lay index 7cc4696cb77..5bd32828e17 100644 --- a/src/mame/layout/k28m2.lay +++ b/src/mame/layout/k28m2.lay @@ -4,16 +4,16 @@ license:CC0-1.0 --> - + - + - + diff --git a/src/mame/misc/eva.cpp b/src/mame/misc/eva.cpp index 47587f65a82..8ff6984af6f 100644 --- a/src/mame/misc/eva.cpp +++ b/src/mame/misc/eva.cpp @@ -215,7 +215,7 @@ ROM_START( eva24 ) ROM_LOAD( "4232345", 0x0000, 0x0400, CRC(0326c2fe) SHA1(c4c73badee68f682871b42ba4f5ca115cd68fb8a) ) ROM_REGION( 0x4000, "tms6100", 0 ) - ROM_LOAD( "cm63002.vsm", 0x0000, 0x4000, CRC(cb63c807) SHA1(df7323eebcd2a8a5401c2e0addbbabb700182302) ) + ROM_LOAD( "cm63002", 0x0000, 0x4000, CRC(cb63c807) SHA1(df7323eebcd2a8a5401c2e0addbbabb700182302) ) ROM_END ROM_START( eva11 ) @@ -228,7 +228,7 @@ ROM_START( eva11 ) ROM_LOAD( "tms1000_eva11_output.pla", 0, 365, CRC(f0f36970) SHA1(a6ad1f5e804ac98e5e1a1d07466b3db3a8d6c256) ) ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cm73002.vsm", 0x0000, 0x1000, CRC(d5340bf8) SHA1(81195e8f870275d39a1abe1c8e2a6afdfdb15725) ) + ROM_LOAD( "cm73002", 0x0000, 0x1000, CRC(d5340bf8) SHA1(81195e8f870275d39a1abe1c8e2a6afdfdb15725) ) ROM_END } // anonymous namespace diff --git a/src/mame/ti/snspell.cpp b/src/mame/ti/snspell.cpp index 6b536ff49eb..19f8d85b3c9 100644 --- a/src/mame/ti/snspell.cpp +++ b/src/mame/ti/snspell.cpp @@ -894,8 +894,8 @@ ROM_START( snspell ) ROM_LOAD( "tms0270_tmc271h_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "tmc0351n2l.vsm", 0x0000, 0x4000, CRC(2d03b292) SHA1(a3e9a365307ae936c7472f720a7a8240741531d6) ) - ROM_LOAD( "tmc0352n2l.vsm", 0x4000, 0x4000, CRC(a6d56883) SHA1(eebf9c07f2f9001679dec06c2367d4a50596d04b) ) + ROM_LOAD( "tmc0351n2l", 0x0000, 0x4000, CRC(2d03b292) SHA1(a3e9a365307ae936c7472f720a7a8240741531d6) ) + ROM_LOAD( "tmc0352n2l", 0x4000, 0x4000, CRC(a6d56883) SHA1(eebf9c07f2f9001679dec06c2367d4a50596d04b) ) ROM_END ROM_START( snspellp ) @@ -910,8 +910,8 @@ ROM_START( snspellp ) ROM_LOAD( "tms0270_tmc271_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // using the one from 1st version ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) // using the one from 1st version - ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) // " + ROM_LOAD( "tmc0351nl", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) // using the one from 1st version + ROM_LOAD( "tmc0352nl", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) // " ROM_END ROM_START( snspellua ) @@ -926,8 +926,8 @@ ROM_START( snspellua ) ROM_LOAD( "tms0270_tmc271_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) - ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) + ROM_LOAD( "tmc0351nl", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) + ROM_LOAD( "tmc0352nl", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) ROM_END ROM_START( snspellub ) @@ -942,7 +942,7 @@ ROM_START( snspellub ) ROM_LOAD( "tms0270_tmc271h_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2350a.vsm", 0x0000, 0x4000, CRC(2adda742) SHA1(3f868ed8284b723c815a30343057e03467c043b5) ) + ROM_LOAD( "cd2350a", 0x0000, 0x4000, CRC(2adda742) SHA1(3f868ed8284b723c815a30343057e03467c043b5) ) ROM_END ROM_START( snspelluk ) @@ -957,8 +957,8 @@ ROM_START( snspelluk ) ROM_LOAD( "tms0270_tmc271_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2303.vsm", 0x0000, 0x4000, CRC(0fae755c) SHA1(b68c3120a63a61db474feb5d71a6e5dd67910d80) ) - ROM_LOAD( "cd2304.vsm", 0x4000, 0x4000, CRC(e2a270eb) SHA1(c13c95ad15f1923a4841f66504e0f22646e71d99) ) + ROM_LOAD( "cd2303", 0x0000, 0x4000, CRC(0fae755c) SHA1(b68c3120a63a61db474feb5d71a6e5dd67910d80) ) + ROM_LOAD( "cd2304", 0x4000, 0x4000, CRC(e2a270eb) SHA1(c13c95ad15f1923a4841f66504e0f22646e71d99) ) ROM_END ROM_START( snspelluka ) @@ -973,7 +973,7 @@ ROM_START( snspelluka ) ROM_LOAD( "tms0270_tmc271h_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd62175.vsm", 0x0000, 0x4000, CRC(6e1063d4) SHA1(b5c66c51148c5921ecb8ffccd7a460ae639cdb68) ) + ROM_LOAD( "cd62175", 0x0000, 0x4000, CRC(6e1063d4) SHA1(b5c66c51148c5921ecb8ffccd7a460ae639cdb68) ) ROM_END ROM_START( snspelljp ) @@ -988,8 +988,8 @@ ROM_START( snspelljp ) ROM_LOAD( "tms0270_tmc271h_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2321.vsm", 0x0000, 0x4000, CRC(ac010cce) SHA1(c0200d857b62be696248ac2d684a390c66ab0c31) ) - ROM_LOAD( "cd2322.vsm", 0x4000, 0x4000, CRC(b6f4bba4) SHA1(65d686a9385b5ef3f080a5f47c6b2418bb9455b0) ) + ROM_LOAD( "cd2321", 0x0000, 0x4000, CRC(ac010cce) SHA1(c0200d857b62be696248ac2d684a390c66ab0c31) ) + ROM_LOAD( "cd2322", 0x4000, 0x4000, CRC(b6f4bba4) SHA1(65d686a9385b5ef3f080a5f47c6b2418bb9455b0) ) ROM_END ROM_START( snspellsp ) @@ -1004,8 +1004,8 @@ ROM_START( snspellsp ) ROM_LOAD( "tms0270_cd2701_output.pla", 0, 1246, CRC(f26980bd) SHA1(8d0c98fe5240541cb53c1e1d14c2a4560e7a7f32) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2319.vsm", 0x0000, 0x4000, CRC(f293ac2f) SHA1(6f941743efcc2f05e514ce07167c094c554dca5d) ) - ROM_LOAD( "cd2320.vsm", 0x4000, 0x4000, CRC(16b68766) SHA1(a9ea335b4487cc333268bfd2e71428258968461d) ) + ROM_LOAD( "cd2319", 0x0000, 0x4000, CRC(f293ac2f) SHA1(6f941743efcc2f05e514ce07167c094c554dca5d) ) + ROM_LOAD( "cd2320", 0x4000, 0x4000, CRC(16b68766) SHA1(a9ea335b4487cc333268bfd2e71428258968461d) ) ROM_END ROM_START( snspellfr ) @@ -1020,7 +1020,7 @@ ROM_START( snspellfr ) ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2352.vsm", 0x0000, 0x4000, CRC(181a239e) SHA1(e16043766c385e152b7005c1c010be4c5fccdd9b) ) + ROM_LOAD( "cd2352", 0x0000, 0x4000, CRC(181a239e) SHA1(e16043766c385e152b7005c1c010be4c5fccdd9b) ) ROM_END ROM_START( snspellit ) @@ -1035,7 +1035,7 @@ ROM_START( snspellit ) ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd62190.vsm", 0x0000, 0x4000, CRC(63832002) SHA1(ea8124b2bf0f5908c5f1a56d60063f2468a10143) ) + ROM_LOAD( "cd62190", 0x0000, 0x4000, CRC(63832002) SHA1(ea8124b2bf0f5908c5f1a56d60063f2468a10143) ) ROM_END @@ -1051,8 +1051,8 @@ ROM_START( snmath ) ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) - ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) - ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) + ROM_LOAD( "cd2392", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) + ROM_LOAD( "cd2393", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) ROM_END ROM_START( snmatha ) @@ -1067,8 +1067,8 @@ ROM_START( snmatha ) ROM_LOAD( "tms0270_cd2708_output.pla", 0, 1246, CRC(1abad753) SHA1(53d20b519ed73ce248368047a056836afbe3cd46) ) ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) - ROM_LOAD( "cd2381.vsm", 0x0000, 0x4000, CRC(f048dc81) SHA1(e97667d1002de40ab3d702c63b82311480032e0f) ) - ROM_LOAD( "cd2614.vsm", 0x4000, 0x1000, CRC(11989074) SHA1(0e9cf906de9bcdf4acb425535dc442846fc48fa2) ) + ROM_LOAD( "cd2381", 0x0000, 0x4000, CRC(f048dc81) SHA1(e97667d1002de40ab3d702c63b82311480032e0f) ) + ROM_LOAD( "cd2614", 0x4000, 0x1000, CRC(11989074) SHA1(0e9cf906de9bcdf4acb425535dc442846fc48fa2) ) ROM_RELOAD( 0x5000, 0x1000 ) ROM_RELOAD( 0x6000, 0x1000 ) ROM_RELOAD( 0x7000, 0x1000 ) @@ -1088,8 +1088,8 @@ ROM_START( snmathp ) ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) // using the one from 1st version ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) - ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) // using the one from 1st version - ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) // " + ROM_LOAD( "cd2392", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) // using the one from 1st version + ROM_LOAD( "cd2393", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) // " ROM_END @@ -1105,8 +1105,8 @@ ROM_START( snread ) ROM_LOAD( "tms0270_cd2705_output.pla", 0, 1246, CRC(bf859848) SHA1(66b297fbf534968fa6db7413b99ef0e81cc35ddc) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2394a.vsm", 0x0000, 0x4000, CRC(cbb0e2b1) SHA1(5e322c683baf806523de171310258ae371671327) ) - ROM_LOAD( "cd2395a.vsm", 0x4000, 0x4000, CRC(3d519504) SHA1(76b19ba5a9a3486005e09c98e8a6abc8b88288dd) ) + ROM_LOAD( "cd2394a", 0x0000, 0x4000, CRC(cbb0e2b1) SHA1(5e322c683baf806523de171310258ae371671327) ) + ROM_LOAD( "cd2395a", 0x4000, 0x4000, CRC(3d519504) SHA1(76b19ba5a9a3486005e09c98e8a6abc8b88288dd) ) ROM_END diff --git a/src/mame/ti/snspellc.cpp b/src/mame/ti/snspellc.cpp index 38c2bc74359..c81325214df 100644 --- a/src/mame/ti/snspellc.cpp +++ b/src/mame/ti/snspellc.cpp @@ -755,7 +755,7 @@ ROM_START( snspellc ) ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2354a.vsm", 0x0000, 0x4000, CRC(548a940c) SHA1(c37e620c4c70a05cbaaff9a166c6da2e2420196f) ) + ROM_LOAD( "cd2354a", 0x0000, 0x4000, CRC(548a940c) SHA1(c37e620c4c70a05cbaaff9a166c6da2e2420196f) ) ROM_END ROM_START( snspellca ) @@ -768,7 +768,7 @@ ROM_START( snspellca ) ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2354.vsm", 0x0000, 0x4000, CRC(3af3232e) SHA1(f89d90dca209ee612634d664d5d4562f1d1786cf) ) + ROM_LOAD( "cd2354", 0x0000, 0x4000, CRC(3af3232e) SHA1(f89d90dca209ee612634d664d5d4562f1d1786cf) ) ROM_END ROM_START( snwrite ) @@ -781,7 +781,7 @@ ROM_START( snwrite ) ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd62174a.vsm", 0x0000, 0x4000, CRC(b7bbaaf3) SHA1(9eb949fcf522982f9c3c4649f207703b746b90ef) ) + ROM_LOAD( "cd62174a", 0x0000, 0x4000, CRC(b7bbaaf3) SHA1(9eb949fcf522982f9c3c4649f207703b746b90ef) ) ROM_END @@ -795,7 +795,7 @@ ROM_START( mathsmag ) ROM_LOAD( "tms1100_mathsmag_output.pla", 0, 365, CRC(d21f19a2) SHA1(9781da173d473c255fa5cc5fcc8ae09c097c682d) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge? - ROM_LOAD( "cd62173a.vsm", 0x0000, 0x4000, CRC(a7230863) SHA1(8a6d1742fb94555f3b3fe37554a7c46fe4213116) ) + ROM_LOAD( "cd62173a", 0x0000, 0x4000, CRC(a7230863) SHA1(8a6d1742fb94555f3b3fe37554a7c46fe4213116) ) ROM_END @@ -809,7 +809,7 @@ ROM_START( tntell ) ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) + ROM_LOAD( "cd2610", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) ROM_END ROM_START( tntelluk ) @@ -822,7 +822,7 @@ ROM_START( tntelluk ) ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd62170.vsm", 0x0000, 0x4000, CRC(6dc9d072) SHA1(9d2c9ff57c4f8fe69768666ffa41fcac649279ef) ) + ROM_LOAD( "cd62170", 0x0000, 0x4000, CRC(6dc9d072) SHA1(9d2c9ff57c4f8fe69768666ffa41fcac649279ef) ) ROM_END ROM_START( tntellfr ) @@ -835,7 +835,7 @@ ROM_START( tntellfr ) ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd62171.vsm", 0x0000, 0x4000, CRC(cc26f7d1) SHA1(2b03e37b3bf3cbeca36980acfc45246dac706b83) ) + ROM_LOAD( "cd62171", 0x0000, 0x4000, CRC(cc26f7d1) SHA1(2b03e37b3bf3cbeca36980acfc45246dac706b83) ) ROM_END ROM_START( tntellp ) @@ -848,7 +848,7 @@ ROM_START( tntellp ) ROM_LOAD( "tms1100_us4403965_output.pla", 0, 365, CRC(66cfb3c3) SHA1(80a05e5d729518e1f35d8f26438f56e80ffbd003) ) ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) + ROM_LOAD( "cd2610", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) ROM_END @@ -862,7 +862,7 @@ ROM_START( vocaid ) ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // same hw as tntell, but no external slot - ROM_LOAD( "cd2357.vsm", 0x0000, 0x4000, CRC(19c251fa) SHA1(8f8163069f32413379e7e1681ce6a4d0819d4ebc) ) + ROM_LOAD( "cd2357", 0x0000, 0x4000, CRC(19c251fa) SHA1(8f8163069f32413379e7e1681ce6a4d0819d4ebc) ) ROM_END } // anonymous namespace diff --git a/src/mame/ti/spellb.cpp b/src/mame/ti/spellb.cpp index 624c717f0ba..f5d546a120d 100644 --- a/src/mame/ti/spellb.cpp +++ b/src/mame/ti/spellb.cpp @@ -492,7 +492,7 @@ ROM_START( spellb ) ROM_LOAD( "tms0270_spellb_output.pla", 0, 1246, CRC(b95e35e6) SHA1(430917486856c9e6c28af10ff3758242048096c4) ) ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cd2602.vsm", 0x0000, 0x1000, CRC(dd1fff8c) SHA1(f1760b29aa50fc96a1538db814cc73289654ac25) ) + ROM_LOAD( "cd2602", 0x0000, 0x1000, CRC(dd1fff8c) SHA1(f1760b29aa50fc96a1538db814cc73289654ac25) ) ROM_END ROM_START( spellabc ) @@ -507,7 +507,7 @@ ROM_START( spellabc ) ROM_LOAD( "tms0270_spellb_output.pla", 0, 1246, CRC(b95e35e6) SHA1(430917486856c9e6c28af10ff3758242048096c4) ) ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cd2607.vsm", 0x0000, 0x1000, CRC(875090c0) SHA1(73b87fff64054f6ab3b7e69d89585582145dbaa7) ) + ROM_LOAD( "cd2607", 0x0000, 0x1000, CRC(875090c0) SHA1(73b87fff64054f6ab3b7e69d89585582145dbaa7) ) ROM_END ROM_START( spellba ) @@ -545,7 +545,7 @@ ROM_START( mrchalgr ) ROM_LOAD( "tms0270_mrchalgr_output.pla", 0, 1246, CRC(4785289c) SHA1(60567af0ea120872a4ccf3128e1365fe84722aa8) ) ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cd2601.vsm", 0x0000, 0x1000, CRC(a9fbe7e9) SHA1(9d480cb30313b8cbce2d048140c1e5e6c5b92452) ) + ROM_LOAD( "cd2601", 0x0000, 0x1000, CRC(a9fbe7e9) SHA1(9d480cb30313b8cbce2d048140c1e5e6c5b92452) ) ROM_END ROM_START( letterlf ) @@ -560,7 +560,7 @@ ROM_START( letterlf ) ROM_LOAD( "tms0270_mrchalgr_output.pla", 0, 1246, CRC(4785289c) SHA1(60567af0ea120872a4ccf3128e1365fe84722aa8) ) ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cd2603.vsm", 0x0000, 0x1000, CRC(70ac954b) SHA1(5593a5844063acdf399600e3e842f0fbe712ba69) ) + ROM_LOAD( "cd2603", 0x0000, 0x1000, CRC(70ac954b) SHA1(5593a5844063acdf399600e3e842f0fbe712ba69) ) ROM_END ROM_START( letterlg ) @@ -575,7 +575,7 @@ ROM_START( letterlg ) ROM_LOAD( "tms0270_mrchalgr_output.pla", 0, 1246, CRC(4785289c) SHA1(60567af0ea120872a4ccf3128e1365fe84722aa8) ) ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cd2604.vsm", 0x0000, 0x1000, CRC(cdb6f039) SHA1(56f512720c5e80cd74b65e31d5a19bf1260017fb) ) + ROM_LOAD( "cd2604", 0x0000, 0x1000, CRC(cdb6f039) SHA1(56f512720c5e80cd74b65e31d5a19bf1260017fb) ) ROM_END } // anonymous namespace diff --git a/src/mame/tiger/k28.cpp b/src/mame/tiger/k28.cpp index 1358e35b4ff..c5560d43dfd 100644 --- a/src/mame/tiger/k28.cpp +++ b/src/mame/tiger/k28.cpp @@ -263,7 +263,7 @@ static INPUT_PORTS_START( k28 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") PORT_START("IN.5") @@ -330,8 +330,8 @@ ROM_START( k28 ) ROM_LOAD( "p8021", 0x0000, 0x0400, CRC(15536d20) SHA1(fac98ce652340ffb2d00952697c3a9ce75393fa4) ) ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff? = space reserved for cartridge - ROM_LOAD( "cm62050.vsm", 0x0000, 0x4000, CRC(6afb8645) SHA1(e22435568ed11c6516a3b4008131f99cd4e47aa9) ) - ROM_LOAD( "cm62051.vsm", 0x4000, 0x4000, CRC(0fa61baa) SHA1(831be669423ba60c7f85a896b4b09a1295478bd9) ) + ROM_LOAD( "cm62050", 0x0000, 0x4000, CRC(6afb8645) SHA1(e22435568ed11c6516a3b4008131f99cd4e47aa9) ) + ROM_LOAD( "cm62051", 0x4000, 0x4000, CRC(0fa61baa) SHA1(831be669423ba60c7f85a896b4b09a1295478bd9) ) ROM_END } // anonymous namespace diff --git a/src/mame/tiger/k28m2.cpp b/src/mame/tiger/k28m2.cpp index 7f5c5d59f52..920c069f277 100644 --- a/src/mame/tiger/k28m2.cpp +++ b/src/mame/tiger/k28m2.cpp @@ -4,21 +4,21 @@ /******************************************************************************* Tiger Electronics K28 (model 7-232) Sold in Hong Kong, distributed in US as: -- Coleco: Talking Teacher +- Coleco: Talking Teacher (model 8100) - Sears: Talkatron: Learning Computer 1981 K28 models 7-230 and 7-231 are on different hardware, showing a different keyboard, VFD, and use the SC-01 speech chip. --> driver k28.cpp Hardware notes: +- PCB label: 201223A (main), REV0 ET828D (LCD) - MCU: TMS1400 MP7324 (die label: TMS1400, MP7324, 28L 01D D000 R100) -- TMS51xx: TMS5110A +- TMS51xx: TMS5110ANL - VSM: 16KB CM62084 - LCD: SMC1112 MCU under epoxy (die label: SMC1112 D2N0), 8*14-seg display - module slot (not compatible with the 1981 version(s)) TODO: -- emulate LCD - dump/add module #5 *******************************************************************************/ @@ -51,7 +51,8 @@ public: m_tms5100(*this, "tms5100"), m_tms6100(*this, "tms6100"), m_cart(*this, "cartslot"), - m_inputs(*this, "IN.%u", 0) + m_inputs(*this, "IN.%u", 0), + m_digits(*this, "digit%u", 0U) { } void k28m2(machine_config &config); @@ -70,25 +71,33 @@ private: required_device m_tms6100; optional_device m_cart; required_ioport_array<9> m_inputs; + output_finder<8> m_digits; void power_off(); u8 read_k(); void write_o(u16 data); void write_r(u32 data); + u8 sub_read_k(); + void write_segs(offs_t offset, u32 data); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); bool m_power_on = false; u16 m_inp_mux = 0; u32 m_r = 0; + u32 m_digit_data[4] = { }; }; void k28m2_state::machine_start() { + m_digits.resolve(); + // register for savestates save_item(NAME(m_power_on)); save_item(NAME(m_inp_mux)); save_item(NAME(m_r)); + save_item(NAME(m_digit_data)); } @@ -101,6 +110,7 @@ void k28m2_state::machine_reset() { m_power_on = true; m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + m_subcpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); } INPUT_CHANGED_MEMBER(k28m2_state::power_on) @@ -113,6 +123,11 @@ void k28m2_state::power_off() { m_power_on = false; m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + + // clear display + for (int i = 0; i < 8; i++) + m_digits[i] = 0; } @@ -128,7 +143,7 @@ DEVICE_IMAGE_LOAD_MEMBER(k28m2_state::cart_load) if (size > 0x4000) return std::make_pair(image_error::INVALIDLENGTH, "Invalid image file size (must be no more than 16K)"); - u8 *const base = memregion("tms6100")->base() + 0x8000; + u8 *const base = memregion("tms6100")->base() + 0x4000; m_cart->common_load_rom(base, size, "rom"); return std::make_pair(std::error_condition(), std::string()); @@ -140,6 +155,8 @@ DEVICE_IMAGE_LOAD_MEMBER(k28m2_state::cart_load) I/O *******************************************************************************/ +// maincpu side + void k28m2_state::write_r(u32 data) { // R1234: TMS5100 CTL8421 @@ -152,8 +169,8 @@ void k28m2_state::write_r(u32 data) // R5: input mux high bit m_inp_mux = (m_inp_mux & 0xff) | (data << 3 & 0x100); - // R7-R10: LCD data - //TODO.. + // R7-R10: subcpu K interrupt + m_subcpu->set_input_line(SMC1102_INPUT_LINE_K, (data & 0x780) ? ASSERT_LINE : CLEAR_LINE); // R6: power-off request, on falling edge if (~data & m_r & 0x40) @@ -182,6 +199,30 @@ u8 k28m2_state::read_k() } +// subcpu side + +void k28m2_state::write_segs(offs_t offset, u32 data) +{ + m_digit_data[offset & 3] = data; + + for (int d = 0; d < 8; d++) + { + // 4 segments per common + u16 segs = 0; + for (int i = 0; i < 4; i++) + segs = segs << 4 | (m_digit_data[i] >> (d * 4) & 0xf); + + m_digits[d] = bitswap<14>(segs,6,10,13,1,5,9,11,8,12,4,2,7,15,14); + } +} + +u8 k28m2_state::sub_read_k() +{ + // K: maincpu R7-R10 + return m_r >> 7 & 0xf; +} + + /******************************************************************************* Input Ports @@ -260,6 +301,10 @@ void k28m2_state::k28m2(machine_config &config) m_maincpu->write_r().set(FUNC(k28m2_state::write_r)); SMC1112(config, m_subcpu, 32.768_kHz_XTAL); + m_subcpu->read_k().set(FUNC(k28m2_state::sub_read_k)); + m_subcpu->write_segs().set(FUNC(k28m2_state::write_segs)); + + config.set_perfect_quantum(m_subcpu); config.set_default_layout(layout_k28m2); @@ -290,7 +335,7 @@ void k28m2_state::k28m2(machine_config &config) ROM_START( k28m2 ) ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7324", 0x0000, 0x1000, CRC(08d15ab6) SHA1(5b0f6c53e6732a362c4bb25d966d4072fdd33db8) ) + ROM_LOAD( "mp7324", 0x0000, 0x1000, CRC(8d304cf2) SHA1(d649b6477ea8634b3a3ba34dde7e5e913855801f) ) ROM_REGION( 867, "maincpu:mpla", 0 ) ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) @@ -298,10 +343,10 @@ ROM_START( k28m2 ) ROM_LOAD( "tms1400_k28m2_output.pla", 0, 557, CRC(3a5c7005) SHA1(3fe5819c138a90e7fc12817415f2622ca81b40b2) ) ROM_REGION( 0x0800, "subcpu", 0 ) - ROM_LOAD( "smc1112_d2n0", 0x0000, 0x0800, NO_DUMP ) + ROM_LOAD( "smc1112_d2n0", 0x0000, 0x0800, CRC(e985fd67) SHA1(a0b0280920bf0ac02a1aaf02d534dddbae829433) ) - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff? = space reserved for cartridge - ROM_LOAD( "cm62084.vsm", 0x0000, 0x4000, CRC(cd1376f7) SHA1(96fa484c392c451599bc083b8376cad9c998df7d) ) + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge + ROM_LOAD( "cm62084", 0x0000, 0x4000, CRC(cd1376f7) SHA1(96fa484c392c451599bc083b8376cad9c998df7d) ) ROM_END } // anonymous namespace @@ -313,4 +358,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -COMP( 1985, k28m2, 0, 0, k28m2, k28m2, k28m2_state, empty_init, "Tiger Electronics", "K28: Talking Learning Computer (model 7-232)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) +COMP( 1985, k28m2, 0, 0, k28m2, k28m2, k28m2_state, empty_init, "Tiger Electronics", "K28: Talking Learning Computer (model 7-232)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -- cgit v1.2.3