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:
parent
593872ad06
commit
126802f61f
42
cio.c
42
cio.c
@ -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;
|
||||
}
|
18
kolibri.h
18
kolibri.h
@ -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;
|
||||
|
6
makefile
6
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
|
||||
|
54
umka.asm
54
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
|
||||
@ -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 ?
|
||||
|
@ -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
68
vdisk.c
Normal 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,
|
||||
};
|
Loading…
Reference in New Issue
Block a user