Moved controller device to devices/controller.c

This commit is contained in:
neauoire 2021-12-27 09:24:43 -08:00
parent a12781f23a
commit fe75479fae
4 changed files with 100 additions and 67 deletions

View File

@ -22,6 +22,8 @@ then
clang-format -i src/devices/file.c clang-format -i src/devices/file.c
clang-format -i src/devices/mouse.h clang-format -i src/devices/mouse.h
clang-format -i src/devices/mouse.c clang-format -i src/devices/mouse.c
clang-format -i src/devices/controller.h
clang-format -i src/devices/controller.c
clang-format -i src/uxnasm.c clang-format -i src/uxnasm.c
clang-format -i src/uxnemu.c clang-format -i src/uxnemu.c
clang-format -i src/uxncli.c clang-format -i src/uxncli.c
@ -60,7 +62,7 @@ fi
echo "Building.." echo "Building.."
${CC} ${CFLAGS} src/uxnasm.c -o bin/uxnasm ${CC} ${CFLAGS} src/uxnasm.c -o bin/uxnasm
${CC} ${CFLAGS} ${CORE} src/devices/file.c src/devices/mouse.c src/devices/ppu.c src/devices/apu.c src/uxnemu.c ${UXNEMU_LDFLAGS} -o bin/uxnemu ${CC} ${CFLAGS} ${CORE} src/devices/file.c src/devices/mouse.c src/devices/controller.c src/devices/ppu.c src/devices/apu.c src/uxnemu.c ${UXNEMU_LDFLAGS} -o bin/uxnemu
${CC} ${CFLAGS} ${CORE} src/devices/file.c src/uxncli.c -o bin/uxncli ${CC} ${CFLAGS} ${CORE} src/devices/file.c src/uxncli.c -o bin/uxncli
if [ -d "$HOME/bin" ] if [ -d "$HOME/bin" ]

38
src/devices/controller.c Normal file
View File

@ -0,0 +1,38 @@
#include "../uxn.h"
#include "controller.h"
/*
Copyright (c) 2021 Devine Lu Linvega
Copyright (c) 2021 Andrew Alderwick
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.
*/
void
controller_down(Device *d, Uint8 mask)
{
d->dat[2] |= mask;
uxn_eval(d->u, d->vector);
}
void
controller_up(Device *d, Uint8 mask)
{
d->dat[2] &= (~mask);
uxn_eval(d->u, d->vector);
}
void
controller_key(Device *d, Uint8 key)
{
if(!key) {
d->dat[3] = key;
uxn_eval(d->u, d->vector);
d->dat[3] = 0x00;
}
}

15
src/devices/controller.h Normal file
View File

@ -0,0 +1,15 @@
/*
Copyright (c) 2021 Devine Lu Linvega
Copyright (c) 2021 Andrew Alderwick
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.
*/
void controller_down(Device *d, Uint8 mask);
void controller_up(Device *d, Uint8 mask);
void controller_key(Device *d, Uint8 key);

View File

