Diff for /np2/bios/bios19.c between versions 1.5 and 1.8

version 1.5, 2004/03/04 17:36:05 version 1.8, 2005/05/20 13:59:46
Line 19  static const UINT rs_speed[] = { Line 19  static const UINT rs_speed[] = {
   
 void bios0x19(void) {  void bios0x19(void) {
   
         BYTE    speed;          UINT8   speed;
         BYTE    mode;          UINT8   mode;
         RSBIOS  rsb;          RSBIOS  rsb;
         UINT16  doff;          UINT16  doff;
         UINT16  cnt;          UINT16  cnt;
         UINT16  dseg;          UINT16  dseg;
         BYTE    flag;          UINT8   flag;
   
         if (CPU_AH < 2) {          if (CPU_AH < 2) {
                 // 通信速度…                  // 通信速度…
Line 58  void bios0x19(void) { Line 58  void bios0x19(void) {
                 iocore_out8(0x32, CPU_CL);      // cmd                  iocore_out8(0x32, CPU_CL);      // cmd
 #endif  #endif
                 iocore_out8(0x77, 0xb6);                  iocore_out8(0x77, 0xb6);
                 iocore_out8(0x75, (BYTE)rs_speed[speed]);                  iocore_out8(0x75, (UINT8)rs_speed[speed]);
                 iocore_out8(0x75, (BYTE)(rs_speed[speed] >> 8));                  iocore_out8(0x75, (UINT8)(rs_speed[speed] >> 8));
   
                 ZeroMemory(&rsb, sizeof(rsb));                  ZeroMemory(&rsb, sizeof(rsb));
                 rsb.FLAG = (CPU_AH << 4);                  rsb.FLAG = (CPU_AH << 4);
Line 95  void bios0x19(void) { Line 95  void bios0x19(void) {
                 // ポインタ〜                  // ポインタ〜
                 SETBIOSMEM16(MEMW_RS_CH0_OFST, CPU_DI);                  SETBIOSMEM16(MEMW_RS_CH0_OFST, CPU_DI);
                 SETBIOSMEM16(MEMW_RS_CH0_SEG, CPU_ES);                  SETBIOSMEM16(MEMW_RS_CH0_SEG, CPU_ES);
                 MEML_WRITESTR(CPU_ES, CPU_DI, &rsb, sizeof(rsb));                  MEMR_WRITES(CPU_ES, CPU_DI, &rsb, sizeof(rsb));
   
                 CPU_AH = 0;                  CPU_AH = 0;
         }          }
Line 106  void bios0x19(void) { Line 106  void bios0x19(void) {
                         CPU_AH = 1;                          CPU_AH = 1;
                         return;                          return;
                 }                  }
                 flag = i286_membyte_read(dseg, doff + R_FLAG);                  flag = MEMR_READ8(dseg, doff + R_FLAG);
                 if (!(flag & RFLAG_INIT)) {                  if (!(flag & RFLAG_INIT)) {
                         CPU_AH = 1;                          CPU_AH = 1;
                         return;                          return;
                 }                  }
                 switch(CPU_AH) {                  switch(CPU_AH) {
                         case 0x02:                          case 0x02:
                                 CPU_CX = i286_memword_read(dseg, doff + R_CNT);                                  CPU_CX = MEMR_READ16(dseg, doff + R_CNT);
                                 break;                                  break;
   
                         case 0x03:                          case 0x03:
Line 121  void bios0x19(void) { Line 121  void bios0x19(void) {
                                 break;                                  break;
   
                         case 0x04:                          case 0x04:
                                 cnt = i286_memword_read(dseg, doff + R_CNT);                                  cnt = MEMR_READ16(dseg, doff + R_CNT);
                                 if (cnt) {                                  if (cnt) {
                                         UINT16  pos;                                          UINT16  pos;
   
                                         // データ引き取り                                          // データ引き取り
                                         pos = i286_memword_read(dseg, doff + R_GETP);                                          pos = MEMR_READ16(dseg, doff + R_GETP);
                                         CPU_CX = i286_memword_read(dseg, pos);                                          CPU_CX = MEMR_READ16(dseg, pos);
   
                                         // 次のポインタをストア                                          // 次のポインタをストア
                                         pos += 2;                                          pos += 2;
                                         if (pos >= i286_memword_read(dseg, doff + R_TAILP)) {                                          if (pos >= MEMR_READ16(dseg, doff + R_TAILP)) {
                                                 pos = i286_memword_read(dseg, doff + R_HEADP);                                                  pos = MEMR_READ16(dseg, doff + R_HEADP);
                                         }                                          }
                                         i286_memword_write(dseg, doff + R_GETP, pos);                                          MEMR_WRITE16(dseg, doff + R_GETP, pos);
   
                                         // カウンタをデクリメント                                          // カウンタをデクリメント
                                         cnt--;                                          cnt--;
                                         i286_memword_write(dseg, doff + R_CNT, cnt);                                          MEMR_WRITE16(dseg, doff + R_CNT, cnt);
   
                                         // XONを送信?                                          // XONを送信?
                                         if ((flag & RFLAG_XOFF) &&                                           if ((flag & RFLAG_XOFF) && 
                                                 (cnt < i286_memword_read(dseg, doff + R_XOFF))) {                                                  (cnt < MEMR_READ16(dseg, doff + R_XOFF))) {
                                                 iocore_out8(0x30, RSCODE_XON);                                                  iocore_out8(0x30, RSCODE_XON);
                                                 flag &= ~RFLAG_XOFF;                                                  flag &= ~RFLAG_XOFF;
                                         }                                          }
                                         flag &= ~RFLAG_BOVF;                                          flag &= ~RFLAG_BOVF;
                                         CPU_AH = 0;                                          CPU_AH = 0;
                                         i286_membyte_write(dseg, doff + R_FLAG, flag);                                          MEMR_WRITE8(dseg, doff + R_FLAG, flag);
                                         return;                                          return;
                                 }                                  }
                                 else {                                  else {
Line 160  void bios0x19(void) { Line 160  void bios0x19(void) {
                                 iocore_out8(0x32, CPU_AL);                                  iocore_out8(0x32, CPU_AL);
                                 if (CPU_AL & RCMD_IR) {                                  if (CPU_AL & RCMD_IR) {
                                         flag &= ~RFLAG_INIT;                                          flag &= ~RFLAG_INIT;
                                         i286_membyte_write(dseg, doff + R_FLAG, flag);                                          MEMR_WRITE8(dseg, doff + R_FLAG, flag);
                                         sysport.c &= ~1;                                          sysport.c &= ~1;
                                         pic.pi[0].imr |= PIC_RS232C;                                          pic.pi[0].imr |= PIC_RS232C;
                                 }                                  }
Line 172  void bios0x19(void) { Line 172  void bios0x19(void) {
                                         sysport.c |= 1;                                          sysport.c |= 1;
                                         pic.pi[0].imr &= ~PIC_RS232C;                                          pic.pi[0].imr &= ~PIC_RS232C;
                                 }                                  }
                                 i286_membyte_write(dseg, doff + R_CMD, CPU_AL);                                  MEMR_WRITE8(dseg, doff + R_CMD, CPU_AL);
                                 break;                                  break;
   
                         case 0x06:                          case 0x06:
                                 CPU_CH = iocore_inp8(0x32);                                  CPU_CH = iocore_inp8(0x32);
                                 CPU_CL = iocore_inp8(0x33);                                  CPU_CL = iocore_inp8(0x33);
Line 181  void bios0x19(void) { Line 182  void bios0x19(void) {
                 }                  }
                 CPU_AH = 0;                  CPU_AH = 0;
                 if (flag & RFLAG_BOVF) {                  if (flag & RFLAG_BOVF) {
                         i286_membyte_write(dseg, doff + R_FLAG,                          MEMR_WRITE8(dseg, doff + R_FLAG, (UINT8)(flag & (~RFLAG_BOVF)));
                                                                                         (BYTE)(flag & (~RFLAG_BOVF)));  
                         CPU_AH = 2;                          CPU_AH = 2;
                 }                  }
         }          }

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


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