Diff for /np2/io/pit.c between versions 1.9 and 1.10

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));
 }  }
   
   

Removed from v.1.9  
changed lines
  Added in v.1.10


RetroPC.NET-CVS <cvs@retropc.net>