diff --git a/cio.c b/cio.c deleted file mode 100644 index 13758e9..0000000 --- a/cio.c +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include -#include -#include -#include "kolibri.h" - -typedef struct { - FILE *file; - uint64_t sect_cnt; - uint32_t sect_size; -} vdisk_t; - -void *cio_disk_init(const char *fname) { - FILE *f = fopen(fname, "r+"); - fseeko(f, 0, SEEK_END); - off_t fsize = ftello(f); - fseeko(f, 0, SEEK_SET); - size_t sect_size = 512; - if (strstr(fname, "s4096") != NULL || strstr(fname, "s4k") != NULL) { - sect_size = 4096; - } - vdisk_t *vdisk = (vdisk_t*)malloc(sizeof(vdisk_t)); - *vdisk = (vdisk_t){f, (uint64_t)fsize / sect_size, sect_size}; - return vdisk; -} - -void cio_disk_free(vdisk_t *vdisk) { - fclose(vdisk->file); - free(vdisk); -} - -f70status_t cio_disk_read(vdisk_t *vdisk, uint8_t *buffer, off_t startsector, uint32_t *numsectors) { - fseeko(vdisk->file, startsector * vdisk->sect_size, SEEK_SET); - fread(buffer, *numsectors * vdisk->sect_size, 1, vdisk->file); - return ERROR_SUCCESS; -} - -f70status_t cio_disk_write(vdisk_t *vdisk, uint8_t *buffer, off_t startsector, uint32_t *numsectors) { - fseeko(vdisk->file, startsector * vdisk->sect_size, SEEK_SET); - fwrite(buffer, *numsectors * vdisk->sect_size, 1, vdisk->file); - return ERROR_SUCCESS; -} diff --git a/kolibri.h b/kolibri.h index daa0d6c..17e6d7c 100644 --- a/kolibri.h +++ b/kolibri.h @@ -1,6 +1,7 @@ #ifndef KOLIBRI_H_INCLUDED #define KOLIBRI_H_INCLUDED +#include #include #include @@ -66,6 +67,23 @@ typedef enum { ERROR_OUT_OF_MEMORY, } f70status_t; +typedef struct { + uint32_t flags; + uint32_t sector_size; + uint64_t capacity; // in sectors +} diskmediainfo_t; + +typedef struct { + uint32_t strucsize; + void (*close)(void *userdata) __attribute__((__stdcall__)); + void (*closemedia)(void *userdata) __attribute__((__stdcall__)); + int (*querymedia)(void *userdata, diskmediainfo_t *info) __attribute__((__stdcall__)); + int (*read)(void *userdata, void *buffer, off_t startsector, size_t *numsectors) __attribute__((__stdcall__)); + int (*write)(void *userdata, void *buffer, off_t startsector, size_t *numsectors) __attribute__((__stdcall__)); + int (*flush)(void* userdata) __attribute__((__stdcall__)); + unsigned int (*adjust_cache_size)(uint32_t suggested_size) __attribute__((__stdcall__)); +} diskfunc_t; + typedef struct { uint32_t attr; uint32_t enc; diff --git a/makefile b/makefile index 859a784..4e2e9df 100644 --- a/makefile +++ b/makefile @@ -11,10 +11,10 @@ all: umka_shell umka_fuse umka.sym umka.prp umka.lst tags tools/mkdirrange tools covpreproc: covpreproc.c $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ -umka_shell: umka_shell.o umka.o trace.o trace_lbr.o cio.o lodepng.o +umka_shell: umka_shell.o umka.o trace.o trace_lbr.o vdisk.o lodepng.o $(CC) $(LDFLAGS) $(LDFLAGS_32) $^ -o $@ -static -umka_fuse: umka_fuse.o umka.o cio.o +umka_fuse: umka_fuse.o umka.o vdisk.o $(CC) $(LDFLAGS) $(LDFLAGS_32) $^ -o $@ `pkg-config fuse3 --libs` umka.o umka.fas: umka.asm skin.skn @@ -44,7 +44,7 @@ trace.o: trace.c trace.h trace_lbr.h trace_lbr.o: trace_lbr.c trace_lbr.h kolibri.h $(CC) $(CFLAGS) $(CFLAGS_32) -c $< -cio.o: cio.c +vdisk.o: vdisk.c $(CC) $(CFLAGS) $(CFLAGS_32) -c $< umka_shell.o: umka_shell.c kolibri.h trace.h syscalls.h diff --git a/umka.asm b/umka.asm index 70378a8..2b7842a 100644 --- a/umka.asm +++ b/umka.asm @@ -5,6 +5,7 @@ __DEBUG_LEVEL__ = 1 extrn 'malloc' as libc_malloc extrn 'free' as libc_free +extrn vdisk_functions cli equ nop iretd equ retd @@ -113,7 +114,7 @@ include 'gui/mouse.inc' include 'hid/keyboard.inc' include 'hid/mousedrv.inc' include 'network/stack.inc' - + include 'sha3.asm' struct VDISK @@ -256,8 +257,8 @@ endp public kos_disk_add proc kos_disk_add c uses ebx esi edi ebp, _file_name, _disk_name - extrn cio_disk_init - ccall cio_disk_init, [_file_name] + extrn vdisk_init + ccall vdisk_init, [_file_name] stdcall disk_add, vdisk_functions, [_disk_name], eax, DISK_NO_INSERT_NOTIFICATION push eax stdcall disk_media_changed, eax, 1 @@ -327,45 +328,6 @@ proc kos_disk_del c uses ebx esi edi ebp, _name ret endp - -proc vdisk_close stdcall uses ebx esi edi ebp, _userdata - extrn cio_disk_free - ccall cio_disk_free, [_userdata] - ret -endp - - -proc vdisk_read stdcall uses ebx esi edi ebp, _userdata, _buffer, _startsector:qword, _numsectors - extrn cio_disk_read - ccall cio_disk_read, [_userdata], [_buffer], dword[_startsector+0], dword[_startsector+4], [_numsectors] - movi eax, DISK_STATUS_OK - ret -endp - - -proc vdisk_write stdcall uses ebx esi edi ebp, userdata, buffer, startsector:qword, numsectors - extrn cio_disk_write - ccall cio_disk_write, [userdata], [buffer], dword[startsector+0], dword[startsector+4], [numsectors] - movi eax, DISK_STATUS_OK - ret -endp - - -proc vdisk_querymedia stdcall uses ebx esi edi ebp, vdisk, mediainfo - mov ecx, [mediainfo] - mov edx, [vdisk] - mov [ecx + DISKMEDIAINFO.Flags], 0 - mov eax, [edx + VDISK.SectSize] - mov [ecx + DISKMEDIAINFO.SectorSize], eax - mov eax, [edx + VDISK.SectCnt.lo] - mov dword [ecx + DISKMEDIAINFO.Capacity + 0], eax - mov eax, [edx + VDISK.SectCnt.hi] - mov dword [ecx + DISKMEDIAINFO.Capacity + 4], eax - - movi eax, DISK_STATUS_OK - ret -endp - proc alloc_page ret push ecx edx @@ -540,16 +502,6 @@ public coverage_end section '.data' writeable align 64 ;include_debug_strings -vdisk_functions: - dd vdisk_functions_end - vdisk_functions - dd 0;vdisk_close ; close - dd 0 ; closemedia - dd vdisk_querymedia - dd vdisk_read - dd vdisk_write - dd 0 ; flush - dd 0 ; adjust_cache_size -vdisk_functions_end: timer_ticks dd 0 fpu_owner dd ? diff --git a/umka_shell.c b/umka_shell.c index f998433..701d4d8 100644 --- a/umka_shell.c +++ b/umka_shell.c @@ -214,7 +214,7 @@ void umka_disk_del(int argc, char **argv) { return; } -void umka_pwd(int argc, char **argv) { +void shell_pwd(int argc, char **argv) { (void)argc; (void)argv; bool quoted = false; @@ -875,7 +875,7 @@ func_table_t funcs[] = { { "stat80", umka_stat80 }, { "read70", umka_read70 }, { "read80", umka_read80 }, - { "pwd", umka_pwd }, + { "pwd", shell_pwd }, { "cd", shell_cd }, { "set_cwd", shell_cd }, { "draw_window", umka_draw_window }, diff --git a/vdisk.c b/vdisk.c new file mode 100644 index 0000000..5d990a3 --- /dev/null +++ b/vdisk.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include "kolibri.h" + +typedef struct { + FILE *file; + uint64_t sect_cnt; + uint32_t sect_size; +} vdisk_t; + +void *vdisk_init(const char *fname) { + FILE *f = fopen(fname, "r+"); + fseeko(f, 0, SEEK_END); + off_t fsize = ftello(f); + fseeko(f, 0, SEEK_SET); + size_t sect_size = 512; + if (strstr(fname, "s4096") != NULL || strstr(fname, "s4k") != NULL) { + sect_size = 4096; + } + vdisk_t *vdisk = (vdisk_t*)malloc(sizeof(vdisk_t)); + *vdisk = (vdisk_t){f, (uint64_t)fsize / sect_size, sect_size}; + return vdisk; +} + +__attribute__((__stdcall__)) +void vdisk_close(void *userdata) { + vdisk_t *vdisk = userdata; + fclose(vdisk->file); + free(vdisk); +} + +__attribute__((__stdcall__)) +int vdisk_read(void *userdata, void *buffer, off_t startsector, size_t *numsectors) { + vdisk_t *vdisk = userdata; + fseeko(vdisk->file, startsector * vdisk->sect_size, SEEK_SET); + fread(buffer, *numsectors * vdisk->sect_size, 1, vdisk->file); + return ERROR_SUCCESS; +} + +__attribute__((__stdcall__)) +int vdisk_write(void *userdata, void *buffer, off_t startsector, size_t *numsectors) { + vdisk_t *vdisk = userdata; + fseeko(vdisk->file, startsector * vdisk->sect_size, SEEK_SET); + fwrite(buffer, *numsectors * vdisk->sect_size, 1, vdisk->file); + return ERROR_SUCCESS; +} + +__attribute__((__stdcall__)) +int vdisk_querymedia(void *userdata, diskmediainfo_t *minfo) { + vdisk_t *vdisk = userdata; + minfo->flags = 0u; + minfo->sector_size = vdisk->sect_size; + minfo->capacity = vdisk->sect_cnt; + return ERROR_SUCCESS; +} + +diskfunc_t vdisk_functions = { + .strucsize = sizeof(diskfunc_t), + .close = vdisk_close, + .closemedia = NULL, + .querymedia = vdisk_querymedia, + .read = vdisk_read, + .write = vdisk_write, + .flush = NULL, + .adjust_cache_size = NULL, + };