Remove remnants from earlier kernel attempts

This commit is contained in:
Nero 2022-01-01 21:22:57 +00:00
parent f7d7f48026
commit 0bd59dd252
9 changed files with 0 additions and 632 deletions

View File

@ -40,8 +40,6 @@ host/%.elf: host/%.c
%.bs: boot/%.asm
$(NASM) $(NASM_ARGS) -o $@ $<
@rdos.com: kernel/*.asm
# Special case: variations of FAT vbr
fat1.bs: boot/fat.asm
$(NASM) $(NASM_ARGS) -DFAT12 -DCHS -o $@ $<

View File

@ -1,95 +0,0 @@
; read/write data from FAT clusters
; requires defines from fcb.asm
section .rodata
; sector sizes for fast lookup
sstab dw 0x800,0x400,0x200,0x100,0x80
section .text
; Map part of cluster into dskbuf
; IN DX:AX sector number within cluster area
mapclus mov bx, [cs:bpb+BPBRDE]
mov cl, 4
shr bx, cl ; 32 bytes per entry
add ax, bx
adc dx, 0
; counting from beginning of dir
; add fat table sizes
maprde xor ch, ch
mov cl, byte [cs:bpb+BPBFN]
.loop add ax, [cs:bpb+BPBFS]
adc dx, 0
loop .loop
; counting from beginning of FAT
; add reserved sector count
mapfat add ax, [cs:bpb+BPBRSC]
adc dx, 0
jmp maprel
; split AX at a bit boundary
; basically a DIV 2^CX
; IN ax divident
; cx integer log2(divisor)
; OUT ax quotient
; dx remainder (lower CX bits)
split mov dx, 1
shl dx, cl
dec dx
and dx, ax
shr ax, cl
ret
filesec call fcbdrv
mov bx, dx
; find sector size scale factor
mov ax, cs
mov es, ax
mov ax, [cs:bpb+BPBSS]
mov di, sstab
mov cx, 5
repne scasw
; CX is now sector size div 128
; same format as in DPT
mov ah, 0
mov al, [ds:bx+FCBRN]
call split
; ax = sector within current cluster
; dx = record number
push dx
mov di, ax
mov ax, [ds:bx+FCBCLUS]
sub ax, 2
mov ch, 0
mov cl, [cs:bpb+BPBSC]
mul cx
add ax, di
call mapclus
pop bx
mov cl, 7
shl bx, cl
add bx, dskbuf
mov dx, bx
mov ax, cs
mov ds, ax
ret
read mov bp, sp
call filesec
call getdta
mov cx, 0x80
call stofar
ret
write mov bp, sp
call filesec
call getdta
mov cx, 0x80
call lodfar
call dirty
ret

View File

@ -1,125 +0,0 @@
section .bss
clus resw 1
section .text
; Set cluster for next operations
; IN dx cluster number
setclus mov [clus], dx
ret
; get ptr to single byte in fat table
; IN dx position byte in fat table
; OUT bx ptr to byte in dskbuf
_fat1 push dx
mov ax, dx
xor dx, dx
mov cl, 9
shr ax, cl
add ax, [bpb+BPBRSC]
adc dx, 0
call map
pop dx
mov bx, dx
and bx, 0x1FF
add bx, dskbuf
ret
; get ptr to word in fat table
_fat2 push dx
mov ax, dx
xor dx, dx
mov cl, 8
shr ax, cl
add ax, [bpb+BPBRSC]
adc dx, 0
call map
pop dx
mov bl, dl
mov bh, 0
add bx, bx
add bx, dskbuf
ret
; read value from fat table
; index given with setclus
; OUT bx value
; carry set if EOF marker
rdfat mov dx, [clus]
mov ax, dx
shr ax, 1
add dx, ax
call _fat1
push word [bx]
inc dx
call _fat1
mov si, bx
pop bx
mov bh, [si]
test word [clus], 1
jz l001
mov cl, 4
shr bx, cl
l001 and bx, 0xFFF
cmp bx, 0xFF0
cmc
ret
; set value in FAT table
; IN dx value
wrfat and dh, 0x0F
push dx
; DX = index * 1.5
mov dx, [clus]
mov ax, dx
shr dx, 1
add dx, ax
call _fat1
pop ax
test [clus], 1
jnz l004
; even, first byte full
mov [bx], al
push ax
call dirty
; DX = index * 1.5
mov dx, [clus]
mov ax, dx
shr dx, 1
add dx, ax
inc dx
call _fat1
pop ax
mov al, [bx]
and al, 0xF0
or al, ah
mov [bx], al
call dirty
jmp l005
; odd, second byte full
l004: mov ch, [bx]
; concat existing and our nib
and ch, 0x0F
mov cl, 4
shl ax, cl
or al, ch
; write back lower 4 bits
mov [bx], al
call dirty
push ax
; re-calculate offset
mov ax, dx
shr dx, 1
add dx, ax
inc dx
; map second byte
call _fat1
pop ax
; write higher 8 bits
mov [bx], ah
call dirty
l005: ret
; wrfat from above, FAT16 flavour
wf16: ret

View File

@ -1,59 +0,0 @@
; FCB layout
struc FCB
FCBDRV resb 1 ; BYTE drive (0=default, 1=A:, 2=B:, ...)
FCBFN resb 11 ; 11 BYTES filename
FCBCLUS resw 1 ; DWORD current cluster
FCBRN resb 1 ; BYTE record in cluster
endstruc
FCBSIZ equ FCB_size
section .data
defdrv db 0
dta dd 0
section .text
; auto-complete drive field in fcb
; also logs in the drive
; IN ds:dx far ptr FCB
fcbdrv push ds
push dx
mov si, dx
; if currently zero, ...
mov dl, [si] ; 1-based
test dl, dl
jnz .log
; replace with current drive
mov dl, [cs:defdrv] ; 0-based
inc dl
mov [si], dl ; 1-based
.log dec dl
mov ax, cs
mov ds, ax
call logdrv ; 0-based
pop dx
pop ds
; if carry flag set, resume stack at bp
; this instant-returns some higher level procs
jnc .ret
mov sp, bp
; duplicate carry bit into all 8 AL bits
; similar to SALC instruction
.ret sbb al, al
ret
; set disk transfer address
; IN DS:DX dta ptr
setdta mov [cs:dta], dx
mov [cs:dta+2], ds
ret
; get disk transfer address
; OUT ES:BX dta ptr
getdta les bx, [cs:dta]
ret

View File

@ -1,8 +0,0 @@
org 0
jmp init
init: mov ax, 0x0e37
int 0x10
hlt: hlt
jmp hlt

View File

@ -1,66 +0,0 @@
section .bss
printr:
.ax: resw 1
.cx: resw 1
.dx: resw 1
.bx: resw 1
section .text
; Stack contents
; ret-addr arg1 arg2 arg3 ...
printf: mov [printr.ax], ax
mov [printr.cx], cx
mov [printr.dx], dx
mov [printr.bx], bx
pop bx
.loop: mov al, [cs:bx]
inc bx
cmp al, 0
je .end
cmp al, 2
je .word
call pputc
jmp .loop
.end: push bx
mov ax, [printr.ax]
mov cx, [printr.cx]
mov dx, [printr.dx]
mov bx, [printr.bx]
ret
.word: pop dx
call pdx
jmp printf.loop
pdx: ; this double-call is essentially a 4 times repeating loop
call .l1
.l1: call .l2
.l2: ; set up cl for bit shifts
mov cl, 4
; grab highest nibble from dx
mov al, dh
; remove highest nibble from dx
shl dx, cl
; shift away second-highest nibble that we accidentally copied
shr al, cl
; map 0-9 to ascii codes for '0' to '9'
add al, 0x30
; if result is larger than '9', ...
cmp al, 0x3a
jl pputc
; ... add 7 so we continue at 'A'
add al, 7
pputc: push bx
mov ah, 0x0e
xor bx, bx
int 0x10
pop bx
ret

View File

@ -1,62 +0,0 @@
; Program segment prefix headers and constants
section .bss
curpsp: resw 1
absolute 0
resb 2 ; ret 0 exit
resb 2 ; next unusable segment
PSPDD: resb 1 ; BYTE default drive
; CP/M entry point
resb 1 ; instruction byte
resw 1 ; usable length of segment (needs to be here for compata)
resb 4 ; opcodes to call us
; saved userdata
PSPAX: resw 1
PSPCX: resw 1
; SS:SP
PSPSP: resw 1
PSPSS: resw 1
; DS:DX
PSPDX: resw 1
PSPDS: resw 1
; ES:BX
PSPBX: resw 1
PSPES: resw 1
PSPDTA: resd 1 ; DWORD ptr to disk transfer area
section .text
; set default drive for current process
; IN dl drive number
setdd: push es
mov es, [curpsp]
mov [es:PSPDD], dl
pop es
ret
; get default drive for current process
; OUT al drive number
getdd: push es
mov es, [curpsp]
mov al, [es:PSPDD]
pop es
ret
; set DTA ptr
; IN es:bx far ptr
setdta: push ds
mov ds, [curpsp]
mov [PSPDTA], bx
mov [PSPDTA+2], es
pop ds
; get DTA ptr
; OUT es:bx far ptr
getdta: mov es, [curpsp]
les bx, [es:PSPDTA]
ret

View File

@ -1,113 +0,0 @@
; Load root directory entry into buffer
; IN ax number of directory entry
; OUT cs:di ptr to directory entry
lddir push ax
push ax
call rstseg
pop ax
mov cl, 4
shr ax, cl
xor dx, dx
; dx:ax = sector number in rootdir
; add sizes of FAT tables
xor ch, ch
mov cl, byte [bpb+BPBFN]
.loop: add ax, [bpb+BPBFS]
adc dx, 0
loop .loop
; add reserved sector count
add ax, [bpb+BPBRSC]
adc dx, 0
; fetch sector (relative to partition)
call maprel
; get di to point to entry
pop di
mov cl, 5
shl di, cl
and di, 0x1FF
add di, dskbuf
ret
; find first matching file
; IN DS:DX input fcb
fndfst mov bp, sp
call fcbdrv
; set search state to zero
les di, [cs:dta]
xor ax, ax
mov [es:di+FCBSIZ], ax
; find next matching file
; state is kept in DTA
fndnxt mov bp, sp
call fcbdrv
; get next direntry to fetch
; get number of current entry from DTA
.loop les di, [cs:dta]
mov ax, [es:di+FCBSIZ]
inc word [es:di+FCBSIZ]
; bail out if we are at end of dir
cmp ax, [cs:bpb+BPBRDE]
jnc .err
; load entry and first byte
push ds
push dx
call lddir
pop dx
pop ds
; next if hidden, dir or vol label
test byte [cs:di+0x0B], 0xDA
jnz .loop
; bail out if end of dir
mov al, [cs:di]
cmp al, 0
je .err
; next if deleted entry
cmp al, 0xE5
je .loop
; DS:SI := FCB+1
; ES:DI := CS:dirent
mov si, dx
push si
inc si
mov ax, cs
mov es, ax
; compare and ; try next if mismatch
mov cx, 11
push di
rep cmpsb
pop di
pop si
jne .loop
; create FCB in DTA
call getdta
xchg bx, di
; copy over drive byte
movsb
; copy filename
push ds
push si
mov ax, cs
mov ds, ax
mov si, bx
mov cx, 11
rep movsb
pop si
pop ds
; done!
xor ax, ax
ret
.err: stc
.ret: sbb al, al
ret
open call fndfst
test al, al
jnz .ret
; read start cluster
mov ax, [cs:bx+0x1A]
mov bx, dx
mov [ds:bx+FCBCLUS], ax
; reset record number
mov byte [ds:bx+FCBRN], 0
.ret ret

View File

@ -1,102 +0,0 @@
; This is the syscall gateway:
; - backs up the data from user space (kernel funcs trash many regs)
; - sets up the kernel stack
; - calls kernel funcs
; - exports a specified set of registers back to userspace
;
; The syscall table acts as a "export"-list for kernel near funcs.
; Kernel code can expect CS = DS
section .rodata
stab: ; syscall table
; cells: ptr to handler, ptr to sysret
; 0-7
dw restart, sret
dw getc, sretb
dw putc, sret
dw err, sret ; reader input
dw err, sret ; punch outout
dw err, sret ; list output
dw conio, sret ; direct console i/o
dw err, sret
; 8-f
dw err, sret
dw err, sret ; print string
dw err, sret ; read into buffer
dw err, sret ; console status
dw err, sret ; return version num
dw err, sret ; reset disks
dw setdd, sret ; select disk
dw open, sretb ; open file
.end:
section .text
; WARNING: BP, SI and DI are not saved
; If kernel code uses them, they need to be saved to the stack
int21: push ds
; load program PSP and save userdata
mov ds, [cs:curpsp]
pop word [PSPDS]
mov [PSPES], es
mov [PSPAX], ax
mov [PSPCX], cx
mov [PSPDX], dx
mov [PSPBX], bx
mov [PSPSS], ss
mov [PSPSP], sp
xor bx, bx
mov ss, bx
mov sp, stack
; get ptr into syscall table
mov bl, [PSPAX+1] ; bh is still 0
shl bx, 1
shl bx, 1
add bx, stab
; load sysret and handler ptr
push word [cs:bx+2]
push word [cs:bx]
; DS is always our segment
push cs
pop ds
; ES:BX is syscall argument
mov bx, [PSPDX]
mov es, [PSPDS]
ret
err: mov ah, 0xFF
ret
; sysret handlers
; return ES:BX to user
sretd: mov ds, [cs:curpsp]
jmp sret.l02
; return BX to user
sretw: mov ds, [cs:curpsp]
mov es, [PSPES]
jmp sret.l02
; return carry flag in AL
sretc: mov ds, [cs:curpsp]
sbb al, al
; return AL to user
sretb: mov ds, [cs:curpsp]
mov ah, [PSPAX+1]
les bx, [PSPBX]
jmp sret.l03
; return without result
sret: mov ds, [cs:curpsp]
les bx, [PSPBX]
.l02: mov ax, [PSPAX]
.l03: mov ss, [PSPSS]
mov sp, [PSPSP]
mov cx, [PSPCX]
lds dx, [PSPDX] ; DS last
iret