1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-26 19:48:06 +11:00

Compare commits

..

2 Commits

Author SHA1 Message Date
Virgil Dupras
8d3da4c0de emul: stop embedding blkfs in binaries
Instead, embed absolute path to blkfs. Having to rebuild the stage
binary at every change in blkfs is getting tedious.
2020-05-23 09:36:10 -04:00
Virgil Dupras
f884918d73 emul: use ncurses in /emul/forth
It doesn't change anything featurewise, but this change is in
preparation for the addition of an eventual AT-XY.
2020-05-23 08:36:55 -04:00
4 changed files with 75 additions and 60 deletions

View File

@ -1,4 +1,4 @@
TARGETS = forth stage TARGETS = forth stage blkfs
OBJS = emul.o libz80/libz80.o OBJS = emul.o libz80/libz80.o
BIN2C = ../tools/bin2c BIN2C = ../tools/bin2c
BLKPACK = ../tools/blkpack BLKPACK = ../tools/blkpack
@ -18,17 +18,14 @@ $(BLKUNPACK): $(BLKPACK)
forth-bin.h: $(BIN2C) forth-bin.h: $(BIN2C)
$(BIN2C) KERNEL < forth.bin > $@ $(BIN2C) KERNEL < forth.bin > $@
stage: stage.c $(OBJS) forth-bin.h blkfs-bin.h stage: stage.c $(OBJS) forth-bin.h
$(CC) stage.c $(OBJS) -o $@ $(CC) stage.c -DBLKFS_PATH=\"`pwd`/blkfs\" $(OBJS) -o $@
blkfs: $(BLKPACK) blkfs: $(BLKPACK)
$(BLKPACK) ../blk > $@ $(BLKPACK) ../blk > $@
blkfs-bin.h: blkfs $(BIN2C) forth: forth.c $(OBJS) forth-bin.h
$(BIN2C) BLKFS < blkfs > $@ $(CC) forth.c -DBLKFS_PATH=\"`pwd`/blkfs\" $(OBJS) -lncurses -o $@
forth: forth.c $(OBJS) forth-bin.h blkfs-bin.h
$(CC) forth.c $(OBJS) -o $@
libz80/libz80.o: libz80/z80.c libz80/libz80.o: libz80/z80.c
$(MAKE) -C libz80/codegen opcodes $(MAKE) -C libz80/codegen opcodes
@ -39,7 +36,7 @@ emul.o: emul.c
.PHONY: updatebootstrap .PHONY: updatebootstrap
updatebootstrap: stage xcomp.fs updatebootstrap: stage xcomp.fs pack
./stage < xcomp.fs > forth.bin ./stage < xcomp.fs > forth.bin
.PHONY: pack .PHONY: pack
@ -52,5 +49,4 @@ unpack:
.PHONY: clean .PHONY: clean
clean: clean:
rm -f $(TARGETS) emul.o *-bin.h stage{1,2}.bin blkfs rm -f $(TARGETS) emul.o *-bin.h blkfs
$(MAKE) -C ../tools clean

View File

@ -3,6 +3,11 @@
This folder contains a couple of tools running under the [libz80][libz80] This folder contains a couple of tools running under the [libz80][libz80]
emulator. emulator.
## Requirements
You need `ncurses` to build the `forth` executable. In debian-based distros,
it's `libncurses5-dev`.
## Not real hardware ## Not real hardware
In the few emulated apps described below, we don't try to emulate real hardware In the few emulated apps described below, we don't try to emulate real hardware
@ -20,7 +25,7 @@ First, make sure that the `libz80` git submodule is checked out. If not, run
After that, you can run `make` and it builds the `forth` interpreter. After that, you can run `make` and it builds the `forth` interpreter.
Run `./forth` to get the COllapse OS prompt. Type `0 LIST` for help. Run `./forth` to get the Collapse OS prompt. Type `0 LIST` for help.
## Problems? ## Problems?

View File

@ -1,10 +1,10 @@
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <curses.h>
#include <termios.h> #include <termios.h>
#include "emul.h" #include "emul.h"
#include "forth-bin.h" #include "forth-bin.h"
#include "blkfs-bin.h"
// in sync with glue.asm // in sync with glue.asm
#define RAMSTART 0x900 #define RAMSTART 0x900
@ -24,7 +24,12 @@ static uint16_t blkid = 0;
static uint8_t iord_stdio() static uint8_t iord_stdio()
{ {
int c = getc(fp); int c;
if (fp != NULL) {
c = getc(fp);
} else {
c = getch();
}
if (c == EOF) { if (c == EOF) {
c = 4; // ASCII EOT c = 4; // ASCII EOT
} }
@ -33,7 +38,13 @@ static uint8_t iord_stdio()
static void iowr_stdio(uint8_t val) static void iowr_stdio(uint8_t val)
{ {
if (fp != NULL) {
putchar(val); putchar(val);
} else {
if (val >= 0x20 || val == '\n') {
echochar(val);
}
}
} }
static void iowr_ret(uint8_t val) static void iowr_ret(uint8_t val)
@ -69,41 +80,17 @@ static void iowr_blkdata(uint8_t val)
} }
} }
int run()
int main(int argc, char *argv[])
{ {
bool tty = false; #ifdef BLKFS_PATH
struct termios termInfo; fprintf(stderr, "Using blkfs %s\n", BLKFS_PATH);
if (argc == 2) { blkfp = fopen(BLKFS_PATH, "r+");
fp = fopen(argv[1], "r"); if (!blkfp) {
if (fp == NULL) { fprintf(stderr, "Can't open\n");
fprintf(stderr, "Can't open %s\n", argv[1]);
return 1;
}
} else if (argc == 1) {
fp = stdin;
tty = isatty(fileno(stdin));
if (tty) {
// Turn echo off: the shell takes care of its own echoing.
if (tcgetattr(0, &termInfo) == -1) {
printf("Can't setup terminal.\n");
return 1;
}
termInfo.c_lflag &= ~ECHO;
termInfo.c_lflag &= ~ICANON;
tcsetattr(0, TCSAFLUSH, &termInfo);
}
} else {
fprintf(stderr, "Usage: ./forth [filename]\n");
return 1;
}
blkfp = fopen("blkfs", "r+");
if (blkfp) {
fprintf(stderr, "Using blkfs file\n");
} else {
blkfp = fmemopen((char*)BLKFS, sizeof(BLKFS), "r");
fprintf(stderr, "Using in-memory read-only blkfs\n");
} }
#else
blkfp = NULL;
#endif
Machine *m = emul_init(); Machine *m = emul_init();
m->ramstart = RAMSTART; m->ramstart = RAMSTART;
m->iord[STDIO_PORT] = iord_stdio; m->iord[STDIO_PORT] = iord_stdio;
@ -120,16 +107,34 @@ int main(int argc, char *argv[])
// Run! // Run!
while (emul_step()); while (emul_step());
if (tty) {
printf("\nDone!\n");
termInfo.c_lflag |= ECHO;
termInfo.c_lflag |= ICANON;
tcsetattr(0, TCSAFLUSH, &termInfo);
emul_printdebug();
}
if (blkfp != NULL) { if (blkfp != NULL) {
fclose(blkfp); fclose(blkfp);
} }
fclose(fp);
return retcode; return retcode;
} }
int main(int argc, char *argv[])
{
if (argc == 2) {
fp = fopen(argv[1], "r");
if (fp == NULL) {
fprintf(stderr, "Can't open %s\n", argv[1]);
return 1;
}
int ret = run();
fclose(fp);
return ret;
} else if (argc == 1) {
fp = NULL;
initscr(); cbreak(); noecho(); nl(); clear();
scrollok(stdscr, 1);
int ret = run();
nocbreak(); echo(); endwin();
printf("\nDone!\n");
emul_printdebug();
return ret;
} else {
fprintf(stderr, "Usage: ./forth [filename]\n");
return 1;
}
}

View File

@ -3,7 +3,10 @@
#include <unistd.h> #include <unistd.h>
#include "emul.h" #include "emul.h"
#include "forth-bin.h" #include "forth-bin.h"
#include "blkfs-bin.h"
#ifndef BLKFS_PATH
#error BLKFS_PATH needed
#endif
/* Staging binaries /* Staging binaries
@ -37,7 +40,7 @@ static int running;
static uint16_t start_here = 0; static uint16_t start_here = 0;
static uint16_t end_here = 0; static uint16_t end_here = 0;
static uint16_t blkid = 0; static uint16_t blkid = 0;
static unsigned int blkpos = 0; static FILE *blkfp;
static uint8_t iord_stdio() static uint8_t iord_stdio()
{ {
@ -65,16 +68,22 @@ static void iowr_blk(uint8_t val)
{ {
blkid <<= 8; blkid <<= 8;
blkid |= val; blkid |= val;
blkpos = blkid * 1024; fseek(blkfp, blkid*1024, SEEK_SET);
} }
static uint8_t iord_blkdata() static uint8_t iord_blkdata()
{ {
return BLKFS[blkpos++]; return getc(blkfp);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
fprintf(stderr, "Using blkfs %s\n", BLKFS_PATH);
blkfp = fopen(BLKFS_PATH, "r+");
if (!blkfp) {
fprintf(stderr, "Can't open\n");
return 1;
}
Machine *m = emul_init(); Machine *m = emul_init();
m->ramstart = RAMSTART; m->ramstart = RAMSTART;
m->iord[STDIO_PORT] = iord_stdio; m->iord[STDIO_PORT] = iord_stdio;