;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Autora:
Juliana - email: synchronized at uol dot com dot br
;; Data: segunda-feira,
6 de março de 2006.
;;
;; Compilação:
;; C:\>nasm -f bin boot.asm -o boot.bin
;; C:\>debug boot.bin
;; -w 100 0 0 1
;; -q
;;
;; Descrição:
;; Um bootloader
inteiramente compatível com a FAT12, muito útil
;; para carregar arquivos de
disquetes formatados pelo DOS/Windows
;;
;; Licença:
;; Você está livre pra usá-lo
e/ou modificá-lo, podes também
;; mudar o nome da autora e
dizer que é seu, pode por no seu
;; site etc. Só não garanto
que ele funcione no seu PC =^^=
;;
A propósito, só funciona com disquetes 3.1/2" formatados com FAT12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[BITS 16]
[ORG 0x0000]
JumpToExecutableCode db
0xEB, 0x3C, 0x90
OEM_NameAndVersion db "Juliana."
BytesPerSector
dw 512
SectorsPerCluster db 1
ReservedSectors dw 1
FATs
db 2
RootEntries
dw
224
TotalSectors16 dw 2880
MediaDescriptorByte db 0xF0
SectorsPerFAT
dw 9
SectorsPerTrack dw 18
Heads
dw 2
HiddenSectors
dd 0
TotalSectors32 dd
0
DriveNumber
db 0
Flags
db 0
Signature
db 0x29
VolumeID
dd 435101793
VolumeLabel
db "NO NAME "
SystemID
db "FAT12 "
MOV AX, 0x07C0
MOV DS, AX
MOV AX, 0x9000
MOV ES, AX
MOV CX, 256
XOR SI, SI
XOR DI, DI
CLD
REP MOVSW
JMP 0x9000:START
START
CLI
MOV AX, CS
MOV DS, AX
MOV ES, AX
MOV SS, AX
MOV SP, 0xFFFF
STI
MOV AX, 0x0003
INT 0x10
LOAD_ROOT
MOV AX, 0x020E
MOV BX, 0x0200
MOV CX, 0x0002
MOV DX, 0x0100
INT 0x13
JC LOAD_ROOT
MOV DX, 224
MOV DI, 0x0200
SEARCH
MOV CX, 11
MOV SI, szFileName
REPE CMPSB
JZ FOUND
DEC DX
JZ NOT_FOUND
ADD DI, 21
ADD DI, CX
JMP SEARCH
NOT_FOUND
JMP $
FOUND
MOV AX, WORD [DI+15]
MOV WORD [wCluster],
AX
LOAD_FAT
MOV AX, 0x0209
MOV BX, 0x0200
MOV CX, 0x0002
XOR DX, DX
INT 0x13
JC LOAD_FAT
MOV AX, 0x1000
MOV ES, AX
MOV BX, 0x0000
PUSH BX
LOAD_FILE
MOV AX, WORD [wCluster]
ADD AX, 31
XOR DX, DX
MOV DI, 18
DIV DI
INC DL
MOV CL, DL
XOR DX, DX
MOV DI, 2
DIV DI
MOV DH, DL
MOV CH, AL
LOAD_SECTOR
POP BX
MOV AX, 0x0201
MOV DL, 0x00
INT 0x13
JC LOAD_SECTOR
ADD BX, 512
CMP BX, 0xFFFF
JE .INCSEG
JMP .CONTINUE
.INCSEG
.CONTINUE
PUSH BX
MOV AX, WORD [wCluster]
MOV CX, AX
MOV DX, AX
SHR DX, 0x0001
ADD CX, DX
MOV BX, 0x0200
ADD BX, CX
MOV DX, WORD [BX]
TEST AX, 0x0001
JNZ .ODD_CLUSTER
.EVEN_CLUSTER:
AND DX, 0000111111111111b
JMP .DONE
.ODD_CLUSTER:
SHR DX, 0x0004
.DONE:
MOV WORD [wCluster],
DX
CMP DX, 0x0FF0
JB LOAD_FILE
PUSH ES
PUSH WORD 0x0000
RETF
wCluster
dw 0x0000
szFileName
db "START BIN" ;"START BIN"
TIMES 510-($-$$) db 0x00
dw 0xAA55