Another api.h update. mkdir and rmdir added.
This commit is contained in:
parent
835cf7b9b1
commit
400b35cd25
7 changed files with 141 additions and 69 deletions
|
@ -73,9 +73,10 @@ int main(void) {
|
||||||
//dirtest();
|
//dirtest();
|
||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
|
kernelNextEvent();
|
||||||
kernelCall(Clock.GetTime);
|
kernelCall(Clock.GetTime);
|
||||||
textGotoXY(0, 0);
|
textGotoXY(0, 0);
|
||||||
printf("%d.%d ", kernelEventData.clock.seconds, kernelEventData.clock.centis);
|
printf("%d.%d ", kernelArgs->time.seconds, kernelArgs->time.centis);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
100
f256lib/api.h
100
f256lib/api.h
|
@ -11,8 +11,13 @@
|
||||||
#ifndef kernel_api_h
|
#ifndef kernel_api_h
|
||||||
#define kernel_api_h
|
#define kernel_api_h
|
||||||
|
|
||||||
|
|
||||||
|
// Ported from https://github.com/ghackwrench/F256_MicroKernel/blob/master/kernel/api.asm
|
||||||
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
#pragma push_macro("EOF")
|
#pragma push_macro("EOF")
|
||||||
#undef EOF
|
#undef EOF
|
||||||
|
|
||||||
|
@ -112,17 +117,17 @@ struct call { // Mount at $ff00
|
||||||
// Kernel Call Arguments; mount at $f0
|
// Kernel Call Arguments; mount at $f0
|
||||||
|
|
||||||
struct events_t {
|
struct events_t {
|
||||||
struct event_t * event; // GetNextEvent copies event data here
|
struct event_t *event; // GetNextEvent copies event data here
|
||||||
char pending; // Negative count of pending events
|
char pending; // Negative count of pending events
|
||||||
};
|
};
|
||||||
|
|
||||||
struct common_t {
|
struct common_t {
|
||||||
char dummy[8-sizeof(struct events_t)];
|
char dummy[8-sizeof(struct events_t)];
|
||||||
const void * ext;
|
const void *ext;
|
||||||
uint8_t extlen;
|
uint8_t extlen;
|
||||||
const void * buf;
|
const void *buf;
|
||||||
uint8_t buflen;
|
uint8_t buflen;
|
||||||
void * internal;
|
void * internal;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fs_mkfs_t {
|
struct fs_mkfs_t {
|
||||||
|
@ -149,6 +154,7 @@ struct fs_open_t {
|
||||||
enum fs_open_mode {
|
enum fs_open_mode {
|
||||||
READ,
|
READ,
|
||||||
WRITE,
|
WRITE,
|
||||||
|
APPEND
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fs_read_t {
|
struct fs_read_t {
|
||||||
|
@ -162,8 +168,13 @@ struct fs_write_t {
|
||||||
// buflen = common.buflen
|
// buflen = common.buflen
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct fs_seek_t {
|
||||||
|
uint8_t stream;
|
||||||
|
uint32_t offset;
|
||||||
|
};
|
||||||
|
|
||||||
struct fs_close_t {
|
struct fs_close_t {
|
||||||
uint8_t stream;
|
uint8_t stream;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fs_rename_t {
|
struct fs_rename_t {
|
||||||
|
@ -182,21 +193,15 @@ struct fs_delete_t {
|
||||||
// fname_len = args.buflen
|
// fname_len = args.buflen
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fs_seek_t {
|
|
||||||
uint8_t stream;
|
|
||||||
uint8_t cookie;
|
|
||||||
uint32_t offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct file_t {
|
struct file_t {
|
||||||
union {
|
union {
|
||||||
struct fs_open_t open;
|
struct fs_open_t open;
|
||||||
struct fs_read_t read;
|
struct fs_read_t read;
|
||||||
struct fs_write_t write;
|
struct fs_write_t write;
|
||||||
|
struct fs_seek_t seek;
|
||||||
struct fs_close_t close;
|
struct fs_close_t close;
|
||||||
struct fs_rename_t rename;
|
struct fs_rename_t rename;
|
||||||
struct fs_delete_t delete;
|
struct fs_delete_t delete;
|
||||||
struct fs_seek_t seek;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -234,6 +239,43 @@ struct display_t {
|
||||||
// buflen = args.buflen
|
// 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 call_args {
|
||||||
struct events_t events; // The GetNextEvent dest address is globally reserved.
|
struct events_t events; // The GetNextEvent dest address is globally reserved.
|
||||||
|
@ -243,7 +285,9 @@ struct call_args {
|
||||||
struct file_t file;
|
struct file_t file;
|
||||||
struct dir_t directory;
|
struct dir_t directory;
|
||||||
struct display_t display;
|
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 {
|
struct event_udp_t {
|
||||||
uint8_t century;
|
uint8_t token;
|
||||||
uint8_t year;
|
};
|
||||||
uint8_t month;
|
|
||||||
uint8_t day;
|
struct event_tcp_t {
|
||||||
uint8_t hours;
|
uint8_t len;
|
||||||
uint8_t minutes;
|
|
||||||
uint8_t seconds;
|
|
||||||
uint8_t centis;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct event_timer_t {
|
struct event_timer_t {
|
||||||
uint8_t units;
|
uint8_t value;
|
||||||
uint8_t absolute;
|
|
||||||
uint8_t cookie;
|
uint8_t cookie;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -433,10 +473,10 @@ struct event_t {
|
||||||
struct event_key_t key;
|
struct event_key_t key;
|
||||||
struct event_mouse_t mouse;
|
struct event_mouse_t mouse;
|
||||||
struct event_game_t game;
|
struct event_game_t game;
|
||||||
|
struct event_udp_t udp;
|
||||||
|
struct event_tcp_t tcp;
|
||||||
struct event_file_t file;
|
struct event_file_t file;
|
||||||
struct event_dir_t directory;
|
struct event_dir_t directory;
|
||||||
//struct event_net_t net;
|
|
||||||
struct event_clock_t clock;
|
|
||||||
struct event_timer_t timer;
|
struct event_timer_t timer;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -64,7 +64,7 @@ void f256Init(void) {
|
||||||
|
|
||||||
//***TODO*** The clock stuff doesn't actually work.
|
//***TODO*** The clock stuff doesn't actually work.
|
||||||
kernelCall(Clock.GetTime);
|
kernelCall(Clock.GetTime);
|
||||||
randomSeed(kernelEventData.clock.centis);
|
randomSeed(kernelArgs->time.centis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ void fileClose(uint8_t *fd) {
|
||||||
|
|
||||||
#pragma push_macro("close")
|
#pragma push_macro("close")
|
||||||
#undef close
|
#undef close
|
||||||
int16_t fileCloseDir(char *dir) {
|
int8_t fileCloseDir(char *dir) {
|
||||||
if (!dir) return -1;
|
if (!dir) return -1;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
@ -83,6 +83,28 @@ int16_t fileCloseDir(char *dir) {
|
||||||
#pragma pop_macro("close")
|
#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 *fileOpen(char *fname, char *mode) {
|
||||||
int16_t ret = 0;
|
int16_t ret = 0;
|
||||||
uint8_t m = 0; // Default to READ.
|
uint8_t m = 0; // Default to READ.
|
||||||
|
@ -233,7 +255,29 @@ fileDirEntT *fileReadDir(char *dir) {
|
||||||
#pragma pop_macro("EOF")
|
#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 drive;
|
||||||
byte drive2;
|
byte drive2;
|
||||||
int16_t path1;
|
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;
|
if (whence != SEEK_SET) return -1;
|
||||||
|
|
||||||
//***TODO*** We should do this manually for IEC devices.
|
//***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;
|
byte drive;
|
||||||
|
|
||||||
name = pathWithoutDrive(name, &drive);
|
name = pathWithoutDrive(name, &drive);
|
||||||
|
|
|
@ -42,15 +42,17 @@ typedef struct fileDirEntS {
|
||||||
|
|
||||||
|
|
||||||
void fileClose(uint8_t *fd);
|
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);
|
int16_t *fileOpen(char *fname, char *mode);
|
||||||
char *fileOpenDir(char *name);
|
char *fileOpenDir(char *name);
|
||||||
int16_t fileRead(void *buf, uint16_t nbytes, uint16_t nmemb, uint8_t *fd);
|
int16_t fileRead(void *buf, uint16_t nbytes, uint16_t nmemb, uint8_t *fd);
|
||||||
fileDirEntT *fileReadDir(char *dir);
|
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);
|
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);
|
||||||
int16_t fileUnlink(char *name);
|
int8_t fileUnlink(char *name);
|
||||||
int16_t fileWrite(void *buf, uint16_t nbytes, uint16_t nmemb, uint8_t *fd);
|
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 fread fileRead
|
||||||
#define fseek fileSeek
|
#define fseek fileSeek
|
||||||
#define fwrite fileWrite
|
#define fwrite fileWrite
|
||||||
|
#define mkdir(d,m) fileMakeDir(d)
|
||||||
#define opendir fileOpenDir
|
#define opendir fileOpenDir
|
||||||
#define readdir fileReadDir
|
#define readdir fileReadDir
|
||||||
#define rename fileRename
|
#define rename fileRename
|
||||||
#define rewind(s) (void)fileSeek(s, 0, SEEK_SET)
|
#define rewind(s) (void)fileSeek(s, 0, SEEK_SET)
|
||||||
|
#define rmdir fileRemoveDir
|
||||||
#define SEEK_SET 0
|
#define SEEK_SET 0
|
||||||
#define STDIN 0
|
#define STDIN 0
|
||||||
#define STDOUT 1
|
#define STDOUT 1
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
|
|
||||||
kernelEventT kernelEventData; // Allocate some RAM to hold event data.
|
kernelEventT kernelEventData; // Allocate some RAM to hold event data.
|
||||||
kernelArgsT *kernelArgs; // Create an alias for the kernel args.
|
kernelArgsT *kernelArgs; // Create an alias for the kernel args.
|
||||||
char kernelReturn;
|
|
||||||
char kernelError;
|
char kernelError;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,33 +38,18 @@ extern "C"
|
||||||
#define kernelEvent(member) (size_t)(&((struct events *)0)->member)
|
#define kernelEvent(member) (size_t)(&((struct events *)0)->member)
|
||||||
#define kernelVector(member) (size_t)(&((struct call *)0xff00)->member)
|
#define kernelVector(member) (size_t)(&((struct call *)0xff00)->member)
|
||||||
#define kernelCall(fn) \
|
#define kernelCall(fn) \
|
||||||
({ char ret; asm( \
|
({ char ret; \
|
||||||
"jsr %[addy] \n" \
|
__attribute__((leaf)) asm( \
|
||||||
"sta (%[ret]) \n" \
|
"jsr %[addy] \n" \
|
||||||
"lda #0 \n" \
|
"sta (%[ret]) \n" \
|
||||||
"ror a \n" \
|
"lda #0 \n" \
|
||||||
"sta (%[err]) \n" \
|
"ror a \n" \
|
||||||
: [err] "=m"(kernelError), [ret] "=m"(ret) \
|
"sta (%[err]) \n" \
|
||||||
: [addy] "i"(kernelVector(fn)) \
|
: [err] "=m"(kernelError), [ret] "=m"(ret) \
|
||||||
: "a", "c", "v"); \
|
: [addy] "i"(kernelVector(fn)) \
|
||||||
ret; })
|
: "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)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct event_t kernelEventT;
|
typedef struct event_t kernelEventT;
|
||||||
|
@ -73,7 +58,6 @@ typedef struct call_args kernelArgsT;
|
||||||
|
|
||||||
extern kernelEventT kernelEventData;
|
extern kernelEventT kernelEventData;
|
||||||
extern kernelArgsT *kernelArgs;
|
extern kernelArgsT *kernelArgs;
|
||||||
extern char kernelReturn;
|
|
||||||
extern char kernelError;
|
extern char kernelError;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue