ti83-sdk/tool/tilem-src/gui/emucore.h

96 lines
3.5 KiB
C

/*
* TilEm II
*
* Copyright (c) 2011 Benjamin Moody
*
* This program is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* IMPORTANT: The following functions may ONLY be used within
tilem_em_main() or a task function, and must be called while
holding the emulator lock. */
#define TILEM_EM_ALWAYS_FF 0xffffffff
/* Run one iteration of the emulator. LINKMODE is the link port
emulation mode. EVENTS is a mask of events we are interested in;
emulation will stop early if any of these events occur, or possibly
for other reasons (e.g., a breakpoint being hit.)
FF_EVENTS is a mask of events we want to fast-forward through
(i.e., not apply speed limiting even if enabled.) If FF_EVENTS is
set to the constant ALWAYS_FF, speed limiting is completely
disabled.
If KEEP_AWAKE is FALSE and the calculator CPU is turned off, this
function may block until another thread wakes it up; in that case,
no timer events will be triggered, and the elapsed time cannot be
measured in any meaningful way. If KEEP_AWAKE is TRUE, the
emulator continues running even when the CPU is turned off.
TIMEOUT is the length of time (microseconds) to run the emulator.
If ELAPSED is non-null, *ELAPSED will be set to the actual number
of microseconds elapsed.
The return value is a mask indicating which of the requested events
occurred. */
dword tilem_em_run(TilemCalcEmulator *emu, int linkmode,
dword events, dword ff_events, gboolean keep_awake,
int timeout, int *elapsed);
/* Main loop */
gpointer tilem_em_main(gpointer data);
/* Run the calculator for a short time. */
void tilem_em_delay(TilemCalcEmulator *emu, int timeout, gboolean ff);
/* Send a byte to the calculator. */
int tilem_em_send_byte(TilemCalcEmulator *emu, unsigned value,
int timeout, gboolean ff);
/* Receive a byte from the calculator. */
int tilem_em_get_byte(TilemCalcEmulator *emu, int timeout, gboolean ff);
/* Wake up calculator if currently turned off. */
void tilem_em_wake_up(TilemCalcEmulator *emu, gboolean ff);
/* Set progress window title. Set TITLE to NULL to disable progress
window. */
void tilem_em_set_progress_title(TilemCalcEmulator *emu, const char *title);
/* Set current progress information. FRAC is the estimated fraction
of the task completed; STATUS is a text description of the current
operation. */
void tilem_em_set_progress(TilemCalcEmulator *emu, gdouble frac,
const char *status);
/* Lock emulator. */
#define tilem_em_lock(emu) \
g_mutex_lock(emu->calc_mutex)
/* Unlock temporarily if another thread is waiting. */
#define tilem_em_check_yield(emu) \
do { \
if (g_atomic_int_get(&emu->calc_lock_waiting)) \
g_cond_wait(emu->calc_wakeup_cond, emu->calc_mutex); \
} while (0)
/* Unlock emulator. */
#define tilem_em_unlock(emu) \
do { \
tilem_em_check_yield(emu); \
g_mutex_unlock(emu->calc_mutex); \
} while (0)