mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
diskdev
This commit is contained in:
parent
d1a2683cc6
commit
c642f415d2
18
Makefile
18
Makefile
@ -1,7 +1,11 @@
|
|||||||
# The OS/K Team licenses this file to you under the MIT license.
|
# The OS/K Team licenses this file to you under the MIT license.
|
||||||
# See the LICENSE file in the project root for more information.
|
# See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
KODIR=ka/obj
|
KODIR=fs
|
||||||
|
|
||||||
|
AOUT=$(KODIR)/dos.com
|
||||||
|
ASYM=$(KODIR)/dos.sym
|
||||||
|
KVVM=$(KODIR)/kvisc.exe
|
||||||
|
|
||||||
all: kas
|
all: kas
|
||||||
|
|
||||||
@ -13,17 +17,17 @@ kas: kpc as/regs.lst as/k-as.py
|
|||||||
|
|
||||||
DOSK = $(shell find ka -name '*.k')
|
DOSK = $(shell find ka -name '*.k')
|
||||||
|
|
||||||
$(KODIR)/a.out: $(DOSK) kas
|
$(AOUT): $(DOSK) kas
|
||||||
@as/k-as.py ka/dos.k 0x100000 $(KODIR)/a.out $(KODIR)/a.sym
|
@as/k-as.py ka/dos.k 0x100000 $(AOUT) $(ASYM)
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
@cd vm && make clean --no-print-directory -s verbose=no
|
@cd vm && make clean --no-print-directory -s verbose=no
|
||||||
@rm -f $(KODIR)/a.out $(KODIR)/a.sym $(KODIR)/k.exe as/instrs.lst
|
@rm -f $(AOUT) $(ASYM) $(KVVM) as/instrs.lst
|
||||||
|
|
||||||
test: $(KODIR)/a.out
|
test: $(AOUT)
|
||||||
@vm/k.exe $(KODIR)/a.out $(KODIR)/a.sym
|
@$(KVVM) $(AOUT) $(ASYM)
|
||||||
@rm -f $(KODIR)/a.out $(KODIR)/a.sym
|
@rm -f $(AOUT) $(ASYM)
|
||||||
|
|
||||||
wc: clean
|
wc: clean
|
||||||
@cat $(shell find -type f -name '*' ! -path './.git/*' | egrep '(ka|vm)/*') | wc -l
|
@cat $(shell find -type f -name '*' ! -path './.git/*' | egrep '(ka|vm)/*') | wc -l
|
||||||
|
BIN
fs/dos.com
Normal file
BIN
fs/dos.com
Normal file
Binary file not shown.
@ -1,8 +1,7 @@
|
|||||||
; The OS/K Team licenses this file to you under the MIT license.
|
; The OS/K Team licenses this file to you under the MIT license.
|
||||||
; See the LICENSE file in the project root for more information.
|
; See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
EOK := 0
|
|
||||||
EINVAL := 1
|
EINVAL := 1
|
||||||
|
|
||||||
errno = 0
|
errno = 0
|
||||||
|
|
||||||
|
EOK := 0
|
||||||
|
@ -11,6 +11,7 @@ itoa:
|
|||||||
;
|
;
|
||||||
; void utoa(char *buf, int num, int base)
|
; void utoa(char *buf, int num, int base)
|
||||||
;
|
;
|
||||||
|
utoa:
|
||||||
sub ax3, ax3
|
sub ax3, ax3
|
||||||
jmp ltostr
|
jmp ltostr
|
||||||
|
|
||||||
|
7
ka/dos.k
7
ka/dos.k
@ -10,9 +10,9 @@ start:
|
|||||||
|
|
||||||
call main
|
call main
|
||||||
|
|
||||||
call strtol_test
|
call dir_test
|
||||||
|
|
||||||
stop
|
hlt
|
||||||
|
|
||||||
; Wait for and print input indefinitely
|
; Wait for and print input indefinitely
|
||||||
.1:
|
.1:
|
||||||
@ -33,8 +33,11 @@ include "crt/crt.k"
|
|||||||
;
|
;
|
||||||
; Disk Operating System
|
; Disk Operating System
|
||||||
;
|
;
|
||||||
|
|
||||||
include "sys/drv/cpudev.k"
|
include "sys/drv/cpudev.k"
|
||||||
include "sys/drv/memdev.k"
|
include "sys/drv/memdev.k"
|
||||||
|
include "sys/drv/diskdev.k"
|
||||||
|
|
||||||
include "sys/tests.k"
|
include "sys/tests.k"
|
||||||
include "sys/main.k"
|
include "sys/main.k"
|
||||||
|
|
||||||
|
13
ka/sys/drv/diskdev.k
Normal file
13
ka/sys/drv/diskdev.k
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
; The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
; See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
DISKDEV := 4
|
||||||
|
|
||||||
|
DISK.FindFirst:
|
||||||
|
iocall DISKDEV, 16
|
||||||
|
ret
|
||||||
|
|
||||||
|
DISK.FindNext:
|
||||||
|
iocall DISKDEV, 17
|
||||||
|
ret
|
||||||
|
|
0
ka/sys/fileapi.k
Normal file
0
ka/sys/fileapi.k
Normal file
@ -1,6 +1,40 @@
|
|||||||
; The OS/K Team licenses this file to you under the MIT license.
|
; The OS/K Team licenses this file to you under the MIT license.
|
||||||
; See the LICENSE file in the project root for more information.
|
; See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
dir_test:
|
||||||
|
mov ax0, .buf
|
||||||
|
mov ax1, 128
|
||||||
|
call DISK.FindFirst
|
||||||
|
jmp .list
|
||||||
|
|
||||||
|
.next:
|
||||||
|
mov ax0, .buf
|
||||||
|
mov ax1, 128
|
||||||
|
call DISK.FindNext
|
||||||
|
|
||||||
|
.list:
|
||||||
|
test rax, rax
|
||||||
|
j.z .nothing
|
||||||
|
|
||||||
|
mov ax0, .fnd
|
||||||
|
call print
|
||||||
|
|
||||||
|
mov ax0, .buf
|
||||||
|
call print
|
||||||
|
|
||||||
|
prn 10
|
||||||
|
|
||||||
|
jmp .next
|
||||||
|
|
||||||
|
.nothing:
|
||||||
|
mov ax0, .err
|
||||||
|
call print
|
||||||
|
ret
|
||||||
|
|
||||||
|
.buf = [128]
|
||||||
|
.fnd = "File found: "
|
||||||
|
.err = "No more files found"
|
||||||
|
|
||||||
strtol_test:
|
strtol_test:
|
||||||
mov ax0, .s1
|
mov ax0, .s1
|
||||||
mov ax1, 10
|
mov ax1, 10
|
||||||
|
@ -26,7 +26,9 @@ CL2='\033[1;36m'
|
|||||||
CL3='\033[0m'
|
CL3='\033[0m'
|
||||||
NC='\033[1;37m'
|
NC='\033[1;37m'
|
||||||
|
|
||||||
all: k.exe
|
KEXE=../fs/kvisc.exe
|
||||||
|
|
||||||
|
all: $(KEXE)
|
||||||
|
|
||||||
-include $(dep)
|
-include $(dep)
|
||||||
|
|
||||||
@ -51,7 +53,7 @@ clean:
|
|||||||
@rm -f $(OBJDIR)/*/*.o in/arch_i.h in/instrs.lst
|
@rm -f $(OBJDIR)/*/*.o in/arch_i.h in/instrs.lst
|
||||||
@rm -f $(OBJDIR)/*/*.d
|
@rm -f $(OBJDIR)/*/*.d
|
||||||
|
|
||||||
k.exe: in/instrs.lst $(obj)
|
$(KEXE): in/instrs.lst $(obj)
|
||||||
@gcc -O2 -lSDL2 -lSDL2_ttf -Wall $(obj) -o k.exe
|
@gcc -O2 -lSDL2 -lSDL2_ttf -Wall $(obj) -o $(KEXE)
|
||||||
@echo ${CL2}[$@] ${CL}made successfully.${CL3}
|
@echo ${CL2}[$@] ${CL}made successfully.${CL3}
|
||||||
|
|
||||||
|
@ -9,4 +9,5 @@ to the same device:
|
|||||||
1 memory device
|
1 memory device
|
||||||
2 clock device
|
2 clock device
|
||||||
3 keyboard device
|
3 keyboard device
|
||||||
4 screen device
|
4 disk device
|
||||||
|
5 screen device
|
||||||
|
26
vm/dv/DISKDEV
Normal file
26
vm/dv/DISKDEV
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
# See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
Disk device function slots:
|
||||||
|
|
||||||
|
slot ax0 ax1 ax2 thr name desc
|
||||||
|
0 - - - - ispresent rax = is disk present?
|
||||||
|
1 - - - - isready rax = is disk ready?
|
||||||
|
2-15 - - - - (reserved) (reserved)
|
||||||
|
|
||||||
|
16 p i - - firstfile
|
||||||
|
- write name of first file on disk in #ax1-sized buffer #ax0
|
||||||
|
- rax = number of bytes written (0 = no files found)
|
||||||
|
|
||||||
|
17 p i - - findnext
|
||||||
|
- write name of next file on disk in #ax1-sized buffer #ax0
|
||||||
|
- rax = number of bytes written (0 = no files found)
|
||||||
|
|
||||||
|
18-25 - - - - (reserved) (reserved)
|
||||||
|
|
||||||
|
26 p i - - open
|
||||||
|
- open file whose name is stored in #ax1-sized buffer #ax0
|
||||||
|
- rax = -1 if couldn't open file, rax = file handle otherwise
|
||||||
|
|
||||||
|
27 i - - - close closes file with handle #ax0
|
||||||
|
|
119
vm/dv/diskdev.c
Normal file
119
vm/dv/diskdev.c
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
// The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
#include <pc/device.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
|
#define MAXOPEN 4096
|
||||||
|
|
||||||
|
typedef struct disk_t disk_t;
|
||||||
|
typedef struct dirent dirent_t;
|
||||||
|
|
||||||
|
struct disk_t
|
||||||
|
{
|
||||||
|
// disk directory
|
||||||
|
DIR *dir;
|
||||||
|
|
||||||
|
// open files
|
||||||
|
int *table[MAXOPEN];
|
||||||
|
uint opened;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GETDISK() \
|
||||||
|
disk_t *disk = (disk_t *)dev->data
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
long diskdev_findnext(ctx_t *ctx, dev_t *dev)
|
||||||
|
{
|
||||||
|
dirent_t *ent;
|
||||||
|
GETDISK();
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
ent = readdir(disk->dir);
|
||||||
|
|
||||||
|
if (ent == NULL)
|
||||||
|
{
|
||||||
|
rax = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rax = copystr(ctx, ax0, ax1, ent->d_name);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long diskdev_findfirst(ctx_t *ctx, dev_t *dev)
|
||||||
|
{
|
||||||
|
GETDISK();
|
||||||
|
|
||||||
|
rewinddir(disk->dir);
|
||||||
|
|
||||||
|
return diskdev_findnext(ctx, dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
long diskdev_poweron(ctx_t *ctx, dev_t *dev)
|
||||||
|
{
|
||||||
|
disk_t *disk = calloc(1, sizeof(disk_t));
|
||||||
|
|
||||||
|
disk->dir = opendir("fs");
|
||||||
|
|
||||||
|
if (disk->dir == NULL)
|
||||||
|
{
|
||||||
|
logerr("diskdev: couldn't open fs directory\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->data = (void *)disk;
|
||||||
|
|
||||||
|
dev->fslots[16] = diskdev_findfirst;
|
||||||
|
dev->fslots[17] = diskdev_findnext;
|
||||||
|
|
||||||
|
dev->state = DEVGOOD;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long diskdev_poweroff(ctx_t *ctx, dev_t *dev)
|
||||||
|
{
|
||||||
|
GETDISK();
|
||||||
|
|
||||||
|
if (disk && disk->dir)
|
||||||
|
closedir(disk->dir);
|
||||||
|
|
||||||
|
if (disk)
|
||||||
|
free(disk);
|
||||||
|
|
||||||
|
dev->data = NULL;
|
||||||
|
dev->state = DEVPWOF;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
dev_t diskdev =
|
||||||
|
{
|
||||||
|
.type = "disk",
|
||||||
|
.name = "disk",
|
||||||
|
.modl = "",
|
||||||
|
.vend = "The OS/K Team",
|
||||||
|
|
||||||
|
.major = KARCH_MAJOR,
|
||||||
|
.minor = KARCH_MINOR,
|
||||||
|
.revis = KARCH_REVIS,
|
||||||
|
|
||||||
|
.fpwon = diskdev_poweron,
|
||||||
|
.fpwoff = diskdev_poweroff,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -24,6 +24,9 @@ IMPL_START_0(hlt)
|
|||||||
{
|
{
|
||||||
if (evt.type == SDL_QUIT)
|
if (evt.type == SDL_QUIT)
|
||||||
die(0);
|
die(0);
|
||||||
|
|
||||||
|
if (evt.type == SDL_KEYDOWN)
|
||||||
|
console_handle_input(ctx, evt.key.keysym.sym);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -54,15 +57,6 @@ dev_t *devctl_common(ctx_t *ctx, ulong v1, ulong v2)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void copystr(ctx_t *ctx, ulong addr, ulong maxn, char *str)
|
|
||||||
{
|
|
||||||
for (; *str && maxn > 0; str++, addr++, maxn--) {
|
|
||||||
writemem(ctx, *str, addr, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
writemem(ctx, 0, addr, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
IMPL_START_2(devctl)
|
IMPL_START_2(devctl)
|
||||||
{
|
{
|
||||||
CHK_SUPERV();
|
CHK_SUPERV();
|
||||||
|
@ -50,7 +50,7 @@ void console_init(ctx_t *ctx)
|
|||||||
TTF_Init();
|
TTF_Init();
|
||||||
|
|
||||||
scr_font = TTF_OpenFont
|
scr_font = TTF_OpenFont
|
||||||
("fn/console_font.ttf", CONSOLE_FONT_SIZE);
|
("fs/console_font.ttf", CONSOLE_FONT_SIZE);
|
||||||
|
|
||||||
if (scr_font == NULL)
|
if (scr_font == NULL)
|
||||||
{
|
{
|
||||||
|
@ -9,14 +9,15 @@
|
|||||||
// Add new builtin devices here
|
// Add new builtin devices here
|
||||||
//
|
//
|
||||||
|
|
||||||
extern dev_t cpudev, memdev, clockdev, keybdev, screendev;
|
extern dev_t cpudev, memdev, clockdev, keybdev, diskdev;
|
||||||
|
|
||||||
static dev_t *arch_d[] =
|
static dev_t *arch_d[] =
|
||||||
{
|
{
|
||||||
&cpudev,
|
&cpudev, // 0
|
||||||
&memdev,
|
&memdev, // 1
|
||||||
&clockdev,
|
&clockdev, // 2
|
||||||
&keybdev,
|
&keybdev, // 3
|
||||||
|
&diskdev, // 4
|
||||||
|
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
15
vm/pc/mem.c
15
vm/pc/mem.c
@ -5,6 +5,21 @@
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
ulong copystr(ctx_t *ctx, ulong addr, ulong maxn, char *str)
|
||||||
|
{
|
||||||
|
ulong orig_maxn = maxn;
|
||||||
|
|
||||||
|
for (; *str && maxn > 0; str++, addr++, maxn--) {
|
||||||
|
writemem(ctx, *str, addr, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
writemem(ctx, 0, addr, 1);
|
||||||
|
|
||||||
|
return orig_maxn - maxn;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
#define CHK_ALIGN(type) \
|
#define CHK_ALIGN(type) \
|
||||||
if (addr % alignof(type) > 0) { \
|
if (addr % alignof(type) > 0) { \
|
||||||
_except(ctx, E_ALI, \
|
_except(ctx, E_ALI, \
|
||||||
|
@ -16,6 +16,8 @@ static inline char getmempref(ushort len)
|
|||||||
// Address of boot firmware stack
|
// Address of boot firmware stack
|
||||||
#define FWSTACK (MEMOFF * 2) // 2MB
|
#define FWSTACK (MEMOFF * 2) // 2MB
|
||||||
|
|
||||||
|
ulong copystr(ctx_t *ctx, ulong addr, ulong maxn, char *str);
|
||||||
|
|
||||||
ulong readmem(ctx_t *c, ulong addr, uint len);
|
ulong readmem(ctx_t *c, ulong addr, uint len);
|
||||||
void writemem(ctx_t *, ulong val, ulong addr, uint len);
|
void writemem(ctx_t *, ulong val, ulong addr, uint len);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user