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

version 1.1, 2003/10/16 17:58:21 version 1.8, 2005/05/20 13:59:46
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 20  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 (I286_AH < 2) {          if (CPU_AH < 2) {
                 // 通信速度…                  // 通信速度…
                 mode = I286_CH | 0x02;                  mode = CPU_CH | 0x02;
                 speed = I286_AL;                  speed = CPU_AL;
                 if (speed >= 8) {                  if (speed >= 8) {
                         speed = 4;                                              // 1200bps                          speed = 4;                                              // 1200bps
                 }                  }
                 if (mem[MEMB_BIOS_FLAG] & 0x80) {       // 4MHz?                  if (mem[MEMB_BIOS_FLAG1] & 0x80) {      // 4MHz?
                         speed += 12;                          speed += 12;
                 }                  }
   
Line 56  void bios0x19(void) { Line 55  void bios0x19(void) {
                 iocore_out8(0x32, 0x00);                // dummy instruction                  iocore_out8(0x32, 0x00);                // dummy instruction
                 iocore_out8(0x32, 0x40);                // reset                  iocore_out8(0x32, 0x40);                // reset
                 iocore_out8(0x32, mode);                // mode                  iocore_out8(0x32, mode);                // mode
                 iocore_out8(0x32, I286_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 = (I286_AH << 4);                  rsb.FLAG = (CPU_AH << 4);
                 rsb.CMD = I286_CL;                  rsb.CMD = CPU_CL;
                 sysport.c &= ~7;                  sysport.c &= ~7;
                 if (!(I286_CL & RCMD_IR)) {                  if (!(CPU_CL & RCMD_IR)) {
                         rsb.FLAG |= RFLAG_INIT;                          rsb.FLAG |= RFLAG_INIT;
                         if (I286_CL & RCMD_RXE) {                          if (CPU_CL & RCMD_RXE) {
                                 sysport.c |= 1;                                  sysport.c |= 1;
                                 pic.pi[0].imr &= ~PIC_RS232C;                                  pic.pi[0].imr &= ~PIC_RS232C;
                         }                          }
                 }                  }
   
                 rsb.STIME = I286_BH;                  rsb.STIME = CPU_BH;
                 if (!rsb.STIME) {                  if (!rsb.STIME) {
                         rsb.STIME = 0x04;                          rsb.STIME = 0x04;
                 }                  }
                 rsb.RTIME = I286_BL;                  rsb.RTIME = CPU_BL;
                 if (!rsb.RTIME) {                  if (!rsb.RTIME) {
                         rsb.RTIME = 0x40;                          rsb.RTIME = 0x40;
                 }                  }
                 doff = I286_DI + sizeof(RSBIOS);                  doff = CPU_DI + sizeof(RSBIOS);
                 STOREINTELWORD(rsb.HEADP, doff);                  STOREINTELWORD(rsb.HEADP, doff);
                 STOREINTELWORD(rsb.PUTP, doff);                  STOREINTELWORD(rsb.PUTP, doff);
                 STOREINTELWORD(rsb.GETP, doff);                  STOREINTELWORD(rsb.GETP, doff);
                 doff += I286_DX;                  doff += CPU_DX;
                 STOREINTELWORD(rsb.TAILP, doff);                  STOREINTELWORD(rsb.TAILP, doff);
                 cnt = I286_DX >> 3;                  cnt = CPU_DX >> 3;
                 STOREINTELWORD(rsb.XOFF, cnt);                  STOREINTELWORD(rsb.XOFF, cnt);
                 cnt += I286_DX >> 2;                  cnt += CPU_DX >> 2;
                 STOREINTELWORD(rsb.XON, cnt);                  STOREINTELWORD(rsb.XON, cnt);
   
                 // ポインタ〜                  // ポインタ〜
                 SETBIOSMEM16(MEMW_RS_CH0_OFST, I286_DI);                  SETBIOSMEM16(MEMW_RS_CH0_OFST, CPU_DI);
                 SETBIOSMEM16(MEMW_RS_CH0_SEG, I286_ES);                  SETBIOSMEM16(MEMW_RS_CH0_SEG, CPU_ES);
                 i286_memstr_write(I286_ES, I286_DI, &rsb, sizeof(rsb));                  MEMR_WRITES(CPU_ES, CPU_DI, &rsb, sizeof(rsb));
   
                 I286_AH = 0;                  CPU_AH = 0;
         }          }
         else if (I286_AH < 7) {          else if (CPU_AH < 7) {
                 doff = GETBIOSMEM16(MEMW_RS_CH0_OFST);                  doff = GETBIOSMEM16(MEMW_RS_CH0_OFST);
                 dseg = GETBIOSMEM16(MEMW_RS_CH0_SEG);                  dseg = GETBIOSMEM16(MEMW_RS_CH0_SEG);
                 if ((!doff) && (!dseg)) {                  if ((!doff) && (!dseg)) {
                         I286_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)) {
                         I286_AH = 1;                          CPU_AH = 1;
                         return;                          return;
                 }                  }
                 switch(I286_AH) {                  switch(CPU_AH) {
                         case 0x02:                          case 0x02:
                                 I286_CX = i286_memword_read(dseg, doff + R_CNT);                                  CPU_CX = MEMR_READ16(dseg, doff + R_CNT);
                                 break;                                  break;
   
                         case 0x03:                          case 0x03:
                                 iocore_out8(0x30, I286_AL);                                  iocore_out8(0x30, CPU_AL);
                                 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);
                                         I286_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;
                                         I286_AH = 0;                                          CPU_AH = 0;
                                         i286_membyte_write(dseg, doff + R_FLAG, flag);                                          MEMR_WRITE8(dseg, doff + R_FLAG, flag);
                                         return;                                          return;
                                 }                                  }
                                 else {                                  else {
                                         I286_AH = 3;                                          CPU_AH = 3;
                                 }                                  }
                                 break;                                  break;
   
                         case 0x05:                          case 0x05:
                                 iocore_out8(0x32, I286_AL);                                  iocore_out8(0x32, CPU_AL);
                                 if (I286_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;
                                 }                                  }
                                 else if (!(I286_AL & RCMD_RXE)) {                                  else if (!(CPU_AL & RCMD_RXE)) {
                                         sysport.c &= ~1;                                          sysport.c &= ~1;
                                         pic.pi[0].imr |= PIC_RS232C;                                          pic.pi[0].imr |= PIC_RS232C;
                                 }                                  }
Line 173  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, I286_AL);                                  MEMR_WRITE8(dseg, doff + R_CMD, CPU_AL);
                                 break;                                  break;
   
                         case 0x06:                          case 0x06:
                                 I286_CH = iocore_inp8(0x32);                                  CPU_CH = iocore_inp8(0x32);
                                 I286_CL = iocore_inp8(0x33);                                  CPU_CL = iocore_inp8(0x33);
                                 break;                                  break;
                 }                  }
                 I286_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;
                         I286_AH = 2;  
                 }                  }
         }          }
         else {          else {
                 I286_AH = 0;                  CPU_AH = 0;
         }          }
 }  }
   

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


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