亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? bios.c

?? Due to an increase in demand for and questions about direct disk access for Micrososft platforms, a
?? C
字號:
/*
 * dos\bios.c   INT 13h functions
 *
 * This file is part of the BETA version of DISKLIB
 * Copyright (C) 1998, Gregg Jennings
 *
 * See README.TXT for information about re-distribution.
 * See DISKLIB.TXT for information about usage.
 *
 * 12-Dec-1998  greggj  disk_get_physical() used to return AX!
 *
 */

/*
 * Note: These functions work under MS-DOS, Windows 95 and 98
 *       except as noted.
 *
 *       These functions only work on floppy drives under
 *       Windows NT.
 *
 */

#include <string.h>         /* memset */
#include <limits.h>         /* CHAR_BIT */

#include <dos.h>            /* REGS, etc. */
#include <bios.h>           /* bios_disk */

#include "debug.h"
#include "dosio.h"
#include "disklib.h"

static int adjdrv(int drv);

/*
 * disk_get_physical    get basic disk geometry (tracks, sectors, heads)
 *
 */

extern int disk_get_physical(int disk, int *t, int *s, int *h)
{
unsigned int tmp;
union REGS regs DBG_0;
#ifdef AMIBIOS
struct SREGS sregs;
char byte, *bug;
#endif

#ifndef NDEBUG
    if (t) *t = 0;
    if (s) *s = 0;
    if (h) *h = 0;
#endif

    regs.x.ax = 0x0800;
    regs.h.dl = (unsigned char)adjdrv(disk);

#ifdef AMIBIOS
    segread(&sregs);                /* get DS */
    bug = MK_FP(sregs.ds,0x74);     /* point to DS:0074 */
    byte = *bug;                    /* stash byte at DS:0074 */
#endif

    DBG_reg_dump(&regs,NULL);

    int86(0x13,&regs,&regs);

    DBG_reg_dump(&regs,NULL);

#ifdef AMIBIOS
    *bug = byte;                    /* restore */
#endif

    if (regs.x.cflag)
        return (int)regs.h.ah;

    if (h) *h = regs.h.dh;
    if (t) *t = regs.h.ch;          /* low bits only */
    tmp = regs.h.cl;                /* has high bits of track also */
    if (s) *s = regs.h.cl;
    if (s) *s &= 0x3f;              /* mask off track high bits */
    if (t) *t += (tmp >> 6) << 8;   /* shift and add track high bits */

    return DISK_OK;
}

/*
 * disk_get_physical_ext    get basic disk geometry (tracks, sectors, heads)
 *
 */

extern int disk_get_physical_ext(int disk, int *t, int *s, int *h)
{
union REGS regs DBG_0;
struct SREGS sregs DBG_0;
struct DISK_PACKET b DBG_0;
struct DISK_PACKET *buf;

#ifndef NDEBUG
    if (t) *t = 0;
    if (s) *s = 0;
    if (h) *h = 0;
#endif

    /*
        Microsoft bombs if the address of operator is used in the
        FP_OFF() or FP_SEG() macros so a pointer is kludged here so
        there is no need for prepocessor conditionals for MS.
    */

    buf = &b;
    b.size = sizeof(struct DISK_PACKET);
    regs.x.ax = 0x4800;
    regs.h.dl = (unsigned char)adjdrv(disk);
    regs.x.si = FP_OFF(buf);
    sregs.ds = FP_SEG(buf);

    DBG_reg_dump(&regs,&sregs);

    int86(0x13,&regs,&regs);

    DBG_reg_dump(&regs,&sregs);

    if (regs.x.cflag)
        return disk_get_physical(disk,t,s,h);

    if (t) *t = b.cylinders - 2;
    if (h) *h = b.heads - 1;
    if (s) *s = b.sectors;

    return DISK_OK;
}

/*
 * disk_read_p      read sector(s)
 *
 */

extern int disk_read_p(int disk, int trk, int sec, int head,
                       void *buf, int nsecs)
{
unsigned int i;
struct _diskinfo_t blk;

    DBG_zero(buf,nsecs*512);    /* for efficiency, only zero if debugging */

    blk.drive = adjdrv(disk);
    blk.track = trk;
    blk.sector = sec;
    blk.head = head;
    blk.nsectors = nsecs;
    blk.buffer = buf;

    _bios_disk(_DISK_READ,&blk);
    i = _bios_disk(_DISK_STATUS,&blk);

#ifdef TRACE
    printf("Int 13h, 02h: AX = %04xh\n",i);
#endif

    /*
        Probably should use int86() so that there can be a register
        dump...
    */

    i >>= CHAR_BIT;     /* AH contains result; AL sectors read */

    return (i) ? i : DISK_OK;
}

/*
 * disk_write_p     write sector(s)
 *
 */

extern int disk_write_p(int disk, int trk, int sec, int head,
                        void *buf, int nsecs)
{
unsigned int i;
struct _diskinfo_t blk;

    blk.drive = adjdrv(disk);
    blk.track = trk;
    blk.sector = sec;
    blk.head = head;
    blk.nsectors = nsecs;
    blk.buffer = buf;

    _bios_disk(_DISK_WRITE,&blk);
    i = _bios_disk(_DISK_STATUS,&blk);

#ifdef TRACE
    printf("Int 13h, 03h: AX = %04xh\n",i);
#endif

    i >>= CHAR_BIT;     /* AH contains result; AL sectors read */

    return (i) ? i : DISK_OK;
}

/*
 * disk_verify_p    verify sector(s)
 *
 */

extern int disk_verify_p(int disk, int trk, int sec, int head, int nsecs)
{
unsigned int i;
struct _diskinfo_t blk;

    blk.drive = adjdrv(disk);
    blk.track = trk;
    blk.sector = sec;
    blk.head = head;
    blk.nsectors = nsecs;

    i = _bios_disk(_DISK_VERIFY,&blk);

#ifdef TRACE
    printf("Int 13h, 04h: AX = %04xh\n",i);
#endif

    /*
        Probably should use int86() so that there can be a register
        dump...
    */

    i >>= CHAR_BIT;     /* AH contains result; AL sectors read */

    return (i) ? i : DISK_OK;
}


extern int disk_reset(int disk)
{
unsigned int i;
struct _diskinfo_t blk;

    blk.drive = adjdrv(disk);
    i = _bios_disk(_DISK_RESET,&blk);
    i >>= CHAR_BIT;
    return (i) ? i : DISK_OK;
}

extern int disk_status(int disk)
{
unsigned i;
struct _diskinfo_t blk;

    blk.drive = adjdrv(disk);
    i = _bios_disk(_DISK_STATUS,&blk);
    return i >> CHAR_BIT;
}

/*
 * disk_part        get disk partition sector (first physical sector)
 *
 */

extern int disk_part(int disk, int c, int h, int s, void *buf)
{
    DBG_zero(buf,512);

    return disk_read_p(disk,c,s,h,buf,1);
}

/*
 * disk_type        get disk (partition) type
 *
 */

extern int disk_type(int disk)
{
int i;
unsigned char buf[512];

    DBG_zero(buf,512);

    i = disk_read_p(disk,0,1,0,buf,1);
    if (i != DISK_OK)
        return 0;
#ifdef __GNUC__
    return (int)buf[0x1be + 4];     /* bug or what! */
#else
    return (int)buf[0x1be+4];
#endif
}

