diff --git a/hash/ti99_cart.xml b/hash/ti99_cart.xml
index d49cdd7d7ee..05e574ce5db 100644
--- a/hash/ti99_cart.xml
+++ b/hash/ti99_cart.xml
@@ -1,6 +1,5 @@
-
@@ -11,7 +10,7 @@
-
+
@@ -22,13 +21,10 @@
1986
Triton
-
-
+
+
-
-
-
@@ -39,8 +35,8 @@
-
-
+
+
@@ -51,7 +47,7 @@
Asgard
-
+
@@ -63,7 +59,7 @@
Asgard
-
+
@@ -76,10 +72,13 @@
-
-
+
+
+
+
+
-
+
@@ -92,8 +91,8 @@
-
-
+
+
@@ -104,7 +103,7 @@
Atarisoft
-
+
@@ -116,7 +115,7 @@
Atarisoft
-
+
@@ -127,12 +126,10 @@
1983
Atarisoft
-
-
+
+
-
-
-
+
@@ -142,12 +139,10 @@
1983
Atarisoft
-
-
+
+
-
-
-
+
@@ -157,12 +152,10 @@
1983
Atarisoft
-
-
+
+
-
-
-
+
@@ -172,12 +165,10 @@
1983
Atarisoft
-
-
+
+
-
-
-
+
@@ -187,12 +178,10 @@
1983
Atarisoft
-
-
+
+
-
-
-
+
@@ -202,12 +191,10 @@
1983
Atarisoft
-
-
+
+
-
-
-
+
@@ -217,27 +204,23 @@
1983
Atarisoft
-
-
+
+
-
-
-
+
-
+
Protector II
1983
Atarisoft
-
-
+
+
-
-
-
+
@@ -247,12 +230,10 @@
1983
Atarisoft
-
-
-
-
-
-
+
+
+
+
@@ -262,12 +243,10 @@
1983
Atarisoft
-
-
+
+
-
-
-
+
@@ -277,12 +256,10 @@
1983
Atarisoft
-
-
+
+
-
-
-
+
@@ -294,10 +271,10 @@
-
+
-
+
@@ -310,8 +287,10 @@
-
-
+
+
+
+
@@ -323,7 +302,7 @@
-
+
@@ -336,7 +315,7 @@
-
+
@@ -349,8 +328,9 @@
-
-
+
+
+
@@ -362,8 +342,10 @@
-
-
+
+
+
+
@@ -375,7 +357,7 @@
-
+
@@ -388,8 +370,8 @@
-
-
+
+
@@ -401,8 +383,8 @@
-
-
+
+
@@ -414,10 +396,10 @@
-
-
+
+
-
+
@@ -429,7 +411,7 @@
Corcomp
-
+
@@ -441,7 +423,7 @@
Corcomp
-
+
@@ -454,7 +436,7 @@
-
+
@@ -466,7 +448,7 @@
DaTaBioTics
-
+
@@ -478,7 +460,7 @@
Navarone
-
+
@@ -489,12 +471,10 @@
1988
John Phillips
-
-
+
+
-
-
-
+
@@ -505,7 +485,7 @@
DaTaBioTics
-
+
@@ -517,7 +497,7 @@
DaTaBioTics
-
+
@@ -529,7 +509,7 @@
DaTaBioTics
-
+
@@ -542,7 +522,7 @@
-
+
@@ -554,7 +534,7 @@
DaTaBioTics
-
+
@@ -566,7 +546,7 @@
DaTaBioTics
-
+
@@ -577,12 +557,10 @@
1986
DaTaBioTics
-
-
+
+
-
-
-
+
@@ -593,26 +571,28 @@
DaTaBioTics
-
-
+
+
+
+
+
+
-
+
-
-
- Micro Pinball
+
+
+ Micro Pinball 2
1984
Software Specialties
-
-
+
+
-
-
-
+
@@ -624,7 +604,7 @@
-
+
@@ -636,7 +616,7 @@
DaTaBioTics
-
+
@@ -647,12 +627,10 @@
1987
DaTaBioTics
-
-
+
+
-
-
-
+
@@ -662,12 +640,10 @@
1983
DaTaBioTics
-
-
+
+
-
-
-
+
@@ -678,7 +654,7 @@
DaTaBioTics
-
+
@@ -690,7 +666,7 @@
Deco
-
+
@@ -702,7 +678,7 @@
Deco
-
+
@@ -716,7 +692,7 @@
-
+
@@ -729,10 +705,11 @@
-
-
+
+
+
-
+
@@ -744,7 +721,7 @@
Data East USA
-
+
@@ -757,7 +734,7 @@
-
+
@@ -770,7 +747,7 @@
-
+
@@ -784,7 +761,7 @@
-
+
@@ -797,10 +774,10 @@
-
+
-
+
@@ -813,8 +790,9 @@
-
-
+
+
+
@@ -826,8 +804,8 @@
-
-
+
+
@@ -840,8 +818,9 @@
-
-
+
+
+
@@ -855,8 +834,9 @@
-
-
+
+
+
@@ -869,8 +849,9 @@
-
-
+
+
+
@@ -881,7 +862,7 @@
Texas Instruments
-
+
@@ -894,8 +875,9 @@
-
-
+
+
+
@@ -906,15 +888,17 @@
DLM Academics
-
-
-
+
+
+
+
+
+
+
-
+
-
-
-
+
@@ -926,7 +910,7 @@
-
+
@@ -939,10 +923,11 @@
-
-
+
+
+
-
+
@@ -955,8 +940,9 @@
-
-
+
+
+
@@ -968,8 +954,9 @@
-
-
+
+
+
@@ -981,7 +968,7 @@
-
+
@@ -994,7 +981,7 @@
-
+
@@ -1007,29 +994,27 @@
-
+
-
+
-
+
Berlin
19??
Iain Johnson
-
-
+
+
-
+
-
-
-
+
@@ -1040,7 +1025,7 @@
DaTaBioTics
-
+
@@ -1052,7 +1037,7 @@
Jlando
-
+
@@ -1064,8 +1049,11 @@
<unknown>
-
-
+
+
+
+
+
@@ -1077,7 +1065,7 @@
-
+
@@ -1089,7 +1077,7 @@
unknown
-
+
@@ -1102,8 +1090,10 @@
-
-
+
+
+
+
@@ -1115,10 +1105,10 @@
-
+
-
+
@@ -1130,7 +1120,7 @@
Texas Instruments
-
+
@@ -1143,7 +1133,7 @@
-
+
@@ -1154,12 +1144,10 @@
1988
DaTaBioTics
-
-
+
+
-
-
-
+
@@ -1170,7 +1158,7 @@
Sunware
-
+
@@ -1182,7 +1170,7 @@
CSI Design Group
-
+
@@ -1196,7 +1184,7 @@
-
+
@@ -1208,7 +1196,7 @@
Personal Peripherals
-
+
@@ -1219,12 +1207,10 @@
1983
Nicesoft
-
-
+
+
-
-
-
+
@@ -1236,26 +1222,24 @@
-
+
-
-
- U-Boat Jagd
+
+
+ U-Boot-Jagd
1984
Saurus
-
-
+
+
-
-
-
-
-
+
+
+
@@ -1267,8 +1251,9 @@
-
-
+
+
+
@@ -1280,10 +1265,10 @@
-
-
+
+
-
+
@@ -1296,7 +1281,7 @@
-
+
@@ -1309,8 +1294,8 @@
-
-
+
+
@@ -1322,7 +1307,7 @@
-
+
@@ -1334,10 +1319,14 @@
Texas Instruments
-
-
+
+
+
+
+
+
-
+
@@ -1349,15 +1338,14 @@
Texas Instruments
-
-
-
+
+
+
+
-
+
-
-
-
+
@@ -1368,11 +1356,11 @@
Texas Instruments
-
-
+
+
-
+
@@ -1387,10 +1375,10 @@
<unknown>
-
+
-
+
@@ -1406,10 +1394,10 @@
-
+
-
+
@@ -1425,15 +1413,16 @@
-
-
-
+
+
+
+
+
+
-
-
-
-
-
+
+
+
@@ -1444,10 +1433,14 @@
Texas Instruments
-
-
+
+
+
+
+
+
-
+
@@ -1460,7 +1453,7 @@
-
+
@@ -1473,8 +1466,9 @@
-
-
+
+
+
@@ -1485,7 +1479,7 @@
Funware
-
+
@@ -1497,7 +1491,7 @@
Funware
-
+
@@ -1509,7 +1503,7 @@
Funware
-
+
@@ -1521,7 +1515,7 @@
Funware - Romox
-
+
@@ -1533,7 +1527,7 @@
Funware
-
+
@@ -1545,8 +1539,10 @@
Funware
-
-
+
+
+
+
@@ -1557,7 +1553,7 @@
Funware - Romox
-
+
@@ -1569,7 +1565,7 @@
Funware
-
+
@@ -1581,7 +1577,7 @@
Funware
-
+
@@ -1593,10 +1589,10 @@
Funware
-
-
+
+
-
+
@@ -1608,7 +1604,7 @@
Funware - Romox
-
+
@@ -1620,10 +1616,14 @@
Texas Instruments
-
-
+
+
+
+
+
+
-
+
@@ -1635,7 +1635,7 @@
Texas Instruments
-
+
@@ -1649,7 +1649,7 @@
-
+
@@ -1663,7 +1663,7 @@
-
+
@@ -1676,8 +1676,9 @@
-
-
+
+
+
@@ -1689,10 +1690,10 @@
-
-
+
+
-
+
@@ -1705,8 +1706,9 @@
-
-
+
+
+
@@ -1718,8 +1720,9 @@
-
-
+
+
+
@@ -1731,8 +1734,8 @@
-
-
+
+
@@ -1744,8 +1747,8 @@
-
-
+
+
@@ -1759,7 +1762,7 @@
-
+
@@ -1772,10 +1775,12 @@
-
-
+
+
+
+
-
+
@@ -1789,7 +1794,7 @@
-
+
@@ -1801,16 +1806,15 @@
Imagic
-
-
-
+
+
+
+
+
-
+
-
-
-
@@ -1821,10 +1825,12 @@
-
-
+
+
+
+
-
+
@@ -1836,11 +1842,15 @@
Imagic
-
-
-
+
+
+
+
+
+
+
-
+
@@ -1849,13 +1859,13 @@
-
+
Wing War (beta)
1983
Imagic
-
+
@@ -1867,10 +1877,10 @@
Imagic
-
+
-
+
@@ -1882,7 +1892,7 @@
John Phillips
-
+
@@ -1893,8 +1903,8 @@
1988
John Phillips
-
-
+
+
@@ -1908,8 +1918,8 @@
1983
Sofmachine
-
-
+
+
@@ -1924,7 +1934,7 @@
Texas Instruments
-
+
@@ -1937,10 +1947,10 @@
-
+
-
+
@@ -1953,23 +1963,11 @@
-
+
-
-
- Bigfoot
- 1983
- Milton Bradley
-
-
-
-
-
-
-
Blasto
@@ -1978,8 +1976,8 @@
-
-
+
+
@@ -1990,8 +1988,8 @@
Milton Bradley
-
-
+
+
@@ -2003,8 +2001,9 @@
-
-
+
+
+
@@ -2015,7 +2014,7 @@
Milton Bradley
-
+
@@ -2028,50 +2027,18 @@
-
-
+
+
+
+
+
+
-
+
-
-
- Honey Hunt
- 1983
- Milton Bradley
-
-
-
-
-
-
-
-
-
- Meteor Belt
- 1983
- Milton Bradley
-
-
-
-
-
-
-
-
-
- Soundtrack Trolley
- 1983
- Milton Bradley
-
-
-
-
-
-
-
Starship Pegasus
@@ -2080,48 +2047,15 @@
-
-
+
+
+
-
+
-
-
- Championship Baseball
- 1983
- Milton Bradley
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- I'm Hiding
- 1983
- Milton Bradley
-
-
-
-
-
-
-
-
-
-
-
-
Zero Zap
@@ -2130,8 +2064,12 @@
-
-
+
+
+
+
+
+
@@ -2142,11 +2080,11 @@
Mechatronic
-
-
+
+
-
+
@@ -2162,8 +2100,10 @@
-
-
+
+
+
+
@@ -2175,8 +2115,10 @@
-
-
+
+
+
+
@@ -2188,8 +2130,9 @@
-
-
+
+
+
@@ -2201,8 +2144,9 @@
-
-
+
+
+
@@ -2214,8 +2158,11 @@
-
-
+
+
+
+
+
@@ -2227,7 +2174,7 @@
-
+
@@ -2240,8 +2187,10 @@
-
-
+
+
+
+
@@ -2252,8 +2201,12 @@
Milliken
-
-
+
+
+
+
+
+
@@ -2264,11 +2217,15 @@
Milliken
-
-
-
+
+
+
+
+
+
+
-
+
@@ -2284,8 +2241,10 @@
-
-
+
+
+
+
@@ -2297,7 +2256,7 @@
-
+
@@ -2310,8 +2269,12 @@
-
-
+
+
+
+
+
+
@@ -2323,8 +2286,9 @@
-
-
+
+
+
@@ -2336,10 +2300,14 @@
-
-
+
+
+
+
+
+
-
+
@@ -2353,8 +2321,12 @@
-
-
+
+
+
+
+
+
@@ -2365,7 +2337,7 @@
John Phillips
-
+
@@ -2380,7 +2352,7 @@
-
+
@@ -2393,10 +2365,10 @@
-
-
+
+
-
+
@@ -2409,10 +2381,12 @@
-
-
+
+
+
+
-
+
@@ -2425,8 +2399,10 @@
-
-
+
+
+
+
@@ -2437,7 +2413,7 @@
Texas Instruments
-
+
@@ -2449,7 +2425,7 @@
Navarone
-
+
@@ -2462,7 +2438,7 @@
-
+
@@ -2474,7 +2450,7 @@
Navarone
-
+
@@ -2486,7 +2462,7 @@
Navarone
-
+
@@ -2498,7 +2474,7 @@
Navarone
-
+
@@ -2511,7 +2487,7 @@
-
+
@@ -2523,7 +2499,7 @@
Navarone
-
+
@@ -2535,7 +2511,7 @@
Navarone
-
+
@@ -2548,7 +2524,7 @@
-
+
@@ -2561,7 +2537,7 @@
-
+
@@ -2573,7 +2549,7 @@
Navarone
-
+
@@ -2585,7 +2561,7 @@
Navarone
-
+
@@ -2597,7 +2573,7 @@
Navarone
-
+
@@ -2609,7 +2585,7 @@
Navarone
-
+
@@ -2620,8 +2596,8 @@
1983
Atarisoft
-
-
+
+
@@ -2637,7 +2613,7 @@
-
+
@@ -2650,8 +2626,8 @@
-
-
+
+
@@ -2663,8 +2639,12 @@
-
-
+
+
+
+
+
+
@@ -2675,7 +2655,7 @@
Texas Instruments
-
+
@@ -2687,7 +2667,7 @@
Navarone
-
+
@@ -2699,7 +2679,7 @@
Navarone
-
+
@@ -2712,10 +2692,12 @@
-
-
+
+
+
+
-
+
@@ -2727,10 +2709,10 @@
Texas Instruments
-
-
+
+
-
+
@@ -2742,10 +2724,10 @@
Parker Brothers
-
+
-
+
@@ -2757,10 +2739,10 @@
Parker Brothers
-
+
-
+
@@ -2772,10 +2754,10 @@
Parker Brothers
-
+
-
+
@@ -2788,8 +2770,11 @@
-
-
+
+
+
+
+
@@ -2800,7 +2785,7 @@
Texas Instruments
-
+
@@ -2813,8 +2798,11 @@
-
-
+
+
+
+
+
@@ -2826,8 +2814,9 @@
-
-
+
+
+
@@ -2839,7 +2828,7 @@
-
+
@@ -2852,10 +2841,10 @@
-
+
-
+
@@ -2867,11 +2856,14 @@
Control Data
-
-
-
+
+
+
+
+
+
-
+
@@ -2884,10 +2876,14 @@
-
-
+
+
+
+
+
+
-
+
@@ -2899,7 +2895,7 @@
Romox
-
+
@@ -2911,7 +2907,7 @@
Romox
-
+
@@ -2923,7 +2919,7 @@
Romox
-
+
@@ -2935,7 +2931,7 @@
Romox
-
+
@@ -2947,7 +2943,7 @@
Romox
-
+
@@ -2959,7 +2955,7 @@
Navarone
-
+
@@ -2971,7 +2967,7 @@
Romox
-
+
@@ -2985,7 +2981,7 @@
-
+
@@ -2998,10 +2994,14 @@
-
-
+
+
+
+
+
+
-
+
@@ -3014,10 +3014,14 @@
-
-
+
+
+
+
+
+
-
+
@@ -3029,11 +3033,15 @@
Scholastic
-
-
-
+
+
+
+
+
+
+
-
+
@@ -3048,11 +3056,15 @@
Scholastic
-
-
-
+
+
+
+
+
+
+
-
+
@@ -3068,10 +3080,11 @@
-
-
+
+
+
-
+
@@ -3084,10 +3097,11 @@
-
-
+
+
+
-
+
@@ -3100,8 +3114,11 @@
-
-
+
+
+
+
+
@@ -3113,10 +3130,11 @@
-
-
+
+
+
-
+
@@ -3128,7 +3146,7 @@
Scott, Foresman
-
+
@@ -3140,7 +3158,7 @@
Scott, Foresman
-
+
@@ -3153,7 +3171,7 @@
-
+
@@ -3166,7 +3184,7 @@
-
+
@@ -3178,7 +3196,7 @@
Scott, Foresman
-
+
@@ -3190,7 +3208,7 @@
Scott, Foresman
-
+
@@ -3202,7 +3220,7 @@
Scott, Foresman
-
+
@@ -3214,7 +3232,7 @@
Scott, Foresman
-
+
@@ -3226,7 +3244,7 @@
Scott, Foresman
-
+
@@ -3239,7 +3257,7 @@
-
+
@@ -3251,7 +3269,7 @@
Scott, Foresman
-
+
@@ -3263,7 +3281,7 @@
Scott, Foresman
-
+
@@ -3275,7 +3293,7 @@
Scott, Foresman
-
+
@@ -3287,7 +3305,7 @@
Scott, Foresman
-
+
@@ -3300,7 +3318,7 @@
-
+
@@ -3312,7 +3330,7 @@
Scott, Foresman
-
+
@@ -3325,7 +3343,7 @@
-
+
@@ -3338,7 +3356,7 @@
-
+
@@ -3350,7 +3368,7 @@
Scott, Foresman
-
+
@@ -3362,7 +3380,7 @@
Scott, Foresman
-
+
@@ -3374,7 +3392,7 @@
Scott, Foresman
-
+
@@ -3386,7 +3404,7 @@
Scott, Foresman
-
+
@@ -3398,7 +3416,7 @@
Scott, Foresman
-
+
@@ -3411,7 +3429,7 @@
-
+
@@ -3424,7 +3442,7 @@
-
+
@@ -3437,7 +3455,7 @@
-
+
@@ -3449,7 +3467,7 @@
Scott, Foresman
-
+
@@ -3461,7 +3479,7 @@
Scott, Foresman
-
+
@@ -3474,7 +3492,7 @@
-
+
@@ -3487,7 +3505,7 @@
-
+
@@ -3499,7 +3517,7 @@
Scott, Foresman
-
+
@@ -3511,7 +3529,7 @@
Scott, Foresman
-
+
@@ -3523,7 +3541,7 @@
Scott, Foresman
-
+
@@ -3535,7 +3553,7 @@
Scott, Foresman
-
+
@@ -3547,7 +3565,7 @@
Scott, Foresman
-
+
@@ -3559,7 +3577,7 @@
Scott, Foresman
-
+
@@ -3571,7 +3589,7 @@
Scott, Foresman
-
+
@@ -3584,10 +3602,10 @@
-
-
+
+
-
+
@@ -3598,8 +3616,8 @@
1983
Sofmachine
-
-
+
+
@@ -3615,10 +3633,10 @@
-
-
+
+
-
+
@@ -3631,8 +3649,9 @@
-
-
+
+
+
@@ -3644,10 +3663,10 @@
-
-
+
+
-
+
@@ -3660,10 +3679,10 @@
-
+
-
+
@@ -3675,10 +3694,13 @@
Sierra On-Line
-
-
+
+
+
+
+
-
+
@@ -3691,8 +3713,8 @@
-
-
+
+
@@ -3704,10 +3726,11 @@
-
-
+
+
+
-
+
@@ -3720,10 +3743,12 @@
-
-
+
+
+
+
-
+
@@ -3735,7 +3760,7 @@
Software Specialties
-
+
@@ -3747,7 +3772,7 @@
Software Specialties
-
+
@@ -3760,8 +3785,12 @@
-
-
+
+
+
+
+
+
@@ -3773,8 +3802,12 @@
-
-
+
+
+
+
+
+
@@ -3785,7 +3818,7 @@
Texas Instruments
-
+
@@ -3797,7 +3830,7 @@
<unknown>
-
+
@@ -3809,11 +3842,15 @@
Texas Instruments
-
-
-
+
+
+
+
+
+
+
-
+
@@ -3829,7 +3866,7 @@
-
+
@@ -3842,10 +3879,14 @@
-
-
+
+
+
+
+
+
-
+
@@ -3858,8 +3899,9 @@
-
-
+
+
+
@@ -3869,8 +3911,8 @@
1983
Micropal - Thorn EMI Video
-
-
+
+
@@ -3888,7 +3930,7 @@
-
+
@@ -3901,8 +3943,8 @@
-
-
+
+
@@ -3913,7 +3955,7 @@
<unknown>
-
+
@@ -3925,7 +3967,7 @@
Micropal - Thorn EMI Video
-
+
@@ -3937,7 +3979,7 @@
Thorn EMI Video
-
+
@@ -3950,10 +3992,10 @@
-
-
+
+
-
+
@@ -3966,10 +4008,13 @@
-
-
+
+
+
+
+
-
+
@@ -3981,10 +4026,10 @@
Texas Instruments
-
+
-
+
@@ -3997,10 +4042,12 @@
-
-
+
+
+
+
-
+
@@ -4013,8 +4060,11 @@
-
-
+
+
+
+
+
@@ -4025,7 +4075,7 @@
<unknown>
-
+
@@ -4038,8 +4088,8 @@
-
-
+
+
@@ -4051,10 +4101,10 @@
-
-
+
+
-
+
@@ -4067,8 +4117,10 @@
-
-
+
+
+
+
@@ -4080,8 +4132,12 @@
-
-
+
+
+
+
+
+
@@ -4092,7 +4148,7 @@
Tigervision
-
+
@@ -4104,7 +4160,7 @@
Tigervision
-
+
@@ -4116,7 +4172,7 @@
Tigervision
-
+
@@ -4129,7 +4185,7 @@
-
+
@@ -4142,10 +4198,13 @@
-
-
+
+
+
+
+
-
+
@@ -4158,10 +4217,10 @@
-
+
-
+
@@ -4174,10 +4233,13 @@
-
-
+
+
+
+
+
-
+
@@ -4190,8 +4252,9 @@
-
-
+
+
+
@@ -4203,8 +4266,8 @@
-
-
+
+
@@ -4216,8 +4279,8 @@
-
-
+
+
@@ -4228,7 +4291,7 @@
Video Magic
-
+
@@ -4240,7 +4303,7 @@
Video Magic
-
+
@@ -4252,7 +4315,7 @@
Video Magic
-
+
@@ -4264,7 +4327,7 @@
Video Magic
-
+
@@ -4276,10 +4339,10 @@
Walt Disney
-
+
-
+
@@ -4291,10 +4354,10 @@
Walt Disney
-
+
-
+
@@ -4306,10 +4369,10 @@
Walt Disney
-
+
-
+
@@ -4321,11 +4384,15 @@
Texas Instruments
-
-
-
+
+
+
+
+
+
+
-
+
@@ -4341,10 +4408,14 @@
-
-
+
+
+
+
+
+
-
+
@@ -4356,10 +4427,14 @@
Texas Instruments
-
-
+
+
+
+
+
+
-
+
@@ -4371,10 +4446,14 @@
Texas Instruments
-
-
+
+
+
+
+
+
-
+
@@ -4387,21 +4466,25 @@
-
+
-
+
Yahtzee
1980
Milton Bradley
-
-
+
+
+
+
+
+
@@ -4414,14 +4497,13 @@
-
+
-
+
-
-
+
@@ -4433,12 +4515,210 @@
-
+
-
+
+
+
+
+
+
+ Super Extended Basic
+ 1987
+ Triton
+
+
+
+
+
+
+
+
+
+
+
+
+ Championship Baseball
+ 1983
+ Milton Bradley
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Space Bandits
+ 1983
+ Milton Bradley
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sewermania
+ 1983
+ Milton Bradley
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bigfoot
+ 1983
+ Milton Bradley
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Meteor Belt
+ 1983
+ Milton Bradley
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Superfly
+ 1983
+ Milton Bradley
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Terry Turtle's Adventure
+ 1984
+ Milton Bradley
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Honey Hunt
+ 1983
+ Milton Bradley
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Soundtrack Trolley
+ 1983
+ Milton Bradley
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/devices/bus/ti99x/gromport.cpp b/src/devices/bus/ti99x/gromport.cpp
index a9f95d59f51..3eddb6433d9 100644
--- a/src/devices/bus/ti99x/gromport.cpp
+++ b/src/devices/bus/ti99x/gromport.cpp
@@ -111,7 +111,7 @@
#define TRACE_RPK 0
#define TRACE_CHANGE 0
-#define TRACE_ILLWRITE 0
+#define TRACE_ILLWRITE 1
#define TRACE_CONFIG 0
#define TRACE_READ 0
#define TRACE_WRITE 0
@@ -648,9 +648,15 @@ machine_config_constructor multi_conn_device::device_mconfig_additions() const
return MACHINE_CONFIG_NAME( multi_slot );
}
+INPUT_CHANGED_MEMBER( multi_conn_device::switch_changed )
+{
+ if (TRACE_CHANGE) logerror("Slot changed %d - %d\n", (int)((UINT64)param & 0x07), newval);
+ m_active_slot = m_fixed_slot = newval - 1;
+}
+
INPUT_PORTS_START(multi_slot)
PORT_START( "CARTSLOT" )
- PORT_DIPNAME( 0x0f, 0x00, "Multi-cartridge slot" )
+ PORT_DIPNAME( 0x0f, 0x00, "Multi-cartridge slot" ) PORT_CHANGED_MEMBER(DEVICE_SELF, multi_conn_device, switch_changed, 0)
PORT_DIPSETTING( 0x00, "Auto" )
PORT_DIPSETTING( 0x01, "Slot 1" )
PORT_DIPSETTING( 0x02, "Slot 2" )
@@ -1123,7 +1129,8 @@ ioport_constructor gkracker_device::device_input_ports() const
enum
{
PCB_STANDARD=1,
- PCB_PAGED,
+ PCB_PAGED12K,
+ PCB_PAGED16K,
PCB_MINIMEM,
PCB_SUPER,
PCB_MBX,
@@ -1137,7 +1144,8 @@ enum
static const pcb_type pcbdefs[] =
{
{ PCB_STANDARD, "standard" },
- { PCB_PAGED, "paged" },
+ { PCB_PAGED12K, "paged12k" },
+ { PCB_PAGED16K, "paged" },
{ PCB_MINIMEM, "minimem" },
{ PCB_SUPER, "super" },
{ PCB_MBX, "mbx" },
@@ -1153,7 +1161,8 @@ static const pcb_type pcbdefs[] =
static const pcb_type sw_pcbdefs[] =
{
{ PCB_STANDARD, "standard" },
- { PCB_PAGED, "paged" },
+ { PCB_PAGED12K, "paged12k" },
+ { PCB_PAGED16K, "paged16k" },
{ PCB_MINIMEM, "minimem" },
{ PCB_SUPER, "super" },
{ PCB_MBX, "mbx" },
@@ -1192,13 +1201,13 @@ void ti99_cartridge_device::prepare_cartridge()
for (int i=0; i < 5; i++) m_pcb->m_grom[i] = nullptr;
- m_pcb->m_grom_size = m_softlist? get_software_region_length("grom_socket") : m_rpk->get_resource_length("grom_socket");
+ m_pcb->m_grom_size = m_softlist? get_software_region_length("grom") : m_rpk->get_resource_length("grom_socket");
if (TRACE_CONFIG) logerror("grom_socket.size=0x%04x\n", m_pcb->m_grom_size);
if (m_pcb->m_grom_size > 0)
{
regg = memregion(CARTGROM_TAG);
- grom_ptr = m_softlist? get_software_region("grom_socket") : m_rpk->get_contents_of_socket("grom_socket");
+ grom_ptr = m_softlist? get_software_region("grom") : 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
m_pcb->m_grom_address = 0; // for gromemu
@@ -1211,25 +1220,29 @@ void ti99_cartridge_device::prepare_cartridge()
if (m_pcb->m_grom_size > 0x8000) m_pcb->set_grom_pointer(4, subdevice(GROM7_TAG));
}
- m_pcb->m_rom_size = m_softlist? get_software_region_length("rom_socket") : m_rpk->get_resource_length("rom_socket");
+ m_pcb->m_rom_size = m_softlist? get_software_region_length("rom") : m_rpk->get_resource_length("rom_socket");
if (m_pcb->m_rom_size > 0)
{
- if (TRACE_CONFIG) logerror("rom_socket.size=0x%04x\n", m_pcb->m_rom_size);
+ if (TRACE_CONFIG) logerror("rom size=0x%04x\n", m_pcb->m_rom_size);
regr = memregion(CARTROM_TAG);
- rom_ptr = m_softlist? get_software_region("rom_socket") : m_rpk->get_contents_of_socket("rom_socket");
+ rom_ptr = m_softlist? get_software_region("rom") : m_rpk->get_contents_of_socket("rom_socket");
memcpy(regr->base(), rom_ptr, m_pcb->m_rom_size);
// Set both pointers to the same region for now
m_pcb->m_rom_ptr = regr->base();
}
- rom2_length = m_softlist? get_software_region_length("rom2_socket") : m_rpk->get_resource_length("rom2_socket");
- if (rom2_length > 0)
+ // Softlist uses only one ROM area, no second socket
+ if (!m_softlist)
{
- // sizes do not differ between rom and rom2
- // We use the large cartrom space for the second bank as well
- regr = memregion(CARTROM_TAG);
- rom_ptr = m_softlist? get_software_region("rom2_socket") : m_rpk->get_contents_of_socket("rom2_socket");
- memcpy(regr->base() + 0x2000, rom_ptr, rom2_length);
+ rom2_length = m_rpk->get_resource_length("rom2_socket");
+ if (rom2_length > 0)
+ {
+ // sizes do not differ between rom and rom2
+ // We use the large cartrom space for the second bank as well
+ regr = memregion(CARTROM_TAG);
+ rom_ptr = m_rpk->get_contents_of_socket("rom2_socket");
+ memcpy(regr->base() + 0x2000, rom_ptr, rom2_length);
+ }
}
// (NV)RAM cartridges
@@ -1326,9 +1339,13 @@ bool ti99_cartridge_device::call_load()
if (TRACE_CONFIG) logerror("Standard PCB\n");
m_pcb = new ti99_standard_cartridge();
break;
- case PCB_PAGED:
- if (TRACE_CONFIG) logerror("Paged PCB\n");
- m_pcb = new ti99_paged_cartridge();
+ case PCB_PAGED12K:
+ if (TRACE_CONFIG) logerror("Paged PCB 12K\n");
+ m_pcb = new ti99_paged12k_cartridge();
+ break;
+ case PCB_PAGED16K:
+ if (TRACE_CONFIG) logerror("Paged PCB 16K\n");
+ m_pcb = new ti99_paged16k_cartridge();
break;
case PCB_MINIMEM:
if (TRACE_CONFIG) logerror("Minimem PCB\n");
@@ -1505,7 +1522,18 @@ const device_type TI99CART = &device_creator;
Some cartridges also have RAM, and some allow for switching between
ROMs.
- Unlike in the previous implementation we do not model it as a full device.
+ Standard cartridge
+
+ GROM space
+ 6000 77ff 8000 97ff a000 b7ff c000 d7ff e000 f7ff
+ |== GROM3 ==|...|== GROM4 ==|...|== GROM5 ==|...|== GROM6 ==|...|== GROM7 ==|
+
+
+ ROM space
+ 6000 7000 7fff
+ | | |
+ |========== ROM1 ============|
+
***************************************************************************/
ti99_cartridge_pcb::ti99_cartridge_pcb()
@@ -1623,15 +1651,83 @@ WRITE_LINE_MEMBER(ti99_cartridge_pcb::gclock_in)
/*****************************************************************************
- Cartridge type: Paged (Extended Basic)
- This cartridge consists of GROM memory and 2 pages of standard ROM.
+ Cartridge type: Paged (12K, Extended Basic)
+
+ The Extended Basic cartridge consists of several GROMs which are
+ treated in the usual way, and two ROMs (4K and 8K).
+
+ GROM space
+ 6000 77ff 8000 97ff a000 b7ff c000 d7ff e000 f7ff
+ |== GROM3 ==|...|== GROM4 ==|...|== GROM5 ==|...|== GROM6 ==|...|== GROM7 ==|
+
+ ROM space
+ 6000 7000 7fff
+ | | |
+ | |==== ROM2a ===| Bank 0 write to 6000, 6004, ... 7ffc
+ |=== ROM1 ====| |
+ |==== ROM2b ===| Bank 1 write to 6002, 6006, ... 7ffe
+
+ The 4K ROM is mapped into the 6000-6FFF space.
+ The 8K ROM is actually composed of two banks of 4K which are mapped into
+ the 7000-7FFF space. Bank 0 is visible after a write access to 6000 / 6004 /
+ 6008 ... , while bank 1 is visible after writing to 6002 / 6006 / 600A / ...
+
+******************************************************************************/
+
+READ8Z_MEMBER(ti99_paged12k_cartridge::readz)
+{
+ if (m_romspace_selected)
+ {
+ // rom_ptr: 0000-0fff = rom1
+ // 2000-2fff = rom2a
+ // 3000-3fff = rom2b
+ if ((offset & 0x1000)==0)
+ *value = m_rom_ptr[offset & 0x0fff];
+ else
+ *value = m_rom_ptr[(offset & 0x0fff) | 0x2000 | (m_rom_page << 12)];
+ }
+ else
+ {
+ // Will not return anything when not selected (preceding gsq=ASSERT)
+ gromreadz(space, offset, value, mem_mask);
+ }
+}
+
+WRITE8_MEMBER(ti99_paged12k_cartridge::write)
+{
+ if (m_romspace_selected)
+ {
+ m_rom_page = (offset >> 1) & 1;
+ }
+ else
+ {
+ // Will not change anything when not selected (preceding gsq=ASSERT)
+ gromwrite(space, offset, data, mem_mask);
+ }
+}
+
+/*****************************************************************************
+ Cartridge type: Paged (16K)
+
+ GROM space
+ 6000 77ff 8000 97ff a000 b7ff c000 d7ff e000 f7ff
+ |== GROM3 ==|...|== GROM4 ==|...|== GROM5 ==|...|== GROM6 ==|...|== GROM7 ==|
+
+ ROM space
+ 6000 7000 7fff
+ | | |
+ |========== ROM1 ===========| Bank 0 write to 6000, 6004, ... 7ffc
+ | | |
+ |========== ROM2 ===========| Bank 1 write to 6002, 6006, ... 7ffe
+
+ This cartridge consists of GROM memory and 2 pages of standard ROM.
The page is set by writing any value to a location in
the address area, where an even word offset sets the page to 0 and an
odd word offset sets the page to 1 (e.g. 6000 = bank 0, and
6002 = bank 1).
******************************************************************************/
-READ8Z_MEMBER(ti99_paged_cartridge::readz)
+READ8Z_MEMBER(ti99_paged16k_cartridge::readz)
{
if (m_romspace_selected)
{
@@ -1644,7 +1740,7 @@ READ8Z_MEMBER(ti99_paged_cartridge::readz)
}
}
-WRITE8_MEMBER(ti99_paged_cartridge::write)
+WRITE8_MEMBER(ti99_paged16k_cartridge::write)
{
if (m_romspace_selected)
{
@@ -1659,9 +1755,20 @@ WRITE8_MEMBER(ti99_paged_cartridge::write)
/*****************************************************************************
Cartridge type: Mini Memory
- GROM: 6 KiB (occupies G>6000 to G>7800)
- ROM: 4 KiB (romfile is actually 8 K long, second half with zeros, 0x6000-0x6fff)
- persistent RAM: 4 KiB (0x7000-0x7fff)
+ GROM: 6 KiB (occupies G>6000 to G>77ff)
+ ROM: 4 KiB (6000-6fff)
+ RAM: 4 KiB (7000-7fff, battery-backed)
+
+ GROM space
+ 6000 77ff
+ |== GROM3 ==|
+
+ ROM space
+ 6000 7000 7fff
+ | | |
+ |=== ROM1 ====| |
+ |=== NVRAM ===|
+
******************************************************************************/
/* Read function for the minimem cartridge. */
@@ -1717,10 +1824,26 @@ WRITE8_MEMBER(ti99_minimem_cartridge::write)
assigns a number in the selection screen. Switching the RAM banks in this
cartridge is achieved by setting CRU bits (the system serial interface).
- GROM: Editor/Assembler GROM
- ROM: none
- persistent RAM: 32 KiB (0x6000-0x7fff, 4 banks)
- Banking: via CRU write
+ GROM: Editor/Assembler GROM
+ ROM: none
+ RAM: 32 KiB (0x6000-0x7fff, 4 banks)
+ Banking: via CRU write
+
+ GROM space
+ 6000 77ff
+ |==== GROM3 (Editor/Assm) ====|
+
+ ROM space
+ 6000 7000 7fff
+ | | |
+ |======== NVRAM 0 ==========| Bank 0 CRU>0802
+ | | |
+ |======== NVRAM 1 ==========| Bank 1 CRU>0806
+ | | |
+ |======== NVRAM 2 ==========| Bank 2 CRU>080a
+ | | |
+ |======== NVRAM 3 ==========| Bank 3 CRU>080e
+
******************************************************************************/
/* Read function for the super cartridge. */
@@ -1802,7 +1925,7 @@ WRITE8_MEMBER(ti99_super_cartridge::cruwrite)
/*****************************************************************************
Cartridge type: MBX
- GROM: up to 40 KiB
+ 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)
RAM: 1022 B (0x6c00-0x6ffd, overrides ROM in that area)
ROM mapper: 6ffe
@@ -1810,6 +1933,34 @@ WRITE8_MEMBER(ti99_super_cartridge::cruwrite)
TODO: Some MBX cartridges assume the presence of the MBX system
(special user interface box with speech input/output)
and will not run without it. This MBX hardware is not emulated yet.
+
+ GROM space
+ 6000 77ff 8000 97ff a000 b7ff c000 d7ff e000 f7ff
+ |== GROM3 ==|...|== GROM4 ==|...|== GROM5 ==|...|== GROM6 ==|...|== GROM7 ==|
+
+ ROM space
+ 6000 6c00 7000 7fff
+ | | | |
+ | | |===== ROM bank 0 ====| 6ffe = 00
+ | |= RAM =| |
+ |=== ROM bank 0 ==| |===== ROM bank 1 ====| 6ffe = 01
+ | |
+ |===== ROM bank 3 ====| 6ffe = 02
+ | |
+ |===== ROM bank 3 ====| 6ffe = 03
+
+ The 16K ROM is composed of four 4K banks, which can be selected by writing
+ the bank number to address 6ffe. This also affects the RAM so that the
+ bank number is stored in RAM and may also be read from there.
+
+ The mapper does not decode the LSB of the address, so it changes value when
+ a write operation is done on 6FFF. Since the TI console always writes the
+ odd byte first, then the even byte, the last byte written is actually 6FFE.
+
+ ROM bank 0 (ROM area 0000-0fff) is always visible in the space 6000-6bff.
+
+ RAM is implemented by two 1024x4 RAM circuits and is not affected by banking.
+
******************************************************************************/
/* Read function for the mbx cartridge. */
@@ -1817,18 +1968,23 @@ READ8Z_MEMBER(ti99_mbx_cartridge::readz)
{
if (m_romspace_selected)
{
- if ((offset & 0x1c00)==0x0c00)
+ if (m_ram_ptr != nullptr && (offset & 0x1c00)==0x0c00)
{
- // This is the RAM area which overrides any ROM. There is no
- // known banking behavior for the RAM, so we must assume that
- // there is only one bank.
- if (m_ram_ptr != nullptr)
- *value = m_ram_ptr[offset & 0x03ff];
+ // Also reads the value of 6ffe
+ *value = m_ram_ptr[offset & 0x03ff];
+ if (TRACE_READ) space.device().logerror("%04x (RAM) -> %02x\n", offset + 0x6000, *value);
}
else
{
if (m_rom_ptr!=nullptr)
- *value = m_rom_ptr[(offset & 0x1fff) | (m_rom_page<<13)];
+ {
+ if ((offset & 0x1000)==0) // 6000 area
+ *value = m_rom_ptr[offset];
+ else // 7000 area
+ *value = m_rom_ptr[(offset & 0x0fff) | (m_rom_page << 12)];
+
+ if (TRACE_READ) space.device().logerror("%04x(%04x) -> %02x\n", offset + 0x6000, offset | (m_rom_page<<13), *value);
+ }
}
}
else
@@ -1842,16 +1998,19 @@ WRITE8_MEMBER(ti99_mbx_cartridge::write)
{
if (m_romspace_selected)
{
- if (offset == 0x6ffe)
+ if ((offset & 0x1c00)==0x0c00) // RAM area
{
- m_rom_page = data & 1;
- return;
- }
+ if ((offset & 0x0ffe) == 0x0ffe) // Mapper, backed by RAM; reacts to bots 6fff and 6ffe
+ {
+ // Valid values are 0, 1, 2, 3
+ m_rom_page = data & 3;
+ if (TRACE_WRITE) if ((offset & 1)==0) space.device().logerror("Set ROM page = %d\n", data);
+ }
- if ((offset & 0x1c00)==0x0c00)
- {
- if (m_ram_ptr == nullptr) return;
- m_ram_ptr[offset & 0x03ff] = data;
+ if (m_ram_ptr != nullptr)
+ m_ram_ptr[offset & 0x03ff] = data;
+ else
+ if (TRACE_ILLWRITE) space.device().logerror("Write access to %04x but no RAM present\n", offset+0x6000);
}
}
else
@@ -1890,6 +2049,19 @@ WRITE8_MEMBER(ti99_mbx_cartridge::write)
>601E 0 / 0 / 0 / 0
The paged379i cartrige does not have any GROMs.
+
+ ROM space
+ 6000 7000 7fff
+ | | |
+ |========== ROM 1 ==========| Bank 0 Write to 601e
+ | | |
+ |========== ROM 2 ==========| Bank 1 Write to 601c
+ | | |
+ | ... |
+ | | |
+ |========== ROM 16 =========| Bank 15 Write to 6000
+
+
******************************************************************************/
/* Read function for the paged379i cartridge. */
@@ -1928,6 +2100,17 @@ WRITE8_MEMBER(ti99_paged379i_cartridge::write)
The cartridge may also be used without GROM.
+ ROM space
+ 6000 7000 7fff
+ | | |
+ |========== ROM 1 ==========| Bank 0 Write to 6000
+ | | |
+ |========== ROM 2 ==========| Bank 1 Write to 6002
+ | | |
+ | ... |
+ | | |
+ |========== ROM 64 =========| Bank 63 Write to 607e
+
******************************************************************************/
/* Read function for the paged378 cartridge. */
@@ -1953,6 +2136,19 @@ WRITE8_MEMBER(ti99_paged378_cartridge::write)
This type is intended for high-capacity cartridges of up to 2 MiB
The paged379i cartrige does not have any GROMs.
+
+ ROM space
+ 6000 7000 7fff
+ | | |
+ |========== ROM 1 ==========| Bank 0 Write to 6000
+ | | |
+ |========== ROM 2 ==========| Bank 1 Write to 6002
+ | | |
+ | ... |
+ | | |
+ |========== ROM 256 ========| Bank 255 Write to 61fe
+
+
******************************************************************************/
/* Read function for the paged377 cartridge. */
@@ -1991,6 +2187,18 @@ WRITE8_MEMBER(ti99_paged377_cartridge::write)
7 >8000 = 1000 0000 0000 0000
No GROMs used in this type.
+
+ ROM space
+ 6000 7000 7fff
+ | | |
+ |========= ROM 1 ==========| Bank 0 CRU>0802
+ | | |
+ |========= ROM 2 ==========| Bank 1 CRU>0806
+ | | |
+ ...
+ | | |
+ |========= ROM 8 ==========| Bank 7 CRU>081e
+
******************************************************************************/
/* Read function for the pagedcru cartridge. */
@@ -2062,13 +2270,29 @@ WRITE8_MEMBER(ti99_pagedcru_cartridge::cruwrite)
Super-MiniMemory is also included here. We assume a RAM area at addresses
7000-7fff for this cartridge.
+
+ GROM space
+ 6000 77ff 8000 97ff a000 b7ff c000 d7ff e000 ffff
+ |=========================== emulated GROM ================================|
+
+ ROM space
+ 6000 7000 7fff
+ | | |
+ |========== ROM1 ===========| Bank 0 write to 6000, 6004, ... 7ffc
+ | | |
+ |========== ROM2 ===========| Bank 1 write to 6002, 6006, ... 7ffe
+
+
******************************************************************************/
WRITE8_MEMBER(ti99_gromemu_cartridge::set_gromlines)
{
- m_grom_selected = (data != CLEAR_LINE);
- m_grom_read_mode = ((offset & GROM_M_LINE)!=0);
- m_grom_address_mode = ((offset & GROM_MO_LINE)!=0);
+ if (m_grom_ptr != nullptr)
+ {
+ m_grom_selected = (data != CLEAR_LINE);
+ m_grom_read_mode = ((offset & GROM_M_LINE)!=0);
+ m_grom_address_mode = ((offset & GROM_MO_LINE)!=0);
+ }
}
READ8Z_MEMBER(ti99_gromemu_cartridge::readz)
diff --git a/src/devices/bus/ti99x/gromport.h b/src/devices/bus/ti99x/gromport.h
index e420a595c72..ee56c885b71 100644
--- a/src/devices/bus/ti99x/gromport.h
+++ b/src/devices/bus/ti99x/gromport.h
@@ -219,6 +219,7 @@ public:
void insert(int index, ti99_cartridge_device* cart) override;
void remove(int index) override;
+ DECLARE_INPUT_CHANGED_MEMBER( switch_changed );
protected:
virtual void device_start() override;
@@ -345,10 +346,20 @@ public:
/*********** Paged cartridge (like Extended Basic) ********************/
-class ti99_paged_cartridge : public ti99_cartridge_pcb
+class ti99_paged12k_cartridge : public ti99_cartridge_pcb
{
public:
- ~ti99_paged_cartridge() { };
+ ~ti99_paged12k_cartridge() { };
+ DECLARE_READ8Z_MEMBER(readz) override;
+ DECLARE_WRITE8_MEMBER(write) override;
+};
+
+/*********** Paged cartridge (others) ********************/
+
+class ti99_paged16k_cartridge : public ti99_cartridge_pcb
+{
+public:
+ ~ti99_paged16k_cartridge() { };
DECLARE_READ8Z_MEMBER(readz) override;
DECLARE_WRITE8_MEMBER(write) override;
};