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 | |