diff --git a/.gitignore b/.gitignore index 91587d6..4c11873 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ *.dsk *.swp *.log +*.jim diff --git a/adlib.c b/adlib.c index 5547a4e..0c4fff7 100755 --- a/adlib.c +++ b/adlib.c @@ -1,8 +1,8 @@ -#include +#include "adlib.h" static void adlib_wait(int delay) { int i; - for (i = 0; i < delay; i ++) inp(0x388); + for (i = 0; i < delay; i ++) adlib_read(); } void adlib_write(int reg, int val) { @@ -12,3 +12,15 @@ void adlib_write(int reg, int val) { outp(0x389, val); adlib_wait(35); } + +void adlib_reset() { + int i; + for (i = 0; i < 0xff; i ++) { + adlib_write(i, 0); + } +} + +void adlib_init() { + adlib_reset(); + atexit(adlib_reset); +} diff --git a/adlib.h b/adlib.h index ab352f5..009857f 100755 --- a/adlib.h +++ b/adlib.h @@ -1 +1,6 @@ -void adlib_write(int reg, int val); \ No newline at end of file +#include + +void adlib_init(); +#define adlib_read() inp(0x388) +void adlib_write(int reg, int val); +void adlib_reset(); \ No newline at end of file diff --git a/boot.jim b/boot.jim deleted file mode 100755 index d20f40f..0000000 Binary files a/boot.jim and /dev/null differ diff --git a/defs.jim b/defs.jim deleted file mode 100755 index 6af2d25..0000000 Binary files a/defs.jim and /dev/null differ diff --git a/entity.jim b/entity.jim deleted file mode 100755 index a03576f..0000000 Binary files a/entity.jim and /dev/null differ diff --git a/footer.jim b/footer.jim deleted file mode 100755 index 495c985..0000000 Binary files a/footer.jim and /dev/null differ diff --git a/game.jim b/game.jim deleted file mode 100755 index d58ed85..0000000 Binary files a/game.jim and /dev/null differ diff --git a/input.jim b/input.jim deleted file mode 100755 index 6b942a2..0000000 Binary files a/input.jim and /dev/null differ diff --git a/jazzbass.sbi b/jazzbass.sbi new file mode 100755 index 0000000..eefdfdf Binary files /dev/null and b/jazzbass.sbi differ diff --git a/jeanne.jim b/jeanne.jim deleted file mode 100755 index 64854b2..0000000 Binary files a/jeanne.jim and /dev/null differ diff --git a/jopl.c b/jopl.c new file mode 100755 index 0000000..e38234e --- /dev/null +++ b/jopl.c @@ -0,0 +1,55 @@ +#include "jorth.h" +#include "adlib.h" +#include "kbd.h" +#include "timer.h" + +cell ontick = 0; +void f_adlib_read() { + PUSHU(adlib_read()); +} + +void f_adlib_write() { + adlib_write(TOP().u & 0xff, ST1().u & 0xff); + DROP(2); +} + +static void timer_callback() { + if (ontick.p) { + f_execcp(ontick); + } +} + +int DONE = 0; +static void f_quit() { + DONE = 1; +} + +void do_repl() { + char buf[128]; + + adlib_init(); + + timer_init(TIMER_18HZ); + f_init(); + + CDEF("quit", f_quit); + CDEF("adlib!", f_adlib_write); + CDEF("adlib@", f_adlib_read); + + f_loadfile("jopl.jor"); + ontick = f_lookupcp("ontick"); + timer_setcallback(timer_callback); + + f_taskloop(); + + while (!DONE) { + PUSHS(gets(buf)); + f_runstring("REPL send"); + f_taskloop(); + } +} + +int main() { + do_repl(); + return 0; +} \ No newline at end of file diff --git a/jopl.exe b/jopl.exe new file mode 100755 index 0000000..1c59a48 Binary files /dev/null and b/jopl.exe differ diff --git a/jopl.jor b/jopl.jor new file mode 100755 index 0000000..9a091ce --- /dev/null +++ b/jopl.jor @@ -0,0 +1,152 @@ +' putc task-emit ! + +: start-repl activate ' putc task-emit ! + s" .:: J O P L ( jean OPL2 print loop) ::." type cr + begin receive loadstring s" ok" type cr again ; +task const REPL +REPL start-repl + +var voice +var op + +: op-with-voice voice @ + dup 2 > if 5 + then + dup 5 > if 5 + then + + op @ + ; +: opreg create b, does> ub@ op-with-voice ; +: voicereg create b, does> ub@ voice @ + ; + +0x20 opreg ar-flags +0x40 opreg ar-level +0x60 opreg ar-ad +0x80 opreg ar-sr +0xe0 opreg ar-wave +0xc0 voicereg ar-alg + +0xa0 voicereg ar-freq +0xb0 voicereg ar-note + +: op2 3 op ! ; +: op1 0 op ! ; +: loadop ( flags level ad sr wave -- ) + ar-wave adlib! + ar-sr adlib! + ar-ad adlib! + ar-level adlib! + ar-flags adlib! ; + +: readop ( v -- ) + r> r@ 4 + b@ r@ 3 + b@ r@ 2 + b@ r@ 1 + b@ r< b@ loadop ; + +: instrument ( alg f1 l1 ad1 sr1 w1 f2 l2 ad2 sr2 w2 -- ) + create b, b, b, b, b, b, b, b, b, b, b, does> + dup dup 5 + op1 readop op2 readop + 10 + b@ ar-alg adlib! ; + +0 0x01 0x10 0xf0 0x77 0 0x01 0x00 0xf0 0x77 0 instrument default + +: freqon ( oct freq -- ) + dup 0xff & ar-freq adlib! + 8 >> 0x03 & swap 2 << | 0x20 | ar-note adlib! ; +: noteoff ( -- ) 0 ar-note adlib! ; + +array semitones +3520 3520 />ratio , +3729 3520 />ratio , +3951 3520 />ratio , +4186 3520 />ratio , +4435 3520 />ratio , +4699 3520 />ratio , +4978 3520 />ratio , +5274 3520 />ratio , +5588 3520 />ratio , +5920 3520 />ratio , +6272 3520 />ratio , +6645 3520 />ratio , + +: note dup 12 / 8 % swap 12 % cells semitones + @ 440 swap * ub@ octave @ 12 * + notestate @ if b, else noteon rest then ; +: %loop 0xfe b, , ; +: % notestate @ if 0xf0 b, else rest then ; +: %% 0 for % next ; +: %- notestate @ if 0xfd b, else noteoff then ; +: %do 0xff b, , ; +0 mknote A +1 mknote A# +2 mknote B +3 mknote C +4 mknote C# +5 mknote D +6 mknote D# +7 mknote E +8 mknote F +9 mknote F# +10 mknote G +11 mknote G# + +array tracks 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , + +: track ( i -- p ) cells tracks + ; +: dotrack ( ip -- ip ) + dup if dup 1 + swap ub@ r> + r@ 0xff = if dup @ swap cell + swap execute then + r@ 0xfe = if @ dotrack then + r@ 0xfd = if noteoff then + r@ 0xf0 < if r@ noteon then + rdrop then ; + +: track-tick ( i -- ) + track dup @ dotrack swap ! ; + +: :track create here 1 notestate ! does> voice @ track ! ; +: ;track %loop 0 notestate ! ; +: shush 0 voice @ track ! %- ; + +: player + songticks @ 1 + songticks ! + voice @ + 0 10 for i voice ! i track-tick next + voice ! ; + +var t2 +: startt2 + 0x60 0x04 adlib! + 0x80 0x04 adlib! + t2 @ 0x03 adlib! + 0x42 0x04 adlib! ; + +: ontick adlib@ 0x20 & if startt2 player then ; + +:noname + default + startt2 +; ' onload redefine diff --git a/jopl.prj b/jopl.prj new file mode 100755 index 0000000..8d074c1 Binary files /dev/null and b/jopl.prj differ diff --git a/jorth.c b/jorth.c index 4e649d0..194636a 100755 --- a/jorth.c +++ b/jorth.c @@ -153,6 +153,10 @@ void f_bget() { TOP().i = *((char*)TOP().p); } +void f_ubget() { + TOP().u = *((unsigned char*)TOP().p); +} + void f_bset() { char *p = (char*)TOP().p; DROP(1); @@ -1060,6 +1064,7 @@ void f_init() { CDEF("!", f_set); CDEF("+!", f_addset); CDEF("b@", f_bget); + CDEF("ub@", f_ubget); CDEF("b!", f_bset); CDEF("dup", f_dup); CDEF("over", f_over); @@ -1129,6 +1134,22 @@ void f_init() { f_loadfile("defs.jor"); } +cell f_lookupcp(char *name) { + cell result = {0}; + PUSHS(name); + f_lookup(); + if (TOP().u) { + result = ST1(); + } + DROP(2); + return result; +} + +void f_execcp(cell cp) { + PUSHC(cp); + f_cexecute(); +} + int DIE = 0; void f_quit() { DIE = 1; diff --git a/jorth.h b/jorth.h index 6978187..0b9b8b2 100755 --- a/jorth.h +++ b/jorth.h @@ -66,6 +66,9 @@ void f_cdef(); // func name -- void f_doconst(); void f_compileword(); +cell f_lookupcp(char *name); +void f_execcp(cell cp); + #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/map.jim b/map.jim deleted file mode 100755 index 81329f3..0000000 Binary files a/map.jim and /dev/null differ diff --git a/pete.jim b/pete.jim deleted file mode 100755 index 0b99ebc..0000000 Binary files a/pete.jim and /dev/null differ diff --git a/petehous.jim b/petehous.jim deleted file mode 100755 index bfca453..0000000 Binary files a/petehous.jim and /dev/null differ diff --git a/repl.jim b/repl.jim deleted file mode 100755 index bd663f3..0000000 Binary files a/repl.jim and /dev/null differ diff --git a/road.jim b/road.jim deleted file mode 100755 index 8abf566..0000000 Binary files a/road.jim and /dev/null differ diff --git a/state.jim b/state.jim deleted file mode 100755 index 6462f1b..0000000 Binary files a/state.jim and /dev/null differ diff --git a/temp.jor b/temp.jor deleted file mode 100755 index 35ca569..0000000 --- a/temp.jor +++ /dev/null @@ -1,13 +0,0 @@ -: interpretword F_IMMEDIATE & state not or if execute else , then ; -: compileword lookup dup - if interpretword - else drop dup number - if swap drop interpretnumber - else drop interpretunknown - then - then ; -: interpreter - begin word dup b@ while compileword repeat - s" ok\n" type drop ; -: loadstring -: loadfile diff --git a/testbed.c b/testbed.c index 725b527..ebdc8b4 100755 --- a/testbed.c +++ b/testbed.c @@ -195,7 +195,7 @@ void f_drawportrait() { } void f_adlib() { - adlib_write(ST1().u, TOP().u); + adlib_write(TOP().u, ST1().u); DROP(2); } diff --git a/timer.c b/timer.c index 283bd46..ff58f76 100755 --- a/timer.c +++ b/timer.c @@ -9,12 +9,18 @@ volatile unsigned int timer_counter = 0; static void interrupt (*oldTimerISR)() = NULL; +static void (*callback)() = NULL; static void interrupt timer_isr() { timer_counter ++; + if (callback) callback(); oldTimerISR(); } +void timer_setcallback(void (*cb)()) { + callback = cb; +} + void timer_setrate(unsigned int rate) { outp(REG_8253_CTL, 0x3c); outp(REG_COUNTER0, rate & 0xff); diff --git a/timer.h b/timer.h index e896905..9d804be 100755 --- a/timer.h +++ b/timer.h @@ -9,3 +9,4 @@ extern volatile unsigned int timer_counter; void timer_init(unsigned int rate); void timer_setrate(unsigned int rate); +void timer_setcallback(void (*cb)()); diff --git a/timer.jim b/timer.jim deleted file mode 100755 index 6a5cce7..0000000 Binary files a/timer.jim and /dev/null differ diff --git a/trail1.jim b/trail1.jim deleted file mode 100755 index 6d2d743..0000000 Binary files a/trail1.jim and /dev/null differ