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();
|
||||
|
||||
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;
|
||||
|
|
100
f256lib/api.h
100
f256lib/api.h
|
@ -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;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue