132 lines
2.3 KiB
NASM
132 lines
2.3 KiB
NASM
ORG 0x7C00
|
|
SECTION .text
|
|
USE16
|
|
|
|
boot: ; dl comes with disk
|
|
; initialize segment registers
|
|
xor ax, ax
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov ss, ax
|
|
|
|
; initialize stack
|
|
mov sp, 0x7C00
|
|
|
|
mov [disk], dl
|
|
|
|
mov si, name
|
|
call print
|
|
call print_line
|
|
|
|
mov bh, 0
|
|
mov bl, [disk]
|
|
call print_num
|
|
call print_line
|
|
|
|
mov ax, (startup_start - boot) / 512
|
|
mov bx, startup_start
|
|
mov cx, (startup_end - startup_start) / 512
|
|
xor dx, dx
|
|
call load
|
|
|
|
mov si, finished
|
|
call print
|
|
call print_line
|
|
|
|
jmp startup
|
|
|
|
; load some sectors from disk to a buffer in memory
|
|
; buffer has to be below 1MiB
|
|
; IN
|
|
; ax: start sector
|
|
; bx: offset of buffer
|
|
; cx: number of sectors (512 Bytes each)
|
|
; dx: segment of buffer
|
|
; CLOBBER
|
|
; ax, bx, cx, dx, si
|
|
; TODO rewrite to (eventually) move larger parts at once
|
|
; if that is done increase buffer_size_sectors in startup-common to that (max 0x80000 - startup_end)
|
|
load:
|
|
cmp cx, 64
|
|
jbe .good_size
|
|
|
|
pusha
|
|
mov cx, 64
|
|
call load
|
|
popa
|
|
add ax, 64
|
|
add dx, 64 * 512 / 16
|
|
sub cx, 64
|
|
|
|
jmp load
|
|
.good_size:
|
|
mov [DAPACK.addr], ax
|
|
mov [DAPACK.buf], bx
|
|
mov [DAPACK.count], cx
|
|
mov [DAPACK.seg], dx
|
|
|
|
; mov si, loading
|
|
; call print
|
|
|
|
; mov bx, [DAPACK.addr]
|
|
; call print_num
|
|
|
|
; mov al, '#'
|
|
; call print_char
|
|
;
|
|
; mov bx, [DAPACK.count]
|
|
; call print_num
|
|
;
|
|
; mov al, ' '
|
|
; call print_char
|
|
;
|
|
; mov bx, [DAPACK.seg]
|
|
; call print_num
|
|
;
|
|
; mov al, ':'
|
|
; call print_char
|
|
;
|
|
; mov bx, [DAPACK.buf]
|
|
; call print_num
|
|
;
|
|
; call print_line
|
|
|
|
mov dl, [disk]
|
|
mov si, DAPACK
|
|
mov ah, 0x42
|
|
int 0x13
|
|
jc error
|
|
ret
|
|
|
|
error:
|
|
mov si, errored
|
|
call print
|
|
call print_line
|
|
.halt:
|
|
cli
|
|
hlt
|
|
jmp .halt
|
|
|
|
%include "print16.asm"
|
|
|
|
name: db "Redox Loader",0
|
|
loading: db "Load ",0
|
|
errored: db "Could not read disk",0
|
|
finished: db "Finished Loading",0
|
|
line: db 13,10,0
|
|
|
|
disk: db 0
|
|
|
|
DAPACK:
|
|
db 0x10
|
|
db 0
|
|
.count: dw 0 ; int 13 resets this to # of blocks actually read/written
|
|
.buf: dw 0 ; memory buffer destination address (0:7c00)
|
|
.seg: dw 0 ; in memory page zero
|
|
.addr: dd 0 ; put the lba to read in this spot
|
|
dd 0 ; more storage bytes only for big lba's ( > 4 bytes )
|
|
|
|
times 510-($-$$) db 0
|
|
db 0x55
|
|
db 0xaa
|