--- np2/cbus/board14.c 2003/10/16 17:58:00 1.1 +++ np2/cbus/board14.c 2003/12/08 00:55:30 1.3 @@ -7,18 +7,112 @@ #include "fmboard.h" +// どうも 8253C-2は 4MHz/16らすい? +// とりあえず 1996800/8を入力してみる... (ver0.71) + + +// ---- 8253C-2 + +static UINT pit3_latch(void) { + + SINT32 clock; + + clock = nevent_getremain(NEVENT_MUSICGEN); + if (clock >= 0) { + clock /= pc.multiple; + clock /= 8; + if (pc.baseclock == PCBASECLOCK25) { + clock = clock * 13 / 16; + } + return(clock); + } + return(0); +} + +static void pit3_setflag(REG8 value) { + + pit.flag[3] = 0; + if (value & 0x30) { + pit.mode[3] = value; + } + else { + pit.mode[3] &= ~0x30; + pit.latch[3] = pit3_latch(); + } +} + +static BOOL pit3_setcount(REG8 value) { + + switch(pit.mode[3] & 0x30) { + case 0x10: // access low + pit.value[3] = value; + break; + + case 0x20: // access high + pit.value[3] = value << 8; + break; + + case 0x30: // access word + if (!(pit.flag[3] & 2)) { + pit.value[3] &= 0xff00; + pit.value[3] += value; + pit.flag[3] ^= 2; + return(TRUE); + } + pit.value[3] &= 0x00ff; + pit.value[3] += value << 8; + pit.flag[3] ^= 2; + break; + } + return(FALSE); +} + +static REG8 pit3_getcount(void) { + + REG8 ret; + REG16 w; + + if (!(pit.mode[3] & 0x30)) { + w = pit.latch[3]; + } + else { + w = pit3_latch(); + } + switch(pit.mode[3] & 0x30) { + case 0x10: // access low + return((UINT8)w); + + case 0x20: // access high + return((UINT8)(w >> 8)); + } + // access word + if (!(pit.flag[3] & 1)) { + ret = (UINT8)w; + } + else { + ret = (UINT8)(w >> 8); + } + pit.flag[3] ^= 1; + return(ret); +} + + // ---- intr static void setmusicgenevent(BOOL absolute) { SINT32 cnt; - if (pit.value[3].w > 8) { // 根拠なし - cnt = pc.multiple * pit.value[3].w; + if (pit.value[3] > 4) { // 根拠なし + cnt = pc.multiple * pit.value[3]; } else { cnt = pc.multiple << 16; } + if (pc.baseclock == PCBASECLOCK25) { + cnt = cnt * 16 / 13; // cnt * 2457600 / 1996800 + } + cnt *= 8; nevent_set(NEVENT_MUSICGEN, cnt, musicgenint, absolute); } @@ -37,19 +131,19 @@ void musicgenint(NEVENTITEM item) { // ---- I/O -static void IOOUTCALL musicgen_o088(UINT port, BYTE dat) { +static void IOOUTCALL musicgen_o088(UINT port, REG8 dat) { musicgen.porta = dat; (void)port; } -static void IOOUTCALL musicgen_o08a(UINT port, BYTE dat) { +static void IOOUTCALL musicgen_o08a(UINT port, REG8 dat) { musicgen.portb = dat; (void)port; } -static void IOOUTCALL musicgen_o08c(UINT port, BYTE dat) { +static void IOOUTCALL musicgen_o08c(UINT port, REG8 dat) { if (dat & 0x80) { if (!(musicgen.portc & 0x80)) { @@ -60,7 +154,7 @@ static void IOOUTCALL musicgen_o08c(UINT musicgen.sync = 0; sound_sync(); musicgen.key[musicgen.ch] = dat; - tms3631_setkey(&tms3631, (BYTE)musicgen.ch, dat); + tms3631_setkey(&tms3631, (REG8)musicgen.ch, dat); } else if ((!(dat & 0x40)) && (musicgen.portc & 0x40)) { musicgen.sync = 1; @@ -71,7 +165,7 @@ static void IOOUTCALL musicgen_o08c(UINT (void)port; } -static void IOOUTCALL musicgen_o188(UINT port, BYTE dat) { +static void IOOUTCALL musicgen_o188(UINT port, REG8 dat) { sound_sync(); musicgen.mask = dat; @@ -79,59 +173,64 @@ static void IOOUTCALL musicgen_o188(UINT (void)port; } -static void IOOUTCALL musicgen_o18c(UINT port, BYTE dat) { +static void IOOUTCALL musicgen_o18c(UINT port, REG8 dat) { - itimer_setcount(3, dat); - setmusicgenevent(NEVENT_ABSOLUTE); + if (!pit3_setcount(dat)) { + setmusicgenevent(NEVENT_ABSOLUTE); + } (void)port; } -static void IOOUTCALL musicgen_o18e(UINT port, BYTE dat) { +static void IOOUTCALL musicgen_o18e(UINT port, REG8 dat) { - itimer_setflag(3, dat); + pit3_setflag(dat); (void)port; } -static BYTE IOINPCALL musicgen_i088(UINT port) { +static REG8 IOINPCALL musicgen_i088(UINT port) { (void)port; return(musicgen.porta); } -static BYTE IOINPCALL musicgen_i08a(UINT port) { +static REG8 IOINPCALL musicgen_i08a(UINT port) { (void)port; return(musicgen.portb); } -static BYTE IOINPCALL musicgen_i08c(UINT port) { +static REG8 IOINPCALL musicgen_i08c(UINT port) { (void)port; return(musicgen.portc); } -static BYTE IOINPCALL musicgen_i08e(UINT port) { +static REG8 IOINPCALL musicgen_i08e(UINT port) { (void)port; return(0x08); } -static BYTE IOINPCALL musicgen_i188(UINT port) { +static REG8 IOINPCALL musicgen_i188(UINT port) { (void)port; return(musicgen.mask); } -static BYTE IOINPCALL musicgen_i18c(UINT port) { +static REG8 IOINPCALL musicgen_i18c(UINT port) { (void)port; - return(itimer_getcount(3)); + return(pit3_getcount()); } -static BYTE IOINPCALL musicgen_i18e(UINT port) { +static REG8 IOINPCALL musicgen_i18e(UINT port) { (void)port; +#if 1 + return(0x80); // INT-5 +#else return(0x40); // INT-5 +#endif } @@ -165,10 +264,10 @@ void board14_bind(void) { void board14_allkeymake(void) { - int i; + REG8 i; for (i=0; i<8; i++) { - tms3631_setkey(&tms3631, (BYTE)i, musicgen.key[i]); + tms3631_setkey(&tms3631, i, musicgen.key[i]); } }