Get rid of wrappers around cio_disk_*, call them directly.

Use __stdcall__ attribute for this and declare few disk and
media related structures.
This commit is contained in:
Ivan Baravy 2020-02-20 06:41:53 +03:00
parent 593872ad06
commit 126802f61f
6 changed files with 95 additions and 99 deletions

42
cio.c
View File

@ -1,42 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#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;
}

View File

@ -1,6 +1,7 @@
#ifndef KOLIBRI_H_INCLUDED
#define KOLIBRI_H_INCLUDED
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
@ -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;

View File

@ -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

View File

@ -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
@ -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 ?

View File

@ -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 },

68
vdisk.c Normal file
View File

@ -0,0 +1,68 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#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,
};