From 38db6f71f320c4c034fa2f8d85af97773e84945c Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Wed, 8 May 2019 20:37:40 -0400 Subject: [PATCH] jopl: implement interactive instrument loading menu --- defs.jor | 9 +++++ jopl.c | 11 ++++++ jopl.exe | Bin 64399 -> 67056 bytes jopl.jor | 100 +++++++++++++++++++++++++++++++++++++++++++++---------- jopl.prj | Bin 4390 -> 4547 bytes jorth.c | 19 +++++++++-- jorth.h | 2 +- 7 files changed, 121 insertions(+), 20 deletions(-) diff --git a/defs.jor b/defs.jor index a350ed7..2d889d2 100755 --- a/defs.jor +++ b/defs.jor @@ -64,6 +64,8 @@ : min ( x y -- x|y ) 2dup > if swap then drop ; : max ( x y -- x|y ) 2dup < if swap then drop ; +: +!pos ( n var -- ) dup @ dup @ here! @@ -73,6 +75,13 @@ : intern create latest wordname , does> @ ; +: preserving ( cp 0 vars... -- ) + 0 r> begin dup while dup @ r> r> repeat drop + execute + begin r@ while r< r< swap ! repeat rdrop ; +: preserve ( cp var -- ) 0 swap preserves ; + + : decompile word lookup if 1 begin ( cp i ) 2dup cells + @ ( cp i @cp+i ) diff --git a/jopl.c b/jopl.c index ac35f94..9c91e24 100755 --- a/jopl.c +++ b/jopl.c @@ -3,6 +3,7 @@ #include "adlib.h" #include "kbd.h" #include "timer.h" +#include "serial.h" cell ontick = 0; void f_adlib_read() { @@ -64,12 +65,22 @@ char *gather_input() { return NULL; } +void f_seremit() { + ser_write_byte(TOP().i); + if (TOP().i == '\n') { + ser_write_byte('\r'); + } + DROP(1); +} + void do_repl(char *exe) { adlib_init(); timer_init(TIMER_18HZ); f_init(exe); + ser_init(SER_COM2, BAUD_19200, SER_8N1); + CDEF("seremit", f_seremit); CDEF("_quit", f_quit); CDEF("adlib!", f_adlib_write); CDEF("adlib@", f_adlib_read); diff --git a/jopl.exe b/jopl.exe index 735eb43af0fa3c671b58e54daf9b1c8ed1881817..400eb976cfcbfb44b87af001d9d0edbdc0cdff26 100755 GIT binary patch delta 26993 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 + for dup i 1 << 1 + 0xb800 b!far next drop ; + : clearline textattr @ 8 << texty @ 80 * textx @ + @@ -180,12 +191,15 @@ var textattr : +textx! ( n -- ) textx @ + dup 80 >= if drop cr else textx ! then ; : emit-direct ( c -- ) - dup '\n' = if 0 textx ! 1 texty +! drop else + dup '\n' = if textleft @ textx ! 1 texty +! drop else dup '\r' = if drop else out-direct 1 +textx! then then ; +: rpad ( n -- ) + textleft @ + textx @ for bl next ; + : status - 0 textx ! 0 texty ! + 0 textx ! 0 texty ! 0 textleft ! s" V: " type voice @ . s" O: " type octave @ . s" T: " type songticks @ . @@ -225,7 +239,7 @@ var t2 t2 @ 0x03 adlib! 0x42 0x04 adlib! ; -: ontick startt2 player status trackstatus ; +: ontick startt2 player ' status 0 textleft textx texty preserving ( trackstatus ) ; : keynote [ inline| 44 b, 31 b, 45 b, 32 b, 46 b, 47 b, 34 b, 48 b, 35 b, 49 b, 36 b, 50 b, @@ -236,16 +250,18 @@ var t2 : onkeynote ( cp -- ) keynote dup if oct+ swap execute else drop drop then ; +var stopkeys +: stoponesc 1 key-pressed if 1 stopkeys ! then ; +: voicekeys + 78 key-pressed if 1 octave +! then + 74 key-pressed if -1 octave +! then + 75 key-pressed if -1 +voice! then + 77 key-pressed if 1 +voice! then ; + : dokeys ( cp -- ) - r> key-start begin - key-debounce 1 key-pressed not while - 78 key-pressed if 1 octave +! then - 74 key-pressed if -1 octave +! then - 75 key-pressed if -1 +voice! then - 77 key-pressed if 1 +voice! then - r@ execute - suspend - repeat key-end rdrop ; + r> 0 stopkeys ! key-start begin + key-debounce r@ execute suspend + stopkeys @ until key-end rdrop ; : nextnote ( ip -- ip ) dup if @@ -261,16 +277,66 @@ var t2 : record 0x4f textattr ! - :| ' setnote onkeynote + :| stoponesc voicekeys + ' setnote onkeynote 41 key-pressed if 0xfd setnote then 52 key-down if 0xf0 setnote then |; dokeys 0x1f textattr ! ; -: jam - :| ' noteon onkeynote - 41 key-pressed if noteoff then - |; dokeys ; +: jamkeys + stoponesc voicekeys + ' noteon onkeynote + 41 key-pressed if noteoff then ; + +: jam ' jamkeys dokeys ; + +var menuscroll +var menuy + +: menu-at ( cp x y -- ) + :| texty ! dup textx ! textleft ! ' emit-direct task-emit ! + 0 menuscroll ! 0 menuy ! + execute |; + 0 textleft task-emit preserving ; + +: menu-lines ( -- count ) 24 texty @ - ; +: menu-skip menuscroll @ 0 max ; +: menu-selectedy menuy @ menu-skip - texty @ + ; +: draw-menu ( cp -- ) 0 texty textattr preserving ; + +: menuitem-bg ( w attr -- ) + :| menu-selectedy texty ! + textleft @ textx ! + textattr ! setattr-to |; + 0 texty textx textattr preserving ; + +: deselect-menu ( w -- ) 0x1f menuitem-bg ; +: select-menu ( w -- ) 0x30 menuitem-bg ; + +: key-menu ( w -- redraw ) + :| + 0 r> + 72 key-pressed if dup deselect-menu -1 menuy +!pos dup select-menu then + 80 key-pressed if dup deselect-menu 1 menuy +!pos dup select-menu then + 73 key-pressed if rdrop 1 r> -10 menuscroll +!pos then + 81 key-pressed if rdrop 1 r> 10 menuscroll +!pos then + drop r< + |; draw-menu ; + +: draw-filemenu ( glob -- ) + :| findfile + menu-skip 0 for drop nextfile next + menu-lines 0 for dup if type else drop then 13 rpad cr nextfile next + drop |; draw-menu ; + +: filemenu ( glob -- filename ) + :| dup draw-filemenu 13 select-menu + :| jamkeys + 13 key-menu if dup draw-filemenu then + 28 key-pressed if ( todo: get filename ) 1 stopkeys ! then + |; dokeys + |; 66 1 menu-at ; :noname 9 -1 for i voice ! default next diff --git a/jopl.prj b/jopl.prj index 2dabce4a118d7ba5bd9a297d2a97a8178108fe80..9d1b09f6e63e465e9f8caef40b6e0382d2d92f7f 100755 GIT binary patch delta 506 zcmYjO%_~Gv6#v~fZ=S&$GYp2sL@0T9z8N2zVMeAgFJ`1BBe7DHjbeo?B*o^Agp|e5 zD2ovrONo`#`~%j?QrTYT%}3mibIv`T-}(66>xSpXbhBbvN~Z2LWma(=NTBt$zHNy7 z0_SSXRYYDl;>ncJ*F=^d_~1f~F@?wME6mDY>?@i~F{Rj>JO0CxCmM(ZeUtha!hv|f z<{4?Ewj333!9pQ5n5V@1WNHjJ;bUbBp*5-21WV(RCT*}w=8**ZU>Wv+PyFDO3Gv8o z*(zzyyi8_0=%o#)P_TP*Wmr*fi&vK*l1%Zhvbt>*-)9MGOrJo6E*;DS!+{83LlI8X zSB5Q%D9%bbEC1yn(DHv5*PcFT9}WhCy>)QGA1BQ zbb$`=2FJ2fgf@?i(5RoN%GTlU4tIs{(O3BVlfhBySeS!xm$ThsPBrZeTBvV+;hbt2 mK_$&Tj3ErdivjebkJ#uzH@eV?4(Mn{8(N|9MY&2A0{8`-vXgxP delta 436 zcmZ9I&o2W(6vw}_ZP%);YAPxuNd0bgDJO2*ZNq8}SwE5{6&EMH3QkCzTtti?DHn-E zBGOa{cfrk_zra6$^LSeaiT5Ti^WJ>s``*k`=VkP!SM?l~OLsAKK@GPlKoGC1TYMeA z)+&Ua537^}FmiFi-=n~@1yqF8^UNpmfgAtr)@a*03Ec8LM!qEf$Pk1Ne| z5?9(3Md@ZM?3=x@2X@8In3NybXC~WWYpjK`MRto#43h&oR9syib00diLX#g~w47R+?cZ>NZ?s)+lBM8s`1n{jM2 z=ay+|J~{2oO$a^IB7C8K4-G1kp_$PUgh+oFNep2S1`-%R95M8x554F?H@e9G8NC5N D^dfZ$ diff --git a/jorth.c b/jorth.c index b74f752..4e63e4a 100755 --- a/jorth.c +++ b/jorth.c @@ -427,6 +427,14 @@ void f_printstack() { } } +void f_printrstack() { + cell *v = RUNNING + RSTACK_OFFSET; + while (v != rstack) { + PUSHC(*v++); + f_dot(); + } +} + void f_cr() { PUSHI('\n'); f_emit(); @@ -761,9 +769,9 @@ struct ffblk findfile; void f_findfirst() { int result = findfirst(TOP().s, &findfile, 0); if (result == 0) { - PUSHS(findfile.ff_name); + TOP().s = findfile.ff_name; } else { - PUSHU(0); + TOP().u = 0; } } @@ -776,6 +784,11 @@ void f_findnext() { } } +void f_chdir() { + chdir(TOP().s); + DROP(1); +} + void f_swapinput() { cell *key = RUNNING + TASK_USER_KEY; cell *keysrc = RUNNING + TASK_USER_KEYSRC; @@ -1152,6 +1165,7 @@ void f_init(char *exe) { CDEF("u.", f_udot); CDEF("type", f_puts); CDEF(".s", f_printstack); + CDEF(".rs", f_printrstack); CDEF(",", f_comma); CDEF("b,", f_bcomma); CDEF("open", f_open); @@ -1171,6 +1185,7 @@ void f_init(char *exe) { CDEF("fread", f_fread); CDEF("findfile", f_findfirst); CDEF("nextfile", f_findnext); + CDEF("chdir", f_chdir); CDEF("imagefilename", f_imagefilename); CDEF("image-uptodate", f_image_up_to_date); CDEF("loadimage", f_loadimage); diff --git a/jorth.h b/jorth.h index 473fcdf..e5b1d87 100755 --- a/jorth.h +++ b/jorth.h @@ -2,7 +2,7 @@ #define MEM_SIZE 16384 #define STACK_SIZE 64 -#define RSTACK_SIZE 32 +#define RSTACK_SIZE 64 void f_init(char *exe);