trunk/src/mess/drivers/vboy.c
| r20343 | r20344 | |
| 39 | 39 | #define WRITE_OVR_TEMPDRAW_MAP(woffs, wdat) m_ovr_tempdraw_map[(woffs) & 0x3f] = wdat; |
| 40 | 40 | #define READ_OVR_TEMPDRAW_MAP(roffs) m_ovr_tempdraw_map[(roffs) & 0x3f]; |
| 41 | 41 | |
| 42 | | #define READ_FONT(roffs) m_font[(roffs) & 0x3fff] |
| 42 | #define READ_FONT(roffs) m_font[(roffs)&0x1ffff] |
| 43 | 43 | |
| 44 | // bit of magic here, we also write pre-flipped copies of the data to extra ram we've allocated |
| 45 | // to simplify the draw loop (we can just pass the flip / unused bits as the upper character bits) |
| 46 | // (all TILE words are in the format of ccxy -ttt tttt tttt |
| 47 | // where 'c' = palette, 'x/y' are flips, '-' is unused(?) and 't' is your basic tile number |
| 48 | |
| 49 | #define WRITE_FONT(woffs) \ |
| 50 | COMBINE_DATA(&m_font[woffs]); /* normal */ \ |
| 51 | UINT16 dat = m_font[woffs]; \ |
| 52 | m_font[((woffs) + 0x4000)] = dat; /* normal */ \ |
| 53 | m_font[((woffs) + 0x8000) ^ 7] = dat; /* flip y */ \ |
| 54 | m_font[((woffs) + 0xc000) ^ 7] = dat; /* flip y */ \ |
| 55 | dat = BITSWAP16(dat,1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14); \ |
| 56 | m_font[((woffs) + 0x10000)] = dat; /* flip x */ \ |
| 57 | m_font[((woffs) + 0x14000)] = dat; /* flip x */ \ |
| 58 | m_font[((woffs) + 0x18000) ^ 7] = dat; /* flip x+y */ \ |
| 59 | m_font[((woffs) + 0x1c000) ^ 7] = dat; /* flip x+y */ \ |
| 60 | |
| 61 | |
| 62 | |
| 44 | 63 | /* FIXME: most if not all of these must be UINT8 */ |
| 45 | 64 | struct vboy_regs_t |
| 46 | 65 | { |
| r20343 | r20344 | |
| 179 | 198 | DECLARE_READ32_MEMBER(sram_r); |
| 180 | 199 | DECLARE_WRITE32_MEMBER(sram_w); |
| 181 | 200 | |
| 182 | | void put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal); |
| 183 | | void fill_ovr_char(UINT16 code, bool flipx, bool flipy, UINT8 pal); |
| 201 | void put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, UINT16 code, UINT8 pal); |
| 202 | void fill_ovr_char(UINT16 code, UINT8 pal); |
| 184 | 203 | INT8 get_bg_map_pixel(int num, int xpos, int ypos); |
| 185 | 204 | 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, |
| 186 | 205 | UINT16 x_mask, UINT16 y_mask, UINT8 ovr, bool right, int bg_map_num); |
| r20343 | r20344 | |
| 214 | 233 | m_r_frame_0 = auto_alloc_array_clear(machine(), UINT8, 0x6000); |
| 215 | 234 | m_r_frame_1 = auto_alloc_array_clear(machine(), UINT8, 0x6000); |
| 216 | 235 | |
| 217 | | m_font = auto_alloc_array_clear(machine(), UINT16, 0x8000 >> 1); |
| 236 | m_font = auto_alloc_array_clear(machine(), UINT16, (0x8000 >> 1)*4 * 2); |
| 218 | 237 | m_bgmap = auto_alloc_array(machine(), UINT16, 0x20000 >> 1); |
| 219 | 238 | } |
| 220 | 239 | |
| 221 | | void vboy_state::put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, UINT16 code, bool flipx, bool flipy, UINT8 pal) |
| 240 | void vboy_state::put_obj(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, UINT16 code, UINT8 pal) |
| 222 | 241 | { |
| 223 | 242 | UINT16 data; |
| 224 | 243 | UINT8 yi, xi, dat, col; |
| 225 | 244 | |
| 226 | 245 | for (yi = 0; yi < 8; yi++) |
| 227 | 246 | { |
| 228 | | if (!flipy) |
| 229 | | data = READ_FONT(code * 8 + yi); |
| 230 | | else |
| 231 | | data = READ_FONT(code * 8 + (7-yi)); |
| 247 | data = READ_FONT(code * 8 + yi); |
| 232 | 248 | |
| 233 | 249 | for (xi = 0; xi < 8; xi++) |
| 234 | 250 | { |
| 235 | 251 | int res_x,res_y; |
| 236 | 252 | |
| 237 | | if (!flipx) |
| 238 | | dat = ((data >> (xi << 1)) & 0x03); |
| 239 | | else |
| 240 | | dat = ((data >> ((7-xi) << 1)) & 0x03); |
| 253 | dat = ((data >> (xi << 1)) & 0x03); |
| 241 | 254 | |
| 242 | 255 | res_x = x + xi; |
| 243 | 256 | res_y = y + yi; |
| r20343 | r20344 | |
| 255 | 268 | |
| 256 | 269 | |
| 257 | 270 | |
| 258 | | void vboy_state::fill_ovr_char(UINT16 code, bool flipx, bool flipy, UINT8 pal) |
| 271 | void vboy_state::fill_ovr_char(UINT16 code, UINT8 pal) |
| 259 | 272 | { |
| 260 | 273 | UINT16 data; |
| 261 | 274 | UINT8 yi, xi, dat; |
| r20343 | r20344 | |
| 263 | 276 | |
| 264 | 277 | for (yi = 0; yi < 8; yi++) |
| 265 | 278 | { |
| 266 | | if (!flipy) |
| 267 | | data = READ_FONT(code * 8 + yi); |
| 268 | | else |
| 269 | | data = READ_FONT(code * 8 + (7-yi)); |
| 279 | data = READ_FONT(code * 8 + yi); |
| 270 | 280 | |
| 271 | 281 | for (xi = 0; xi < 8; xi++) |
| 272 | 282 | { |
| 273 | | if (!flipx) |
| 274 | | dat = ((data >> (xi << 1)) & 0x03); |
| 275 | | else |
| 276 | | dat = ((data >> ((7-xi) << 1)) & 0x03); |
| 277 | | |
| 283 | dat = ((data >> (xi << 1)) & 0x03); |
| 278 | 284 | col = (pal >> (dat*2)) & 3; |
| 279 | 285 | |
| 280 | 286 | if(dat == 0) |
| r20343 | r20344 | |
| 285 | 291 | } |
| 286 | 292 | } |
| 287 | 293 | |
| 288 | | INT8 vboy_state::get_bg_map_pixel(int num, int xpos, int ypos) |
| 294 | inline INT8 vboy_state::get_bg_map_pixel(int num, int xpos, int ypos) |
| 289 | 295 | { |
| 296 | // g_profiler.start(PROFILER_USER1); |
| 290 | 297 | int x, y; |
| 291 | 298 | UINT8 stepx, stepy; |
| 292 | 299 | |
| 293 | 300 | y = ypos >>3; |
| 294 | 301 | x = xpos >>3; |
| 295 | 302 | |
| 296 | | // Fill background map |
| 297 | | // for (y = 0; y < scy; y++) |
| 298 | | { |
| 299 | | // for (x = 0; x < scx; x++) |
| 300 | | { |
| 301 | | stepx = (x & 0x1c0) >> 6; |
| 302 | | stepy = ((y & 0x1c0) >> 6) * (stepx+1); |
| 303 | | UINT16 val = READ_BGMAP((x & 0x3f) + (64 * (y & 0x3f)) + ((num + stepx + stepy) * 0x1000)); |
| 304 | | int flipx = BIT(val,13); |
| 305 | | int flipy = BIT(val,12); |
| 306 | | int pal = m_vip_regs.GPLT[(val >> 14) & 3]; |
| 307 | | int code = val & 0x7ff; |
| 303 | stepx = (x & 0x1c0) >> 6; |
| 304 | stepy = ((y & 0x1c0) >> 6) * (stepx+1); |
| 305 | UINT16 val = READ_BGMAP((x & 0x3f) + (64 * (y & 0x3f)) + ((num + stepx + stepy) * 0x1000)); |
| 306 | int pal = m_vip_regs.GPLT[(val >> 14) & 3]; |
| 307 | int code = val & 0x3fff; |
| 308 | 308 | |
| 309 | | //put_char(x * 8, y * 8, , , , ); |
| 310 | | { |
| 311 | | UINT16 data; |
| 312 | | UINT8 yi, xi, dat; |
| 313 | | int col; |
| 309 | UINT16 data; |
| 310 | UINT8 yi, xi, dat; |
| 314 | 311 | |
| 315 | | // for (yi = 0; yi < 8; yi++) |
| 316 | | yi = ypos & 7; |
| 312 | yi = ypos & 7; |
| 313 | data = READ_FONT(code * 8 + yi); |
| 314 | xi = xpos & 7; |
| 315 | dat = ((data >> (xi << 1)) & 0x03); |
| 317 | 316 | |
| 318 | | { |
| 319 | | if (!flipy) |
| 320 | | data = READ_FONT(code * 8 + yi); |
| 321 | | else |
| 322 | | data = READ_FONT(code * 8 + (7-yi)); |
| 323 | | |
| 324 | | //for (xi = 0; xi < 8; xi++) |
| 325 | | xi = xpos & 7; |
| 326 | | { |
| 327 | | //int res_x,res_y; |
| 328 | | |
| 329 | | if (!flipx) |
| 330 | | dat = ((data >> (xi << 1)) & 0x03); |
| 331 | | else |
| 332 | | dat = ((data >> ((7-xi) << 1)) & 0x03); |
| 333 | | |
| 334 | | //res_x = x + xi; |
| 335 | | //res_y = y + yi; |
| 336 | | |
| 337 | | col = (pal >> (dat*2)) & 3; |
| 338 | | |
| 339 | | if(dat == 0) |
| 340 | | col = -1; |
| 341 | | |
| 342 | | return col; |
| 343 | | //WRITE_BG_TEMPDRAW_MAP(res_y*0x1000+res_x, col); |
| 344 | | } |
| 345 | | } |
| 346 | | } |
| 347 | | |
| 348 | | } |
| 317 | if(dat == 0) |
| 318 | { |
| 319 | //g_profiler.stop(); |
| 320 | return -1; |
| 349 | 321 | } |
| 322 | // g_profiler.stop(); |
| 323 | return (pal >> (dat*2)) & 3; |
| 350 | 324 | } |
| 351 | 325 | |
| 352 | 326 | 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, |
| 353 | 327 | UINT16 x_mask, UINT16 y_mask, UINT8 ovr, bool right, int bg_map_num) |
| 354 | 328 | { |
| 329 | // g_profiler.start(PROFILER_USER2); |
| 355 | 330 | int x,y; |
| 356 | 331 | |
| 357 | 332 | for(y=0;y<=h;y++) |
| r20343 | r20344 | |
| 381 | 356 | |
| 382 | 357 | |
| 383 | 358 | int pix = 0; |
| 384 | | if(ovr && (src_x > x_mask || src_y > y_mask || src_x < 0 || src_y < 0)) |
| 359 | if(ovr) |
| 385 | 360 | { |
| 386 | | pix = READ_OVR_TEMPDRAW_MAP((src_y & 7)*8+(src_x & 7)); |
| 361 | if ((src_x > x_mask || src_y > y_mask || src_x < 0 || src_y < 0)) |
| 362 | { |
| 363 | g_profiler.start(PROFILER_USER3); |
| 364 | pix = READ_OVR_TEMPDRAW_MAP((src_y & 7)*8+(src_x & 7)); |
| 365 | g_profiler.stop(); |
| 366 | } |
| 367 | else |
| 368 | { |
| 369 | pix = get_bg_map_pixel(bg_map_num, src_x & x_mask, src_y & y_mask); |
| 370 | } |
| 387 | 371 | } |
| 388 | 372 | else |
| 389 | 373 | { |
| r20343 | r20344 | |
| 394 | 378 | bitmap.pix16(y1, x1) = machine().pens[pix & 3]; |
| 395 | 379 | } |
| 396 | 380 | } |
| 381 | // g_profiler.stop(); |
| 397 | 382 | } |
| 398 | 383 | |
| 399 | 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, |
| 400 | 385 | UINT16 x_mask, UINT16 y_mask, UINT8 ovr, bool right, int bg_map_num) |
| 401 | 386 | { |
| 387 | // g_profiler.start(PROFILER_USER3); |
| 402 | 388 | int x,y; |
| 403 | 389 | |
| 404 | 390 | for(y=0;y<=h;y++) |
| r20343 | r20344 | |
| 437 | 423 | bitmap.pix16(y1, x1) = machine().pens[pix & 3]; |
| 438 | 424 | } |
| 439 | 425 | } |
| 426 | // g_profiler.stop(); |
| 440 | 427 | } |
| 441 | 428 | |
| 442 | 429 | /* |
| r20343 | r20344 | |
| 481 | 468 | if (mode < 2) // Normal / HBias Mode |
| 482 | 469 | { |
| 483 | 470 | if(ovr) |
| 484 | | fill_ovr_char(ovr_char & 0x7ff,BIT(ovr_char,13), BIT(ovr_char,12), m_vip_regs.GPLT[(ovr_char >> 14) & 3]); |
| 471 | fill_ovr_char(ovr_char & 0x3fff, m_vip_regs.GPLT[(ovr_char >> 14) & 3]); |
| 485 | 472 | |
| 486 | 473 | if (lon && (!right)) |
| 487 | 474 | { |
| 488 | | //fill_bg_map(bg_map_num, scx, scy); |
| 489 | 475 | draw_bg_map(bitmap, cliprect, param_base, mode, gx, gp, gy, mx, mp, my, h,w, scx*8-1, scy*8-1, ovr, right, bg_map_num); |
| 490 | 476 | } |
| 491 | 477 | |
| 492 | 478 | if (ron && (right)) |
| 493 | 479 | { |
| 494 | | //fill_bg_map(bg_map_num, scx, scy); |
| 495 | 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, bg_map_num); |
| 496 | 481 | } |
| 497 | 482 | } |
| 498 | 483 | else if (mode==2) // Affine Mode |
| 499 | 484 | { |
| 500 | 485 | if(ovr) |
| 501 | | fill_ovr_char(ovr_char & 0x7ff,BIT(ovr_char,13), BIT(ovr_char,12), m_vip_regs.GPLT[(ovr_char >> 14) & 3]); |
| 486 | fill_ovr_char(ovr_char & 0x3fff, m_vip_regs.GPLT[(ovr_char >> 14) & 3]); |
| 502 | 487 | |
| 503 | 488 | if (lon && (!right)) |
| 504 | 489 | { |
| 505 | | //fill_bg_map(bg_map_num, scx, scy); |
| 506 | 490 | draw_affine_map(bitmap, cliprect, param_base, gx, gp, gy, h,w, scx*8-1, scy*8-1, ovr, right, bg_map_num); |
| 507 | 491 | } |
| 508 | 492 | |
| 509 | 493 | if (ron && (right)) |
| 510 | 494 | { |
| 511 | | //fill_bg_map(bg_map_num, scx, scy); |
| 512 | 495 | draw_affine_map(bitmap, cliprect, param_base, gx, gp, gy, h,w, scx*8-1, scy*8-1, ovr, right, bg_map_num); |
| 513 | 496 | } |
| 514 | 497 | } |
| r20343 | r20344 | |
| 540 | 523 | UINT8 jron = (READ_OBJECTS(start_ndx+1) & 0x4000) >> 14; |
| 541 | 524 | |
| 542 | 525 | if (!right && jlon) |
| 543 | | put_obj(bitmap, cliprect, (jx-jp) & 0x1ff, jy, val & 0x7ff, BIT(val,13), BIT(val,12), m_vip_regs.JPLT[(val>>14) & 3]); |
| 526 | put_obj(bitmap, cliprect, (jx-jp) & 0x1ff, jy, val & 0x3fff, m_vip_regs.JPLT[(val>>14) & 3]); |
| 544 | 527 | |
| 545 | 528 | if(right && jron) |
| 546 | | put_obj(bitmap, cliprect, (jx+jp) & 0x1ff, jy, val & 0x7ff, BIT(val,13), BIT(val,12), m_vip_regs.JPLT[(val>>14) & 3]); |
| 529 | put_obj(bitmap, cliprect, (jx+jp) & 0x1ff, jy, val & 0x3fff, m_vip_regs.JPLT[(val>>14) & 3]); |
| 547 | 530 | |
| 548 | 531 | i --; |
| 549 | 532 | i &= 0x3ff; |
| r20343 | r20344 | |
| 1044 | 1027 | |
| 1045 | 1028 | WRITE16_MEMBER( vboy_state::vboy_font0_w ) |
| 1046 | 1029 | { |
| 1047 | | COMBINE_DATA(&m_font[offset]); |
| 1030 | WRITE_FONT(offset); |
| 1048 | 1031 | } |
| 1049 | 1032 | |
| 1050 | 1033 | WRITE16_MEMBER( vboy_state::vboy_font1_w ) |
| 1051 | 1034 | { |
| 1052 | | COMBINE_DATA(&m_font[offset+0x1000]); |
| 1035 | WRITE_FONT(offset+0x1000); |
| 1053 | 1036 | } |
| 1054 | 1037 | |
| 1055 | 1038 | WRITE16_MEMBER( vboy_state::vboy_font2_w ) |
| 1056 | 1039 | { |
| 1057 | | COMBINE_DATA(&m_font[offset+0x2000]); |
| 1040 | WRITE_FONT(offset+0x2000); |
| 1058 | 1041 | } |
| 1059 | 1042 | |
| 1060 | 1043 | WRITE16_MEMBER( vboy_state::vboy_font3_w ) |
| 1061 | 1044 | { |
| 1062 | | COMBINE_DATA(&m_font[offset+0x3000]); |
| 1045 | WRITE_FONT(offset+0x3000); |
| 1063 | 1046 | } |
| 1064 | 1047 | |
| 1065 | 1048 | READ16_MEMBER( vboy_state::vboy_font0_r ) |