summaryrefslogtreecommitdiff
path: root/xxx/boot1/disk_load_16.asm
diff options
context:
space:
mode:
Diffstat (limited to 'xxx/boot1/disk_load_16.asm')
-rw-r--r--xxx/boot1/disk_load_16.asm103
1 files changed, 103 insertions, 0 deletions
diff --git a/xxx/boot1/disk_load_16.asm b/xxx/boot1/disk_load_16.asm
new file mode 100644
index 0000000..6d1e4b3
--- /dev/null
+++ b/xxx/boot1/disk_load_16.asm
@@ -0,0 +1,103 @@
+;
+;disk_load_16
+;
+
+[bits 16]
+
+STR_LBA:
+ db "LBA Support Detected",0
+
+STR_CHS:
+ db "No CHS Support!)",0
+
+STR_ERROR:
+ db "Disk Read Error",0
+
+STR_DONE:
+ db "Stage 2 Loaded",0
+
+disk_load_16:
+
+ pusha
+
+ ; check if LBA is supported
+ mov ah,0x41
+ mov bx,0x55aa
+ int 0x13
+ jnc disk_load_lba
+ jmp disk_load_chs
+
+disk_load_lba:
+
+ mov bx, STR_LBA
+ call print_string
+ call print_nextline
+
+ mov dl,[BOOT_DRIVE]
+ xor ah,ah
+ mov ah,0x42
+
+ mov bx,0
+ mov ds,bx
+ lea si,[lba_adr]
+
+ int 0x13
+ jnc disk_load_finish
+ jmp disk_load_error
+
+disk_load_chs:
+
+ mov bx, STR_CHS
+ call print_string
+ call print_nextline
+ jmp $
+
+ mov bx,0 ;target es:bx
+ mov es,bx
+ mov bx,0x7e00
+
+ mov al,50 ;number of sectors to read
+ mov ah,0x02 ;BIOS read sector func
+
+ mov cl,2 ; sector
+ mov ch,0 ; cylinder
+
+ mov dl,[BOOT_DRIVE]
+ mov dh,0 ;head
+
+ int 0x13 ;bios interrupt
+
+ jnc disk_load_finish
+
+disk_load_error:
+
+ call print_nextline
+ mov bx, STR_ERROR
+ call print_string
+ call print_nextline
+ jmp $
+
+disk_load_finish:
+
+ call print_nextline
+ mov bx, STR_DONE
+ call print_string
+ call print_nextline
+
+
+ popa
+ ret
+
+
+;; here we hold the lba addr
+lba_adr:
+
+ dw 0x10 ; size of packet ( 16 byte)
+ dw 16 ; number of sectors to read
+
+ ; target is 0x7e00
+ dw 0x7e00 ; target addr. offset
+ dw 0x0000 ; target addr. sector
+
+ dd 1 ; first sector to read
+ dd 0