From 114d1ff804781831397734729eb0bab19cda368f Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Mon, 25 Feb 2019 22:19:08 -0500 Subject: [PATCH] Bigger footer, portrait support, coloured text --- defs.jor | 16 ++++++++++++---- egamap.h | 15 +++++++++++++++ footer.tif | Bin 4332 -> 8076 bytes game.exe | Bin 112287 -> 113021 bytes game.jor | 51 +++++++++++++++++++++++++++++++++++++++++++-------- game.prj | Bin 5265 -> 5281 bytes jorth.c | 13 +++++++++---- jorth.h | 5 ++++- portrait.tif | Bin 0 -> 7955 bytes testbed.c | 26 +++++++++++++++++++++----- tiles.c | 14 +++++++++++++- tiles.h | 8 +++++++- video.h | 3 ++- 13 files changed, 126 insertions(+), 25 deletions(-) create mode 100755 egamap.h create mode 100755 portrait.tif diff --git a/defs.jor b/defs.jor index fb3f50c..4d8b011 100755 --- a/defs.jor +++ b/defs.jor @@ -10,15 +10,23 @@ s" jorth.log" open seekend deactivate const LOGFILE : noop ; -' cells @ const docolon ( get the colon execution token ) -: :noname here docolon , ] ; +' cells @ const $DOCOLON ( get the colon execution token ) +: :noname here $DOCOLON , ] ; -: :| inline| :noname ; immediate +: :| inline| $DOCOLON , ; immediate : |; ' ret , |inline ; immediate -: defer word new-word docolon , ' noop , ' ret , ; +: defer word new-word $DOCOLON , ' noop , ' ret , ; : redefine ( cp cpdeferred ) cell + ! ; +: create word new-word $DOCREATE , 0 , ; + +: finishcreate ( ipfirst -- ) + ( set cell after codepointer to first instruction of does> ) + latest codepointer cell + ! ; + +: does> here 4 cells + lit ' finishcreate , ' ret , ] ; immediate + : +towards ( from to -- from+-1 ) over > if 1 + else 1 - then ; diff --git a/egamap.h b/egamap.h new file mode 100755 index 0000000..ca621c5 --- /dev/null +++ b/egamap.h @@ -0,0 +1,15 @@ +#include "tiles.h" + +#define NUM_TILES 128 +#define NUM_PORTRAITS 16 + +#define SIZE_FOOTER (PAGE_STRIDE * 48) +#define SIZE_PAGE (PAGE_STRIDE * (PAGE_TILES_H << 4)) +#define SIZE_TILES (NUM_TILES << 5) +#define SIZE_PORTRAITS (NUM_PORTRAITS << 7) + +#define OFF_FOOTER 0 +#define OFF_PAGE1 (OFF_FOOTER + SIZE_FOOTER) +#define OFF_PAGE2 (OFF_PAGE1 + SIZE_PAGE) +#define OFF_TILES (OFF_PAGE2 + SIZE_PAGE) +#define OFF_PORTRAITS (OFF_TILES + SIZE_TILES) diff --git a/footer.tif b/footer.tif index 99812bc19c1a0178b6f9522aca9d9c3b2e79f5c1..c4d3ba64cad50582a496eda9abd4bc5be24a7112 100755 GIT binary patch literal 8076 zcmeI0F$%&!5Je|OL_rW6Z9IXMM@V54u*?}ef=QV|NRHw$EG(@(LQY}f47*Cgf`uQ6 z;Gbo)e|Kg!o5zr1({wFk5t)cYu|%p8eMDYwbUyHUs5r>UM zR(zt`_B&{Q*-2c>#I?J)W&!3g%XBoad7h(r+ugja-l%i0pViECT#D2*h(Jywfqn@T zK>=5JxE2I`f1z?*3j0-cOwZSu_cY=8F!1C@ei#8PoApP27y&Gs^+$df0W6#KM}8Oq zESvR5ei#8PoApP27y&Gs^+$df0W6#K_aFR%o7&&H-|hGIn{Oup68M@y}i5~&K@WR&<)r?12CzA0Z_gH${a9i)Q!{$`q6M4 z4M$iAjOJ@tNZ_YO^9=s*Ay#%Y9ElAn{OU%-5r6m)D?1vF#D)}pbvVKi-kb%>!`TDH nz~M%0?cPzbVH5%f7#JEFI64>_IvhG$TqpuQXYhd|l$Z?w@t3Wk diff --git a/game.exe b/game.exe index 68e915946cc5579c82a14c3c675bef4353f8c9f0..781709d3cad184b7472371e87c8f23fdc8b09499 100755 GIT binary patch delta 25777 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 diff --git a/game.jor b/game.jor index f0134d9..91431c4 100755 --- a/game.jor +++ b/game.jor @@ -90,9 +90,35 @@ var footer-y : draw-footer footer-y @ split-screen ; -: text1 6 4 @ >rot ticks ( from to duration start ) @@ -103,11 +129,20 @@ var footer-y >rot suspend repeat rdrop drop drop drop drop ; -: show-footer 24 10 footer-y move-to ; +: show-footer 48 10 footer-y move-to ; : hide-footer 0 10 footer-y move-to ; -: say1 ( s -- ) clear text1 show-footer ^ENTER wait-key ; -: say2 ( s1 s2 -- ) clear text2 text1 show-footer ^ENTER wait-key ; +: footer-wait show-footer ^ENTER wait-key ; +: say1 ( s -- ) clear text1 footer-wait ; +: say2 ( s1 s2 -- ) clear text1 text0 footer-wait ; +: say3 ( s1 s2 s3 -- ) clear text2 text1 text0 footer-wait ; + +: character ( iportrait color ) create , , + does> dup @ text-color ! cell + @ draw-portrait ; + +0 GREEN character pete +1 MAGENTA character mary +2 BROWN character chuck ( M O U S E ) @@ -162,8 +197,8 @@ var tileselect factivate ; : load-map ( filename -- ) - fdeactivate swap open tell . - fget tell . fget tell . cr .s + fdeactivate swap open + fget fget 2dup * map fread mapsize! factivate ; diff --git a/game.prj b/game.prj index d4c8b59992462df3b1dcb5b1afae2d9b7ba802bd..fd09030239e1a259d906de717b31ce6ad26209bf 100755 GIT binary patch delta 533 zcmYjNPe@cj82`Zshb~Of;ItD@@b}K>(i>@|M zheTT3y~IWr?U7Ai&d&rTgOJUkpL>sl Y*?|7(?ZwDyx7&Izp@gB;H+mP(0VFb?WB>pF delta 516 zcmZ3eIZ<;{7(0Uyg9t+U zKgdNPo<6R@dL9g*!23UWjZiop = TOP().p; - HERE ++; - DROP(1); + f_comma(); } void f_docolon(); @@ -719,6 +717,12 @@ void f_var() { f_comma(); } +void f_docreate() { + PUSHCP(W.p + 2); + RPUSH(IP); + IP = *(W.p + 1); +} + void f_bz_() { if (!TOP().u) { IP.p = IP.p->p; // branch @@ -946,6 +950,7 @@ void f_init() { CDEF("stacksize", f_stacksize); CDEF("rstacksize", f_rstacksize); CDEF("task-user-size", f_taskusersize); + PCONST("$DOCREATE", f_docreate); PUSHS("boot.jor"); f_open(); diff --git a/jorth.h b/jorth.h index 348b18d..6978187 100755 --- a/jorth.h +++ b/jorth.h @@ -7,7 +7,6 @@ void f_init(); void f_cdef(); -#define CDEF(name, def) PUSHP(def); PUSHS(name); f_cdef() void f_immediate(); void f_loadfile(char *filename); @@ -64,5 +63,9 @@ void f_comma(); void f_bcomma(); void f_create(); // name -- void f_cdef(); // func name -- +void f_doconst(); void f_compileword(); +#define CDEF(name, def) PUSHP(def); PUSHS(name); f_cdef() +#define ICONST(name, v) CDEF(name, f_doconst); PUSHI(v); f_comma() +#define PCONST(name, p) CDEF(name, f_doconst); PUSHP(p); f_comma() diff --git a/portrait.tif b/portrait.tif new file mode 100755 index 0000000000000000000000000000000000000000..d613391b5991a35f4681d06f8a414b1931907b25 GIT binary patch literal 7955 zcmeI1v2GJV5QfM2bQsA}L<0>4H5HF=#Ws;l7x!0PO$9EmK=Bql2#=A%g^NX|2^E&8 zQu6?j!vD|A-klRc3Ocmo-0ghx|2Mmt_^Ohz*Ixo#kK z__c1%u)buIKSVp$>y9xNjK_k?qrv4tUtF3YH|(NCuZ8S}N7=l7$1FRE$>P$th@X}B zz1Sl${kp{u*dnI8Tl~a<;~}NHlz9^0Ft%3MMnie(>?n&EVHsqR z`@G$3H=BvhhMSn%i8kDfsQhulvRKBeyqicB!fGEvDnv3L20h1)gQ z##@XV@_Ro$K%-2%#bc~?QE%d1xnY)ei4``el<|$=>YNVv0sym~4$E}r%zi8K4u^(c zIiVq#sJvV4cJ{dTU!nc#lmqvpy~4`lWVU``h3Dv!wFX*R4L$&75&(88Ip3t z9Z+AUks&l-mh%S9kM#A(I_(gS8ZJxq?s|Q^Uaya;LO-r8zIoxn(rTr)Mc+Xb>fwd9 zY|4BQ{q2O2Y1a;V%e1ZATDwZyw$NdM5#|~NzWXq7!>)!A+;&0}7(TED{9J3Vupbb6 z^(yxRt4+_Vx~jNk{gkl`jFKPPPAemh=fRJ~w2Sqq}9 zh+)7^Hso-W#RJpRewnSoK+`{;74`HJy`*IVWddaaWddaaWddaaWddaaWddaaWddaa oWddaaWddaaWddaaWddaaWdi@r1g=E-ei5aQP5i`vDg7;e1IQJGTL1t6 literal 0 HcmV?d00001 diff --git a/testbed.c b/testbed.c index d3196cc..367c2a0 100755 --- a/testbed.c +++ b/testbed.c @@ -10,6 +10,7 @@ #include "serial.h" #include "timer.h" #include "jorth.h" +#include "egamap.h" /*** T E X T ***/ char far *font = NULL; @@ -49,9 +50,7 @@ void text_draw(unsigned int vidOffset, unsigned char *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]; @@ -88,7 +87,7 @@ void game_init() { f = fopen("FOOTER.TIF", "rb"); meta = tifLoadMeta(f); - tifLoadEGA(f, meta, 0, 24, 336); + tifLoadEGA(f, meta, 0, 48, 336); fclose(f); f = fopen("TILES.TIF", "rb"); @@ -102,6 +101,11 @@ void game_init() { tifLoad(f, meta, sprites, NUM_SPRITES * 16, 16, 5); fclose(f); + f = fopen("PORTRAIT.TIF", "rb"); + meta = tifLoadMeta(f); + tifLoadEGA(f, meta, OFF_PORTRAITS, NUM_PORTRAITS * 32, 32); + fclose(f); + loadTiles(OFF_TILES, tiles); loadMap(map, 100, 100); scroll(0, 0); @@ -144,7 +148,11 @@ void f_splitscreen() { DROP(1); } -void f_text() { // ( col line s -- ) + +void f_text() { // ( col line s color -- ) + setWriteMode(0); + setPlaneColor(TOP().u); + DROP(1); text_draw(ST2().u + (ST1().u * PAGE_STRIDE), TOP().s); DROP(3); } @@ -171,12 +179,20 @@ void f_mousebuttons() { PUSHI(MOUSE.buttons); } +void f_drawportrait() { + setAllPlanes(); + setWriteMode(1); + blit32x32(OFF_PORTRAITS + (TOP().u << 7), (PAGE_STRIDE << 3) + 1); + DROP(1); +} + 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("draw-portrait", f_drawportrait); CDEF("scroll", f_scroll); CDEF("scrollpos", f_scrollpos); CDEF("draw-screen", drawScreen); @@ -188,7 +204,7 @@ void game_f_init() { CDEF("mapsize!", f_mapsize_set); CDEF("mousepos", f_mousepos); CDEF("mousebuttons", f_mousebuttons); - + CDEF("unfuck", tile_init); f_loadfile("game.jor"); } diff --git a/tiles.c b/tiles.c index 10a774c..44db0b4 100755 --- a/tiles.c +++ b/tiles.c @@ -3,6 +3,7 @@ #include #include "video.h" #include "tiles.h" +#include "egamap.h" /*** T I L E S ***/ @@ -31,13 +32,24 @@ void blitTile(unsigned int offsetFrom, unsigned int offsetTo) { } } +void blit32x32(unsigned int offsetFrom, unsigned int offsetTo) { + int y; + for (y = 0; y < 32; y ++) { + VID[offsetTo] = VID[offsetFrom ++]; + VID[offsetTo + 1] = VID[offsetFrom ++]; + VID[offsetTo + 2] = VID[offsetFrom ++]; + VID[offsetTo + 3] = VID[offsetFrom ++]; + offsetTo += PAGE_STRIDE; + } +} + #define D_NOTHING 0x80 #define D_BGTILE 0x81 #define isBufIndex(d) (!((d) & 0x80)) #define nextBufferIndex(i) ((i + 1) % NUM_BUFFERS) -TiledScreen_t screen = { 0, 0, 0, 0, { 0x0600, 0x2B00 }, 0, 0, NULL, NULL, +TiledScreen_t screen = { 0, 0, 0, 0, { OFF_PAGE1, OFF_PAGE2 }, 0, 0, NULL, NULL, 0, 0, 0, 0, 0 }; void loadTiles(unsigned int tilesOffset, unsigned int *memTiles) { diff --git a/tiles.h b/tiles.h index 89d68e0..1401e45 100755 --- a/tiles.h +++ b/tiles.h @@ -1,4 +1,6 @@ /*** T I L E S ***/ +#ifndef __TILES_H__ +#define __TILES_H__ void tile_init(); @@ -8,6 +10,8 @@ void drawSprite(unsigned int *sprite, int x, int y); void scroll(int newX, int newY); void drawScreen(); +void blit32x32(unsigned int offsetFrom, unsigned int offsetTo); + #define PAGE_TILES_W 21 #define PAGE_TILES_H 14 #define PAGE_TILES_COUNT (PAGE_TILES_H * PAGE_TILES_W) @@ -34,4 +38,6 @@ typedef struct { unsigned char firstBuffer; } TiledScreen_t; -extern TiledScreen_t screen; \ No newline at end of file +extern TiledScreen_t screen; + +#endif \ No newline at end of file diff --git a/video.h b/video.h index 491a177..505d39d 100755 --- a/video.h +++ b/video.h @@ -15,7 +15,8 @@ #define PLANE_R 0x02 #define PLANE_I 0x03 #define setPlane(p) outport(REG_TS, 2 | (0x100 << p)) -#define setAllPlanes() outport(REG_TS, 0x0f02) +#define setPlaneColor(c) outport(REG_TS, 2 | (c << 8)) +#define setAllPlanes() setPlaneColor(0x0f) #define setWriteMode(m) outport(REG_GDC, 0x05 | m << 8)