diff options
author | 2017-06-24 16:05:07 +0200 | |
---|---|---|
committer | 2017-06-24 16:15:08 +0200 | |
commit | 9814aba49eef1c6a810eac4349d2ed4763abdc0f (patch) | |
tree | eb44a545a75e32a8bb66189aea15bc69f644068e | |
parent | d28c2b807ea3d968a11f9d87e92b63f6fbea2e67 (diff) |
ti99: Added new cartridge type paged7 for TI-CALC.
-rw-r--r-- | hash/ti99_cart.xml | 17 | ||||
-rw-r--r-- | src/devices/bus/ti99/gromport/cartridges.cpp | 79 | ||||
-rw-r--r-- | src/devices/bus/ti99/gromport/cartridges.h | 9 |
3 files changed, 103 insertions, 2 deletions
diff --git a/hash/ti99_cart.xml b/hash/ti99_cart.xml index 48966f6d0fa..8687d42bc0a 100644 --- a/hash/ti99_cart.xml +++ b/hash/ti99_cart.xml @@ -5020,4 +5020,21 @@ </part> </software> +<!-- Softlist entry for TI-CALC. --> + <software name="ticalc"> + <description>TI-CALC</description> + <year>1983</year> + <publisher>Texas Instruments</publisher> + <info name="serial" value="PHM 3213"/> + <part name="cart" interface="ti99_cart"> + <feature name="pcb" value="paged7" /> + <dataarea name="grom" size="0x2000"> + <rom name="phm3213_g3.bin" size="0x1800" crc="d68df037" sha1="fce2fb8928018492d30256588d3040ef5c654faa" offset="0x0000" /> + </dataarea> + <dataarea name="rom" size="0x4000"> + <rom name="phm3213_r1.bin" size="0x2000" crc="0451b0f9" sha1="fce0f47d07cdda537ae5c9b9c831978423da854f" offset="0x0000" /> + <rom name="phm3213_r2.bin" size="0x2000" crc="80749ad6" sha1="018b9c847645dd682cad1113e3d7a4c9f231f685" offset="0x2000" /> + </dataarea> + </part> + </software> </softwarelist> diff --git a/src/devices/bus/ti99/gromport/cartridges.cpp b/src/devices/bus/ti99/gromport/cartridges.cpp index f90d6a5fb6e..10780a6f0c2 100644 --- a/src/devices/bus/ti99/gromport/cartridges.cpp +++ b/src/devices/bus/ti99/gromport/cartridges.cpp @@ -49,7 +49,8 @@ enum PCB_PAGED378, PCB_PAGED377, PCB_PAGEDCRU, - PCB_GROMEMU + PCB_GROMEMU, + PCB_PAGED7 }; static const pcb_type pcbdefs[] = @@ -65,6 +66,7 @@ static const pcb_type pcbdefs[] = { PCB_PAGED377, "paged377" }, { PCB_PAGEDCRU, "pagedcru" }, { PCB_GROMEMU, "gromemu" }, + { PCB_PAGED7, "paged7" }, { 0, nullptr} }; @@ -77,6 +79,7 @@ static const pcb_type sw_pcbdefs[] = { PCB_SUPER, "super" }, { PCB_MBX, "mbx" }, { PCB_GROMEMU, "gromemu" }, + { PCB_PAGED7, "paged7" }, { 0, nullptr} }; @@ -257,6 +260,10 @@ image_init_result ti99_cartridge_device::call_load() if (TRACE_CONFIG) logerror("Paged PCB 16K\n"); m_pcb = std::make_unique<ti99_paged16k_cartridge>(); break; + case PCB_PAGED7: + if (TRACE_CONFIG) logerror("Paged PCB 7000\n"); + m_pcb = std::make_unique<ti99_paged7_cartridge>(); + break; case PCB_MINIMEM: if (TRACE_CONFIG) logerror("Minimem PCB\n"); m_pcb = std::make_unique<ti99_minimem_cartridge>(); @@ -860,7 +867,7 @@ WRITE8_MEMBER(ti99_super_cartridge::cruwrite) | |= RAM =| | |=== ROM bank 0 ==| |===== ROM bank 1 ====| 6ffe = 01 | | - |===== ROM bank 3 ====| 6ffe = 02 + |===== ROM bank 2 ====| 6ffe = 02 | | |===== ROM bank 3 ====| 6ffe = 03 @@ -934,6 +941,74 @@ WRITE8_MEMBER(ti99_mbx_cartridge::write) } } + +/***************************************************************************** + Cartridge type: paged7 + GROM: up to 5 GROMs (sockets for a maximum of 3 GROMs, but may be stacked) + ROM: up to 16 KiB (in up to 2 banks of 8KiB each) + ROM mapper: 7000, 7002, 7004, 7006 + + GROM space + 6000 77ff 8000 97ff a000 b7ff c000 d7ff e000 f7ff + |== GROM3 ==|...|== GROM4 ==|...|== GROM5 ==|...|== GROM6 ==|...|== GROM7 ==| + + ROM space + 6000 7000 7fff + | | | + | |===== ROM bank 0 ====| write to 7000 + | | | + |=== ROM bank 0 =========|===== ROM bank 1 ====| write to 7002 + | | + |===== ROM bank 2 ====| write to 7004 + | | + |===== ROM bank 3 ====| write to 7006 + + This is very similar to the MBX scheme, only that the bank switch is + done by writing to the first words of the 7000 space. Also, there is no + additional RAM. + +******************************************************************************/ + +/* Read function for the paged7 cartridge. */ +READ8Z_MEMBER(ti99_paged7_cartridge::readz) +{ + if (m_romspace_selected) + { + if (m_rom_ptr!=nullptr) + { + if ((offset & 0x1000)==0x0000) // 6000 area + *value = m_rom_ptr[offset]; + else // 7000 area + *value = m_rom_ptr[(offset & 0x0fff) | (m_rom_page << 12)]; + + if (TRACE_READ) m_cart->logerror("%04x(%04x) -> %02x\n", offset + 0x6000, offset | (m_rom_page<<13), *value); + } + } + else + { + gromreadz(space, offset, value, mem_mask); + } +} + +/* Write function for the paged7 cartridge. */ +WRITE8_MEMBER(ti99_paged7_cartridge::write) +{ + if (m_romspace_selected) + { + // 0111 0000 0000 0110 + if ((offset & 0x1ff9) == 0x1000) // Mapper + { + // Valid values are 0, 1, 2, 3 + m_rom_page = (offset>>1) & 3; + if (TRACE_BANKSWITCH) if ((offset & 1)==0) m_cart->logerror("Set ROM page = %d (writing to %04x)\n", m_rom_page, (offset | 0x6000)); + } + } + else + { + gromwrite(space, offset, data, mem_mask); + } +} + /***************************************************************************** Cartridge type: paged379i This cartridge consists of one 16 KiB, 32 KiB, 64 KiB, or 128 KiB EEPROM diff --git a/src/devices/bus/ti99/gromport/cartridges.h b/src/devices/bus/ti99/gromport/cartridges.h index 1e4cc5b2956..dd7a4752862 100644 --- a/src/devices/bus/ti99/gromport/cartridges.h +++ b/src/devices/bus/ti99/gromport/cartridges.h @@ -272,6 +272,15 @@ public: DECLARE_WRITE8_MEMBER(write) override; }; +/*********** Paged7 cartridge (late carts) ********************/ + +class ti99_paged7_cartridge : public ti99_cartridge_pcb +{ +public: + DECLARE_READ8Z_MEMBER(readz) override; + DECLARE_WRITE8_MEMBER(write) override; +}; + /********************** Mini Memory ***********************************/ class ti99_minimem_cartridge : public ti99_cartridge_pcb |