static struct int13_msg {
   int code;
   char *msg;
} int13_diskerr_msg[] = {
   { 0x01, "bad command/unknown drive" },
   { 0x02, "address mark not found" },
   { 0x03, "write-protected disk" },
   { 0x04, "sector not found" },
   { 0x05, "reset failed" },
   { 0x06, "diskette removed or changed" },
   { 0x07, "bad parameter table" },
   { 0x08, "DMA overrun" },
   { 0x09, "attempt to DMA across 64K boundary" },
   { 0x0A, "bad sector detected" },
   { 0x0B, "bad track detected" },
   { 0x0C, "unsupported track or media type not found" },
   { 0x0D, "invalid number of sectors on format" },
   { 0x0E, "control data address mark detected" },
   { 0x0F, "DMA arbitration level out of range" },
   { 0x10, "uncorrectable CRC/EEC on read" },
   { 0x11, "ECC corrected data error" },
   { 0x20, "controller failure" },
   { 0x40, "seek failed" },
   { 0x80, "timeout" },
   { 0xAA, "drive not ready" },
   { 0xBB, "undefined error" },
   { 0xCC, "write fault" },
   { 0xE0, "status error" },
   { 0xFF, "sense operation failed" },
   { 0,    "unknown error" }
};

#define nerrors (sizeof(int13_diskerr_msg)/sizeof(struct int13_msg))

extern const char *disk_error(int error)
{
int i;
char *errmsg;

   for (i = 0; i < nerrors-1; i++)
      if (int13_diskerr_msg[i].code == error)
         break;

   errmsg = int13_diskerr_msg[i].msg;

   return errmsg;
}



/* floppys: 0 - 7Fh, hards: 80h - FFh */

