trunk/hash/ti99_cart.xml
| r20677 | r20678 | |
| 1386 | 1386 | <year>198?</year> |
| 1387 | 1387 | <publisher><unknown></publisher> |
| 1388 | 1388 | <part name="cart" interface="ti99_cart"> |
| 1389 | | <feature name="pcb" value="paged"/> |
| 1389 | <feature name="pcb" value="gromemu"/> |
| 1390 | 1390 | <dataarea name="grom_socket" size="0xa000"> |
| 1391 | 1391 | <rom name="xb25g.bin" size="0xa000" crc="80b33ca1" sha1="664ae7f2810df6942480634288df31b9567df72c" offset="0x0000" /> |
| 1392 | 1392 | </dataarea> |
| r20677 | r20678 | |
| 1405 | 1405 | <publisher><unknown></publisher> |
| 1406 | 1406 | <info name="comment" value="Standard Exbasic with additional functions. Maybe @apesoft."/> |
| 1407 | 1407 | <part name="cart" interface="ti99_cart"> |
| 1408 | | <feature name="pcb" value="paged"/> |
| 1408 | <feature name="pcb" value="gromemu"/> |
| 1409 | 1409 | <dataarea name="grom_socket" size="0xa000"> |
| 1410 | 1410 | <rom name="xbapeg.bin" size="0xa000" crc="a27f2f5e" sha1="d9614cd24eb04cb61ecf7c29e42029adfd4bbafc" offset="0x0000" /> |
| 1411 | 1411 | </dataarea> |
| r20677 | r20678 | |
| 2983 | 2983 | <publisher>Western Horizon</publisher> |
| 2984 | 2984 | <info name="version" value="1002"/> |
| 2985 | 2985 | <part name="cart" interface="ti99_cart"> |
| 2986 | | <feature name="pcb" value="paged"/> |
| 2986 | <feature name="pcb" value="gromemu"/> |
| 2987 | 2987 | <dataarea name="grom_socket" size="0xa000"> |
| 2988 | 2988 | <rom name="rxbv2g.bin" size="0xa000" crc="8e07abd2" sha1="ad12ccd39d2a8d0a65d6b1a82fbaddafa1a1f89d" offset="0x0000" /> |
| 2989 | 2989 | </dataarea> |
| r20677 | r20678 | |
| 3002 | 3002 | <publisher>Rich Gilbertson</publisher> |
| 3003 | 3003 | <info name="version" value="2002"/> |
| 3004 | 3004 | <part name="cart" interface="ti99_cart"> |
| 3005 | | <feature name="pcb" value="paged"/> |
| 3005 | <feature name="pcb" value="gromemu"/> |
| 3006 | 3006 | <dataarea name="grom_socket" size="0xa000"> |
| 3007 | 3007 | <rom name="rxb2k2g.bin" size="0xa000" crc="350c4945" sha1="f1417afe7841146903a5182beeeebaf154d21e06" offset="0x0000" /> |
| 3008 | 3008 | </dataarea> |
| r20677 | r20678 | |
| 3021 | 3021 | <publisher>Rich Gilbertson</publisher> |
| 3022 | 3022 | <info name="version" value="2.37"/> |
| 3023 | 3023 | <part name="cart" interface="ti99_cart"> |
| 3024 | | <feature name="pcb" value="paged"/> |
| 3024 | <feature name="pcb" value="gromemu"/> |
| 3025 | 3025 | <dataarea name="grom_socket" size="0xa000"> |
| 3026 | 3026 | <rom name="rxb237g.bin" size="0xa000" crc="34cb2778" sha1="2368f8aeb810ce198180e0da31ac7a5b548bb2b2" offset="0x0000" /> |
| 3027 | 3027 | </dataarea> |
| r20677 | r20678 | |
| 3040 | 3040 | <publisher>Rich Gilbertson</publisher> |
| 3041 | 3041 | <info name="version" value="2.4"/> |
| 3042 | 3042 | <part name="cart" interface="ti99_cart"> |
| 3043 | | <feature name="pcb" value="paged"/> |
| 3043 | <feature name="pcb" value="gromemu"/> |
| 3044 | 3044 | <dataarea name="grom_socket" size="0xa000"> |
| 3045 | 3045 | <rom name="rxb24g.bin" size="0xa000" crc="15b3406b" sha1="aa04abd00f16a08ee336d788a5cc0fc0a9a9a917" offset="0x0000" /> |
| 3046 | 3046 | </dataarea> |
| r20677 | r20678 | |
| 3059 | 3059 | <publisher>Rich Gilbertson</publisher> |
| 3060 | 3060 | <info name="version" value="2.6"/> |
| 3061 | 3061 | <part name="cart" interface="ti99_cart"> |
| 3062 | | <feature name="pcb" value="paged"/> |
| 3062 | <feature name="pcb" value="gromemu"/> |
| 3063 | 3063 | <dataarea name="grom_socket" size="0xa000"> |
| 3064 | 3064 | <rom name="rxb26g.bin" size="0xa000" crc="fb887f39" sha1="26df9cc148b7827d4fc65a117a1fe254febdc388" offset="0x0000" /> |
| 3065 | 3065 | </dataarea> |
| r20677 | r20678 | |
| 3077 | 3077 | <year>19??</year> |
| 3078 | 3078 | <publisher>Rich Gilbertson</publisher> |
| 3079 | 3079 | <part name="cart" interface="ti99_cart"> |
| 3080 | | <feature name="pcb" value="paged"/> |
| 3080 | <feature name="pcb" value="gromemu"/> |
| 3081 | 3081 | <dataarea name="grom_socket" size="0xa000"> |
| 3082 | 3082 | <rom name="rxbg.bin" size="0xa000" crc="8700ecb5" sha1="ca19389a99d4928f570f8c708787daa0a557ba8a" offset="0x0000" /> |
| 3083 | 3083 | </dataarea> |
| r20677 | r20678 | |
| 3095 | 3095 | <year>19??</year> |
| 3096 | 3096 | <publisher>Rich Gilbertson</publisher> |
| 3097 | 3097 | <part name="cart" interface="ti99_cart"> |
| 3098 | | <feature name="pcb" value="paged"/> |
| 3098 | <feature name="pcb" value="gromemu"/> |
| 3099 | 3099 | <dataarea name="grom_socket" size="0xa000"> |
| 3100 | 3100 | <rom name="dump_g.bin" size="0xa000" crc="3bbaba2c" sha1="8b55e7c5f20b1e6366fd7047b0630b6d22af31f0" offset="0x0000" /> |
| 3101 | 3101 | </dataarea> |
| r20677 | r20678 | |
| 3113 | 3113 | <year>19??</year> |
| 3114 | 3114 | <publisher>Rich Gilbertson</publisher> |
| 3115 | 3115 | <part name="cart" interface="ti99_cart"> |
| 3116 | | <feature name="pcb" value="paged"/> |
| 3116 | <feature name="pcb" value="gromemu"/> |
| 3117 | 3117 | <dataarea name="grom_socket" size="0xa000"> |
| 3118 | 3118 | <rom name="dump_g.bin" size="0xa000" crc="e8c04156" sha1="4145c28c252dc6d8f94164fb5a9f501f633587eb" offset="0x0000" /> |
| 3119 | 3119 | </dataarea> |
| r20677 | r20678 | |
| 3131 | 3131 | <year>1992</year> |
| 3132 | 3132 | <publisher>Cadd Electronics - Rich Gilbertson</publisher> |
| 3133 | 3133 | <part name="cart" interface="ti99_cart"> |
| 3134 | | <feature name="pcb" value="paged"/> |
| 3134 | <feature name="pcb" value="gromemu"/> |
| 3135 | 3135 | <dataarea name="grom_socket" size="0xa000"> |
| 3136 | 3136 | <rom name="dump_g.bin" size="0xa000" crc="0d3ff2bd" sha1="de686366ff69892fa2e801f8364f2b09a71f4d5e" offset="0x0000" /> |
| 3137 | 3137 | </dataarea> |
| r20677 | r20678 | |
| 3989 | 3989 | <publisher>Triton</publisher> |
| 3990 | 3990 | <info name="version" value="120"/> |
| 3991 | 3991 | <part name="cart" interface="ti99_cart"> |
| 3992 | | <feature name="pcb" value="paged"/> |
| 3992 | <feature name="pcb" value="gromemu"/> |
| 3993 | 3993 | <dataarea name="grom_socket" size="0xa000"> |
| 3994 | 3994 | <rom name="superxbg.bin" size="0xa000" crc="a94cfd99" sha1="12f1871c8e2dc39a474a78739dd2bd243b755eaf" offset="0x0000" /> |
| 3995 | 3995 | </dataarea> |
trunk/src/mess/machine/ti99/gromport.c
| r20677 | r20678 | |
| 9 | 9 | |
| 10 | 10 | LEFT |
| 11 | 11 | |
| 12 | | RESET* 1||2 GND |
| 12 | /RESET 1||2 GND |
| 13 | 13 | D7 3||4 CRUCLK |
| 14 | 14 | D6 5||6 CRUIN |
| 15 | 15 | D5 7||8 A15/CRUOUT |
| r20677 | r20678 | |
| 1053 | 1053 | PCB_SUPER, |
| 1054 | 1054 | PCB_MBX, |
| 1055 | 1055 | PCB_PAGED379I, |
| 1056 | | PCB_PAGEDCRU |
| 1056 | PCB_PAGEDCRU, |
| 1057 | PCB_GROMEMU |
| 1057 | 1058 | }; |
| 1058 | 1059 | |
| 1059 | 1060 | static const pcb_type pcbdefs[] = |
| r20677 | r20678 | |
| 1065 | 1066 | { PCB_MBX, "mbx" }, |
| 1066 | 1067 | { PCB_PAGED379I, "paged379i" }, |
| 1067 | 1068 | { PCB_PAGEDCRU, "pagedcru" }, |
| 1069 | { PCB_GROMEMU, "gromemu" }, |
| 1068 | 1070 | { 0, NULL} |
| 1069 | 1071 | }; |
| 1070 | 1072 | |
| r20677 | r20678 | |
| 1073 | 1075 | { |
| 1074 | 1076 | { PCB_STANDARD, "standard" }, |
| 1075 | 1077 | { PCB_PAGED, "paged" }, |
| 1078 | { PCB_GROMEMU, "gromemu" }, |
| 1076 | 1079 | { 0, NULL} |
| 1077 | 1080 | }; |
| 1078 | 1081 | |
| r20677 | r20678 | |
| 1099 | 1102 | |
| 1100 | 1103 | if (m_pcb->m_grom_size > 0) |
| 1101 | 1104 | { |
| 1102 | | regg = memregion("grom_contents"); |
| 1105 | regg = memregion(CARTGROM_TAG); |
| 1103 | 1106 | grom_ptr = m_softlist? get_software_region("grom_socket") : (UINT8*)m_rpk->get_contents_of_socket("grom_socket"); |
| 1104 | 1107 | memcpy(regg->base(), grom_ptr, m_pcb->m_grom_size); |
| 1108 | m_pcb->m_grom_ptr = regg->base(); // for gromemu |
| 1105 | 1109 | |
| 1106 | 1110 | // Find the GROMs and keep their pointers |
| 1107 | 1111 | m_pcb->set_grom_pointer(0, subdevice(GROM3_TAG)); |
| r20677 | r20678 | |
| 1115 | 1119 | if (m_pcb->m_rom_size > 0) |
| 1116 | 1120 | { |
| 1117 | 1121 | 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); |
| 1119 | 1123 | m_pcb->m_rom_ptr = m_softlist? get_software_region("rom_socket") : (UINT8*)m_rpk->get_contents_of_socket("rom_socket"); |
| 1120 | 1124 | memcpy(regr->base(), m_pcb->m_rom_ptr, m_pcb->m_rom_size); |
| 1121 | 1125 | } |
| r20677 | r20678 | |
| 1124 | 1128 | if (rom2_length > 0) |
| 1125 | 1129 | { |
| 1126 | 1130 | // sizes do not differ between rom and rom2 |
| 1127 | | regr2 = memregion("rom2_contents"); |
| 1131 | regr2 = memregion(CARTROM2_TAG); |
| 1128 | 1132 | m_pcb->m_rom2_ptr = m_softlist? get_software_region("rom2_socket") : (UINT8*)m_rpk->get_contents_of_socket("rom2_socket"); |
| 1129 | 1133 | memcpy(regr2->base(), m_pcb->m_rom2_ptr, rom2_length); |
| 1130 | 1134 | } |
| r20677 | r20678 | |
| 1233 | 1237 | if (VERBOSE>6) LOG("gromport.cartridge_device: PagedCRU PCB\n"); |
| 1234 | 1238 | m_pcb = new ti99_pagedcru_cartridge(); |
| 1235 | 1239 | 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; |
| 1236 | 1244 | } |
| 1237 | 1245 | |
| 1238 | 1246 | prepare_cartridge(); |
| r20677 | r20678 | |
| 1463 | 1471 | if ((offset & GROM_MASK)==GROM_AREA) |
| 1464 | 1472 | gromwrite(space, offset, data, mem_mask); |
| 1465 | 1473 | |
| 1466 | | else |
| 1474 | else { |
| 1467 | 1475 | m_rom_page = (offset >> 1) & 1; |
| 1476 | } |
| 1468 | 1477 | } |
| 1469 | 1478 | |
| 1470 | 1479 | /***************************************************************************** |
| r20677 | r20678 | |
| 1796 | 1805 | } |
| 1797 | 1806 | } |
| 1798 | 1807 | |
| 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 | |
| 1837 | READ8Z_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 | |
| 1854 | WRITE8_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 | |
| 1865 | READ8Z_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 | |
| 1883 | WRITE8_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 | |
| 1799 | 1906 | /**************************************************************************** |
| 1800 | 1907 | |
| 1801 | 1908 | RPK loader |