diff options
Diffstat (limited to 'src/mame/drivers/gunpey.cpp')
-rw-r--r-- | src/mame/drivers/gunpey.cpp | 1255 |
1 files changed, 0 insertions, 1255 deletions
diff --git a/src/mame/drivers/gunpey.cpp b/src/mame/drivers/gunpey.cpp deleted file mode 100644 index e3fa57afd90..00000000000 --- a/src/mame/drivers/gunpey.cpp +++ /dev/null @@ -1,1255 +0,0 @@ -// license:LGPL-2.1+ -// copyright-holders:Angelo Salese, Tomasz Slanina, David Haywood, Luca Elia, Morten Shearman Kirkegaard -/******************************************************************************************** - - Gunpey (c) 2000 Banpresto - - TODO: - - Framebuffer is actually in the same DRAM as the blitter data gets copied to, not a - separate RAM. It (and the double buffered copy) appear near the top right of the - framebuffer, so there are likely registers to control this that need finding. - - Other sprite modes supported by the video chip (not used here?) - - Check zooming precision against hardware - - Cleanup (still a lot of debug code in here) - -============================================================================================= -ASM code study: -0x84718 main code -0x8472c call 0x81f34 reading of dip-switches - 0x5e62: -0x84731 call 0x81f5c move dip-switches settings to work RAM -0x84736 call 0x80ae4 writes to i/os 0x7fc0-0x7fff: - 0x7fc0: 0x00 - 0x7fc1: 0x00 - 0x7fc2: 0x40 - 0x7fc3: 0x03 - 0x7fc4: 0x72 - 0x7fc5: 0x72 - 0x7fc6: 0x90 - 0x7fc7: 0x01 - 0x7fc8: 0x55 irq mask? - (note: skips irq ack) - 0x7fca: 0x00 - 0x7fcb: 0x00 - 0x7fcc: 0x00 - 0x7fcd: 0x00 - 0x7fce: 0x00 - 0x7fcf: 0x07 - 0x7fd0: 0x00 - 0x7fd1: 0x00 - 0x7fd2: 0x00 - 0x7fd3: 0x8c - 0x7fd4-0x7fde: 0x00 - (skips 0x7fdf) - 0x7fe0: 0x40 - 0x7fe1: 0x02 - 0x7fe2: 0x00 - 0x7fe3: 0x00 - 0x7fe4: 0x60 - 0x7fe5: 0x07 - 0x7fe6: 0x88 - 0x7fe7: 0x07 - 0x7fe8: 0x9f - 0x7fe9: 0x08 - 0x7fea: 0x77 - 0x7feb: 0x08 - (here the code writes 16-bit words, read from 0x500e ...) - 0x7fec: 0x00 - 0x7fed: 0x84 - (read from 0x5012) - 0x7fee: 0x00 - 0x7fef: 0x88 - (returns to byte filling) - 0x7ff0: 0x84 - 0x7ff1: 0x00 - 0x7ff2: 0x00 - 0x7ff3: 0x01 - 0x7ff4: 0x00 - 0x7ff5: 0x00 - 0x7ff6: 0xc7 - 0x7ff7: 0x56 - 0x7ff8: 0x3f - 0x7ff9: 0x48 - 0x7ffa: 0x9a - 0x7ffb: 0x22 - 0x7ffc: 0x0e - 0x7ffd: 0x43 - 0x7ffe: 0xf0 - 0x7fff: 0x15 - Then, it fills the following work RAMs (with 0 except where noted): - 0x5e36, 0x5e38, 0x5e44, 0x5e46 (4), 0x5e48, 0x5e4a, 0x5e40, 0x5e42, 0x5b68 (0x9c8), 0x5b6a (0x9c8), 0x59c4 (1) -0x8473b: call 0x81415 - reads [0x500e] -> [0xf0bc] - reads [0x5010] -> [0xf0be] - (does it twice, shrug -.-") - reads 0xf0bc / 0xf0be - AW = 0xb3c9, CW = 0x10 - 0x81447: call 0xb3aa0 - moves RAM from 0xb3c90-0xb3c9f to RAM 0x400-0x40f - writes 0x800 to [0xf0b8] writes 0 to [0xf0ba] - loops while writing to [0xf0b8] [0xf0ba] for 0x200 times, filling a table at [0x800][0x27f0] with a 1 - writes 0x800 to [0xf0b8] writes 0 to [0xf0ba] again - reads the [0xf0b8][0xf0ba] - 0x81484: call 0xb3aa0 - moves RAM from 0xb3ca0-0xb3caf to RAM 0x800-0x80f - writes 0x2800 to [0xf0b8] writes 0 to [0xf0ba] - loops while writing to [0xf0b8] [0xf0ba] for 0x200 times, filling a table at [0x2800][0x47f0] with a 1 - 0x81484: call 0xb3aa0 - moves RAM from 0xb3ca0-0xb3caf to RAM 0x2800-0x280f -0x84740: call 0x821cd - fills 0x5c88-0x5c9a with this pattern (byte writes): - [+0x00] 0x00 - [+0x02] 0x00 - [+0x08] 0x00 - [+0x04] 0x00 - [+0x0c] 0x00 - [+0x0e] 0x0c - [+0x06] 0x00 - [+0x10] 0x00 - [+0x12] 0x0c - does the same with 0x5c89-0x5c9b -0x84745: call 0x82026 - checks if 0x5e62 is 0 (bit 6 of 0x5c80, i/o 0x7f41) - ... -0x8474a: call 0xa7f53 sound init -... - - - -============================================================================================= - -Gunpey -Banpresto, 2000 - -The hardware looks very Raizing/8ing -ish, especially the ROM stickers and PCB silk-screening -which are identical to those on Brave Blade and Battle Bakraid ;-) - -PCB Layout ----------- - -VG-10 -|-------------------------------------| -| M6295 ROM5 | -| YMZ280B-F ROM4 ROM3 | -| YAC516 16.93MHz | -| 61256 ROM1 | -| 61256 ROM2 | -|J | -|A PAL XILINX | -|M XC95108 | -|M 57.2424MHz | -|A V30 | -| | -| |-------| | -| |AXELL | | -| DSW1 |AG-1 | | -| DSW2 |AX51101| T2316162 | -| |-------| T2316162 | -|-------------------------------------| - -Notes: - V30 clock: 14.3106MHz (= 57.2424 / 4) - YMZ280B clock: 16.93MHz - OKI M6295 clock: 2.11625MHz (= 16.93 / 8), sample rate = clock / 165 - VSync: 60Hz - HSync: 15.79kHz - - ROMs: - GP_ROM1.021 \ - GP_ROM2.022 / 27C040, Main program - - GP_ROM3.025 \ - GP_ROM4.525 / SOP44 32M MASK, Graphics - - GP_ROM5.622 SOP44 32M MASK, OKI samples - - -AX51101 gfx chip: - -Axell Corporation is a Japanese company that specialises in Sound and Graphics (Amusement Graphics) LSI. -The AG-1 is a sprite system controller meant for the amusement industry, such as pachi-slot machines, -it has reached end-of-life in about 2005. -These are the specifications of the Axell AG-1 AX51102A, it should be very similar to the AX51101. -(excuse the strange grammar, it is a JP->EN translation) - -Drawing technique: Sprite system -Buffer drawing method: Double frame buffer -Configuration of the character: Configured from 2 or more cells, a cell can be set in units of each dot a horizontal, vertical from 1 to 256 dots -Maximum character size: 4096 x 4096 dot -Display the number of sprite: Up to 127 sheets (register 2KB) -Maximum drawing speed: Dot sec / 2500-35000000 highest -Color depth: 32,768 colors (5 bits for each RGB) -Color scheme: Cell character unit can be specified in 256 colors of palettes, and 16 colors -Scaling: 256 times the resolution of 1/64 to 4 cell character unit -Semi-transparent processing: Gradation in the unit cell or 32 character -Intensity modulation: Gradation in the unit cell or 32 character -Other Features: Rotation, DMA, BitBLT, Built-in flip -Display resolution: 100 to 600 dots horizontal, 120 to 800 dots vertical -Virtual screen size: Up to 4096 x 4096 dot -CGRAM space: 4M-bit minimum, 32M-bit maximum -Operating frequency: Up to 76MHz -Release: November 1999 - -********************************************************************************************/ - -#include "emu.h" -#include "cpu/nec/nec.h" -#include "machine/timer.h" -#include "sound/okim6295.h" -#include "sound/ymz280b.h" -#include "emupal.h" -#include "screen.h" -#include "speaker.h" - -namespace { - -struct state_s -{ - unsigned char *buf; - unsigned char bits; - int num_bits; - unsigned char colour[16]; - int basex; - int ix, iy, iw; - int dx, dy; - int ow, oh; - int ox, oy; - - void set_o(unsigned char v); - unsigned char get_o(int x, int y) const; - - static void hn_bytes_new_colour(state_s &s, unsigned char v, int n); - static void hn_bytes_prev_colour(state_s &s, unsigned char v, int n); - static void hn_copy_directly(state_s &s, unsigned char v, int n); - static void hn_copy_plus_one(state_s &s, unsigned char v, int n); - static void hn_copy_minus_one(state_s &s, unsigned char v, int n); -}; - - -struct huffman_node_s -{ - const char *bits; - void (*func)(state_s &, unsigned char, int); - int arg0_bits; - int arg1_val; -}; - - -class gunpey_state : public driver_device -{ -public: - gunpey_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_oki(*this, "oki") - , m_wram(*this, "wram") - , m_palette(*this, "palette") - , m_blit_rom(*this, "blit_data") - { } - - void gunpey(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void video_start() override; - -private: - void io_map(address_map &map); - void mem_map(address_map &map); - - void status_w(offs_t offset, uint8_t data); - uint8_t status_r(offs_t offset); - uint8_t inputs_r(offs_t offset); - void blitter_w(offs_t offset, uint8_t data); - void blitter_upper_w(offs_t offset, uint8_t data); - void blitter_upper2_w(offs_t offset, uint8_t data); - void output_w(uint8_t data); - void vram_bank_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void vregs_addr_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_DEVICE_CALLBACK_MEMBER(scanline); - TIMER_CALLBACK_MEMBER(blitter_end); - - void irq_check(uint8_t irq_type); - uint8_t draw_gfx(bitmap_ind16 &bitmap, const rectangle &cliprect, int count, uint8_t scene_gradient); - uint16_t m_vram_bank; - uint16_t m_vreg_addr; - - emu_timer *m_blitter_end_timer; - - // work variables for the decompression - int m_srcx; - int m_srcxbase; - int m_scrxcount; - int m_srcy; - int m_srcycount; - int m_ysize; - int m_xsize; - int m_dstx; - int m_dsty; - int m_dstxbase; - int m_dstxcount; - int m_dstycount; - uint16_t m_blit_ram[0x10]; - - uint8_t get_vrom_byte(int x, int y); - int write_dest_byte(uint8_t usedata); - int decompress_sprite(unsigned char *buf, int ix, int iy, int ow, int oh, int dx, int dy); - int next_node(const huffman_node_s **res, state_s *s); - int get_next_bit(state_s *s); - - uint8_t m_irq_cause, m_irq_mask; - std::unique_ptr<uint16_t[]> m_blit_buffer; - std::unique_ptr<uint8_t[]> m_vram; - - required_device<cpu_device> m_maincpu; - required_device<okim6295_device> m_oki; - required_shared_ptr<uint16_t> m_wram; - required_device<palette_device> m_palette; - required_region_ptr<uint8_t> m_blit_rom; -}; - - -void gunpey_state::machine_start() -{ - m_irq_cause = 0; - m_irq_mask = 0; -} - -void gunpey_state::video_start() -{ - // assumes it can make an address mask from m_blit_rom.length() - 1 - assert(!(m_blit_rom.length() & (m_blit_rom.length() - 1))); - - m_blit_buffer = std::make_unique<uint16_t[]>(512*512); - m_vram = std::make_unique<uint8_t[]>(0x400000); - std::fill_n(&m_vram[0], 0x400000, 0xff); - m_blitter_end_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gunpey_state::blitter_end), this)); - save_pointer(NAME(m_vram), 0x400000); -} - -uint8_t gunpey_state::draw_gfx(bitmap_ind16 &bitmap,const rectangle &cliprect,int count,uint8_t scene_gradient) -{ - const int ZOOM_SHIFT = 15; - // there doesn't seem to be a specific bit to mark compressed sprites (we currently have a hack to look at the first byte of the data) - // do they get decompressed at blit time instead? of are there other registers we need to look at - - // +0 +1 +2 +3 +4 +5 +6 +7 - // cccc cccc e--b b--- | xxxx x--- u--t tttt | yyyy yy-- --XX XXXX | nnnn nnnn ---Y YYYY | mmmm mmmm -MMM -NNN | hhhh hhhh wwww wwww | ---- ---- oooo oooo | pppp pppp ---- ---- | - - // c = color palette - // e = END marker - // b = bpp select - // x = LSB x source - // X = MSB x source - // y = LSB y source - // Y = MSB y source - // n = LSB X DRAW position - // N = MSB X DRAW position - // m = LSB Y DRAW position - // M = MSB Y DRAW position - // h = height - // w = width - // u = unknown, set on text, maybe 'solid' ? - // o = zoom width - // p = zoom height - // t = transparency / alpha related? (0x10 on player cursor, 0xf when swapping, other values at other times..) - const int debug = 0; - - if(!(m_wram[count+0] & 1)) - { - int x = (m_wram[count+3] >> 8) | ((m_wram[count+4] & 0x03) << 8); - int y = (m_wram[count+4] >> 8) | ((m_wram[count+4] & 0x30) << 4); - uint32_t zoomheight = (m_wram[count+5] >> 8); - uint32_t zoomwidth = (m_wram[count+5] & 0xff); - int bpp_sel = (m_wram[count+0] & 0x18); - int color = (m_wram[count+0] >> 8); - - x-=0x160; - y-=0x188; - - uint32_t sourcewidth = (m_wram[count+6] & 0xff)<<ZOOM_SHIFT; - uint32_t sourceheight = (m_wram[count+7] >> 8)<<ZOOM_SHIFT; - int xsource = ((m_wram[count+2] & 0x003f) << 5) | ((m_wram[count+1] & 0xf800) >> 11); - int ysource = ((m_wram[count+3] & 0x001f) << 6) | ((m_wram[count+2] & 0xfc00) >> 10); - - int alpha = m_wram[count+1] & 0x1f; - - uint32_t widthstep = 1<<ZOOM_SHIFT; - uint32_t heightstep = 1<<ZOOM_SHIFT; - - if (zoomwidth) widthstep = sourcewidth / zoomwidth; - if (zoomheight) heightstep = sourceheight / zoomheight; - - uint16_t unused; - if (debug) logerror("sprite %04x %04x %04x %04x %04x %04x %04x %04x\n", m_wram[count+0], m_wram[count+1], m_wram[count+2], m_wram[count+3], m_wram[count+4], m_wram[count+5], m_wram[count+6], m_wram[count+7]); - - unused = m_wram[count+0]&~0xff98; if (unused) logerror("unused bits set in word 0 - %04x\n", unused); - unused = m_wram[count+1]&~0xf89f; if (unused) logerror("unused bits set in word 1 - %04x\n", unused); - unused = m_wram[count+2]&~0xfc3f; if (unused) logerror("unused bits set in word 2 - %04x\n", unused); - unused = m_wram[count+3]&~0xff1f; if (unused) logerror("unused bits set in word 3 - %04x\n", unused); - unused = m_wram[count+4]&~0xff77; if (unused) logerror("unused bits set in word 4 - %04x\n", unused); - unused = m_wram[count+5]&~0xffff; if (unused) logerror("unused bits set in word 5 - %04x\n", unused); - unused = m_wram[count+6]&~0x00ff; if (unused) logerror("unused bits set in word 6 - %04x\n", unused); - unused = m_wram[count+7]&~0xff00; if (unused) logerror("unused bits set in word 7 - %04x\n", unused); - - if (((zoomwidth<<ZOOM_SHIFT) != sourcewidth) || ((zoomheight<<ZOOM_SHIFT) != sourceheight)) - { - // logerror("sw %08x zw %08x sh %08x zh %08x heightstep %08x widthstep %08x \n", sourcewidth, zoomwidth<<ZOOM_SHIFT, sourceheight, zoomheight<<ZOOM_SHIFT, heightstep, widthstep ); - } - - if(bpp_sel == 0x00) // 4bpp - { - int ysourceoff = 0; - for(int yi=0;yi<zoomheight;yi++) - { - int yi2 = ysourceoff>>ZOOM_SHIFT; - int xsourceoff = 0; - - for(int xi=0;xi<zoomwidth;xi++) - { - int xi2 = xsourceoff>>ZOOM_SHIFT; - uint8_t data = m_vram[((((ysource + yi2) & 0x7ff) * 0x800) + ((xsource + (xi2/2)) & 0x7ff))]; - uint8_t pix; - - if (xi2 & 1) - { - pix = (data & 0xf0)>>4; - } - else - { - pix = (data & 0x0f); - } - - uint32_t col_offs = ((pix + color*0x10) & 0xff) << 1; - col_offs+= ((pix + color*0x10) >> 8)*0x800; - uint16_t color_data = (m_vram[col_offs])|(m_vram[col_offs+1]<<8); - - if(!(color_data & 0x8000)) - { - if(scene_gradient & 0x40) - { - int r = (color_data & 0x7c00) >> 10; - int g = (color_data & 0x03e0) >> 5; - int b = (color_data & 0x001f) >> 0; - r-= (scene_gradient & 0x1f); - g-= (scene_gradient & 0x1f); - b-= (scene_gradient & 0x1f); - if(r < 0) r = 0; - if(g < 0) g = 0; - if(b < 0) b = 0; - - color_data = (color_data & 0x8000) | (r << 10) | (g << 5) | (b << 0); - } - - if(cliprect.contains(x+xi, y+yi)) - { - if (alpha==0x00) // a value of 0x00 is solid - { - bitmap.pix(y+yi, x+xi) = color_data & 0x7fff; - } - else - { - uint16_t basecolor = bitmap.pix(y+yi, x+xi); - int base_r = ((basecolor >> 10)&0x1f)*alpha; - int base_g = ((basecolor >> 5)&0x1f)*alpha; - int base_b = ((basecolor >> 0)&0x1f)*alpha; - int r = ((color_data & 0x7c00) >> 10)*(0x1f-alpha); - int g = ((color_data & 0x03e0) >> 5)*(0x1f-alpha); - int b = ((color_data & 0x001f) >> 0)*(0x1f-alpha); - r = (base_r+r)/0x1f; - g = (base_g+g)/0x1f; - b = (base_b+b)/0x1f; - color_data = (color_data & 0x8000) | (r << 10) | (g << 5) | (b << 0); - bitmap.pix(y+yi, x+xi) = color_data & 0x7fff; - } - } - } - xsourceoff += widthstep; - } - ysourceoff += heightstep; - } - } - else if(bpp_sel == 0x08) // 6bpp - { - // not used by Gunpey? - logerror("6bpp\n"); - } - else if(bpp_sel == 0x10) // 8bpp - { - int ysourceoff = 0; - for(int yi=0;yi<zoomheight;yi++) - { - int yi2 = ysourceoff>>ZOOM_SHIFT; - int xsourceoff = 0; - - for(int xi=0;xi<zoomwidth;xi++) - { - int xi2 = xsourceoff>>ZOOM_SHIFT; - - uint8_t data = m_vram[((((ysource+yi2)&0x7ff)*0x800) + ((xsource+xi2)&0x7ff))]; - - uint8_t pix = (data & 0xff); - uint32_t col_offs = ((pix + color*0x100) & 0xff) << 1; - col_offs+= ((pix + color*0x100) >> 8)*0x800; - uint16_t color_data = (m_vram[col_offs])|(m_vram[col_offs+1]<<8); - - if(!(color_data & 0x8000)) - { - if(scene_gradient & 0x40) - { - int r = (color_data & 0x7c00) >> 10; - int g = (color_data & 0x03e0) >> 5; - int b = (color_data & 0x001f) >> 0; - r-= (scene_gradient & 0x1f); - g-= (scene_gradient & 0x1f); - b-= (scene_gradient & 0x1f); - if(r < 0) r = 0; - if(g < 0) g = 0; - if(b < 0) b = 0; - - color_data = (color_data & 0x8000) | (r << 10) | (g << 5) | (b << 0); - } - - if(cliprect.contains(x+xi,y+yi)) - { - if (alpha==0x00) // a value of 0x00 is solid - { - bitmap.pix(y+yi, x+xi) = color_data & 0x7fff; - } - else - { - uint16_t basecolor = bitmap.pix(y+yi, x+xi); - int base_r = ((basecolor >> 10)&0x1f)*alpha; - int base_g = ((basecolor >> 5)&0x1f)*alpha; - int base_b = ((basecolor >> 0)&0x1f)*alpha; - int r = ((color_data & 0x7c00) >> 10)*(0x1f-alpha); - int g = ((color_data & 0x03e0) >> 5)*(0x1f-alpha); - int b = ((color_data & 0x001f) >> 0)*(0x1f-alpha); - r = (base_r+r)/0x1f; - g = (base_g+g)/0x1f; - b = (base_b+b)/0x1f; - color_data = (color_data & 0x8000) | (r << 10) | (g << 5) | (b << 0); - bitmap.pix(y+yi, x+xi) = color_data & 0x7fff; - } - } - } - xsourceoff += widthstep; - } - ysourceoff += heightstep; - } - } - else if(bpp_sel == 0x18) // RGB32k - { - // not used by Gunpey? - logerror("32k\n"); - // ... - } - } - - return m_wram[count+0] & 0x80; -} - -uint32_t gunpey_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - //uint16_t *blit_buffer = m_blit_buffer; - uint16_t vram_bank = m_vram_bank & 0x7fff; - uint16_t vreg_addr = m_vreg_addr & 0x7fff; - uint8_t end_mark; - int count; - int scene_index; - - bitmap.fill(m_palette->pen(0), cliprect); //black pen - - if((!(m_vreg_addr & 0x8000)) || (!(m_vram_bank & 0x8000))) - return 0; - - for(scene_index = vreg_addr/2;scene_index<(vreg_addr+0x400)/2;scene_index+=0x10/2) - { - uint16_t start_offs; - uint16_t end_offs; - uint8_t scene_end_mark; - uint8_t scene_enabled; - uint8_t scene_gradient; - - start_offs = (vram_bank+(m_wram[scene_index+5] << 8))/2; - end_offs = (vram_bank+(m_wram[scene_index+5] << 8)+0x1000)/2; //safety check - scene_end_mark = m_wram[scene_index+0] & 0x80; - scene_enabled = m_wram[scene_index+0] & 0x01; - scene_gradient = m_wram[scene_index+1] & 0xff; - -// logerror("%08x: %08x %08x %08x %08x | %08x %08x %08x %08x\n",scene_index,m_wram[scene_index+0],m_wram[scene_index+1],m_wram[scene_index+2],m_wram[scene_index+3], -// m_wram[scene_index+4],m_wram[scene_index+5],m_wram[scene_index+6],m_wram[scene_index+7]); - - if(scene_enabled) - { - for(count = start_offs;count<end_offs;count+=0x10/2) - { - end_mark = draw_gfx(bitmap,cliprect,count,scene_gradient); - - if(end_mark == 0x80) - break; - } - } - - if(scene_end_mark == 0x80) - break; - } - - return 0; -} - -void gunpey_state::irq_check(uint8_t irq_type) -{ - m_irq_cause |= irq_type; - - if(m_irq_cause & m_irq_mask) - m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0x200/4); // V30 - else - m_maincpu->set_input_line_and_vector(0, CLEAR_LINE, 0x200/4); // V30 -} - -void gunpey_state::status_w(offs_t offset, uint8_t data) -{ - if(offset == 1) - { - m_irq_cause &= ~data; - irq_check(0); - } - - if(offset == 0) - { - m_irq_mask = data; - irq_check(0); - } -} - -uint8_t gunpey_state::status_r(offs_t offset) -{ - if(offset == 1) - return m_irq_cause; - - return m_irq_mask; -} - -uint8_t gunpey_state::inputs_r(offs_t offset) -{ - switch(offset+0x7f40) - { - case 0x7f40: return ioport("DSW1")->read(); - case 0x7f41: return ioport("DSW2")->read(); - case 0x7f42: return ioport("P1")->read(); - case 0x7f43: return ioport("P2")->read(); - case 0x7f44: return ioport("SYSTEM")->read(); - } - - return 0xff; -} - -TIMER_CALLBACK_MEMBER(gunpey_state::blitter_end) -{ - irq_check(4); -} - - -int gunpey_state::write_dest_byte(uint8_t usedata) -{ - // write the byte we and to destination and increase our counters - m_vram[(((m_dsty)&0x7ff)*0x800)+((m_dstx)&0x7ff)] = usedata; - - // increase destination counter and check if we've filled our destination rectangle - m_dstx++; m_dstxcount++; - if (m_dstxcount==m_xsize) - { - m_dstxcount = 0; - m_dstx = m_dstxbase; - m_dsty++; m_dstycount++; - if (m_dstycount==m_ysize) - { - return -1; - } - } - - return 1; -} - - -inline uint8_t gunpey_state::get_vrom_byte(int x, int y) -{ - return m_blit_rom[((x)+2048 * (y)) & (m_blit_rom.length() - 1)]; -} - -inline int gunpey_state::get_next_bit(state_s *s) -{ - if (s->num_bits == 0) - { - if (s->ix >= s->basex + s->iw) - { - s->ix = s->basex; - s->iy++; - } - s->bits = get_vrom_byte(s->ix, s->iy); - s->ix++; - s->num_bits = 8; - } - - int res = 1 & s->bits; - - s->bits >>= 1; - s->num_bits--; - - return res; -} - - -void state_s::set_o(unsigned char v) -{ - assert(ox >= 0); - assert(ox < ow); - assert(ox < 256); - assert(oy >= 0); - assert(oy < oh); - assert(oy < 256); - - unsigned char a = v; - for (int i = 0; i < std::size(colour); i++) - { - unsigned char b = colour[i]; - colour[i] = a; - a = b; - if (a == v) - break; - } - - buf[((dx + ox++) & 0x7ff) + (((dy + oy) & 0x7ff) * 0x800)] = v; -} - - -unsigned char state_s::get_o(int x, int y) const -{ - assert(x >= 0); - assert(x < ow); - assert(x < 256); - assert(y >= 0); - assert(y < oh); - assert(y < 256); - - return buf[((dx + x) & 0x7ff) + (((dy + y) & 0x7ff) * 0x800)]; -} - - -void state_s::hn_bytes_new_colour(state_s &s, unsigned char v, int n) -{ - for (int i = 0; i < n; i++) - s.set_o(v); -} - - -void state_s::hn_bytes_prev_colour(state_s &s, unsigned char v, int n) -{ - int c = s.colour[v]; - - for (int i = 0; i < n; i++) - s.set_o(c); -} - - -void state_s::hn_copy_directly(state_s &s, unsigned char v, int n) -{ - for (int i = 0; i < n; i++) - { - if ((s.ox / 12) & 1) - s.set_o(s.get_o(s.ox, s.oy + 1)); - else - s.set_o(s.get_o(s.ox, s.oy - 1)); - } -} - - - -void state_s::hn_copy_plus_one(state_s &s, unsigned char v, int n) -{ - for (int i = 0; i < n; i++) - { - if ((s.ox / 12) & 1) - s.set_o(s.get_o(s.ox + 1, s.oy + 1)); - else - s.set_o(s.get_o(s.ox + 1, s.oy - 1)); - } -} - - -void state_s::hn_copy_minus_one(state_s &s, unsigned char v, int n) -{ - for (int i = 0; i < n; i++) - { - if ((s.ox / 12) & 1) - s.set_o(s.get_o(s.ox - 1, s.oy + 1)); - else - s.set_o(s.get_o(s.ox - 1, s.oy - 1)); - } -} - - -static const huffman_node_s hn[] = { - { "11", state_s::hn_bytes_new_colour, 8, 1 }, - { "10111", state_s::hn_bytes_new_colour, 8, 2 }, - { "10110011", state_s::hn_bytes_new_colour, 8, 3 }, - { "1010011000", state_s::hn_bytes_new_colour, 8, 4 }, - { "1010101010000", state_s::hn_bytes_new_colour, 8, 5 }, - { "101010001011110", state_s::hn_bytes_new_colour, 8, 6 }, - { "101010010101110", state_s::hn_bytes_new_colour, 8, 7 }, - { "101010010101111", state_s::hn_bytes_new_colour, 8, 8 }, - { "101010010101100", state_s::hn_bytes_new_colour, 8, 9 }, - { "10101000101100", state_s::hn_bytes_new_colour, 8, 10 }, - { "101010010101101", state_s::hn_bytes_new_colour, 8, 11 }, - { "10101000101101", state_s::hn_bytes_new_colour, 8, 12 }, - { "0", state_s::hn_bytes_prev_colour, 4, 1 }, - { "100", state_s::hn_bytes_prev_colour, 4, 2 }, - { "101011", state_s::hn_bytes_prev_colour, 4, 3 }, - { "1010010", state_s::hn_bytes_prev_colour, 4, 4 }, - { "101010100", state_s::hn_bytes_prev_colour, 4, 5 }, - { "1010100100", state_s::hn_bytes_prev_colour, 4, 6 }, - { "10101010110", state_s::hn_bytes_prev_colour, 4, 7 }, - { "10100111000", state_s::hn_bytes_prev_colour, 4, 8 }, - { "101010101001", state_s::hn_bytes_prev_colour, 4, 9 }, - { "101001111000", state_s::hn_bytes_prev_colour, 4, 10 }, - { "101010010100", state_s::hn_bytes_prev_colour, 4, 11 }, - { "1010011001", state_s::hn_bytes_prev_colour, 4, 12 }, - { "101101", state_s::hn_copy_directly, 0, 2 }, - { "10101011", state_s::hn_copy_directly, 0, 3 }, - { "101010011", state_s::hn_copy_directly, 0, 4 }, - { "101001101", state_s::hn_copy_directly, 0, 5 }, - { "1010011111", state_s::hn_copy_directly, 0, 6 }, - { "1010100011", state_s::hn_copy_directly, 0, 7 }, - { "10101000100", state_s::hn_copy_directly, 0, 8 }, - { "101010101111", state_s::hn_copy_directly, 0, 9 }, - { "101001110010", state_s::hn_copy_directly, 0, 10 }, - { "1010011100111", state_s::hn_copy_directly, 0, 11 }, - { "101100101", state_s::hn_copy_directly, 0, 12 }, - { "1011000", state_s::hn_copy_plus_one, 0, 2 }, - { "101010000", state_s::hn_copy_plus_one, 0, 3 }, - { "10101001011", state_s::hn_copy_plus_one, 0, 4 }, - { "101010001010", state_s::hn_copy_plus_one, 0, 5 }, - { "1010101011101", state_s::hn_copy_plus_one, 0, 6 }, - { "1010101011100", state_s::hn_copy_plus_one, 0, 7 }, - { "1010011110010", state_s::hn_copy_plus_one, 0, 8 }, - { "10101000101110", state_s::hn_copy_plus_one, 0, 9 }, - { "101010001011111", state_s::hn_copy_plus_one, 0, 10 }, - { "1010011110011", state_s::hn_copy_plus_one, 0, 11 }, - { "101000", state_s::hn_copy_minus_one, 0, 2 }, - { "101100100", state_s::hn_copy_minus_one, 0, 3 }, - { "1010011101", state_s::hn_copy_minus_one, 0, 4 }, - { "10101010101", state_s::hn_copy_minus_one, 0, 5 }, - { "101001111011", state_s::hn_copy_minus_one, 0, 6 }, - { "101001111010", state_s::hn_copy_minus_one, 0, 7 }, - { "1010101010001", state_s::hn_copy_minus_one, 0, 8 }, - { "1010011100110", state_s::hn_copy_minus_one, 0, 9 }, - { "10101001010101", state_s::hn_copy_minus_one, 0, 10 }, - { "10101001010100", state_s::hn_copy_minus_one, 0, 11 }, - { nullptr, nullptr, 0, 0 }, -}; - - -int gunpey_state::next_node(const huffman_node_s **res, state_s *s) -{ - char bits[128]; - - memset(bits, 0, sizeof(bits)); - - for (int i = 0; i < sizeof(bits) - 1; i++) - { - bits[i] = '0' + get_next_bit(s); - - for (int j = 0;; j++) - { - if (!hn[j].bits) return -1; - - if (strncmp(bits, hn[j].bits, i + 1) == 0) - { - if (!hn[j].bits[i + 1]) - { - *res = &hn[j]; - return 0; - } - break; - } - } - } - - return -1; -} - -int gunpey_state::decompress_sprite(unsigned char *buf, int ix, int iy, int ow, int oh, int dx, int dy) -{ - const huffman_node_s *n; - state_s s; - unsigned char v; - int eol; - - s.buf = buf; - s.num_bits = 0; - - memset(s.colour, 0, sizeof(s.colour)); - - s.basex = ix; - - s.ix = ix; - s.iy = iy; - s.iw = get_vrom_byte(s.ix++, s.iy) + 1; - s.dx = dx; - s.dy = dy; - - s.ow = ow; - s.oh = oh; - s.ox = 0; - s.oy = 0; - - int temp; - temp = get_next_bit(&s); - temp |= get_next_bit(&s) << 1; - temp |= get_next_bit(&s) << 2; - assert(temp == 0); - - while (s.ox < s.ow) - { - if (next_node(&n, &s)) - return -1; - - v = 0; - for (int i = 0; i < n->arg0_bits; i++) - { - v |= get_next_bit(&s) << i; - } - - n->func(s, v, n->arg1_val); - - if ((s.ox % 12) == 0) - { - s.ox -= 12; - if ((s.ox / 12) & 1) - { - s.oy -= 1; - } - else - { - s.oy += 1; - } - eol = 1; - - } - else if (s.ox == s.ow) - { - s.ox -= s.ow % 12; - if ((s.ox / 12) & 1) - { - s.oy -= 1; - } - else - { - s.oy += 1; - } - eol = 1; - - } - else - { - eol = 0; - } - - if (eol) - { - if ((s.oy == s.oh) || (s.oy == -1)) - { - s.ox += 12; - if ((s.ox / 12) & 1) - { - s.oy -= 1; - } - else - { - s.oy += 1; - } - } - } - } - - return 0; -} - -void gunpey_state::blitter_w(offs_t offset, uint8_t data) -{ - uint16_t *blit_ram = m_blit_ram; - - //logerror("gunpey_blitter_w offset %01x data %02x\n", offset,data); - - blit_ram[offset] = data; - - if(offset == 0 && data == 2) // blitter trigger, 0->1 transition - { - m_srcx = blit_ram[0x04]|(blit_ram[0x05]<<8); - m_srcy = blit_ram[0x06]|(blit_ram[0x07]<<8); - m_dstx = blit_ram[0x08]|(blit_ram[0x09]<<8); - m_dsty = blit_ram[0x0a]|(blit_ram[0x0b]<<8); - m_xsize = blit_ram[0x0c]+1; - m_ysize = blit_ram[0x0e]+1; - int compression = blit_ram[0x01]; - - m_dstx<<=1; - m_xsize<<=1; - - if(compression) - { - if(compression == 8) - { - if (decompress_sprite(m_vram.get(), m_srcx, m_srcy, m_xsize, m_ysize, m_dstx, m_dsty)) - { - logerror("[-] Failed to decompress sprite at %04x %04x\n", m_srcx, m_srcy); - } - } - else - logerror("unknown compression mode %02x\n",compression); - } - else - { - m_dstxbase = m_dstx; - m_dstxcount = 0; - m_dstycount = 0; - m_srcxbase = m_srcx; - m_scrxcount = 0; - m_srcycount = 0; - - for (;;) - { - uint8_t usedata = m_blit_rom[(((m_srcy)&0x7ff)*0x800)+((m_srcx)&0x7ff)]; - m_srcx++; m_scrxcount++; - if (m_scrxcount==m_xsize) - { - m_scrxcount = 0; - m_srcx = m_srcxbase; - m_srcy++; m_srcycount++; - } - - if ((write_dest_byte(usedata))==-1) - break; - } - } - - m_blitter_end_timer->adjust(m_maincpu->cycles_to_attotime(m_xsize*m_ysize)); - } -} - -void gunpey_state::blitter_upper_w(offs_t offset, uint8_t data) -{ - //logerror("gunpey_blitter_upper_w %02x %02x\n", offset, data); - -} - -void gunpey_state::blitter_upper2_w(offs_t offset, uint8_t data) -{ - //logerror("gunpey_blitter_upper2_w %02x %02x\n", offset, data); - -} - - -void gunpey_state::output_w(uint8_t data) -{ - //bit 0 is coin counter -// popmessage("%02x",data); - - m_oki->set_rom_bank((data & 0x70) >> 4); -} - -void gunpey_state::vram_bank_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_vram_bank); -} - -void gunpey_state::vregs_addr_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_vreg_addr); -} - -/***************************************************************************************/ - -void gunpey_state::mem_map(address_map &map) -{ - map(0x00000, 0x0ffff).ram().share("wram"); -// map(0x50000, 0x500ff).ram(); -// map(0x50100, 0x502ff).noprw(); - map(0x80000, 0xfffff).rom(); -} - -void gunpey_state::io_map(address_map &map) -{ - map(0x7f40, 0x7f45).r(FUNC(gunpey_state::inputs_r)); - - map(0x7f48, 0x7f48).w(FUNC(gunpey_state::output_w)); - map(0x7f80, 0x7f81).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)); - - map(0x7f88, 0x7f88).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - - map(0x7fc8, 0x7fc9).rw(FUNC(gunpey_state::status_r), FUNC(gunpey_state::status_w)); - map(0x7fd0, 0x7fdf).w(FUNC(gunpey_state::blitter_w)); - map(0x7fe0, 0x7fe5).w(FUNC(gunpey_state::blitter_upper_w)); - map(0x7ff0, 0x7ff5).w(FUNC(gunpey_state::blitter_upper2_w)); - - //map(0x7ff0, 0x7ff1).ram(); - map(0x7fec, 0x7fed).w(FUNC(gunpey_state::vregs_addr_w)); - map(0x7fee, 0x7fef).w(FUNC(gunpey_state::vram_bank_w)); - -} - - -/***************************************************************************************/ - -static INPUT_PORTS_START( gunpey ) - PORT_START("DSW1") // IN0 - 7f40 - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:1,2") - PORT_DIPSETTING( 0x01, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x03, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x0c, 0x00, "Difficulty (vs. mode)" ) PORT_DIPLOCATION("SW1:3,4") - PORT_DIPSETTING( 0x04, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x0c, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x30, 0x00, "Matches (vs. mode)?" ) PORT_DIPLOCATION("SW1:5,6") - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x10, "2" ) - PORT_DIPSETTING( 0x20, "3" ) - PORT_DIPSETTING( 0x30, "5" ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:8") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80, DEF_STR( On ) ) - - PORT_START("DSW2") // IN1 - 7f41 - PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW2:1,2,3") - PORT_DIPSETTING( 0x07, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x06, DEF_STR( 3C_2C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) - PORT_DIPNAME( 0x38, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW2:4,5,6") - PORT_DIPSETTING( 0x38, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x28, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x18, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x30, DEF_STR( 3C_2C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x20, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x10, DEF_STR( 1C_3C ) ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW2:7") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:8") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80, DEF_STR( On ) ) - - PORT_START("P1") // IN2 - 7f42 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - - PORT_START("P2") // IN3 - 7f43 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - - PORT_START("SYSTEM") // IN4 - 7f44 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_SERVICE( 0x04, IP_ACTIVE_HIGH ) // TEST!! - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) -INPUT_PORTS_END - -/***************************************************************************************/ - -/*: -0x01 -0x04 blitter ready -0x10 vblank too? (otherwise you'll get various hangs/inputs stop to work) -0x40 almost certainly vblank (reads inputs) -0x80 -*/ -TIMER_DEVICE_CALLBACK_MEMBER(gunpey_state::scanline) -{ - int scanline = param; - - if(scanline == 240) - { - //logerror("frame\n"); - irq_check(0x50); - } -} - -/***************************************************************************************/ -void gunpey_state::gunpey(machine_config &config) -{ - /* basic machine hardware */ - V30(config, m_maincpu, 57242400 / 4); - m_maincpu->set_addrmap(AS_PROGRAM, &gunpey_state::mem_map); - m_maincpu->set_addrmap(AS_IO, &gunpey_state::io_map); - TIMER(config, "scantimer").configure_scanline(FUNC(gunpey_state::scanline), "screen", 0, 1); - - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(57242400/8, 442, 0, 320, 264, 0, 240); /* just to get ~60 Hz */ - screen.set_screen_update(FUNC(gunpey_state::screen_update)); - screen.set_palette(m_palette); - - PALETTE(config, m_palette, palette_device::RGB_555); - - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - - OKIM6295(config, m_oki, XTAL(16'934'400) / 8, okim6295_device::PIN7_LOW); - m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.125); - m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.125); - - ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400))); - ymz.add_route(0, "lspeaker", 0.25); - ymz.add_route(1, "rspeaker", 0.25); -} - -/***************************************************************************************/ - -ROM_START( gunpey ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* V30 code */ - ROM_LOAD16_BYTE( "gp_rom1.021", 0x00000, 0x80000, CRC(07a589a7) SHA1(06c4140ffd5f74b3d3ddfc424f43fcd08d903490) ) - ROM_LOAD16_BYTE( "gp_rom2.022", 0x00001, 0x80000, CRC(f66bc4cf) SHA1(54931d878d228c535b9e2bf22a0a3e41756f0fe5) ) - - ROM_REGION( 0x400000, "blit_data", 0 ) - ROM_LOAD( "gp_rom3.025", 0x00000, 0x400000, CRC(f2d1f9f0) SHA1(0d20301fd33892074508b9d127456eae80cc3a1c) ) - - ROM_REGION( 0x400000, "ymz", 0 ) - ROM_LOAD( "gp_rom4.525", 0x000000, 0x400000, CRC(78dd1521) SHA1(91d2046c60e3db348f29f776def02e3ef889f2c1) ) // 11xxxxxxxxxxxxxxxxxxxx = 0xFF - - ROM_REGION( 0x400000, "oki", 0 ) - ROM_LOAD( "gp_rom5.622", 0x000000, 0x400000, CRC(f79903e0) SHA1(4fd50b4138e64a48ec1504eb8cd172a229e0e965)) // 1xxxxxxxxxxxxxxxxxxxxx = 0xFF -ROM_END - -} // anonymous namespace - -GAME( 2000, gunpey, 0, gunpey, gunpey, gunpey_state, empty_init, ROT0, "Bandai / Banpresto", "Gunpey (Japan)", 0 ) |