From 6c4e5ff396ba356e461c5ae5b39c7b40cc4ddd90 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 14 Apr 2019 15:08:13 -0400 Subject: [PATCH] JOPL status bar, remove jorth from ISR (for now??) --- jopl.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++----- jopl.exe | Bin 63298 -> 64234 bytes jopl.jor | 58 ++++++++++++++++++++++++++++++++++++--- jopl.prj | Bin 4390 -> 4390 bytes kbd.c | 2 -- timer.c | 3 --- 6 files changed, 129 insertions(+), 15 deletions(-) diff --git a/jopl.c b/jopl.c index d2c41b4..c7de704 100755 --- a/jopl.c +++ b/jopl.c @@ -14,9 +14,10 @@ void f_adlib_write() { DROP(2); } +volatile int WAKE = 0; static void timer_callback() { - if (ontick.p) { - f_execcp(ontick); + if (adlib_read() & 0x20) { + WAKE = 1; } } @@ -53,9 +54,35 @@ void f_keydown() { TOP().i = keyIsDown(TOP().i); } -void do_repl(char *exe) { - char buf[128]; +char *gather_input() { + static char buf[128]; + static int ibuf = 0; + if (bioskey(1)) { + int key = bioskey(0); + char ch = key & 0xff; + if (ch == 0x08) { + if (ibuf > 0) { + printf("%c %c", ch, ch); + ibuf --; + } + } else { + buf[ibuf] = ch; + ibuf ++; + if (ch == 0x0d) { + printf("\n"); + buf[ibuf] = 0; + ibuf = 0; + return buf; + } else { + printf("%c", ch); + } + } + } + return NULL; +} + +void do_repl(char *exe) { adlib_init(); timer_init(TIMER_18HZ); @@ -78,13 +105,55 @@ void do_repl(char *exe) { f_taskloop(); while (!DONE) { - PUSHS(gets(buf)); - f_runstring("REPL send"); + char *buf = gather_input(); + if (buf) { + PUSHS(buf); + f_runstring("REPL send"); + } + if (WAKE) { + WAKE = 0; + if (ontick.p != NULL) { + f_execcp(ontick); + } + } f_taskloop(); } } +#define RIGHT 0x01 +#define LEFT 0x02 +#define CTRL 0x04 +#define ALT 0x08 + +void keything() { + int key, modifiers, done; + done = 0; + while (!done) { + /* function 1 returns 0 until a key is pressed */ + while (bioskey(1) == 0); + + /* function 0 returns the key that is waiting */ + key = bioskey(0); + + /* use function 2 to determine if shift keys were used */ + modifiers = bioskey(2); + if (modifiers) + { + printf("[%#02x", modifiers); + if (modifiers & RIGHT) printf(" RIGHT"); + if (modifiers & LEFT) printf(" LEFT"); + if (modifiers & CTRL) printf(" CTRL"); + if (modifiers & ALT) printf(" ALT"); + printf("]"); + } + /* print out the character read */ + printf("'%c' %#02x\n", key & 0xff, key); + if ((key & 0xff) == 'q') done = 1; + + } +} int main(int argc, char *argv[]) { +// keything(); do_repl(argv[0]); return 0; } \ No newline at end of file diff --git a/jopl.exe b/jopl.exe index a904c6fd52622c74f03d4eea41ed2ba63fdb5cdb..925e76da833f31dd8f23df94bf0480557bf7d05b 100755 GIT binary patch delta 11096 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

5K2#SZX)Cg%rdn`>*7RHJqrs5=mnQ^U6>pM$3{ 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 if drop cr else textx ! then ; +: emit-direct ( c -- ) + dup '\n' = if 0 textx ! 1 texty +! drop else + dup '\r' = if drop else + out-direct 1 +textx! then then ; + +: status + 0 textx ! 0 texty ! + s" V: " type voice @ . + s" O: " type octave @ . + s" T: " type songticks @ . + clearline ; + +: emit-status-cmd ( ip -- ip ) + dup ub@ swap 1 + swap + dup 0xf0 = if s" % " type then + dup 0xfd = if s" - " type then + dup 0xf0 < if dup emit-note then + dup 0xfe = if + 16 textattr +! + swap @ emit-status-cmd swap + -16 textattr +! + then drop ; + +: showtrack ( n -- ) + dup . s" : " type + track @ dup if 20 0 for emit-status-cmd next then drop + clearline ; + +: trackstatus cr voice @ showtrack ; var tempo 1 tempo ! : player @@ -178,7 +225,7 @@ var t2 t2 @ 0x03 adlib! 0x42 0x04 adlib! ; -: ontick adlib@ 0x20 & if startt2 player then ; +: ontick startt2 player status trackstatus ; : files findfile begin dup while yield findnext repeat ; @@ -199,7 +246,7 @@ var t2 75 key-pressed if -1 +voice! then 77 key-pressed if 1 +voice! then r@ execute - rest + suspend repeat key-end rdrop ; : nextnote ( ip -- ip ) @@ -215,10 +262,12 @@ var t2 dup if b! else drop drop then ; : record + 0x4f textattr ! :| ' setnote onkeynote 41 key-pressed if 0xfd setnote then 52 key-down if 0xf0 setnote then - |; dokeys ; + |; dokeys + 0x1f textattr ! ; : jam :| ' noteon onkeynote @@ -228,4 +277,5 @@ var t2 :noname 9 -1 for i voice ! default next startt2 + ' emit-direct task-emit ! ; ' onload redefine diff --git a/jopl.prj b/jopl.prj index 0fa12fffe15a287a3558c3c8975ac05ee5a10af7..bca732d6cc38d1dc0a50f961d1c538920292683b 100755 GIT binary patch delta 254 zcmZ3cv`lG(IvaCDMc-yEHY0X^F@}(eKEKI~3=FLd3=IC0vw36rg&9JDVuyfy4j|T> ze4RI*_i=Hb-$7;uhIpXL`IDXbszd+(pTOwI*vweQD8*>R5X<g5GTYFWRnnscSYaicz!XtXO&{B zoBa3~#2CatNZ&{~${ypW}Cw1xosP`3Lxb U1R>`7x(4ZaFn|?L))Dvx04NPl-v9sr delta 254 zcmZ3cv`lG(IvcZcaPMX