示例#1
0
文件: powerpak.c 项目: basecq/q2dos
void WriteRealMem (REALPTR rp, const void *src, int size)
{
  DWORD lin = (RP_SEG(rp) << 4) + RP_OFF(rp);

  __asm {
    push es
    push edi
    push esi
    mov  es, _watt_dos_ds
    mov  edi, lin
    mov  esi, src
    mov  ecx, size
    shr  ecx, 2
    cld
    db   0F3h, 0A5h   /* rep movsd */
    mov  ecx, size
    and  ecx, 3
    rep  movsb        /* move rest */
    pop  esi
    pop  edi
    pop  es
  }
}
示例#2
0
文件: powerpak.c 项目: basecq/q2dos
void ReadRealMem (void *dst, REALPTR rp, unsigned size)
{
  DWORD lin = (RP_SEG(rp) << 4) + RP_OFF(rp);

  __asm {
    push ds
    push edi
    push esi
    mov  ds, _watt_dos_ds
    mov  esi, lin
    mov  edi, dst
    mov  ecx, size
    shr  ecx, 2
    cld
    db   0F3h, 0A5h   /* rep movsd */
    mov  ecx, size
    and  ecx, 3
    rep  movsb        /* move rest */
    pop  esi
    pop  edi
    pop  ds
  }
}
示例#3
0
文件: bsdname.c 项目: basecq/q2dos
/**
 * Try asking a LAN extension of DOS for a host-name.
 */
int _get_machine_name (char *buf, int size)
{
  IREGS reg;
  char *h;
  char  dosBuf[16];
  int   len;

  memset (&reg, 0, sizeof(reg));
  reg.r_ax = 0x5E00;

#if (DOSX & DJGPP)
  if (_go32_info_block.size_of_transfer_buffer < sizeof(dosBuf))
     return (-1);
  reg.r_ds = __tb / 16;
  reg.r_dx = __tb & 15;

#elif (DOSX & (PHARLAP|X32VM|POWERPAK))
  if (_watt_dosTbSize < sizeof(dosBuf) || !_watt_dosTbr)
     return (-1);
  reg.r_ds = RP_SEG (_watt_dosTbr);
  reg.r_dx = RP_OFF (_watt_dosTbr);

#elif (DOSX & DOS4GW)
  if (_watt_dosTbSize < sizeof(dosBuf) || !_watt_dosTbSeg)
     return (-1);
  reg.r_ds = _watt_dosTbSeg;
  reg.r_dx = 0;

#elif (DOSX == 0)
  reg.r_ds = FP_SEG (dosBuf);
  reg.r_dx = FP_OFF (dosBuf);

#else
  #error Help me!
#endif

  GEN_INTERRUPT (0x21, &reg);
  if ((reg.r_flags & CARRY_BIT) || hiBYTE(reg.r_cx) == 0)
     return (-1);

#if (DOSX & DJGPP)
  dosmemget (__tb, sizeof(dosBuf), dosBuf);

#elif (DOSX & (PHARLAP|X32VM|POWERPAK))
  ReadRealMem ((void*)&dosBuf, _watt_dosTbr, sizeof(dosBuf));

#elif (DOSX & DOS4GW)
  memcpy (dosBuf, SEG_OFS_TO_LIN(_watt_dosTbSeg,0), sizeof(dosBuf));
#endif

  /* Remove right space padding
   */
  h = dosBuf + min (strlen(dosBuf), sizeof(dosBuf)-1);
  while (h > dosBuf && h[-1] == ' ')
        h--;

  *h  = '\0';
  h   = dosBuf;
  len = strlen (h);
  if (len + 1 > size)
  {
    SOCK_ERRNO (ERANGE);
    return (-1);
  }
  strcpy (buf, h);
  strlwr (buf);
  return (0);
}
示例#4
0
int GetCountryCode (void)
{
#if (DOSX & DJGPP)    /* _osmajor/_osminor not set in crt0.o */
  _get_dos_version (0);
#endif

  if (_osmajor >= 3)
  {
#if (DOSX & DJGPP)
    __dpmi_regs reg;

    reg.d.edx = 0;
    reg.x.ds  = __tb / 16;
    reg.d.eax = 0x3800;
    __dpmi_int (0x21, &reg);
    if (reg.x.flags & 1)
       return (0);
    dosmemget (__tb, sizeof(_country_info), &_country_info);
    return (reg.x.bx);

#elif (DOSX & PHARLAP)
    SWI_REGS reg;

    if (_watt_dosTbSize < sizeof(_country_info))
       return (0);

    reg.edx = RP_OFF (_watt_dosTbr);
    reg.ds  = RP_SEG (_watt_dosTbr);
    reg.eax = 0x3800;
    _dx_real_int (0x21, &reg);
    if (reg.flags & 1)
       return (0);
    ReadRealMem (&_country_info, _watt_dosTbr, sizeof(_country_info));
    return (reg.ebx);

#elif (DOSX & (DOS4GW|WDOSX))
    union  REGS  reg;
    struct SREGS sreg;

    if (_watt_dosTbSize < sizeof(_country_info))
       return (0);
 
    reg.x.edx = 0;
    sreg.ds   = _watt_dosTbSeg;
    reg.x.eax = 0x3800;
    int386x (0x21, &reg, &reg, &sreg);
    if (reg.x.cflag)
       return (0);
    memcpy (&_country_info, SEG_OFS_TO_LIN(_watt_dosTbSeg,0),
            sizeof(_country_info));
    return (reg.w.bx);

#elif (DOSX & POWERPAK)
    UNFINISED();

#elif (DOSX == 0)        /* real-mode */
    union  REGS  reg;
    struct SREGS sreg;
 
    reg.x.dx = FP_OFF (_country_info);
    sreg.ds  = FP_SEG (_country_info);
    reg.x.ax = 0x3800;
    int86x (0x21, &reg, &reg, &sreg);
    if (reg.x.cflag)
       return (0);
    return (reg.x.bx);

#else
  #error Unsupported target
#endif
  }
  return (0);
}