Previous 199869 Revisions Next

r20331 Saturday 19th January, 2013 at 02:06:42 UTC by David Haywood
also bounds check most of the array accesses in vboy, rules out memory corruption from here (nw)
[src/mess/drivers]vboy.c

trunk/src/mess/drivers/vboy.c
r20330r20331
3030#include "audio/vboy.h"
3131#include "vboy.lh"
3232
33#define READ_BGMAP(bgoffs) m_bgmap[(bgoffs) & 0xffff]
34#define READ_WORLD(wldoffs)   READ_BGMAP((0x1d800 >> 1) + wldoffs)
35#define READ_COLTAB1(wldoffs) READ_BGMAP((0x1dc00 >> 1) + wldoffs)
36#define READ_COLTAB2(wldoffs) READ_BGMAP((0x1de00 >> 1) + wldoffs)
37#define READ_OBJECTS(wldoffs) READ_BGMAP((0x1e000 >> 1) + wldoffs)
38
39#define WRITE_BG_TEMPDRAW_MAP(woffs, wdat) m_bg_tempdraw_map[(woffs) & 0xffffff] = wdat;
40#define WRITE_OVR_TEMPDRAW_MAP(woffs, wdat) m_ovr_tempdraw_map[(woffs) & 0x3f] = wdat;
41
42#define READ_BG_TEMPDRAW_MAP(roffs) m_bg_tempdraw_map[(roffs) & 0xffffff];
43#define READ_OVR_TEMPDRAW_MAP(roffs) m_ovr_tempdraw_map[(roffs) & 0x3f];
44
45#define READ_FONT(roffs) m_font[(roffs) & 0x3fff]
46
3347/* FIXME: most if not all of these must be UINT8 */
3448struct vboy_regs_t
3549{
r20330r20331
7589      : driver_device(mconfig, type, tag),
7690         m_maintimer(*this, "timer_main"),
7791         m_maincpu(*this, "maincpu")
78         { }
92   {
93      m_vip_regs.INTPND = 0;
94      m_vip_regs.INTENB = 0;
95      m_vip_regs.DPSTTS = 0;
96      m_vip_regs.DPCTRL = 0;
97      m_vip_regs.BRTA = 0;
98      m_vip_regs.BRTB = 0;
99      m_vip_regs.BRTC = 0;
100      m_vip_regs.REST = 0;
101      m_vip_regs.FRMCYC = 0;
102      m_vip_regs.CTA = 0;
103      m_vip_regs.XPSTTS = 0;
104      m_vip_regs.XPCTRL = 0;
105      m_vip_regs.VER = 0;
106      m_vip_regs.SPT[0] = 0;
107      m_vip_regs.SPT[1] = 0;
108      m_vip_regs.SPT[2] = 0;
109      m_vip_regs.SPT[3] = 0;
110      m_vip_regs.GPLT[0] = 0;
111      m_vip_regs.GPLT[1] = 0;
112      m_vip_regs.GPLT[2] = 0;
113      m_vip_regs.GPLT[3] = 0;
114      m_vip_regs.JPLT[0] = 0;
115      m_vip_regs.JPLT[1] = 0;
116      m_vip_regs.JPLT[2] = 0;
117      m_vip_regs.JPLT[3] = 0;
118      m_vip_regs.BKCOL = 0;
79119
120      m_vboy_regs.lpc = 0;
121      m_vboy_regs.lpc2 = 0;
122      m_vboy_regs.lpt = 0;
123      m_vboy_regs.lpr = 0;
124      m_vboy_regs.khb = 0;
125      m_vboy_regs.klb = 0;
126      m_vboy_regs.thb = 0;
127      m_vboy_regs.tlb = 0;
128      m_vboy_regs.tcr = 0;
129      m_vboy_regs.wcr = 0;
130      m_vboy_regs.kcr = 0;
131
132      m_vboy_timer.count = 0;
133      m_vboy_timer.latch = 0;
134   }
135
80136   required_device<timer_device> m_maintimer;
81137   required_device<cpu_device> m_maincpu;
82138
r20330r20331
108164   UINT8 *m_l_frame_1;
109165   UINT8 *m_r_frame_0;
110166   UINT8 *m_r_frame_1;
111   UINT16 *m_world;
112   UINT16 *m_columntab1;
113   UINT16 *m_columntab2;
114   UINT16 *m_objects;
115167   vboy_regs_t m_vboy_regs;
116168   vip_regs_t m_vip_regs;
117169   vboy_timer_t m_vboy_timer;
118   int *m_bg_map;
119   int *m_ovr_map;
170   INT32 *m_bg_tempdraw_map;
171   INT32 *m_ovr_tempdraw_map;
120172   UINT16 m_frame_count;
121173   UINT8 m_displayfb;
122174   UINT8 m_drawfb;
r20330r20331
131183   DECLARE_READ32_MEMBER(sram_r);
132184   DECLARE_WRITE32_MEMBER(sram_w);
133185
134   void m_pcg_debug(UINT16 offset,UINT16 data,UINT16 mem_mask);
135
136   void put_obj(bitmap_ind16 &bitmap, int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal);
186   void put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal);
137187   void put_char(int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal);
138188   void fill_ovr_char(UINT16 code, bool flipx, bool flipy, UINT8 pal);
139189   void fill_bg_map(int num, UINT16 scx, UINT16 scy);
140   void draw_bg_map(bitmap_ind16 &bitmap, UINT16 *vboy_paramtab, int mode, int gx, int gp, int gy, int mx, int mp, int my,int h, int w,
190   void draw_bg_map(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 param_base, int mode, int gx, int gp, int gy, int mx, int mp, int my,int h, int w,
141191                                 UINT16 x_mask, UINT16 y_mask, UINT8 ovr, bool right);
142   void draw_affine_map(bitmap_ind16 &bitmap, UINT16 *vboy_paramtab, int gx, int gp, int gy, int h, int w,
192   void draw_affine_map(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 param_base, int gx, int gp, int gy, int h, int w,
143193                                    UINT16 x_mask, UINT16 y_mask, UINT8 ovr, bool right);
144   UINT8 display_world(int num, bitmap_ind16 &bitmap, bool right, int &cur_spt);
194   UINT8 display_world(int num, bitmap_ind16 &bitmap, const rectangle &cliprect, bool right, int &cur_spt);
145195   void m_set_brightness(void);
146196   virtual void machine_start();
147197   virtual void machine_reset();
r20330r20331
161211   //int i;
162212
163213   // Allocate memory for temporary screens
164   m_bg_map = auto_alloc_array_clear(machine(), int, 0x1000*0x1000);
165   m_ovr_map = auto_alloc_array_clear(machine(), int, 8*8);
214   m_bg_tempdraw_map = auto_alloc_array_clear(machine(), INT32, 0x1000000);
215   m_ovr_tempdraw_map = auto_alloc_array_clear(machine(), INT32, 0x40);
166216
167217   // Allocate memory for framebuffers
168218   m_l_frame_0 = auto_alloc_array_clear(machine(), UINT8, 0x6000);
r20330r20331
170220   m_r_frame_0 = auto_alloc_array_clear(machine(), UINT8, 0x6000);
171221   m_r_frame_1 = auto_alloc_array_clear(machine(), UINT8, 0x6000);
172222
173   m_font  = auto_alloc_array_clear(machine(), UINT16, 2048 * 8);
223   m_font  = auto_alloc_array_clear(machine(), UINT16, 0x8000 >> 1);
174224   m_bgmap = auto_alloc_array(machine(), UINT16, 0x20000 >> 1);
175   m_objects = m_bgmap + (0x1e000 >> 1);
176   m_columntab1 = m_bgmap + (0x1dc00 >> 1);
177   m_columntab2 = m_bgmap + (0x1de00 >> 1);
178   m_world = m_bgmap + (0x1d800 >> 1);
179225}
180226
181void vboy_state::put_obj(bitmap_ind16 &bitmap, int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal)
227void vboy_state::put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal)
182228{
183229   UINT16 data;
184230   UINT8 yi, xi, dat, col;
r20330r20331
186232   for (yi = 0; yi < 8; yi++)
187233   {
188234      if (!flipy)
189            data = m_font[code * 8 + yi];
235            data = READ_FONT(code * 8 + yi);
190236      else
191            data = m_font[code * 8 + (7-yi)];
237            data = READ_FONT(code * 8 + (7-yi));
192238
193239      for (xi = 0; xi < 8; xi++)
194240      {
r20330r20331
204250
205251         col = (pal >> (dat*2)) & 3;
206252
207         if (dat && res_x < 384 && res_y < 224)
208            bitmap.pix16((res_y), (res_x)) = machine().pens[col];
253         if (dat)
254         {
255            if (cliprect.contains(res_x, res_y))
256               bitmap.pix16((res_y), (res_x)) = machine().pens[col];
257         }
209258      }
210259   }
211260}
r20330r20331
219268   for (yi = 0; yi < 8; yi++)
220269   {
221270      if (!flipy)
222            data = m_font[code * 8 + yi];
271            data = READ_FONT(code * 8 + yi);
223272      else
224            data = m_font[code * 8 + (7-yi)];
273            data = READ_FONT(code * 8 + (7-yi));
225274
226275      for (xi = 0; xi < 8; xi++)
227276      {
r20330r20331
240289         if(dat == 0)
241290            col = -1;
242291
243         m_bg_map[res_y*0x1000+res_x] = col;
292         WRITE_BG_TEMPDRAW_MAP(res_y*0x1000+res_x, col);
244293      }
245294   }
246295}
r20330r20331
254303   for (yi = 0; yi < 8; yi++)
255304   {
256305      if (!flipy)
257            data = m_font[code * 8 + yi];
306            data = READ_FONT(code * 8 + yi);
258307      else
259            data = m_font[code * 8 + (7-yi)];
308            data = READ_FONT(code * 8 + (7-yi));
260309
261310      for (xi = 0; xi < 8; xi++)
262311      {
r20330r20331
270319         if(dat == 0)
271320            col = -1;
272321
273         m_ovr_map[yi*8+xi] = col;
322         WRITE_OVR_TEMPDRAW_MAP(yi*8+xi, col);
274323      }
275324   }
276325}
r20330r20331
287336      {
288337         stepx = (x & 0x1c0) >> 6;
289338         stepy = ((y & 0x1c0) >> 6) * (stepx+1);
290         UINT16 val = m_bgmap[(x & 0x3f) + (64 * (y & 0x3f)) + ((num + stepx + stepy) * 0x1000)];
339         UINT16 val = READ_BGMAP((x & 0x3f) + (64 * (y & 0x3f)) + ((num + stepx + stepy) * 0x1000));
291340         put_char(x * 8, y * 8, val & 0x7ff, BIT(val,13), BIT(val,12), m_vip_regs.GPLT[(val >> 14) & 3]);
292341      }
293342   }
294343}
295344
296void vboy_state::draw_bg_map(bitmap_ind16 &bitmap, UINT16 *vboy_paramtab, int mode, int gx, int gp, int gy, int mx, int mp, int my, int h, int w,
345void vboy_state::draw_bg_map(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 param_base, int mode, int gx, int gp, int gy, int mx, int mp, int my, int h, int w,
297346                                       UINT16 x_mask, UINT16 y_mask, UINT8 ovr, bool right)
298347{
299348   int x,y;
r20330r20331
311360
312361         src_x = x+mx;
313362         if (mode==1)
314            src_x += (INT16)vboy_paramtab[y*2+(right ^ 1)];
363            src_x += (INT16)READ_BGMAP(param_base + (y*2+(right ^ 1)));
315364
316365         src_y = y+my;
317366         src_x += right ? -mp : mp;
318367
319368         if(ovr && (src_x > x_mask || src_y > y_mask || src_x < 0 || src_y < 0))
320            pix = m_ovr_map[(src_y & 7)*8+(src_x & 7)];
369         {
370            pix = READ_OVR_TEMPDRAW_MAP((src_y & 7)*8+(src_x & 7));
371         }
321372         else
322            pix = m_bg_map[(src_y & y_mask)*0x1000+(src_x & x_mask)];
373         {
374            pix = READ_BG_TEMPDRAW_MAP((src_y & y_mask)*0x1000+(src_x & x_mask));
375         }
323376
324377         if(pix != -1)
325            if (y1>=0 && y1<224)
326               if (x1>=0 && x1<384)
327                  bitmap.pix16(y1, x1) = machine().pens[pix & 3];
378            if (cliprect.contains(x1, y1))
379               bitmap.pix16(y1, x1) = machine().pens[pix & 3];
328380      }
329381   }
330382}
331383
332void vboy_state::draw_affine_map(bitmap_ind16 &bitmap, UINT16 *vboy_paramtab, int gx, int gp, int gy, int h, int w,
384void vboy_state::draw_affine_map(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 param_base, int gx, int gp, int gy, int h, int w,
333385                                          UINT16 x_mask, UINT16 y_mask, UINT8 ovr, bool right)
334386{
335387   int x,y;
336388
337389   for(y=0;y<=h;y++)
338390   {
339      float h_skw = (INT16)vboy_paramtab[y*8+0] / 8.0;
340      float prlx = (INT16)vboy_paramtab[y*8+1] / 8.0;
341      float v_skw = (INT16)vboy_paramtab[y*8+2] / 8.0;
342      float h_scl = (INT16)vboy_paramtab[y*8+3] / 512.0;
343      float v_scl = (INT16)vboy_paramtab[y*8+4] / 512.0;
391      float h_skw = (INT16)READ_BGMAP(param_base + (y*8+0)) / 8.0;
392      float prlx = (INT16)READ_BGMAP(param_base + (y*8+1)) / 8.0;
393      float v_skw = (INT16)READ_BGMAP(param_base + (y*8+2)) / 8.0;
394      float h_scl = (INT16)READ_BGMAP(param_base + (y*8+3)) / 512.0;
395      float v_scl = (INT16)READ_BGMAP(param_base + (y*8+4)) / 512.0;
344396
345397      h_skw += right ? -prlx : prlx;
346398
r20330r20331
357409         src_y = (INT32)((v_skw) + (v_scl * x));
358410
359411         if(ovr && (src_y > y_mask || src_x > x_mask || src_x < 0 || src_y < 0))
360            pix = m_ovr_map[(src_y & 7)*8+(src_x & 7)];
412         {
413            pix = READ_OVR_TEMPDRAW_MAP((src_y & 7)*8+(src_x & 7));
414         }
361415         else
362            pix = m_bg_map[(src_y & y_mask)*0x1000+(src_x & x_mask)];
416         {
417            pix = READ_BG_TEMPDRAW_MAP((src_y & y_mask)*0x1000+(src_x & x_mask));
418         }
363419
364420         if(pix != -1)
365            if (y1>=0 && y1<224)
366               if (x1>=0 && x1<384)
367                  bitmap.pix16(y1, x1) = machine().pens[pix & 3];
421            if (cliprect.contains(x1, y1))
422               bitmap.pix16(y1, x1) = machine().pens[pix & 3];
368423      }
369424   }
370425}
r20330r20331
381436---- ---- ---- xxxx     BGMAP_BASE
382437*/
383438
384UINT8 vboy_state::display_world(int num, bitmap_ind16 &bitmap, bool right, int &cur_spt)
439UINT8 vboy_state::display_world(int num, bitmap_ind16 &bitmap, const rectangle &cliprect, bool right, int &cur_spt)
385440{
386441   num <<= 4;
387   UINT16 def = m_world[num];
442   UINT16 def = READ_WORLD(num);
388443   UINT8 lon = (def >> 15) & 1;
389444   UINT8 ron = (def >> 14) & 1;
390445   UINT8 mode = (def >> 12) & 3;
r20330r20331
392447   UINT16 scy = 64 << ((def >> 8) & 3);
393448   UINT8 ovr = (def >> 7) & 1;
394449   UINT8 end = (def >> 6) & 1;
395   INT16 gx  = m_world[num+1];
396   INT16 gp  = m_world[num+2];
397   INT16 gy  = m_world[num+3];
398   INT16 mx  = m_world[num+4];
399   INT16 mp  = m_world[num+5];
400   INT16 my  = m_world[num+6];
401   UINT16 w  = m_world[num+7];
402   UINT16 h  = m_world[num+8];
403   UINT16 param_base = m_world[num+9] & 0xfff0;
404   UINT16 ovr_char = m_bgmap[m_world[num+10]];
450   INT16 gx  = READ_WORLD(num+1);
451   INT16 gp  = READ_WORLD(num+2);
452   INT16 gy  = READ_WORLD(num+3);
453   INT16 mx  = READ_WORLD(num+4);
454   INT16 mp  = READ_WORLD(num+5);
455   INT16 my  = READ_WORLD(num+6);
456   UINT16 w  = READ_WORLD(num+7);
457   UINT16 h  = READ_WORLD(num+8);
458   UINT16 param_base = READ_WORLD(num+9) & 0xfff0;
459   UINT16 ovr_char = READ_BGMAP(READ_WORLD(num+10));
405460   UINT8 bg_map_num = def & 0x0f;
406   UINT16 *vboy_paramtab;
407461   int i;
408462
409   vboy_paramtab = m_bgmap + param_base;
410
411463   if(end)
412464      return 1;
413465
r20330r20331
419471      if (lon && (!right))
420472      {
421473         fill_bg_map(bg_map_num, scx, scy);
422         draw_bg_map(bitmap, vboy_paramtab, mode, gx, gp, gy, mx, mp, my, h,w, scx*8-1, scy*8-1, ovr, right);
474         draw_bg_map(bitmap, cliprect, param_base, mode, gx, gp, gy, mx, mp, my, h,w, scx*8-1, scy*8-1, ovr, right);
423475      }
424476
425477      if (ron && (right))
426478      {
427479         fill_bg_map(bg_map_num, scx, scy);
428         draw_bg_map(bitmap, vboy_paramtab, mode, gx, gp, gy, mx, mp, my, h,w, scx*8-1, scy*8-1, ovr, right);
480         draw_bg_map(bitmap, cliprect, param_base, mode, gx, gp, gy, mx, mp, my, h,w, scx*8-1, scy*8-1, ovr, right);
429481      }
430482   }
431483   else if (mode==2) // Affine Mode
r20330r20331
436488      if (lon && (!right))
437489      {
438490         fill_bg_map(bg_map_num, scx, scy);
439         draw_affine_map(bitmap, vboy_paramtab, gx, gp, gy, h,w, scx*8-1, scy*8-1, ovr, right);
491         draw_affine_map(bitmap, cliprect, param_base, gx, gp, gy, h,w, scx*8-1, scy*8-1, ovr, right);
440492      }
441493
442494      if (ron && (right))
443495      {
444496         fill_bg_map(bg_map_num, scx, scy);
445         draw_affine_map(bitmap, vboy_paramtab, gx, gp, gy, h,w, scx*8-1, scy*8-1, ovr, right);
497         draw_affine_map(bitmap, cliprect, param_base, gx, gp, gy, h,w, scx*8-1, scy*8-1, ovr, right);
446498      }
447499   }
448500   else if (mode==3) // OBJ Mode
r20330r20331
465517      do
466518      {
467519         UINT16 start_ndx = i * 4;
468         INT16 jx = m_objects[start_ndx+0];
469         INT16 jp = m_objects[start_ndx+1] & 0x3fff;
470         INT16 jy = m_objects[start_ndx+2] & 0x1ff;
471         UINT16 val = m_objects[start_ndx+3];
472         UINT8 jlon = (m_objects[start_ndx+1] & 0x8000) >> 15;
473         UINT8 jron = (m_objects[start_ndx+1] & 0x4000) >> 14;
520         INT16 jx = READ_OBJECTS(start_ndx+0);
521         INT16 jp = READ_OBJECTS(start_ndx+1) & 0x3fff;
522         INT16 jy = READ_OBJECTS(start_ndx+2) & 0x1ff;
523         UINT16 val = READ_OBJECTS(start_ndx+3);
524         UINT8 jlon = (READ_OBJECTS(start_ndx+1) & 0x8000) >> 15;
525         UINT8 jron = (READ_OBJECTS(start_ndx+1) & 0x4000) >> 14;
474526
475527         if (!right && jlon)
476            put_obj(bitmap, (jx-jp) & 0x1ff, jy, val & 0x7ff, BIT(val,13), BIT(val,12), m_vip_regs.JPLT[(val>>14) & 3]);
528            put_obj(bitmap, cliprect, (jx-jp) & 0x1ff, jy, val & 0x7ff, BIT(val,13), BIT(val,12), m_vip_regs.JPLT[(val>>14) & 3]);
477529
478530         if(right && jron)
479            put_obj(bitmap, (jx+jp) & 0x1ff, jy, val & 0x7ff, BIT(val,13), BIT(val,12), m_vip_regs.JPLT[(val>>14) & 3]);
531            put_obj(bitmap, cliprect, (jx+jp) & 0x1ff, jy, val & 0x7ff, BIT(val,13), BIT(val,12), m_vip_regs.JPLT[(val>>14) & 3]);
480532
481533         i --;
482534         i &= 0x3ff;
r20330r20331
499551
500552   cur_spt = 3;
501553   for(int i=31; i>=0; i--)
502      if (display_world(i, bitmap, false, cur_spt)) break;
554      if (display_world(i, bitmap, cliprect, false, cur_spt)) break;
503555
504556   if(0)
505557   {
r20330r20331
535587
536588   cur_spt = 3;
537589   for(int i=31; i>=0; i--)
538      if (display_world(i, bitmap, true, cur_spt)) break;
590      if (display_world(i, bitmap, cliprect, true, cur_spt)) break;
539591
540592   return 0;
541593}
r20330r20331
9741026}
9751027
9761028
977void vboy_state::m_pcg_debug(UINT16 offset,UINT16 data,UINT16 mem_mask)
978{
979   UINT8 *pcg_ram = memregion("pcg")->base();
980   int i;
9811029
982   if(mem_mask & 0x00ff)
983      pcg_ram[(offset<<1)+1] = (data & 0x00ff);
984
985   if(mem_mask & 0xff00)
986      pcg_ram[(offset<<1)+0] = (data & 0xff00) >> 8;
987
988   machine().gfx[0]->mark_dirty(offset >> 4);
989   for(i=0;i<0x800;i++)
990      machine().gfx[0]->mark_dirty(i);
991
992}
993
9941030WRITE16_MEMBER( vboy_state::vboy_font0_w )
9951031{
996   m_font[offset] = data | (m_font[offset] & (mem_mask ^ 0xffff));
997
998   if(1)
999      m_pcg_debug(offset,data,mem_mask);
1032   COMBINE_DATA(&m_font[offset]);
10001033}
10011034
10021035WRITE16_MEMBER( vboy_state::vboy_font1_w )
10031036{
1004   m_font[offset + 0x1000] = data | (m_font[offset + 0x1000] & (mem_mask ^ 0xffff));
1005
1006   if(1)
1007      m_pcg_debug(offset+0x1000,data,mem_mask);
1037   COMBINE_DATA(&m_font[offset+0x1000]);
10081038}
10091039
10101040WRITE16_MEMBER( vboy_state::vboy_font2_w )
10111041{
1012   m_font[offset + 0x2000] = data | (m_font[offset + 0x2000] & (mem_mask ^ 0xffff));
1013
1014   if(1)
1015      m_pcg_debug(offset+0x2000,data,mem_mask);
1042   COMBINE_DATA(&m_font[offset+0x2000]);
10161043}
10171044
10181045WRITE16_MEMBER( vboy_state::vboy_font3_w )
10191046{
1020   m_font[offset + 0x3000] = data | (m_font[offset + 0x3000] & (mem_mask ^ 0xffff));
1021
1022   if(1)
1023      m_pcg_debug(offset+0x3000,data,mem_mask);
1047   COMBINE_DATA(&m_font[offset+0x3000]);
10241048}
10251049
10261050READ16_MEMBER( vboy_state::vboy_font0_r )
10271051{
1028   return m_font[offset];
1052   return READ_FONT(offset);
10291053}
10301054
10311055READ16_MEMBER( vboy_state::vboy_font1_r )
10321056{
1033   return m_font[offset + 0x1000];
1057   return READ_FONT(offset + 0x1000);
10341058}
10351059
10361060READ16_MEMBER( vboy_state::vboy_font2_r )
10371061{
1038   return m_font[offset + 0x2000];
1062   return READ_FONT(offset + 0x2000);
10391063}
10401064
10411065READ16_MEMBER( vboy_state::vboy_font3_r )
10421066{
1043   return m_font[offset + 0x3000];
1067   return READ_FONT(offset + 0x3000);
10441068}
10451069
10461070WRITE16_MEMBER( vboy_state::vboy_bgmap_w )
r20330r20331
13131337#endif
13141338
13151339
1316static const gfx_layout vboy_pcg_8x8 =
1317{
1318   8,8,
1319   RGN_FRAC(1,1),
1320   2,
1321   { 0, 1 },
1322   { 7*2, 6*2, 5*2, 4*2, 3*2, 2*2, 1*2, 0*2 },
1323   { STEP8(0,8*2) },
1324   8*8*2
1325};
13261340
1327/* decoded for debugging purpose, this will be nuked in the end... */
1328static GFXDECODE_START( vboy )
1329   GFXDECODE_ENTRY( "pcg",     0x00000, vboy_pcg_8x8,      0, 1 )
1330GFXDECODE_END
1331
13321341READ32_MEMBER(vboy_state::sram_r)
13331342{
13341343   return m_vboy_sram[offset];
r20330r20331
14181427   MCFG_CARTSLOT_INTERFACE("vboy_cart")
14191428   MCFG_CARTSLOT_LOAD(vboy_cart)
14201429
1421   MCFG_GFXDECODE(vboy)
1422
14231430   /* software lists */
14241431   MCFG_SOFTWARE_LIST_ADD("cart_list","vboy")
14251432
r20330r20331
14331440/* ROM definition */
14341441ROM_START( vboy )
14351442   ROM_REGION( 0x2000000, "cartridge", ROMREGION_ERASEFF )
1436
1437   ROM_REGION( 0x8000, "pcg", ROMREGION_ERASE00 )
14381443ROM_END
14391444
14401445/* Driver */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team