Skip to content

Commit 52c1388

Browse files
committed
amiga/cubo.cpp: hookup 8-bit NVRAM device
1 parent cdfb07c commit 52c1388

File tree

1 file changed

+78
-10
lines changed

1 file changed

+78
-10
lines changed

src/mame/amiga/cubo.cpp

Lines changed: 78 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88
for JAMMA use.
99
1010
TODO:
11-
- remove m_input_hack functions, needed to make inputs working
12-
- lsrquiz2i, lsrquizg: access violation on microtouch_device destructor when exiting emulation
13-
Caused by microtouch_device::rcv_complete() overrunning the m_rx_buffer
14-
array space with 149 (array size=16).
15-
11+
- remove m_input_hack functions, needed to make inputs working;
12+
- extra RTC device mapped on i2c bus (shared with the Akiko one?);
13+
- later gambling games requires extra hopper devices;
1614
1715
Known Games:
1816
Dumped | Title | Rev. | Year | Notes
@@ -320,6 +318,7 @@ routines :
320318
#include "amiga.h"
321319
#include "imagedev/cdromimg.h"
322320
#include "machine/microtch.h"
321+
#include "machine/nvram.h"
323322
#include "speaker.h"
324323

325324

@@ -338,6 +337,7 @@ class cubo_state : public amiga_state
338337
, m_player_ports(*this, {"P1", "P2"})
339338
, m_microtouch(*this, "microtouch")
340339
, m_akiko(*this, "akiko")
340+
, m_nvram(*this, "nvram")
341341
{ }
342342

343343
void handle_joystick_cia(uint8_t pra, uint8_t dra);
@@ -369,12 +369,14 @@ class cubo_state : public amiga_state
369369
void cubo_mem(address_map &map) ATTR_COLD;
370370
void overlay_2mb_map32(address_map &map) ATTR_COLD;
371371
protected:
372+
virtual void machine_start() override;
372373
virtual void rs232_tx(int state) override;
373374
virtual void potgo_w(uint16_t data) override;
374375

375376
private:
376377
required_device<microtouch_device> m_microtouch;
377378
required_device<akiko_device> m_akiko;
379+
required_device<nvram_device> m_nvram;
378380

379381
typedef void (cubo_state::*input_hack_func)();
380382
input_hack_func m_input_hack{};
@@ -386,8 +388,19 @@ class cubo_state : public amiga_state
386388
void lasstixx_input_hack();
387389
void mgnumber_input_hack();
388390
void mgprem11_input_hack();
391+
392+
std::unique_ptr<u8[]> m_nvram_data;
389393
};
390394

395+
void cubo_state::machine_start()
396+
{
397+
amiga_state::machine_start();
398+
399+
m_nvram_data = make_unique_clear<u8[]>(0x800);
400+
subdevice<nvram_device>("nvram")->set_base(&m_nvram_data[0], 0x800);
401+
402+
save_pointer(NAME(m_nvram_data), 0x800);
403+
}
391404

