From a3ef6930597e0ea845fce0e803af6d154537ff32 Mon Sep 17 00:00:00 2001 From: Nero <41307858+nero@users.noreply.github.com> Date: Fri, 10 Dec 2021 10:41:02 +0000 Subject: [PATCH] commit whatever is in my worktree rn --- com/@rdos.asm | 38 +++-------- com/a86.asm | 163 ++++++----------------------------------------- kernel/drive.asm | 74 +++++++++++++-------- kernel/fat.asm | 125 ++++++++++++++++++++++++++++++++++++ kernel/main.asm | 8 +++ 5 files changed, 211 insertions(+), 197 deletions(-) create mode 100644 kernel/fat.asm create mode 100644 kernel/main.asm diff --git a/com/@rdos.asm b/com/@rdos.asm index 83e817a..2ce5368 100644 --- a/com/@rdos.asm +++ b/com/@rdos.asm @@ -7,11 +7,8 @@ banner: db "RDOS KERNEL ", V, 0x0A, 0x0D, '$', 0x1A %include "kernel/far.asm" %include "kernel/char.asm" -%include "inc/bpb.asm" %include "kernel/drive.asm" -%include "kernel/fcb.asm" -%include "kernel/rootdir.asm" -%include "kernel/cluster.asm" +%include "kernel/fat.asm" section .text @@ -21,32 +18,15 @@ init: call rstseg mov dx, banner call puts - call rstseg - mov dx, testdta - push ds - call norm - call setdta - pop ds + mov dl, 0 + call select - mov dx, testfcb - call norm - - call open - - call read - - mov ax, [cs:testdta] - mov cx, [cs:testdta+2] - int 3 + mov dx, 3 + call setclus + call rdfat + mov dx, bx + inc dx + call wdfat hlt: hlt jmp hlt - -section .data - -testfcb db 0, "HELLO ","COM" - times FCBSIZ db 0 - -section .bss - -testdta resb 128 diff --git a/com/a86.asm b/com/a86.asm index c227117..2c50896 100644 --- a/com/a86.asm +++ b/com/a86.asm @@ -43,10 +43,6 @@ dmpdx3: int 0x10 free dw 0 ; free ram size lncnt dw 0 ; line count rdptr dw 0xFFFF ; infile blk ptr -symbol dw 0 ; symbol of current line -offset dw 0 ; byte offset in outfile -len db 0 ; len for wrd (must be before it) -wrd dw 0,0,0,0,0,0,0,0 ; 16 byte word buf getc mov bx, [rdptr] cmp bx, 0x80 @@ -72,12 +68,6 @@ l02 mov al, 0x1A l03 cmp al, eof ret -;getc2 call peek -; cmp al, eof -; jne getc_ -; inc word [rdptr] -;getc_ ret - newlin mov dl, 0x0A mov ah, 2 int 0x21 @@ -99,145 +89,32 @@ error mov dl, [bx] e_eof db "EOF " e_dup db "DUPSYM " - ; scan word -scawrd mov si, wrd -l04 call getc - ; EOF is fatal - mov bx, e_eof - jz error - ; tab=end - cmp al, 9 - je pad - ; space=end - cmp al, 0x20 - je pad - ; if lbl full, continue eating - cmp si, wrd+0x10 - jnc l04 - ; insert - mov [si], al - inc si - jmp l04 - ; pad with spaces -pad mov cx, si - sub cx, wrd - mov [len], cl - cmp si, wrd+0x10 - jnc l06 - mov ah, 0x20 - xchg ah, [si] - inc si - cmp ah, 0x20 - jne pad -l06 ret +tok1: +s_ws db " " ; also used for tabs +s_com db "," +s_obr db "[" +s_cbr db "]" +s_plu db "+" +s_min db "-" - ; print wrd -dmpwrd mov si, wrd - mov cx, 0x10 - mov ah, 2 -l05 mov dl, [si] - cmp dl, 0x20 - je l07 - inc si - int 0x21 - loop l05 -l07 call newlin - ret + align 2 +tok2: +reg8 db "AL","CL","DL","BL","AH","CH","DH","BH" +reg16 db "AX","CX","DX","BX","SP","BP","SI","DI" +sreg db "ES","CS","SS","DS" +s_db db "DB" +s_dw db "DW" - ; create symbol table entry - ; name is read from [wrd] - ; offset is written to [symbol] -symins cmp byte [wrd], 0x20 - je nosym - mov bx, init ; walk ptr - mov bp, [free] - add bp, bx ; end addr - jmp l09 -l08 add bx, 8 -l09 mov al, [bx] - cmp al, 0 - je l10 - call symcmp - jnz l08 - mov bx, e_dup - jmp error - ; copy str to table -l10 mov si, wrd - mov di, bx - movsw - movsw - movsw - xor ax, ax - stosw - mov byte [bx+8], 0 - mov [symbol], bx - ret +tok3: +s_org db "ORG" +s_equ db "EQU" -nosym xor ax, ax - mov [symbol], ax - ret - - ; compares 6 bytes [bx] with [wrd] - ; bit 7 of each byte is ignored -symcmp mov si, wrd - xor ax, ax - mov dx, [wrd] - xor dx, [bx] - or ax, dx - mov dx, [wrd+2] - xor dx, [bx+2] - or ax, dx - mov dx, [wrd+4] - xor dx, [bx+4] - or ax, dx - test ax, 0x8F8F - ret - - ; look up keyword in wrd - ; result is stored in bx -lookup mov ch, 0 - mov bx, s_org -l11 mov si, bx - mov di, len ; wrd immediately follows - mov cl, [bx] - test cx, cx - jz l13 - inc cl - mov dx, cx - rep cmpsb - je l12 - add bx, dx - jmp l11 - ; found! -l12 clc - ret - ; give up -l13 xor bx, bx - stc - ret - -s_org db 3, "org" -s_equ db 3, "equ" - db 0 + ; TODO: parse a line into wordlist of tokens and ptrs to strings +rline: ret ; clear symbol table main mov byte [init], 0 - ; scan and create label -mloop call scawrd - call symins - ; scan instruction word - call scawrd - call lookup - ; special stuff - cmp bx, s_org - je iorg - mov ax, bx - call dumpax - int 0x20 - - ; org pseudo instruction -iorg mov ax, 0x5A5A - call dumpax + call rline int 0x20 align 16 diff --git a/kernel/drive.asm b/kernel/drive.asm index 248dfc5..75b9aa5 100644 --- a/kernel/drive.asm +++ b/kernel/drive.asm @@ -5,6 +5,34 @@ ; - dirty: inform that dskbuf has been written to ; access is done by accessing dskbuf directly +BPBOFF equ 0xB + +; DOS 2.0 BPB +BPBSS equ 0 ; word +BPBSC equ 2 ; byte +BPBRSC equ 3 ; word +BPBFN equ 5 ; byte +BPBRDE equ 6 ; word +BPBTS equ 8 ; word +BPBMD equ 10 ; byte +BPBFS equ 11 ; word +BPBSIZ2 equ 13 ; size constant + +; DOS 3.31 BPB +BPBSPT equ 0x0D ; word +BPBNOS equ 0x0F ; word +BPBHS equ 0x11 ; dword +BPBLTS equ 0x15 ; dword +BPBSIZ3 equ 25 ; size constant + +; DOS 3.4 EBPB +BPBDN equ 0x19 ; byte +BPBFALG equ 0x1A ; byte +BPBSIG equ 0x1B ; byte +BPBSER equ 0x1C ; dword serial number +BPBSIZ4 equ 32 ; size constant + +; Disk parameter table (int 1E) DPTSIZE equ 11 DPTSPT equ 4 @@ -94,10 +122,10 @@ getprm test byte [dskflag], 4 call lodfar .ret ret - ; log in drive + ; select a drive for io ; IN dl drive number ; dont do anything if drive already selected -logdrv cmp dl, [dsknum] +select cmp dl, [dsknum] je logfdd.ret ; clear out current contents push dx @@ -191,35 +219,42 @@ loghdd sub dl, 2 logerr stc ret - ; count from partition start + ; map sector into dskbuf + ; sector number from partition start ; IN dx:ax sector number -maprel add ax, [bpb+BPBHS] +map add ax, [bpb+BPBHS] add dx, [bpb+BPBHS+2] ; absolute sector count ; skip doing a read if sector number matches ; IN dx:ax sector number mapabs cmp ax, [dskseek] - jne dskread + jne l003 cmp dx, [dskseek+2] - jne dskread - ret - -dskread push ax + je l002 + ; flush and read other sector +l003 push ax push dx call flush pop dx pop ax ; store the sector number - mov [cs:dskseek], ax - mov [cs:dskseek+2], dx - ; do the actual read + mov [dskseek], ax + mov [dskseek+2], dx + jmp _read + ; mark dskbuf as containing unwritten changes +dirty or byte [cs:dskflag], 1 ; dirty +l002 ret + + ; flush buffer if dirty +flush test byte [cs:dskflag], 1 + jz l002 ; low level read and write ; call again to retry, no input registers ; read or write is configured in cx -_read mov ch, 2 - db 0x3D ; cmp ax, imm16: causes next instr to be skipped _write mov ch, 3 + db 0x3D ; cmp ax, imm16: causes next 2 bytes to be skipped +_read mov ch, 2 mov cl, 1 ; read len ; DS := ES := CS mov ax, cs @@ -286,14 +321,3 @@ _write mov ch, 3 ; exit with carry flag set stc ret - - ; mark dskbuf as containing unwritten changes -dirty or byte [cs:dskflag], 1 ; dirty - ret - - ; flush buffer if dirty -flush test byte [cs:dskflag], 1 - jz .ret - ; TODO: error handling & retries - jmp _write -.ret ret diff --git a/kernel/fat.asm b/kernel/fat.asm new file mode 100644 index 0000000..aad99bb --- /dev/null +++ b/kernel/fat.asm @@ -0,0 +1,125 @@ +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 diff --git a/kernel/main.asm b/kernel/main.asm new file mode 100644 index 0000000..19a325e --- /dev/null +++ b/kernel/main.asm @@ -0,0 +1,8 @@ + org 0 + jmp init + +init: mov ax, 0x0e37 + int 0x10 + +hlt: hlt + jmp hlt