Diff for /np2/io/gdc.c between versions 1.1.1.1 and 1.8

version 1.1.1.1, 2003/10/16 17:57:53 version 1.8, 2003/12/08 00:55:32
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "scrnmng.h"  #include        "scrnmng.h"
 #include        "i286.h"  #include        "cpucore.h"
 #include        "memory.h"  #include        "memory.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 #include        "gdc_cmd.tbl"  
 #include        "palettes.h"  
 #include        "vram.h"  #include        "vram.h"
   #include        "palettes.h"
   #include        "gdc_cmd.tbl"
   
   
 #define SEARHC_SYNC  #define SEARHC_SYNC
 #define TURE_SYNC  #define TURE_SYNC
   
 extern BYTE screenupdate;  
   
   static const UINT8 defdegpal[4] = {0x04,0x15,0x26,0x37};
   static const UINT8 defsync[8] = {0x10,0x4e,0x07,0x25,0x07,0x07,0x90,0x65};
   
 static const BYTE defdegpal[4] = {0x04,0x15,0x26,0x37};  
 static const BYTE defsync[8] = {0x10,0x4e,0x07,0x25,0x07,0x07,0x90,0x65};  
   
   void gdc_setdegitalpal(int color, REG8 value) {
 void gdc_setdegitalpal(int color, BYTE value) {  
   
         if (color & 4) {          if (color & 4) {
                 color &= 3;                  color &= 3;
Line 41  void gdc_setdegitalpal(int color, BYTE v Line 39  void gdc_setdegitalpal(int color, BYTE v
         }          }
 }  }
   
 void gdc_setanalogpal(int color, int rgb, BYTE value) {  void gdc_setanalogpal(int color, int rgb, REG8 value) {
   
         BYTE            *ptr;          UINT8           *ptr;
         PAL1EVENT       *event;          PAL1EVENT       *event;
   
         ptr = ((BYTE *)(gdc.anapal + color)) + rgb;          ptr = ((UINT8 *)(gdc.anapal + color)) + rgb;
         if ((*ptr ^ value) & 0x0f) {          if (((*ptr) ^ value) & 0x0f) {
                 gdcs.palchange = GDCSCRN_REDRAW;                  gdcs.palchange = GDCSCRN_REDRAW;
                 if ((palevent.events < PALEVENTMAX) && (!gdc.vsync)) {                  if (palevent.events < PALEVENTMAX) {
                         event = palevent.event + palevent.events;                          if (!gdc.vsync) {
                         event->clock = nevent.item[NEVENT_FLAMES].clock -                                  event = palevent.event + palevent.events;
                                                                         (nevent.baseclock - nevent.remainclock);                                  event->clock = nevent.item[NEVENT_FLAMES].clock -
                         event->color = (color * sizeof(RGB32)) + rgb;                                                                                          (CPU_BASECLOCK - CPU_REMCLOCK);
                         event->value = value;                                  event->color = (color * sizeof(RGB32)) + rgb;
                         palevent.events++;                                  event->value = (UINT8)value;
                                   palevent.events++;
                           }
                           else {
                                   palevent.vsyncpal = 1;
                           }
                 }                  }
         }          }
         *ptr = value;          *ptr = value;
 }  }
   
 void gdc_setdegpalpack(int color, BYTE value) {  void gdc_setdegpalpack(int color, REG8 value) {
   
         if ((gdc.degpal[color] ^ value) & 0x77) {          if ((gdc.degpal[color] ^ value) & 0x77) {
                 gdcs.palchange = GDCSCRN_REDRAW;                  gdcs.palchange = GDCSCRN_REDRAW;
         }          }
         gdc.degpal[color] = value;          gdc.degpal[color] = (UINT8)value;
 }  }
   
 void gdc_paletteinit(void) {  void gdc_paletteinit(void) {
   
         BYTE    c;          int             c;
   
         CopyMemory(gdc.degpal, defdegpal, 4);          CopyMemory(gdc.degpal, defdegpal, 4);
         for (c=0; c<8; c++) {          for (c=0; c<8; c++) {
Line 128  static void textdraw(void) {         //  Line 131  static void textdraw(void) {         // 
   
 void gdc_work(int id) {  void gdc_work(int id) {
   
         UINT16          i;  
         BYTE            data;  
         GDCDATA         item;          GDCDATA         item;
         BYTE            *dispflag;          UINT8           *dispflag;
           UINT            i;
           BYTE            data;
   
         item = ((id==GDCWORK_MASTER)?(&gdc.m):(&gdc.s));          item = (id==GDCWORK_MASTER)?&gdc.m:&gdc.s;
         dispflag = ((id==GDCWORK_MASTER)?(&gdcs.textdisp):(&gdcs.grphdisp));          dispflag = (id==GDCWORK_MASTER)?&gdcs.textdisp:&gdcs.grphdisp;
   
         for (i=0; i<item->cnt; i++) {          for (i=0; i<item->cnt; i++) {
                 data = (BYTE)item->fifo[i];                  data = (BYTE)item->fifo[i];
Line 148  void gdc_work(int id) { Line 151  void gdc_work(int id) {
                                                 item->rcv = 2;                                                  item->rcv = 2;
                                                 item->paracb = 1;                                                  item->paracb = 1;
                                                 break;                                                  break;
   
                                         case 0x10:                                          case 0x10:
                                         case 0x18:                                          case 0x18:
                                                 item->rcv = 1;                                                  item->rcv = 1;
                                                 item->paracb = 1;                                                  item->paracb = 1;
                                                 break;                                                  break;
   
                                         default:                                          default:
                                                 item->rcv = 0;                                                  item->rcv = 0;
                                                 break;                                                  break;
Line 242  void gdc_restorekacmode(void) { Line 247  void gdc_restorekacmode(void) {
   
 // ---- I/O  // ---- I/O
   
 static void IOOUTCALL gdc_o60(UINT port, BYTE dat) {  static void IOOUTCALL gdc_o60(UINT port, REG8 dat) {
   
         if (gdc.m.cnt < GDCCMD_MAX) {          if (gdc.m.cnt < GDCCMD_MAX) {
                 gdc.m.fifo[gdc.m.cnt++] = dat;                  gdc.m.fifo[gdc.m.cnt++] = dat;
Line 250  static void IOOUTCALL gdc_o60(UINT port, Line 255  static void IOOUTCALL gdc_o60(UINT port,
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_o62(UINT port, BYTE dat) {  static void IOOUTCALL gdc_o62(UINT port, REG8 dat) {
   
         if (gdc.m.cnt < GDCCMD_MAX) {          if (gdc.m.cnt < GDCCMD_MAX) {
                 gdc.m.fifo[gdc.m.cnt++] = 0x100 | dat;                  gdc.m.fifo[gdc.m.cnt++] = 0x100 | dat;
Line 259  static void IOOUTCALL gdc_o62(UINT port, Line 264  static void IOOUTCALL gdc_o62(UINT port,
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_o64(UINT port, BYTE dat) {  static void IOOUTCALL gdc_o64(UINT port, REG8 dat) {
   
         gdc.vsyncint = 1;          gdc.vsyncint = 1;
         (void)port;          (void)port;
         (void)dat;          (void)dat;
 }  }
   
 static void IOOUTCALL gdc_o68(UINT port, BYTE dat) {  static void IOOUTCALL gdc_o68(UINT port, REG8 dat) {
   
         BYTE    bit;          REG8    bit;
   
         if (!(dat & 0xf0)) {                                                                    // ver0.28          if (!(dat & 0xf0)) {                                                                    // ver0.28
                 bit = 1 << ((dat >> 1) & 7);                  bit = 1 << ((dat >> 1) & 7);
Line 296  static void IOOUTCALL gdc_o68(UINT port, Line 301  static void IOOUTCALL gdc_o68(UINT port,
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_o6a(UINT port, BYTE dat) {  static void IOOUTCALL gdc_o6a(UINT port, REG8 dat) {
   
         BYTE    bit;          REG8    bit;
   
         if (!(dat & 0xf8)) {          if (!(dat & 0xf8)) {
                 bit = (dat >> 1) & 3;                  bit = (dat >> 1) & 3;
Line 364  static void IOOUTCALL gdc_o6a(UINT port, Line 369  static void IOOUTCALL gdc_o6a(UINT port,
         (void)port;          (void)port;
 }  }
   
 static BYTE IOINPCALL gdc_i60(UINT port) {  static REG8 IOINPCALL gdc_i60(UINT port) {
   
         BYTE    ret;          REG8    ret;
         long    remain;          SINT32  remain;
   
         ret = 0x80 | gdc.vsync;         // | m_drawing;          ret = 0x80 | gdc.vsync;         // | m_drawing;
         remain = nevent_getremain(NEVENT_FLAMES);          remain = nevent_getremain(NEVENT_FLAMES);
Line 389  static BYTE IOINPCALL gdc_i60(UINT port) Line 394  static BYTE IOINPCALL gdc_i60(UINT port)
                 gdc_work(GDCWORK_MASTER);                  gdc_work(GDCWORK_MASTER);
         }          }
 #ifdef SEARHC_SYNC  #ifdef SEARHC_SYNC
         if ((i286s.inport) && (nevent.remainclock >= 5)) {          if ((CPU_INPADRS) && (CPU_REMCLOCK >= 5)) {
                 UINT16 jadr = 0xfa74;                  UINT16 jadr = 0xfa74;
                 UINT16 memv;                  UINT16 memv;
                 memv = i286_memoryread_w(i286s.inport);                  memv = i286_memoryread_w(CPU_INPADRS);
                 while((memv == 0x00eb) || (memv == 0x5fe6)) {                  while((memv == 0x00eb) || (memv == 0x5fe6)) {
                         jadr -= 0x200;                          jadr -= 0x200;
                         i286s.inport += 2;                          CPU_INPADRS += 2;
                         memv = i286_memoryread_w(i286s.inport);                          memv = i286_memoryread_w(CPU_INPADRS);
                 }                  }
                 if ((memv == 0x20a8) || (memv == 0x2024)) {                  if ((memv == 0x20a8) || (memv == 0x2024)) {
                         memv = i286_memoryread_w(i286s.inport + 2);                          memv = i286_memoryread_w(CPU_INPADRS + 2);
                         if (memv == jadr) {                                     // je                          if (memv == jadr) {                                     // je
                                 if (!gdc.vsync) {                                  if (!gdc.vsync) {
                                         nevent.remainclock = -1;                                          CPU_REMCLOCK = -1;
                                 }                                  }
                         }                          }
                         else if (memv == (jadr + 1)) {          // jne                          else if (memv == (jadr + 1)) {          // jne
                                 if (gdc.vsync) {                                  if (gdc.vsync) {
                                         nevent.remainclock = -1;                                          CPU_REMCLOCK = -1;
                                 }                                  }
                         }                          }
                 }                  }
         }          }
 #endif  #endif
 #ifdef TURE_SYNC                                // クロックイベントの誤差修正  #ifdef TURE_SYNC                                // クロックイベントの誤差修正
         if (nevent.item[NEVENT_FLAMES].clock <          if (nevent.item[NEVENT_FLAMES].clock < (CPU_BASECLOCK - CPU_REMCLOCK)) {
                                                                 (nevent.baseclock - nevent.remainclock)) {  
                 ret ^= 0x20;                  ret ^= 0x20;
         }          }
 #endif  #endif
Line 423  static BYTE IOINPCALL gdc_i60(UINT port) Line 427  static BYTE IOINPCALL gdc_i60(UINT port)
         return(ret);          return(ret);
 }  }
   
 static BYTE IOINPCALL gdc_i62(UINT port) {  static REG8 IOINPCALL gdc_i62(UINT port) {
   
         if (gdc.m.snd) {          if (gdc.m.snd) {
                 gdc.m.snd--;                  gdc.m.snd--;
Line 433  static BYTE IOINPCALL gdc_i62(UINT port) Line 437  static BYTE IOINPCALL gdc_i62(UINT port)
         return(0xff);          return(0xff);
 }  }
   
 static BYTE IOINPCALL gdc_i68(UINT port) {  static REG8 IOINPCALL gdc_i68(UINT port) {
   
         (void)port;          (void)port;
         return(gdc.mode1);          return(gdc.mode1);
 }  }
   
 static BYTE IOINPCALL gdc_i6a(UINT port) {  static REG8 IOINPCALL gdc_i6a(UINT port) {
   
         (void)port;          (void)port;
         return(gdc.mode2);          return(gdc.mode2);
 }  }
   
   
 static void IOOUTCALL gdc_oa0(UINT port, BYTE dat) {  static void IOOUTCALL gdc_oa0(UINT port, REG8 dat) {
   
         if (gdc.s.cnt < GDCCMD_MAX) {          if (gdc.s.cnt < GDCCMD_MAX) {
                 gdc.s.fifo[gdc.s.cnt++] = dat;                  gdc.s.fifo[gdc.s.cnt++] = dat;
         }          }
   //      TRACEOUT(("GDC-B %.2x", dat));
         if (gdc.s.paracb) {                                             // ver0.29          if (gdc.s.paracb) {                                             // ver0.29
                 gdc_work(GDCWORK_SLAVE);                  gdc_work(GDCWORK_SLAVE);
         }          }
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_oa2(UINT port, BYTE dat) {  static void IOOUTCALL gdc_oa2(UINT port, REG8 dat) {
   
         if (gdc.s.cnt < GDCCMD_MAX) {          if (gdc.s.cnt < GDCCMD_MAX) {
                 gdc.s.fifo[gdc.s.cnt++] = 0x100 | dat;                  gdc.s.fifo[gdc.s.cnt++] = 0x100 | dat;
         }          }
   //      TRACEOUT(("GDC-A %.2x", dat));
         gdc_work(GDCWORK_SLAVE);          gdc_work(GDCWORK_SLAVE);
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_oa4(UINT port, BYTE dat) {  static void IOOUTCALL gdc_oa4(UINT port, REG8 dat) {
   
         if ((gdcs.disp ^ dat) & 1) {          if ((gdcs.disp ^ dat) & 1) {
                 gdcs.disp = dat & 1;                  gdcs.disp = dat & 1;
Line 475  static void IOOUTCALL gdc_oa4(UINT port, Line 481  static void IOOUTCALL gdc_oa4(UINT port,
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_oa6(UINT port, BYTE dat) {  static void IOOUTCALL gdc_oa6(UINT port, REG8 dat) {
   
         if ((gdcs.access ^ dat) & 1) {          if ((gdcs.access ^ dat) & 1) {
                 gdcs.access = dat & 1;                  gdcs.access = dat & 1;
Line 486  static void IOOUTCALL gdc_oa6(UINT port, Line 492  static void IOOUTCALL gdc_oa6(UINT port,
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_oa8(UINT port, BYTE dat) {  static void IOOUTCALL gdc_oa8(UINT port, REG8 dat) {
   
         if (gdc.analog) {          if (gdc.analog) {
                 gdc.palnum = dat & 0x0f;                  gdc.palnum = dat & 0x0f;
Line 497  static void IOOUTCALL gdc_oa8(UINT port, Line 503  static void IOOUTCALL gdc_oa8(UINT port,
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_oaa(UINT port, BYTE dat) {  static void IOOUTCALL gdc_oaa(UINT port, REG8 dat) {
   
         if (gdc.analog) {          if (gdc.analog) {
                 gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.g), dat);                  gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.g), dat);
Line 508  static void IOOUTCALL gdc_oaa(UINT port, Line 514  static void IOOUTCALL gdc_oaa(UINT port,
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_oac(UINT port, BYTE dat) {  static void IOOUTCALL gdc_oac(UINT port, REG8 dat) {
   
         if (gdc.analog) {          if (gdc.analog) {
                 gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.r), dat);                  gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.r), dat);
Line 519  static void IOOUTCALL gdc_oac(UINT port, Line 525  static void IOOUTCALL gdc_oac(UINT port,
         (void)port;          (void)port;
 }  }
   
 static void IOOUTCALL gdc_oae(UINT port, BYTE dat) {  static void IOOUTCALL gdc_oae(UINT port, REG8 dat) {
   
         if (gdc.analog) {          if (gdc.analog) {
                 gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.b), dat);                  gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.b), dat);
Line 530  static void IOOUTCALL gdc_oae(UINT port, Line 536  static void IOOUTCALL gdc_oae(UINT port,
         (void)port;          (void)port;
 }  }
   
 static BYTE IOINPCALL gdc_ia0(UINT port) {  static REG8 IOINPCALL gdc_ia0(UINT port) {
   
         BYTE    ret;          REG8    ret;
         SINT32  remain;          SINT32  remain;
   
         ret = 0x80 | gdc.vsync | gdc.s_drawing;          ret = 0x80 | gdc.vsync | gdc.s_drawing;
Line 555  static BYTE IOINPCALL gdc_ia0(UINT port) Line 561  static BYTE IOINPCALL gdc_ia0(UINT port)
                 gdc_work(GDCWORK_SLAVE);                  gdc_work(GDCWORK_SLAVE);
         }          }
 #ifdef SEARHC_SYNC  #ifdef SEARHC_SYNC
         if ((i286s.inport) && (nevent.remainclock >= 5)) {          if ((CPU_INPADRS) && (CPU_REMCLOCK >= 5)) {
                 UINT16 jadr = 0xfa74;                  UINT16 jadr = 0xfa74;
                 UINT16 memv;                  UINT16 memv;
                 memv = i286_memoryread_w(i286s.inport);                  memv = i286_memoryread_w(CPU_INPADRS);
                 while((memv == 0x00eb) || (memv == 0x5fe6)) {                  while((memv == 0x00eb) || (memv == 0x5fe6)) {
                         jadr -= 0x200;                          jadr -= 0x200;
                         i286s.inport += 2;                          CPU_INPADRS += 2;
                         memv = i286_memoryread_w(i286s.inport);                          memv = i286_memoryread_w(CPU_INPADRS);
                 }                  }
                 if ((memv == 0x20a8) || (memv == 0x2024)) {                  if ((memv == 0x20a8) || (memv == 0x2024)) {
                         memv = i286_memoryread_w(i286s.inport + 2);                          memv = i286_memoryread_w(CPU_INPADRS + 2);
                         if (memv == jadr) {                                     // je                          if (memv == jadr) {                                     // je
                                 if (!gdc.vsync) {                                  if (!gdc.vsync) {
                                         nevent.remainclock = -1;                                          CPU_REMCLOCK = -1;
                                 }                                  }
                         }                          }
                         else if (memv == (jadr + 1)) {          // jne                          else if (memv == (jadr + 1)) {          // jne
                                 if (gdc.vsync) {                                  if (gdc.vsync) {
                                         nevent.remainclock = -1;                                          CPU_REMCLOCK = -1;
                                 }                                  }
                         }                          }
                 }                  }
         }          }
 #endif  #endif
 #ifdef TURE_SYNC                                // クロックイベントの誤差修正  #ifdef TURE_SYNC                                // クロックイベントの誤差修正
         if (nevent.item[NEVENT_FLAMES].clock <          if (nevent.item[NEVENT_FLAMES].clock < (CPU_BASECLOCK - CPU_REMCLOCK)) {
                                                                 (nevent.baseclock - nevent.remainclock)) {  
                 ret ^= 0x20;                  ret ^= 0x20;
         }          }
 #endif  #endif
Line 589  static BYTE IOINPCALL gdc_ia0(UINT port) Line 594  static BYTE IOINPCALL gdc_ia0(UINT port)
         return(ret);          return(ret);
 }  }
   
 static BYTE IOINPCALL gdc_ia2(UINT port) {  static REG8 IOINPCALL gdc_ia2(UINT port) {
   
         if (gdc.s.snd) {          if (gdc.s.snd) {
                 gdc.s.snd--;                  gdc.s.snd--;
Line 599  static BYTE IOINPCALL gdc_ia2(UINT port) Line 604  static BYTE IOINPCALL gdc_ia2(UINT port)
         return(0xff);          return(0xff);
 }  }
   
 static BYTE IOINPCALL gdc_ia4(UINT port) {  static REG8 IOINPCALL gdc_ia4(UINT port) {
   
         (void)port;          (void)port;
         return(gdcs.disp);          return(gdcs.disp);
 }  }
   
 static BYTE IOINPCALL gdc_ia6(UINT port) {  static REG8 IOINPCALL gdc_ia6(UINT port) {
   
         (void)port;          (void)port;
         return(gdcs.access);          return(gdcs.access);

Removed from v.1.1.1.1  
changed lines
  Added in v.1.8


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