今天的主要任务是让画面显示黑屏,嘿嘿。
内容比较多,包括制作能装载程序的IPL,读取软盘内容,画面显示黑屏,开始运行C语言编写的程序。
由于我们在同一个文件上做了多次修改,因此今天的资源分了多个文件夹,里面用到的文件括号里的内容对应文末资源里的文件夹名。
事不宜迟,那么现在就开始吧——
制作IPL
上一篇我们知道,磁盘最初的512字节是启动区,现在我们要装载下一个512字节的内容。
我们在上一版ipl.nas中添加了如下代码,由于该部分内容后面需要经过多次修改,这里给每次修改添加了版本,ipl.nas(version_a)内容修改如下:
添加部分version_a版:
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; 柱面0
MOV DH,0 ; 磁头0
MOV CL,2 ; 扇区2
MOV AH,0x02 ; AH=0x02 : 读盘
MOV AL,1 ; 1个扇区
MOV BX,0
MOV DL,0x00 ; A驱动器
INT 0x13 ; 调用磁盘BIOS
JC error
老规矩,看新指令——
JC指令:是“jump if carry”的缩写,意思是如果进位标识是1的话就跳转,进位标识是一个只能存储1位信息的寄存器。
这里用到了几个新的寄存器:CH=柱面号,CL=扇区号,DH=磁头号,DL=驱动器号。
在有多个软盘驱动器的时候,用驱动器号来指定从哪个驱动器的软盘上读取数据。
这里有些小伙伴可能会问柱面、扇区、磁头这些都是什么呢?不用着急,我们先把软盘拆开,看一下软盘的内部结构——
柱面(cylinder)就是上图中 深黑色的一圈一圈圆环状的区域,从外向内分别为柱面0、柱面1、…、柱面79,一共80个柱面。
磁头是一种针状的磁性设备,它可以从正反两面接触磁盘。软盘磁盘正反两面都能记录数据,因此我们有正反两个磁头,分别是磁头0号和磁头1号。
扇区(sector)就是把一个圆环(柱面),均匀分成几等份,每一份称为一个扇区。一个圆环有18个扇区,分别称为扇区1、扇区2、…扇区18。
综上,一张软盘有80个柱面、2个磁头,18个扇区,一个扇区可以存储512字节,所以一张软盘的容量为:
80×2×18×512 = 1 474 560B = 1440KB。
我们制作的IPL启动区位于C0-H0-S1(柱面0,磁头0,扇区1),下一个扇区是C0-H0-S1,接下来我们就装载这个扇区。
添加试错
读取软盘的时候很容易出错,这时候可能多读几次就能读出来了。
因此这里我们添加试错程序ÿ