软盘
软盘有160k, 180k, 320k, 360k, 720k, 1.2M, 1.44M, 1.68M, 1.72M以及 2.88M.我们比较常用的是1.44M的软盘。
软盘的扇区
扇区编号顺序连贯的,对应磁盘上的物理位置也是连贯的。
1.44M
1.44M软盘有2个盘面(0和1),每个盘面有80条磁道(或称磁柱),一个磁道有18个扇区,一个扇区大小为512个字节。
1.44M软盘总容量计算: 2 * 80 * 18 * 512 bytes = 1474560 bytes = 1.44M
FDC
FDC即Floppy Disk Controller,软盘控制器。
Model 30
Model 30即PS/2 Model 30。
PS/2
PC/AT
这是一种软盘控制器,即PC/AT Floppy Disk Controller。
还有Standard IBM PC/AT Floppy Disk Controller,标准IBM PC/AT软盘控制器,以及82077AA PC/AT Floppy Disk Controller,即82077AA PC/AT软盘控制器。
PC/XT
82072
8272A
寄存器
状态寄存器A
Status Register A
状态寄存器B
Status Register B
数字输出寄存器
Digital Output Register或者DOR。该寄存器是个8-位只写寄存器。
// |M|M|M|M|D|R|D|D|
// |O|O|O|O|M|E|R|R|
// |T|T|T|T|A|S|1|0|
// |D|C|B|A| |T| | |
// +-+-+-+-+-+-+-+-+
// ^ ^ ^ ^ ^ ^|<->|
// | | | | | | |
// | | | | | | |DSEL1 and 0: Drive select
// | | | | | |Controller reset
// | | | | |DMA and IRQ channel
// | | | |Motor control for floppy drive A
// | | |Motor control for floppy drive B
// | |Motor control for floppy drive C
// |Motor control for floppy drive D
// | | | | | | | | |
// +-+-+-+-+-+-+-+-+
// ^ ^ ^ ^ ^ ^ ^ ^
// | | | | | | | |DRIVE SEL 0
// | | | | | | |DRIVE SEL 1
// | | | | | |RESET
// | | | | |DMA GATE
// | | | |MOT EN0
// | | |MOT EN1
// | |MOT EN2
// |MOT EN3
DMA GATE
DMA GATE位只有在PC-AT和Model 30模式下才会开启。如果DMA GATE位设置为低电位,INT和DRQ输出将被跟踪,并且DACK和TC输入将被禁用。DMA GATE位设置为高电位将开启到系统的INT,DRQ,以及DACK。在PS/2模式下,DMAGATE对INT、DRQ、TC或DACK引脚没有影响,它们总是处于活动状态。
磁带驱动器寄存器
Tape Drive Register
主状态寄存器
Main Status Register或者MSR
// |M|D|N|B|A|A|A|A|
// |R|I|D|U|C|C|C|C|
// |Q|O|M|S|T|T|T|T|
// | | |A|Y|D|C|B|A|
// +-+-+-+-+-+-+-+-+
// ^ ^ ^ ^|<----->|
// | | | | |Drive D, C, B, A in positioning mode
// | | | |Instruction (device busy)
// | | |non-DMA mode
// | |Data input/output
// |Main Request
数据比率选择寄存器
DataRate Select Register,其低2位(bit0-1)指定数据传输率,表示从驱动器读取数据或者向驱动器写入数据的传输速率。对于1.44MB或者1.2MB的软盘,应该将这两位设置为0。
数据比率
驱动器类型 数据率 设置值
2.88M 1Mbps 3
1.44M 500Kbps 0
1.2M 500Kbps 0
数据FIFO寄存器
Data FIFO Register或者FIFO寄存器,有些资料也叫Data Register,数据寄存器,或者DR
数字输入寄存器
Digital Input Register或者DIR
配置控制寄存器
Configuration Control Register或者CCR
另外还有几个状态寄存器
Status Register 0
|IC|S|E|/|H|DD|
| |E|C| | |SS|
| | | | | |10|
+--+-+-+-+-+--+
| | | | | |Drive Select
| | | | |Head Address
| | | |Unused. This bit is always ``0''.
| | |Equipment Check
| |Seek End
|Interrupt Code
Status Register 1
|E|/|D|O|/|N|N|M|
|N| |E|R| |D|W|A|
+-+-+-+-+-+-+-+-+
| | | | | | | |Missing Address Mark
| | | | | | |Not Writable
| | | | | |No Data
| | | | |Unused. This bit is always ``0''.
| | | |Overrun/Underrun
| | |Data Error
| |Unused. This bit is always ``0''.
|End of Cylinder
Status Register 2
|/|C|D|W|/|/|B|M|
| |M|D|C| | |C|D|
+-+-+-+-+-+-+-+-+
| | | | | | | |Missing Data Address Mark
| | | | | | |Bad Cylinder
| | | | | |Unused. This bit is always ``0''.
| | | | |Unused. This bit is always ``0''.
| | | |Wrong Cylinder
| | |Data Error in Data Field.
| |Control Mark
|Unused. This bit is always ``0''.
Status Register 3
|/|W|/|T|/|H|DD|
| |P| |0| |D|SS|
| | | | | | |10|
+-+-+-+-+-+-+--+
| | | | | | |
| | | | | | |Drive Select
| | | | | |Head Address
| | | | |Unused. This bit is always ``1''.
| | | |Indicates the status of the TRK0 pin.
| | |Unused. This bit is always ``1''.
| |Write Protected
|Unused. This bit is always ``0''.
NEC765A/B
82077AA
82077AA兼容Personal System/2s、PC/AT以及PC/XT软盘控制器子系统。Personal System/2s就是PS/2?
因此82077AA兼容PS/2, PC/AT以及PS/2 Model 30操作模式。
PS/2模式
PC/AT模式
PS/2 Model 30模式
命令
使用命令字节来表示要发送的命令。因此命令使一个8-位的值,命令值小于32,发送(写入)到数据FIFO寄存器。如果有需要发送参数的话,每个命令后面跟着指定的参数字节。如果有返回数据的话,后面同时会有返回字节需要读取。
82077AA处理命令分为3个阶段:Command阶段, Execution阶段以及Result阶段。
所有的命令都有Command阶段,如果命令执行有返回信息的话,那么这个命令就有Result阶段。另外就是Execution阶段,有些命令有Execution阶段,有些命令没有Execution阶段,需要看具体命令说明。
命令字节
Command Byte
参数字节
parameter bytes
返回字节
result bytes
可选位
Option bits
命令说明
READ TRACK
读磁道
SPECIFY
设置驱动器参数
SRT
SRT即Step Rate Time,步率时间,表示磁头在连续相邻的磁道之间移动时,控制器需要等待的时间。对于现代3.5英寸软盘驱动器,一个合理的时间是3毫秒。6到8毫秒是个安全值。
对应SRT值计算公式
SRT值 = 16 - (milliseconds * data_rate / 500000)
对于1.44 MB软盘,SRT值可以这样计算:SRT值 = 16 - (8 * 500000 / 500000) = 8。
HLT
HLT即Head Load Time,磁头搭载时间,表示在激活头部和实际执行读/写之间,控制器应该等待的时间。
合理的时间是10毫秒,30毫秒是个安全值。
对应HLT值计算公式
HLT值 = milliseconds * data_rate / 1000000
对于1.44 MB软盘,HLT值可以这样计算:HLT值 = 10 * 500000 / 1000000 = 5。
HUT
HUT即Head Unload Time,磁头卸载时间,表示在解除(deactivate)磁头,使磁头无效之前,控制器应该等待的时间。
对应HUT值计算公式
HUT值 = milliseconds * data_rate / 8000000
对于1.44 MB软盘,这个HUT时间为240毫秒,即milliseconds=240,那么HUT值可以这样计算:HUT值 = 240 * 500000 / 8000000 = 15。
HUT值最好设置为0,表示在任何模式下都是最大值。
设置驱动器参数说明
1、写入命令0x3
2、写入第1个参数字节:SRT值 << 4 | HUT值
3、写入第2个参数字节:HLT值 << 1 | NDMA
// Command byte:
// +----+----+
// |0000|0011|
// +----+----+
// The 1st parameter byte:
// +----+----+
// |SRT |HUT |
// +----+----+
// The 2nd parameter byte:
// +----+---+-+
// |HLT |N|
// | |D|
// +----+---|-+
// ^
// |When this bit is "1", the NONDMA mode is selected, and when ND is "0", the DMA mode is selected.
SENSE DRIVE STATUS
检测驱动器状态
WRITE DATA
写数据
READ DATA
读数据
// Command byte:
// +----+----+
// |MMS0|0110|
// |TFK | |
// | M | |
// +----+----+
// Parameter byte:
// The 1st parameter byte:
// +----+----+
// |0000|0HDD|
// | | DSS|
// | | S10|
// +----+----+
// The 2nd parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |C
// The 3rd parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |H
// The 4th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |R
// The 5th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |N
// The 6th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |EOT
// The 7th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |GPL
// The 8th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |DTL
// Result byte:
// The 1st result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |ST0
// The 2nd result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |ST1
// The 3rd result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |ST2
// The 4th result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |C
// The 5th result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |H
// The 6th result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |R
// The 7th result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |N
RECALIBRATE
重新矫正
SENSE INTERRUPT STATUS
检测中断
WRITE DELETED DATA
写入删除数据
READ ID
读ID
READ DELETED DATA
读取删除数据
FORMAT TRACK
格式化磁道
DUMPREG
备份寄存器
SEEK
查找
RELATIVE SEEK
VERSION
获取版本
SCAN EQUAL
扫描(等于)
PERPENDICULAR MODE
P模式(Pmode)
CONFIGURE
配置
// Command byte:
// +----+----+
// |0001|0011|
// +----+----+
// The 1st parameter byte:
// +----+----+
// |0000|0000|
// +----+----+
// The 2nd parameter byte:
// +-+-+-+-+----+
// |0| | | | |
// +-+-+-+-+----+
// ^ ^ ^|<-->|
// | | | ^
// | | | |FIFOTHR.
// | | |POLL
// | |EFIFO
// |EIS
// The 3rd parameter byte:
// +--------+
// |PRETRK |
// +--------+
LOCK
锁定
VERIFY
验证
SCAN LOW OR EQUAL
扫描(小于等于)
SCAN HIGH OR EQUAL
扫描(大于等于)
以上命令有执行阶段的有:READ DATA,READ DELETED DATA,WRITE DATA,WRITE DELETED DATA,READ TRACK,VERIFY,FORMAT TRACK,SCAN EQUAL,SCAN LOW OR EQUAL,SCAN HIGH OR EQUAL,RECALIBRATE,SEEK,DUMPREG,READ ID。所有涉及到读写的命令都有执行阶段。
Command阶段
Execution阶段
执行阶段
Result阶段
返回阶段
所有的数据传输,向82077AA发送数据或从82077AA接收数据,都在Execution阶段。这里有两种模式:DMA或者non-DMA模式。这可以在SPECIFY(设置驱动器参数)命令中指定。
数据传输模式
通过SPECIFY(设置驱动器参数)命令指定数据传输模式,即DMA模式还是non-DMA模式。non-DMA模式即PIO模式。
DMA
PIO
中断
通过以下函数检查中断是否屏蔽:
// 0X40 -> 0100 0000 #define O_IRQ6 0X40 pic_irq_is_enable(O_IRQ6)
DMA
参考8237/8237A以及DMA控制器。
DRQ
DRQ即DMA request,DRQ请求。
DMA channel
DMA channel即DMA通道
设置DMA通道2
初始化FDC
初始化FDC启动motor的时候需要延迟等待一段时间,等motor速度上来。
要延迟等待多久?
如果是3.5"软盘,建议延迟等待300毫秒;如果是5.25"软盘,建议延迟等待500毫秒。
如果使用DMA进行数据传输,在初始化FDC之前,需要设置DMA,设置DMA Channel 2,即DMA 通道#2。
通过以下函数设置DMA 通道#2:
setup_dma2(FLOPPY_DMA_TRANSFER_ADDRESS, FLOPPY_DMA_TRANSFER_LENGTH - 1);
相关结构和定义
#define DOR_REST 0x04 #define DOR_DMA 0x08 #define DOR_MOTA 0x10 #define DOR_MOTB 0x20 #define DOR_MOTC 0x40 #define DOR_MOTD 0x80
#define DOR_MOTX(A,B,C,D) (DOR_MOTA | DOR_MOTB | DOR_MOTC | DOR_MOTD) #define DOR_MOTY(BA,BB,BC,BD) ((BA ? DOR_MOTA : 0) | (BB ? DOR_MOTB : 0) | (BC ? DOR_MOTC : 0) | (BD ? DOR_MOTD : 0)) #define DOR_MOTZ(drive) (1 << (drive + 4))
enum floppy_command_t { COMMAND_READ_TRACK = 2, COMMAND_SPECIFY = 3, COMMAND_SENSE_DRIVE_STATUS = 4, COMMAND_WRITE_DATA = 5, COMMAND_READ_DATA = 6, COMMAND_RECALIBRATE = 7, COMMAND_SENSE_INTERRUPT = 8, COMMAND_WRITE_DELETED_DATA = 9, COMMAND_READ_ID = 10, COMMAND_READ_DELETED_DATA = 12, COMMAND_FORMAT_TRACK = 13, COMMAND_DUMPREG = 14, COMMAND_SEEK = 15, COMMAND_VERSION = 16, COMMAND_SCAN_EQUAL = 17, COMMAND_PERPENDICULAR_MODE = 18, COMMAND_CONFIGURE = 19, COMMAND_LOCK = 20, COMMAND_VERIFY = 22, COMMAND_SCAN_LOW_OR_EQUAL = 25, COMMAND_SCAN_HIGH_OR_EQUAL = 29 };
void floppy_init(u1 drive); void floppy_ready(); void floppy_wait(); void floppy_set_datarate(u1 rate); void floppy_send_command(u1 command, u1 option, byte* parameter_bytes, byte* result_bytes);
数据传输模式
// the mode of data transfer. return zero if in DMA mode int floppy_get_mode() { u1 msr = floppy_read_msr(); return msr & MSR_NDMA; // MSR_NDMA = 0x20, if bit5 of MSR set, in non-DMA mode, else in DMA mode. }
相关推荐
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的...
7. Windows磁盘扫描程序:磁盘扫描程序能够检测和修复磁盘错误,包括硬盘、软盘和可读/写光盘。 8. 录音机程序的文件扩展名:在Windows中,录音机程序创建的文件通常以.wav为扩展名。 9. 实用程序:实用程序是辅助...
1. ENIAC是世界上第一台电子计算机,它于1946年诞生,主要用于数值计算,加减运算速度达到每秒5000次。 2. 信息技术作为现代科技的核心,已经成为推动全球经济社会发展的新动力。 3. 1997年5月11日,IBM的超级...
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
基于kinect的3D人体建模C++完整代码.cpp
搞机工具箱10.1.0.7z
GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟
auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
复件 复件 建设工程可行性研究合同[示范文本].doc
13考试真题最近的t64.txt
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
auto_gptq-0.4.2-cp38-cp38-win_amd64.whl
自动立体库设计方案.pptx
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!