summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/archimds.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/archimds.cpp')
-rw-r--r--src/mame/machine/archimds.cpp77
1 files changed, 52 insertions, 25 deletions
diff --git a/src/mame/machine/archimds.cpp b/src/mame/machine/archimds.cpp
index 35c2f74999a..9d5b46951f3 100644
--- a/src/mame/machine/archimds.cpp
+++ b/src/mame/machine/archimds.cpp
@@ -116,7 +116,7 @@ void archimedes_state::vidc_vblank()
archimedes_request_irq_a(ARCHIMEDES_IRQA_VBL);
// set up for next vbl
- m_vbl_timer->adjust(m_screen->time_until_pos(m_vidc_regs[0xb4]));
+ m_vbl_timer->adjust(m_screen->time_until_pos(m_vidc_vblank_time));
}
/* video DMA */
@@ -155,7 +155,7 @@ void archimedes_state::vidc_video_tick()
if(m_video_dma_on)
{
- m_vid_timer->adjust(m_screen->time_until_pos(m_vidc_regs[0xb4]));
+ m_vid_timer->adjust(m_screen->time_until_pos(m_vidc_vblank_time+1));
}
else
m_vid_timer->adjust(attotime::never);
@@ -204,9 +204,9 @@ void archimedes_state::vidc_audio_tick()
56, 48, 40, 32, 24, 16, 8, 0
};
- for(ch=0;ch<8;ch++)
+ for(ch=0; ch<8; ch++)
{
- uint8_t ulaw_temp = (space.read_byte(m_vidc_sndstart+m_vidc_sndcur + ch)) ^ 0xff;
+ uint8_t ulaw_temp = (space.read_byte(m_vidc_sndcur + ch)) ^ 0xff;
ulaw_comp = (ulaw_temp>>1) | ((ulaw_temp&1)<<7);
@@ -217,19 +217,24 @@ void archimedes_state::vidc_audio_tick()
m_vidc_sndcur+=8;
- if (m_vidc_sndcur >= (m_vidc_sndend-m_vidc_sndstart)+0x10)
+ if (m_vidc_sndcur >= m_vidc_sndendcur)
{
- m_vidc_sndcur = 0;
archimedes_request_irq_b(ARCHIMEDES_IRQB_SOUND_EMPTY);
if(!m_audio_dma_on)
{
m_snd_timer->adjust(attotime::never);
- for(ch=0;ch<8;ch++)
+ for(ch=0; ch<8; ch++)
{
m_dac[ch & 7]->write(0);
}
}
+ else
+ {
+ //printf("Chaining to next: start %x end %x\n", m_vidc_sndstart, m_vidc_sndend);
+ m_vidc_sndcur = m_vidc_sndstart;
+ m_vidc_sndendcur = m_vidc_sndend;
+ }
}
}
@@ -260,6 +265,10 @@ void archimedes_state::ioc_timer(int param)
// all timers always run
a310_set_timer(param);
+ // keep FIQ line ASSERTED if there are active requests
+ if (m_ioc_regs[FIQ_STATUS] & m_ioc_regs[FIQ_MASK])
+ archimedes_request_fiq(0);
+
// but only timers 0 and 1 generate IRQs
switch (param)
{
@@ -289,6 +298,9 @@ void archimedes_state::archimedes_reset()
m_ioc_regs[IRQ_STATUS_B] = 0x00; //set up IL[1] On
m_ioc_regs[FIQ_STATUS] = 0x80; //set up Force FIQ
m_ioc_regs[CONTROL] = 0xff;
+
+ m_vidc_vblank_time = 10000; // set a stupidly high time so it doesn't fire off
+ m_vbl_timer->adjust(attotime::never);
}
void archimedes_state::archimedes_init()
@@ -494,7 +506,7 @@ bool archimedes_state::check_floppy_ready()
}
if(floppy)
- return floppy->ready_r();
+ return !floppy->ready_r();
return false;
}
@@ -617,7 +629,7 @@ WRITE32_MEMBER( archimedes_state::ioc_ctrl_w )
archimedes_request_irq_a((data & 0x80) ? ARCHIMEDES_IRQA_FORCE : 0);
if(data & 0x08) //set up the VBLANK timer
- m_vbl_timer->adjust(m_screen->time_until_pos(m_vidc_regs[0xb4]));
+ m_vbl_timer->adjust(m_screen->time_until_pos(m_vidc_vblank_time));
break;
@@ -842,7 +854,7 @@ WRITE32_MEMBER(archimedes_state::archimedes_ioc_w)
---- x--- floppy controller reset
*/
m_fdc->dden_w(BIT(data, 1));
- if(data & 8)
+ if (!(data & 8))
m_fdc->soft_reset();
if(data & ~0xa)
printf("%02x Latch B\n",data);
@@ -901,7 +913,6 @@ void archimedes_state::vidc_dynamic_res_change()
*/
if((m_vidc_regs[VIDC_HCR] >= m_vidc_regs[VIDC_HBER]) &&
(m_vidc_regs[VIDC_HBER] >= m_vidc_regs[VIDC_HBSR]) &&
- (m_vidc_regs[VIDC_VCR] >= m_vidc_regs[VIDC_VBER]) &&
(m_vidc_regs[VIDC_VBER] >= m_vidc_regs[VIDC_VBSR]))
{
rectangle visarea;
@@ -912,13 +923,14 @@ void archimedes_state::vidc_dynamic_res_change()
visarea.max_x = m_vidc_regs[VIDC_HBER] - m_vidc_regs[VIDC_HBSR] - 1;
visarea.max_y = (m_vidc_regs[VIDC_VBER] - m_vidc_regs[VIDC_VBSR]) * (m_vidc_interlace+1);
- //logerror("Configuring: htotal %d vtotal %d border %d x %d display %d x %d\n",
+ m_vidc_vblank_time = m_vidc_regs[VIDC_VBER] * (m_vidc_interlace+1);
+ //logerror("Configuring: htotal %d vtotal %d border %d x %d display origin %d x %d vblank = %d\n",
// m_vidc_regs[VIDC_HCR], m_vidc_regs[VIDC_VCR],
// visarea.max_x, visarea.max_y,
- // m_vidc_regs[VIDC_HDER]-m_vidc_regs[VIDC_HDSR],m_vidc_regs[VIDC_VDER]-m_vidc_regs[VIDC_VDSR]+1);
+ // m_vidc_regs[VIDC_HDER]-m_vidc_regs[VIDC_HDSR],m_vidc_regs[VIDC_VDER]-m_vidc_regs[VIDC_VDSR]+1,
+ // m_vidc_vblank_time);
- /* FIXME: pixel clock */
- refresh = HZ_TO_ATTOSECONDS(pixel_rate[m_vidc_pixel_clk]*2) * m_vidc_regs[VIDC_HCR] * m_vidc_regs[VIDC_VCR];
+ refresh = HZ_TO_ATTOSECONDS(pixel_rate[m_vidc_pixel_clk]) * m_vidc_regs[VIDC_HCR] * m_vidc_regs[VIDC_VCR];
m_screen->configure(m_vidc_regs[VIDC_HCR], m_vidc_regs[VIDC_VCR] * (m_vidc_interlace+1), visarea, refresh);
}
@@ -984,6 +996,8 @@ WRITE32_MEMBER(archimedes_state::archimedes_vidc_w)
}
}
+ // update partials
+ machine().first_screen()->update_partial(machine().first_screen()->vpos());
}
else if (reg >= 0x60 && reg <= 0x7c)
{
@@ -1005,7 +1019,7 @@ WRITE32_MEMBER(archimedes_state::archimedes_vidc_w)
case VIDC_HCSR: m_vidc_regs[VIDC_HCSR] = ((val >> 13) & 0x7ff) + 6; break;
// #define VIDC_HIR 0x9c
- case VIDC_VCR: m_vidc_regs[VIDC_VCR] = ((val >> 14)<<1)+1; break;
+ case VIDC_VCR: m_vidc_regs[VIDC_VCR] = ((val >> 14))+1; break;
// #define VIDC_VSWR 0xa4
case VIDC_VBSR: m_vidc_regs[VIDC_VBSR] = (val >> 14)+1; break;
case VIDC_VDSR: m_vidc_regs[VIDC_VDSR] = (val >> 14)+1; break;
@@ -1023,7 +1037,19 @@ WRITE32_MEMBER(archimedes_state::archimedes_vidc_w)
vidc_dynamic_res_change();
}
- else if(reg == 0xe0)
+ else if (reg == 0xc0)
+ {
+ m_vidc_regs[reg] = val & 0xffff;
+
+ if (m_audio_dma_on)
+ {
+ double sndhz = 1e6 / ((m_vidc_regs[0xc0] & 0xff) + 2);
+ sndhz /= 8.0;
+ m_snd_timer->adjust(attotime::zero, 0, attotime::from_hz(sndhz));
+ //printf("VIDC: sound freq to %d, sndhz = %f\n", (val & 0xff)-2, sndhz);
+ }
+ }
+ else if (reg == 0xe0)
{
m_vidc_bpp_mode = ((val & 0x0c) >> 2);
m_vidc_interlace = ((val & 0x40) >> 6);
@@ -1099,19 +1125,20 @@ WRITE32_MEMBER(archimedes_state::archimedes_memc_w)
if ((data>>10)&1)
{
m_vidc_vidcur = 0;
- m_vid_timer->adjust(m_screen->time_until_pos(m_vidc_regs[0xb4]));
+ m_vid_timer->adjust(m_screen->time_until_pos(m_vidc_vblank_time+1));
}
- if ((data>>11)&1)
+ if ((data>>11) & 1)
{
- double sndhz;
-
- /* FIXME: is the frequency correct? */
- sndhz = (250000.0 / 2) / (double)((m_vidc_regs[0xc0]&0xff)+2);
-
- printf("MEMC: Starting audio DMA at %f Hz, buffer from %x to %x\n", sndhz, m_vidc_sndstart, m_vidc_sndend);
+ //printf("MEMC: Starting audio DMA at %d uSec, buffer from %x to %x\n", ((m_vidc_regs[0xc0]&0xff)-2)*8, m_vidc_sndstart, m_vidc_sndend);
+ double sndhz = 1e6 / ((m_vidc_regs[0xc0] & 0xff) + 2);
+ sndhz /= 8.0;
m_snd_timer->adjust(attotime::zero, 0, attotime::from_hz(sndhz));
+ //printf("MEMC: audio DMA start, sound freq %d, sndhz = %f\n", (m_vidc_regs[0xc0] & 0xff)-2, sndhz);
+
+ m_vidc_sndcur = m_vidc_sndstart;
+ m_vidc_sndendcur = m_vidc_sndend;
}
break;