;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Nome:     boot.asm

;; 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

            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