30天自制操作系统吧 关注:1,380贴子:4,760
  • 3回复贴,共1

铁娃娃OS访问(读取)软盘的操作实验

只看楼主收藏回复

先上一幅铁娃娃OS读取软盘的桌面截图。

这幅图片是铁娃娃OS在进入32bit模式后,在不能利用BIOS的INT 0x13情况下,再次读取
软盘扇区获得的。
按“纸娃娃”的作者所言,进入32bit系统以后,就不能调用BIOS功能了。不能调用BIOS
就不能利用BIOS的INT 0x13访问软盘。虽然可以在进入32bit模式之前,利用BIOS功能预
先读取,但能读取的扇区数是受到限制的。实际上是不能把整个软盘2880扇区都读入到电
脑内存里的。因为在16bit模式下,给我们利用的内存范围是"0x7E00~0x9FBFF"之间(见中
文版P49.的解释)。书中介绍的程序大多只用到10个磁道,即180KB。作者也介绍了用20个
磁道(360KB)的例子。由于可用内存的限制,即最大只能用到33磁道。所以虽然一张3.5寸
软盘有80个磁道,实际上OS的img文件,最多只能放607KB的内容。也就是说软盘还有一
大半存储空间没有利用呢。感慨纸娃娃作者千方百计地压缩OS的size是多么辛苦。
所以才有本文的实验尝试。基本思路是利用底层的I/O命令,直接访问软盘驱动器的接口。
纸娃娃OS为我们提供了不少的利用底层的I/O命令的例子,如定时器8237的设置,中断控制
器的8259的设置等。
我开始用带软盘驱动器的东芝古董电脑,对I/O的"3F2"输出一个8bit命令,软盘的马达
居然“嚓嚓”开始运转了。还有其他控制命令,如磁道定位等。虽然眼睛是看不到磁头的动作,
听到“咔咔”的声音可以判断出来。接下来就暂不用古董电脑,转移到虚拟机上调试。
首先,目标是读取一个Boot扇区。
(待续)
12.22


IP属地:上海1楼2024-12-22 20:35回复
    2. 读取软盘驱动器一个扇区。
    除了要初始化FDC(软盘驱动控制器),还有数据数据传输模式的问题。一种是非DMA
    模式,那就是一个字节,一个字节,读固定的0x3F5端口。另一种是DMA模式,它可以不消
    耗CPU的资源,直接从软驱传到电脑内存里。这是实际使用时的首选。设置DMA也有些麻烦,
    所幸以前有设置SB16声卡的经验,基本思路与方法几乎一样。不同的是SB16声卡的传输方
    向是内存到声卡,而这里是软驱到内存,相当于SB16的麦克风的DMA设置。
    下图是成功读取软盘第一扇区(BOOT扇区)的数据后,在桌面上显示。

    掩盖住的“美女”图片,也是通过读取一个个扇区(几十KB)获得的。
    现在只做成读取一个扇区的函数。大于512字节的文件,就要用for一个个读入,效率太低。
    下一步,是想一次读入18个扇区,尽可能缩短运行时间。或者一次读入36个扇区(磁头0,
    磁头1)。
    (续1)
    12.22 .


    IP属地:上海2楼2024-12-22 21:12
    回复
      3,一次读取软盘驱动器n个扇区。
      设置方式与读取18个扇区比,要复杂一些。上周是一次读取18扇区,我为了程序简便,
      每次都是从1号扇区至18号扇区,然后是磁头0或1进位,磁道是10进制进位。
      现在,我要建立一个类似 file_loadfile()的函数,函数名为file_loaddisk_fd(),专读软盘。
      在DMA里设置要传送的数据总长度,以扇区为最小单位。
      FDC设置要确定扇区,磁头,磁道的开始位置。是根据clustno数值,事先计算好。
      由连续写入9个命令字节的“读扇区”命令,写入FDC的0x3F5口。每输出一共字节
      还要判断状态寄存器(0x3F4),只有允许(不忙)的情况下,才能输出命令。
      使用方法与读取 file_loadfile()相同。不同的是 file_loadfile()是从内存中读取的,速度
      很快。file_loaddisk_fd()是从软驱软盘中读取,用虚拟机时速度也要慢一些。用实际软驱
      则更慢。
      以前,我用普通方法播放mp2音乐,最长可以达到50秒(约400KB)。现在我利用软盘的
      后面一大部分空间,时间可以延长到160秒(文件size 1.2MB)。
      提供测试文件:20241229.img
      链接: https://pan.baidu.com/s/1kShACHNcxJb8FfQg7WJNkA
      提取码: feos
      这个测试文件有一些BUG,目的只是验证怎么充分利用软盘的可能性。播放声音还与
      装载,解码,中断的处理时间相关。压缩得很厉害,声质也不好。
      用虚拟机VMware 软件打开。ES1371虚拟声卡。点击"mp2",再在波形上点击一下。
      用耳机收听。左右声道是不同的歌曲。

      1229.


      IP属地:上海3楼2024-12-29 18:20
      回复
        补充:
        1,改善读取扇区命令的状态判断。
        2,在32bit系统内,开设一个1.44MB的存储空间。在起动OS的时候,预先把整个
        软盘的内容全部读进来,以后就不用再麻烦去读软盘了。以后要访问软盘时,
        就直接访问这个1.44MB的存储空间就可以了。之前怎么没有想到呢?大概是受
        读硬盘的那套思路。 假如需要的话,开设2.88MB空间都可以。
        3,把播放时间延长到170秒。数据几乎填满1.44MB。
        4,改掉几个致半命的BUG,稳定性有所改善。
        5,放入两首吕继宏的歌曲,各放在左右声道里。压缩到最低速率的64bps。
        6,在VMware虚拟机上运行,声卡为ES1371。QEMU上无法打开。
        运行时的模样:

        体验版: FeOS1231.img
        百度下载地址:
        链接: https://pan.baidu.com/s/1pFuq7V0NdzTez6SlvXUDLQ
        提取码: feos
        24.12.31 最后一天。


        IP属地:上海4楼2024-12-31 14:36
        回复