--- xmil/io/ctc.c 2004/08/11 12:08:16 1.5 +++ xmil/io/ctc.c 2004/08/13 02:16:33 1.9 @@ -6,6 +6,40 @@ #include "ievent.h" +static SINT32 minclock(const CTCCH *ch) { + + UINT32 event; + UINT i; + UINT32 clock; + + event = 0x01000000; + for (i=0; i<3; i++) { + if ((ch->cmd[i] & 0x82) == 0x80) { + clock = ch->count[i]; + if (ch->cmd[i] & 0x40) { + clock = clock * 2; + } + event = min(event, clock); + } + } + if ((ch->cmd[3] & 0x82) == 0x80) { + clock = ch->count[3]; + if (ch->cmd[3] & 0x40) { + clock = (clock - 1) * ch->countmax[0]; + clock += ch->count[0]; + if (ch->cmd[0] & 0x40) { + clock = clock * 2; + } + } + event = min(event, clock); + } + event = event / 2; + if (event == 0) { + event = 1; + } + return(event); +} + static REG8 ctcwork(CTCCH *ch) { UINT32 baseclock; @@ -93,7 +127,6 @@ static void ctcstep(CTCCH *ch) { intr = ctcwork(ch); if (intr) { ch->intr |= intr; - TRACEOUT(("-> ievent_set")); ievent_set(IEVENT_CTC0 + ch->num); } } @@ -101,39 +134,12 @@ static void ctcstep(CTCCH *ch) { static void ctcnextevent(CTCCH *ch) { UINT32 event; - UINT i; - UINT32 clock; if (ch->intr) { return; } - event = 0x04000000; - for (i=0; i<3; i++) { - if ((ch->cmd[i] & 0x82) == 0x80) { - clock = ch->count[i]; - if (ch->cmd[i] & 0x40) { - clock = clock * 2; - } - TRACEOUT(("ch %d -> %d :%.2x:%.8x", i, clock, ch->cmd[i], ch->count[i])); - event = min(event, clock); - } - } - if ((ch->cmd[3] & 0x82) == 0x80) { - clock = ch->count[3]; - if (ch->cmd[3] & 0x40) { - clock = (clock - 1) * ch->countmax[0]; - clock += ch->count[0]; - if (ch->cmd[0] & 0x40) { - clock = clock * 2; - } - } - TRACEOUT(("ch %d -> %d", 3, clock)); - event = min(event, clock); - } - event /= 2; - event *= pccore.multiple; + event = minclock(ch) * pccore.multiple; nevent_set(NEVENT_CTC0 + ch->num, event, neitem_ctc, NEVENT_ABSOLUTE); - TRACEOUT(("ctc -> %d (%x)", event, event)); } void neitem_ctc(UINT id) { @@ -145,7 +151,6 @@ void neitem_ctc(UINT id) { intr = ctcwork(ch); if (intr) { ch->intr |= intr; - TRACEOUT(("-> ievent_set")); ievent_set(IEVENT_CTC0 + ch->num); } else { @@ -164,13 +169,14 @@ BRESULT ieitem_ctc(UINT id) { ch = ctc.ch + (id - IEVENT_CTC0); intr = ctcwork(ch); intr |= ch->intr; - TRACEOUT(("ieitem_ctc %d - %.2x", id - IEVENT_CTC0, intr)); r = FALSE; if (intr) { for (i=0, bit=1; i<4; i++, bit<<=1) { if (intr & bit) { #if 1 // アークスのタイミング→あとで修正 if (0) +#elif 1 + if ((ch->countmax[i] - ch->count[i]) >= 256) #elif 0 if (((ch->count[i] * 17) >> 4) < ch->countmax[i]) #else @@ -185,16 +191,14 @@ BRESULT ieitem_ctc(UINT id) { else if (!r) { r = TRUE; intr ^= bit; - TRACEOUT(("z80int %d", i)); - Z80_INT((REG8)(ch->vector + (i << 1))); +// TRACEOUT(("ctc int %d %d", ch->num, i)); + Z80_INTERRUPT((REG8)(ch->vector + (i << 1))); } } } } - TRACEOUT(("--> %.2x", intr)); ch->intr = intr; if (intr) { - TRACEOUT(("-> ievent_set")); ievent_set(IEVENT_CTC0 + ch->num); } else { @@ -204,84 +208,6 @@ BRESULT ieitem_ctc(UINT id) { } - - -#if 0 -void x1_ctc_int(void) { - - CTCCH *ch; - UINT r; - SINT32 clk0; - SINT32 clk4; - SINT32 clk2; - SINT32 subcnt; - UINT i; - REG8 bit; - REG8 ctcint_flg; - - ctcint_flg = Z80_ABLEINTERRUPT(); - - clk4 = pccore.HSYNC_CLK; - clk2 = clk4 >> 1; - - if (pccore.ROM_TYPE >= 2) { - ch = ctc.ch + 0; - r = 3; - } - else { - ch = ctc.ch + 2; - r = 1; - } - - do { - clk0 = 0; - bit = 1; - for (i=0; i<4; i++) { - if (!(ch->cmd[i] & 0x02)) { - if (ch->count[i] <= 0) { - ch->count[i] += ch->countmax[i]; - } - if (!(ch->cmd[i] & 0x40)) { - subcnt = clk4; - } - else if (i == 3) { - subcnt = clk0; - } - else { - subcnt = clk2; - } - ch->count[i] -= subcnt; - if (ch->count[i] <= 0) { - ch->int_flag |= bit; - if (!i) { - clk0 = 1; - } - } - } - bit <<= 1; - } - - bit = 1; - for (i=0; i<4; i++) { - if (ch->int_flag & bit) { - if (!(ch->cmd[i] & 0x80)) { - ch->int_flag ^= bit; - } - else if (ctcint_flg) { - ctcint_flg = 0; - ch->int_flag ^= bit; -// TRACEOUT(("ctc%u int -- %d", 3 - r, i)); - Z80_INT((REG8)(ch->vector + (i << 1))); - } - } - bit <<= 1; - } - ch++; - } while(--r); -} -#endif - - // ---- static void ctcch_o(CTCCH *ch, UINT port, REG8 value) { @@ -307,6 +233,7 @@ static void ctcch_o(CTCCH *ch, UINT port } } count <<= scale; + ch->scale[port] = scale; ch->countmax[port] = count; ch->count[port] = count; ch->cmd[port] &= ~6; @@ -324,24 +251,13 @@ static void ctcch_o(CTCCH *ch, UINT port static REG8 ctcch_i(CTCCH *ch, UINT port) { - REG8 scale; - port &= 3; if (port != 3) { return(ch->basecnt[port]); } else { ctcstep(ch); - scale = 0; - if (!(ch->cmd[3] & 0x40)) { - if (ch->cmd[3] & 0x20) { - scale = 8; - } - else { - scale = 4; - } - } - return((REG8)(ch->count[3] >> scale)); + return((REG8)(ch->count[3] >> ch->scale[3])); } } @@ -400,6 +316,7 @@ void ctc_reset(void) { ctc.ch[i].num = (UINT8)i; for (j=0; j<4; j++) { ctc.ch[i].cmd[j] = 0x03; + ctc.ch[i].scale[j] = 8; ctc.ch[i].count[j] = 256 << 8; ctc.ch[i].countmax[j] = 256 << 8; }