diff options
Diffstat (limited to 'src/mame/drivers/special_gambl.cpp')
-rw-r--r-- | src/mame/drivers/special_gambl.cpp | 292 |
1 files changed, 0 insertions, 292 deletions
diff --git a/src/mame/drivers/special_gambl.cpp b/src/mame/drivers/special_gambl.cpp deleted file mode 100644 index f81628ffdd1..00000000000 --- a/src/mame/drivers/special_gambl.cpp +++ /dev/null @@ -1,292 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:MetalliC - -/* - Gambling hardware based on "Specialist MX" computer - (c) 199? Dinaris - - Main components: - Z80 CPU, - 27256 ROM, - 2x KR580VV55(i8255 PPI), - KR580VI53(i8253 PIT), - 8x KR565RU5(4164) DRAM, - 3x KR573RU10(HM6516) SRAM - - How to enter statistics mode: - - press Test button, "CODE" text will appear - - repeat 4x times - - press Test button (code_digit - 1) times - - press and hold Test button until "INPUT" text appears - - release Test button - Currently we use 0000 hardware code, in such case game will accept any code sequence. - Now you may press "Clear stats" key few times to clear all the non-volatile play statistics. - Or press "Clear stats" once, then hold for a several seconds, and then press again - game will clear NVRAM and also raise few flags, effect is not known. - -*/ - -#include "emu.h" -#include "cpu/z80/z80.h" -#include "audio/special.h" -#include "machine/i8255.h" -#include "machine/pit8253.h" -#include "machine/nvram.h" -#include "machine/ticket.h" -#include "emupal.h" -#include "screen.h" -#include "speaker.h" - -class dinaris_state : public driver_device -{ -public: - dinaris_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_ppi(*this, "ppi8255") - , m_ppi2(*this, "ppi82552") - , m_pit(*this, "pit8253") - , m_palette(*this, "palette") - , m_nvram(*this, "nvram") - , m_vram(*this, "vram") - , m_hopper(*this, "hopper") - , m_lamps(*this, "lamp%u", 0U) - , m_sram_en(false) - , m_cold_boot(0) - { } - - void dice(machine_config &config); - - DECLARE_CUSTOM_INPUT_MEMBER(boot_r) { return m_cold_boot; } - DECLARE_INPUT_CHANGED_MEMBER(ram_test) { m_maincpu->set_input_line(INPUT_LINE_NMI, newval ? ASSERT_LINE : CLEAR_LINE); } - -protected: - enum - { - TIMER_COLD_BOOT - }; - - void machine_start() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - - void dice_palette(palette_device &palette) const; - u32 screen_update_dice(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - - void dice_mem(address_map &map); - void dice_io(address_map &map); - - required_device<cpu_device> m_maincpu; - required_device<i8255_device> m_ppi; - required_device<i8255_device> m_ppi2; - required_device<pit8253_device> m_pit; - required_device<palette_device> m_palette; - required_device<nvram_device> m_nvram; - required_shared_ptr<u8> m_vram; - required_device<hopper_device> m_hopper; - output_finder<8> m_lamps; - - void lamps_w(u8 data); - u8 ppi2a_r(); - void ppi2c_w(u8 data); - u8 code_r(offs_t offset); - - std::unique_ptr<u8[]> m_sram; - bool m_sram_en; - int m_cold_boot; -}; - - -static INPUT_PORTS_START(dice) - PORT_START("P0") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_GAMBLE_LOW) // 6 or less / double less - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP) // 12/11 - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_GAMBLE_BET) // bet / field - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_GAMBLE_HALF) // point/7 - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH) // 8 or more / double more - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL) // start / double - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT) // payout / take - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_CUSTOM_MEMBER(dinaris_state, boot_r) - - PORT_START("P1") - PORT_DIPNAME(0x01, 0x00, DEF_STR(Language)) - PORT_DIPSETTING(0x00, DEF_STR(English)) - PORT_DIPSETTING(0x01, "Russian") - PORT_SERVICE_NO_TOGGLE(0x02, IP_ACTIVE_LOW) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_SERVICE1) PORT_NAME("Clear stats") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_COIN1) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("hopper", hopper_device, line_r) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_SERVICE2) PORT_NAME("Reset") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) - - PORT_START("NMI") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_SERVICE3) PORT_NAME("RAM Test") PORT_CHANGED_MEMBER(DEVICE_SELF, dinaris_state, ram_test, 0) -INPUT_PORTS_END - -void dinaris_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - switch (id) - { - case TIMER_COLD_BOOT: - m_cold_boot = 1; - break; - default: - throw emu_fatalerror("Unknown id in dinaris_state::device_timer"); - } -} - -void dinaris_state::machine_start() -{ - m_lamps.resolve(); - - constexpr int size = 0x800; // actually used only 256 bytes - m_sram = std::make_unique<u8[]>(size); - m_nvram->set_base(&m_sram[0], size); - - save_pointer(NAME(m_sram), size); - save_item(NAME(m_sram_en)); - save_item(NAME(m_cold_boot)); - - timer_set(attotime::from_msec(100), TIMER_COLD_BOOT); -} - -void dinaris_state::dice_mem(address_map &map) -{ - map(0x0000, 0x7fff).rom(); - map(0x8000, 0x8fff).ram(); // SRAM - map(0x9000, 0xffff).ram().share("vram"); // DRAM -} - -void dinaris_state::dice_io(address_map &map) -{ - map.global_mask(0x000f); - map(0x00, 0x03).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0x04, 0x07).rw(m_ppi2, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0x08, 0x0b).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - map(0x0c, 0x0d).r(FUNC(dinaris_state::code_r)).mirror(0x02); -} - -// borrowed from Specialist MX, probably wrong -static constexpr rgb_t specimx_pens[16] = { - { 0x00, 0x00, 0x00 }, // 0 - { 0x00, 0x00, 0xaa }, // 1 - { 0x00, 0xaa, 0x00 }, // 2 - { 0x00, 0xaa, 0xaa }, // 3 - { 0xaa, 0x00, 0x00 }, // 4 - { 0xaa, 0x00, 0xaa }, // 5 - { 0xaa, 0xaa, 0x00 }, // 6 - { 0xaa, 0xaa, 0xaa }, // 7 - { 0x55, 0x55, 0x55 }, // 8 - { 0x55, 0x55, 0xff }, // 9 - { 0x55, 0xff, 0x55 }, // A - { 0x55, 0xff, 0xff }, // B - { 0xff, 0x55, 0x55 }, // C - { 0xff, 0x55, 0xff }, // D - { 0xff, 0xff, 0x55 }, // E - { 0xff, 0xff, 0xff } // F -}; - -void dinaris_state::dice_palette(palette_device &palette) const -{ - palette.set_pen_colors(0, specimx_pens); -} - -u32 dinaris_state::screen_update_dice(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - // note: attribute area bytes set colors for 4x2 pix screen elements, not 8x1 like Specialist MX. - for (int x = 0; x < 48; x++) - { - for (int y = 0; y < 256; y++) - { - u8 const code = m_vram[0x0000 + y + x * 256]; - u8 const color1 = m_vram[0x4000 + (y & 0xfe) + x * 256]; - u8 const color2 = m_vram[0x4000 + (y | 0x01) + x * 256]; - for (int b = 7; b >= 4; b--) - bitmap.pix(y, x * 8 + (7 - b)) = BIT(code, b) ? (color1 & 0xf) : (color1 >> 4); - for (int b = 3; b >= 0; b--) - bitmap.pix(y, x * 8 + (7 - b)) = BIT(code, b) ? (color2 & 0xf) : (color2 >> 4); - } - } - return 0; -} - -void dinaris_state::lamps_w(u8 data) -{ - // TODO identify each lamp - for (int i = 0; i < 8; i++) - m_lamps[i] = BIT(data, i); -} - -u8 dinaris_state::ppi2a_r() -{ - return m_sram_en ? m_sram[m_ppi2->pb_r()] : 0xff; -} - -void dinaris_state::ppi2c_w(u8 data) -{ - if (!BIT(data, 2)) - m_sram_en = true; - - if (!BIT(data, 1)) - m_sram_en = false; - - if (!BIT(data, 0) && m_sram_en) - m_sram[m_ppi2->pb_r()] = m_ppi2->pa_r(); - - m_hopper->motor_w(((data & 0x68) == 0x60) ? 1 : 0); -} - -u8 dinaris_state::code_r(offs_t offset) -{ - // it is not clear how statistics mode code was set, related components was removed from PCB - // currently we return 0 so game will accept any code sequence - return 0x0000 >> (offset * 8); -} - -void dinaris_state::dice(machine_config &config) -{ - // Basic machine hardware - Z80(config, m_maincpu, XTAL(8'000'000) / 4); // not confirmed - m_maincpu->set_addrmap(AS_PROGRAM, &dinaris_state::dice_mem); - m_maincpu->set_addrmap(AS_IO, &dinaris_state::dice_io); - m_maincpu->set_vblank_int("screen", FUNC(dinaris_state::irq0_line_hold)); - - // Video - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(XTAL(8'000'000), 512, 0, 384, 312, 0, 256); - screen.set_screen_update(FUNC(dinaris_state::screen_update_dice)); - screen.set_palette(m_palette); - - PALETTE(config, m_palette, FUNC(dinaris_state::dice_palette), 16); - - // Sound - SPEAKER(config, "speaker").front_center(); - SPECIMX_SND(config, "custom", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); - - PIT8253(config, m_pit, 0); - m_pit->set_clk<0>(XTAL(8'000'000) / 4); - m_pit->out_handler<0>().set("custom", FUNC(specimx_sound_device::set_input_ch0)); - m_pit->set_clk<1>(XTAL(8'000'000) / 4); - m_pit->out_handler<1>().set("custom", FUNC(specimx_sound_device::set_input_ch1)); - m_pit->set_clk<2>(XTAL(8'000'000) / 4); - m_pit->out_handler<2>().set("custom", FUNC(specimx_sound_device::set_input_ch2)); - - // Devices - I8255(config, m_ppi); - m_ppi->in_pa_callback().set_ioport("P0"); - m_ppi->in_pb_callback().set_ioport("P1"); - m_ppi->out_pc_callback().set(FUNC(dinaris_state::lamps_w)); - - I8255(config, m_ppi2); - m_ppi2->in_pa_callback().set(FUNC(dinaris_state::ppi2a_r)); - m_ppi2->out_pc_callback().set(FUNC(dinaris_state::ppi2c_w)); - - NVRAM(config, m_nvram, nvram_device::DEFAULT_ALL_0); - HOPPER(config, m_hopper, attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW); -} - -ROM_START(dindice) - ROM_REGION( 0x8000, "maincpu", 0) - ROM_LOAD( "27256.bin", 0x0000, 0x8000, CRC(511f8ba8) SHA1(e75a2cab80ac6b08a19d1adb8ba9bb321aa5e7a8)) -ROM_END - -GAME( 199?, dindice, 0, dice, dice, dinaris_state, empty_init, ROT0, "Dinaris", "Dice game", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_COLORS) |