Starting debugger cli
This commit is contained in:
parent
75b0fd06d9
commit
de22c37e07
19
build.sh
19
build.sh
|
@ -5,17 +5,22 @@ mkdir -p bin
|
|||
|
||||
# Assembler
|
||||
clang-format -i assembler.c
|
||||
rm -f ./assembler
|
||||
rm -f ./boot.rom
|
||||
rm -f ./bin/assembler
|
||||
rm -f ./bin/boot.rom
|
||||
cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined assembler.c -o bin/assembler
|
||||
./bin/assembler examples/hello.usm bin/boot.rom
|
||||
|
||||
# Emulator
|
||||
clang-format -i emulator.c
|
||||
# Cli
|
||||
clang-format -i cli.c
|
||||
clang-format -i uxn.h
|
||||
clang-format -i uxn.c
|
||||
rm -f ./uxn
|
||||
cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined uxn.c emulator.c -L/usr/local/lib -lSDL2 -o bin/emulator
|
||||
rm -f ./bin/cli
|
||||
cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined uxn.c cli.c -o bin/cli
|
||||
|
||||
# Emulator
|
||||
# clang-format -i emulator.c
|
||||
# rm -f ./bin/emulator
|
||||
# cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined uxn.c emulator.c -L/usr/local/lib -lSDL2 -o bin/emulator
|
||||
|
||||
# run
|
||||
./bin/emulator bin/boot.rom
|
||||
./bin/cli bin/boot.rom
|
||||
|
|
|
@ -0,0 +1,94 @@
|
|||
#include <stdio.h>
|
||||
|
||||
/*
|
||||
Copyright (c) 2021 Devine Lu Linvega
|
||||
|
||||
Permission to use, copy, modify, and distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "uxn.h"
|
||||
|
||||
int
|
||||
error(char *msg, const char *err)
|
||||
{
|
||||
printf("Error %s: %s\n", msg, err);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
console_onread(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
console_onwrite(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
echos(Stack8 *s, Uint8 len, char *name)
|
||||
{
|
||||
int i;
|
||||
printf("\n%s\n", name);
|
||||
for(i = 0; i < len; ++i) {
|
||||
if(i % 16 == 0)
|
||||
printf("\n");
|
||||
printf("%02x%c", s->dat[i], s->ptr == i ? '<' : ' ');
|
||||
}
|
||||
printf("\n\n");
|
||||
}
|
||||
|
||||
void
|
||||
echom(Memory *m, Uint16 len, char *name)
|
||||
{
|
||||
int i;
|
||||
printf("\n%s\n", name);
|
||||
for(i = 0; i < len; ++i) {
|
||||
if(i % 16 == 0)
|
||||
printf("\n");
|
||||
printf("%02x ", m->dat[i]);
|
||||
}
|
||||
printf("\n\n");
|
||||
}
|
||||
|
||||
void
|
||||
echof(Uxn *c)
|
||||
{
|
||||
printf("ended @ %d steps | hf: %x sf: %x sf: %x cf: %x\n",
|
||||
c->counter,
|
||||
getflag(&c->status, FLAG_HALT) != 0,
|
||||
getflag(&c->status, FLAG_SHORT) != 0,
|
||||
getflag(&c->status, FLAG_SIGN) != 0,
|
||||
getflag(&c->status, FLAG_COND) != 0);
|
||||
}
|
||||
|
||||
Uxn u;
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
if(argc < 2)
|
||||
return error("Input", "Missing");
|
||||
if(!bootuxn(&u))
|
||||
return error("Boot", "Failed");
|
||||
if(!loaduxn(&u, argv[1]))
|
||||
return error("Load", "Failed");
|
||||
|
||||
portuxn(&u, 0xfff0, 0xfff1, console_onread, console_onwrite);
|
||||
|
||||
printf("VRESET\n");
|
||||
evaluxn(&u, u.vreset);
|
||||
printf("VFRAME\n");
|
||||
evaluxn(&u, u.vframe);
|
||||
|
||||
echos(&u.wst, 0x40, "stack");
|
||||
echom(&u.ram, 0x40, "ram");
|
||||
echof(&u);
|
||||
|
||||
return 0;
|
||||
}
|
22
emulator.c
22
emulator.c
|
@ -137,14 +137,26 @@ void
|
|||
domouse(SDL_Event *event)
|
||||
{
|
||||
(void)event;
|
||||
printf("mouse\n");
|
||||
/* printf("mouse\n"); */
|
||||
}
|
||||
|
||||
void
|
||||
dokey(SDL_Event *event)
|
||||
{
|
||||
(void)event;
|
||||
printf("key\n");
|
||||
/* printf("key\n"); */
|
||||
}
|
||||
|
||||
#pragma mark - Devices
|
||||
|
||||
void
|
||||
console_onread(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
console_onwrite(void)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -175,11 +187,11 @@ start(Uxn *u)
|
|||
}
|
||||
}
|
||||
|
||||
Uxn u;
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
Uxn u;
|
||||
|
||||
if(argc < 2)
|
||||
return error("Input", "Missing");
|
||||
if(!bootuxn(&u))
|
||||
|
@ -189,6 +201,8 @@ main(int argc, char **argv)
|
|||
if(!init())
|
||||
return error("Init", "Failed");
|
||||
|
||||
portuxn(&u, 0xfff0, 0xfff1, console_onread, console_onwrite);
|
||||
|
||||
start(&u);
|
||||
|
||||
echos(&u.wst, 0x40, "stack");
|
||||
|
|
|
@ -4,10 +4,10 @@
|
|||
:dev1r FFF0
|
||||
:dev1w FFF1
|
||||
|
||||
|0100 @RESET
|
||||
|0100 @RESET
|
||||
,01 ,02 ,03
|
||||
BRK
|
||||
|
||||
,01 ,02 ADD
|
||||
|
||||
|c000 @FRAME BRK
|
||||
|c000 @FRAME BRK
|
||||
|d000 @ERROR BRK
|
||||
|FFFA .RESET .FRAME .ERROR
|
||||
|
|
84
uxn.c
84
uxn.c
|
@ -103,26 +103,6 @@ haltuxn(Uxn *u, char *name, int id)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
inituxn(Uxn *u)
|
||||
{
|
||||
size_t i;
|
||||
char *cptr = (char *)u;
|
||||
for(i = 0; i < sizeof u; i++)
|
||||
cptr[i] = 0;
|
||||
}
|
||||
|
||||
int
|
||||
loaduxn(Uxn *u, char *filepath)
|
||||
{
|
||||
FILE *f;
|
||||
if(!(f = fopen(filepath, "rb")))
|
||||
return haltuxn(u, "Missing input.", 0);
|
||||
fread(u->ram.dat, sizeof(u->ram.dat), 1, f);
|
||||
printf("Uxn Loaded: %s\n", filepath);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
lituxn(Uxn *u, Uint8 instr)
|
||||
{
|
||||
|
@ -136,9 +116,13 @@ lituxn(Uxn *u, Uint8 instr)
|
|||
int
|
||||
devuxn(Uxn *u) /* experimental */
|
||||
{
|
||||
if(u->ram.dat[0xfff1]) {
|
||||
printf("%c", u->ram.dat[0xfff1]);
|
||||
u->ram.dat[0xfff1] = 0x00;
|
||||
int i;
|
||||
for(i = 0; i < u->devices; ++i) {
|
||||
Uint16 addr = u->dev[i].w;
|
||||
if(u->ram.dat[addr]) {
|
||||
printf("%c", u->ram.dat[addr]);
|
||||
u->ram.dat[addr] = 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -162,31 +146,65 @@ opcuxn(Uxn *u, Uint8 instr)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
parse(Uxn *u) /* TODO: Rename */
|
||||
{
|
||||
Uint8 instr = u->ram.dat[u->ram.ptr++];
|
||||
u->counter++;
|
||||
if(u->literal > 0)
|
||||
return lituxn(u, instr);
|
||||
else
|
||||
return opcuxn(u, instr);
|
||||
}
|
||||
|
||||
int
|
||||
evaluxn(Uxn *u, Uint16 vec)
|
||||
{
|
||||
u->ram.ptr = vec;
|
||||
setflag(&u->status, FLAG_HALT, 0);
|
||||
while(!(u->status & FLAG_HALT)) {
|
||||
Uint8 instr = u->ram.dat[u->ram.ptr++];
|
||||
u->counter++;
|
||||
if(u->literal > 0)
|
||||
return lituxn(u, instr);
|
||||
else
|
||||
return opcuxn(u, instr);
|
||||
}
|
||||
while(!(u->status & FLAG_HALT) && parse(u))
|
||||
;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
bootuxn(Uxn *u)
|
||||
{
|
||||
inituxn(u);
|
||||
size_t i;
|
||||
char *cptr = (char *)u;
|
||||
for(i = 0; i < sizeof u; i++)
|
||||
cptr[i] = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
loaduxn(Uxn *u, char *filepath)
|
||||
{
|
||||
FILE *f;
|
||||
if(!(f = fopen(filepath, "rb")))
|
||||
return haltuxn(u, "Missing input.", 0);
|
||||
fread(u->ram.dat, sizeof(u->ram.dat), 1, f);
|
||||
u->vreset = mempeek16(u, 0xfffa);
|
||||
u->vframe = mempeek16(u, 0xfffc);
|
||||
u->verror = mempeek16(u, 0xfffe);
|
||||
printf("Uxn Ready.\n");
|
||||
printf("Uxn loaded[%s] vrst:%04x vfrm:%04x verr:%04x.\n",
|
||||
filepath,
|
||||
u->vreset,
|
||||
u->vframe,
|
||||
u->verror);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* to start: evaluxn(u, u->vreset); */
|
||||
|
||||
int
|
||||
portuxn(Uxn *u, Uint16 r, Uint16 w, void (*onread)(), void (*onwrite)())
|
||||
{
|
||||
Device *d = &u->dev[u->devices++];
|
||||
d->r = r;
|
||||
d->w = w;
|
||||
d->rfn = onread;
|
||||
d->wfn = onwrite;
|
||||
printf("Created device: #%d, at r:%04x w:%04x\n", u->devices, r, w);
|
||||
return 1;
|
||||
}
|
||||
|
|
12
uxn.h
12
uxn.h
|
@ -35,15 +35,23 @@ typedef struct {
|
|||
} Memory;
|
||||
|
||||
typedef struct {
|
||||
Uint8 literal, status;
|
||||
Uint16 r, w;
|
||||
void (*rfn)(void);
|
||||
void (*wfn)(void);
|
||||
} Device;
|
||||
|
||||
typedef struct {
|
||||
Uint8 literal, status, devices;
|
||||
Uint16 counter, vreset, vframe, verror;
|
||||
Stack8 wst;
|
||||
Stack16 rst;
|
||||
Memory ram;
|
||||
Device dev[64];
|
||||
} Uxn;
|
||||
|
||||
void setflag(Uint8 *status, char flag, int b);
|
||||
int getflag(Uint8 *status, char flag);
|
||||
int loaduxn(Uxn *c, char *filepath);
|
||||
int bootuxn(Uxn *c);
|
||||
int evaluxn(Uxn *u, Uint16 vec);
|
||||
int evaluxn(Uxn *u, Uint16 vec);
|
||||
int portuxn(Uxn *u, Uint16 r, Uint16 w, void (*onread)(), void (*onwrite)());
|
||||
|
|
Loading…
Reference in New Issue