; ; MenuesOS Boot Loader ; ; Author: Trans ; Date: 14.02.03 ; Version: 1.0 ; ; Current Version: 1.1 ; Date of modification: 11.06.03 ; ; Compile with FASM ; ;--------Code------------ org 100h start: push cs pop ds mov ax,0003h int 10h mov dx,title call print mov dx,title_1 call print ; mov dx,mes1 ; call print ;-------open Msetup.exe-------------- mov dx,img0 call file_open cmp ax,00h je loader_next_file_search_0 mov [handle],ax mov [foffset],dword 00h jmp loader_continue loader_next_file_search_0: mov dx,img1 call file_open cmp ax,00h je loader_next_file_search_00 mov [handle],ax jmp loader_continue loader_next_file_search_00: mov dx,img2 call file_open cmp ax,00h je loader_next_file_search_01 mov [handle],ax mov [foffset],dword 00h jmp loader_continue loader_next_file_search_01: mov dx,img3 call file_open cmp ax,00h je loader_not_find_file mov [handle],ax mov [foffset],dword 00h loader_continue: ;******* Load IMAGE in memory*************************************************** mov dx,start_img_read call print mov bx,ax xor cx,cx ; cx:dx - offset in bytes (cx*65535+dx) xor edx,edx call file_offset mov [image_counter],0 @@_1: mov bx,[handle] mov dx,buffer ;ds:dx - buffer mov cx,512*96 call file_read push fs xor ax,ax ;AX = 0 mov fs,ax ;DS = AX = 0 ..Èñïîëüçóåò ËÈÍÅÉÍÎÅ ÀÄÐÅÑÎÂÀÍÈÅ! mov ecx,512*96 mov si,buffer movzx edi,[image_counter] imul edi,48*1024 add edi,0x100000 @@: mov al,[si] mov [fs:edi],al inc edi inc esi loop @b pop fs mov dx,progress_img_read call print inc [image_counter] mov bx,[handle] ;ax movzx edx,[image_counter] imul edx,48*1024 mov ecx,edx shr ecx,16 call file_offset cmp [image_counter],30 jne @@_1 mov dx,end_img_read call print mov dx,start_kernel_read call print ;******************************************************************************* ;-------Move pointer to boot-sector-- mov bx,[handle] ;ax xor cx,cx mov edx,[foffset] call file_offset ;---------Read boot-sector----------- mov bx,[handle] mov dx,buffer mov cx,512 call file_read ;--------Read parametrs-------------- mov ax,[buffer+0bh] mov [SectSize],ax mov al,[buffer+0dh] mov [ClustSect],al mov ax,[buffer+0eh] mov [ResSect],ax add ax,[ResRgn] mov [FATRgn],ax mov al,[buffer+10h] mov [FATCnt],al xor bx,bx mov bl,al mov ax,[buffer+11h] mov [RootEnt],ax shr ax,4 ; ax=ax*32/512 mov [RootDirRgnSz],ax mov ax,[buffer+16h] mov [FATSect],ax mul bx mov [FATRgnSz],ax add ax,[FATRgn] mov [RootDirRgn],ax add ax,[RootDirRgnSz] mov [DataRgn],ax ;------Read FATs and RootDir--------- xor eax,eax xor edx,edx mov ax,[FATRgn] mul [SectSize] add eax,[foffset] mov cx,dx mov dx,ax mov bx,[handle] call file_offset mov ax,[FATRgnSz] mul [SectSize] mov cx,ax mov dx,buffer mov bx,[handle] call file_read mov cx,[RootEnt] shl cx,5 mov dx,Root mov bx,[handle] call file_read ;-------Search entry pointer in RootDir--------- push ds pop es mov cx,[RootEnt] mov bx,Root loader_loc_00: push cx mov cx,11 mov di,bx mov si,kernel repe cmpsb jnz loader_notfound pop cx jmp loader_find loader_notfound: pop cx add bx,32 loop loader_loc_00 loader_find: mov ax,[bx+1ah] mov [FirstClust],ax mov eax,[bx+1ch] mov [filesize],eax ;------Read Kernel---------------------- call read_kernel ;--------------------------------------- mov bx,[handle] call file_close ;;;;;;;;;;;;;;;;;;;;;; jmp loader_yes ;;;;;;;;;;;;;;;;;;;;;; ; mov dx,mes2 ; call print ;loader_key: ; mov ah,00h ; int 16h ; cmp al,1bh ;ESC ; je loader_no ; cmp al,6eh ;'n' ; je loader_no ; cmp al,4eh ;'N' ; je loader_no ; cmp al,79h ;'y' ; je loader_yes ; cmp al,59h ;'Y' ; je loader_yes ; jmp loader_key loader_not_find_file: mov dx,mes4 call print jmp loader_exit loader_yes: mov dx,yes call print mov ax,7000h mov es,ax mov si,move_kernel xor di,di mov cx,len_mk rep movsb jmp far 7000h:0000h ; jmp loader_exit loader_no: mov dx,no call print loader_exit: mov dx,mes3 call print retn ;----Subprogramms-------- print: ; in: dx - offset of ASCII string ; out: mov ah,09h int 21h retn file_open: ; in: ds:dx - offset of ASCIIZ filename string ; out: ax - file handle (ax=0 - not found) mov ax,3d00h int 21h jnc fo_exit xor ax,ax fo_exit: retn file_close: ; in: bx - file handle ; out: mov ah,3eh int 21h retn file_read: ; in: bx - file handle ; ds:dx - buffer ; cx - numbers of bytes ; out: mov ah,3fh int 21h retn file_offset: ; in: bx - file handle ; cx:dx - offset in bytes (cx*65535+dx) ; out: mov ax,4200h int 21h retn sector_find: ; in: ax - No of Cluster ; out: ax - 1st sector of Cluster dec ax dec ax push bx xor bx,bx mov bl,[ClustSect] mul bx pop bx add ax,[DataRgn] retn read_cluster: ; in: ax - No of Cluster ; ds:dx - buffer ; out: push dx call sector_find push ax xor eax,eax xor ebx,ebx pop ax mov bx,[SectSize] mul ebx add eax,[foffset] mov dx,ax shr eax,16 mov cx,ax mov bx,[handle] call file_offset xor ax,ax mov al,[ClustSect] mul [SectSize] mov cx,ax mov bx,[handle] pop dx call file_read retn read_kernel: ; in: ; out: mov ax,8000h mov es,ax ;8000:0000 = 80000h - Temporal location of kernel xor di,di ; mov ax,[FirstClust] mov bp,ax rk_loc_00: push es mov dx,Root call read_cluster xor ax,ax ; Moving cluster to area of location kernel mov al,[ClustSect] ; mul [SectSize] ; mov cx,ax ; pop es ; mov si,Root ; rep movsb ; cmp di,00h jne rk_continue mov ax,es add ax,1000h mov es,ax rk_continue: mov ax,bp cmp ax,0ff8h jae rk_done shl ax,1 ; Val=Clustrer*1,5 //(Cluster*3)/2 add ax,bp ; shr ax,1 ; mov bx,ax add bx,buffer mov ax,[bx] bt bp,0 jc rk_nechet and ax,0fffh jmp rk_chet rk_nechet: shr ax,4 rk_chet: mov bp,ax jmp rk_loc_00 rk_done: retn move_kernel: ; in: ; out: mov ax,8000h mov ds,ax mov ax,1000h mov es,ax xor si,si xor di,di mov cx,8000h rep movsb mov cx,8000h rep movsb mov bx,es add bx,1000h mov es,bx mov bx,ds add bx,1000h mov ds,bx mov cx,8000h rep movsb mov cx,8000h rep movsb mov ax,1000h mov ds,ax mov es,ax jmp far 1000h:0000h retn len_mk=$-move_kernel ;--------Data------------ title db 'KolibriOS\MenuetOS Boot Loader. Ver.1.2 Copyright(C) 2003, Trans.',0ah,0dh,0ah,0dh,'$' title_1 db 'Addition 2005-2006 by Mario79 - for boot Flash RAM.',0ah,0dh,0ah,0dh,'$' ;mes1 db 'It is alternative of boot from floppy.',0ah,0dh ; db 'You MUST select HD booting !!!',0ah,0dh,0ah,0dh,'$' ;mes2 db 'Are you sure loading MeOS? (Y/N):','$' start_img_read db 'Read IMG file: ','$' progress_img_read db '#','$' end_img_read db 0ah,0dh,0ah,0dh,'$' start_kernel_read db 'Start kernel read ','$' yes db 'Y','$' no db 'N','$' mes3 db 0ah,0dh,0ah,0dh,'See you later ...',0ah,0dh,'$' mes4 db 0ah,0dh,0ah,0dh,'Not Found: ' img0 db 'kolibri\kolibri.img',0,', ' img1 db 'msetup.exe',0,', ' img2 db 'menuet.img',0,', ' img3 db 'kolibri.img',0,' :($' image_counter db 0 kernel db 'KERNEL MNT',0 handle dw ? foffset dd 20480 SectSize dw ? ; +0bh ClustSect db ? ; +0dh ResSect dw ? ; +0eh FATCnt db ? ; +10h RootEnt dw ? ; +11h FATSect dw ? ; +16h filesize dd ? ; +1ch FirstClust dw ? ; +1ah ResRgn dw 0 ; = VolumeStart FATRgn dw ? ; = ResRgn+ResSect RootDirRgn dw ? ; = FATRgn+(FATCnt*FATSect) DataRgn dw ? ; = RootDirRgn+((RootEnt*32)/SectSize) ResRgnSz dw ? ; = ResSect FATRgnSz dw ? ; = FATCnt*FATSect RootDirRgnSz dw ? ; = (RootEnt*32)/SectSize ;First sector of cluster N = DataRgn+((N-2)*ClustSect) buffer: org 3000h Root: