diff options
Diffstat (limited to 'src/mame/drivers/ghosteo.c')
-rw-r--r-- | src/mame/drivers/ghosteo.c | 581 |
1 files changed, 581 insertions, 0 deletions
diff --git a/src/mame/drivers/ghosteo.c b/src/mame/drivers/ghosteo.c new file mode 100644 index 00000000000..9ffd36985f1 --- /dev/null +++ b/src/mame/drivers/ghosteo.c @@ -0,0 +1,581 @@ +/************************************************************************ + +Eolith Ghost Hardware driver + +1. CPU +- 16/32bit RISC Microprocessor(ARM920T CPU core) +- Separate 16KB Instruction and 16KB Data Cache +- Operating Frequency : Up to 203MHz + +2. MEMORY +- Main Memory : 32Mbytes(Maximum 128Mbytes) SDRAM +- NAND FLASH : 16M,32M, 64M, 128M, 256Mbytes + +3. VIDEO +- RGB (5:6:5) format +- Supports 1,2,4 or 8 bpp(bit-per-pixel) palette color displays +- Supports 16 bpp non-palette true-color displays +- Supports multiple screen size +Typical actual screen size : 320*240, 640*480 +Maximum virtual screen size is 4Mbytes +Maximum virtual screen size in 64K color mode : 2048*1024 +- Rendering Performance : 480 Objects per sec.(256*256 sprite) + +4. SOUND +Internal Audio Engine or External System Available +TDA1519(Philips)Stereo Power AMP +- Internal Audio Engine : 1-ch IIS-bus for audio interface +Serial, 8-/16-bit per channel data transfers +128 Bytes (64-Byte + 64-Byte) FIFO for Tx/Rx +- External System(Option) : General MIDI Chipset QDSP1000 +MIDI 16th Channel(32 Poly) using as Effect +Effect EPROM : 512Kbyte or 1Mbyte +MIDI Background Music EPROM:512Kbyte + +5. Board Feature +- JAMMA Standard ( Application of PACK TYPE ) : 1P,2P ? Joystick (Up, Down, Left, Right), 4 Push Buttons, Start Button +- 1P,2P ? Coin, Coin Counter +- On Board Service Button, On Board Test Button +- Photo Gun : 1P, 2P Photo Gun (or Light Pen) (Option) +- ETC : Security System Available +Multi I/O Port Available +Coin Counter Available +Gun Shooting Effect Available (Option) +Hopper, Ticket Counter, Prize System (Option) + +6. Develoment +- On-chip ICEbreaker debug support with JTAG-based debugging solution +- MultiICE, OPENICE etc. +- Compiler : ADS, SDT + + +*/ + +#include "driver.h" +#include "cpu/arm7/arm7core.h" + +static UINT32 *system_memory; +static UINT32 *flash_regs; +static UINT32 *lcd_control; +static UINT32 *io_port; + +//static UINT32 fifoh[16]; +//static UINT32 fifol[12]; + +static struct lcd_config +{ + int screen_type; + int bpp_mode; + int lcd_bank; + int lcd_base_u; + int lcd_base_sel; + int line_val; + int hoz_val; + int off_size; + int page_width; +} lcd; + +static READ32_HANDLER( r1 ) +{ +// int pc = activecpu_get_pc(); +// if(pc != 0x9a0 && pc != 0x7b4) printf("r1 @ %X\n",pc); + + return 1; +} + +static READ32_HANDLER( r2 ) +{ +// int pc = activecpu_get_pc(); +// if(pc != 0xd64 && pc != 0xd3c ) printf("r2 @ %X\n",pc); + + return 2; +} + +static UINT32 flash_addr = 0; +static int flash_addr_step = 0; + +#define ADDR_STEP_CONFIG 4 + +static WRITE32_HANDLER( flash_reg_w ) +{ + static int old[3]; + + COMBINE_DATA(&flash_regs[offset]); + + + if(old[offset] != flash_regs[offset]) + { + old[offset] = flash_regs[offset]; + +// printf("reg %d) %02X\n",offset,old[offset] = flash_regs[offset]); +// logerror("reg %d) %02X\n",offset,old[offset] = flash_regs[offset]); + } + + switch(offset) + { + case 0: + + break; + case 1: + break; + case 2: + + switch(flash_addr_step) + { + case 0: flash_addr = data << 0; break; + case 1: flash_addr |= data << 8; break; + case 2: flash_addr |= data << 16; break; + case 3: flash_addr |= data << 24; break; + } + + if(flash_addr_step == (ADDR_STEP_CONFIG - 1)) + { + flash_addr <<=1; + } + + flash_addr_step = (flash_addr_step + 1) % ADDR_STEP_CONFIG; + + break; + } +} + +static READ32_HANDLER( flash_reg_r ) +{ + // always read back what it's written? + return flash_regs[offset]; +} + +static READ32_HANDLER( flash_r ) +{ + UINT8 *flash = (UINT8 *)memory_region(REGION_USER1); + UINT8 value = flash[flash_addr]; + flash_addr = (flash_addr + 1) % memory_region_length(REGION_USER1); + return value; +} + +static READ32_HANDLER( flash_ecc_r ) +{ + + //TODO + + return 0; +} + +static WRITE32_HANDLER( debug_w ) +{ +#if 1 + mame_printf_debug("%c",data & 0xff); //debug texts +#endif +} + +/* +a) cpu #0 (PC=000007D0): unmapped program memory dword read from 4E000014 & 000000FF +b) cpu #0 (PC=000007D8): unmapped program memory dword read from 4E000014 & 0000FF00 +c) cpu #0 (PC=000007E0): unmapped program memory dword read from 4E000014 & 00FF0000 +1) read flash @ 0812 +2) read flash @ 0813 +3) read flash @ 0814 +4) read flash @ 0815 +5) read flash @ 0816 +6) read flash @ 0817 + +a == 1 +b == 2 +c == 3 +6 == 0xff + +*/ + +// PC: 574 check -> jumps to execute code from ram + +/* +Power management: +Normal, Idle, Slow & Power-off +4-ch 16 bit PWM ( Pulse Width Modulation), & 1-ch 16-bit timer for OS +RTC : 32.768 KHz, alarm interrupt +GPIO :117 (multiplexed I/O) +3-ch UARTs +4 ch DMA Controllers +8-ch 10-bit A/D (Max. 500KSPS), including TSP Controller +TFT LCD/STN LCD Controller (16bit, 640?480 maximum) +16-bit Watch-dog Timer +1-ch IIC-Bus Interface +IIS-Bus Interface +Screen Size: up to 640 x 480 +2-ch SPI (Synchronous Serial I/O) +SD Host/MMC (Multi Media Card) Interface +USB Host/Device Interface +Debug & TEST +NAND Flash Controller (4KB internal buffer) +24-ch external interrupts Controller (Wake-up source 16-ch) +*/ + +static READ32_HANDLER( lcd_control_r ) +{ + switch(offset) + { + case 0x00/4: + { + int line_val = video_screen_get_vpos(0) & 0x3ff; + return (lcd_control[offset] & ~(0x3ff << 18)) | ((lcd.line_val - line_val) << 18); + } + + case 0x10/4: + { + //TODO: VSTATUS, HSTATUS + + static int VSTATUS = 0; + VSTATUS ^= 0x18000; + + return (lcd_control[offset] & ~0x18000) | VSTATUS; + } + + default: + { + return lcd_control[offset]; + } + } +} + +static WRITE32_HANDLER( lcd_control_w ) +{ + COMBINE_DATA(&lcd_control[offset]); + + switch(offset) + { + case 0x00/4: + { + int line_val = video_screen_get_vpos(0) & 0x3ff; + int bpp_mode = (lcd_control[offset] & 0x1e) >> 1; + int screen_type = (lcd_control[offset] & 0x60) >> 5; + + lcd.screen_type = screen_type; + lcd.bpp_mode = bpp_mode; + + if(bpp_mode != 12) + printf("bpp mode= %d\n",bpp_mode); + + lcd_control[offset] = (lcd_control[offset] & ~(0x3ff << 18)) | ((lcd.line_val - line_val) << 18); + + break; + } + + case 0x04/4: + { + int line_val = (lcd_control[offset] >> 14) & 0x3ff; + + lcd.line_val = line_val; + + break; + } + + case 0x08/4: + { + int hoz_val = (lcd_control[offset] >> 8) & 0x3ff; + + lcd.hoz_val = hoz_val; + + break; + } + + case 0x10/4: + { + /* + int frm565 = (lcd_control[offset] >> 11) & 1; + int inv_vd = (lcd_control[offset] >> 7) & 1; + int bs_swp = (lcd_control[offset] >> 1) & 1; + int hw_swp = (lcd_control[offset] >> 0) & 1; + */ + + break; + } + + case 0x14/4: + { + int lcd_bank = (lcd_control[offset] >> 21) & 0x1ff; + int lcd_base_u = (lcd_control[offset] >> 0) & 0x1fffff; + + lcd.lcd_bank = lcd_bank; + lcd.lcd_base_u = lcd_base_u; + + break; + } + + case 0x18/4: + { + int lcd_base_sel = (lcd_control[offset] >> 0) & 0x1fffff; + + lcd.lcd_base_sel = lcd_base_sel; + + break; + } + + case 0x1c/4: + { + int off_size = (lcd_control[offset] >> 11) & 0x7ff; + int page_width = (lcd_control[offset] >> 0) & 0x7ff; + + lcd.off_size = off_size; + lcd.page_width = page_width; + + break; + } + } +} + + +static READ32_HANDLER( io_port_r ) +{ + switch(offset) + { + case 0x64/4: + { + static int input = 0; + input ^= 0x20; + + // bits from 15-0 can be configured as input/output/... + //return input; + + return (io_port[offset] & ~0x20) | input; + } + + default: + { + return io_port[offset]; + } + } +} + +static WRITE32_HANDLER( io_port_w ) +{ + COMBINE_DATA(&io_port[offset]); +} + + +static ADDRESS_MAP_START( bballoon_map, ADDRESS_SPACE_PROGRAM, 32 ) + AM_RANGE(0x00000000, 0x00000fff) AM_ROM AM_REGION(REGION_USER1, 0) + AM_RANGE(0x30000000, 0x31ffffff) AM_RAM AM_BASE(&system_memory) + AM_RANGE(0x40000000, 0x40000fff) AM_ROM AM_REGION(REGION_USER1, 0) // mirror? seems so + AM_RANGE(0x48000000, 0x48000033) AM_RAM // memory controller + + AM_RANGE(0x4d000000, 0x4d00001f) AM_READWRITE(lcd_control_r,lcd_control_w) AM_BASE(&lcd_control) + + AM_RANGE(0x4e000000, 0x4e00000b) AM_READWRITE(flash_reg_r, flash_reg_w) AM_BASE(&flash_regs) + AM_RANGE(0x4e00000c, 0x4e00000f) AM_READ(flash_r) + AM_RANGE(0x4e000010, 0x4e000013) AM_READ(r1) + AM_RANGE(0x4e000014, 0x4e000017) AM_READ(flash_ecc_r) + + AM_RANGE(0x50000010, 0x50000013) AM_READ(r2) + + AM_RANGE(0x50000020, 0x50000023) AM_WRITE(debug_w) + //AM_RANGE(0x51000040, 0x51000043) AM_READ() // a timer... + + AM_RANGE(0x56000000, 0x56000093) AM_READWRITE(io_port_r, io_port_w) AM_BASE(&io_port) + +ADDRESS_MAP_END + +static INPUT_PORTS_START( bballoon ) +INPUT_PORTS_END + +static int irq_en = 0; + +static VIDEO_START( bballoon ) +{ + +} +static int b=0; +static VIDEO_UPDATE( bballoon ) +{ + if(input_code_pressed_once(KEYCODE_Q)) + { + irq_en ^= 1; + printf("en = %d\n",irq_en); + } + + if(input_code_pressed_once(KEYCODE_W)) + { + + printf("b = %d\n",++b); + } + + if(input_code_pressed_once(KEYCODE_E)) + { + + printf("b = %d\n",--b); + } + + if(lcd_control[0] & 1) + { + // output enabled + + //bballoon setup + //TFT 16bpp + //5:6:5 format + //normal + //bs swap disabled + //hw swap enabled + + int start_addr = (lcd.lcd_bank << 22) - 0x30000000; + + if(start_addr > 0x1ffffff) + printf("max = %X\n",start_addr); + else + { + //printf("addr = %X\n",start_addr + lcd.lcd_base_u); + + UINT32* videoram = system_memory + start_addr/4 + lcd.lcd_base_u/4 + 0x10000*b; + int x,y,count; + + // probably wrong... + + count = 0; + for (y=0;y <= cliprect->max_y;y++) + { + for (x=0;x <= cliprect->max_x/2;x+=2) + { + UINT32 color; + UINT32 b; + UINT32 g; + UINT32 r; + + color = (videoram[count] >> 16) & 0xffff; + + b = (color & 0x001f) << 3; + g = (color & 0x07e0) >> 2; + r = (color & 0xf800) >> 6; + + *BITMAP_ADDR32(bitmap, y, x*2+0) = b | (g<<8) | (r<<16); + + color = videoram[count] & 0xffff; + + b = (color & 0x001f) << 3; + g = (color & 0x07e0) >> 2; + r = (color & 0xf800) >> 6; + + *BITMAP_ADDR32(bitmap, y, x*2+1) = b | (g<<8) | (r<<16); + + count++; + } + } + + + } + + } + else + { + // output disabled + } + + return 0; +} + +static INTERRUPT_GEN( bballoon_interrupt ) +{ + if(irq_en) + cpunum_set_input_line(0, ARM7_IRQ_LINE, PULSE_LINE); + //cpunum_set_input_line(0, ARM7_FIRQ_LINE, PULSE_LINE); + + irq_en = 0; +} + +static MACHINE_DRIVER_START( bballoon ) + + /* basic machine hardware */ + MDRV_CPU_ADD(ARM7, 24000000) + MDRV_CPU_PROGRAM_MAP(bballoon_map,0) + MDRV_CPU_VBLANK_INT(bballoon_interrupt,1) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) + + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB15) + MDRV_SCREEN_SIZE(1024, 1024) + MDRV_SCREEN_VISIBLE_AREA(0, 319, 0, 239) + MDRV_PALETTE_LENGTH(256) + + MDRV_VIDEO_START(bballoon) + MDRV_VIDEO_UPDATE(bballoon) + + /* sound hardware */ +MACHINE_DRIVER_END + +/* +Balloon & Balloon +Eolith, 2003 + +PCB Layout +---------- + +GHOST Ver1.1 2003.03.28 +|---------------------------------------------| +|TDA1519A B2.U20 LED RESET | +| QS1000 | +|DA1311A 24MHz LED| +| | +| | +| |---------| | +| QS1001A.U17 |ARM 312 | | +|J |SAMSUNG | | +|A B1.U16 |S3C2410 | IC42S16800 | +|M | | | +|M |---------| | +|A | +| IC42S16800 | +| 12MHz | +| M24CL16-S | +| | +| | +| * FLASH.U1| +| SERVICE | +|DSW1 TEST | +|---------------------------------------------| +Notes: + * - Unknown SOIC20 chip, surface scratched + FLASH.U1 - Samsung K9F5608U0B 256MBit NAND FlashROM (TSOP48) + U16 - 27C801 8MBit EPROM + U20 - 29F040 EEPROM + IC42S16800 - ISSI IC42S16800 4(2)M x 8(16) Bits x 4 Banks (128MBit) SDRAM +*/ + +ROM_START( bballoon ) + ROM_REGION( 0x2000000, REGION_USER1, 0 ) /* ARM 32 bit code */ + ROM_LOAD( "flash.u1", 0x000000, 0x2000000, CRC(73285634) SHA1(4d0210c1bebdf3113a99978ffbcd77d6ee854168) ) + + // banked every 0x10000 bytes ? + ROM_REGION( 0x080000, REGION_USER2, 0 ) + ROM_LOAD( "b2.u20", 0x000000, 0x080000, CRC(0a12334c) SHA1(535b5b34f28435517218100d70147d87809f485a) ) + + ROM_REGION( 0x100000, REGION_SOUND2, 0 ) // sound wave + ROM_LOAD( "b1.u16", 0x000000, 0x100000, CRC(c42c1c85) SHA1(e1f49d556ffd6bc27142a7784c3bb8e37999857d) ) +ROM_END + +static DRIVER_INIT( bballoon ) +{ + UINT8 *flash = (UINT8 *)memory_region(REGION_USER1); + + // nop flash ECC checks + + flash[0x844+0] = 0x00; + flash[0x844+1] = 0x00; + flash[0x844+2] = 0xA0; + flash[0x844+3] = 0xE1; + + flash[0x850+0] = 0x00; + flash[0x850+1] = 0x00; + flash[0x850+2] = 0xA0; + flash[0x850+3] = 0xE1; + + flash[0x860+0] = 0x00; + flash[0x860+1] = 0x00; + flash[0x860+2] = 0xA0; + flash[0x860+3] = 0xE1; + + flash[0x86c+0] = 0x00; + flash[0x86c+1] = 0x00; + flash[0x86c+2] = 0xA0; + flash[0x86c+3] = 0xE1; +} + +GAME( 2003, bballoon, 0, bballoon, bballoon, bballoon, ROT0, "Eolith", "Balloon & Balloon", GAME_NO_SOUND | GAME_NOT_WORKING ) |