⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootmf32.asm

📁 首先
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                                ;;
;;   Bootloader v0.2 for MenuetOS                                 ;;
;;                                                                ;;
;;   License: GPL / See file COPYING for details.                 ;;
;;   Bootloader comes with ABSOLUTELY NO WARRANTY.                ;;
;;   Copyright by Ville Turjanmaa, villemt@itu.jyu.fi             ;;
;;                                                                ;;
;;   Default setup: Floppy Fat12 bootsector which loads           ;;
;;   kernel.mnt from first partition of primary master harddisk   ;;
;;   with Fat32 filesystem and executes 16 bit jmp 0x1000:0x0000  ;;
;;                                                                ;;
;;   Note: Kernel.mnt must be located in the first cluster of     ;;
;;         root directory                                         ;;
;;                                                                ;;
;;   Compile with fasm 1.30+                                      ;;
;;   1) fasm thisfile.asm bootm                                   ;;
;;   2) copy bootm to target                                      ;;
;;                                                                ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


partition_start_cluster  equ  data_area+0 
fat_start_cluster        equ  data_area+4 
root_start_block         equ  data_area+8 
number_of_fats           equ  data_area+12
fat_size                 equ  data_area+16
block_start_cluster      equ  data_area+20
sectors_per_cluster      equ  data_area+24
in_cache                 equ  data_area+28

Debug                    equ  0
Fat12                    equ  1
Fat32                    equ  2

; SETUP
                         ; Load image from:
                         ;
hdbase   equ  0x1f0      ; 0x1f0 for primary device
                         ; 0x170 for secondary device
                         ;
hdid     equ  0x00       ; 0x00 for master hd
                         ; 0x10 for slave hd

                         ; Install bootsector to: 
                         ;
Header   equ  Fat12      ; Fat12:
                         ; Floppy installation can be used as such.
                         ;
                         ; Fat32:
                         ; Harddisk installation requires modification
                         ; of the Fat32 header, or you'll lose everything
                         ; on the target partition.
                         ;
                         ; Debug:
                         ; No Header. Use for debugging with floppy only !!
                         ; Messages at low left corner during boot:
                         ; 1 : bootsector loaded
                         ; 2 : file not found
                         ; 3 : file found - load starts
                         ; 4 : jump to kernel


                   jmp start_program
                   nop

if Header = Fat12
   
oemname            db 'MENUETOS'
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 'TEST       '
filesystemtype     db 'FAT12   '

end if


if Header = Fat32

Id                 db  'MSWIN4.1'
BytesPerSector     dw  200h
SectorsPerCluster  db  8
ReservedSector     dw  20h
NumberOfFATs       db  2
RootEntries        dw  0
TotalSectors       dw  0
MediaDescriptor    db  0F8h ; hd
SectorsPerFAT      dw  0   
SectorsPerTrack    dw  63
Heads              dw  255
HiddenSectors      dd  63
BigTotalSectors    db  0xbf,0x64,0x9c,0x00  
BigSectorsPerFat   db  0x10,0x27,0x00,0x00
ExtFlags           dw  0
FS_Version         dw  0
RootDirStrtClus    dd  2
FSInfoSec          dw  0x01         ; at 0x30
BkUpBootSec        dw  0x06
Reserved           dw  0,0,0,0,0,0
Drive              db  80h          ; at 0x40
HeadTemp           db  0
Signature          db  29h
SerialNumber       db  0x07,0x16,0x1a,0x39
VolumeLabel        db  'TEST       '
FileSystemID       db  'FAT32   '

end if

; 0x2000:0xfff0   - stack set at start
; es(0x1000+):0   - data read from hd

start_program:

  cli
  cld

  mov  ax,0x1000
  mov  es,ax
  mov  ax,0x2000
  mov  ss,ax
  mov  sp,0xfff0
  push cs
  pop  ds

if Header = Debug

  mov  ax,0xb800
  mov  gs,ax
  mov  [gs:80*24*2],byte '1'

