| version 1.1, 2003/10/16 17:58:00 | version 1.2, 2003/11/12 20:02:54 | 
| Line 7 | Line 7 | 
 | #include        "fmboard.h" | #include        "fmboard.h" | 
 |  |  | 
 |  |  | 
 |  | // どうも 8253C-2は 4MHz/16らすい? | 
 |  | // とりあえず 1996800/8を入力してみる... (ver0.71) | 
 |  |  | 
 |  |  | 
 |  | // ---- 8253C-2 | 
 |  |  | 
 |  | static UINT16 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((UINT16)clock); | 
 |  | } | 
 |  | return(0); | 
 |  | } | 
 |  |  | 
 |  | static void pit3_setflag(BYTE 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(BYTE 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 BYTE pit3_getcount(void) { | 
 |  |  | 
 |  | BYTE    ret; | 
 |  | UINT16  w; | 
 |  |  | 
 |  | if (!(pit.mode[3] & 0x30)) { | 
 |  | w = pit.latch[3]; | 
 |  | } | 
 |  | else { | 
 |  | w = pit3_latch(); | 
 |  | } | 
 |  | switch(pit.mode[3] & 0x30) { | 
 |  | case 0x10:                                              // access low | 
 |  | return((BYTE)w); | 
 |  |  | 
 |  | case 0x20:                                              // access high | 
 |  | return((BYTE)(w >> 8)); | 
 |  | } | 
 |  | // access word | 
 |  | if (!(pit.flag[3] & 1)) { | 
 |  | ret = (BYTE)w; | 
 |  | } | 
 |  | else { | 
 |  | ret = (BYTE)(w >> 8); | 
 |  | } | 
 |  | pit.flag[3] ^= 1; | 
 |  | return(ret); | 
 |  | } | 
 |  |  | 
 |  |  | 
 | // ---- intr | // ---- intr | 
 |  |  | 
 | static void setmusicgenevent(BOOL absolute) { | static void setmusicgenevent(BOOL absolute) { | 
 |  |  | 
 | SINT32  cnt; | SINT32  cnt; | 
 |  |  | 
| if (pit.value[3].w > 8) {                                               // 根拠なし | if (pit.value[3] > 4) {                                         // 根拠なし | 
| cnt = pc.multiple * pit.value[3].w; | cnt = pc.multiple * pit.value[3]; | 
 | } | } | 
 | else { | else { | 
 | cnt = pc.multiple << 16; | cnt = pc.multiple << 16; | 
 | } | } | 
 |  | if (pc.baseclock == PCBASECLOCK25) { | 
 |  | cnt = cnt * 16 / 13;                                    // cnt * 2457600 / 1996800 | 
 |  | } | 
 |  | cnt *= 8; | 
 | nevent_set(NEVENT_MUSICGEN, cnt, musicgenint, absolute); | nevent_set(NEVENT_MUSICGEN, cnt, musicgenint, absolute); | 
 | } | } | 
 |  |  | 
| Line 81  static void IOOUTCALL musicgen_o188(UINT | Line 175  static void IOOUTCALL musicgen_o188(UINT | 
 |  |  | 
 | static void IOOUTCALL musicgen_o18c(UINT port, BYTE dat) { | static void IOOUTCALL musicgen_o18c(UINT port, BYTE dat) { | 
 |  |  | 
| itimer_setcount(3, dat); | if (!pit3_setcount(dat)) { | 
| setmusicgenevent(NEVENT_ABSOLUTE); | setmusicgenevent(NEVENT_ABSOLUTE); | 
|  | } | 
 | (void)port; | (void)port; | 
 | } | } | 
 |  |  | 
 | static void IOOUTCALL musicgen_o18e(UINT port, BYTE dat) { | static void IOOUTCALL musicgen_o18e(UINT port, BYTE dat) { | 
 |  |  | 
| itimer_setflag(3, dat); | pit3_setflag(dat); | 
 | (void)port; | (void)port; | 
 | } | } | 
 |  |  | 
| Line 125  static BYTE IOINPCALL musicgen_i188(UINT | Line 220  static BYTE IOINPCALL musicgen_i188(UINT | 
 | static BYTE IOINPCALL musicgen_i18c(UINT port) { | static BYTE IOINPCALL musicgen_i18c(UINT port) { | 
 |  |  | 
 | (void)port; | (void)port; | 
| return(itimer_getcount(3)); | return(pit3_getcount()); | 
 | } | } | 
 |  |  | 
 | static BYTE IOINPCALL musicgen_i18e(UINT port) { | static BYTE IOINPCALL musicgen_i18e(UINT port) { | 
 |  |  | 
 | (void)port; | (void)port; | 
 |  | #if 1 | 
 |  | return(0x80);                                   // INT-5 | 
 |  | #else | 
 | return(0x40);                                   // INT-5 | return(0x40);                                   // INT-5 | 
 |  | #endif | 
 | } | } | 
 |  |  | 
 |  |  |