summaryrefslogtreecommitdiffstats
path: root/sw
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sw/z80/kernel/boot_loader.c13
-rw-r--r--sw/z80/kernel/include/boot.h18
-rw-r--r--sw/z80/kernel/include/progman.h63
-rw-r--r--sw/z80/kernel/programs.c100
4 files changed, 194 insertions, 0 deletions
diff --git a/sw/z80/kernel/boot_loader.c b/sw/z80/kernel/boot_loader.c
new file mode 100644
index 0000000..b7873ec
--- /dev/null
+++ b/sw/z80/kernel/boot_loader.c
@@ -0,0 +1,13 @@
+#include "boot.h"
+#include "progman.h"
+
+#define DEFAULT_EXEC_STATUS 0x4000
+
+struct exec_status *status = EXEC_STATUS;
+
+void boot_init() {
+
+ *status = DEFAULT_EXEC_STATUS;
+
+ // TODO other stuff
+} \ No newline at end of file
diff --git a/sw/z80/kernel/include/boot.h b/sw/z80/kernel/include/boot.h
new file mode 100644
index 0000000..d581687
--- /dev/null
+++ b/sw/z80/kernel/include/boot.h
@@ -0,0 +1,18 @@
+#ifndef BOOT_H
+#define BOOT_H
+
+#define LOGIN_PC // TODO find an address in ROM, to perform jumps
+
+#define EXEC_STATUS // TODO find an address in Kernel space
+
+struct exec_status {
+
+ volatile int logged_in:1; // authenticated
+ volatile int k_control:1; // no running programs
+ volatile int program_id:1; // current running program id, see "progman.h"
+ volatile int hidden_pc:13; // program counter of the paused program
+};
+
+void boot_init();
+
+#endif \ No newline at end of file
diff --git a/sw/z80/kernel/include/progman.h b/sw/z80/kernel/include/progman.h
new file mode 100644
index 0000000..b37e9e9
--- /dev/null
+++ b/sw/z80/kernel/include/progman.h
@@ -0,0 +1,63 @@
+#ifndef PROGRAM_MAN
+#define PROGRAM_MAN
+
+#include "types.h"
+
+#define PROG_0 0x0
+#define PROG_1 0x1
+
+#define PROG_VSTART 0x1000
+#define PROG_0_PREFIX 0xA000
+#define PROG_1_PREFIX 0xC000
+
+#define PROG_0_INFO // TODO
+#define PROG_1_INFO // TODO find a space in the ram
+
+struct program_info {
+
+ volatile int enabled:1;
+ volatile int running:1;
+ volatile int exiting:1;
+ volatile int heap_addr:13;
+ volatile void (*quit_cb)(void); // 16
+};
+
+/*
+* Initialize the program manager system
+*/
+
+void progman_init();
+
+/*
+* Check if it can start a new program
+* If it succedes, the program id is returned,
+* otherwise it is returned an error number
+*/
+
+#define PROG_REQ_FULL -1
+#define PROG_REQ_ERR -2 // Maybe we don't need this, but just in case
+
+int8_t prog_req(struct program_info *info);
+
+/*
+* It sets a quit callback
+*/
+
+void prog_0_qcb(void (*callback)(void));
+void prog_1_qcb(void (*callback)(void));
+
+/*
+* It quits a program, if a callback is set, it will be called
+*/
+
+void prog_0_quit();
+void prog_1_quit();
+
+/*
+* It forces a program to quit
+*/
+
+void prog_0_fquit();
+void prog_1_fquit();
+
+#endif \ No newline at end of file
diff --git a/sw/z80/kernel/programs.c b/sw/z80/kernel/programs.c
new file mode 100644
index 0000000..31593d1
--- /dev/null
+++ b/sw/z80/kernel/programs.c
@@ -0,0 +1,100 @@
+#include "progman.h"
+
+#define EMPTY_PROG_INFO 0x0
+
+struct program_info *prog_0 = PROG_0_INFO,
+ *prog_1 = PROG_1_INFO;
+
+void progman_init() {
+
+ *prog_0 = EMPTY_PROG_INFO;
+ *prog_1 = EMPTY_PROG_INFO;
+
+ // TODO other stuff
+}
+
+int8_t prog_req(struct program_info *info) {
+
+ uint8_t prog;
+
+ if (!prog_0->enabled) {
+
+ prog = PROG_0;
+ *info = *prog_0;
+
+ } else if (!prog_1->enabled) {
+
+ prog = PROG_1;
+ *info = *prog_1;
+
+ } else {
+
+ return PROG_REQ_FULL;
+ }
+
+ return prog;
+}
+
+void prog_0_qcb(void (*callback)(void)) {
+
+ prog_0->quit_cb = callback;
+}
+
+void prog_1_qcb(void (*callback)(void)) {
+
+ prog_1->quit_cb = callback;
+}
+
+void prog_0_quit() {
+
+ if (!prog_0->enabled || prog_0->exiting)
+ return;
+
+ if (prog_0->quit_cb)
+ prog_0->quit_cb();
+
+ // TODO free space in RAM
+
+ *prog_0 = EMPTY_PROG_INFO;
+
+ // TODO jump program counter
+}
+
+void prog_1_quit() {
+
+ if (!prog_1->enabled || prog_1->exiting)
+ return;
+
+ if (prog_1->quit_cb)
+ prog_1->quit_cb();
+
+ // TODO free space in RAM
+
+ *prog_1 = EMPTY_PROG_INFO;
+
+ // TODO jump program counter
+}
+
+void prog_0_fquit() {
+
+ if (!prog_0->enabled)
+ return;
+
+ // TODO free space in RAM
+
+ *prog_0 = EMPTY_PROG_INFO;
+
+ // TODO jump program counter
+}
+
+void prog_1_fquit() {
+
+ if (!prog_1->enabled)
+ return;
+
+ // TODO free space in RAM
+
+ *prog_1 = EMPTY_PROG_INFO;
+
+ // TODO jump program counter
+} \ No newline at end of file