commit 459855d825456ce153c74cad4c959b42dec7644c
parent 0518385a6d466c4feaf7cd39495f9369dcdfe017
Author: neauoire <aliceffekt@gmail.com>
Date: Wed, 12 Jan 2022 18:40:51 -0800
Removed supervisor
Diffstat:
11 files changed, 26 insertions(+), 392 deletions(-)
diff --git a/TODO b/TODO
@@ -1,6 +0,0 @@
-# TODOs
-
-- Emulation controls should be handled by the supervisor.
-- Overlap the supervisor device page with the core device page.
-- The boot rom should display "no roms" when the list is empty.
--
diff --git a/build.sh b/build.sh
@@ -36,7 +36,6 @@ echo "Cleaning.."
rm -f ./bin/uxnasm
rm -f ./bin/uxnemu
rm -f ./bin/uxncli
-rm -f ./bin/supervisor.rom
rm -f ./bin/launcher.rom
rm -f ./bin/asma.rom
@@ -108,8 +107,6 @@ then
cp bin/uxnemu bin/uxnasm bin/uxncli $HOME/bin/
fi
-echo "Assembling(supervisor).."
-./bin/uxnasm projects/software/supervisor.tal bin/supervisor.rom
echo "Assembling(launcher).."
./bin/uxnasm projects/software/launcher.tal bin/launcher.rom
echo "Assembling(asma).."
diff --git a/projects/software/supervisor.tal b/projects/software/supervisor.tal
@@ -1,314 +0,0 @@
-( launcher )
-
-%+ { ADD } %- { SUB } %* { MUL } %/ { DIV }
-%< { LTH } %> { GTH } %= { EQU } %! { NEQ }
-%++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 }
-%<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 }
-
-%AUTO-X { #01 .Screen/auto DEO }
-%AUTO-Y { #02 .Screen/auto DEO }
-%AUTO-YADDR { #06 .Screen/auto DEO }
-
-%HALT { #010f DEO }
-%EMIT { #18 DEO }
-%PRINT { ;print-str JSR2 #0a EMIT }
-%DEBUG { ;print-hex/byte JSR2 #0a EMIT }
-%DEBUG2 { ;print-hex JSR2 #0a EMIT }
-
-%MODALW { #0024 }
-%MODALH { #0009 }
-
-%RTN { JMP2r }
-%2// { #01 SFT2 }
-%8** { #30 SFT2 }
-
-%SYS_EADDR { #fd04 }
-%SYS_ECODE { #fd06 }
-%SYS_DEBUG { #fd0e }
-%WST { #fe00 }
-%RST { #ff00 }
-
-( devices )
-
-|00 @System &vector $2 &wst $1 &rst $1 &eaddr $2 &ecode $1 &pad $1 &r $2 &g $2 &b $2 &debug $1 &halt $1
-|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1
-|80 @Controller &vector $2 &button $1 &key $1 &func $1
-
-( variables )
-
-|0000
-
-@center
- &x $2 &y $2
-@modal
- &x $2 &y $2
-
-( init )
-
-|0100 ( -> )
-
- .Screen/width DEI2 2//
- DUP2 .center/x STZ2
- MODALW #31 SFT2 -- .modal/x STZ2
- .Screen/height DEI2 2//
- DUP2 .center/y STZ2
- MODALH #31 SFT2 -- .modal/y STZ2
-
- ( vectors )
- ;on-error .System/vector DEO2
- ;on-frame .Screen/vector DEO2
- ;on-button .Controller/vector DEO2
-
- ( print initial memory )
- SYS_DEBUG LDA #00 = ,&no-debug JCN
- ;print-stacks JSR2
- &no-debug
-
-BRK
-
-@on-frame ( -> )
-
- ;draw-cross JSR2
- ;draw-stacks JSR2
-
-BRK
-
-@on-button ( -> )
-
- .Controller/func DEI DUP DEBUG
- DUP #02 ! ,&no-f2 JCN
- ;toggle-debugger JSR2
- &no-f2
- DUP #08 ! ,&no-f4 JCN
- ;reboot JSR2
- &no-f4
- POP
-
-BRK
-
-@on-error ( -> )
-
- ( background )
- #00 .Screen/auto DEO
- ;bg-icn .Screen/addr DEO2
- MODALH #0000
- &ver
- DUP2 8** .modal/y LDZ2 ++ .Screen/y DEO2
- MODALW #0000
- &hor
- DUP2 8** .modal/x LDZ2 ++ .Screen/x DEO2
- #42 .Screen/sprite DEO
- INC2 GTH2k ,&hor JCN
- POP2 POP2
- INC2 GTH2k ,&ver JCN
- POP2 POP2
-
- ( corners )
- ;corner-icn .Screen/addr DEO2
- .modal/x LDZ2 .Screen/x DEO2
- .modal/y LDZ2 .Screen/y DEO2
- #42 .Screen/sprite DEO
- .modal/x LDZ2 MODALW #0001 -- 8** ++ .Screen/x DEO2
- #52 .Screen/sprite DEO
-
- .modal/y LDZ2 MODALH #0001 -- 8** ++ .Screen/y DEO2
- #72 .Screen/sprite DEO
-
- .modal/x LDZ2 .Screen/x DEO2
- #62 .Screen/sprite DEO
-
- ( text )
- .modal/x LDZ2 #0010 ++ .Screen/x DEO2
- .modal/y LDZ2 #0010 ++ .Screen/y DEO2
- ;error-txts/0 #4f ;draw-str JSR2
-
- ;at-txt #4f ;draw-str JSR2
-
- SYS_EADDR LDA2 #47 ;draw-short JSR2
-
- #0000 SYS_EADDR STA2
-
-BRK
-
-@toggle-debugger ( -- )
-
- ( toggle debug )
- ( #fd0e STH2k LDA #00 = STH2r STA )
-
-RTN
-
-@reboot ( -- )
-
- ( clear devices/stacks )
- #fd00 #0300 ;mclr JSR2
-
- ( load rom )
-
-RTN
- &boot-path "launcher.rom $1
-
-@draw-stacks ( -- )
-
- AUTO-YADDR
- #0010 #0000
- &wst
- ( working stack )
- #0010 .Screen/y DEO2
- DUP2 #0018 ** #0010 ++ .Screen/x DEO2
- DUP #fe00 LDA ( ptr ) EQU #41 + STH
- DUP2 #fe01 ++ LDA STHr ;draw-byte JSR2
- ( return stack )
- #0028 .Screen/y DEO2
- DUP2 #0018 ** #0010 ++ .Screen/x DEO2
- DUP #ff00 LDA ( ptr ) EQU #41 + STH
- DUP2 #ff01 ++ LDA STHr ;draw-byte JSR2
- INC2 GTH2k ,&wst JCN
- POP2 POP2
-
-RTN
-
-@draw-cross ( -- )
-
- ( ver )
- AUTO-Y
- #0000 .Screen/y DEO2
- .center/x LDZ2 .Screen/x DEO2
- .Screen/height DEI2 #0000
- &ver
- #43 .Screen/pixel DEO
- .Screen/y DEI2k INC2 ROT DEO2
- INC2 GTH2k ,&ver JCN
- POP2 POP2
-
- ( hor )
- AUTO-X
- #0000 .Screen/x DEO2
- .center/y LDZ2 .Screen/y DEO2
- .Screen/width DEI2 #0000
- &hor
- #43 .Screen/pixel DEO
- .Screen/x DEI2k INC2 ROT DEO2
- INC2 GTH2k ,&hor JCN
- POP2 POP2
-
-RTN
-
-@draw-str ( text* color -- )
-
- AUTO-YADDR
- STH
- &while
- LDAk STHkr ,draw-char JSR
- INC2 LDAk ,&while JCN
- POP2
- POPr
-
-RTN
-
-@draw-short ( short* color -- )
-
- STH SWP STHkr ,draw-byte JSR
- STHr ,draw-byte JSR
-
-RTN
-
-@draw-byte ( byte color -- )
-
- STH
- DUP #04 SFT ,&parse JSR STHkr ,draw-char JSR
- #0f AND ,&parse JSR STHr ,draw-char JSR
-
-RTN
- &parse ( byte -- char ) DUP #09 GTH ,&above JCN #30 ADD JMP2r
- &above #57 ADD JMP2r
-
-@draw-char ( char color -- )
-
- SWP
- [ #20 - #00 SWP #40 SFT2 ;font ++ ] .Screen/addr DEO2
- .Screen/sprite DEOk DEO
- .Screen/x DEI2k #0008 ++ ROT DEO2
- .Screen/y DEI2k #0010 -- ROT DEO2
-
-JMP2r
-
-@mclr ( addr* len* -- )
-
- OVR2 ++ SWP2
- &loop
- STH2k #00 STH2r STA
- INC2 GTH2k ,&loop JCN
- POP2 POP2
-
-JMP2r
-
-@print-stacks ( -- )
-
- #0a EMIT
- WST ;&wst-txt ,print-stack JSR
- RST ;&rst-txt ,print-stack JSR
-
-RTN
- &wst-txt "Working-stack $1
- &rst-txt "Return-stack $1
-
-@print-stack ( addr* name* -- )
-
- PRINT
- ( keep ptr ) LDAk STH
- ( keep counter ) LITr 00
- ( skip ptr ) INC2
- DUP2 #0020 ++ SWP2
- &loop
- ( print cell )
- EQUkr STHr #3b * #20 + EMIT
- LDAk ;print-hex/byte JSR2
- EQUkr STHr #3d * #20 + EMIT
- ( break into columns )
- SUB2k #0001 -- #0007 AND2 #0000 !! ,&no-lb JCN
- #0a EMIT
- &no-lb
- INCr
- INC2 GTH2k ,&loop JCN
- POP2 POP2
- POP2r
-
-RTN
-
-@print-hex ( value* -- )
-
- SWP ,&byte JSR
- &byte ( byte -- )
- STHk #04 SFT ,&parse JSR #18 DEO
- STHr #0f AND ,&parse JSR #18 DEO
- JMP2r
- &parse ( byte -- char ) DUP #09 GTH ,&above JCN #30 ADD JMP2r
- &above #57 ADD JMP2r
-
-JMP2r
-
-@print-str ( string* -- )
-
- #0001 SUB2
- &while
- INC2 LDAk DUP #18 DEO ,&while JCN
- POP2
-
-JMP2r
-
-@error-txts
- &0 "Working-stack 20 "underflow $1
- &1 "Return-stack 20 "underflow $1
- &2 "Working-stack 20 "overflow $1
- &3 "Return-stack 20 "overflow $1
- &4 "Working-stack 20 "division 20 "by 20 "zero $1
- &5 "Return-stack 20 "division 20 "by 20 "zero $1
-@at-txt
- ', 20 "at 20 $1
-
-@bg-icn
- ffff ffff ffff ffff
-@corner-icn
- 1f7f 7fff ffff ffff
-
-~projects/assets/msx01x02.tal
-\ No newline at end of file
diff --git a/src/devices/file.c b/src/devices/file.c
@@ -150,7 +150,7 @@ file_deo(Device *d, Uint8 port)
case 0x5:
DEVPEEK16(a, 0x4);
DEVPEEK16(b, 0xa);
- res = file_stat(&bank1[a], b);
+ res = file_stat(&bank0[a], b);
DEVPOKE16(0x2, res);
break;
case 0x6:
@@ -159,19 +159,19 @@ file_deo(Device *d, Uint8 port)
break;
case 0x9:
DEVPEEK16(a, 0x8);
- res = file_init(&bank1[a]);
+ res = file_init(&bank0[a]);
DEVPOKE16(0x2, res);
break;
case 0xd:
DEVPEEK16(a, 0xc);
DEVPEEK16(b, 0xa);
- res = file_read(&bank1[a], b);
+ res = file_read(&bank0[a], b);
DEVPOKE16(0x2, res);
break;
case 0xf:
DEVPEEK16(a, 0xe);
DEVPEEK16(b, 0xa);
- res = file_write(&bank1[a], b, d->dat[0x7]);
+ res = file_write(&bank0[a], b, d->dat[0x7]);
DEVPOKE16(0x2, res);
break;
}
diff --git a/src/devices/file.h b/src/devices/file.h
@@ -12,4 +12,4 @@ WITH REGARD TO THIS SOFTWARE.
void file_deo(Device *d, Uint8 port);
-extern Uint8 *bank1;
-\ No newline at end of file
+extern Uint8 *bank0;
+\ No newline at end of file
diff --git a/src/devices/system.c b/src/devices/system.c
@@ -14,8 +14,6 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE.
*/
-Uxn supervisor;
-
static const char *errors[] = {
"Working-stack underflow",
"Return-stack underflow",
@@ -31,7 +29,6 @@ uxn_halt(Uxn *u, Uint8 error, Uint16 addr)
Uint16 vec = GETVECTOR(d);
DEVPOKE16(0x4, addr);
d->dat[0x6] = error;
- uxn_eval(&supervisor, GETVECTOR(&supervisor.dev[0]));
if(vec) {
/* need to rearm to run System/vector again */
d->dat[0] = 0;
@@ -50,8 +47,8 @@ Uint8
system_dei(Device *d, Uint8 port)
{
switch(port) {
- case 0x2: return d->u->wst->ptr;
- case 0x3: return d->u->rst->ptr;
+ case 0x2: return d->u->wst.ptr;
+ case 0x3: return d->u->rst.ptr;
default: return d->dat[port];
}
}
@@ -60,8 +57,8 @@ void
system_deo(Device *d, Uint8 port)
{
switch(port) {
- case 0x2: d->u->wst->ptr = d->dat[port]; break;
- case 0x3: d->u->rst->ptr = d->dat[port]; break;
+ case 0x2: d->u->wst.ptr = d->dat[port]; break;
+ case 0x3: d->u->rst.ptr = d->dat[port]; break;
default: system_deo_special(d, port);
}
}
diff --git a/src/devices/system.h b/src/devices/system.h
@@ -12,5 +12,3 @@ WITH REGARD TO THIS SOFTWARE.
Uint8 system_dei(Device *d, Uint8 port);
void system_deo(Device *d, Uint8 port);
void system_deo_special(Device *d, Uint8 port);
-
-extern Uxn supervisor;
diff --git a/src/uxn.c b/src/uxn.c
@@ -39,13 +39,13 @@ uxn_eval(Uxn *u, Uint16 pc)
Stack *src, *dst;
Device *dev;
if(!pc || u->dev[0].dat[0xf]) return 0;
- if(u->wst->ptr > 0xf8) u->wst->ptr = 0xf8;
+ if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8;
while((instr = u->ram[pc++])) {
/* Return Mode */
if(instr & 0x40) {
- src = u->rst; dst = u->wst;
+ src = &u->rst; dst = &u->wst;
} else {
- src = u->wst; dst = u->rst;
+ src = &u->wst; dst = &u->rst;
}
/* Keep Mode */
if(instr & 0x80) {
@@ -112,16 +112,13 @@ err:
/* clang-format on */
int
-uxn_boot(Uxn *u, Uint8 *ram, Uint8 *devices, Stack *wst, Stack *rst)
+uxn_boot(Uxn *u, Uint8 *ram)
{
Uint32 i;
char *cptr = (char *)u;
for(i = 0; i < sizeof(*u); i++)
cptr[i] = 0x00;
u->ram = ram;
- u->devices = devices;
- u->wst = wst;
- u->rst = rst;
return 1;
}
@@ -130,7 +127,6 @@ uxn_port(Uxn *u, Uint8 id, Uint8 (*deifn)(Device *d, Uint8 port), void (*deofn)(
{
Device *d = &u->dev[id];
d->u = u;
- d->dat = u->devices + id * 0x10;
d->dei = deifn;
d->deo = deofn;
return d;
diff --git a/src/uxn.h b/src/uxn.h
@@ -37,18 +37,18 @@ typedef struct {
typedef struct Device {
struct Uxn *u;
- Uint8 *dat, *mem;
+ Uint8 dat[16], *mem;
Uint8 (*dei)(struct Device *d, Uint8);
void (*deo)(struct Device *d, Uint8);
} Device;
typedef struct Uxn {
- Uint8 *ram, *devices;
- Stack *wst, *rst;
+ Uint8 *ram;
+ Stack wst, rst;
Device dev[16];
} Uxn;
-int uxn_boot(Uxn *u, Uint8 *ram, Uint8 *devices, Stack *wst, Stack *rst);
+int uxn_boot(Uxn *u, Uint8 *ram);
int uxn_eval(Uxn *u, Uint16 pc);
int uxn_halt(Uxn *u, Uint8 error, Uint16 addr);
int uxn_interrupt(Uxn *u);
diff --git a/src/uxncli.c b/src/uxncli.c
@@ -3,7 +3,7 @@
#include "uxn.h"
-Uint8 *bank0, *bank1;
+Uint8 *bank0;
#include "devices/system.h"
#include "devices/file.h"
@@ -23,6 +23,7 @@ WITH REGARD TO THIS SOFTWARE.
int
uxn_interrupt(Uxn *u)
{
+ (void)u;
return 0;
}
@@ -53,8 +54,8 @@ void
system_deo_special(Device *d, Uint8 port)
{
if(port == 0xe) {
- inspect(d->u->wst, "Working-stack");
- inspect(d->u->rst, "Return-stack");
+ inspect(&d->u->wst, "Working-stack");
+ inspect(&d->u->rst, "Return-stack");
}
}
@@ -118,8 +119,7 @@ static int
start(Uxn *u)
{
bank0 = (Uint8 *)calloc(0x10000, sizeof(Uint8));
- bank1 = (Uint8 *)calloc(0x10000, sizeof(Uint8));
- if(!uxn_boot(u, bank1, bank0 + PAGE_DEV, (Stack *)(bank0 + PAGE_WST), (Stack *)(bank0 + PAGE_RST)))
+ if(!uxn_boot(u, bank0))
return error("Boot", "Failed");
/* system */ uxn_port(u, 0x0, system_dei, system_deo);
/* console */ uxn_port(u, 0x1, nil_dei, console_deo);
diff --git a/src/uxnemu.c b/src/uxnemu.c
@@ -3,7 +3,7 @@
#include "uxn.h"
-Uint8 *bank0, *bank1;
+Uint8 *bank0;
#pragma GCC diagnostic push
#pragma clang diagnostic push
@@ -87,6 +87,7 @@ audio_finished_handler(UxnAudio *c)
int
uxn_interrupt(Uxn *u)
{
+ (void)u;
return 0;
}
@@ -261,10 +262,9 @@ load(Uxn *u, char *rom)
static int
start(Uxn *u, char *rom)
{
- bank1 = (Uint8 *)calloc(0x10000, sizeof(Uint8));
bank0 = (Uint8 *)calloc(0x10000, sizeof(Uint8));
- if(!uxn_boot(u, bank1, bank0 + PAGE_DEV, (Stack *)(bank0 + PAGE_WST), (Stack *)(bank0 + PAGE_RST)))
+ if(!uxn_boot(u, bank0))
return error("Boot", "Failed to start uxn.");
if(!load(u, rom))
return error("Boot", "Failed to load rom.");
@@ -285,21 +285,9 @@ start(Uxn *u, char *rom)
/* unused */ uxn_port(u, 0xe, nil_dei, nil_deo);
/* unused */ uxn_port(u, 0xf, nil_dei, nil_deo);
- /* Supervisor */
- if(!uxn_boot(&supervisor, bank0, bank0 + VISOR_DEV, (Stack *)(bank0 + VISOR_WST), (Stack *)(bank0 + VISOR_RST)))
- return error("Boot", "Failed to start uxn.");
- if(!load(&supervisor, "supervisor.rom"))
- error("Supervisor", "No debugger found.");
- /* system */ uxn_port(&supervisor, 0x0, system_dei, system_deo);
- /* console */ uxn_port(&supervisor, 0x1, nil_dei, console_deo);
- /* screen */ uxn_port(&supervisor, 0x2, screen_dei, screen_deo);
- /* control */ uxn_port(&supervisor, 0x8, nil_dei, nil_deo);
-
if(!uxn_eval(u, PAGE_PROGRAM))
return error("Boot", "Failed to start rom.");
- uxn_eval(&supervisor, PAGE_PROGRAM);
-
return 1;
}
@@ -358,22 +346,6 @@ get_button(SDL_Event *event)
}
static Uint8
-get_fkey(SDL_Event *event)
-{
- switch(event->key.keysym.sym) {
- case SDLK_F1: return 0x01;
- case SDLK_F2: return 0x02;
- case SDLK_F3: return 0x04;
- case SDLK_F4: return 0x08;
- case SDLK_F5: return 0x10;
- case SDLK_F6: return 0x20;
- case SDLK_F7: return 0x40;
- case SDLK_F8: return 0x80;
- }
- return 0x00;
-}
-
-static Uint8
get_button_joystick(SDL_Event *event)
{
return 0x01 << (event->jbutton.button & 0x3);
@@ -468,9 +440,6 @@ run(Uxn *u)
controller_down(devctrl, get_button(&event));
else
do_shortcut(u, &event);
- /* function keys are sent to supervisor */
- if(get_fkey(&event))
- controller_special(&supervisor.dev[0x8], get_fkey(&event));
ksym = event.key.keysym.sym;
if(SDL_PeepEvents(&event, 1, SDL_PEEKEVENT, SDL_KEYUP, SDL_KEYUP) == 1 && ksym == event.key.keysym.sym)
break;
@@ -490,8 +459,6 @@ run(Uxn *u)
else if(event.type == stdin_event)
console_input(u, event.cbutton.button);
}
- if(devsystem->dat[0xe])
- uxn_eval(&supervisor, GETVECTOR(&supervisor.dev[2]));
uxn_eval(u, GETVECTOR(devscreen));
if(uxn_screen.fg.changed || uxn_screen.bg.changed || devsystem->dat[0xe])
redraw();