392405
void cubo_state::akiko_int_w(int state)
393406
{
@@ -435,8 +448,14 @@ void cubo_state::cubo_mem(address_map &map)
435448
{
436449
map.unmap_value_high();
437450
map(0x000000, 0x1fffff).m(m_overlay, FUNC(address_map_bank_device::amap32));
451+
map(0x600000, 0x601fff).lrw8(
452+
NAME([this] (offs_t offset) { return m_nvram_data[offset]; }),
453+
NAME([this] (offs_t offset, u8 data) { m_nvram_data[offset] = data; })
454+
).umask32(0x000000ff);
438455
map(0x800000, 0x800003).portr("DIPSW1");
456+
map(0x800008, 0x80000b).portw("OUTPUT1");
439457
map(0x800010, 0x800013).portr("DIPSW2");
458+
map(0x800018, 0x80001b).portw("OUTPUT2");
440459
map(0xa80000, 0xb7ffff).noprw();
441460
map(0xb80000, 0xb8003f).rw(m_akiko, FUNC(akiko_device::read), FUNC(akiko_device::write));
442461
map(0xbf0000, 0xbfffff).rw(FUNC(cubo_state::cia_r), FUNC(cubo_state::gayle_cia_w));
@@ -638,7 +657,7 @@ static INPUT_PORTS_START( cubo )
638657
PORT_DIPNAME( 0x02, 0x02, "DSW2 2" )
639658
PORT_DIPSETTING( 0x02, "Reset" )
640659
PORT_DIPSETTING( 0x00, "Set" )
641-
PORT_DIPNAME( 0x04, 0x04, "DSW2 3" )
660+
PORT_DIPNAME( 0x04, 0x04, "DSW2 3" ) // PIC data
642661
PORT_DIPSETTING( 0x04, "Reset" )
643662
PORT_DIPSETTING( 0x00, "Set" )
644663
PORT_DIPNAME( 0x08, 0x08, "DSW2 4" )
@@ -647,7 +666,7 @@ static INPUT_PORTS_START( cubo )
647666
PORT_DIPNAME( 0x10, 0x10, "DSW2 5" )
648667
PORT_DIPSETTING( 0x10, "Reset" )
649668
PORT_DIPSETTING( 0x00, "Set" )
650-
PORT_DIPNAME( 0x20, 0x20, "DSW2 6" )
669+
PORT_DIPNAME( 0x20, 0x20, "DSW2 6" ) // i2c SDA for RTC
651670
PORT_DIPSETTING( 0x20, "Reset" )
652671
PORT_DIPSETTING( 0x00, "Set" )
653672
PORT_DIPNAME( 0x40, 0x40, "DSW2 7" )
@@ -656,6 +675,20 @@ static INPUT_PORTS_START( cubo )
656675
PORT_DIPNAME( 0x80, 0x80, "DSW2 8" )
657676
PORT_DIPSETTING( 0x80, "Reset" )
658677
PORT_DIPSETTING( 0x00, "Set" )
678+
679+
PORT_START("OUTPUT1")
680+
// bit 1 pic clock
681+
// bit 2 hopper related
682+
// bit 3 pic data write
683+
// bit 6 pic enable
684+
// bit 7 hopper motor
685+
686+
PORT_START("OUTPUT2")
687+
// bit 0 chip select (0) normal ticket (1) "Suzo" / "MKXX" motor, "erogatore megagettoni"
688+
// bit 4 ticket motor out
689+
// bit 5 i2c RTC data
690+
// bit 6 i2c RTC CS?
691+
// bit 7 i2c RTC clock
659692
INPUT_PORTS_END
660693

661694
static INPUT_PORTS_START( cndypuzl )
@@ -1082,6 +1115,8 @@ void cubo_state::cubo(machine_config &config)
10821115

10831116
I2C_24C08(config, "i2cmem", 0); // AT24C08N
10841117

1118+
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // unknown type, odeontw accesses it
1119+
10851120
AKIKO(config, m_akiko, 0);
10861121
m_akiko->mem_r_callback().set(FUNC(amiga_state::chip_ram_r));
10871122
m_akiko->mem_w_callback().set(FUNC(amiga_state::chip_ram_w));
@@ -1157,76 +1192,109 @@ void cubo_state::init_cubo()
11571192
ROM_START( cndypuzl )
11581193
CD32_BIOS
11591194

1195+
ROM_REGION(0x1000, "pic", 0) // unknown type
1196+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1197+
11601198
DISK_REGION( "akiko" )
11611199
DISK_IMAGE_READONLY( "cndypuzl", 0, BAD_DUMP SHA1(5f41ed3521b3e05d233ac1245b78cb0b118b2b90) )
11621200
ROM_END
11631201

11641202
ROM_START( haremchl )
11651203
CD32_BIOS
11661204

1205+
ROM_REGION(0x1000, "pic", 0) // unknown type
1206+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1207+
11671208
DISK_REGION( "akiko" )
11681209
DISK_IMAGE_READONLY( "haremchl", 0, BAD_DUMP SHA1(abbab347c0d7c5eef0465d0eee770754a452e874) )
11691210
ROM_END
11701211

11711212
ROM_START( lsrquiz )
11721213
CD32_BIOS
11731214

1215+
ROM_REGION(0x1000, "pic", 0) // unknown type
1216+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1217+
11741218
DISK_REGION( "akiko" )
11751219
DISK_IMAGE_READONLY( "lsrquiz", 0, BAD_DUMP SHA1(41fb6cd0c9d36bd77e9c3db69d36801edc791e96) )
11761220
ROM_END
11771221

11781222
ROM_START( lsrquiz2i )
11791223
CD32_BIOS
11801224

1225+
ROM_REGION(0x1000, "pic", 0) // unknown type
1226+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1227+
11811228
DISK_REGION( "akiko" )
11821229
DISK_IMAGE_READONLY( "lsrquiz2", 0, BAD_DUMP SHA1(78e261df1c548fa492e6cf37a9469640bb8816bf) )
11831230
ROM_END
11841231

11851232
ROM_START( lsrquizg )
11861233
CD32_BIOS
11871234

1235+
ROM_REGION(0x1000, "pic", 0) // unknown type
1236+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1237+
11881238
DISK_REGION( "akiko" )
11891239
DISK_IMAGE_READONLY( "laserquizgreek2pro", 0, BAD_DUMP SHA1(8538915b4a0078f19197a5562e37ed3e6d0429a4) )
11901240
ROM_END
11911241

11921242
ROM_START( mgprem11 )
11931243
CD32_BIOS
11941244

1245+
ROM_REGION(0x1000, "pic", 0) // unknown type
1246+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1247+
11951248
DISK_REGION( "akiko" )
11961249
DISK_IMAGE_READONLY( "mgprem11", 0, BAD_DUMP SHA1(7808db33d5949f6c86d12b32bc388c12377e7038) )
11971250
ROM_END
11981251

11991252
ROM_START( lasstixx )
12001253
CD32_BIOS
12011254

1255+
ROM_REGION(0x1000, "pic", 0) // unknown type
1256+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1257+
12021258
DISK_REGION( "akiko" )
12031259
DISK_IMAGE_READONLY( "lasstixx", 0, BAD_DUMP SHA1(b8f6138e1f1840c193e786c56dab03c512f3e21f) )
12041260
ROM_END
12051261

12061262
ROM_START( mgnumber )
12071263
CD32_BIOS
12081264

1265+
ROM_REGION(0x1000, "pic", 0) // unknown type
1266+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1267+
12091268
DISK_REGION( "akiko" )
12101269
DISK_IMAGE_READONLY( "magicnumber", 0, BAD_DUMP SHA1(60e1fadc42694742d19cc0ac2b6e99e9e33faa3d) )
12111270
ROM_END
12121271

12131272
ROM_START( odeontw )
12141273
CD32_BIOS
12151274

1275+
ROM_REGION(0x1000, "pic", 0) // unknown type
1276+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1277+
12161278
DISK_REGION( "akiko" )
12171279
DISK_IMAGE_READONLY( "twister32_17_3", 0, BAD_DUMP SHA1(a40ec484708e22059f7186415283084ebf01323e) ) // has its audio cut a little, worth to mark as redump needed
12181280
ROM_END
12191281

12201282
ROM_START( odeontw2 )
12211283
CD32_BIOS
12221284

1285+
ROM_REGION(0x1000, "pic", 0) // unknown type
1286+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1287+
12231288
DISK_REGION( "akiko" )
12241289
DISK_IMAGE_READONLY( "odeontw2", 0, BAD_DUMP SHA1(f39e09f35b65a6ae9f1eba4a22f970626b7d3b71) )
12251290
ROM_END
12261291

12271292
ROM_START( eldoralg )
12281293
CD32_BIOS
12291294

1295+
ROM_REGION(0x1000, "pic", 0) // unknown type
1296+
ROM_LOAD( "pic.bin", 0x000000, 0x1000, NO_DUMP )
1297+
12301298
DISK_REGION( "akiko" )
12311299
DISK_IMAGE_READONLY( "eldorado", 0, BAD_DUMP SHA1(bc1617c2e3438b729421c1d8b1bf88840b12f030) )
12321300
ROM_END
@@ -1372,9 +1440,9 @@ GAME( 1995, lsrquiz2i, cubo, cubo, lsrquiz2, cubo_state, init_lsrquiz2, ROT0, "C
13721440
GAME( 1995, lasstixx, cubo, cubo, lasstixx, cubo_state, init_lasstixx, ROT0, "CD Express", "Laser Strixx 2", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
13731441
GAME( 1995, mgnumber, cubo, cubo, mgnumber, cubo_state, init_mgnumber, ROT0, "CD Express", "Magic Number", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
13741442
GAME( 1996, mgprem11, cubo, cubo, mgprem11, cubo_state, init_mgprem11, ROT0, "CD Express", "Magic Premium (v1.1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
1375-
GAME( 1997, eldoralg, cubo, cubo, eldoralg, cubo_state, init_cubo, ROT0, "Shangai Games", "Eldorado (4.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // touchscreen is offset and cannot be calibrated, joystick buttons aren't recognized properly, has slight GFX bug with roulette ball
1376-
GAME( 1998, odeontw, cubo, cubo, eldoralg, cubo_state, init_cubo, ROT0, "CD Express", "Odeon Twister (v1.4)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // "Invalid NVRAM", accesses area $6xxxxx and claims invalid RAM config if bypassed
1377-
GAME( 1998, odeontw2, cubo, cubo, eldoralg, cubo_state, init_cubo, ROT0, "CD Express", "Odeon Twister 2 (v202.19)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Resets halfway thru "please wait" in service mode, therefore NVRAM cannot be inited
1443+
GAME( 1997, eldoralg, cubo, cubo, eldoralg, cubo_state, init_cubo, ROT0, "Shangai Games", "Eldorado (4.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // touchscreen is offset and throws errors in calibration menu, joystick buttons aren't recognized properly in places, uses SPRES=3 (SHRES) for roulette ball in attract
1444+
GAME( 1998, odeontw, cubo, cubo, eldoralg, cubo_state, init_cubo, ROT0, "CD Express", "Odeon Twister (v1.4)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // claims invalid RAM config once intialized (i2c RTC?), hangs with NVRAM viewer in service mode
1445+
GAME( 1998, odeontw2, cubo, cubo, eldoralg, cubo_state, init_cubo, ROT0, "CD Express", "Odeon Twister 2 (v202.19)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // "Security checking failed" once initialized
13781446
// Laser Gate 2, alt title for Eldorado?
13791447
// Lucky Five
13801448
// Greyhound Race

0 commit comments

Comments
 (0)