diff options
| author | 2010-04-18 21:46:20 +0000 | |
|---|---|---|
| committer | 2010-04-18 21:46:20 +0000 | |
| commit | de242278cf204b455be8cb7874e4e75a5bfb017b (patch) | |
| tree | ea4c7b5dee938cec8cdf6ab5629dc54dbf29f4f8 /src | |
| parent | 2d0b13909fb9ad4953b90e2e131c625ae219dbdf (diff) | |
Implemented H-Blank IRQ modes
Diffstat (limited to 'src')
| -rw-r--r-- | src/mame/video/dc.c | 102 |
1 files changed, 63 insertions, 39 deletions
diff --git a/src/mame/video/dc.c b/src/mame/video/dc.c index 6aee7b79928..4b29665e6a2 100644 --- a/src/mame/video/dc.c +++ b/src/mame/video/dc.c @@ -23,8 +23,27 @@ static int vblc=0; /* PVR TA macro defines */ /* +SPG_HBLANK_INT +---- --xx xxxx xxxx ---- ---- ---- ---- hblank_in_interrupt +---- ---- ---- ---- --xx ---- ---- ---- hblank_int_mode +---- ---- ---- ---- ---- --xx xxxx xxxx line_comp_val +*/ +#define spg_hblank_in_irq ((pvrta_regs[SPG_HBLANK_INT] & 0x03ff0000) >> 16) +#define spg_hblank_int_mode ((pvrta_regs[SPG_HBLANK_INT] & 0x00003000) >> 12) +#define spg_line_comp_val ((pvrta_regs[SPG_HBLANK_INT] & 0x000003ff) >> 0) + +/* +SPG_VBLANK_INT +---- --xx xxxx xxxx ---- ---- ---- ---- vblank_out_interrupt_line_number +---- ---- ---- ---- ---- --xx xxxx xxxx vblank_in_interrupt_line_number +*/ +#define spg_vblank_out_irq_line_num ((pvrta_regs[SPG_VBLANK_INT] & 0x03ff0000) >> 16) +#define spg_vblank_in_irq_line_num ((pvrta_regs[SPG_VBLANK_INT] & 0x000003ff) >> 0) + + +/* VO_BORDER_COL ----- ---x ---- ---- ---- ---- ---- ---- Chroma +---- ---x ---- ---- ---- ---- ---- ---- Chroma ;suchie3 sets 0xff there, maybe it's 8 bits too? ---- ---- xxxx xxxx ---- ---- ---- ---- Red ---- ---- ---- ---- xxxx xxxx ---- ---- Green ---- ---- ---- ---- ---- ---- xxxx xxxx Blue @@ -39,8 +58,8 @@ SPG_HBLANK ---- ---- --xx xxxx xxxx ---- ---- ---- vbend ---- ---- ---- ---- ---- --xx xxxx xxxx vbstart */ -#define pvrta_hbend ((pvrta_regs[SPG_HBLANK] & 0x03ff0000) >> 16) -#define pvrta_hbstart ((pvrta_regs[SPG_HBLANK] & 0x000003ff) >> 0) +#define spg_hbend ((pvrta_regs[SPG_HBLANK] & 0x03ff0000) >> 16) +#define spg_hbstart ((pvrta_regs[SPG_HBLANK] & 0x000003ff) >> 0) /* @@ -48,16 +67,16 @@ SPG_LOAD ---- ---- --xx xxxx xxxx ---- ---- ---- vcount ---- ---- ---- ---- ---- --xx xxxx xxxx hcount */ -#define pvrta_vcount ((pvrta_regs[SPG_LOAD] & 0x03ff0000) >> 16) -#define pvrta_hcount ((pvrta_regs[SPG_LOAD] & 0x000003ff) >> 0) +#define spg_vcount ((pvrta_regs[SPG_LOAD] & 0x03ff0000) >> 16) +#define spg_hcount ((pvrta_regs[SPG_LOAD] & 0x000003ff) >> 0) /* SPG_VBLANK ---- ---- --xx xxxx xxxx ---- ---- ---- vbend ---- ---- ---- ---- ---- --xx xxxx xxxx vbstart */ -#define pvrta_vbend ((pvrta_regs[SPG_VBLANK] & 0x03ff0000) >> 16) -#define pvrta_vbstart ((pvrta_regs[SPG_VBLANK] & 0x000003ff) >> 0) +#define spg_vbend ((pvrta_regs[SPG_VBLANK] & 0x03ff0000) >> 16) +#define spg_vbstart ((pvrta_regs[SPG_VBLANK] & 0x000003ff) >> 0) /* @@ -70,19 +89,19 @@ VO_CONTROL ---- ---- ---- ---- ---- ---- ---- --x- vsync_pol ---- ---- ---- ---- ---- ---- ---- ---x hsync_pol */ -#define pvrta_pclk_delay ((pvrta_regs[VO_CONTROL] & 0x003f0000) >> 16) -#define pvrta_pixel_double ((pvrta_regs[VO_CONTROL] & 0x00000100) >> 8) -#define pvrta_field_mode ((pvrta_regs[VO_CONTROL] & 0x000000f0) >> 4) -#define pvrta_blank_video ((pvrta_regs[VO_CONTROL] & 0x00000008) >> 3) -#define pvrta_blank_pol ((pvrta_regs[VO_CONTROL] & 0x00000004) >> 2) -#define pvrta_vsync_pol ((pvrta_regs[VO_CONTROL] & 0x00000002) >> 1) -#define pvrta_hsync_pol ((pvrta_regs[VO_CONTROL] & 0x00000001) >> 0) +#define spg_pclk_delay ((pvrta_regs[VO_CONTROL] & 0x003f0000) >> 16) +#define spg_pixel_double ((pvrta_regs[VO_CONTROL] & 0x00000100) >> 8) +#define spg_field_mode ((pvrta_regs[VO_CONTROL] & 0x000000f0) >> 4) +#define spg_blank_video ((pvrta_regs[VO_CONTROL] & 0x00000008) >> 3) +#define spg_blank_pol ((pvrta_regs[VO_CONTROL] & 0x00000004) >> 2) +#define spg_vsync_pol ((pvrta_regs[VO_CONTROL] & 0x00000002) >> 1) +#define spg_hsync_pol ((pvrta_regs[VO_CONTROL] & 0x00000001) >> 0) /* VO_STARTX ---- ---- ---- ---- ---- ---x xxxx xxxx horzontal start position */ -#define pvrta_horz_start_pos ((pvrta_regs[VO_STARTX] & 0x000003ff) >> 0) +#define vo_horz_start_pos ((pvrta_regs[VO_STARTX] & 0x000003ff) >> 0) /* VO_STARTY @@ -90,8 +109,8 @@ VO_STARTY ---- ---- ---- ---- ---- ---x xxxx xxxx vertical start position on field 1 */ -#define pvrta_vert_start_pos_f2 ((pvrta_regs[VO_STARTY] & 0x03ff0000) >> 16) -#define pvrta_vert_start_pos_f1 ((pvrta_regs[VO_STARTY] & 0x000003ff) >> 0) +#define vo_vert_start_pos_f2 ((pvrta_regs[VO_STARTY] & 0x03ff0000) >> 16) +#define vo_vert_start_pos_f1 ((pvrta_regs[VO_STARTY] & 0x000003ff) >> 0) @@ -1069,14 +1088,14 @@ READ64_HANDLER( pvr_ta_r ) fieldnum = (video_screen_get_frame_number(space->machine->primary_screen) & 1) ? 1 : 0; vsync = video_screen_get_vblank(space->machine->primary_screen) ? 1 : 0; - if(pvrta_vsync_pol) { vsync^=1; } + if(spg_vsync_pol) { vsync^=1; } hsync = video_screen_get_hblank(space->machine->primary_screen) ? 1 : 0; - if(pvrta_hsync_pol) { hsync^=1; } + if(spg_hsync_pol) { hsync^=1; } /* FIXME: following is just a wild guess */ blank = (video_screen_get_vblank(space->machine->primary_screen) | video_screen_get_hblank(space->machine->primary_screen)) ? 0 : 1; - if(pvrta_blank_pol) { blank^=1; } + if(spg_blank_pol) { blank^=1; } pvrta_regs[reg] = (vsync << 13) | (hsync << 12) | (blank << 11) | (fieldnum << 10) | (video_screen_get_vpos(space->machine->primary_screen) & 0x1ff); break; @@ -1334,11 +1353,11 @@ WRITE64_HANDLER( pvr_ta_w ) rectangle visarea = *video_screen_get_visible_area(space->machine->primary_screen); /* FIXME: right visible area calculations aren't known yet*/ visarea.min_x = 0; - visarea.max_x = ((pvrta_hbstart - pvrta_hbend - pvrta_horz_start_pos) <= 0x180 ? 320 : 640) - 1; + visarea.max_x = ((spg_hbstart - spg_hbend - vo_horz_start_pos) <= 0x180 ? 320 : 640) - 1; visarea.min_y = 0; - visarea.max_y = ((pvrta_vbstart - pvrta_vbend - pvrta_vert_start_pos_f1) <= 0x100 ? 240 : 480) - 1; + visarea.max_y = ((spg_vbstart - spg_vbend - vo_vert_start_pos_f1) <= 0x100 ? 240 : 480) - 1; - video_screen_configure(space->machine->primary_screen, pvrta_hbstart, pvrta_vbstart, &visarea, video_screen_get_frame_period(space->machine->primary_screen).attoseconds ); + video_screen_configure(space->machine->primary_screen, spg_hbstart, spg_vbstart, &visarea, video_screen_get_frame_period(space->machine->primary_screen).attoseconds ); } break; } @@ -2223,7 +2242,7 @@ static void pvr_drawframebuffer(bitmap_t *bitmap,const rectangle *cliprect) for (y=0;y < dy;y++) { addrp=pvrta_regs[FB_R_SOF1]+y*xi*2; - if(pvrta_pixel_double) + if(spg_pixel_double) { for (x=0;x < xi;x++) { @@ -2267,7 +2286,7 @@ static void pvr_drawframebuffer(bitmap_t *bitmap,const rectangle *cliprect) for (y=0;y < dy;y++) { addrp=pvrta_regs[FB_R_SOF1]+y*xi*2; - if(pvrta_pixel_double) + if(spg_pixel_double) { for (x=0;x < xi;x++) { @@ -2312,7 +2331,7 @@ static void pvr_drawframebuffer(bitmap_t *bitmap,const rectangle *cliprect) for (y=0;y < dy;y++) { addrp=pvrta_regs[FB_R_SOF1]+y*xi*2; - if(pvrta_pixel_double) + if(spg_pixel_double) { for (x=0;x < xi;x++) { @@ -2356,7 +2375,7 @@ static void pvr_drawframebuffer(bitmap_t *bitmap,const rectangle *cliprect) for (y=0;y < dy;y++) { addrp=pvrta_regs[FB_R_SOF1]+y*xi*2; - if(pvrta_pixel_double) + if(spg_pixel_double) { for (x=0;x < xi;x++) { @@ -2498,19 +2517,22 @@ static TIMER_CALLBACK(vbout) scanline = 0; timer_adjust_oneshot(vbout_timer, attotime_never, 0); - timer_adjust_oneshot(hbin_timer, video_screen_get_time_until_pos(machine->primary_screen, 0, 640), 0); + timer_adjust_oneshot(hbin_timer, video_screen_get_time_until_pos(machine->primary_screen, 0, spg_hblank_in_irq-1), 0); } static TIMER_CALLBACK(hbin) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_HBL_IN; // H Blank-in interrupt - dc_update_interrupt_status(machine); + if((scanline == spg_line_comp_val) || (spg_hblank_int_mode & 2)) // FIXME: is there any real difference between modes 0 and 1? + { + dc_sysctrl_regs[SB_ISTNRM] |= IST_HBL_IN; // H Blank-in interrupt + dc_update_interrupt_status(machine); + } // printf("hbin on scanline %d\n",scanline); scanline++; - timer_adjust_oneshot(hbin_timer, video_screen_get_time_until_pos(machine->primary_screen, scanline, 640), 0); + timer_adjust_oneshot(hbin_timer, video_screen_get_time_until_pos(machine->primary_screen, scanline, spg_hblank_in_irq-1), 0); } @@ -2552,13 +2574,15 @@ VIDEO_START(dc) pvrta_regs[PVRID]=0x17fd11db; pvrta_regs[REVISION]=0x11; /* FIXME: move the following regs inside MACHINE_RESET */ - pvrta_regs[VO_CONTROL]=0x108; - pvrta_regs[SOFTRESET]=0x7; - pvrta_regs[VO_STARTX]=0x0000009d; - pvrta_regs[VO_STARTY]=0x00150015; - pvrta_regs[SPG_HBLANK]=0x007e0345; - pvrta_regs[SPG_LOAD]=0x01060359; - pvrta_regs[SPG_VBLANK]=01500104; + pvrta_regs[VO_CONTROL]= 0x00000108; + pvrta_regs[SOFTRESET]= 0x00000007; + pvrta_regs[VO_STARTX]= 0x0000009d; + pvrta_regs[VO_STARTY]= 0x00150015; + pvrta_regs[SPG_HBLANK]= 0x007e0345; + pvrta_regs[SPG_LOAD]= 0x01060359; + pvrta_regs[SPG_VBLANK]= 0x01500104; + pvrta_regs[SPG_HBLANK_INT]= 0x031d0000; + pvrta_regs[SPG_VBLANK_INT]= 0x01500104; state_ta.tafifo_pos=0; state_ta.tafifo_mask=7; @@ -2628,7 +2652,7 @@ VIDEO_UPDATE(dc) bitmap_fill(bitmap,cliprect,MAKE_ARGB(0xff,vo_border_R,vo_border_G,vo_border_B)); //FIXME: Chroma bit? - if(!pvrta_blank_video) + if(!spg_blank_video) pvr_drawframebuffer(bitmap,cliprect); // update this here so we only do string lookup once per frame |