end if

  xor  eax,eax
  call hd_read

  mov  eax,[es:0x1c6]                 
  mov  [partition_start_cluster],eax

  call hd_read

  mov  [in_cache],dword 0          ; clear fat cache

  movzx ecx,word [es:0xe]          ; fat start cluster
  mov  [fat_start_cluster],ecx

  movzx ecx,byte [es:0x10]         ; number of fats
  mov  [number_of_fats],ecx

  mov  ecx,[es:0x24]               ; fat size
  mov  [fat_size],ecx

  mov  eax,[number_of_fats]         ; block start cluster =
  imul eax,[fat_size]               ; number_of_fats*fat_size
  add  eax,[fat_start_cluster]      ; +fat_start_cluster
  mov  [block_start_cluster],eax

  movzx ecx,byte [es:0xd]           ; sectors per cluster
  mov  [sectors_per_cluster],ecx

  mov  eax,[block_start_cluster]      ; assumes that root starts at
  add  eax,[partition_start_cluster]  ; block number 2

new_file_cluster_search:

  mov  edi,[sectors_per_cluster]

new_file_search:

  call hd_read

  mov  esi,0
 .newn:
  cmp  [es:esi],dword 'KERN'
  jne  .not_found
  cmp  [es:esi+8],word 'MN'
  jne  .not_found
  jmp  .found
 .not_found:
  add  esi,32
  cmp  esi,512
  jne  .newn
  inc  eax
  dec  edi
  jnz  new_file_search

  if Header = Debug
     mov  [gs:80*24*2],byte '2'
  end if

  jmp  $

 .found:

  if Header = Debug
   mov  [gs:80*24*2],byte '3'
  end if

  mov  ax,[es:esi+20]              ; first cluster of file data
  shl  eax,16
  mov  ax,[es:esi+26]

  sub  eax,2                       ; eax has the first cluster of file 

new_cluster_of_file:

  push eax

  imul eax,[sectors_per_cluster]
  add  eax,[block_start_cluster]
  add  eax,[partition_start_cluster]

  mov  ecx,[sectors_per_cluster]
 newbr:
  call hd_read

  mov  dx,es
  add  dx,512 / 16
  mov  es,dx

  inc  eax
  dec  ecx
  jnz  newbr

  pop  eax
  call find_next_cluster_from_fat

  cmp  eax,0xf000000
  jb   new_cluster_of_file

  mov  ax,0x1000
  mov  es,ax

  sti

if Header = Debug

   mov  [gs:80*24*2],byte '4'

end if

if Header = Fat12

  mov  dx,0x3f2                  ; turn floppy motor off
  mov  al,0
  out  dx,al

end if

  jmp  0x1000:0000 

   
find_next_cluster_from_fat:

  push es
  mov  bx,0x1000-512/16
  mov  es,bx

  add  eax,2
  shl  eax,2
   
  mov  ecx,eax
  shr  eax,9             ; cluster no

  add  eax,[fat_start_cluster]
  add  eax,[partition_start_cluster]

  cmp  eax,[in_cache]    ; check cache
  je   no_read
  call hd_read
  mov  [in_cache],eax
 no_read:
   
  and  ecx,511           ; in cluster
  mov  eax,[es:ecx]
  sub  eax,2

  pop  es
   
  ret



hd_read:      ; eax block to read

    pushad 
    push  eax

  newhdread:
   
    mov   edx,hdbase
    inc   edx
    mov   al,0
    out   dx,al

    inc   edx
    mov   al,1
    out   dx,al

    inc   edx
    pop   ax
    out   dx,al

    inc   edx
    shr   ax,8
    out   dx,al

    inc   edx
    pop   ax
    out   dx,al

    inc   edx
    shr   ax,8
    and   al,1+2+4+8
    add   al,hdid
    add   al,128+64+32
    out   dx,al

    inc   edx
    mov   al,20h
    out   dx,al
   
  .hdwait:
   
    in    al,dx
    test  al,128
    jnz   .hdwait

    mov   edi,0x0 
    mov   ecx,256
    mov   edx,hdbase
    cld
    rep   insw

    popad

    ret
   
times ((0x1fe-$) and 0xff) db 00h

  db 55h,0aah ;boot signature

data_area:


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -