mirror of
https://github.com/holub/mame
synced 2025-04-19 23:12:11 +03:00
ti99: Added a new cartridge type for RXB cartridges
This commit is contained in:
parent
0df1b89e6f
commit
0fc7621c9e
@ -1386,7 +1386,7 @@
|
||||
<year>198?</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="xb25g.bin" size="0xa000" crc="80b33ca1" sha1="664ae7f2810df6942480634288df31b9567df72c" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -1405,7 +1405,7 @@
|
||||
<publisher><unknown></publisher>
|
||||
<info name="comment" value="Standard Exbasic with additional functions. Maybe @apesoft."/>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="xbapeg.bin" size="0xa000" crc="a27f2f5e" sha1="d9614cd24eb04cb61ecf7c29e42029adfd4bbafc" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -2983,7 +2983,7 @@
|
||||
<publisher>Western Horizon</publisher>
|
||||
<info name="version" value="1002"/>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="rxbv2g.bin" size="0xa000" crc="8e07abd2" sha1="ad12ccd39d2a8d0a65d6b1a82fbaddafa1a1f89d" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -3002,7 +3002,7 @@
|
||||
<publisher>Rich Gilbertson</publisher>
|
||||
<info name="version" value="2002"/>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="rxb2k2g.bin" size="0xa000" crc="350c4945" sha1="f1417afe7841146903a5182beeeebaf154d21e06" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -3021,7 +3021,7 @@
|
||||
<publisher>Rich Gilbertson</publisher>
|
||||
<info name="version" value="2.37"/>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="rxb237g.bin" size="0xa000" crc="34cb2778" sha1="2368f8aeb810ce198180e0da31ac7a5b548bb2b2" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -3040,7 +3040,7 @@
|
||||
<publisher>Rich Gilbertson</publisher>
|
||||
<info name="version" value="2.4"/>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="rxb24g.bin" size="0xa000" crc="15b3406b" sha1="aa04abd00f16a08ee336d788a5cc0fc0a9a9a917" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -3059,7 +3059,7 @@
|
||||
<publisher>Rich Gilbertson</publisher>
|
||||
<info name="version" value="2.6"/>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="rxb26g.bin" size="0xa000" crc="fb887f39" sha1="26df9cc148b7827d4fc65a117a1fe254febdc388" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -3077,7 +3077,7 @@
|
||||
<year>19??</year>
|
||||
<publisher>Rich Gilbertson</publisher>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="rxbg.bin" size="0xa000" crc="8700ecb5" sha1="ca19389a99d4928f570f8c708787daa0a557ba8a" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -3095,7 +3095,7 @@
|
||||
<year>19??</year>
|
||||
<publisher>Rich Gilbertson</publisher>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="dump_g.bin" size="0xa000" crc="3bbaba2c" sha1="8b55e7c5f20b1e6366fd7047b0630b6d22af31f0" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -3113,7 +3113,7 @@
|
||||
<year>19??</year>
|
||||
<publisher>Rich Gilbertson</publisher>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="dump_g.bin" size="0xa000" crc="e8c04156" sha1="4145c28c252dc6d8f94164fb5a9f501f633587eb" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -3131,7 +3131,7 @@
|
||||
<year>1992</year>
|
||||
<publisher>Cadd Electronics - Rich Gilbertson</publisher>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="dump_g.bin" size="0xa000" crc="0d3ff2bd" sha1="de686366ff69892fa2e801f8364f2b09a71f4d5e" offset="0x0000" />
|
||||
</dataarea>
|
||||
@ -3989,7 +3989,7 @@
|
||||
<publisher>Triton</publisher>
|
||||
<info name="version" value="120"/>
|
||||
<part name="cart" interface="ti99_cart">
|
||||
<feature name="pcb" value="paged"/>
|
||||
<feature name="pcb" value="gromemu"/>
|
||||
<dataarea name="grom_socket" size="0xa000">
|
||||
<rom name="superxbg.bin" size="0xa000" crc="a94cfd99" sha1="12f1871c8e2dc39a474a78739dd2bd243b755eaf" offset="0x0000" />
|
||||
</dataarea>
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
LEFT
|
||||
|
||||
RESET* 1||2 GND
|
||||
/RESET 1||2 GND
|
||||
D7 3||4 CRUCLK
|
||||
D6 5||6 CRUIN
|
||||
D5 7||8 A15/CRUOUT
|
||||
@ -1053,7 +1053,8 @@ enum
|
||||
PCB_SUPER,
|
||||
PCB_MBX,
|
||||
PCB_PAGED379I,
|
||||
PCB_PAGEDCRU
|
||||
PCB_PAGEDCRU,
|
||||
PCB_GROMEMU
|
||||
};
|
||||
|
||||
static const pcb_type pcbdefs[] =
|
||||
@ -1065,6 +1066,7 @@ static const pcb_type pcbdefs[] =
|
||||
{ PCB_MBX, "mbx" },
|
||||
{ PCB_PAGED379I, "paged379i" },
|
||||
{ PCB_PAGEDCRU, "pagedcru" },
|
||||
{ PCB_GROMEMU, "gromemu" },
|
||||
{ 0, NULL}
|
||||
};
|
||||
|
||||
@ -1073,6 +1075,7 @@ static const pcb_type sw_pcbdefs[] =
|
||||
{
|
||||
{ PCB_STANDARD, "standard" },
|
||||
{ PCB_PAGED, "paged" },
|
||||
{ PCB_GROMEMU, "gromemu" },
|
||||
{ 0, NULL}
|
||||
};
|
||||
|
||||
@ -1099,9 +1102,10 @@ void ti99_cartridge_device::prepare_cartridge()
|
||||
|
||||
if (m_pcb->m_grom_size > 0)
|
||||
{
|
||||
regg = memregion("grom_contents");
|
||||
regg = memregion(CARTGROM_TAG);
|
||||
grom_ptr = m_softlist? get_software_region("grom_socket") : (UINT8*)m_rpk->get_contents_of_socket("grom_socket");
|
||||
memcpy(regg->base(), grom_ptr, m_pcb->m_grom_size);
|
||||
m_pcb->m_grom_ptr = regg->base(); // for gromemu
|
||||
|
||||
// Find the GROMs and keep their pointers
|
||||
m_pcb->set_grom_pointer(0, subdevice(GROM3_TAG));
|
||||
@ -1115,7 +1119,7 @@ void ti99_cartridge_device::prepare_cartridge()
|
||||
if (m_pcb->m_rom_size > 0)
|
||||
{
|
||||
if (VERBOSE>6) LOG("gromport: rom_socket.size=0x%04x\n", m_pcb->m_rom_size);
|
||||
regr = memregion("rom_contents");
|
||||
regr = memregion(CARTROM_TAG);
|
||||
m_pcb->m_rom_ptr = m_softlist? get_software_region("rom_socket") : (UINT8*)m_rpk->get_contents_of_socket("rom_socket");
|
||||
memcpy(regr->base(), m_pcb->m_rom_ptr, m_pcb->m_rom_size);
|
||||
}
|
||||
@ -1124,7 +1128,7 @@ void ti99_cartridge_device::prepare_cartridge()
|
||||
if (rom2_length > 0)
|
||||
{
|
||||
// sizes do not differ between rom and rom2
|
||||
regr2 = memregion("rom2_contents");
|
||||
regr2 = memregion(CARTROM2_TAG);
|
||||
m_pcb->m_rom2_ptr = m_softlist? get_software_region("rom2_socket") : (UINT8*)m_rpk->get_contents_of_socket("rom2_socket");
|
||||
memcpy(regr2->base(), m_pcb->m_rom2_ptr, rom2_length);
|
||||
}
|
||||
@ -1233,6 +1237,10 @@ bool ti99_cartridge_device::call_load()
|
||||
if (VERBOSE>6) LOG("gromport.cartridge_device: PagedCRU PCB\n");
|
||||
m_pcb = new ti99_pagedcru_cartridge();
|
||||
break;
|
||||
case PCB_GROMEMU:
|
||||
if (VERBOSE>6) LOG("gromport.cartridge_device: GromEmulation PCB\n");
|
||||
m_pcb = new ti99_gromemu_cartridge();
|
||||
break;
|
||||
}
|
||||
|
||||
prepare_cartridge();
|
||||
@ -1463,8 +1471,9 @@ WRITE8_MEMBER(ti99_paged_cartridge::write)
|
||||
if ((offset & GROM_MASK)==GROM_AREA)
|
||||
gromwrite(space, offset, data, mem_mask);
|
||||
|
||||
else
|
||||
else {
|
||||
m_rom_page = (offset >> 1) & 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@ -1796,6 +1805,104 @@ void ti99_pagedcru_cartridge::cruwrite(offs_t offset, UINT8 data)
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Cartridge type: GROM emulation/paged
|
||||
|
||||
This cartridge offers GROM address space without real GROM circuits. The GROMs
|
||||
are emulated by a normal EPROM with a circuits that mimics GROM behavior.
|
||||
Each simulated GROM offers 8K (real GROMs only offer 6K).
|
||||
|
||||
Some assumptions:
|
||||
- No readable address counter. This means the parallel console GROMs
|
||||
will deliver the address when reading.
|
||||
- No wait states. Reading is generally faster than with real GROMs.
|
||||
- No wrapping at 8K boundaries.
|
||||
- Two pages of ROM at address 6000
|
||||
|
||||
If any of these fails, the cartridge will crash, so we'll see.
|
||||
|
||||
Typical cartridges: RXB, Super Extended Basic
|
||||
|
||||
For the sake of simplicity, we register GROMs like the other PCB types, but
|
||||
we implement special access methods for the GROM space.
|
||||
|
||||
Still not working:
|
||||
rxb1002 (Set page to 1 (6372 <- 00), lockup)
|
||||
rxb237 (immediate reset)
|
||||
rxbv555 (repeating reset on Master Title Screen)
|
||||
superxb (lockup, fix: add RAM at 7c00)
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
READ8Z_MEMBER(ti99_gromemu_cartridge::readz)
|
||||
{
|
||||
if ((offset & GROM_MASK)==GROM_AREA)
|
||||
gromemureadz(space, offset, value, mem_mask);
|
||||
else
|
||||
{
|
||||
if (m_rom_page==0)
|
||||
{
|
||||
*value = m_rom_ptr[offset & 0x1fff];
|
||||
}
|
||||
else
|
||||
{
|
||||
*value = m_rom2_ptr[offset & 0x1fff];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(ti99_gromemu_cartridge::write)
|
||||
{
|
||||
// LOG("write standard\n");
|
||||
if ((offset & GROM_MASK)==GROM_AREA)
|
||||
gromemuwrite(space, offset, data, mem_mask);
|
||||
|
||||
else {
|
||||
m_rom_page = (offset >> 1) & 1;
|
||||
}
|
||||
}
|
||||
|
||||
READ8Z_MEMBER(ti99_gromemu_cartridge::gromemureadz)
|
||||
{
|
||||
// Similar to the GKracker implemented above, we do not have a readable
|
||||
// GROM address counter but use the one from the console GROMs.
|
||||
if ((offset & 0x0002)!=0) return;
|
||||
int id = ((m_grom_address & 0xe000)>>13)&0x07;
|
||||
if (id > 2) {
|
||||
// Cartridge space (0x6000 - 0xffff)
|
||||
*value = m_grom_ptr[m_grom_address-0x6000]; // use the GROM memory
|
||||
}
|
||||
|
||||
// The GROM emulation does not wrap at 8K boundaries.
|
||||
m_grom_address = (m_grom_address + 1) & 0xffff;
|
||||
|
||||
// Reset the write address flipflop.
|
||||
m_waddr_LSB = false;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(ti99_gromemu_cartridge::gromemuwrite)
|
||||
{
|
||||
// Set GROM address
|
||||
if ((offset & 0x0002)==0x0002) {
|
||||
if (m_waddr_LSB == true)
|
||||
{
|
||||
// Accept low address byte (second write)
|
||||
m_grom_address = (m_grom_address & 0xff00) | data;
|
||||
m_waddr_LSB = false;
|
||||
if (VERBOSE>8) LOG("ti99_gromemu_cartridge: set grom address %04x\n", m_grom_address);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Accept high address byte (first write)
|
||||
m_grom_address = (m_grom_address & 0x00ff) | (data << 8);
|
||||
m_waddr_LSB = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (VERBOSE>2) LOG("ti99_gromemu_cartridge: ignoring write to GROM area at address %04x\n", m_grom_address);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
RPK loader
|
||||
|
@ -276,6 +276,7 @@ protected:
|
||||
UINT8* m_rom_ptr;
|
||||
UINT8* m_rom2_ptr;
|
||||
UINT8* m_ram_ptr;
|
||||
UINT8* m_grom_ptr; // for gromemu
|
||||
|
||||
private:
|
||||
};
|
||||
@ -365,6 +366,22 @@ private:
|
||||
int m_rom_page;
|
||||
};
|
||||
|
||||
/********************** GROM emulation cartridge ************************************/
|
||||
|
||||
class ti99_gromemu_cartridge : public ti99_cartridge_pcb
|
||||
{
|
||||
public:
|
||||
~ti99_gromemu_cartridge() { };
|
||||
DECLARE_READ8Z_MEMBER(readz);
|
||||
DECLARE_WRITE8_MEMBER(write);
|
||||
DECLARE_READ8Z_MEMBER(gromemureadz);
|
||||
DECLARE_WRITE8_MEMBER(gromemuwrite);
|
||||
private:
|
||||
int m_rom_page;
|
||||
int m_grom_address;
|
||||
bool m_waddr_LSB;
|
||||
};
|
||||
|
||||
|
||||
struct pcb_type
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user