summary refs log tree commit diff
path: root/src/Window_Saturn.c
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2024-06-16 10:35:45 +0300
committerWlodekM <[email protected]>2024-06-16 10:35:45 +0300
commitabef6da56913f1c55528103e60a50451a39628b1 (patch)
treeb3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Window_Saturn.c
initial commit
Diffstat (limited to 'src/Window_Saturn.c')
-rw-r--r--src/Window_Saturn.c246
1 files changed, 246 insertions, 0 deletions
diff --git a/src/Window_Saturn.c b/src/Window_Saturn.c
new file mode 100644
index 0000000..e335379
--- /dev/null
+++ b/src/Window_Saturn.c
@@ -0,0 +1,246 @@
+#include "Core.h"
+#if defined CC_BUILD_SATURN
+#include "Window.h"
+#include "Platform.h"
+#include "Input.h"
+#include "Event.h"
+#include "Graphics.h"
+#include "String.h"
+#include "Funcs.h"
+#include "Bitmap.h"
+#include "Errors.h"
+#include "ExtMath.h"
+#include "Logger.h"
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <yaul.h>
+
+#define SCREEN_WIDTH    320
+#define SCREEN_HEIGHT   224
+
+static cc_bool launcherMode;
+
+struct _DisplayData DisplayInfo;
+struct _WindowData WindowInfo;
+
+static void OnVblank(void* work) {
+	smpc_peripheral_intback_issue();
+}
+
+void Window_PreInit(void) { }
+void Window_Init(void) {
+	DisplayInfo.Width  = SCREEN_WIDTH;
+	DisplayInfo.Height = SCREEN_HEIGHT;
+	DisplayInfo.ScaleX = 0.5f;
+	DisplayInfo.ScaleY = 0.5f;
+	
+	Window_Main.Width   = DisplayInfo.Width;
+	Window_Main.Height  = DisplayInfo.Height;
+	Window_Main.Focused = true;
+	Window_Main.Exists  = true;
+
+	Input.Sources = INPUT_SOURCE_GAMEPAD;
+	DisplayInfo.ContentOffsetX = 10;
+	DisplayInfo.ContentOffsetY = 10;
+
+	vdp2_tvmd_display_res_set(VDP2_TVMD_INTERLACE_NONE, VDP2_TVMD_HORZ_NORMAL_A, VDP2_TVMD_VERT_224);
+	vdp2_scrn_back_color_set(VDP2_VRAM_ADDR(0, 0), RGB1555(1, 19, 0, 0));
+	vdp2_tvmd_display_set();
+
+	smpc_peripheral_init();
+	vdp_sync_vblank_out_set(OnVblank, NULL);
+}
+
+void Window_Free(void) { }
+
+void Window_Create3D(int width, int height) { 
+	launcherMode = false; 
+}
+
+void Window_SetTitle(const cc_string* title) { }
+void Clipboard_GetText(cc_string* value) { }
+void Clipboard_SetText(const cc_string* value) { }
+
+int Window_GetWindowState(void) { return WINDOW_STATE_FULLSCREEN; }
+cc_result Window_EnterFullscreen(void) { return 0; }
+cc_result Window_ExitFullscreen(void)  { return 0; }
+int Window_IsObscured(void)            { return 0; }
+
+void Window_Show(void) { }
+void Window_SetSize(int width, int height) { }
+
+void Window_RequestClose(void) {
+	Event_RaiseVoid(&WindowEvents.Closing);
+}
+
+
+/*########################################################################################################################*
+*----------------------------------------------------Input processing-----------------------------------------------------*
+*#########################################################################################################################*/
+void Window_ProcessEvents(float delta) {
+	smpc_peripheral_process();
+}
+
+void Cursor_SetPosition(int x, int y) { } // Makes no sense for PS Vita
+
+void Window_EnableRawMouse(void)  { Input.RawMode = true; }
+void Window_UpdateRawMouse(void)  {  }
+void Window_DisableRawMouse(void) { Input.RawMode = false; }
+
+
+/*########################################################################################################################*
+*-------------------------------------------------------Gamepads----------------------------------------------------------*
+*#########################################################################################################################*/
+static void ProcessButtons(int port, int mods) {
+	Gamepad_SetButton(port, CCPAD_A, mods & PERIPHERAL_DIGITAL_A);
+	Gamepad_SetButton(port, CCPAD_B, mods & PERIPHERAL_DIGITAL_B);
+	Gamepad_SetButton(port, CCPAD_X, mods & PERIPHERAL_DIGITAL_C);
+	
+	Gamepad_SetButton(port, CCPAD_Y, mods & PERIPHERAL_DIGITAL_X);
+	Gamepad_SetButton(port, CCPAD_Z, mods & PERIPHERAL_DIGITAL_Y);
+
+	Gamepad_SetButton(port, CCPAD_L, mods & PERIPHERAL_DIGITAL_L);
+	Gamepad_SetButton(port, CCPAD_R, mods & PERIPHERAL_DIGITAL_R);
+      
+	Gamepad_SetButton(port, CCPAD_START,  mods & PERIPHERAL_DIGITAL_START);
+	Gamepad_SetButton(port, CCPAD_SELECT, mods & PERIPHERAL_DIGITAL_Z);
+
+	Gamepad_SetButton(port, CCPAD_LEFT,   mods & PERIPHERAL_DIGITAL_LEFT);
+	Gamepad_SetButton(port, CCPAD_RIGHT,  mods & PERIPHERAL_DIGITAL_RIGHT);
+	Gamepad_SetButton(port, CCPAD_UP,     mods & PERIPHERAL_DIGITAL_UP);
+	Gamepad_SetButton(port, CCPAD_DOWN,   mods & PERIPHERAL_DIGITAL_DOWN);
+}
+
+static smpc_peripheral_digital_t dig_state;
+static smpc_peripheral_analog_t  ana_state;
+
+void Window_ProcessGamepads(float delta) {
+	smpc_peripheral_digital_port(1, &dig_state);
+	ProcessButtons(0, dig_state.pressed.raw | dig_state.held.raw);
+	
+	smpc_peripheral_analog_port(1, &ana_state);
+}
+
+
+/*########################################################################################################################*
+*------------------------------------------------------Framebuffer--------------------------------------------------------*
+*#########################################################################################################################*/
+static const vdp2_vram_cycp_t vram_cycp = {
+	.pt[0].t0 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[0].t1 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[0].t2 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[0].t3 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[0].t4 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[0].t5 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[0].t6 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[0].t7 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	
+	.pt[1].t0 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[1].t1 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[1].t2 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[1].t3 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[1].t4 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[1].t5 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[1].t6 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[1].t7 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	
+	.pt[2].t0 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[2].t1 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[2].t2 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[2].t3 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[2].t4 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[2].t5 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[2].t6 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[2].t7 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	
+	.pt[3].t0 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[3].t1 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[3].t2 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[3].t3 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[3].t4 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[3].t5 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[3].t6 = VDP2_VRAM_CYCP_CHPNDR_NBG0,
+	.pt[3].t7 = VDP2_VRAM_CYCP_CHPNDR_NBG0
+};
+		
+void Window_Create2D(int width, int height) {
+	launcherMode = true;
+
+	const vdp2_scrn_bitmap_format_t format = {
+		.scroll_screen = VDP2_SCRN_NBG0,
+		.ccc           = VDP2_SCRN_CCC_RGB_32768,
+		.bitmap_size   = VDP2_SCRN_BITMAP_SIZE_512X256,
+		.palette_base  = 0x00000000,
+		.bitmap_base   = VDP2_VRAM_ADDR(0, 0x00000)
+	};
+
+	vdp2_scrn_bitmap_format_set(&format);
+	vdp2_scrn_priority_set(VDP2_SCRN_NBG0, 5);
+	vdp2_scrn_display_set(VDP2_SCRN_DISP_NBG0);
+	
+	vdp2_vram_cycp_set(&vram_cycp);
+}
+
+void Window_AllocFramebuffer(struct Bitmap* bmp, int width, int height) {
+	// bottom half of VRAM is allocated for the 512x256 16 bit per pixel "bitmap"
+	// but since only draw 224 rows anyways, can move the launcher framebuffer 
+	// slightly into the end of the bottom half of VRAM
+	bmp->scan0  = (BitmapCol*)VDP2_VRAM_ADDR(1, SCREEN_HEIGHT * 512);
+	bmp->width  = width;
+	bmp->height = height;
+}
+
+void Window_DrawFramebuffer(Rect2D r, struct Bitmap* bmp) {
+	volatile rgb1555_t* vram = (volatile rgb1555_t*)VDP2_VRAM_ADDR(0, 0x00000);
+
+	// TODO: Partial redraws seem to produce some corrupt pixels ???
+	for (int y = r.y; y < r.y + r.height; y++) 
+	{
+		BitmapCol* row = Bitmap_GetRow(bmp, y);
+		for (int x = r.x; x < r.x + r.width; x++) 
+		{
+			// TODO optimise
+			BitmapCol col = row[x];
+			cc_uint8 R = BitmapCol_R(col);
+			cc_uint8 G = BitmapCol_G(col);
+			cc_uint8 B = BitmapCol_B(col);
+			vram[x + (y * 512)] = RGB1555(0, R >> 3, G >> 3, B >> 3);
+		}
+	}
+
+	vdp2_sync();
+	vdp2_sync_wait();
+}
+
+void Window_FreeFramebuffer(struct Bitmap* bmp) {
+}
+
+
+/*########################################################################################################################*
+*------------------------------------------------------Soft keyboard------------------------------------------------------*
+*#########################################################################################################################*/
+void OnscreenKeyboard_Open(struct OpenKeyboardArgs* args) { /* TODO implement */ }
+void OnscreenKeyboard_SetText(const cc_string* text) { }
+void OnscreenKeyboard_Draw2D(Rect2D* r, struct Bitmap* bmp) { }
+void OnscreenKeyboard_Draw3D(void) { }
+void OnscreenKeyboard_Close(void) { /* TODO implement */ }
+
+
+/*########################################################################################################################*
+*-------------------------------------------------------Misc/Other--------------------------------------------------------*
+*#########################################################################################################################*/
+void Window_ShowDialog(const char* title, const char* msg) {
+	/* TODO implement */
+	Platform_LogConst(title);
+	Platform_LogConst(msg);
+}
+
+cc_result Window_OpenFileDialog(const struct OpenFileDialogArgs* args) {
+	return ERR_NOT_SUPPORTED;
+}
+
+cc_result Window_SaveFileDialog(const struct SaveFileDialogArgs* args) {
+	return ERR_NOT_SUPPORTED;
+}
+#endif