`
lobin
  • 浏览: 417676 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于os的一些整理:第十九篇:软盘

 
阅读更多

软盘

软盘有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

 

写道
// SPECIFY
// 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

读数据

写道
// 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

配置

写道
// 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.
}

 

 

分享到:
评论

相关推荐

    OS2 Boot启动软盘

    用于OS2系统安装,win98下制作用于OS2启动的软盘。

    没有软盘照样有用的-虚拟软盘

    虚拟软盘技术是一种在现代计算机系统中模拟传统软盘驱动器的技术,它允许用户在没有物理软盘的情况下,实现与软盘类似的功能。这在许多情况下非常有用,尤其是在需要运行旧版软件或进行低级系统操作时,这些操作通常...

    OSBOOT.IMG dos622光盘启动文件,也可以做成软盘

    在描述中提到的"也可以做成软盘",意味着OSBOOT.IMG可以被写入到软盘上,使其成为可引导的软盘。在过去的年代,软盘是常见的存储媒介,用户可以通过将这样的启动文件复制到软盘上来创建一个可以启动电脑的媒体。 ...

    !万能工具软盘,万能工具软盘

    【标签】:“万能工具软盘”标签明确指出这个话题的核心是关于一个多功能的工具集合,它可能是针对特定操作系统或通用的,用于解决各种技术问题。 【文件名称】:“dm98ddo.exe” 这个文件名看起来像是一个可执行...

    DOS7.1软盘版加软盘修复软件

    DOS7.1软盘版是微软在20世纪90年代末期发布的一个操作系统版本,主要用于个人计算机的启动和管理。在这个版本中,DOS(Disk Operating System)提供了更加强大和稳定的命令行环境,使得用户可以通过键盘输入指令来...

    软盘分析工具

    软盘分析工具在这个环境中提供了一种方便的方式来检查软盘的状态,包括读取、写入能力,检测坏道,以及整理文件系统。 软盘分析工具的主要功能可能包括: 1. **磁盘扫描**:扫描软盘上的所有扇区,寻找损坏或无法...

    虚拟软盘小工具,十分方便制作虚拟软盘(含源码)

    标题中的“虚拟软盘小工具”是指一种软件应用,它能够创建并管理虚拟的软盘驱动器,使得用户能够在没有物理软盘的情况下模拟软盘的使用。这种工具通常用于在现代计算机系统上运行那些需要软盘作为媒介的老式程序或者...

    虚拟软盘工具,将img虚拟成A:等等

    在IT领域,虚拟软盘工具是一种实用的软件技术,它允许用户将镜像文件(如`.img`格式)模拟为物理软盘驱动器,通常表示为A:或B:等驱动器字母。这一功能在系统恢复、软件安装、游戏运行以及对旧软件的兼容性测试等方面...

    制作软盘驱动

    本篇文章将详细介绍如何制作软盘驱动,以及在这个过程中可能遇到的相关知识点。 首先,我们需要了解软盘驱动的基本概念。软盘驱动器是一种磁性存储设备,用于读取和写入3.5英寸或5.25英寸的软磁盘。这些磁盘通常有...

    1581软盘系统,系统的软盘是维护的开发,开发的维护在于软盘的系统

    《1581软盘系统:开发与维护的深度融合》 在计算机技术发展的早期阶段,软盘作为一种存储介质,扮演了至关重要的角色。1581软盘系统,是80年代末90年代初个人计算机领域的一个重要里程碑,尤其在DOS系统盛行的时代...

    软盘驱动基本原理

    ### 软盘驱动基本原理 #### 一、软盘子系统及软盘结构 **软盘子系统**由三个核心部分组成:软盘、软驱(软盘驱动器)和软盘控制器。 1. **软盘**:主要用于存储数据。它由盘片和保护套组成,其中盘片是以聚酯膜...

    dos 6.22 安装 软盘

    【标题】"dos 6.22 安装 软盘" 涉及的知识点主要集中在DOS操作系统的历史、版本特点以及安装过程。DOS(Disk Operating System)是微软在1981年推出的命令行操作系统,是个人计算机早期广泛使用的系统之一。6.22版本...

    wpwin10ins.zip 快速开发的软盘,软盘开发的技术,技术实现的快速

    "软盘开发的技术"可能涉及到创建、编辑和管理这些虚拟软盘镜像的过程,而"技术实现的快速"则暗示了这里可能包含了一些提高开发效率的方法或工具。 在描述中,信息与标题重复,没有提供额外的细节,但我们可以根据...

    软盘扇区读写工具,软盘镜像文件生成器

    软盘扇区读写工具与软盘镜像文件生成器是一种专门用于操作软盘数据的软件,主要功能包括创建和编辑软盘的镜像文件。在这个项目中,开发者使用了经典的编程环境 VC++6(Visual C++ 6.0)来实现这个功能,这是一款在...

    ucdos安装软盘

    1. **准备软盘**:首先,你需要有15张空白的3.5英寸软盘,并用上述工具将uc7.img写入第一张软盘,以此类推,将每一张对应的映像文件写入相应的软盘。 2. **启动安装**:将第一张写入了uc7.img的软盘插入电脑的软驱...

    windows 95 软盘镜像

    《Windows 95软盘镜像:历史与技术解析》 Windows 95,作为微软公司推出的里程碑式操作系统,标志着个人计算机新时代的开启。这款操作系统于1995年发布,以其直观的用户界面和对多任务处理的支持,极大地推动了桌面...

    vc编辑软盘的程序,可对软盘 格式化、校验和读写特殊扇区。可用作磁盘加密.zip

    这些扇区对于软盘的正常工作至关重要,因为它们存储了关于如何找到和管理软盘上其他数据的信息。通过直接操作这些扇区,可以实现一些高级功能,例如磁盘加密,这在描述中也有所提及。 磁盘加密是一种安全措施,通过...

    windows1.0软盘镜像

    市面上已不多见的windows1.0软盘镜像,本人自己将多个软盘中的文件打包制作成了这个文件,可在虚拟机上装载并安装。由于windows3.2及之前版本都是dos下的图形界面程序,所以首先得安装ms-dos,再挂载该软盘镜像,在...

    fdg540复制软盘

    标题“fdg540复制软盘”暗示我们讨论的主题是关于使用某种工具或方法来复制软盘,可能涉及到数据的备份或者克隆。描述中提到的“fdc530”是一个加密软盘复制工具,这表明它不仅能够复制软盘上的数据,还可能提供了...

    Dos 6.22 软盘镜像

    【标题】"Dos 6.22 软盘镜像"所涉及的知识点主要集中在老式的个人计算机操作系统——MS-DOS 6.22上,这是一个基于命令行的系统,广泛应用于20世纪90年代。这个标题暗示了我们讨论的是一个用于创建或还原DOS启动软盘...

Global site tag (gtag.js) - Google Analytics