first and second stage basic bootloader
commit
ef16a95229
@ -0,0 +1,27 @@
|
||||
all : image
|
||||
|
||||
compile :
|
||||
nasm -f bin -o boot.bin boot.asm
|
||||
nasm -f bin -o program.bin program.asm
|
||||
|
||||
|
||||
image : compile
|
||||
sudo dd if=/dev/zero of=disk.img bs=1024 count=720
|
||||
sudo dd if=boot.bin of=disk.img bs=512 count=1 conv=notrunc
|
||||
sudo dd if=program.bin of=disk.img bs=512 seek=1 count=1 conv=notrunc
|
||||
|
||||
|
||||
flashusb : image
|
||||
#sudo umount /dev/sdb
|
||||
sudo dd if=boot.bin of=/dev/sdb bs=512 count=1
|
||||
sudo dd if=program.bin of=/dev/sdb bs=512 seek=1 count=1
|
||||
|
||||
run : image
|
||||
qemu-system-x86_64 disk.img
|
||||
|
||||
clean :
|
||||
rm *.img
|
||||
rm *.bin
|
||||
|
||||
|
||||
|
@ -0,0 +1,13 @@
|
||||
#Useful resources
|
||||
|
||||
|
||||
|
||||
##interrupts
|
||||
http://stanislavs.org/helppc/idx_interrupt.html
|
||||
|
||||
##BIOS colors
|
||||
https://en.wikipedia.org/wiki/BIOS_color_attributes
|
||||
|
||||
##Second stage bootloader booting from usb
|
||||
https://stackoverflow.com/questions/36044706/enable-the-boot-loader-to-load-the-second-sector-of-a-usb
|
||||
|
@ -0,0 +1,76 @@
|
||||
[bits 16]
|
||||
[org 0x7c00]
|
||||
|
||||
; Use the boot drive number passed to us by BIOS in register DL
|
||||
start:
|
||||
xor ax,ax ; We want a segment of 0 for DS for this question
|
||||
mov ds,ax ; Set AX to appropriate segment value for your situation
|
||||
mov es,ax ; In this case we'll default to ES=DS
|
||||
mov bx,0x8000 ; Stack segment can be any usable memory
|
||||
|
||||
mov ss,bx ; This places it with the top of the stack @ 0x80000.
|
||||
mov sp,ax ; Set SP=0 so the bottom of stack will be @ 0x8FFFF
|
||||
|
||||
cld ; Set the direction flag to be positive direction
|
||||
|
||||
mov si, wolf_wel_msg
|
||||
call wolf_print
|
||||
|
||||
mov si, wolf_kernel_load
|
||||
call wolf_print
|
||||
|
||||
pushf
|
||||
stc
|
||||
|
||||
mov ah,00
|
||||
int 13h
|
||||
|
||||
read_sector:
|
||||
mov ax, 0x0
|
||||
mov es, ax ; ES = 0
|
||||
mov bx, 0x1000 ; BX = 0x1000. ES:BX=0x0:0x1000
|
||||
; ES:BX = starting address to read sector(s) into
|
||||
mov ah, 02 ; Int 13h/AH=2 = Read Sectors From Drive
|
||||
mov al, 01 ; Sectors to read = 1
|
||||
mov ch, 00 ; CH=Cylinder. Second sector of disk
|
||||
; is at Cylinder 0 not 1
|
||||
mov cl, 02 ; Sector to read = 2
|
||||
mov dh, 00 ; Head to read = 0
|
||||
; DL hasn't been destroyed by our bootloader code and still
|
||||
; contains boot drive # passed to our bootloader by the BIOS
|
||||
int 13h
|
||||
|
||||
jc wolf_error
|
||||
popf
|
||||
jmp 0x0:0x1000
|
||||
cli
|
||||
hlt
|
||||
|
||||
wolf_error:
|
||||
mov si, wolf_error_msg
|
||||
call wolf_print
|
||||
mov si, wolf_error_msg1
|
||||
call wolf_print
|
||||
mov ah,00
|
||||
int 16h
|
||||
xor ax,ax
|
||||
int 19h
|
||||
|
||||
wolf_print:
|
||||
lodsb
|
||||
or al,al
|
||||
jz exit
|
||||
mov ah,0x0e
|
||||
int 10h
|
||||
jmp wolf_print
|
||||
exit:
|
||||
ret
|
||||
|
||||
; Moved the data before the boot signature but after the code
|
||||
wolf_wel_msg db 'Welcome to this publication...',0x0D,0x0A,0
|
||||
wolf_kernel_load db 'Loading program',0x0D,0x0A,0
|
||||
wolf_error_msg db 'Program not found!',0x0D,0x0A,0
|
||||
wolf_error_msg1 db 'Press any key to restart..',0
|
||||
|
||||
times 510-($-$$) db 0
|
||||
dw 0xAA55
|
@ -0,0 +1,28 @@
|
||||
[org 0x1000]
|
||||
|
||||
jmp start
|
||||
data:
|
||||
msg db 'program XPUB',0
|
||||
start:
|
||||
MOV AH, 06h ; Scroll up function
|
||||
XOR AL, AL ; Clear entire screen
|
||||
XOR CX, CX ; Upper left corner CH=row, CL=column
|
||||
MOV DX, 184FH ; lower right corner DH=row, DL=column
|
||||
MOV BH, 1Eh ; YellowOnBlue
|
||||
INT 10H
|
||||
|
||||
mov si, msg
|
||||
call print ; print is a function, use CALL instead of JMP
|
||||
|
||||
cli
|
||||
hlt
|
||||
print:
|
||||
lodsb
|
||||
or al, al
|
||||
jz exit
|
||||
mov ah,0x0e
|
||||
int 10h
|
||||
jmp print
|
||||
exit:
|
||||
ret
|
||||
|
Binary file not shown.
Loading…
Reference in New Issue