home *** CD-ROM | disk | FTP | other *** search
/ Borland Programmer's Resource / Borland_Programmers_Resource_CD_1995.iso / code / bcpp / file7 / boot.asm next >
Encoding:
Assembly Source File  |  1995-05-19  |  8.8 KB  |  253 lines

  1. ; Simple boot strap loader for floppies (only)
  2.  
  3. ; Assemble:     tasm boot
  4. ; Link:         tlink /t boot, boot.bin
  5.  
  6. ;.......................................................................
  7.  
  8. NUL     equ     00h             ; NUL terminator
  9. LF      equ     0ah             ; line feed
  10. CR      equ     0dh             ; carriage return
  11. BOOT    equ     7c00h           ; offset address of boot sector load point
  12.  
  13. cseg    segment
  14.         assume cs:cseg
  15.         
  16.         org 0
  17.  
  18.         db      BOOT dup (?)    ; skip to load point
  19.  
  20. start:
  21.         jmp     boot_code       ; skip over data
  22.         
  23. ;.......................................................................
  24.  
  25. ; required data header for boot sector
  26.  
  27. oem_name                db   "FLOPPY  " ; varies
  28. bytes_per_sector        dw   ?          ; 512
  29. sectors_per_cluster     db   ?          ; 1 or 2
  30. reserved_sectors        dw   ?          ; 1
  31. FATs                    db   ?          ; 2
  32. root_directories        dw   ?          ; usually 112 or 224
  33. total_sectors           dw   ?          ; varies
  34. media_descriptor        db   ?          ; varies
  35. sectors_per_FAT         dw   ?          ; varies
  36. sectors_per_track       dw   ?          ; varies
  37. heads                   dw   ?          ; usually 2
  38. hidden_sectors          dd   0
  39. large_vol_tsectors      dd   0
  40. physical_drive          db   0
  41. reserved                db   0
  42. extended_boot_sig       db   29h
  43. serial_number           dd   ?
  44. volume_label            db   "NO NAME    "
  45. fat_type                db   "FAT12   "
  46.  
  47. ;.......................................................................
  48.                         
  49. ; boot sector program code
  50.  
  51. boot_code:
  52.         cli                             ; disable interrupts
  53.  
  54.         xor     ax, ax                  ; set DS, ES and SS to segment 0
  55.         mov     ds, ax
  56.         mov     es, ax
  57.         mov     ss, ax
  58.  
  59.         mov     sp, BOOT                ; put stack just below boot code
  60.  
  61.         sti                             ; enable interrupts
  62.  
  63.         assume ds:cseg, es:cseg, ss:cseg
  64.  
  65.         int     13h                     ; reset the disk controller
  66.         jc      reset_error             ; jump if error
  67.  
  68.         mov     si, offset boot_msg     ; display boot message
  69.         call    puts
  70.  
  71. ; compute starting sector for directory entries
  72.         xor     ah, ah
  73.         mov     al, byte ptr FATs
  74.         mul     word ptr sectors_per_FAT
  75.         add     ax, word ptr reserved_sectors
  76.         mov     word ptr directory_sector, ax   ; save result
  77.  
  78. ; read the directory sector
  79.         mov     bx, 0500h               ; directory data will go here
  80.         call    read_sector             ; read the first directory sector
  81.         jc      read_error              ; jump if error
  82.  
  83. ; check first directory entry for IO.SYS (MS-DOS systems)
  84.         mov     di, bx                  ; BX still points to buffer start
  85.         mov     si, offset iosys        ; file name: IO.SYS
  86.         mov     cx, 11                  ; file names are 11 characters long
  87.         rep     cmpsb                   ; compare
  88.         jnz     system_error            ; jump if not first entry
  89.  
  90. ; check second directory entry for MSDOS.SYS (MS-DOS systems)
  91.         lea     di, [bx+32]             ; get address of next directory entry
  92.         mov     si, offset msdos        ; file name: MSDOS.SYS
  93.         mov     cx, 11                  ; file names are 11 characters long
  94.         rep     cmpsb                   ; compare
  95.         jnz     system_error            ; jump if not second entry
  96.                 
  97. ; compute starting sector for data (comes after the root directory entries)
  98.         mov     ax, 32                          ; 32 bytes per directory entry
  99.         mul     word ptr root_directories
  100.         div     word ptr bytes_per_sector
  101.         add     ax, word ptr directory_sector
  102.         mov     word ptr data_sector, ax        ; save it
  103.  
  104.         mov     cx, 3                   ; first 3 sectors of io.sys
  105.         mov     bx, 0700h               ;  will go here
  106.  
  107. ; read the 3 required sectors
  108. read_loop:
  109.         push    ax                      ; save logical sector number
  110.         push    bx                      ; save buffer address
  111.         push    cx                      ; save count
  112.  
  113.         call    read_sector             ; read 1 sector
  114.  
  115.         pop     cx                      ; restore registers
  116.         pop     bx
  117.         pop     ax
  118.  
  119.         jc      read_error              ; jump if error
  120.  
  121.         inc     ax                              ; bump sector# to next sector
  122.         add     bx, word ptr bytes_per_sector   ; advance pointer
  123.         loop    read_loop                       ; continue
  124.  
  125. ; set up the parameters for the BIOS loader
  126.         mov     ch, byte ptr media_descriptor
  127.         mov     dl, byte ptr physical_drive
  128.         xor     ax, ax
  129.         mov     bx, word ptr data_sector
  130.  
  131.         jmp     far ptr bios_load               ; do it
  132.  
  133. ;.......................................................................
  134.  
  135. reset_error:
  136.         mov     si, offset reset_msg
  137.         jmp     short no_good
  138.  
  139. system_error:
  140.         mov     si, offset system_msg
  141.         jmp     short no_good
  142.  
  143. read_error:
  144.         mov     si, offset read_msg
  145.         jmp     short no_good
  146.  
  147. no_good:
  148.         call    puts                            ; print error message
  149.         mov     si, offset retry_msg
  150.         call    puts                            ; print retry message
  151.  
  152.         xor     ah, ah                          ; wait for key press
  153.         int     16h
  154.  
  155.         int     19h                             ; try booting again
  156.  
  157.         mov     si, offset reboot_msg           ; just in case it comes back
  158.         jmp     no_good                         ;  (it shouldn't)
  159.  
  160. ;.......................................................................
  161.  
  162. ; write a message to the screen
  163. ;  address of message in register SI
  164. puts    proc near
  165.  
  166.         lodsb                   ; get one character
  167.         or      al, al          ; check for terminating NUL
  168.         jnz     disp            ; continue
  169.         ret                     ;  else done
  170.  
  171. disp:
  172.         mov     ah, 0eh         ; write character in teletype mode
  173.         mov     bx, 0007h       ; video page 0, normal white
  174.         int     10h             ; BIOS video function
  175.         jmp     puts
  176.  
  177. puts    endp
  178.  
  179. ; read a sector from the disk
  180. ;  buffer address in register BX
  181. ;  logical sector number in register AX
  182. read_sector     proc near
  183.  
  184. ; translate logical sector number to sector, track, and head
  185.         xor     dx, dx
  186.         div     word ptr sectors_per_track
  187.         inc     dl                              ; sector numbering starts at 1
  188.         mov     byte ptr sector, dl             ; save remainder: sector
  189.  
  190.         xor     dx, dx                          ; quotient still in AX
  191.         div     word ptr heads
  192.         mov     byte ptr head, dl               ; save remainder: head
  193.         mov     word ptr track, ax              ; save quotient:  track
  194.  
  195. ; set up for disk read
  196.         mov     dx, word ptr track
  197.         mov     cl, 06                          ; bits 8 & 9 of the track
  198.         shl     dh, cl                          ;  into upper 2 bits of sector
  199.         or      dh, byte ptr sector             ; stuff in the sector
  200.         mov     cx, dx                          ; move result into CX
  201.         xchg    ch, cl                          ; CH<-track, CL<-sector
  202.  
  203.         mov     dl, byte ptr physical_drive     ; DL<-drive
  204.         mov     dh, byte ptr head               ; DH<-head
  205.  
  206.         mov     ax, 0201h                       ; read one sector
  207.         int     13h
  208.  
  209.         ret
  210.  
  211. read_sector     endp
  212.  
  213. ;.......................................................................
  214.  
  215. ; data used by program
  216.  
  217. iosys                   db "IO      SYS"
  218. msdos                   db "MSDOS   SYS"
  219.  
  220. boot_msg                db "Now booting from floppy.", CR, LF, NUL
  221. reset_msg               db "Disk controller error.",   CR, LF, NUL
  222. read_msg                db "Disk read error.",         CR, LF, NUL
  223. system_msg              db "No system on disk.",       CR, LF, NUL
  224. reboot_msg              db "Reboot failed.",           CR, LF, NUL
  225. retry_msg               db "Press any key to reboot.", CR, LF, NUL
  226.  
  227. track                   dw 0
  228. head                    db 0
  229. sector                  db 0
  230.  
  231. directory_sector        dw 0
  232. data_sector             dw 0
  233.  
  234. ; fill-out program size to 510 bytes (remaining 2 are for boot signature)
  235. fill    db (512-(offset fill-offset start)-2) dup (0)
  236.  
  237. signature       dw 0AA55h
  238.  
  239. cseg    ends
  240.  
  241. ;.......................................................................
  242.  
  243. bios    segment at 0070h
  244.         assume cs:bios
  245.  
  246.         org 0000h
  247.  
  248. bios_load       label far
  249.  
  250. bios    ends
  251.  
  252.         end     start
  253.