本帖最后由 神之觉醒 于 2013-9-29 12:57 编辑
手上的两个IDE硬盘,80G和40G,IED接口最多可以挂两个硬盘,要是两个都上的话耗电比较大,担心电源会爆炸;
下面是本机I/O空间地址和IDE硬盘寄存器的对应关系:
FF10H读: 数据寄存器低8位(D0~D7)
FF10H写: 数据寄存器低8位(D0~D7)
FF11H读: 错误寄存器
FF11H写: 特征寄存器
FF12H读: 扇区计数寄存器
FF12H写: 扇区计数寄存器
FF13H读: 扇区号或LBA块地址7~0
FF13H写: 扇区号或LBA块地址7~0
FF14H读: 磁道数低8位或LBA块地址15~8
FF14H写: 磁道数低8位或LBA块地址15~8
FF15H读: 磁道数高8位或LBA块地址23~16
FF15H写: 磁道数高8位或LBA块地址23~16
FF16H读: 驱动器/磁头或LBA块地址27~24
FF16H写: 驱动器/磁头或LBA块地址27~24
FF17H读: 状态寄存器
FF17H写: 命令寄存器
FF1DH读: 数据寄存器高8位(D15~D8)
FF1DH写: 数据寄存器高8位(D15~D8)
FF1EH读: 交换状态寄存器(只读寄存器)
FF1EH写: 设备控制寄存器(复位)
FF1FH读: 驱动器地址寄存器
FF1FH写: ?
硬盘读写请参看这里的资料(摆渡谷哥):
XXXXXXXXXXXXXXXXXXXXXX/view/XXXXXXXXXXXXXXXXXXXXXXXXXXXml
在本机,读写IDE用PIO方式;寻址用LBA(扇区)方式;
写1个扇区案例: 要写入数据到扇区1,查询状态寄存器的第7位(最高位),为1表示IDE忙,为0时可以操作,在FF12H、FF13H、FF14H、FF15H、FF16H分别写入01H、01H、00H、00H、E0H(如果操作从盘写F0H),查询状态寄存器的第6位,为1时,可以发送写命令 命令寄存器写入30H,这个时候硬盘灯点亮,接着查询状态寄存器的第3位,为1则可以写入扇区的数据;必须先把高8位数据写入FF1DH,然后低8位数据写入FF10H,在写入第512个字节,硬盘灯灭,操作完成;
读1个扇区案例: 要从读出扇区1数据,查询状态寄存器的第7位(最高位),为1表示IDE忙,为0时可以操作,在FF12H、FF13H、FF14H、FF15H、FF16H分别写入01H、01H、00H、00H、E0H(如果操作从盘写F0H),查询状态寄存器的第6位,为1时,可以发送读命令 命令寄存器写入20H,这个时候硬盘灯点亮,接着查询状态寄存器的第3位,为1则可以读出扇区的数据;必须先从FF10H读出低8位,然后再从FF1DH读出高8位,在读出第511个字节时硬盘灯灭,然后第512字节从FF1DH读出;
扇区计数寄存器为连续读写扇区的个数,如果需要连续读写N个扇区,就写入N~