trunk/src/mess/video/x68k.c
| r30761 | r30762 | |
| 125 | 125 | m_crtc.hend = (m_crtc.reg[3] * 8); |
| 126 | 126 | m_crtc.vbegin = (m_crtc.reg[6]) / m_crtc.vmultiple; |
| 127 | 127 | m_crtc.vend = (m_crtc.reg[7] - 1) / m_crtc.vmultiple; |
| 128 | if((m_crtc.vmultiple == 2) && !(m_crtc.reg[7] & 1)) // otherwise if the raster irq line == vblank line, the raster irq fires too late |
| 129 | m_crtc.vend++; |
| 128 | 130 | m_crtc.hsync_end = (m_crtc.reg[1]) * 8; |
| 129 | 131 | m_crtc.vsync_end = (m_crtc.reg[5]) / m_crtc.vmultiple; |
| 130 | 132 | m_crtc.hsyncadjust = m_crtc.reg[8]; |
| r30761 | r30762 | |
| 161 | 163 | // logerror("CRTC regs - %i %i %i %i - %i %i %i %i - %i - %i\n",m_crtc.reg[0],m_crtc.reg[1],m_crtc.reg[2],m_crtc.reg[3], |
| 162 | 164 | // m_crtc.reg[4],m_crtc.reg[5],m_crtc.reg[6],m_crtc.reg[7],m_crtc.reg[8],m_crtc.reg[9]); |
| 163 | 165 | logerror("video_screen_configure(machine.first_screen(),%i,%i,[%i,%i,%i,%i],55.45)\n",scr.max_x,scr.max_y,visiblescr.min_x,visiblescr.min_y,visiblescr.max_x,visiblescr.max_y); |
| 164 | | machine().first_screen()->configure(scr.max_x,scr.max_y,visiblescr,HZ_TO_ATTOSECONDS(55.45)); |
| 166 | m_screen->configure(scr.max_x,scr.max_y,visiblescr,HZ_TO_ATTOSECONDS(55.45)); |
| 165 | 167 | } |
| 166 | 168 | |
| 167 | 169 | TIMER_CALLBACK_MEMBER(x68k_state::x68k_hsync) |
| r30761 | r30762 | |
| 177 | 179 | { |
| 178 | 180 | if(m_oddscanline == 1) |
| 179 | 181 | { |
| 180 | | int scan = machine().first_screen()->vpos(); |
| 182 | int scan = m_screen->vpos(); |
| 181 | 183 | if(scan > m_crtc.vend) |
| 182 | 184 | scan = m_crtc.vbegin; |
| 183 | | hsync_time = machine().first_screen()->time_until_pos(scan,(m_crtc.htotal + m_crtc.hend) / 2); |
| 185 | hsync_time = m_screen->time_until_pos(scan,(m_crtc.htotal + m_crtc.hend) / 2); |
| 184 | 186 | m_scanline_timer->adjust(hsync_time); |
| 185 | 187 | if(scan != 0) |
| 186 | 188 | { |
| 187 | 189 | if((ioport("options")->read() & 0x04)) |
| 188 | 190 | { |
| 189 | | machine().first_screen()->update_partial(scan); |
| 191 | m_screen->update_partial(scan); |
| 190 | 192 | } |
| 191 | 193 | } |
| 192 | 194 | } |
| 193 | 195 | else |
| 194 | 196 | { |
| 195 | | int scan = machine().first_screen()->vpos(); |
| 197 | int scan = m_screen->vpos(); |
| 196 | 198 | if(scan > m_crtc.vend) |
| 197 | 199 | scan = m_crtc.vbegin; |
| 198 | | hsync_time = machine().first_screen()->time_until_pos(scan,m_crtc.hend / 2); |
| 200 | hsync_time = m_screen->time_until_pos(scan,m_crtc.hend / 2); |
| 199 | 201 | m_scanline_timer->adjust(hsync_time); |
| 200 | 202 | if(scan != 0) |
| 201 | 203 | { |
| 202 | 204 | if((ioport("options")->read() & 0x04)) |
| 203 | 205 | { |
| 204 | | machine().first_screen()->update_partial(scan); |
| 206 | m_screen->update_partial(scan); |
| 205 | 207 | } |
| 206 | 208 | } |
| 207 | 209 | } |
| r30761 | r30762 | |
| 210 | 212 | { |
| 211 | 213 | if(m_oddscanline == 1) |
| 212 | 214 | { |
| 213 | | int scan = machine().first_screen()->vpos(); |
| 215 | int scan = m_screen->vpos(); |
| 214 | 216 | if(scan > m_crtc.vend) |
| 215 | 217 | scan = m_crtc.vbegin; |
| 216 | 218 | else |
| 217 | 219 | scan++; |
| 218 | | hsync_time = machine().first_screen()->time_until_pos(scan,m_crtc.hbegin / 2); |
| 220 | hsync_time = m_screen->time_until_pos(scan,m_crtc.hbegin / 2); |
| 219 | 221 | m_scanline_timer->adjust(hsync_time, 1); |
| 220 | 222 | m_oddscanline = 0; |
| 221 | 223 | } |
| 222 | 224 | else |
| 223 | 225 | { |
| 224 | | hsync_time = machine().first_screen()->time_until_pos(machine().first_screen()->vpos(),(m_crtc.htotal + m_crtc.hbegin) / 2); |
| 226 | hsync_time = m_screen->time_until_pos(m_screen->vpos(),(m_crtc.htotal + m_crtc.hbegin) / 2); |
| 225 | 227 | m_scanline_timer->adjust(hsync_time, 1); |
| 226 | 228 | m_oddscanline = 1; |
| 227 | 229 | } |
| r30761 | r30762 | |
| 231 | 233 | { |
| 232 | 234 | if(hstate == 1) |
| 233 | 235 | { |
| 234 | | int scan = machine().first_screen()->vpos(); |
| 236 | int scan = m_screen->vpos(); |
| 235 | 237 | if(scan > m_crtc.vend) |
| 236 | 238 | scan = 0; |
| 237 | | hsync_time = machine().first_screen()->time_until_pos(scan,m_crtc.hend); |
| 239 | hsync_time = m_screen->time_until_pos(scan,m_crtc.hend); |
| 238 | 240 | m_scanline_timer->adjust(hsync_time); |
| 239 | 241 | if(scan != 0) |
| 240 | 242 | { |
| 241 | 243 | if((ioport("options")->read() & 0x04)) |
| 242 | 244 | { |
| 243 | | machine().first_screen()->update_partial(scan); |
| 245 | m_screen->update_partial(scan); |
| 244 | 246 | } |
| 245 | 247 | } |
| 246 | 248 | } |
| 247 | 249 | if(hstate == 0) |
| 248 | 250 | { |
| 249 | | hsync_time = machine().first_screen()->time_until_pos(machine().first_screen()->vpos()+1,m_crtc.hbegin); |
| 251 | hsync_time = m_screen->time_until_pos(m_screen->vpos()+1,m_crtc.hbegin); |
| 250 | 252 | m_scanline_timer->adjust(hsync_time, 1); |
| 251 | 253 | } |
| 252 | 254 | } |
| r30761 | r30762 | |
| 266 | 268 | if(scan <= m_crtc.vtotal) |
| 267 | 269 | { |
| 268 | 270 | m_mfpdev->i6_w(0); |
| 269 | | machine().first_screen()->update_partial(scan); |
| 270 | | irq_time = machine().first_screen()->time_until_pos(scan,m_crtc.hbegin); |
| 271 | m_screen->update_partial(scan); |
| 272 | irq_time = m_screen->time_until_pos(scan,m_crtc.hbegin); |
| 271 | 273 | // end of HBlank period clears GPIP6 also? |
| 272 | | end_time = machine().first_screen()->time_until_pos(scan,m_crtc.hend); |
| 274 | end_time = m_screen->time_until_pos(scan,m_crtc.hend); |
| 273 | 275 | m_raster_irq->adjust(irq_time, scan); |
| 274 | 276 | timer_set(end_time, TIMER_X68K_CRTC_RASTER_END); |
| 275 | | logerror("GPIP6: Raster triggered at line %i (%i)\n",scan,machine().first_screen()->vpos()); |
| 277 | logerror("GPIP6: Raster triggered at line %i (%i)\n",scan,m_screen->vpos()); |
| 276 | 278 | } |
| 277 | 279 | } |
| 278 | 280 | |
| r30761 | r30762 | |
| 286 | 288 | { |
| 287 | 289 | m_crtc.vblank = 1; |
| 288 | 290 | vblank_line = m_crtc.vbegin; |
| 289 | | irq_time = machine().first_screen()->time_until_pos(vblank_line,2); |
| 291 | irq_time = m_screen->time_until_pos(vblank_line,2); |
| 290 | 292 | m_vblank_irq->adjust(irq_time); |
| 291 | 293 | logerror("CRTC: VBlank on\n"); |
| 292 | 294 | } |
| r30761 | r30762 | |
| 296 | 298 | vblank_line = m_crtc.vend; |
| 297 | 299 | if(vblank_line > m_crtc.vtotal) |
| 298 | 300 | vblank_line = m_crtc.vtotal; |
| 299 | | irq_time = machine().first_screen()->time_until_pos(vblank_line,2); |
| 301 | irq_time = m_screen->time_until_pos(vblank_line,2); |
| 300 | 302 | m_vblank_irq->adjust(irq_time, 1); |
| 301 | 303 | logerror("CRTC: VBlank off\n"); |
| 302 | 304 | } |
| r30761 | r30762 | |
| 373 | 375 | case 9: // CRTC raster IRQ (GPIP6) |
| 374 | 376 | { |
| 375 | 377 | attotime irq_time; |
| 376 | | irq_time = machine().first_screen()->time_until_pos((data) / m_crtc.vmultiple,2); |
| 378 | data = m_crtc.reg[9]; |
| 379 | irq_time = m_screen->time_until_pos((data) / m_crtc.vmultiple,2); |
| 377 | 380 | |
| 378 | 381 | if(irq_time.as_double() > 0) |
| 379 | 382 | m_raster_irq->adjust(irq_time, (data) / m_crtc.vmultiple); |
| r30761 | r30762 | |
| 716 | 719 | + (((m_tvram[loc+0x10000] >> bit) & 0x01) ? 2 : 0) |
| 717 | 720 | + (((m_tvram[loc+0x20000] >> bit) & 0x01) ? 4 : 0) |
| 718 | 721 | + (((m_tvram[loc+0x30000] >> bit) & 0x01) ? 8 : 0); |
| 719 | | if(m_video.text_pal[colour] != 0x0000) // any colour but black |
| 720 | | { |
| 721 | | // Colour 0 is displayable if the text layer is at the priority level 2 |
| 722 | | if(colour == 0 && (m_video.reg[1] & 0x0c00) == 0x0800) |
| 723 | | bitmap.pix32(line, pixel) = m_pcgpalette->pen(colour); |
| 724 | | else |
| 725 | | if(colour != 0) |
| 726 | | bitmap.pix32(line, pixel) = m_pcgpalette->pen(colour); |
| 727 | | } |
| 722 | // Colour 0 is displayable if the text layer is at the priority level 2 |
| 723 | if((colour && (m_pcgpalette->pen(colour) & 0xffffff)) || (m_video.text_pri == 2)) |
| 724 | bitmap.pix32(line, pixel) = m_pcgpalette->pen(colour); |
| 728 | 725 | bit--; |
| 729 | 726 | if(bit < 0) |
| 730 | 727 | { |
| r30761 | r30762 | |
| 736 | 733 | } |
| 737 | 734 | } |
| 738 | 735 | |
| 739 | | void x68k_state::x68k_draw_gfx_scanline( bitmap_rgb32 &bitmap, rectangle cliprect, UINT8 priority) |
| 736 | void x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority) |
| 740 | 737 | { |
| 741 | 738 | int pixel; |
| 742 | 739 | int page; |
| r30761 | r30762 | |
| 775 | 772 | colour = (m_gvram[(lineoffset - 0xc0000) + (loc & 0x3ff)] & 0xf000) >> 12; |
| 776 | 773 | break; |
| 777 | 774 | } |
| 778 | | if(colour != 0) |
| 779 | | { |
| 780 | | bitmap.pix32(scanline, pixel) = m_gfxpalette->pen(colour); |
| 781 | | } |
| 775 | if(colour || (priority == 3)) |
| 776 | bitmap.pix16(scanline, pixel) = colour; |
| 782 | 777 | loc++; |
| 783 | 778 | loc &= 0x3ff; |
| 784 | 779 | } |
| r30761 | r30762 | |
| 801 | 796 | for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++) |
| 802 | 797 | { |
| 803 | 798 | colour = ((m_gvram[lineoffset + loc] >> page*shift) & 0x000f); |
| 804 | | if(colour != 0) |
| 805 | | { |
| 806 | | bitmap.pix32(scanline, pixel) = m_gfxpalette->pen(colour); |
| 807 | | } |
| 799 | if(colour || (priority == 3)) |
| 800 | bitmap.pix16(scanline, pixel) = colour; |
| 808 | 801 | loc++; |
| 809 | 802 | loc &= 0x1ff; |
| 810 | 803 | } |
| r30761 | r30762 | |
| 820 | 813 | for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++) |
| 821 | 814 | { |
| 822 | 815 | colour = ((m_gvram[lineoffset + loc] >> page*shift) & 0x00ff); |
| 823 | | if(colour != 0) |
| 824 | | { |
| 825 | | bitmap.pix32(scanline, pixel) = m_gfxpalette->pen(colour); |
| 826 | | } |
| 816 | if(colour || (priority == 3)) |
| 817 | bitmap.pix16(scanline, pixel) = colour; |
| 827 | 818 | loc++; |
| 828 | 819 | loc &= 0x1ff; |
| 829 | 820 | } |
| r30761 | r30762 | |
| 837 | 828 | for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++) |
| 838 | 829 | { |
| 839 | 830 | colour = m_gvram[lineoffset + loc]; |
| 840 | | if(colour != 0) |
| 841 | | { |
| 842 | | bitmap.pix32(scanline, pixel) = pal555(colour, 6, 11, 1); |
| 843 | | } |
| 831 | if(colour || (priority == 3)) |
| 832 | bitmap.pix16(scanline, pixel) = colour; |
| 844 | 833 | loc++; |
| 845 | 834 | loc &= 0x1ff; |
| 846 | 835 | } |
| r30761 | r30762 | |
| 853 | 842 | |
| 854 | 843 | void x68k_state::x68k_draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect) |
| 855 | 844 | { |
| 856 | | int priority; |
| 845 | int priority, scanline, pixel; |
| 857 | 846 | //rectangle rect; |
| 858 | 847 | //int xscr,yscr; |
| 859 | 848 | //int gpage; |
| r30761 | r30762 | |
| 861 | 850 | if(m_crtc.reg[20] & 0x0800) // if graphic layers are set to buffer, then they aren't visible |
| 862 | 851 | return; |
| 863 | 852 | |
| 853 | m_gfxbitmap->fill(0, cliprect); |
| 854 | |
| 864 | 855 | for(priority=3;priority>=0;priority--) |
| 865 | 856 | { |
| 866 | | x68k_draw_gfx_scanline(bitmap,cliprect,priority); |
| 857 | x68k_draw_gfx_scanline(*m_gfxbitmap,cliprect,priority); |
| 867 | 858 | } |
| 859 | |
| 860 | for(scanline=cliprect.min_y;scanline<=cliprect.max_y;scanline++) |
| 861 | { |
| 862 | UINT16 colour; |
| 863 | for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++) |
| 864 | { |
| 865 | if((m_video.reg[0] & 0x03) == 3) |
| 866 | { |
| 867 | colour = m_gfxbitmap->pix16(scanline, pixel); |
| 868 | if(colour || (m_video.gfx_pri == 2)) |
| 869 | bitmap.pix32(scanline, pixel) = pal555(colour, 6, 11, 1); |
| 870 | } |
| 871 | else |
| 872 | { |
| 873 | colour = m_gfxbitmap->pix16(scanline, pixel) & 0xff; |
| 874 | if((colour && (m_gfxpalette->pen(colour) & 0xffffff)) || (m_video.gfx_pri == 2)) |
| 875 | bitmap.pix32(scanline, pixel) = m_gfxpalette->pen(colour); |
| 876 | } |
| 877 | } |
| 878 | } |
| 868 | 879 | } |
| 869 | 880 | |
| 870 | 881 | // Sprite controller "Cynthia" at 0xeb0000 |
| 871 | | void x68k_state::x68k_draw_sprites(bitmap_rgb32 &bitmap, int priority, rectangle cliprect) |
| 882 | void x68k_state::x68k_draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle cliprect) |
| 872 | 883 | { |
| 873 | 884 | /* |
| 874 | 885 | 0xeb0000 - 0xeb07ff - Sprite registers (up to 128) |
| r30761 | r30762 | |
| 1012 | 1023 | m_bg0_16->set_transparent_pen(0); |
| 1013 | 1024 | m_bg1_16->set_transparent_pen(0); |
| 1014 | 1025 | |
| 1026 | m_pcgbitmap = auto_bitmap_ind16_alloc(machine(), 1024, 1024); |
| 1027 | m_pcgbitmap->fill(0); |
| 1028 | |
| 1029 | m_gfxbitmap = auto_bitmap_ind16_alloc(machine(), 1024, 1024); |
| 1030 | m_gfxbitmap->fill(0); |
| 1031 | |
| 1015 | 1032 | // m_scanline_timer->adjust(attotime::zero, 0, attotime::from_hz(55.45)/568); |
| 1016 | 1033 | } |
| 1017 | 1034 | |
| r30761 | r30762 | |
| 1023 | 1040 | int x; |
| 1024 | 1041 | tilemap_t* x68k_bg0; |
| 1025 | 1042 | tilemap_t* x68k_bg1; |
| 1043 | int pixel, scanline; |
| 1026 | 1044 | //UINT8 *rom; |
| 1027 | 1045 | |
| 1028 | 1046 | if((m_spritereg[0x408] & 0x03) == 0x00) // Sprite/BG H-Res 0=8x8, 1=16x16, 2 or 3 = undefined. |
| r30761 | r30762 | |
| 1070 | 1088 | } |
| 1071 | 1089 | } |
| 1072 | 1090 | |
| 1073 | | for(priority=3;priority>=0;priority--) |
| 1091 | |
| 1092 | for(priority=2;priority>=0;priority--) |
| 1074 | 1093 | { |
| 1075 | 1094 | // Graphics screen(s) |
| 1076 | 1095 | if(priority == m_video.gfx_pri) |
| r30761 | r30762 | |
| 1079 | 1098 | // Sprite / BG Tiles |
| 1080 | 1099 | if(priority == m_video.sprite_pri /*&& (m_spritereg[0x404] & 0x0200)*/ && (m_video.reg[2] & 0x0040)) |
| 1081 | 1100 | { |
| 1082 | | x68k_draw_sprites(bitmap,1,rect); |
| 1101 | m_pcgbitmap->fill(0, rect); |
| 1102 | x68k_draw_sprites(*m_pcgbitmap,1,rect); |
| 1083 | 1103 | if((m_spritereg[0x404] & 0x0008)) |
| 1084 | 1104 | { |
| 1085 | 1105 | if((m_spritereg[0x404] & 0x0030) == 0x10) // BG1 TXSEL |
| 1086 | 1106 | { |
| 1087 | 1107 | x68k_bg0->set_scrollx(0,(m_spritereg[0x402] - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff); |
| 1088 | 1108 | x68k_bg0->set_scrolly(0,(m_spritereg[0x403] - m_crtc.vbegin) & 0x3ff); |
| 1089 | | x68k_bg0->draw(screen, bitmap,rect,0,0); |
| 1109 | x68k_bg0->draw(screen, *m_pcgbitmap,rect,0,0); |
| 1090 | 1110 | } |
| 1091 | 1111 | else |
| 1092 | 1112 | { |
| 1093 | 1113 | x68k_bg1->set_scrollx(0,(m_spritereg[0x402] - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff); |
| 1094 | 1114 | x68k_bg1->set_scrolly(0,(m_spritereg[0x403] - m_crtc.vbegin) & 0x3ff); |
| 1095 | | x68k_bg1->draw(screen, bitmap,rect,0,0); |
| 1115 | x68k_bg1->draw(screen, *m_pcgbitmap,rect,0,0); |
| 1096 | 1116 | } |
| 1097 | 1117 | } |
| 1098 | | x68k_draw_sprites(bitmap,2,rect); |
| 1118 | x68k_draw_sprites(*m_pcgbitmap,2,rect); |
| 1099 | 1119 | if((m_spritereg[0x404] & 0x0001)) |
| 1100 | 1120 | { |
| 1101 | 1121 | if((m_spritereg[0x404] & 0x0006) == 0x02) // BG0 TXSEL |
| 1102 | 1122 | { |
| 1103 | 1123 | x68k_bg0->set_scrollx(0,(m_spritereg[0x400] - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff); |
| 1104 | 1124 | x68k_bg0->set_scrolly(0,(m_spritereg[0x401] - m_crtc.vbegin) & 0x3ff); |
| 1105 | | x68k_bg0->draw(screen, bitmap,rect,0,0); |
| 1125 | x68k_bg0->draw(screen, *m_pcgbitmap,rect,0,0); |
| 1106 | 1126 | } |
| 1107 | 1127 | else |
| 1108 | 1128 | { |
| 1109 | 1129 | x68k_bg1->set_scrollx(0,(m_spritereg[0x400] - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff); |
| 1110 | 1130 | x68k_bg1->set_scrolly(0,(m_spritereg[0x401] - m_crtc.vbegin) & 0x3ff); |
| 1111 | | x68k_bg1->draw(screen, bitmap,rect,0,0); |
| 1131 | x68k_bg1->draw(screen, *m_pcgbitmap,rect,0,0); |
| 1112 | 1132 | } |
| 1113 | 1133 | } |
| 1114 | | x68k_draw_sprites(bitmap,3,rect); |
| 1134 | x68k_draw_sprites(*m_pcgbitmap,3,rect); |
| 1135 | |
| 1136 | for(scanline=rect.min_y;scanline<=rect.max_y;scanline++) |
| 1137 | { |
| 1138 | for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++) |
| 1139 | { |
| 1140 | UINT8 colour = m_pcgbitmap->pix16(scanline, pixel) & 0xff; |
| 1141 | if((colour && (m_pcgpalette->pen(colour) & 0xffffff)) || (priority == 2)) |
| 1142 | bitmap.pix32(scanline, pixel) = m_pcgpalette->pen(colour); |
| 1143 | } |
| 1144 | } |
| 1115 | 1145 | } |
| 1116 | 1146 | |
| 1117 | 1147 | // Text screen |
trunk/src/mess/drivers/x68k.c
| r30761 | r30762 | |
| 101 | 101 | Keyboard doesn't work properly (MFP USART). |
| 102 | 102 | Supervisor area set isn't implemented. |
| 103 | 103 | |
| 104 | | Some minor game-specific issues (at 28/12/08): |
| 105 | | Pacmania: Black squares on the maze (transparency?). |
| 104 | Some minor game-specific issues: |
| 106 | 105 | Salamander: System error when using keys in-game. No error if a joystick is used. |
| 107 | 106 | Some text is drawn incorrectly. |
| 108 | 107 | Dragon Buster: Text is black and unreadable. (Text layer actually covers it) |
| 109 | 108 | Tetris: Black dots over screen (text layer). |
| 110 | 109 | Parodius Da!: Black squares in areas. |
| 110 | PacLand: Leftover garbage on title screen |
| 111 | Akumajo Drac: Missing transparency, no sfx starting on second stage (m68000 only, 030 is fine), text layer not being cleared properly |
| 111 | 112 | |
| 112 | 113 | |
| 113 | 114 | More detailed documentation at http://x68kdev.emuvibes.com/iomap.html - if you can stand broken english :) |
| r30761 | r30762 | |
| 916 | 917 | |
| 917 | 918 | WRITE16_MEMBER(x68k_state::x68k_vid_w) |
| 918 | 919 | { |
| 919 | | int val; |
| 920 | | if(offset < 0x100) // Graphic layer palette |
| 921 | | { |
| 922 | | COMBINE_DATA(m_video.gfx_pal+offset); |
| 923 | | val = m_video.gfx_pal[offset]; |
| 924 | | m_gfxpalette->set_pen_color(offset, pal555(val, 6, 11, 1)); |
| 925 | | return; |
| 926 | | } |
| 927 | | |
| 928 | | if(offset >= 0x100 && offset < 0x200) // Text / Sprites / Tilemap palette |
| 929 | | { |
| 930 | | offset -= 0x100; |
| 931 | | COMBINE_DATA(m_video.text_pal + offset); |
| 932 | | val = m_video.text_pal[offset]; |
| 933 | | m_pcgpalette->set_pen_color(offset, pal555(val, 6, 11, 1)); |
| 934 | | return; |
| 935 | | } |
| 936 | | |
| 937 | 920 | switch(offset) |
| 938 | 921 | { |
| 939 | | case 0x200: |
| 922 | case 0x000: |
| 940 | 923 | COMBINE_DATA(m_video.reg); |
| 941 | 924 | break; |
| 942 | | case 0x280: // priority levels |
| 925 | case 0x080: // priority levels |
| 943 | 926 | COMBINE_DATA(m_video.reg+1); |
| 944 | 927 | if(ACCESSING_BITS_0_7) |
| 945 | 928 | { |
| r30761 | r30762 | |
| 961 | 944 | m_video.sprite_pri--; |
| 962 | 945 | } |
| 963 | 946 | break; |
| 964 | | case 0x300: |
| 947 | case 0x100: |
| 965 | 948 | COMBINE_DATA(m_video.reg+2); |
| 966 | 949 | break; |
| 967 | 950 | default: |
| r30761 | r30762 | |
| 971 | 954 | |
| 972 | 955 | READ16_MEMBER(x68k_state::x68k_vid_r) |
| 973 | 956 | { |
| 974 | | if(offset < 0x100) |
| 975 | | return m_video.gfx_pal[offset]; |
| 976 | | |
| 977 | | if(offset >= 0x100 && offset < 0x200) |
| 978 | | return m_video.text_pal[offset-0x100]; |
| 979 | | |
| 980 | 957 | switch(offset) |
| 981 | 958 | { |
| 982 | | case 0x200: |
| 959 | case 0x000: |
| 983 | 960 | return m_video.reg[0]; |
| 984 | | case 0x280: |
| 961 | case 0x080: |
| 985 | 962 | return m_video.reg[1]; |
| 986 | | case 0x300: |
| 963 | case 0x100: |
| 987 | 964 | return m_video.reg[2]; |
| 988 | 965 | default: |
| 989 | 966 | logerror("VC: Invalid video controller read (offset = 0x%04x)\n",offset); |
| r30761 | r30762 | |
| 1196 | 1173 | AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(x68k_gvram_r, x68k_gvram_w) |
| 1197 | 1174 | AM_RANGE(0xe00000, 0xe7ffff) AM_READWRITE(x68k_tvram_r, x68k_tvram_w) |
| 1198 | 1175 | AM_RANGE(0xe80000, 0xe81fff) AM_READWRITE(x68k_crtc_r, x68k_crtc_w) |
| 1199 | | AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w) |
| 1176 | AM_RANGE(0xe82000, 0xe821ff) AM_DEVREADWRITE("gfxpalette", palette_device, read, write) AM_SHARE("gfxpalette") |
| 1177 | AM_RANGE(0xe82200, 0xe823ff) AM_DEVREADWRITE("pcgpalette", palette_device, read, write) AM_SHARE("pcgpalette") |
| 1178 | AM_RANGE(0xe82400, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w) |
| 1200 | 1179 | AM_RANGE(0xe84000, 0xe85fff) AM_DEVREADWRITE("hd63450", hd63450_device, read, write) |
| 1201 | 1180 | AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE(x68k_areaset_r, x68k_areaset_w) |
| 1202 | 1181 | AM_RANGE(0xe88000, 0xe89fff) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff) |
| r30761 | r30762 | |
| 1231 | 1210 | AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(x68k_gvram_r, x68k_gvram_w) |
| 1232 | 1211 | AM_RANGE(0xe00000, 0xe7ffff) AM_READWRITE(x68k_tvram_r, x68k_tvram_w) |
| 1233 | 1212 | AM_RANGE(0xe80000, 0xe81fff) AM_READWRITE(x68k_crtc_r, x68k_crtc_w) |
| 1234 | | AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w) |
| 1213 | AM_RANGE(0xe82000, 0xe821ff) AM_DEVREADWRITE("gfxpalette", palette_device, read, write) AM_SHARE("gfxpalette") |
| 1214 | AM_RANGE(0xe82200, 0xe823ff) AM_DEVREADWRITE("pcgpalette", palette_device, read, write) AM_SHARE("pcgpalette") |
| 1215 | AM_RANGE(0xe82400, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w) |
| 1235 | 1216 | AM_RANGE(0xe84000, 0xe85fff) AM_DEVREADWRITE("hd63450", hd63450_device, read, write) |
| 1236 | 1217 | AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE(x68k_areaset_r, x68k_areaset_w) |
| 1237 | 1218 | AM_RANGE(0xe88000, 0xe89fff) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff) |
| r30761 | r30762 | |
| 1268 | 1249 | AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE16(x68k_gvram_r, x68k_gvram_w, 0xffffffff) |
| 1269 | 1250 | AM_RANGE(0xe00000, 0xe7ffff) AM_READWRITE16(x68k_tvram_r, x68k_tvram_w, 0xffffffff) |
| 1270 | 1251 | AM_RANGE(0xe80000, 0xe81fff) AM_READWRITE16(x68k_crtc_r, x68k_crtc_w,0xffffffff) |
| 1271 | | AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE16(x68k_vid_r, x68k_vid_w,0xffffffff) |
| 1252 | AM_RANGE(0xe82000, 0xe821ff) AM_DEVREADWRITE("gfxpalette", palette_device, read, write) AM_SHARE("gfxpalette") |
| 1253 | AM_RANGE(0xe82200, 0xe823ff) AM_DEVREADWRITE("pcgpalette", palette_device, read, write) AM_SHARE("pcgpalette") |
| 1254 | AM_RANGE(0xe82400, 0xe83fff) AM_READWRITE16(x68k_vid_r, x68k_vid_w,0xffffffff) |
| 1272 | 1255 | AM_RANGE(0xe84000, 0xe85fff) AM_DEVREADWRITE16("hd63450", hd63450_device, read, write, 0xffffffff) |
| 1273 | 1256 | AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE16(x68k_areaset_r, x68k_areaset_w,0xffffffff) |
| 1274 | 1257 | AM_RANGE(0xe88000, 0xe89fff) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff00ff) |
| r30761 | r30762 | |
| 1552 | 1535 | |
| 1553 | 1536 | // start VBlank timer |
| 1554 | 1537 | m_crtc.vblank = 1; |
| 1555 | | irq_time = machine().first_screen()->time_until_pos(m_crtc.reg[6],2); |
| 1538 | irq_time = m_screen->time_until_pos(m_crtc.reg[6],2); |
| 1556 | 1539 | m_vblank_irq->adjust(irq_time); |
| 1557 | 1540 | |
| 1558 | 1541 | // start HBlank timer |
| 1559 | | m_scanline_timer->adjust(machine().first_screen()->scan_period(), 1); |
| 1542 | m_scanline_timer->adjust(m_screen->scan_period(), 1); |
| 1560 | 1543 | |
| 1561 | 1544 | /// TODO: get callbacks to trigger these |
| 1562 | 1545 | m_mfpdev->i0_w(1); // alarm |