mirror of
https://github.com/holub/mame
synced 2025-05-25 15:25:33 +03:00
Improved video DMA operations (4 usecs is another thing)
This commit is contained in:
parent
4f344bf3eb
commit
2bb61f771c
@ -111,27 +111,26 @@ static TIMER_CALLBACK( vidc_vblank )
|
|||||||
timer_adjust_oneshot(vbl_timer, machine->primary_screen->time_until_pos(vidc_regs[0xb4]), 0);
|
timer_adjust_oneshot(vbl_timer, machine->primary_screen->time_until_pos(vidc_regs[0xb4]), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* at about every ~4/4 USEC do a DMA transfer byte */
|
/* video DMA */
|
||||||
|
/* TODO: what type of DMA this is, burst or cycle steal? Docs doesn't explain it (4 usec is the DRAM refresh). */
|
||||||
static TIMER_CALLBACK( vidc_video_tick )
|
static TIMER_CALLBACK( vidc_video_tick )
|
||||||
{
|
{
|
||||||
address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
|
address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
|
||||||
static UINT8 *vram = memory_region(machine,"vram");
|
static UINT8 *vram = memory_region(machine,"vram");
|
||||||
|
UINT32 size;
|
||||||
|
|
||||||
|
size = vidc_vidend-vidc_vidstart;
|
||||||
|
|
||||||
|
for(vidc_vidcur = 0;vidc_vidcur < size;vidc_vidcur++)
|
||||||
vram[vidc_vidcur] = (space->read_byte(vidc_vidstart+vidc_vidcur+vidc_vidinit));
|
vram[vidc_vidcur] = (space->read_byte(vidc_vidstart+vidc_vidcur+vidc_vidinit));
|
||||||
|
|
||||||
vidc_vidcur++;
|
|
||||||
|
|
||||||
if(video_dma_on)
|
if(video_dma_on)
|
||||||
{
|
timer_adjust_oneshot(vid_timer, space->machine->primary_screen->time_until_pos(vidc_regs[0xb4]), 0);
|
||||||
if (vidc_vidcur >= vidc_vidend-vidc_vidstart)
|
|
||||||
vidc_vidcur = 0;
|
|
||||||
|
|
||||||
timer_adjust_oneshot(vid_timer, ATTOTIME_IN_USEC(1), 0);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
timer_adjust_oneshot(vid_timer, attotime_never, 0);
|
timer_adjust_oneshot(vid_timer, attotime_never, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* audio DMA */
|
||||||
static TIMER_CALLBACK( vidc_audio_tick )
|
static TIMER_CALLBACK( vidc_audio_tick )
|
||||||
{
|
{
|
||||||
address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
|
address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
|
||||||
@ -384,7 +383,7 @@ static READ32_HANDLER( ioc_ctrl_r )
|
|||||||
case CONTROL:
|
case CONTROL:
|
||||||
{
|
{
|
||||||
UINT8 i2c_data;
|
UINT8 i2c_data;
|
||||||
static UINT8 flyback;
|
static UINT8 flyback; //internal name for vblank here
|
||||||
int vert_pos;
|
int vert_pos;
|
||||||
|
|
||||||
vert_pos = space->machine->primary_screen->vpos();
|
vert_pos = space->machine->primary_screen->vpos();
|
||||||
@ -799,6 +798,7 @@ WRITE32_HANDLER(archimedes_vidc_w)
|
|||||||
(vidc_regs[VIDC_VBER] >= vidc_regs[VIDC_VBSR]))
|
(vidc_regs[VIDC_VBER] >= vidc_regs[VIDC_VBSR]))
|
||||||
{
|
{
|
||||||
rectangle visarea;
|
rectangle visarea;
|
||||||
|
attoseconds_t refresh;
|
||||||
|
|
||||||
visarea.min_x = 0;
|
visarea.min_x = 0;
|
||||||
visarea.min_y = 0;
|
visarea.min_y = 0;
|
||||||
@ -810,7 +810,10 @@ WRITE32_HANDLER(archimedes_vidc_w)
|
|||||||
visarea.max_x, visarea.max_y,
|
visarea.max_x, visarea.max_y,
|
||||||
vidc_regs[VIDC_HDER]-vidc_regs[VIDC_HDSR],vidc_regs[VIDC_VDER]-vidc_regs[VIDC_VDSR]+1);
|
vidc_regs[VIDC_HDER]-vidc_regs[VIDC_HDSR],vidc_regs[VIDC_VDER]-vidc_regs[VIDC_VDSR]+1);
|
||||||
|
|
||||||
space->machine->primary_screen->configure(vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR], visarea, space->machine->primary_screen->frame_period().attoseconds);
|
/* FIXME: pixel clock */
|
||||||
|
refresh = HZ_TO_ATTOSECONDS(16000000) * vidc_regs[VIDC_HCR] * vidc_regs[VIDC_VCR];
|
||||||
|
|
||||||
|
space->machine->primary_screen->configure(vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR], visarea, refresh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -881,7 +884,7 @@ WRITE32_HANDLER(archimedes_memc_w)
|
|||||||
if ((data>>10)&1)
|
if ((data>>10)&1)
|
||||||
{
|
{
|
||||||
vidc_vidcur = 0;
|
vidc_vidcur = 0;
|
||||||
timer_adjust_oneshot(vid_timer, ATTOTIME_IN_USEC(1), 0);
|
timer_adjust_oneshot(vid_timer, space->machine->primary_screen->time_until_pos(vidc_regs[0xb4]), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((data>>11)&1)
|
if ((data>>11)&1)
|
||||||
|
Loading…
Reference in New Issue
Block a user