Previous 199869 Revisions Next

r20678 Saturday 2nd February, 2013 at 22:03:56 UTC by Michael Zapf
ti99: Added a new cartridge type for RXB cartridges
[hash]ti99_cart.xml
[src/mess/machine/ti99]gromport.c gromport.h

trunk/hash/ti99_cart.xml
r20677r20678
13861386   <year>198?</year>
13871387   <publisher>&lt;unknown&gt;</publisher>
13881388   <part name="cart" interface="ti99_cart">
1389      <feature name="pcb" value="paged"/>
1389      <feature name="pcb" value="gromemu"/>
13901390      <dataarea name="grom_socket" size="0xa000">
13911391         <rom name="xb25g.bin" size="0xa000" crc="80b33ca1" sha1="664ae7f2810df6942480634288df31b9567df72c" offset="0x0000" />
13921392      </dataarea>
r20677r20678
14051405   <publisher>&lt;unknown&gt;</publisher>
14061406   <info name="comment" value="Standard Exbasic with additional functions. Maybe @apesoft."/>
14071407   <part name="cart" interface="ti99_cart">
1408      <feature name="pcb" value="paged"/>
1408      <feature name="pcb" value="gromemu"/>
14091409      <dataarea name="grom_socket" size="0xa000">
14101410         <rom name="xbapeg.bin" size="0xa000" crc="a27f2f5e" sha1="d9614cd24eb04cb61ecf7c29e42029adfd4bbafc" offset="0x0000" />
14111411      </dataarea>
r20677r20678
29832983   <publisher>Western Horizon</publisher>
29842984   <info name="version" value="1002"/>
29852985   <part name="cart" interface="ti99_cart">
2986      <feature name="pcb" value="paged"/>
2986      <feature name="pcb" value="gromemu"/>
29872987      <dataarea name="grom_socket" size="0xa000">
29882988         <rom name="rxbv2g.bin" size="0xa000" crc="8e07abd2" sha1="ad12ccd39d2a8d0a65d6b1a82fbaddafa1a1f89d" offset="0x0000" />
29892989      </dataarea>
r20677r20678
30023002   <publisher>Rich Gilbertson</publisher>
30033003   <info name="version" value="2002"/>
30043004   <part name="cart" interface="ti99_cart">
3005      <feature name="pcb" value="paged"/>
3005      <feature name="pcb" value="gromemu"/>
30063006      <dataarea name="grom_socket" size="0xa000">
30073007         <rom name="rxb2k2g.bin" size="0xa000" crc="350c4945" sha1="f1417afe7841146903a5182beeeebaf154d21e06" offset="0x0000" />
30083008      </dataarea>
r20677r20678
30213021   <publisher>Rich Gilbertson</publisher>
30223022   <info name="version" value="2.37"/>
30233023   <part name="cart" interface="ti99_cart">
3024      <feature name="pcb" value="paged"/>
3024      <feature name="pcb" value="gromemu"/>
30253025      <dataarea name="grom_socket" size="0xa000">
30263026         <rom name="rxb237g.bin" size="0xa000" crc="34cb2778" sha1="2368f8aeb810ce198180e0da31ac7a5b548bb2b2" offset="0x0000" />
30273027      </dataarea>
r20677r20678
30403040   <publisher>Rich Gilbertson</publisher>
30413041   <info name="version" value="2.4"/>
30423042   <part name="cart" interface="ti99_cart">
3043      <feature name="pcb" value="paged"/>
3043      <feature name="pcb" value="gromemu"/>
30443044      <dataarea name="grom_socket" size="0xa000">
30453045         <rom name="rxb24g.bin" size="0xa000" crc="15b3406b" sha1="aa04abd00f16a08ee336d788a5cc0fc0a9a9a917" offset="0x0000" />
30463046      </dataarea>
r20677r20678
30593059   <publisher>Rich Gilbertson</publisher>
30603060   <info name="version" value="2.6"/>
30613061   <part name="cart" interface="ti99_cart">
3062      <feature name="pcb" value="paged"/>
3062      <feature name="pcb" value="gromemu"/>
30633063      <dataarea name="grom_socket" size="0xa000">
30643064         <rom name="rxb26g.bin" size="0xa000" crc="fb887f39" sha1="26df9cc148b7827d4fc65a117a1fe254febdc388" offset="0x0000" />
30653065      </dataarea>
r20677r20678
30773077   <year>19??</year>
30783078   <publisher>Rich Gilbertson</publisher>
30793079   <part name="cart" interface="ti99_cart">
3080      <feature name="pcb" value="paged"/>
3080      <feature name="pcb" value="gromemu"/>
30813081      <dataarea name="grom_socket" size="0xa000">
30823082         <rom name="rxbg.bin" size="0xa000" crc="8700ecb5" sha1="ca19389a99d4928f570f8c708787daa0a557ba8a" offset="0x0000" />
30833083      </dataarea>
r20677r20678
30953095   <year>19??</year>
30963096   <publisher>Rich Gilbertson</publisher>
30973097   <part name="cart" interface="ti99_cart">
3098      <feature name="pcb" value="paged"/>
3098      <feature name="pcb" value="gromemu"/>
30993099      <dataarea name="grom_socket" size="0xa000">
31003100         <rom name="dump_g.bin" size="0xa000" crc="3bbaba2c" sha1="8b55e7c5f20b1e6366fd7047b0630b6d22af31f0" offset="0x0000" />
31013101      </dataarea>
r20677r20678
31133113   <year>19??</year>
31143114   <publisher>Rich Gilbertson</publisher>
31153115   <part name="cart" interface="ti99_cart">
3116      <feature name="pcb" value="paged"/>
3116      <feature name="pcb" value="gromemu"/>
31173117      <dataarea name="grom_socket" size="0xa000">
31183118         <rom name="dump_g.bin" size="0xa000" crc="e8c04156" sha1="4145c28c252dc6d8f94164fb5a9f501f633587eb" offset="0x0000" />
31193119      </dataarea>
r20677r20678
31313131   <year>1992</year>
31323132   <publisher>Cadd Electronics - Rich Gilbertson</publisher>
31333133   <part name="cart" interface="ti99_cart">
3134      <feature name="pcb" value="paged"/>
3134      <feature name="pcb" value="gromemu"/>
31353135      <dataarea name="grom_socket" size="0xa000">
31363136         <rom name="dump_g.bin" size="0xa000" crc="0d3ff2bd" sha1="de686366ff69892fa2e801f8364f2b09a71f4d5e" offset="0x0000" />
31373137      </dataarea>
r20677r20678
39893989   <publisher>Triton</publisher>
39903990   <info name="version" value="120"/>
39913991   <part name="cart" interface="ti99_cart">
3992      <feature name="pcb" value="paged"/>
3992      <feature name="pcb" value="gromemu"/>
39933993      <dataarea name="grom_socket" size="0xa000">
39943994         <rom name="superxbg.bin" size="0xa000" crc="a94cfd99" sha1="12f1871c8e2dc39a474a78739dd2bd243b755eaf" offset="0x0000" />
39953995      </dataarea>
trunk/src/mess/machine/ti99/gromport.c
r20677r20678
99
1010          LEFT
1111
12  RESET*  1||2   GND
12  /RESET  1||2   GND
1313      D7  3||4   CRUCLK
1414      D6  5||6   CRUIN
1515      D5  7||8   A15/CRUOUT
r20677r20678
10531053   PCB_SUPER,
10541054   PCB_MBX,
10551055   PCB_PAGED379I,
1056   PCB_PAGEDCRU
1056   PCB_PAGEDCRU,
1057   PCB_GROMEMU
10571058};
10581059
10591060static const pcb_type pcbdefs[] =
r20677r20678
10651066   { PCB_MBX, "mbx" },
10661067   { PCB_PAGED379I, "paged379i" },
10671068   { PCB_PAGEDCRU, "pagedcru" },
1069   { PCB_GROMEMU, "gromemu" },
10681070   { 0, NULL}
10691071};
10701072
r20677r20678
10731075{
10741076   { PCB_STANDARD, "standard" },
10751077   { PCB_PAGED, "paged" },
1078   { PCB_GROMEMU, "gromemu" },
10761079   { 0, NULL}
10771080};
10781081
r20677r20678
10991102
11001103   if (m_pcb->m_grom_size > 0)
11011104   {
1102      regg = memregion("grom_contents");
1105      regg = memregion(CARTGROM_TAG);
11031106      grom_ptr = m_softlist? get_software_region("grom_socket") : (UINT8*)m_rpk->get_contents_of_socket("grom_socket");
11041107      memcpy(regg->base(), grom_ptr, m_pcb->m_grom_size);
1108      m_pcb->m_grom_ptr = regg->base();   // for gromemu
11051109
11061110      // Find the GROMs and keep their pointers
11071111      m_pcb->set_grom_pointer(0, subdevice(GROM3_TAG));
r20677r20678
11151119   if (m_pcb->m_rom_size > 0)
11161120   {
11171121      if (VERBOSE>6) LOG("gromport: rom_socket.size=0x%04x\n", m_pcb->m_rom_size);
1118      regr = memregion("rom_contents");
1122      regr = memregion(CARTROM_TAG);
11191123      m_pcb->m_rom_ptr = m_softlist? get_software_region("rom_socket") : (UINT8*)m_rpk->get_contents_of_socket("rom_socket");
11201124      memcpy(regr->base(), m_pcb->m_rom_ptr, m_pcb->m_rom_size);
11211125   }
r20677r20678
11241128   if (rom2_length > 0)
11251129   {
11261130      // sizes do not differ between rom and rom2
1127      regr2 = memregion("rom2_contents");
1131      regr2 = memregion(CARTROM2_TAG);
11281132      m_pcb->m_rom2_ptr = m_softlist? get_software_region("rom2_socket") : (UINT8*)m_rpk->get_contents_of_socket("rom2_socket");
11291133      memcpy(regr2->base(), m_pcb->m_rom2_ptr, rom2_length);
11301134   }
r20677r20678
12331237      if (VERBOSE>6) LOG("gromport.cartridge_device: PagedCRU PCB\n");
12341238      m_pcb = new ti99_pagedcru_cartridge();
12351239      break;
1240   case PCB_GROMEMU:
1241      if (VERBOSE>6) LOG("gromport.cartridge_device: GromEmulation PCB\n");
1242      m_pcb = new ti99_gromemu_cartridge();
1243      break;
12361244   }
12371245
12381246   prepare_cartridge();
r20677r20678
14631471   if ((offset & GROM_MASK)==GROM_AREA)
14641472      gromwrite(space, offset, data, mem_mask);
14651473
1466   else
1474   else {
14671475      m_rom_page = (offset >> 1) & 1;
1476   }
14681477}
14691478
14701479/*****************************************************************************
r20677r20678
17961805   }
17971806}
17981807
1808/*****************************************************************************
1809  Cartridge type: GROM emulation/paged
1810
1811  This cartridge offers GROM address space without real GROM circuits. The GROMs
1812  are emulated by a normal EPROM with a circuits that mimics GROM behavior.
1813  Each simulated GROM offers 8K (real GROMs only offer 6K).
1814
1815  Some assumptions:
1816  - No readable address counter. This means the parallel console GROMs
1817    will deliver the address when reading.
1818  - No wait states. Reading is generally faster than with real GROMs.
1819  - No wrapping at 8K boundaries.
1820  - Two pages of ROM at address 6000
1821
1822  If any of these fails, the cartridge will crash, so we'll see.
1823
1824  Typical cartridges: RXB, Super Extended Basic
1825
1826  For the sake of simplicity, we register GROMs like the other PCB types, but
1827  we implement special access methods for the GROM space.
1828
1829  Still not working:
1830     rxb1002 (Set page to 1 (6372 <- 00), lockup)
1831     rxb237 (immediate reset)
1832     rxbv555 (repeating reset on Master Title Screen)
1833     superxb (lockup, fix: add RAM at 7c00)
1834
1835******************************************************************************/
1836
1837READ8Z_MEMBER(ti99_gromemu_cartridge::readz)
1838{
1839   if ((offset & GROM_MASK)==GROM_AREA)
1840      gromemureadz(space, offset, value, mem_mask);
1841   else
1842   {
1843      if (m_rom_page==0)
1844      {
1845         *value = m_rom_ptr[offset & 0x1fff];
1846      }
1847      else
1848      {
1849         *value = m_rom2_ptr[offset & 0x1fff];
1850      }
1851   }
1852}
1853
1854WRITE8_MEMBER(ti99_gromemu_cartridge::write)
1855{
1856   // LOG("write standard\n");
1857   if ((offset & GROM_MASK)==GROM_AREA)
1858      gromemuwrite(space, offset, data, mem_mask);
1859
1860   else {
1861      m_rom_page = (offset >> 1) & 1;
1862   }
1863}
1864
1865READ8Z_MEMBER(ti99_gromemu_cartridge::gromemureadz)
1866{
1867   // Similar to the GKracker implemented above, we do not have a readable
1868   // GROM address counter but use the one from the console GROMs.
1869   if ((offset & 0x0002)!=0) return;
1870   int id = ((m_grom_address & 0xe000)>>13)&0x07;
1871   if (id > 2) {
1872      // Cartridge space (0x6000 - 0xffff)
1873      *value = m_grom_ptr[m_grom_address-0x6000]; // use the GROM memory
1874   }
1875
1876   // The GROM emulation does not wrap at 8K boundaries.
1877   m_grom_address = (m_grom_address + 1) & 0xffff;
1878
1879   // Reset the write address flipflop.
1880   m_waddr_LSB = false;
1881}
1882
1883WRITE8_MEMBER(ti99_gromemu_cartridge::gromemuwrite)
1884{
1885   // Set GROM address
1886   if ((offset & 0x0002)==0x0002) {
1887      if (m_waddr_LSB == true)
1888      {
1889         // Accept low address byte (second write)
1890         m_grom_address = (m_grom_address & 0xff00) | data;
1891         m_waddr_LSB = false;
1892         if (VERBOSE>8) LOG("ti99_gromemu_cartridge: set grom address %04x\n", m_grom_address);
1893      }
1894      else
1895      {
1896         // Accept high address byte (first write)
1897         m_grom_address = (m_grom_address & 0x00ff) | (data << 8);
1898         m_waddr_LSB = true;
1899      }
1900   }
1901   else {
1902      if (VERBOSE>2) LOG("ti99_gromemu_cartridge: ignoring write to GROM area at address %04x\n", m_grom_address);
1903   }
1904}
1905
17991906/****************************************************************************
18001907
18011908    RPK loader
trunk/src/mess/machine/ti99/gromport.h
r20677r20678
276276   UINT8*              m_rom_ptr;
277277   UINT8*              m_rom2_ptr;
278278   UINT8*              m_ram_ptr;
279   UINT8*              m_grom_ptr; // for gromemu
279280
280281private:
281282};
r20677r20678
365366   int     m_rom_page;
366367};
367368
369/********************** GROM emulation cartridge  ************************************/
368370
371class ti99_gromemu_cartridge : public ti99_cartridge_pcb
372{
373public:
374   ~ti99_gromemu_cartridge() { };
375   DECLARE_READ8Z_MEMBER(readz);
376   DECLARE_WRITE8_MEMBER(write);
377   DECLARE_READ8Z_MEMBER(gromemureadz);
378   DECLARE_WRITE8_MEMBER(gromemuwrite);
379private:
380   int     m_rom_page;
381   int     m_grom_address;
382   bool    m_waddr_LSB;
383};
384
385
369386struct pcb_type
370387{
371388   int id;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team