BOOTMENU.ASM
上传用户:yeshiping1
上传日期:2007-01-06
资源大小:29k
文件大小:5k
源码类别:

磁盘编程

开发平台:

Others

  1. PAGE 60,132
  2. ; bootmenu: BOOT Hard Disk Partition
  3. ; by Gordon W. Ross, Aug 1990
  4. ;
  5. ; See the file bootmenu.doc for user instructions.
  6. ;
  7. ; This version of bootmenu is compatible with SpeedStor.
  8. ; See the file sstor-bug.txt for the gory details.
  9. ;
  10. ; The following is an outline of the program:
  11. ;
  12. ; Relocate self from 0x7c00 to 0x0600
  13. ; Display partition menu
  14. ; Prompt for and read user selection
  15. ;
  16. ; Boot from the selected partition:
  17. ; (was selected by user, or was active)
  18. ; Read first sector of selected partition into 0x7c00
  19. ; Verify good second-stage boot sector (magic word)
  20. ; Set-up correct register values and jump to it.
  21. ;
  22. CODEORG equ 0600h ; offset of this code in code seg
  23. ; All values computed from offsets in codeseg need to be
  24. ; adjusted by adding CODEORG to each.  The obvious method,
  25. ; using "org CODEORG" causes MASM/LINK to fill in the space.
  26. codeseg segment
  27. assume cs:codeseg, ds:codeseg
  28. ; Initial program entry point
  29. ; (Assembler is told this is at offset zero.)
  30. main:
  31. ; Set up the stack
  32. xor ax,ax
  33. mov si,7C00h ; just before load location
  34. cli
  35. mov ss,ax
  36. mov sp,si
  37. sti
  38. ; Relocate this code from 0:7C00h to 0:CODEORG
  39. mov ds,ax
  40. mov es,ax
  41. mov si,7C00h ; where this program is initially loaded
  42. mov di,CODEORG
  43. mov cx,0100h
  44. cld
  45. rep movsw
  46. ; Jump to relocated code (0:CODEORG)
  47. jmp far ptr begin1
  48. begin equ $ ; The above jump lands here.
  49. ; Print partition menu from name table
  50. menu:
  51. call putnl ; print newline
  52. mov si, offset pnames ; no org fix-up here!
  53. mov al, '1'
  54. prname:
  55. push si
  56. push ax
  57. call putc
  58. mov al,' '
  59. call putc
  60. mov cx,8 ; maximum name length
  61. call putn
  62. call putnl
  63. pop ax
  64. pop si
  65. add si,8
  66. inc al
  67. cmp al,'4'
  68. jbe prname
  69. ; Prompt for and read user selection
  70. select:
  71. call putnl ; print prompt
  72. mov si, offset prompt + CODEORG
  73. call puts
  74. mov ah,0 ; Read a keystroke and print it
  75. int 16h
  76. push ax
  77. call putc
  78. call putnl
  79. pop ax
  80. sub al,'1' ; range check and convert to index
  81. cmp al,04
  82. jnb select
  83. boot:
  84. ; Boot from the selected partition.
  85. ; On entry to this section:  AL = index of ptable element
  86. ; get address of ptable element (si = & ptable[AL])
  87. mov si, offset ptable ; no org fix-up here
  88. mov cl,16 ; size of array element
  89. mul cl ; ax = al * cl
  90. add si,ax
  91. ; Check for valid system ID (non-zero)
  92. mov al,[si+4]
  93. cmp al,0
  94. jnz id_ok
  95. mov si, offset msgempty + CODEORG
  96. jmp error
  97. id_ok:
  98. ; Read first sector of selected partition into 0x7c00
  99. ; Also, mark this entry active (in RAM only) in case the
  100. ; secondary boot program looks at it (which it may).
  101. mov al,80h ; active flag
  102. mov [si], al
  103. mov cx,5 ; retry count
  104. retry: push cx
  105. mov dx,[si] ; drive, head
  106. mov cx,[si+2] ; cyl, sector
  107. mov bx,7C00h ; destination (es=0)
  108. mov ax,0201h ; BIOS read one sector
  109. int 13h
  110. jnc rd_ok
  111. xor ax,ax ; reset disk
  112. int 13h
  113. pop cx
  114. loop retry
  115. mov si, offset msgread + CODEORG
  116. jmp error
  117. rd_ok: pop cx
  118. ; Check for valid magic number in secondary boot sector
  119. mov ax, 0AA55h
  120. assume ds:seg0 ; Actually, codeseg == seg0
  121. cmp ax, magic2
  122. assume ds:codeseg
  123. jz magic_ok
  124. mov si, offset msginvalid + CODEORG
  125. jmp error
  126. magic_ok:
  127. ; Make sure ds:si points to the booted partition, and
  128. ; Jump to the secondary boot program.
  129. jmp far ptr begin2
  130. ; Jump here with si=error-message
  131. error:
  132. call puts
  133. call putnl
  134. jmp menu
  135. ;*************************************************************
  136. ; Subroutines
  137. ;*************************************************************
  138. CR EQU 13
  139. LF EQU 10
  140. TAB EQU  9
  141. putc proc near ; print char in AL
  142. mov ah, 0Eh ; uses: ax, bx
  143. mov bx, 07
  144. int 10h
  145. ret
  146. putc endp
  147. putnl proc near ; print a newline
  148. mov al, CR ; uses: ax, bx
  149. call putc
  150. mov al, LF
  151. call putc
  152. ret
  153. putnl endp
  154. puts proc near ; print string at address SI
  155. mov cx,80 ; Stop at null or CX chars
  156. putn: lodsb ; uses: ax, bx, cx, si
  157. cmp al,0
  158. jz puts_e
  159. push cx
  160. call putc
  161. pop cx
  162. loop putn
  163. puts_e: ret
  164. puts endp
  165. ;**********************************************************
  166. ; A little space here makes this program live happily with
  167. ; SpeedStor, which wants to write type-override stuff here.
  168. ;**********************************************************
  169. org 100h
  170. ;**********************************************************
  171. ; Strings
  172. ;**********************************************************
  173. prompt db "Boot partition? (1-4) ",0
  174. msgempty db "Empty!",0
  175. msgread db "Read error!",0
  176. msginvalid db "Invalid!",0
  177. codeseg ends
  178. ; Declares some offsets in segment zero
  179. seg0 segment at 0
  180. org CODEORG + (offset begin - offset main)
  181. begin1 equ $
  182. ; Here is the name table used for the partition menu.
  183. ; The accompanying fdisk program updates this table.
  184. org CODEORG + 180h
  185. pnames db 32 dup(?)
  186. ; The locations after 1AE are (reportedly) used by some
  187. ; Western Digital controllers in "auto-configure" mode.
  188. ; Don't put anything critical between here and ptable.
  189. ; Here is the partition table
  190. org CODEORG + 1BEh
  191. ptable db (4 * 16) dup(?)
  192. ; Here is where the secondary boot sector is loaded.
  193. org 7C00h
  194. begin2 equ $
  195. org 7DFEh
  196. magic2 dw ?
  197. seg0 ends
  198. end main