장 – 8
C를 사용한 디스크 BIOS 기능 및 인터럽트 처리
소개
이 장에서는 쉽고 짧은 방법으로 C를 사용하여 프로그램에서 인터럽트를 자유롭게 사용하고 처리할 수 있는 중요한 Disk-BIOS 기능과 기타 중요한 기능에 대해 설명합니다. 이러한 기능은 뒤로 – 데이터 복구 및 디스크 문제 해결 프로그래밍의 뼈대. 다음은 C 언어를 “높게 – 레벨 어셈블리 언어”.
biosdisk 및 _bios_disk 기능
이 두 기능은 데이터 복구 및 디스크 문제 해결 프로그래밍의 목적에 가장 중요한 기능입니다. 대부분의 경우 이러한 기능을 사용합니다.
이 두 가지는 BIOS 디스크 드라이브 서비스이며 biosdisk가 원시 섹터의 파일 수준 아래에서 작동하는 bios.h에 정의되어 있습니다. 이러한 기능을 조금만 주의해서 사용하면 하드 디스크의 파일 내용과 디렉터리가 파괴될 수 있습니다. biosdisk 및 _bios_disk 기능 모두 인터럽트 0x13을 사용하여 BIOS에 디스크 작업을 직접 실행합니다. _bios_disk 함수는 다음과 같은 방식으로 프로그램에서 선언됩니다.
unsigned _bios_disk(unsigned cmd, struct diskinfo_t *dinfo);
And the declaration for the bios disk function is as follows:
int biosdisk(int cmd, int drive, int head, int track,
int sector, int nsects, void *buffer);
이러한 매개변수의 의미는 다음 표에 설명되어 있습니다.
Parameter |
Function |
What It Is or what it does |
cmd |
Both |
Indicates the operation to perform such as read, write, verify etc.(See the description of cmd, given next) |
dinfo |
_bios_disk |
Points to a diskinfo_t structure that contains the remaining Parameters required by the operation.(see the description of diskinfo_t structure, given next) |
drive |
biosdisk |
Specifies which disk drive is to be used(0 for a:, 1for b: and 0x80 for first physical hard disk, 0x81 for second and so on.) |
head
track
sector |
biosdisk |
These specify the starting sector location from which the Operation is to be started. |
nsects |
biosdisk |
Number of sectors to read, write, verify etc. |
buffer |
biosdisk |
Memory address where data is to be read or written |
이 두 함수에서 데이터는 하드 디스크 섹터의 논리적 크기인 섹터당 512바이트로 버퍼에서 읽고 쓰여지며 두 함수에서 반환된 값은 INT 0x13H에 의해 설정된 AX 레지스터 값입니다. BIOS 호출.
기능이 성공하면 상위 바이트 = 0은 성공적인 완료를 의미하고 하위 바이트에는 읽기, 쓰기 또는 확인된 섹터 수가 포함됩니다.
그러나 오류가 있고 기능이 성공하지 못한 경우 High byte의 값은 다음 표에 설명된 다음 오류 코드 중 하나가 됩니다.
Value |
Description |
0x00 |
Successful completion (Not an Error!!) |
0x01 |
Bad command |
0x02 |
Address mark not found |
0x03 |
Attempt to write to write-protected disk |
0x04 |
Sector not found |
0x05 |
Reset failed (hard disk) |
0x06 |
Disk changed since last operation |
0x07 |
Drive parameter activity failed |
0x08 |
Direct memory access (DMA) overrun |
0x09 |
Attempt to perform DMA across 64K boundary
(data Boundary error or >80H sectors) |
0x0A |
Bad sector detected |
0x0B |
Bad track detected |
0x0C |
Unsupported track |
0x0D |
Invalid number of sectors on format (PS/2 hard disk) |
0x0E |
Control data address mark detected (hard disk) |
0x0F |
DMA arbitration level out of range (hard disk) |
0x10 |
Bad CRC/ECC on disk read |
0x11 |
CRC/ECC corrected data error (Not an error actually) |
0x20 |
Controller has failed |
0x31 |
No media in drive (IBM/MS INT 13 extensions) |
0x32 |
Incorrect drive type stored in CMOS (Compaq) |
0x40 |
Seek operation failed |
0x80 |
Attachment failed to respond |
0xAA |
Drive not ready (hard disk only) |
0xB0 |
Volume not locked in drive (INT 13 extensions) |
0xB1 |
Volume locked in drive (INT 13 extensions) |
0xB2 |
Volume not removable (INT 13 extensions) |
0xB3 |
Volume in use (INT 13 extensions) |
0xB4 |
Lock count exceeded (INT 13 extensions) |
0xB5 |
Valid eject request failed (INT 13 extensions) |
0xBB |
Undefined error occurred (hard disk only) |
0xCC |
Write fault occurred |
0xE0 |
Status register error |
0xFF |
Sense operation failed |
다음 표는 cmd 매개변수가 수행할 작업 명령을 나타냅니다. 우선 두 함수의 공통적인 동작을 볼 것입니다.
biosdisk |
_bios_disk |
What it does |
0 |
_DISK_RESET |
Resets disk system, forcing the drive controller to do a hard reset. Ignore all other parameters |
1 |
_DISK_STATUS |
Returns the status of the last disk operation. Ignores all other parameters |
2 |
_DISK_READ |
Reads one or more disk sectors into memory |
3 |
_DISK_WRITE |
Writes one or more disk sectors from memory |
4 |
_DISK_VERIFY |
Verifies one or more sectors |
5 |
_DISK_FORMAT |
Formats a track |
cmd = 0, 1, 2, 3, 4,5 또는 cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT을 자유롭게 사용할 수 있지만 두 옵션 모두 동일한 효과를 가지지만 다음을 수행하는 것이 좋습니다. cmd = 5 대신 cmd = _DISK_FORMAT과 같은 단어 옵션을 사용하는 습관을 가지십시오. cmd에 잘못된 명령 번호를 입력한 경우 발생할 수 있는 오류를 방지하는 데 도움이 될 수 있기 때문입니다.
biosdisk 또는 _bios_disk 함수 선언에서 cmd = _DISK_RESET를 제공하면 함수가 다른 모든 매개변수를 무시하고 디스크 시스템을 재설정하고 _DISK_STATUS는 무시하고 마지막 디스크 작업의 상태를 반환합니다. 다른 모든 매개변수
cmd =_DISK_READ, _DISK_WRITE 또는 _DISK_VERIFY(2, 3 또는 4)의 경우 biosdisk 및 _bios_disk 함수는 아래에 표시된 다른 매개변수도 사용합니다.
Parameter |
What It Does |
head
track
sector |
These three specify the location of starting sector for the specified operation. (minimum possible values may be head = 0, track = 0 and sector =1) |
nsectors |
This specifies the number of sectors to read or write |
buffer |
It points to the buffer where data is to be read and written |
cmd의 값이 = 5(_DISK_FORMAT)인 경우 biosdisk와 _bios_disk는 표의 설명에 따라 다음 매개변수를 사용합니다. _DISK_FORMAT을 사용하는 동안 항상 주의를 기울여야 하며 무엇을 사용할 것인지 알아야 합니다. 지식이 부족하거나 작은 실수라도 큰 데이터 손실에 직면할 수 있습니다.
Parameter |
What It Does |
head
track |
These specify the location of the track to format |
buffer |
It points to a table of sector headers to be written on the named track |
biosdisk 기능에서만 사용되는 cmd의 몇 가지 추가 값이 있습니다. 이러한 cmd 값은 XT, AT, PS/2 및 호환 제품에만 허용됩니다. 값은 다음에 제공된 표에 설명되어 있습니다.
cmd |
What it does |
6 |
Formats a track and sets bad sector flags |
7 |
Formats the drive beginning at a specific track |
8 |
Returns the current drive parameters in first 4 bytes of buffer |
9 |
Initializes drive-pair characteristics |
10 |
Does a long read (512 plus 4 extra bytes per sector) |
11 |
Does a long write (512 plus 4 extra bytes per sector) |
12 |
Does a disk seek |
13 |
Alternates disk reset |
14 |
Reads sector buffer |
15 |
Writes sector buffer |
16 |
Tests whether the named drive is ready |
17 |
Recalibrates the drive |
18 |
Controller RAM diagnostic |
19 |
Drive diagnostic |
20 |
Controller internal diagnostic |
diskinfo_t 구조
diskinfo_t 구조는 _bios_disk 함수에 의해 사용됩니다. 구조에 대한 설명은 다음과 같습니다.
struct diskinfo_t {
unsigned drive, head, track, sector, nsectors;
void far *buffer;
};
여기서 drive는 사용할 디스크 드라이브를 지정합니다. 하드 디스크의 경우 디스크 파티션이 아니라 물리적 드라이브가 지정된다는 점을 항상 기억하십시오. 파티션을 운영하려면 응용 프로그램이 해당 디스크 자체의 파티션 테이블 정보도 해석해야 합니다.
헤드, 트랙 및 섹터 값은 작업의 시작 섹터 위치를 지정합니다. nsectors는 읽거나 쓸 섹터 수를 지정하고 버퍼는 데이터를 읽고 쓰는 버퍼를 가리킵니다. cmd 값에 따라 diskinfo_t 구조의 다른 매개변수가 필요할 수도 있고 필요하지 않을 수도 있습니다.
biosdisk 및 _bios_disk 기능에서 사용할 디스크 드라이브 사양 값은 다음 표와 같습니다.
drive Value |
Disk drive to use |
0 |
First floppy-disk drive |
1 |
Second floppy-disk drive |
2 |
Third floppy-disk drive |
.... |
(and so on) |
0x80 |
First hard-disk drive |
0x81 |
Second hard-disk drive |
0x82 |
Third hard-disk drive |
.... |
(and so on) |
충분한 이론! 이제 몇 가지 실용적인 것들과 이러한 기능의 몇 가지 예를 살펴보겠습니다. 다음은 플로피 4개 트랙의 양쪽 섹터를 읽어 사용자가 지정한 파일에 저장하는 예이다. 프로그램이 디스크 표면을 직접 읽기 때문에 디스크에서 파일을 삭제해도 상관 없습니다.
삭제된 데이터를 보려면 완전히 포맷된 플로피 디스크를 가지고 .c 프로그램 코딩 또는 기타 텍스트 파일과 같은 일부 텍스트 파일을 복사하는 것이 더 좋습니다(파일 내용을 이해할 수 있도록) 약 73KB를 차지합니다(각 트랙의 4개 트랙, 양면 및 18개 섹터에 저장된 데이터. 각 섹터는 512바이트). 이 프로그램은 예제를 보여주기 위해 개발되었습니다. 그러나 데이터를 복구할 준비가 되도록 변경하고 개발할 수 있습니다.
/* 플로피의 4개 트랙(0, 1, 2, 3)을 읽고 지정된 파일에 내용을 쓰는 프로그램 */
#include <bios.h>
#include <stdio.h>
#include<conio.h>
void main(void)
{
int head,track;
int result,i,sector;
char filename[80];
char *buffer;
struct diskinfo_t dinfo;
static char dbuf[512];
FILE *tt;
clrscr();
/// 드라이브가 준비 상태인지 확인하십시오. \\\
if(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf(" Drive A: Not Ready:\n Insert disk into Drive A:
and press any key\n");
getch();
}
/* 의 섹터 데이터를 저장할 파일 이름을 가져옵니다.
디스크 */
printf("\nEnter the Destination File name with full Path
to store the data \n\n >");
gets(filename);
if((tt= fopen(filename, "wb"))==NULL)
{
printf("Could not open the File!!!");
getch();
}
for(track=0;track<4;track++)
{
for(head=0; head<=1;head++)
{
for(sector=1;sector<=18;sector++)
{
dinfo.drive = 0; /* drive number for A: */
dinfo.head = head; /* disk head number */
dinfo.track = track; /* track number */
dinfo.sector = sector; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
/// 상태 표시 \\\
gotoxy(10,10); printf("Reading Data from: Head=%d
Track=%d Sector=%d",
head, track, sector);
fprintf(tt,"\n Data read from: Head=%d Track=%d Sector=%d\n",
head, track, sector);
/// 지정된 섹터 읽기 \\\
result = _bios_disk(_DISK_READ, &dinfo);
/// 지정된 파일에 내용 저장 \\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* 섹터를 읽는 동안 오류에 대한 화면 및 파일의 오류 메시지 인쇄 */
else
{
printf("\n Can not read at Head= %d Track= %d
Sector= %d\n",head,track,sector);
fprintf(tt,"\n Can not read at Head= %d Track= %d
Sector =%d\n",head,track,sector);
}
}
}
}
fclose(tt);
}
이 예는 biosdisk 및 _bios_disk 함수의 사용을 보여줍니다. biosdisk 기능은 디스크가 준비되었는지 여부와 주소 표시가 있는지 확인합니다. _bios_disk 기능은 최대 4개의 트랙까지 양면의 섹터를 읽습니다.
디스크 표면에서 읽기(또는 쓰기) 순서는 다음과 같아야 합니다.
absread 및 abswrite 함수
이 기능은 Dos.h에 정의되어 있습니다. absread 함수는 절대 디스크 섹터를 읽고 abswrite 함수는 절대 디스크 섹터를 씁니다. 함수 absread는 DOS 인터럽트 0x25를 사용하여 특정 디스크 섹터를 읽고 함수 abswrite는 DOS 인터럽트 0x26을 사용하여 특정 디스크 섹터를 씁니다.
절대 읽기 또는 쓰기 작업은 섹터를 단계적으로 증가시켜 순차적인 방식으로 진행되며 헤드 및 트랙 번호 등이 완전히 없습니다. 절대 섹터를 해당 섹터로 변환하는 것은 컴퓨터 BIOS의 작업입니다. 트랙, 헤드 및 섹터 번호.
전체 디스크에서 읽기/쓰기 작업을 수행하고 프로그램 속도를 가장 빠르게 높이기 위해 프로그램에서 추가 코딩 및 루프를 방지하려는 프로그램에서는 절대 읽기 및 쓰기 작업을 권장합니다.
absread 및 abswrite 기능 모두 디스크의 논리적 구조를 무시하고 파일, FAT 또는 디렉토리에 주의를 기울이지 않습니다. 이러한 함수는 디스크 표면에서 직접 절대 읽기 및 절대 쓰기 작업을 수행합니다. 이것이 부적절하게 사용되는 경우 abswrite가 파일, 디렉토리 및 FAT를 덮어쓸 수 있는 이유입니다.
absread 함수의 선언은 다음과 같습니다.
int absread(int drive, int nsects, long lsect,
void *buffer);
그리고 abswrite 함수는 다음과 같이 선언됩니다.
int abswrite(int drive, int nsects, long lsect,
void *buffer);
여기서 매개변수의 의미는 다음과 같습니다.
Param. |
What It Is/Does |
drive |
Drive number to read (or write): 0 = A, 1 = B, etc. |
nsects |
Number of sectors to read (or write) |
lsect |
Beginning logical sector number |
buffer |
Memory address where the data is to be read (or written) |
성공하면 두 함수 모두 0을 반환합니다. 오류가 있으면 -1을 반환하고 오류 번호를 설정합니다. 시스템 호출에 의해 반환된 AX 레지스터의 값으로
읽기 또는 쓰기 작업을 위한 섹터 수는 64K 또는 버퍼 크기 중 작은 것으로 제한됩니다. 그러나 우리는 다음 장에서 매우 빠른 프로그램을 개발하기 위해 메모리 제한 64K를 초과하는 거대한 메모리의 사용을 배울 것입니다.
|
C를 사용한 인터럽트 처리
C는 정의된 일부 기능을 사용하여 다른 인터럽트를 호출할 수 있기 때문에 고급 어셈블리 언어라고도 합니다. 몇 가지 중요한 기능은 다음과 같습니다.
- int86: MS-DOS 인터럽트를 호출합니다.
- int86x: 세그먼트 레지스터 값으로 MS-DOS 인터럽트를 호출합니다.
- intdos: DX 및 AL 이외의 레지스터를 사용하여 MS-DOS 서비스를 호출합니다.
- intdosx: 세그먼트 레지스터 값으로 MS-DOS 서비스를 호출합니다.
- segread: 세그먼트 레지스터를 읽습니다.
우리는 이러한 기능에 대해 자세히 논의할 것입니다. 우선 이러한 기능과 함께 자주 또는 반드시 사용되는 사전 정의된 구조와 공용체에 대해 논의합니다.
SREGS 구조
이 구조는 dos.h에 정의되어 있으며 int86x, intdosx 및 segread 함수에 전달되고 채워진 세그먼트 레지스터의 구조입니다. 구조체 선언은 다음과 같습니다.
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
REGS 연합
REGS는 두 구조의 합집합입니다. 통합 REGS는 dos.h로 정의되었으며 int86, int86x, intdos 및 intdosx 함수 간에 정보를 전달하는 데 사용됩니다. 노조 선언문은 다음과 같다.
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
BYTEREGS 및 WORDREGS 구조
BYTEREGES 및 WORDREGS 구조는 dos.h에 정의되어 있으며 바이트 및 워드 레지스터를 저장하는 데 사용됩니다. WORGREGS 구조는 BYTEREGES 구조가 개별 8비트 레지스터에 대한 액세스를 제공하는 반면 사용자는 16비트 수량으로 CPU 레지스터에 액세스할 수 있습니다.
BITEREGS 구조는 다음과 같이 선언됩니다.
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
그리고 WORDREGS 구조는 다음과 같이 선언됩니다.
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
int86 및 int86x 함수
이 함수들은 dos.h에 정의된 일반적인 8086 소프트웨어 인터럽트 인터페이스입니다. 레지스터는 원하는 값으로 설정되고 이러한 함수는 MS-DOS 인터럽트를 호출하기 위해 호출됩니다. int86 함수의 선언은 다음과 같습니다.
int int86(int intno, union REGS *inregs,
union REGS *outregs);
int86x는 int86 함수의 변형입니다. 다음과 같이 선언됩니다.
int int86x(int intno, union REGS *inregs,
union REGS *outregs, struct SREGS *segregs);
int86 및 int86x 함수는 모두 intno 인수로 지정된 8086 소프트웨어 인터럽트를 실행합니다. 또는 생성할 인터럽트가 intno로 지정되었다고 말할 수 있습니다.
int86x 기능을 사용하면 CS 및 SS가 아닌 ES 및 DS에만 액세스할 수 있으므로 기본 데이터 세그먼트와 다른 DS 값을 취하거나 ES에서 인수를 취하는 8086 소프트웨어 인터럽트를 호출할 수 있습니다.
이 함수는 소프트웨어 인터럽트를 실행하기 전에 inregs에서 레지스터로 레지스터 값을 복사합니다. 함수 int86x는 또한 소프트웨어 인터럽트를 실행하기 전에 segregs->ds 및 segregs->es 값을 해당 레지스터에 복사합니다. 이 기능을 사용하면 원거리 포인터 또는 대용량 데이터 메모리 모델을 사용하는 프로그램이 소프트웨어 인터럽트에 사용할 세그먼트를 지정할 수 있습니다.
이 함수는 소프트웨어 인터럽트가 반환된 후 현재 레지스터 값을 outregs에 복사하고 carry 플래그의 상태를 outregs의 x.cflag 필드에 복사하고 8086 플래그 레지스터 값을 outregs의 x.flags 필드에 복사합니다. 함수 int86x는 또한 DS를 복원하고 segregs->es 및 segregs->ds 필드를 해당 세그먼트 레지스터의 값으로 설정합니다.
두 함수에서 inregs와 outregs는 동일한 구조를 가리킬 수 있으며 두 함수 모두 소프트웨어 인터럽트 완료 후 AX 값을 반환합니다. 캐리 플래그가 설정되면 일반적으로 오류가 발생했음을 나타냅니다.
어셈블리 언어에 해당하는 C에서 사용되는 REGS 공용체 요소는 다음 표에 나와 있습니다.
16-bit |
8-bit |
C language |
Assembly language |
C language |
Assembly language |
inregs.x.ax |
AX |
inregs.h.al |
AL |
|
|
inregs.h.ah |
AH |
inregs.x.bx |
BX |
inregs.h.bl |
BL |
|
|
inregs.h.bh |
BH |
inregs.x.cx |
CX |
inregs.h.cl |
CL |
|
|
inregs.h.ch |
CH |
inregs.x.dx |
DX |
inregs.h.dl |
DL |
|
|
inregs.h.dh |
DH |
inregs.x.si |
SI |
|
|
inregs.x.di |
DI |
|
|
inregs.x.cflag |
CF |
|
|
int86 및 int86x 함수의 예를 살펴보겠습니다. 다음 프로그램은 플로피 디스크의 모든 섹터를 스캔하고 모든 섹터의 상태를 화면에 인쇄합니다.
/* 플로피 디스크의 모든 섹터를 스캔하고 상태를 인쇄하는 프로그램 */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
/// 디스크 시스템을 재설정하여 디스크 초기화 \\\
gotoxy(10,2); printf("Initializing The Disk...");
for(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Function Number
inregs.h.dl=0x00; // Floppy Disk
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("The Status of the Disk is as....\n");
/* 0에서 79 트랙(총 트랙 80)에서 플로피 디스크 스캔 */
for(track=0;track<=79;track++)
for(head=0;head<=1;head++)
for(sector=1;sector<=18;sector++)
{
inregs.h.ah = 0x04; /// function Number
inregs.h.al = 1; /// Number of sectors
inregs.h.dl = 0x00; /// Floppy Disk
inregs.h.ch = track;
inregs.h.dh = head;
inregs.h.cl = sector;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// 스캔된 섹터의 상태 인쇄 \\\\
switch(outregs.h.ah)
{
case 0x00:
cprintf("STATUS: No Error!!");
break;
case 0x01:
cprintf("STATUS: Bad command");
break;
case 0x02:
cprintf("STATUS: Address mark not found");
break;
case 0x03:
cprintf("STATUS: Attempt to write to
write-protected disk");
break;
case 0x04:
cprintf("STATUS: Sector not found");
break;
case 0x05:
cprintf("STATUS: Reset failed (hard disk)");
break;
case 0x06:
cprintf("STATUS: Disk changed since last
operation");
break;
case 0x07:
cprintf("STATUS: Drive parameter activity
failed");
break;
case 0x08:
cprintf("STATUS: Direct memory access (DMA)
overrun");
break;
case 0x09:
cprintf("STATUS: Attempt to perform DMA across
64K boundary");
break;
case 0x0A:
cprintf("STATUS: Bad sector detected");
break;
case 0x0B:
cprintf("STATUS: Bad track detected");
break;
case 0x0C:
cprintf("STATUS: Media type not found");
break;
case 0x0D:
cprintf("STATUS: Invalid number of sectors on
format (hard disk)");
break;
case 0x0E:
cprintf("STATUS: Control data address mark
detected (hard disk)");
break;
case 0x0F:
cprintf("STATUS: DMA arbitration level out of
range (hard disk)");
break;
case 0x10:
cprintf("STATUS: Bad CRC/ECC on disk read");
break;
case 0x11:
cprintf("STATUS: CRC/ECC corrected data error");
break;
case 0x20:
cprintf("STATUS: Controller has failed");
break;
case 0x31:
cprintf("STATUS: No media in drive (IBM/MS INT 13H
extensions)");
break;
case 0x32:
cprintf("STATUS: Incorrect drive type stored in
CMOS (Compaq)");
break;
case 0x40:
cprintf("STATUS: Seek operation failed");
break;
case 0x80:
cprintf("STATUS: Attachment failed to respond
(Disk Timed-out)");
break;
case 0xAA:
cprintf("STATUS: Drive not ready (hard disk
only)");
break;
case 0xB0:
cprintf("STATUS: Volume not locked in drive (INT
13H extensions)");
break;
case 0xB1:
cprintf("STATUS: Volume locked in drive (INT 13H extensions)");
break;
case 0xB2:
cprintf("STATUS: Volume not removable (INT 13H
extensions)");
break;
case 0xB3:
cprintf("STATUS: Volume in use (INT 13H
extensions)");
break;
case 0xB4:
cprintf("STATUS: Lock count exceeded (INT 13H
extensions)");
break;
case 0xB5:
cprintf("STATUS: Valid eject request failed (INT
13H extensions)");
break;
case 0xBB:
cprintf("STATUS: Undefined error occurred (hard
disk only)");
break;
case 0xCC:
cprintf("STATUS: Write fault occurred");
break;
case 0xE0:
cprintf("STATUS: Status register error");
break;
case 0xFF:
cprintf("STATUS: Sense operation failed");
break;
default: cprintf("STATUS: UNKNOWN Status CODE");
}
printf("\nCurrent position= Track:%d Head:%d Sector:%d \n",
track,head,sector);
}
gotoxy(10,24);printf("Scanning Completed!! Press Any Key TO
Exit..");
getch();
}
프로그램은 int86 및 int86x 함수의 사용 예를 보여줍니다. 이 프로그램에서 int86 함수는 INT 13H의 함수 00H를 사용하여 디스크 시스템을 재설정하여 디스크를 초기화합니다. int86x 함수는 INT 13H의 04H 함수를 사용하여 플로피의 모든 섹터(1.44Mb, 3½ 플로피 디스크)를 양쪽에서 최대 0 ~ 79개 트랙(총 80개 트랙)까지 확인합니다.
분리 기능
이 함수는 dos.h에 정의되어 있습니다. 이 함수는 세그먼트 레지스터를 읽습니다. 함수 선언은 다음과 같습니다.
void segread(struct SREGS *segp);
여기서 segread는 세그먼트 레지스터의 현재 값을 *segp 구조에 넣습니다. 함수는 아무 것도 반환하지 않으며 호출은 intdosx 및 int86x와 함께 사용하기 위한 것입니다. 예를 보자
#include <stdio.h>
#include <dos.h>
void main()
{
struct SREGS segs;
segread(&segs);
printf("Current segment register settings\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
getch();
}
그리고 프로그램의 출력은 다음과 같을 것입니다:
Current segment register settings
CS: EED DS: 10BA
ES: 10BA SS: 10BA
intdos 및 intdosx 함수
이 함수들은 dos.h에 정의되어 있습니다. 이것은 일반적인 DOS 인터럽트 인터페이스입니다. intdos 함수는 MS-DOS 서비스 레지스터를 호출한 다음 DX 및 AL을 호출하며 여기서 intdosx 함수는 세그먼트 레지스터 값으로 MS-DOS 서비스를 호출합니다.
intdos 함수의 선언은 다음과 같습니다.
int intdos(union REGS *inregs, union REGS *outregs);
intdosx 함수의 선언은 다음과 같습니다.
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
intdos 및 intdosx 함수는 DOS 인터럽트 0x21을 실행하여 지정된 DOS 기능을 호출합니다. inregs->h.ah의 값은 호출될 DOS 기능을 지정합니다. 함수 intdosx는 DOS 함수를 호출하기 전에 segregs ->ds 및 segregs ->es 값을 해당 레지스터에 복사한 다음 DS를 복원합니다.
함수의 이 기능을 사용하면 먼 포인터를 사용하는 프로그램이나 대용량 데이터 메모리 모델이 함수 실행에 사용할 세그먼트를 지정할 수 있습니다. intdosx 함수를 사용하면 기본 데이터 세그먼트와 다른 DS 값을 취하거나 ES에서 인수를 취하는 DOS 함수를 호출할 수 있습니다.
두 함수 모두 DOS 함수 호출 완료 후 AX 값을 반환하며 캐리 플래그가 설정되면(outregs -> x.cflag != 0) 오류가 발생했음을 나타냅니다.
인터럽트 0x21이 반환된 후 현재 레지스터 값을 outregs에 복사하고, 캐리 플래그의 상태를 outregs의 x.cflag 필드에, 8086 플래그 값 레지스터를 outregs의 x.flags 필드에 복사합니다. inreg와 outreg는 모두 동일한 구조를 가리킬 수 있습니다. 이러한 기능의 예를 살펴보겠습니다.
intdos 함수의 사용 예는 아래와 같습니다. 이 프로그램은 플로피(1.44Mb, 3인치 플로피 디스크) 디스크 드라이브에 대한 선택된 정보를 얻습니다. 이 프로그램은 플로피 디스크의 할당 정보를 제공합니다.
/* 디스크 사용에 대한 드라이브 할당 정보 가져오기 */
#include <dos.h> /* for intdos() and union REGS */
#include <stdio.h> /* for printf() */
union REGS inregs, outregs;
void main()
{
inregs.h.ah = 0x36; /* get disk free space
function number */
inregs.h.dl = 0x01; /* drive A: */
intdos(&inregs, &outregs);
printf("%d sectors/cluster,\n%d clusters,\n%d bytes/sector,
\n%d total clusters",
outregs.x.ax,outregs.x.bx,
outregs.x.cx, outregs.x.dx);
getch();
}
그리고 프로그램의 출력은 다음과 같을 것입니다:
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
이제 intdosx 함수의 예를 살펴보겠습니다. 다음 예는 intdosx 함수의 사용을 보여줍니다. 프로그램은 문자열을 표준 출력으로 출력합니다.
/* '문자열'을 표준으로 출력하는 프로그램
산출. */
#include <dos.h>
union REGS inregs, outregs;
struct SREGS segregs;
char far *string = "this string is not in the
default data segment$";
void main()
{
inregs.h.ah = 0x09; /* function number */
inregs.x.dx = FP_OFF(string);/*DS:DX is far
address of 'string */
segregs.ds = FP_SEG(string);
intdosx(&inregs, &outregs, &segregs);
getch();
}
그리고 프로그램의 출력은 다음과 같을 것입니다:
이 문자열은 기본 데이터 세그먼트에 없습니다. |
여기서 우리는 INT 21H의 09H 함수에 의해 intdosx 함수로 주어진 문자열을 인쇄하고 있습니다. 주어진 문자열은 항상 문자 “$”로 끝나야 한다는 점을 항상 염두에 두어야 합니다.
물리적 하드 드라이브 번호를 아는 방법
물리적 하드 드라이브 번호는 매우 중요하며 정확하게 기록해야 합니다. 잘못된 드라이브 사양으로 인해 데이터가 크게 손실될 수 있습니다. 데이터 복구 또는 디스크 문제 해결 프로그래밍 중에 드라이브 번호를 확신해야 합니다. 디스크 배열이 다른 디스크의 드라이브 번호를 아는 방법은 다음에 주어진 예를 통해 추정할 수 있습니다.
가장 일반적인 신화에 따르면 물리적 드라이브 번호는 디스크의 연결 상태에 따라 제공되지만 일부 또는 특별한 경우에는 운영 체제의 부팅 절차 또는 부팅 설정.
BIOS에서 제공하는 물리적 드라이브 번호에 대한 가장 일반적인 개념이 여기에 나와 있지만 이 경우에도 디스크 편집 도구나 다음 장에서 설명하는 프로그램을 사용하여 확인해야 합니다. 디스크 구성에 대해 설명합니다. 불법적으로 사용하거나 지식이 없는 경우 데이터를 손상시키거나 손상시킬 수 있는 프로그램 실행에 대한 결정을 내려야 합니다.
일반적으로 두 개의 디스크가 시스템에 연결되어 있는 경우 하나는 기본 마스터이고 다른 하나는 보조 마스터인 경우 첫 번째 기본 설정은 기본 마스터(사용 가능한 경우 기본 슬레이브)에 제공된 다음 보조 마스터( 그런 다음 사용 가능한 경우 보조 슬레이브로 지정) 및 물리적 번호는 기본 설정에 따라 제공됩니다.
시스템이 한 번에 최대 4개의 하드 디스크를 지원한다고 가정해 보겠습니다. 다음과 같이 4개의 하드 디스크를 모두 연결할 수 있습니다.
Primary Master |
Primary Slave |
Secondary Master |
Secondary Slave |
이제 물리적 드라이브의 드라이브 수에 대한 몇 가지 경우를 고려해 보겠습니다. 여기에서는 디스크 제조업체가 언급한 적절한 점퍼 설정과 적절한 마스터 및 슬레이브 설정으로 디스크를 연결했다고 가정합니다.
- 4개의 하드 디스크가 모두 시스템에 연결된 경우: 4개의 디스크가 모두 시스템에 연결된 경우 물리적 드라이브 번호는 다음과 같습니다.
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 83H. In this case the Hard Disk is called the Fourth Hard Disk. |
- 3개의 하드 디스크가 시스템에 연결된 경우: 3개의 하드 디스크가 시스템에 연결된 경우 물리적 드라이브 번호는 부착 기본 설정에 따른 것입니다. 다음 예는 일부 배열을 나타냅니다.
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk Not Present |
------------------- |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk Not Present |
------------------- |
Primary Slave |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
- 두 개의 하드 디스크가 시스템에 연결된 경우: 유사하게 두 개의 하드 디스크가 시스템에 연결된 경우 물리적 드라이브 번호는 연결 기본 설정에 따른 것입니다. 다음 예제는 그것을 보여줍니다:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
- 싱글 하드 디스크가 시스템에 연결된 경우: 사용할 수 있는 디스크가 하나뿐인 경우 물리적 드라이브 번호는 80H가 될 것이라고 생각할 필요가 없습니다.
인터럽트 13H(INT 13H), ROM BIOS 디스크 드라이버 기능
INT 13H 기능에 대한 설명이 여기에 있습니다. 이러한 기능을 오용하거나 주의 부족 또는 지식 부족으로 사용하면 데이터가 크게 손실되거나 기타 여러 문제가 발생할 수 있으므로 이러한 기능은 주의해서 학습해야 합니다. 그러나 적절하고 적절한 방식으로 사용하면 이러한 기능은 프로그램 코딩을 최소화하고 프로그래밍을 간단하고 쉽게 만드는 데 도움이 됩니다.
INT 13H (0x13)
Function 00H (0x00) Reset disk system
Call with AH = 00H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function is successful
Carry flag = clear
AH = 00H
If function is unsuccessful
Carry flag = set
AH = status
댓글:
디스크 컨트롤러를 재설정하고 연결된 드라이브를 재보정합니다. 읽기/쓰기 암이 실린더 0으로 이동하고 디스크 I/O를 준비합니다.
이 함수는 작업을 재시도하기 전에 실패한 플로피 디스크 읽기, 쓰기, 확인 또는 포맷 요청 후에 호출되어야 합니다. 함수가 고정 디스크 드라이브로 호출되면(즉, DL>=80H 선택), 플로피 디스크 컨트롤러와 고정 디스크 컨트롤러가 재설정됩니다.
INT 13H (0x13)
Function 01H (0x01) Get disk system status
Call with: AH = 01H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: AH = 00H
AL = status of previous disk operation
(See the table given before for error
and status codes description).
댓글:
가장 최근의 디스크 작업 상태를 반환합니다.
INT 13H (0x13)
Function 02H (0x02) Read sector
Call with: AH = 02H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES:BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 디스크에서 메모리로 하나 이상의 섹터를 읽습니다. 고정 디스크에서 10비트 실린더 번호의 상위 2비트는 레지스터 CL의 상위 2비트에 배치됩니다.
INT 13H (0x13)
Function 03H (0x03) Write sector
Call with: AH = 03H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sector transferred
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 함수는 메모리에서 디스크로 하나 이상의 섹터를 씁니다. 고정 디스크에서 10비트 실린더 번호의 상위 2비트는 레지스터 CL의 상위 2비트에 배치됩니다.
INT 13H (0x13)
Function 04H (0x04) >> Verify sector
Call with: AH = 04H
AL = number of sectors
CH = cylinder
CL = sector
DH = drive
00H-7FH floppy disk
80H-FFH fixed drive
ES: BX = segment: offset of buffer
Returns: If function is successful
Carry flag = clear
AH = 00H
AL = number of sectors verified
If function is unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 하나 이상의 섹터의 주소 필드를 확인합니다. 이 작업으로 메모리로 또는 메모리에서 데이터가 전송되지 않습니다. 고정 디스크에서 10비트 실린더 번호의 상위 2비트는 레지스터 CL의 상위 2비트로 대체됩니다.
이 기능은 읽을 수 있는 미디어가 플로피 디스크 드라이브에 있는지 테스트하는 데 사용할 수 있습니다. 요청하는 프로그램은 읽을 수 있는 플로피 디스크가 없다고 가정하기 전에 플로피 디스크 시스템(INT 13H 기능 00H)을 재설정하고 작업을 세 번 다시 시도해야 합니다. 대부분의 플로피 초기화 작업에서 권장됩니다.
INT 13H (0x13)
Function 05H (0x05) >> Format track
Call with: AH = 05H
AL = interleave (PC/XT fixed disks)
CH = cylinder
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of address field list
(Except PC/XT fixed disk)
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
댓글:
디스크 섹터를 초기화하고 지정된 트랙의 주소 필드를 추적합니다. 플로피 디스크에서 주소 필드 목록은 섹터당 하나의 항목인 일련의 4바이트 항목으로 구성됩니다. 형식은 다음 표에 나와 있습니다.
고정 디스크에서 10비트 실린더 번호의 상위 2비트는 레지스터 CL의 상위 2비트에 배치됩니다.
Byte |
Contents |
0 |
Cylinder |
1 |
Head |
2 |
Sector |
3
|
Sector-size code
Value |
Description |
00H |
128 Byte per sector |
01H |
256 Byte per sector |
02H |
512 Byte per sector |
03H |
1024 Byte per sector |
|
INT 13H (0x13)
Function 06H (0x06) >> Format bad track
Call with: AH = 06H
AL = interleave
CH = cylinder
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 PC/XT 고정 디스크 드라이브에만 정의됩니다. 트랙을 초기화하고 디스크 주소 필드와 데이터 섹터를 기록하고 불량 섹터 플래그를 설정합니다.
INT 13H (0x13)
Function 07H (0x07) >> Format drive
Call with: AH = 07H
AL = interleave
CH = cylinder
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
댓글:
이 기능은 PC/XT 고정 디스크 드라이브에만 정의됩니다. 지정된 실린더에서 시작하여 전체 드라이브를 포맷하고 디스크 주소 필드와 데이터 섹터를 기록합니다.
INT 13H (0x13)
Function 08H (0x08) >> Get drive parameters
Call with: AH = 08H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
BL = drive type (PC/AT and PS/2 floppy
disk)
Value |
Description |
01H |
360KB, 40 track, 5.25” |
02H |
1.2MB, 80 track, 5.25” |
03H |
720KB, 80 track, 3.5” |
04H |
1.44MB, 80 track, 3.5” |
CH = low 8 bits of maximum cylinder
number
CL = bits 6-7 high order 2 bits of maximum
cylinder number bits 0-5 maximum
sector number
DH = maximum head number
DL = number of drives
ES: DI = segment: offset of disk drive
parameter table
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 함수는 지정된 드라이브에 대한 다양한 매개변수를 반환합니다. 레지스터 DL에 반환된 값은 요청된 드라이브의 어댑터에 연결된 실제 드라이브의 실제 수를 반영합니다.
INT 13H (0x13)
Function 09H (0x09) >> Initialize fixed disk characteristics
Call with: AH = 09H
DL = drive
80H-FFH fixed disk
On the PC/XT Vector for INT 41H
must point to disk parameter block or, on the PC/AT and PS/2
Vector for INT 41H must point to disk
parameter block for drive 0
Vector for INT 46H must point to disk
parameter block for drive 1
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 ROM BIOS 디스크 매개변수 블록에 있는 값을 사용하여 후속 I/O 작업을 위해 고정 디스크 컨트롤러를 초기화합니다. 이 기능은 고정 디스크에서만 지원됩니다. PC 및 PC/XT 고정 디스크의 매개변수 블록 형식은 다음과 같습니다.
Byte(s) |
Contents |
00H-01H |
Maximum number of cylinders |
02H |
Maximum number of heads |
03H-04H |
Starting reduced write current cylinder |
05H-06H |
Starting write pre compensation cylinder |
07H |
Maximum ECC burst length |
08H
|
Drive option
Bit(s) |
Significance (if set) |
0 – 2 |
drive option |
3 – 5 |
reserved (0) |
6 |
disable ECC entries |
7 |
disable disk-access retries |
|
09H |
Standard time-out value |
0AH |
Time-out value for format drive |
0BH |
Time-out value for check drive |
0CH-0FH |
Reserved |
PC/AT 및 PS/2 고정 디스크의 매개변수 블록 형식은 다음과 같습니다:
Byte(s) |
Contents |
00H_01H |
maximum number of cylinders |
02H |
maximum number of heads |
03H-04H |
Reserved |
05H-06H |
starting write pre compensation cylinder |
07H |
maximum ECC burst length |
08H |
Drive options
Bit(s) |
Significance (if set) |
0 – 2 |
not used |
3 |
more than 8 heads |
4 |
not used |
5 |
manufacturer’s defect map present at
maximum cylinder +1 |
6 – 8 |
nonzero (10, 01,or 11) if retries disabled |
|
09H-0BH |
Reserved |
0CH-0DH |
landing zone cylinder |
0EH |
sector per track |
0FH |
Reserved |
INT 13H (0x13)
Function 0A H (0x0A or 10) >> Read sector long
Call with: AH = 0AH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 각 섹터에 대한 4바이트 ECC(오류 수정 코드) 코드와 함께 디스크에서 메모리로 섹터를 읽습니다. 일반 읽기 섹터 기능(INT 13H(0x13) 기능 02H)과 달리 ECC 오류는 자동으로 수정되지 않습니다. 다중 섹터 전송은 읽기 오류가 있는 섹터 이후에 종료됩니다.
이 기능은 고정 디스크에서만 지원됩니다. 10비트 실린더 번호의 상위 2비트는 레지스터 CL의 상위 2비트에 배치됩니다.
INT 13H (0x13)
Function 0BH (0x0B or 11) >> Write sector long
Call with:AH = 0BH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 함수는 메모리에서 디스크로 섹터를 씁니다. 각 섹터 가치의 데이터 뒤에는 4바이트 ECC 코드가 와야 합니다. 10비트 실린더 번호의 상위 2비트는 레지스터 CL의 상위 2비트에 배치됩니다. 이 기능은 고정 디스크에서만 지원됩니다.
INT 13H (0x13)
Function 0CH (0x0C or 12) >> Seek
Call with:AH = 0CH
CH = lower 8 bits of cylinder
CL = upper 2 bits of cylinder in bits 6-7
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 데이터를 전송하지 않고 디스크 읽기/쓰기 헤드를 지정된 실린더에 배치합니다. 실린더 번호의 상위 2비트는 레지스터 CL의 상위 2비트에 배치됩니다. 이 기능은 고정 디스크에서만 지원됩니다.
INT 13H (0x13)
Function 0DH (0x0D or 13) >> Reset fixed disk system
Call with:AH = 0DH
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
댓글:
이 기능은 고정 디스크 컨트롤러를 재설정하고 연결된 드라이브를 재보정하고 읽기/쓰기 암을 실린더 0으로 이동하고 후속 디스크 I/O를 준비합니다.
INT 13H (0x13)
Function 0EH (0x0E or 14) >> Read sector buffer
Call with:AH = 0EH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 고정 디스크 어댑터의 내부 섹터 버퍼의 내용을 시스템 메모리로 전송합니다. 물리적 디스크 드라이브에서 데이터를 읽지 않습니다.
INT 13H (0x13)
Function 0FH (0x0F or 15) >> Write sector buffer
Call with:AH = 0FH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 시스템 메모리에서 고정 어댑터의 내부 섹터 버퍼로 데이터를 전송합니다. 물리적 디스크 드라이브에 데이터가 기록되지 않습니다. 이 함수는 INT 13H Function 05H로 드라이브를 포맷하기 전에 섹터 버퍼의 내용을 초기화하기 위해 호출되어야 합니다.
INT 13H (0x13)
Function 10H (0x10 or 16) >> Get drive status
Call with:AH = 10H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 지정된 고정 디스크 드라이브가 작동하는지 테스트하고 드라이브 상태를 반환합니다. 이 기능은 고정 디스크에서만 지원됩니다.
INT 13H (0x13)
Function 11H (0x11 or 17) >> Recalibrate drive
Call with:AH =11H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 고정 디스크 어댑터가 읽기/쓰기 암을 실린더 0에 배치하고 드라이브의 상태를 반환하여 지정된 드라이브에 대해 자체적으로 재보정하도록 합니다. 이 기능은 고정 디스크에서만 지원됩니다.
INT 13H (0x13)
Function 12H (0x12 or 18) >> Controller RAM
diagnostic
Call with:AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 고정 디스크 어댑터가 내부 섹터 버퍼에 대한 내장 진단 테스트를 수행하도록 하여 테스트가 반환된 상태로 통과되었는지 여부를 나타냅니다.
INT 13H (0x13)
Function 13H (0x13 or 19) >> Controller drive diagnostic
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 고정 어댑터가 연결된 드라이브의 내부 진단 테스트를 실행하도록 하여 테스트가 반환된 상태로 통과되었는지 여부를 나타냅니다.
INT 13H (0x13)
Function 14H (0x14 or 20) >> Controller internal
diagnostic
Call with:AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능을 사용하면 고정 디스크 어댑터가 기본 제공 진단 자체 테스트를 수행하여 테스트가 반환된 상태로 통과되었는지 여부를 나타냅니다.
INT 13H (0x13)
Function 15H (0x15 or 21) >> Get disk type
Call with:AH = 15H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = drive type code
00H if no drive present
01H if floppy disk drive without change-line support
02H if floppy disk drive with change-line support
03H if fixed disk
|
And, if fixed disk (AH =03H)
CX: DX = number of 512-byte sectors
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 함수는 지정된 드라이브 코드에서 참조하는 플로피 또는 고정 디스크의 유형을 나타내는 코드를 반환합니다.
INT 13H (0x13)
Function 16H (0x16 or 22) >> Get disk change
status
Call with: AH = 16H
DL = drive
00H-7FH floppy disk
Returns:If change line inactive and disk has not been changed
Carry flag = clear
AH = 00H
If change line active and disk may have been changed
Carry flag = set
AH = 06H
댓글:
이 함수는 마지막 디스크 액세스 이후에 드라이브의 디스크가 교체되었는지 여부를 나타내는 변경 라인의 상태를 반환합니다. 캐리 플래그가 설정된 상태로 이 기능이 반환되면 디스크가 반드시 변경된 것은 아니며 플로피 디스크를 제거하지 않고 디스크 드라이브 도어를 잠금 해제 및 잠그기만 하면 변경 라인이 활성화될 수 있습니다.
INT 13H (0x13)
Function 17H (0x17 or 23) >> Set disk type
Call with: AH = 17H
AL = floppy disk type code
Value |
Description |
00H |
Not used |
01H |
320/360 KB floppy disk in 360 KB drive |
02H |
320/360 KB floppy disk in 1.2 MB drive |
03H |
1.2 MB floppy disk in 1.2 MB drive |
04H |
720 KB floppy disk in 720 KB drive |
SL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 지정된 드라이브에 대한 플로피 디스크 유형을 선택합니다.
INT 13H (0x13)
Function 18H (0x18 or 24) >> Set media type for format
Call with: AH = 18H
CH = number of cylinders
CL = sector per track
DL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
ES: DI = segment: offset of disk
parameter table for media type
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 지정된 드라이브의 미디어 특성을 선택하므로 드라이브에 플로피 디스크가 있어야 합니다.
INT 13H (0x13)
Function 19H (0x19 or 25) >> Park heads
Call with: AH = 19H
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
댓글:
이 기능은 읽기/쓰기 암을 데이터 저장에 사용되지 않는 트랙으로 이동하여 드라이브가 꺼져도 데이터가 손상되지 않도록 합니다.
INT 13H (0x13)
Function 1AH (0x1A or 26) >> Format ESDI drive
Call with: AH = 1AH
AL = Relative Block Address (RBA)
defect table count
0, if no RBA table
>0, if RBA table used
CL = format modifier bits
Bit(s) |
Significance (if set) |
0 |
Ignore primary defect map |
1 |
Ignore secondary defect map |
2 |
Update secondary defect map |
3 |
Perform extended surface analysis |
4 |
Generate periodic interrupt |
5-7 |
Reserved (must be 0) |
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of RBA table
Returns: If function successfu
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
댓글:
이 기능은 디스크 섹터를 초기화하고 ESDI 고정 디스크 드라이브 어댑터에 연결된 드라이브의 주소 필드를 추적합니다.
이 기능의 작업을 저수준 형식이라고 하며 섹터 수준에서 물리적 읽기/쓰기 작업을 위해 디스크를 준비합니다. 드라이브는 이후에 FDISK 명령으로 파티션을 나눈 다음 파일 시스템을 설치하기 위해 FORMAT 명령으로 상위 레벨 포맷을 제공해야 합니다.