trunk/src/mess/drivers/vboy.c
| r20330 | r20331 | |
| 30 | 30 | #include "audio/vboy.h" |
| 31 | 31 | #include "vboy.lh" |
| 32 | 32 | |
| 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 | |
| 33 | 47 | /* FIXME: most if not all of these must be UINT8 */ |
| 34 | 48 | struct vboy_regs_t |
| 35 | 49 | { |
| r20330 | r20331 | |
| 75 | 89 | : driver_device(mconfig, type, tag), |
| 76 | 90 | m_maintimer(*this, "timer_main"), |
| 77 | 91 | 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; |
| 79 | 119 | |
| 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 | |
| 80 | 136 | required_device<timer_device> m_maintimer; |
| 81 | 137 | required_device<cpu_device> m_maincpu; |
| 82 | 138 | |
| r20330 | r20331 | |
| 108 | 164 | UINT8 *m_l_frame_1; |
| 109 | 165 | UINT8 *m_r_frame_0; |
| 110 | 166 | UINT8 *m_r_frame_1; |
| 111 | | UINT16 *m_world; |
| 112 | | UINT16 *m_columntab1; |
| 113 | | UINT16 *m_columntab2; |
| 114 | | UINT16 *m_objects; |
| 115 | 167 | vboy_regs_t m_vboy_regs; |
| 116 | 168 | vip_regs_t m_vip_regs; |
| 117 | 169 | 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; |
| 120 | 172 | UINT16 m_frame_count; |
| 121 | 173 | UINT8 m_displayfb; |
| 122 | 174 | UINT8 m_drawfb; |
| r20330 | r20331 | |
| 131 | 183 | DECLARE_READ32_MEMBER(sram_r); |
| 132 | 184 | DECLARE_WRITE32_MEMBER(sram_w); |
| 133 | 185 | |
| 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); |
| 137 | 187 | void put_char(int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal); |
| 138 | 188 | void fill_ovr_char(UINT16 code, bool flipx, bool flipy, UINT8 pal); |
| 139 | 189 | 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, |
| 141 | 191 | 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, |
| 143 | 193 | 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); |
| 145 | 195 | void m_set_brightness(void); |
| 146 | 196 | virtual void machine_start(); |
| 147 | 197 | virtual void machine_reset(); |
| r20330 | r20331 | |
| 161 | 211 | //int i; |
| 162 | 212 | |
| 163 | 213 | // 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); |
| 166 | 216 | |
| 167 | 217 | // Allocate memory for framebuffers |
| 168 | 218 | m_l_frame_0 = auto_alloc_array_clear(machine(), UINT8, 0x6000); |
| r20330 | r20331 | |
| 170 | 220 | m_r_frame_0 = auto_alloc_array_clear(machine(), UINT8, 0x6000); |
| 171 | 221 | m_r_frame_1 = auto_alloc_array_clear(machine(), UINT8, 0x6000); |
| 172 | 222 | |
| 173 | | m_font = auto_alloc_array_clear(machine(), UINT16, 2048 * 8); |
| 223 | m_font = auto_alloc_array_clear(machine(), UINT16, 0x8000 >> 1); |
| 174 | 224 | 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); |
| 179 | 225 | } |
| 180 | 226 | |
| 181 | | void vboy_state::put_obj(bitmap_ind16 &bitmap, int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal) |
| 227 | void vboy_state::put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal) |
| 182 | 228 | { |
| 183 | 229 | UINT16 data; |
| 184 | 230 | UINT8 yi, xi, dat, col; |
| r20330 | r20331 | |
| 186 | 232 | for (yi = 0; yi < 8; yi++) |
| 187 | 233 | { |
| 188 | 234 | if (!flipy) |
| 189 | | data = m_font[code * 8 + yi]; |
| 235 | data = READ_FONT(code * 8 + yi); |
| 190 | 236 | else |
| 191 | | data = m_font[code * 8 + (7-yi)]; |
| 237 | data = READ_FONT(code * 8 + (7-yi)); |
| 192 | 238 | |
| 193 | 239 | for (xi = 0; xi < 8; xi++) |
| 194 | 240 | { |
| r20330 | r20331 | |
| 204 | 250 | |
| 205 | 251 | col = (pal >> (dat*2)) & 3; |
| 206 | 252 | |
| 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 | } |
| 209 | 258 | } |
| 210 | 259 | } |
| 211 | 260 | } |
| r20330 | r20331 | |
| 219 | 268 | for (yi = 0; yi < 8; yi++) |
| 220 | 269 | { |
| 221 | 270 | if (!flipy) |
| 222 | | data = m_font[code * 8 + yi]; |
| 271 | data = READ_FONT(code * 8 + yi); |
| 223 | 272 | else |
| 224 | | data = m_font[code * 8 + (7-yi)]; |
| 273 | data = READ_FONT(code * 8 + (7-yi)); |
| 225 | 274 | |
| 226 | 275 | for (xi = 0; xi < 8; xi++) |
| 227 | 276 | { |
| r20330 | r20331 | |
| 240 | 289 | if(dat == 0) |
| 241 | 290 | col = -1; |
| 242 | 291 | |
| 243 | | m_bg_map[res_y*0x1000+res_x] = col; |
| 292 | WRITE_BG_TEMPDRAW_MAP(res_y*0x1000+res_x, col); |
| 244 | 293 | } |
| 245 | 294 | } |
| 246 | 295 | } |
| r20330 | r20331 | |
| 254 | 303 | for (yi = 0; yi < 8; yi++) |
| 255 | 304 | { |
| 256 | 305 | if (!flipy) |
| 257 | | data = m_font[code * 8 + yi]; |
| 306 | data = READ_FONT(code * 8 + yi); |
| 258 | 307 | else |
| 259 | | data = m_font[code * 8 + (7-yi)]; |
| 308 | data = READ_FONT(code * 8 + (7-yi)); |
| 260 | 309 | |
| 261 | 310 | for (xi = 0; xi < 8; xi++) |
| 262 | 311 | { |
| r20330 | r20331 | |
| 270 | 319 | if(dat == 0) |
| 271 | 320 | col = -1; |
| 272 | 321 | |
| 273 | | m_ovr_map[yi*8+xi] = col; |
| 322 | WRITE_OVR_TEMPDRAW_MAP(yi*8+xi, col); |
| 274 | 323 | } |
| 275 | 324 | } |
| 276 | 325 | } |
| r20330 | r20331 | |
| 287 | 336 | { |
| 288 | 337 | stepx = (x & 0x1c0) >> 6; |
| 289 | 338 | 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)); |
| 291 | 340 | put_char(x * 8, y * 8, val & 0x7ff, BIT(val,13), BIT(val,12), m_vip_regs.GPLT[(val >> 14) & 3]); |
| 292 | 341 | } |
| 293 | 342 | } |
| 294 | 343 | } |
| 295 | 344 | |
| 296 | | void 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, |
| 345 | void 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, |
| 297 | 346 | UINT16 x_mask, UINT16 y_mask, UINT8 ovr, bool right) |
| 298 | 347 | { |
| 299 | 348 | int x,y; |
| r20330 | r20331 | |
| 311 | 360 | |
| 312 | 361 | src_x = x+mx; |
| 313 | 362 | 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))); |
| 315 | 364 | |
| 316 | 365 | src_y = y+my; |
| 317 | 366 | src_x += right ? -mp : mp; |
| 318 | 367 | |
| 319 | 368 | 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 | } |
| 321 | 372 | 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 | } |
| 323 | 376 | |
| 324 | 377 | 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]; |
| 328 | 380 | } |
| 329 | 381 | } |
| 330 | 382 | } |
| 331 | 383 | |
| 332 | | void vboy_state::draw_affine_map(bitmap_ind16 &bitmap, UINT16 *vboy_paramtab, int gx, int gp, int gy, int h, int w, |
| 384 | void vboy_state::draw_affine_map(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 param_base, int gx, int gp, int gy, int h, int w, |
| 333 | 385 | UINT16 x_mask, UINT16 y_mask, UINT8 ovr, bool right) |
| 334 | 386 | { |
| 335 | 387 | int x,y; |
| 336 | 388 | |
| 337 | 389 | for(y=0;y<=h;y++) |
| 338 | 390 | { |
| 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; |
| 344 | 396 | |
| 345 | 397 | h_skw += right ? -prlx : prlx; |
| 346 | 398 | |
| r20330 | r20331 | |
| 357 | 409 | src_y = (INT32)((v_skw) + (v_scl * x)); |
| 358 | 410 | |
| 359 | 411 | 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 | } |
| 361 | 415 | 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 | } |
| 363 | 419 | |
| 364 | 420 | 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]; |
| 368 | 423 | } |
| 369 | 424 | } |
| 370 | 425 | } |
| r20330 | r20331 | |
| 381 | 436 | ---- ---- ---- xxxx BGMAP_BASE |
| 382 | 437 | */ |
| 383 | 438 | |
| 384 | | UINT8 vboy_state::display_world(int num, bitmap_ind16 &bitmap, bool right, int &cur_spt) |
| 439 | UINT8 vboy_state::display_world(int num, bitmap_ind16 &bitmap, const rectangle &cliprect, bool right, int &cur_spt) |
| 385 | 440 | { |
| 386 | 441 | num <<= 4; |
| 387 | | UINT16 def = m_world[num]; |
| 442 | UINT16 def = READ_WORLD(num); |
| 388 | 443 | UINT8 lon = (def >> 15) & 1; |
| 389 | 444 | UINT8 ron = (def >> 14) & 1; |
| 390 | 445 | UINT8 mode = (def >> 12) & 3; |
| r20330 | r20331 | |
| 392 | 447 | UINT16 scy = 64 << ((def >> 8) & 3); |
| 393 | 448 | UINT8 ovr = (def >> 7) & 1; |
| 394 | 449 | 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)); |
| 405 | 460 | UINT8 bg_map_num = def & 0x0f; |
| 406 | | UINT16 *vboy_paramtab; |
| 407 | 461 | int i; |
| 408 | 462 | |
| 409 | | vboy_paramtab = m_bgmap + param_base; |
| 410 | | |
| 411 | 463 | if(end) |
| 412 | 464 | return 1; |
| 413 | 465 | |
| r20330 | r20331 | |
| 419 | 471 | if (lon && (!right)) |
| 420 | 472 | { |
| 421 | 473 | 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); |
| 423 | 475 | } |
| 424 | 476 | |
| 425 | 477 | if (ron && (right)) |
| 426 | 478 | { |
| 427 | 479 | 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); |
| 429 | 481 | } |
| 430 | 482 | } |
| 431 | 483 | else if (mode==2) // Affine Mode |
| r20330 | r20331 | |
| 436 | 488 | if (lon && (!right)) |
| 437 | 489 | { |
| 438 | 490 | 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); |
| 440 | 492 | } |
| 441 | 493 | |
| 442 | 494 | if (ron && (right)) |
| 443 | 495 | { |
| 444 | 496 | 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); |
| 446 | 498 | } |
| 447 | 499 | } |
| 448 | 500 | else if (mode==3) // OBJ Mode |
| r20330 | r20331 | |
| 465 | 517 | do |
| 466 | 518 | { |
| 467 | 519 | 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; |
| 474 | 526 | |
| 475 | 527 | 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]); |
| 477 | 529 | |
| 478 | 530 | 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]); |
| 480 | 532 | |
| 481 | 533 | i --; |
| 482 | 534 | i &= 0x3ff; |
| r20330 | r20331 | |
| 499 | 551 | |
| 500 | 552 | cur_spt = 3; |
| 501 | 553 | 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; |
| 503 | 555 | |
| 504 | 556 | if(0) |
| 505 | 557 | { |
| r20330 | r20331 | |
| 535 | 587 | |
| 536 | 588 | cur_spt = 3; |
| 537 | 589 | 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; |
| 539 | 591 | |
| 540 | 592 | return 0; |
| 541 | 593 | } |
| r20330 | r20331 | |
| 974 | 1026 | } |
| 975 | 1027 | |
| 976 | 1028 | |
| 977 | | void vboy_state::m_pcg_debug(UINT16 offset,UINT16 data,UINT16 mem_mask) |
| 978 | | { |
| 979 | | UINT8 *pcg_ram = memregion("pcg")->base(); |
| 980 | | int i; |
| 981 | 1029 | |
| 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 | | |
| 994 | 1030 | WRITE16_MEMBER( vboy_state::vboy_font0_w ) |
| 995 | 1031 | { |
| 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]); |
| 1000 | 1033 | } |
| 1001 | 1034 | |
| 1002 | 1035 | WRITE16_MEMBER( vboy_state::vboy_font1_w ) |
| 1003 | 1036 | { |
| 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]); |
| 1008 | 1038 | } |
| 1009 | 1039 | |
| 1010 | 1040 | WRITE16_MEMBER( vboy_state::vboy_font2_w ) |
| 1011 | 1041 | { |
| 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]); |
| 1016 | 1043 | } |
| 1017 | 1044 | |
| 1018 | 1045 | WRITE16_MEMBER( vboy_state::vboy_font3_w ) |
| 1019 | 1046 | { |
| 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]); |
| 1024 | 1048 | } |
| 1025 | 1049 | |
| 1026 | 1050 | READ16_MEMBER( vboy_state::vboy_font0_r ) |
| 1027 | 1051 | { |
| 1028 | | return m_font[offset]; |
| 1052 | return READ_FONT(offset); |
| 1029 | 1053 | } |
| 1030 | 1054 | |
| 1031 | 1055 | READ16_MEMBER( vboy_state::vboy_font1_r ) |
| 1032 | 1056 | { |
| 1033 | | return m_font[offset + 0x1000]; |
| 1057 | return READ_FONT(offset + 0x1000); |
| 1034 | 1058 | } |
| 1035 | 1059 | |
| 1036 | 1060 | READ16_MEMBER( vboy_state::vboy_font2_r ) |
| 1037 | 1061 | { |
| 1038 | | return m_font[offset + 0x2000]; |
| 1062 | return READ_FONT(offset + 0x2000); |
| 1039 | 1063 | } |
| 1040 | 1064 | |
| 1041 | 1065 | READ16_MEMBER( vboy_state::vboy_font3_r ) |
| 1042 | 1066 | { |
| 1043 | | return m_font[offset + 0x3000]; |
| 1067 | return READ_FONT(offset + 0x3000); |
| 1044 | 1068 | } |
| 1045 | 1069 | |
| 1046 | 1070 | WRITE16_MEMBER( vboy_state::vboy_bgmap_w ) |
| r20330 | r20331 | |
| 1313 | 1337 | #endif |
| 1314 | 1338 | |
| 1315 | 1339 | |
| 1316 | | static 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 | | }; |
| 1326 | 1340 | |
| 1327 | | /* decoded for debugging purpose, this will be nuked in the end... */ |
| 1328 | | static GFXDECODE_START( vboy ) |
| 1329 | | GFXDECODE_ENTRY( "pcg", 0x00000, vboy_pcg_8x8, 0, 1 ) |
| 1330 | | GFXDECODE_END |
| 1331 | | |
| 1332 | 1341 | READ32_MEMBER(vboy_state::sram_r) |
| 1333 | 1342 | { |
| 1334 | 1343 | return m_vboy_sram[offset]; |
| r20330 | r20331 | |
| 1418 | 1427 | MCFG_CARTSLOT_INTERFACE("vboy_cart") |
| 1419 | 1428 | MCFG_CARTSLOT_LOAD(vboy_cart) |
| 1420 | 1429 | |
| 1421 | | MCFG_GFXDECODE(vboy) |
| 1422 | | |
| 1423 | 1430 | /* software lists */ |
| 1424 | 1431 | MCFG_SOFTWARE_LIST_ADD("cart_list","vboy") |
| 1425 | 1432 | |
| r20330 | r20331 | |
| 1433 | 1440 | /* ROM definition */ |
| 1434 | 1441 | ROM_START( vboy ) |
| 1435 | 1442 | ROM_REGION( 0x2000000, "cartridge", ROMREGION_ERASEFF ) |
| 1436 | | |
| 1437 | | ROM_REGION( 0x8000, "pcg", ROMREGION_ERASE00 ) |
| 1438 | 1443 | ROM_END |
| 1439 | 1444 | |
| 1440 | 1445 | /* Driver */ |