mirror of
https://github.com/aap/pdp6.git
synced 2026-01-11 23:53:31 +00:00
emu: made it work in any directory
This commit is contained in:
parent
68037c9d95
commit
21018f6056
11
art/makeres.sh
Executable file
11
art/makeres.sh
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
|
||||
files='op_panel ind_panel1 ind_panel2 io_panel extra_panel\
|
||||
key_n key_d key_u lamp_on lamp_off switch_d switch_u'
|
||||
|
||||
for i in $files; do
|
||||
# echo static u8 $i[] = {
|
||||
xxd -i ${i}.png
|
||||
# echo '};'
|
||||
# echo
|
||||
done > panelart.inc
|
||||
10414
art/panelart.inc
Normal file
10414
art/panelart.inc
Normal file
File diff suppressed because it is too large
Load Diff
@ -3,8 +3,8 @@ H=pdp6.h ../tools/pdp6common.h threading.h
|
||||
# clang
|
||||
#CFLAGS= -Wno-shift-op-parentheses -Wno-logical-op-parentheses \
|
||||
# -Wno-bitwise-op-parentheses
|
||||
CFLAGS= -O3 -Wall -Wno-parentheses -fno-diagnostics-show-caret
|
||||
#CFLAGS= -g -Wall -Wno-parentheses -fno-diagnostics-show-caret
|
||||
#CFLAGS= -O3 -Wall -Wno-parentheses -fno-diagnostics-show-caret
|
||||
CFLAGS= -g -Wall -Wno-parentheses -fno-diagnostics-show-caret
|
||||
SDLFLAGS=`sdl2-config --cflags` `pkg-config SDL2_image --cflags`
|
||||
|
||||
LIBS=`sdl2-config --libs` `pkg-config SDL2_image --libs` -lpthread
|
||||
|
||||
@ -37,7 +37,7 @@ skipwhite(void)
|
||||
static int
|
||||
isdelim(char c)
|
||||
{
|
||||
return c && strchr(" \t\n;'\"", c) != nil;
|
||||
return c == '\0' || strchr(" \t\n;'\"", c) != nil;
|
||||
}
|
||||
|
||||
/* tokenize lp into ops[numops] */
|
||||
@ -64,6 +64,7 @@ splitops(void)
|
||||
lp++;
|
||||
*p++ = *lp++;
|
||||
}
|
||||
if(*lp == '\0') lp--;
|
||||
*p = '\0';
|
||||
}else{
|
||||
ops[numops++] = p = lp;
|
||||
@ -72,6 +73,7 @@ splitops(void)
|
||||
lp++;
|
||||
*p++ = *lp++;
|
||||
}
|
||||
if(*lp == '\0') lp--;
|
||||
*p = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
39
emu/emu.c
39
emu/emu.c
@ -96,16 +96,51 @@ showdevices(void)
|
||||
printf("%s %s\n", dev->name, dev->type);
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
dofile(const char *path)
|
||||
{
|
||||
FILE *f;
|
||||
if(f = fopen(path, "r"), f == nil){
|
||||
printf("Couldn't open file %s\n", path);
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
cli(f, nil);
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Wrapper around non-const */
|
||||
static void
|
||||
line(const char *cln)
|
||||
{
|
||||
static char ln[160];
|
||||
strncpy(ln, cln, 159);
|
||||
ln[159] = 0;
|
||||
commandline(ln);
|
||||
}
|
||||
|
||||
void
|
||||
defaultconfig(void)
|
||||
{
|
||||
line("mkdev apr apr166");
|
||||
line("mkdev tty tty626");
|
||||
line("mkdev ptr ptr760");
|
||||
line("mkdev ptp ptp761");
|
||||
line("mkdev dc dc136");
|
||||
line("mkdev dt0 dt551");
|
||||
line("mkdev dx0 dx555");
|
||||
line("mkdev fmem fmem162 0");
|
||||
line("mkdev mem0 moby");
|
||||
|
||||
line("connectdev dc dt0");
|
||||
line("connectdev dt0 dx0 1");
|
||||
line("connectio tty apr");
|
||||
line("connectio ptr apr");
|
||||
line("connectio ptp apr");
|
||||
line("connectio dc apr");
|
||||
line("connectio dt0 apr");
|
||||
line("connectmem fmem 0 apr -1");
|
||||
line("connectmem mem0 0 apr 0");
|
||||
}
|
||||
|
||||
/* Task for simulation.
|
||||
|
||||
@ -30,14 +30,14 @@ connectmem mem0 0 apr 0
|
||||
#connectmem cmem2 0 apr 2
|
||||
#connectmem cmem3 0 apr 3
|
||||
|
||||
mount tty /tmp/6tty
|
||||
mount ptr ../code/test.rim
|
||||
##mount tty /tmp/6tty
|
||||
##mount ptr ../code/test.rim
|
||||
#mount ptr ../code/sysgen.rim
|
||||
#mount ptr ../lars_sysgen/sysgen.pt
|
||||
mount ptp ../code/ptp.out
|
||||
##mount ptp ../code/ptp.out
|
||||
#mount dx0 ../test/out.dt6
|
||||
#mount dx0 ../test/test.dt6
|
||||
mount dx0 ../test/foo.dtr
|
||||
##mount dx0 ../test/foo.dtr
|
||||
|
||||
#load -b ../maint/pdp6.part1
|
||||
|
||||
|
||||
211
emu/main_panel.c
211
emu/main_panel.c
@ -4,6 +4,8 @@
|
||||
#include <SDL2/SDL_image.h>
|
||||
#include "args.h"
|
||||
|
||||
#include "../art/panelart.inc"
|
||||
|
||||
typedef struct Point Point;
|
||||
struct Point
|
||||
{
|
||||
@ -59,6 +61,7 @@ mustloadimg(const char *path)
|
||||
{
|
||||
Image *img;
|
||||
SDL_Texture *s;
|
||||
|
||||
s = IMG_LoadTexture(renderer, path);
|
||||
if(s == nil)
|
||||
err("Couldn't load %s", path);
|
||||
@ -68,6 +71,25 @@ mustloadimg(const char *path)
|
||||
return img;
|
||||
}
|
||||
|
||||
Image*
|
||||
loadresimg(u8 *data, int sz)
|
||||
{
|
||||
SDL_RWops *f;
|
||||
Image *img;
|
||||
SDL_Texture *s;
|
||||
|
||||
f = SDL_RWFromConstMem(data, sz);
|
||||
if(f == nil)
|
||||
err("Couldn't load resource");
|
||||
s = IMG_LoadTexture_RW(renderer, f, 0);
|
||||
if(s == nil)
|
||||
err("Couldn't load image");
|
||||
img = malloc(sizeof(Image));
|
||||
img->tex = s;
|
||||
SDL_QueryTexture(img->tex, nil, nil, &img->w, &img->h);
|
||||
return img;
|
||||
}
|
||||
|
||||
Image *lampsurf[2];
|
||||
Image *switchsurf[2];
|
||||
Image *keysurf[3];
|
||||
@ -616,6 +638,110 @@ findlayout(int *w, int *h)
|
||||
*h = oppanel.pos.y + oppanel.surf->h;
|
||||
}
|
||||
|
||||
static void
|
||||
initpanel(void)
|
||||
{
|
||||
Element *e;
|
||||
|
||||
#ifdef LOADFILES
|
||||
oppanel.surf = mustloadimg("../art/op_panel.png");
|
||||
iopanel.surf = mustloadimg("../art/io_panel.png");
|
||||
indpanel1.surf = mustloadimg("../art/ind_panel1.png");
|
||||
indpanel2.surf = mustloadimg("../art/ind_panel2.png");
|
||||
extrapanel.surf = mustloadimg("../art/extra_panel.png");
|
||||
|
||||
lampsurf[0] = mustloadimg("../art/lamp_off.png");
|
||||
lampsurf[1] = mustloadimg("../art/lamp_on.png");
|
||||
|
||||
switchsurf[0] = mustloadimg("../art/switch_d.png");
|
||||
switchsurf[1] = mustloadimg("../art/switch_u.png");
|
||||
|
||||
keysurf[0] = mustloadimg("../art/key_n.png");
|
||||
keysurf[1] = mustloadimg("../art/key_d.png");
|
||||
keysurf[2] = mustloadimg("../art/key_u.png");
|
||||
#else
|
||||
oppanel.surf = loadresimg(op_panel_png, op_panel_png_len);
|
||||
iopanel.surf = loadresimg(io_panel_png, io_panel_png_len);
|
||||
indpanel1.surf = loadresimg(ind_panel1_png, ind_panel1_png_len);
|
||||
indpanel2.surf = loadresimg(ind_panel2_png, ind_panel2_png_len);
|
||||
extrapanel.surf = loadresimg(extra_panel_png, extra_panel_png_len);
|
||||
|
||||
lampsurf[0] = loadresimg(lamp_off_png, lamp_off_png_len);
|
||||
lampsurf[1] = loadresimg(lamp_on_png, lamp_on_png_len);
|
||||
|
||||
switchsurf[0] = loadresimg(switch_d_png, switch_d_png_len);
|
||||
switchsurf[1] = loadresimg(switch_u_png, switch_u_png_len);
|
||||
|
||||
keysurf[0] = loadresimg(key_n_png, key_n_png_len);
|
||||
keysurf[1] = loadresimg(key_d_png, key_d_png_len);
|
||||
keysurf[2] = loadresimg(key_u_png, key_u_png_len);
|
||||
#endif
|
||||
|
||||
|
||||
opgrid1.panel = &oppanel;
|
||||
opgrid1.xscl = opgrid1.panel->surf->w/90.0f;
|
||||
opgrid1.yscl = opgrid1.panel->surf->h/11.0f;
|
||||
opgrid1.yoff = opgrid1.yscl/2.0f;
|
||||
|
||||
opgrid2.panel = &oppanel;
|
||||
opgrid2.xscl = opgrid1.xscl*1.76f;
|
||||
opgrid2.yscl = opgrid2.xscl;
|
||||
opgrid2.xoff = opgrid1.xscl*44.5f;
|
||||
opgrid2.yoff = opgrid1.panel->surf->h*2.4f/143.0f;
|
||||
|
||||
iogrid.panel = &iopanel;
|
||||
iogrid.xscl = iogrid.panel->surf->w/44.0f;
|
||||
iogrid.yscl = iogrid.panel->surf->h/28.0f;
|
||||
|
||||
indgrid1.panel = &indpanel1;
|
||||
indgrid1.xscl = indgrid1.panel->surf->w*5.0f/77.0f;
|
||||
indgrid1.yscl = indgrid1.panel->surf->h/12.0f;
|
||||
|
||||
indgrid2.panel = &indpanel2;
|
||||
indgrid2.xscl = indgrid2.panel->surf->w/44.0f;
|
||||
indgrid2.yscl = indgrid2.panel->surf->h/11.0f;
|
||||
|
||||
extragrid = indgrid1;
|
||||
extragrid.panel = &extrapanel;
|
||||
|
||||
e = switches;
|
||||
data_sw = e; e += 36;
|
||||
ma_sw = e; e += 18;
|
||||
misc_sw = e; e += 4;
|
||||
|
||||
extra_sw = e; e += 5;
|
||||
|
||||
e = lamps;
|
||||
mi_l = e; e += 36;
|
||||
ir_l = e; e += 18;
|
||||
ma_l = e; e += 18;
|
||||
pc_l = e; e += 18;
|
||||
pio_l = e; e += 7;
|
||||
pir_l = e; e += 7;
|
||||
pih_l = e; e += 7;
|
||||
misc_l = e; e += 7;
|
||||
|
||||
mb_l = e; e += 36;
|
||||
ar_l = e; e += 36;
|
||||
mq_l = e; e += 36;
|
||||
ff_l = e; e += 14*8;
|
||||
|
||||
iobus_l = e; e += 36;
|
||||
cr_l = e; e += 9;
|
||||
crbuf_l = e; e += 36;
|
||||
ptr_l = e; e += 6;
|
||||
ptrbuf_l = e; e += 36;
|
||||
ptp_l = e; e += 6;
|
||||
ptpbuf_l = e; e += 8;
|
||||
tty_l = e; e += 7;
|
||||
ttibuf_l = e; e += 8;
|
||||
pr_l = e; e += 8;
|
||||
rlr_l = e; e += 8;
|
||||
rla_l = e; e += 8;
|
||||
|
||||
extra_l = e; e += 1;
|
||||
}
|
||||
|
||||
void
|
||||
usage(void)
|
||||
{
|
||||
@ -664,89 +790,12 @@ threadmain(int argc, char *argv[])
|
||||
if(SDL_CreateWindowAndRenderer(1399, 740, 0, &window, &renderer) < 0)
|
||||
err("SDL_CreateWindowAndRenderer() failed: %s\n", SDL_GetError());
|
||||
|
||||
lampsurf[0] = mustloadimg("../art/lamp_off.png");
|
||||
lampsurf[1] = mustloadimg("../art/lamp_on.png");
|
||||
|
||||
switchsurf[0] = mustloadimg("../art/switch_d.png");
|
||||
switchsurf[1] = mustloadimg("../art/switch_u.png");
|
||||
|
||||
keysurf[0] = mustloadimg("../art/key_n.png");
|
||||
keysurf[1] = mustloadimg("../art/key_d.png");
|
||||
keysurf[2] = mustloadimg("../art/key_u.png");
|
||||
|
||||
oppanel.surf = mustloadimg("../art/op_panel.png");
|
||||
|
||||
opgrid1.panel = &oppanel;
|
||||
opgrid1.xscl = opgrid1.panel->surf->w/90.0f;
|
||||
opgrid1.yscl = opgrid1.panel->surf->h/11.0f;
|
||||
opgrid1.yoff = opgrid1.yscl/2.0f;
|
||||
|
||||
opgrid2.panel = &oppanel;
|
||||
opgrid2.xscl = opgrid1.xscl*1.76f;
|
||||
opgrid2.yscl = opgrid2.xscl;
|
||||
opgrid2.xoff = opgrid1.xscl*44.5f;
|
||||
opgrid2.yoff = opgrid1.panel->surf->h*2.4f/143.0f;
|
||||
|
||||
iopanel.surf = mustloadimg("../art/io_panel.png");
|
||||
iogrid.panel = &iopanel;
|
||||
iogrid.xscl = iogrid.panel->surf->w/44.0f;
|
||||
iogrid.yscl = iogrid.panel->surf->h/28.0f;
|
||||
|
||||
indpanel1.surf = mustloadimg("../art/ind_panel1.png");
|
||||
indgrid1.panel = &indpanel1;
|
||||
indgrid1.xscl = indgrid1.panel->surf->w*5.0f/77.0f;
|
||||
indgrid1.yscl = indgrid1.panel->surf->h/12.0f;
|
||||
|
||||
indpanel2.surf = mustloadimg("../art/ind_panel2.png");
|
||||
indgrid2.panel = &indpanel2;
|
||||
indgrid2.xscl = indgrid2.panel->surf->w/44.0f;
|
||||
indgrid2.yscl = indgrid2.panel->surf->h/11.0f;
|
||||
|
||||
extrapanel.surf = mustloadimg("../art/extra_panel.png");
|
||||
extragrid = indgrid1;
|
||||
extragrid.panel = &extrapanel;
|
||||
initpanel();
|
||||
|
||||
findlayout(&w, &h);
|
||||
|
||||
SDL_SetWindowSize(window, w, h);
|
||||
|
||||
e = switches;
|
||||
data_sw = e; e += 36;
|
||||
ma_sw = e; e += 18;
|
||||
misc_sw = e; e += 4;
|
||||
|
||||
extra_sw = e; e += 5;
|
||||
|
||||
e = lamps;
|
||||
mi_l = e; e += 36;
|
||||
ir_l = e; e += 18;
|
||||
ma_l = e; e += 18;
|
||||
pc_l = e; e += 18;
|
||||
pio_l = e; e += 7;
|
||||
pir_l = e; e += 7;
|
||||
pih_l = e; e += 7;
|
||||
misc_l = e; e += 7;
|
||||
|
||||
mb_l = e; e += 36;
|
||||
ar_l = e; e += 36;
|
||||
mq_l = e; e += 36;
|
||||
ff_l = e; e += 14*8;
|
||||
|
||||
iobus_l = e; e += 36;
|
||||
cr_l = e; e += 9;
|
||||
crbuf_l = e; e += 36;
|
||||
ptr_l = e; e += 6;
|
||||
ptrbuf_l = e; e += 36;
|
||||
ptp_l = e; e += 6;
|
||||
ptpbuf_l = e; e += 8;
|
||||
tty_l = e; e += 7;
|
||||
ttibuf_l = e; e += 8;
|
||||
pr_l = e; e += 8;
|
||||
rlr_l = e; e += 8;
|
||||
rla_l = e; e += 8;
|
||||
|
||||
extra_l = e; e += 1;
|
||||
|
||||
for(i = 0; i < 12; i++){
|
||||
data_digits[i].lp = &mi_l[i*3];
|
||||
data_digits[i].sw = &data_sw[i*3];
|
||||
@ -764,12 +813,16 @@ threadmain(int argc, char *argv[])
|
||||
|
||||
rtcchan = chancreate(sizeof(RtcMsg), 20);
|
||||
|
||||
dofile("init.ini");
|
||||
if(dofile("init.ini"))
|
||||
defaultconfig();
|
||||
apr = (Apr*)getdevice("apr");
|
||||
tty = (Tty*)getdevice("tty");
|
||||
ptr = (Ptr*)getdevice("ptr");
|
||||
ptp = (Ptp*)getdevice("ptp");
|
||||
|
||||
if(apr == nil || tty == nil || ptr == nil || ptp == nil)
|
||||
err("need APR, TTY, PTR and PTP");
|
||||
|
||||
cmdchans[0] = chancreate(sizeof(char*), 1);
|
||||
cmdchans[1] = chancreate(sizeof(void*), 1);
|
||||
t = (Task){ nil, readcmdchan, cmdchans, 10, 0 };
|
||||
|
||||
@ -39,7 +39,8 @@ void readcmdchan(void *p);
|
||||
void *cmdthread(void *);
|
||||
void *simthread(void *p);
|
||||
void *rtcthread(void *p);
|
||||
void dofile(const char *path);
|
||||
int dofile(const char *path);
|
||||
void defaultconfig(void);
|
||||
|
||||
enum {
|
||||
MAXPULSE = 20
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user