ti99: Added a new cartridge type for RXB cartridges

This commit is contained in:
Michael Zapf 2013-02-02 22:03:56 +00:00
parent 0df1b89e6f
commit 0fc7621c9e
3 changed files with 142 additions and 18 deletions

View File

@ -1386,7 +1386,7 @@
<year>198?</year>
<publisher>&lt;unknown&gt;</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>&lt;unknown&gt;</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>

View File

@ -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

View File

@ -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
{