Another api.h update. mkdir and rmdir added.

This commit is contained in:
Scott Duensing 2024-01-25 19:03:44 -06:00
parent 835cf7b9b1
commit 400b35cd25
7 changed files with 141 additions and 69 deletions

View file

@ -73,9 +73,10 @@ int main(void) {
//dirtest();
while(true) {
kernelNextEvent();
kernelCall(Clock.GetTime);
textGotoXY(0, 0);
printf("%d.%d ", kernelEventData.clock.seconds, kernelEventData.clock.centis);
printf("%d.%d ", kernelArgs->time.seconds, kernelArgs->time.centis);
}
return 0;

View file

@ -11,8 +11,13 @@
#ifndef kernel_api_h
#define kernel_api_h
// Ported from https://github.com/ghackwrench/F256_MicroKernel/blob/master/kernel/api.asm
#include <stdint.h>
#pragma push_macro("EOF")
#undef EOF
@ -112,17 +117,17 @@ struct call { // Mount at $ff00
// Kernel Call Arguments; mount at $f0
struct events_t {
struct event_t * event; // GetNextEvent copies event data here
char pending; // Negative count of pending events
struct event_t *event; // GetNextEvent copies event data here
char pending; // Negative count of pending events
};
struct common_t {
char dummy[8-sizeof(struct events_t)];
const void * ext;
uint8_t extlen;
const void * buf;
uint8_t buflen;
void * internal;
char dummy[8-sizeof(struct events_t)];
const void *ext;
uint8_t extlen;
const void *buf;
uint8_t buflen;
void * internal;
};
struct fs_mkfs_t {
@ -149,6 +154,7 @@ struct fs_open_t {
enum fs_open_mode {
READ,
WRITE,
APPEND
};
struct fs_read_t {
@ -162,8 +168,13 @@ struct fs_write_t {
// buflen = common.buflen
};
struct fs_seek_t {
uint8_t stream;
uint32_t offset;
};
struct fs_close_t {
uint8_t stream;
uint8_t stream;
};
struct fs_rename_t {
@ -182,21 +193,15 @@ struct fs_delete_t {
// fname_len = args.buflen
};
struct fs_seek_t {
uint8_t stream;
uint8_t cookie;
uint32_t offset;
};
struct file_t {
union {
struct fs_open_t open;
struct fs_read_t read;
struct fs_write_t write;
struct fs_seek_t seek;
struct fs_close_t close;
struct fs_rename_t rename;
struct fs_delete_t delete;
struct fs_seek_t seek;
};
};
@ -234,6 +239,43 @@ struct display_t {
// buflen = args.buflen
};
struct net_init_t {
uint16_t source_port;
uint16_t dest_port;
long dest_ip;
};
struct net_send_recv_t {
uint8_t accepted;
// buf = args.ext
// buflen = args.extlen
};
struct net_t {
// socket = args.buf
union {
struct net_init_t net_init;
struct net_send_recv_t net_send_recv;
};
};
struct timer_t {
uint8_t units;
uint8_t absolute;
uint8_t cookie;
};
struct time_t {
uint8_t century;
uint8_t year;
uint8_t month;
uint8_t day;
uint8_t hours;
uint8_t minutes;
uint8_t seconds;
uint8_t centis;
};
struct call_args {
struct events_t events; // The GetNextEvent dest address is globally reserved.
@ -243,7 +285,9 @@ struct call_args {
struct file_t file;
struct dir_t directory;
struct display_t display;
// struct net_t net;
struct net_t net;
struct timer_t timer;
struct time_t time;
};
};
@ -408,20 +452,16 @@ struct event_dir_t {
};
};
struct event_clock_t {
uint8_t century;
uint8_t year;
uint8_t month;
uint8_t day;
uint8_t hours;
uint8_t minutes;
uint8_t seconds;
uint8_t centis;
struct event_udp_t {
uint8_t token;
};
struct event_tcp_t {
uint8_t len;
};
struct event_timer_t {
uint8_t units;
uint8_t absolute;
uint8_t value;
uint8_t cookie;
};
@ -433,10 +473,10 @@ struct event_t {
struct event_key_t key;
struct event_mouse_t mouse;
struct event_game_t game;
struct event_udp_t udp;
struct event_tcp_t tcp;
struct event_file_t file;
struct event_dir_t directory;
//struct event_net_t net;
struct event_clock_t clock;
struct event_timer_t timer;
};
};

View file

@ -64,7 +64,7 @@ void f256Init(void) {
//***TODO*** The clock stuff doesn't actually work.
kernelCall(Clock.GetTime);
randomSeed(kernelEventData.clock.centis);
randomSeed(kernelArgs->time.centis);
}

View file

@ -62,7 +62,7 @@ void fileClose(uint8_t *fd) {
#pragma push_macro("close")
#undef close
int16_t fileCloseDir(char *dir) {
int8_t fileCloseDir(char *dir) {
if (!dir) return -1;
for (;;) {
@ -83,6 +83,28 @@ int16_t fileCloseDir(char *dir) {
#pragma pop_macro("close")
int8_t fileMakeDir(char *dir) {
byte drive;
dir = pathWithoutDrive(dir, &drive);
kernelArgs->directory.mkdir.drive = drive;
kernelArgs->common.buf = dir;
kernelArgs->common.buflen = strlen(dir);
kernelCall(Directory.MkDir);
if (kernelError) return -1;
for (;;) {
kernelNextEvent();
if (kernelEventData.type == kernelEvent(directory.CREATED)) break;
if (kernelEventData.type == kernelEvent(directory.ERROR)) return -1;
}
return 0;
}
int16_t *fileOpen(char *fname, char *mode) {
int16_t ret = 0;
uint8_t m = 0; // Default to READ.
@ -233,7 +255,29 @@ fileDirEntT *fileReadDir(char *dir) {
#pragma pop_macro("EOF")
int16_t fileRename(char *name, char *to) {
int8_t fileRemoveDir(char *dir) {
byte drive;
dir = pathWithoutDrive(dir, &drive);
kernelArgs->directory.mkdir.drive = drive;
kernelArgs->common.buf = dir;
kernelArgs->common.buflen = strlen(dir);
kernelCall(Directory.RmDir);
if (kernelError) return -1;
for (;;) {
kernelNextEvent();
if (kernelEventData.type == kernelEvent(directory.DELETED)) break;
if (kernelEventData.type == kernelEvent(directory.ERROR)) return -1;
}
return 0;
}
int8_t fileRename(char *name, char *to) {
byte drive;
byte drive2;
int16_t path1;
@ -280,7 +324,7 @@ void fileReset(void) {
}
int16_t fileSeek(uint8_t *fd, uint32_t offset, uint8_t whence) {
int8_t fileSeek(uint8_t *fd, uint32_t offset, uint8_t whence) {
if (whence != SEEK_SET) return -1;
//***TODO*** We should do this manually for IEC devices.
@ -294,7 +338,7 @@ int16_t fileSeek(uint8_t *fd, uint32_t offset, uint8_t whence) {
}
int16_t fileUnlink(char *name) {
int8_t fileUnlink(char *name) {
byte drive;
name = pathWithoutDrive(name, &drive);

View file

@ -42,15 +42,17 @@ typedef struct fileDirEntS {
void fileClose(uint8_t *fd);
int16_t fileCloseDir(char *dir);
int8_t fileCloseDir(char *dir);
int8_t fileMakeDir(char *dir);
int16_t *fileOpen(char *fname, char *mode);
char *fileOpenDir(char *name);
int16_t fileRead(void *buf, uint16_t nbytes, uint16_t nmemb, uint8_t *fd);
fileDirEntT *fileReadDir(char *dir);
int16_t fileRename(char *name, char *to);
int8_t fileRemoveDir(char *dir);
int8_t fileRename(char *name, char *to);
void fileReset(void);
int16_t fileSeek(uint8_t *fd, uint32_t offset, uint8_t whence);
int16_t fileUnlink(char *name);
int8_t fileSeek(uint8_t *fd, uint32_t offset, uint8_t whence);
int8_t fileUnlink(char *name);
int16_t fileWrite(void *buf, uint16_t nbytes, uint16_t nmemb, uint8_t *fd);
@ -75,10 +77,12 @@ int16_t fileWrite(void *buf, uint16_t nbytes, uint16_t nmemb, uint8_t *fd);
#define fread fileRead
#define fseek fileSeek
#define fwrite fileWrite
#define mkdir(d,m) fileMakeDir(d)
#define opendir fileOpenDir
#define readdir fileReadDir
#define rename fileRename
#define rewind(s) (void)fileSeek(s, 0, SEEK_SET)
#define rmdir fileRemoveDir
#define SEEK_SET 0
#define STDIN 0
#define STDOUT 1

View file

@ -26,7 +26,6 @@
kernelEventT kernelEventData; // Allocate some RAM to hold event data.
kernelArgsT *kernelArgs; // Create an alias for the kernel args.
char kernelReturn;
char kernelError;

View file

@ -38,33 +38,18 @@ extern "C"
#define kernelEvent(member) (size_t)(&((struct events *)0)->member)
#define kernelVector(member) (size_t)(&((struct call *)0xff00)->member)
#define kernelCall(fn) \
({ char ret; asm( \
"jsr %[addy] \n" \
"sta (%[ret]) \n" \
"lda #0 \n" \
"ror a \n" \
"sta (%[err]) \n" \
: [err] "=m"(kernelError), [ret] "=m"(ret) \
: [addy] "i"(kernelVector(fn)) \
: "a", "c", "v"); \
ret; })
/*
asm (
".text\n"
".global kernelwrapper\n"
"kernelwrapper: \n"
" jsr 1f \n"
" tax \n"
" lda #0 \n"
" ror a \n"
" sta (__rs2) \n"
" txa \n"
" rts \n"
"1: jmp (__rs1) \n"
);
unsigned char kernelwrapper(void *vector, char *error);
#define kernelCall(fn) kernelwrapper((void*)kernelVector(fn), &kernelError)
*/
({ char ret; \
__attribute__((leaf)) asm( \
"jsr %[addy] \n" \
"sta (%[ret]) \n" \
"lda #0 \n" \
"ror a \n" \
"sta (%[err]) \n" \
: [err] "=m"(kernelError), [ret] "=m"(ret) \
: [addy] "i"(kernelVector(fn)) \
: "a", "c", "v"); \
ret; \
})
typedef struct event_t kernelEventT;
@ -73,7 +58,6 @@ typedef struct call_args kernelArgsT;
extern kernelEventT kernelEventData;
extern kernelArgsT *kernelArgs;
extern char kernelReturn;
extern char kernelError;