⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot.asm

📁 一个微型操作系统源码
💻 ASM
字号:
            %TITLE      "instinct - bootloader 0.0.3"

            ;           Robert Lee <robert.lee@lostcommunity.org>
            ;               Tuesday, July 04, 2000
            ;                   Created file as experimental bootloader
            ;               Thursday, January 04, 2001
            ;                   Support for second-stage bootloader
            ;               Sunday, October 13, 2002
            ;                   Rewrote for IDEAL mode and style
            ;
            ;           Simeon Maxein <smaxein@freenet.de>
            ;               ? Sunday, October 13, 2002
            ;                   Support for FAT12

            IDEAL
            MODEL       SMALL, C
            STACK
            JUMPS
            LOCALS      @@
            CODESEG
            P386N
start:
            JMP         main
            NOP
bOSOEMName  DB          'iosx 0.0'
wByPSector  DW          512
bSecPClust  DB          1
wRsvdSects  DW          1                           ; Boot Sect
bFATTables  DB          2
wRootEntrs  DW          224
wSmSectors  DW          2880                        ; All
bMediaTypw  DB          240                         ; 1.44MB Floppy
wFATSector  DW          9
wSectsPTrk  DW          18
wDrivHeads  DW          2
dHidnSects  DD          0                           
dLgSectors  DD          0
bDrivNumbr  DB          0                           ; A:
bNTDrtyFlg  DB          0
bExBPBSign  DB          29h                         ; Extended
dDskSerial  DD          0                           ; Blank
bDiskLabel  DB          '           '
bDskFilSys  DB          'FAT12   '

bFilename   DB          'CORE    SYS'

main:
            DB          0EAh
            DW          OFFSET L01, 7C0h
L01:
            MOV         AX, CS
            MOV         DS, AX
            MOV         ES, AX
            MOV         [bDrivNumbr], DL

            CALL        readSects, 01d, 09d, 2000h  ; FAT
            JC          Fail
            CALL        readSects, 19d, 14d, 2500h  ; Root Dir
            JC          Fail
            CALL        findFile, OFFSET bFilename, 2500h
            JC          Fail
            CALL        chainLoad, AX, 0050h        ; core.sys
            JC          Fail

            DB          0EAh
            DW          0000h, 0050h

Fail:
            MOV         AL, 'E'
            MOV         BX, 0007h
            MOV         AH, 0Eh
            INT         10h
            JMP         $



PROC getCHS NEAR        @@address:WORD
            MOV         AX, [@@address]
            XOR         DX, DX
            DIV         [wSectsPTrk]
            INC         DX
            MOV         [bSECT], DL
            XOR         DX, DX
            DIV         [wDrivHeads]
            MOV         [bCYL], AL
            MOV         [bHEAD], DL
            RET

ENDP getCHS

PROC readSects NEAR     @@SectStart:WORD, @@SectCount:WORD, @@LoadSeg:WORD
            LOCAL       @@Attempt:BYTE
            PUSH        ES
            MOV         [@@Attempt], 03h

@@sectLoop:
            CMP         [@@SectCount], 0000h
            JE          @@success
            CALL        getCHS, [@@SectStart]
            MOV         AX, [@@LoadSeg]
            MOV         ES, AX
            XOR         BX, BX
            MOV         CH, [bCYL]
            MOV         CL, [bSECT]
            MOV         DH, [bHEAD]
            MOV         DL, [bDrivNumbr]
            MOV         AL, 01h
            MOV         AH, 02h
            INT         13h
            JNC         @@L01
            DEC         [@@Attempt]
            CMP         [@@Attempt], 0
            JE          @@failure
            CALL        resetDisk
            JMP         @@sectLoop
@@L01:
            ADD         [@@LoadSeg], 20h
            INC         [@@SectStart]
            DEC         [@@SectCount]
            JMP         @@sectLoop

@@success:
            POP         ES
            CLC
            RET

@@failure:
            POP         ES
            STC
            RET
ENDP readSects

PROC resetDisk NEAR
            MOV         DL, [bDrivNumbr]
            MOV         AH, 0
            INT         13h
            JC          @@failure

@@success:
            CLC
            RET

@@failure:
            STC
            RET
ENDP resetDisk


PROC chainLoad NEAR     @@Cluster:WORD, @@StartSeg:WORD
            PUSH        ES
            MOV         AX, [@@Cluster]

@@chlstart:
            ADD         AX, 31d
            CALL        readSects, AX, 0001h, [@@StartSeg]
            JC          @@failure
            ADD         [@@StartSeg], 20h

            MOV         AX, 2000h                   ; FAT
            MOV         ES, AX
            MOV         SI, [@@Cluster]
            SHL         SI, 01d                     ; si=si*2
            ADD         SI, [@@Cluster]             ; si=si+cluster (si=si*3)
            SHR         SI, 01d                     ; si=si/2 (si=si*1.5)
            MOV         AX, [ES:SI]
            JNC         @@L01

            SHR         AX, 04d
            JMP         @@L02
@@L01:
            AND         AX, 0FFFh
@@L02:
            CMP         AX, 0FF8h
            JAE         @@success
            MOV         [@@Cluster], AX
            JMP         @@chlstart

@@success:
            POP         ES
            CLC
            RET

@@failure:
            POP         ES
            STC
            RET
ENDP chainLoad

PROC findFile NEAR      @@FilePointer:WORD, @@StartSeg
            PUSH        ES
            MOV         AX, [@@StartSeg]
            MOV         ES, AX
            XOR         DX, DX

@@ffloop1:
            MOV         SI, [@@FilePointer]
            MOV         DI, DX
            MOV         CX, 11
            CLD
            REPE CMPSB
            JE          @@getCluster
            ADD         DX, 32d
            CMP         DX, 1C00h
            JAE         @@failure
            JMP         @@ffloop1

@@getcluster:
            ADD         DX, 26d
            MOV         DI, DX
            MOV         AX, [ES:DI]

@@success:
            POP         ES
            CLC
            RET

@@failure:
            POP         ES
            STC
            RET
ENDP findFile


            ORG         510d
wSysDskSgn  DW          0AA55h

bCYL        DB          ?
bHEAD       DB          ?
bSECT       DB          ?

            END         start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -