JOPL status bar, remove jorth from ISR (for now??)
This commit is contained in:
parent
4fcf03fd07
commit
6c4e5ff396
81
jopl.c
81
jopl.c
|
@ -14,9 +14,10 @@ void f_adlib_write() {
|
||||||
DROP(2);
|
DROP(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
volatile int WAKE = 0;
|
||||||
static void timer_callback() {
|
static void timer_callback() {
|
||||||
if (ontick.p) {
|
if (adlib_read() & 0x20) {
|
||||||
f_execcp(ontick);
|
WAKE = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,9 +54,35 @@ void f_keydown() {
|
||||||
TOP().i = keyIsDown(TOP().i);
|
TOP().i = keyIsDown(TOP().i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_repl(char *exe) {
|
char *gather_input() {
|
||||||
char buf[128];
|
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();
|
adlib_init();
|
||||||
|
|
||||||
timer_init(TIMER_18HZ);
|
timer_init(TIMER_18HZ);
|
||||||
|
@ -78,13 +105,55 @@ void do_repl(char *exe) {
|
||||||
f_taskloop();
|
f_taskloop();
|
||||||
|
|
||||||
while (!DONE) {
|
while (!DONE) {
|
||||||
PUSHS(gets(buf));
|
char *buf = gather_input();
|
||||||
f_runstring("REPL send");
|
if (buf) {
|
||||||
|
PUSHS(buf);
|
||||||
|
f_runstring("REPL send");
|
||||||
|
}
|
||||||
|
if (WAKE) {
|
||||||
|
WAKE = 0;
|
||||||
|
if (ontick.p != NULL) {
|
||||||
|
f_execcp(ontick);
|
||||||
|
}
|
||||||
|
}
|
||||||
f_taskloop();
|
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[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
// keything();
|
||||||
do_repl(argv[0]);
|
do_repl(argv[0]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
58
jopl.jor
58
jopl.jor
|
@ -97,7 +97,7 @@ var songticks
|
||||||
var notestate
|
var notestate
|
||||||
var octave
|
var octave
|
||||||
: oct+ octave @ 12 * + ;
|
: oct+ octave @ 12 * + ;
|
||||||
: rest songticks @ begin dup songticks @ != until drop ;
|
: rest songticks @ begin suspend dup songticks @ != until drop ;
|
||||||
: beat begin dup songticks @ swap % 0 != while rest repeat drop ;
|
: beat begin dup songticks @ swap % 0 != while rest repeat drop ;
|
||||||
: %O octave ! ;
|
: %O octave ! ;
|
||||||
: %V voice ! ;
|
: %V voice ! ;
|
||||||
|
@ -161,6 +161,53 @@ array tracks 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
|
||||||
'name :track type bl swap type bl
|
'name :track type bl swap type bl
|
||||||
begin dup ub@ emit-cmd while 1 + repeat drop ;
|
begin dup ub@ emit-cmd while 1 + repeat drop ;
|
||||||
|
|
||||||
|
var textx
|
||||||
|
var texty
|
||||||
|
var textattr
|
||||||
|
0x1f textattr !
|
||||||
|
|
||||||
|
: out-direct ( c -- )
|
||||||
|
textattr @ 8 << |
|
||||||
|
texty @ 160 * textx @ 1 << +
|
||||||
|
0xb800 !far ;
|
||||||
|
|
||||||
|
: clearline
|
||||||
|
textattr @ 8 <<
|
||||||
|
texty @ 80 * textx @ +
|
||||||
|
texty @ 1 + 80 *
|
||||||
|
for dup i 1 << 0xb800 !far next drop ;
|
||||||
|
|
||||||
|
: +textx! ( n -- )
|
||||||
|
textx @ + dup 80 >= 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 !
|
var tempo 1 tempo !
|
||||||
: player
|
: player
|
||||||
|
@ -178,7 +225,7 @@ var t2
|
||||||
t2 @ 0x03 adlib!
|
t2 @ 0x03 adlib!
|
||||||
0x42 0x04 adlib! ;
|
0x42 0x04 adlib! ;
|
||||||
|
|
||||||
: ontick adlib@ 0x20 & if startt2 player then ;
|
: ontick startt2 player status trackstatus ;
|
||||||
|
|
||||||
: files findfile begin dup while yield findnext repeat ;
|
: files findfile begin dup while yield findnext repeat ;
|
||||||
|
|
||||||
|
@ -199,7 +246,7 @@ var t2
|
||||||
75 key-pressed if -1 +voice! then
|
75 key-pressed if -1 +voice! then
|
||||||
77 key-pressed if 1 +voice! then
|
77 key-pressed if 1 +voice! then
|
||||||
r@ execute
|
r@ execute
|
||||||
rest
|
suspend
|
||||||
repeat key-end rdrop ;
|
repeat key-end rdrop ;
|
||||||
|
|
||||||
: nextnote ( ip -- ip )
|
: nextnote ( ip -- ip )
|
||||||
|
@ -215,10 +262,12 @@ var t2
|
||||||
dup if b! else drop drop then ;
|
dup if b! else drop drop then ;
|
||||||
|
|
||||||
: record
|
: record
|
||||||
|
0x4f textattr !
|
||||||
:| ' setnote onkeynote
|
:| ' setnote onkeynote
|
||||||
41 key-pressed if 0xfd setnote then
|
41 key-pressed if 0xfd setnote then
|
||||||
52 key-down if 0xf0 setnote then
|
52 key-down if 0xf0 setnote then
|
||||||
|; dokeys ;
|
|; dokeys
|
||||||
|
0x1f textattr ! ;
|
||||||
|
|
||||||
: jam
|
: jam
|
||||||
:| ' noteon onkeynote
|
:| ' noteon onkeynote
|
||||||
|
@ -228,4 +277,5 @@ var t2
|
||||||
:noname
|
:noname
|
||||||
9 -1 for i voice ! default next
|
9 -1 for i voice ! default next
|
||||||
startt2
|
startt2
|
||||||
|
' emit-direct task-emit !
|
||||||
; ' onload redefine
|
; ' onload redefine
|
||||||
|
|
2
kbd.c
2
kbd.c
|
@ -19,7 +19,6 @@ static void interrupt kbd_isr() {
|
||||||
char ctl;
|
char ctl;
|
||||||
|
|
||||||
disable();
|
disable();
|
||||||
*((int far*)MK_FP(0xb800, 0)) = 0x0165;
|
|
||||||
|
|
||||||
raw = inp(0x60);
|
raw = inp(0x60);
|
||||||
ctl = inp(0x61) | 0x82;
|
ctl = inp(0x61) | 0x82;
|
||||||
|
@ -34,7 +33,6 @@ static void interrupt kbd_isr() {
|
||||||
kbd_triggered = raw;
|
kbd_triggered = raw;
|
||||||
outp(0x20, 0x20);
|
outp(0x20, 0x20);
|
||||||
enable();
|
enable();
|
||||||
*((int far*)MK_FP(0xb800, 0)) = 0x0166 + (raw % 4);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char kbd_wait() {
|
unsigned char kbd_wait() {
|
||||||
|
|
3
timer.c
3
timer.c
|
@ -13,13 +13,10 @@ static void (*callback)() = NULL;
|
||||||
|
|
||||||
static void interrupt timer_isr() {
|
static void interrupt timer_isr() {
|
||||||
disable();
|
disable();
|
||||||
*((int far*)MK_FP(0xb800, 2)) = 0x0165;
|
|
||||||
timer_counter ++;
|
timer_counter ++;
|
||||||
if (callback) callback();
|
if (callback) callback();
|
||||||
enable();
|
enable();
|
||||||
*((int far*)MK_FP(0xb800, 2)) = 0x0166;
|
|
||||||
oldTimerISR();
|
oldTimerISR();
|
||||||
*((int far*)MK_FP(0xb800, 2)) = 0x0167;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void timer_setcallback(void (*cb)()) {
|
void timer_setcallback(void (*cb)()) {
|
||||||
|
|
Loading…
Reference in a new issue