软盘
软盘有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的超级...
scratch少儿编程逻辑思维游戏源码-米克 demo.zip
scratch少儿编程逻辑思维游戏源码-萝卜男孩拯救世界.zip
scratch少儿编程逻辑思维游戏源码-酷忍者.zip
教育科技_微信小程序_二手交易平台_大学校园二手书与物品循环利用公益系统_风华读书人校园二手交易平台_基于C2C模式的校内闲置物品交易系统_支持多校区独立运营的二手书交易平台_包含
全新UI彩虹外链网盘系统源码前后端美化模板整站 模版文件.zip
maoxig_nonebot-plugin-ai-timetable_32152_1745865455265
少儿编程scratch项目源代码文件案例素材-足球顶尖高手.zip
少儿编程scratch项目源代码文件案例素材-作战基地.zip
少儿编程scratch项目源代码文件案例素材-云端之上 1-4名玩家.zip
scratch少儿编程逻辑思维游戏源码-魔幻之塔.zip
scratch少儿编程逻辑思维游戏源码-楼层酷跑.zip
scratch少儿编程逻辑思维游戏源码-圈.zip
少儿编程scratch项目源代码文件案例素材-纸片马里奥自定义战役.zip
少儿编程scratch项目源代码文件案例素材-自由下落.zip
少儿编程scratch项目源代码文件案例素材-阻击蜈蚣.zip
健康监测与疾病预防_脉搏波分析_六轴加速度传感器_生理参数融合_STC12硬件采集_Android数据处理_SpringBoot后端_MySQL数据库_MatlabPython实验
音乐流媒体应用开发_基于JetpackCompose的跨平台开发_网易云音乐风格的多终端音乐播放器_包含手机平板电视手表四端适配的现代化音乐播放应用实现音乐发现播放列表管理个性化推