144 lines
2.8 KiB
NASM
144 lines
2.8 KiB
NASM
; rmmod.asm
|
|
; real mode module for HOS
|
|
; Author: Josh Holtrop
|
|
; Date: 09/20/04
|
|
|
|
; the bootstrap process will jump us to 0x0:0x5010 so we'd better be ready for it
|
|
[org 0x5000]
|
|
[bits 16]
|
|
;HOS module header, better be 16 bytes!
|
|
dd 0x4D534F48 ; magic identifier "HOSM"
|
|
dd 1 ; real mode module
|
|
dd start ; start address
|
|
dd 0 ; reserved
|
|
|
|
; ebx = return address
|
|
; ecx = where to store real mode parameter table
|
|
; edx = initrd, where to put ram disk
|
|
start:
|
|
jmp 0:start_refreshed
|
|
start_refreshed:
|
|
mov ax, cs ; 0
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov ss, ax
|
|
mov esp, 0x7000
|
|
mov [dat_rmadd], ecx
|
|
mov [dat_initrd], edx
|
|
mov [dat_retn], ebx
|
|
|
|
sti
|
|
mov ah, 0 ;reset floppy controller
|
|
mov dl, 0
|
|
int 0x13
|
|
|
|
; xor ax, ax
|
|
; int 0x16
|
|
|
|
; push txt_loading_initrd ;print loading initrd string
|
|
; push 23*80
|
|
; call putString
|
|
; add sp, 4
|
|
|
|
; push es ; draw a red bar to fill in
|
|
; mov ax, 0xb800
|
|
; mov es, ax
|
|
; mov di, 24*160
|
|
; mov cx, 80
|
|
; mov ax, 0x04B0
|
|
; rep stosw
|
|
; pop es
|
|
|
|
mov cx, 80 ;80 cylinders to read
|
|
xor si, si ;start at cylinder 0
|
|
mov edi, [dat_initrd] ;ram disk address
|
|
read_cylinder:
|
|
push cx
|
|
|
|
mov bx, 0x1000 ;read sectors from head 0
|
|
mov es, bx
|
|
xor bx, bx ;es:bx = data buffer for read
|
|
mov ax, 0x0212 ;ah = int 0x13 function 2, al = number of sectors to read
|
|
mov cx, si ;what cyl. we are on is now in cx
|
|
mov ch, cl ;ch = cyl. number
|
|
mov cl, 1 ;cl = sector number 1-63
|
|
xor dx, dx ;dh = head number
|
|
; mov dl, 0 ;dl = drive number
|
|
int 0x13
|
|
|
|
mov bx, 0x1000 ;now read sectors from head 1
|
|
mov es, bx
|
|
mov bx, 9216 ;es:bx = data buffer for read
|
|
mov ax, 0x0212 ;ah = int 0x13 function 2, al = number of sectors to read
|
|
mov cx, si ;what cyl. we are on is now in cx
|
|
mov ch, cl ;ch = cyl. number
|
|
mov cl, 1 ;cl = sector number 1-63
|
|
; mov dh, 1 ;dh = head number
|
|
; mov dl, 0 ;dl = drive number
|
|
mov dx, 0x0100
|
|
int 0x13
|
|
|
|
mov ebx, 0xb8000 ;draw a green block
|
|
add bx, si
|
|
shl bl, 1
|
|
mov word [ds:ebx+160*24], 0x0200+219
|
|
|
|
push si
|
|
mov esi, 0x10000 ;now copy the disk up to where we will keep it
|
|
mov cx, 0x2400
|
|
; rep o32 movsb
|
|
|
|
pop si ;what cylinder# we are on...
|
|
inc si
|
|
pop cx
|
|
; loop read_cylinder
|
|
|
|
xor ax, ax
|
|
int 0x16
|
|
|
|
mov al, 0xfe
|
|
out 0x64, al ;reboot
|
|
|
|
; putString(int position, char *str)
|
|
putString:
|
|
push bp
|
|
mov bp, sp
|
|
push ds
|
|
push es
|
|
push edi
|
|
push esi
|
|
push eax
|
|
|
|
mov ax, 0xb800
|
|
mov es, ax
|
|
xor ax, ax
|
|
mov ds, ax
|
|
mov ax, [bp + 4]
|
|
mov di, ax
|
|
shl di, 1
|
|
mov ax, [bp + 6]
|
|
mov si, ax
|
|
|
|
putString_loop:
|
|
lodsb
|
|
stosb
|
|
cmp al, 0
|
|
jz putString_loop_done
|
|
mov al, 0x07
|
|
stosb
|
|
jmp putString_loop
|
|
putString_loop_done:
|
|
|
|
pop eax
|
|
pop esi
|
|
pop edi
|
|
pop es
|
|
pop ds
|
|
pop bp
|
|
ret
|
|
|
|
txt_loading_initrd: db "Loading initrd... ", 0
|
|
dat_rmadd dd 0
|
|
dat_initrd dd 0
|
|
dat_retn dd 0
|