diff options
Diffstat (limited to 'src/mame/machine/archimds.cpp')
-rw-r--r-- | src/mame/machine/archimds.cpp | 77 |
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; |