⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 biosdisk.c

📁 Algorithms for Image Processing and Computer Vision Source Code
💻 C
字号:
#include <bios.h>
#include <go32.h>
#include <dpmi.h>
#include <stdlib.h>

#define tb _go32_info_block.linear_address_of_transfer_buffer

static int dos_segment = 0;
static _go32_dpmi_seginfo dos_info;

static void free_dos_buffer()
{
  _go32_dpmi_free_dos_memory(&dos_info);
  dos_segment = 0;
}

static void alloc_dos_buffer()
{
  if (dos_segment)
    return;
  dos_info.size = 18 * 512 / 16;
  if (_go32_dpmi_allocate_dos_memory(&dos_info))
  {
    dos_segment = 0;
    return;
  }
  dos_segment = dos_info.rm_segment;
  atexit(free_dos_buffer);
}

int biosdisk(int cmd, int drive, int head, int track,
	     int sector, int nsects, void *buffer)
{
  int seg=0, ofs=0, xfer=0, before=0;
  _go32_dpmi_registers r;
  switch (cmd)
  {
  case 2:
    xfer = 512 * nsects;
    before = 0;
    break;
  case 3:
    xfer = 512 * nsects;
    before = 1;
    break;
  case 5:
    xfer = 2 * 256;
    before = 1;
    break;
  case 0x0a:
    xfer = (512+7) * nsects;
    before = 0;
    break;
  case 0x0b:
    xfer = (512+7) * nsects;
    before = 1;
    break;
  case 0x0e:
    xfer = 512;
    before = 0;
    break;
  case 0x0f:
    xfer = 512;
    before = 1;
    break;
  }
  if (xfer)
  {
    if (xfer > 18*512)
      return 1;			/* bad command */
    if (xfer > _go32_info_block.size_of_transfer_buffer)
    {
      alloc_dos_buffer();
      if (dos_segment == 0)
	return 0xbb;		/* undefined error */
      seg = dos_segment;
      ofs = 0;
    }
    else
    {
      seg = tb >> 4;
      ofs = tb & 15;
    }
  }
  memset(&r, 0, sizeof(r));
  r.h.ah = cmd;
  r.h.al = nsects;
  r.x.es = seg;
  r.x.bx = ofs;
  r.h.ch = track & 0xff;
  r.h.cl = sector | ((track >> 2) & 0xc0);
  r.h.dh = head;
  r.h.dl = drive;
  if (xfer && before)
    dosmemput(buffer, xfer, seg*16+ofs);
  _go32_dpmi_simulate_int(0x13, &r);
  if (xfer && !before)
    dosmemget(seg*16+ofs, xfer, buffer);
  if (cmd == 0x08)
  {
    ((short *)buffer)[0] = r.x.cx;
    ((short *)buffer)[1] = r.x.dx;
  }
  return r.h.ah;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -