src/mess/video/gb.c
| r975 | r976 | |
| 43 | 43 | |
| 44 | 44 | static UINT8 bg_zbuf[160]; |
| 45 | 45 | UINT8 gb_vid_regs[_NR_GB_VID_REGS]; |
| 46 | | UINT16 cgb_bpal[32]; /* CGB current background palette table */ |
| 47 | | UINT16 cgb_spal[32]; /* CGB current background palette table */ |
| 48 | | UINT8 gb_bpal[4]; /* Background palette */ |
| 49 | | UINT8 gb_spal0[4]; /* Sprite 0 palette */ |
| 50 | | UINT8 gb_spal1[4]; /* Sprite 1 palette */ |
| 46 | static UINT16 cgb_bpal[32]; /* CGB current background palette table */ |
| 47 | static UINT16 cgb_spal[32]; /* CGB current background palette table */ |
| 48 | UINT16 sgb_pal[128]; /* SGB palette remapping */ |
| 49 | static UINT8 gb_bpal[4]; /* Background palette */ |
| 50 | static UINT8 gb_spal0[4]; /* Sprite 0 palette */ |
| 51 | static UINT8 gb_spal1[4]; /* Sprite 1 palette */ |
| 51 | 52 | UINT8 *gb_oam = NULL; |
| 52 | 53 | UINT8 *gb_vram = NULL; |
| 53 | 54 | int gbc_hdma_enabled; |
| r975 | r976 | |
| 147 | 148 | } |
| 148 | 149 | |
| 149 | 150 | /* Some default colours for non-SGB games */ |
| 150 | | colortable[0] = 32767; |
| 151 | | colortable[1] = 21140; |
| 152 | | colortable[2] = 10570; |
| 153 | | colortable[3] = 0; |
| 151 | sgb_pal[0] = 32767; |
| 152 | sgb_pal[1] = 21140; |
| 153 | sgb_pal[2] = 10570; |
| 154 | sgb_pal[3] = 0; |
| 154 | 155 | /* The rest of the colortable can be black */ |
| 155 | 156 | for( ii = 4; ii < 8*16; ii++ ) |
| 156 | | colortable[ii] = 0; |
| 157 | sgb_pal[ii] = 0; |
| 157 | 158 | } |
| 158 | 159 | |
| 159 | 160 | PALETTE_INIT( gbc ) { |
| r975 | r976 | |
| 495 | 496 | { |
| 496 | 497 | register int colour = ((data & 0x0100) ? 2 : 0) | ((data & 0x0001) ? 1 : 0); |
| 497 | 498 | if ((xindex >= SGB_XOFFSET && xindex <= SGB_XOFFSET + 160) && colour && !bg_zbuf[xindex - SGB_XOFFSET]) |
| 498 | | gb_plot_pixel(bitmap, xindex, yindex, Machine->remapped_colortable[pal + spal[colour]]); |
| 499 | gb_plot_pixel(bitmap, xindex, yindex, sgb_pal[pal + spal[colour]]); |
| 499 | 500 | data >>= 1; |
| 500 | 501 | } |
| 501 | 502 | break; |
| r975 | r976 | |
| 504 | 505 | { |
| 505 | 506 | register int colour = ((data & 0x0100) ? 2 : 0) | ((data & 0x0001) ? 1 : 0); |
| 506 | 507 | if ((xindex >= SGB_XOFFSET && xindex <= SGB_XOFFSET + 160) && colour) |
| 507 | | gb_plot_pixel(bitmap, xindex, yindex, Machine->remapped_colortable[pal + spal[colour]]); |
| 508 | gb_plot_pixel(bitmap, xindex, yindex, sgb_pal[pal + spal[colour]]); |
| 508 | 509 | data >>= 1; |
| 509 | 510 | } |
| 510 | 511 | break; |
| r975 | r976 | |
| 513 | 514 | { |
| 514 | 515 | register int colour = ((data & 0x8000) ? 2 : 0) | ((data & 0x0080) ? 1 : 0); |
| 515 | 516 | if ((xindex >= SGB_XOFFSET && xindex <= SGB_XOFFSET + 160) && colour && !bg_zbuf[xindex - SGB_XOFFSET]) |
| 516 | | gb_plot_pixel(bitmap, xindex, yindex, Machine->remapped_colortable[pal + spal[colour]]); |
| 517 | gb_plot_pixel(bitmap, xindex, yindex, sgb_pal[pal + spal[colour]]); |
| 517 | 518 | data <<= 1; |
| 518 | 519 | } |
| 519 | 520 | break; |
| r975 | r976 | |
| 522 | 523 | { |
| 523 | 524 | register int colour = ((data & 0x8000) ? 2 : 0) | ((data & 0x0080) ? 1 : 0); |
| 524 | 525 | if ((xindex >= SGB_XOFFSET && xindex <= SGB_XOFFSET + 160) && colour) |
| 525 | | gb_plot_pixel(bitmap, xindex, yindex, Machine->remapped_colortable[pal + spal[colour]]); |
| 526 | gb_plot_pixel(bitmap, xindex, yindex, sgb_pal[pal + spal[colour]]); |
| 526 | 527 | data <<= 1; |
| 527 | 528 | } |
| 528 | 529 | break; |
| r975 | r976 | |
| 586 | 587 | */ |
| 587 | 588 | if( !((yidx >= SGB_YOFFSET && yidx < SGB_YOFFSET + 144) && |
| 588 | 589 | (xindex >= SGB_XOFFSET && xindex < SGB_XOFFSET + 160)) ) { |
| 589 | | gb_plot_pixel(bitmap, xindex, yidx, Machine->remapped_colortable[pal + colour]); |
| 590 | gb_plot_pixel(bitmap, xindex, yidx, sgb_pal[pal + colour]); |
| 590 | 591 | } |
| 591 | 592 | xindex++; |
| 592 | 593 | } |
| r975 | r976 | |
| 690 | 691 | fillbitmap( bitmap, Machine->pens[0], &r ); |
| 691 | 692 | } |
| 692 | 693 | while( l < 2 ) { |
| 693 | | UINT8 xindex, sgb_pal, *map, *tiles; |
| 694 | UINT8 xindex, sgb_palette, *map, *tiles; |
| 694 | 695 | UINT16 data; |
| 695 | 696 | int i, tile_index; |
| 696 | 697 | |
| r975 | r976 | |
| 713 | 714 | data <<= gb_lcd.layer[l].xshift; |
| 714 | 715 | |
| 715 | 716 | /* Figure out which palette we're using */ |
| 716 | | sgb_pal = sgb_pal_map[ ( gb_lcd.end_x - i ) >> 3 ][ gb_lcd.current_line >> 3 ] << 2; |
| 717 | sgb_palette = sgb_pal_map[ ( gb_lcd.end_x - i ) >> 3 ][ gb_lcd.current_line >> 3 ] << 2; |
| 717 | 718 | |
| 718 | 719 | while( i > 0 ) { |
| 719 | 720 | while( ( gb_lcd.layer[l].xshift < 8 ) && i ) { |
| 720 | 721 | register int colour = ( ( data & 0x8000 ) ? 2 : 0 ) | ( ( data & 0x0080 ) ? 1 : 0 ); |
| 721 | | gb_plot_pixel( bitmap, xindex + SGB_XOFFSET, gb_lcd.current_line + SGB_YOFFSET, Machine->remapped_colortable[ sgb_pal + gb_bpal[colour]] ); |
| 722 | gb_plot_pixel( bitmap, xindex + SGB_XOFFSET, gb_lcd.current_line + SGB_YOFFSET, sgb_pal[ sgb_palette + gb_bpal[colour]] ); |
| 722 | 723 | bg_zbuf[xindex] = colour; |
| 723 | 724 | xindex++; |
| 724 | 725 | data <<= 1; |
| r975 | r976 | |
| 730 | 731 | gb_lcd.layer[l].xshift = 0; |
| 731 | 732 | tile_index = ( map[ gb_lcd.layer[l].xindex ] ^ gb_tile_no_mod ) * 16; |
| 732 | 733 | data = tiles[ tile_index ] | ( tiles[ tile_index + 1 ] << 8 ); |
| 733 | | sgb_pal = sgb_pal_map[ ( gb_lcd.end_x - i ) >> 3 ][ gb_lcd.current_line >> 3 ] << 2; |
| 734 | sgb_palette = sgb_pal_map[ ( gb_lcd.end_x - i ) >> 3 ][ gb_lcd.current_line >> 3 ] << 2; |
| 734 | 735 | } |
| 735 | 736 | } |
| 736 | 737 | l++; |
src/mess/machine/gb.c
| r975 | r976 | |
| 796 | 796 | } |
| 797 | 797 | if (sgb_bytecount == (sgb_packets << 4) ) |
| 798 | 798 | { |
| 799 | | /* 7-Sep-2007 - After 0.118u5, you cannot change remapped_colortable */ |
| 800 | 799 | switch( sgb_data[0] >> 3 ) |
| 801 | 800 | { |
| 802 | 801 | case 0x00: /* PAL01 */ |
| 803 | | /* |
| 804 | | Machine->remapped_colortable[0*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 805 | | Machine->remapped_colortable[0*4 + 1] = sgb_data[3] | (sgb_data[4] << 8); |
| 806 | | Machine->remapped_colortable[0*4 + 2] = sgb_data[5] | (sgb_data[6] << 8); |
| 807 | | Machine->remapped_colortable[0*4 + 3] = sgb_data[7] | (sgb_data[8] << 8); |
| 808 | | Machine->remapped_colortable[1*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 809 | | Machine->remapped_colortable[1*4 + 1] = sgb_data[9] | (sgb_data[10] << 8); |
| 810 | | Machine->remapped_colortable[1*4 + 2] = sgb_data[11] | (sgb_data[12] << 8); |
| 811 | | Machine->remapped_colortable[1*4 + 3] = sgb_data[13] | (sgb_data[14] << 8); |
| 812 | | */ |
| 802 | sgb_pal[0*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 803 | sgb_pal[0*4 + 1] = sgb_data[3] | (sgb_data[4] << 8); |
| 804 | sgb_pal[0*4 + 2] = sgb_data[5] | (sgb_data[6] << 8); |
| 805 | sgb_pal[0*4 + 3] = sgb_data[7] | (sgb_data[8] << 8); |
| 806 | sgb_pal[1*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 807 | sgb_pal[1*4 + 1] = sgb_data[9] | (sgb_data[10] << 8); |
| 808 | sgb_pal[1*4 + 2] = sgb_data[11] | (sgb_data[12] << 8); |
| 809 | sgb_pal[1*4 + 3] = sgb_data[13] | (sgb_data[14] << 8); |
| 813 | 810 | break; |
| 814 | 811 | case 0x01: /* PAL23 */ |
| 815 | | /* |
| 816 | | Machine->remapped_colortable[2*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 817 | | Machine->remapped_colortable[2*4 + 1] = sgb_data[3] | (sgb_data[4] << 8); |
| 818 | | Machine->remapped_colortable[2*4 + 2] = sgb_data[5] | (sgb_data[6] << 8); |
| 819 | | Machine->remapped_colortable[2*4 + 3] = sgb_data[7] | (sgb_data[8] << 8); |
| 820 | | Machine->remapped_colortable[3*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 821 | | Machine->remapped_colortable[3*4 + 1] = sgb_data[9] | (sgb_data[10] << 8); |
| 822 | | Machine->remapped_colortable[3*4 + 2] = sgb_data[11] | (sgb_data[12] << 8); |
| 823 | | Machine->remapped_colortable[3*4 + 3] = sgb_data[13] | (sgb_data[14] << 8); |
| 824 | | */ |
| 812 | sgb_pal[2*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 813 | sgb_pal[2*4 + 1] = sgb_data[3] | (sgb_data[4] << 8); |
| 814 | sgb_pal[2*4 + 2] = sgb_data[5] | (sgb_data[6] << 8); |
| 815 | sgb_pal[2*4 + 3] = sgb_data[7] | (sgb_data[8] << 8); |
| 816 | sgb_pal[3*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 817 | sgb_pal[3*4 + 1] = sgb_data[9] | (sgb_data[10] << 8); |
| 818 | sgb_pal[3*4 + 2] = sgb_data[11] | (sgb_data[12] << 8); |
| 819 | sgb_pal[3*4 + 3] = sgb_data[13] | (sgb_data[14] << 8); |
| 825 | 820 | break; |
| 826 | 821 | case 0x02: /* PAL03 */ |
| 827 | | /* |
| 828 | | Machine->remapped_colortable[0*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 829 | | Machine->remapped_colortable[0*4 + 1] = sgb_data[3] | (sgb_data[4] << 8); |
| 830 | | Machine->remapped_colortable[0*4 + 2] = sgb_data[5] | (sgb_data[6] << 8); |
| 831 | | Machine->remapped_colortable[0*4 + 3] = sgb_data[7] | (sgb_data[8] << 8); |
| 832 | | Machine->remapped_colortable[3*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 833 | | Machine->remapped_colortable[3*4 + 1] = sgb_data[9] | (sgb_data[10] << 8); |
| 834 | | Machine->remapped_colortable[3*4 + 2] = sgb_data[11] | (sgb_data[12] << 8); |
| 835 | | Machine->remapped_colortable[3*4 + 3] = sgb_data[13] | (sgb_data[14] << 8); |
| 836 | | */ |
| 822 | sgb_pal[0*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 823 | sgb_pal[0*4 + 1] = sgb_data[3] | (sgb_data[4] << 8); |
| 824 | sgb_pal[0*4 + 2] = sgb_data[5] | (sgb_data[6] << 8); |
| 825 | sgb_pal[0*4 + 3] = sgb_data[7] | (sgb_data[8] << 8); |
| 826 | sgb_pal[3*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 827 | sgb_pal[3*4 + 1] = sgb_data[9] | (sgb_data[10] << 8); |
| 828 | sgb_pal[3*4 + 2] = sgb_data[11] | (sgb_data[12] << 8); |
| 829 | sgb_pal[3*4 + 3] = sgb_data[13] | (sgb_data[14] << 8); |
| 837 | 830 | break; |
| 838 | 831 | case 0x03: /* PAL12 */ |
| 839 | | /* |
| 840 | | Machine->remapped_colortable[1*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 841 | | Machine->remapped_colortable[1*4 + 1] = sgb_data[3] | (sgb_data[4] << 8); |
| 842 | | Machine->remapped_colortable[1*4 + 2] = sgb_data[5] | (sgb_data[6] << 8); |
| 843 | | Machine->remapped_colortable[1*4 + 3] = sgb_data[7] | (sgb_data[8] << 8); |
| 844 | | Machine->remapped_colortable[2*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 845 | | Machine->remapped_colortable[2*4 + 1] = sgb_data[9] | (sgb_data[10] << 8); |
| 846 | | Machine->remapped_colortable[2*4 + 2] = sgb_data[11] | (sgb_data[12] << 8); |
| 847 | | Machine->remapped_colortable[2*4 + 3] = sgb_data[13] | (sgb_data[14] << 8); |
| 848 | | */ |
| 832 | sgb_pal[1*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 833 | sgb_pal[1*4 + 1] = sgb_data[3] | (sgb_data[4] << 8); |
| 834 | sgb_pal[1*4 + 2] = sgb_data[5] | (sgb_data[6] << 8); |
| 835 | sgb_pal[1*4 + 3] = sgb_data[7] | (sgb_data[8] << 8); |
| 836 | sgb_pal[2*4 + 0] = sgb_data[1] | (sgb_data[2] << 8); |
| 837 | sgb_pal[2*4 + 1] = sgb_data[9] | (sgb_data[10] << 8); |
| 838 | sgb_pal[2*4 + 2] = sgb_data[11] | (sgb_data[12] << 8); |
| 839 | sgb_pal[2*4 + 3] = sgb_data[13] | (sgb_data[14] << 8); |
| 849 | 840 | break; |
| 850 | 841 | case 0x04: /* ATTR_BLK */ |
| 851 | 842 | { |
| r975 | r976 | |
| 1044 | 1035 | case 0x0A: /* PAL_SET */ |
| 1045 | 1036 | { |
| 1046 | 1037 | UINT16 index_, J, I; |
| 1047 | | /* 7-Sep-2007 - After 0.118u5, you cannot change remapped_colortable */ |
| 1048 | 1038 | |
| 1049 | 1039 | /* Palette 0 */ |
| 1050 | 1040 | index_ = (UINT16)(sgb_data[1] | (sgb_data[2] << 8)) * 4; |
| 1051 | | /* |
| 1052 | | Machine->remapped_colortable[0] = sgb_pal_data[index_]; |
| 1053 | | Machine->remapped_colortable[1] = sgb_pal_data[index_ + 1]; |
| 1054 | | Machine->remapped_colortable[2] = sgb_pal_data[index_ + 2]; |
| 1055 | | Machine->remapped_colortable[3] = sgb_pal_data[index_ + 3]; |
| 1056 | | */ |
| 1041 | sgb_pal[0] = sgb_pal_data[index_]; |
| 1042 | sgb_pal[1] = sgb_pal_data[index_ + 1]; |
| 1043 | sgb_pal[2] = sgb_pal_data[index_ + 2]; |
| 1044 | sgb_pal[3] = sgb_pal_data[index_ + 3]; |
| 1057 | 1045 | /* Palette 1 */ |
| 1058 | 1046 | index_ = (UINT16)(sgb_data[3] | (sgb_data[4] << 8)) * 4; |
| 1059 | | /* |
| 1060 | | Machine->remapped_colortable[4] = sgb_pal_data[index_]; |
| 1061 | | Machine->remapped_colortable[5] = sgb_pal_data[index_ + 1]; |
| 1062 | | Machine->remapped_colortable[6] = sgb_pal_data[index_ + 2]; |
| 1063 | | Machine->remapped_colortable[7] = sgb_pal_data[index_ + 3]; |
| 1064 | | */ |
| 1047 | sgb_pal[4] = sgb_pal_data[index_]; |
| 1048 | sgb_pal[5] = sgb_pal_data[index_ + 1]; |
| 1049 | sgb_pal[6] = sgb_pal_data[index_ + 2]; |
| 1050 | sgb_pal[7] = sgb_pal_data[index_ + 3]; |
| 1065 | 1051 | /* Palette 2 */ |
| 1066 | 1052 | index_ = (UINT16)(sgb_data[5] | (sgb_data[6] << 8)) * 4; |
| 1067 | | /* |
| 1068 | | Machine->remapped_colortable[8] = sgb_pal_data[index_]; |
| 1069 | | Machine->remapped_colortable[9] = sgb_pal_data[index_ + 1]; |
| 1070 | | Machine->remapped_colortable[10] = sgb_pal_data[index_ + 2]; |
| 1071 | | Machine->remapped_colortable[11] = sgb_pal_data[index_ + 3]; |
| 1072 | | */ |
| 1053 | sgb_pal[8] = sgb_pal_data[index_]; |
| 1054 | sgb_pal[9] = sgb_pal_data[index_ + 1]; |
| 1055 | sgb_pal[10] = sgb_pal_data[index_ + 2]; |
| 1056 | sgb_pal[11] = sgb_pal_data[index_ + 3]; |
| 1073 | 1057 | /* Palette 3 */ |
| 1074 | 1058 | index_ = (UINT16)(sgb_data[7] | (sgb_data[8] << 8)) * 4; |
| 1075 | | /* |
| 1076 | | Machine->remapped_colortable[12] = sgb_pal_data[index_]; |
| 1077 | | Machine->remapped_colortable[13] = sgb_pal_data[index_ + 1]; |
| 1078 | | Machine->remapped_colortable[14] = sgb_pal_data[index_ + 2]; |
| 1079 | | Machine->remapped_colortable[15] = sgb_pal_data[index_ + 3]; |
| 1080 | | */ |
| 1059 | sgb_pal[12] = sgb_pal_data[index_]; |
| 1060 | sgb_pal[13] = sgb_pal_data[index_ + 1]; |
| 1061 | sgb_pal[14] = sgb_pal_data[index_ + 2]; |
| 1062 | sgb_pal[15] = sgb_pal_data[index_ + 3]; |
| 1081 | 1063 | /* Attribute File */ |
| 1082 | 1064 | if( sgb_data[9] & 0x40 ) |
| 1083 | 1065 | sgb_window_mask = 0; |
| r975 | r976 | |
| 1150 | 1132 | { |
| 1151 | 1133 | col = program_read_byte_8 (0x8800 + (I*2)); |
| 1152 | 1134 | col |= (UINT16)(program_read_byte_8 (0x8800 + (I*2) + 1)) << 8; |
| 1153 | | /* 7-Sep-2007 - After 0.118u5, you cannot change remapped_colortable */ |
| 1154 | | /* Machine->remapped_colortable[SGB_BORDER_PAL_OFFSET + I] = col; */ |
| 1135 | sgb_pal[SGB_BORDER_PAL_OFFSET + I] = col; |
| 1155 | 1136 | } |
| 1156 | 1137 | } |
| 1157 | 1138 | else /* Do things normally */ |
| r975 | r976 | |
| 1161 | 1142 | { |
| 1162 | 1143 | col = program_read_byte_8 (0x9000 + (I*2)); |
| 1163 | 1144 | col |= (UINT16)(program_read_byte_8 (0x9000 + (I*2) + 1)) << 8; |
| 1164 | | /* 7-Sep-2007 - After 0.118u5, you cannot change remapped_colortable */ |
| 1165 | | /* Machine->remapped_colortable[SGB_BORDER_PAL_OFFSET + I] = col; */ |
| 1145 | sgb_pal[SGB_BORDER_PAL_OFFSET + I] = col; |
| 1166 | 1146 | } |
| 1167 | 1147 | } |
| 1168 | 1148 | } |