1
0
mirror of https://github.com/aap/pdp6.git synced 2026-03-02 18:05:20 +00:00

emu: implemented a little keyboard interface for the panel

This commit is contained in:
aap
2019-03-11 00:06:13 +01:00
parent 83b757ae1c
commit b705b0fc4b

View File

@@ -42,6 +42,15 @@ struct Element
int active;
};
typedef struct SwDigit SwDigit;
struct SwDigit
{
Element *lp; // lamp
Element *sw; // switch
SwDigit *prev;
SwDigit *next;
};
SDL_Window *window;
SDL_Renderer *renderer;
@@ -95,6 +104,11 @@ Element *iobus_l, *cr_l, *crbuf_l, *ptr_l, *ptrbuf_l,
Element *extra_sw;
Element *extra_l;
SwDigit data_digits[12];
SwDigit addr_digits[6];
SwDigit *curdigit;
SDL_Rect digitindline;
#include "elements.inc"
void
@@ -132,7 +146,7 @@ updatepanel(Apr *apr)
extra_sw[4].state = apr->sw_spltcyc_override;
}
void
static void
updateapr(Apr *apr, Ptr *ptr)
{
Apr oldapr;
@@ -320,7 +334,7 @@ updateapr(Apr *apr, Ptr *ptr)
setelements(apr->iobus.c12, iobus_l, 36);
}
void
static void
updatetty(Tty *tty)
{
if(tty){
@@ -333,7 +347,7 @@ updatetty(Tty *tty)
}
}
void
static void
updatept(Ptp *ptp, Ptr *ptr)
{
if(ptp){
@@ -355,7 +369,7 @@ updatept(Ptp *ptp, Ptr *ptr)
}
}
void
static void
putpixel(SDL_Texture *screen, int x, int y, Uint32 col)
{
// TODO: rewrite for SDL2
@@ -370,21 +384,21 @@ putpixel(SDL_Texture *screen, int x, int y, Uint32 col)
*/
}
void
static void
drawhline(SDL_Texture *screen, int y, int x1, int x2, Uint32 col)
{
for(; x1 < x2; x1++)
putpixel(screen, x1, y, col);
}
void
static void
drawvline(SDL_Texture *screen, int x, int y1, int y2, Uint32 col)
{
for(; y1 < y2; y1++)
putpixel(screen, x, y1, col);
}
Point
static Point
xform(Grid *g, Point p)
{
p.x = g->panel->pos.x + g->xoff + p.x*g->xscl;
@@ -392,7 +406,7 @@ xform(Grid *g, Point p)
return p;
}
int
static int
ismouseover(Element *e, int x, int y)
{
Point p;
@@ -402,7 +416,7 @@ ismouseover(Element *e, int x, int y)
y >= p.y && y <= p.y + e->surf[e->state]->h;
}
void
static void
drawgrid(Grid *g, SDL_Texture *s, Uint32 col)
{
Image *pi;
@@ -425,7 +439,7 @@ drawgrid(Grid *g, SDL_Texture *s, Uint32 col)
}
}
void
static void
drawpanel(SDL_Renderer *renderer, Panel *p)
{
if(p->pos.x < 0)
@@ -436,7 +450,7 @@ drawpanel(SDL_Renderer *renderer, Panel *p)
SDL_RenderCopy(renderer, p->surf->tex, nil, &p->pos);
}
void
static void
drawelement(SDL_Renderer *renderer, Element *elt, int power)
{
Image *img;
@@ -460,7 +474,7 @@ drawelement(SDL_Renderer *renderer, Element *elt, int power)
SDL_RenderCopy(renderer, img->tex, nil, &r);
}
void
static void
mouse(int button, int state, int x, int y)
{
static int buttonstate;
@@ -510,7 +524,73 @@ mouse(int button, int state, int x, int y)
}
}
void
static void
setcurdigit(SwDigit *d)
{
Point p1, p2;
curdigit = d;
p1 = xform(d->sw[0].grid, d->sw[0].pos);
p2 = xform(d->sw[2].grid, d->sw[2].pos);
p2.x += d->sw[2].surf[0]->w;
p2.y += d->sw[2].surf[0]->h;
digitindline.x = p1.x;
digitindline.y = p1.y;
digitindline.w = p2.x - p1.x;
digitindline.h = p2.y - p1.y;
}
static void
setdigit(int n)
{
curdigit->sw[0].state = !!(n & 4);
curdigit->sw[1].state = !!(n & 2);
curdigit->sw[2].state = !!(n & 1);
setcurdigit(curdigit->next);
}
static void
setdigitfromlamp(void)
{
curdigit->sw[0].state = curdigit->lp[0].state;
curdigit->sw[1].state = curdigit->lp[1].state;
curdigit->sw[2].state = curdigit->lp[2].state;
setcurdigit(curdigit->next);
}
static void
keydown(SDL_Keysym keysym)
{
int i;
switch(keysym.scancode){
case SDL_SCANCODE_0: setdigit(0); break;
case SDL_SCANCODE_1: setdigit(1); break;
case SDL_SCANCODE_2: setdigit(2); break;
case SDL_SCANCODE_3: setdigit(3); break;
case SDL_SCANCODE_4: setdigit(4); break;
case SDL_SCANCODE_5: setdigit(5); break;
case SDL_SCANCODE_6: setdigit(6); break;
case SDL_SCANCODE_7: setdigit(7); break;
case SDL_SCANCODE_A: setcurdigit(addr_digits); break;
case SDL_SCANCODE_D: setcurdigit(data_digits); break;
case SDL_SCANCODE_LEFT: setcurdigit(curdigit->prev); break;
case SDL_SCANCODE_RIGHT: setcurdigit(curdigit->next); break;
case SDL_SCANCODE_C:
/* clear */
for(i = 0; i < 12; i++)
setdigit(0);
break;
case SDL_SCANCODE_L:
/* load */
for(i = 0; i < 12; i++)
setdigitfromlamp();
break;
default: break;
}
}
static void
findlayout(int *w, int *h)
{
float gap;
@@ -667,6 +747,21 @@ threadmain(int argc, char *argv[])
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];
data_digits[i].prev = &data_digits[(i+11) % 12];
data_digits[i].next = &data_digits[(i+1) % 12];
}
for(i = 0; i < 6; i++){
addr_digits[i].lp = &ma_l[i*3];
addr_digits[i].sw = &ma_sw[i*3];
addr_digits[i].prev = &addr_digits[(i+5) % 6];
addr_digits[i].next = &addr_digits[(i+1) % 6];
}
setcurdigit(data_digits);
rtcchan = chancreate(sizeof(RtcMsg), 20);
dofile("init.ini");
@@ -695,6 +790,9 @@ threadmain(int argc, char *argv[])
mbev = (SDL_MouseButtonEvent*)&ev;
mouse(mbev->button, mbev->state, mbev->x, mbev->y);
break;
case SDL_KEYDOWN:
keydown(ev.key.keysym);
break;
case SDL_QUIT:
quit(0);
}
@@ -719,6 +817,9 @@ threadmain(int argc, char *argv[])
for(i = 0, e = switches; i < nelem(switches); i++, e++)
drawelement(renderer, e, apr->sw_power);
SDL_SetRenderDrawColor(renderer, 0xFF, 0, 0, 0xff);
SDL_RenderDrawRect(renderer, &digitindline);
// SDL_LockSurface(screen);
// drawgrid(&opgrid1, screen, 0xFFFFFF00);
// drawgrid(&opgrid2, screen, 0xFF0000FF);