trunk/src/mame/video/atari.c
| r31951 | r31952 | |
| 739 | 739 | |
| 740 | 740 | /* reset the ANTIC color tables */ |
| 741 | 741 | for( i = 0; i < 256; i ++ ) |
| 742 | | antic.color_lookup[i] = (m_palette->pen(0) << 8) + m_palette->pen(0); |
| 742 | gtia.color_lookup[i] = (m_palette->pen(0) << 8) + m_palette->pen(0); |
| 743 | 743 | |
| 744 | 744 | LOG(("atari cclk_init\n")); |
| 745 | 745 | cclk_init(); |
| r31951 | r31952 | |
| 788 | 788 | UINT8 atari_B = ((b+0x70)&0xf0)+c; |
| 789 | 789 | UINT8 atari_C = b+c; |
| 790 | 790 | UINT8 atari_D = gtia.w.colbk; |
| 791 | UINT16 *color_lookup = gtia.color_lookup; |
| 791 | 792 | |
| 792 | 793 | for( x = 0; x < width * 4; x++ ) |
| 793 | 794 | { |
| r31951 | r31952 | |
| 807 | 808 | bits |= 3; |
| 808 | 809 | break; |
| 809 | 810 | default: |
| 810 | | *dst++ = antic.color_lookup[n]; |
| 811 | | *dst++ = antic.color_lookup[n]; |
| 811 | *dst++ = color_lookup[n]; |
| 812 | *dst++ = color_lookup[n]; |
| 812 | 813 | continue; |
| 813 | 814 | } |
| 814 | 815 | switch( (bits >> 1) & 7 ) |
| r31951 | r31952 | |
| 862 | 863 | UINT8 atari_B = ((b+0x70)&0xf0)+c; |
| 863 | 864 | UINT8 atari_C = b+c; |
| 864 | 865 | UINT8 atari_D = gtia.w.colpf2; |
| 866 | UINT16 *color_lookup = gtia.color_lookup; |
| 865 | 867 | |
| 866 | 868 | for( x = 0; x < width * 4; x++ ) |
| 867 | 869 | { |
| r31951 | r31952 | |
| 881 | 883 | bits |= 3; |
| 882 | 884 | break; |
| 883 | 885 | default: |
| 884 | | *dst++ = antic.color_lookup[n]; |
| 885 | | *dst++ = antic.color_lookup[n]; |
| 886 | *dst++ = color_lookup[n]; |
| 887 | *dst++ = color_lookup[n]; |
| 886 | 888 | continue; |
| 887 | 889 | } |
| 888 | 890 | switch( (bits >> 1) & 7 ) |
| r31951 | r31952 | |
| 933 | 935 | UINT8 *src; |
| 934 | 936 | UINT32 *dst; |
| 935 | 937 | UINT32 scanline[4 + (HCHARS * 2) + 4]; |
| 938 | UINT16 *color_lookup = gtia.color_lookup; |
| 936 | 939 | |
| 937 | 940 | /* increment the scanline */ |
| 938 | 941 | if( ++antic.scanline == machine().first_screen()->height() ) |
| r31951 | r31952 | |
| 965 | 968 | return; |
| 966 | 969 | } |
| 967 | 970 | } |
| 968 | | dst[0] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 969 | | dst[1] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 970 | | dst[2] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 971 | dst[0] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 972 | dst[1] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 973 | dst[2] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 971 | 974 | if ( (antic.cmd & ANTIC_HSCR) == 0 || (antic.pfwidth == 48) || (antic.pfwidth == 32)) |
| 972 | 975 | { |
| 973 | 976 | /* no hscroll */ |
| 974 | | dst[3] = antic.color_lookup[src[BYTE_XOR_LE(0)]] | antic.color_lookup[src[BYTE_XOR_LE(1)]] << 16; |
| 977 | dst[3] = color_lookup[src[BYTE_XOR_LE(0)]] | color_lookup[src[BYTE_XOR_LE(1)]] << 16; |
| 975 | 978 | src += 2; |
| 976 | 979 | dst += 4; |
| 977 | 980 | for( x = 1; x < HCHARS-1; x++ ) |
| 978 | 981 | { |
| 979 | | *dst++ = antic.color_lookup[src[BYTE_XOR_LE(0)]] | antic.color_lookup[src[BYTE_XOR_LE(1)]] << 16; |
| 980 | | *dst++ = antic.color_lookup[src[BYTE_XOR_LE(2)]] | antic.color_lookup[src[BYTE_XOR_LE(3)]] << 16; |
| 982 | *dst++ = color_lookup[src[BYTE_XOR_LE(0)]] | color_lookup[src[BYTE_XOR_LE(1)]] << 16; |
| 983 | *dst++ = color_lookup[src[BYTE_XOR_LE(2)]] | color_lookup[src[BYTE_XOR_LE(3)]] << 16; |
| 981 | 984 | src += 4; |
| 982 | 985 | } |
| 983 | | dst[0] = antic.color_lookup[src[BYTE_XOR_LE(0)]] | antic.color_lookup[src[BYTE_XOR_LE(1)]] << 16; |
| 986 | dst[0] = color_lookup[src[BYTE_XOR_LE(0)]] | color_lookup[src[BYTE_XOR_LE(1)]] << 16; |
| 984 | 987 | } |
| 985 | 988 | else |
| 986 | 989 | { |
| r31951 | r31952 | |
| 990 | 993 | { |
| 991 | 994 | case 0: |
| 992 | 995 | { |
| 993 | | dst[3] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 996 | dst[3] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 994 | 997 | dst += 4; |
| 995 | 998 | for ( x = 1; x < HCHARS-1; x++ ) |
| 996 | 999 | { |
| 997 | | *dst++ = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 998 | | *dst++ = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1000 | *dst++ = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1001 | *dst++ = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 999 | 1002 | } |
| 1000 | | dst[0] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1003 | dst[0] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1001 | 1004 | } |
| 1002 | 1005 | break; |
| 1003 | 1006 | /* support for narrow playfield (32) with horizontal scrolling should be added here */ |
| 1004 | 1007 | case 40: |
| 1005 | 1008 | { |
| 1006 | | dst[3] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1009 | dst[3] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1007 | 1010 | dst += 4; |
| 1008 | 1011 | for ( x = 1; x < HCHARS-2; x++ ) |
| 1009 | 1012 | { |
| 1010 | 1013 | if ( x == 1 ) |
| 1011 | 1014 | { |
| 1012 | | *dst++ = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1015 | *dst++ = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1013 | 1016 | } |
| 1014 | 1017 | else |
| 1015 | 1018 | { |
| 1016 | | *dst++ = antic.color_lookup[src[BYTE_XOR_LE(0)]] | antic.color_lookup[src[BYTE_XOR_LE(1)]] << 16; |
| 1019 | *dst++ = color_lookup[src[BYTE_XOR_LE(0)]] | color_lookup[src[BYTE_XOR_LE(1)]] << 16; |
| 1017 | 1020 | } |
| 1018 | | *dst++ = antic.color_lookup[src[BYTE_XOR_LE(2)]] | antic.color_lookup[src[BYTE_XOR_LE(3)]] << 16; |
| 1021 | *dst++ = color_lookup[src[BYTE_XOR_LE(2)]] | color_lookup[src[BYTE_XOR_LE(3)]] << 16; |
| 1019 | 1022 | src += 4; |
| 1020 | 1023 | } |
| 1021 | 1024 | for ( ; x < HCHARS-1; x++ ) |
| 1022 | 1025 | { |
| 1023 | | *dst++ = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1024 | | *dst++ = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1026 | *dst++ = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1027 | *dst++ = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1025 | 1028 | } |
| 1026 | | dst[0] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1029 | dst[0] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1027 | 1030 | } |
| 1028 | 1031 | break; |
| 1029 | 1032 | } |
| 1030 | 1033 | } |
| 1031 | | dst[1] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1032 | | dst[2] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1033 | | dst[3] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; |
| 1034 | dst[1] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1035 | dst[2] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1036 | dst[3] = color_lookup[PBK] | color_lookup[PBK] << 16; |
| 1034 | 1037 | |
| 1035 | 1038 | draw_scanline8(*antic.bitmap, 12, y, MIN(antic.bitmap->width() - 12, sizeof(scanline)), (const UINT8 *) scanline, NULL); |
| 1036 | 1039 | } |
| r31951 | r31952 | |
| 1214 | 1217 | } |
| 1215 | 1218 | } |
| 1216 | 1219 | |
| 1217 | | gtia_render(video); |
| 1220 | if (antic.scanline >= VBL_END && antic.scanline < 256) |
| 1221 | gtia_render((UINT8 *)antic.pmbits + PMOFFSET, (UINT8 *)antic.cclock + PMOFFSET - antic.hscrol_old, (UINT8 *)antic.prio_table[gtia.w.prior & 0x3f], (UINT8 *)&antic.pmbits); |
| 1218 | 1222 | |
| 1219 | 1223 | antic.steal_cycles += CYCLES_REFRESH; |
| 1220 | 1224 | LOG((" run CPU for %d cycles\n", CYCLES_HSYNC - CYCLES_HSTART - antic.steal_cycles)); |
trunk/src/mame/video/gtia.c
| r31951 | r31952 | |
| 44 | 44 | * set both color clocks equal for one color |
| 45 | 45 | **********************************************/ |
| 46 | 46 | #define SETCOL_B(o,d) \ |
| 47 | | antic.color_lookup[o] = ((d) << 8) | (d) |
| 47 | gtia.color_lookup[o] = ((d) << 8) | (d) |
| 48 | 48 | |
| 49 | 49 | /********************************************** |
| 50 | 50 | * set left color clock for one color |
| 51 | 51 | **********************************************/ |
| 52 | 52 | #define SETCOL_L(o,d) \ |
| 53 | | *((UINT8*)&antic.color_lookup[o] + 0) = d |
| 53 | *((UINT8*)>ia.color_lookup[o] + 0) = d |
| 54 | 54 | |
| 55 | 55 | /********************************************** |
| 56 | 56 | * set right color clock for one color |
| 57 | 57 | **********************************************/ |
| 58 | 58 | #define SETCOL_R(o,d) \ |
| 59 | | *((UINT8*)&antic.color_lookup[o] + 1) = d |
| 59 | *((UINT8*)>ia.color_lookup[o] + 1) = d |
| 60 | 60 | |
| 61 | 61 | |
| 62 | 62 | |
| r31951 | r31952 | |
| 841 | 841 | } |
| 842 | 842 | |
| 843 | 843 | |
| 844 | | void gtia_render(VIDEO *video) |
| 844 | void gtia_render(UINT8 *src, UINT8 *dst, UINT8 *prio, UINT8 *pmbits) |
| 845 | 845 | { |
| 846 | | int x; |
| 847 | | UINT8 *prio = antic.prio_table[gtia.w.prior & 0x3f]; |
| 848 | | UINT8 *src, *dst; |
| 849 | | |
| 850 | | if( antic.scanline < VBL_END || antic.scanline >= 256 ) |
| 851 | | return; |
| 852 | | |
| 853 | 846 | if (gtia.h.grafp0) |
| 854 | | player_render(gtia.h.grafp0, gtia.w.sizep0 + 1, P0, &antic.pmbits[gtia.w.hposp0]); |
| 847 | player_render(gtia.h.grafp0, gtia.w.sizep0 + 1, P0, &pmbits[gtia.w.hposp0]); |
| 855 | 848 | if (gtia.h.grafp1) |
| 856 | | player_render(gtia.h.grafp1, gtia.w.sizep1 + 1, P1, &antic.pmbits[gtia.w.hposp1]); |
| 849 | player_render(gtia.h.grafp1, gtia.w.sizep1 + 1, P1, &pmbits[gtia.w.hposp1]); |
| 857 | 850 | if (gtia.h.grafp2) |
| 858 | | player_render(gtia.h.grafp2, gtia.w.sizep2 + 1, P2, &antic.pmbits[gtia.w.hposp2]); |
| 851 | player_render(gtia.h.grafp2, gtia.w.sizep2 + 1, P2, &pmbits[gtia.w.hposp2]); |
| 859 | 852 | if (gtia.h.grafp3) |
| 860 | | player_render(gtia.h.grafp3, gtia.w.sizep3 + 1, P3, &antic.pmbits[gtia.w.hposp3]); |
| 853 | player_render(gtia.h.grafp3, gtia.w.sizep3 + 1, P3, &pmbits[gtia.w.hposp3]); |
| 861 | 854 | |
| 862 | 855 | if (gtia.h.grafm0) |
| 863 | | missile_render(gtia.h.grafm0, gtia.w.sizem + 1, M0, &antic.pmbits[gtia.w.hposm0]); |
| 856 | missile_render(gtia.h.grafm0, gtia.w.sizem + 1, M0, &pmbits[gtia.w.hposm0]); |
| 864 | 857 | if (gtia.h.grafm1) |
| 865 | | missile_render(gtia.h.grafm1, gtia.w.sizem + 1, M1, &antic.pmbits[gtia.w.hposm1]); |
| 858 | missile_render(gtia.h.grafm1, gtia.w.sizem + 1, M1, &pmbits[gtia.w.hposm1]); |
| 866 | 859 | if (gtia.h.grafm2) |
| 867 | | missile_render(gtia.h.grafm2, gtia.w.sizem + 1, M2, &antic.pmbits[gtia.w.hposm2]); |
| 860 | missile_render(gtia.h.grafm2, gtia.w.sizem + 1, M2, &pmbits[gtia.w.hposm2]); |
| 868 | 861 | if (gtia.h.grafm3) |
| 869 | | missile_render(gtia.h.grafm3, gtia.w.sizem + 1, M3, &antic.pmbits[gtia.w.hposm3]); |
| 862 | missile_render(gtia.h.grafm3, gtia.w.sizem + 1, M3, &pmbits[gtia.w.hposm3]); |
| 870 | 863 | |
| 871 | | src = antic.pmbits + PMOFFSET; |
| 872 | | dst = antic.cclock + PMOFFSET - antic.hscrol_old; |
| 873 | | |
| 874 | | for( x = 0; x < HWIDTH*4; x++, src++, dst++ ) |
| 864 | for (int x = 0; x < HWIDTH * 4; x++, src++, dst++) |
| 875 | 865 | { |
| 876 | 866 | UINT8 pm, pc, pf; |
| 877 | | if( !*src ) |
| 867 | if (!*src) |
| 878 | 868 | continue; |
| 879 | 869 | /* get the player/missile combination bits and reset the buffer */ |
| 880 | 870 | pm = *src; |