From 9f49ce0de47b42a182d6711a462f09e9ccf36d48 Mon Sep 17 00:00:00 2001 From: Godzil Date: Wed, 15 Jan 2020 17:53:21 +0000 Subject: [PATCH] Add missing new emulate.cpp and emulate.h files It contain the emulation loop that was in "filter" header files. --- oswan/source/emulate.cpp | 560 +++++++++++++++++++++++++++++++++++++++ oswan/source/emulate.h | 31 +++ 2 files changed, 591 insertions(+) create mode 100644 oswan/source/emulate.cpp create mode 100644 oswan/source/emulate.h diff --git a/oswan/source/emulate.cpp b/oswan/source/emulate.cpp new file mode 100644 index 0000000..b28ccc9 --- /dev/null +++ b/oswan/source/emulate.cpp @@ -0,0 +1,560 @@ +//////////////////////////////////////////////////////////////////////////////// +// Main emulation loop +//////////////////////////////////////////////////////////////////////////////// +// +// +// +// +// +// +////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include /* UNIX standard function definitions */ +#include /* Error number definitions */ +#include /* POSIX terminal control definitions */ +#include + +#include "SDL.h" +#include "types.h" +#include "SDLptc.h" +#include "log.h" +#include "io.h" +#include "ws.h" +#include "rom.h" +#include "./nec/nec.h" +#include "./nec/necintrf.h" +#include "gpu.h" +#include "audio.h" +#include "memory.h" + +SDL_Joystick *joystick=NULL; +char app_window_title[256]; +int app_gameRunning=0; +int app_terminate=0; +int app_fullscreen=0; +SDL_Event app_input_event; +int app_rotated=0; + + +int ws_key_esc = 0; + + +static void read_keys() +{ + static int testJoystick=1; + + if (testJoystick==1) + { + testJoystick=0; + fprintf(log_get(),"%i joysticks were found.\n\n", SDL_NumJoysticks() ); + fprintf(log_get(),"The names of the joysticks are:\n"); + + for(int tti=0; tti < SDL_NumJoysticks(); tti++ ) + { + fprintf(log_get()," %s\n", SDL_JoystickName(tti)); + } + + SDL_JoystickEventState(SDL_ENABLE); + joystick = SDL_JoystickOpen(0); + } + else + { + if (joystick!=NULL) + { + SDL_JoystickClose(0); + SDL_JoystickEventState(SDL_ENABLE); + joystick = SDL_JoystickOpen(0); + } + } + + while ( SDL_PollEvent(&app_input_event) ) + { + if ( app_input_event.type == SDL_QUIT ) + { + ws_key_esc = 1; + } + } + + if (joystick) + { + if (SDL_JoystickGetButton(joystick,0)) + { + ws_key_start=1; + } + else + { + ws_key_start=0; + } + + if (SDL_JoystickGetButton(joystick,1)) + { + ws_key_button_a=1; + } + else + { + ws_key_button_a=0; + } + + if (SDL_JoystickGetButton(joystick,2)) + { + ws_key_button_b=1; + } + else + { + ws_key_button_b=0; + } + + + if (SDL_JoystickGetAxis(joystick,0)<-7000) + { + ws_key_x4=1; + } + else + { + ws_key_x4=0; + } + + if (SDL_JoystickGetAxis(joystick,0)>7000) + { + ws_key_x2=1; + } + else + { + ws_key_x2=0; + } + + if (SDL_JoystickGetAxis(joystick,1)<-7000) + { + ws_key_x1=1; + } + else + { + ws_key_x1=0; + } + + if (SDL_JoystickGetAxis(joystick,1)>7000) + { + ws_key_x3=1; + } + else + { + ws_key_x3=0; + } + ws_key_y4=0; + ws_key_y2=0; + ws_key_y1=0; + ws_key_y3=0; + } + else + { + ws_key_start=0; + ws_key_x4=0; + ws_key_x2=0; + ws_key_x1=0; + ws_key_x3=0; + ws_key_y4=0; + ws_key_y2=0; + ws_key_y1=0; + ws_key_y3=0; + ws_key_button_a=0; + ws_key_button_b=0; + } + + uint8 *keystate = SDL_GetKeyState(NULL); + + if ( keystate[SDLK_e]) + { + dump_memory(); + } + + if ( keystate[SDLK_r]) + { + printf("Boop\n"); + ws_reset(); + } + + if ( keystate[SDLK_ESCAPE] ) + { + ws_key_esc = 1; + } + + if ( keystate[SDLK_UP] ) + { + ws_key_x1=1; + } + + if ( keystate[SDLK_DOWN] ) + { + ws_key_x3=1; + } + + if ( keystate[SDLK_RIGHT] ) + { + ws_key_x2=1; + } + + if ( keystate[SDLK_LEFT] ) + { + ws_key_x4=1; + } + + if (keystate[SDLK_RETURN]) + { + ws_key_start=1; + } + + if (keystate[SDLK_c]) + { + ws_key_button_a=1; + } + + if (keystate[SDLK_x]) + { + ws_key_button_b=1; + } + + if (keystate[SDLK_w]) + { + ws_key_y1=1; + } + + if (keystate[SDLK_a]) + { + ws_key_y4=1; + } + + if (keystate[SDLK_s]) + { + ws_key_y3=1; + } + + if (keystate[SDLK_d]) + { + ws_key_y2=1; + } + + if (keystate[SDLK_o]) + { + ws_cyclesByLine+=10; + } + + if (keystate[SDLK_l]) + { + ws_cyclesByLine-=10; + } + +} + +//////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////// +// +// +// +// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +static void ws_drawDoubledScanline(int16 *vs, int16 *backbuffer_alias) +{ + register int32 *vs_alias = (int32 *)vs; + register int32 data; + + for (int pixel = 0 ; pixel < 224 ; pixel += 8) + { + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////// +// +// +// +// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +static void ws_drawDoubledRotatedScanline(int16 *vs, int16 *backbuffer_alias) +{ + register int32 *vs_alias = (int32 *)vs; + register int32 data; + + for (int pixel = 0 ; pixel < 144 ; pixel += 8) + { + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + data = *backbuffer_alias++; + data |= (data << 16); + *vs_alias++ = data; + } +} +//////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////// +// +// +// +// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +void ws_rotate_backbuffer(int16 *backbuffer) +{ + static int16_t temp[224*144]; + + memcpy(temp,backbuffer,224*144*2); + + for (int line=0; line<144; line++) + for (int column=0; column<224; column++) + { + backbuffer[line+((223-column)<<7)+((223-column)<<4)]=temp[column+(line<<7)+(line<<6)+(line<<5)]; + } +} +//////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////// +// +// +// +// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +void ws_emulate(void) +{ + int32_t nCount = 0; + int i = 0; + + double dTime = 0.0, dNormalLast = 0.0, dTemp; + int32_t surfacePitch; + +// 15 bits RGB555 + Format format(16, 0x007c00, 0x00003e0, 0x0000001f); + Console console; + Surface *surface; + + if (app_rotated) + { + surface = new Surface(144 * 2, 224 * 2, format); + int16 *backbuffer = (int16 *)malloc(224 * 144 * sizeof(int16)); + memset(backbuffer, 0x00, 224 * 144 * sizeof(int16)); + surfacePitch = (surface->pitch() >> 1); + + dNormalLast = (double)SDL_GetTicks(); + + console.open(app_window_title, 144 * 2, 224 * 2, format); + + while (1) + { + + dTemp = (double)SDL_GetTicks(); + dTime = dTemp - dNormalLast; + + nCount = (Sint32)(dTime * 0.07547); // does this calculation make sense? + + if (nCount <= 0) + { + SDL_Delay(2); + } // No need to do anything for a bit + else + { + + dNormalLast += nCount * (1 / 0.07547); + + if (nCount > 10) + { + nCount = 10; + } + + read_keys(); + + if (ws_key_esc) + { + console.close(); + + app_terminate = 1; + + if ((ws_rom_path != NULL) || (app_terminate)) + { + break; + } + + console.open(app_window_title, 144 * 2, 224 * 2, format); + + } + + + for (i = 0 ; i < nCount - 1 ; i++) + { + while (!ws_executeLine(backbuffer, 0)) + { + } + } + + while (!ws_executeLine(backbuffer, 1)) + { + } + + + ws_rotate_backbuffer(backbuffer); + + int16 *vs = (int16 *)surface->lock(); + int16 *backbuffer_alias = backbuffer; + + for (int line = 0 ; line < 224 ; line++) + { + ws_drawDoubledRotatedScanline(vs, backbuffer_alias); + vs += surfacePitch; + ws_drawDoubledRotatedScanline(vs, backbuffer_alias); + vs += surfacePitch; + backbuffer_alias += 144; + } + + surface->unlock(); + surface->copy(console); + console.update(); + } + } + + console.close(); + delete surface; + + } + else + { + surface = new Surface(224 * 2, 144 * 2, format); + int16 *backbuffer = (int16 *)malloc(224 * 144 * sizeof(int16)); + memset(backbuffer, 0x00, 224 * 144 * sizeof(int16)); + surfacePitch = (surface->pitch() >> 1); + + dNormalLast = (double)SDL_GetTicks(); + + console.open(app_window_title, 224 * 2, 144 * 2, format); + + while (1) + { + + dTemp = (double)SDL_GetTicks(); + dTime = dTemp - dNormalLast; + + + nCount = (Sint32)(dTime * 0.07547); // does this calculation make sense? + + if (nCount <= 0) + { + SDL_Delay(2); + } // No need to do anything for a bit + else + { + + dNormalLast += nCount * (1 / 0.07547); + + if (nCount > 10) + { + nCount = 10; + } + + read_keys(); + + if (ws_key_esc) + { + console.close(); + + app_terminate = 1; + + if ((ws_rom_path != NULL) || (app_terminate)) + { + break; + } + + console.open(app_window_title, 224 * 2, 144 * 2, format); + + } + + + for (i = 0 ; i < nCount - 1 ; i++) + { + while (!ws_executeLine(backbuffer, 0)) + { + } + } + + while (!ws_executeLine(backbuffer, 1)) + { + } + + int16 *vs = (int16 *)surface->lock(); + int16 *backbuffer_alias = backbuffer; + + for (int line = 0 ; line < 144 ; line++) + { + ws_drawDoubledScanline(vs, backbuffer_alias); + vs += surfacePitch; + ws_drawDoubledScanline(vs, backbuffer_alias); + vs += surfacePitch; + backbuffer_alias += 224; + } + + surface->unlock(); + surface->copy(console); + console.update(); + } + } + + console.close(); + delete surface; + } +} diff --git a/oswan/source/emulate.h b/oswan/source/emulate.h new file mode 100644 index 0000000..296a9c1 --- /dev/null +++ b/oswan/source/emulate.h @@ -0,0 +1,31 @@ +#ifndef EMULATE_H +#define EMULATE_H + +#define KEY_ENTER 0x0D +#define KEY_SPACE 0x20 +#define KEY_ESC 0x1b +#define KEY_UP 0x26 +#define KEY_DOWN 0x28 +#define KEY_LEFT 0x25 +#define KEY_RIGHT 0x27 +#define KEY_BUTTON1 0x57 +#define KEY_BUTTON2 0x58 + +#define GUI_COMMAND_NONE 0 +#define GUI_COMMAND_RESET 1 +#define GUI_COMMAND_SCHEME_CHANGE 2 +#define GUI_COMMAND_FILTER_CHANGE 3 + + +extern char app_window_title[256]; +extern int app_gameRunning; +extern int app_terminate; +extern int app_fullscreen; +extern SDL_Event app_input_event; +extern int app_rotated; + + +void ws_emulate(void); + + +#endif /* EMULATE_H */ \ No newline at end of file