Serial read support, add embedded Forp repl over serial port to game
This commit is contained in:
parent
9821025def
commit
ca25a4578e
8
defs.frp
8
defs.frp
|
@ -69,11 +69,3 @@ key const sp
|
||||||
begin dup @ not while suspend repeat ( wait for mail )
|
begin dup @ not while suspend repeat ( wait for mail )
|
||||||
dup @ 0 rot ! ;
|
dup @ 0 rot ! ;
|
||||||
|
|
||||||
|
|
||||||
: start-repl activate
|
|
||||||
stdout
|
|
||||||
' log-emit task-echo !
|
|
||||||
begin receive loadstring again ;
|
|
||||||
task const REPL
|
|
||||||
|
|
||||||
REPL start-repl
|
|
7
game.frp
Executable file
7
game.frp
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
: start-repl activate
|
||||||
|
' seremit task-emit !
|
||||||
|
' log-emit task-echo !
|
||||||
|
begin receive loadstring again ;
|
||||||
|
task const REPL
|
||||||
|
|
||||||
|
REPL start-repl
|
57
serial.c
57
serial.c
|
@ -1,3 +1,4 @@
|
||||||
|
#include <stdio.h>
|
||||||
#include <dos.h>
|
#include <dos.h>
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
|
|
||||||
|
@ -6,18 +7,72 @@ int comport = 0;
|
||||||
#define SER_LATCH_LO 0
|
#define SER_LATCH_LO 0
|
||||||
#define SER_LATCH_HI 1
|
#define SER_LATCH_HI 1
|
||||||
#define SER_TX 0
|
#define SER_TX 0
|
||||||
|
#define SER_RX 0
|
||||||
|
#define SER_IER 1
|
||||||
#define SER_LCR 3
|
#define SER_LCR 3
|
||||||
|
#define SER_MCR 4
|
||||||
#define SER_LSR 5
|
#define SER_LSR 5
|
||||||
|
|
||||||
|
#define PIC1 0x20
|
||||||
|
#define OCW1 0x21
|
||||||
|
#define PIC_EOI 0x20
|
||||||
|
|
||||||
|
// COM1 - IRQ4, COM2 - IRQ3, COM3 - IRQ4, COM4 - IRQ3
|
||||||
|
#define SER_IRQ(port) (4 - (port % 2))
|
||||||
|
#define SER_VECTOR(irq) (0x08 + (irq))
|
||||||
|
|
||||||
|
static char readbuf[SER_READ_BUFFER_SIZE];
|
||||||
|
static int ireadbufStart = 0;
|
||||||
|
static volatile int ireadbufLim = 0;
|
||||||
|
static int irq = 0;
|
||||||
|
|
||||||
|
static void interrupt (*oldSerISR)() = NULL;
|
||||||
|
|
||||||
|
static void interrupt ser_isr() {
|
||||||
|
while (inp(comport + SER_LSR) & 0x01) {
|
||||||
|
readbuf[ireadbufLim] = inp(comport + SER_RX);
|
||||||
|
ireadbufLim = (ireadbufLim + 1) % SER_READ_BUFFER_SIZE;
|
||||||
|
}
|
||||||
|
outp(PIC1, PIC_EOI);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ser_cleanup() {
|
||||||
|
if (irq) {
|
||||||
|
int ocw = inp(OCW1) | (1 << irq);
|
||||||
|
outp(OCW1, ocw);
|
||||||
|
setvect(SER_VECTOR(irq), oldSerISR);
|
||||||
|
irq = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ser_init(int port, int baudrate, int protocol) {
|
void ser_init(int port, int baudrate, int protocol) {
|
||||||
int far *comport_addr = MK_FP(0x0040, 0x0000);
|
int far *comport_addr = MK_FP(0x0040, 0x0000);
|
||||||
int lcr;
|
int lcr, ocw;
|
||||||
comport = comport_addr[port];
|
comport = comport_addr[port];
|
||||||
|
irq = SER_IRQ(port);
|
||||||
|
|
||||||
outp(comport + SER_LCR, 0x80);
|
outp(comport + SER_LCR, 0x80);
|
||||||
outp(comport + SER_LATCH_HI, baudrate >> 8);
|
outp(comport + SER_LATCH_HI, baudrate >> 8);
|
||||||
outp(comport + SER_LATCH_LO, baudrate & 0xff);
|
outp(comport + SER_LATCH_LO, baudrate & 0xff);
|
||||||
outp(comport + SER_LCR, protocol);
|
outp(comport + SER_LCR, protocol);
|
||||||
|
outp(comport + SER_MCR, 0x0b);
|
||||||
|
|
||||||
|
oldSerISR = getvect(SER_VECTOR(irq));
|
||||||
|
setvect(SER_VECTOR(irq), ser_isr);
|
||||||
|
ocw = inp(OCW1) & ~(1 << irq);
|
||||||
|
outp(OCW1, ocw);
|
||||||
|
outp(comport + SER_IER, 0x01);
|
||||||
|
|
||||||
|
atexit(ser_cleanup);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ser_poll() {
|
||||||
|
int result = SER_NODATA;
|
||||||
|
if (ireadbufStart != ireadbufLim) {
|
||||||
|
result = readbuf[ireadbufStart];
|
||||||
|
ireadbufStart = (ireadbufStart + 1) % SER_READ_BUFFER_SIZE;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ser_write_byte(char byte) {
|
void ser_write_byte(char byte) {
|
||||||
|
|
4
serial.h
4
serial.h
|
@ -19,6 +19,10 @@
|
||||||
#define BAUD_57600 0x0002
|
#define BAUD_57600 0x0002
|
||||||
#define BAUD_115200 0x0001
|
#define BAUD_115200 0x0001
|
||||||
|
|
||||||
|
#define SER_READ_BUFFER_SIZE 0x200
|
||||||
|
#define SER_NODATA -1
|
||||||
|
|
||||||
void ser_init(int port, int baudrate, int protocol);
|
void ser_init(int port, int baudrate, int protocol);
|
||||||
|
int ser_poll();
|
||||||
void ser_write_byte(char byte);
|
void ser_write_byte(char byte);
|
||||||
void ser_write(char *str);
|
void ser_write(char *str);
|
||||||
|
|
72
testbed.c
72
testbed.c
|
@ -148,17 +148,83 @@ void overworldThink() {
|
||||||
scroll(game.player.x - 152, game.player.y - 92);
|
scroll(game.player.x - 152, game.player.y - 92);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main3() {
|
||||||
f_init();
|
f_init();
|
||||||
f_repl();
|
f_repl();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
int main2() {
|
|
||||||
|
void f_seremit() {
|
||||||
|
ser_write_byte(TOP().i);
|
||||||
|
if (TOP().i == '\n') {
|
||||||
|
ser_write_byte('\r');
|
||||||
|
}
|
||||||
|
DROP(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void f_keyWasPressed() {
|
||||||
|
TOP().i = keyWasPressed(TOP().i);
|
||||||
|
}
|
||||||
|
void f_keyIsDown() {
|
||||||
|
TOP().i = keyIsDown(TOP().i);
|
||||||
|
}
|
||||||
|
void f_drawSprite() { // ( x y sprite -- )
|
||||||
|
drawSprite(&sprites[TOP().i * SPRITE_STRIDE], ST2().i, ST1().i);
|
||||||
|
DROP(3);
|
||||||
|
}
|
||||||
|
void f_scroll() { // ( x y -- )
|
||||||
|
scroll(ST1().i, TOP().i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void game_f_init() {
|
||||||
|
f_init();
|
||||||
|
CDEF("seremit", f_seremit);
|
||||||
|
CDEF("key-pressed", f_keyWasPressed);
|
||||||
|
CDEF("key-down", f_keyIsDown);
|
||||||
|
CDEF("sprite", f_drawSprite);
|
||||||
|
CDEF("scroll", f_scroll);
|
||||||
|
CDEF("draw", drawScreen);
|
||||||
|
|
||||||
|
f_loadfile("game.frp");
|
||||||
|
}
|
||||||
|
|
||||||
|
void f_poll() {
|
||||||
|
static char line[256] = { 0 };
|
||||||
|
|
||||||
|
int i = strlen(line);
|
||||||
|
int value;
|
||||||
|
for (value = ser_poll(); value != SER_NODATA; value = ser_poll()) {
|
||||||
|
if (value == '\b' || value == 127) {
|
||||||
|
i --;
|
||||||
|
} else {
|
||||||
|
line[i] = value;
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
line[i] = '\0';
|
||||||
|
ser_write_byte(value); // echo
|
||||||
|
|
||||||
|
if (value == '\r') {
|
||||||
|
line[i - 1] = '\n';
|
||||||
|
ser_write_byte('\n');
|
||||||
|
PUSHS(line);
|
||||||
|
f_runstring("REPL send");
|
||||||
|
f_taskloop();
|
||||||
|
i = 0;
|
||||||
|
line[i] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
game_init();
|
game_init();
|
||||||
|
game_f_init();
|
||||||
|
|
||||||
ser_init(SER_COM2, BAUD_19200, SER_8N1);
|
ser_init(SER_COM2, BAUD_19200, SER_8N1);
|
||||||
ser_write("JORTS QUEST DEBUG OUTPUT\r\n");
|
|
||||||
|
|
||||||
while (!keyIsDown(K_ESC)) {
|
while (!keyIsDown(K_ESC)) {
|
||||||
kbd_debounce();
|
kbd_debounce();
|
||||||
|
f_poll();
|
||||||
|
|
||||||
if (game.state == STATE_MAP) {
|
if (game.state == STATE_MAP) {
|
||||||
overworldThink();
|
overworldThink();
|
||||||
} else if (game.state == STATE_DIALOG) {
|
} else if (game.state == STATE_DIALOG) {
|
||||||
|
|
Loading…
Reference in a new issue