diff options
Diffstat (limited to 'src/mame/drivers/upscope.c')
-rw-r--r-- | src/mame/drivers/upscope.c | 395 |
1 files changed, 395 insertions, 0 deletions
diff --git a/src/mame/drivers/upscope.c b/src/mame/drivers/upscope.c new file mode 100644 index 00000000000..7d78151ef07 --- /dev/null +++ b/src/mame/drivers/upscope.c @@ -0,0 +1,395 @@ +/********************************************************************************** + + Up Scope + + Driver by Mariusz Wojcieszek + +*********************************************************************************** + + Up Scope + Grand Products 1986 + + rom board +--------------+ + amiga I/O board + u4 u3 u2 u1 + u6 u5 Amiga 500 7404 7400 + 74374 6116 8255 TIP120 TIP120 + u12 u11 u10 u9 battery TIP120 TIP120 TIP120 TIP120 + u14 u13 TIP120 TIP120 TIP120 TIP120 + + + + +---------------+ + +**********************************************************************************/ + +#include "driver.h" +#include "includes/amiga.h" + + + +/************************************* + * + * Debugging + * + *************************************/ + +#define LOG_IO 0 + + + +/************************************* + * + * Globals + * + *************************************/ + +static UINT8 prev_cia1_porta; +static UINT8 parallel_data; +static UINT8 nvram_address_latch; +static UINT8 nvram_data_latch; + + + +/************************************* + * + * Reset state + * + *************************************/ + +static void upscope_reset(void) +{ + prev_cia1_porta = 0xff; +} + + + +/************************************* + * + * CIA-A port A access: + * + * PA7 = game port 1, pin 6 (fire) + * PA6 = game port 0, pin 6 (fire) + * PA5 = /RDY (disk ready) + * PA4 = /TK0 (disk track 00) + * PA3 = /WPRO (disk write protect) + * PA2 = /CHNG (disk change) + * PA1 = /LED (LED, 0=bright / audio filter control) + * PA0 = OVL (ROM/RAM overlay bit) + * + *************************************/ + +static void upscope_cia_0_porta_w(UINT8 data) +{ + /* switch banks as appropriate */ + memory_set_bank(1, data & 1); + + /* swap the write handlers between ROM and bank 1 based on the bit */ + if ((data & 1) == 0) + /* overlay disabled, map RAM on 0x000000 */ + memory_install_write16_handler(0, ADDRESS_SPACE_PROGRAM, 0x000000, 0x07ffff, 0, 0, MWA16_BANK1); + + else + /* overlay enabled, map Amiga system ROM on 0x000000 */ + memory_install_write16_handler(0, ADDRESS_SPACE_PROGRAM, 0x000000, 0x07ffff, 0, 0, MWA16_ROM); +} + + + +/************************************* + * + * CIA-A port B access: + * + * PB7 = parallel data 7 + * PB6 = parallel data 6 + * PB5 = parallel data 5 + * PB4 = parallel data 4 + * PB3 = parallel data 3 + * PB2 = parallel data 2 + * PB1 = parallel data 1 + * PB0 = parallel data 0 + * + *************************************/ + +static void upscope_cia_0_portb_w(UINT8 data) +{ + parallel_data = data; +} + +static UINT8 upscope_cia_0_portb_r(void) +{ + return nvram_data_latch; +} + + + +/************************************* + * + * CIA-B port A access: + * + * PA7 = com line /DTR + * PA6 = com line /RTS + * PA5 = com line /carrier detect + * PA4 = com line /CTS + * PA3 = com line /DSR + * PA2 = SEL (Centronics parellel control) + * PA1 = POUT (Centronics parellel control) + * PA0 = BUSY (Centronics parellel control) + * + *************************************/ + +static UINT8 upscope_cia_1_porta_r(void) +{ + return 0xf8 | (prev_cia1_porta & 0x07); +} + +static void upscope_cia_1_porta_w(UINT8 data) +{ + /* on a low transition of POUT, we latch stuff for the NVRAM */ + if ((prev_cia1_porta & 2) && !(data & 2)) + { + /* if SEL == 1 && BUSY == 0, we latch an address */ + if ((data & 5) == 4) + { + if (LOG_IO) logerror("Latch address: %02X\n", parallel_data); + nvram_address_latch = parallel_data; + } + + /* if SEL == 1 && BUSY == 1, we write data to internal registers */ + else if ((data & 5) == 5) + { + switch (nvram_address_latch) + { + case 0x01: + /* lamps: + 01 = Enemy Right + 02 = Enemy Left + 04 = Torpedo 1 + 08 = Torpedo 2 + 10 = Torpedo 3 + 20 = Torpedo 4 + 40 = Sight + 80 = Bubble Light + */ + break; + + case 0x02: + /* coin counter */ + coin_counter_w(0, data & 1); + break; + + case 0x03: + /* Written $98 at startup and nothing afterwards */ + break; + + default: + logerror("Internal register (%d) = %02X\n", nvram_address_latch, parallel_data); + break; + } + } + + /* if SEL == 0 && BUSY == 1, we write data to NVRAM */ + else if ((data & 5) == 1) + { + if (LOG_IO) logerror("NVRAM data write @ %02X = %02X\n", nvram_address_latch, parallel_data); + generic_nvram[nvram_address_latch] = parallel_data; + } + + /* if SEL == 0 && BUSY == 0, who knows? */ + else + { + logerror("Unexpected: POUT low with SEL == 0/BUSY == 0\n"); + } + } + + /* on a low transition of BUSY, we latch stuff for reading */ + else if ((prev_cia1_porta & 1) && !(data & 1)) + { + /* if SEL == 1, we read internal data registers */ + if (data & 4) + { + if (LOG_IO) logerror("Internal register (%d) read\n", nvram_address_latch); + nvram_data_latch = (nvram_address_latch == 0) ? readinputportbytag("IO0") : 0xff; + } + + /* if SEL == 0, we read NVRAM */ + else + { + nvram_data_latch = generic_nvram[nvram_address_latch]; + if (LOG_IO) logerror("NVRAM data read @ %02X = %02X\n", nvram_address_latch, nvram_data_latch); + } + } + + /* remember the previous value */ + prev_cia1_porta = data; +} + + + +/************************************* + * + * Memory map + * + *************************************/ + +static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 ) + ADDRESS_MAP_FLAGS( AMEF_UNMAP(1) ) + AM_RANGE(0x000000, 0x07ffff) AM_RAMBANK(1) AM_BASE(&amiga_chip_ram) AM_SIZE(&amiga_chip_ram_size) + AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w) + AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_BASE(&amiga_custom_regs) + AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w) + AM_RANGE(0xfc0000, 0xffffff) AM_ROM AM_REGION(REGION_USER1, 0) /* System ROM */ + + AM_RANGE(0xf00000, 0xf7ffff) AM_ROM AM_REGION(REGION_USER2, 0) +ADDRESS_MAP_END + + + +/************************************* + * + * Input ports + * + *************************************/ + +static INPUT_PORTS_START( upscope ) + PORT_START_TAG("POT1DAT") + PORT_BIT( 0xff, 0x80, IPT_PADDLE) PORT_SENSITIVITY(25) PORT_MINMAX(0x02,0xfe) PORT_KEYDELTA(5) PORT_CENTERDELTA(0) PORT_REVERSE + + PORT_START_TAG("IO0") + PORT_SERVICE( 0x01, IP_ACTIVE_LOW ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) +INPUT_PORTS_END + + + +/************************************* + * + * Sound definitions + * + *************************************/ + +static struct CustomSound_interface amiga_custom_interface = +{ + amiga_sh_start +}; + + + +/************************************* + * + * Machine driver + * + *************************************/ + +static MACHINE_DRIVER_START( upscope ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M68000, AMIGA_68000_NTSC_CLOCK) + MDRV_CPU_PROGRAM_MAP(main_map,0) + MDRV_CPU_VBLANK_INT(amiga_scanline_callback, 262) + + MDRV_SCREEN_REFRESH_RATE(59.997) + MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + + MDRV_MACHINE_RESET(amiga) + MDRV_NVRAM_HANDLER(generic_0fill) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_UPDATE_BEFORE_VBLANK) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(512*2, 262) + MDRV_SCREEN_VISIBLE_AREA((129-8)*2, (449+8-1)*2, 44-8, 244+8-1) + MDRV_PALETTE_LENGTH(4096) + MDRV_PALETTE_INIT(amiga) + + MDRV_VIDEO_START(amiga) + MDRV_VIDEO_UPDATE(generic_bitmapped) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(CUSTOM, 3579545) + MDRV_SOUND_CONFIG(amiga_custom_interface) + MDRV_SOUND_ROUTE(0, "right", 0.50) + MDRV_SOUND_ROUTE(1, "left", 0.50) + MDRV_SOUND_ROUTE(2, "left", 0.50) + MDRV_SOUND_ROUTE(3, "right", 0.50) +MACHINE_DRIVER_END + + + +/************************************* + * + * ROM definitions + * + *************************************/ + +ROM_START( upscope ) + ROM_REGION(0x80000, REGION_USER1, 0) + ROM_LOAD16_WORD_SWAP( "kick12.rom", 0x000000, 0x40000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88) ) + ROM_COPY( REGION_USER1, 0x000000, 0x040000, 0x040000 ) + + ROM_REGION(0x080000, REGION_USER2, 0) + ROM_LOAD16_BYTE( "upscope.u5", 0x000000, 0x008000, CRC(c109912e) SHA1(dcac9522e3c4818b2a02212b9173540fcf4bd463) ) + ROM_LOAD16_BYTE( "upscope.u13", 0x000001, 0x008000, CRC(9c8b071a) SHA1(69f9f8c17630ed568975e65dadc03213677a12dd) ) + ROM_LOAD16_BYTE( "upscope.u6", 0x010000, 0x008000, CRC(962f371e) SHA1(5682c62f34df2cc70f6125cf14203087670571db) ) + ROM_LOAD16_BYTE( "upscope.u14", 0x010001, 0x008000, CRC(1231bfc1) SHA1(f99adfabb01c1a15130f82f6a09d5458109a28bb) ) + + ROM_LOAD16_BYTE( "upscope.u1", 0x040000, 0x008000, CRC(7a8de1fb) SHA1(30b87f07e0e0f66699402dffaeb0ca00c554f23e) ) + ROM_LOAD16_BYTE( "upscope.u9", 0x040001, 0x008000, CRC(5d16521e) SHA1(93e0a1644bd8adbb6f9fca6d4a252c11812c6ada) ) + ROM_LOAD16_BYTE( "upscope.u2", 0x050000, 0x008000, CRC(2089ef6b) SHA1(a12d87c8b368ffbadb556aca2e43e50348d34839) ) + ROM_LOAD16_BYTE( "upscope.u10", 0x050001, 0x008000, CRC(fbab44f5) SHA1(cd49f1f79e2181b3a9c40aebfba9d7c314dc909b) ) + + ROM_LOAD16_BYTE( "upscope.u3", 0x060000, 0x008000, CRC(9b325528) SHA1(5bde1a42b62dd810843349ee9edf76e1c7521653) ) + ROM_LOAD16_BYTE( "upscope.u11", 0x060001, 0x008000, CRC(40e54449) SHA1(7d6ed97b87d74d80776cb682c78cd3b4a68633f4) ) + ROM_LOAD16_BYTE( "upscope.u4", 0x070000, 0x008000, CRC(6585ef1d) SHA1(b95e5e424266a50d4b63501278eb5d618fde5ba2) ) + ROM_LOAD16_BYTE( "upscope.u12", 0x070001, 0x008000, CRC(a909e388) SHA1(62acc30ab97d6a46a6d0782bb4ceb58061332724) ) +ROM_END + + + +/************************************* + * + * Driver init + * + *************************************/ + +static DRIVER_INIT( upscope ) +{ + static const amiga_machine_interface upscope_intf = + { + ANGUS_CHIP_RAM_MASK, + NULL, upscope_cia_0_portb_r, + upscope_cia_0_porta_w, upscope_cia_0_portb_w, + upscope_cia_1_porta_r, NULL, + upscope_cia_1_porta_w, NULL, + NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, upscope_reset, + NULL, + 0 + }; + amiga_machine_config(&upscope_intf); + + /* allocate NVRAM */ + generic_nvram_size = 0x100; + generic_nvram = auto_malloc(generic_nvram_size); + + /* set up memory */ + memory_configure_bank(1, 0, 1, amiga_chip_ram, 0); + memory_configure_bank(1, 1, 1, memory_region(REGION_USER1), 0); +} + + + +/************************************* + * + * Game drivers + * + *************************************/ + +GAME( 1986, upscope, 0, upscope, upscope, upscope, ORIENTATION_FLIP_X, "Grand Products", "Up Scope", GAME_IMPERFECT_SOUND ) |