pete286/testbed.c

201 lines
3.8 KiB
C
Raw Normal View History

2019-01-05 21:16:08 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#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"
#include "timer.h"
#include "jorth.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 ***/
#define NUM_TILES 128
#define NUM_SPRITES 64
#define OFF_TILES 0x5000
#define TILE_STRIDE 64
#define SPRITE_STRIDE 80
unsigned int tiles[NUM_TILES * TILE_STRIDE];
unsigned int sprites[NUM_SPRITES * SPRITE_STRIDE];
unsigned char map[10000];
2019-01-19 04:02:50 +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 ++) {
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
}
}
void game_init() {
2019-01-05 21:16:08 +00:00
FILE *f;
TifImageMeta_t meta;
setEGAMode();
2019-01-07 02:29:20 +00:00
atexit(vid_cleanup);
kbd_init();
timer_init(TIMER_30HZ);
2019-02-16 00:39:50 +00:00
text_init();
tile_init();
fillMap();
2019-01-07 02:29:20 +00:00
f = fopen("FOOTER.TIF", "rb");
meta = tifLoadMeta(f);
2019-01-19 04:02:50 +00:00
tifLoadEGA(f, meta, 0, 24, 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);
tifLoad(f, meta, tiles, NUM_TILES * 16, 16, 4);
tifLoadEGA(f, meta, OFF_TILES, NUM_TILES * 16, 16);
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);
loadTiles(OFF_TILES, tiles);
loadMap(map, 100, 100);
scroll(0, 0);
}
2019-01-30 00:35:48 +00:00
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);
2019-02-11 00:17:58 +00:00
DROP(2);
}
void f_ticks() {
PUSHU(timer_counter);
}
void f_splitscreen() {
setSplitScreen(399 - (TOP().i << 1));
DROP(1);
}
2019-02-16 00:39:50 +00:00
void f_text() { // ( col y s -- )
text_draw(ST2().u + (ST1().u * PAGE_STRIDE), TOP().s);
DROP(3);
}
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);
CDEF("scroll", f_scroll);
2019-02-11 00:17:58 +00:00
CDEF("draw-screen", drawScreen);
CDEF("split-screen", f_splitscreen);
CDEF("ticks", f_ticks);
2019-02-16 00:39:50 +00:00
CDEF("text", f_text);
f_loadfile("game.jor");
}
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() {
ser_init(SER_COM2, BAUD_19200, SER_8N1);
game_init();
game_f_init();
while (!keyIsDown(K_ESC)) {
kbd_debounce();
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;
}