Diff for /np2/bios/bios18.c between versions 1.6 and 1.8

version 1.6, 2003/12/01 17:13:36 version 1.8, 2003/12/12 01:04:39
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "i286.h"  #include        "cpucore.h"
 #include        "memory.h"  
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 #include        "bios.h"  #include        "bios.h"
Line 103  static void bios18_47(void) { Line 102  static void bios18_47(void) {
         }          }
         gdc_forceready(&gdc.s);          gdc_forceready(&gdc.s);
   
         i286_memstr_read(I286_DS, I286_BX, &ucw, sizeof(ucw));          i286_memstr_read(CPU_DS, CPU_BX, &ucw, sizeof(ucw));
         GBSX1 = LOADINTELWORD(ucw.GBSX1);          GBSX1 = LOADINTELWORD(ucw.GBSX1);
         GBSY1 = LOADINTELWORD(ucw.GBSY1);          GBSY1 = LOADINTELWORD(ucw.GBSY1);
         GBSX2 = LOADINTELWORD(ucw.GBSX2);          GBSX2 = LOADINTELWORD(ucw.GBSX2);
Line 165  static void bios18_47(void) { Line 164  static void bios18_47(void) {
         else {          else {
                 return;                  return;
         }          }
         if ((I286_CH & 0xc0) == 0x40) {          if ((CPU_CH & 0xc0) == 0x40) {
                 GBSY1 += 200;                  GBSY1 += 200;
         }          }
         csrw = (GBSY1 * 40) + (GBSX1 >> 4);          csrw = (GBSY1 * 40) + (GBSX1 >> 4);
         csrw += (GBSX1 & 0xf) << 20;          csrw += (GBSX1 & 0xf) << 20;
         GBMDOTI = LOADINTELWORD(ucw.GBMDOTI);          GBMDOTI = LOADINTELWORD(ucw.GBMDOTI);
         if ((I286_CH & 0x30) == 0x30) {          if ((CPU_CH & 0x30) == 0x30) {
                 if (ucw.GBON_PTN & 1) {                  if (ucw.GBON_PTN & 1) {
                         func(0x04000 + csrw, &vect, GBMDOTI, GDCOPE_SET);                          func(0x04000 + csrw, &vect, GBMDOTI, GDCOPE_SET);
                 }                  }
Line 192  static void bios18_47(void) { Line 191  static void bios18_47(void) {
                 }                  }
         }          }
         else {          else {
                 func(csrw + 0x4000 + ((I286_CH & 0x30) << 10), &vect,                  func(csrw + 0x4000 + ((CPU_CH & 0x30) << 10), &vect,
                                                                                                                 GBMDOTI, ucw.GBDOTU);                                                                                                                  GBMDOTI, ucw.GBDOTU);
         }          }
 }  }
