Previous 15994 Revisions Next

r6002 Wednesday 7th October, 2009 at 21:03:53 UTC by Wilbert Pol
[GameBoy family] Moved some globals to a struct.
[src/mess/machine]gb.c

src/mess/machine/gb.c
r6001r6002
6868#define MAX_ROMBANK 512
6969#define MAX_RAMBANK 256
7070
71#define JOYPAD      gb_io[0x00]   /* Joystick: 1.1.P15.P14.P13.P12.P11.P10       */
72#define SIODATA      gb_io[0x01]   /* Serial IO data buffer                       */
73#define SIOCONT      gb_io[0x02]   /* Serial IO control register                  */
74#define DIVREG      gb_io[0x04]   /* Divider register (???)                      */
75#define TIMECNT      gb_io[0x05]   /* Timer counter. Gen. int. when it overflows  */
76#define TIMEMOD      gb_io[0x06]   /* New value of TimeCount after it overflows   */
77#define TIMEFRQ      gb_io[0x07]   /* Timer frequency and start/stop switch       */
71#define JOYPAD      gb_driver_data.gb_io[0x00]   /* Joystick: 1.1.P15.P14.P13.P12.P11.P10       */
72#define SIODATA      gb_driver_data.gb_io[0x01]   /* Serial IO data buffer                       */
73#define SIOCONT      gb_driver_data.gb_io[0x02]   /* Serial IO control register                  */
74#define DIVREG      gb_driver_data.gb_io[0x04]   /* Divider register (???)                      */
75#define TIMECNT      gb_driver_data.gb_io[0x05]   /* Timer counter. Gen. int. when it overflows  */
76#define TIMEMOD      gb_driver_data.gb_io[0x06]   /* New value of TimeCount after it overflows   */
77#define TIMEFRQ      gb_driver_data.gb_io[0x07]   /* Timer frequency and start/stop switch       */
7878
7979static UINT16 MBCType;               /* MBC type: 0 for none                        */
8080static UINT8 CartType;               /* Cart Type (battery, ram, timer etc)         */
r6001r6002
104104
105105static UINT8 *gb_cart = NULL;
106106static UINT8 *gb_cart_ram = NULL;
107static UINT8 gb_io[0x10];
108107static UINT8 *gb_dummy_rom_bank = NULL;
109108static UINT8 *gb_dummy_ram_bank = NULL;
110109/* TAMA5 related global variables */
r6001r6002
112111static UINT8 gbTama5Byte;
113112static UINT8 gbTama5Address;
114113static UINT8 gbLastTama5Command;
115/* Timer related globals */
116static struct gb_timer_struct {
117   UINT16   divcount;
118   UINT8   shift;
119   UINT16   shift_cycles;
120   UINT8   triggering_irq;
121   UINT8   reloading;
122} gb_timer;
123/* Serial I/O related */
124static UINT32 SIOCount;         /* Serial I/O counter                          */
125static emu_timer   *gb_serial_timer = NULL;
126114
115typedef struct _gb_state gb_state;
116struct _gb_state {
117   UINT8      gb_io[0x10];
118
119   /* Timer related */
120   UINT16      divcount;
121   UINT8      shift;
122   UINT16      shift_cycles;
123   UINT8      triggering_irq;
124   UINT8      reloading;
125
126   /* Serial I/O related */
127   UINT32      SIOCount;      /* Serial I/O counter */
128   emu_timer   *gb_serial_timer;
129};
130
131static gb_state gb_driver_data;
132
127133/*
128134  Prototypes
129135*/
r6001r6002
283289   gb_sound_w(devtag_get_device(space->machine, "custom"), 0x16, 0x00 );       /* Initialize sound hardware */
284290
285291   /* Allocate the serial timer, and disable it */
286   gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
287   timer_enable( gb_serial_timer, 0 );
292   gb_driver_data.gb_serial_timer = timer_alloc(machine,  gb_serial_timer_proc , NULL);
293   timer_enable( gb_driver_data.gb_serial_timer, 0 );
288294
289   gb_timer.divcount = 0;
290   gb_timer.triggering_irq = 0;
291   gb_io[0x07] = 0xF8;      /* Upper bits of TIMEFRQ register are set to 1 */
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 */
292298}
293299
294300MACHINE_START( gb )
r6001r6002
307313   /* Enable BIOS rom */
308314   memory_set_bankptr(machine, 5, memory_region(machine, "maincpu") );
309315
310   gb_timer.divcount = 0x0004;
316   gb_driver_data.divcount = 0x0004;
311317}
312318
313319MACHINE_RESET( sgb )
r6001r6002
348354            sgb_hack = 1;
349355   }
350356
351   gb_timer.divcount = 0x0004; //0xABC8; // needs to be fixed for bootrom, probably should be 0x0004 like dmg
357   gb_driver_data.divcount = 0x0004;
352358}
353359
354360MACHINE_RESET( gbpocket )
r6001r6002
367373   /* Enable BIOS rom if we have one */
368374   gb_rom16_0000( machine, ROMMap[ROMBank00] ? ROMMap[ROMBank00] : gb_dummy_rom_bank );
369375
370   gb_timer.divcount = 0xABC8;
376   gb_driver_data.divcount = 0xABC8;
371377}
372378
373379MACHINE_RESET( gbc )
r6001r6002
814820      case 0x00:
815821      case 0x01:
816822      case 0x80:            /* enabled & external clock */
817         SIOCount = 0;
823         gb_driver_data.SIOCount = 0;
818824         break;
819825      case 0x81:            /* enabled & internal clock */
820826         SIODATA = 0xFF;
821         SIOCount = 8;
822         timer_adjust_periodic(gb_serial_timer, cputag_clocks_to_attotime(space->machine, "maincpu", 512), 0, cputag_clocks_to_attotime(space->machine, "maincpu", 512));
823         timer_enable( gb_serial_timer, 1 );
827         gb_driver_data.SIOCount = 8;
828         timer_adjust_periodic(gb_driver_data.gb_serial_timer, cputag_clocks_to_attotime(space->machine, "maincpu", 512), 0, cputag_clocks_to_attotime(space->machine, "maincpu", 512));
829         timer_enable( gb_driver_data.gb_serial_timer, 1 );
824830         break;
825831      }
826832      break;
827833   case 0x04:                  /* DIV - Divider register */
828834      /* Force increment of TIMECNT register */
829      if ( gb_timer.divcount >= 16 )
835      if ( gb_driver_data.divcount >= 16 )
830836         gb_timer_increment(space->machine);
831      gb_timer.divcount = 0;
837      gb_driver_data.divcount = 0;
832838      return;
833839   case 0x05:                  /* TIMA - Timer counter */
834840      /* Check if the counter is being reloaded in this cycle */
835      if ( gb_timer.reloading && ( gb_timer.divcount & ( gb_timer.shift_cycles - 1 ) ) == 4 )
841      if ( gb_driver_data.reloading && ( gb_driver_data.divcount & ( gb_driver_data.shift_cycles - 1 ) ) == 4 )
836842      {
837843         data = TIMECNT;
838844      }
839845      break;
840846   case 0x06:                  /* TMA - Timer module */
841847      /* Check if the counter is being reloaded in this cycle */
842      if ( gb_timer.reloading && ( gb_timer.divcount & ( gb_timer.shift_cycles - 1 ) ) == 4 )
848      if ( gb_driver_data.reloading && ( gb_driver_data.divcount & ( gb_driver_data.shift_cycles - 1 ) ) == 4 )
843849      {
844850         TIMECNT = data;
845851      }
r6001r6002
850856      if ( ( ! ( data & 0x04 ) && ( TIMEFRQ & 0x04 ) ) || ( ( data & 0x04 ) && ( TIMEFRQ & 0x04 ) && ( data & 0x03 ) != ( TIMEFRQ & 0x03 ) ) )
851857      {
852858         /* Check if TIMECNT should be incremented */
853         if ( ( gb_timer.divcount & ( gb_timer.shift_cycles - 1 ) ) >= ( gb_timer.shift_cycles >> 1 ) )
859         if ( ( gb_driver_data.divcount & ( gb_driver_data.shift_cycles - 1 ) ) >= ( gb_driver_data.shift_cycles >> 1 ) )
854860         {
855861            gb_timer_increment(space->machine);
856862         }
857863      }
858      gb_timer.shift = timer_shifts[data & 0x03];
859      gb_timer.shift_cycles = 1 << gb_timer.shift;
864      gb_driver_data.shift = timer_shifts[data & 0x03];
865      gb_driver_data.shift_cycles = 1 << gb_driver_data.shift;
860866      break;
861867   case 0x0F:                  /* IF - Interrupt flag */
862868      data &= 0x1F;
r6001r6002
864870      break;
865871   }
866872
867   gb_io[offset] = data;
873   gb_driver_data.gb_io[offset] = data;
868874}
869875
870876WRITE8_HANDLER ( gb_io2_w )
r6001r6002
14051411         return;
14061412   }
14071413
1408   gb_io[offset] = data;
1414   gb_driver_data.gb_io[offset] = data;
14091415}
14101416
14111417/* Interrupt Enable register */
r6001r6002
14251431   switch(offset)
14261432   {
14271433      case 0x04:
1428         return ( gb_timer.divcount >> 8 ) & 0xFF;
1434         return ( gb_driver_data.divcount >> 8 ) & 0xFF;
14291435      case 0x00:
14301436      case 0x01:
14311437      case 0x02:
r6001r6002
14331439      case 0x05:
14341440      case 0x06:
14351441      case 0x07:
1436         return gb_io[offset];
1442         return gb_driver_data.gb_io[offset];
14371443      case 0x0F:
14381444         /* Make sure the internal states are up to date */
14391445         return 0xE0 | cpu_get_reg( cputag_get_cpu(space->machine, "maincpu"), LR35902_IF );
r6001r6002
19071913   /* Shift in a received bit */
19081914   SIODATA = (SIODATA << 1) | 0x01;
19091915   /* Decrement number of handled bits */
1910   SIOCount--;
1916   gb_driver_data.SIOCount--;
19111917   /* If all bits done, stop timer and trigger interrupt */
1912   if ( ! SIOCount )
1918   if ( ! gb_driver_data.SIOCount )
19131919   {
19141920      SIOCONT &= 0x7F;
1915      timer_enable( gb_serial_timer, 0 );
1921      timer_enable( gb_driver_data.gb_serial_timer, 0 );
19161922      cputag_set_input_line(machine, "maincpu", SIO_INT, ASSERT_LINE);
19171923   }
19181924}
19191925
19201926INLINE void gb_timer_check_irq( running_machine *machine )
19211927{
1922   gb_timer.reloading = 0;
1923   if ( gb_timer.triggering_irq )
1928   gb_driver_data.reloading = 0;
1929   if ( gb_driver_data.triggering_irq )
19241930   {
1925      gb_timer.triggering_irq = 0;
1931      gb_driver_data.triggering_irq = 0;
19261932      if ( TIMECNT == 0 )
19271933      {
19281934         TIMECNT = TIMEMOD;
19291935         cputag_set_input_line(machine, "maincpu", TIM_INT, ASSERT_LINE );
1930         gb_timer.reloading = 1;
1936         gb_driver_data.reloading = 1;
19311937      }
19321938   }
19331939}
r6001r6002
19391945   TIMECNT += 1;
19401946   if ( TIMECNT == 0 )
19411947   {
1942      gb_timer.triggering_irq = 1;
1948      gb_driver_data.triggering_irq = 1;
19431949   }
19441950}
19451951
19461952void gb_timer_callback(const device_config *device, int cycles)
19471953{
1948   UINT16 old_gb_divcount = gb_timer.divcount;
1949   gb_timer.divcount += cycles;
1954   UINT16 old_gb_divcount = gb_driver_data.divcount;
1955   gb_driver_data.divcount += cycles;
19501956
19511957   gb_timer_check_irq(device->machine);
19521958
19531959   if ( TIMEFRQ & 0x04 )
19541960   {
1955      UINT16 old_count = old_gb_divcount >> gb_timer.shift;
1956      UINT16 new_count = gb_timer.divcount >> gb_timer.shift;
1957      if ( cycles > gb_timer.shift_cycles )
1961      UINT16 old_count = old_gb_divcount >> gb_driver_data.shift;
1962      UINT16 new_count = gb_driver_data.divcount >> gb_driver_data.shift;
1963      if ( cycles > gb_driver_data.shift_cycles )
19581964      {
19591965         gb_timer_increment(device->machine);
19601966         old_count++;
r6001r6002
19631969      {
19641970         gb_timer_increment(device->machine);
19651971      }
1966      if ( new_count << gb_timer.shift < gb_timer.divcount )
1972      if ( new_count << gb_driver_data.shift < gb_driver_data.divcount )
19671973      {
19681974         gb_timer_check_irq(device->machine);
19691975      }

Previous 15994 Revisions Next


© 1998-2018 The MESS Team