@ -11,6 +11,7 @@
#include "devices/ppu.h" #include "devices/ppu.h"
#include "devices/apu.h" #include "devices/apu.h"
#include "devices/file.h" #include "devices/file.h"
#include "devices/controller.h"
#include "devices/mouse.h" #include "devices/mouse.h"
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#pragma clang diagnostic pop #pragma clang diagnostic pop
@ -409,39 +410,29 @@ get_button(SDL_Event *event)
return 0x00; return 0x00;
} }
void Uint8
controller_down(Device *d, Uint8 mask) get_key(SDL_Event *event)
{ {
d->dat[2] |= mask; SDL_Keymod mods = SDL_GetModState();
uxn_eval(d->u, d->vector); if(event->key.keysym.sym < 0x20 || event->key.keysym.sym == SDLK_DELETE)
} return event->key.keysym.sym;
if((mods & KMOD_CTRL) && event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_z)
void return event->key.keysym.sym - (mods & KMOD_SHIFT) * 0x20;
controller_up(Device *d, Uint8 mask) return 0x00;
{
d->dat[2] &= (~mask);
uxn_eval(d->u, d->vector);
} }
static void static void
doctrl(Uxn *u, SDL_Event *event, int z) do_shortcut(Uxn *u, SDL_Event *event)
{ {
SDL_Keymod mods = SDL_GetModState(); if(event->key.keysym.sym == SDLK_F1)
/* clang-format off */ set_zoom(zoom > 2 ? 1 : zoom + 1);
switch(event->key.keysym.sym) { else if(event->key.keysym.sym == SDLK_F2) {
case SDLK_F1: if(z) set_zoom(zoom > 2 ? 1 : zoom + 1); break; devsystem->dat[0xe] = !devsystem->dat[0xe];
case SDLK_F2: if(z) devsystem->dat[0xe] = !devsystem->dat[0xe]; ppu_clear(&ppu, &ppu.fg); break; ppu_clear(&ppu, &ppu.fg);
case SDLK_F3: if(z) capture_screen(); break; } else if(event->key.keysym.sym == SDLK_F3)
case SDLK_AC_BACK: capture_screen();
case SDLK_F4: if(z) restart(u); break; else if(event->key.keysym.sym == SDLK_F4)
} restart(u);
/* clang-format on */
if(z) {
if(event->key.keysym.sym < 0x20 || event->key.keysym.sym == SDLK_DELETE)
devctrl->dat[3] = event->key.keysym.sym;
else if((mods & KMOD_CTRL) && event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_z)
devctrl->dat[3] = event->key.keysym.sym - (mods & KMOD_SHIFT) * 0x20;
}
} }
static const char *errors[] = {"underflow", "overflow", "division by zero"}; static const char *errors[] = {"underflow", "overflow", "division by zero"};
@ -467,12 +458,24 @@ run(Uxn *u)
while(!devsystem->dat[0xf]) { while(!devsystem->dat[0xf]) {
SDL_Event event; SDL_Event event;
double elapsed, begin = 0; double elapsed, begin = 0;
int ksym;
if(!BENCH) if(!BENCH)
begin = SDL_GetPerformanceCounter(); begin = SDL_GetPerformanceCounter();
while(SDL_PollEvent(&event) != 0) { while(SDL_PollEvent(&event) != 0) {
/* new handlers */ /* Window */
if(event.type == SDL_MOUSEWHEEL) if(event.type == SDL_QUIT)
return error("Run", "Quit.");
else if(event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_EXPOSED)
redraw(u);
else if(event.type == SDL_DROPFILE) {
set_size(WIDTH, HEIGHT, 0);
start(u, event.drop.file);
SDL_free(event.drop.file);
}
/* Audio */
else if(event.type >= audio0_event && event.type < audio0_event + POLYPHONY)
uxn_eval(u, peek16((devaudio0 + (event.type - audio0_event))->dat, 0));
/* Mouse */
else if(event.type == SDL_MOUSEWHEEL)
mouse_z(devmouse, event.wheel.y); mouse_z(devmouse, event.wheel.y);
else if(event.type == SDL_MOUSEBUTTONUP) else if(event.type == SDL_MOUSEBUTTONUP)
mouse_up(devmouse, 0x1 << (event.button.button - 1)); mouse_up(devmouse, 0x1 << (event.button.button - 1));
@ -482,44 +485,19 @@ run(Uxn *u)
mouse_xy(devmouse, mouse_xy(devmouse,
clamp(event.motion.x - PAD, 0, ppu.width - 1), clamp(event.motion.x - PAD, 0, ppu.width - 1),
clamp(event.motion.y - PAD, 0, ppu.height - 1)); clamp(event.motion.y - PAD, 0, ppu.height - 1));
else if(event.type == SDL_KEYDOWN) /* Controller */
else if(event.type == SDL_KEYDOWN) {
controller_down(devctrl, get_button(&event)); controller_down(devctrl, get_button(&event));
else if(event.type == SDL_KEYUP) controller_key(devctrl, get_key(&event));
do_shortcut(u, &event);
} else if(event.type == SDL_KEYUP)
controller_up(devctrl, get_button(&event)); controller_up(devctrl, get_button(&event));
/* continue */ else if(event.type == SDL_TEXTINPUT)
switch(event.type) { controller_key(devctrl, event.text.text[0]);
case SDL_DROPFILE: /* Console */
set_size(WIDTH, HEIGHT, 0); else if(event.type == stdin_event)
start(u, event.drop.file); console_input(u, event.cbutton.button);
SDL_free(event.drop.file);
break;
case SDL_QUIT:
return error("Run", "Quit.");
case SDL_TEXTINPUT:
devctrl->dat[3] = event.text.text[0]; /* fall-thru */
case SDL_KEYDOWN:
case SDL_KEYUP:
doctrl(u, &event, event.type == SDL_KEYDOWN);
uxn_eval(u, devctrl->vector);
devctrl->dat[3] = 0;
if(event.type == SDL_KEYDOWN) {
ksym = event.key.keysym.sym;
if(SDL_PeepEvents(&event, 1, SDL_PEEKEVENT, SDL_KEYUP, SDL_KEYUP) == 1 && ksym == event.key.keysym.sym)
goto breakout;
}
break;
case SDL_WINDOWEVENT:
if(event.window.event == SDL_WINDOWEVENT_EXPOSED)
redraw(u);
break;
default:
if(event.type == stdin_event) {
console_input(u, event.cbutton.button);
} else if(event.type >= audio0_event && event.type < audio0_event + POLYPHONY)
uxn_eval(u, peek16((devaudio0 + (event.type - audio0_event))->dat, 0));
}
} }
breakout:
uxn_eval(u, devscreen->vector); uxn_eval(u, devscreen->vector);
if(ppu.fg.changed || ppu.bg.changed || devsystem->dat[0xe]) if(ppu.fg.changed || ppu.bg.changed || devsystem->dat[0xe])
redraw(u); redraw(u);