summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/pasogo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/pasogo.cpp')
-rw-r--r--src/mame/drivers/pasogo.cpp588
1 files changed, 0 insertions, 588 deletions
diff --git a/src/mame/drivers/pasogo.cpp b/src/mame/drivers/pasogo.cpp
deleted file mode 100644
index dd08e9c4609..00000000000
--- a/src/mame/drivers/pasogo.cpp
+++ /dev/null
@@ -1,588 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Peter Trauner
-/******************************************************************************
-
-Pasogo Handheld Console
-Koei 1996
-
-This is a handheld console made by Koei in 1996. All of the games available on
-this console are variations of the game 'Go'
-
-
-Main PCB Layout
----------------
-PT-GMAIN01D
-|--------------|------------||
-|POWER VOL | ||
-| LM2937*| CART ||
-|CE-0702 | SLOT ||
-| | CN1 ||
-| |MC14071B* ||
-| | ||
-| PIEZO_SPKR |------------||
-|CN5 74HC04* |
-| X2 |
-| |-------| CN4|
-| |VADEM | |
-| |VG230 | |
-| | | HM514800* |
-| | | CN3|
-| |-------| HM514800* |
-|CN2* X1 |
-|----------------------------|
-Notes: (all ICs shown)
-
- VG230 - Vadem VG230 single-chip PC platform. Contains 16 MHz NEC uPD70116H V30HL CPU
- (which is a high-speed low-power 8086 variation), IBM PC/XT-compatible core
- logic, LCD controller (CGA/AT&T640x400), keyboard matrix scanner, dual PCMCIA
- 2.1 card controller, EMS 4.0 hardware support for up to 64MB, built-in timer
- PIC/DMA/UART/RTC controllers. The clock input is 32.2200MHz. An internal divider
- creates a 16.11MHz clock for the V30HL CPU.
- HM514800 - Hitachi HM514800 512k x8-bit DRAM
- MC14071 - Motorola MC14071 Quad 2-input OR gate
- 74HC04 - 74HC04 Hex inverter
- LM2937 - Texas Instruments LM2937ES-5 voltage regulator (Max 26V input, 5V output at 500mA)
- CE-0702 - TDK CE-0702 DC-DC converter for LCD in SIP9 package (5V input, -24V output at 25mA)
- POWER - 9V DC power input from AC/DC adapter
- VOL - Volume pot
- CN5 - 5 pin connector for 4-way control pad (up/down/left/right/ground)
- CN4 - 5 pin connector for on/off switch and 2 buttons
- CN3 - 2 pin power input from 6x AA-battery compartment (input voltage is 9V DC)
- CN2 - Flat cable connector for video out to LCD panel. When the LCD is powered on the pixels
- are blue. The LCD panel PCB has part number 97-44264-8 LMG6912RPFC LMG6910RPGR
- and contains the following parts.....
- Matsushita 53008HEB-8
- Sanyo LA6324N quad operational amplifier
- Hitachi BD66285BFC LCD controller IC (x3)
- Hitachi BD66284BFC LCD controller IC (x4)
- The LCD flat cable has several wires but 2 of them have frequencies which measure
- 69.9161Hz and 16.7798kHz. These are assumed to be VSync and HSync
- CN1 - Cart slot
- X1 - Marked 322. Measures 32.21732MHz so this is a common 32.22MHz OSC.
- X2 - No markings. Measures 32.768kHz and used for the RTC
- * - These parts are on the other side of the PCB
-
-
-Carts
------
-All of the carts are identical. Most have only one surface mounted mask ROM. Either a
-MX23C8100 (8M) or YRM0442 (4M). Some are populated with additional parts including a 62256
-32kx8 SRAM, a 3v coin battery and a MM1081N reset chip plus a few resistors/capacitors and
-a transistor. All parts are surface mounted.
-
-PT-GMEM01B
-PT-GMEM01C
-|---------------|
-|-- CR2016 |
-|-- MM1081 |
-|-- |
-|-- |
-|-- 62256 |
-|-- |
-|-- |
-|-- MX23C8100|
-|-- or YRM0442 |
-|---------------|
-Notes:
- Carts containing just one mask ROM are KS-1002, KS-1003, KS1004 and KS-1009
- Carts containing RAM, battery and reset chip are KS-1001 and KS1010
- Carts KS-1005, KS-1006, KS-1007 and KS-1008 probably exist but are unknown.
-
-===========================================================================================
-
- PeT mess@utanet.at march 2008
-
-although it is very related to standard pc hardware, it is different enough
-to make the standard pc driver one level more complex, so own driver
-
-TODO:
-- Make a separate device of the Vadem VG230 core (it is also used in the HP
- OmniGo 100 and 120).
-
-******************************************************************************/
-
-
-#include "emu.h"
-#include "cpu/nec/nec.h"
-#include "bus/generic/slot.h"
-#include "bus/generic/carts.h"
-#include "machine/bankdev.h"
-#include "machine/genpc.h"
-#include "machine/timer.h"
-#include "emupal.h"
-#include "screen.h"
-#include "softlist.h"
-
-/*
- rtc interrupt irq 2
- */
-
-
-class pasogo_state : public driver_device
-{
-public:
- pasogo_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- , m_cart(*this, "cartslot")
- , m_ems(*this, "ems")
- , m_vram(*this, "vram")
- , m_palette(*this, "palette")
- { }
-
- void pasogo(machine_config &config);
-
- DECLARE_INPUT_CHANGED_MEMBER(contrast);
-
-private:
- required_device<cpu_device> m_maincpu;
- required_device<generic_slot_device> m_cart;
- required_device<address_map_bank_device> m_ems;
- required_shared_ptr<uint16_t> m_vram;
- required_device<palette_device> m_palette;
-
- uint16_t ems_r(offs_t offset, uint16_t mem_mask);
- void ems_w(offs_t offset, uint16_t data, uint16_t mem_mask);
- uint16_t emsram_r(offs_t offset, uint16_t mem_mask);
- void emsram_w(offs_t offset, uint16_t data, uint16_t mem_mask);
- uint8_t vg230_io_r(offs_t offset);
- void vg230_io_w(offs_t offset, uint8_t data);
-
- struct
- {
- uint8_t index;
- uint8_t data[0x100];
- struct {
- uint16_t data;
- } bios_timer; // 1.19 MHz tclk signal
- struct {
- int seconds, minutes, hours, days;
- int alarm_seconds, alarm_minutes, alarm_hours, alarm_days;
-
- int onehertz_interrupt_on;
- int onehertz_interrupt_request;
- int alarm_interrupt_on;
- int alarm_interrupt_request;
- } rtc;
- struct {
- int write_protected;
- } pmu;
- } m_vg230;
-
- void machine_reset() override;
- void machine_start() override;
-
- uint32_t screen_update_pasogo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- INTERRUPT_GEN_MEMBER(pasogo_interrupt);
- TIMER_DEVICE_CALLBACK_MEMBER(vg230_timer);
-
- memory_region *m_cart_rom;
- uint8_t m_ems_index;
- uint16_t m_ems_bank[28];
- void emsbank_map(address_map &map);
- void pasogo_io(address_map &map);
- void pasogo_mem(address_map &map);
-};
-
-
-TIMER_DEVICE_CALLBACK_MEMBER(pasogo_state::vg230_timer)
-{
- m_vg230.rtc.seconds += 1;
- if (m_vg230.rtc.seconds >= 60)
- {
- m_vg230.rtc.seconds = 0;
- m_vg230.rtc.minutes += 1;
- if (m_vg230.rtc.minutes >= 60)
- {
- m_vg230.rtc.minutes = 0;
- m_vg230.rtc.hours += 1;
- if (m_vg230.rtc.hours >= 24)
- {
- m_vg230.rtc.hours = 0;
- m_vg230.rtc.days = (m_vg230.rtc.days + 1) & 0xfff;
- }
- }
- }
-
- if (m_vg230.rtc.seconds == m_vg230.rtc.alarm_seconds
- && m_vg230.rtc.minutes == m_vg230.rtc.alarm_minutes
- && m_vg230.rtc.hours == m_vg230.rtc.alarm_hours
- && (m_vg230.rtc.days & 0x1f) == m_vg230.rtc.alarm_hours)
- {
- // generate alarm
- }
-}
-
-void pasogo_state::machine_start()
-{
- system_time systime;
-
- memset(&m_vg230, 0, sizeof(m_vg230));
- m_vg230.pmu.write_protected = true;
- machine().base_datetime(systime);
-
- m_vg230.rtc.seconds = systime.local_time.second;
- m_vg230.rtc.minutes = systime.local_time.minute;
- m_vg230.rtc.hours = systime.local_time.hour;
- m_vg230.rtc.days = 0;
-
- m_vg230.bios_timer.data=0x7200; // HACK
-}
-
-uint8_t pasogo_state::vg230_io_r(offs_t offset)
-{
- int log = true;
- uint8_t data = 0;
-
- m_vg230.bios_timer.data += 0x100; //HACK
- if (offset&1)
- {
- data = m_vg230.data[m_vg230.index];
- switch (m_vg230.index)
- {
- case 0x09:
- break;
-
- case 0x0a:
- if (m_vg230.data[9] & 1)
- data=ioport("JOY")->read();
- else
- data = 0xff;
- break;
-
- case 0x30:
- data = m_vg230.bios_timer.data & 0xff;
- break;
-
- case 0x31:
- data = m_vg230.bios_timer.data >> 8;
- log = false;
- break;
-
- case 0x70:
- data = m_vg230.rtc.seconds;
- log = false;
- break;
-
- case 0x71:
- data = m_vg230.rtc.minutes;
- log = false;
- break;
-
- case 0x72:
- data = m_vg230.rtc.hours;
- log = false;
- break;
-
- case 0x73:
- data = m_vg230.rtc.days;
- break;
-
- case 0x74:
- data = m_vg230.rtc.days >> 8;
- break;
-
- case 0x79:
- /*rtc status*/
- log = false;
- break;
-
- case 0x7a:
- data &= ~3;
- if (m_vg230.rtc.alarm_interrupt_request)
- data |= 1<<1;
- if (m_vg230.rtc.onehertz_interrupt_request)
- data |= 1<<0;
- break;
-
- case 0xc1:
- data &= ~1;
- if (m_vg230.pmu.write_protected)
- data |= 1;
- m_vg230.pmu.write_protected = false;
- log = false;
- break;
- }
-
- if (log)
- logerror("%.5x vg230 %02x read %.2x\n",(int) m_maincpu->pc(), m_vg230.index, data);
- // data=machine.root_device().memregion("maincpu")->base()[0x4000+offset];
- }
- else
- data = m_vg230.index;
-
- return data;
-}
-
-
-void pasogo_state::vg230_io_w(offs_t offset, uint8_t data)
-{
- int log = true;
-
- if (offset & 1)
- {
- // machine.root_device().memregion("maincpu")->base()[0x4000+offset]=data;
- m_vg230.data[m_vg230.index] = data;
- switch (m_vg230.index)
- {
- case 0x09:
- break;
-
- case 0x70:
- m_vg230.rtc.seconds = data & 0x3f;
- break;
-
- case 0x71:
- m_vg230.rtc.minutes = data & 0x3f;
- break;
-
- case 0x72:
- m_vg230.rtc.hours = data & 0x1f;
- break;
-
- case 0x73:
- m_vg230.rtc.days = (m_vg230.rtc.days & ~0xff) | data;
- break;
-
- case 0x74:
- m_vg230.rtc.days = (m_vg230.rtc.days & 0xff) | ((data & 0xf) << 8);
- break;
-
- case 0x75:
- m_vg230.rtc.alarm_seconds = data & 0x3f;
- break;
-
- case 0x76:
- m_vg230.rtc.alarm_minutes = data & 0x3f;
- break;
-
- case 0x77:
- m_vg230.rtc.alarm_hours = data & 0x1f;
- break;
-
- case 0x78:
- m_vg230.rtc.days = data & 0x1f;
- break;
-
- case 0x79:
- m_vg230.rtc.onehertz_interrupt_on = data & 1;
- m_vg230.rtc.alarm_interrupt_on = data & 2;
- log = false;
- break;
-
- case 0x7a:
- if (data & 2)
- {
- m_vg230.rtc.alarm_interrupt_request = false;
- m_vg230.rtc.onehertz_interrupt_request = false; /* update interrupt */
- }
- break;
- }
-
- if (log)
- logerror("%.5x vg230 %02x write %.2x\n", (int)m_maincpu->pc(), m_vg230.index, data);
- }
- else
- m_vg230.index = data;
-}
-
-
-uint16_t pasogo_state::ems_r(offs_t offset, uint16_t mem_mask)
-{
- uint8_t data = 0;
- uint8_t index;
-
- switch (offset)
- {
- case 0:
- data = m_ems_index;
- break;
-
- case 1:
- index = (m_ems_index >> 2) & 0x1f;
- data = m_ems_bank[index];
- break;
- }
- return data;
-}
-
-
-void pasogo_state::ems_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- uint8_t index;
-
- switch (offset)
- {
- case 0:
- m_ems_index = data;
- break;
-
- case 1:
- index = (m_ems_index >> 2) & 0x1f;
- if((index & ~1) == 10)
- {
- logerror("EMS mapping of CGA framebuffer\n");
- break;
- }
- else if(index >= 28)
- {
- logerror("EMS index out of range\n");
- break;
- }
- COMBINE_DATA(&m_ems_bank[index]);
- break;
- }
-}
-
-uint16_t pasogo_state::emsram_r(offs_t offset, uint16_t mem_mask)
-{
- m_ems->set_bank(m_ems_bank[(offset >> 13) & 0x1f] & 0x7fff);
- return m_ems->read16(offset & 0x1fff, mem_mask);
-}
-
-void pasogo_state::emsram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- m_ems->set_bank(m_ems_bank[(offset >> 13) & 0x1f] & 0x7fff);
- m_ems->write16(offset & 0x1fff, data, mem_mask);
-}
-
-void pasogo_state::emsbank_map(address_map &map)
-{
- map(0x04080000, 0x040fffff).ram();
- map(0x08000000, 0x080fffff).bankr("bank27");
- map(0x10000000, 0x1000ffff).ram(); // cart ram?
-}
-
-void pasogo_state::pasogo_mem(address_map &map)
-{
- map(0x80000, 0xeffff).rw(FUNC(pasogo_state::emsram_r), FUNC(pasogo_state::emsram_w));
- map(0xb8000, 0xbffff).ram().share("vram");
- map(0xf0000, 0xfffff).bankr("bank27");
-}
-
-
-void pasogo_state::pasogo_io(address_map &map)
-{
- map(0x0000, 0x00ff).m("mb", FUNC(ibm5160_mb_device::map));
- map(0x0026, 0x0027).rw(FUNC(pasogo_state::vg230_io_r), FUNC(pasogo_state::vg230_io_w));
- map(0x006c, 0x006f).rw(FUNC(pasogo_state::ems_r), FUNC(pasogo_state::ems_w));
-}
-
-
-static INPUT_PORTS_START( pasogo )
- PORT_START("JOY")
-// PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("select")
-// PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START) PORT_NAME("start")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("O") /*?*/
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("X") /*?*/
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("a") PORT_CODE(KEYCODE_A)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("b") PORT_CODE(KEYCODE_B)
- PORT_START("COLOR")
- PORT_CONFNAME(0x01, 0x01, "Contrast") PORT_CHANGED_MEMBER(DEVICE_SELF, pasogo_state, contrast, 0)
- PORT_CONFSETTING(0x00, "Actual")
- PORT_CONFSETTING(0x01, "Enhanced")
-INPUT_PORTS_END
-
-INPUT_CHANGED_MEMBER(pasogo_state::contrast)
-{
- if(newval)
- {
- m_palette->set_pen_color(0, rgb_t(80, 130, 130));
- m_palette->set_pen_color(1, rgb_t(40, 60, 140));
- }
- else
- {
- m_palette->set_pen_color(0, rgb_t(100, 110, 100));
- m_palette->set_pen_color(1, rgb_t(90, 80, 110));
- }
-}
-
-uint32_t pasogo_state::screen_update_pasogo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- uint8_t *vram = (uint8_t *)m_vram.target();
- int x, y;
- for (y=0; y<240; y++)
- {
- for (x=0; x<(320/8); x++)
- {
- int a = (y & 3) * 0x2000;
- uint8_t d1 = vram[a + (y >> 2) * 80 + x];
- uint16_t *line = &bitmap.pix16(y, x << 3);
- *line++ = ((d1 >> 7) & 1);
- *line++ = ((d1 >> 6) & 1);
- *line++ = ((d1 >> 5) & 1);
- *line++ = ((d1 >> 4) & 1);
- *line++ = ((d1 >> 3) & 1);
- *line++ = ((d1 >> 2) & 1);
- *line++ = ((d1 >> 1) & 1);
- *line++ = ((d1 >> 0) & 1);
- }
- }
- return 0;
-}
-
-INTERRUPT_GEN_MEMBER(pasogo_state::pasogo_interrupt)
-{
-// m_maincpu->pulse_input_line(UPD7810_INTFE1, attotime::zero);
-}
-
-void pasogo_state::machine_reset()
-{
- std::string region_tag;
- ioport_port *color = ioport("COLOR");
- m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
- if (!m_cart_rom) // even with mandatory carts, debug will crash without anything at the boot vector
- m_cart_rom = memregion("empty");
-
- membank("bank27")->set_base(m_cart_rom->base());
- m_ems_index = 0;
- memset(m_ems_bank, 0, sizeof(m_ems_bank));
- contrast(*color->fields().first(), 0, 0, color->read());
-}
-
-void pasogo_state::pasogo(machine_config &config)
-{
- V30(config, m_maincpu, XTAL(32'220'000)/2);
- m_maincpu->set_addrmap(AS_PROGRAM, &pasogo_state::pasogo_mem);
- m_maincpu->set_addrmap(AS_IO, &pasogo_state::pasogo_io);
- m_maincpu->set_vblank_int("screen", FUNC(pasogo_state::pasogo_interrupt));
- m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
-
- ADDRESS_MAP_BANK(config, "ems").set_map(&pasogo_state::emsbank_map).set_options(ENDIANNESS_LITTLE, 16, 32, 0x4000);
-
- ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb", 0));
- mb.set_cputag(m_maincpu);
- mb.int_callback().set_inputline(m_maincpu, 0);
- mb.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
-
- RAM(config, RAM_TAG).set_default_size("512K");
-
- // It's a CGA device right so lets use isa_cga! Well, not so much.
- // The carts use vg230 specific registers and mostly ignore the mc6845.
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
- screen.set_refresh_hz(60);
- screen.set_size(320, 240);
- screen.set_visarea(0, 320-1, 0, 240-1);
- screen.set_screen_update(FUNC(pasogo_state::screen_update_pasogo));
- screen.set_palette(m_palette);
- PALETTE(config, m_palette).set_entries(2);
-
- GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "pasogo_cart");
- m_cart->set_width(GENERIC_ROM16_WIDTH);
- m_cart->set_must_be_loaded(true);
-
- SOFTWARE_LIST(config, "cart_list").set_original("pasogo");
-
- TIMER(config, "vg230_timer").configure_periodic(FUNC(pasogo_state::vg230_timer), attotime::from_hz(1));
-}
-
-ROM_START( pasogo )
- ROM_REGION( 0x10000, "empty", ROMREGION_ERASEFF )
-ROM_END
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1996, pasogo, 0, 0, pasogo, pasogo, pasogo_state, empty_init, "KOEI", "PasoGo", MACHINE_NO_SOUND|MACHINE_NOT_WORKING)