summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/wheelfir.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/wheelfir.c')
-rw-r--r--src/mame/drivers/wheelfir.c683
1 files changed, 683 insertions, 0 deletions
diff --git a/src/mame/drivers/wheelfir.c b/src/mame/drivers/wheelfir.c
new file mode 100644
index 00000000000..599ff53d619
--- /dev/null
+++ b/src/mame/drivers/wheelfir.c
@@ -0,0 +1,683 @@
+/* Wheels & Fire */
+
+/* driver by
+ David Haywood
+ Tomasz Slanina
+*/
+
+/*
+
+Produttore TCH
+N.revisione E133
+
+
+
+CPU
+
+2x MC68HC000FN16
+
+2x TPC1020BFN-084C
+1x BT478KPJ50-615-9132F
+1x S9530AG-ADC0808-CCV
+1x oscillator 32.000000MHz
+
+ROMs
+
+12x TMS27C040
+
+1x GAL16V8QS
+2x GAL22V10
+
+Note
+
+1x JAMMA connector
+1x VGA connector
+2x trimmer (volume)
+
+
+----
+
+uses a blitter for the gfx, this is not fully understood...
+
+level 5 interrupt = raster interrupt, used for road
+level 3 interrupt = vblank interrupt
+level 1 interrupt = blitter interrupt
+
+something is missing, currently needs a hack to boot
+
+*/
+
+
+#include "driver.h"
+static int toggle_bit;
+
+static READ16_HANDLER( wheelfir_rand1 )
+{
+
+
+
+
+ return readinputport(0)^toggle_bit;// mame_rand(Machine);
+}
+
+static READ16_HANDLER( wheelfir_rand2 )
+{
+ return readinputport(1);// mame_rand(Machine);
+}
+
+
+static READ16_HANDLER( wheelfir_rand4 )
+{
+ return mame_rand(Machine);
+}
+
+static UINT16 *wheelfir_myram;
+static UINT16 wheelfir_blitdata[16];
+static mame_bitmap *wheelfir_tmp_bitmap[3];
+
+/*
+
+A 30f7 - 3150 - 0059 - 0d5c - 0066 - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - A
+B
+C 48f7 - 4971 - 007a - 0d28 - 0032 - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - C
+C 48f7 - 4945 - 004e - 0d42 - 004c - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - C
+D 54f7 - 559d - 00a6 - 0d76 - 0080 - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - D
+E 1ff8 - 209d - 00a5 - 2728 - 0032 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - E
+F
+G 60f7 - 6145 - 004e - 0d5c - 0066 - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - G
+H 6cf7 - 6d7c - 0085 - 0d28 - 0032 - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - H
+I 3efd - 3f5e - 0061 - 2d28 - 0032 - 0000 - 0000 - 3400 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - I
+I 3efd - 3f5e - 0061 - 2d42 - 004c - 0000 - 0000 - 3400 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - I
+I 3efd - 3fa0 - 00a3 - 2d42 - 004c - 0000 - 0000 - 3400 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - I
+J
+K
+L 40f8 - 415b - 0063 - 2776 - 0080 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - L
+M 3cf6 - 3d5a - 0064 - eac4 - 00ce - 0000 - 0000 - 3b00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - M
+N 84f7 - 8566 - 006f - 0d42 - 004c - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - N
+N 84f7 - 85b3 - 00bc - 0d42 - 004c - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - N
+O 90f7 - 9150 - 0059 - 0d42 - 004c - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - O
+O 90f7 - 917c - 0085 - 0d42 - 004c - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - O
+O 90f7 - 91a8 - 00b1 - 0d42 - 004c - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - O
+P f0f7 - f187 - 0090 - 0d42 - 004c - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - P
+Q
+R fcf7 - fd71 - 007a - 0d76 - 0080 - 0000 - 0000 - 3c00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - R
+S 4bf8 - 4c45 - 004d - 2728 - 0032 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - S
+S 4bf8 - 4ca8 - 00b0 - 2728 - 0032 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - S
+S 4bf8 - 4cbe - 00c6 - 2742 - 004c - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - S
+T 08f7 - 0966 - 006f - 0d28 - 0032 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - T
+T 08f7 - 0992 - 009b - 0d28 - 0032 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - T
+T 08f7 - 09b3 - 00bc - 0d28 - 0032 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - T
+T 08f7 - 0992 - 009b - 0d42 - 004c - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - T
+U 14f7 - 155b - 0064 - 0d90 - 009a - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - U
+V 20f7 - 21d4 - 00dd - 0d76 - 0080 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - V
+W 20f3 - 214e - 005b - b628 - 0032 - 0000 - 0000 - 3a00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - W
+X 2cf7 - 2d50 - 0059 - 0dde - 00e8 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - X
+Y 38f7 - 3921 - 002a - 0d76 - 0080 - 0000 - 0000 - 3d00 - 00d7 - c000 - 000c - 0000 - 0000 - 0000 - 00ff - ffff - ffff - Y
+Z
+ extra test mode reads..
+
+ ????
+ GAME OPTIONS
+ COIN OPTIONS
+ COLOR AND CONVERGENCY
+ SOUND
+ STATISTICS
+ COMUNICATION
+ EXIT
+
+U 14f7 - 155b - 0064 - 0d90 - 009a - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - U
+V 20f7 - 21d4 - 00dd - 0d76 - 0080 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - V
+X 2cf7 - 2d50 - 0059 - 0dde - 00e8 - 0000 - 0000 - 3d00 - 0097 - c000 - 0008 - 0000 - 0000 - 0000 - 00ff - ffff - ffff - X
+Y 38f7 - 3921 - 002a - 0d76 - 0080 - 0000 - 0000 - 3d00 - 00d7 - c000 - 000c - 0000 - 0000 - 0000 - 00ff - ffff - ffff - Y
+
+by the grouping of the characters the test mode font should clearly be the one seen at the start of the last page. and
+scattered over the previous page. letters are 12x12, and U/V/X/Y are +0x0c00 from each other in this data.
+
+
+by using 0xffff at 0xf as the draw command we seem to lose some data.. maybe its not right.
+
+*/
+
+/* each 512x512 page is
+ 0x40000 bytes long
+
+therefore a 512x256 page is
+ 0x20000 bytes...
+
+*/
+
+/* it draws the background and road with direct writes to port 6... but where does this really go? an extra blit source page? */
+static int wheelfir_six_pos = 0;
+static mame_bitmap* render_bitmap;
+
+static WRITE16_HANDLER(wheelfir_blit_w)
+{
+ //wheelfir_blitdata[offset]=data;
+ int vpage=0;
+ COMBINE_DATA(&wheelfir_blitdata[offset]);
+
+ /* a bit of a hack really .. */
+ if(offset==0x6)
+ {
+ int sixdat = data&0xff;
+ int x,y;
+
+ x = wheelfir_six_pos % 512;
+ y = wheelfir_six_pos / 512;
+
+ x &= 511;
+ y &= 511;
+
+ wheelfir_six_pos++;
+
+ *BITMAP_ADDR16(wheelfir_tmp_bitmap[2], y, x) = sixdat;
+ return;
+ }
+
+
+ /* probably wrong, see above! */
+ if(offset==0xf && data==0xffff)
+ {
+
+
+ int x,y;
+ int xsize,ysize;
+ UINT8 *rom = memory_region(REGION_GFX1);
+ int dir=0;
+
+
+ wheelfir_six_pos = 0;
+
+ mame_printf_debug("XX %.4x - ",wheelfir_blitdata[0]-wheelfir_blitdata[1]);
+ mame_printf_debug("YY %.4x - ",wheelfir_blitdata[2]-wheelfir_blitdata[3]);
+
+
+ for(x=0;x<16;x++)
+ mame_printf_debug("%x-",wheelfir_blitdata[x]);
+
+ mame_printf_debug("\n");
+
+ xsize = ((wheelfir_blitdata[1]&0xff)-(wheelfir_blitdata[0]&0xff))&0xff;
+ ysize = ((wheelfir_blitdata[3]&0xff)-(wheelfir_blitdata[2]&0xff))&0x0ff;
+
+
+
+
+ if(wheelfir_blitdata[7]&0x1)
+ dir=1;
+ else
+ {
+ dir=-1;
+ xsize=0x100-xsize;
+ }
+
+ for(y=0;y<=ysize+1/*((wheelfir_blitdata[9]?wheelfir_blitdata[9]:16)*/;y++)
+ for(x=0;x<=xsize+1/*(wheelfir_blitdata[9]?wheelfir_blitdata[9]:16)*/;x++)
+ {
+ int destx=wheelfir_blitdata[0]&0xff;
+ int desty=wheelfir_blitdata[2]&0xff;
+
+ int pagenumber = (wheelfir_blitdata[6]&0x3e00)>>9;
+ int gfxbase = pagenumber * 0x20000;
+ int xbit = (wheelfir_blitdata[6]&0x0100)>>8;
+
+
+ int offs;
+ int pix;
+ int diffx,diffy;
+
+ if (wheelfir_blitdata[7]&0x0040)destx +=0x100;
+ // if (wheelfir_blitdata[7]&0x0080) desty +=0x100;
+
+// if (wheelfir_blitdata[9]&0x0004) destx +=0x100;
+// if (wheelfir_blitdata[9]&0x0008) desty +=0x100;
+
+ diffx=wheelfir_blitdata[0]>>8;
+ diffy=wheelfir_blitdata[2]>>8;
+
+ // diffx-=0xf700;
+ // diffx&=511;
+
+
+ // diffy-=0xf400;
+// diffy&=1023;
+
+
+ diffx &= 0xff;
+ diffy &= 0xff;
+ if (xbit) diffx+=0x100;
+
+ diffx+=x;
+ diffy+=y;
+
+
+ destx+=x*dir;
+ desty+=y;
+
+ offs=gfxbase+diffy*512+diffx;
+
+ offs&=0x3fffff;
+
+ pix = rom[offs];
+
+
+ if(pix && destx >0 && desty >0 && destx<Machine->screen[0].width && desty <Machine->screen[0].height)
+ *BITMAP_ADDR16(wheelfir_tmp_bitmap[vpage], desty, destx) = pix;
+ }
+ }
+
+
+
+}
+
+static VIDEO_START(wheelfir)
+{
+
+ wheelfir_tmp_bitmap[0] = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format);
+ wheelfir_tmp_bitmap[1] = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format);
+ wheelfir_tmp_bitmap[2] = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format);
+
+ render_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format);
+
+}
+
+static UINT8 wheelfir_palette[8192];
+static int wheelfir_palpos = 0;
+/* Press R to show a page of gfx, Q / E to move between pages, and W to clear the framebuffer */
+static VIDEO_UPDATE(wheelfir)
+{
+ /*
+ int x,y;
+ static int base = 0;
+
+ if ( input_code_pressed_once(KEYCODE_E) )
+ base += 512*512;
+
+ if ( input_code_pressed_once(KEYCODE_Q) )
+ base -= 512*512;
+
+ if (base<0x000000) base = 0x000000;
+ if (base>0x3c0000) base = 0x3c0000;
+
+ copybitmap(bitmap, wheelfir_tmp_bitmap[2], 0, 0, 0, 0, cliprect, TRANSPARENCY_NONE, 0);
+ //copybitmap(bitmap, wheelfir_tmp_bitmap[1], 0, 0, 0, 0, cliprect, TRANSPARENCY_PEN, 0);
+ copybitmap(bitmap, wheelfir_tmp_bitmap[0], 0, 0, 0, 0, cliprect, TRANSPARENCY_PEN, 0);
+ fillbitmap(wheelfir_tmp_bitmap[0], 0,&machine->screen[0].visarea);
+
+ if ( input_code_pressed(KEYCODE_R) )
+ {
+ for (y=0;y<128;y++)
+ {
+ for (x=0;x<512;x++)
+ {
+ int romoffs;
+ UINT8 romdata;
+
+ romoffs = base+y*512+x;
+
+ romdata = memory_region(REGION_GFX1)[romoffs];
+
+ *BITMAP_ADDR16(bitmap, y, x) = romdata;
+ }
+ }
+ }
+ */
+
+ copybitmap(bitmap, render_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENCY_NONE, 0);
+ copybitmap(bitmap, wheelfir_tmp_bitmap[0], 0, 0, 0, 0, cliprect, TRANSPARENCY_PEN, 0);
+
+ {
+ int x;
+ for (x=0;x<8192;x+=3)
+ {
+ //int paldat = (wheelfir_palette[x]<<8) | wheelfir_palette[x+1];
+ int b,g,r;
+
+ r = wheelfir_palette[x];
+ g = wheelfir_palette[x+1];
+ b = wheelfir_palette[x+2];
+ palette_set_color(machine,x/3,MAKE_RGB(r,g,b));
+ }
+ }
+/*
+ {
+ FILE* fp;
+ fp=fopen("wheelfir_pal.dmp", "w+b");
+ if (fp)
+ {
+ fwrite(wheelfir_palette, 1024, 1, fp);
+ fclose(fp);
+ }
+ }
+*/
+
+ return 0;
+}
+
+static WRITE16_HANDLER( pal_reset_pos_w )
+{
+ wheelfir_palpos = 0;
+}
+
+static WRITE16_HANDLER( pal_data_w )
+{
+ wheelfir_palette[wheelfir_palpos] = data & 0xff;
+ wheelfir_palpos ++;
+
+ wheelfir_palpos &=8191;
+}
+
+
+
+static ADDRESS_MAP_START( wheelfir_main, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x0fffff) AM_ROM
+ AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_BASE (&wheelfir_myram)
+
+ AM_RANGE(0x7c0000, 0x7c0001) AM_READ(wheelfir_rand1)
+ AM_RANGE(0x780000, 0x780001) AM_READ(wheelfir_rand2)
+ AM_RANGE(0x7e0000, 0x7e0001) AM_READ(input_port_2_word_r)
+ AM_RANGE(0x7e0002, 0x7e0003) AM_READ(input_port_3_word_r)
+
+
+ AM_RANGE(0x700000, 0x70001f) AM_WRITE(wheelfir_blit_w) // blitter stuff
+ AM_RANGE(0x720000, 0x720001) AM_WRITE(pal_reset_pos_w) // always 0?
+ AM_RANGE(0x720002, 0x720003) AM_WRITE(pal_data_w) // lots of different values.. also blitter? palette?
+// AM_RANGE(0x720004, 0x720005) AM_WRITE(MWA16_NOP) // always ffff?
+
+// AM_RANGE(0x740000, 0x740001) AM_WRITE(MWA16_NOP)
+// AM_RANGE(0x760000, 0x760001) AM_WRITE(MWA16_NOP)
+// AM_RANGE(0x740000, 0x740001) AM_WRITE(MWA16_NOP)
+// AM_RANGE(0x7a0000, 0x7a0001) AM_WRITE(MWA16_NOP)
+// AM_RANGE(0x7c0000, 0x7c0001) AM_WRITE(MWA16_NOP)
+
+ ADDRESS_MAP_END
+
+
+/* sub is sound cpu? the program roms contain lots of samples */
+static ADDRESS_MAP_START( wheelfir_sub, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x0fffff) AM_ROM
+ AM_RANGE(0x200000, 0x20ffff) AM_RAM
+
+ AM_RANGE(0x780000, 0x780001) AM_READ(wheelfir_rand4)
+ AM_RANGE(0x700000, 0x700001) AM_WRITE(MWA16_NOP)
+ AM_RANGE(0x740000, 0x740001) AM_WRITE(MWA16_NOP)
+ADDRESS_MAP_END
+
+
+static INPUT_PORTS_START( wheelfir )
+ PORT_START /* 16bit */
+ PORT_DIPNAME( 0x0001, 0x0001, "0" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START /* 16bit */
+ PORT_DIPNAME( 0x0001, 0x0001, "1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START /* 16bit */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_DIPNAME( 0x1000, 0x1000, "Test / Game?" )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 16bit */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static emu_timer* frame_timer;
+static emu_timer* scanline_timer;
+
+static TIMER_CALLBACK( frame_timer_callback )
+{
+ /* callback */
+}
+
+static int scanline_counter = 0;
+static int total_scanlines = 262;
+
+static void render_background_to_render_buffer(int scanline)
+{
+ int x;
+ UINT16 yscroll = (wheelfir_blitdata[0xb]&0x00ff) | (wheelfir_blitdata[0x8]&0x0080) << 1;
+ UINT16 xscroll = (wheelfir_blitdata[0xa]&0x00ff) | (wheelfir_blitdata[0x8]&0x0040) << 2;
+
+ UINT16 *source = BITMAP_ADDR16(wheelfir_tmp_bitmap[2], (scanline+yscroll)&511, 0);
+ UINT16 *dest = BITMAP_ADDR16(render_bitmap, scanline, 0);
+
+// if (scanline==100)
+// printf("%04x %04x %04x %04x\n", wheelfir_blitdata[0x8],wheelfir_blitdata[0x9],wheelfir_blitdata[0xa],wheelfir_blitdata[0xb]);
+
+ for (x=0;x<336;x++)
+ {
+ dest[x] = source[ (x+xscroll) &511];
+ }
+
+}
+
+static TIMER_CALLBACK( scanline_timer_callback )
+{
+ timer_call_after_resynch(0, 0);
+
+ if (scanline_counter!=(total_scanlines-1))
+ {
+ scanline_counter++;
+ cpunum_set_input_line(0, 5, HOLD_LINE); // raster IRQ, changes scroll values for road
+ timer_adjust(scanline_timer, attotime_div(ATTOTIME_IN_HZ(60), total_scanlines), 0, attotime_zero);
+
+ if (scanline_counter<256)
+ {
+ render_background_to_render_buffer(scanline_counter);
+ }
+
+ if (scanline_counter==256)
+ {
+ cpunum_set_input_line(0, 3, HOLD_LINE); // vblank IRQ?
+ toggle_bit = 0x8000; // must toggle..
+ }
+
+ if (scanline_counter==0)
+ {
+ toggle_bit = 0x0000; // must toggle..
+ }
+
+ // printf("scanline %d\n",scanline_counter);
+ }
+ else /* pretend we're still on the same scanline to compensate for rounding errors */
+ {
+ scanline_counter = total_scanlines-1;
+ }
+}
+
+static VIDEO_EOF( wheelfir )
+{
+ scanline_counter = -1;
+ fillbitmap(wheelfir_tmp_bitmap[0], 0,&machine->screen[0].visarea);
+
+ timer_adjust(frame_timer, attotime_zero, 0, attotime_zero);
+ timer_adjust(scanline_timer, attotime_zero, 0, attotime_zero);
+}
+
+static MACHINE_RESET(wheelfir)
+{
+ frame_timer = timer_alloc(frame_timer_callback);
+ scanline_timer = timer_alloc(scanline_timer_callback);
+ timer_adjust(frame_timer, attotime_zero, 0, attotime_zero);
+ timer_adjust(scanline_timer, attotime_zero, 0, attotime_zero);
+ scanline_counter = -1;
+}
+
+static INTERRUPT_GEN( wheelfir_irq )
+{
+ // we seem to need this interrupt at least once for every object drawn on the screen, otherwise things flicker + slowdown
+ cpunum_set_input_line(0, 1, HOLD_LINE); // blitter IRQ?
+}
+
+
+static MACHINE_DRIVER_START( wheelfir )
+ MDRV_CPU_ADD_TAG("main", M68000, 32000000)
+ MDRV_CPU_PROGRAM_MAP(wheelfir_main, 0)
+ MDRV_CPU_VBLANK_INT(wheelfir_irq,256) // 1,3,5 valid
+
+ MDRV_CPU_ADD_TAG("main", M68000, 32000000/2)
+ MDRV_CPU_PROGRAM_MAP(wheelfir_sub, 0)
+ MDRV_CPU_VBLANK_INT(irq1_line_hold,1) // 1 valid
+
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ MDRV_MACHINE_RESET (wheelfir)
+
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(64*8, 64*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 42*8-1, 0*8, 32*8-1)
+
+ MDRV_PALETTE_LENGTH(8192)
+
+ MDRV_VIDEO_START(wheelfir)
+ MDRV_VIDEO_UPDATE(wheelfir)
+ MDRV_VIDEO_EOF(wheelfir)
+MACHINE_DRIVER_END
+
+
+ROM_START( wheelfir )
+ ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "tch1.u19", 0x00001, 0x80000, CRC(33bbbc67) SHA1(c2ecc0ab522ee442076ea7b9536aee6e1fad0540) )
+ ROM_LOAD16_BYTE( "tch2.u21", 0x00000, 0x80000, CRC(ed6b9e8a) SHA1(214c5aaf55963a219db33dd5d530492e09ad5e07) )
+
+ ROM_REGION( 0x100000, REGION_CPU2, 0 ) /* 68000 Code + sound samples */
+ ROM_LOAD16_BYTE( "tch3.u83", 0x00001, 0x80000, CRC(43c014a6) SHA1(6c01a08dda204f36e8768795dd5d405576a49140) )
+ ROM_LOAD16_BYTE( "tch11.u65", 0x00000, 0x80000, CRC(fc894b2e) SHA1(ebe6d1adf889731fb6f53b4ce5f09c60e2aefb97) )
+
+ ROM_REGION( 0x400000, REGION_GFX1, 0 ) // 512x512 gfx pages
+ ROM_LOAD( "tch4.u52", 0x000000, 0x80000, CRC(fe4bc2c7) SHA1(33a2ef79cb13f9e7e7d513915c6e13c4e7fe0188) )
+ ROM_LOAD( "tch5.u53", 0x080000, 0x80000, CRC(a38b9ca5) SHA1(083c9f700b9df1039fb553e918e205c6d32057ad) )
+ ROM_LOAD( "tch6.u54", 0x100000, 0x80000, CRC(2733ae6b) SHA1(ebd91e123b670159f79be19a552d1ae0c8a0faff) )
+ ROM_LOAD( "tch7.u55", 0x180000, 0x80000, CRC(6d98f27f) SHA1(d39f7f184abce645b9165b64e89e3b5354187eea) )
+ ROM_LOAD( "tch8.u56", 0x200000, 0x80000, CRC(22b661fe) SHA1(b6edf8e1e8b479ee8813502157615f54627dc7c1) )
+ ROM_LOAD( "tch9.u57", 0x280000, 0x80000, CRC(83c66de3) SHA1(50deaf3338d590340b928f891548c47ba8f3ca38) )
+ ROM_LOAD( "tch10.u58",0x300000, 0x80000, CRC(2036ed80) SHA1(910381e2ccdbc2d06f873021d8af02795d22f595) )
+ ROM_LOAD( "tch12.u59",0x380000, 0x80000, CRC(cce2e675) SHA1(f3d8916077b2e057169d0f254005cd959789a3b3) ) // font is in here
+ROM_END
+
+static DRIVER_INIT(wheelfir)
+{
+ UINT16 *RAM = (UINT16 *)memory_region(REGION_CPU1);
+ RAM[0xdd3da/2] = 0x4e71; // hack!
+}
+
+GAME( 199?, wheelfir, 0, wheelfir, wheelfir, wheelfir, ROT0, "TCH", "Wheels & Fire", GAME_NOT_WORKING|GAME_NO_SOUND )