Diff for /np2/lio/lio.c between versions 1.5 and 1.16

version 1.5, 2004/02/20 08:32:23 version 1.16, 2004/03/07 23:04:51
Line 2 Line 2
 #include        "cpucore.h"  #include        "cpucore.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
   #include        "gdc_sub.h"
 #include        "bios.h"  #include        "bios.h"
 #include        "biosmem.h"  #include        "biosmem.h"
 #include        "vram.h"  #include        "vram.h"
 #include        "lio.h"  #include        "lio.h"
   
   
         LIO_TABLE       lio;  
   
   
 void lio_initialize(void) {  void lio_initialize(void) {
   
         UINT    i;          UINT    i;
Line 18  void lio_initialize(void) { Line 16  void lio_initialize(void) {
         mem[0xf9900] = 0x11;          mem[0xf9900] = 0x11;
         for (i=0; i<0x11; i++) {          for (i=0; i<0x11; i++) {
                 mem[0xf9904 + i*4] = 0xa0 + i;                  mem[0xf9904 + i*4] = 0xa0 + i;
                 SETBIOSMEM16(0xf9906 + i*4, 0x100 + i*2);                  mem[0xf9905 + i*4] = 0x00;
                 SETBIOSMEM16(0xf9a00 + i*2, 0xcf90);                  SETBIOSMEM16(0xf9906 + i*4, 0x100 + i*4);
                   SETBIOSMEM32(0xf9a00 + i*4, 0xcf90fb90);
         }          }
         mem[0xf9944] = 0xce;          mem[0xf9944] = 0xce;
         ZeroMemory(&lio, sizeof(lio));  
 }  }
   
 void bios_lio(REG8 cmd) {  void bios_lio(REG8 cmd) {
   
         UINT    i;          _GLIO   lio;
           UINT8   ret;
         TRACEOUT(("lio command %.2x", cmd));  
   
   //      TRACEOUT(("lio command %.2x", cmd));
           MEML_READSTR(CPU_DS, 0x0620, &lio.work, sizeof(lio.work));
           lio.palmode = MEML_READ8(CPU_DS, 0x0a08);
           lio.wait = 0;
         switch(cmd) {          switch(cmd) {
                 case 0x00:                      // a0: GINIT                  case 0x00:                      // a0: GINIT
                         // GDCバッファを空に                          ret = lio_ginit(&lio);
                         if (gdc.s.cnt) {  
                                 gdc_work(GDCWORK_SLAVE);  
                         }  
                         gdc_forceready(&gdc.s);  
   
                         ZeroMemory(&gdc.s.para[GDC_SCROLL], 8);  
                         gdc.mode1 |= 0x10;  
                         gdc.s.para[GDC_CSRFORM] = 1;  
                         screenupdate |= 2;  
                         gdcs.access = gdcs.disp = 0;  
                         vramop.operate &= VOP_ACCESSMASK;  
                         i286_vram_dispatch(vramop.operate);  
                         iocore_out8(0x006a, 0);  
                         gdcs.grphdisp |= GDCSCRN_ENABLE;  
                         gdc_paletteinit();  
   
                         lio.scrn.top = 0;  
                         lio.scrn.lines = 200;  
                         lio.scrn.bank = 0;  
                         lio.scrn.plane = 0x80;  
   
                         lio.gcolor1.palmax = 8;  
                         lio.gcolor1.bgcolor = 0;  
                         lio.gcolor1.bdcolor = 0;  
                         lio.gcolor1.fgcolor = 7;  
                         lio.gcolor1.palmode = 0;  
   
                         lio.gview.x1 = 0;  
                         lio.gview.y1 = 0;  
                         lio.gview.x2 = 639;  
                         lio.gview.y2 = 399;  
                         lio_makeviewmask();  
   
                         for (i=0; i<8; i++) {  
                                 lio.degcol[i] = i;  
                         }  
                         CPU_AH = 0;  
                         break;                          break;
   
                 case 0x01:                      // a1: GSCREEN                  case 0x01:                      // a1: GSCREEN
                         CPU_AH = lio_gscreen();                          ret = lio_gscreen(&lio);
                         break;                          break;
   
                 case 0x02:                      // a2: GVIEW                  case 0x02:                      // a2: GVIEW
                         CPU_AH = lio_gview();                          ret = lio_gview(&lio);
                         break;                          break;
   
                 case 0x03:                      // a3: GCOLOR1                  case 0x03:                      // a3: GCOLOR1
                         CPU_AH = lio_gcolor1();                          ret = lio_gcolor1(&lio);
                         break;                          break;
   
                 case 0x04:                      // a4: GCOLOR2                  case 0x04:                      // a4: GCOLOR2
                         CPU_AH = lio_gcolor2();                          ret = lio_gcolor2(&lio);
                         break;                          break;
   
                 case 0x05:                      // a5: GCLS                  case 0x05:                      // a5: GCLS
                         CPU_AH = lio_gcls();                          ret = lio_gcls(&lio);
                         break;                          break;
   
                 case 0x06:                      // a6: GPSET                  case 0x06:                      // a6: GPSET
                         CPU_AH = lio_gpset();                          ret = lio_gpset(&lio);
                         break;                          break;
   
                 case 0x07:                      // a7: GLINE                  case 0x07:                      // a7: GLINE
                         CPU_AH = lio_gline();                          ret = lio_gline(&lio);
                         break;                          break;
   
                 case 0x08:                      // a8: GCIRCLE  //              case 0x08:                      // a8: GCIRCLE
                         break;  //                      break;
   
                 case 0x09:                      // a9: GPAINT1  //              case 0x09:                      // a9: GPAINT1
                         break;  //                      break;
   
                 case 0x0a:                      // aa: GPAINT2  //              case 0x0a:                      // aa: GPAINT2
                         break;  //                      break;
   
                 case 0x0b:                      // ab: GGET                  case 0x0b:                      // ab: GGET
                           ret = lio_gget(&lio);
                         break;                          break;
   
                 case 0x0c:                      // ac: GPUT1                  case 0x0c:                      // ac: GPUT1
                         CPU_AH = lio_gput1();                          ret = lio_gput1(&lio);
                         break;                          break;
   
                 case 0x0d:                      // ad: GPUT2                  case 0x0d:                      // ad: GPUT2
 //                      CPU_AH = lio_gput2();                          ret = lio_gput2(&lio);
                         break;                          break;
   
                 case 0x0e:                      // ae: GROLL  //              case 0x0e:                      // ae: GROLL
                         break;  //                      break;
   
                 case 0x0f:                      // af: GPOINT2                  case 0x0f:                      // af: GPOINT2
                           ret = lio_gpoint2(&lio);
                         break;                          break;
   
                 case 0x10:                      // ce: GCOPY  //              case 0x10:                      // ce: GCOPY
   //                      break;
   
                   default:
                           ret = LIO_SUCCESS;
                         break;                          break;
         }          }
         // TRACEOUT(("lio cmd-%d, %d", cmd, CPU_AH));          CPU_AH = ret;
           if (lio.wait) {
                   gdcsub_setslavewait(lio.wait);
           }
 }  }
   
   
 // ----  // ----
   
 static const UINT32 planeadrs[4] = {0xa8000, 0xb0000, 0xb8000, 0xe0000};  const UINT32 lioplaneadrs[4] = {VRAM_B, VRAM_R, VRAM_G, VRAM_E};
 static const BYTE bit_l[8] = {0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01};  
 static const BYTE bit_r[8] = {0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};  void lio_updatedraw(GLIO lio) {
   
           UINT8   flag;
           UINT8   colorbit;
           SINT16  maxline;
           SINT16  tmp;
   
           flag = 0;
           colorbit = 3;
           maxline = 399;
           if (lio->palmode == 2) {
                   flag |= LIODRAW_4BPP;
                   colorbit = 4;
           }
           switch(lio->work.scrnmode) {
                   case 0:
                           if (lio->work.pos & 1) {
                                   flag |= LIODRAW_UPPER;
                           }
                           maxline = 199;
                           break;
   
 static void pixed8(UINT32 vadrs, BYTE bit, BYTE pal) {                  case 1:
                           flag |= lio->work.pos % colorbit;
                           flag |= LIODRAW_MONO;
                           if (lio->work.pos >= colorbit) {
                                   flag |= LIODRAW_UPPER;
                           }
                           maxline = 199;
                           break;
   
         if (lio.scrn.plane & 0x80) {                  case 2:
                           flag |= lio->work.pos % colorbit;
                           flag |= LIODRAW_MONO;
                           break;
           }
           lio->draw.flag = flag;
           lio->draw.palmax = 1 << colorbit;
   
           tmp = (SINT16)LOADINTELWORD(lio->work.viewx1);
           lio->draw.x1 = max(tmp, 0);
           tmp = (SINT16)LOADINTELWORD(lio->work.viewy1);
           lio->draw.y1 = max(tmp, 0);
           tmp = (SINT16)LOADINTELWORD(lio->work.viewx2);
           lio->draw.x2 = min(tmp, 639);
           tmp = (SINT16)LOADINTELWORD(lio->work.viewy2);
           lio->draw.y2 = min(tmp, maxline);
           if (!gdcs.access) {
                   lio->draw.base = 0;
                   lio->draw.bank = 0;
                   lio->draw.sbit = 0x01;
           }
           else {
                   lio->draw.base = VRAM_STEP;
                   lio->draw.bank = 1;
                   lio->draw.sbit = 0x02;
           }
   }
   
   
   // ----
   
   static void pixed8(const _GLIO *lio, UINT addr, REG8 bit, REG8 pal) {
   
           BYTE    *ptr;
   
           addr = LOW15(addr);
           vramupdate[addr] |= lio->draw.sbit;
           ptr = mem + lio->draw.base + addr;
           if (!(lio->draw.flag & LIODRAW_MONO)) {
                 if (pal & 1) {                  if (pal & 1) {
                         mem[vadrs+0xa8000] |= bit;                          ptr[VRAM_B] |= bit;
                 }                  }
                 else {                  else {
                         mem[vadrs+0xa8000] &= ~bit;                          ptr[VRAM_B] &= ~bit;
                 }                  }
                 if (pal & 2) {                  if (pal & 2) {
                         mem[vadrs+0xb0000] |= bit;                          ptr[VRAM_R] |= bit;
                 }                  }
                 else {                  else {
                         mem[vadrs+0xb0000] &= ~bit;                          ptr[VRAM_R] &= ~bit;
                 }                  }
                 if (pal & 4) {                  if (pal & 4) {
                         mem[vadrs+0xb8000] |= bit;                          ptr[VRAM_G] |= bit;
                 }                  }
                 else {                  else {
                         mem[vadrs+0xb8000] &= ~bit;                          ptr[VRAM_G] &= ~bit;
                 }                  }
                 if (pal & 8) {                  if (lio->draw.flag & LIODRAW_4BPP) {
                         mem[vadrs+0xe0000] |= bit;                          if (pal & 8) {
                 }                                  ptr[VRAM_E] |= bit;
                 else {                          }
                         mem[vadrs+0xe0000] &= ~bit;                          else {
                                   ptr[VRAM_E] &= ~bit;
                           }
                 }                  }
         }          }
         else {          else {
                 vadrs += planeadrs[lio.scrn.plane & 3];                  ptr += lioplaneadrs[lio->draw.flag & LIODRAW_PMASK];
                 if (pal) {                  if (pal) {
                         mem[vadrs] |= bit;                          *ptr |= bit;
                 }                  }
                 else {                  else {
                         mem[vadrs] &= ~bit;                          *ptr &= ~bit;
                 }                  }
         }          }
 }  }
   
 void lio_pset(SINT16 x, SINT16 y, BYTE pal) {  void lio_pset(const _GLIO *lio, SINT16 x, SINT16 y, REG8 pal) {
   
         UINT32  adrs;          UINT    addr;
         BYTE    bit;          BYTE    bit;
   
         if ((lio.x1 > x) || (lio.x2 < x) || (lio.y1 > y) || (lio.y2 < y)) {          if ((lio->draw.x1 > x) || (lio->draw.x2 < x) ||
                   (lio->draw.y1 > y) || (lio->draw.y2 < y)) {
                 return;                  return;
         }          }
         adrs = (y * 80) + (x >> 3);          addr = (y * 80) + (x >> 3);
         bit = 0x80 >> (x & 7);          bit = 0x80 >> (x & 7);
         if (lio.scrn.top) {          if (lio->draw.flag & LIODRAW_UPPER) {
                 adrs += 16000;                  addr += 16000;
         }  
         if (!lio.scrn.bank) {  
                 vramupdate[adrs] |= 1;  
                 gdcs.grphdisp |= 1;  
         }          }
         else {          gdcs.grphdisp |= lio->draw.sbit;
                 vramupdate[adrs] |= 2;          pixed8(lio, addr, bit, pal);
                 gdcs.grphdisp |= 2;  
                 adrs += 0x200000;  
         }  
         pixed8(adrs, bit, pal);  
 }  }
   
 void lio_line(SINT16 x1, SINT16 x2, SINT16 y, BYTE pal) {  #if 0
   void lio_line(const _GLIO *lio, SINT16 x1, SINT16 x2, SINT16 y, REG8 pal) {
   
         UINT    adrs;          UINT    addr;
         UINT32  vadrs;          BYTE    bit, dbit;
         BYTE    bit, dbit, sbit;  
         SINT16  width;          SINT16  width;
   
         if ((lio.y1 > y) || (lio.y2 < y)) {          if ((lio->draw.y1 > y) || (lio->draw.y2 < y)) {
                 return;                  return;
         }          }
         if (lio.x1 > x1) {          if (lio->draw.x1 > x1) {
                 x1 = lio.x1;                  x1 = lio->draw.x1;
         }          }
         if (lio.x2 < x2) {          if (lio->draw.x2 < x2) {
                 x2 = lio.x2;                  x2 = lio->draw.x2;
         }          }
         width = x2 - x1 + 1;          width = x2 - x1 + 1;
         if (width <= 0) {          if (width <= 0) {
                 return;                  return;
         }          }
         adrs = (y * 80) + (x1 >> 3);          addr = (y * 80) + (x1 >> 3);
         bit = 0x80 >> (x1 & 7);          bit = 0x80 >> (x1 & 7);
         if (lio.scrn.top) {          if (lio->draw.flag & LIODRAW_UPPER) {
                 adrs += 16000;                  addr += 16000;
         }  
         if (!lio.scrn.bank) {  
                 vadrs = adrs;  
                 sbit = 1;  
                 gdcs.grphdisp |= 1;  
         }  
         else {  
                 vadrs = adrs + 0x200000;  
                 sbit = 2;  
                 gdcs.grphdisp |= 2;  
         }          }
           gdcs.grphdisp |= lio->draw.sbit;
         dbit = 0;          dbit = 0;
         while(bit && width--) {          while((bit) && (width)) {
                 dbit |= bit;                  dbit |= bit;
                 bit >>= 1;                  bit >>= 1;
                   width--;
         }          }
         pixed8(vadrs++, dbit, pal);          pixed8(lio, addr, dbit, pal);
         vramupdate[adrs++] |= sbit;          addr++;
         while(width >= 8) {          while(width >= 8) {
                 width -= 8;                  width -= 8;
                 pixed8(vadrs++, 0xff, pal);                  pixed8(lio, addr, 0xff, pal);
                 vramupdate[adrs++] |= sbit;                  addr++;
         }          }
         dbit = 0;          dbit = 0;
         bit = 0x80;          bit = 0x80;
         while(bit && width--) {          while((bit) && (width)) {
                 dbit |= bit;                  dbit |= bit;
                 bit >>= 1;                  bit >>= 1;
                   width--;
         }          }
         if (dbit) {          if (dbit) {
                 pixed8(vadrs, dbit, pal);                  pixed8(lio, addr, dbit, pal);
                 vramupdate[adrs] |= sbit;          }
   }
   #endif
   
   
   #if 0
   void lio_look(UINT vect) {
   
           BYTE    work[16];
   
           TRACEOUT(("lio command %.2x [%.4x:%.4x]", vect, CPU_CS, CPU_IP));
           if (vect == 0xa7) {
                   i286_memstr_read(CPU_DS, CPU_BX, work, 16);
                   TRACEOUT(("LINE %d %d %d %d - %d %d / %d : %.2x %.2x",
                                           LOADINTELWORD(work),
                                           LOADINTELWORD(work+2),
                                           LOADINTELWORD(work+4),
                                           LOADINTELWORD(work+6),
                                           work[8], work[9], work[10], work[11], work[12]));
           }
           else if (vect == 0xad) {
                   i286_memstr_read(CPU_DS, CPU_BX, work, 16);
                   TRACEOUT(("GPUT2 x=%d / y=%d / chr=%.4x / %d / %d %d %d",
                           LOADINTELWORD(work),
                           LOADINTELWORD(work+2),
                           LOADINTELWORD(work+4),
                           work[6], work[7], work[8], work[9]));
         }          }
 }  }
   #endif
   

Removed from v.1.5  
changed lines
  Added in v.1.16


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