summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Angelo Salese <salese_corp_ltd@email.it>2015-01-31 00:57:49 +0100
committer Angelo Salese <salese_corp_ltd@email.it>2015-01-31 00:57:49 +0100
commit7333404896dc06d8d829a51ae571cd3064b8bff8 (patch)
tree13144226b4a11096a4095e1e576abed1de5d07b6
parent134158802555e5fe98592f7fb22eb65b4272a1cb (diff)
parente1c631813a96ba27fb9977434c83e0342b846425 (diff)
Merge branch 'master' of https://github.com/mamedev/mame
-rw-r--r--src/mame/drivers/comebaby.c137
-rw-r--r--src/osd/sdl/video.c103
-rw-r--r--src/osd/sdl/video.h29
3 files changed, 195 insertions, 74 deletions
diff --git a/src/mame/drivers/comebaby.c b/src/mame/drivers/comebaby.c
index 18fbe9c344e..01c957ac8fc 100644
--- a/src/mame/drivers/comebaby.c
+++ b/src/mame/drivers/comebaby.c
@@ -2,9 +2,9 @@
(c) 2000 ExPotato Co. Ltd (Excellent Potato)
TODO:
-Can't be emulated without proper motherboard BIOS
+Nearly everything.
- There also appears to be a sequel which may be running on the same hardware, which might not have been released.
+ There also appears to be a sequel which may be running on the same hardware, but which does not seem to have been released.
Come On Baby - Ballympic Heroes! (c) 2001
Other games in this series include:
@@ -16,29 +16,138 @@ Can't be emulated without proper motherboard BIOS
This is a Korean PC based board running Windows. The game runs fully from
the hard disk making these things rather fragile and prone to damage.
- Very little is known about the actual PC at this time, and the driver is
- just a skeleton placeholder for the CHD dump of the hard disk.
+ PC Motherboard: PC Partner BXAS1-928
+ BIOS String: 07/03/2000-440BX-ITE8671-2A69KV3IC-00
+ aka. BIOS-I-2M
+ Award BIOS
+ B1120IAG.BIN For Super IO = ITE 8671
+ Clock Gen IC : Winbond-39A
+ (Nov/2000 built)
+
+ CPU - Slot 1 Celeron 633MHz (66x9.5)
+ Memory - 65536k SDRAM PC100
+
+ Brief motherboard overview (from PC Partner BXAS1-928 motherboard manual)
+ --
+
+ HARDWARE CONFIGURATION
+ This motherboard is based on Intel 82440BX chipset. The chipset is a
+ highly integrated solution for a cost-effective and compact motherboard.
+ The motherboard supports standard DIMM module, PC-100 DIMM module or
+ Registered DIMM Module.
+
+ Features on-board include....
+ super-I/O, Ultra DMA33 (Ultra DMA66 optional for VIA chipset), PCI bus master IDE, AGP Ver 1.0, PCI Ver 2.1 compliance,
+ USB, VRM 8.4 compliance, ECC, ATX specification 2.01 compliance, hardware monitoring (optional), On-board PCI Sound
+ Sub-system(optional). Supports PC-100 DIMM Module.
+
+ Key Features:
+
+ Processor
+ - Full support for the Intel Pentium II & Intel Pentium III, Intel Celeron and Deschutes processors using Slot 1 connector.
+ - Slot 1 connector for Intel Pentium II & Intel Pentium III microprocessors.
+ - Supports 66MHz and 100MHz bus speed including all Pentium II & Pentium III processors and future processor.
+
+ CPU Speed Setting
+ - Jumper setting or no jumper is needed to set for various speed of CPU (Factory optional).
+
+ VRM (Voltage Regulator Modules) on Board
+ - Flexible motherboard design with on-board VRM 8.4, easy to upgrade with
+ Future Intel Pentium II & Pentium III processors.
+
+ Cache
+ - Pentium II & Pentium III Processor built-in L2 cache.
+
+ System Memory
+ - Up to 384MB (SDRAM) or 768MB (Registered SDRAM) - for 440BX.
+ - A total of three 168-pin DIMM sockets for 440BX.
+ - Supports SDRAM (only for 66MHz bus speed).
+ - Supports PC-100.
+
+ Memory Organization
+ - Supports single-density DIMMs of 1MB, 2MB, 4MB, 8MB and 16MB depth (x64 or 72).
+ - Supports double-density DIMMs of 2MB, 4MB, 8MB, 16MB and 32MB depth
+ (x64 or 72).
+ - Supports error checking correction (ECC) using parity DRAM modules (for 440BX).
+ - Banks of different DRAM types depths can be mixed.
+
+ Expansion Slots
+ - Supports SB-LINK Port for Creative Sound PCI Card.
+ - 1 AGP slot (ver. 1.0, 1x/2x mode supported).
+ - 5 PCI bus master slots (rev. 2.1 compliant, with 1 PCI slot sharing with 1 ISA slot)
+ - 2 ISA slots (1 ISA slot sharing with 1 PCI slot).
+
+ On-Board I/O
+ - Two PCI fast IDE ports supporting up to 4 ATA2, Ultra DMA33 IDE HDDs, Ultra DMA66 (optional only for VIA Chipset)
+ IDE HDDs, CD-Roms, ZIP devices and LS-120 drives as boot drive.
+ - Supports bus master IDE, PIO mode 4 (up to 16M bytes/sec), Ultra DMA33 (up
+ to 33M bytes/sec) transfer.
+ - One ECP/EPP parallel port .
+ - Two 16550-compatible UART serial ports.
+ - One floppy port supporting two FDDs of 360KB, 720KB, 1.2MB, 1.44MB
+ or 2.88MB formated capacity.
+ - Two USB ports.
+ - PS/2 keyboard port.
+ - PS/2 mouse port.
+ - Infrared (IrDA) support (via a header).
+ - One Line / Speaker out, one Mic in, one Line in and MIDI / Gameport
+
+ System BIOS
+ - 2MB flash BIOS supporting PnP, APM, ATAPI, ACPI and DMI;
+ - Jumper selection for 5V or 12V flash memory voltage.
+ - Auto detects and supports LBA hard disks with formatted capacities over
+ 8.4GB.
+ - Easily upgradable by end-user.
+
+ Plug-and-Play
+ - Supports Plug-and-Play Specification 1.1.
+ - Plug-and-play for DOS, Windows 3.X, Windows 95 as well as Windows 98.
+ - Fully steerable PCI interrupts.
+
+ Power Management
+ - Supports SMM, APM and ACPI.
+ - Break switch for instant suspend/resume on system operation.
+ - Energy star "Green PC" compliant .
+ - Supports WAKE-ON-LAN (WOL).
+ - Supports Wake on Ring for External Modem.
+ - Supports ATX specification 2.01.
+
+ Creative PCI Sound (optional)
+ - Full DOS game support (DDMA, PC/PCI, CLS).
+ - PCI 2.1 Bus Master, hardware sound acceleration.
+ - Direct sound and sound Blaster Compatible.
+ - Full Duplex, 3D Enhancement, Software wavetable.
+ - PNP and APM 1.2 support.
+ - Win95/98, NT drivers ready.
+
+ Keyboard Password Turn ON
+ - Special feature for system security.
+
+ System monitoring (optional)
+ - Hardware monitoring circuitry is supported, provides voltages, temperature, fan speeds etc. monitoring.
+
+ --
- The donor PC looks like a standard Windows98 setup.
+ The donor PC looks like a standard Windows 98 setup.
The only exceptions we see are that there's a game logo.sys/logo.bmp in the
- root directory to hide the Windows98 startup screen, and a shortcut to
+ root directory to hide the Windows 98 startup screen, and a shortcut to
the game in the startup programs.
- Also of interest, Windows98 was installed from a setup folder on the HD.
+ Also of interest, Windows 98 was installed from a setup folder on the HD.
To me this hints that there may have been some expectation of the disk
being plugged into random hardware.
- The game is pretty much standard PC game running on Windows98 PC.
- It uses DirectSound and the Microsoft MCI interfaces and Glide for video.
+ The game is pretty much a standard PC game running on a Windows 98 PC.
+ It uses DirectSound and the Microsoft MCI interfaces and 3dfx Glide for video.
The PC that the game was dumped from has Sound Blaster and Ensoniq drivers,
but it works fine with some other sound configurations.
- The donor PC has a 3dfxvoodoo3 driver installation directory, but it works
+ The donor PC has a "3dfxvoodoo3" driver installation directory, but it works
fine with a Voodoo4 4500.
The game itself has some protection, it expects a file C:\\WINDOWS\win386p.swp of 84 bytes
to have the hard disk volume serial number in ascii number (not hex) format at offset 4.
- The game appears to use parallel port (0x378,0x379)for I/O.
- The direct port access means it won't run on XP
+ The game appears to use parallel port (0x378,0x379) for I/O.
+ The direct port access means it won't run on XP.
For the controls, it writes a device select to 0x378, and reads the device value from 0x379.
There is some other output, maybe lights?
--------------------------------------------
@@ -126,8 +235,8 @@ MACHINE_CONFIG_END
ROM_START(comebaby)
- ROM_REGION32_LE(0x20000, "maincpu", 0) /* motherboard bios */
- ROM_LOAD("comeonbaby.pcbios", 0x000000, 0x10000, NO_DUMP )
+ ROM_REGION32_LE(0x80000, "maincpu", 0) /* motherboard bios */
+ ROM_LOAD("b1120iag.bin", 0x000000, 0x40000, CRC(9b6f95f1) SHA1(65d6a2fea9911593f093b2e2a43d1534b54d60b3) )
DISK_REGION( "disks" )
DISK_IMAGE( "comebaby", 0, SHA1(ea57919319c0b6a1d4abd7822cff028855bf082f) )
diff --git a/src/osd/sdl/video.c b/src/osd/sdl/video.c
index 05b17fd45e1..a5e566982e1 100644
--- a/src/osd/sdl/video.c
+++ b/src/osd/sdl/video.c
@@ -156,12 +156,12 @@ void sdl_monitor_info::refresh()
#if defined(SDLMAME_WIN32) // Win32 version
MONITORINFOEX info;
info.cbSize = sizeof(info);
- GetMonitorInfo((HMONITOR)monitor->handle, (LPMONITORINFO)&info);
- monitor->m_dimensions.x = monitor->m_dimensions.y = 0;
- monitor->m_center_width = monitor->m_dimensions.w = info.rcMonitor.right - info.rcMonitor.left;
- monitor->m_center_height = monitor->m_dimensions.h = info.rcMonitor.bottom - info.rcMonitor.top;
+ GetMonitorInfo((HMONITOR)m_handle, (LPMONITORINFO)&info);
+ m_dimensions.x = m_dimensions.y = 0;
+ m_center_width = m_dimensions.w = info.rcMonitor.right - info.rcMonitor.left;
+ m_center_height = m_dimensions.h = info.rcMonitor.bottom - info.rcMonitor.top;
char *temp = utf8_from_wstring(info.szDevice);
- strcpy(monitor->monitor_device, temp);
+ strcpy(m_monitor_device, temp);
osd_free(temp);
#elif defined(SDLMAME_MACOSX) // Mac OS X Core Imaging version
CGDirectDisplayID primary;
@@ -171,9 +171,10 @@ void sdl_monitor_info::refresh()
primary = CGMainDisplayID();
dbounds = CGDisplayBounds(primary);
- monitor->center_width = monitor->monitor_width = dbounds.size.width - dbounds.origin.x;
- monitor->center_height = monitor->monitor_height = dbounds.size.height - dbounds.origin.y;
- strcpy(monitor->monitor_device, "Mac OS X display");
+ m_dimensions.x = m_dimensions.y = 0;
+ m_center_width = m_dimensions.w = dbounds.size.width - dbounds.origin.x;
+ m_center_height = m_dimensions.h = dbounds.size.height - dbounds.origin.y;
+ strcpy(m_monitor_device, "Mac OS X display");
#elif defined(SDLMAME_X11) || defined(SDLMAME_NO_X11) // X11 version
{
#if defined(SDLMAME_X11)
@@ -185,9 +186,10 @@ void sdl_monitor_info::refresh()
if ( SDL_GetWMInfo(&info) && (info.subsystem == SDL_SYSWM_X11) )
{
screen = DefaultScreen(info.info.x11.display);
- SDL_VideoDriverName(monitor->monitor_device, sizeof(monitor->monitor_device)-1);
- monitor->monitor_width = DisplayWidth(info.info.x11.display, screen);
- monitor->monitor_height = DisplayHeight(info.info.x11.display, screen);
+ SDL_VideoDriverName(m_monitor_device, sizeof(m_monitor_device)-1);
+ m_dimensions.x = m_dimensions.y = 0;
+ m_dimensions.w = DisplayWidth(info.info.x11.display, screen);
+ m_dimensions.h = DisplayHeight(info.info.x11.display, screen);
if ((XineramaIsActive(info.info.x11.display)) && video_config.restrictonemonitor)
{
@@ -196,15 +198,15 @@ void sdl_monitor_info::refresh()
xineinfo = XineramaQueryScreens(info.info.x11.display, &numscreens);
- monitor->center_width = xineinfo[0].width;
- monitor->center_height = xineinfo[0].height;
+ m_center_width = xineinfo[0].width;
+ m_center_height = xineinfo[0].height;
XFree(xineinfo);
}
else
{
- monitor->center_width = monitor->monitor_width;
- monitor->center_height = monitor->monitor_height;
+ m_center_width = m_dimensions.w;
+ m_center_height = m_dimensions.h;
}
}
else
@@ -213,7 +215,7 @@ void sdl_monitor_info::refresh()
static int first_call=0;
static int cw = 0, ch = 0;
- SDL_VideoDriverName(monitor->monitor_device, sizeof(monitor->monitor_device)-1);
+ SDL_VideoDriverName(m_monitor_device, sizeof(m_monitor_device)-1);
if (first_call==0)
{
const char *dimstr = osd_getenv(SDLENV_DESKTOPDIM);
@@ -233,7 +235,7 @@ void sdl_monitor_info::refresh()
}
if ((cw==0) || (ch==0))
{
- osd_printf_warning("WARNING: SDL_GetVideoInfo() for driver <%s> is broken.\n", monitor->monitor_device);
+ osd_printf_warning("WARNING: SDL_GetVideoInfo() for driver <%s> is broken.\n", m_monitor_device);
osd_printf_warning(" You should set SDLMAME_DESKTOPDIM to your desktop size.\n");
osd_printf_warning(" e.g. export SDLMAME_DESKTOPDIM=800x600\n");
osd_printf_warning(" Assuming 1024x768 now!\n");
@@ -242,16 +244,17 @@ void sdl_monitor_info::refresh()
}
}
}
- monitor->monitor_width = cw;
- monitor->monitor_height = ch;
- monitor->center_width = cw;
- monitor->center_height = ch;
+ m_dimensions.w = cw;
+ m_dimensions.h = ch;
+ m_center_width = cw;
+ m_center_height = ch;
}
}
#elif defined(SDLMAME_OS2) // OS2 version
- monitor->center_width = monitor->monitor_width = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
- monitor->center_height = monitor->monitor_height = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
- strcpy(monitor->monitor_device, "OS/2 display");
+ m_dimensions.x = m_dimensions.y = 0;
+ m_center_width = m_dimensions.w = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
+ m_center_height = m_dimensions.h = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
+ strcpy(m_monitor_device, "OS/2 display");
#else
#error Unknown SDLMAME_xx OS type!
#endif
@@ -260,8 +263,8 @@ void sdl_monitor_info::refresh()
static int info_shown=0;
if (!info_shown)
{
- osd_printf_verbose("SDL Device Driver : %s\n", monitor->monitor_device);
- osd_printf_verbose("SDL Monitor Dimensions: %d x %d\n", monitor->monitor_width, monitor->monitor_height);
+ osd_printf_verbose("SDL Device Driver : %s\n", m_monitor_device);
+ osd_printf_verbose("SDL Monitor Dimensions: %d x %d\n", m_dimensions.w, m_dimensions.h);
info_shown = 1;
}
}
@@ -323,7 +326,7 @@ void sdl_osd_interface::update(bool skip_redraw)
//============================================================
#if !defined(SDLMAME_WIN32) && !(SDLMAME_SDL2)
-static void add_primary_monitor(void *data)
+void sdl_monitor_info::add_primary_monitor(void *data)
{
sdl_monitor_info ***tailptr = (sdl_monitor_info ***)data;
sdl_monitor_info *monitor;
@@ -332,19 +335,19 @@ static void add_primary_monitor(void *data)
monitor = global_alloc_clear(sdl_monitor_info);
// copy in the data
- monitor->handle = 1;
+ monitor->m_handle = 1;
- sdlvideo_monitor_refresh(monitor);
+ monitor->refresh();
// guess the aspect ratio assuming square pixels
- monitor->aspect = (float)(monitor->monitor_width) / (float)(monitor->monitor_height);
+ monitor->m_aspect = (float)(monitor->m_dimensions.w) / (float)(monitor->m_dimensions.h);
// save the primary monitor handle
primary_monitor = monitor;
// hook us into the list
**tailptr = monitor;
- *tailptr = &monitor->next;
+ *tailptr = &monitor->m_next;
}
#endif
@@ -367,34 +370,22 @@ static BOOL CALLBACK monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect,
assert(result);
(void)result; // to silence gcc 4.6
- // allocate a new monitor info
- monitor = global_alloc_clear(sdl_monitor_info);
-
- // copy in the data
+ // guess the aspect ratio assuming square pixels
+ float aspect = (float)(info.rcMonitor.right - info.rcMonitor.left) / (float)(info.rcMonitor.bottom - info.rcMonitor.top);
-#ifdef PTR64
- monitor->handle = (UINT64)handle;
-#else
- monitor->handle = (UINT32)handle;
-#endif
- monitor->monitor_width = info.rcMonitor.right - info.rcMonitor.left;
- monitor->monitor_height = info.rcMonitor.bottom - info.rcMonitor.top;
- monitor->center_width = monitor->monitor_width;
- monitor->center_height = monitor->monitor_height;
+ // allocate a new monitor info
char *temp = utf8_from_wstring(info.szDevice);
- strcpy(monitor->monitor_device, temp);
+ // copy in the data
+ monitor = global_alloc(sdl_monitor_info((UINT64) handle, temp, aspect));
osd_free(temp);
- // guess the aspect ratio assuming square pixels
- monitor->aspect = (float)(info.rcMonitor.right - info.rcMonitor.left) / (float)(info.rcMonitor.bottom - info.rcMonitor.top);
-
// save the primary monitor handle
if (info.dwFlags & MONITORINFOF_PRIMARY)
- primary_monitor = monitor;
+ sdl_monitor_info::primary_monitor = monitor;
// hook us into the list
**tailptr = monitor;
- *tailptr = &monitor->next;
+ *tailptr = &monitor->m_next;
// enumerate all the available monitors so to list their names in verbose mode
return TRUE;
@@ -449,7 +440,7 @@ void sdl_monitor_info::init()
// hook us into the list
*tailptr = monitor;
- tailptr = &monitor->next;
+ tailptr = &monitor->m_next;
}
}
osd_printf_verbose("Leave init_monitors\n");
@@ -466,7 +457,7 @@ void sdl_monitor_info::exit()
while (sdl_monitor_info::list != NULL)
{
sdl_monitor_info *temp = sdl_monitor_info::list;
- sdl_monitor_info::list = temp->next;
+ sdl_monitor_info::list = temp->next();
global_free(temp);
}
}
@@ -498,7 +489,7 @@ sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index
// look for a match in the name first
if (scrname != NULL)
{
- for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next)
+ for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next())
{
moncount++;
if (strcmp(scrname, monitor->device()) == 0)
@@ -508,7 +499,7 @@ sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index
// didn't find it; alternate monitors until we hit the jackpot
index %= moncount;
- for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next)
+ for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next())
if (index-- == 0)
goto finishit;
@@ -523,7 +514,7 @@ finishit:
return monitor;
}
#else
-static sdl_monitor_info *pick_monitor(sdl_options &options, int index)
+sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index)
{
sdl_monitor_info *monitor;
float aspect;
@@ -536,7 +527,7 @@ static sdl_monitor_info *pick_monitor(sdl_options &options, int index)
if (aspect != 0)
{
- monitor->aspect = aspect;
+ monitor->m_aspect = aspect;
}
return monitor;
}
diff --git a/src/osd/sdl/video.h b/src/osd/sdl/video.h
index 2e5cc4f0cce..a2ab10f7ebc 100644
--- a/src/osd/sdl/video.h
+++ b/src/osd/sdl/video.h
@@ -58,10 +58,22 @@ struct sdl_mode
int height;
};
+// FIXME: This is sort of ugly ... and should be a real interface only
class sdl_monitor_info
{
public:
- sdl_monitor_info * next; // pointer to next monitor in list
+
+ sdl_monitor_info()
+ : m_next(NULL), m_handle(0), m_aspect(0.0f),
+ m_center_width(0), m_center_height(0)
+ {}
+ sdl_monitor_info(const UINT64 handle, const char *monitor_device, float aspect)
+ : m_next(NULL), m_handle(handle), m_aspect(aspect),
+ m_center_width(0), m_center_height(0)
+ {
+ strncpy(m_monitor_device, monitor_device, 64);
+ refresh();
+ }
const UINT64 handle() { return m_handle; }
const SDL_Rect &position_size() { refresh(); return m_dimensions; }
@@ -69,6 +81,7 @@ public:
const char *device() { return m_monitor_device; }
float aspect();
+
int center_width() { refresh(); return m_center_width; }
int center_height() { refresh(); return m_center_height; }
@@ -78,7 +91,18 @@ public:
static void init();
static void exit();
static sdl_monitor_info *pick_monitor(sdl_options &options, int index);
+#if !defined(SDLMAME_WIN32) && !(SDLMAME_SDL2)
+ static void add_primary_monitor(void *data);
+#endif
+ sdl_monitor_info * next() { return m_next; } // pointer to next monitor in list
+
+ // STATIC
+ static sdl_monitor_info *primary_monitor;
+ static sdl_monitor_info *list;
+
+ // FIXME: shouldn't be here - see windows enumeration callback
+ sdl_monitor_info * m_next; // pointer to next monitor in list
private:
void refresh();
@@ -89,9 +113,6 @@ private:
int m_center_width; // width of first physical screen for centering
int m_center_height; // height of first physical screen for centering
- // STATIC
- static sdl_monitor_info *primary_monitor;
- static sdl_monitor_info *list;
};