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:
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
|
#ifndef KOLIBRI_H_INCLUDED
|
||||||
#define KOLIBRI_H_INCLUDED
|
#define KOLIBRI_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
@@ -66,6 +67,23 @@ typedef enum {
|
|||||||
ERROR_OUT_OF_MEMORY,
|
ERROR_OUT_OF_MEMORY,
|
||||||
} f70status_t;
|
} 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 {
|
typedef struct {
|
||||||
uint32_t attr;
|
uint32_t attr;
|
||||||
uint32_t enc;
|
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
|
covpreproc: covpreproc.c
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
|
$(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
|
$(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`
|
$(CC) $(LDFLAGS) $(LDFLAGS_32) $^ -o $@ `pkg-config fuse3 --libs`
|
||||||
|
|
||||||
umka.o umka.fas: umka.asm skin.skn
|
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
|
trace_lbr.o: trace_lbr.c trace_lbr.h kolibri.h
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_32) -c $<
|
$(CC) $(CFLAGS) $(CFLAGS_32) -c $<
|
||||||
|
|
||||||
cio.o: cio.c
|
vdisk.o: vdisk.c
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_32) -c $<
|
$(CC) $(CFLAGS) $(CFLAGS_32) -c $<
|
||||||
|
|
||||||
umka_shell.o: umka_shell.c kolibri.h trace.h syscalls.h
|
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 'malloc' as libc_malloc
|
||||||
extrn 'free' as libc_free
|
extrn 'free' as libc_free
|
||||||
|
extrn vdisk_functions
|
||||||
|
|
||||||
cli equ nop
|
cli equ nop
|
||||||
iretd equ retd
|
iretd equ retd
|
||||||
@@ -256,8 +257,8 @@ endp
|
|||||||
|
|
||||||
public kos_disk_add
|
public kos_disk_add
|
||||||
proc kos_disk_add c uses ebx esi edi ebp, _file_name, _disk_name
|
proc kos_disk_add c uses ebx esi edi ebp, _file_name, _disk_name
|
||||||
extrn cio_disk_init
|
extrn vdisk_init
|
||||||
ccall cio_disk_init, [_file_name]
|
ccall vdisk_init, [_file_name]
|
||||||
stdcall disk_add, vdisk_functions, [_disk_name], eax, DISK_NO_INSERT_NOTIFICATION
|
stdcall disk_add, vdisk_functions, [_disk_name], eax, DISK_NO_INSERT_NOTIFICATION
|
||||||
push eax
|
push eax
|
||||||
stdcall disk_media_changed, eax, 1
|
stdcall disk_media_changed, eax, 1
|
||||||
@@ -327,45 +328,6 @@ proc kos_disk_del c uses ebx esi edi ebp, _name
|
|||||||
ret
|
ret
|
||||||
endp
|
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
|
proc alloc_page
|
||||||
ret
|
ret
|
||||||
push ecx edx
|
push ecx edx
|
||||||
@@ -540,16 +502,6 @@ public coverage_end
|
|||||||
|
|
||||||
section '.data' writeable align 64
|
section '.data' writeable align 64
|
||||||
;include_debug_strings
|
;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
|
timer_ticks dd 0
|
||||||
fpu_owner dd ?
|
fpu_owner dd ?
|
||||||
|
@@ -214,7 +214,7 @@ void umka_disk_del(int argc, char **argv) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void umka_pwd(int argc, char **argv) {
|
void shell_pwd(int argc, char **argv) {
|
||||||
(void)argc;
|
(void)argc;
|
||||||
(void)argv;
|
(void)argv;
|
||||||
bool quoted = false;
|
bool quoted = false;
|
||||||
@@ -875,7 +875,7 @@ func_table_t funcs[] = {
|
|||||||
{ "stat80", umka_stat80 },
|
{ "stat80", umka_stat80 },
|
||||||
{ "read70", umka_read70 },
|
{ "read70", umka_read70 },
|
||||||
{ "read80", umka_read80 },
|
{ "read80", umka_read80 },
|
||||||
{ "pwd", umka_pwd },
|
{ "pwd", shell_pwd },
|
||||||
{ "cd", shell_cd },
|
{ "cd", shell_cd },
|
||||||
{ "set_cwd", shell_cd },
|
{ "set_cwd", shell_cd },
|
||||||
{ "draw_window", umka_draw_window },
|
{ "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,
|
||||||
|
};
|
Reference in New Issue
Block a user