Update to bsnes v028 release.
Changelog:
- OpenGL (with hardware filter mode support) and SDL video drivers added to Linux port
- OpenAL (with speed regulation disable support) and OSS audio drivers added to Linux port [Nach]
- SDL input driver (with joypad support) added to Linux port
- Emulator pause option added
- Added option to select behavior of bsnes when idle: allow input, ignore input or pause emulator
- Added support to remap common GUI actions to key/joypad presses on the "Input Configuration" screen
- bsnes will now clamp the video output size when it is larger than the screen resolution
- GUI library has been enhanced, and renamed to hiro
- Fullscreen mode now always centers video, rather than approximates
- Fullscreen mode now works correctly on Linux/Openbox
- Extra layer of abstraction in src/ui has been removed, as GUI lib unifies all ports anyway
- Video, audio and input drivers unified into standard library, named ruby
- All custom headers have been merged into a new template library, named nall
- Makefile rewritten, vastly improved. Allows quick toggling of compiled-in drivers
- Makefile: all object files now placed in /src/obj, binary placed in /
- libco greatly enhanced, no longer requires an assembler to build [byuu, blargg, Nach]
- libco SJLJ driver added; bsnes should now build on any Unix-derivative now (Solaris, OS X, PS3, etc) [Nach]
- Fixed register $213e.d4 PPU1 open bus behavior [zones]
- Windows port will not activate screensaver while bsnes is running [Nightcrawler]
- Visual C++ target no longer requires stdint.h
- And lots more -- mostly code refactoring related
2008-02-04 16:16:34 +00:00
|
|
|
/*
|
|
|
|
libco.sjlj (2008-01-28)
|
|
|
|
author: Nach
|
|
|
|
license: public domain
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Note this was designed for UNIX systems. Based on ideas expressed in a paper
|
|
|
|
* by Ralf Engelschall.
|
|
|
|
* For SJLJ on other systems, one would want to rewrite springboard() and
|
|
|
|
* co_create() and hack the jmb_buf stack pointer.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define LIBCO_C
|
2008-03-18 06:19:43 +00:00
|
|
|
#include "libco.h"
|
Update to bsnes v028 release.
Changelog:
- OpenGL (with hardware filter mode support) and SDL video drivers added to Linux port
- OpenAL (with speed regulation disable support) and OSS audio drivers added to Linux port [Nach]
- SDL input driver (with joypad support) added to Linux port
- Emulator pause option added
- Added option to select behavior of bsnes when idle: allow input, ignore input or pause emulator
- Added support to remap common GUI actions to key/joypad presses on the "Input Configuration" screen
- bsnes will now clamp the video output size when it is larger than the screen resolution
- GUI library has been enhanced, and renamed to hiro
- Fullscreen mode now always centers video, rather than approximates
- Fullscreen mode now works correctly on Linux/Openbox
- Extra layer of abstraction in src/ui has been removed, as GUI lib unifies all ports anyway
- Video, audio and input drivers unified into standard library, named ruby
- All custom headers have been merged into a new template library, named nall
- Makefile rewritten, vastly improved. Allows quick toggling of compiled-in drivers
- Makefile: all object files now placed in /src/obj, binary placed in /
- libco greatly enhanced, no longer requires an assembler to build [byuu, blargg, Nach]
- libco SJLJ driver added; bsnes should now build on any Unix-derivative now (Solaris, OS X, PS3, etc) [Nach]
- Fixed register $213e.d4 PPU1 open bus behavior [zones]
- Windows port will not activate screensaver while bsnes is running [Nightcrawler]
- Visual C++ target no longer requires stdint.h
- And lots more -- mostly code refactoring related
2008-02-04 16:16:34 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#include <setjmp.h>
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
sigjmp_buf context;
|
|
|
|
void (*coentry)(void);
|
|
|
|
void *stack;
|
|
|
|
} cothread_struct;
|
|
|
|
|
|
|
|
static thread_local cothread_struct co_primary;
|
|
|
|
static thread_local cothread_struct *creating, *co_running = 0;
|
|
|
|
|
|
|
|
static void springboard(int ignored) {
|
|
|
|
if(sigsetjmp(creating->context, 0)) {
|
|
|
|
co_running->coentry();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cothread_t co_active() {
|
|
|
|
if(!co_running) co_running = &co_primary;
|
|
|
|
return (cothread_t)co_running;
|
|
|
|
}
|
|
|
|
|
|
|
|
cothread_t co_create(unsigned int size, void (*coentry)(void)) {
|
|
|
|
if(!co_running) co_running = &co_primary;
|
|
|
|
|
|
|
|
cothread_struct *thread = (cothread_struct*)malloc(sizeof(cothread_struct));
|
|
|
|
if(thread) {
|
|
|
|
struct sigaction handler;
|
|
|
|
struct sigaction old_handler;
|
|
|
|
|
|
|
|
stack_t stack;
|
|
|
|
stack_t old_stack;
|
|
|
|
|
|
|
|
thread->coentry = thread->stack = 0;
|
|
|
|
|
|
|
|
stack.ss_flags = 0;
|
|
|
|
stack.ss_size = size;
|
|
|
|
thread->stack = stack.ss_sp = malloc(size);
|
|
|
|
if(stack.ss_sp && !sigaltstack(&stack, &old_stack)) {
|
|
|
|
handler.sa_handler = springboard;
|
|
|
|
handler.sa_flags = SA_ONSTACK;
|
|
|
|
sigemptyset(&handler.sa_mask);
|
|
|
|
creating = thread;
|
|
|
|
|
|
|
|
if(!sigaction(SIGUSR1, &handler, &old_handler)) {
|
|
|
|
if(!raise(SIGUSR1)) {
|
|
|
|
thread->coentry = coentry;
|
|
|
|
}
|
|
|
|
sigaltstack(&old_stack, 0);
|
|
|
|
sigaction(SIGUSR1, &old_handler, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(thread->coentry != coentry) {
|
|
|
|
co_delete(thread);
|
|
|
|
thread = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return (cothread_t)thread;
|
|
|
|
}
|
|
|
|
|
|
|
|
void co_delete(cothread_t cothread) {
|
|
|
|
if(cothread) {
|
|
|
|
if(((cothread_struct*)cothread)->stack) {
|
|
|
|
free(((cothread_struct*)cothread)->stack);
|
|
|
|
}
|
|
|
|
free(cothread);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void co_switch(cothread_t cothread) {
|
|
|
|
if(!sigsetjmp(co_running->context, 0)) {
|
|
|
|
co_running = (cothread_struct*)cothread;
|
|
|
|
siglongjmp(co_running->context, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|