ファイルシステムのないuディスク起動とファイルロードプロセッサ-boot部分
3258 ワード
org 07c00h
jmp short BOOT_START
nop
BOOT_START:
;init
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,BaseOfStack
;clear screen
call cls
;message ->BootMessage [(cs:BootMessage,4,(0,0))]
mov ax,cs
push ax
mov ax,BootMessage
push ax
mov ax,4
push ax
mov ax,0000h
push ax
call dispstr
add sp,8
;--message end
;test disk
xor ax,ax
mov ah,41h
mov bx,055aah
mov dl,80h
int 13h
;--test end
jc BOOT_ERROR
;message ->pass test [(cs:PassMessage,4,(1,0))]
mov ax,cs
push ax
mov ax,PassMessage
push ax
mov ax,4
push ax
mov ax,0100h
push ax
call dispstr
add sp,8
;--message end
jmp BOOT_LOADER
BOOT_ERROR:
;message ->fail test [(cs:ErrorMessage,5,(1,0))]
mov ax,cs
push ax
mov ax,ErrorMessage
push ax
mov ax,5
push ax
mov ax,0100h
push ax
call dispstr
add sp,8
;--message end
jmp $
;load loader
BOOT_LOADER:
call cls
;message ->LoadMessage [(cs:LoadMessage,7,(0,0))]
mov ax,cs
push ax
mov ax,LoadMessage
push ax
mov ax,7
push ax
mov ax,0000h
push ax
call dispstr
add sp,8
;--message end
;readsector [1,100,1000h:0h]
mov eax,1
push eax
mov ax,100
push ax
mov ax,1000h
push ax
mov ax,0h
push ax
call readsector
add sp,10
;--end readsector
;jmp to loader
jmp 1000h:0000h
;--end jmp
jmp $
;data ->BootData
BaseOfStack equ 07c00h
BootMessage:
db "boot "
PassMessage:
db "pass "
ErrorMessage:
db "error "
LoadMessage:
db "loading"
TestMessage:
db "test "
DAP:
PacketSize: db 10h
Reserved: db 0
BlockCount: dw 100
BufferAddr_off: dw 0000h
BufferAddr_Seg: dw 1000h
BlockNum: dq 1
;--data end
;function ->cls [clean screen]
cls:
mov ax,0600h
mov bx,0700h
mov cx,0
mov dx,0184fh
int 10h
mov ah,02h
mov bh,00h
mov dx,00h
int 10h
ret
;--function end
;function ->dispstr(u32 source,u16 lens,u16 (pos_x,pos_y)) [display string]
;[source es:bp ,lens cx ,pos_x dh ,pos_y dl ]
dispstr:
mov ax,sp
add sp,2
pop dx
pop cx
pop ax
mov bp,ax
pop ax
mov es,ax
sub sp,10
mov ax,01301h
mov bx,0007
int 10h
ret
;--function end
;function ->readsector(u32 Blocknum,u16 blockcount,u16 seg,u16 off)
;[Blocknum ,blockcount ,seg:off ]
readsector:
add sp,2
pop ax
mov [DAP+4],ax
pop ax
mov [DAP+6],ax
pop ax
mov [DAP+2],ax
pop eax
mov [DAP+8],eax
sub sp,12
mov ax,0
mov ds,ax
mov ax,DAP
mov si,ax
mov dl,80h
mov ah,42h
int 13h
ret
;--function end
times 200h-2-($-$$) db 0
dw 0xaa55