trunk/src/mame/video/skyfox.c
| r32068 | r32069 | |
| 41 | 41 | |
| 42 | 42 | /*************************************************************************** |
| 43 | 43 | |
| 44 | | Memory Handlers |
| 45 | | |
| 46 | | ***************************************************************************/ |
| 47 | | |
| 48 | | #ifdef UNUSED_FUNCTION |
| 49 | | READ8_MEMBER(skyfox_state::skyfox_vregs_r)// for debug |
| 50 | | { |
| 51 | | return m_vreg[offset]; |
| 52 | | } |
| 53 | | #endif |
| 54 | | |
| 55 | | WRITE8_MEMBER(skyfox_state::skyfox_vregs_w) |
| 56 | | { |
| 57 | | m_vreg[offset] = data; |
| 58 | | |
| 59 | | switch (offset) |
| 60 | | { |
| 61 | | case 0: m_bg_ctrl = data; break; |
| 62 | | case 1: soundlatch_byte_w(space, 0, data); break; |
| 63 | | case 2: break; |
| 64 | | case 3: break; |
| 65 | | case 4: break; |
| 66 | | case 5: break; |
| 67 | | case 6: break; |
| 68 | | case 7: break; |
| 69 | | } |
| 70 | | } |
| 71 | | |
| 72 | | |
| 73 | | |
| 74 | | /*************************************************************************** |
| 75 | | |
| 76 | 44 | Convert the color PROMs into a more useable format. |
| 77 | 45 | |
| 78 | 46 | There are three 256x4 palette PROMs (one per gun). |
| r32068 | r32069 | |
| 89 | 57 | PALETTE_INIT_MEMBER(skyfox_state, skyfox) |
| 90 | 58 | { |
| 91 | 59 | const UINT8 *color_prom = memregion("proms")->base(); |
| 92 | | int i; |
| 93 | 60 | |
| 94 | | for (i = 0; i < 256; i++) |
| 61 | for (int i = 0; i < 256; i++) |
| 95 | 62 | { |
| 96 | 63 | int bit0, bit1, bit2, bit3, r, g, b; |
| 97 | 64 | |
| r32068 | r32069 | |
| 117 | 84 | palette.set_pen_color(i, rgb_t(r, g, b)); |
| 118 | 85 | } |
| 119 | 86 | |
| 120 | | /* Grey scale for the background??? */ |
| 121 | | for (i = 0; i < 256; i++) |
| 87 | /* Grey scale for the background??? is wrong */ |
| 88 | for (int i = 0; i < 256; i++) |
| 122 | 89 | { |
| 123 | 90 | palette.set_pen_color(i + 256, rgb_t(i, i, i)); |
| 124 | 91 | } |
| r32068 | r32069 | |
| 159 | 126 | |
| 160 | 127 | void skyfox_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 161 | 128 | { |
| 162 | | int offs; |
| 163 | | |
| 129 | gfx_element *gfx = m_gfxdecode->gfx(0); |
| 164 | 130 | int width = m_screen->width(); |
| 165 | 131 | int height = m_screen->height(); |
| 166 | 132 | |
| 167 | 133 | /* The 32x32 tiles in the 80-ff range are bankswitched */ |
| 168 | | int shift =(m_bg_ctrl & 0x80) ? (4 - 1) : 4; |
| 134 | int shift = (m_bg_ctrl & 0x80) ? (4 - 1) : 4; |
| 169 | 135 | |
| 170 | | for (offs = 0; offs < m_spriteram.bytes(); offs += 4) |
| 136 | for (int offs = 0; offs < m_spriteram.bytes(); offs += 4) |
| 171 | 137 | { |
| 172 | 138 | int xstart, ystart, xend, yend; |
| 173 | 139 | int xinc, yinc, dx, dy; |
| 174 | 140 | int low_code, high_code, n; |
| 175 | 141 | |
| 176 | | int y = m_spriteram[offs + 0]; |
| 177 | | int x = m_spriteram[offs + 1]; |
| 178 | | int code = m_spriteram[offs + 2] + m_spriteram[offs + 3] * 256; |
| 142 | int code = m_spriteram[offs + 3] << 8 | m_spriteram[offs + 2]; |
| 179 | 143 | int flipx = code & 0x2; |
| 180 | 144 | int flipy = code & 0x4; |
| 145 | int y = m_spriteram[offs + 0]; |
| 146 | int x = m_spriteram[offs + 1] << 1 | (code & 1); |
| 181 | 147 | |
| 182 | | x = x * 2 + (code & 1); // add the least significant bit |
| 183 | | |
| 184 | 148 | high_code = ((code >> 4) & 0x7f0) + ((code & 0x8000) >> shift); |
| 185 | 149 | |
| 186 | | switch( code & 0x88 ) |
| 150 | switch (code & 0x88) |
| 187 | 151 | { |
| 188 | | case 0x88: n = 4; low_code = 0; break; |
| 189 | | case 0x08: n = 2; low_code = ((code & 0x20) ? 8 : 0) + ((code & 0x10) ? 2 : 0); break; |
| 190 | | default: n = 1; low_code = (code >> 4) & 0xf; |
| 152 | case 0x88: n = 4; low_code = 0; break; |
| 153 | case 0x08: n = 2; low_code = (code & 0x20) >> 2 | (code & 0x10) >> 3; break; |
| 154 | default: n = 1; low_code = (code >> 4) & 0xf; break; |
| 191 | 155 | } |
| 192 | 156 | |
| 193 | | #define DRAW_SPRITE(DX,DY,CODE) \ |
| 194 | | m_gfxdecode->gfx(0)->transpen(bitmap,\ |
| 195 | | cliprect, \ |
| 196 | | (CODE), \ |
| 197 | | 0, \ |
| 198 | | flipx,flipy, \ |
| 199 | | x + (DX),y + (DY), 0xff); |
| 200 | | if (m_bg_ctrl & 1) // flipscreen |
| 157 | if (m_bg_ctrl & 1) // flipscreen |
| 201 | 158 | { |
| 202 | 159 | x = width - x - (n - 1) * 8; |
| 203 | 160 | y = height - y - (n - 1) * 8; |
| r32068 | r32069 | |
| 217 | 174 | for (dy = ystart; dy != yend; dy += yinc) |
| 218 | 175 | { |
| 219 | 176 | for (dx = xstart; dx != xend; dx += xinc) |
| 220 | | DRAW_SPRITE(dx * 8, dy * 8, code++); |
| 177 | { |
| 178 | gfx->transpen(bitmap, cliprect, code, 0, flipx, flipy, dx*8 + x, dy*8 + y, 0xff); |
| 179 | code++; |
| 180 | } |
| 221 | 181 | |
| 222 | | if (n == 2) code += 2; |
| 182 | if (n == 2) |
| 183 | code += 2; |
| 223 | 184 | } |
| 224 | 185 | } |
| 225 | 186 | } |
| 226 | 187 | |
| 227 | 188 | |
| 228 | 189 | |
| 229 | | |
| 230 | | |
| 231 | 190 | /*************************************************************************** |
| 232 | 191 | |
| 233 | 192 | Background Rendering |
| r32068 | r32069 | |
| 236 | 195 | |
| 237 | 196 | void skyfox_state::draw_background(bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 238 | 197 | { |
| 239 | | UINT8 *RAM = memregion("gfx2")->base(); |
| 240 | | int x, y, i; |
| 198 | UINT8 *rom = memregion("gfx2")->base(); |
| 241 | 199 | |
| 242 | 200 | /* The foreground stars (sprites) move at twice this speed when |
| 243 | | the bg scroll rate [e.g. (skyfox_bg_reg >> 1) & 7] is 4 */ |
| 201 | the bg scroll rate [e.g. (m_bg_ctrl >> 1) & 7] is 4 */ |
| 244 | 202 | int pos = (m_bg_pos >> 4) & (512 * 2 - 1); |
| 245 | 203 | |
| 246 | | for (i = 0 ; i < 0x1000; i++) |
| 204 | for (int i = 0; i < 0x1000; i++) |
| 247 | 205 | { |
| 248 | | int pen, offs, j; |
| 206 | int offs = (i * 2 + ((m_bg_ctrl >> 4) & 0x3) * 0x2000) % 0x8000; |
| 249 | 207 | |
| 250 | | offs = (i * 2 + ((m_bg_ctrl >> 4) & 0x3) * 0x2000) % 0x8000; |
| 208 | int pen = rom[offs]; |
| 209 | int x = rom[offs + 1] * 2 + (i & 1) + pos + ((i & 8) ? 512 : 0); |
| 210 | int y = ((i / 8) / 2) * 8 + (i % 8); |
| 251 | 211 | |
| 252 | | pen = RAM[offs]; |
| 253 | | x = RAM[offs + 1] * 2 + (i & 1) + pos + ((i & 8) ? 512 : 0); |
| 254 | | y = ((i / 8) / 2) * 8 + (i % 8); |
| 255 | | |
| 256 | | if (m_bg_ctrl & 1) // flipscreen |
| 212 | if (m_bg_ctrl & 1) // flipscreen |
| 257 | 213 | { |
| 258 | 214 | x = 512 * 2 - (x % (512 * 2)); |
| 259 | 215 | y = 256 - (y % 256); |
| 260 | 216 | } |
| 261 | 217 | |
| 262 | | for (j = 0 ; j <= ((pen & 0x80) ? 0 : 3); j++) |
| 263 | | bitmap.pix16( |
| 264 | | (((j / 2) & 1) + y) % 256, |
| 265 | | ((j & 1) + x) % 512) = 256 + (pen & 0x7f); |
| 218 | for (int j = 0; j <= ((pen & 0x80) ? 0 : 3); j++) |
| 219 | bitmap.pix16((((j / 2) & 1) + y) % 256, ((j & 1) + x) % 512) = 256 + (pen & 0x7f); |
| 266 | 220 | } |
| 267 | 221 | } |
| 268 | 222 | |
| 269 | 223 | |
| 270 | 224 | /*************************************************************************** |
| 271 | 225 | |
| 272 | | |
| 273 | 226 | Screen Drawing |
| 274 | 227 | |
| 275 | | |
| 276 | 228 | ***************************************************************************/ |
| 277 | 229 | |
| 278 | | |
| 279 | 230 | UINT32 skyfox_state::screen_update_skyfox(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 280 | 231 | { |
| 281 | 232 | bitmap.fill(255, cliprect); // the bg is black |
trunk/src/mame/drivers/skyfox.c
| r32068 | r32069 | |
| 16 | 16 | Verified Dip locations and recommended settings with manual |
| 17 | 17 | |
| 18 | 18 | ***************************************************************************/ |
| 19 | |
| 19 | 20 | #include "emu.h" |
| 20 | 21 | #include "cpu/z80/z80.h" |
| 21 | 22 | #include "sound/2203intf.h" |
| r32068 | r32069 | |
| 24 | 25 | |
| 25 | 26 | /*************************************************************************** |
| 26 | 27 | |
| 27 | | |
| 28 | 28 | Main CPU |
| 29 | 29 | |
| 30 | | |
| 31 | 30 | ***************************************************************************/ |
| 32 | 31 | |
| 32 | WRITE8_MEMBER(skyfox_state::skyfox_vregs_w) |
| 33 | { |
| 34 | switch (offset) |
| 35 | { |
| 36 | case 0: |
| 37 | m_bg_ctrl = data; |
| 38 | break; |
| 33 | 39 | |
| 34 | | /*************************************************************************** |
| 35 | | Sky Fox |
| 36 | | ***************************************************************************/ |
| 40 | case 1: |
| 41 | soundlatch_byte_w(space, 0, data); |
| 42 | break; |
| 37 | 43 | |
| 44 | default: |
| 45 | break; |
| 46 | } |
| 47 | } |
| 48 | |
| 38 | 49 | static ADDRESS_MAP_START( skyfox_map, AS_PROGRAM, 8, skyfox_state ) |
| 39 | | AM_RANGE(0x0000, 0xbfff) AM_ROM // ROM |
| 40 | | AM_RANGE(0xc000, 0xcfff) AM_RAM // RAM |
| 41 | | AM_RANGE(0xd000, 0xd3ff) AM_RAM AM_SHARE("spriteram") // Sprites |
| 42 | | AM_RANGE(0xd400, 0xdfff) AM_RAM // RAM? |
| 43 | | AM_RANGE(0xe000, 0xe000) AM_READ_PORT("INPUTS") // Input Ports |
| 44 | | AM_RANGE(0xe001, 0xe001) AM_READ_PORT("DSW0") // |
| 45 | | AM_RANGE(0xe002, 0xe002) AM_READ_PORT("DSW1") // |
| 46 | | AM_RANGE(0xe008, 0xe00f) AM_WRITE(skyfox_vregs_w) // Video Regs |
| 47 | | AM_RANGE(0xf001, 0xf001) AM_READ_PORT("DSW2") // |
| 48 | | // AM_RANGE(0xff00, 0xff07) AM_READ(skyfox_vregs_r) // fake to read the vregs |
| 50 | AM_RANGE(0x0000, 0xbfff) AM_ROM |
| 51 | AM_RANGE(0xc000, 0xcfff) AM_RAM |
| 52 | AM_RANGE(0xd000, 0xd3ff) AM_RAM AM_SHARE("spriteram") |
| 53 | AM_RANGE(0xd400, 0xdfff) AM_RAM // ? |
| 54 | AM_RANGE(0xe000, 0xe000) AM_READ_PORT("INPUTS") |
| 55 | AM_RANGE(0xe001, 0xe001) AM_READ_PORT("DSW0") |
| 56 | AM_RANGE(0xe002, 0xe002) AM_READ_PORT("DSW1") |
| 57 | AM_RANGE(0xe008, 0xe00f) AM_WRITE(skyfox_vregs_w) |
| 58 | AM_RANGE(0xf001, 0xf001) AM_READ_PORT("DSW2") |
| 49 | 59 | ADDRESS_MAP_END |
| 50 | 60 | |
| 51 | 61 | |
| 52 | 62 | /*************************************************************************** |
| 53 | 63 | |
| 54 | | |
| 55 | 64 | Sound CPU |
| 56 | 65 | |
| 57 | | |
| 58 | 66 | ***************************************************************************/ |
| 59 | 67 | |
| 60 | | |
| 61 | | /*************************************************************************** |
| 62 | | Sky Fox |
| 63 | | ***************************************************************************/ |
| 64 | | |
| 65 | | |
| 66 | 68 | static ADDRESS_MAP_START( skyfox_sound_map, AS_PROGRAM, 8, skyfox_state ) |
| 67 | | AM_RANGE(0x0000, 0x7fff) AM_ROM // ROM |
| 68 | | AM_RANGE(0x8000, 0x87ff) AM_RAM // RAM |
| 69 | | // AM_RANGE(0x9000, 0x9001) AM_WRITENOP // ?? |
| 70 | | AM_RANGE(0xa000, 0xa001) AM_DEVREADWRITE("ym1", ym2203_device, read, write) // YM2203 #1 |
| 71 | | // AM_RANGE(0xb000, 0xb001) AM_WRITENOP // ?? |
| 72 | | AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ym2", ym2203_device, read, write) // YM2203 #2 |
| 73 | | AM_RANGE(0xb000, 0xb000) AM_READ(soundlatch_byte_r) // From Main CPU |
| 69 | AM_RANGE(0x0000, 0x7fff) AM_ROM |
| 70 | AM_RANGE(0x8000, 0x87ff) AM_RAM |
| 71 | // AM_RANGE(0x9000, 0x9001) AM_WRITENOP // ?? |
| 72 | AM_RANGE(0xa000, 0xa001) AM_DEVREADWRITE("ym1", ym2203_device, read, write) |
| 73 | // AM_RANGE(0xb000, 0xb001) AM_WRITENOP // ?? |
| 74 | AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ym2", ym2203_device, read, write) |
| 75 | AM_RANGE(0xb000, 0xb000) AM_READ(soundlatch_byte_r) |
| 74 | 76 | ADDRESS_MAP_END |
| 75 | 77 | |
| 76 | 78 | |
| 77 | 79 | /*************************************************************************** |
| 78 | 80 | |
| 79 | | |
| 80 | 81 | Input Ports |
| 81 | 82 | |
| 82 | | |
| 83 | 83 | ***************************************************************************/ |
| 84 | 84 | |
| 85 | 85 | INPUT_CHANGED_MEMBER(skyfox_state::coin_inserted) |
| r32068 | r32069 | |
| 147 | 147 | PORT_DIPSETTING( 0x02, "3" ) |
| 148 | 148 | PORT_DIPSETTING( 0x03, "4" ) |
| 149 | 149 | PORT_DIPSETTING( 0x04, "5" ) |
| 150 | | // PORT_DIPSETTING( 0x05, "5" ) |
| 151 | | // PORT_DIPSETTING( 0x06, "5" ) |
| 150 | PORT_DIPSETTING( 0x05, "5" ) // dupe |
| 151 | PORT_DIPSETTING( 0x06, "5" ) // dupe |
| 152 | 152 | PORT_DIPSETTING( 0x07, "Infinite (Cheat)") |
| 153 | 153 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 154 | 154 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| r32068 | r32069 | |
| 166 | 166 | |
| 167 | 167 | /*************************************************************************** |
| 168 | 168 | |
| 169 | | |
| 170 | 169 | Graphics Layouts |
| 171 | 170 | |
| 172 | | |
| 173 | 171 | ***************************************************************************/ |
| 174 | 172 | |
| 175 | 173 | /* 8x8x8 tiles (note that the tiles in the ROMs are 32x32x8, but |
| r32068 | r32069 | |
| 187 | 185 | 8*8*8 |
| 188 | 186 | }; |
| 189 | 187 | |
| 190 | | /*************************************************************************** |
| 191 | | Sky Fox |
| 192 | | ***************************************************************************/ |
| 193 | | |
| 194 | 188 | static GFXDECODE_START( skyfox ) |
| 195 | | GFXDECODE_ENTRY( "gfx1", 0, layout_8x8x8, 0, 1 ) // [0] Sprites |
| 189 | GFXDECODE_ENTRY( "gfx1", 0, layout_8x8x8, 0, 1 ) // [0] Sprites |
| 196 | 190 | GFXDECODE_END |
| 197 | 191 | |
| 198 | 192 | |
| 199 | 193 | /*************************************************************************** |
| 200 | 194 | |
| 201 | | |
| 202 | 195 | Machine Drivers |
| 203 | 196 | |
| 204 | | |
| 205 | 197 | ***************************************************************************/ |
| 206 | 198 | |
| 207 | | |
| 208 | | /*************************************************************************** |
| 209 | | Sky Fox |
| 210 | | ***************************************************************************/ |
| 211 | | |
| 212 | 199 | /* Scroll the background on every vblank (guess). */ |
| 213 | 200 | |
| 214 | 201 | INTERRUPT_GEN_MEMBER(skyfox_state::skyfox_interrupt) |
| r32068 | r32069 | |
| 234 | 221 | /* basic machine hardware */ |
| 235 | 222 | MCFG_CPU_ADD("maincpu", Z80, XTAL_8MHz/2) /* Verified at 4MHz */ |
| 236 | 223 | MCFG_CPU_PROGRAM_MAP(skyfox_map) |
| 237 | | MCFG_CPU_VBLANK_INT_DRIVER("screen", skyfox_state, skyfox_interrupt) /* NMI caused by coin insertion */ |
| 224 | MCFG_CPU_VBLANK_INT_DRIVER("screen", skyfox_state, skyfox_interrupt) |
| 238 | 225 | |
| 239 | 226 | MCFG_CPU_ADD("audiocpu", Z80, XTAL_14_31818MHz/8) /* Verified at 1.789772MHz */ |
| 240 | 227 | MCFG_CPU_PROGRAM_MAP(skyfox_sound_map) |
| 241 | 228 | |
| 242 | | |
| 243 | 229 | /* video hardware */ |
| 244 | 230 | MCFG_SCREEN_ADD("screen", RASTER) |
| 245 | 231 | MCFG_SCREEN_REFRESH_RATE(62.65) |
| 246 | | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // we're using PORT_VBLANK |
| 232 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) |
| 247 | 233 | MCFG_SCREEN_SIZE(512, 256) |
| 248 | | MCFG_SCREEN_VISIBLE_AREA(0+0x60, 320-1+0x60, 0+16, 256-1-16) // from $30*2 to $CC*2+8 |
| 234 | MCFG_SCREEN_VISIBLE_AREA(0+0x60, 320-1+0x60, 0+16, 256-1-16) // from $30*2 to $CC*2+8 |
| 249 | 235 | MCFG_SCREEN_UPDATE_DRIVER(skyfox_state, screen_update_skyfox) |
| 250 | 236 | MCFG_SCREEN_PALETTE("palette") |
| 251 | 237 | |
| 252 | 238 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", skyfox) |
| 253 | | MCFG_PALETTE_ADD("palette", 256+256) /* 256 static colors (+256 for the background??) */ |
| 239 | MCFG_PALETTE_ADD("palette", 256+256) /* 256 static colors (+256 for the background??) */ |
| 254 | 240 | MCFG_PALETTE_INIT_OWNER(skyfox_state, skyfox) |
| 255 | 241 | |
| 256 | 242 | /* sound hardware */ |
| r32068 | r32069 | |
| 265 | 251 | |
| 266 | 252 | |
| 267 | 253 | |
| 268 | | |
| 269 | | |
| 270 | | |
| 271 | 254 | /*************************************************************************** |
| 272 | 255 | |
| 273 | | |
| 274 | 256 | ROMs Loading |
| 275 | 257 | |
| 258 | **************************************************************************** |
| 276 | 259 | |
| 277 | | ***************************************************************************/ |
| 278 | | |
| 279 | | |
| 280 | | |
| 281 | | /*************************************************************************** |
| 282 | | |
| 283 | 260 | Sky Fox |
| 284 | 261 | |
| 285 | 262 | |
| r32068 | r32069 | |
| 287 | 264 | c044-5 : Score (BCD) |
| 288 | 265 | c048-9 : Power (BCD) |
| 289 | 266 | |
| 290 | | ***************************************************************************/ |
| 267 | **************************************************************************** |
| 291 | 268 | |
| 292 | | /*************************************************************************** |
| 293 | | |
| 294 | 269 | Exerizer [Bootleg] |
| 295 | 270 | |
| 296 | 271 | malcor |
| r32068 | r32069 | |
| 417 | 392 | ROM_END |
| 418 | 393 | |
| 419 | 394 | |
| 420 | | |
| 421 | | |
| 422 | 395 | /* Untangle the graphics: cut each 32x32x8 tile in 16 8x8x8 tiles */ |
| 423 | 396 | DRIVER_INIT_MEMBER(skyfox_state,skyfox) |
| 424 | 397 | { |
| 425 | | UINT8 *RAM = memregion("gfx1")->base(); |
| 426 | | UINT8 *end = RAM + memregion("gfx1")->bytes(); |
| 398 | UINT8 *rom = memregion("gfx1")->base(); |
| 399 | UINT8 *end = rom + memregion("gfx1")->bytes(); |
| 427 | 400 | UINT8 buf[32 * 32]; |
| 428 | 401 | |
| 429 | | while (RAM < end) |
| 402 | while (rom < end) |
| 430 | 403 | { |
| 431 | | int i; |
| 432 | | for (i = 0; i < (32 * 32); i++) |
| 433 | | buf[i] = RAM[(i % 8) + ((i / 8) % 8) * 32 + ((i / 64) % 4) * 8 + (i / 256) * 256]; |
| 404 | for (int i = 0; i < (32 * 32); i++) |
| 405 | buf[i] = rom[(i % 8) + ((i / 8) % 8) * 32 + ((i / 64) % 4) * 8 + (i / 256) * 256]; |
| 434 | 406 | |
| 435 | | memcpy(RAM, buf, 32 * 32); |
| 436 | | RAM += 32 * 32; |
| 407 | memcpy(rom, buf, 32 * 32); |
| 408 | rom += 32 * 32; |
| 437 | 409 | } |
| 438 | 410 | } |
| 439 | 411 | |
| 440 | 412 | |
| 441 | | |
| 442 | | GAME( 1987, skyfox, 0, skyfox, skyfox, skyfox_state, skyfox, ROT90, "Jaleco (Nichibutsu USA license)", "Sky Fox" , GAME_SUPPORTS_SAVE ) |
| 413 | GAME( 1987, skyfox, 0, skyfox, skyfox, skyfox_state, skyfox, ROT90, "Jaleco (Nichibutsu USA license)", "Sky Fox", GAME_SUPPORTS_SAVE ) |
| 443 | 414 | GAME( 1987, exerizer, skyfox, skyfox, skyfox, skyfox_state, skyfox, ROT90, "Jaleco", "Exerizer (Japan)", GAME_SUPPORTS_SAVE ) |
| 444 | | GAME( 1987, exerizerb, skyfox, skyfox, skyfox, skyfox_state, skyfox, ROT90, "bootleg", "Exerizer (Japan) (bootleg)", GAME_SUPPORTS_SAVE ) |
| 415 | GAME( 1987, exerizerb, skyfox, skyfox, skyfox, skyfox_state, skyfox, ROT90, "bootleg", "Exerizer (bootleg)", GAME_SUPPORTS_SAVE ) |