如何调用int 13进行设定DASD以便进行特殊格式化制作加密钥匙盘?

zoucaiming 2001-07-29 08:09:16
设定1.44MB3.5英寸disk,下面代码,正确吗?

mov ah,17H
mov al,04H
mov dl,00H
int 13
...全文
317 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoucaiming 2001-07-29
  • 打赏
  • 举报
回复
以下读绝对扇区的代码老是出错,why?

/* program name slotchk.c */

#include <stdio.h>
#include <dos.h>

struct DISK_PARM{
char STR;
char HLT;
char WAIT_TIME;
char N; /* may be set to 2 */
char EOT; /* must be set to 9 */
char GAP; /* must be set to 2AH */
char DTL; /* may be set to FFH */
char GAP3; /* must be set to 50h */
char FILL; /* may be set to F6H */
char SETTLE;
char START_TIME;
} far * disk_parm,disk_parm_buffer;
unsigned char Head,Drive,Track,Sector,N;
unsigned char sector_data[512];
unsigned char slot_data[5];
unsigned int slot_ptr;

save_disk_parm()
{
char far * p, * q, i;

p=(char far *)disk_parm;
q=(char *)&disk_parm_buffer;
for(i=0;i<11;i++)
* q= * p;
}

restore_disk_parm()
{
char far * p, * q, i;

p=(char far *)disk_parm;
q=(char *)&disk_parm_buffer;
for(i=0;i<11;i++)
* p= * q;
}

disk_reset()
{
_AX=0;
_DL=Drive;
geninterrupt(0x13);
}

read_sector()
{
int es;
disk_parm->N=2;
es=_ES;
_ES=FP_SEG(sector_data);
_BX=FP_SEG(sector_data);
_CH=Track;
_CL=Sector;
_DH=Head;
_DL=Drive;
_AX=0x0201;
geninterrupt(0x13);
_ES=es;
disk_parm->N=2;
if((_FLAGS&1)==1)
return(1);
else
return(0);
}

show_disk_error_msg(int ah)
{
printf("ERROR_CODE:%02X",ah);
switch(ah)
{
case 0x01:printf("BAD_COMMAND\n\r"); break;
case 0x02:printf("BAD_ADDRESS_MARK\n\r"); break;
case 0x03:printf("WRITE_PROTECT\n\r"); break;
case 0x04:printf("RECORD_NOT_FIND\n\r"); break;
case 0x06:printf("MEDIA_CHANGE\n\r"); break;
case 0x08:printf("BAD_DMA\n\r"); break;
case 0x09:printf("DMA_BOUNDARY\n\r"); break;
case 0x10:printf("BAD_CRC\n\r"); break;
case 0x20:printf("BAD_NEC\n\r"); break;
case 0x40:printf("BAD_SEEK\n\r"); break;
case 0x80:printf("TIME_OUT\\n\r"); break;
}
}

quit()
{
restore_disk_parm();
}

check()
{
int i,j;
unsigned char ah;

printf("checking...");
disk_reset();
for(i=0;i<100;i++)
{
for(j=0;j<512;j++)
sector_data[j]=0;
for(j=0;j<3;j++)
{
if(read_sector())
{
_AH=1;
geninterrupt(0x13);
ah=_AH;
if(ah==0x10)
break;
}
}
if(j==3)
{
printf("1.read_sector error!\n\r");
show_disk_error_msg(ah);
return(1);
}
if(i==0)
{
for(slot_ptr=0x0000;slot_ptr<512;slot_ptr++)
if(sector_data[slot_ptr]!=0x4E)
break;
if((slot_ptr==0)||(slot_ptr==512))
{
printf("2.sector_data error!\n\r");
return(1);
}
slot_ptr--;
for(j=0;j<5;j++)
slot_data[j]=sector_data[slot_ptr+j];
}
else
{
for(j=0;j<5;j++)
if(sector_data[slot_ptr+j]!=slot_data[j])
break;
if(j<5)
{
printf("slot not stable!\n\r");
return(1);
}
}
printf("done!\n\r");
printf("SLOT:%04X->",slot_ptr);
for(j=0;j<5;j++)
printf("%02X",(unsigned char)slot_data[j]);
printf("\n\r");
return(0);
}
}

init()
{
disk_parm=MK_FP(0,0x522);
save_disk_parm();
disk_parm->N=2;
disk_parm->EOT=18;
disk_parm->GAP=0x2A;
disk_parm->GAP3=0x50;
Track=0x40;
Head=0;
Drive=0;
Sector=5;
N=2;
}

main()
{
init();
check();
quit();
}
Leemaasn 2001-07-29
  • 打赏
  • 举报
回复
al=04h表示720kb软盘在720kb驱动器中(pc/at或ps/2)或720kb或1。44mb软盘在1。44mb驱动器中(ps/2)
书上说的,我也没试过!
对了,你上面的代码最后一行,怎么会少打了个h呢?
Leemaasn 2001-07-29
  • 打赏
  • 举报
回复
哦,抱歉,手头一时没tc,,,
Leemaasn 2001-07-29
  • 打赏
  • 举报
回复
看看先,:)

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