static int adjdrv(int drv)
{
    if (drv > 1)
        return drv + 0x80 - 2;
    return drv;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91.com在线观看| 成人精品在线视频观看| 欧美久久久久免费| 午夜电影一区二区三区| 日韩午夜电影av| 国产精品亚洲午夜一区二区三区 | 成人免费一区二区三区视频| 99久久99久久精品免费看蜜桃| 亚洲精品国产一区二区精华液| 色偷偷一区二区三区| 午夜a成v人精品| 精品免费99久久| 成人国产亚洲欧美成人综合网 | 亚洲成av人**亚洲成av**| 欧美精品99久久久**| 国内精品在线播放| 国产精品美女www爽爽爽| 欧美日精品一区视频| 久久精品国产精品亚洲红杏| 国产精品视频yy9299一区| 欧美亚洲动漫精品| 国产一区二区三区四区五区美女 | 一区二区欧美视频| 7777精品伊人久久久大香线蕉 | 91亚洲精品乱码久久久久久蜜桃 | 一区二区三区中文字幕精品精品| 欧美私人免费视频| 国产寡妇亲子伦一区二区| 亚洲麻豆国产自偷在线| 日韩精品一区二区三区三区免费| 成+人+亚洲+综合天堂| 日本中文在线一区| 亚洲美女电影在线| 久久久久青草大香线综合精品| 在线看一区二区| 国产精品一级在线| 日韩vs国产vs欧美| 亚洲精品网站在线观看| 久久精品亚洲一区二区三区浴池| 欧美日韩一区高清| 成人av电影在线| 九九**精品视频免费播放| 一区二区三区在线视频观看| 久久久国产一区二区三区四区小说 | 日韩欧美国产麻豆| 色婷婷精品大视频在线蜜桃视频| 精品一区二区三区在线观看国产| 亚洲激情图片小说视频| 国产精品情趣视频| www亚洲一区| 91精品在线一区二区| 欧美性受xxxx| 色拍拍在线精品视频8848| 国产精品99久久久| 久久精品噜噜噜成人88aⅴ| 午夜日韩在线观看| 亚洲精品欧美在线| 17c精品麻豆一区二区免费| 久久久久久久久一| 欧美精品一区男女天堂| 欧美一区二区网站| 欧美一区二区三区成人| 欧美日韩国产综合草草| 在线亚洲+欧美+日本专区| 99r国产精品| 99麻豆久久久国产精品免费| 国产河南妇女毛片精品久久久 | 99精品视频在线观看免费| 国产激情视频一区二区在线观看| 久久成人久久爱| 免费观看91视频大全| 水野朝阳av一区二区三区| 一区二区三区欧美视频| 亚洲精品欧美专区| 一区二区在线看| 一区二区在线观看av| 亚洲视频在线一区二区| 亚洲欧洲综合另类| 亚洲视频1区2区| 亚洲天堂a在线| 亚洲永久精品国产| 五月天亚洲精品| 美脚の诱脚舐め脚责91| 经典一区二区三区| 国产福利一区在线观看| 国产成人一级电影| 成人av资源网站| 91麻豆国产在线观看| 色哟哟一区二区| 欧美日韩一区 二区 三区 久久精品| 欧美日韩在线观看一区二区| 7777精品伊人久久久大香线蕉 | 777xxx欧美| 精品国产成人在线影院| 国产亚洲成aⅴ人片在线观看 | 久久免费电影网| 中日韩av电影| 一区二区三区美女| 日韩av一区二区三区| 狠狠狠色丁香婷婷综合激情| 国产成人日日夜夜| 91网站黄www| 日韩一区二区在线免费观看| 亚洲精品在线电影| 日韩毛片高清在线播放| 午夜久久久久久久久久一区二区| 久久97超碰国产精品超碰| 成人深夜福利app| 精品视频在线视频| 久久综合999| 亚洲精品视频免费观看| 激情文学综合插| 91国产精品成人| www久久精品| 一区二区三区在线视频播放| 极品少妇一区二区三区精品视频| av激情综合网| 日韩一区二区高清| 国产精品高潮久久久久无| 奇米精品一区二区三区在线观看 | 92精品国产成人观看免费| 欧美性色综合网| 国产日产欧美精品一区二区三区| 夜夜精品浪潮av一区二区三区| 国内精品久久久久影院薰衣草| 91一区二区在线| 久久精品在线免费观看| 香蕉久久夜色精品国产使用方法| 国产一二精品视频| 欧美乱熟臀69xxxxxx| 国产精品久久久久久久久图文区| 日韩黄色在线观看| 91在线看国产| 国产视频一区二区在线观看| 午夜视频一区二区| 在线亚洲高清视频| 国产精品久久久久一区 | 国产精品天天看| 久久精品噜噜噜成人av农村| 日本高清不卡在线观看| 亚洲国产精品精华液ab| 久久 天天综合| 欧美美女一区二区在线观看| 国产精品久久网站| 狠狠狠色丁香婷婷综合激情| 7777精品伊人久久久大香线蕉完整版| 日韩伦理av电影| 99久久精品国产毛片| 国产日韩欧美一区二区三区乱码| 久久99精品一区二区三区三区| 欧美日韩国产精品成人| 亚洲黄色av一区| 日本高清不卡在线观看| 自拍偷拍亚洲激情| 成人18视频日本| 国产欧美视频一区二区三区| 久久99国产精品免费| 欧美一区二区三区视频在线 | 久久精品视频免费观看| 狠狠色综合日日| 精品国产91久久久久久久妲己 | 亚洲图片激情小说| 成人av资源网站| 一区在线观看免费| 91亚洲精品久久久蜜桃| 亚洲日本乱码在线观看| 91欧美激情一区二区三区成人| 国产精品国产三级国产有无不卡| 成人美女视频在线看| 国产精品嫩草影院com| 成人app下载| 亚洲免费资源在线播放| 在线精品视频一区二区三四| 亚洲一区二区视频在线| 欧美日韩三级视频| 丝袜美腿一区二区三区| 欧美成人vps| 国产成人免费9x9x人网站视频| 中文字幕精品一区| 一本一本大道香蕉久在线精品| 亚洲精选一二三| 欧美精品欧美精品系列| 美女免费视频一区二区| 久久久久久久免费视频了| www.av精品| 亚洲福利国产精品| 欧美成人vps| a4yy欧美一区二区三区| 一区二区不卡在线播放| 制服丝袜成人动漫| 国产一区二区三区综合| 亚洲欧洲99久久| 欧美精品777| 国产成人激情av| 一区二区国产视频| 欧美成人性福生活免费看| 国产91精品一区二区| 亚洲一二三四区不卡| 精品少妇一区二区| 91女人视频在线观看|