Diff for /xmil/io/ppi.c between versions 1.2 and 1.11

version 1.2, 2004/08/02 11:48:14 version 1.11, 2004/08/12 13:32:52
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 #include        "x1_io.h"  #include        "makescrn.h"
 #include        "x1_crtc.h"  
 #include        "x1_vram.h"  
 #include        "draw.h"  
   
   
 // ---- 8255 PPI〜  // ---- 8255 PPI〜
   
 void IOOUTCALL ppi_o(UINT port, REG8 value) {  static REG8 getportb(void) {
   
           REG8    ret;
           UINT    v;
   
         UINT8   bak_c;          ret = cmt_test(); // | cmt_read();              // THUNDER BALL
         UINT8   bit;  
           v = pccore_getraster(NULL);
           if (v < crtc.e.dl) {
                   ret |= 0x80;                                            // 1:DISP
           }
           if (subcpu.IBF) {
                   subcpu.IBF = 0;
                   ret |= 0x40;                                            // 1:SUB-CPU BUSY
           }
           if (subcpu.OBF) {
                   ret |= 0x20;                                            // 1:SUB-CPU Data empty
           }
           if (memio.ram) {
                   ret |= 0x10;                                            // 1:RAM
           }
   #if 1
           if (!(v < crtc.e.vs)) {
                   ret |= 0x04;                                            // V-SYNC
           }
   #else                                                           // ラプラステスト…VYSNCが長すぎるらしい
           if (v_cnt == crtc.e.vs) {
                   ret |= 0x04;
           }
   #endif
           return(ret);
   }
   
   static void setportc(REG8 dat) {
   
           REG8    oldc;
         UINT8   xl;          UINT8   xl;
   
         if (crtc.TXT_XL == 40) {          oldc = ppi.portc;
                 ppi.PORT_C |= 0x40;          if (crtc.s.TXT_XL == 40) {
                   oldc |= 0x40;
         }          }
         else {          else {
                 ppi.PORT_C &= ~0x40;                  oldc &= ~0x40;
           }
           ppi.portc = dat;
   
   //      cmt_write((REG8)(dat & 1));
           if ((oldc & 0x20) && (!(dat & 0x20))) {
                   iocore.s.mode = 1;
           }
           xl = ((dat & 0x40)?40:80);
           if (crtc.s.TXT_XL != xl) {
                   crtc.s.TXT_XL = (UINT8)xl;
   //              crtc.s.GRP_XL = xl << 3;
                   vrambank_patch();
                   scrnallflash = 1;
         }          }
         bak_c = ppi.PORT_C;  }
   
   
   // ----
   
   void IOOUTCALL ppi_o(UINT port, REG8 value) {
   
           REG8    bit;
   
         switch(port & 0x0f) {          switch(port & 0x0f) {
                 case 0:                  case 0:
                         if (!(ppi.MODE & 0x10)) {                          ppi.porta = value;
                                 ppi.PORT_A = value;  
                         }  
                         return;                          return;
   
                 case 1:                  case 1:
                         if (!(ppi.MODE & 0x02)) {                          ppi.portb = value;
                                 ppi.PORT_B = value;  
                         }  
                         return;                          return;
   
                 case 2:                  case 2:
                         if (!(ppi.MODE & 0x01)) {                          setportc(value);
                                 ppi.PORT_C &= 0xf0;  
                                 ppi.PORT_C |= (value & 0x0f);  
                         }  
                         if (!(ppi.MODE & 0x08)) {  
                                 ppi.PORT_C &= 0x0f;  
                                 ppi.PORT_C |= (value & 0xf0);  
                         }  
                         break;                          break;
   
                 case 3:                  case 3:
                         if (value & 0x80) {                          if (value & 0x80) {
                                 ppi.MODE = value;                                  ppi.mode = value;
                                 return;                                  return;
                         }                          }
                         else {                          else {
                                 bit = (UINT8)(1 << ((value >> 1) & 7));                                  bit = 1 << ((value >> 1) & 7);
                                 if (value & 0x01) {                                  if (value & 0x01) {
                                         ppi.PORT_C |= bit;                                          setportc((REG8)(ppi.portc | bit));
                                 }                                  }
                                 else {                                  else {
                                         ppi.PORT_C &= ~bit;                                          setportc((REG8)(ppi.portc & (~bit)));
                                 }                                  }
                         }                          }
                         break;                          break;
   
                 default:  
                         return;  
         }  
   
 //      cmt_write(ppi.PORT_C & 1);  
         if ((bak_c & 0x20) && (!(ppi.PORT_C & 0x20))) {  
                 ppi.IO_MODE = 1;  
         }  
         xl = ((ppi.PORT_C & 0x40)?40:80);  
         if (crtc.TXT_XL != xl) {  
                 crtc.TXT_XL = (UINT8)xl;  
                 crtc.GRP_XL = xl << 3;  
                 vrambank_patch();  
                 scrnallflash = 1;  
         }          }
 }  }
   
 REG8 IOINPCALL ppi_i(UINT port) {  REG8 IOINPCALL ppi_i(UINT port) {
   
         ppi.PORT_B = cmt_test(); // | cmt_read();       // THUNDER BALL  
   
         if (v_cnt < crtc.CRT_YL) {  
                 ppi.PORT_B |= 0x80;                                     // 1:DISP  
         }  
         if (subcpu.IBF) {  
                 subcpu.IBF = 0;  
                 ppi.PORT_B |= 0x40;                                     // 1:SUB-CPU BUSY  
         }  
         if (subcpu.OBF) {  
                 ppi.PORT_B |= 0x20;                                     // 1:SUB-CPU Data empty  
         }  
         if (!pccore.ROM_SW) {  
                 ppi.PORT_B |= 0x10;                                     // 1:RAM  
         }  
 #if 1  
         if (!(v_cnt < crtc.CRT_VS)) {  
                 ppi.PORT_B |= 0x04;                                     // V-SYNC  
         }  
 #else                                                           // ラプラステスト…VYSNCが長すぎるらしい  
         if (v_cnt == crtc.CRT_VS) {  
                 ppi.PORT_B |= 0x04;  
         }  
 #endif  
         if (crtc.TXT_XL == 40) {  
                 ppi.PORT_C |= 0x40;  
         }  
         else {  
                 ppi.PORT_C &= ~0x40;  
         }  
         switch(port & 0x0f) {          switch(port & 0x0f) {
                 case 0:                  case 0:
                         return(ppi.PORT_A);                  //      if (!(ppi.mode & 0x10)) {
                   //              return(ppi.porta);
                   //      }
                           return(ppi.porta);
   
                 case 1:                  case 1:
                         return(ppi.PORT_B);                          if (!(ppi.mode & 0x02)) {
                                   return(ppi.portb);
                           }
                           return(getportb());
   
                 case 2:                  case 2:
                         return(ppi.PORT_C);  #if 1
                           if (crtc.s.TXT_XL == 40) {
                                   ppi.portc |= 0x40;
                           }
                           else {
                                   ppi.portc &= ~0x40;
                           }
   #endif
                           return(ppi.portc);
   
                 case 3:                  case 3:
                         return(ppi.MODE);                          return(ppi.mode);
         }          }
         return(0xff);          return(0xff);
 }  }
Line 133  REG8 IOINPCALL ppi_i(UINT port) { Line 141  REG8 IOINPCALL ppi_i(UINT port) {
   
 void ppi_initialize(void) {  void ppi_initialize(void) {
   
         ppi.PORT_A = 0x00;          ppi.porta = 0x00;
         ppi.PORT_B = 0xff;          ppi.portb = 0xff;
         ppi.PORT_C = 0xff;          ppi.portc = 0xff;
         ppi.MODE = 0;          ppi.mode = 0x9b;
         ppi.IO_MODE = 0;  
 }  }
   
 void ppi_reset(void) {  void ppi_reset(void) {
   
         ppi.MODE = 0;          ppi.porta = 0x00;
         ppi.PORT_A = 0;          ppi.portc |= 0x40;
         ppi.PORT_C |= 0x40;          ppi.mode = 0x82;
         ppi.IO_MODE = 0;  
 }  }
   

Removed from v.1.2  
changed lines
  Added in v.1.11


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