#include "system/sokol.h" #include #include #include #include #include static tic80* tic = NULL; static void app_init(void) { saudio_desc desc = {0}; desc.num_channels = 2; saudio_setup(&desc); FILE* file = fopen("cart.tic", "rb"); if(file) { fseek(file, 0, SEEK_END); int size = ftell(file); fseek(file, 0, SEEK_SET); void* cart = malloc(size); if(cart) fread(cart, size, 1, file); fclose(file); if(cart) { printf("%s\n", "cart loaded"); tic = tic80_create(saudio_sample_rate()); if(tic) { printf("%s\n", "tic created"); tic80_load(tic, cart, size); } } } sokol_gfx_init(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, 1, 1, false, false); } static tic80_input tic_input; static void app_frame(void) { if(tic) tic80_tick(tic, tic_input); sokol_gfx_draw(tic->screen); static float floatSamples[44100 / 60 * 2]; for(s32 i = 0; i < tic->sound.count; i++) floatSamples[i] = (float)tic->sound.samples[i] / SHRT_MAX; saudio_push(floatSamples, tic->sound.count / 2); } static void app_input(const sapp_event* event) { static const sapp_keycode Keys[] = { SAPP_KEYCODE_UP, SAPP_KEYCODE_DOWN, SAPP_KEYCODE_LEFT, SAPP_KEYCODE_RIGHT, SAPP_KEYCODE_Z, SAPP_KEYCODE_X, SAPP_KEYCODE_A, SAPP_KEYCODE_S, }; switch (event->type) { case SAPP_EVENTTYPE_KEY_DOWN: case SAPP_EVENTTYPE_KEY_UP: for (int i = 0; i < sizeof Keys / sizeof Keys[0]; i++) { if (event->key_code == Keys[i]) { if(event->type == SAPP_EVENTTYPE_KEY_DOWN) tic_input.gamepads.first.data |= (1 << i); else tic_input.gamepads.first.data &= ~(1 << i); } } break; default: break; } } static void app_cleanup(void) { if(tic) tic80_delete(tic); sg_shutdown(); } sapp_desc sokol_main(int argc, char* argv[]) { // args_init(argc, argv); return (sapp_desc) { .init_cb = app_init, .frame_cb = app_frame, .event_cb = app_input, .cleanup_cb = app_cleanup, .width = 3 * TIC80_FULLWIDTH, .height = 3 * TIC80_FULLHEIGHT, .window_title = "TIC-80 with Sokol renderer", .ios_keyboard_resizes_canvas = true }; }