Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Use16
- org 0x7C00
- TTY_WIDTH equ 80
- TTY_HEIGHT equ 25
- FAT equ 0x1000
- ROOT equ 0x3000
- SBOOT equ 0x8000
- jmp start
- db 0
- BS_OEMName db ' '
- BPB_BytsPerSec dw 0x200 ; байт в секторе
- BPB_SecPerClus db 1 ; секторов в кластере
- BPB_RsvdSecCnt dw 1
- BPB_NumFATs db 2 ; число таблиц FAT
- BPB_RootEntCnt dw 0x00E0 ; число записей в корневом дереве
- BPB_TotSec16 dw 0x0B40
- BPB_Media db 0xF0
- BPB_FATSz16 dw 9 ; размер FAT в секторах
- BPB_SecPerTrk dw 0x12 ; секторов на дорожке
- BPB_NumHeads dw 2 ; число читающих головок
- BPB_HiddSec dd 0
- BPB_TotSec32 dd 0
- BS_DrvNum db 0
- BS_Reserved1 db 0
- BS_BootSig db 0
- BS_VolID dd 0
- BS_VolLab db ' '
- BS_FiSysType db 'FAT12 '
- start:
- cli
- mov ax, cs
- mov ds, ax
- mov es, ax
- mov ss, ax
- mov sp, 0x7C00
- sti
- push dx
- call k_read_fat
- call k_read_root_dir
- mov di, SBOOT
- mov si, secondBoot
- call k_read_file
- or ax, ax ; файл не найден?
- jz @f
- cmp word [SBOOT], 0 ; Проверяем на всякий случай
- je @f
- pop dx
- mov ax, k_read_file
- jmp SBOOT ; Передаем управление вторичному загрузчику
- @@:
- mov si, msgErrorCode
- call k_puts
- ;hlt
- jmp $
- ;
- ; Процедура читает файл с дискеты в память
- ;
- ; Вход:
- ; di - адрес буффера
- ; si - имя файла строго в формате NNNNNNNNEEE
- ; Выход:
- ; ax - 0 если файл не найден, 1 - найден
- ;
- k_read_file:
- push di
- mov di, ROOT
- mov cx, 0xE0 ;BPB_RootEntCnt
- .next_item:
- mov al, byte [di]
- cmp al, 0xE5 ;Метка удаленного файла
- je .space_item
- test al, al ;Пустая запись
- je .space_item
- pusha
- mov cx, 11 ;8+3
- repe cmpsb ;Сравниваем имя файла с искомым
- test cx,cx
- popa
- je .read_file ;break
- .space_item:
- add di, 32 ;Длина записи
- loop .next_item
- pop di
- xor ax, ax
- ret
- .read_file:
- pop si
- mov bp, word [di+0x1A] ;Номер начальной ячейки FAT
- push es
- .read_next_claster:
- pusha
- mov dx, bp
- sub dx, 3
- add dx, 0x22
- call k_read_sector
- popa
- cmp di, 0xFFF
- je .end_of_file
- mov di, bp
- mov bx, bp ; сохраняем на случай если будет 0xFFF
- imul di, 3
- shr di, 1
- add di, FAT ;FAT+num*3/2 - адрес записи
- mov di, word [ds:di]
- test bp, 1 ;Делаем коррекцию т.к. запись 12-битная
- jne @f
- and di, 0xFFF
- jmp .end_correct
- @@:
- shr di, 4
- .end_correct:
- mov bp, di
- ; Если ячейка конечная, то корректируем ее номер на старый+1
- cmp di, 0xFFF
- jne @f
- inc bx
- mov bp, bx
- @@:
- add si, 512
- jae @f
- mov ax, es
- add ax, 0x1000
- mov es, ax
- @@:
- jmp .read_next_claster
- .end_of_file:
- pop es
- xor ax, ax
- inc ax
- ret
- ;
- ; Процедура чтения сектора дискеты по абсолютному номеру
- ;
- ; Вход:
- ; dx - абсолютный номер сектора
- ; si - адрес буффера
- ;
- k_read_sector:
- ;S = N mod 18 + 1
- ;T = N / 18
- ;H = T mod 2
- ;C = T / 2
- pusha
- mov ax, dx
- mov cx, 0x12 ;BPB_SecPerTrk
- mov bx, si
- xor dx, dx
- div cx
- mov ch, al
- shr ch, 1
- mov cl, dl
- inc cx
- mov dh, al
- and dh, 1
- mov ax, 0x0201
- xor dl, dl
- int 0x13
- jnc @f
- mov si, msgErrorRead
- call k_puts
- @@:
- popa
- ret
- ;
- ; Процедура последовательного чтения нескольких секторов
- ;
- ; Вход:
- ; dx - начальный сектор
- ; cx - сколько секторов подряд читать
- ; si - адрес памяти, куда читать
- ;
- k_read_sectors:
- pusha
- @@:
- call k_read_sector
- inc dx
- add si, 512
- loop @b
- popa
- ret
- ;
- ; Процедура читает таблицу FAT в память
- ;
- k_read_fat:
- mov dx, 1
- mov cx, 9
- mov si, FAT
- call k_read_sectors
- ret
- ;
- ; Процедура читает корневой каталог в память
- ;
- k_read_root_dir:
- mov dx, 19
- mov cx, 15
- mov si, ROOT
- call k_read_sectors
- ret
- ;
- ; Процедура вывода ASCII-строки на экран.
- ;
- ; Вход:
- ; si - адрес строки
- ;
- k_puts:
- pusha
- xor bx, bx
- mov ah, 0x0E
- cld
- @@:
- lodsb
- test al, al
- jz @f
- int 0x10 ; вывести символ в режиме teletype
- jmp @b
- @@:
- popa
- ret
- msgErrorRead db 'Sector read fail!', 0
- msgErrorCode db 'File SBOOT.BIN not found!',0
- secondBoot db 'SBOOT BIN'
- times 510-($-$$) db 0
- db 0x55, 0xaa
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement