diff --git a/examples/pgztest/pgztest.c b/examples/pgztest/pgztest.c index bf43b52..ee349a5 100644 --- a/examples/pgztest/pgztest.c +++ b/examples/pgztest/pgztest.c @@ -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; diff --git a/f256lib/api.h b/f256lib/api.h index 247d604..1896ffb 100644 --- a/f256lib/api.h +++ b/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 + #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; }; }; diff --git a/f256lib/f256.c b/f256lib/f256.c index 16c4815..dd2d2c6 100644 --- a/f256lib/f256.c +++ b/f256lib/f256.c @@ -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); } diff --git a/f256lib/file.c b/f256lib/file.c index e2d4583..9feb542 100644 --- a/f256lib/file.c +++ b/f256lib/file.c @@ -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); diff --git a/f256lib/file.h b/f256lib/file.h index ea6db13..4bf183b 100644 --- a/f256lib/file.h +++ b/f256lib/file.h @@ -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 diff --git a/f256lib/kernel.c b/f256lib/kernel.c index 3de69e4..25acbc9 100644 --- a/f256lib/kernel.c +++ b/f256lib/kernel.c @@ -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; diff --git a/f256lib/kernel.h b/f256lib/kernel.h index ed101b1..a741820 100644 --- a/f256lib/kernel.h +++ b/f256lib/kernel.h @@ -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;