2019-01-05 21:16:08 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <dos.h>
|
|
|
|
|
2019-01-25 02:36:42 +00:00
|
|
|
#include "video.h"
|
|
|
|
#include "kbd.h"
|
|
|
|
#include "mouse.h"
|
|
|
|
#include "tiff.h"
|
|
|
|
#include "tiles.h"
|
2019-01-30 00:35:48 +00:00
|
|
|
#include "serial.h"
|
2019-02-09 16:48:40 +00:00
|
|
|
#include "timer.h"
|
|
|
|
#include "jorth.h"
|
2019-02-26 03:19:08 +00:00
|
|
|
#include "egamap.h"
|
2019-01-19 04:02:50 +00:00
|
|
|
|
2019-02-16 00:39:50 +00:00
|
|
|
/*** T E X T ***/
|
|
|
|
char far *font = NULL;
|
|
|
|
|
|
|
|
void text_init() {
|
|
|
|
unsigned int fontSeg, fontOff;
|
|
|
|
asm {
|
|
|
|
push es
|
|
|
|
push bp
|
|
|
|
mov ah, 11h
|
|
|
|
mov al, 30h
|
|
|
|
mov bh, 3
|
|
|
|
int 10h
|
|
|
|
mov ax, bp
|
|
|
|
pop bp
|
|
|
|
mov fontSeg, es
|
|
|
|
mov fontOff, ax
|
|
|
|
pop es
|
|
|
|
}
|
|
|
|
font = MK_FP(fontSeg, fontOff);
|
|
|
|
}
|
|
|
|
|
|
|
|
void text_draw_char(unsigned int vidOffset, unsigned char c) {
|
|
|
|
unsigned int fontOffset = c << 3;
|
|
|
|
int i;
|
|
|
|
for (i = 0; i < 8; i ++) {
|
|
|
|
VID[vidOffset] = font[fontOffset++];
|
|
|
|
vidOffset += PAGE_STRIDE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void text_draw(unsigned int vidOffset, unsigned char *s) {
|
|
|
|
while (*s) {
|
|
|
|
text_draw_char(vidOffset++, *s++);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-19 04:02:50 +00:00
|
|
|
/*** S C R A T C H ***/
|
2019-01-25 02:36:42 +00:00
|
|
|
|
2019-01-19 04:03:02 +00:00
|
|
|
#define NUM_SPRITES 64
|
2019-01-19 20:50:50 +00:00
|
|
|
#define TILE_STRIDE 64
|
|
|
|
#define SPRITE_STRIDE 80
|
|
|
|
unsigned int tiles[NUM_TILES * TILE_STRIDE];
|
|
|
|
unsigned int sprites[NUM_SPRITES * SPRITE_STRIDE];
|
2019-01-19 04:03:02 +00:00
|
|
|
|
2019-01-19 04:02:56 +00:00
|
|
|
unsigned char map[10000];
|
2019-01-19 04:02:50 +00:00
|
|
|
|
2019-01-19 04:02:56 +00:00
|
|
|
void fillMap() {
|
2019-01-19 04:02:50 +00:00
|
|
|
unsigned int x, y, z;
|
|
|
|
z = 0;
|
|
|
|
|
|
|
|
for (y = 0; y < 100; y ++) {
|
|
|
|
for (x = 0; x < 100; x ++) {
|
2019-01-19 20:50:50 +00:00
|
|
|
map[x + (y * 100)] = ((x + y + z) >> 2) % 4;
|
2019-01-19 04:02:50 +00:00
|
|
|
}
|
2019-01-05 21:16:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-19 04:02:56 +00:00
|
|
|
void game_init() {
|
2019-01-05 21:16:08 +00:00
|
|
|
FILE *f;
|
|
|
|
TifImageMeta_t meta;
|
|
|
|
|
2019-02-18 01:14:56 +00:00
|
|
|
mouse_init();
|
|
|
|
|
2019-01-05 21:16:08 +00:00
|
|
|
setEGAMode();
|
2019-01-07 02:29:20 +00:00
|
|
|
atexit(vid_cleanup);
|
|
|
|
|
2019-01-25 02:36:42 +00:00
|
|
|
kbd_init();
|
2019-02-09 16:48:40 +00:00
|
|
|
timer_init(TIMER_30HZ);
|
2019-02-16 00:39:50 +00:00
|
|
|
text_init();
|
2019-01-25 02:36:42 +00:00
|
|
|
|
2019-01-19 04:02:56 +00:00
|
|
|
tile_init();
|
|
|
|
fillMap();
|
|
|
|
|
2019-01-07 02:29:20 +00:00
|
|
|
f = fopen("FOOTER.TIF", "rb");
|
|
|
|
meta = tifLoadMeta(f);
|
2019-02-26 03:19:08 +00:00
|
|
|
tifLoadEGA(f, meta, 0, 48, 336);
|
2019-01-07 02:29:20 +00:00
|
|
|
fclose(f);
|
2019-01-05 21:16:08 +00:00
|
|
|
|
|
|
|
f = fopen("TILES.TIF", "rb");
|
|
|
|
meta = tifLoadMeta(f);
|
2019-01-19 04:03:02 +00:00
|
|
|
tifLoad(f, meta, tiles, NUM_TILES * 16, 16, 4);
|
2019-01-19 20:50:50 +00:00
|
|
|
tifLoadEGA(f, meta, OFF_TILES, NUM_TILES * 16, 16);
|
2019-01-19 04:03:02 +00:00
|
|
|
fclose(f);
|
|
|
|
|
|
|
|
f = fopen("SPRITE.TIF", "rb");
|
|
|
|
meta = tifLoadMeta(f);
|
|
|
|
tifLoad(f, meta, sprites, NUM_SPRITES * 16, 16, 5);
|
2019-01-05 21:16:08 +00:00
|
|
|
fclose(f);
|
|
|
|
|
2019-02-26 03:19:08 +00:00
|
|
|
f = fopen("PORTRAIT.TIF", "rb");
|
|
|
|
meta = tifLoadMeta(f);
|
|
|
|
tifLoadEGA(f, meta, OFF_PORTRAITS, NUM_PORTRAITS * 32, 32);
|
|
|
|
fclose(f);
|
|
|
|
|
2019-01-19 04:02:56 +00:00
|
|
|
loadTiles(OFF_TILES, tiles);
|
|
|
|
loadMap(map, 100, 100);
|
|
|
|
scroll(0, 0);
|
|
|
|
}
|
|
|
|
|
2019-02-06 02:07:30 +00:00
|
|
|
void f_seremit() {
|
|
|
|
ser_write_byte(TOP().i);
|
|
|
|
if (TOP().i == '\n') {
|
|
|
|
ser_write_byte('\r');
|
|
|
|
}
|
|
|
|
DROP(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void f_keyWasPressed() {
|
2019-02-17 00:21:02 +00:00
|
|
|
int k = TOP().i;
|
|
|
|
TOP().i = keyWasPressed(k);
|
|
|
|
consumeKey(k);
|
2019-02-06 02:07:30 +00:00
|
|
|
}
|
|
|
|
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);
|
2019-02-11 00:17:58 +00:00
|
|
|
DROP(2);
|
2019-02-06 02:07:30 +00:00
|
|
|
}
|
2019-02-18 01:14:56 +00:00
|
|
|
|
|
|
|
void f_scrollpos() { // ( -- x y )
|
|
|
|
PUSHI(screen.scrollX);
|
|
|
|
PUSHI(screen.scrollY);
|
|
|
|
}
|
2019-02-09 16:48:40 +00:00
|
|
|
void f_ticks() {
|
|
|
|
PUSHU(timer_counter);
|
|
|
|
}
|
2019-02-12 04:23:00 +00:00
|
|
|
void f_splitscreen() {
|
|
|
|
setSplitScreen(399 - (TOP().i << 1));
|
|
|
|
DROP(1);
|
|
|
|
}
|
2019-02-16 00:39:50 +00:00
|
|
|
|
2019-03-05 22:35:50 +00:00
|
|
|
void f_textc() { // ( col line c color -- )
|
|
|
|
setWriteMode(0);
|
|
|
|
setPlaneColor(TOP().u);
|
|
|
|
DROP(1);
|
|
|
|
text_draw_char(ST2().u + (ST1().u * PAGE_STRIDE), TOP().i);
|
|
|
|
DROP(3);
|
|
|
|
}
|
2019-02-26 03:19:08 +00:00
|
|
|
|
|
|
|
void f_text() { // ( col line s color -- )
|
|
|
|
setWriteMode(0);
|
|
|
|
setPlaneColor(TOP().u);
|
|
|
|
DROP(1);
|
2019-02-16 00:39:50 +00:00
|
|
|
text_draw(ST2().u + (ST1().u * PAGE_STRIDE), TOP().s);
|
|
|
|
DROP(3);
|
|
|
|
}
|
2019-02-18 01:14:56 +00:00
|
|
|
|
|
|
|
void f_map() {
|
|
|
|
PUSHP(map);
|
|
|
|
}
|
|
|
|
|
|
|
|
void f_mapsize() { // ( -- w h )
|
|
|
|
PUSHI(screen.w);
|
|
|
|
PUSHI(screen.h);
|
|
|
|
}
|
|
|
|
|
2019-02-24 17:18:34 +00:00
|
|
|
void f_mapsize_set() { // ( w h -- )
|
|
|
|
loadMap(map, ST1().i, TOP().i);
|
|
|
|
DROP(2);
|
|
|
|
}
|
|
|
|
|
2019-02-18 01:14:56 +00:00
|
|
|
void f_mousepos() { // ( -- x y )
|
|
|
|
PUSHI(MOUSE.x);
|
|
|
|
PUSHI(MOUSE.y);
|
|
|
|
}
|
|
|
|
void f_mousebuttons() {
|
|
|
|
PUSHI(MOUSE.buttons);
|
|
|
|
}
|
|
|
|
|
2019-02-26 03:19:08 +00:00
|
|
|
void f_drawportrait() {
|
|
|
|
setAllPlanes();
|
|
|
|
setWriteMode(1);
|
|
|
|
blit32x32(OFF_PORTRAITS + (TOP().u << 7), (PAGE_STRIDE << 3) + 1);
|
|
|
|
DROP(1);
|
|
|
|
}
|
|
|
|
|
2019-02-06 02:07:30 +00:00
|
|
|
void game_f_init() {
|
|
|
|
f_init();
|
|
|
|
CDEF("seremit", f_seremit);
|
|
|
|
CDEF("key-pressed", f_keyWasPressed);
|
|
|
|
CDEF("key-down", f_keyIsDown);
|
2019-02-11 00:17:58 +00:00
|
|
|
CDEF("draw-sprite", f_drawSprite);
|
2019-02-26 03:19:08 +00:00
|
|
|
CDEF("draw-portrait", f_drawportrait);
|
2019-02-06 02:07:30 +00:00
|
|
|
CDEF("scroll", f_scroll);
|
2019-02-18 01:14:56 +00:00
|
|
|
CDEF("scrollpos", f_scrollpos);
|
2019-02-11 00:17:58 +00:00
|
|
|
CDEF("draw-screen", drawScreen);
|
2019-02-12 04:23:00 +00:00
|
|
|
CDEF("split-screen", f_splitscreen);
|
2019-02-09 16:48:40 +00:00
|
|
|
CDEF("ticks", f_ticks);
|
2019-02-16 00:39:50 +00:00
|
|
|
CDEF("text", f_text);
|
2019-03-05 22:35:50 +00:00
|
|
|
CDEF("textc", f_textc);
|
2019-02-18 01:14:56 +00:00
|
|
|
CDEF("map", f_map);
|
|
|
|
CDEF("mapsize", f_mapsize);
|
2019-02-24 17:18:34 +00:00
|
|
|
CDEF("mapsize!", f_mapsize_set);
|
2019-02-18 01:14:56 +00:00
|
|
|
CDEF("mousepos", f_mousepos);
|
|
|
|
CDEF("mousebuttons", f_mousebuttons);
|
2019-02-26 03:19:08 +00:00
|
|
|
CDEF("unfuck", tile_init);
|
2019-02-09 16:48:40 +00:00
|
|
|
f_loadfile("game.jor");
|
2019-02-04 02:04:02 +00:00
|
|
|
}
|
2019-02-06 02:07:30 +00:00
|
|
|
|
|
|
|
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';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-24 15:14:56 +00:00
|
|
|
int DONE = 0;
|
|
|
|
static void f_quit() {
|
|
|
|
DONE = 1;
|
|
|
|
}
|
|
|
|
void do_repl() {
|
|
|
|
char buf[256];
|
|
|
|
|
|
|
|
f_init();
|
|
|
|
CDEF("quit", f_quit);
|
|
|
|
|
|
|
|
f_loadfile("repl.jor");
|
|
|
|
f_taskloop();
|
|
|
|
|
|
|
|
while (!DONE) {
|
|
|
|
PUSHS(gets(buf));
|
|
|
|
f_runstring("REPL send");
|
|
|
|
f_taskloop();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc) {
|
|
|
|
if (argc > 1) {
|
|
|
|
do_repl();
|
|
|
|
return 0;
|
|
|
|
}
|
2019-02-09 16:48:40 +00:00
|
|
|
ser_init(SER_COM2, BAUD_19200, SER_8N1);
|
2019-01-19 04:02:56 +00:00
|
|
|
game_init();
|
2019-02-06 02:07:30 +00:00
|
|
|
game_f_init();
|
|
|
|
|
2019-01-25 02:36:42 +00:00
|
|
|
while (!keyIsDown(K_ESC)) {
|
|
|
|
kbd_debounce();
|
2019-02-06 02:07:30 +00:00
|
|
|
f_poll();
|
2019-02-11 00:17:58 +00:00
|
|
|
f_taskloop();
|
|
|
|
f_runstring("tick");
|
|
|
|
f_taskloop();
|
|
|
|
f_runstring("draw");
|
2019-01-05 21:16:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|