软盘控制器FDC 非dma 方式 传送
发布网友
发布时间:2022-04-22 17:49
我来回答
共1个回答
热心网友
时间:2023-10-23 17:05
以下是我几年前写的一篇文章,供你参考吧。
用无数据扇区进行加密
正常格式化的软盘每个扇区都
可以分为地址区和数据区两部分,
格式化时在地址区写入磁道号、磁
头号、 扇区号和大小码共4个字节
的地址标志及两个字节的 CRC校验
码, 数据区用F6填充。对扇区进行
读写时, 软盘控制器首先找到地址
标志, 经校验无误后才对数据区进
行读写。 如果地址区的CRC校验码
错误,数据区将无法读写,我们称这
种扇区为无数据扇区。我们可以利
用这种特殊扇区制成KEY盘, 进行
加密。
怎样才能做出无数据扇区呢?
用一般的格式化程序是无法做到的,
我们只能通过对软盘控制器直接编
程的办法来实现, 首先将软盘控制
器设置成非DMA方式,逐个字节送出
格式化命令和格式化数据, 送完扇
区地址标志的 4个字节后延时一段
时间,然后复位软盘控制器,人为地
制造出CRC错。 在这里最关键的是
延时量,如果延时时间短了,地址区
数据不完整, 读写时找不到扇区。
如果延时时间长了, 扇区就成了有
数据扇区。我们可以用一个循环来
找出延时量的最佳值。
MKND.ASM是本人编制的制作KEY
盘的实验程序, 无数据扇区是6道
0头0号扇区, 程序已在本人的华硕
P2B主板PII350CPU的机器上调试通
过, 由于采用了直接对软盘控制器
编程技术, 可能在某些机器上兼容
性不太理想, 如果读者在试验本程
序时遇到问题,欢迎与作者联系。
RKND.ASM是判断KEY盘真假的程序,
读者可根据自己的需要进行修改。
作者:盛玉增
* * * MKND.ASM * * *
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
BEGIN:CALL DISP_CP
DB 'MKND V1.0 '
DB '(C)SYZ 1999.5.22',0DH,0AH
DB 'Please insert a disk in '
DB 'drive A: Press any key..'
DB 0DH,0AH,24H
DISP_CP:
POP DX
MOV AH,9
INT 21H
MOV AH,0
INT 16H
JMP START
CONT_1 DW 20H ;延时循环次数
CONT_2 DW 0 ;上次循环次数
LON_1 DB 0 ;循环计数
DON_1 DB 30H,20H,24H
DISP_1 DB 0DH,0AH,'OK!',0DH,0AH,24H
DISP_2 DB 'ERROR!',0DH,0AH,24H
ORG 200H
FMT_ID DB 6,0,0,02 ;格式化数据
START:
MOV AH,0
MOV DX,0
INT 13H ;复位A盘
MOV DI,0
MOV ES,DI
MOV DI,490H
MOV AX,17H
STOSB ;设置参数,A盘1.44M
MOV DI,526H
MOV AL,1
STOSB ;1扇区/磁道
PUSH CS
POP ES
MK_LOOP:
MOV AL,byte ptr CS:LON_1
CMP AL,10
JNB MK_E1
INC AL
MOV BYTE PTR CS:LON_1,AL
ADD AL,30H
MOV BYTE PTR CS:DON_1,AL
MOV AH,9
MOV DX,OFFSET DON_1
INT 21H
MKCRC1:CALL MKCRC
CMP AH,10H
JNZ ST_1
CALL AH_10
JMP MK_LOOP
ST_1: CMP AH,0
JNZ CT_1
ST_2: CALL AH_0
JMP MK_LOOP
MK_E1:JMP ERR_1
CT_1: CALL AH_4
JMP MK_LOOP
OK_1:MOV AH,9
MOV DX,OFFSET DISP_1
INT 21H
JMP END_1
ERR_1:
MOV AH,9
MOV DX,OFFSET DISP_2
INT 21H
END_1:
MOV DI,0
MOV ES,DI
MOV DI,526H
MOV AL,12H
STOSB
MOV AX,4C00H
INT 21H
AH_10: ;判断是否读出数据
MOV SI,8000H
LODSW
CMP AX,0
JZ CRC_OK
JMP ST_2
CRC_OK:JMP OK_1
AH_4: ;增加延时循环次数
MOV AX,CS:CONT_1
MOV CS:CONT_2,AX
SHL AX,1
MOV CS:CONT_1,AX
RETN
AH_0: ;减少延时循环次数
MOV AX,CS:CONT_1
MOV BX,CS:CONT_2
ADD AX,BX
SHR AX,1
MOV CS:CONT_1,AX
RETN
MKCRC: ;制作CRC错
PUSH CS
POP ES
MOV DI,8000H
MOV AL,0
MOV CX,200H
REP STOSB
MOV AX,0501H
MOV BX,OFFSET FMT_ID
MOV CX,0600H
MOV DX,0
INT 13H ;格式化
MOV AX,0501H
INT 13H
JNB MKC_1
JMP ERR_1
MKC_1:
CLI
MOV SI,OFFSET FMT_ID
MOV AL,1Ch
MOV DX,3F2H
OUT DX,AL
MOV AH,03H ;命令码,设定参数
CALL OUT_FDC
MOV AH,0FDH ;步进速率,卸载时间
CALL OUT_FDC
MOV AH,011H ;非DMA方式
CALL OUT_FDC
MOV AH,4DH ;格式化
CALL OUT_FDC
MOV AH,0 ;A驱0头
CALL OUT_FDC
MOV AH,2 ;大小码=2,512字节/扇区
CALL OUT_FDC
MOV AH,1 ;扇数/磁道
CALL OUT_FDC
MOV AH,54h ;gp3,扇区缝大小
CALL OUT_FDC
MOV AH,0F8H ;填f8h
CALL OUT_FDC
MOV SI,200H
DLY_1:LODSB
MOV AH,AL
CALL OUT_FDC1 ;送地址标志
CMP SI,204H
JNB DLY_2
JMP DLY_1
DLY_2:MOV CX,CS:CONT_1
DLY_3:
OUT 0EBH,AL ;延时
JMP $+2
LOOP DLY_3 ;循环
MOV AL,0
MOV DX,3F2H
OUT DX,AL
MOV AL,0CH
OUT DX,AL ;关马达
READ_1:
MOV AX,201H
MOV BX,8000H
MOV CX,0600H
MOV DX,0
INT 13H ;读6道0头0号扇区
MOV AX,201H
INT 13H
RETN
OUT_FDC1: ;向软盘控制器输出数据
MOV DX,3F4H
LOOP_1:
IN AL,DX ;读主状态寄存器
TEST AL,080H ;就绪?
JZ LOOP_1
TEST AL,40H
JNZ LOOP_1
INC DX
MOV AL,AH
OUT DX,AL ;送数据
RETN
OUT_FDC: ;向软盘控制器输出命令
MOV DX,3F4H
LOOP_2:
IN AL,DX ;读主状态寄存器
TEST AL,80H ;就绪?
JZ LOOP_2
INC DX
MOV AL,AH
OUT DX,AL ;送数据
RETN
CODE ENDS
END BEGIN
* * * RKND.ASM * * *
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
BEGIN:
CALL DISP_CP
DB 'RKND V1.0 '
DB '(C)SYZ 1999.5.22',0DH,0AH
DB 'Please insert a KEY disk in '
DB 'drive A: Press any key..'
db 0DH,0AH,24H
DISP_CP:
POP DX
MOV AH,9
INT 21H
MOV AH,0
INT 16H
MOV CX,3 ;读3次
READ_1:
PUSH CX
MOV DI,0
MOV ES,DI
MOV DI,490H
MOV AX,17H
STOSB
MOV AX,0
MOV DX,0
INT 40H ;复位A盘
MOV AX,0201H
MOV BX,OFFSET BUFF_1
MOV CX,0600H
MOV DX,0
INT 40H ;读6道0头0号扇区
POP CX
CMP AH,10H
JZ TR_1
LOOP READ_1
JMP F_1
TR_1: MOV SI,BX
LODSW
CMP AX,03636H
JNZ F_1
TR_2: MOV AH,9
MOV DX,OFFSET Tk_1
INT 21H
MOV AH,4CH
INT 21H
F_1: MOV DX,OFFSET FK_1
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
BUFF_1 DB 200H DUP(36H)
FK_1 DB 'KEY is false!!',0dh,0ah,24h
TK_1 DB 'KEY is true!',0dh,0ah,24h
CODE ENDS
END BEGIN