--- xmil/io/ctc.c 2004/08/15 07:52:16 1.13 +++ xmil/io/ctc.c 2004/08/15 17:51:53 1.15 @@ -155,17 +155,17 @@ BRESULT ieitem_ctc(UINT id) { intr |= ch->intr; r = FALSE; if (intr) { -// for (i=0, bit=1; i<4; i++, bit<<=1) - for (i=4, bit=8; i--; bit>>=1) + for (i=0, bit=1; i<4; i++, bit<<=1) +// for (i=4, bit=8; i--; bit>>=1) { if (intr & bit) { if (!(ch->cmd[i] & 0x80)) { intr ^= bit; } -#if 0 // アークスのタイミング→あとで修正 +#if 1 // アークスのタイミング→あとで修正 else if (0) #elif 1 - if ((ch->countmax[i] - ch->count[i]) >= ch->range[i]) + else if ((ch->countmax[i] - ch->count[i]) >= ch->range[i]) #elif 0 else if (((ch->cmd[i] & 0x10) == 0) && ((ch->countmax[i] - ch->count[i]) >= (256 >> 1))) @@ -178,7 +178,8 @@ BRESULT ieitem_ctc(UINT id) { else if (!r) { r = TRUE; intr ^= bit; -// TRACEOUT(("ctc int %d %d", ch->num, i)); + ch->irq = (UINT8)i; +// TRACEOUT(("ctc int %d %d [%.2x]", ch->num, i, ch->cmd[i])); Z80_INTERRUPT((REG8)(ch->vector + (i << 1))); } } @@ -194,6 +195,30 @@ BRESULT ieitem_ctc(UINT id) { return(r); } +void ieeoi_ctc(UINT id) { + + CTCCH *ch; + REG8 intr; + UINT curirq; + + ch = ctc.ch + (id - IEVENT_CTC0); + intr = ctcwork(ch) | ch->intr; + curirq = ch->irq; + if (intr & (1 << curirq)) { // 割り込み中に割り込んだ… + // カウンタが0でなければ割り込みを消す + if ((ch->countmax[curirq] - ch->count[curirq]) >= ch->range[curirq]) { + intr ^= (1 << curirq); + } + } + ch->intr = intr; + if (intr) { + ievent_set(id); + } + else { + ctcnextevent(ch); + } +} + // ---- @@ -219,8 +244,7 @@ static void ctcch_o(CTCCH *ch, UINT port ch->scale[port] = scale; ch->countmax[port] = count << scale; ch->count[port] = count << scale; -// ch->range[port] = ((count + 3) >> 2) << scale; - ch->range[port] = 4 << scale; + ch->range[port] = 1 << scale; ch->cmd[port] &= ~6; ctcnextevent(ch); }