trunk/src/mame/video/konamigx.c
r241541 | r241542 | |
276 | 276 | #define GX_MAX_OBJECTS (GX_MAX_SPRITES + GX_MAX_LAYERS) |
277 | 277 | |
278 | 278 | static struct GX_OBJ { int order, offs, code, color; } *gx_objpool; |
279 | | static UINT16 *gx_spriteram; |
280 | 279 | |
281 | | // mirrored K054338 settings |
282 | | static int *K054338_shdRGB; |
283 | | |
284 | | |
285 | 280 | void konamigx_state::konamigx_mixer_init(screen_device &screen, int objdma) |
286 | 281 | { |
287 | 282 | m_gx_objdma = 0; |
r241541 | r241542 | |
291 | 286 | m_gx_shdzbuf = auto_alloc_array(machine(), UINT8, GX_ZBUFSIZE); |
292 | 287 | gx_objpool = auto_alloc_array(machine(), struct GX_OBJ, GX_MAX_OBJECTS); |
293 | 288 | |
294 | | m_k054338->export_config(&K054338_shdRGB); |
| 289 | m_k054338->export_config(&m_K054338_shdRGB); |
295 | 290 | |
296 | 291 | if (objdma) |
297 | 292 | { |
298 | | gx_spriteram = auto_alloc_array(machine(), UINT16, 0x1000/2); |
| 293 | m_gx_spriteram = auto_alloc_array(machine(), UINT16, 0x1000/2); |
299 | 294 | m_gx_objdma = 1; |
300 | 295 | } |
301 | 296 | else |
302 | | m_k055673->k053247_get_ram(&gx_spriteram); |
| 297 | m_k055673->k053247_get_ram(&m_gx_spriteram); |
303 | 298 | |
304 | 299 | m_palette->set_shadow_dRGB32(3,-80,-80,-80, 0); |
305 | 300 | m_k054338->invert_alpha(1); |
r241541 | r241542 | |
315 | 310 | UINT16* k053247_ram; |
316 | 311 | m_k055673->k053247_get_ram(&k053247_ram); |
317 | 312 | |
318 | | if (m_gx_objdma && gx_spriteram && k053247_ram) memcpy(gx_spriteram, k053247_ram, 0x1000); |
| 313 | if (m_gx_objdma && m_gx_spriteram && k053247_ram) memcpy(m_gx_spriteram, k053247_ram, 0x1000); |
319 | 314 | } |
320 | 315 | |
321 | 316 | void konamigx_state::konamigx_mixer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, |
r241541 | r241542 | |
416 | 411 | // only enable shadows beyond a +/-7 RGB threshold |
417 | 412 | for (j=0,i=0; i<3; j+=3,i++) |
418 | 413 | { |
419 | | k = K054338_shdRGB[j ]; if (k < -7 || k > 7) { shadowon[i] = 1; continue; } |
420 | | k = K054338_shdRGB[j+1]; if (k < -7 || k > 7) { shadowon[i] = 1; continue; } |
421 | | k = K054338_shdRGB[j+2]; if (k < -7 || k > 7) { shadowon[i] = 1; } |
| 414 | k = m_K054338_shdRGB[j ]; if (k < -7 || k > 7) { shadowon[i] = 1; continue; } |
| 415 | k = m_K054338_shdRGB[j+1]; if (k < -7 || k > 7) { shadowon[i] = 1; continue; } |
| 416 | k = m_K054338_shdRGB[j+2]; if (k < -7 || k > 7) { shadowon[i] = 1; } |
422 | 417 | } |
423 | 418 | |
424 | 419 | // SHDON specifies layers on which shadows can be projected (see detail on p.65 7.2.8) |
r241541 | r241542 | |
496 | 491 | { |
497 | 492 | int pri = 0; |
498 | 493 | |
499 | | if (!(gx_spriteram[offs] & 0x8000)) continue; |
| 494 | if (!(m_gx_spriteram[offs] & 0x8000)) continue; |
500 | 495 | |
501 | | int zcode = gx_spriteram[offs] & 0xff; |
| 496 | int zcode = m_gx_spriteram[offs] & 0xff; |
502 | 497 | |
503 | 498 | // invert z-order when opset_pri is set (see p.51 OPSET PRI) |
504 | 499 | if (m_k053247_opset & 0x10) zcode = 0xff - zcode; |
505 | 500 | |
506 | | int code = gx_spriteram[offs+1]; |
507 | | int color = k = gx_spriteram[offs+6]; |
508 | | l = gx_spriteram[offs+7]; |
| 501 | int code = m_gx_spriteram[offs+1]; |
| 502 | int color = k = m_gx_spriteram[offs+6]; |
| 503 | l = m_gx_spriteram[offs+7]; |
509 | 504 | |
510 | 505 | m_k055673->m_k053247_cb(&code, &color, &pri); |
511 | 506 | |
r241541 | r241542 | |
869 | 864 | |
870 | 865 | |
871 | 866 | m_k055673->k053247_draw_single_sprite_gxcore(bitmap, cliprect, |
872 | | m_gx_objzbuf, m_gx_shdzbuf, code, gx_spriteram, offs, |
| 867 | m_gx_objzbuf, m_gx_shdzbuf, code, m_gx_spriteram, offs, |
873 | 868 | color, alpha, drawmode, zcode, pri, |
874 | 869 | /* non-gx only */ |
875 | 870 | 0,0,NULL,NULL,0 |
r241541 | r241542 | |
927 | 922 | SET_TILE_INFO_MEMBER(0, tileno, colour, TILE_FLIPYX(flip)); |
928 | 923 | } |
929 | 924 | |
930 | | static int konamigx_type3_psac2_actual_bank; |
931 | | //int konamigx_type3_psac2_actual_last_bank = 0; |
932 | 925 | |
933 | 926 | WRITE32_MEMBER(konamigx_state::konamigx_type3_psac2_bank_w) |
934 | 927 | { |
935 | 928 | // other bits are used for something... |
936 | 929 | |
937 | 930 | COMBINE_DATA(&m_konamigx_type3_psac2_bank[offset]); |
938 | | konamigx_type3_psac2_actual_bank = (m_konamigx_type3_psac2_bank[0] & 0x10000000) >> 28; |
| 931 | m_konamigx_type3_psac2_actual_bank = (m_konamigx_type3_psac2_bank[0] & 0x10000000) >> 28; |
939 | 932 | |
940 | 933 | /* handle this by creating 2 roz tilemaps instead, otherwise performance dies completely on dual screen mode |
941 | | if (konamigx_type3_psac2_actual_bank!=konamigx_type3_psac2_actual_last_bank) |
| 934 | if (m_konamigx_type3_psac2_actual_bank!=m_konamigx_type3_psac2_actual_last_bank) |
942 | 935 | { |
943 | 936 | m_gx_psac_tilemap->mark_all_dirty(); |
944 | | konamigx_type3_psac2_actual_last_bank = konamigx_type3_psac2_actual_bank; |
| 937 | m_konamigx_type3_psac2_actual_last_bank = m_konamigx_type3_psac2_actual_bank; |
945 | 938 | } |
946 | 939 | */ |
947 | 940 | } |
r241541 | r241542 | |
956 | 949 | |
957 | 950 | int base_index = tile_index; |
958 | 951 | |
959 | | // if (konamigx_type3_psac2_actual_bank) |
| 952 | // if (m_konamigx_type3_psac2_actual_bank) |
960 | 953 | // base_index+=0x20000/2; |
961 | 954 | |
962 | 955 | |
r241541 | r241542 | |
977 | 970 | |
978 | 971 | int base_index = tile_index; |
979 | 972 | |
980 | | // if (konamigx_type3_psac2_actual_bank) |
| 973 | // if (m_konamigx_type3_psac2_actual_bank) |
981 | 974 | // base_index+=0x20000/2; |
982 | 975 | |
983 | 976 | |
r241541 | r241542 | |
1432 | 1425 | temprect = cliprect; |
1433 | 1426 | temprect.max_x = cliprect.min_x+320; |
1434 | 1427 | |
1435 | | if (konamigx_type3_psac2_actual_bank == 1) K053936_0_zoom_draw(screen, *m_type3_roz_temp_bitmap, temprect,m_gx_psac_tilemap_alt, 0,0,0); // soccerss playfield |
| 1428 | if (m_konamigx_type3_psac2_actual_bank == 1) K053936_0_zoom_draw(screen, *m_type3_roz_temp_bitmap, temprect,m_gx_psac_tilemap_alt, 0,0,0); // soccerss playfield |
1436 | 1429 | else K053936_0_zoom_draw(screen, *m_type3_roz_temp_bitmap, temprect,m_gx_psac_tilemap, 0,0,0); // soccerss playfield |
1437 | 1430 | |
1438 | 1431 | |