home *** CD-ROM | disk | FTP | other *** search
- ; Simple boot strap loader for floppies (only)
-
- ; Assemble: tasm boot
- ; Link: tlink /t boot, boot.bin
-
- ;.......................................................................
-
- NUL equ 00h ; NUL terminator
- LF equ 0ah ; line feed
- CR equ 0dh ; carriage return
- BOOT equ 7c00h ; offset address of boot sector load point
-
- cseg segment
- assume cs:cseg
-
- org 0
-
- db BOOT dup (?) ; skip to load point
-
- start:
- jmp boot_code ; skip over data
-
- ;.......................................................................
-
- ; required data header for boot sector
-
- oem_name db "FLOPPY " ; varies
- bytes_per_sector dw ? ; 512
- sectors_per_cluster db ? ; 1 or 2
- reserved_sectors dw ? ; 1
- FATs db ? ; 2
- root_directories dw ? ; usually 112 or 224
- total_sectors dw ? ; varies
- media_descriptor db ? ; varies
- sectors_per_FAT dw ? ; varies
- sectors_per_track dw ? ; varies
- heads dw ? ; usually 2
- hidden_sectors dd 0
- large_vol_tsectors dd 0
- physical_drive db 0
- reserved db 0
- extended_boot_sig db 29h
- serial_number dd ?
- volume_label db "NO NAME "
- fat_type db "FAT12 "
-
- ;.......................................................................
-
- ; boot sector program code
-
- boot_code:
- cli ; disable interrupts
-
- xor ax, ax ; set DS, ES and SS to segment 0
- mov ds, ax
- mov es, ax
- mov ss, ax
-
- mov sp, BOOT ; put stack just below boot code
-
- sti ; enable interrupts
-
- assume ds:cseg, es:cseg, ss:cseg
-
- int 13h ; reset the disk controller
- jc reset_error ; jump if error
-
- mov si, offset boot_msg ; display boot message
- call puts
-
- ; compute starting sector for directory entries
- xor ah, ah
- mov al, byte ptr FATs
- mul word ptr sectors_per_FAT
- add ax, word ptr reserved_sectors
- mov word ptr directory_sector, ax ; save result
-
- ; read the directory sector
- mov bx, 0500h ; directory data will go here
- call read_sector ; read the first directory sector
- jc read_error ; jump if error
-
- ; check first directory entry for IO.SYS (MS-DOS systems)
- mov di, bx ; BX still points to buffer start
- mov si, offset iosys ; file name: IO.SYS
- mov cx, 11 ; file names are 11 characters long
- rep cmpsb ; compare
- jnz system_error ; jump if not first entry
-
- ; check second directory entry for MSDOS.SYS (MS-DOS systems)
- lea di, [bx+32] ; get address of next directory entry
- mov si, offset msdos ; file name: MSDOS.SYS
- mov cx, 11 ; file names are 11 characters long
- rep cmpsb ; compare
- jnz system_error ; jump if not second entry
-
- ; compute starting sector for data (comes after the root directory entries)
- mov ax, 32 ; 32 bytes per directory entry
- mul word ptr root_directories
- div word ptr bytes_per_sector
- add ax, word ptr directory_sector
- mov word ptr data_sector, ax ; save it
-
- mov cx, 3 ; first 3 sectors of io.sys
- mov bx, 0700h ; will go here
-
- ; read the 3 required sectors
- read_loop:
- push ax ; save logical sector number
- push bx ; save buffer address
- push cx ; save count
-
- call read_sector ; read 1 sector
-
- pop cx ; restore registers
- pop bx
- pop ax
-
- jc read_error ; jump if error
-
- inc ax ; bump sector# to next sector
- add bx, word ptr bytes_per_sector ; advance pointer
- loop read_loop ; continue
-
- ; set up the parameters for the BIOS loader
- mov ch, byte ptr media_descriptor
- mov dl, byte ptr physical_drive
- xor ax, ax
- mov bx, word ptr data_sector
-
- jmp far ptr bios_load ; do it
-
- ;.......................................................................
-
- reset_error:
- mov si, offset reset_msg
- jmp short no_good
-
- system_error:
- mov si, offset system_msg
- jmp short no_good
-
- read_error:
- mov si, offset read_msg
- jmp short no_good
-
- no_good:
- call puts ; print error message
- mov si, offset retry_msg
- call puts ; print retry message
-
- xor ah, ah ; wait for key press
- int 16h
-
- int 19h ; try booting again
-
- mov si, offset reboot_msg ; just in case it comes back
- jmp no_good ; (it shouldn't)
-
- ;.......................................................................
-
- ; write a message to the screen
- ; address of message in register SI
- puts proc near
-
- lodsb ; get one character
- or al, al ; check for terminating NUL
- jnz disp ; continue
- ret ; else done
-
- disp:
- mov ah, 0eh ; write character in teletype mode
- mov bx, 0007h ; video page 0, normal white
- int 10h ; BIOS video function
- jmp puts
-
- puts endp
-
- ; read a sector from the disk
- ; buffer address in register BX
- ; logical sector number in register AX
- read_sector proc near
-
- ; translate logical sector number to sector, track, and head
- xor dx, dx
- div word ptr sectors_per_track
- inc dl ; sector numbering starts at 1
- mov byte ptr sector, dl ; save remainder: sector
-
- xor dx, dx ; quotient still in AX
- div word ptr heads
- mov byte ptr head, dl ; save remainder: head
- mov word ptr track, ax ; save quotient: track
-
- ; set up for disk read
- mov dx, word ptr track
- mov cl, 06 ; bits 8 & 9 of the track
- shl dh, cl ; into upper 2 bits of sector
- or dh, byte ptr sector ; stuff in the sector
- mov cx, dx ; move result into CX
- xchg ch, cl ; CH<-track, CL<-sector
-
- mov dl, byte ptr physical_drive ; DL<-drive
- mov dh, byte ptr head ; DH<-head
-
- mov ax, 0201h ; read one sector
- int 13h
-
- ret
-
- read_sector endp
-
- ;.......................................................................
-
- ; data used by program
-
- iosys db "IO SYS"
- msdos db "MSDOS SYS"
-
- boot_msg db "Now booting from floppy.", CR, LF, NUL
- reset_msg db "Disk controller error.", CR, LF, NUL
- read_msg db "Disk read error.", CR, LF, NUL
- system_msg db "No system on disk.", CR, LF, NUL
- reboot_msg db "Reboot failed.", CR, LF, NUL
- retry_msg db "Press any key to reboot.", CR, LF, NUL
-
- track dw 0
- head db 0
- sector db 0
-
- directory_sector dw 0
- data_sector dw 0
-
- ; fill-out program size to 510 bytes (remaining 2 are for boot signature)
- fill db (512-(offset fill-offset start)-2) dup (0)
-
- signature dw 0AA55h
-
- cseg ends
-
- ;.......................................................................
-
- bios segment at 0070h
- assume cs:bios
-
- org 0000h
-
- bios_load label far
-
- bios ends
-
- end start
-