Previous 15994 Revisions Next

r9785 Saturday 18th December, 2010 at 05:05:36 UTC by Nathan Woods
Converted gameboy to driver_device. [Atari Ace]
[src/mess/audio]gb.c gb.h*
[src/mess/drivers]gb.c gba.c pcw.c sapi1.c tx0.c
[src/mess/includes]cpschngr.h gb.h kc.h pcw.h sapi1.h
[src/mess/machine]gb.c kc.c
[src/mess/video]cpschngr.c gb.c

src/mess/audio/gb.c
r9784r9785
4040***************************************************************************************/
4141
4242#include "emu.h"
43#include "includes/gb.h"
4443#include "streams.h"
44#include "gb.h"
4545
4646
4747/***************************************************************************
src/mess/audio/gb.h
r0r9785
1DECLARE_LEGACY_SOUND_DEVICE(GAMEBOY, gameboy_sound);
2
3READ8_DEVICE_HANDLER( gb_sound_r );
4WRITE8_DEVICE_HANDLER( gb_sound_w );
5READ8_DEVICE_HANDLER( gb_wave_r );
6WRITE8_DEVICE_HANDLER( gb_wave_w );
src/mess/machine/gb.c
r9784r9785
3636#define __MACHINE_GB_C
3737
3838#include "emu.h"
39#include "includes/gb.h"
4039#include "cpu/lr35902/lr35902.h"
4140#include "devices/cartslot.h"
4241#include "devices/messram.h"
4342#include "image.h"
43#include "audio/gb.h"
44#include "includes/gb.h"
4445
4546/* Memory bank controller types */
4647enum {
r9784r9785
6667#define CGB_START_VRAM_BANKS   0x0000
6768#define CGB_START_RAM_BANKS   ( 2 * 8 * 1024 )
6869
69#define MAX_ROMBANK 512
70#define MAX_RAMBANK 256
70#define JOYPAD      state->gb_io[0x00]   /* Joystick: 1.1.P15.P14.P13.P12.P11.P10       */
71#define SIODATA      state->gb_io[0x01]   /* Serial IO data buffer                       */
72#define SIOCONT      state->gb_io[0x02]   /* Serial IO control register                  */
73#define DIVREG      state->gb_io[0x04]   /* Divider register (???)                      */
74#define TIMECNT      state->gb_io[0x05]   /* Timer counter. Gen. int. when it overflows  */
75#define TIMEMOD      state->gb_io[0x06]   /* New value of TimeCount after it overflows   */
76#define TIMEFRQ      state->gb_io[0x07]   /* Timer frequency and start/stop switch       */
7177
72#define JOYPAD      gb_driver_data.gb_io[0x00]   /* Joystick: 1.1.P15.P14.P13.P12.P11.P10       */
73#define SIODATA      gb_driver_data.gb_io[0x01]   /* Serial IO data buffer                       */
74#define SIOCONT      gb_driver_data.gb_io[0x02]   /* Serial IO control register                  */
75#define DIVREG      gb_driver_data.gb_io[0x04]   /* Divider register (???)                      */
76#define TIMECNT      gb_driver_data.gb_io[0x05]   /* Timer counter. Gen. int. when it overflows  */
77#define TIMEMOD      gb_driver_data.gb_io[0x06]   /* New value of TimeCount after it overflows   */
78#define TIMEFRQ      gb_driver_data.gb_io[0x07]   /* Timer frequency and start/stop switch       */
7978
80UINT8 *sgb_tile_data;
81UINT16 sgb_pal[128];   /* SGB palette remapping */
82UINT16 sgb_pal_data[4096];   /* 512 palettes of 4 colours            */
83UINT8 sgb_pal_map[20][18];   /* Palette tile map                     */
84UINT8 sgb_tile_map[2048];   /* 32x32 tile map data (0-tile,1-attribute) */
85UINT8 sgb_window_mask;      /* Current GB screen mask               */
86UINT8 sgb_hack;            /* Flag set if we're using a hack       */
8779
88
89typedef struct _gb_state gb_state;
90struct _gb_state {
91   UINT8      gb_io[0x10];
92
93   /* Timer related */
94   UINT16      divcount;
95   UINT8      shift;
96   UINT16      shift_cycles;
97   UINT8      triggering_irq;
98   UINT8      reloading;
99
100   /* Serial I/O related */
101   UINT32      SIOCount;            /* Serial I/O counter */
102   emu_timer   *gb_serial_timer;
103
104   /* SGB variables */
105   UINT8      sgb_atf_data[4050];      /* (SGB) Attributes files */
106
107   /* Cartridge/mapper */
108   UINT16      MBCType;            /* MBC type: 0 for none */
109   UINT8      CartType;            /* Cartridge type (battery, ram, rtc, etc) */
110   UINT8      *ROMMap[MAX_ROMBANK];   /* Addresses of ROM banks */
111   UINT16      ROMBank;            /* Index of ROM bank currently used at 4000-7fff */
112   UINT16      ROMBank00;            /* Index of ROM bank currently used at 0000-3fff */
113   UINT8      ROMMask;            /* Mask for the ROM bank number */
114   UINT16      ROMBanks;            /* Total number of ROM banks */
115   UINT8      *RAMMap[MAX_RAMBANK];   /* Addresses of RAM banks */
116   UINT8      RAMBank;            /* Number of RAM bank currently used */
117   UINT8      RAMMask;            /* Mask for the RAM bank number */
118   UINT8      RAMBanks;            /* Total number of RAM banks */
119   UINT8      MBC1Mode;            /* MBC1 ROM/RAM mode */
120   UINT8      *MBC3RTCData;         /* MBC3 RTC data */
121   UINT8      MBC3RTCMap[5];         /* MBC3 RTC banks */
122   UINT8      MBC3RTCBank;         /* MBC3 RTC bank */
123   UINT8      *GBC_RAMMap[8];         /* (CGB) Addresses of internal RAM banks */
124   UINT8      GBC_RAMBank;         /* (CGB) Current CGB RAM bank */
125   UINT8      gbTama5Memory[32];
126   UINT8      gbTama5Byte;
127   UINT8      gbTama5Address;
128   UINT8      gbLastTama5Command;
129   UINT8      *gb_cart;
130   UINT8      *gb_cart_ram;
131   UINT8      *gb_dummy_rom_bank;
132   UINT8      *gb_dummy_ram_bank;
133};
134
135static gb_state gb_driver_data;
136
13780/*
13881  Prototypes
13982*/
r9784r9785
172115
173116static void gb_init_regs(running_machine *machine)
174117{
118   gb_state *state = machine->driver_data<gb_state>();
175119   /* Initialize the registers */
176120   SIODATA = 0x00;
177121   SIOCONT = 0x7E;
r9784r9785
206150
207151static void gb_init(running_machine *machine)
208152{
153   gb_state *state = machine->driver_data<gb_state>();
209154   address_space *space = cputag_get_address_space( machine, "maincpu", ADDRESS_SPACE_PROGRAM );
210155
211156   /* Initialize the memory banks */
212   gb_driver_data.MBC1Mode = 0;
213   gb_driver_data.MBC3RTCBank = 0;
214   gb_driver_data.ROMBank = gb_driver_data.ROMBank00 + 1;
215   gb_driver_data.RAMBank = 0;
157   state->MBC1Mode = 0;
158   state->MBC3RTCBank = 0;
159   state->ROMBank = state->ROMBank00 + 1;
160   state->RAMBank = 0;
216161
217   if (gb_driver_data.gb_cart)
162   if (state->gb_cart)
218163   {
219      if ( gb_driver_data.MBCType != MBC_MEGADUCK )
164      if ( state->MBCType != MBC_MEGADUCK )
220165      {
221         gb_rom16_4000( machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank] );
222         memory_set_bankptr (machine, "bank2", gb_driver_data.RAMMap[gb_driver_data.RAMBank] ? gb_driver_data.RAMMap[gb_driver_data.RAMBank] : gb_driver_data.gb_dummy_ram_bank);
166         gb_rom16_4000( machine, state->ROMMap[state->ROMBank] );
167         memory_set_bankptr (machine, "bank2", state->RAMMap[state->RAMBank] ? state->RAMMap[state->RAMBank] : state->gb_dummy_ram_bank);
223168      }
224169      else
225170      {
226         memory_set_bankptr( machine, "bank1", gb_driver_data.ROMMap[gb_driver_data.ROMBank] );
227         memory_set_bankptr( machine, "bank10", gb_driver_data.ROMMap[0] );
171         memory_set_bankptr( machine, "bank1", state->ROMMap[state->ROMBank] );
172         memory_set_bankptr( machine, "bank10", state->ROMMap[0] );
228173      }
229174   }
230175
231176   /* Set handlers based on the Memory Bank Controller in the cart */
232   switch( gb_driver_data.MBCType )
177   switch( state->MBCType )
233178   {
234179      case MBC_NONE:
235180         break;
r9784r9785
292237
293238   gb_sound_w(space->machine->device("custom"), 0x16, 0x00 );       /* Initialize sound hardware */
294239
295   gb_driver_data.divcount = 0;
296   gb_driver_data.triggering_irq = 0;
297   gb_driver_data.gb_io[0x07] = 0xF8;      /* Upper bits of TIMEFRQ register are set to 1 */
240   state->divcount = 0;
241   state->triggering_irq = 0;
242   state->gb_io[0x07] = 0xF8;      /* Upper bits of TIMEFRQ register are set to 1 */
298243}
299244
300245MACHINE_START( gb )
301246{
247   gb_state *state = machine->driver_data<gb_state>();
302248   machine->add_notifier(MACHINE_NOTIFY_EXIT, gb_machine_stop);
303249
304250   /* Allocate the serial timer, and disable it */
305   gb_driver_data.gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
306   timer_enable( gb_driver_data.gb_serial_timer, 0 );
251   state->gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
252   timer_enable( state->gb_serial_timer, 0 );
307253
308254   MACHINE_START_CALL( gb_video );
309255}
310256
311257MACHINE_START( gbc )
312258{
259   gb_state *state = machine->driver_data<gb_state>();
313260   machine->add_notifier(MACHINE_NOTIFY_EXIT, gb_machine_stop);
314261
315262   /* Allocate the serial timer, and disable it */
316   gb_driver_data.gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
317   timer_enable( gb_driver_data.gb_serial_timer, 0 );
263   state->gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
264   timer_enable( state->gb_serial_timer, 0 );
318265
319266   MACHINE_START_CALL( gbc_video );
320267}
321268
322269MACHINE_RESET( gb )
323270{
271   gb_state *state = machine->driver_data<gb_state>();
324272   gb_init(machine);
325273
326274   gb_video_reset( machine, GB_VIDEO_DMG );
327275
328   gb_rom16_0000( machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank00] );
276   gb_rom16_0000( machine, state->ROMMap[state->ROMBank00] );
329277
330278   /* Enable BIOS rom */
331279   memory_set_bankptr(machine, "bank5", memory_region(machine, "maincpu") );
332280
333   gb_driver_data.divcount = 0x0004;
281   state->divcount = 0x0004;
334282}
335283
336284
337285MACHINE_START( sgb )
338286{
339   sgb_tile_data = auto_alloc_array_clear(machine, UINT8, 0x2000 );
287   gb_state *state = machine->driver_data<gb_state>();
288   state->sgb_tile_data = auto_alloc_array_clear(machine, UINT8, 0x2000 );
340289
341290   machine->add_notifier(MACHINE_NOTIFY_EXIT, gb_machine_stop);
342291
343292   /* Allocate the serial timer, and disable it */
344   gb_driver_data.gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
345   timer_enable( gb_driver_data.gb_serial_timer, 0 );
293   state->gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
294   timer_enable( state->gb_serial_timer, 0 );
346295
347296   MACHINE_START_CALL( gb_video );
348297}
349298
350299MACHINE_RESET( sgb )
351300{
301   gb_state *state = machine->driver_data<gb_state>();
352302   gb_init(machine);
353303
354304   gb_video_reset( machine, GB_VIDEO_SGB );
355305
356306   gb_init_regs(machine);
357307
358   gb_rom16_0000( machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank00] ? gb_driver_data.ROMMap[gb_driver_data.ROMBank00] : gb_driver_data.gb_dummy_rom_bank );
308   gb_rom16_0000( machine, state->ROMMap[state->ROMBank00] ? state->ROMMap[state->ROMBank00] : state->gb_dummy_rom_bank );
359309
360310   /* Enable BIOS rom */
361311   memory_set_bankptr(machine, "bank5", memory_region(machine, "maincpu") );
362312
363   memset( sgb_tile_data, 0, 0x2000 );
313   memset( state->sgb_tile_data, 0, 0x2000 );
364314
365   sgb_window_mask = 0;
366   memset( sgb_pal_map, 0, sizeof(sgb_pal_map) );
367   memset( gb_driver_data.sgb_atf_data, 0, sizeof(gb_driver_data.sgb_atf_data) );
315   state->sgb_window_mask = 0;
316   memset( state->sgb_pal_map, 0, sizeof(state->sgb_pal_map) );
317   memset( state->sgb_atf_data, 0, sizeof(state->sgb_atf_data) );
368318
369319   /* HACKS for Donkey Kong Land 2 + 3.
370320       For some reason that I haven't figured out, they store the tile
371321       data differently.  Hacks will go once I figure it out */
372   sgb_hack = 0;
322   state->sgb_hack = 0;
373323
374   if (gb_driver_data.gb_cart)   // make sure cart is in
324   if (state->gb_cart)   // make sure cart is in
375325   {
376      if( strncmp( (const char*)(gb_driver_data.gb_cart + 0x134), "DONKEYKONGLAND 2", 16 ) == 0 ||
377         strncmp( (const char*)(gb_driver_data.gb_cart + 0x134), "DONKEYKONGLAND 3", 16 ) == 0 )
378            sgb_hack = 1;
326      if( strncmp( (const char*)(state->gb_cart + 0x134), "DONKEYKONGLAND 2", 16 ) == 0 ||
327         strncmp( (const char*)(state->gb_cart + 0x134), "DONKEYKONGLAND 3", 16 ) == 0 )
328            state->sgb_hack = 1;
379329   }
380330
381   gb_driver_data.divcount = 0x0004;
331   state->divcount = 0x0004;
382332}
383333
384334MACHINE_RESET( gbpocket )
385335{
336   gb_state *state = machine->driver_data<gb_state>();
386337   gb_init(machine);
387338
388339   gb_video_reset( machine, GB_VIDEO_MGB );
r9784r9785
395346   gb_sound_w(machine->device("custom"), 0x14,0x77);
396347
397348   /* Enable BIOS rom if we have one */
398   gb_rom16_0000( machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank00] ? gb_driver_data.ROMMap[gb_driver_data.ROMBank00] : gb_driver_data.gb_dummy_rom_bank );
349   gb_rom16_0000( machine, state->ROMMap[state->ROMBank00] ? state->ROMMap[state->ROMBank00] : state->gb_dummy_rom_bank );
399350
400   gb_driver_data.divcount = 0xABC8;
351   state->divcount = 0xABC8;
401352}
402353
403354MACHINE_RESET( gbc )
404355{
356   gb_state *state = machine->driver_data<gb_state>();
405357   int ii;
406358
407359   gb_init(machine);
r9784r9785
410362
411363   gb_init_regs(machine);
412364
413   gb_rom16_0000( machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank00] ? gb_driver_data.ROMMap[gb_driver_data.ROMBank00] : gb_driver_data.gb_dummy_rom_bank );
365   gb_rom16_0000( machine, state->ROMMap[state->ROMBank00] ? state->ROMMap[state->ROMBank00] : state->gb_dummy_rom_bank );
414366
415367   /* Enable BIOS rom */
416368   memory_set_bankptr(machine, "bank5", memory_region(machine, "maincpu") );
r9784r9785
419371   /* Allocate memory for internal ram */
420372   for( ii = 0; ii < 8; ii++ )
421373   {
422      gb_driver_data.GBC_RAMMap[ii] = messram_get_ptr(machine->device("messram")) + CGB_START_RAM_BANKS + ii * 0x1000;
423      memset (gb_driver_data.GBC_RAMMap[ii], 0, 0x1000);
374      state->GBC_RAMMap[ii] = messram_get_ptr(machine->device("messram")) + CGB_START_RAM_BANKS + ii * 0x1000;
375      memset (state->GBC_RAMMap[ii], 0, 0x1000);
424376   }
425377}
426378
427379static void gb_machine_stop(running_machine &machine)
428380{
381   gb_state *state = machine.driver_data<gb_state>();
429382   /* Don't save if there was no battery */
430   if(!(gb_driver_data.CartType & BATTERY) || !gb_driver_data.RAMBanks)
383   if(!(state->CartType & BATTERY) || !state->RAMBanks)
431384      return;
432385
433386   /* NOTE: The reason we save the carts RAM this way instead of using MAME's
434387       built in macros is because they force the filename to be the name of
435388       the machine.  We need to have a separate name for each game. */
436389   device_image_interface *image = dynamic_cast<device_image_interface *>(machine.device("cart"));
437   image->battery_save(gb_driver_data.gb_cart_ram, gb_driver_data.RAMBanks * 0x2000);
390   image->battery_save(state->gb_cart_ram, state->RAMBanks * 0x2000);
438391}
439392
440393static void gb_set_mbc1_banks( running_machine *machine )
441394{
442   gb_rom16_4000( machine, gb_driver_data.ROMMap[ gb_driver_data.ROMBank ] );
443   memory_set_bankptr( machine, "bank2", gb_driver_data.RAMMap[ gb_driver_data.MBC1Mode ? ( gb_driver_data.ROMBank >> 5 ) : 0 ] );
395   gb_state *state = machine->driver_data<gb_state>();
396   gb_rom16_4000( machine, state->ROMMap[ state->ROMBank ] );
397   memory_set_bankptr( machine, "bank2", state->RAMMap[ state->MBC1Mode ? ( state->ROMBank >> 5 ) : 0 ] );
444398}
445399
446400static WRITE8_HANDLER( gb_rom_bank_select_mbc1 )
447401{
402   gb_state *state = space->machine->driver_data<gb_state>();
448403   data &= 0x1F; /* Only uses lower 5 bits */
449404   /* Selecting bank 0 == selecting bank 1 */
450405   if( data == 0 )
451406      data = 1;
452407
453   gb_driver_data.ROMBank = ( gb_driver_data.ROMBank & 0x01E0 ) | data;
408   state->ROMBank = ( state->ROMBank & 0x01E0 ) | data;
454409   /* Switch banks */
455410   gb_set_mbc1_banks( space->machine );
456411}
457412
458413static WRITE8_HANDLER( gb_rom_bank_select_mbc2 )
459414{
415   gb_state *state = space->machine->driver_data<gb_state>();
460416   data &= 0x0F; /* Only uses lower 4 bits */
461417   /* Selecting bank 0 == selecting bank 1 */
462418   if( data == 0 )
r9784r9785
464420
465421   /* The least significant bit of the upper address byte must be 1 */
466422   if( offset & 0x0100 )
467      gb_driver_data.ROMBank = ( gb_driver_data.ROMBank & 0x100 ) | data;
423      state->ROMBank = ( state->ROMBank & 0x100 ) | data;
468424   /* Switch banks */
469   gb_rom16_4000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank] );
425   gb_rom16_4000( space->machine, state->ROMMap[state->ROMBank] );
470426}
471427
472428static WRITE8_HANDLER( gb_rom_bank_select_mbc3 )
473429{
430   gb_state *state = space->machine->driver_data<gb_state>();
474431   logerror( "0x%04X: write to mbc3 rom bank select register 0x%04X <- 0x%02X\n", cpu_get_pc( space->cpu ), offset, data );
475432   data &= 0x7F; /* Only uses lower 7 bits */
476433   /* Selecting bank 0 == selecting bank 1 */
477434   if( data == 0 )
478435      data = 1;
479436
480   gb_driver_data.ROMBank = ( gb_driver_data.ROMBank & 0x0100 ) | data;
437   state->ROMBank = ( state->ROMBank & 0x0100 ) | data;
481438   /* Switch banks */
482   gb_rom16_4000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank] );
439   gb_rom16_4000( space->machine, state->ROMMap[state->ROMBank] );
483440}
484441
485442static WRITE8_HANDLER( gb_rom_bank_select_mbc5 )
486443{
444   gb_state *state = space->machine->driver_data<gb_state>();
487445   /* MBC5 has a 9 bit bank select
488446      Writing into 2000-2FFF sets the lower 8 bits
489447      Writing into 3000-3FFF sets the 9th bit
r9784r9785
491449   logerror( "0x%04X: MBC5 ROM Bank select write 0x%04X <- 0x%02X\n", cpu_get_pc( space->cpu ), offset, data );
492450   if( offset & 0x1000 )
493451   {
494      gb_driver_data.ROMBank = (gb_driver_data.ROMBank & 0xFF ) | ( ( data & 0x01 ) << 8 );
452      state->ROMBank = (state->ROMBank & 0xFF ) | ( ( data & 0x01 ) << 8 );
495453   }
496454   else
497455   {
498      gb_driver_data.ROMBank = (gb_driver_data.ROMBank & 0x100 ) | data;
456      state->ROMBank = (state->ROMBank & 0x100 ) | data;
499457   }
500458   /* Switch banks */
501   gb_rom16_4000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank] );
459   gb_rom16_4000( space->machine, state->ROMMap[state->ROMBank] );
502460}
503461
504462static WRITE8_HANDLER( gb_ram_bank_select_mbc6 )
r9784r9785
508466
509467static WRITE8_HANDLER( gb_rom_bank_select_mbc6_1 )
510468{
469   gb_state *state = space->machine->driver_data<gb_state>();
511470   logerror( "0x%04X: write to mbc6 rom area: 0x%04X <- 0x%02X\n", cpu_get_pc( space->cpu ), 0x2000 + offset, data );
512471   if ( offset & 0x0800 )
513472   {
514473      if ( data == 0x00 )
515474      {
516         gb_rom8_4000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank>>1] + ( ( gb_driver_data.ROMBank & 0x01 ) ? 0x2000 : 0x0000 ) );
475         gb_rom8_4000( space->machine, state->ROMMap[state->ROMBank>>1] + ( ( state->ROMBank & 0x01 ) ? 0x2000 : 0x0000 ) );
517476      }
518477   }
519478   else
520479   {
521      gb_driver_data.ROMBank = data;
480      state->ROMBank = data;
522481   }
523482}
524483
525484static WRITE8_HANDLER( gb_rom_bank_select_mbc6_2 )
526485{
486   gb_state *state = space->machine->driver_data<gb_state>();
527487   logerror( "0x%04X: write to mbc6 rom area: 0x%04X <- 0x%02X\n", cpu_get_pc( space->cpu ), 0x3000 + offset, data );
528488   if ( offset & 0x0800 )
529489   {
530490      if ( data == 0x00 )
531491      {
532         gb_rom8_6000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank00>>1] + ( ( gb_driver_data.ROMBank00 & 0x01 ) ? 0x2000 : 0x0000 ) );
492         gb_rom8_6000( space->machine, state->ROMMap[state->ROMBank00>>1] + ( ( state->ROMBank00 & 0x01 ) ? 0x2000 : 0x0000 ) );
533493      }
534494   }
535495   else
536496   {
537      gb_driver_data.ROMBank00 = data;
497      state->ROMBank00 = data;
538498   }
539499}
540500
541501static WRITE8_HANDLER( gb_rom_bank_select_mbc7 )
542502{
503   gb_state *state = space->machine->driver_data<gb_state>();
543504   logerror( "0x%04X: write to mbc7 rom select register: 0x%04X <- 0x%02X\n", cpu_get_pc( space->cpu ), 0x2000 + offset, data );
544505   /* Bit 12 must be set for writing to the mbc register */
545506   if ( offset & 0x0100 )
546507   {
547      gb_driver_data.ROMBank = data;
548      gb_rom16_4000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank] );
508      state->ROMBank = data;
509      gb_rom16_4000( space->machine, state->ROMMap[state->ROMBank] );
549510   }
550511}
551512
r9784r9785
569530
570531static WRITE8_HANDLER( gb_rom_bank_select_wisdom )
571532{
533   gb_state *state = space->machine->driver_data<gb_state>();
572534   logerror( "0x%04X: wisdom tree mapper write to address 0x%04X\n", cpu_get_pc( space->cpu ), offset );
573535   /* The address determines the bank to select */
574   gb_driver_data.ROMBank = ( offset << 1 ) & 0x1FF;
575   memory_set_bankptr( space->machine, "bank5", gb_driver_data.ROMMap[ gb_driver_data.ROMBank ] );
576   memory_set_bankptr( space->machine, "bank10", gb_driver_data.ROMMap[ gb_driver_data.ROMBank ] + 0x0100 );
577   gb_rom16_4000( space->machine, gb_driver_data.ROMMap[ gb_driver_data.ROMBank + 1 ] );
536   state->ROMBank = ( offset << 1 ) & 0x1FF;
537   memory_set_bankptr( space->machine, "bank5", state->ROMMap[ state->ROMBank ] );
538   memory_set_bankptr( space->machine, "bank10", state->ROMMap[ state->ROMBank ] + 0x0100 );
539   gb_rom16_4000( space->machine, state->ROMMap[ state->ROMBank + 1 ] );
578540}
579541
580542static WRITE8_HANDLER( gb_ram_bank_select_mbc1 )
581543{
544   gb_state *state = space->machine->driver_data<gb_state>();
582545   data &= 0x3; /* Only uses the lower 2 bits */
583546
584547   /* Select the upper bits of the ROMMask */
585   gb_driver_data.ROMBank = ( gb_driver_data.ROMBank & 0x1F ) | ( data << 5 );
548   state->ROMBank = ( state->ROMBank & 0x1F ) | ( data << 5 );
586549
587550   /* Switch banks */
588551   gb_set_mbc1_banks( space->machine );
r9784r9785
590553
591554static WRITE8_HANDLER( gb_ram_bank_select_mbc3 )
592555{
556   gb_state *state = space->machine->driver_data<gb_state>();
593557   logerror( "0x%04X: write mbc3 ram bank select register 0x%04X <- 0x%02X\n", cpu_get_pc( space->cpu ), offset, data );
594558   if( data & 0x8 )
595559   {   /* RTC banks */
596      if ( gb_driver_data.CartType & TIMER )
560      if ( state->CartType & TIMER )
597561      {
598         gb_driver_data.MBC3RTCBank = data & 0x07;
562         state->MBC3RTCBank = data & 0x07;
599563         if ( data < 5 )
600564         {
601            memset( gb_driver_data.MBC3RTCData, gb_driver_data.MBC3RTCMap[gb_driver_data.MBC3RTCBank], 0x2000 );
602            memory_set_bankptr( space->machine, "bank2", gb_driver_data.MBC3RTCData );
565            memset( state->MBC3RTCData, state->MBC3RTCMap[state->MBC3RTCBank], 0x2000 );
566            memory_set_bankptr( space->machine, "bank2", state->MBC3RTCData );
603567         }
604568      }
605569   }
606570   else
607571   {   /* RAM banks */
608      gb_driver_data.RAMBank = data & 0x3;
609      gb_driver_data.MBC3RTCBank = 0xFF;
572      state->RAMBank = data & 0x3;
573      state->MBC3RTCBank = 0xFF;
610574      /* Switch banks */
611      memory_set_bankptr( space->machine, "bank2", gb_driver_data.RAMMap[gb_driver_data.RAMBank] );
575      memory_set_bankptr( space->machine, "bank2", state->RAMMap[state->RAMBank] );
612576   }
613577}
614578
615579static WRITE8_HANDLER( gb_ram_bank_select_mbc5 )
616580{
581   gb_state *state = space->machine->driver_data<gb_state>();
617582   logerror( "0x%04X: MBC5 RAM Bank select write 0x%04X <- 0x%02X\n", cpu_get_pc( space->cpu ), offset, data );
618583   data &= 0x0F;
619   if( gb_driver_data.CartType & RUMBLE )
584   if( state->CartType & RUMBLE )
620585   {
621586      data &= 0x7;
622587   }
623   gb_driver_data.RAMBank = data;
588   state->RAMBank = data;
624589   /* Switch banks */
625   memory_set_bankptr (space->machine, "bank2", gb_driver_data.RAMMap[gb_driver_data.RAMBank] );
590   memory_set_bankptr (space->machine, "bank2", state->RAMMap[state->RAMBank] );
626591}
627592
628593WRITE8_HANDLER ( gb_ram_enable )
r9784r9785
634599
635600static WRITE8_HANDLER( gb_mem_mode_select_mbc1 )
636601{
637   gb_driver_data.MBC1Mode = data & 0x1;
602   gb_state *state = space->machine->driver_data<gb_state>();
603   state->MBC1Mode = data & 0x1;
638604   gb_set_mbc1_banks( space->machine );
639605}
640606
641607static WRITE8_HANDLER( gb_mem_mode_select_mbc3 )
642608{
609   gb_state *state = space->machine->driver_data<gb_state>();
643610        logerror( "0x%04X: Write to mbc3 mem mode select register 0x%04X <- 0x%02X\n", cpu_get_pc( space->cpu ), offset, data );
644   if( gb_driver_data.CartType & TIMER )
611   if( state->CartType & TIMER )
645612   {
646613      /* FIXME: RTC Latch goes here */
647      gb_driver_data.MBC3RTCMap[0] = 50;    /* Seconds */
648      gb_driver_data.MBC3RTCMap[1] = 40;    /* Minutes */
649      gb_driver_data.MBC3RTCMap[2] = 15;    /* Hours */
650      gb_driver_data.MBC3RTCMap[3] = 25;    /* Day counter lowest 8 bits */
651      gb_driver_data.MBC3RTCMap[4] = 0x01;  /* Day counter upper bit, timer off, no day overflow occured (bit7) */
614      state->MBC3RTCMap[0] = 50;    /* Seconds */
615      state->MBC3RTCMap[1] = 40;    /* Minutes */
616      state->MBC3RTCMap[2] = 15;    /* Hours */
617      state->MBC3RTCMap[3] = 25;    /* Day counter lowest 8 bits */
618      state->MBC3RTCMap[4] = 0x01;  /* Day counter upper bit, timer off, no day overflow occured (bit7) */
652619   }
653620}
654621
655622static WRITE8_HANDLER( gb_ram_tama5 )
656623{
624   gb_state *state = space->machine->driver_data<gb_state>();
657625   logerror( "0x%04X: TAMA5 write 0x%04X <- 0x%02X\n", cpu_get_pc( space->cpu ), 0xA000 + offset, data );
658626   switch( offset & 0x0001 )
659627   {
660628   case 0x0000:    /* Write to data register */
661      switch( gb_driver_data.gbLastTama5Command )
629      switch( state->gbLastTama5Command )
662630      {
663631      case 0x00:      /* Bits 0-3 for rom bank selection */
664         gb_driver_data.ROMBank = ( gb_driver_data.ROMBank & 0xF0 ) | ( data & 0x0F );
665         gb_rom16_4000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank] );
632         state->ROMBank = ( state->ROMBank & 0xF0 ) | ( data & 0x0F );
633         gb_rom16_4000( space->machine, state->ROMMap[state->ROMBank] );
666634         break;
667635      case 0x01:      /* Bit 4(-7?) for rom bank selection */
668         gb_driver_data.ROMBank = ( gb_driver_data.ROMBank & 0x0F ) | ( ( data & 0x0F ) << 4 );
669         gb_rom16_4000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank] );
636         state->ROMBank = ( state->ROMBank & 0x0F ) | ( ( data & 0x0F ) << 4 );
637         gb_rom16_4000( space->machine, state->ROMMap[state->ROMBank] );
670638         break;
671639      case 0x04:      /* Data to write lo */
672         gb_driver_data.gbTama5Byte = ( gb_driver_data.gbTama5Byte & 0xF0 ) | ( data & 0x0F );
640         state->gbTama5Byte = ( state->gbTama5Byte & 0xF0 ) | ( data & 0x0F );
673641         break;
674642      case 0x05:      /* Data to write hi */
675         gb_driver_data.gbTama5Byte = ( gb_driver_data.gbTama5Byte & 0x0F ) | ( ( data & 0x0F ) << 4 );
643         state->gbTama5Byte = ( state->gbTama5Byte & 0x0F ) | ( ( data & 0x0F ) << 4 );
676644         break;
677645      case 0x06:      /* Address selection hi */
678         gb_driver_data.gbTama5Address = ( gb_driver_data.gbTama5Address & 0x0F ) | ( ( data & 0x0F ) << 4 );
646         state->gbTama5Address = ( state->gbTama5Address & 0x0F ) | ( ( data & 0x0F ) << 4 );
679647         break;
680648      case 0x07:      /* Address selection lo */
681649            /* This address always seems to written last, so we'll just
682650                   execute the command here */
683         gb_driver_data.gbTama5Address = ( gb_driver_data.gbTama5Address & 0xF0 ) | ( data & 0x0F );
684         switch ( gb_driver_data.gbTama5Address & 0xE0 )
651         state->gbTama5Address = ( state->gbTama5Address & 0xF0 ) | ( data & 0x0F );
652         switch ( state->gbTama5Address & 0xE0 )
685653         {
686654         case 0x00:      /* Write memory */
687            logerror( "Write tama5 memory 0x%02X <- 0x%02X\n", gb_driver_data.gbTama5Address & 0x1F, gb_driver_data.gbTama5Byte );
688            gb_driver_data.gbTama5Memory[ gb_driver_data.gbTama5Address & 0x1F ] = gb_driver_data.gbTama5Byte;
655            logerror( "Write tama5 memory 0x%02X <- 0x%02X\n", state->gbTama5Address & 0x1F, state->gbTama5Byte );
656            state->gbTama5Memory[ state->gbTama5Address & 0x1F ] = state->gbTama5Byte;
689657            break;
690658         case 0x20:      /* Read memory */
691            logerror( "Read tama5 memory 0x%02X\n", gb_driver_data.gbTama5Address & 0x1F );
692            gb_driver_data.gbTama5Byte = gb_driver_data.gbTama5Memory[ gb_driver_data.gbTama5Address & 0x1F ];
659            logerror( "Read tama5 memory 0x%02X\n", state->gbTama5Address & 0x1F );
660            state->gbTama5Byte = state->gbTama5Memory[ state->gbTama5Address & 0x1F ];
693661            break;
694662         case 0x40:      /* Unknown, some kind of read */
695            if ( ( gb_driver_data.gbTama5Address & 0x1F ) == 0x12 )
663            if ( ( state->gbTama5Address & 0x1F ) == 0x12 )
696664            {
697               gb_driver_data.gbTama5Byte = 0xFF;
665               state->gbTama5Byte = 0xFF;
698666            }
699667         case 0x80:      /* Unknown, some kind of read (when 07=01)/write (when 07=00/02) */
700668         default:
r9784r9785
715683      case 0x07:      /* Address register lo */
716684         break;
717685      case 0x0A:      /* Are we ready for the next command? */
718         gb_driver_data.MBC3RTCData[0] = 0x01;
719         memory_set_bankptr( space->machine, "bank2", gb_driver_data.MBC3RTCData );
686         state->MBC3RTCData[0] = 0x01;
687         memory_set_bankptr( space->machine, "bank2", state->MBC3RTCData );
720688         break;
721689      case 0x0C:      /* Data read register lo */
722         gb_driver_data.MBC3RTCData[0] = gb_driver_data.gbTama5Byte & 0x0F;
690         state->MBC3RTCData[0] = state->gbTama5Byte & 0x0F;
723691         break;
724692      case 0x0D:      /* Data read register hi */
725         gb_driver_data.MBC3RTCData[0] = ( gb_driver_data.gbTama5Byte & 0xF0 ) >> 4;
693         state->MBC3RTCData[0] = ( state->gbTama5Byte & 0xF0 ) >> 4;
726694         break;
727695      default:
728696         logerror( "0x%04X: Unknown tama5 command 0x%02X\n", cpu_get_pc( space->cpu ), data );
729697         break;
730698      }
731      gb_driver_data.gbLastTama5Command = data;
699      state->gbLastTama5Command = data;
732700      break;
733701   }
734702}
735703
736704/* This mmm01 implementation is mostly guess work, no clue how correct it all is */
737705
738static UINT8 mmm01_bank_offset;
739static UINT8 mmm01_reg1;
740static UINT8 mmm01_bank;
741static UINT8 mmm01_bank_mask;
742706
743707static WRITE8_HANDLER( gb_rom_bank_mmm01_0000_w )
744708{
709   gb_state *state = space->machine->driver_data<gb_state>();
745710   logerror( "0x%04X: write 0x%02X to 0x%04X\n", cpu_get_pc( space->cpu ), data, offset+0x000 );
746711   if ( data & 0x40 )
747712   {
748      mmm01_bank_offset = mmm01_reg1;
749      memory_set_bankptr( space->machine, "bank5", gb_driver_data.ROMMap[ mmm01_bank_offset ] );
750      memory_set_bankptr( space->machine, "bank10", gb_driver_data.ROMMap[ mmm01_bank_offset ] + 0x0100 );
751      gb_rom16_4000( space->machine, gb_driver_data.ROMMap[ mmm01_bank_offset + mmm01_bank ] );
713      state->mmm01_bank_offset = state->mmm01_reg1;
714      memory_set_bankptr( space->machine, "bank5", state->ROMMap[ state->mmm01_bank_offset ] );
715      memory_set_bankptr( space->machine, "bank10", state->ROMMap[ state->mmm01_bank_offset ] + 0x0100 );
716      gb_rom16_4000( space->machine, state->ROMMap[ state->mmm01_bank_offset + state->mmm01_bank ] );
752717   }
753718}
754719
755720static WRITE8_HANDLER( gb_rom_bank_mmm01_2000_w )
756721{
722   gb_state *state = space->machine->driver_data<gb_state>();
757723   logerror( "0x%04X: write 0x%02X to 0x%04X\n", cpu_get_pc( space->cpu ), data, offset+0x2000 );
758724
759   mmm01_reg1 = data & gb_driver_data.ROMMask;
760   mmm01_bank = mmm01_reg1 & mmm01_bank_mask;
761   if ( mmm01_bank == 0 )
725   state->mmm01_reg1 = data & state->ROMMask;
726   state->mmm01_bank = state->mmm01_reg1 & state->mmm01_bank_mask;
727   if ( state->mmm01_bank == 0 )
762728   {
763      mmm01_bank = 1;
729      state->mmm01_bank = 1;
764730   }
765   gb_rom16_4000( space->machine, gb_driver_data.ROMMap[ mmm01_bank_offset + mmm01_bank ] );
731   gb_rom16_4000( space->machine, state->ROMMap[ state->mmm01_bank_offset + state->mmm01_bank ] );
766732}
767733
768734static WRITE8_HANDLER( gb_rom_bank_mmm01_4000_w )
r9784r9785
772738
773739static WRITE8_HANDLER( gb_rom_bank_mmm01_6000_w )
774740{
741   gb_state *state = space->machine->driver_data<gb_state>();
775742   logerror( "0x%04X: write 0x%02X to 0x%04X\n", cpu_get_pc( space->cpu ), data, offset+0x6000 );
776743   /* Not sure if this is correct, Taito Variety Pack sets these values */
777744   /* Momotarou Collection 2 writes 01 and 21 here */
778745   switch( data )
779746   {
780   case 0x30:   mmm01_bank_mask = 0x07;   break;
781   case 0x38:   mmm01_bank_mask = 0x03;   break;
782   default:   mmm01_bank_mask = 0xFF; break;
747   case 0x30:   state->mmm01_bank_mask = 0x07;   break;
748   case 0x38:   state->mmm01_bank_mask = 0x03;   break;
749   default:   state->mmm01_bank_mask = 0xFF; break;
783750   }
784751}
785752
r9784r9785
787754
788755static void gb_set_mbc1_kor_banks( running_machine *machine )
789756{
790   if ( gb_driver_data.ROMBank & 0x30 )
757   gb_state *state = machine->driver_data<gb_state>();
758   if ( state->ROMBank & 0x30 )
791759   {
792      gb_rom16_0000( machine, gb_driver_data.ROMMap[ gb_driver_data.ROMBank & 0x30 ] );
760      gb_rom16_0000( machine, state->ROMMap[ state->ROMBank & 0x30 ] );
793761   }
794   gb_rom16_4000( machine, gb_driver_data.ROMMap[ gb_driver_data.ROMBank ] );
795   memory_set_bankptr( machine, "bank2", gb_driver_data.RAMMap[ gb_driver_data.MBC1Mode ? ( gb_driver_data.ROMBank >> 5 ) : 0 ] );
762   gb_rom16_4000( machine, state->ROMMap[ state->ROMBank ] );
763   memory_set_bankptr( machine, "bank2", state->RAMMap[ state->MBC1Mode ? ( state->ROMBank >> 5 ) : 0 ] );
796764}
797765
798766static WRITE8_HANDLER( gb_rom_bank_select_mbc1_kor )
799767{
768   gb_state *state = space->machine->driver_data<gb_state>();
800769   data &= 0x0F; /* Only uses lower 5 bits */
801770   /* Selecting bank 0 == selecting bank 1 */
802771   if( data == 0 )
803772      data = 1;
804773
805   gb_driver_data.ROMBank = ( gb_driver_data.ROMBank & 0x01F0 ) | data;
774   state->ROMBank = ( state->ROMBank & 0x01F0 ) | data;
806775   /* Switch banks */
807776   gb_set_mbc1_kor_banks( space->machine );
808777}
809778
810779static WRITE8_HANDLER( gb_ram_bank_select_mbc1_kor )
811780{
781   gb_state *state = space->machine->driver_data<gb_state>();
812782   data &= 0x3; /* Only uses the lower 2 bits */
813783
814784   /* Select the upper bits of the ROMMask */
815   gb_driver_data.ROMBank = ( gb_driver_data.ROMBank & 0x0F ) | ( data << 4 );
785   state->ROMBank = ( state->ROMBank & 0x0F ) | ( data << 4 );
816786
817787   /* Switch banks */
818788   gb_set_mbc1_kor_banks( space->machine );
r9784r9785
820790
821791static WRITE8_HANDLER( gb_mem_mode_select_mbc1_kor )
822792{
823   gb_driver_data.MBC1Mode = data & 0x1;
793   gb_state *state = space->machine->driver_data<gb_state>();
794   state->MBC1Mode = data & 0x1;
824795   gb_set_mbc1_kor_banks( space->machine );
825796}
826797
827798WRITE8_HANDLER ( gb_io_w )
828799{
800   gb_state *state = space->machine->driver_data<gb_state>();
829801   static const UINT8 timer_shifts[4] = {10, 4, 6, 8};
830802
831803   switch (offset)
r9784r9785
845817      case 0x00:
846818      case 0x01:
847819      case 0x80:            /* enabled & external clock */
848         gb_driver_data.SIOCount = 0;
820         state->SIOCount = 0;
849821         break;
850822      case 0x81:            /* enabled & internal clock */
851823         SIODATA = 0xFF;
852         gb_driver_data.SIOCount = 8;
853         timer_adjust_periodic(gb_driver_data.gb_serial_timer, space->machine->device<cpu_device>("maincpu")->cycles_to_attotime(512), 0, space->machine->device<cpu_device>("maincpu")->cycles_to_attotime(512));
854         timer_enable( gb_driver_data.gb_serial_timer, 1 );
824         state->SIOCount = 8;
825         timer_adjust_periodic(state->gb_serial_timer, space->machine->device<cpu_device>("maincpu")->cycles_to_attotime(512), 0, space->machine->device<cpu_device>("maincpu")->cycles_to_attotime(512));
826         timer_enable( state->gb_serial_timer, 1 );
855827         break;
856828      }
857829      break;
858830   case 0x04:                  /* DIV - Divider register */
859831      /* Force increment of TIMECNT register */
860      if ( gb_driver_data.divcount >= 16 )
832      if ( state->divcount >= 16 )
861833         gb_timer_increment(space->machine);
862      gb_driver_data.divcount = 0;
834      state->divcount = 0;
863835      return;
864836   case 0x05:                  /* TIMA - Timer counter */
865837      /* Check if the counter is being reloaded in this cycle */
866      if ( gb_driver_data.reloading && ( gb_driver_data.divcount & ( gb_driver_data.shift_cycles - 1 ) ) == 4 )
838      if ( state->reloading && ( state->divcount & ( state->shift_cycles - 1 ) ) == 4 )
867839      {
868840         data = TIMECNT;
869841      }
870842      break;
871843   case 0x06:                  /* TMA - Timer module */
872844      /* Check if the counter is being reloaded in this cycle */
873      if ( gb_driver_data.reloading && ( gb_driver_data.divcount & ( gb_driver_data.shift_cycles - 1 ) ) == 4 )
845      if ( state->reloading && ( state->divcount & ( state->shift_cycles - 1 ) ) == 4 )
874846      {
875847         TIMECNT = data;
876848      }
r9784r9785
881853      if ( ( ! ( data & 0x04 ) && ( TIMEFRQ & 0x04 ) ) || ( ( data & 0x04 ) && ( TIMEFRQ & 0x04 ) && ( data & 0x03 ) != ( TIMEFRQ & 0x03 ) ) )
882854      {
883855         /* Check if TIMECNT should be incremented */
884         if ( ( gb_driver_data.divcount & ( gb_driver_data.shift_cycles - 1 ) ) >= ( gb_driver_data.shift_cycles >> 1 ) )
856         if ( ( state->divcount & ( state->shift_cycles - 1 ) ) >= ( state->shift_cycles >> 1 ) )
885857         {
886858            gb_timer_increment(space->machine);
887859         }
888860      }
889      gb_driver_data.shift = timer_shifts[data & 0x03];
890      gb_driver_data.shift_cycles = 1 << gb_driver_data.shift;
861      state->shift = timer_shifts[data & 0x03];
862      state->shift_cycles = 1 << state->shift;
891863      break;
892864   case 0x0F:                  /* IF - Interrupt flag */
893865      data &= 0x1F;
r9784r9785
895867      break;
896868   }
897869
898   gb_driver_data.gb_io[offset] = data;
870   state->gb_io[offset] = data;
899871}
900872
901873WRITE8_HANDLER ( gb_io2_w )
902874{
875   gb_state *state = space->machine->driver_data<gb_state>();
903876   if ( offset == 0x10 )
904877   {
905878      /* disable BIOS ROM */
906      gb_rom16_0000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank00] );
879      gb_rom16_0000( space->machine, state->ROMMap[state->ROMBank00] );
907880   }
908881   else
909882   {
r9784r9785
945918
946919WRITE8_HANDLER ( sgb_io_w )
947920{
921   gb_state *state = space->machine->driver_data<gb_state>();
948922   static UINT8 sgb_bitcount = 0, sgb_bytecount = 0, sgb_start = 0, sgb_rest = 0;
949923   static UINT8 sgb_controller_no = 0, sgb_controller_mode = 0;
950924   static INT8 sgb_packets = -1;
r9784r9785
1008982                  switch( sgb_data[0] >> 3 )
1009983                  {
1010984                     case 0x00:   /* PAL01 */
1011                        sgb_pal[0*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1012                        sgb_pal[0*4 + 1] = sgb_data[3] | (sgb_data[4] << 8);
1013                        sgb_pal[0*4 + 2] = sgb_data[5] | (sgb_data[6] << 8);
1014                        sgb_pal[0*4 + 3] = sgb_data[7] | (sgb_data[8] << 8);
1015                        sgb_pal[1*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1016                        sgb_pal[1*4 + 1] = sgb_data[9] | (sgb_data[10] << 8);
1017                        sgb_pal[1*4 + 2] = sgb_data[11] | (sgb_data[12] << 8);
1018                        sgb_pal[1*4 + 3] = sgb_data[13] | (sgb_data[14] << 8);
985                        state->sgb_pal[0*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
986                        state->sgb_pal[0*4 + 1] = sgb_data[3] | (sgb_data[4] << 8);
987                        state->sgb_pal[0*4 + 2] = sgb_data[5] | (sgb_data[6] << 8);
988                        state->sgb_pal[0*4 + 3] = sgb_data[7] | (sgb_data[8] << 8);
989                        state->sgb_pal[1*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
990                        state->sgb_pal[1*4 + 1] = sgb_data[9] | (sgb_data[10] << 8);
991                        state->sgb_pal[1*4 + 2] = sgb_data[11] | (sgb_data[12] << 8);
992                        state->sgb_pal[1*4 + 3] = sgb_data[13] | (sgb_data[14] << 8);
1019993                        break;
1020994                     case 0x01:   /* PAL23 */
1021                        sgb_pal[2*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1022                        sgb_pal[2*4 + 1] = sgb_data[3] | (sgb_data[4] << 8);
1023                        sgb_pal[2*4 + 2] = sgb_data[5] | (sgb_data[6] << 8);
1024                        sgb_pal[2*4 + 3] = sgb_data[7] | (sgb_data[8] << 8);
1025                        sgb_pal[3*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1026                        sgb_pal[3*4 + 1] = sgb_data[9] | (sgb_data[10] << 8);
1027                        sgb_pal[3*4 + 2] = sgb_data[11] | (sgb_data[12] << 8);
1028                        sgb_pal[3*4 + 3] = sgb_data[13] | (sgb_data[14] << 8);
995                        state->sgb_pal[2*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
996                        state->sgb_pal[2*4 + 1] = sgb_data[3] | (sgb_data[4] << 8);
997                        state->sgb_pal[2*4 + 2] = sgb_data[5] | (sgb_data[6] << 8);
998                        state->sgb_pal[2*4 + 3] = sgb_data[7] | (sgb_data[8] << 8);
999                        state->sgb_pal[3*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1000                        state->sgb_pal[3*4 + 1] = sgb_data[9] | (sgb_data[10] << 8);
1001                        state->sgb_pal[3*4 + 2] = sgb_data[11] | (sgb_data[12] << 8);
1002                        state->sgb_pal[3*4 + 3] = sgb_data[13] | (sgb_data[14] << 8);
10291003                        break;
10301004                     case 0x02:   /* PAL03 */
1031                        sgb_pal[0*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1032                        sgb_pal[0*4 + 1] = sgb_data[3] | (sgb_data[4] << 8);
1033                        sgb_pal[0*4 + 2] = sgb_data[5] | (sgb_data[6] << 8);
1034                        sgb_pal[0*4 + 3] = sgb_data[7] | (sgb_data[8] << 8);
1035                        sgb_pal[3*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1036                        sgb_pal[3*4 + 1] = sgb_data[9] | (sgb_data[10] << 8);
1037                        sgb_pal[3*4 + 2] = sgb_data[11] | (sgb_data[12] << 8);
1038                        sgb_pal[3*4 + 3] = sgb_data[13] | (sgb_data[14] << 8);
1005                        state->sgb_pal[0*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1006                        state->sgb_pal[0*4 + 1] = sgb_data[3] | (sgb_data[4] << 8);
1007                        state->sgb_pal[0*4 + 2] = sgb_data[5] | (sgb_data[6] << 8);
1008                        state->sgb_pal[0*4 + 3] = sgb_data[7] | (sgb_data[8] << 8);
1009                        state->sgb_pal[3*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1010                        state->sgb_pal[3*4 + 1] = sgb_data[9] | (sgb_data[10] << 8);
1011                        state->sgb_pal[3*4 + 2] = sgb_data[11] | (sgb_data[12] << 8);
1012                        state->sgb_pal[3*4 + 3] = sgb_data[13] | (sgb_data[14] << 8);
10391013                        break;
10401014                     case 0x03:   /* PAL12 */
1041                        sgb_pal[1*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1042                        sgb_pal[1*4 + 1] = sgb_data[3] | (sgb_data[4] << 8);
1043                        sgb_pal[1*4 + 2] = sgb_data[5] | (sgb_data[6] << 8);
1044                        sgb_pal[1*4 + 3] = sgb_data[7] | (sgb_data[8] << 8);
1045                        sgb_pal[2*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1046                        sgb_pal[2*4 + 1] = sgb_data[9] | (sgb_data[10] << 8);
1047                        sgb_pal[2*4 + 2] = sgb_data[11] | (sgb_data[12] << 8);
1048                        sgb_pal[2*4 + 3] = sgb_data[13] | (sgb_data[14] << 8);
1015                        state->sgb_pal[1*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1016                        state->sgb_pal[1*4 + 1] = sgb_data[3] | (sgb_data[4] << 8);
1017                        state->sgb_pal[1*4 + 2] = sgb_data[5] | (sgb_data[6] << 8);
1018                        state->sgb_pal[1*4 + 3] = sgb_data[7] | (sgb_data[8] << 8);
1019                        state->sgb_pal[2*4 + 0] = sgb_data[1] | (sgb_data[2] << 8);
1020                        state->sgb_pal[2*4 + 1] = sgb_data[9] | (sgb_data[10] << 8);
1021                        state->sgb_pal[2*4 + 2] = sgb_data[11] | (sgb_data[12] << 8);
1022                        state->sgb_pal[2*4 + 3] = sgb_data[13] | (sgb_data[14] << 8);
10491023                        break;
10501024                     case 0x04:   /* ATTR_BLK */
10511025                        {
r9784r9785
10591033                                 {
10601034                                    for( J = sgb_data[o + 5]; J <= sgb_data[o + 7]; J++ )
10611035                                    {
1062                                       sgb_pal_map[I][J] = sgb_data[o + 3] & 0x3;
1036                                       state->sgb_pal_map[I][J] = sgb_data[o + 3] & 0x3;
10631037                                    }
10641038                                 }
10651039                              }
r9784r9785
10771051                              {
10781052                                 for( J = 0; J < 20; J++ )
10791053                                 {
1080                                    sgb_pal_map[J][sgb_data[K + 1] & 0x1f] = (sgb_data[K + 1] & 0x60) >> 5;
1054                                    state->sgb_pal_map[J][sgb_data[K + 1] & 0x1f] = (sgb_data[K + 1] & 0x60) >> 5;
10811055                                 }
10821056                              }
10831057                              else
10841058                              {
10851059                                 for( J = 0; J < 18; J++ )
10861060                                 {
1087                                    sgb_pal_map[sgb_data[K + 1] & 0x1f][J] = (sgb_data[K + 1] & 0x60) >> 5;
1061                                    state->sgb_pal_map[sgb_data[K + 1] & 0x1f][J] = (sgb_data[K + 1] & 0x60) >> 5;
10881062                                 }
10891063                              }
10901064                           }
r9784r9785
10991073                              {
11001074                                 for( J = 0; J < 20; J++ )
11011075                                 {
1102                                    sgb_pal_map[J][I] = (sgb_data[1] & 0xC) >> 2;
1076                                    state->sgb_pal_map[J][I] = (sgb_data[1] & 0xC) >> 2;
11031077                                 }
11041078                              }
11051079                              for( J = 0; J < 20; J++ )
11061080                              {
1107                                 sgb_pal_map[J][sgb_data[2]] = (sgb_data[1] & 0x30) >> 4;
1081                                 state->sgb_pal_map[J][sgb_data[2]] = (sgb_data[1] & 0x30) >> 4;
11081082                              }
11091083                              for( I = sgb_data[2] + 1; I < 18; I++ )
11101084                              {
11111085                                 for( J = 0; J < 20; J++ )
11121086                                 {
1113                                    sgb_pal_map[J][I] = sgb_data[1] & 0x3;
1087                                    state->sgb_pal_map[J][I] = sgb_data[1] & 0x3;
11141088                                 }
11151089                              }
11161090                           }
r9784r9785
11201094                              {
11211095                                 for( J = 0; J < 18; J++ )
11221096                                 {
1123                                    sgb_pal_map[I][J] = (sgb_data[1] & 0xC) >> 2;
1097                                    state->sgb_pal_map[I][J] = (sgb_data[1] & 0xC) >> 2;
11241098                                 }
11251099                              }
11261100                              for( J = 0; J < 18; J++ )
11271101                              {
1128                                 sgb_pal_map[sgb_data[2]][J] = (sgb_data[1] & 0x30) >> 4;
1102                                 state->sgb_pal_map[sgb_data[2]][J] = (sgb_data[1] & 0x30) >> 4;
11291103                              }
11301104                              for( I = sgb_data[2] + 1; I < 20; I++ )
11311105                              {
11321106                                 for( J = 0; J < 18; J++ )
11331107                                 {
1134                                    sgb_pal_map[I][J] = sgb_data[1] & 0x3;
1108                                    state->sgb_pal_map[I][J] = sgb_data[1] & 0x3;
11351109                                 }
11361110                              }
11371111                           }
r9784r9785
11521126                           {
11531127                              for( I = 6; I < sets; I++ )
11541128                              {
1155                                 sgb_pal_map[x][y++] = (sgb_data[I] & 0xC0) >> 6;
1129                                 state->sgb_pal_map[x][y++] = (sgb_data[I] & 0xC0) >> 6;
11561130                                 if( y > 17 )
11571131                                 {
11581132                                    y = 0;
r9784r9785
11611135                                       x = 0;
11621136                                 }
11631137
1164                                 sgb_pal_map[x][y++] = (sgb_data[I] & 0x30) >> 4;
1138                                 state->sgb_pal_map[x][y++] = (sgb_data[I] & 0x30) >> 4;
11651139                                 if( y > 17 )
11661140                                 {
11671141                                    y = 0;
r9784r9785
11701144                                       x = 0;
11711145                                 }
11721146
1173                                 sgb_pal_map[x][y++] = (sgb_data[I] & 0xC) >> 2;
1147                                 state->sgb_pal_map[x][y++] = (sgb_data[I] & 0xC) >> 2;
11741148                                 if( y > 17 )
11751149                                 {
11761150                                    y = 0;
r9784r9785
11791153                                       x = 0;
11801154                                 }
11811155
1182                                 sgb_pal_map[x][y++] = sgb_data[I] & 0x3;
1156                                 state->sgb_pal_map[x][y++] = sgb_data[I] & 0x3;
11831157                                 if( y > 17 )
11841158                                 {
11851159                                    y = 0;
r9784r9785
11931167                           {
11941168                              for( I = 6; I < sets; I++ )
11951169                              {
1196                                 sgb_pal_map[x++][y] = (sgb_data[I] & 0xC0) >> 6;
1170                                 state->sgb_pal_map[x++][y] = (sgb_data[I] & 0xC0) >> 6;
11971171                                 if( x > 19 )
11981172                                 {
11991173                                    x = 0;
r9784r9785
12021176                                       y = 0;
12031177                                 }
12041178
1205                                 sgb_pal_map[x++][y] = (sgb_data[I] & 0x30) >> 4;
1179                                 state->sgb_pal_map[x++][y] = (sgb_data[I] & 0x30) >> 4;
12061180                                 if( x > 19 )
12071181                                 {
12081182                                    x = 0;
r9784r9785
12111185                                       y = 0;
12121186                                 }
12131187
1214                                 sgb_pal_map[x++][y] = (sgb_data[I] & 0xC) >> 2;
1188                                 state->sgb_pal_map[x++][y] = (sgb_data[I] & 0xC) >> 2;
12151189                                 if( x > 19 )
12161190                                 {
12171191                                    x = 0;
r9784r9785
12201194                                       y = 0;
12211195                                 }
12221196
1223                                 sgb_pal_map[x++][y] = sgb_data[I] & 0x3;
1197                                 state->sgb_pal_map[x++][y] = sgb_data[I] & 0x3;
12241198                                 if( x > 19 )
12251199                                 {
12261200                                    x = 0;
r9784r9785
12471221
12481222                           /* Palette 0 */
12491223                           index_ = (UINT16)(sgb_data[1] | (sgb_data[2] << 8)) * 4;
1250                           sgb_pal[0] = sgb_pal_data[index_];
1251                           sgb_pal[1] = sgb_pal_data[index_ + 1];
1252                           sgb_pal[2] = sgb_pal_data[index_ + 2];
1253                           sgb_pal[3] = sgb_pal_data[index_ + 3];
1224                           state->sgb_pal[0] = state->sgb_pal_data[index_];
1225                           state->sgb_pal[1] = state->sgb_pal_data[index_ + 1];
1226                           state->sgb_pal[2] = state->sgb_pal_data[index_ + 2];
1227                           state->sgb_pal[3] = state->sgb_pal_data[index_ + 3];
12541228                           /* Palette 1 */
12551229                           index_ = (UINT16)(sgb_data[3] | (sgb_data[4] << 8)) * 4;
1256                           sgb_pal[4] = sgb_pal_data[index_];
1257                           sgb_pal[5] = sgb_pal_data[index_ + 1];
1258                           sgb_pal[6] = sgb_pal_data[index_ + 2];
1259                           sgb_pal[7] = sgb_pal_data[index_ + 3];
1230                           state->sgb_pal[4] = state->sgb_pal_data[index_];
1231                           state->sgb_pal[5] = state->sgb_pal_data[index_ + 1];
1232                           state->sgb_pal[6] = state->sgb_pal_data[index_ + 2];
1233                           state->sgb_pal[7] = state->sgb_pal_data[index_ + 3];
12601234                           /* Palette 2 */
12611235                           index_ = (UINT16)(sgb_data[5] | (sgb_data[6] << 8)) * 4;
1262                           sgb_pal[8] = sgb_pal_data[index_];
1263                           sgb_pal[9] = sgb_pal_data[index_ + 1];
1264                           sgb_pal[10] = sgb_pal_data[index_ + 2];
1265                           sgb_pal[11] = sgb_pal_data[index_ + 3];
1236                           state->sgb_pal[8] = state->sgb_pal_data[index_];
1237                           state->sgb_pal[9] = state->sgb_pal_data[index_ + 1];
1238                           state->sgb_pal[10] = state->sgb_pal_data[index_ + 2];
1239                           state->sgb_pal[11] = state->sgb_pal_data[index_ + 3];
12661240                           /* Palette 3 */
12671241                           index_ = (UINT16)(sgb_data[7] | (sgb_data[8] << 8)) * 4;
1268                           sgb_pal[12] = sgb_pal_data[index_];
1269                           sgb_pal[13] = sgb_pal_data[index_ + 1];
1270                           sgb_pal[14] = sgb_pal_data[index_ + 2];
1271                           sgb_pal[15] = sgb_pal_data[index_ + 3];
1242                           state->sgb_pal[12] = state->sgb_pal_data[index_];
1243                           state->sgb_pal[13] = state->sgb_pal_data[index_ + 1];
1244                           state->sgb_pal[14] = state->sgb_pal_data[index_ + 2];
1245                           state->sgb_pal[15] = state->sgb_pal_data[index_ + 3];
12721246                           /* Attribute File */
12731247                           if( sgb_data[9] & 0x40 )
1274                              sgb_window_mask = 0;
1248                              state->sgb_window_mask = 0;
12751249                           sgb_atf = (sgb_data[9] & 0x3f) * (18 * 5);
12761250                           if( sgb_data[9] & 0x80 )
12771251                           {
r9784r9785
12791253                              {
12801254                                 for( I = 0; I < 5; I++ )
12811255                                 {
1282                                    sgb_pal_map[I * 4][J] = (gb_driver_data.sgb_atf_data[(J * 5) + sgb_atf + I] & 0xC0) >> 6;
1283                                    sgb_pal_map[(I * 4) + 1][J] = (gb_driver_data.sgb_atf_data[(J * 5) + sgb_atf + I] & 0x30) >> 4;
1284                                    sgb_pal_map[(I * 4) + 2][J] = (gb_driver_data.sgb_atf_data[(J * 5) + sgb_atf + I] & 0xC) >> 2;
1285                                    sgb_pal_map[(I * 4) + 3][J] = gb_driver_data.sgb_atf_data[(J * 5) + sgb_atf + I] & 0x3;
1256                                    state->sgb_pal_map[I * 4][J] = (state->sgb_atf_data[(J * 5) + sgb_atf + I] & 0xC0) >> 6;
1257                                    state->sgb_pal_map[(I * 4) + 1][J] = (state->sgb_atf_data[(J * 5) + sgb_atf + I] & 0x30) >> 4;
1258                                    state->sgb_pal_map[(I * 4) + 2][J] = (state->sgb_atf_data[(J * 5) + sgb_atf + I] & 0xC) >> 2;
1259                                    state->sgb_pal_map[(I * 4) + 3][J] = state->sgb_atf_data[(J * 5) + sgb_atf + I] & 0x3;
12861260                                 }
12871261                              }
12881262                           }
r9784r9785
12961270                           for( I = 0; I < 2048; I++ )
12971271                           {
12981272                              col = ( gb_vram[ 0x0800 + (I*2) + 1 ] << 8 ) | gb_vram[ 0x0800 + (I*2) ];
1299                              sgb_pal_data[I] = col;
1273                              state->sgb_pal_data[I] = col;
13001274                           }
13011275                        }
13021276                        break;
r9784r9785
13261300                        break;
13271301                     case 0x13:   /* CHR_TRN */
13281302                        if( sgb_data[1] & 0x1 )
1329                           memcpy( sgb_tile_data + 4096, gb_get_vram_ptr(space->machine) + 0x0800, 4096 );
1303                           memcpy( state->sgb_tile_data + 4096, gb_get_vram_ptr(space->machine) + 0x0800, 4096 );
13301304                        else
1331                           memcpy( sgb_tile_data, gb_get_vram_ptr(space->machine) + 0x0800, 4096 );
1305                           memcpy( state->sgb_tile_data, gb_get_vram_ptr(space->machine) + 0x0800, 4096 );
13321306                        break;
13331307                     case 0x14:   /* PCT_TRN */
13341308                        {
13351309                           int I;
13361310                           UINT16 col;
13371311                           UINT8 *gb_vram = gb_get_vram_ptr( space->machine );
1338                           if( sgb_hack )
1312                           if( state->sgb_hack )
13391313                           {
1340                              memcpy( sgb_tile_map, gb_vram + 0x1000, 2048 );
1314                              memcpy( state->sgb_tile_map, gb_vram + 0x1000, 2048 );
13411315                              for( I = 0; I < 64; I++ )
13421316                              {
13431317                                 col = ( gb_vram[ 0x0800 + (I*2) + 1 ] << 8 ) | gb_vram[ 0x0800 + (I*2) ];
1344                                 sgb_pal[SGB_BORDER_PAL_OFFSET + I] = col;
1318                                 state->sgb_pal[SGB_BORDER_PAL_OFFSET + I] = col;
13451319                              }
13461320                           }
13471321                           else /* Do things normally */
13481322                           {
1349                              memcpy( sgb_tile_map, gb_vram + 0x0800, 2048 );
1323                              memcpy( state->sgb_tile_map, gb_vram + 0x0800, 2048 );
13501324                              for( I = 0; I < 64; I++ )
13511325                              {
13521326                                 col = ( gb_vram[ 0x1000 + (I*2) + 1 ] << 8 ) | gb_vram[ 0x1000 + (I*2) ];
1353                                 sgb_pal[SGB_BORDER_PAL_OFFSET + I] = col;
1327                                 state->sgb_pal[SGB_BORDER_PAL_OFFSET + I] = col;
13541328                              }
13551329                           }
13561330                        }
13571331                        break;
13581332                     case 0x15:   /* ATTR_TRN */
1359                        memcpy( gb_driver_data.sgb_atf_data, gb_get_vram_ptr( space->machine ) + 0x0800, 4050 );
1333                        memcpy( state->sgb_atf_data, gb_get_vram_ptr( space->machine ) + 0x0800, 4050 );
13601334                        break;
13611335                     case 0x16:   /* ATTR_SET */
13621336                        {
r9784r9785
13641338
13651339                           /* Attribute File */
13661340                           if( sgb_data[1] & 0x40 )
1367                              sgb_window_mask = 0;
1341                              state->sgb_window_mask = 0;
13681342                           sgb_atf = (sgb_data[1] & 0x3f) * (18 * 5);
13691343                           for( J = 0; J < 18; J++ )
13701344                           {
13711345                              for( I = 0; I < 5; I++ )
13721346                              {
1373                                 sgb_pal_map[I * 4][J] = (gb_driver_data.sgb_atf_data[(J * 5) + sgb_atf + I] & 0xC0) >> 6;
1374                                 sgb_pal_map[(I * 4) + 1][J] = (gb_driver_data.sgb_atf_data[(J * 5) + sgb_atf + I] & 0x30) >> 4;
1375                                 sgb_pal_map[(I * 4) + 2][J] = (gb_driver_data.sgb_atf_data[(J * 5) + sgb_atf + I] & 0xC) >> 2;
1376                                 sgb_pal_map[(I * 4) + 3][J] = gb_driver_data.sgb_atf_data[(J * 5) + sgb_atf + I] & 0x3;
1347                                 state->sgb_pal_map[I * 4][J] = (state->sgb_atf_data[(J * 5) + sgb_atf + I] & 0xC0) >> 6;
1348                                 state->sgb_pal_map[(I * 4) + 1][J] = (state->sgb_atf_data[(J * 5) + sgb_atf + I] & 0x30) >> 4;
1349                                 state->sgb_pal_map[(I * 4) + 2][J] = (state->sgb_atf_data[(J * 5) + sgb_atf + I] & 0xC) >> 2;
1350                                 state->sgb_pal_map[(I * 4) + 3][J] = state->sgb_atf_data[(J * 5) + sgb_atf + I] & 0x3;
13771351                              }
13781352                           }
13791353                        }
13801354                        break;
13811355                     case 0x17:   /* MASK_EN */
1382                        sgb_window_mask = sgb_data[1];
1356                        state->sgb_window_mask = sgb_data[1];
13831357                        break;
13841358                     case 0x18:   /* OBJ_TRN */
13851359                        /* Not Implemnted */
r9784r9785
14401414         return;
14411415   }
14421416
1443   gb_driver_data.gb_io[offset] = data;
1417   state->gb_io[offset] = data;
14441418}
14451419
14461420/* Interrupt Enable register */
r9784r9785
14571431/* IO read */
14581432READ8_HANDLER ( gb_io_r )
14591433{
1434   gb_state *state = space->machine->driver_data<gb_state>();
14601435   switch(offset)
14611436   {
14621437      case 0x04:
1463         return ( gb_driver_data.divcount >> 8 ) & 0xFF;
1438         return ( state->divcount >> 8 ) & 0xFF;
14641439      case 0x00:
14651440      case 0x01:
14661441      case 0x02:
r9784r9785
14681443      case 0x05:
14691444      case 0x06:
14701445      case 0x07:
1471         return gb_driver_data.gb_io[offset];
1446         return state->gb_io[offset];
14721447      case 0x0F:
14731448         /* Make sure the internal states are up to date */
14741449         return 0xE0 | cpu_get_reg( space->machine->device("maincpu"), LR35902_IF );
r9784r9785
14801455
14811456DEVICE_START(gb_cart)
14821457{
1458   gb_state *state = device->machine->driver_data<gb_state>();
14831459   int I;
14841460
1485   memset(&gb_driver_data, 0, sizeof(gb_driver_data));
1461   state->gb_dummy_rom_bank = auto_alloc_array(device->machine, UINT8, 0x4000);
1462   memset(state->gb_dummy_rom_bank, 0xff, 0x4000);
14861463
1487   gb_driver_data.gb_dummy_rom_bank = auto_alloc_array(device->machine, UINT8, 0x4000);
1488   memset(gb_driver_data.gb_dummy_rom_bank, 0xff, 0x4000);
1464   state->gb_dummy_ram_bank = auto_alloc_array(device->machine, UINT8, 0x2000);
1465   memset(state->gb_dummy_ram_bank, 0xff, 0x2000 );
14891466
1490   gb_driver_data.gb_dummy_ram_bank = auto_alloc_array(device->machine, UINT8, 0x2000);
1491   memset(gb_driver_data.gb_dummy_ram_bank, 0xff, 0x2000 );
1492
14931467   for(I = 0; I < MAX_ROMBANK; I++)
14941468   {
1495      gb_driver_data.ROMMap[I] = gb_driver_data.gb_dummy_rom_bank;
1469      state->ROMMap[I] = state->gb_dummy_rom_bank;
14961470   }
14971471   for(I = 0; I < MAX_RAMBANK; I++)
14981472   {
1499      gb_driver_data.RAMMap[I] = gb_driver_data.gb_dummy_ram_bank;
1473      state->RAMMap[I] = state->gb_dummy_ram_bank;
15001474   }
1501   gb_driver_data.ROMBank00 = 0;
1502   gb_driver_data.ROMBanks = 0;
1503   gb_driver_data.RAMBanks = 0;
1504   gb_driver_data.MBCType = MBC_NONE;
1505   gb_driver_data.CartType = 0;
1506   gb_driver_data.ROMMask = 0;
1507   gb_driver_data.RAMMask = 0;
1475   state->ROMBank00 = 0;
1476   state->ROMBanks = 0;
1477   state->RAMBanks = 0;
1478   state->MBCType = MBC_NONE;
1479   state->CartType = 0;
1480   state->ROMMask = 0;
1481   state->RAMMask = 0;
15081482}
15091483
15101484DEVICE_IMAGE_LOAD(gb_cart)
15111485{
1486   gb_state *state = image.device().machine->driver_data<gb_state>();
15121487   static const char *const CartTypes[] =
15131488   {
15141489      "ROM ONLY",
r9784r9785
16621637   }
16631638
16641639   /* Claim memory */
1665   gb_driver_data.gb_cart = auto_alloc_array(image.device().machine, UINT8, filesize);
1640   state->gb_cart = auto_alloc_array(image.device().machine, UINT8, filesize);
16661641
16671642   if (image.software_entry() == NULL)
16681643   {
r9784r9785
16701645      image.fseek(load_start, SEEK_SET);
16711646
16721647      /* Read cartridge */
1673      if (image.fread( gb_driver_data.gb_cart, filesize) != filesize)
1648      if (image.fread( state->gb_cart, filesize) != filesize)
16741649      {
16751650         image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file");
16761651         return IMAGE_INIT_FAIL;
16771652      }
16781653   }
16791654   else
1680      memcpy(gb_driver_data.gb_cart, image.get_software_region("rom") + load_start, filesize);
1655      memcpy(state->gb_cart, image.get_software_region("rom") + load_start, filesize);
16811656
1682   gb_header = gb_driver_data.gb_cart;
1683   gb_driver_data.ROMBank00 = 0;
1657   gb_header = state->gb_cart;
1658   state->ROMBank00 = 0;
16841659
16851660   /* Check for presence of MMM01 mapper */
16861661   if (filesize >= 0x8000)
r9784r9785
16911666         0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E
16921667      };
16931668      int   bytes_matched = 0;
1694      gb_header = gb_driver_data.gb_cart + filesize - 0x8000;
1669      gb_header = state->gb_cart + filesize - 0x8000;
16951670      for (I = 0; I < 0x18; I++)
16961671      {
16971672         if (gb_header[0x0104 + I] == nintendo_logo[I])
r9784r9785
17021677
17031678      if (bytes_matched == 0x18 && gb_header[0x0147] >= 0x0B && gb_header[0x0147] <= 0x0D)
17041679      {
1705         gb_driver_data.ROMBank00 = (filesize / 0x4000) - 2;
1706         mmm01_bank_offset = gb_driver_data.ROMBank00;
1680         state->ROMBank00 = (filesize / 0x4000) - 2;
1681         state->mmm01_bank_offset = state->ROMBank00;
17071682      }
17081683      else
17091684      {
1710         gb_header = gb_driver_data.gb_cart;
1685         gb_header = state->gb_cart;
17111686      }
17121687   }
17131688
17141689   /* Fill in our cart details */
17151690   switch(gb_header[0x0147])
17161691   {
1717   case 0x00:   gb_driver_data.MBCType = MBC_NONE;   gb_driver_data.CartType = 0;            break;
1718   case 0x01:   gb_driver_data.MBCType = MBC_MBC1;   gb_driver_data.CartType = 0;            break;
1719   case 0x02:   gb_driver_data.MBCType = MBC_MBC1;   gb_driver_data.CartType = RAM;            break;
1720   case 0x03:   gb_driver_data.MBCType = MBC_MBC1;   gb_driver_data.CartType = RAM | BATTERY;      break;
1721   case 0x05:   gb_driver_data.MBCType = MBC_MBC2;   gb_driver_data.CartType = 0;            break;
1722   case 0x06:   gb_driver_data.MBCType = MBC_MBC2;   gb_driver_data.CartType = BATTERY;         break;
1723   case 0x08:   gb_driver_data.MBCType = MBC_NONE;   gb_driver_data.CartType = RAM;            break;
1724   case 0x09:   gb_driver_data.MBCType = MBC_NONE;   gb_driver_data.CartType = RAM | BATTERY;      break;
1725   case 0x0B:   gb_driver_data.MBCType = MBC_MMM01;   gb_driver_data.CartType = 0;            break;
1726   case 0x0C:   gb_driver_data.MBCType = MBC_MMM01;   gb_driver_data.CartType = RAM;            break;
1727   case 0x0D:   gb_driver_data.MBCType = MBC_MMM01;   gb_driver_data.CartType = RAM | BATTERY;      break;
1728   case 0x0F:   gb_driver_data.MBCType = MBC_MBC3;   gb_driver_data.CartType = TIMER | BATTERY;      break;
1729   case 0x10:   gb_driver_data.MBCType = MBC_MBC3;   gb_driver_data.CartType = TIMER | RAM | BATTERY;   break;
1730   case 0x11:   gb_driver_data.MBCType = MBC_MBC3;   gb_driver_data.CartType = 0;            break;
1731   case 0x12:   gb_driver_data.MBCType = MBC_MBC3;   gb_driver_data.CartType = RAM;            break;
1732   case 0x13:   gb_driver_data.MBCType = MBC_MBC3;   gb_driver_data.CartType = RAM | BATTERY;      break;
1733   case 0x15:   gb_driver_data.MBCType = MBC_MBC4;   gb_driver_data.CartType = 0;            break;
1734   case 0x16:   gb_driver_data.MBCType = MBC_MBC4;   gb_driver_data.CartType = RAM;            break;
1735   case 0x17:   gb_driver_data.MBCType = MBC_MBC4;   gb_driver_data.CartType = RAM | BATTERY;      break;
1736   case 0x19:   gb_driver_data.MBCType = MBC_MBC5;   gb_driver_data.CartType = 0;            break;
1737   case 0x1A:   gb_driver_data.MBCType = MBC_MBC5;   gb_driver_data.CartType = RAM;            break;
1738   case 0x1B:   gb_driver_data.MBCType = MBC_MBC5;   gb_driver_data.CartType = RAM | BATTERY;      break;
1739   case 0x1C:   gb_driver_data.MBCType = MBC_MBC5;   gb_driver_data.CartType = RUMBLE;         break;
1740   case 0x1D:   gb_driver_data.MBCType = MBC_MBC5;   gb_driver_data.CartType = RUMBLE | SRAM;      break;
1741   case 0x1E:   gb_driver_data.MBCType = MBC_MBC5;   gb_driver_data.CartType = RUMBLE | SRAM | BATTERY;   break;
1742   case 0x20:   gb_driver_data.MBCType = MBC_MBC6;   gb_driver_data.CartType = SRAM; break;
1743   case 0x22:   gb_driver_data.MBCType = MBC_MBC7;   gb_driver_data.CartType = SRAM | BATTERY;      break;
1744   case 0xBE:   gb_driver_data.MBCType = MBC_NONE;   gb_driver_data.CartType = 0;            break;   /* used in Flash2Advance GB Bridge boot program */
1745   case 0xFD:   gb_driver_data.MBCType = MBC_TAMA5;   gb_driver_data.CartType = 0 /*RTC | BATTERY?*/;   break;
1746   case 0xFE:   gb_driver_data.MBCType = MBC_HUC3;   gb_driver_data.CartType = 0;            break;
1747   case 0xFF:   gb_driver_data.MBCType = MBC_HUC1;   gb_driver_data.CartType = 0;            break;
1748   default:   gb_driver_data.MBCType = MBC_UNKNOWN;   gb_driver_data.CartType = UNKNOWN;         break;
1692   case 0x00:   state->MBCType = MBC_NONE;   state->CartType = 0;            break;
1693   case 0x01:   state->MBCType = MBC_MBC1;   state->CartType = 0;            break;
1694   case 0x02:   state->MBCType = MBC_MBC1;   state->CartType = RAM;            break;
1695   case 0x03:   state->MBCType = MBC_MBC1;   state->CartType = RAM | BATTERY;      break;
1696   case 0x05:   state->MBCType = MBC_MBC2;   state->CartType = 0;            break;
1697   case 0x06:   state->MBCType = MBC_MBC2;   state->CartType = BATTERY;         break;
1698   case 0x08:   state->MBCType = MBC_NONE;   state->CartType = RAM;            break;
1699   case 0x09:   state->MBCType = MBC_NONE;   state->CartType = RAM | BATTERY;      break;
1700   case 0x0B:   state->MBCType = MBC_MMM01;   state->CartType = 0;            break;
1701   case 0x0C:   state->MBCType = MBC_MMM01;   state->CartType = RAM;            break;
1702   case 0x0D:   state->MBCType = MBC_MMM01;   state->CartType = RAM | BATTERY;      break;
1703   case 0x0F:   state->MBCType = MBC_MBC3;   state->CartType = TIMER | BATTERY;      break;
1704   case 0x10:   state->MBCType = MBC_MBC3;   state->CartType = TIMER | RAM | BATTERY;   break;
1705   case 0x11:   state->MBCType = MBC_MBC3;   state->CartType = 0;            break;
1706   case 0x12:   state->MBCType = MBC_MBC3;   state->CartType = RAM;            break;
1707   case 0x13:   state->MBCType = MBC_MBC3;   state->CartType = RAM | BATTERY;      break;
1708   case 0x15:   state->MBCType = MBC_MBC4;   state->CartType = 0;            break;
1709   case 0x16:   state->MBCType = MBC_MBC4;   state->CartType = RAM;            break;
1710   case 0x17:   state->MBCType = MBC_MBC4;   state->CartType = RAM | BATTERY;      break;
1711   case 0x19:   state->MBCType = MBC_MBC5;   state->CartType = 0;            break;
1712   case 0x1A:   state->MBCType = MBC_MBC5;   state->CartType = RAM;            break;
1713   case 0x1B:   state->MBCType = MBC_MBC5;   state->CartType = RAM | BATTERY;      break;
1714   case 0x1C:   state->MBCType = MBC_MBC5;   state->CartType = RUMBLE;         break;
1715   case 0x1D:   state->MBCType = MBC_MBC5;   state->CartType = RUMBLE | SRAM;      break;
1716   case 0x1E:   state->MBCType = MBC_MBC5;   state->CartType = RUMBLE | SRAM | BATTERY;   break;
1717   case 0x20:   state->MBCType = MBC_MBC6;   state->CartType = SRAM; break;
1718   case 0x22:   state->MBCType = MBC_MBC7;   state->CartType = SRAM | BATTERY;      break;
1719   case 0xBE:   state->MBCType = MBC_NONE;   state->CartType = 0;            break;   /* used in Flash2Advance GB Bridge boot program */
1720   case 0xFD:   state->MBCType = MBC_TAMA5;   state->CartType = 0 /*RTC | BATTERY?*/;   break;
1721   case 0xFE:   state->MBCType = MBC_HUC3;   state->CartType = 0;            break;
1722   case 0xFF:   state->MBCType = MBC_HUC1;   state->CartType = 0;            break;
1723   default:   state->MBCType = MBC_UNKNOWN;   state->CartType = UNKNOWN;         break;
17491724   }
17501725
17511726   /* Check whether we're dealing with a (possible) Wisdom Tree game here */
r9784r9785
17581733      }
17591734      if (count == 0)
17601735      {
1761         gb_driver_data.MBCType = MBC_WISDOM;
1736         state->MBCType = MBC_WISDOM;
17621737      }
17631738   }
17641739
17651740   /* Check if we're dealing with a Korean variant of the MBC1 mapper */
1766   if (gb_driver_data.MBCType == MBC_MBC1)
1741   if (state->MBCType == MBC_MBC1)
17671742   {
17681743      if (gb_header[0x13F] == 0x42 && gb_header[0x140] == 0x32 && gb_header[0x141] == 0x43 && gb_header[0x142] == 0x4B)
17691744      {
1770         gb_driver_data.MBCType = MBC_MBC1_KOR;
1745         state->MBCType = MBC_MBC1_KOR;
17711746      }
17721747   }
1773   if (gb_driver_data.MBCType == MBC_UNKNOWN)
1748   if (state->MBCType == MBC_UNKNOWN)
17741749   {
17751750      image.seterror(IMAGE_ERROR_UNSUPPORTED, "Unknown mapper type");
17761751      return IMAGE_INIT_FAIL;
17771752   }
1778   if (gb_driver_data.MBCType == MBC_MMM01)
1753   if (state->MBCType == MBC_MMM01)
17791754   {
17801755//      image.seterror(IMAGE_ERROR_UNSUPPORTED, "Mapper MMM01 is not supported yet");
17811756//      return IMAGE_INIT_FAIL;
17821757   }
1783   if (gb_driver_data.MBCType == MBC_MBC4)
1758   if (state->MBCType == MBC_MBC4)
17841759   {
17851760      image.seterror(IMAGE_ERROR_UNSUPPORTED, "Mapper MBC4 is not supported yet");
17861761      return IMAGE_INIT_FAIL;
17871762   }
17881763   /* MBC7 support is still work-in-progress, so only enable it for debug builds */
17891764#ifndef MAME_DEBUG
1790   if (gb_driver_data.MBCType == MBC_MBC7)
1765   if (state->MBCType == MBC_MBC7)
17911766   {
17921767      image.seterror(IMAGE_ERROR_UNSUPPORTED, "Mapper MBC7 is not supported yet");
17931768      return IMAGE_INIT_FAIL;
17941769   }
17951770#endif
17961771
1797   gb_driver_data.ROMBanks = filesize / 0x4000;
1772   state->ROMBanks = filesize / 0x4000;
17981773   switch (gb_header[0x0148])
17991774   {
18001775   case 0x52:
r9784r9785
18151790      reported_rom_banks = 256;
18161791      break;
18171792   }
1818   if (gb_driver_data.ROMBanks != reported_rom_banks && gb_driver_data.MBCType != MBC_WISDOM)
1793   if (state->ROMBanks != reported_rom_banks && state->MBCType != MBC_WISDOM)
18191794   {
18201795      logerror("Warning loading cartridge: Filesize and reported ROM banks don't match.\n");
18211796   }
18221797
1823   gb_driver_data.RAMBanks = rambanks[gb_header[0x0149] & 7];
1798   state->RAMBanks = rambanks[gb_header[0x0149] & 7];
18241799
18251800   /* Calculate and check checksum */
18261801   Checksum = ((UINT16) gb_header[0x014E] << 8) + gb_header[0x014F];
18271802   Checksum += gb_header[0x014E] + gb_header[0x014F];
18281803   for (I = 0; I < filesize; I++)
18291804   {
1830      Checksum -= gb_driver_data.gb_cart[I];
1805      Checksum -= state->gb_cart[I];
18311806   }
18321807   if (Checksum & 0xFFFF)
18331808   {
r9784r9785
18351810   }
18361811
18371812   /* Initialize ROMMap pointers */
1838   for (I = 0; I < gb_driver_data.ROMBanks; I++)
1813   for (I = 0; I < state->ROMBanks; I++)
18391814   {
1840      gb_driver_data.ROMMap[I] = gb_driver_data.gb_cart + (I * 0x4000);
1815      state->ROMMap[I] = state->gb_cart + (I * 0x4000);
18411816   }
18421817
18431818   /*
r9784r9785
18471822      80 (1010000)  1001111 (79)
18481823      96 (1100000)  1011111 (95)
18491824    */
1850   gb_driver_data.ROMMask = I - 1;
1851   if ((gb_driver_data.ROMBanks & gb_driver_data.ROMMask) != 0)
1825   state->ROMMask = I - 1;
1826   if ((state->ROMBanks & state->ROMMask) != 0)
18521827   {
1853      for( ; I & gb_driver_data.ROMBanks; I++)
1828      for( ; I & state->ROMBanks; I++)
18541829      {
1855         gb_driver_data.ROMMap[I] = gb_driver_data.ROMMap[I & gb_driver_data.ROMMask];
1830         state->ROMMap[I] = state->ROMMap[I & state->ROMMask];
18561831      }
1857      gb_driver_data.ROMMask = I - 1;
1832      state->ROMMask = I - 1;
18581833   }
18591834
18601835   /* Fill out the remaining rom bank pointers, if any. */
18611836   for ( ; I < MAX_ROMBANK; I++)
18621837   {
1863      gb_driver_data.ROMMap[I] = gb_driver_data.ROMMap[I & gb_driver_data.ROMMask];
1838      state->ROMMap[I] = state->ROMMap[I & state->ROMMask];
18641839   }
18651840
18661841   /* Log cart information */
r9784r9785
18771852      logerror("\tType:             %s [0x%2X]\n", CartTypes[gb_header[0x0147]], gb_header[0x0147] );
18781853      logerror("\tGame Boy:         %s\n", (gb_header[0x0143] == 0xc0) ? "No" : "Yes" );
18791854      logerror("\tSuper GB:         %s [0x%2X]\n", (gb_header[0x0146] == 0x03) ? "Yes" : "No", gb_header[0x0146] );
1880      logerror("\tColor GB:         %s [0x%2X]\n", (gb_header[0x0143] == 0x80 || gb_header[0x0143] == 0xc0) ? "Yes" : "No", gb_driver_data.gb_cart[0x0143] );
1881      logerror("\tROM Size:         %d 16kB Banks [0x%2X]\n", gb_driver_data.ROMBanks, gb_header[0x0148]);
1855      logerror("\tColor GB:         %s [0x%2X]\n", (gb_header[0x0143] == 0x80 || gb_header[0x0143] == 0xc0) ? "Yes" : "No", state->gb_cart[0x0143] );
1856      logerror("\tROM Size:         %d 16kB Banks [0x%2X]\n", state->ROMBanks, gb_header[0x0148]);
18821857      logerror("\tRAM Size:         %d kB [0x%2X]\n", ramsize[ gb_header[0x0149] & 0x07 ], gb_header[0x0149]);
18831858      logerror("\tLicense code:     0x%2X%2X\n", gb_header[0x0145], gb_header[0x0144] );
18841859      J = ((UINT16) gb_header[0x014B] << 8) + gb_header[0x014A];
r9784r9785
18951870   }
18961871
18971872   /* MBC2 has 512 * 4bits (8kb) internal RAM */
1898   if(gb_driver_data.MBCType == MBC_MBC2)
1899      gb_driver_data.RAMBanks = 1;
1873   if(state->MBCType == MBC_MBC2)
1874      state->RAMBanks = 1;
19001875   /* MBC7 has 512 bytes(?) of internal RAM */
1901   if (gb_driver_data.MBCType == MBC_MBC7)
1876   if (state->MBCType == MBC_MBC7)
19021877   {
1903      gb_driver_data.RAMBanks = 1;
1878      state->RAMBanks = 1;
19041879   }
19051880
1906   if (gb_driver_data.RAMBanks && gb_driver_data.MBCType)
1881   if (state->RAMBanks && state->MBCType)
19071882   {
19081883      /* Claim memory */
1909      gb_driver_data.gb_cart_ram = auto_alloc_array(image.device().machine, UINT8, gb_driver_data.RAMBanks * 0x2000);
1910      memset(gb_driver_data.gb_cart_ram, 0xFF, gb_driver_data.RAMBank * 0x2000);
1884      state->gb_cart_ram = auto_alloc_array(image.device().machine, UINT8, state->RAMBanks * 0x2000);
1885      memset(state->gb_cart_ram, 0xFF, state->RAMBank * 0x2000);
19111886
1912      for (I = 0; I < gb_driver_data.RAMBanks; I++)
1887      for (I = 0; I < state->RAMBanks; I++)
19131888      {
1914         gb_driver_data.RAMMap[I] = gb_driver_data.gb_cart_ram + (I * 0x2000);
1889         state->RAMMap[I] = state->gb_cart_ram + (I * 0x2000);
19151890      }
19161891
19171892      /* Set up rest of the (mirrored) RAM pages */
1918      gb_driver_data.RAMMask = I - 1;
1893      state->RAMMask = I - 1;
19191894      for ( ; I < MAX_RAMBANK; I++)
19201895      {
1921         gb_driver_data.RAMMap[I] = gb_driver_data.RAMMap[I & gb_driver_data.RAMMask];
1896         state->RAMMap[I] = state->RAMMap[I & state->RAMMask];
19221897      }
19231898   }
19241899   else
19251900   {
1926      gb_driver_data.RAMMask = 0;
1901      state->RAMMask = 0;
19271902   }
19281903
19291904   /* If there's an RTC claim memory to store the RTC contents */
1930   if (gb_driver_data.CartType & TIMER)
1905   if (state->CartType & TIMER)
19311906   {
1932      gb_driver_data.MBC3RTCData = auto_alloc_array(image.device().machine, UINT8, 0x2000);
1907      state->MBC3RTCData = auto_alloc_array(image.device().machine, UINT8, 0x2000);
19331908   }
19341909
1935   if (gb_driver_data.MBCType == MBC_TAMA5)
1910   if (state->MBCType == MBC_TAMA5)
19361911   {
1937      gb_driver_data.MBC3RTCData = auto_alloc_array(image.device().machine, UINT8, 0x2000);
1938      memset(gb_driver_data.gbTama5Memory, 0xff, sizeof(gb_driver_data.gbTama5Memory));
1912      state->MBC3RTCData = auto_alloc_array(image.device().machine, UINT8, 0x2000);
1913      memset(state->gbTama5Memory, 0xff, sizeof(state->gbTama5Memory));
19391914   }
19401915
19411916   /* Load the saved RAM if this cart has a battery */
1942   if (gb_driver_data.CartType & BATTERY && gb_driver_data.RAMBanks)
1917   if (state->CartType & BATTERY && state->RAMBanks)
19431918   {
1944      image.battery_load(gb_driver_data.gb_cart_ram, gb_driver_data.RAMBanks * 0x2000, 0x00);
1919      image.battery_load(state->gb_cart_ram, state->RAMBanks * 0x2000, 0x00);
19451920   }
19461921
19471922   return IMAGE_INIT_PASS;
r9784r9785
19531928
19541929static TIMER_CALLBACK(gb_serial_timer_proc)
19551930{
1931   gb_state *state = machine->driver_data<gb_state>();
19561932   /* Shift in a received bit */
19571933   SIODATA = (SIODATA << 1) | 0x01;
19581934   /* Decrement number of handled bits */
1959   gb_driver_data.SIOCount--;
1935   state->SIOCount--;
19601936   /* If all bits done, stop timer and trigger interrupt */
1961   if ( ! gb_driver_data.SIOCount )
1937   if ( ! state->SIOCount )
19621938   {
19631939      SIOCONT &= 0x7F;
1964      timer_enable( gb_driver_data.gb_serial_timer, 0 );
1940      timer_enable( state->gb_serial_timer, 0 );
19651941      cputag_set_input_line(machine, "maincpu", SIO_INT, ASSERT_LINE);
19661942   }
19671943}
19681944
19691945INLINE void gb_timer_check_irq( running_machine *machine )
19701946{
1971   gb_driver_data.reloading = 0;
1972   if ( gb_driver_data.triggering_irq )
1947   gb_state *state = machine->driver_data<gb_state>();
1948   state->reloading = 0;
1949   if ( state->triggering_irq )
19731950   {
1974      gb_driver_data.triggering_irq = 0;
1951      state->triggering_irq = 0;
19751952      if ( TIMECNT == 0 )
19761953      {
19771954         TIMECNT = TIMEMOD;
19781955         cputag_set_input_line(machine, "maincpu", TIM_INT, ASSERT_LINE );
1979         gb_driver_data.reloading = 1;
1956         state->reloading = 1;
19801957      }
19811958   }
19821959}
19831960
19841961static void gb_timer_increment( running_machine *machine )
19851962{
1963   gb_state *state = machine->driver_data<gb_state>();
19861964   gb_timer_check_irq(machine);
19871965
19881966   TIMECNT += 1;
19891967   if ( TIMECNT == 0 )
19901968   {
1991      gb_driver_data.triggering_irq = 1;
1969      state->triggering_irq = 1;
19921970   }
19931971}
19941972
19951973void gb_timer_callback(running_device *device, int cycles)
19961974{
1997   UINT16 old_gb_divcount = gb_driver_data.divcount;
1998   gb_driver_data.divcount += cycles;
1975   gb_state *state = device->machine->driver_data<gb_state>();
1976   UINT16 old_gb_divcount = state->divcount;
1977   state->divcount += cycles;
19991978
20001979   gb_timer_check_irq(device->machine);
20011980
20021981   if ( TIMEFRQ & 0x04 )
20031982   {
2004      UINT16 old_count = old_gb_divcount >> gb_driver_data.shift;
2005      UINT16 new_count = gb_driver_data.divcount >> gb_driver_data.shift;
2006      if ( cycles > gb_driver_data.shift_cycles )
1983      UINT16 old_count = old_gb_divcount >> state->shift;
1984      UINT16 new_count = state->divcount >> state->shift;
1985      if ( cycles > state->shift_cycles )
20071986      {
20081987         gb_timer_increment(device->machine);
20091988         old_count++;
r9784r9785
20121991      {
20131992         gb_timer_increment(device->machine);
20141993      }
2015      if ( new_count << gb_driver_data.shift < gb_driver_data.divcount )
1994      if ( new_count << state->shift < state->divcount )
20161995      {
20171996         gb_timer_check_irq(device->machine);
20181997      }
r9784r9785
20212000
20222001WRITE8_HANDLER ( gbc_io2_w )
20232002{
2003   gb_state *state = space->machine->driver_data<gb_state>();
20242004   switch( offset )
20252005   {
20262006      case 0x0D:   /* KEY1 - Prepare speed switch */
20272007         cpu_set_reg( space->machine->device("maincpu"), LR35902_SPEED, data );
20282008         return;
20292009      case 0x10:   /* BFF - Bios disable */
2030         gb_rom16_0000( space->machine, gb_driver_data.ROMMap[gb_driver_data.ROMBank00] );
2010         gb_rom16_0000( space->machine, state->ROMMap[state->ROMBank00] );
20312011         return;
20322012      case 0x16:   /* RP - Infrared port */
20332013         break;
20342014      case 0x30:   /* SVBK - RAM bank select */
2035         gb_driver_data.GBC_RAMBank = data & 0x7;
2036         if ( ! gb_driver_data.GBC_RAMBank )
2037            gb_driver_data.GBC_RAMBank = 1;
2038         memory_set_bankptr (space->machine, "bank3", gb_driver_data.GBC_RAMMap[gb_driver_data.GBC_RAMBank]);
2015         state->GBC_RAMBank = data & 0x7;
2016         if ( ! state->GBC_RAMBank )
2017            state->GBC_RAMBank = 1;
2018         memory_set_bankptr (space->machine, "bank3", state->GBC_RAMMap[state->GBC_RAMBank]);
20392019         break;
20402020      default:
20412021         break;
r9784r9785
20452025
20462026READ8_HANDLER( gbc_io2_r )
20472027{
2028   gb_state *state = space->machine->driver_data<gb_state>();
20482029   switch( offset )
20492030   {
20502031   case 0x0D:   /* KEY1 */
r9784r9785
20522033   case 0x16:   /* RP - Infrared port */
20532034      break;
20542035   case 0x30:   /* SVBK - RAM bank select */
2055      return gb_driver_data.GBC_RAMBank;
2036      return state->GBC_RAMBank;
20562037   default:
20572038      break;
20582039   }
r9784r9785
20672048
20682049MACHINE_START( megaduck )
20692050{
2051   gb_state *state = machine->driver_data<gb_state>();
20702052   /* Allocate the serial timer, and disable it */
2071   gb_driver_data.gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
2072   timer_enable( gb_driver_data.gb_serial_timer, 0 );
2053   state->gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
2054   timer_enable( state->gb_serial_timer, 0 );
20732055
20742056   MACHINE_START_CALL( gb_video );
20752057}
r9784r9785
21902172
21912173WRITE8_HANDLER( megaduck_rom_bank_select_type1 )
21922174{
2193   if( gb_driver_data.ROMMask )
2175   gb_state *state = space->machine->driver_data<gb_state>();
2176   if( state->ROMMask )
21942177   {
2195      gb_driver_data.ROMBank = data & gb_driver_data.ROMMask;
2178      state->ROMBank = data & state->ROMMask;
21962179
21972180      /* Switch banks */
2198      memory_set_bankptr (space->machine, "bank1", gb_driver_data.ROMMap[gb_driver_data.ROMBank]);
2181      memory_set_bankptr (space->machine, "bank1", state->ROMMap[state->ROMBank]);
21992182   }
22002183}
22012184
22022185WRITE8_HANDLER( megaduck_rom_bank_select_type2 )
22032186{
2204   if( gb_driver_data.ROMMask )
2187   gb_state *state = space->machine->driver_data<gb_state>();
2188   if( state->ROMMask )
22052189   {
2206      gb_driver_data.ROMBank = (data << 1) & gb_driver_data.ROMMask;
2190      state->ROMBank = (data << 1) & state->ROMMask;
22072191
22082192      /* Switch banks */
2209      memory_set_bankptr( space->machine, "bank10", gb_driver_data.ROMMap[gb_driver_data.ROMBank]);
2210      memory_set_bankptr( space->machine, "bank1", gb_driver_data.ROMMap[gb_driver_data.ROMBank + 1]);
2193      memory_set_bankptr( space->machine, "bank10", state->ROMMap[state->ROMBank]);
2194      memory_set_bankptr( space->machine, "bank1", state->ROMMap[state->ROMBank + 1]);
22112195   }
22122196}
22132197
22142198DEVICE_IMAGE_LOAD(megaduck_cart)
22152199{
2200   gb_state *state = image.device().machine->driver_data<gb_state>();
22162201   int I;
22172202   UINT32 filesize;
22182203
22192204   for (I = 0; I < MAX_ROMBANK; I++)
2220      gb_driver_data.ROMMap[I] = NULL;
2205      state->ROMMap[I] = NULL;
22212206   for (I = 0; I < MAX_RAMBANK; I++)
2222      gb_driver_data.RAMMap[I] = NULL;
2207      state->RAMMap[I] = NULL;
22232208
22242209   if (image.software_entry() == NULL)
22252210      filesize = image.length();
r9784r9785
22322217      return IMAGE_INIT_FAIL;
22332218   }
22342219
2235   gb_driver_data.ROMBanks = filesize / 0x4000;
2220   state->ROMBanks = filesize / 0x4000;
22362221
22372222   /* Claim memory */
2238   gb_driver_data.gb_cart = auto_alloc_array(image.device().machine, UINT8, filesize);
2223   state->gb_cart = auto_alloc_array(image.device().machine, UINT8, filesize);
22392224
22402225   /* Read cartridge */
22412226   if (image.software_entry() == NULL)
22422227   {
2243      if (image.fread( gb_driver_data.gb_cart, filesize) != filesize)
2228      if (image.fread( state->gb_cart, filesize) != filesize)
22442229      {
22452230         image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file");
22462231         return IMAGE_INIT_FAIL;
r9784r9785
22482233   }
22492234   else
22502235   {
2251      memcpy(gb_driver_data.gb_cart, image.get_software_region("rom"), filesize);
2236      memcpy(state->gb_cart, image.get_software_region("rom"), filesize);
22522237   }
22532238
22542239   /* Log cart information */
22552240   {
22562241      logerror("Cart Information\n");
2257      logerror("\tRom Banks:        %d\n", gb_driver_data.ROMBanks);
2242      logerror("\tRom Banks:        %d\n", state->ROMBanks);
22582243   }
22592244
2260   for (I = 0; I < gb_driver_data.ROMBanks; I++)
2245   for (I = 0; I < state->ROMBanks; I++)
22612246   {
2262      gb_driver_data.ROMMap[I] = gb_driver_data.gb_cart + (I * 0x4000);
2247      state->ROMMap[I] = state->gb_cart + (I * 0x4000);
22632248   }
22642249
22652250   /* Build rom bank Mask */
2266   if (gb_driver_data.ROMBanks < 3)
2267      gb_driver_data.ROMMask = 0;
2251   if (state->ROMBanks < 3)
2252      state->ROMMask = 0;
22682253   else
22692254   {
2270      for (I = 1; I < gb_driver_data.ROMBanks; I <<= 1) ;
2271         gb_driver_data.ROMMask = I - 1;
2255      for (I = 1; I < state->ROMBanks; I <<= 1) ;
2256         state->ROMMask = I - 1;
22722257   }
22732258
2274   gb_driver_data.MBCType = MBC_MEGADUCK;
2259   state->MBCType = MBC_MEGADUCK;
22752260
22762261   return IMAGE_INIT_PASS;
22772262}
src/mess/machine/kc.c
r9784r9785
296296   "Disk Interface"
297297};
298298
299static const struct kc85_module *modules[256>>2];
300299/*
301300
302301    port xx80
r9784r9785
315314
316315 READ8_HANDLER(kc85_module_r)
317316{
317   kc_state *state = space->machine->driver_data<kc_state>();
318318   int port_upper;
319319   int module_index;
320320
r9784r9785
330330
331331   module_index = (port_upper>>2) & 0x03f;
332332
333   if (modules[module_index])
333   if (state->modules[module_index])
334334   {
335      return modules[module_index]->id;
335      return state->modules[module_index]->id;
336336   }
337337
338338   return 0x0ff;
r9784r9785
351351   state->kc85_module_rom = NULL;
352352   for (i=0; i<64; i++)
353353   {
354      modules[i] = NULL;
354      state->modules[i] = NULL;
355355   }
356356
357   modules[30] = &kc85_disk_interface_device;
357   state->modules[30] = &kc85_disk_interface_device;
358358}
359359
360360
src/mess/video/cpschngr.c
r9784r9785
7777   int bootleg_kludge;
7878};
7979
80static const struct CPS1config *cps1_game_config;
81
82
8380#define __not_applicable__   -1,-1,-1,-1,-1,-1,-1
8481
8582/*                     CPSB ID    multiply protection      unknown      ctrl     priority masks   palctrl    layer enable masks  */
r9784r9785
153150
154151static MACHINE_RESET( cps )
155152{
153   cpschngr_state *state = machine->driver_data<cpschngr_state>();
156154   const char *gamename = machine->gamedrv->name;
157155   const struct CPS1config *pCFG=&cps1_config_table[0];
158156
r9784r9785
164162      }
165163      pCFG++;
166164   }
167   cps1_game_config=pCFG;
165   state->cps1_game_config=pCFG;
168166}
169167
170168
r9784r9785
193191   /* Some games interrogate a couple of registers on bootup. */
194192   /* These are CPS1 board B self test checks. They wander from game to */
195193   /* game. */
196   if (offset == cps1_game_config->cpsb_addr/2)
197      return cps1_game_config->cpsb_value;
194   if (offset == state->cps1_game_config->cpsb_addr/2)
195      return state->cps1_game_config->cpsb_value;
198196
199197   /* some games use as a protection check the ability to do 16-bit multiplications */
200198   /* with a 32-bit result, by writing the factors to two ports and reading the */
201199   /* result from two other ports. */
202   if (offset == cps1_game_config->mult_result_lo/2)
203      return (state->cps1_cps_b_regs[cps1_game_config->mult_factor1/2] *
204            state->cps1_cps_b_regs[cps1_game_config->mult_factor2/2]) & 0xffff;
205   if (offset == cps1_game_config->mult_result_hi/2)
206      return (state->cps1_cps_b_regs[cps1_game_config->mult_factor1/2] *
207            state->cps1_cps_b_regs[cps1_game_config->mult_factor2/2]) >> 16;
200   if (offset == state->cps1_game_config->mult_result_lo/2)
201      return (state->cps1_cps_b_regs[state->cps1_game_config->mult_factor1/2] *
202            state->cps1_cps_b_regs[state->cps1_game_config->mult_factor2/2]) & 0xffff;
203   if (offset == state->cps1_game_config->mult_result_hi/2)
204      return (state->cps1_cps_b_regs[state->cps1_game_config->mult_factor1/2] *
205            state->cps1_cps_b_regs[state->cps1_game_config->mult_factor2/2]) >> 16;
208206
209   if (offset == cps1_game_config->in2_addr/2)   /* Extra input ports (on C-board) */
207   if (offset == state->cps1_game_config->in2_addr/2)   /* Extra input ports (on C-board) */
210208      return input_port_read(space->machine, "IN2");
211209
212   if (offset == cps1_game_config->in3_addr/2)   /* Player 4 controls (on C-board) ("Captain Commando") */
210   if (offset == state->cps1_game_config->in3_addr/2)   /* Player 4 controls (on C-board) ("Captain Commando") */
213211      return input_port_read(space->machine, "IN3");
214212
215213   return 0xffff;
r9784r9785
222220   data = COMBINE_DATA(&state->cps1_cps_b_regs[offset]);
223221
224222   // additional outputs on C-board
225   if (offset == cps1_game_config->out2_addr/2)
223   if (offset == state->cps1_game_config->out2_addr/2)
226224   {
227225      if (ACCESSING_BITS_0_7)
228226      {
229         if (cps1_game_config->cpsb_value == 0x0402)   // Mercs (CN2 connector)
227         if (state->cps1_game_config->cpsb_value == 0x0402)   // Mercs (CN2 connector)
230228         {
231229            coin_lockout_w(space->machine,2,~data & 0x01);
232230            set_led_status(space->machine,0,data & 0x02);
r9784r9785
330328   }
331329
332330   /* Some of the sf2 hacks use only sprite port 0x9100 and the scroll layers are offset */
333   if (cps1_game_config->bootleg_kludge == 1)
331   if (state->cps1_game_config->bootleg_kludge == 1)
334332   {
335333      state->cps1_cps_a_regs[CPS1_OBJ_BASE] = 0x9100;
336334      state->cps1_obj = cps1_base(state, CPS1_OBJ_BASE, cps1_obj_size);
r9784r9785
360358   state->stars2y = state->cps1_cps_a_regs[CPS1_STARS2_SCROLLY];
361359
362360   /* Get layer enable bits */
363   layercontrol = state->cps1_cps_b_regs[cps1_game_config->layer_control/2];
361   layercontrol = state->cps1_cps_b_regs[state->cps1_game_config->layer_control/2];
364362   videocontrol = state->cps1_cps_a_regs[CPS1_VIDEOCONTROL];
365   tilemap_set_enable(state->cps1_bg_tilemap[0],layercontrol & cps1_game_config->layer_enable_mask[0]);
366   tilemap_set_enable(state->cps1_bg_tilemap[1],(layercontrol & cps1_game_config->layer_enable_mask[1]) && (videocontrol & 4));
367   tilemap_set_enable(state->cps1_bg_tilemap[2],(layercontrol & cps1_game_config->layer_enable_mask[2]) && (videocontrol & 8));
368   state->cps1_stars_enabled[0] = layercontrol & cps1_game_config->layer_enable_mask[3];
369   state->cps1_stars_enabled[1] = layercontrol & cps1_game_config->layer_enable_mask[4];
363   tilemap_set_enable(state->cps1_bg_tilemap[0],layercontrol & state->cps1_game_config->layer_enable_mask[0]);
364   tilemap_set_enable(state->cps1_bg_tilemap[1],(layercontrol & state->cps1_game_config->layer_enable_mask[1]) && (videocontrol & 4));
365   tilemap_set_enable(state->cps1_bg_tilemap[2],(layercontrol & state->cps1_game_config->layer_enable_mask[2]) && (videocontrol & 8));
366   state->cps1_stars_enabled[0] = layercontrol & state->cps1_game_config->layer_enable_mask[3];
367   state->cps1_stars_enabled[1] = layercontrol & state->cps1_game_config->layer_enable_mask[4];
370368}
371369
372370
r9784r9785
388386
389387static int gfxrom_bank_mapper(running_machine *machine, int type, int code)
390388{
391   const struct gfx_range *range = cps1_game_config->bank_mapper;
389   cpschngr_state *state = machine->driver_data<cpschngr_state>();
390   const struct gfx_range *range = state->cps1_game_config->bank_mapper;
392391   int shift = 0;
393392
394393   assert(range);
r9784r9785
413412            int i;
414413
415414            for (i = 0; i < range->bank; ++i)
416               base += cps1_game_config->bank_sizes[i];
415               base += state->cps1_game_config->bank_sizes[i];
417416
418            return (base + (code & (cps1_game_config->bank_sizes[range->bank] - 1))) >> shift;
417            return (base + (code & (state->cps1_game_config->bank_sizes[range->bank] - 1))) >> shift;
419418         }
420419      }
421420
r9784r9785
530529      int mask;
531530
532531      /* Get transparency registers */
533      if (cps1_game_config->priority[i] != -1)
534         mask = state->cps1_cps_b_regs[cps1_game_config->priority[i]/2] ^ 0xffff;
532      if (state->cps1_game_config->priority[i] != -1)
533         mask = state->cps1_cps_b_regs[state->cps1_game_config->priority[i]/2] ^ 0xffff;
535534      else mask = 0xffff;   /* completely transparent if priority masks not defined (qad) */
536535
537536      tilemap_set_transmask(state->cps1_bg_tilemap[0],i,mask,0x8000);
r9784r9785
575574   state->cps1_cps_a_regs[CPS1_SCROLL3_BASE] = 0x9080;
576575   state->cps1_cps_a_regs[CPS1_OTHER_BASE]   = 0x9100;
577576
578   assert_always(cps1_game_config, "cps1_game_config hasn't been set up yet");
577   assert_always(state->cps1_game_config, "state->cps1_game_config hasn't been set up yet");
579578
580579   /* Set up old base */
581580   cps1_get_video_base(state);   /* Calculate base pointers */
r9784r9785
598597   int offset, page;
599598   const UINT16 *palette_ram = palette_base;
600599
601   int ctrl = state->cps1_cps_b_regs[cps1_game_config->palette_control/2];
600   int ctrl = state->cps1_cps_b_regs[state->cps1_game_config->palette_control/2];
602601
603602   for (page = 0; page < 6; ++page)
604603   {
r9784r9785
676675   UINT16 *base=state->cps1_buffered_obj;
677676
678677   /* some sf2 hacks draw the sprites in reverse order */
679   if (cps1_game_config->bootleg_kludge == 1)
678   if (state->cps1_game_config->bootleg_kludge == 1)
680679   {
681680      base += state->cps1_last_sprite_offset;
682681      baseadd = -4;
r9784r9785
912911
913912   flip_screen_set(screen->machine, videocontrol & 0x8000);
914913
915   layercontrol = state->cps1_cps_b_regs[cps1_game_config->layer_control/2];
914   layercontrol = state->cps1_cps_b_regs[state->cps1_game_config->layer_control/2];
916915
917916   /* Get video memory base registers */
918917   cps1_get_video_base(state);
src/mess/video/gb.c
r9784r9785
1515***************************************************************************/
1616
1717#include "emu.h"
18#include "includes/gb.h"
1918#include "cpu/lr35902/lr35902.h"
2019#include "profiler.h"
20#include "includes/gb.h"
2121
22#define LCDCONT      gb_lcd.gb_vid_regs[0x00]   /* LCD control register                       */
23#define LCDSTAT      gb_lcd.gb_vid_regs[0x01]   /* LCD status register                        */
24#define SCROLLY      gb_lcd.gb_vid_regs[0x02]   /* Starting Y position of the background      */
25#define SCROLLX      gb_lcd.gb_vid_regs[0x03]   /* Starting X position of the background      */
26#define CURLINE      gb_lcd.gb_vid_regs[0x04]   /* Current screen line being scanned          */
27#define CMPLINE      gb_lcd.gb_vid_regs[0x05]   /* Gen. int. when scan reaches this line      */
28#define BGRDPAL      gb_lcd.gb_vid_regs[0x07]   /* Background palette                         */
29#define SPR0PAL      gb_lcd.gb_vid_regs[0x08]   /* Sprite palette #0                          */
30#define SPR1PAL      gb_lcd.gb_vid_regs[0x09]   /* Sprite palette #1                          */
31#define WNDPOSY      gb_lcd.gb_vid_regs[0x0A]   /* Window Y position                          */
32#define WNDPOSX      gb_lcd.gb_vid_regs[0x0B]   /* Window X position                          */
33#define KEY1      gb_lcd.gb_vid_regs[0x0D]   /* Prepare speed switch                       */
34#define HDMA1      gb_lcd.gb_vid_regs[0x11]   /* HDMA source high byte                      */
35#define HDMA2      gb_lcd.gb_vid_regs[0x12]   /* HDMA source low byte                       */
36#define HDMA3      gb_lcd.gb_vid_regs[0x13]   /* HDMA destination high byte                 */
37#define HDMA4      gb_lcd.gb_vid_regs[0x14]   /* HDMA destination low byte                  */
38#define HDMA5      gb_lcd.gb_vid_regs[0x15]   /* HDMA length/mode/start                     */
39#define GBCBCPS      gb_lcd.gb_vid_regs[0x28]   /* Backgound palette spec                     */
40#define GBCBCPD      gb_lcd.gb_vid_regs[0x29]   /* Backgound palette data                     */
41#define GBCOCPS      gb_lcd.gb_vid_regs[0x2A]   /* Object palette spec                        */
42#define GBCOCPD      gb_lcd.gb_vid_regs[0x2B]   /* Object palette data                        */
22#define LCDCONT      state->lcd.gb_vid_regs[0x00]   /* LCD control register                       */
23#define LCDSTAT      state->lcd.gb_vid_regs[0x01]   /* LCD status register                        */
24#define SCROLLY      state->lcd.gb_vid_regs[0x02]   /* Starting Y position of the background      */
25#define SCROLLX      state->lcd.gb_vid_regs[0x03]   /* Starting X position of the background      */
26#define CURLINE      state->lcd.gb_vid_regs[0x04]   /* Current screen line being scanned          */
27#define CMPLINE      state->lcd.gb_vid_regs[0x05]   /* Gen. int. when scan reaches this line      */
28#define BGRDPAL      state->lcd.gb_vid_regs[0x07]   /* Background palette                         */
29#define SPR0PAL      state->lcd.gb_vid_regs[0x08]   /* Sprite palette #0                          */
30#define SPR1PAL      state->lcd.gb_vid_regs[0x09]   /* Sprite palette #1                          */
31#define WNDPOSY      state->lcd.gb_vid_regs[0x0A]   /* Window Y position                          */
32#define WNDPOSX      state->lcd.gb_vid_regs[0x0B]   /* Window X position                          */
33#define KEY1      state->lcd.gb_vid_regs[0x0D]   /* Prepare speed switch                       */
34#define HDMA1      state->lcd.gb_vid_regs[0x11]   /* HDMA source high byte                      */
35#define HDMA2      state->lcd.gb_vid_regs[0x12]   /* HDMA source low byte                       */
36#define HDMA3      state->lcd.gb_vid_regs[0x13]   /* HDMA destination high byte                 */
37#define HDMA4      state->lcd.gb_vid_regs[0x14]   /* HDMA destination low byte                  */
38#define HDMA5      state->lcd.gb_vid_regs[0x15]   /* HDMA length/mode/start                     */
39#define GBCBCPS      state->lcd.gb_vid_regs[0x28]   /* Backgound palette spec                     */
40#define GBCBCPD      state->lcd.gb_vid_regs[0x29]   /* Backgound palette data                     */
41#define GBCOCPS      state->lcd.gb_vid_regs[0x2A]   /* Object palette spec                        */
42#define GBCOCPD      state->lcd.gb_vid_regs[0x2B]   /* Object palette data                        */
4343
4444enum {
4545   UNLOCKED=0,
4646   LOCKED
4747};
4848
49#define _NR_GB_VID_REGS      0x40
5049
51struct layer_struct {
52   UINT8  enabled;
53   UINT8  *bg_tiles;
54   UINT8  *bg_map;
55   UINT8  xindex;
56   UINT8  xshift;
57   UINT8  xstart;
58   UINT8  xend;
59   /* GBC specific */
60   UINT8  *gbc_map;
61   INT16  bgline;
62};
63
64static struct gb_lcd_struct {
65   int   window_lines_drawn;
66
67   UINT8   gb_vid_regs[_NR_GB_VID_REGS];
68   UINT8   bg_zbuf[160];
69
70   UINT16   cgb_bpal[32];   /* CGB current background palette table */
71   UINT16   cgb_spal[32];   /* CGB current sprite palette table */
72
73   UINT8   gb_bpal[4];      /* Background palette */
74   UINT8   gb_spal0[4];   /* Sprite 0 palette */
75   UINT8   gb_spal1[4];   /* Sprite 1 palette */
76
77   /* Things used to render current line */
78   int   current_line;      /* Current line */
79   int cmp_line;         /* Compare line */
80   int   sprCount;         /* Number of sprites on current line */
81   int   sprite[10];         /* References to sprites to draw on current line */
82   int   previous_line;      /* Previous line we've drawn in */
83   int   start_x;         /* Pixel to start drawing from (inclusive) */
84   int   end_x;            /* Pixel to end drawing (exclusive) */
85   int mode;            /* Keep track of internal STAT mode */
86   int state;            /* Current state of the video state machine */
87   int lcd_irq_line;
88   int triggering_line_irq;
89   int line_irq;
90   int triggering_mode_irq;
91   int mode_irq;
92   int delayed_line_irq;
93   int sprite_cycles;
94   int scrollx_adjust;
95   int oam_locked;
96   int vram_locked;
97   int pal_locked;
98   int hdma_enabled;
99   int hdma_possible;
100   struct layer_struct   layer[2];
101   emu_timer   *lcd_timer;
102   int gbc_mode;
103
104   region_info   *gb_vram;      /* Pointer to VRAM */
105   region_info *gb_oam;      /* Pointer to OAM memory */
106   UINT8   *gb_vram_ptr;
107   UINT8   *gb_chrgen;      /* Character generator */
108   UINT8   *gb_bgdtab;      /* Background character table */
109   UINT8   *gb_wndtab;      /* Window character table */
110   UINT8   gb_tile_no_mod;
111   UINT8   *gbc_chrgen;   /* CGB Character generator */
112   UINT8   *gbc_bgdtab;   /* CGB Background character table */
113   UINT8   *gbc_wndtab;   /* CGB Window character table */
114} gb_lcd;
115
116static void (*update_scanline)( running_machine *machine );
117
11850/* Prototypes */
11951static TIMER_CALLBACK(gb_lcd_timer_proc);
12052static TIMER_CALLBACK(gbc_lcd_timer_proc);
r9784r9785
16698
16799PALETTE_INIT( sgb )
168100{
101   gb_state *state = machine->driver_data<gb_state>();
169102   int ii, r, g, b;
170103
171104   for( ii = 0; ii < 32768; ii++ )
r9784r9785
177110   }
178111
179112   /* Some default colours for non-SGB games */
180   sgb_pal[0] = 32767;
181   sgb_pal[1] = 21140;
182   sgb_pal[2] = 10570;
183   sgb_pal[3] = 0;
113   state->sgb_pal[0] = 32767;
114   state->sgb_pal[1] = 21140;
115   state->sgb_pal[2] = 10570;
116   state->sgb_pal[3] = 0;
184117   /* The rest of the colortable can be black */
185118   for( ii = 4; ii < 8*16; ii++ )
186      sgb_pal[ii] = 0;
119      state->sgb_pal[ii] = 0;
187120}
188121
189122PALETTE_INIT( gbc )
190123{
124   gb_state *state = machine->driver_data<gb_state>();
191125   int ii, r, g, b;
192126
193127   for( ii = 0; ii < 32768; ii++ )
r9784r9785
200134
201135   /* Background is initialised as white */
202136   for( ii = 0; ii < 32; ii++ )
203      gb_lcd.cgb_bpal[ii] = 32767;
137      state->lcd.cgb_bpal[ii] = 32767;
204138   /* Sprites are supposed to be uninitialized, but we'll make them black */
205139   for( ii = 0; ii < 32; ii++ )
206      gb_lcd.cgb_spal[ii] = 0;
140      state->lcd.cgb_spal[ii] = 0;
207141}
208142
209143PALETTE_INIT( megaduck )
r9784r9785
225159  Select which sprites should be drawn for the current scanline and return the
226160  number of sprites selected.
227161 */
228static void gb_select_sprites( void )
162static void gb_select_sprites( gb_state *state )
229163{
230164   int   i, /*yindex,*/ line, height;
231   UINT8   *oam = gb_lcd.gb_oam->base() + 39 * 4;
165   UINT8   *oam = state->lcd.gb_oam->base() + 39 * 4;
232166
233   gb_lcd.sprCount = 0;
167   state->lcd.sprCount = 0;
234168
235169   /* If video hardware is enabled and sprites are enabled */
236170   if ( ( LCDCONT & 0x80 ) && ( LCDCONT & 0x02 ) )
r9784r9785
245179         height = 8;
246180      }
247181
248      //yindex = gb_lcd.current_line;
249      line = gb_lcd.current_line + 16;
182      //yindex = state->lcd.current_line;
183      line = state->lcd.current_line + 16;
250184
251185      for( i = 39; i >= 0; i-- )
252186      {
r9784r9785
254188         {
255189            /* We limit the sprite count to max 10 here;
256190                   proper games should not exceed this... */
257            if ( gb_lcd.sprCount < 10 )
191            if ( state->lcd.sprCount < 10 )
258192            {
259               gb_lcd.sprite[gb_lcd.sprCount] = i;
260               gb_lcd.sprCount++;
193               state->lcd.sprite[state->lcd.sprCount] = i;
194               state->lcd.sprCount++;
261195            }
262196         }
263197         oam -= 4;
r9784r9785
267201
268202INLINE void gb_update_sprites ( running_machine *machine )
269203{
204   gb_state *state = machine->driver_data<gb_state>();
270205   bitmap_t *bitmap = machine->generic.tmpbitmap;
271206   UINT8 height, tilemask, line, *oam, *vram;
272207   int i, yindex;
r9784r9785
282217      tilemask = 0xFF;
283218   }
284219
285   yindex = gb_lcd.current_line;
286   line = gb_lcd.current_line + 16;
220   yindex = state->lcd.current_line;
221   line = state->lcd.current_line + 16;
287222
288   oam = gb_lcd.gb_oam->base() + 39 * 4;
289   vram = gb_lcd.gb_vram->base();
223   oam = state->lcd.gb_oam->base() + 39 * 4;
224   vram = state->lcd.gb_vram->base();
290225   for (i = 39; i >= 0; i--)
291226   {
292227      /* if sprite is on current line && x-coordinate && x-coordinate is < 168 */
r9784r9785
296231         UINT8 bit, *spal;
297232         int xindex, adr;
298233
299         spal = (oam[3] & 0x10) ? gb_lcd.gb_spal1 : gb_lcd.gb_spal0;
234         spal = (oam[3] & 0x10) ? state->lcd.gb_spal1 : state->lcd.gb_spal0;
300235         xindex = oam[1] - 8;
301236         if (oam[3] & 0x40)         /* flip y ? */
302237         {
r9784r9785
314249            for (bit = 0; bit < 8; bit++, xindex++)
315250            {
316251               register int colour = ((data & 0x0100) ? 2 : 0) | ((data & 0x0001) ? 1 : 0);
317               if (colour && !gb_lcd.bg_zbuf[xindex] && xindex >= 0 && xindex < 160)
252               if (colour && !state->lcd.bg_zbuf[xindex] && xindex >= 0 && xindex < 160)
318253                  gb_plot_pixel(bitmap, xindex, yindex, spal[colour]);
319254               data >>= 1;
320255            }
r9784r9785
332267            for (bit = 0; bit < 8 && xindex < 160; bit++, xindex++)
333268            {
334269               register int colour = ((data & 0x8000) ? 2 : 0) | ((data & 0x0080) ? 1 : 0);
335               if (colour && !gb_lcd.bg_zbuf[xindex] && xindex >= 0 && xindex < 160)
270               if (colour && !state->lcd.bg_zbuf[xindex] && xindex >= 0 && xindex < 160)
336271                  gb_plot_pixel(bitmap, xindex, yindex, spal[colour]);
337272               data <<= 1;
338273            }
r9784r9785
354289
355290static void gb_update_scanline( running_machine *machine )
356291{
292   gb_state *state = machine->driver_data<gb_state>();
357293   bitmap_t *bitmap = machine->generic.tmpbitmap;
358294
359295   g_profiler.start(PROFILER_VIDEO);
r9784r9785
362298   if ( ( LCDSTAT & 0x03 ) == 0x03 )
363299   {
364300      /* Calculate number of pixels to render based on time still left on the timer */
365      UINT32 cycles_to_go = machine->device<cpu_device>("maincpu")->attotime_to_cycles(timer_timeleft( gb_lcd.lcd_timer ) );
301      UINT32 cycles_to_go = machine->device<cpu_device>("maincpu")->attotime_to_cycles(timer_timeleft( state->lcd.lcd_timer ) );
366302      int l = 0;
367303
368      if ( gb_lcd.start_x < 0 )
304      if ( state->lcd.start_x < 0 )
369305      {
370306         /* Window is enabled if the hardware says so AND the current scanline is
371307             * within the window AND the window X coordinate is <=166 */
372         gb_lcd.layer[1].enabled = ( ( LCDCONT & 0x20 ) && ( gb_lcd.current_line >= WNDPOSY ) && ( WNDPOSX <= 166 ) ) ? 1 : 0;
308         state->lcd.layer[1].enabled = ( ( LCDCONT & 0x20 ) && ( state->lcd.current_line >= WNDPOSY ) && ( WNDPOSX <= 166 ) ) ? 1 : 0;
373309
374310         /* BG is enabled if the hardware says so AND (window_off OR (window_on
375311            * AND window's X position is >=7 ) ) */
376         gb_lcd.layer[0].enabled = ( ( LCDCONT & 0x01 ) && ( ( ! gb_lcd.layer[1].enabled ) || ( gb_lcd.layer[1].enabled && ( WNDPOSX >= 7 ) ) ) ) ? 1 : 0;
312         state->lcd.layer[0].enabled = ( ( LCDCONT & 0x01 ) && ( ( ! state->lcd.layer[1].enabled ) || ( state->lcd.layer[1].enabled && ( WNDPOSX >= 7 ) ) ) ) ? 1 : 0;
377313
378         if ( gb_lcd.layer[0].enabled )
314         if ( state->lcd.layer[0].enabled )
379315         {
380            gb_lcd.layer[0].bgline = ( SCROLLY + gb_lcd.current_line ) & 0xFF;
381            gb_lcd.layer[0].bg_map = gb_lcd.gb_bgdtab;
382            gb_lcd.layer[0].bg_tiles = gb_lcd.gb_chrgen;
383            gb_lcd.layer[0].xindex = SCROLLX >> 3;
384            gb_lcd.layer[0].xshift = SCROLLX & 7;
385            gb_lcd.layer[0].xstart = 0;
386            gb_lcd.layer[0].xend = 160;
316            state->lcd.layer[0].bgline = ( SCROLLY + state->lcd.current_line ) & 0xFF;
317            state->lcd.layer[0].bg_map = state->lcd.gb_bgdtab;
318            state->lcd.layer[0].bg_tiles = state->lcd.gb_chrgen;
319            state->lcd.layer[0].xindex = SCROLLX >> 3;
320            state->lcd.layer[0].xshift = SCROLLX & 7;
321            state->lcd.layer[0].xstart = 0;
322            state->lcd.layer[0].xend = 160;
387323         }
388324
389         if ( gb_lcd.layer[1].enabled )
325         if ( state->lcd.layer[1].enabled )
390326         {
391327            int xpos;
392328
r9784r9785
394330            if ( xpos < 0 )
395331               xpos = 0;
396332
397            gb_lcd.layer[1].bgline = gb_lcd.window_lines_drawn;
398            gb_lcd.layer[1].bg_map = gb_lcd.gb_wndtab;
399            gb_lcd.layer[1].bg_tiles = gb_lcd.gb_chrgen;
400            gb_lcd.layer[1].xindex = 0;
401            gb_lcd.layer[1].xshift = 0;
402            gb_lcd.layer[1].xstart = xpos;
403            gb_lcd.layer[1].xend = 160;
404            gb_lcd.layer[0].xend = xpos;
333            state->lcd.layer[1].bgline = state->lcd.window_lines_drawn;
334            state->lcd.layer[1].bg_map = state->lcd.gb_wndtab;
335            state->lcd.layer[1].bg_tiles = state->lcd.gb_chrgen;
336            state->lcd.layer[1].xindex = 0;
337            state->lcd.layer[1].xshift = 0;
338            state->lcd.layer[1].xstart = xpos;
339            state->lcd.layer[1].xend = 160;
340            state->lcd.layer[0].xend = xpos;
405341         }
406         gb_lcd.start_x = 0;
342         state->lcd.start_x = 0;
407343      }
408344
409345      if ( cycles_to_go < 160 )
410346      {
411         gb_lcd.end_x = MIN(160 - cycles_to_go,160);
347         state->lcd.end_x = MIN(160 - cycles_to_go,160);
412348         /* Draw empty pixels when the background is disabled */
413349         if ( ! ( LCDCONT & 0x01 ) )
414350         {
415351            rectangle r;
416            r.min_y = r.max_y = gb_lcd.current_line;
417            r.min_x = gb_lcd.start_x;
418            r.max_x = gb_lcd.end_x - 1;
419            bitmap_fill( bitmap, &r , gb_lcd.gb_bpal[0]);
352            r.min_y = r.max_y = state->lcd.current_line;
353            r.min_x = state->lcd.start_x;
354            r.max_x = state->lcd.end_x - 1;
355            bitmap_fill( bitmap, &r , state->lcd.gb_bpal[0]);
420356         }
421357         while ( l < 2 )
422358         {
r9784r9785
424360            UINT16   data;
425361            int   i, tile_index;
426362
427            if ( ! gb_lcd.layer[l].enabled )
363            if ( ! state->lcd.layer[l].enabled )
428364            {
429365               l++;
430366               continue;
431367            }
432            map = gb_lcd.layer[l].bg_map + ( ( gb_lcd.layer[l].bgline << 2 ) & 0x3E0 );
433            tiles = gb_lcd.layer[l].bg_tiles + ( ( gb_lcd.layer[l].bgline & 7 ) << 1 );
434            xindex = gb_lcd.start_x;
435            if ( xindex < gb_lcd.layer[l].xstart )
436               xindex = gb_lcd.layer[l].xstart;
437            i = gb_lcd.end_x;
438            if ( i > gb_lcd.layer[l].xend )
439               i = gb_lcd.layer[l].xend;
368            map = state->lcd.layer[l].bg_map + ( ( state->lcd.layer[l].bgline << 2 ) & 0x3E0 );
369            tiles = state->lcd.layer[l].bg_tiles + ( ( state->lcd.layer[l].bgline & 7 ) << 1 );
370            xindex = state->lcd.start_x;
371            if ( xindex < state->lcd.layer[l].xstart )
372               xindex = state->lcd.layer[l].xstart;
373            i = state->lcd.end_x;
374            if ( i > state->lcd.layer[l].xend )
375               i = state->lcd.layer[l].xend;
440376            i = i - xindex;
441377
442            tile_index = ( map[ gb_lcd.layer[l].xindex ] ^ gb_lcd.gb_tile_no_mod ) * 16;
378            tile_index = ( map[ state->lcd.layer[l].xindex ] ^ state->lcd.gb_tile_no_mod ) * 16;
443379            data = tiles[ tile_index ] | ( tiles[ tile_index+1 ] << 8 );
444            data <<= gb_lcd.layer[l].xshift;
380            data <<= state->lcd.layer[l].xshift;
445381
446382            while ( i > 0 )
447383            {
448               while ( ( gb_lcd.layer[l].xshift < 8 ) && i )
384               while ( ( state->lcd.layer[l].xshift < 8 ) && i )
449385               {
450386                  register int colour = ( ( data & 0x8000 ) ? 2 : 0 ) | ( ( data & 0x0080 ) ? 1 : 0 );
451                  gb_plot_pixel( bitmap, xindex, gb_lcd.current_line, gb_lcd.gb_bpal[ colour ] );
452                  gb_lcd.bg_zbuf[ xindex ] = colour;
387                  gb_plot_pixel( bitmap, xindex, state->lcd.current_line, state->lcd.gb_bpal[ colour ] );
388                  state->lcd.bg_zbuf[ xindex ] = colour;
453389                  xindex++;
454390                  data <<= 1;
455                  gb_lcd.layer[l].xshift++;
391                  state->lcd.layer[l].xshift++;
456392                  i--;
457393               }
458               if ( gb_lcd.layer[l].xshift == 8 )
394               if ( state->lcd.layer[l].xshift == 8 )
459395               {
460396                  /* Take possible changes to SCROLLY into account */
461397                  if ( l == 0 )
462398                  {
463                     gb_lcd.layer[0].bgline = ( SCROLLY + gb_lcd.current_line ) & 0xFF;
464                     map = gb_lcd.layer[l].bg_map + ( ( gb_lcd.layer[l].bgline << 2 ) & 0x3E0 );
465                     tiles = gb_lcd.layer[l].bg_tiles + ( ( gb_lcd.layer[l].bgline & 7 ) << 1 );
399                     state->lcd.layer[0].bgline = ( SCROLLY + state->lcd.current_line ) & 0xFF;
400                     map = state->lcd.layer[l].bg_map + ( ( state->lcd.layer[l].bgline << 2 ) & 0x3E0 );
401                     tiles = state->lcd.layer[l].bg_tiles + ( ( state->lcd.layer[l].bgline & 7 ) << 1 );
466402                  }
467403
468                  gb_lcd.layer[l].xindex = ( gb_lcd.layer[l].xindex + 1 ) & 31;
469                  gb_lcd.layer[l].xshift = 0;
470                  tile_index = ( map[ gb_lcd.layer[l].xindex ] ^ gb_lcd.gb_tile_no_mod ) * 16;
404                  state->lcd.layer[l].xindex = ( state->lcd.layer[l].xindex + 1 ) & 31;
405                  state->lcd.layer[l].xshift = 0;
406                  tile_index = ( map[ state->lcd.layer[l].xindex ] ^ state->lcd.gb_tile_no_mod ) * 16;
471407                  data = tiles[ tile_index ] | ( tiles[ tile_index+1 ] << 8 );
472408               }
473409            }
474410            l++;
475411         }
476         if ( gb_lcd.end_x == 160 && LCDCONT & 0x02 )
412         if ( state->lcd.end_x == 160 && LCDCONT & 0x02 )
477413         {
478414            gb_update_sprites(machine);
479415         }
480         gb_lcd.start_x = gb_lcd.end_x;
416         state->lcd.start_x = state->lcd.end_x;
481417      }
482418   }
483419   else
r9784r9785
485421      if ( ! ( LCDCONT & 0x80 ) )
486422      {
487423         /* Draw an empty line when LCD is disabled */
488         if ( gb_lcd.previous_line != gb_lcd.current_line )
424         if ( state->lcd.previous_line != state->lcd.current_line )
489425         {
490            if ( gb_lcd.current_line < 144 )
426            if ( state->lcd.current_line < 144 )
491427            {
492428               screen_device *screen = machine->first_screen();
493429               rectangle r1;
494430               const rectangle &r = screen->visible_area();
495               r1.min_y = r1.max_y = gb_lcd.current_line;
431               r1.min_y = r1.max_y = state->lcd.current_line;
496432               r1.min_x = r.min_x;
497433               r1.max_x = r.max_x;
498434               bitmap_fill( bitmap, &r1 , 0);
499435            }
500            gb_lcd.previous_line = gb_lcd.current_line;
436            state->lcd.previous_line = state->lcd.current_line;
501437         }
502438      }
503439   }
r9784r9785
509445
510446INLINE void sgb_update_sprites (running_machine *machine)
511447{
448   gb_state *state = machine->driver_data<gb_state>();
512449   bitmap_t *bitmap = machine->generic.tmpbitmap;
513450   UINT8 height, tilemask, line, *oam, *vram, pal;
514451   INT16 i, yindex;
r9784r9785
525462   }
526463
527464   /* Offset to center of screen */
528   yindex = gb_lcd.current_line + SGB_YOFFSET;
529   line = gb_lcd.current_line + 16;
465   yindex = state->lcd.current_line + SGB_YOFFSET;
466   line = state->lcd.current_line + 16;
530467
531   oam = gb_lcd.gb_oam->base() + 39 * 4;
532   vram = gb_lcd.gb_vram->base();
468   oam = state->lcd.gb_oam->base() + 39 * 4;
469   vram = state->lcd.gb_vram->base();
533470   for (i = 39; i >= 0; i--)
534471   {
535472      /* if sprite is on current line && x-coordinate && x-coordinate is < 168 */
r9784r9785
540477         INT16 xindex;
541478         int adr;
542479
543         spal = (oam[3] & 0x10) ? gb_lcd.gb_spal1 : gb_lcd.gb_spal0;
480         spal = (oam[3] & 0x10) ? state->lcd.gb_spal1 : state->lcd.gb_spal0;
544481         xindex = oam[1] - 8;
545482         if (oam[3] & 0x40)         /* flip y ? */
546483         {
r9784r9785
553490         data = (vram[adr + 1] << 8) | vram[adr];
554491
555492         /* Find the palette to use */
556         pal = sgb_pal_map[(xindex >> 3)][((yindex - SGB_YOFFSET) >> 3)] << 2;
493         pal = state->sgb_pal_map[(xindex >> 3)][((yindex - SGB_YOFFSET) >> 3)] << 2;
557494
558495         /* Offset to center of screen */
559496         xindex += SGB_XOFFSET;
r9784r9785
564501            for (bit = 0; bit < 8; bit++, xindex++)
565502            {
566503               register int colour = ((data & 0x0100) ? 2 : 0) | ((data & 0x0001) ? 1 : 0);
567               if ((xindex >= SGB_XOFFSET && xindex < SGB_XOFFSET + 160) && colour && !gb_lcd.bg_zbuf[xindex - SGB_XOFFSET])
568                  gb_plot_pixel(bitmap, xindex, yindex, sgb_pal[pal + spal[colour]]);
504               if ((xindex >= SGB_XOFFSET && xindex < SGB_XOFFSET + 160) && colour && !state->lcd.bg_zbuf[xindex - SGB_XOFFSET])
505                  gb_plot_pixel(bitmap, xindex, yindex, state->sgb_pal[pal + spal[colour]]);
569506               data >>= 1;
570507            }
571508            break;
r9784r9785
574511            {
575512               register int colour = ((data & 0x0100) ? 2 : 0) | ((data & 0x0001) ? 1 : 0);
576513               if ((xindex >= SGB_XOFFSET && xindex < SGB_XOFFSET + 160) && colour)
577                  gb_plot_pixel(bitmap, xindex, yindex, sgb_pal[pal + spal[colour]]);
514                  gb_plot_pixel(bitmap, xindex, yindex, state->sgb_pal[pal + spal[colour]]);
578515               data >>= 1;
579516            }
580517            break;
r9784r9785
582519            for (bit = 0; bit < 8; bit++, xindex++)
583520            {
584521               register int colour = ((data & 0x8000) ? 2 : 0) | ((data & 0x0080) ? 1 : 0);
585               if ((xindex >= SGB_XOFFSET && xindex < SGB_XOFFSET + 160) && colour && !gb_lcd.bg_zbuf[xindex - SGB_XOFFSET])
586                  gb_plot_pixel(bitmap, xindex, yindex, sgb_pal[pal + spal[colour]]);
522               if ((xindex >= SGB_XOFFSET && xindex < SGB_XOFFSET + 160) && colour && !state->lcd.bg_zbuf[xindex - SGB_XOFFSET])
523                  gb_plot_pixel(bitmap, xindex, yindex, state->sgb_pal[pal + spal[colour]]);
587524               data <<= 1;
588525            }
589526            break;
r9784r9785
592529            {
593530               register int colour = ((data & 0x8000) ? 2 : 0) | ((data & 0x0080) ? 1 : 0);
594531               if ((xindex >= SGB_XOFFSET && xindex < SGB_XOFFSET + 160) && colour)
595                  gb_plot_pixel(bitmap, xindex, yindex, sgb_pal[pal + spal[colour]]);
532                  gb_plot_pixel(bitmap, xindex, yindex, state->sgb_pal[pal + spal[colour]]);
596533               data <<= 1;
597534            }
598535            break;
r9784r9785
604541
605542static void sgb_refresh_border(running_machine *machine)
606543{
544   gb_state *state = machine->driver_data<gb_state>();
607545   UINT16 data, data2;
608546   UINT16 yidx, xidx, xindex;
609547   UINT8 *map, *tiles, *tiles2;
610548   UINT8 pal, i;
611549   bitmap_t *bitmap = machine->generic.tmpbitmap;
612550
613   map = sgb_tile_map - 64;
551   map = state->sgb_tile_map - 64;
614552
615553   for( yidx = 0; yidx < 224; yidx++ )
616554   {
r9784r9785
619557      for( xidx = 0; xidx < 64; xidx+=2 )
620558      {
621559         if( map[xidx+1] & 0x80 ) /* Vertical flip */
622            tiles = sgb_tile_data + ( ( 7 - ( yidx % 8 ) ) << 1 );
560            tiles = state->sgb_tile_data + ( ( 7 - ( yidx % 8 ) ) << 1 );
623561         else /* No vertical flip */
624            tiles = sgb_tile_data + ( ( yidx % 8 ) << 1 );
562            tiles = state->sgb_tile_data + ( ( yidx % 8 ) << 1 );
625563         tiles2 = tiles + 16;
626564
627565         pal = (map[xidx+1] & 0x1C) >> 2;
r9784r9785
629567            pal = 1;
630568         pal <<= 4;
631569
632         if( sgb_hack )
570         if( state->sgb_hack )
633571         { /* A few games do weird stuff */
634572            UINT8 tileno = map[xidx];
635573            if( tileno >= 128 ) tileno = ((64 + tileno) % 128) + 128;
r9784r9785
667605            if( !((yidx >= SGB_YOFFSET && yidx < SGB_YOFFSET + 144) &&
668606               (xindex >= SGB_XOFFSET && xindex < SGB_XOFFSET + 160)) )
669607            {
670               gb_plot_pixel(bitmap, xindex, yidx, sgb_pal[pal + colour]);
608               gb_plot_pixel(bitmap, xindex, yidx, state->sgb_pal[pal + colour]);
671609            }
672610            xindex++;
673611         }
r9784r9785
677615
678616static void sgb_update_scanline( running_machine *machine )
679617{
618   gb_state *state = machine->driver_data<gb_state>();
680619   bitmap_t *bitmap = machine->generic.tmpbitmap;
681620
682621   g_profiler.start(PROFILER_VIDEO);
r9784r9785
684623   if ( ( LCDSTAT & 0x03 ) == 0x03 )
685624   {
686625      /* Calcuate number of pixels to render based on time still left on the timer */
687      UINT32 cycles_to_go = machine->device<cpu_device>("maincpu")->attotime_to_cycles(timer_timeleft( gb_lcd.lcd_timer ) );
626      UINT32 cycles_to_go = machine->device<cpu_device>("maincpu")->attotime_to_cycles(timer_timeleft( state->lcd.lcd_timer ) );
688627      int l = 0;
689628
690      if ( gb_lcd.start_x < 0 )
629      if ( state->lcd.start_x < 0 )
691630      {
692631         /* Window is enabled if the hardware says so AND the current scanline is
693632             * within the window AND the window X coordinate is <=166 */
694         gb_lcd.layer[1].enabled = ((LCDCONT & 0x20) && gb_lcd.current_line >= WNDPOSY && WNDPOSX <= 166) ? 1 : 0;
633         state->lcd.layer[1].enabled = ((LCDCONT & 0x20) && state->lcd.current_line >= WNDPOSY && WNDPOSX <= 166) ? 1 : 0;
695634
696635         /* BG is enabled if the hardware says so AND (window_off OR (window_on
697636             * AND window's X position is >=7 ) ) */
698         gb_lcd.layer[0].enabled = ((LCDCONT & 0x01) && ((!gb_lcd.layer[1].enabled) || (gb_lcd.layer[1].enabled && WNDPOSX >= 7))) ? 1 : 0;
637         state->lcd.layer[0].enabled = ((LCDCONT & 0x01) && ((!state->lcd.layer[1].enabled) || (state->lcd.layer[1].enabled && WNDPOSX >= 7))) ? 1 : 0;
699638
700         if ( gb_lcd.layer[0].enabled )
639         if ( state->lcd.layer[0].enabled )
701640         {
702            gb_lcd.layer[0].bgline = ( SCROLLY + gb_lcd.current_line ) & 0xFF;
703            gb_lcd.layer[0].bg_map = gb_lcd.gb_bgdtab;
704            gb_lcd.layer[0].bg_tiles = gb_lcd.gb_chrgen;
705            gb_lcd.layer[0].xindex = SCROLLX >> 3;
706            gb_lcd.layer[0].xshift = SCROLLX & 7;
707            gb_lcd.layer[0].xstart = 0;
708            gb_lcd.layer[0].xend = 160;
641            state->lcd.layer[0].bgline = ( SCROLLY + state->lcd.current_line ) & 0xFF;
642            state->lcd.layer[0].bg_map = state->lcd.gb_bgdtab;
643            state->lcd.layer[0].bg_tiles = state->lcd.gb_chrgen;
644            state->lcd.layer[0].xindex = SCROLLX >> 3;
645            state->lcd.layer[0].xshift = SCROLLX & 7;
646            state->lcd.layer[0].xstart = 0;
647            state->lcd.layer[0].xend = 160;
709648         }
710649
711         if ( gb_lcd.layer[1].enabled )
650         if ( state->lcd.layer[1].enabled )
712651         {
713652            int xpos;
714653
r9784r9785
717656            if (xpos < 0)
718657               xpos = 0;
719658
720            gb_lcd.layer[1].bgline = gb_lcd.window_lines_drawn;
721            gb_lcd.layer[1].bg_map = gb_lcd.gb_wndtab;
722            gb_lcd.layer[1].bg_tiles = gb_lcd.gb_chrgen;
723            gb_lcd.layer[1].xindex = 0;
724            gb_lcd.layer[1].xshift = 0;
725            gb_lcd.layer[1].xstart = xpos;
726            gb_lcd.layer[1].xend = 160;
727            gb_lcd.layer[0].xend = xpos;
659            state->lcd.layer[1].bgline = state->lcd.window_lines_drawn;
660            state->lcd.layer[1].bg_map = state->lcd.gb_wndtab;
661            state->lcd.layer[1].bg_tiles = state->lcd.gb_chrgen;
662            state->lcd.layer[1].xindex = 0;
663            state->lcd.layer[1].xshift = 0;
664            state->lcd.layer[1].xstart = xpos;
665            state->lcd.layer[1].xend = 160;
666            state->lcd.layer[0].xend = xpos;
728667         }
729         gb_lcd.start_x = 0;
668         state->lcd.start_x = 0;
730669      }
731670
732671      if ( cycles_to_go == 0 )
r9784r9785
734673
735674         /* Does this belong here? or should it be moved to the else block */
736675         /* Handle SGB mask */
737         switch( sgb_window_mask )
676         switch( state->sgb_window_mask )
738677         {
739678         case 1: /* Freeze screen */
740679            return;
r9784r9785
759698         }
760699
761700         /* Draw the "border" if we're on the first line */
762         if ( gb_lcd.current_line == 0 )
701         if ( state->lcd.current_line == 0 )
763702         {
764703            sgb_refresh_border(machine);
765704         }
766705      }
767706      if ( cycles_to_go < 160 )
768707      {
769         gb_lcd.end_x = MIN(160 - cycles_to_go,160);
708         state->lcd.end_x = MIN(160 - cycles_to_go,160);
770709
771710         /* if background or screen disabled clear line */
772711         if ( ! ( LCDCONT & 0x01 ) )
r9784r9785
774713            rectangle r;
775714            r.min_x = SGB_XOFFSET;
776715            r.max_x = SGB_XOFFSET + 160 - 1;
777            r.min_y = r.max_y = gb_lcd.current_line + SGB_YOFFSET;
716            r.min_y = r.max_y = state->lcd.current_line + SGB_YOFFSET;
778717            bitmap_fill( bitmap, &r , 0);
779718         }
780719         while( l < 2 )
r9784r9785
783722            UINT16   data;
784723            int   i, tile_index;
785724
786            if ( ! gb_lcd.layer[l].enabled )
725            if ( ! state->lcd.layer[l].enabled )
787726            {
788727               l++;
789728               continue;
790729            }
791            map = gb_lcd.layer[l].bg_map + ( ( gb_lcd.layer[l].bgline << 2 ) & 0x3E0 );
792            tiles = gb_lcd.layer[l].bg_tiles + ( ( gb_lcd.layer[l].bgline & 7 ) << 1 );
793            xindex = gb_lcd.start_x;
794            if ( xindex < gb_lcd.layer[l].xstart )
795               xindex = gb_lcd.layer[l].xstart;
796            i = gb_lcd.end_x;
797            if ( i > gb_lcd.layer[l].xend )
798               i = gb_lcd.layer[l].xend;
730            map = state->lcd.layer[l].bg_map + ( ( state->lcd.layer[l].bgline << 2 ) & 0x3E0 );
731            tiles = state->lcd.layer[l].bg_tiles + ( ( state->lcd.layer[l].bgline & 7 ) << 1 );
732            xindex = state->lcd.start_x;
733            if ( xindex < state->lcd.layer[l].xstart )
734               xindex = state->lcd.layer[l].xstart;
735            i = state->lcd.end_x;
736            if ( i > state->lcd.layer[l].xend )
737               i = state->lcd.layer[l].xend;
799738            i = i - xindex;
800739
801            tile_index = (map[gb_lcd.layer[l].xindex] ^ gb_lcd.gb_tile_no_mod) * 16;
740            tile_index = (map[state->lcd.layer[l].xindex] ^ state->lcd.gb_tile_no_mod) * 16;
802741            data = tiles[tile_index] | ( tiles[tile_index + 1] << 8 );
803            data <<= gb_lcd.layer[l].xshift;
742            data <<= state->lcd.layer[l].xshift;
804743
805744            /* Figure out which palette we're using */
806            sgb_palette = sgb_pal_map[ ( gb_lcd.end_x - i ) >> 3 ][ gb_lcd.current_line >> 3 ] << 2;
745            sgb_palette = state->sgb_pal_map[ ( state->lcd.end_x - i ) >> 3 ][ state->lcd.current_line >> 3 ] << 2;
807746
808747            while( i > 0 )
809748            {
810               while( ( gb_lcd.layer[l].xshift < 8 ) && i )
749               while( ( state->lcd.layer[l].xshift < 8 ) && i )
811750               {
812751                  register int colour = ( ( data & 0x8000 ) ? 2 : 0 ) | ( ( data & 0x0080 ) ? 1 : 0 );
813                  gb_plot_pixel( bitmap, xindex + SGB_XOFFSET, gb_lcd.current_line + SGB_YOFFSET, sgb_pal[ sgb_palette + gb_lcd.gb_bpal[colour]] );
814                  gb_lcd.bg_zbuf[xindex] = colour;
752                  gb_plot_pixel( bitmap, xindex + SGB_XOFFSET, state->lcd.current_line + SGB_YOFFSET, state->sgb_pal[ sgb_palette + state->lcd.gb_bpal[colour]] );
753                  state->lcd.bg_zbuf[xindex] = colour;
815754                  xindex++;
816755                  data <<= 1;
817                  gb_lcd.layer[l].xshift++;
756                  state->lcd.layer[l].xshift++;
818757                  i--;
819758               }
820               if ( gb_lcd.layer[l].xshift == 8 )
759               if ( state->lcd.layer[l].xshift == 8 )
821760               {
822761                  /* Take possible changes to SCROLLY into account */
823762                  if ( l == 0 )
824763                  {
825                     gb_lcd.layer[0].bgline = ( SCROLLY + gb_lcd.current_line ) & 0xFF;
826                     map = gb_lcd.layer[l].bg_map + ( ( gb_lcd.layer[l].bgline << 2 ) & 0x3E0 );
827                     tiles = gb_lcd.layer[l].bg_tiles + ( ( gb_lcd.layer[l].bgline & 7 ) << 1 );
764                     state->lcd.layer[0].bgline = ( SCROLLY + state->lcd.current_line ) & 0xFF;
765                     map = state->lcd.layer[l].bg_map + ( ( state->lcd.layer[l].bgline << 2 ) & 0x3E0 );
766                     tiles = state->lcd.layer[l].bg_tiles + ( ( state->lcd.layer[l].bgline & 7 ) << 1 );
828767                  }
829768
830                  gb_lcd.layer[l].xindex = ( gb_lcd.layer[l].xindex + 1 ) & 31;
831                  gb_lcd.layer[l].xshift = 0;
832                  tile_index = ( map[ gb_lcd.layer[l].xindex ] ^ gb_lcd.gb_tile_no_mod ) * 16;
769                  state->lcd.layer[l].xindex = ( state->lcd.layer[l].xindex + 1 ) & 31;
770                  state->lcd.layer[l].xshift = 0;
771                  tile_index = ( map[ state->lcd.layer[l].xindex ] ^ state->lcd.gb_tile_no_mod ) * 16;
833772                  data = tiles[ tile_index ] | ( tiles[ tile_index + 1 ] << 8 );
834                  sgb_palette = sgb_pal_map[ ( gb_lcd.end_x - i ) >> 3 ][ gb_lcd.current_line >> 3 ] << 2;
773                  sgb_palette = state->sgb_pal_map[ ( state->lcd.end_x - i ) >> 3 ][ state->lcd.current_line >> 3 ] << 2;
835774               }
836775            }
837776            l++;
838777         }
839         if ( ( gb_lcd.end_x == 160 ) && ( LCDCONT & 0x02 ) )
778         if ( ( state->lcd.end_x == 160 ) && ( LCDCONT & 0x02 ) )
840779         {
841780            sgb_update_sprites(machine);
842781         }
843         gb_lcd.start_x = gb_lcd.end_x;
782         state->lcd.start_x = state->lcd.end_x;
844783      }
845784   }
846785   else
r9784r9785
848787      if ( ! ( LCDCONT * 0x80 ) )
849788      {
850789         /* if screen disabled clear line */
851         if ( gb_lcd.previous_line != gb_lcd.current_line )
790         if ( state->lcd.previous_line != state->lcd.current_line )
852791         {
853792            /* Also refresh border here??? */
854            if ( gb_lcd.current_line < 144 )
793            if ( state->lcd.current_line < 144 )
855794            {
856795               rectangle r;
857796               r.min_x = SGB_XOFFSET;
858797               r.max_x = SGB_XOFFSET + 160 - 1;
859               r.min_y = r.max_y = gb_lcd.current_line + SGB_YOFFSET;
798               r.min_y = r.max_y = state->lcd.current_line + SGB_YOFFSET;
860799               bitmap_fill(bitmap, &r, 0);
861800            }
862            gb_lcd.previous_line = gb_lcd.current_line;
801            state->lcd.previous_line = state->lcd.current_line;
863802         }
864803      }
865804   }
r9784r9785
871810
872811INLINE void cgb_update_sprites ( running_machine *machine )
873812{
813   gb_state *state = machine->driver_data<gb_state>();
874814   bitmap_t *bitmap = machine->generic.tmpbitmap;
875815   UINT8 height, tilemask, line, *oam;
876816   int i, xindex, yindex;
r9784r9785
886826      tilemask = 0xFF;
887827   }
888828
889   yindex = gb_lcd.current_line;
890   line = gb_lcd.current_line + 16;
829   yindex = state->lcd.current_line;
830   line = state->lcd.current_line + 16;
891831
892   oam = gb_lcd.gb_oam->base() + 39 * 4;
832   oam = state->lcd.gb_oam->base() + 39 * 4;
893833   for (i = 39; i >= 0; i--)
894834   {
895835      /* if sprite is on current line && x-coordinate && x-coordinate is < 168 */
r9784r9785
899839         UINT8 bit, pal;
900840
901841         /* Handle mono mode for GB games */
902         if( ! gb_lcd.gbc_mode )
842         if( ! state->lcd.gbc_mode )
903843            pal = (oam[3] & 0x10) ? 4 : 0;
904844         else
905845            pal = ((oam[3] & 0x7) * 4);
r9784r9785
907847         xindex = oam[1] - 8;
908848         if (oam[3] & 0x40)         /* flip y ? */
909849         {
910            data = *((UINT16 *) &gb_lcd.gb_vram->base()[ ((oam[3] & 0x8)<<10) + (oam[2] & tilemask) * 16 + (height - 1 - line + oam[0]) * 2]);
850            data = *((UINT16 *) &state->lcd.gb_vram->base()[ ((oam[3] & 0x8)<<10) + (oam[2] & tilemask) * 16 + (height - 1 - line + oam[0]) * 2]);
911851         }
912852         else
913853         {
914            data = *((UINT16 *) &gb_lcd.gb_vram->base()[ ((oam[3] & 0x8)<<10) + (oam[2] & tilemask) * 16 + (line - oam[0]) * 2]);
854            data = *((UINT16 *) &state->lcd.gb_vram->base()[ ((oam[3] & 0x8)<<10) + (oam[2] & tilemask) * 16 + (line - oam[0]) * 2]);
915855         }
916856#ifndef LSB_FIRST
917857         data = (data << 8) | (data >> 8);
r9784r9785
923863            for (bit = 0; bit < 8; bit++, xindex++)
924864            {
925865               register int colour = ((data & 0x0100) ? 2 : 0) | ((data & 0x0001) ? 1 : 0);
926               if (colour && !gb_lcd.bg_zbuf[xindex] && xindex >= 0 && xindex < 160)
866               if (colour && !state->lcd.bg_zbuf[xindex] && xindex >= 0 && xindex < 160)
927867               {
928                  if ( ! gb_lcd.gbc_mode )
929                     colour = pal ? gb_lcd.gb_spal1[colour] : gb_lcd.gb_spal0[colour];
930                  gb_plot_pixel(bitmap, xindex, yindex, gb_lcd.cgb_spal[pal + colour]);
868                  if ( ! state->lcd.gbc_mode )
869                     colour = pal ? state->lcd.gb_spal1[colour] : state->lcd.gb_spal0[colour];
870                  gb_plot_pixel(bitmap, xindex, yindex, state->lcd.cgb_spal[pal + colour]);
931871               }
932872               data >>= 1;
933873            }
r9784r9785
936876            for (bit = 0; bit < 8; bit++, xindex++)
937877            {
938878               register int colour = ((data & 0x0100) ? 2 : 0) | ((data & 0x0001) ? 1 : 0);
939               if((gb_lcd.bg_zbuf[xindex] & 0x80) && (gb_lcd.bg_zbuf[xindex] & 0x7f) && (LCDCONT & 0x1))
879               if((state->lcd.bg_zbuf[xindex] & 0x80) && (state->lcd.bg_zbuf[xindex] & 0x7f) && (LCDCONT & 0x1))
940880                  colour = 0;
941881               if (colour && xindex >= 0 && xindex < 160)
942882               {
943                  if ( ! gb_lcd.gbc_mode )
944                     colour = pal ? gb_lcd.gb_spal1[colour] : gb_lcd.gb_spal0[colour];
945                  gb_plot_pixel(bitmap, xindex, yindex, gb_lcd.cgb_spal[pal + colour]);
883                  if ( ! state->lcd.gbc_mode )
884                     colour = pal ? state->lcd.gb_spal1[colour] : state->lcd.gb_spal0[colour];
885                  gb_plot_pixel(bitmap, xindex, yindex, state->lcd.cgb_spal[pal + colour]);
946886               }
947887               data >>= 1;
948888            }
r9784r9785
951891            for (bit = 0; bit < 8; bit++, xindex++)
952892            {
953893               register int colour = ((data & 0x8000) ? 2 : 0) | ((data & 0x0080) ? 1 : 0);
954               if (colour && !gb_lcd.bg_zbuf[xindex] && xindex >= 0 && xindex < 160)
894               if (colour && !state->lcd.bg_zbuf[xindex] && xindex >= 0 && xindex < 160)
955895               {
956                  if ( ! gb_lcd.gbc_mode )
957                     colour = pal ? gb_lcd.gb_spal1[colour] : gb_lcd.gb_spal0[colour];
958                  gb_plot_pixel(bitmap, xindex, yindex, gb_lcd.cgb_spal[pal + colour]);
896                  if ( ! state->lcd.gbc_mode )
897                     colour = pal ? state->lcd.gb_spal1[colour] : state->lcd.gb_spal0[colour];
898                  gb_plot_pixel(bitmap, xindex, yindex, state->lcd.cgb_spal[pal + colour]);
959899               }
960900               data <<= 1;
961901            }
r9784r9785
964904            for (bit = 0; bit < 8; bit++, xindex++)
965905            {
966906               register int colour = ((data & 0x8000) ? 2 : 0) | ((data & 0x0080) ? 1 : 0);
967               if((gb_lcd.bg_zbuf[xindex] & 0x80) && (gb_lcd.bg_zbuf[xindex] & 0x7f) && (LCDCONT & 0x1))
907               if((state->lcd.bg_zbuf[xindex] & 0x80) && (state->lcd.bg_zbuf[xindex] & 0x7f) && (LCDCONT & 0x1))
968908                  colour = 0;
969909               if (colour && xindex >= 0 && xindex < 160)
970910               {
971                  if ( ! gb_lcd.gbc_mode )
972                     colour = pal ? gb_lcd.gb_spal1[colour] : gb_lcd.gb_spal0[colour];
973                  gb_plot_pixel(bitmap, xindex, yindex, gb_lcd.cgb_spal[pal + colour]);
911                  if ( ! state->lcd.gbc_mode )
912                     colour = pal ? state->lcd.gb_spal1[colour] : state->lcd.gb_spal0[colour];
913                  gb_plot_pixel(bitmap, xindex, yindex, state->lcd.cgb_spal[pal + colour]);
974914               }
975915               data <<= 1;
976916            }
r9784r9785
983923
984924static void cgb_update_scanline ( running_machine *machine )
985925{
926   gb_state *state = machine->driver_data<gb_state>();
986927   bitmap_t *bitmap = machine->generic.tmpbitmap;
987928
988929   g_profiler.start(PROFILER_VIDEO);
r9784r9785
990931   if ( ( LCDSTAT & 0x03 ) == 0x03 )
991932   {
992933      /* Calcuate number of pixels to render based on time still left on the timer */
993      UINT32 cycles_to_go = machine->device<cpu_device>("maincpu")->attotime_to_cycles(timer_timeleft( gb_lcd.lcd_timer ) );
934      UINT32 cycles_to_go = machine->device<cpu_device>("maincpu")->attotime_to_cycles(timer_timeleft( state->lcd.lcd_timer ) );
994935      int l = 0;
995936
996      if ( gb_lcd.start_x < 0 )
937      if ( state->lcd.start_x < 0 )
997938      {
998939         /* Window is enabled if the hardware says so AND the current scanline is
999940             * within the window AND the window X coordinate is <=166 */
1000         gb_lcd.layer[1].enabled = ( ( LCDCONT & 0x20 ) && ( gb_lcd.current_line >= WNDPOSY ) && ( WNDPOSX <= 166 ) ) ? 1 : 0;
941         state->lcd.layer[1].enabled = ( ( LCDCONT & 0x20 ) && ( state->lcd.current_line >= WNDPOSY ) && ( WNDPOSX <= 166 ) ) ? 1 : 0;
1001942
1002943         /* BG is enabled if the hardware says so AND (window_off OR (window_on
1003944             * AND window's X position is >=7 ) ) */
1004         gb_lcd.layer[0].enabled = ( ( LCDCONT & 0x01 ) && ( ( ! gb_lcd.layer[1].enabled ) || ( gb_lcd.layer[1].enabled && ( WNDPOSX >= 7 ) ) ) ) ? 1 : 0;
945         state->lcd.layer[0].enabled = ( ( LCDCONT & 0x01 ) && ( ( ! state->lcd.layer[1].enabled ) || ( state->lcd.layer[1].enabled && ( WNDPOSX >= 7 ) ) ) ) ? 1 : 0;
1005946
1006         if ( gb_lcd.layer[0].enabled )
947         if ( state->lcd.layer[0].enabled )
1007948         {
1008            gb_lcd.layer[0].bgline = ( SCROLLY + gb_lcd.current_line ) & 0xFF;
1009            gb_lcd.layer[0].bg_map = gb_lcd.gb_bgdtab;
1010            gb_lcd.layer[0].gbc_map = gb_lcd.gbc_bgdtab;
1011            gb_lcd.layer[0].xindex = SCROLLX >> 3;
1012            gb_lcd.layer[0].xshift = SCROLLX & 7;
1013            gb_lcd.layer[0].xstart = 0;
1014            gb_lcd.layer[0].xend = 160;
949            state->lcd.layer[0].bgline = ( SCROLLY + state->lcd.current_line ) & 0xFF;
950            state->lcd.layer[0].bg_map = state->lcd.gb_bgdtab;
951            state->lcd.layer[0].gbc_map = state->lcd.gbc_bgdtab;
952            state->lcd.layer[0].xindex = SCROLLX >> 3;
953            state->lcd.layer[0].xshift = SCROLLX & 7;
954            state->lcd.layer[0].xstart = 0;
955            state->lcd.layer[0].xend = 160;
1015956         }
1016957
1017         if ( gb_lcd.layer[1].enabled )
958         if ( state->lcd.layer[1].enabled )
1018959         {
1019960            int xpos;
1020961
r9784r9785
1023964            if (xpos < 0)
1024965               xpos = 0;
1025966
1026            gb_lcd.layer[1].bgline = gb_lcd.window_lines_drawn;
1027            gb_lcd.layer[1].bg_map = gb_lcd.gb_wndtab;
1028            gb_lcd.layer[1].gbc_map = gb_lcd.gbc_wndtab;
1029            gb_lcd.layer[1].xindex = 0;
1030            gb_lcd.layer[1].xshift = 0;
1031            gb_lcd.layer[1].xstart = xpos;
1032            gb_lcd.layer[1].xend = 160;
1033            gb_lcd.layer[0].xend = xpos;
967            state->lcd.layer[1].bgline = state->lcd.window_lines_drawn;
968            state->lcd.layer[1].bg_map = state->lcd.gb_wndtab;
969            state->lcd.layer[1].gbc_map = state->lcd.gbc_wndtab;
970            state->lcd.layer[1].xindex = 0;
971            state->lcd.layer[1].xshift = 0;
972            state->lcd.layer[1].xstart = xpos;
973            state->lcd.layer[1].xend = 160;
974            state->lcd.layer[0].xend = xpos;
1034975         }
1035         gb_lcd.start_x = 0;
976         state->lcd.start_x = 0;
1036977      }
1037978
1038979      if ( cycles_to_go < 160 )
1039980      {
1040         gb_lcd.end_x = MIN(160 - cycles_to_go,160);
981         state->lcd.end_x = MIN(160 - cycles_to_go,160);
1041982         /* Draw empty line when the background is disabled */
1042983         if ( ! ( LCDCONT & 0x01 ) )
1043984         {
1044985            rectangle r;
1045            r.min_y = r.max_y = gb_lcd.current_line;
1046            r.min_x = gb_lcd.start_x;
1047            r.max_x = gb_lcd.end_x - 1;
1048            bitmap_fill( bitmap, &r , ( ! gb_lcd.gbc_mode ) ? 0 : 32767);
986            r.min_y = r.max_y = state->lcd.current_line;
987            r.min_x = state->lcd.start_x;
988            r.max_x = state->lcd.end_x - 1;
989            bitmap_fill( bitmap, &r , ( ! state->lcd.gbc_mode ) ? 0 : 32767);
1049990         }
1050991         while ( l < 2 )
1051992         {
r9784r9785
1053994            UINT16   data;
1054995            int   i, tile_index;
1055996
1056            if ( ! gb_lcd.layer[l].enabled )
997            if ( ! state->lcd.layer[l].enabled )
1057998            {
1058999               l++;
10591000               continue;
10601001            }
1061            map = gb_lcd.layer[l].bg_map + ( ( gb_lcd.layer[l].bgline << 2 ) & 0x3E0 );
1062            gbcmap = gb_lcd.layer[l].gbc_map + ( ( gb_lcd.layer[l].bgline << 2 ) & 0x3E0 );
1063            tiles = ( gbcmap[ gb_lcd.layer[l].xindex ] & 0x08 ) ? gb_lcd.gbc_chrgen : gb_lcd.gb_chrgen;
1002            map = state->lcd.layer[l].bg_map + ( ( state->lcd.layer[l].bgline << 2 ) & 0x3E0 );
1003            gbcmap = state->lcd.layer[l].gbc_map + ( ( state->lcd.layer[l].bgline << 2 ) & 0x3E0 );
1004            tiles = ( gbcmap[ state->lcd.layer[l].xindex ] & 0x08 ) ? state->lcd.gbc_chrgen : state->lcd.gb_chrgen;
10641005
10651006            /* Check for vertical flip */
1066            if ( gbcmap[ gb_lcd.layer[l].xindex ] & 0x40 )
1007            if ( gbcmap[ state->lcd.layer[l].xindex ] & 0x40 )
10671008            {
1068               tiles += ( ( 7 - ( gb_lcd.layer[l].bgline & 0x07 ) ) << 1 );
1009               tiles += ( ( 7 - ( state->lcd.layer[l].bgline & 0x07 ) ) << 1 );
10691010            }
10701011            else
10711012            {
1072               tiles += ( ( gb_lcd.layer[l].bgline & 0x07 ) << 1 );
1013               tiles += ( ( state->lcd.layer[l].bgline & 0x07 ) << 1 );
10731014            }
1074            xindex = gb_lcd.start_x;
1075            if ( xindex < gb_lcd.layer[l].xstart )
1076               xindex = gb_lcd.layer[l].xstart;
1077            i = gb_lcd.end_x;
1078            if ( i > gb_lcd.layer[l].xend )
1079               i = gb_lcd.layer[l].xend;
1015            xindex = state->lcd.start_x;
1016            if ( xindex < state->lcd.layer[l].xstart )
1017               xindex = state->lcd.layer[l].xstart;
1018            i = state->lcd.end_x;
1019            if ( i > state->lcd.layer[l].xend )
1020               i = state->lcd.layer[l].xend;
10801021            i = i - xindex;
10811022
1082            tile_index = ( map[ gb_lcd.layer[l].xindex ] ^ gb_lcd.gb_tile_no_mod ) * 16;
1023            tile_index = ( map[ state->lcd.layer[l].xindex ] ^ state->lcd.gb_tile_no_mod ) * 16;
10831024            data = tiles[ tile_index ] | ( tiles[ tile_index + 1 ] << 8 );
10841025            /* Check for horinzontal flip */
1085            if ( gbcmap[ gb_lcd.layer[l].xindex ] & 0x20 )
1026            if ( gbcmap[ state->lcd.layer[l].xindex ] & 0x20 )
10861027            {
1087               data >>= gb_lcd.layer[l].xshift;
1028               data >>= state->lcd.layer[l].xshift;
10881029            }
10891030            else
10901031            {
1091               data <<= gb_lcd.layer[l].xshift;
1032               data <<= state->lcd.layer[l].xshift;
10921033            }
10931034
10941035            while ( i > 0 )
10951036            {
1096               while ( ( gb_lcd.layer[l].xshift < 8 ) && i )
1037               while ( ( state->lcd.layer[l].xshift < 8 ) && i )
10971038               {
10981039                  int colour;
10991040                  /* Check for horinzontal flip */
1100                  if ( gbcmap[ gb_lcd.layer[l].xindex ] & 0x20 )
1041                  if ( gbcmap[ state->lcd.layer[l].xindex ] & 0x20 )
11011042                  {
11021043                     colour = ( ( data & 0x0100 ) ? 2 : 0 ) | ( ( data & 0x0001 ) ? 1 : 0 );
11031044                     data >>= 1;
r9784r9785
11071048                     colour = ( ( data & 0x8000 ) ? 2 : 0 ) | ( ( data & 0x0080 ) ? 1 : 0 );
11081049                     data <<= 1;
11091050                  }
1110                  gb_plot_pixel( bitmap, xindex, gb_lcd.current_line, gb_lcd.cgb_bpal[ ( ! gb_lcd.gbc_mode ) ? gb_lcd.gb_bpal[colour] : ( ( ( gbcmap[ gb_lcd.layer[l].xindex ] & 0x07 ) * 4 ) + colour ) ] );
1111                  gb_lcd.bg_zbuf[ xindex ] = colour + ( gbcmap[ gb_lcd.layer[l].xindex ] & 0x80 );
1051                  gb_plot_pixel( bitmap, xindex, state->lcd.current_line, state->lcd.cgb_bpal[ ( ! state->lcd.gbc_mode ) ? state->lcd.gb_bpal[colour] : ( ( ( gbcmap[ state->lcd.layer[l].xindex ] & 0x07 ) * 4 ) + colour ) ] );
1052                  state->lcd.bg_zbuf[ xindex ] = colour + ( gbcmap[ state->lcd.layer[l].xindex ] & 0x80 );
11121053                  xindex++;
1113                  gb_lcd.layer[l].xshift++;
1054                  state->lcd.layer[l].xshift++;
11141055                  i--;
11151056               }
1116               if ( gb_lcd.layer[l].xshift == 8 )
1057               if ( state->lcd.layer[l].xshift == 8 )
11171058               {
11181059                  /* Take possible changes to SCROLLY into account */
11191060                  if ( l == 0 )
11201061                  {
1121                     gb_lcd.layer[0].bgline = ( SCROLLY + gb_lcd.current_line ) & 0xFF;
1122                     map = gb_lcd.layer[l].bg_map + ( ( gb_lcd.layer[l].bgline << 2 ) & 0x3E0 );
1123                     gbcmap = gb_lcd.layer[l].gbc_map + ( ( gb_lcd.layer[l].bgline << 2 ) & 0x3E0 );
1062                     state->lcd.layer[0].bgline = ( SCROLLY + state->lcd.current_line ) & 0xFF;
1063                     map = state->lcd.layer[l].bg_map + ( ( state->lcd.layer[l].bgline << 2 ) & 0x3E0 );
1064                     gbcmap = state->lcd.layer[l].gbc_map + ( ( state->lcd.layer[l].bgline << 2 ) & 0x3E0 );
11241065                  }
11251066
1126                  gb_lcd.layer[l].xindex = ( gb_lcd.layer[l].xindex + 1 ) & 31;
1127                  gb_lcd.layer[l].xshift = 0;
1128                  tiles = ( gbcmap[ gb_lcd.layer[l].xindex ] & 0x08 ) ? gb_lcd.gbc_chrgen : gb_lcd.gb_chrgen;
1067                  state->lcd.layer[l].xindex = ( state->lcd.layer[l].xindex + 1 ) & 31;
1068                  state->lcd.layer[l].xshift = 0;
1069                  tiles = ( gbcmap[ state->lcd.layer[l].xindex ] & 0x08 ) ? state->lcd.gbc_chrgen : state->lcd.gb_chrgen;
11291070
11301071                  /* Check for vertical flip */
1131                  if ( gbcmap[ gb_lcd.layer[l].xindex ] & 0x40 )
1072                  if ( gbcmap[ state->lcd.layer[l].xindex ] & 0x40 )
11321073                  {
1133                     tiles += ( ( 7 - ( gb_lcd.layer[l].bgline & 0x07 ) ) << 1 );
1074                     tiles += ( ( 7 - ( state->lcd.layer[l].bgline & 0x07 ) ) << 1 );
11341075                  }
11351076                  else
11361077                  {
1137                     tiles += ( ( gb_lcd.layer[l].bgline & 0x07 ) << 1 );
1078                     tiles += ( ( state->lcd.layer[l].bgline & 0x07 ) << 1 );
11381079                  }
1139                  tile_index = ( map[ gb_lcd.layer[l].xindex ] ^ gb_lcd.gb_tile_no_mod ) * 16;
1080                  tile_index = ( map[ state->lcd.layer[l].xindex ] ^ state->lcd.gb_tile_no_mod ) * 16;
11401081                  data = tiles[ tile_index ] | ( tiles[ tile_index + 1 ] << 8 );
11411082               }
11421083            }
11431084            l++;
11441085         }
1145         if ( gb_lcd.end_x == 160 && ( LCDCONT & 0x02 ) )
1086         if ( state->lcd.end_x == 160 && ( LCDCONT & 0x02 ) )
11461087         {
11471088            cgb_update_sprites( machine );
11481089         }
1149         gb_lcd.start_x = gb_lcd.end_x;
1090         state->lcd.start_x = state->lcd.end_x;
11501091      }
11511092   }
11521093   else
r9784r9785
11541095      if ( ! ( LCDCONT & 0x80 ) )
11551096      {
11561097         /* Draw an empty line when LCD is disabled */
1157         if ( gb_lcd.previous_line != gb_lcd.current_line )
1098         if ( state->lcd.previous_line != state->lcd.current_line )
11581099         {
1159            if ( gb_lcd.current_line < 144 )
1100            if ( state->lcd.current_line < 144 )
11601101            {
11611102               screen_device *screen = machine->first_screen();
11621103               rectangle r;
11631104               const rectangle &r1 = screen->visible_area();
11641105               r.min_x = r1.min_x;
11651106               r.max_x = r1.max_x;
1166               r.min_y = r.max_y = gb_lcd.current_line;
1167               bitmap_fill( bitmap, &r , ( ! gb_lcd.gbc_mode ) ? 0 : 32767);
1107               r.min_y = r.max_y = state->lcd.current_line;
1108               bitmap_fill( bitmap, &r , ( ! state->lcd.gbc_mode ) ? 0 : 32767);
11681109            }
1169            gb_lcd.previous_line = gb_lcd.current_line;
1110            state->lcd.previous_line = state->lcd.current_line;
11701111         }
11711112      }
11721113   }
r9784r9785
12891230
12901231MACHINE_START( gb_video )
12911232{
1292   gb_lcd.lcd_timer = timer_alloc(machine, gb_lcd_timer_proc, NULL);
1233   gb_state *state = machine->driver_data<gb_state>();
1234   state->lcd.lcd_timer = timer_alloc(machine, gb_lcd_timer_proc, NULL);
12931235}
12941236
12951237MACHINE_START( gbc_video )
12961238{
1297   gb_lcd.lcd_timer = timer_alloc(machine, gbc_lcd_timer_proc, NULL);
1239   gb_state *state = machine->driver_data<gb_state>();
1240   state->lcd.lcd_timer = timer_alloc(machine, gbc_lcd_timer_proc, NULL);
12981241}
12991242
13001243void gb_video_reset( running_machine *machine, int mode )
13011244{
1245   gb_state *state = machine->driver_data<gb_state>();
13021246   int   i;
13031247   int vram_size = 0x2000;
13041248   address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
1305   emu_timer *old_timer = gb_lcd.lcd_timer;
1249   emu_timer *old_timer = state->lcd.lcd_timer;
13061250
1307   memset( &gb_lcd, 0, sizeof(gb_lcd) );
1308   gb_lcd.lcd_timer = old_timer;
1251   memset( &state->lcd, 0, sizeof(state->lcd) );
1252   state->lcd.lcd_timer = old_timer;
13091253
13101254   if (mode == GB_VIDEO_CGB) vram_size = 0x4000;
13111255
r9784r9785
13131257   if (memory_region(machine, "gfx1"))      machine->region_free("gfx1");
13141258   if (memory_region(machine, "gfx2"))      machine->region_free("gfx2");
13151259
1316   gb_lcd.gb_vram = machine->region_alloc("gfx1", vram_size, 0 );
1317   gb_lcd.gb_oam = machine->region_alloc("gfx2", 0x100, 0 );
1318   memset( gb_lcd.gb_vram->base(), 0, vram_size );
1260   state->lcd.gb_vram = machine->region_alloc("gfx1", vram_size, 0 );
1261   state->lcd.gb_oam = machine->region_alloc("gfx2", 0x100, 0 );
1262   memset( state->lcd.gb_vram->base(), 0, vram_size );
13191263
1320   gb_lcd.gb_vram_ptr = gb_lcd.gb_vram->base();
1321   gb_lcd.gb_chrgen = gb_lcd.gb_vram->base();
1322   gb_lcd.gb_bgdtab = gb_lcd.gb_vram->base() + 0x1C00;
1323   gb_lcd.gb_wndtab = gb_lcd.gb_vram->base() + 0x1C00;
1264   state->lcd.gb_vram_ptr = state->lcd.gb_vram->base();
1265   state->lcd.gb_chrgen = state->lcd.gb_vram->base();
1266   state->lcd.gb_bgdtab = state->lcd.gb_vram->base() + 0x1C00;
1267   state->lcd.gb_wndtab = state->lcd.gb_vram->base() + 0x1C00;
13241268
1325   gb_lcd.gb_vid_regs[0x06] = 0xFF;
1269   state->lcd.gb_vid_regs[0x06] = 0xFF;
13261270   for( i = 0x0c; i < _NR_GB_VID_REGS; i++ )
13271271   {
1328      gb_lcd.gb_vid_regs[i] = 0xFF;
1272      state->lcd.gb_vid_regs[i] = 0xFF;
13291273   }
13301274
13311275   LCDSTAT = 0x80;
13321276   LCDCONT = 0x00;      /* Video hardware is turned off at boot time */
1333   gb_lcd.current_line = CURLINE = CMPLINE = 0x00;
1277   state->lcd.current_line = CURLINE = CMPLINE = 0x00;
13341278   SCROLLX = SCROLLY = 0x00;
13351279   SPR0PAL = SPR1PAL = 0xFF;
13361280   WNDPOSX = WNDPOSY = 0x00;
r9784r9785
13381282   /* Initialize palette arrays */
13391283   for( i = 0; i < 4; i++ )
13401284   {
1341      gb_lcd.gb_bpal[i] = gb_lcd.gb_spal0[i] = gb_lcd.gb_spal1[i] = i;
1285      state->lcd.gb_bpal[i] = state->lcd.gb_spal0[i] = state->lcd.gb_spal1[i] = i;
13421286   }
13431287
13441288   switch( mode )
13451289   {
13461290   case GB_VIDEO_DMG:
1347      timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(456), 0);
1291      timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(456), 0);
13481292
13491293      /* set the scanline update function */
1350      update_scanline = gb_update_scanline;
1294      state->update_scanline = gb_update_scanline;
13511295
1352      memcpy( gb_lcd.gb_oam->base(), dmg_oam_fingerprint, 0x100 );
1296      memcpy( state->lcd.gb_oam->base(), dmg_oam_fingerprint, 0x100 );
13531297
13541298      break;
13551299   case GB_VIDEO_MGB:
13561300      /* set the scanline update function */
1357      update_scanline = gb_update_scanline;
1301      state->update_scanline = gb_update_scanline;
13581302      /* Initialize part of VRAM. This code must be deleted when we have added the bios dump */
13591303      for( i = 1; i < 0x0D; i++ )
13601304      {
1361         gb_lcd.gb_vram->base()[ 0x1903 + i ] = i;
1362         gb_lcd.gb_vram->base()[ 0x1923 + i ] = i + 0x0C;
1305         state->lcd.gb_vram->base()[ 0x1903 + i ] = i;
1306         state->lcd.gb_vram->base()[ 0x1923 + i ] = i + 0x0C;
13631307      }
1364      gb_lcd.gb_vram->base()[ 0x1910 ] = 0x19;
1308      state->lcd.gb_vram->base()[ 0x1910 ] = 0x19;
13651309
13661310
1367      memcpy( gb_lcd.gb_oam->base(), mgb_oam_fingerprint, 0x100 );
1311      memcpy( state->lcd.gb_oam->base(), mgb_oam_fingerprint, 0x100 );
13681312
13691313      /* Make sure the VBlank interrupt is set when the first instruction gets executed */
13701314      timer_set(machine,  machine->device<cpu_device>("maincpu")->cycles_to_attotime(1), NULL, 0, gb_video_init_vbl );
r9784r9785
13751319      gb_video_w( space, 0x8, 0xFC );    /* SPR0PAL */
13761320      gb_video_w( space, 0x9, 0xFC );    /* SPR1PAL */
13771321
1378      CURLINE = gb_lcd.current_line = 0;
1322      CURLINE = state->lcd.current_line = 0;
13791323      LCDSTAT = ( LCDSTAT & 0xF8 ) | 0x05;
1380      gb_lcd.mode = 1;
1381      timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(60), GB_LCD_STATE_LY00_M0);
1324      state->lcd.mode = 1;
1325      timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(60), GB_LCD_STATE_LY00_M0);
13821326
13831327      break;
13841328   case GB_VIDEO_SGB:
13851329      /* set the scanline update function */
1386      update_scanline = sgb_update_scanline;
1330      state->update_scanline = sgb_update_scanline;
13871331
13881332      break;
13891333
13901334   case GB_VIDEO_CGB:
13911335      /* set the scanline update function */
1392      update_scanline = cgb_update_scanline;
1336      state->update_scanline = cgb_update_scanline;
13931337
1394      memcpy( gb_lcd.gb_oam->base(), cgb_oam_fingerprint, 0x100 );
1338      memcpy( state->lcd.gb_oam->base(), cgb_oam_fingerprint, 0x100 );
13951339
1396      gb_lcd.gb_chrgen = gb_lcd.gb_vram->base();
1397      gb_lcd.gbc_chrgen = gb_lcd.gb_vram->base() + 0x2000;
1398      gb_lcd.gb_bgdtab = gb_lcd.gb_wndtab = gb_lcd.gb_vram->base() + 0x1C00;
1399      gb_lcd.gbc_bgdtab = gb_lcd.gbc_wndtab = gb_lcd.gb_vram->base() + 0x3C00;
1340      state->lcd.gb_chrgen = state->lcd.gb_vram->base();
1341      state->lcd.gbc_chrgen = state->lcd.gb_vram->base() + 0x2000;
1342      state->lcd.gb_bgdtab = state->lcd.gb_wndtab = state->lcd.gb_vram->base() + 0x1C00;
1343      state->lcd.gbc_bgdtab = state->lcd.gbc_wndtab = state->lcd.gb_vram->base() + 0x3C00;
14001344
14011345      /* HDMA disabled */
1402      gb_lcd.hdma_enabled = 0;
1403      gb_lcd.hdma_possible = 0;
1346      state->lcd.hdma_enabled = 0;
1347      state->lcd.hdma_possible = 0;
14041348
1405      gb_lcd.gbc_mode = 1;
1349      state->lcd.gbc_mode = 1;
14061350      break;
14071351   }
14081352}
14091353
14101354static void gbc_hdma(running_machine *machine, UINT16 length)
14111355{
1356   gb_state *state = machine->driver_data<gb_state>();
14121357   UINT16 src, dst;
14131358   address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
14141359
r9784r9785
14281373   if( (HDMA5 & 0x7f) == 0x7f )
14291374   {
14301375      HDMA5 = 0xff;
1431      gb_lcd.hdma_enabled = 0;
1376      state->lcd.hdma_enabled = 0;
14321377   }
14331378}
14341379
1435static void gb_increment_scanline( void )
1380static void gb_increment_scanline( gb_state *state )
14361381{
1437   gb_lcd.current_line = ( gb_lcd.current_line + 1 ) % 154;
1382   state->lcd.current_line = ( state->lcd.current_line + 1 ) % 154;
14381383   if ( LCDCONT & 0x80 )
14391384   {
1440      CURLINE = gb_lcd.current_line;
1385      CURLINE = state->lcd.current_line;
14411386   }
1442   if ( gb_lcd.current_line == 0 )
1387   if ( state->lcd.current_line == 0 )
14431388   {
1444      gb_lcd.window_lines_drawn = 0;
1389      state->lcd.window_lines_drawn = 0;
14451390   }
14461391}
14471392
14481393static TIMER_CALLBACK(gb_lcd_timer_proc)
14491394{
1395   gb_state *state = machine->driver_data<gb_state>();
14501396   static const int sprite_cycles[] = { 0, 8, 20, 32, 44, 52, 64, 76, 88, 96, 108 };
14511397
1452   gb_lcd.state = param;
1398   state->lcd.state = param;
14531399
14541400   if ( LCDCONT & 0x80 )
14551401   {
1456      switch( gb_lcd.state )
1402      switch( state->lcd.state )
14571403      {
14581404      case GB_LCD_STATE_LYXX_PRE_M0:   /* Just before switching to mode 0 */
1459         gb_lcd.mode = 0;
1405         state->lcd.mode = 0;
14601406         if ( LCDSTAT & 0x08 )
14611407         {
1462            if ( ! gb_lcd.mode_irq )
1408            if ( ! state->lcd.mode_irq )
14631409            {
1464               if ( ! gb_lcd.line_irq && ! gb_lcd.delayed_line_irq )
1410               if ( ! state->lcd.line_irq && ! state->lcd.delayed_line_irq )
14651411               {
1466                  gb_lcd.mode_irq = 1;
1412                  state->lcd.mode_irq = 1;
14671413                  cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
14681414               }
14691415            }
14701416            else
14711417            {
1472               gb_lcd.mode_irq = 0;
1418               state->lcd.mode_irq = 0;
14731419            }
14741420         }
1475         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0);
1421         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0);
14761422         break;
14771423      case GB_LCD_STATE_LYXX_M0:      /* Switch to mode 0 */
14781424         /* update current scanline */
1479         update_scanline( machine );
1425         (*state->update_scanline)( machine );
14801426         /* Increment the number of window lines drawn if enabled */
1481         if ( gb_lcd.layer[1].enabled )
1427         if ( state->lcd.layer[1].enabled )
14821428         {
1483            gb_lcd.window_lines_drawn++;
1429            state->lcd.window_lines_drawn++;
14841430         }
1485         gb_lcd.previous_line = gb_lcd.current_line;
1431         state->lcd.previous_line = state->lcd.current_line;
14861432         /* Set Mode 0 lcdstate */
1487         gb_lcd.mode = 0;
1433         state->lcd.mode = 0;
14881434         LCDSTAT &= 0xFC;
1489         gb_lcd.oam_locked = UNLOCKED;
1490         gb_lcd.vram_locked = UNLOCKED;
1435         state->lcd.oam_locked = UNLOCKED;
1436         state->lcd.vram_locked = UNLOCKED;
14911437         /*
14921438                There seems to a kind of feature in the Game Boy hardware when the lowest bits of the
14931439                SCROLLX register equals 3 or 7, then the delayed M0 irq is triggered 4 cycles later
r9784r9785
14961442            */
14971443         if ( ( SCROLLX & 0x03 ) == 0x03 )
14981444         {
1499            gb_lcd.scrollx_adjust += 4;
1500            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_SCX3);
1445            state->lcd.scrollx_adjust += 4;
1446            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_SCX3);
15011447            break;
15021448         }
15031449      case GB_LCD_STATE_LYXX_M0_SCX3:
15041450         /* Generate lcd interrupt if requested */
1505         if ( ! gb_lcd.mode_irq && ( LCDSTAT & 0x08 ) &&
1506              ( ( ! gb_lcd.line_irq && gb_lcd.delayed_line_irq ) || ! ( LCDSTAT & 0x40 ) ) )
1451         if ( ! state->lcd.mode_irq && ( LCDSTAT & 0x08 ) &&
1452              ( ( ! state->lcd.line_irq && state->lcd.delayed_line_irq ) || ! ( LCDSTAT & 0x40 ) ) )
15071453         {
15081454            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
15091455         }
1510         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(196 - gb_lcd.scrollx_adjust - gb_lcd.sprite_cycles), GB_LCD_STATE_LYXX_M0_PRE_INC);
1456         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(196 - state->lcd.scrollx_adjust - state->lcd.sprite_cycles), GB_LCD_STATE_LYXX_M0_PRE_INC);
15111457         break;
15121458      case GB_LCD_STATE_LYXX_M0_PRE_INC:   /* Just before incrementing the line counter go to mode 2 internally */
15131459         if ( CURLINE < 143 )
15141460         {
1515            gb_lcd.mode = 2;
1516            gb_lcd.triggering_mode_irq = ( LCDSTAT & 0x20 ) ? 1 : 0;
1517            if ( gb_lcd.triggering_mode_irq )
1461            state->lcd.mode = 2;
1462            state->lcd.triggering_mode_irq = ( LCDSTAT & 0x20 ) ? 1 : 0;
1463            if ( state->lcd.triggering_mode_irq )
15181464            {
1519               if ( ! gb_lcd.mode_irq )
1465               if ( ! state->lcd.mode_irq )
15201466               {
1521                  if ( ! gb_lcd.line_irq && ! gb_lcd.delayed_line_irq )
1467                  if ( ! state->lcd.line_irq && ! state->lcd.delayed_line_irq )
15221468                  {
1523                     gb_lcd.mode_irq = 1;
1469                     state->lcd.mode_irq = 1;
15241470                     cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
15251471                  }
15261472               }
15271473               else
15281474               {
1529                  gb_lcd.mode_irq = 0;
1475                  state->lcd.mode_irq = 0;
15301476               }
15311477            }
15321478         }
1533         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_INC);
1479         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_INC);
15341480         break;
15351481      case GB_LCD_STATE_LYXX_M0_INC:   /* Increment LY, stay in M0 for 4 more cycles */
1536         gb_increment_scanline();
1537         gb_lcd.delayed_line_irq = gb_lcd.line_irq;
1538         gb_lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1539         gb_lcd.line_irq = 0;
1540         if ( ! gb_lcd.mode_irq && ! gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq && ! gb_lcd.triggering_mode_irq )
1482         gb_increment_scanline(state);
1483         state->lcd.delayed_line_irq = state->lcd.line_irq;
1484         state->lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1485         state->lcd.line_irq = 0;
1486         if ( ! state->lcd.mode_irq && ! state->lcd.delayed_line_irq && state->lcd.triggering_line_irq && ! state->lcd.triggering_mode_irq )
15411487         {
1542            gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1488            state->lcd.line_irq = state->lcd.triggering_line_irq;
15431489            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
15441490         }
15451491         /* Reset LY==LYC STAT bit */
r9784r9785
15471493         /* Check if we're going into VBlank next */
15481494         if ( CURLINE == 144 )
15491495         {
1550            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY9X_M1);
1496            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY9X_M1);
15511497         }
15521498         else
15531499         {
15541500            /* Internally switch to mode 2 */
1555            gb_lcd.mode = 2;
1501            state->lcd.mode = 2;
15561502            /* Generate lcd interrupt if requested */
1557            if ( ! gb_lcd.mode_irq && gb_lcd.triggering_mode_irq &&
1558                ( ( ! gb_lcd.triggering_line_irq && ! gb_lcd.delayed_line_irq ) || ! ( LCDSTAT & 0x40 ) ) )
1503            if ( ! state->lcd.mode_irq && state->lcd.triggering_mode_irq &&
1504                ( ( ! state->lcd.triggering_line_irq && ! state->lcd.delayed_line_irq ) || ! ( LCDSTAT & 0x40 ) ) )
15591505            {
1560               gb_lcd.mode_irq = 1;
1506               state->lcd.mode_irq = 1;
15611507               cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
15621508            }
1563            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M2);
1509            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M2);
15641510         }
15651511         break;
15661512      case GB_LCD_STATE_LY00_M2:      /* Switch to mode 2 on line #0 */
15671513         /* Set Mode 2 lcdstate */
1568         gb_lcd.mode = 2;
1514         state->lcd.mode = 2;
15691515         LCDSTAT = ( LCDSTAT & 0xFC ) | 0x02;
1570         gb_lcd.oam_locked = LOCKED;
1516         state->lcd.oam_locked = LOCKED;
15711517         /* Generate lcd interrupt if requested */
1572         if ( ( LCDSTAT & 0x20 ) && ! gb_lcd.line_irq && ! gb_lcd.line_irq )
1518         if ( ( LCDSTAT & 0x20 ) && ! state->lcd.line_irq && ! state->lcd.line_irq )
15731519         {
15741520            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
15751521         }
15761522         /* Check for regular compensation of x-scroll register */
1577         gb_lcd.scrollx_adjust = ( SCROLLX & 0x04 ) ? 4 : 0;
1523         state->lcd.scrollx_adjust = ( SCROLLX & 0x04 ) ? 4 : 0;
15781524         /* Mode 2 lasts approximately 80 clock cycles */
1579         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
1525         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
15801526         break;
15811527      case GB_LCD_STATE_LYXX_M2:      /* Switch to mode 2 */
15821528         /* Update STAT register to the correct state */
15831529         LCDSTAT = (LCDSTAT & 0xFC) | 0x02;
1584         gb_lcd.oam_locked = LOCKED;
1530         state->lcd.oam_locked = LOCKED;
15851531         /* Generate lcd interrupt if requested */
1586         if ( ( gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq && ! ( LCDSTAT & 0x20 ) ) ||
1587             ( ! gb_lcd.mode_irq && ! gb_lcd.line_irq && ! gb_lcd.delayed_line_irq && gb_lcd.triggering_mode_irq ) )
1532         if ( ( state->lcd.delayed_line_irq && state->lcd.triggering_line_irq && ! ( LCDSTAT & 0x20 ) ) ||
1533             ( ! state->lcd.mode_irq && ! state->lcd.line_irq && ! state->lcd.delayed_line_irq && state->lcd.triggering_mode_irq ) )
15881534         {
15891535            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
15901536         }
1591         gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1592         gb_lcd.triggering_mode_irq = 0;
1537         state->lcd.line_irq = state->lcd.triggering_line_irq;
1538         state->lcd.triggering_mode_irq = 0;
15931539         /* Check if LY==LYC STAT bit should be set */
15941540         if ( CURLINE == CMPLINE )
15951541         {
15961542            LCDSTAT |= 0x04;
15971543         }
15981544         /* Check for regular compensation of x-scroll register */
1599         gb_lcd.scrollx_adjust = ( SCROLLX & 0x04 ) ? 4 : 0;
1545         state->lcd.scrollx_adjust = ( SCROLLX & 0x04 ) ? 4 : 0;
16001546         /* Mode 2 last for approximately 80 clock cycles */
1601         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
1547         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
16021548         break;
16031549      case GB_LCD_STATE_LYXX_M3:      /* Switch to mode 3 */
1604         gb_select_sprites();
1605         gb_lcd.sprite_cycles = sprite_cycles[ gb_lcd.sprCount ];
1550         gb_select_sprites(state);
1551         state->lcd.sprite_cycles = sprite_cycles[ state->lcd.sprCount ];
16061552         /* Set Mode 3 lcdstate */
1607         gb_lcd.mode = 3;
1553         state->lcd.mode = 3;
16081554         LCDSTAT = (LCDSTAT & 0xFC) | 0x03;
1609         gb_lcd.vram_locked = LOCKED;
1555         state->lcd.vram_locked = LOCKED;
16101556         /* Check for compensations of x-scroll register */
16111557         /* Mode 3 lasts for approximately 172+cycles needed to handle sprites clock cycles */
1612         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(168 + gb_lcd.scrollx_adjust + gb_lcd.sprite_cycles), GB_LCD_STATE_LYXX_PRE_M0);
1613         gb_lcd.start_x = -1;
1558         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(168 + state->lcd.scrollx_adjust + state->lcd.sprite_cycles), GB_LCD_STATE_LYXX_PRE_M0);
1559         state->lcd.start_x = -1;
16141560         break;
16151561      case GB_LCD_STATE_LY9X_M1:      /* Switch to or stay in mode 1 */
16161562         if ( CURLINE == 144 )
r9784r9785
16181564            /* Trigger VBlank interrupt */
16191565            cputag_set_input_line( machine, "maincpu", VBL_INT, ASSERT_LINE );
16201566            /* Set VBlank lcdstate */
1621            gb_lcd.mode = 1;
1567            state->lcd.mode = 1;
16221568            LCDSTAT = (LCDSTAT & 0xFC) | 0x01;
16231569            /* Trigger LCD interrupt if requested */
16241570            if ( LCDSTAT & 0x10 )
r9784r9785
16311577         {
16321578            LCDSTAT |= 0x04;
16331579         }
1634         if ( gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq )
1580         if ( state->lcd.delayed_line_irq && state->lcd.triggering_line_irq )
16351581         {
16361582            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
16371583         }
1638         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(452), GB_LCD_STATE_LY9X_M1_INC);
1584         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(452), GB_LCD_STATE_LY9X_M1_INC);
16391585         break;
16401586      case GB_LCD_STATE_LY9X_M1_INC:      /* Increment scanline counter */
1641         gb_increment_scanline();
1642         gb_lcd.delayed_line_irq = gb_lcd.line_irq;
1643         gb_lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1644         gb_lcd.line_irq = 0;
1645         if ( ! gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq )
1587         gb_increment_scanline(state);
1588         state->lcd.delayed_line_irq = state->lcd.line_irq;
1589         state->lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1590         state->lcd.line_irq = 0;
1591         if ( ! state->lcd.delayed_line_irq && state->lcd.triggering_line_irq )
16461592         {
1647            gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1593            state->lcd.line_irq = state->lcd.triggering_line_irq;
16481594            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
16491595         }
16501596         /* Reset LY==LYC STAT bit */
16511597         LCDSTAT &= 0xFB;
1652         if ( gb_lcd.current_line == 153 )
1598         if ( state->lcd.current_line == 153 )
16531599         {
1654            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1);
1600            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1);
16551601         }
16561602         else
16571603         {
1658            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY9X_M1);
1604            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY9X_M1);
16591605         }
16601606         break;
16611607      case GB_LCD_STATE_LY00_M1:      /* we stay in VBlank but current line counter should already be incremented */
16621608         /* Check LY=LYC for line #153 */
1663         if ( gb_lcd.delayed_line_irq )
1609         if ( state->lcd.delayed_line_irq )
16641610         {
1665            if ( gb_lcd.triggering_line_irq )
1611            if ( state->lcd.triggering_line_irq )
16661612            {
16671613               cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
16681614            }
16691615         }
1670         gb_lcd.delayed_line_irq = gb_lcd.delayed_line_irq | gb_lcd.line_irq;
1616         state->lcd.delayed_line_irq = state->lcd.delayed_line_irq | state->lcd.line_irq;
16711617         if ( CURLINE == CMPLINE )
16721618         {
16731619            LCDSTAT |= 0x04;
16741620         }
1675         gb_increment_scanline();
1676         gb_lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1677         gb_lcd.line_irq = 0;
1621         gb_increment_scanline(state);
1622         state->lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1623         state->lcd.line_irq = 0;
16781624         LCDSTAT &= 0xFB;
1679         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4/*8*/), GB_LCD_STATE_LY00_M1_1);
1625         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4/*8*/), GB_LCD_STATE_LY00_M1_1);
16801626         break;
16811627      case GB_LCD_STATE_LY00_M1_1:
1682         if ( ! gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq )
1628         if ( ! state->lcd.delayed_line_irq && state->lcd.triggering_line_irq )
16831629         {
1684            gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1630            state->lcd.line_irq = state->lcd.triggering_line_irq;
16851631            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
16861632         }
1687         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1_2);
1633         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1_2);
16881634         break;
16891635      case GB_LCD_STATE_LY00_M1_2:   /* Rest of line #0 during VBlank */
1690         if ( gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq )
1636         if ( state->lcd.delayed_line_irq && state->lcd.triggering_line_irq )
16911637         {
1692            gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1638            state->lcd.line_irq = state->lcd.triggering_line_irq;
16931639            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
16941640         }
16951641         if ( CURLINE == CMPLINE )
16961642         {
16971643            LCDSTAT |= 0x04;
16981644         }
1699         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(444), GB_LCD_STATE_LY00_M0);
1645         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(444), GB_LCD_STATE_LY00_M0);
17001646         break;
17011647      case GB_LCD_STATE_LY00_M0:      /* The STAT register seems to go to 0 for about 4 cycles */
17021648         /* Set Mode 0 lcdstat */
1703         gb_lcd.mode = 0;
1649         state->lcd.mode = 0;
17041650         LCDSTAT = ( LCDSTAT & 0xFC );
1705         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M2);
1651         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M2);
17061652         break;
17071653      }
17081654   }
17091655   else
17101656   {
1711      gb_increment_scanline();
1712      if ( gb_lcd.current_line < 144 )
1657      gb_increment_scanline(state);
1658      if ( state->lcd.current_line < 144 )
17131659      {
1714         update_scanline( machine );
1660         (*state->update_scanline)( machine );
17151661      }
1716      timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(456), 0);
1662      timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(456), 0);
17171663   }
17181664}
17191665
17201666static TIMER_CALLBACK(gbc_lcd_timer_proc)
17211667{
1668   gb_state *state = machine->driver_data<gb_state>();
17221669   static const int sprite_cycles[] = { 0, 8, 20, 32, 44, 52, 64, 76, 88, 96, 108 };
17231670
1724   gb_lcd.state = param;
1671   state->lcd.state = param;
17251672
17261673   if ( LCDCONT & 0x80 )
17271674   {
1728      switch( gb_lcd.state )
1675      switch( state->lcd.state )
17291676      {
17301677      case GB_LCD_STATE_LYXX_PRE_M0:   /* Just before switching to mode 0 */
1731         gb_lcd.mode = 0;
1678         state->lcd.mode = 0;
17321679         if ( LCDSTAT & 0x08 )
17331680         {
1734            if ( ! gb_lcd.mode_irq )
1681            if ( ! state->lcd.mode_irq )
17351682            {
1736               if ( ! gb_lcd.line_irq && ! gb_lcd.delayed_line_irq )
1683               if ( ! state->lcd.line_irq && ! state->lcd.delayed_line_irq )
17371684               {
1738                  gb_lcd.mode_irq = 1;
1685                  state->lcd.mode_irq = 1;
17391686                  cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
17401687               }
17411688            }
17421689            else
17431690            {
1744               gb_lcd.mode_irq = 0;
1691               state->lcd.mode_irq = 0;
17451692            }
17461693         }
1747         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0);
1694         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0);
17481695         break;
17491696      case GB_LCD_STATE_LYXX_M0:      /* Switch to mode 0 */
17501697         /* update current scanline */
1751         update_scanline( machine );
1698         (*state->update_scanline)( machine );
17521699         /* Increment the number of window lines drawn if enabled */
1753         if ( gb_lcd.layer[1].enabled )
1700         if ( state->lcd.layer[1].enabled )
17541701         {
1755            gb_lcd.window_lines_drawn++;
1702            state->lcd.window_lines_drawn++;
17561703         }
1757         gb_lcd.previous_line = gb_lcd.current_line;
1704         state->lcd.previous_line = state->lcd.current_line;
17581705         /* Set Mode 0 lcdstate */
1759         gb_lcd.mode = 0;
1706         state->lcd.mode = 0;
17601707         LCDSTAT &= 0xFC;
1761         gb_lcd.oam_locked = UNLOCKED;
1762         gb_lcd.vram_locked = UNLOCKED;
1708         state->lcd.oam_locked = UNLOCKED;
1709         state->lcd.vram_locked = UNLOCKED;
17631710         /*
17641711                There seems to a kind of feature in the Game Boy hardware when the lowest bits of the
17651712                SCROLLX register equals 3 or 7, then the delayed M0 irq is triggered 4 cycles later
17661713                than usual.
17671714                The SGB probably has the same bug.
17681715            */
1769         gb_lcd.triggering_mode_irq = ( LCDSTAT & 0x08 ) ? 1 : 0;
1716         state->lcd.triggering_mode_irq = ( LCDSTAT & 0x08 ) ? 1 : 0;
17701717         if ( ( SCROLLX & 0x03 ) == 0x03 )
17711718         {
1772            gb_lcd.scrollx_adjust += 4;
1773            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_SCX3);
1719            state->lcd.scrollx_adjust += 4;
1720            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_SCX3);
17741721            break;
17751722         }
17761723      case GB_LCD_STATE_LYXX_M0_SCX3:
17771724         /* Generate lcd interrupt if requested */
1778         if ( ! gb_lcd.mode_irq && gb_lcd.triggering_mode_irq &&
1779              ( ( ! gb_lcd.line_irq && gb_lcd.delayed_line_irq ) || ! ( LCDSTAT & 0x40 ) ) )
1725         if ( ! state->lcd.mode_irq && state->lcd.triggering_mode_irq &&
1726              ( ( ! state->lcd.line_irq && state->lcd.delayed_line_irq ) || ! ( LCDSTAT & 0x40 ) ) )
17801727         {
17811728            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
1782            gb_lcd.triggering_mode_irq = 0;
1729            state->lcd.triggering_mode_irq = 0;
17831730         }
17841731         if ( ( SCROLLX & 0x03 ) == 0x03 )
17851732         {
1786            gb_lcd.pal_locked = UNLOCKED;
1733            state->lcd.pal_locked = UNLOCKED;
17871734         }
1788         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_GBC_PAL);
1735         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_GBC_PAL);
17891736         break;
17901737      case GB_LCD_STATE_LYXX_M0_GBC_PAL:
1791         gb_lcd.pal_locked = UNLOCKED;
1738         state->lcd.pal_locked = UNLOCKED;
17921739            /* Check for HBLANK DMA */
1793         if( gb_lcd.hdma_enabled )
1740         if( state->lcd.hdma_enabled )
17941741         {
17951742            gbc_hdma(machine, 0x10);
17961743//              cpunum_set_reg( 0, LR35902_DMA_CYCLES, 36 );
17971744         }
17981745         else
17991746         {
1800            gb_lcd.hdma_possible = 1;
1747            state->lcd.hdma_possible = 1;
18011748         }
1802         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(192 - gb_lcd.scrollx_adjust - gb_lcd.sprite_cycles), GB_LCD_STATE_LYXX_M0_PRE_INC);
1749         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(192 - state->lcd.scrollx_adjust - state->lcd.sprite_cycles), GB_LCD_STATE_LYXX_M0_PRE_INC);
18031750         break;
18041751      case GB_LCD_STATE_LYXX_M0_PRE_INC:   /* Just before incrementing the line counter go to mode 2 internally */
1805         gb_lcd.cmp_line = CMPLINE;
1752         state->lcd.cmp_line = CMPLINE;
18061753         if ( CURLINE < 143 )
18071754         {
1808            gb_lcd.mode = 2;
1755            state->lcd.mode = 2;
18091756            if ( LCDSTAT & 0x20 )
18101757            {
1811               if ( ! gb_lcd.mode_irq )
1758               if ( ! state->lcd.mode_irq )
18121759               {
1813                  if ( ! gb_lcd.line_irq && ! gb_lcd.delayed_line_irq )
1760                  if ( ! state->lcd.line_irq && ! state->lcd.delayed_line_irq )
18141761                  {
1815                     gb_lcd.mode_irq = 1;
1762                     state->lcd.mode_irq = 1;
18161763                     cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
18171764                  }
18181765               }
18191766               else
18201767               {
1821                  gb_lcd.mode_irq = 0;
1768                  state->lcd.mode_irq = 0;
18221769               }
18231770            }
18241771         }
1825         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_INC);
1772         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M0_INC);
18261773         break;
18271774      case GB_LCD_STATE_LYXX_M0_INC:   /* Increment LY, stay in M0 for 4 more cycles */
1828         gb_increment_scanline();
1829         gb_lcd.delayed_line_irq = gb_lcd.line_irq;
1830         gb_lcd.triggering_line_irq = ( ( gb_lcd.cmp_line == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1831         gb_lcd.line_irq = 0;
1832         if ( ! gb_lcd.mode_irq && ! gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq && ! ( LCDSTAT & 0x20 ) )
1775         gb_increment_scanline(state);
1776         state->lcd.delayed_line_irq = state->lcd.line_irq;
1777         state->lcd.triggering_line_irq = ( ( state->lcd.cmp_line == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1778         state->lcd.line_irq = 0;
1779         if ( ! state->lcd.mode_irq && ! state->lcd.delayed_line_irq && state->lcd.triggering_line_irq && ! ( LCDSTAT & 0x20 ) )
18331780         {
1834            gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1781            state->lcd.line_irq = state->lcd.triggering_line_irq;
18351782            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
18361783         }
1837         gb_lcd.hdma_possible = 0;
1784         state->lcd.hdma_possible = 0;
18381785         /* Check if we're going into VBlank next */
18391786         if ( CURLINE == 144 )
18401787         {
1841            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY9X_M1);
1788            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY9X_M1);
18421789         }
18431790         else
18441791         {
18451792            /* Internally switch to mode 2 */
1846            gb_lcd.mode = 2;
1793            state->lcd.mode = 2;
18471794            /* Generate lcd interrupt if requested */
1848            if ( ! gb_lcd.mode_irq && ( LCDSTAT & 0x20 ) &&
1849                ( ( ! gb_lcd.triggering_line_irq && ! gb_lcd.delayed_line_irq ) || ! ( LCDSTAT & 0x40 ) ) )
1795            if ( ! state->lcd.mode_irq && ( LCDSTAT & 0x20 ) &&
1796                ( ( ! state->lcd.triggering_line_irq && ! state->lcd.delayed_line_irq ) || ! ( LCDSTAT & 0x40 ) ) )
18501797            {
1851               gb_lcd.mode_irq = 1;
1798               state->lcd.mode_irq = 1;
18521799               cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
18531800            }
1854            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M2);
1801            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LYXX_M2);
18551802         }
18561803         break;
18571804      case GB_LCD_STATE_LY00_M2:      /* Switch to mode 2 on line #0 */
18581805         /* Set Mode 2 lcdstate */
1859         gb_lcd.mode = 2;
1806         state->lcd.mode = 2;
18601807         LCDSTAT = ( LCDSTAT & 0xFC ) | 0x02;
1861         gb_lcd.oam_locked = LOCKED;
1808         state->lcd.oam_locked = LOCKED;
18621809         /* Generate lcd interrupt if requested */
1863         if ( ( LCDSTAT & 0x20 ) && ! gb_lcd.line_irq && ! gb_lcd.line_irq )
1810         if ( ( LCDSTAT & 0x20 ) && ! state->lcd.line_irq && ! state->lcd.line_irq )
18641811         {
18651812            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
18661813         }
18671814         /* Check for regular compensation of x-scroll register */
1868         gb_lcd.scrollx_adjust = ( SCROLLX & 0x04 ) ? 4 : 0;
1815         state->lcd.scrollx_adjust = ( SCROLLX & 0x04 ) ? 4 : 0;
18691816         /* Mode 2 lasts approximately 80 clock cycles */
1870         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
1817         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
18711818         break;
18721819      case GB_LCD_STATE_LYXX_M2:      /* Switch to mode 2 */
18731820         /* Update STAT register to the correct state */
18741821         LCDSTAT = (LCDSTAT & 0xFC) | 0x02;
1875         gb_lcd.oam_locked = LOCKED;
1822         state->lcd.oam_locked = LOCKED;
18761823         /* Generate lcd interrupt if requested */
1877         if ( ( gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq && ! ( LCDSTAT & 0x20 ) ) ||
1878             ( !gb_lcd.mode_irq && ! gb_lcd.line_irq && ! gb_lcd.delayed_line_irq && ( LCDSTAT & 0x20 ) ) )
1824         if ( ( state->lcd.delayed_line_irq && state->lcd.triggering_line_irq && ! ( LCDSTAT & 0x20 ) ) ||
1825             ( !state->lcd.mode_irq && ! state->lcd.line_irq && ! state->lcd.delayed_line_irq && ( LCDSTAT & 0x20 ) ) )
18791826         {
18801827            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
18811828         }
1882         gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1829         state->lcd.line_irq = state->lcd.triggering_line_irq;
18831830         /* Check if LY==LYC STAT bit should be set */
18841831         if ( CURLINE == CMPLINE )
18851832         {
r9784r9785
18901837            LCDSTAT &= ~0x04;
18911838         }
18921839         /* Check for regular compensation of x-scroll register */
1893         gb_lcd.scrollx_adjust = ( SCROLLX & 0x04 ) ? 4 : 0;
1840         state->lcd.scrollx_adjust = ( SCROLLX & 0x04 ) ? 4 : 0;
18941841         /* Mode 2 last for approximately 80 clock cycles */
1895         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
1842         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
18961843         break;
18971844      case GB_LCD_STATE_LYXX_M3:      /* Switch to mode 3 */
1898         gb_select_sprites();
1899         gb_lcd.sprite_cycles = sprite_cycles[ gb_lcd.sprCount ];
1845         gb_select_sprites(state);
1846         state->lcd.sprite_cycles = sprite_cycles[ state->lcd.sprCount ];
19001847         /* Set Mode 3 lcdstate */
1901         gb_lcd.mode = 3;
1848         state->lcd.mode = 3;
19021849         LCDSTAT = (LCDSTAT & 0xFC) | 0x03;
1903         gb_lcd.vram_locked = LOCKED;
1904         gb_lcd.pal_locked = LOCKED;
1850         state->lcd.vram_locked = LOCKED;
1851         state->lcd.pal_locked = LOCKED;
19051852         /* Check for compensations of x-scroll register */
19061853         /* Mode 3 lasts for approximately 172+cycles needed to handle sprites clock cycles */
1907         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(168 + gb_lcd.scrollx_adjust + gb_lcd.sprite_cycles), GB_LCD_STATE_LYXX_PRE_M0);
1908         gb_lcd.start_x = -1;
1854         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(168 + state->lcd.scrollx_adjust + state->lcd.sprite_cycles), GB_LCD_STATE_LYXX_PRE_M0);
1855         state->lcd.start_x = -1;
19091856         break;
19101857      case GB_LCD_STATE_LY9X_M1:      /* Switch to or stay in mode 1 */
19111858         if ( CURLINE == 144 )
r9784r9785
19131860            /* Trigger VBlank interrupt */
19141861            cputag_set_input_line( machine, "maincpu", VBL_INT, ASSERT_LINE );
19151862            /* Set VBlank lcdstate */
1916            gb_lcd.mode = 1;
1863            state->lcd.mode = 1;
19171864            LCDSTAT = (LCDSTAT & 0xFC) | 0x01;
19181865            /* Trigger LCD interrupt if requested */
19191866            if ( LCDSTAT & 0x10 )
r9784r9785
19301877         {
19311878            LCDSTAT &= ~0x04;
19321879         }
1933         if ( gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq )
1880         if ( state->lcd.delayed_line_irq && state->lcd.triggering_line_irq )
19341881         {
19351882            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
19361883         }
1937         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(452), GB_LCD_STATE_LY9X_M1_INC);
1884         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(452), GB_LCD_STATE_LY9X_M1_INC);
19381885         break;
19391886      case GB_LCD_STATE_LY9X_M1_INC:      /* Increment scanline counter */
1940         gb_increment_scanline();
1941         gb_lcd.delayed_line_irq = gb_lcd.line_irq;
1942         gb_lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1943         gb_lcd.line_irq = 0;
1944         if ( ! gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq )
1887         gb_increment_scanline(state);
1888         state->lcd.delayed_line_irq = state->lcd.line_irq;
1889         state->lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1890         state->lcd.line_irq = 0;
1891         if ( ! state->lcd.delayed_line_irq && state->lcd.triggering_line_irq )
19451892         {
1946            gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1893            state->lcd.line_irq = state->lcd.triggering_line_irq;
19471894            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
19481895         }
1949         if ( gb_lcd.current_line == 153 )
1896         if ( state->lcd.current_line == 153 )
19501897         {
1951            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1);
1898            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1);
19521899         }
19531900         else
19541901         {
1955            timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY9X_M1);
1902            timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY9X_M1);
19561903         }
19571904         break;
19581905      case GB_LCD_STATE_LY00_M1:      /* we stay in VBlank but current line counter should already be incremented */
19591906         /* Check LY=LYC for line #153 */
1960         if ( gb_lcd.delayed_line_irq )
1907         if ( state->lcd.delayed_line_irq )
19611908         {
1962            if ( gb_lcd.triggering_line_irq )
1909            if ( state->lcd.triggering_line_irq )
19631910            {
19641911               cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
19651912            }
19661913         }
1967         gb_lcd.delayed_line_irq = gb_lcd.delayed_line_irq | gb_lcd.line_irq;
1914         state->lcd.delayed_line_irq = state->lcd.delayed_line_irq | state->lcd.line_irq;
19681915         if ( CURLINE == CMPLINE )
19691916         {
19701917            LCDSTAT |= 0x04;
r9784r9785
19731920         {
19741921            LCDSTAT &= ~0x04;
19751922         }
1976         gb_increment_scanline();
1977         gb_lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1978         gb_lcd.line_irq = 0;
1923         gb_increment_scanline(state);
1924         state->lcd.triggering_line_irq = ( ( CMPLINE == CURLINE ) && ( LCDSTAT & 0x40 ) ) ? 1 : 0;
1925         state->lcd.line_irq = 0;
19791926         LCDSTAT &= 0xFB;
1980         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1_1);
1927         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1_1);
19811928         break;
19821929      case GB_LCD_STATE_LY00_M1_1:
1983         if ( ! gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq )
1930         if ( ! state->lcd.delayed_line_irq && state->lcd.triggering_line_irq )
19841931         {
1985            gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1932            state->lcd.line_irq = state->lcd.triggering_line_irq;
19861933            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
19871934         }
1988         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1_2);
1935         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M1_2);
19891936         break;
19901937      case GB_LCD_STATE_LY00_M1_2:   /* Rest of line #0 during VBlank */
1991         if ( gb_lcd.delayed_line_irq && gb_lcd.triggering_line_irq )
1938         if ( state->lcd.delayed_line_irq && state->lcd.triggering_line_irq )
19921939         {
1993            gb_lcd.line_irq = gb_lcd.triggering_line_irq;
1940            state->lcd.line_irq = state->lcd.triggering_line_irq;
19941941            cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
19951942         }
19961943         if ( CURLINE == CMPLINE )
r9784r9785
20011948         {
20021949            LCDSTAT &= ~0x04;
20031950         }
2004         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(444), GB_LCD_STATE_LY00_M0);
1951         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(444), GB_LCD_STATE_LY00_M0);
20051952         break;
20061953      case GB_LCD_STATE_LY00_M0:      /* The STAT register seems to go to 0 for about 4 cycles */
20071954         /* Set Mode 0 lcdstat */
2008         gb_lcd.mode = 0;
2009         timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M2);
1955         state->lcd.mode = 0;
1956         timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(4), GB_LCD_STATE_LY00_M2);
20101957         break;
20111958      }
20121959   }
20131960   else
20141961   {
2015      gb_increment_scanline();
2016      if ( gb_lcd.current_line < 144 )
1962      gb_increment_scanline(state);
1963      if ( state->lcd.current_line < 144 )
20171964      {
2018         update_scanline( machine );
1965         (*state->update_scanline)( machine );
20191966      }
2020      timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(456), 0);
1967      timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(456), 0);
20211968   }
20221969}
20231970
20241971static void gb_lcd_switch_on( running_machine *machine )
20251972{
2026   gb_lcd.current_line = 0;
2027   gb_lcd.previous_line = 153;
2028   gb_lcd.window_lines_drawn = 0;
2029   gb_lcd.line_irq = 0;
2030   gb_lcd.delayed_line_irq = 0;
2031   gb_lcd.mode = 0;
2032   gb_lcd.oam_locked = LOCKED;   /* TODO: Investigate whether this OAM locking is correct. */
1973   gb_state *state = machine->driver_data<gb_state>();
1974   state->lcd.current_line = 0;
1975   state->lcd.previous_line = 153;
1976   state->lcd.window_lines_drawn = 0;
1977   state->lcd.line_irq = 0;
1978   state->lcd.delayed_line_irq = 0;
1979   state->lcd.mode = 0;
1980   state->lcd.oam_locked = LOCKED;   /* TODO: Investigate whether this OAM locking is correct. */
20331981   /* Check for LY=LYC coincidence */
20341982   if ( CURLINE == CMPLINE )
20351983   {
r9784r9785
20401988         cputag_set_input_line( machine, "maincpu", LCD_INT, ASSERT_LINE );
20411989      }
20421990   }
2043   gb_lcd.state = GB_LCD_STATE_LY00_M2;
2044   timer_adjust_oneshot(gb_lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
1991   state->lcd.state = GB_LCD_STATE_LY00_M2;
1992   timer_adjust_oneshot(state->lcd.lcd_timer, machine->device<cpu_device>("maincpu")->cycles_to_attotime(80), GB_LCD_STATE_LYXX_M3);
20451993}
20461994
20471995READ8_HANDLER( gb_video_r )
20481996{
2049   return gb_lcd.gb_vid_regs[offset];
1997   gb_state *state = space->machine->driver_data<gb_state>();
1998   return state->lcd.gb_vid_regs[offset];
20501999}
20512000
20522001READ8_HANDLER( gb_vram_r )
20532002{
2054   return ( gb_lcd.vram_locked == LOCKED ) ? 0xFF : gb_lcd.gb_vram_ptr[offset];
2003   gb_state *state = space->machine->driver_data<gb_state>();
2004   return ( state->lcd.vram_locked == LOCKED ) ? 0xFF : state->lcd.gb_vram_ptr[offset];
20552005}
20562006
20572007WRITE8_HANDLER( gb_vram_w )
20582008{
2059   if ( gb_lcd.vram_locked == LOCKED )
2009   gb_state *state = space->machine->driver_data<gb_state>();
2010   if ( state->lcd.vram_locked == LOCKED )
20602011   {
20612012      return;
20622013   }
2063   gb_lcd.gb_vram_ptr[offset] = data;
2014   state->lcd.gb_vram_ptr[offset] = data;
20642015}
20652016
20662017READ8_HANDLER( gb_oam_r )
20672018{
2068   return ( gb_lcd.oam_locked == LOCKED ) ? 0xFF : gb_lcd.gb_oam->base()[offset];
2019   gb_state *state = space->machine->driver_data<gb_state>();
2020   return ( state->lcd.oam_locked == LOCKED ) ? 0xFF : state->lcd.gb_oam->base()[offset];
20692021}
20702022
20712023WRITE8_HANDLER( gb_oam_w )
20722024{
2073   if ( gb_lcd.oam_locked == LOCKED || offset >= 0xa0 )
2025   gb_state *state = space->machine->driver_data<gb_state>();
2026   if ( state->lcd.oam_locked == LOCKED || offset >= 0xa0 )
20742027   {
20752028      return;
20762029   }
2077   gb_lcd.gb_oam->base()[offset] = data;
2030   state->lcd.gb_oam->base()[offset] = data;
20782031}
20792032
20802033WRITE8_HANDLER ( gb_video_w )
20812034{
2035   gb_state *state = space->machine->driver_data<gb_state>();
20822036   switch (offset)
20832037   {
20842038   case 0x00:                  /* LCDC - LCD Control */
2085      gb_lcd.gb_chrgen = gb_lcd.gb_vram->base() + ((data & 0x10) ? 0x0000 : 0x0800);
2086      gb_lcd.gb_tile_no_mod = (data & 0x10) ? 0x00 : 0x80;
2087      gb_lcd.gb_bgdtab = gb_lcd.gb_vram->base() + ((data & 0x08) ? 0x1C00 : 0x1800 );
2088      gb_lcd.gb_wndtab = gb_lcd.gb_vram->base() + ((data & 0x40) ? 0x1C00 : 0x1800 );
2039      state->lcd.gb_chrgen = state->lcd.gb_vram->base() + ((data & 0x10) ? 0x0000 : 0x0800);
2040      state->lcd.gb_tile_no_mod = (data & 0x10) ? 0x00 : 0x80;
2041      state->lcd.gb_bgdtab = state->lcd.gb_vram->base() + ((data & 0x08) ? 0x1C00 : 0x1800 );
2042      state->lcd.gb_wndtab = state->lcd.gb_vram->base() + ((data & 0x40) ? 0x1C00 : 0x1800 );
20892043      /* if LCD controller is switched off, set STAT and LY to 00 */
20902044      if ( ! ( data & 0x80 ) )
20912045      {
20922046         LCDSTAT &= ~0x03;
20932047         CURLINE = 0;
2094         gb_lcd.oam_locked = UNLOCKED;
2095         gb_lcd.vram_locked = UNLOCKED;
2048         state->lcd.oam_locked = UNLOCKED;
2049         state->lcd.vram_locked = UNLOCKED;
20962050      }
20972051      /* If LCD is being switched on */
20982052      if ( !( LCDCONT & 0x80 ) && ( data & 0x80 ) )
r9784r9785
21232077               - 0x20 -> 0x00/0x08/0x10/0x20/0x40 (mode 2, after m2int) - don't trigger
21242078               - 0x20 -> 0x00/0x08/0x10/0x20/0x40 (mode 3, after m2int) - don't trigger
21252079            */
2126         if ( ! gb_lcd.mode_irq && ( ( gb_lcd.mode == 1 ) ||
2080         if ( ! state->lcd.mode_irq && ( ( state->lcd.mode == 1 ) ||
21272081            ( ( LCDSTAT & 0x40 ) && ! ( data & 0x68 ) ) ||
21282082            ( ! ( LCDSTAT & 0x40 ) && ( data & 0x40 ) && ( LCDSTAT & 0x04 ) ) ||
21292083            ( ! ( LCDSTAT & 0x48 ) && ( data & 0x08 ) ) ||
r9784r9785
21382092               - 0x20 -> 0x00/0x10/0x20/0x40 (mode 0, after m2int) - trigger (stat bug)
21392093               - 0x00 -> 0xXX (mode 0) - trigger stat bug
21402094            */
2141         if ( gb_lcd.mode_irq && gb_lcd.mode == 0 )
2095         if ( state->lcd.mode_irq && state->lcd.mode == 0 )
21422096         {
21432097            cputag_set_input_line( space->machine, "maincpu", LCD_INT, ASSERT_LINE );
21442098         }
r9784r9785
21512105      {
21522106         if ( CURLINE == data )
21532107         {
2154            if ( gb_lcd.state != GB_LCD_STATE_LYXX_M0_INC && gb_lcd.state != GB_LCD_STATE_LY9X_M1_INC )
2108            if ( state->lcd.state != GB_LCD_STATE_LYXX_M0_INC && state->lcd.state != GB_LCD_STATE_LY9X_M1_INC )
21552109            {
21562110               LCDSTAT |= 0x04;
21572111               /* Generate lcd interrupt if requested */
r9784r9785
21642118         else
21652119         {
21662120            LCDSTAT &= 0xFB;
2167            gb_lcd.triggering_line_irq = 0;
2121            state->lcd.triggering_line_irq = 0;
21682122         }
21692123      }
21702124      break;
21712125   case 0x06:                  /* DMA - DMA Transfer and Start Address */
21722126      {
2173         UINT8 *P = gb_lcd.gb_oam->base();
2127         UINT8 *P = state->lcd.gb_oam->base();
21742128         offset = (UINT16) data << 8;
21752129         for (data = 0; data < 0xA0; data++)
21762130            *P++ = space->read_byte(offset++);
21772131      }
21782132      return;
21792133   case 0x07:                  /* BGP - Background Palette */
2180      update_scanline( space->machine );
2181      gb_lcd.gb_bpal[0] = data & 0x3;
2182      gb_lcd.gb_bpal[1] = (data & 0xC) >> 2;
2183      gb_lcd.gb_bpal[2] = (data & 0x30) >> 4;
2184      gb_lcd.gb_bpal[3] = (data & 0xC0) >> 6;
2134      (*state->update_scanline)( space->machine );
2135      state->lcd.gb_bpal[0] = data & 0x3;
2136      state->lcd.gb_bpal[1] = (data & 0xC) >> 2;
2137      state->lcd.gb_bpal[2] = (data & 0x30) >> 4;
2138      state->lcd.gb_bpal[3] = (data & 0xC0) >> 6;
21852139      break;
21862140   case 0x08:                  /* OBP0 - Object Palette 0 */
2187//      update_scanline( machine );
2188      gb_lcd.gb_spal0[0] = data & 0x3;
2189      gb_lcd.gb_spal0[1] = (data & 0xC) >> 2;
2190      gb_lcd.gb_spal0[2] = (data & 0x30) >> 4;
2191      gb_lcd.gb_spal0[3] = (data & 0xC0) >> 6;
2141//      (*state->update_scanline)( machine );
2142      state->lcd.gb_spal0[0] = data & 0x3;
2143      state->lcd.gb_spal0[1] = (data & 0xC) >> 2;
2144      state->lcd.gb_spal0[2] = (data & 0x30) >> 4;
2145      state->lcd.gb_spal0[3] = (data & 0xC0) >> 6;
21922146      break;
21932147   case 0x09:                  /* OBP1 - Object Palette 1 */
2194//      update_scanline( machine );
2195      gb_lcd.gb_spal1[0] = data & 0x3;
2196      gb_lcd.gb_spal1[1] = (data & 0xC) >> 2;
2197      gb_lcd.gb_spal1[2] = (data & 0x30) >> 4;
2198      gb_lcd.gb_spal1[3] = (data & 0xC0) >> 6;
2148//      (*state->update_scanline)( machine );
2149      state->lcd.gb_spal1[0] = data & 0x3;
2150      state->lcd.gb_spal1[1] = (data & 0xC) >> 2;
2151      state->lcd.gb_spal1[2] = (data & 0x30) >> 4;
2152      state->lcd.gb_spal1[3] = (data & 0xC0) >> 6;
21992153      break;
22002154   case 0x02:                  /* SCY - Scroll Y */
22012155   case 0x03:                  /* SCX - Scroll X */
2202      update_scanline( space->machine );
2156      (*state->update_scanline)( space->machine );
22032157   case 0x0A:                  /* WY - Window Y position */
22042158   case 0x0B:                  /* WX - Window X position */
22052159      break;
22062160   default:                  /* Unknown register, no change */
22072161      return;
22082162   }
2209   gb_lcd.gb_vid_regs[ offset ] = data;
2163   state->lcd.gb_vid_regs[ offset ] = data;
22102164}
22112165
22122166READ8_HANDLER( gbc_video_r )
22132167{
2168   gb_state *state = space->machine->driver_data<gb_state>();
22142169   switch( offset )
22152170   {
22162171   case 0x11:   /* FF51 */
r9784r9785
22202175      return 0xFF;
22212176   case 0x29:   /* FF69 */
22222177   case 0x2B:   /* FF6B */
2223      if ( gb_lcd.pal_locked == LOCKED )
2178      if ( state->lcd.pal_locked == LOCKED )
22242179      {
22252180         return 0xFF;
22262181      }
22272182      break;
22282183   }
2229   return gb_lcd.gb_vid_regs[offset];
2184   return state->lcd.gb_vid_regs[offset];
22302185}
22312186
22322187WRITE8_HANDLER ( gbc_video_w )
22332188{
2189   gb_state *state = space->machine->driver_data<gb_state>();
22342190   switch( offset )
22352191   {
22362192   case 0x00:      /* LCDC - LCD Control */
2237      gb_lcd.gb_chrgen = gb_lcd.gb_vram->base() + ((data & 0x10) ? 0x0000 : 0x0800);
2238      gb_lcd.gbc_chrgen = gb_lcd.gb_vram->base() + ((data & 0x10) ? 0x2000 : 0x2800);
2239      gb_lcd.gb_tile_no_mod = (data & 0x10) ? 0x00 : 0x80;
2240      gb_lcd.gb_bgdtab = gb_lcd.gb_vram->base() + ((data & 0x08) ? 0x1C00 : 0x1800);
2241      gb_lcd.gbc_bgdtab = gb_lcd.gb_vram->base() + ((data & 0x08) ? 0x3C00 : 0x3800);
2242      gb_lcd.gb_wndtab = gb_lcd.gb_vram->base() + ((data & 0x40) ? 0x1C00 : 0x1800);
2243      gb_lcd.gbc_wndtab = gb_lcd.gb_vram->base() + ((data & 0x40) ? 0x3C00 : 0x3800);
2193      state->lcd.gb_chrgen = state->lcd.gb_vram->base() + ((data & 0x10) ? 0x0000 : 0x0800);
2194      state->lcd.gbc_chrgen = state->lcd.gb_vram->base() + ((data & 0x10) ? 0x2000 : 0x2800);
2195      state->lcd.gb_tile_no_mod = (data & 0x10) ? 0x00 : 0x80;
2196      state->lcd.gb_bgdtab = state->lcd.gb_vram->base() + ((data & 0x08) ? 0x1C00 : 0x1800);
2197      state->lcd.gbc_bgdtab = state->lcd.gb_vram->base() + ((data & 0x08) ? 0x3C00 : 0x3800);
2198      state->lcd.gb_wndtab = state->lcd.gb_vram->base() + ((data & 0x40) ? 0x1C00 : 0x1800);
2199      state->lcd.gbc_wndtab = state->lcd.gb_vram->base() + ((data & 0x40) ? 0x3C00 : 0x3800);
22442200      /* if LCD controller is switched off, set STAT to 00 */
22452201      if ( ! ( data & 0x80 ) )
22462202      {
22472203         LCDSTAT &= ~0x03;
22482204         CURLINE = 0;
2249         gb_lcd.oam_locked = UNLOCKED;
2250         gb_lcd.vram_locked = UNLOCKED;
2251         gb_lcd.pal_locked = UNLOCKED;
2205         state->lcd.oam_locked = UNLOCKED;
2206         state->lcd.vram_locked = UNLOCKED;
2207         state->lcd.pal_locked = UNLOCKED;
22522208      }
22532209      /* If LCD is being switched on */
22542210      if ( !( LCDCONT & 0x80 ) && ( data & 0x80 ) )
r9784r9785
22632219         /*
22642220               - 0x20 -> 0x08/0x18/0x28/0x48 (mode 0, after m2int) - trigger
22652221            */
2266         if ( gb_lcd.mode_irq && gb_lcd.mode == 0 && ( LCDSTAT & 0x28 ) == 0x20 && ( data & 0x08 ) )
2222         if ( state->lcd.mode_irq && state->lcd.mode == 0 && ( LCDSTAT & 0x28 ) == 0x20 && ( data & 0x08 ) )
22672223         {
22682224            cputag_set_input_line( space->machine, "maincpu", LCD_INT, ASSERT_LINE );
22692225         }
22702226         /* Check if line irqs are being disabled */
22712227         if ( ! ( data & 0x40 ) )
22722228         {
2273            gb_lcd.delayed_line_irq = 0;
2229            state->lcd.delayed_line_irq = 0;
22742230         }
22752231         /* Check if line irqs are being enabled */
22762232         if ( ! ( LCDSTAT & 0x40 ) && ( data & 0x40 ) )
22772233         {
22782234            if ( CMPLINE == CURLINE )
22792235            {
2280               gb_lcd.line_irq = 1;
2236               state->lcd.line_irq = 1;
22812237               cputag_set_input_line( space->machine, "maincpu", LCD_INT, ASSERT_LINE );
22822238            }
22832239         }
r9784r9785
22862242   case 0x05:                      /* LYC */
22872243      if ( CMPLINE != data )
22882244      {
2289         if ( ( gb_lcd.state != GB_LCD_STATE_LYXX_M0_PRE_INC && CURLINE == data ) ||
2290              ( gb_lcd.state == GB_LCD_STATE_LYXX_M0_INC && gb_lcd.triggering_line_irq ) )
2245         if ( ( state->lcd.state != GB_LCD_STATE_LYXX_M0_PRE_INC && CURLINE == data ) ||
2246              ( state->lcd.state == GB_LCD_STATE_LYXX_M0_INC && state->lcd.triggering_line_irq ) )
22912247         {
22922248            LCDSTAT |= 0x04;
22932249            /* Generate lcd interrupt if requested */
r9784r9785
22992255         else
23002256         {
23012257            LCDSTAT &= 0xFB;
2302            gb_lcd.triggering_line_irq = 0;
2303            gb_lcd.cmp_line = data;
2258            state->lcd.triggering_line_irq = 0;
2259            state->lcd.cmp_line = data;
23042260         }
23052261      }
23062262      break;
23072263   case 0x07:      /* BGP - GB background palette */
2308      update_scanline( space->machine );
2309      gb_lcd.gb_bpal[0] = data & 0x3;
2310      gb_lcd.gb_bpal[1] = (data & 0xC) >> 2;
2311      gb_lcd.gb_bpal[2] = (data & 0x30) >> 4;
2312      gb_lcd.gb_bpal[3] = (data & 0xC0) >> 6;
2264      (*state->update_scanline)( space->machine );
2265      state->lcd.gb_bpal[0] = data & 0x3;
2266      state->lcd.gb_bpal[1] = (data & 0xC) >> 2;
2267      state->lcd.gb_bpal[2] = (data & 0x30) >> 4;
2268      state->lcd.gb_bpal[3] = (data & 0xC0) >> 6;
23132269      break;
23142270   case 0x08:      /* OBP0 - GB Object 0 palette */
2315      gb_lcd.gb_spal0[0] = data & 0x3;
2316      gb_lcd.gb_spal0[1] = (data & 0xC) >> 2;
2317      gb_lcd.gb_spal0[2] = (data & 0x30) >> 4;
2318      gb_lcd.gb_spal0[3] = (data & 0xC0) >> 6;
2271      state->lcd.gb_spal0[0] = data & 0x3;
2272      state->lcd.gb_spal0[1] = (data & 0xC) >> 2;
2273      state->lcd.gb_spal0[2] = (data & 0x30) >> 4;
2274      state->lcd.gb_spal0[3] = (data & 0xC0) >> 6;
23192275      break;
23202276   case 0x09:      /* OBP1 - GB Object 1 palette */
2321      gb_lcd.gb_spal1[0] = data & 0x3;
2322      gb_lcd.gb_spal1[1] = (data & 0xC) >> 2;
2323      gb_lcd.gb_spal1[2] = (data & 0x30) >> 4;
2324      gb_lcd.gb_spal1[3] = (data & 0xC0) >> 6;
2277      state->lcd.gb_spal1[0] = data & 0x3;
2278      state->lcd.gb_spal1[1] = (data & 0xC) >> 2;
2279      state->lcd.gb_spal1[2] = (data & 0x30) >> 4;
2280      state->lcd.gb_spal1[3] = (data & 0xC0) >> 6;
23252281      break;
23262282   case 0x0c:      /* Undocumented register involved in selecting gb/gbc mode */
23272283      logerror( "Write to undocumented register: %X = %X\n", offset, data );
23282284      break;
23292285   case 0x0F:      /* VBK - VRAM bank select */
2330      gb_lcd.gb_vram_ptr = gb_lcd.gb_vram->base() + ( data & 0x01 ) * 0x2000;
2286      state->lcd.gb_vram_ptr = state->lcd.gb_vram->base() + ( data & 0x01 ) * 0x2000;
23312287      data |= 0xFE;
23322288      break;
23332289   case 0x11:      /* HDMA1 - HBL General DMA - Source High */
r9784r9785
23442300   case 0x15:      /* HDMA5 - HBL General DMA - Mode, Length */
23452301      if( !(data & 0x80) )
23462302      {
2347         if( gb_lcd.hdma_enabled )
2303         if( state->lcd.hdma_enabled )
23482304         {
2349            gb_lcd.hdma_enabled = 0;
2305            state->lcd.hdma_enabled = 0;
23502306            data = HDMA5 & 0x80;
23512307         }
23522308         else
r9784r9785
23602316      else
23612317      {
23622318         /* H-Blank DMA */
2363         gb_lcd.hdma_enabled = 1;
2319         state->lcd.hdma_enabled = 1;
23642320         data &= 0x7f;
2365         gb_lcd.gb_vid_regs[offset] = data;
2321         state->lcd.gb_vid_regs[offset] = data;
23662322         /* Check if HDMA should be immediately performed */
2367         if ( gb_lcd.hdma_possible )
2323         if ( state->lcd.hdma_possible )
23682324         {
23692325            gbc_hdma( space->machine, 0x10 );
23702326//              cpunum_set_reg( 0, LR35902_DMA_CYCLES, 36 );
2371            gb_lcd.hdma_possible = 0;
2327            state->lcd.hdma_possible = 0;
23722328         }
23732329      }
23742330      break;
23752331   case 0x28:      /* BCPS - Background palette specification */
23762332      GBCBCPS = data;
23772333      if (data & 0x01)
2378         GBCBCPD = gb_lcd.cgb_bpal[( data >> 1 ) & 0x1F] >> 8;
2334         GBCBCPD = state->lcd.cgb_bpal[( data >> 1 ) & 0x1F] >> 8;
23792335      else
2380         GBCBCPD = gb_lcd.cgb_bpal[( data >> 1 ) & 0x1F] & 0xFF;
2336         GBCBCPD = state->lcd.cgb_bpal[( data >> 1 ) & 0x1F] & 0xFF;
23812337      break;
23822338   case 0x29:      /* BCPD - background palette data */
2383      if ( gb_lcd.pal_locked == LOCKED )
2339      if ( state->lcd.pal_locked == LOCKED )
23842340      {
23852341         return;
23862342      }
23872343      GBCBCPD = data;
23882344      if (GBCBCPS & 0x01)
2389         gb_lcd.cgb_bpal[( GBCBCPS >> 1 ) & 0x1F] = ((data << 8) | (gb_lcd.cgb_bpal[( GBCBCPS >> 1 ) & 0x1F] & 0xFF)) & 0x7FFF;
2345         state->lcd.cgb_bpal[( GBCBCPS >> 1 ) & 0x1F] = ((data << 8) | (state->lcd.cgb_bpal[( GBCBCPS >> 1 ) & 0x1F] & 0xFF)) & 0x7FFF;
23902346      else
2391         gb_lcd.cgb_bpal[( GBCBCPS >> 1 ) & 0x1F] = ((gb_lcd.cgb_bpal[( GBCBCPS >> 1 ) & 0x1F] & 0xFF00) | data) & 0x7FFF;
2347         state->lcd.cgb_bpal[( GBCBCPS >> 1 ) & 0x1F] = ((state->lcd.cgb_bpal[( GBCBCPS >> 1 ) & 0x1F] & 0xFF00) | data) & 0x7FFF;
23922348      if( GBCBCPS & 0x80 )
23932349      {
23942350         GBCBCPS++;
r9784r9785
23982354   case 0x2A:      /* OCPS - Object palette specification */
23992355      GBCOCPS = data;
24002356      if (data & 0x01)
2401         GBCOCPD = gb_lcd.cgb_spal[( data >> 1 ) & 0x1F] >> 8;
2357         GBCOCPD = state->lcd.cgb_spal[( data >> 1 ) & 0x1F] >> 8;
24022358      else
2403         GBCOCPD = gb_lcd.cgb_spal[( data >> 1 ) & 0x1F] & 0xFF;
2359         GBCOCPD = state->lcd.cgb_spal[( data >> 1 ) & 0x1F] & 0xFF;
24042360      break;
24052361   case 0x2B:      /* OCPD - Object palette data */
2406      if ( gb_lcd.pal_locked == LOCKED )
2362      if ( state->lcd.pal_locked == LOCKED )
24072363      {
24082364         return;
24092365      }
24102366      GBCOCPD = data;
24112367      if (GBCOCPS & 0x01)
2412         gb_lcd.cgb_spal[( GBCOCPS >> 1 ) & 0x1F] = ((data << 8) | (gb_lcd.cgb_spal[( GBCOCPS >> 1 ) & 0x1F] & 0xFF)) & 0x7FFF;
2368         state->lcd.cgb_spal[( GBCOCPS >> 1 ) & 0x1F] = ((data << 8) | (state->lcd.cgb_spal[( GBCOCPS >> 1 ) & 0x1F] & 0xFF)) & 0x7FFF;
24132369      else
2414         gb_lcd.cgb_spal[( GBCOCPS >> 1 ) & 0x1F] = ((gb_lcd.cgb_spal[( GBCOCPS >> 1 ) & 0x1F] & 0xFF00) | data) & 0x7FFF;
2370         state->lcd.cgb_spal[( GBCOCPS >> 1 ) & 0x1F] = ((state->lcd.cgb_spal[( GBCOCPS >> 1 ) & 0x1F] & 0xFF00) | data) & 0x7FFF;
24152371      if( GBCOCPS & 0x80 )
24162372      {
24172373         GBCOCPS++;
r9784r9785
24252381      data = 0xFE | ( data & 0x01 );
24262382      if ( data & 0x01 )
24272383      {
2428         gb_lcd.gbc_mode = 0;
2384         state->lcd.gbc_mode = 0;
24292385      }
24302386      break;
24312387   case 0x32:
r9784r9785
24492405      return;
24502406   }
24512407
2452   gb_lcd.gb_vid_regs[offset] = data;
2408   state->lcd.gb_vid_regs[offset] = data;
24532409}
24542410
24552411
24562412UINT8 *gb_get_vram_ptr(running_machine *machine)
24572413{
2458   return gb_lcd.gb_vram_ptr;
2414   gb_state *state = machine->driver_data<gb_state>();
2415   return state->lcd.gb_vram_ptr;
24592416}
24602417
src/mess/includes/kc.h
r9784r9785
7474   int kc85_blink_state;
7575   unsigned char *kc85_4_display_video_ram;
7676   unsigned char *kc85_4_video_ram;
77   const struct kc85_module *modules[256>>2];
7778};
7879
7980
src/mess/includes/cpschngr.h
r9784r9785
3333   int stars1y;
3434   int stars2x;
3535   int stars2y;
36   const struct CPS1config *cps1_game_config;
3637   UINT8 empty_tile8x8[8*8];
3738   UINT8 empty_tile[32*32/2];
3839};
src/mess/includes/gb.h
r9784r9785
3232#define SGB_FRAMES_PER_SECOND   61.17
3333
3434
35/*----------- defined in audio/gb.c -----------*/
35#define MAX_ROMBANK 512
36#define MAX_RAMBANK 256
3637
37DECLARE_LEGACY_SOUND_DEVICE(GAMEBOY, gameboy_sound);
3838
39/* Custom Sound Interface */
40READ8_DEVICE_HANDLER( gb_sound_r );
41WRITE8_DEVICE_HANDLER( gb_sound_w );
42READ8_DEVICE_HANDLER( gb_wave_r );
43WRITE8_DEVICE_HANDLER( gb_wave_w );
39#define _NR_GB_VID_REGS      0x40
4440
41struct layer_struct {
42   UINT8  enabled;
43   UINT8  *bg_tiles;
44   UINT8  *bg_map;
45   UINT8  xindex;
46   UINT8  xshift;
47   UINT8  xstart;
48   UINT8  xend;
49   /* GBC specific */
50   UINT8  *gbc_map;
51   INT16  bgline;
52};
4553
54typedef struct {
55   int   window_lines_drawn;
56
57   UINT8   gb_vid_regs[_NR_GB_VID_REGS];
58   UINT8   bg_zbuf[160];
59
60   UINT16   cgb_bpal[32];   /* CGB current background palette table */
61   UINT16   cgb_spal[32];   /* CGB current sprite palette table */
62
63   UINT8   gb_bpal[4];      /* Background palette */
64   UINT8   gb_spal0[4];   /* Sprite 0 palette */
65   UINT8   gb_spal1[4];   /* Sprite 1 palette */
66
67   /* Things used to render current line */
68   int current_line;      /* Current line */
69   int cmp_line;         /* Compare line */
70   int sprCount;         /* Number of sprites on current line */
71   int sprite[10];         /* References to sprites to draw on current line */
72   int previous_line;      /* Previous line we've drawn in */
73   int start_x;         /* Pixel to start drawing from (inclusive) */
74   int end_x;            /* Pixel to end drawing (exclusive) */
75   int mode;            /* Keep track of internal STAT mode */
76   int state;            /* Current state of the video state machine */
77   int lcd_irq_line;
78   int triggering_line_irq;
79   int line_irq;
80   int triggering_mode_irq;
81   int mode_irq;
82   int delayed_line_irq;
83   int sprite_cycles;
84   int scrollx_adjust;
85   int oam_locked;
86   int vram_locked;
87   int pal_locked;
88   int hdma_enabled;
89   int hdma_possible;
90   struct layer_struct   layer[2];
91   emu_timer *lcd_timer;
92   int gbc_mode;
93
94   region_info *gb_vram;      /* Pointer to VRAM */
95   region_info *gb_oam;      /* Pointer to OAM memory */
96   UINT8   *gb_vram_ptr;
97   UINT8   *gb_chrgen;      /* Character generator */
98   UINT8   *gb_bgdtab;      /* Background character table */
99   UINT8   *gb_wndtab;      /* Window character table */
100   UINT8   gb_tile_no_mod;
101   UINT8   *gbc_chrgen;   /* CGB Character generator */
102   UINT8   *gbc_bgdtab;   /* CGB Background character table */
103   UINT8   *gbc_wndtab;   /* CGB Window character table */
104} gb_lcd_t;
105
106
107
108class gb_state : public driver_device
109{
110public:
111   gb_state(running_machine &machine, const driver_device_config_base &config)
112      : driver_device(machine, config) { }
113
114   UINT16 sgb_pal_data[4096];
115   UINT8 sgb_pal_map[20][18];
116   UINT16 sgb_pal[128];
117   UINT8 *sgb_tile_data;
118   UINT8 sgb_tile_map[2048];
119   UINT8 sgb_window_mask;
120   UINT8 sgb_hack;
121   //gb_state driver_data;
122   UINT8      gb_io[0x10];
123
124   /* Timer related */
125   UINT16      divcount;
126   UINT8      shift;
127   UINT16      shift_cycles;
128   UINT8      triggering_irq;
129   UINT8      reloading;
130
131   /* Serial I/O related */
132   UINT32      SIOCount;            /* Serial I/O counter */
133   emu_timer   *gb_serial_timer;
134
135   /* SGB variables */
136   UINT8      sgb_atf_data[4050];      /* (SGB) Attributes files */
137
138   /* Cartridge/mapper */
139   UINT16      MBCType;            /* MBC type: 0 for none */
140   UINT8      CartType;            /* Cartridge type (battery, ram, rtc, etc) */
141   UINT8      *ROMMap[MAX_ROMBANK];   /* Addresses of ROM banks */
142   UINT16      ROMBank;            /* Index of ROM bank currently used at 4000-7fff */
143   UINT16      ROMBank00;            /* Index of ROM bank currently used at 0000-3fff */
144   UINT8      ROMMask;            /* Mask for the ROM bank number */
145   UINT16      ROMBanks;            /* Total number of ROM banks */
146   UINT8      *RAMMap[MAX_RAMBANK];   /* Addresses of RAM banks */
147   UINT8      RAMBank;            /* Number of RAM bank currently used */
148   UINT8      RAMMask;            /* Mask for the RAM bank number */
149   UINT8      RAMBanks;            /* Total number of RAM banks */
150   UINT8      MBC1Mode;            /* MBC1 ROM/RAM mode */
151   UINT8      *MBC3RTCData;         /* MBC3 RTC data */
152   UINT8      MBC3RTCMap[5];         /* MBC3 RTC banks */
153   UINT8      MBC3RTCBank;         /* MBC3 RTC bank */
154   UINT8      *GBC_RAMMap[8];         /* (CGB) Addresses of internal RAM banks */
155   UINT8      GBC_RAMBank;         /* (CGB) Current CGB RAM bank */
156   UINT8      gbTama5Memory[32];
157   UINT8      gbTama5Byte;
158   UINT8      gbTama5Address;
159   UINT8      gbLastTama5Command;
160   UINT8      *gb_cart;
161   UINT8      *gb_cart_ram;
162   UINT8      *gb_dummy_rom_bank;
163   UINT8      *gb_dummy_ram_bank;
164
165   UINT8 mmm01_bank_offset;
166   UINT8 mmm01_reg1;
167   UINT8 mmm01_bank;
168   UINT8 mmm01_bank_mask;
169   gb_lcd_t lcd;
170   void (*update_scanline)( running_machine *machine );
171};
172
173
46174/*----------- defined in machine/gb.c -----------*/
47175
48176WRITE8_HANDLER( gb_ram_enable );
r9784r9785
66194#define SGB_XOFFSET            48   /* GB screen starts at column 48        */
67195#define SGB_YOFFSET            40   /* GB screen starts at row 40           */
68196
69extern UINT16 sgb_pal_data[4096];   /* 512 palettes of 4 colours            */
70extern UINT8 sgb_pal_map[20][18];   /* Palette tile map                     */
71extern UINT16 sgb_pal[128];         /* SGB palette remapping                */
72extern UINT8 *sgb_tile_data;      /* 256 tiles of 32 bytes each           */
73extern UINT8 sgb_tile_map[2048];   /* 32x32 tile map data (0-tile,1-attribute) */
74extern UINT8 sgb_window_mask;      /* Current GB screen mask               */
75extern UINT8 sgb_hack;            /* Flag set if we're using a hack       */
76197
77198extern MACHINE_START( sgb );
78199extern MACHINE_RESET( sgb );
src/mess/includes/pcw.h
r9784r9785
5757   UINT8 printer_p2;  // MCU port P2 state
5858   UINT8 paper_feed;  // amount of paper fed through printer, by n/360 inches.  One line feed is 61/360in (from the linefeed command in CP/M;s ptr menu)
5959   bitmap_t* prn_output;
60   UINT8 printer_p2_prev;
6061};
6162
6263
src/mess/includes/sapi1.h
r9784r9785
1616   UINT8* sapi_video_ram;
1717   UINT8 keyboard_mask;
1818   UINT8 refresh_counter;
19   UINT8 zps3_25;
1920};
2021
2122
src/mess/drivers/gb.c
r9784r9785
436436***************************************************************************/
437437
438438#include "emu.h"
439#include "includes/gb.h"
440439#include "cpu/lr35902/lr35902.h"
441440#include "devices/cartslot.h"
442441#include "devices/messram.h"
443442#include "rendlay.h"
443#include "audio/gb.h"
444#include "includes/gb.h"
444445
445446
446447/* Initial value of the cpu registers (hacks until we get bios dumps) */
r9784r9785
551552   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select")
552553INPUT_PORTS_END
553554
554static MACHINE_CONFIG_START( gb_common, driver_device )
555static MACHINE_CONFIG_START( gb_common, gb_state )
555556   /* basic machine hardware */
556557   MDRV_CPU_ADD("maincpu", LR35902, 4194304)         /* 4.194304 MHz */
557558   MDRV_CPU_PROGRAM_MAP(gb_map)
r9784r9785
652653   MDRV_SOFTWARE_LIST_COMPATIBLE_ADD("gameboy","gameboy")
653654MACHINE_CONFIG_END
654655
655static MACHINE_CONFIG_START( megaduck, driver_device )
656static MACHINE_CONFIG_START( megaduck, gb_state )
656657   /* basic machine hardware */
657658   MDRV_CPU_ADD("maincpu", LR35902, 4194304)         /* 4.194304 MHz */
658659   MDRV_CPU_PROGRAM_MAP( megaduck_map)
src/mess/drivers/tx0.c
r9784r9785
219219   pen_typewriter_bg, pen_red      /* red typing in typewriter */
220220};
221221
222static UINT8 total_colors_needed = pen_crt_num_levels + sizeof(tx0_colors) / 3;
222static const UINT8 total_colors_needed = pen_crt_num_levels + sizeof(tx0_colors) / 3;
223223
224224static GFXDECODE_START( tx0 )
225225   GFXDECODE_ENTRY( "gfx1", 0, fontlayout, pen_crt_num_levels + sizeof(tx0_colors) / 3, 3 )
src/mess/drivers/pcw.c
r9784r9785
771771static WRITE8_HANDLER(mcu_printer_p2_w)
772772{
773773   pcw_state *state = space->machine->driver_data<pcw_state>();
774   static UINT8 prev;
775774
776775   //logerror("PRN: MCU writing %02x to P2\n",data);
777776   state->printer_p2 = data & 0x70;
778777
779   if((data & 0x40) == 0 && (prev & 0x40) != 0)
778   if((data & 0x40) == 0 && (state->printer_p2_prev & 0x40) != 0)
780779      pcw_printer_fire_pins(space->machine,state->printer_pins);
781780
782781   // handle shift/store
r9784r9785
841840      state->printer_pins |= 0x0100;
842841   else
843842      state->printer_pins &= ~0x0100;
844   prev = data;
843   state->printer_p2_prev = data;
845844   //popmessage("PRN: P2 bits %s %s %s\nSerial: %02x\nHeadpos: %i",data & 0x40 ? " " : "6",data & 0x20 ? " " : "5",data & 0x10 ? " " : "4",state->printer_shift_output,state->printer_headpos);
846845}
847846
src/mess/drivers/sapi1.c
r9784r9785
2020#include "includes/sapi1.h"
2121#include "devices/messram.h"
2222
23static UINT8 sapizps3_25;
2423
2524/* switch out the rom shadow */
2625static WRITE8_HANDLER( sapizps3_00_w )
r9784r9785
3130/* to stop execution in random ram */
3231static READ8_HANDLER( sapizps3_25_r )
3332{
34   return sapizps3_25;
33   sapi1_state *state = space->machine->driver_data<sapi1_state>();
34   return state->zps3_25;
3535}
3636
3737static WRITE8_HANDLER( sapizps3_25_w )
3838{
39   sapizps3_25 = data & 0xfc; //??
39   sapi1_state *state = space->machine->driver_data<sapi1_state>();
40   state->zps3_25 = data & 0xfc; //??
4041}
4142
4243
src/mess/drivers/gba.c
r9784r9785
2020#include "cpu/arm7/arm7.h"
2121#include "cpu/arm7/arm7core.h"
2222#include "devices/cartslot.h"
23#include "includes/gba.h"
24#include "includes/gb.h"
2523#include "sound/dac.h"
2624#include "machine/intelfsh.h"
25#include "audio/gb.h"
26#include "includes/gba.h"
2727
2828#define VERBOSE_LEVEL   (0)
2929

Previous 15994 Revisions Next


© 1998-2018 The MESS Team