Line 206  void bios0x18(void) { Line 205  void bios0x18(void) {
         UINT16  tmp;          UINT16  tmp;
         UINT32  pal;          UINT32  pal;
   
 //      TRACE_("int18", I286_AH);  //      TRACE_("int18", CPU_AH);
   
         sti_waiting ^= 1;          sti_waiting ^= 1;
         if (sti_waiting) {                                      // 割込み許可の遊び          if (sti_waiting) {                                      // 割込み許可の遊び
                 I286_STI;                  CPU_STI;
                 if (PICEXISTINTR) {                  if (PICEXISTINTR) {
                         I286_IP--;                          CPU_IP--;
                         nevent_forceexit();                          nevent_forceexit();
                         return;                          return;
                 }                  }
         }          }
           sti_waiting = 0;
   
         switch(I286_AH) {          switch(CPU_AH) {
                 case 0x00:                                              // キー・データの読みだし                  case 0x00:                                              // キー・データの読みだし
                         if (mem[MEMB_KB_COUNT]) {                          if (mem[MEMB_KB_COUNT]) {
                                 I286_AX = keyget();                                  CPU_AX = keyget();
                         }                          }
                         else {                          else {
                                 I286_IP--;                                  CPU_IP--;
                                 I286_REMCLOCK = -1;                                  CPU_REMCLOCK = -1;
                                 break;                                  break;
                         }                          }
                         break;                          break;
Line 233  void bios0x18(void) { Line 233  void bios0x18(void) {
                 case 0x01:                                              // キー・バッファ状態のセンス                  case 0x01:                                              // キー・バッファ状態のセンス
                         if (mem[MEMB_KB_COUNT]) {                          if (mem[MEMB_KB_COUNT]) {
                                 pos = GETBIOSMEM16(MEMW_KB_BUF_HEAD);                                  pos = GETBIOSMEM16(MEMW_KB_BUF_HEAD);
                                 I286_AX = GETBIOSMEM16(pos);                                  CPU_AX = GETBIOSMEM16(pos);
                                 I286_BH = 1;                                  CPU_BH = 1;
                         }                          }
                         else {                          else {
                                 I286_BH = 0;                                  CPU_BH = 0;
                         }                          }
                         break;                          break;
   
                 case 0x02:                                              // シフト・キー状態のセンス                  case 0x02:                                              // シフト・キー状態のセンス
                         I286_AL = mem[MEMB_SHIFT_STS];                          CPU_AL = mem[MEMB_SHIFT_STS];
                         break;                          break;
   
                 case 0x03:                                              // キーボード・インタフェイスの初期化                  case 0x03:                                              // キーボード・インタフェイスの初期化
Line 250  void bios0x18(void) { Line 250  void bios0x18(void) {
                         break;                          break;
   
                 case 0x04:                                              // キー入力状態のセンス                  case 0x04:                                              // キー入力状態のセンス
                         I286_AH = mem[0x00052a + (I286_AL & 0x0f)];                          CPU_AH = mem[0x00052a + (CPU_AL & 0x0f)];
                         break;                          break;
   
                 case 0x05:                                              // キー入力センス                  case 0x05:                                              // キー入力センス
                         if (mem[MEMB_KB_COUNT]) {                          if (mem[MEMB_KB_COUNT]) {
                                 I286_AX = keyget();                                  CPU_AX = keyget();
                                 I286_BH = 1;                                  CPU_BH = 1;
                         }                          }
                         else {                          else {
                                 I286_BH = 0;                                  CPU_BH = 0;
                         }                          }
                         break;                          break;
   
                 case 0x0a:                                              // CRTモードの設定                  case 0x0a:                                              // CRTモードの設定
 #if 1  #if 1
                         mem[MEMB_CRT_STS_FLAG] = 0x80 | (I286_AL & 0x0f);                          mem[MEMB_CRT_STS_FLAG] = 0x80 | (CPU_AL & 0x0f);
                         // GDCバッファを空に                          // GDCバッファを空に
                         if (gdc.m.cnt) {                          if (gdc.m.cnt) {
                                 gdc_work(GDCWORK_MASTER);                                  gdc_work(GDCWORK_MASTER);
Line 274  void bios0x18(void) { Line 274  void bios0x18(void) {
   
                         gdc.mode1 &= ~(0x25);                          gdc.mode1 &= ~(0x25);
                         gdc.mode1 |= 0x08;                          gdc.mode1 |= 0x08;
                         if (I286_AL & 0x02) {                          if (CPU_AL & 0x02) {
                                 gdc.mode1 |= 0x04;                              // 40桁                                  gdc.mode1 |= 0x04;                              // 40桁
                         }                          }
                         if (I286_AL & 0x04) {                          if (CPU_AL & 0x04) {
                                 gdc.mode1 |= 0x01;                              // アトリビュート                                  gdc.mode1 |= 0x01;                              // アトリビュート
                         }                          }
                         if (I286_AL & 0x08) {                          if (CPU_AL & 0x08) {
                                 gdc.mode1 |= 0x20;                              // コードアクセス                                  gdc.mode1 |= 0x20;                              // コードアクセス
                         }                          }
                         if (I286_AL & 0x01) {                                   // 20行                          if (CPU_AL & 0x01) {                                    // 20行
                                 mem[MEMB_CRT_RASTER] = 0x13;                                  mem[MEMB_CRT_RASTER] = 0x13;
                                 gdc.m.para[GDC_CSRFORM + 0] = 0x13;                                  gdc.m.para[GDC_CSRFORM + 0] = 0x13;
                                 gdc.m.para[GDC_CSRFORM + 1] = 0x00;                                  gdc.m.para[GDC_CSRFORM + 1] = 0x00;
Line 311  void bios0x18(void) { Line 311  void bios0x18(void) {
                         }                          }
                         gdc_forceready(&gdc.m);                          gdc_forceready(&gdc.m);
   
                         mem[MEMB_CRT_STS_FLAG] = I286_AL;                          mem[MEMB_CRT_STS_FLAG] = CPU_AL;
                         if (systemport_r(0x33) & 0x08) {                          if (systemport_r(0x33) & 0x08) {
                                 mem[MEMB_CRT_STS_FLAG] |= 0x80;                                  mem[MEMB_CRT_STS_FLAG] |= 0x80;
                         }                          }
 #endif  #endif
   
                 case 0x0b:                                              // CRTモードのセンス                  case 0x0b:                                              // CRTモードのセンス
                         I286_AL = mem[MEMB_CRT_STS_FLAG];                          CPU_AL = mem[MEMB_CRT_STS_FLAG];
                         break;                          break;
   
                 case 0x0c:                                              // テキスト画面の表示開始                  case 0x0c:                                              // テキスト画面の表示開始
Line 343  void bios0x18(void) { Line 343  void bios0x18(void) {
                         gdc_forceready(&gdc.m);                          gdc_forceready(&gdc.m);
   
                         ZeroMemory(&gdc.m.para[GDC_SCROLL], 16);                          ZeroMemory(&gdc.m.para[GDC_SCROLL], 16);
                         tmp = I286_DX >> 1;                          tmp = CPU_DX >> 1;
                         STOREINTELWORD(gdc.m.para + GDC_SCROLL, tmp);                          STOREINTELWORD(gdc.m.para + GDC_SCROLL, tmp);
                         gdcs.textdisp |= GDCSCRN_ALLDRAW2;                          gdcs.textdisp |= GDCSCRN_ALLDRAW2;
                         screenupdate |= 2;                          screenupdate |= 2;
                         break;                          break;
   
                 case 0x0f:                                              // 複数の表示領域の設定                  case 0x0f:                                              // 複数の表示領域の設定
                         SETBIOSMEM16(0x0053e, I286_CX);                          SETBIOSMEM16(0x0053e, CPU_CX);
                         SETBIOSMEM16(0x00540, I286_BX);                          SETBIOSMEM16(0x00540, CPU_BX);
                         mem[0x00547] = I286_DH;                          mem[0x00547] = CPU_DH;
                         mem[0x0053D] = I286_DL;                          mem[0x0053D] = CPU_DL;
                         // wait sync int                          // wait sync int
                         if ((i = I286_DL) > 0) {                          if ((i = CPU_DL) > 0) {
                                 pos = I286_CX;                                  pos = CPU_CX;
                                 p = gdc.m.para + GDC_SCROLL + (I286_DH << 2);                                  p = gdc.m.para + GDC_SCROLL + (CPU_DH << 2);
                                 while((i--) && (p < (gdc.m.para + GDC_SCROLL + 0x10))) {                                  while((i--) && (p < (gdc.m.para + GDC_SCROLL + 0x10))) {
                                         REG16 t;                                          REG16 t;
                                         t = i286_memword_read(I286_BX, pos);                                          t = i286_memword_read(CPU_BX, pos);
                                         t >>= 1;                                          t >>= 1;
                                         STOREINTELWORD(p, t);                                          STOREINTELWORD(p, t);
                                         t = i286_memword_read(I286_BX, pos + 2);                                          t = i286_memword_read(CPU_BX, pos + 2);
                                         if (!(mem[MEMB_CRT_STS_FLAG] & 1)) {    // 25                                          if (!(mem[MEMB_CRT_STS_FLAG] & 1)) {    // 25
                                                 t *= (16 * 16);                                                  t *= (16 * 16);
                                         }                                          }
Line 391  void bios0x18(void) { Line 391  void bios0x18(void) {
   
                         gdc.m.para[GDC_CSRFORM + 0] &= 0x7f;                          gdc.m.para[GDC_CSRFORM + 0] &= 0x7f;
                         gdc.m.para[GDC_CSRFORM + 1] &= 0xdf;                          gdc.m.para[GDC_CSRFORM + 1] &= 0xdf;
                         gdc.m.para[GDC_CSRFORM + 1] |= (I286_AL & 1) << 5;                          gdc.m.para[GDC_CSRFORM + 1] |= (CPU_AL & 1) << 5;
                         gdcs.textdisp |= GDCSCRN_EXT;                          gdcs.textdisp |= GDCSCRN_EXT;
                         break;                          break;
   
Line 428  void bios0x18(void) { Line 428  void bios0x18(void) {
                         }                          }
                         gdc_forceready(&gdc.m);                          gdc_forceready(&gdc.m);
   
                         tmp = I286_DX >> 1;                          tmp = CPU_DX >> 1;
                         if (LOADINTELWORD(gdc.m.para + GDC_CSRW) != tmp) {                          if (LOADINTELWORD(gdc.m.para + GDC_CSRW) != tmp) {
                                 STOREINTELWORD(gdc.m.para + GDC_CSRW, tmp);                                  STOREINTELWORD(gdc.m.para + GDC_CSRW, tmp);
                                 gdcs.textdisp |= GDCSCRN_EXT;                                  gdcs.textdisp |= GDCSCRN_EXT;
Line 436  void bios0x18(void) { Line 436  void bios0x18(void) {
                         break;                          break;
   
                 case 0x14:                                              // フォントパターンの読み出し                  case 0x14:                                              // フォントパターンの読み出し
                         switch(I286_DH) {                          switch(CPU_DH) {
                                 case 0x00:                      // 8x8                                  case 0x00:                      // 8x8
                                         i286_memword_write(I286_BX, I286_CX, 0x0101);                                          i286_memword_write(CPU_BX, CPU_CX, 0x0101);
                                         i286_memstr_write(I286_BX, I286_CX+2,                                          i286_memstr_write(CPU_BX, CPU_CX + 2,
                                                                 fontrom + 0x82000 + (I286_DL << 3), 8);                                                                  fontrom + 0x82000 + (CPU_DL << 3), 8);
                                         break;                                          break;
   
                                 case 0x28:                      // 8x16 KANJI                                  case 0x28:                      // 8x16 KANJI
                                 case 0x29:                                  case 0x29:
                                 case 0x2a:                                  case 0x2a:
                                 case 0x2b:                                  case 0x2b:
                                         i286_memword_write(I286_BX, I286_CX, 0x0102);                                          i286_memword_write(CPU_BX, CPU_CX, 0x0102);
                                         i286_memstr_write(I286_BX, I286_CX+2,                                          i286_memstr_write(CPU_BX, CPU_CX + 2,
                                                                 fontrom + ((I286_DL & 0x7f) << 12)                                                                  fontrom + ((CPU_DL & 0x7f) << 12)
                                                                                 + ((I286_DH - 0x20) << 4), 16);                                                                                  + ((CPU_DH - 0x20) << 4), 16);
                                         break;                                          break;
   
                                 case 0x80:                      // 8x16 ANK                                  case 0x80:                      // 8x16 ANK
                                         i286_memword_write(I286_BX, I286_CX, 0x0102);                                          i286_memword_write(CPU_BX, CPU_CX, 0x0102);
                                         i286_memstr_write(I286_BX, I286_CX+2,                                          i286_memstr_write(CPU_BX, CPU_CX + 2,
                                                                 fontrom + 0x80000 + (I286_DL << 4), 16);                                                                  fontrom + 0x80000 + (CPU_DL << 4), 16);
                                         break;                                          break;
   
                                 default:                                  default:
                                         buf[0] = 0x02;                                          buf[0] = 0x02;
                                         buf[1] = 0x02;                                          buf[1] = 0x02;
                                         p = fontrom + ((I286_DL & 0x7f) << 12)                                          p = fontrom + ((CPU_DL & 0x7f) << 12)
                                                                 + (((I286_DH - 0x20) & 0x7f) << 4);                                                                  + (((CPU_DH - 0x20) & 0x7f) << 4);
                                         for (i=1; i<17; i++, p++) {                                          for (i=1; i<17; i++, p++) {
                                                 buf[i*2+0] = *p;                                                  buf[i*2+0] = *p;
                                                 buf[i*2+1] = *(p+0x800);                                                  buf[i*2+1] = *(p+0x800);
                                         }                                          }
                                         i286_memstr_write(I286_BX, I286_CX, buf, 34);                                          i286_memstr_write(CPU_BX, CPU_CX, buf, 34);
                                         break;                                          break;
                         }                          }
                         break;                          break;
Line 477  void bios0x18(void) { Line 477  void bios0x18(void) {
                         break;                          break;
   
                 case 0x16:                                              // テキストVRAMの初期化                  case 0x16:                                              // テキストVRAMの初期化
                         bios0x18_16(I286_DL, I286_DH);                          bios0x18_16(CPU_DL, CPU_DH);
                         break;                          break;
   
                 case 0x17:                                              // ブザーの起呼                  case 0x17:                                              // ブザーの起呼
Line 492  void bios0x18(void) { Line 492  void bios0x18(void) {
                         break;                          break;
   
                 case 0x1a:                                              // ユーザー文字の定義                  case 0x1a:                                              // ユーザー文字の定義
                         if ((I286_DH & 0x7e) == 0x76) {                          if ((CPU_DH & 0x7e) == 0x76) {
                                 i286_memstr_read(I286_BX, I286_CX+2, buf, 32);                                  i286_memstr_read(CPU_BX, CPU_CX + 2, buf, 32);
                                 p = fontrom + ((I286_DL & 0x7f) << 12)                                  p = fontrom + ((CPU_DL & 0x7f) << 12)
                                                         + (((I286_DH - 0x20) & 0x7f) << 4);                                                          + (((CPU_DH - 0x20) & 0x7f) << 4);
                                 for (i=0; i<16; i++, p++) {                                  for (i=0; i<16; i++, p++) {
                                         *p = buf[i*2+0];                                          *p = buf[i*2+0];
                                         *(p+0x800) = buf[i*2+1];                                          *(p+0x800) = buf[i*2+1];
Line 505  void bios0x18(void) { Line 505  void bios0x18(void) {
                         break;                          break;
   
                 case 0x1b:                                              // KCGアクセスモードの設定                  case 0x1b:                                              // KCGアクセスモードの設定
                         switch(I286_AL) {                                               // 実装し忘れ   // ver0.28                          switch(CPU_AL) {
                                 case 0:                                  case 0:
                                         mem[MEMB_CRT_STS_FLAG] &= ~0x08;                                          mem[MEMB_CRT_STS_FLAG] &= ~0x08;
                                         gdc.mode1 &= ~0x20;                                          gdc.mode1 &= ~0x20;
Line 542  void bios0x18(void) { Line 542  void bios0x18(void) {
                         gdc_forceready(&gdc.s);                          gdc_forceready(&gdc.s);
   
                         ZeroMemory(&gdc.s.para[GDC_SCROLL], 8);                          ZeroMemory(&gdc.s.para[GDC_SCROLL], 8);
                         switch(I286_CH & 0xc0) {                          switch(CPU_CH & 0xc0) {
                                 case 0x40:                                      // UPPER                                  case 0x40:                                      // UPPER
                                         if ((mem[MEMB_PRXDUPD] & 0x24) == 0x24) {                                          if ((mem[MEMB_PRXDUPD] & 0x24) == 0x24) {
                                                 mem[MEMB_PRXDUPD] ^= 4;                                                  mem[MEMB_PRXDUPD] ^= 4;
Line 578  void bios0x18(void) { Line 578  void bios0x18(void) {
                                         gdc.s.para[GDC_CSRFORM] = 0;                                          gdc.s.para[GDC_CSRFORM] = 0;
                                         break;                                          break;
                         }                          }
                         gdcs.disp = (I286_CH >> 4) & 1;                         // 00/05/23                          gdcs.disp = (CPU_CH >> 4) & 1;
                         gdcs.grphdisp |= GDCSCRN_ALLDRAW2;                          gdcs.grphdisp |= GDCSCRN_ALLDRAW2;
                         screenupdate |= 2;                          screenupdate |= 2;
                         break;                          break;
   
                 case 0x43:                                              // パレットの設定                  case 0x43:                                              // パレットの設定
                         i286_memstr_read(I286_DS, I286_BX + offsetof(UCWTBL, GBCPC),                          i286_memstr_read(CPU_DS, CPU_BX + offsetof(UCWTBL, GBCPC),
                                                                                                                                         buf, 4);                                                                                                                                          buf, 4);
                         pal = LOADINTELDWORD(buf);                          pal = LOADINTELDWORD(buf);
                         for (i=8; i--;) {                          for (i=8; i--;) {

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


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