Lay out skeletons for FCB handling
This commit is contained in:
parent
31c6ef5876
commit
4e779c5a22
5
Makefile
5
Makefile
@ -6,10 +6,11 @@ QEMU = qemu-system-i386
|
|||||||
QEMU_ARGS = $(addprefix --option-rom ,$(ROMS))
|
QEMU_ARGS = $(addprefix --option-rom ,$(ROMS))
|
||||||
|
|
||||||
VERSION = $(shell git log -1 --format=%cd --date=format:%Y%m%d)
|
VERSION = $(shell git log -1 --format=%cd --date=format:%Y%m%d)
|
||||||
LABEL = RDOS $(VERSION)
|
PRODUCT = rdos
|
||||||
|
LABEL = $(PRODUCT) $(VERSION)
|
||||||
|
|
||||||
NASM = nasm
|
NASM = nasm
|
||||||
NASM_ARGS = -s -Ilib -DVERSION=$(VERSION)
|
NASM_ARGS = -s -Ilib -DPRODUCT=$(PRODUCT) -DVERSION=$(VERSION)
|
||||||
|
|
||||||
KVM = $(shell test -w /dev/kvm && echo 1)
|
KVM = $(shell test -w /dev/kvm && echo 1)
|
||||||
|
|
||||||
|
@ -14,6 +14,9 @@ bootsect: equ 0x7C00 ; our origin before reloc
|
|||||||
|
|
||||||
%include "inc/bpb.asm"
|
%include "inc/bpb.asm"
|
||||||
|
|
||||||
|
%define V 0x %+ VERSION
|
||||||
|
dd V, V
|
||||||
|
|
||||||
times ( 0x0B - ($-$$) ) db 0
|
times ( 0x0B - ($-$$) ) db 0
|
||||||
|
|
||||||
params: times bpb_size db 0
|
params: times bpb_size db 0
|
||||||
|
@ -22,12 +22,18 @@ print_banner: mov si, banner
|
|||||||
cmp al, 0x0D
|
cmp al, 0x0D
|
||||||
jnz .loop
|
jnz .loop
|
||||||
|
|
||||||
|
call dskrst
|
||||||
|
|
||||||
|
mov dl, 0
|
||||||
|
call dsksel
|
||||||
|
|
||||||
hlt: hlt
|
hlt: hlt
|
||||||
jmp hlt
|
jmp hlt
|
||||||
|
|
||||||
banner: db "rdos kernel", 0x0A, 0x0D
|
%defstr VERSIONSTR VERSION
|
||||||
|
banner: db "RDOS ", VERSIONSTR, 0x0A, 0x0D
|
||||||
|
|
||||||
end: align 512
|
%include "kernel/drive.asm"
|
||||||
|
|
||||||
section .bss
|
section .bss
|
||||||
|
|
||||||
|
167
kernel/drive.asm
167
kernel/drive.asm
@ -1,159 +1,40 @@
|
|||||||
section .bss
|
section .bss
|
||||||
|
|
||||||
drives: equ 16
|
; drive selected for I/O
|
||||||
|
dsknum: resb 1
|
||||||
; ptr into currently selected drive
|
; current sector number
|
||||||
drive_ptr: resw 1
|
dskseek: resd 1
|
||||||
|
|
||||||
drive_table: resb (drives * drive_size)
|
|
||||||
|
|
||||||
; DX and CX for int 13 CHS access
|
|
||||||
chs_dx: resw 1
|
|
||||||
chs_cx: resw 1
|
|
||||||
|
|
||||||
; disk buffer for I/O operations
|
; disk buffer for I/O operations
|
||||||
diskbuf: resb 1024
|
dskbuf: resb 512
|
||||||
|
|
||||||
section .text
|
section .text
|
||||||
|
|
||||||
drives_init: ; CX = number of floppy drives in the system
|
ret: ret
|
||||||
int 0x11
|
|
||||||
mov cl, 6
|
|
||||||
shr ax, cl
|
|
||||||
inc ax
|
|
||||||
and ax, 3
|
|
||||||
mov cx, ax
|
|
||||||
|
|
||||||
mov bx, drive_table
|
|
||||||
xor dx, dx
|
|
||||||
|
|
||||||
.loop: push cx
|
|
||||||
push dx
|
|
||||||
mov [bx+drive.biosnum], dl
|
|
||||||
mov byte [bx+drive.flag], 1 ; 1 = drive letter used
|
|
||||||
; query bios for floppy format
|
|
||||||
mov ah, 8
|
|
||||||
push bx
|
|
||||||
int 0x13
|
|
||||||
pop bx
|
|
||||||
; set up defaults if invalid data or fail
|
|
||||||
jc .defs
|
|
||||||
test cx, cx
|
|
||||||
jnz .load
|
|
||||||
.defs: ; use defaults: 360k, 40 cyl, 9 sects
|
|
||||||
les di, [0x1e * 4]
|
|
||||||
mov cx, 0x270
|
|
||||||
mov dh, 1
|
|
||||||
.load: ; copy dpt
|
|
||||||
push es
|
|
||||||
push ds
|
|
||||||
pop es
|
|
||||||
pop ds
|
|
||||||
push cx
|
|
||||||
mov si, di
|
|
||||||
lea di, [bx+drive.dpt]
|
|
||||||
mov cx, 11
|
|
||||||
rep movsb
|
|
||||||
pop cx
|
|
||||||
; restore ds
|
|
||||||
push cs
|
|
||||||
pop ds
|
|
||||||
; get and save number of cylinders
|
|
||||||
mov ax, cx
|
|
||||||
xchg al, ah
|
|
||||||
rol ah, 1
|
|
||||||
rol ah, 1
|
|
||||||
and ax, 0x03FF
|
|
||||||
inc ax
|
|
||||||
mov [bx+drive.cylinders], ax
|
|
||||||
; save spt
|
|
||||||
mov ax, cx
|
|
||||||
and al, 0x3F
|
|
||||||
mov [bx+drive.dpt+dpt.lastsector], al
|
|
||||||
; multiply with heads and save sectors per cylinder
|
|
||||||
inc dh
|
|
||||||
mul dh ; ax = al * dh
|
|
||||||
mov [bx+drive.spc], ax
|
|
||||||
; advance loop
|
|
||||||
pop dx
|
|
||||||
pop cx
|
|
||||||
inc dl
|
|
||||||
add bx, drive_size
|
|
||||||
loop .loop
|
|
||||||
ret
|
|
||||||
|
|
||||||
; select drive
|
; select drive
|
||||||
; IN dl drive number
|
; IN dl drive number
|
||||||
drive_select: xor dh, dh
|
dsksel: cmp dl, 1
|
||||||
mov ax, drive_size
|
jnc ret
|
||||||
mul dx
|
mov al, dl
|
||||||
add ax, drive_table
|
and al, 0x02
|
||||||
mov word [drive_ptr], ax
|
|
||||||
ret
|
|
||||||
|
|
||||||
; reset currently selected drive
|
|
||||||
drive_reset: mov bx, [drive_ptr]
|
|
||||||
mov dl, [bx+drive.biosnum]
|
|
||||||
; our ptr = CX:BX
|
|
||||||
lea bx, [bx+drive.dpt]
|
|
||||||
mov cx, ds
|
|
||||||
; toggle in our ptr
|
|
||||||
mov si, [0x1E*4]
|
|
||||||
xchg bx, [si]
|
|
||||||
xchg cx, [si+2]
|
|
||||||
; do the call
|
|
||||||
xor ax, ax
|
|
||||||
int 0x13
|
|
||||||
pushf
|
|
||||||
; restore original ptr
|
|
||||||
xchg bx, [si]
|
|
||||||
xchg cx, [si+2]
|
|
||||||
; pass int 13 flags
|
|
||||||
popf
|
|
||||||
ret
|
|
||||||
|
|
||||||
; query status of selected drive
|
|
||||||
; OUT ah
|
|
||||||
drive_status: mov bx, [drive_ptr]
|
|
||||||
mov dl, [bx+drive.biosnum]
|
|
||||||
mov ah, 1
|
|
||||||
int 0x13
|
|
||||||
ret
|
|
||||||
|
|
||||||
; set sector for read/write operation
|
|
||||||
; IN dx:ax 32-bit sector number
|
|
||||||
drive_seek: mov bx, [drive_ptr]
|
|
||||||
div word [bx+drive.spc]
|
|
||||||
xchg ax, dx
|
|
||||||
; dx = cylinder, ax = head * spt + sector
|
|
||||||
div byte [bx+drive.dpt+dpt.lastsector]
|
|
||||||
; dx = cylinder, al = head, ah = sector
|
|
||||||
xchg dl, dh
|
|
||||||
ror dl, 1
|
ror dl, 1
|
||||||
ror dl, 1
|
ror dl, 1
|
||||||
or dl, ah
|
cmp dl, byte [dsknum]
|
||||||
inc dx
|
je ret
|
||||||
; al: head number
|
|
||||||
; dh bit 0-7: cylinder bits 0-7
|
call dskrst
|
||||||
; dl bit 0-5: sector bits 0-5
|
|
||||||
; dl bit 6-7: cylinder bits 8-9
|
int 3
|
||||||
xchg al, ah
|
|
||||||
mov al, [bx+drive.biosnum]
|
|
||||||
; store
|
|
||||||
mov word [chs_dx], ax
|
|
||||||
mov word [chs_cx], dx
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
drive_read: mov ax, 0x0201
|
dskrst: call flush
|
||||||
mov cx, [chs_cx]
|
mov ax, 0xFFFF
|
||||||
mov dx, [chs_dx]
|
mov [dsknum], al
|
||||||
mov bx, diskbuf
|
mov [dskseek], ax
|
||||||
int 0x13
|
mov [dskseek+2], ax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
drive_write: mov ax, 0x0301
|
; flush buffer if dirty
|
||||||
mov cx, [chs_cx]
|
flush: ret
|
||||||
mov dx, [chs_dx]
|
|
||||||
mov bx, diskbuf
|
|
||||||
int 0x13
|
|
||||||
ret
|
|
||||||
|
55
kernel/fcb.asm
Normal file
55
kernel/fcb.asm
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
; in FCB required
|
||||||
|
; word offset in rootdir
|
||||||
|
; used for search
|
||||||
|
; word current cluster
|
||||||
|
; byte record num in cluster
|
||||||
|
|
||||||
|
; FCB open
|
||||||
|
fcbopn: ; call fcbfst
|
||||||
|
; copy match
|
||||||
|
; store cluster number in fcb
|
||||||
|
; record = 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
; FCB close
|
||||||
|
fcbcls: ; flush disk buffer
|
||||||
|
ret
|
||||||
|
|
||||||
|
; FCB find first
|
||||||
|
fcbfst: ; init search state in FCB
|
||||||
|
; jmp to fcbnxt
|
||||||
|
ret
|
||||||
|
|
||||||
|
; FCB find next
|
||||||
|
fcbnxt: ; load rootdir sector from state
|
||||||
|
; search until next match
|
||||||
|
; next sec & loop if mismatch
|
||||||
|
; err exit if no further matches
|
||||||
|
ret
|
||||||
|
|
||||||
|
; FCB delete file
|
||||||
|
fcbdel: ; call fcbfst
|
||||||
|
; get search state, load root dir from there
|
||||||
|
; mark file as deleted
|
||||||
|
ret
|
||||||
|
|
||||||
|
; FCB read
|
||||||
|
; read sector from cluster into diskbuf
|
||||||
|
fcbrd: ; read record from sector
|
||||||
|
; advance record num, carry over to cluster
|
||||||
|
ret
|
||||||
|
|
||||||
|
; FCB write
|
||||||
|
fcbwr: ; read sector from cluster into diskbuf
|
||||||
|
; write record into sector
|
||||||
|
; mark buffer dirty
|
||||||
|
; advance record num, carry over to cluster
|
||||||
|
ret
|
||||||
|
|
||||||
|
; FCB create
|
||||||
|
fcbcre:
|
||||||
|
ret
|
||||||
|
|
||||||
|
; FCB rename
|
||||||
|
fcbren:
|
||||||
|
ret
|
Loading…
Reference in New Issue
Block a user