print all cluster numbers ok

This commit is contained in:
ridethepig 2022-09-21 14:25:18 +08:00
parent 308d1caf1e
commit a0dacc4b9e

View File

@ -28,15 +28,15 @@ DispStr:
pop bp
ret
;----------------------------------------------------------------------------
; @param ax: the int to print
; @param bp + 4: the word to print as uint_16t
;----------------------------------------------------------------------------
; print a word as decimal to current cursor
DispInt:
push bp
mov bp, sp
pusha
mov di, 0
mov ax, [bp + 4]
.loop1:
mov dx, 0
mov bx, 10
@ -61,8 +61,9 @@ DispInt:
pop bp
ret
;----------------------------------------------------------------------------
; give you a new line
; no param
;----------------------------------------------------------------------------
; give you a new line
DispNewline:
push bp
mov bp, sp
@ -81,6 +82,27 @@ DispNewline:
ret
;----------------------------------------------------------------------------
; @param bp + 4: low byte holds the ascii to print
;----------------------------------------------------------------------------
; putchar to current cursor pos
DispPutchar:
push bp
mov bp, sp
pusha
; get cursor pos
mov ax, 0300h
mov bh, 0
int 10h
; putchar
mov ax, [bp + 4]
mov ah, 0Eh ; no need to set al, ax holds the param
mov bl, 0Fh
int 10H
popa
pop bp
ret
;----------------------------------------------------------------------------
; 函数名: StringCmp
;----------------------------------------------------------------------------
; 作用:
@ -143,11 +165,11 @@ ReadSector:
pop bp
ret
.ReadFail:
jmp $ ; 如果cf位置1就意味着读入错误这个时候建议直接开摆
;------------------------------------------------------------------------------
; 函数名: GetNextCluster
; data => BaseOfSectorBuf : 0
;------------------------------------------------------------------------------
; 作用:
; ax存放的是当前的簇(cluster)号根据当前的簇号在fat表里查找找到下一个簇的簇号并将返回值存放在ax
@ -176,9 +198,9 @@ GetNextCluster:
mov ax, [es:bx]
pop bx ; 取回奇数标识信息
cmp bx, 0 ; 如果是第奇数个FAT项还得右移四位
jz EvenCluster ; 可能是微软(FAT是微软创建的)第一个亲儿子的原因,有它的历史局限性
jz .EvenCluster ; 可能是微软(FAT是微软创建的)第一个亲儿子的原因,有它的历史局限性
shr ax, 4 ; 当时的磁盘很脆弱经常容易写坏所以需要两张FAT表备份而且人们能够制作的存储设备的容量很小
EvenCluster:
.EvenCluster:
and ax, 0FFFh ; 读完需要与一下因为高位是未定义的防止ax值有误
mov word [bp - 2], ax ; 这里用了一个技巧这样在popa的时候ax也顺便更新了
@ -191,7 +213,7 @@ EvenCluster:
; @retval ax: first cluster no
;------------------------------------------------------------------------------
; Find File by name, return first cluster no.
; data => BaseOfSectorBuf:OffsetOfSectorBuf
FuncFindFile:
push bp
mov bp, sp
@ -247,58 +269,86 @@ FuncFindFile:
pop bp
ret
;------------------------------------------------------------------------------
; @param bp + 4: first cluster number
;------------------------------------------------------------------------------
; Find File by name, return first cluster no.
; data => BaseOfSectorBuf:OffsetOfSectorBuf
FuncPrintClusterNumbers:
push bp
mov bp, sp
pusha
mov ax, [bp + 4]
.loop:
mov ax, dx
push ax
call DispInt ; ax now holds the current cluster number
add sp, 2
push ' '
call DispPutchar
add sp, 2
call GetNextCluster ; 根据数据区簇号获取文件下一个簇的簇号
mov dx, ax ; dx <- 下一个簇的簇号
cmp dx, 0FFFh ; 判断是否读完了根据文档理论上dx只要在0xFF8~0xFFF都行但是这里直接偷懒只判断0xFFF
jnz .loop
popa
pop bp
ret
MAIN:
mov ax, cs ; cs <- 0
mov ds, ax ; ds <- 0
mov ss, ax ; ss <- 0
mov ax, BaseOfSectorBuf
mov es, ax ; es <- BaseOfSectorBuf
; Display "This is {name}'s boot"
call DispNewline
mov ax, cs
push ax
mov ax, StudentString
push ax
mov ax, _endStudentString - StudentString
push ax
call DispStr
add sp, 6 ; pop for 3 times
mov ax, LoaderFileName
push ax
push cs
push StudentString
push _endStudentString - StudentString
call DispStr
add sp, 6 ; pop for 3 times
; Read loader.bin's cluster number
push LoaderFileName
call FuncFindFile
mov dx, ax ; temporarily save read result to dx
pop ax
add sp, 2
mov dx, ax ; temporarily save read result to dx
; Print first cluster number
call DispNewline
mov ax, cs
push ax
mov ax, clusternoString
push ax
mov ax, _endclusternoString - clusternoString
push ax
push cs
push clusternoString
push _endclusternoString - clusternoString
call DispStr
add sp, 6 ; pop for 3 times
mov ax, dx ; dx holds the read result
call DispInt
mov ax, AA1FileName
push ax
push dx ; dx holds the read result
call FuncPrintClusterNumbers
add sp, 2
; Read aA1.txt's cluster number
push AA1FileName
call FuncFindFile
mov dx, ax ; temporarily save read result to dx
pop ax
add sp, 2
mov dx, ax ; temporarily save read result to dx
; Print first cluster number
call DispNewline
mov ax, cs
push ax
mov ax, clusternoString
push ax
mov ax, _endclusternoString - clusternoString
push ax
push cs
push clusternoString
push _endclusternoString - clusternoString
call DispStr
add sp, 6 ; pop for 3 times
mov ax, dx ; dx holds the read result
call DispInt
add sp, 6
push dx ; dx holds the read result
call FuncPrintClusterNumbers
add sp, 2
jmp $
;==============================================================================
@ -307,7 +357,7 @@ MAIN:
BaseOfStack equ 07c00h ; Boot状态下堆栈基地址(栈底, 从这个位置向低地址生长)
; according to osdev, memory from 0x0000:0x7e00 to 0x7000:0xFFFF is free to use
BaseOfSectorBuf equ 07000h ; diff from where we are here
OffsetOfSectorBuf equ 0000h ; diff from where we are here
OffsetOfSectorBuf equ 0400h ; the first 400h(=1024d) bytes left for fat1 read buf
RootDirSectors equ 14 ; 19~32
SectorNoOfRootDirectory equ 19 ; Root Sector starts from 19
SectorNoOfFAT1 equ 1
@ -335,7 +385,7 @@ LeftRootDirSectors dw RootDirSectors ; 还未搜索的根目录
RootDirSectorNow dw SectorNoOfRootDirectory ; 目前正在搜索的根目录扇区
BufferPacket times 010h db 0 ; ReadSector函数会用到的用于向int 13h中断的一个缓冲区
LoaderFileName db "LOADE BIN", 0 ; 8:3, fill with whitespace
LoaderFileName db "LOADER BIN", 0 ; 8:3, fill with whitespace
AA1FileName db "AA1 TXT", 0 ; the 0 at end is for StrCmp
StudentString db "This is LiMaoliang's boot" ; size = 25
_endStudentString