Boot loader/ru
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Бут сектор загрузки для FDD. Рассмотрим код и опишем логику работы.
<asm>;== boot program for Kolibri OS version 1.00 ==
- January 2002
- Copyright (C) Alex Nogueira Teixeira
- alexwal{dog_}siteplanet.com.br
- Distributed under GPL, see file COPYING for details
- equates for program
- added support of config save
lf equ 0ah cr equ 0dh pos_read_tmp equ 0700h ;position for temporary read boot_program equ 07c00h ;position for boot code seg_read_kernel equ 01000h ;seguiment to kernel read jmp start_program nop oemname db 'KOLIBRI ' bytespersector dw 512 sectorspercluster db 1 ressectors dw 1 numcopiesfat db 2 maxallocrootdir dw 224 maxsectors dw 2880 ;for 1.44 mbytes disk mediadescriptor db 0f0h ;fd = 2 sides 18 sectors sectorsperfat dw 9 sectorspertrack dw 18 heads dw 2 hiddensectors dd 0 hugesectors dd 0 ;if sectors > 65536 drivenumber db 0 db 0 bootsignature db 029h ;extended boot signature volumeid dd 0 volumelabel db 'KOLIBRI ' filesystemtype db 'FAT12 ' start_program: xor ax,ax mov ss,ax mov sp,boot_program push ss pop ds mov si,loading+boot_program loop_loading: lodsb or al,al jz procura_arquivo_novamente mov ah,0eh mov bx,07h int 010h jmp loop_loading
procura_arquivo_novamente: push ss pop es mov bp,16
newtry: dec bp jz mensagem_erro_arquivo mov ax,020eh ;read, 14 sectors for directory mov bx,pos_read_tmp ;es:bx read position mov cx,02h ;track 0, sector 2 mov dx,0100h ;head 1, drive 0 (a:) call read_sector ; int 013h ;read sectors ; jc newtry ; mensagem_erro_arquivo mov si,bx loop_compara_entrada_diretorio: push si mov cx,11 ;file name mov di,arq_boot+boot_program rep cmpsb pop si je le_arquivo_kernel add si,32 cmp si,pos_read_tmp+(512*14) ;end of directory jb loop_compara_entrada_diretorio mensagem_erro_arquivo: mov si,mens_erro+boot_program loop_envio_mensagem: lodsb or al,al jz espera_digitar_tecla mov ah,0eh mov bx,07h int 010h jmp loop_envio_mensagem espera_digitar_tecla: jmp $ ;зацикливание остановка пк. ;load kernel le_arquivo_kernel: mov bp,[si+01ah] mov ax,0209h ;read, 9 sectors mov bx,pos_read_tmp ;es:bx read position mov cx,02h ;track 0, sector 2 xor dx,dx ;head 0, drive 0 (a:) call read_sector ; int 013h ;read sectorsv jc mensagem_erro_arquivo mov ax,seg_read_kernel mov es,ax xor bx,bx ; \begin{diamond}[02.12.2005] mov [cluster1st+boot_program], bp ; \end{diamond}[02.12.2005] ; read kernel to es:bx loop_obtem_dados_kernel: call le_setor_dados jc mensagem_erro_arquivo ; add bx,0200h ;add one sector push bx mov bx,es add bx,0x20 mov es,bx pop bx mov di,bp shr di,01h pushf add di,bp add di,pos_read_tmp mov ax,[di] popf jc desloca_4_direita and ax,0fffh jmp verifica_fim_setores desloca_4_direita: mov cl,4 shr ax,cl verifica_fim_setores: cmp ax,0ff8h jae executa_kernel mov bp,ax jmp loop_obtem_dados_kernel executa_kernel: ; \begin{diamond}[02.12.2005] mov ax, 'KL' push 0 pop ds mov si, loader_block+boot_program ; \end{diamond}[02.12.2005] push word seg_read_kernel push word 00h retf le_setor_dados: ;es:bx -> position in read buffer ;bp -> logical sector to read ;carry <- 0 read OK ;carry <- 1 read error push bx mov ax,0e2eh ;decimal point xor bh,bh int 010h pop bx mov ax,bp ;data sector to read writesec: add ax,31 ;get logical sector mov cx,36 ;sector/track xor dx,dx div cx mov ch,al ;track transfer xor dh,dh ;head 0 cmp dl,18 jb cabeca_correta sub dl,18 inc dh ;head 1 cabeca_correta: inc dl mov cl,dl xor dl,dl ;drive 0 (a:) patchhere: mov ax,0201h ;read 1 sector call read_sector ; int 013h retn read_sector: push bp mov bp,20 newread: dec bp jz mensagem_erro_arquivo push ax bx cx dx int 0x13 pop dx cx bx ax jc newread pop bp retn loading db 13,10,'Starting system ',00h mens_erro: db 13,10 arq_boot: db 'KERNEL MNT ?',cr,lf,00h errors db 16 ; \begin{diamond}[02.12.2005] write1st: push cs pop ds mov byte [patchhere+2+boot_program], 3 mov ax, [cluster1st+boot_program] push 1000h pop es xor bx, bx call writesec mov byte [patchhere+2+boot_program], 2 retf cluster1st dw ? loader_block: db 1 dw 0 dw write1st+boot_program dw 0 ; \end{diamond}[02.12.2005] times 0x1fe-$ db 00h db 55h,0aah ;boot signature</asm>