diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-11-14 11:08:04 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-11-14 11:08:04 +0100 |
| commit | e3cc5f6c89ba9f37bf2c1edf588d0f75c1d63c57 (patch) | |
| tree | 1c43c3e9ce81f7564beb3a970b88beaa66169946 /boot/disk_load_16.asm | |
| parent | 2761b620043ad511d9baf66d5478a463aeece77b (diff) | |
rename dirs
Diffstat (limited to 'boot/disk_load_16.asm')
| -rw-r--r-- | boot/disk_load_16.asm | 281 |
1 files changed, 0 insertions, 281 deletions
diff --git a/boot/disk_load_16.asm b/boot/disk_load_16.asm deleted file mode 100644 index 52912f4..0000000 --- a/boot/disk_load_16.asm +++ /dev/null @@ -1,281 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;;;;; Miguel's FoolOS Helper Functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -;disk_load_16 -; - -[bits 16] - -STR_ERROR: - db "Disk Read Error",0 - -STR_SPACE: - db " ",0 - -STR_OK: - db "Kernel Loaded",0 -STR_PROGRESS: - db ".",0 - -bpbSectorsPerTrack: - dw 18 - -bpbHeadsPerCylinder: - dw 2 - -LBA: - dw 10 ; current lba - -disk_load_16: - - ; check if LBA is supported - mov ah,0x41 - mov bx,0x55aa - int 0x13 - jnc disk_load_lba - jmp disk_load_chs - - -;####################### - -disk_load_lba: - - pusha - - mov bx,0x1800 ;target es:bx - mov es,bx - mov bx,0 - - next_sectors_lba: - - jmp skip_debug_lba - ;show es - target - pusha - mov bx,es - - ;mov al,bh - ;call print_hex_byte - - ;mov al,bl - ;call print_hex_byte - - mov bx,[LBA] - - mov al,bh - call print_hex_byte - - mov al,bl - call print_hex_byte - - popa - ;-- - - skip_debug_lba: - - mov [lba_addr_sector],es - mov ax,[LBA] - mov [lba_first_sector],ax - - mov dl,[BOOT_DRIVE] - - mov ah,0x42 - mov bx,0 - mov ds,bx - lea si,[lba_adr] - int 0x13 - jc disk_read_error - - mov bx,es - add bx,0x0800 - - mov ax,[LBA] - add ax,64 ; 64 sectors = 0x2000*4 bytes ;16 sectors this is 0x200*0x10 butes - mov [LBA],ax - - cmp bx,0x9000 - je disk_load_finish - - mov es,bx ;next target es:bx - mov bx,0 - - jmp next_sectors_lba - -;####################### - - -disk_load_chs: - - pusha - - ; get boot drive geometry - mov ah,8 - mov dl,[BOOT_DRIVE] - int 0x13 - - add dh,1 - and cl,0x3f - - mov [bpbSectorsPerTrack],cl - mov [bpbHeadsPerCylinder],dh - ; - - ;show geometry - mov al,dh - call print_hex_byte - - mov bx, STR_SPACE - call print_string - - mov al,cl - call print_hex_byte - - call print_nextline - popa - ; - - pusha - - - mov bx,0x1800 ;target es:bx - mov es,bx - mov bx,0 - - next_sectors_chs: - - ;jmp skip_debug - pusha - - mov bx, STR_SPACE - call print_string - - ;show es - target - mov bx,es - - mov al,bh - call print_hex_byte - - mov al,bl - call print_hex_byte - - mov bx, STR_SPACE - call print_string - - ;show next LBA numer - mov ax,[LBA] - mov al,ah - call print_hex_byte - - mov ax,[LBA] - call print_hex_byte - - mov bx, STR_SPACE - call print_string - - popa - - mov ax,[LBA] - - ;calculate chs - call lba_to_chs - - ;show chs sector/ head / cylinder - mov al,cl - call print_hex_byte - - mov al,dh - call print_hex_byte - - mov al,ch - call print_hex_byte - - call print_nextline - - skip_debug: - - - mov ax,[LBA] - - ;calculate chs - call lba_to_chs - - ; and now READ it! - mov al,1 ;number of sectors to read - mov dl,[BOOT_DRIVE] - - mov ah,0x02 ;BIOS read sector func - int 0x13 ;bios interrupt - - jc disk_read_error - - mov bx,es - add bx,0x0020 - cmp bx,0x9000 - je disk_load_finish - - mov es,bx - mov bx,0 - - mov ax,[LBA] - add ax,1 - mov [LBA],ax - - jmp next_sectors_chs - -disk_read_error: - mov bx, STR_ERROR - call print_string - call print_nextline - jmp $ - -disk_load_finish: - - mov bx, STR_PROGRESS - call print_string -; call print_nextline - - popa - ret - - - -;lba to chs translation: -; input : ax - lba -; output: cl - sector -; dh - head -; ch - cylinder / track - -lba_to_chs: - - xor dx, dx ; prepare dx:ax for operation - div WORD [bpbSectorsPerTrack] ; divide by sectors per track - inc dl ; add 1 (obsolute sector formula) - mov cl, dl - - xor dx, dx ; prepare dx:ax for operation - div WORD [bpbHeadsPerCylinder] ; mod by number of heads (Absolue head formula) - mov dh,dl ; everything else was already done from the first formula - - mov ch, al ; not much else to do :) - ret - -;; here we hold the lba addr -lba_adr: - - dw 0x10 ; size of packet ( 16 byte) - dw 64 ; number of sectors to read - - ; target is 0x10000 - - dw 0x0000 ; target addr. offset - -lba_addr_sector: - dw 0x1800 ; target addr. sector - -lba_first_sector: - dw 10 ; first sector to read - dw 0 - - dd 0 - - ; |
