#include #include #include #include "video.h" #include "kbd.h" #include "mouse.h" #include "tiff.h" #include "tiles.h" #include "serial.h" #include "timer.h" #include "jorth.h" /*** 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++); } } /*** 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]; void fillMap() { 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; } } } void game_init() { FILE *f; TifImageMeta_t meta; setEGAMode(); atexit(vid_cleanup); kbd_init(); timer_init(TIMER_30HZ); text_init(); tile_init(); fillMap(); f = fopen("FOOTER.TIF", "rb"); meta = tifLoadMeta(f); tifLoadEGA(f, meta, 0, 24, 336); fclose(f); 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); fclose(f); loadTiles(OFF_TILES, tiles); loadMap(map, 100, 100); scroll(0, 0); } 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); DROP(2); } void f_ticks() { PUSHU(timer_counter); } void f_splitscreen() { setSplitScreen(399 - (TOP().i << 1)); DROP(1); } 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); CDEF("draw-sprite", f_drawSprite); CDEF("scroll", f_scroll); CDEF("draw-screen", drawScreen); CDEF("split-screen", f_splitscreen); CDEF("ticks", f_ticks); 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(); f_taskloop(); f_runstring("tick"); f_taskloop(); f_runstring("draw"); } return 0; }