|
|
| version 1.9, 2003/12/01 17:13:36 | version 1.10, 2003/12/08 00:55:32 |
|---|---|
| Line 3 | Line 3 |
| // | // |
| #include "compiler.h" | #include "compiler.h" |
| #include "i286.h" | |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "sound.h" | #include "sound.h" |
| Line 149 void rs232ctimer(NEVENTITEM item) { | Line 148 void rs232ctimer(NEVENTITEM item) { |
| // --------------------------------------------------------------------------- | // --------------------------------------------------------------------------- |
| static UINT16 itimer_latch(int ch) { | static UINT pit_latch(int ch) { |
| SINT32 clock; | SINT32 clock; |
| Line 160 static UINT16 itimer_latch(int ch) { | Line 159 static UINT16 itimer_latch(int ch) { |
| return(pit.value[1]); | return(pit.value[1]); |
| #ifdef uPD71054 | #ifdef uPD71054 |
| case 0x06: | case 0x06: |
| return(pit.value[1] & 0xfffe); | return(pit.value[1] & (~1)); |
| #endif | #endif |
| } | } |
| #if defined(BEEPCOUNTEREX) | #if defined(BEEPCOUNTEREX) |
| Line 175 static UINT16 itimer_latch(int ch) { | Line 174 static UINT16 itimer_latch(int ch) { |
| else { | else { |
| clock >>= 16; | clock >>= 16; |
| } | } |
| return((UINT16)clock); | return(clock); |
| #endif | #endif |
| } | } |
| clock = nevent_getremain(NEVENT_ITIMER + ch); | clock = nevent_getremain(NEVENT_ITIMER + ch); |
| if (clock >= 0) { | if (clock >= 0) { |
| return((UINT16)(clock / pc.multiple)); | return(clock / pc.multiple); |
| } | } |
| return(0); | return(0); |
| } | } |
| void itimer_setflag(int ch, BYTE value) { | void pit_setflag(int ch, REG8 value) { |
| pit.flag[ch] = 0; | pit.flag[ch] = 0; |
| if (value & 0x30) { | if (value & 0x30) { |
| pit.mode[ch] = value; | pit.mode[ch] = (UINT8)value; |
| } | } |
| else { // latch | else { // latch |
| pit.mode[ch] &= ~0x30; | pit.mode[ch] &= ~0x30; |
| pit.latch[ch] = itimer_latch(ch); | pit.latch[ch] = (UINT16)pit_latch(ch); |
| } | } |
| } | } |
| BOOL itimer_setcount(int ch, BYTE value) { | BOOL pit_setcount(int ch, REG8 value) { |
| switch(pit.mode[ch] & 0x30) { | switch(pit.mode[ch] & 0x30) { |
| case 0x10: // access low | case 0x10: // access low |
| Line 223 BOOL itimer_setcount(int ch, BYTE value) | Line 222 BOOL itimer_setcount(int ch, BYTE value) |
| return(FALSE); | return(FALSE); |
| } | } |
| BYTE itimer_getcount(int ch) { | REG8 pit_getcount(int ch) { |
| BYTE ret; | REG8 ret; |
| UINT16 w; | REG16 w; |
| if (!(pit.mode[ch] & 0x30)) { | if (!(pit.mode[ch] & 0x30)) { |
| w = pit.latch[ch]; | w = pit.latch[ch]; |
| } | } |
| else { | else { |
| w = itimer_latch(ch); | w = pit_latch(ch); |
| } | } |
| switch(pit.mode[ch] & 0x30) { | switch(pit.mode[ch] & 0x30) { |
| case 0x10: // access low | case 0x10: // access low |
| return((BYTE)w); | return((UINT8)w); |
| case 0x20: // access high | case 0x20: // access high |
| return((BYTE)(w >> 8)); | return((UINT8)(w >> 8)); |
| } | } |
| // access word | if (!(pit.flag[ch] & 1)) { // access word |
| if (!(pit.flag[ch] & 1)) { | ret = (UINT8)w; |
| ret = (BYTE)w; | |
| } | } |
| else { | else { |
| ret = (BYTE)(w >> 8); | ret = (UINT8)(w >> 8); |
| } | } |
| pit.flag[ch] ^= 1; | pit.flag[ch] ^= 1; |
| return(ret); | return(ret); |
| Line 256 BYTE itimer_getcount(int ch) { | Line 254 BYTE itimer_getcount(int ch) { |
| // ---- I/O | // ---- I/O |
| // system timer | // system timer |
| static void IOOUTCALL pit_o71(UINT port, BYTE dat) { | static void IOOUTCALL pit_o71(UINT port, REG8 dat) { |
| // TRACEOUT(("pic o71: %x [%.4x %.4x]", dat, I286_CS, I286_IP)); | if (pit_setcount(0, dat)) { |
| if (itimer_setcount(0, dat)) { | |
| return; | return; |
| } | } |
| pic.pi[0].irr &= (~1); | pic.pi[0].irr &= (~1); |
| Line 269 static void IOOUTCALL pit_o71(UINT port, | Line 266 static void IOOUTCALL pit_o71(UINT port, |
| } | } |
| // beep | // beep |
| static void IOOUTCALL pit_o73(UINT port, BYTE dat) { | static void IOOUTCALL pit_o73(UINT port, REG8 dat) { |
| if (itimer_setcount(1, dat)) { | if (pit_setcount(1, dat)) { |
| return; | return; |
| } | } |
| setbeepevent(NEVENT_ABSOLUTE); | setbeepevent(NEVENT_ABSOLUTE); |
| Line 285 static void IOOUTCALL pit_o73(UINT port, | Line 282 static void IOOUTCALL pit_o73(UINT port, |
| } | } |
| // rs-232c | // rs-232c |
| static void IOOUTCALL pit_o75(UINT port, BYTE dat) { | static void IOOUTCALL pit_o75(UINT port, REG8 dat) { |
| if (itimer_setcount(2, dat)) { | if (pit_setcount(2, dat)) { |
| return; | return; |
| } | } |
| rs232c_open(); | rs232c_open(); |
| Line 296 static void IOOUTCALL pit_o75(UINT port, | Line 293 static void IOOUTCALL pit_o75(UINT port, |
| } | } |
| // ctrl | // ctrl |
| static void IOOUTCALL pit_o77(UINT port, BYTE dat) { | static void IOOUTCALL pit_o77(UINT port, REG8 dat) { |
| int ch; | int ch; |
| // TRACEOUT(("pic o77: %x", dat)); | // TRACEOUT(("pic o77: %x", dat)); |
| ch = (dat >> 6) & 3; | ch = (dat >> 6) & 3; |
| if (ch != 3) { | if (ch != 3) { |
| itimer_setflag(ch, dat); | pit_setflag(ch, dat); |
| if (ch == 0) { // 書込みで itimerのirrがリセットされる… | if (ch == 0) { // 書込みで itimerのirrがリセットされる… |
| pic.pi[0].irr &= (~1); | pic.pi[0].irr &= (~1); |
| if (dat & 0x30) { // 一応ラッチ時は割り込みをセットしない | if (dat & 0x30) { // 一応ラッチ時は割り込みをセットしない |
| Line 318 static void IOOUTCALL pit_o77(UINT port, | Line 315 static void IOOUTCALL pit_o77(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static BYTE IOINPCALL pit_i71(UINT port) { | static REG8 IOINPCALL pit_i71(UINT port) { |
| return(itimer_getcount((port >> 1) & 3)); | return(pit_getcount((port >> 1) & 3)); |
| } | } |