From cb87356d5c68cb22a0d5162e5c0c85c1a7b46d03 Mon Sep 17 00:00:00 2001 From: Phil Bennett Date: Sun, 30 Mar 2008 23:59:31 +0000 Subject: [PATCH] Courtesy of Anonymous: * Added plane priority to blitter - if anyone knows how this really works let us know! - Fixes Treble Top signature writing * Video output now supports all modes - lores, hires, mixedres, 8/7/4/3 bits/pixel - Fixes Every Second Counts colour problems * Added line draw - Fixes missing stuff from Question Of Sport * Change blitter loop type control - there are 4 types of loop. * Corrected video frame rate to 50Hz. * Corrected Z80 speed - 5.91mhz, this still might be wrong but I don't have a board to check. * Accounted for Z80 cycles stolen during a blit operation. Improves gfx/sound sync and seems to fix the final round lockup in Every Second Counts. --- src/mame/drivers/bfcobra.c | 440 ++++++++++++++++++++++++++++--------- 1 file changed, 332 insertions(+), 108 deletions(-) diff --git a/src/mame/drivers/bfcobra.c b/src/mame/drivers/bfcobra.c index 1cedcde3bac..0cbd3999dd2 100644 --- a/src/mame/drivers/bfcobra.c +++ b/src/mame/drivers/bfcobra.c @@ -2,13 +2,13 @@ Bell-Fruit Cobra I/II and Viper Hardware - driver by Phil Bennett + driver by Phil Bennett and Anonymous Games supported: * A Question of Sport [2 sets] - * Beeline (non-working) + * Beeline (non-working - missing disk) * Every Second Counts - * Inquizitor (Viper hardware, non-working) + * Inquizitor (Viper hardware, non-working - missing disk) * Quizvaders * Treble Top @@ -55,22 +55,23 @@ To do: - * Verify blitter modes on real hardware and rewrite code - * Deduce unknown chipset accesses + * Complete blitter emulation * Cobra II support - * Implement Flare One DSP (although nothing seems to use it) * Hook up additional inputs, EM meters, lamps etc - * Remove a 'TODO' comment or thirty Known issues: - * trebltop: During the intro, DLT's signature is drawn incorrectly. - * escounts: Colours are completely wrong. Is there a palette register - somewhere that affects blitter/video output? - * qos: Game clock and score dividers aren't drawn (needs line draw mode) - * All games bar qos: NVRAM not saved. + * All games bar qos: NVRAM not saved + + * Viper does not have a colour palette - the Flare chipset drives RGB direct. + To fix this I set default values in the palette when the machine is initialised + * CPU execution rate is wrong, the hardware adds 1 TCycle to each access which is unaccounted for. + * Plane priority is probably wrong but it's only used in Treble Top. + * Blitter loop counts and step are wrong - they are 9 bit counts, not 8. + * Blitter emulation doesn't support hi-res mode (needed for Inquizitor) ******************************************************************************/ + #include "driver.h" #include "deprecat.h" #include "machine/6850acia.h" @@ -83,7 +84,7 @@ /* Defines */ -#define Z80_XTAL 4000000 +#define Z80_XTAL 5910000 /* Unconfirmed */ #define M6809_XTAL 1000000 @@ -97,6 +98,7 @@ static UINT8 h_scroll; static UINT8 v_scroll; static UINT8 flip_8; static UINT8 flip_22; +static UINT8 videomode; /* UART source/sinks */ static UINT8 z80_m6809_line; @@ -104,7 +106,7 @@ static UINT8 m6809_z80_line; static UINT8 data_r; static UINT8 data_t; -static int irq_state; +static int irq_state; static int acia_irq; static int vblank_irq; static int blitter_irq; @@ -140,16 +142,13 @@ static void update_irqs(running_machine *machine) ***************************************************************************/ -#ifdef MAME_DEBUG -static int DEBUG_BLITTER = 0; -#endif - -/* Typedefs */ typedef union { #ifdef LSB_FIRST + struct { UINT16 loword, hiword ; } ; struct { UINT8 addr0, addr1, addr2; }; #else + struct { UINT16 hiword, loword ; } ; struct { UINT8 addr2, addr1, addr0; }; #endif UINT32 addr; @@ -161,10 +160,11 @@ typedef union #define CMD_PARRD 0x04 /* Never used? */ #define CMD_SRCUP 0x08 #define CMD_DSTUP 0x10 -#define CMD_SRCEN 0x20 -#define CMD_DSTEN 0x40 +#define CMD_LT0 0x20 +#define CMD_LT1 0x40 #define CMD_LINEDRAW 0x80 + /* All unconfirmed */ //#define SRCDST_CMP 0x10 //#define SRCDST_WRAP 0x20 @@ -178,13 +178,10 @@ typedef union #define MODE_BITTOBYTE 0x04 #define MODE_PALREMAP 0x10 -/* All unconfirmed */ -//#define CMPFUNC_EQ 0x01 -//#define CMPFUNC_NE 0x02 -//#define CMPFUNC_GT 0x04 -//#define CMPFUNC_PLANE 0x08 - -#define CMPFUNC_EQ 0x08 +#define CMPFUNC_LT 0x01 +#define CMPFUNC_EQ 0x02 +#define CMPFUNC_GT 0x04 +#define CMPFUNC_BEQ 0x08 #define CMPFUNC_LOG0 0x10 #define CMPFUNC_LOG1 0x20 #define CMPFUNC_LOG2 0x40 @@ -212,6 +209,8 @@ static struct UINT8 pattern; } blitter; +#define LOOPTYPE ( ( blitter.command&0x60 ) >> 5 ) + /* MUSIC Semiconductor TR9C1710 RAMDAC or equivalent */ @@ -231,32 +230,152 @@ static struct UINT8 count_w; } ramdac; + +#define BLUE_0 0 +#define BLUE_1 1 +#define BLUE_2 2 +#define BLUE_3 3 +#define GREEN_0 ( 0 << 2 ) +#define GREEN_1 ( 1 << 2 ) +#define GREEN_2 ( 2 << 2 ) +#define GREEN_3 ( 3 << 2 ) +#define GREEN_4 ( 4 << 2 ) +#define GREEN_5 ( 5 << 2 ) +#define GREEN_6 ( 6 << 2 ) +#define GREEN_7 ( 7 << 2 ) +#define RED_0 ( 0 << 5 ) +#define RED_1 ( 1 << 5 ) +#define RED_2 ( 2 << 5 ) +#define RED_3 ( 3 << 5 ) +#define RED_4 ( 4 << 5 ) +#define RED_5 ( 5 << 5 ) +#define RED_6 ( 6 << 5 ) +#define RED_7 ( 7 << 5 ) + +static UINT8 col4bit[16]= +{ + BLUE_0 | GREEN_0 | RED_0, + BLUE_1, + GREEN_2, + BLUE_1 | GREEN_2, + RED_2, + RED_2 | BLUE_1, + RED_2 | GREEN_2, + RED_2 | GREEN_2 | BLUE_1, + BLUE_2 | GREEN_5 | RED_5, + BLUE_3, + GREEN_7, + BLUE_3 | GREEN_7, + RED_7, + RED_7 | BLUE_3, + RED_7 | GREEN_7, + RED_7 | GREEN_7 | BLUE_3 +}; + +static UINT8 col3bit[16]= +{ + 0, + BLUE_3, + GREEN_7, + BLUE_3 | GREEN_7, + RED_7, + RED_7 | BLUE_3, + RED_7 | GREEN_7, + RED_7 | GREEN_7 | BLUE_3, + 0, + BLUE_3, + GREEN_7, + BLUE_3 | GREEN_7, + RED_7, + RED_7 | BLUE_3, + RED_7 | GREEN_7, + RED_7 | GREEN_7 | BLUE_3 +}; + +static UINT8 col8bit[256]; +static UINT8 col7bit[256]; +static UINT8 col6bit[256]; +static UINT8 col76index[] = {0, 2, 4, 7}; + + static VIDEO_UPDATE( bfcobra ) { + static int init_colour_indexes = 1; int x, y; UINT8 *src; UINT32 *dest; UINT32 offset; + UINT8 *hirescol; + UINT8 *lorescol; - /* A bit dodgy */ + /* + The following is a dirty hack to init the palette index tables + this should really be done elsewhere, preferably at compile time. + */ + if (init_colour_indexes == 1) + { + init_colour_indexes = 0; + + for (x = 0; x < 256; ++x) + { + UINT8 col; + + col8bit[x] = x; + col = x & 0x7f; + col = (col & 0x1f) | (col76index[ ( (col & 0x60) >> 5 ) & 3] << 5); + col7bit[x] = col; + + col = (col & 3) | (col76index[( (col & 0x0c) >> 2) & 3] << 2 ) | + (col76index[( (col & 0x30) >> 4) & 3] << 5 ); + col6bit[x] = col; + } + } + + + /* Select screen has to be programmed into two registers */ + /* No idea what happens if the registers are different */ if (flip_8 & 0x40 && flip_22 & 0x40) offset = 0x10000; else offset = 0; + if(videomode & 0x20) + { + hirescol = col3bit; + lorescol = col7bit; + } + else if(videomode & 0x40) + { + hirescol = col4bit; + lorescol = col6bit; + } + else + { + hirescol = col4bit; + lorescol = col8bit; + } + for (y = cliprect->min_y; y <= cliprect->max_y; ++y) { UINT16 y_offset = (y + v_scroll) * 256; src = &video_ram[offset + y_offset]; dest = BITMAP_ADDR32(bitmap, y, 0); - for (x = cliprect->min_x; x <= cliprect->max_x; ++x) + for (x = cliprect->min_x; x <= cliprect->max_x / 2; ++x) { UINT8 x_offset = x + h_scroll; UINT8 pen = *(src + x_offset); - //*dest++ = screen->machine->pens[pen & ramdac.mask]; - *dest++ = screen->machine->pens[pen]; + if ( ( videomode & 0x81 ) == 1 || (videomode & 0x80 && pen & 0x80) ) + { + *dest++ = screen->machine->pens[hirescol[pen & 0x0f]]; + *dest++ = screen->machine->pens[hirescol[(pen >> 4) & 0x0f]]; + } + else + { + *dest++ = screen->machine->pens[lorescol[pen]]; + *dest++ = screen->machine->pens[lorescol[pen]]; + } } } @@ -297,6 +416,9 @@ static void RunBlit(void) { #define BLITPRG_READ(x) blitter.x = *(blitter_get_addr(blitter.program.addr++)) + int cycles_used = 0; + + do { UINT8 srcdata = 0; @@ -316,7 +438,8 @@ static void RunBlit(void) BLITPRG_READ(step); BLITPRG_READ(pattern); -#ifdef MAME_DEBUG +#if 0 + /* This debug is now wrong ! */ if (DEBUG_BLITTER) { mame_printf_debug("\nBlitter (%x): Running command from 0x%.5x\n\n", activecpu_get_previouspc(), blitter.program.addr - 12); @@ -326,9 +449,7 @@ static void RunBlit(void) blitter.command & CMD_COLST ? "COLST" : " ", blitter.command & CMD_PARRD ? "PARRD" : " ", blitter.command & CMD_SRCUP ? "SRCUP" : " ", - blitter.command & CMD_DSTUP ? "DSTUP" : " ", - blitter.command & CMD_SRCEN ? "SRCEN" : " ", - blitter.command & CMD_DSTEN ? "DSTEN" : " "); + blitter.command & CMD_DSTUP ? "DSTUP" : " "); mame_printf_debug("Src Address Byte 0 %.2x\n", blitter.source.addr0); mame_printf_debug("Src Address Byte 1 %.2x\n", blitter.source.addr1); @@ -351,79 +472,99 @@ static void RunBlit(void) /* Ignore these writes */ if (blitter.dest.addr == 0) - { return; - } - - /* Dirty hacks for Quizvaders */ - if ( (blitter.command == 0x01) || (blitter.command == 0x19) ) - { - blitter.command |= CMD_SRCEN; - } /* Begin outer loop */ for (;;) { UINT8 innercnt = blitter.innercnt; + dstdata = blitter.pattern; if (blitter.command & CMD_LINEDRAW) { - /* - Line Drawing Mode + do + { + if (blitter.modectl & MODE_YFRAC) + { + if (blitter.modectl & MODE_SSIGN ) + blitter.dest.addr0--; + else + blitter.dest.addr0++; + } + else + { + if (blitter.modectl & MODE_DSIGN ) + blitter.dest.addr1--; + else + blitter.dest.addr1++; + } + if( blitter.source.addr0 < blitter.step ) + { - x1 - x0 - y1 - y0 + blitter.source.addr0 -=blitter.step ; + blitter.source.addr0 +=blitter.source.addr1; - d1 = bigger - d2 = smaller + if ( blitter.modectl & MODE_YFRAC ) + { + if (blitter.modectl & MODE_DSIGN ) + blitter.dest.addr1--; + else + blitter.dest.addr1++; + } + else + { + if (blitter.modectl & MODE_SSIGN ) + blitter.dest.addr0--; + else + blitter.dest.addr0++; + } + } + else + { + blitter.source.addr0 -=blitter.step; + } - * SRC0 = d1/2 - * SRC1 = d1 - * Inner Count = d1 - * DST0 = X0 - * DST1 = Y0 - * Source control = LSB of d1 - * Step reg = d2 - */ + *blitter_get_addr(blitter.dest.addr) = blitter.pattern; + cycles_used++; + + } while (--innercnt); } else do { - // UINT32 srcaddr = 0; UINT8 inhibit = 0; /* TODO: Set this correctly */ UINT8 result = blitter.pattern; - /* Source value is read only once in character mode */ - if (blitter.modectl & MODE_BITTOBYTE && innercnt == blitter.innercnt) + if (LOOPTYPE == 3 && innercnt == blitter.innercnt) { - if (blitter.command & CMD_SRCEN) - { - srcdata = *(blitter_get_addr(blitter.source.addr & 0xfffff)); - } + srcdata = *(blitter_get_addr(blitter.source.addr & 0xfffff)); + blitter.source.loword++; + cycles_used++; } /* Enable source address read and increment? */ - if ( !(blitter.modectl & (MODE_BITTOBYTE | MODE_PALREMAP)) ) + if (!(blitter.modectl & (MODE_BITTOBYTE | MODE_PALREMAP))) { - if (blitter.command & CMD_SRCEN) + if (LOOPTYPE == 0 || LOOPTYPE == 1) { srcdata = *(blitter_get_addr(blitter.source.addr & 0xfffff)); + cycles_used++; - /* TODO */ if (blitter.modectl & MODE_SSIGN) - blitter.source.addr = (blitter.source.addr - 1) & 0xfffff; + blitter.source.loword-- ; else - blitter.source.addr = (blitter.source.addr + 1) & 0xfffff; + blitter.source.loword++; result = srcdata; } } /* Read destination pixel? */ - if (blitter.command & CMD_DSTEN) + if (LOOPTYPE == 0) { dstdata = *blitter_get_addr(blitter.dest.addr & 0xfffff); + cycles_used++; } /* Inhibit depending on the bit selected by the inner count */ @@ -432,14 +573,9 @@ static void RunBlit(void) if (blitter.modectl & MODE_BITTOBYTE) { inhibit = !(srcdata & (1 << (8 - innercnt))); - - if (innercnt == 1) - { - blitter.source.addr = (blitter.source.addr + 1) & 0xfffff; - } } - if (blitter.compfunc & 0x08) + if (blitter.compfunc & CMPFUNC_BEQ) { if (srcdata == blitter.pattern) { @@ -450,6 +586,41 @@ static void RunBlit(void) return; } } + if (blitter.compfunc & CMPFUNC_LT) + { + /* Might be wrong */ + if ((srcdata & 0xc0) < (dstdata & 0xc0)) + { + inhibit = 1; + + /* TODO: Resume from inhibit? */ + if (blitter.command & CMD_COLST) + return; + } + } + if (blitter.compfunc & CMPFUNC_EQ) + { + if ((srcdata & 0xc0) == (dstdata & 0xc0)) + { + inhibit = 1; + + /* TODO: Resume from inhibit? */ + if (blitter.command & CMD_COLST) + return; + } + } + if (blitter.compfunc & CMPFUNC_GT) + { + /* Might be wrong */ + if ((srcdata & 0xc0) > (dstdata & 0xc0)) + { + inhibit = 1; + + /* TODO: Resume from inhibit? */ + if (blitter.command & CMD_COLST) + return; + } + } /* Write the data if not inhibited */ if (!inhibit) @@ -465,15 +636,35 @@ static void RunBlit(void) UINT8 newcol = *(blitter_get_addr((blitter.source.addr + dest) & 0xfffff)); *blitter_get_addr(blitter.dest.addr) = newcol; + cycles_used += 3; } else { - *blitter_get_addr(blitter.dest.addr) = result; + UINT8 final_result = 0; + + if (blitter.compfunc & CMPFUNC_LOG3) + final_result |= result & dstdata; + + if (blitter.compfunc & CMPFUNC_LOG2) + final_result |= result & ~dstdata; + + if (blitter.compfunc & CMPFUNC_LOG1) + final_result |= ~result & dstdata; + + if (blitter.compfunc & CMPFUNC_LOG0) + final_result |= ~result & ~dstdata; + + *blitter_get_addr(blitter.dest.addr) = final_result; + cycles_used++; } } /* Update destination address */ - blitter.dest.addr = (blitter.dest.addr + 1) & 0xfffff; + if (blitter.modectl & MODE_DSIGN) + blitter.dest.loword--; + else + blitter.dest.loword++; + } while (--innercnt); if (!--blitter.outercnt) @@ -483,14 +674,10 @@ static void RunBlit(void) else { if (blitter.command & CMD_DSTUP) - { - blitter.dest.addr = (blitter.dest.addr + blitter.step) & 0xfffff; - } + blitter.dest.loword += blitter.step; if (blitter.command & CMD_SRCUP) - { - blitter.source.addr = (blitter.source.addr + blitter.step) & 0xfffff; - } + blitter.source.loword += blitter.step; if (blitter.command & CMD_PARRD) { @@ -505,6 +692,9 @@ static void RunBlit(void) BLITPRG_READ(command); } while (blitter.command & CMD_RUN); + + /* Burn Z80 cycles while blitter is in operation */ + cpu_spinuntil_time( ATTOTIME_IN_NSEC( (1000000000 / Z80_XTAL)*cycles_used * 2 ) ); } @@ -551,6 +741,7 @@ static READ8_HANDLER( ramdac_r ) static WRITE8_HANDLER( ramdac_w ) { + switch (offset & 3) { case 0: @@ -592,18 +783,27 @@ static WRITE8_HANDLER( ramdac_w ) 03 Bank control for Z80 region 0xc000-0xffff (16kB) WR 06 Interrupt status....................................WR - 07 Interrupt ack.......................................WR + 07 Interrupt ack.......................................WR + Writing here sets the line number that vertical interrupt is generated at. + cmd1, bit2 is the 9th bit of the line number ???? Written with 0x21 - 08 - 09 ???? Linked with c001...............................W + 08 cmd1 WR * bit 6 = screen select + bit2 = 9th bit of vertical interrupt line number + bit6 = 1 = select screen 1 else screen 0 + 09 cmd2 Linked with c001...............................W * bit 0 = 1 = hires + bit0=1=hi res else lo res (as long as bit7 is 0) + bit5=mask msb of each pixel + bit6=mask 2 msbits of each lores pixel + bit7=1=variable resolution - resolution is set by bit 7 of each vram byte. bit7=1=2 hires pixels 0A ???? Written with 0 and 1...........................W + color of border 0B Horizontal frame buffer scroll .....................W 0C Vertical frame buffer scroll .......................W - 0D ???? Written with $FF...............................W - 0E ???? Written with $A2 (162).........................W - 0F ???? Written with $B4 (180).........................W + 0D Colour hold colour..................................W + 0E Palette value for hi-res magenta....................W + 0F Palette value for hi-res yellow?....................W 14 ....................................................W 18 Blitter program low byte............................WR @@ -686,19 +886,23 @@ static WRITE8_HANDLER( chipset_w ) case 0x03: { if (data > 0x3f) - { popmessage("%x: Unusual bank access (%x)\n", activecpu_get_previouspc(), data); - } + data &= 0x3f; bank[offset] = data; z80_bank(offset, data); break; } + case 0x08: { flip_8 = data; break; } + case 9: + videomode = data; + break; + case 0x0B: { h_scroll = data; @@ -709,6 +913,20 @@ static WRITE8_HANDLER( chipset_w ) v_scroll = data; break; } + case 0x0E: + { + col4bit[5] = data; + col3bit[5] = data; + col3bit[5 + 8] = data; + break; + } + case 0x0f: + { + col4bit[6] = data; + col3bit[6] = data; + col3bit[6 + 8] = data; + break; + } case 0x18: { blitter.program.addr0 = data; @@ -731,7 +949,7 @@ static WRITE8_HANDLER( chipset_w ) if (data & CMD_RUN) RunBlit(); else - mame_printf_debug ("Blitter stopped by IO.\n"); + mame_printf_debug("Blitter stopped by IO.\n"); break; } @@ -905,7 +1123,7 @@ static READ8_HANDLER( fddata_r ) { fdc.byte_pos = 0; - if(fdc.sector == fdc.stop_track || ++fdc.sector == 11) + if (fdc.sector == fdc.stop_track || ++fdc.sector == 11) { /* End of read operation */ fdc.MSR = 0xd0; @@ -1032,7 +1250,7 @@ static void command_phase(UINT8 data) //mame_printf_debug(" %x\n",data); } - if(fdc.cmd_cnt == fdc.cmd_len) + if (fdc.cmd_cnt == fdc.cmd_len) { fdc.phase = fdc.next_phase; fdc.cmd_cnt = 0; @@ -1070,6 +1288,13 @@ WRITE8_HANDLER( fd_ctrl_w ) static MACHINE_RESET( bfcobra ) { + unsigned int pal; + + for (pal = 0; pal < 256; ++pal) + { + palette_set_color_rgb(Machine, pal, pal3bit((pal>>5)&7), pal3bit((pal>>2)&7), pal2bit(pal&3)); + } + bank[0] = 1; memset(&ramdac, 0, sizeof(ramdac)); reset_fdc(); @@ -1150,10 +1375,9 @@ static WRITE8_HANDLER( meter_w ) When a meter is triggered, the current drawn is sensed. If a meter is connected, the /FIRQ line will be pulsed. */ - - for (i = 0; i<8; i++) + for (i = 0; i < 8; i++) { - if ( changed & (1 << i) ) + if (changed & (1 << i)) { Mechmtr_update(i, cycles, data & (1 << i) ); cpunum_set_input_line(Machine, 1, M6809_FIRQ_LINE, PULSE_LINE ); @@ -1248,11 +1472,11 @@ static INPUT_PORTS_START( bfcobra ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START_TAG("STROBE1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("PASS") PORT_CODE(KEYCODE_A) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("CONTINUE") PORT_CODE(KEYCODE_S) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("COLLECT") PORT_CODE(KEYCODE_D) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("START") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("BONUS") PORT_CODE(KEYCODE_F) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Pass") PORT_CODE(KEYCODE_A) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Continue") PORT_CODE(KEYCODE_S) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Collect") PORT_CODE(KEYCODE_D) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Start") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bonus") PORT_CODE(KEYCODE_F) // PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) // PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) @@ -1510,11 +1734,11 @@ static MACHINE_DRIVER_START( bfcobra ) /* TODO */ MDRV_SCREEN_ADD("main", RASTER) - MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_REFRESH_RATE(50) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MDRV_SCREEN_SIZE(256, 256) - MDRV_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) + MDRV_SCREEN_SIZE(512, 256) + MDRV_SCREEN_VISIBLE_AREA(0, 512 - 1, 0, 256 - 1) MDRV_PALETTE_LENGTH(256) MDRV_SPEAKER_STANDARD_MONO("mono") @@ -1652,7 +1876,7 @@ ROM_START( qosb ) ROM_END GAME( 1989, inquiztr, 0, bfcobra, bfcobra, bfcobra, ROT0, "BFM", "Inquizitor", GAME_NOT_WORKING ) -GAME( 1990, escounts, 0, bfcobra, bfcobra, bfcobra, ROT0, "BFM", "Every Second Counts (39-360-053)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS ) +GAME( 1990, escounts, 0, bfcobra, bfcobra, bfcobra, ROT0, "BFM", "Every Second Counts (39-360-053)", GAME_IMPERFECT_GRAPHICS ) GAME( 1991, trebltop, 0, bfcobra, bfcobra, bfcobra, ROT0, "BFM", "Treble Top (39-360-070)", GAME_IMPERFECT_GRAPHICS ) GAME( 1991, beeline, 0, bfcobra, bfcobra, bfcobra, ROT0, "BFM", "Beeline (39-360-075)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS ) GAME( 1991, quizvadr, 0, bfcobra, bfcobra, bfcobra, ROT0, "BFM", "Quizvaders (39-360-078)", GAME_IMPERFECT_GRAPHICS )