From 5c6bbec87aa97f1a247301b44f5eff91f316116d Mon Sep 17 00:00:00 2001 From: InvisibleUp Date: Fri, 10 Jul 2020 21:51:05 -0400 Subject: [PATCH] Add configuration file support Also tweaked with the UseLargeScreen hack and factored out some more stuff into src/HW/RAM. --- .gitmodules | 3 + cfg/EMCONFIG.h | 6 +- cfg/MACPLUS.h | 1 + meson.build | 4 +- src/CFGMAN.c | 156 ++++++++++++++++++++ src/CFGMAN.h | 35 +++++ src/GLOBGLUE.c | 110 +------------- src/HW/RAM/RAMADDR.h | 112 ++++++++++++++ src/HW/SCREEN/SCRNEMDV.c | 53 ++++++- src/HW/SCREEN/SCRNEMDV.h | 16 +- src/HW/SCREEN/SCRNMAPR.c | 53 ------- src/HW/SCREEN/SCRNMAPR.h | 19 --- src/PATCHES/ROMEMDEV.c | 1 + src/PATCHES/ROMEMDEV.h | 5 +- src/PATCHES/SCRNHACK.c | 312 +++++++++++++++++++++------------------ src/PATCHES/SCRNHACK.h | 2 +- src/PATCHES/SONYDRV.c | 10 +- src/PROGMAIN.c | 7 +- src/UI/COMOSGLU.c | 2 +- src/UI/CONFIGM.c | 2 +- src/UI/MYOSGLUE.h | 10 -- src/UI/SDL2/OSGLUSD2.c | 15 +- src/UI/SDL2/VIDEO.c | 5 +- src/tomlc99 | 1 + 24 files changed, 576 insertions(+), 364 deletions(-) create mode 100644 src/CFGMAN.c create mode 100644 src/CFGMAN.h create mode 100644 src/HW/RAM/RAMADDR.h delete mode 100644 src/HW/SCREEN/SCRNMAPR.c delete mode 100644 src/HW/SCREEN/SCRNMAPR.h create mode 160000 src/tomlc99 diff --git a/.gitmodules b/.gitmodules index 503d6fc..2a682bd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "src/incbin"] path = src/incbin url = https://github.com/graphitemaster/incbin +[submodule "src/tomlc99"] + path = src/tomlc99 + url = https://github.com/cktan/tomlc99 diff --git a/cfg/EMCONFIG.h b/cfg/EMCONFIG.h index 41868be..df6eec8 100644 --- a/cfg/EMCONFIG.h +++ b/cfg/EMCONFIG.h @@ -55,12 +55,12 @@ #define AutoKeyThresh 0x06 #define AutoKeyRate 0x03 -#define CurEmMd kEmMd_II +#define CurEmMd kEmMd_Plus //#if (CurEmMd == kEmMd_Plus) -//#include "MACPLUS.h" +#include "MACPLUS.h" //#elif (CurEmMd == kEmMd_II) -#include "MACII.h" +//#include "MACII.h" //#endif #define WantDisasm 0 diff --git a/cfg/MACPLUS.h b/cfg/MACPLUS.h index b2d08cb..5dc92d8 100644 --- a/cfg/MACPLUS.h +++ b/cfg/MACPLUS.h @@ -1,3 +1,4 @@ +#pragma once #define EmClassicKbrd 1 #define EmADB 0 #define EmRTC 1 diff --git a/meson.build b/meson.build index a3e6e76..16071fa 100644 --- a/meson.build +++ b/meson.build @@ -152,9 +152,11 @@ UI_SRC = [ EMU_SRC = [ 'src/PROGMAIN.c', 'src/GLOBGLUE.c', + 'src/CFGMAN.c', 'src/PATCHES/ROMEMDEV.c', 'src/UTIL/DATE2SEC.c', 'src/LANG/INTLCHAR.c', + 'src/tomlc99/toml.c' ] EMU_INC = include_directories([ @@ -166,7 +168,7 @@ EMU_INC = include_directories([ # Just gonna do an SDL2 Mac Plus for now executable( 'microvmac', - sources: MAC_SRC['II'] + UI_SRC + EMU_SRC, + sources: MAC_SRC['Plus'] + UI_SRC + EMU_SRC, dependencies: [lSDL2], include_directories: EMU_INC, ) diff --git a/src/CFGMAN.c b/src/CFGMAN.c new file mode 100644 index 0000000..bcdd7e1 --- /dev/null +++ b/src/CFGMAN.c @@ -0,0 +1,156 @@ +/* + * CFGMAN.c + * + * Configuration Management + * + */ + +#include "tomlc99/toml.h" +#include +#include +#include +#include +#include +#include "HW/SCREEN/SCRNEMDV.h" + +toml_table_t* CONFIG; +const char CONFIG_PATH[] = "uvmac-cfg.toml"; + +/* Load existing config */ +static bool Config_TryLoad() +{ + FILE* fp; + char errbuf[200]; + + /* Open the file. */ + fp = fopen("uvmac-cfg.toml", "r"); + if (fp == NULL) { + return false; + } + + /* Run the file through the parser. */ + CONFIG = toml_parse_file(fp, errbuf, sizeof(errbuf)); + if (CONFIG == NULL) { + fclose(fp); + return false; + } + + fclose(fp); + return true; +} + +/* Create new configuration */ +static bool Config_TryCreate() +{ + /* TODO: implement this. or really, TOML creation in general. */ + char errbuf[200]; + CONFIG = toml_parse("", errbuf, sizeof(errbuf)); + return (CONFIG != NULL); +} + +/* Load or create config and prepare for use */ +bool Config_TryInit() +{ + bool okay; + okay = Config_TryLoad(); + if (!okay) { okay = Config_TryCreate(); } + if (!okay) { return false; } + + // Initialize per-device configuration + okay = Screen_LoadCfg(); + if (!okay) { return false; } + + return true; +} + +/* Locate a raw value given a table/key pair */ +static bool Config_GetRawValue(const char table[], const char key[], toml_raw_t *value) +{ + toml_table_t *table_raw; + + /* Locate the table. */ + table_raw = toml_table_in(CONFIG, table); + if (table_raw == NULL) { return false; } + + /* Locate the key */ + *value = toml_raw_in(table_raw, key); + if (*value == NULL) { return false; } + return true; +} + +/* Check if key exists */ +bool Config_KeyExists(const char table[], const char key[]) +{ + toml_raw_t value_raw; + return Config_GetRawValue(table, key, &value_raw); +} + +/* Read a boolean */ +bool Config_GetBool(const char table[], const char key[], bool *value, bool defaultValue) +{ + toml_raw_t value_raw; + bool found, okay; + int result; + + found = Config_GetRawValue(table, key, &value_raw); + if (!found) { + // TODO: write default to TOML file + *value = defaultValue; + return true; + } + + okay = (toml_rtob(value_raw, &result) == 0); + *value = result; + return okay; +} + +/* Read an integer */ +bool Config_GetInt(const char table[], const char key[], int64_t *value, int64_t defaultValue) +{ + toml_raw_t value_raw; + bool found; + + found = Config_GetRawValue(table, key, &value_raw); + if (!found) { + // TODO: write default to TOML file + *value = defaultValue; + return true; + } + + return (toml_rtoi(value_raw, value) == 0); +} + +/* Read a double-precision floating point number */ +bool Config_GetFloat(const char table[], const char key[], double *value, double defaultValue) +{ + toml_raw_t value_raw; + bool found; + + found = Config_GetRawValue(table, key, &value_raw); + if (!found) { + // TODO: write default to TOML file + *value = defaultValue; + return true; + } + + return (toml_rtod(value_raw, value) == 0); +} + +/* Read a string value */ +bool Config_GetString(const char table[], const char key[], char **value, const char *defaultValue) +{ + toml_raw_t value_raw; + bool found; + + found = Config_GetRawValue(table, key, &value_raw); + if (!found) { + // TODO: write default to TOML file + int defaultLen = strlen(defaultValue)+1; + *value = malloc(defaultLen); + strncpy(*value, defaultValue, defaultLen); + + return true; + } + + return (toml_rtos(value_raw, value) == 0); +} diff --git a/src/CFGMAN.h b/src/CFGMAN.h new file mode 100644 index 0000000..bf6c3a7 --- /dev/null +++ b/src/CFGMAN.h @@ -0,0 +1,35 @@ +/* + * CFGMAN.h + * + * Configuration Management + * + */ + +/* Load or create config and prepare for use */ +#pragma once + +bool Config_TryInit(); + +/* Check if key exists */ +bool Config_KeyExists(const char table[], const char key[]); +/* Read a boolean */ +bool Config_GetBool(const char table[], const char key[], bool *value, bool defaultValue); +/* Read an integer */ +bool Config_GetInt(const char table[], const char key[], int64_t *value, int64_t defaultValue); +/* Read a double-precision floating point number */ +bool Config_GetFloat(const char table[], const char key[], double *value, double defaultValue); +/* Read a string value */ +bool Config_GetString(const char table[], const char key[], char **value, const char *defaultValue); + +/* List of known tables and keys */ +#define CONFIG_SCC_REALPORT(MACPORT) "SCC_#MACPORT", "RealPort" +#define CONFIG_SCC_REALPORT(MACPORT) "SCC_#MACPORT", "RealPort" + +#define CONFIG_VIDEO_BLACK "Video", "ColorBlack" +#define CONFIG_VIDEO_WHITE "Video", "ColorWhite" +#define CONFIG_VIDEO_WIDTH "Video", "Width" +#define CONFIG_VIDEO_HEIGHT "Video", "Height" +#define CONFIG_VIDEO_DEPTH "Video", "Depth" +#define CONFIG_VIDEO_USEHACK "Video", "UseLargeScreenHack" + +#define DISK_PATH(NUM) "Disk", "Path#NUM" diff --git a/src/GLOBGLUE.c b/src/GLOBGLUE.c index ecb1947..50d4d1c 100644 --- a/src/GLOBGLUE.c +++ b/src/GLOBGLUE.c @@ -33,6 +33,7 @@ #endif #include "GLOBGLUE.h" +#include "HW/RAM/RAMADDR.h" /* ReportAbnormalID unused 0x111D - 0x11FF @@ -233,72 +234,6 @@ GLOBALPROC DoReportAbnormalID(uint16_t id } #endif -/* map of address space */ - -#define kRAM_Base 0x00000000 /* when overlay off */ -#if (CurEmMd == kEmMd_PB100) -#define kRAM_ln2Spc 23 -#elif (CurEmMd == kEmMd_II) || (CurEmMd == kEmMd_IIx) -#define kRAM_ln2Spc 23 -#else -#define kRAM_ln2Spc 22 -#endif - -#if IncludeVidMem -#if CurEmMd == kEmMd_PB100 -#define kVidMem_Base 0x00FA0000 -#define kVidMem_ln2Spc 16 -#else -#define kVidMem_Base 0x00540000 -#define kVidMem_ln2Spc 18 -#endif -#endif - -#if CurEmMd == kEmMd_PB100 -#define kSCSI_Block_Base 0x00F90000 -#define kSCSI_ln2Spc 16 -#else -#define kSCSI_Block_Base 0x00580000 -#define kSCSI_ln2Spc 19 -#endif - -#define kRAM_Overlay_Base 0x00600000 /* when overlay on */ -#define kRAM_Overlay_Top 0x00800000 - -#if CurEmMd == kEmMd_PB100 -#define kSCCRd_Block_Base 0x00FD0000 -#define kSCC_ln2Spc 16 -#else -#define kSCCRd_Block_Base 0x00800000 -#define kSCC_ln2Spc 22 -#endif - -#if CurEmMd != kEmMd_PB100 -#define kSCCWr_Block_Base 0x00A00000 -#define kSCCWr_Block_Top 0x00C00000 -#endif - -#if CurEmMd == kEmMd_PB100 -#define kIWM_Block_Base 0x00F60000 -#define kIWM_ln2Spc 16 -#else -#define kIWM_Block_Base 0x00C00000 -#define kIWM_ln2Spc 21 -#endif - -#if CurEmMd == kEmMd_PB100 -#define kVIA1_Block_Base 0x00F70000 -#define kVIA1_ln2Spc 16 -#else -#define kVIA1_Block_Base 0x00E80000 -#define kVIA1_ln2Spc 19 -#endif - -#if CurEmMd == kEmMd_PB100 -#define kASC_Block_Base 0x00FB0000 -#define kASC_ln2Spc 16 -#endif -#define kASC_Mask 0x00000FFF #if IncludeExtnPbufs @@ -622,49 +557,6 @@ GLOBALPROC Extn_Reset(void) ParamAddrHi = (uint16_t) - 1; } -/* implementation of read/write for everything but RAM and ROM */ - -#define kSCC_Mask 0x03 - -#define kVIA1_Mask 0x00000F -#if EmVIA2 -#define kVIA2_Mask 0x00000F -#endif - -#define kIWM_Mask 0x00000F /* Allocated Memory Bandwidth for IWM */ - -#if CurEmMd <= kEmMd_512Ke -#define ROM_CmpZeroMask 0 -#elif CurEmMd <= kEmMd_Plus -#if kROM_Size > 0x00020000 -#define ROM_CmpZeroMask 0 /* For hacks like Mac ROM-inator */ -#else -#define ROM_CmpZeroMask 0x00020000 -#endif -#elif CurEmMd <= kEmMd_PB100 -#define ROM_CmpZeroMask 0 -#elif CurEmMd <= kEmMd_IIx -#define ROM_CmpZeroMask 0 -#else -#error "ROM_CmpZeroMask not defined" -#endif - -#define kROM_cmpmask (0x00F00000 | ROM_CmpZeroMask) - -#if CurEmMd <= kEmMd_512Ke -#define Overlay_ROM_CmpZeroMask 0x00100000 -#elif CurEmMd <= kEmMd_Plus -#define Overlay_ROM_CmpZeroMask 0x00020000 -#elif CurEmMd <= kEmMd_Classic -#define Overlay_ROM_CmpZeroMask 0x00300000 -#elif CurEmMd <= kEmMd_PB100 -#define Overlay_ROM_CmpZeroMask 0 -#elif CurEmMd <= kEmMd_IIx -#define Overlay_ROM_CmpZeroMask 0 -#else -#error "Overlay_ROM_CmpZeroMask not defined" -#endif - enum { kMMDV_VIA1, #if EmVIA2 diff --git a/src/HW/RAM/RAMADDR.h b/src/HW/RAM/RAMADDR.h new file mode 100644 index 0000000..5f3c7e6 --- /dev/null +++ b/src/HW/RAM/RAMADDR.h @@ -0,0 +1,112 @@ +#pragma once + +/* map of address space */ + +#define kRAM_Base 0x00000000 /* when overlay off */ +#if (CurEmMd == kEmMd_PB100) +#define kRAM_ln2Spc 23 +#elif (CurEmMd == kEmMd_II) || (CurEmMd == kEmMd_IIx) +#define kRAM_ln2Spc 23 +#else +#define kRAM_ln2Spc 22 +#endif + +#if IncludeVidMem +#if CurEmMd == kEmMd_PB100 +#define kVidMem_Base 0x00FA0000 +#define kVidMem_ln2Spc 16 +#else +#define kVidMem_Base 0x00540000 +#define kVidMem_ln2Spc 18 +#endif +#endif + +#if CurEmMd == kEmMd_PB100 +#define kSCSI_Block_Base 0x00F90000 +#define kSCSI_ln2Spc 16 +#else +#define kSCSI_Block_Base 0x00580000 +#define kSCSI_ln2Spc 19 +#endif + +#define kRAM_Overlay_Base 0x00600000 /* when overlay on */ +#define kRAM_Overlay_Top 0x00800000 + +#if CurEmMd == kEmMd_PB100 +#define kSCCRd_Block_Base 0x00FD0000 +#define kSCC_ln2Spc 16 +#else +#define kSCCRd_Block_Base 0x00800000 +#define kSCC_ln2Spc 22 +#endif + +#if CurEmMd != kEmMd_PB100 +#define kSCCWr_Block_Base 0x00A00000 +#define kSCCWr_Block_Top 0x00C00000 +#endif + +#if CurEmMd == kEmMd_PB100 +#define kIWM_Block_Base 0x00F60000 +#define kIWM_ln2Spc 16 +#else +#define kIWM_Block_Base 0x00C00000 +#define kIWM_ln2Spc 21 +#endif + +#if CurEmMd == kEmMd_PB100 +#define kVIA1_Block_Base 0x00F70000 +#define kVIA1_ln2Spc 16 +#else +#define kVIA1_Block_Base 0x00E80000 +#define kVIA1_ln2Spc 19 +#endif + +#if CurEmMd == kEmMd_PB100 +#define kASC_Block_Base 0x00FB0000 +#define kASC_ln2Spc 16 +#endif +#define kASC_Mask 0x00000FFF + + +/* implementation of read/write for everything but RAM and ROM */ + +#define kSCC_Mask 0x03 + +#define kVIA1_Mask 0x00000F +#if EmVIA2 +#define kVIA2_Mask 0x00000F +#endif + +#define kIWM_Mask 0x00000F /* Allocated Memory Bandwidth for IWM */ + +#if CurEmMd <= kEmMd_512Ke +#define ROM_CmpZeroMask 0 +#elif CurEmMd <= kEmMd_Plus +#if kROM_Size > 0x00020000 +#define ROM_CmpZeroMask 0 /* For hacks like Mac ROM-inator */ +#else +#define ROM_CmpZeroMask 0x00020000 +#endif +#elif CurEmMd <= kEmMd_PB100 +#define ROM_CmpZeroMask 0 +#elif CurEmMd <= kEmMd_IIx +#define ROM_CmpZeroMask 0 +#else +#error "ROM_CmpZeroMask not defined" +#endif + +#define kROM_cmpmask (0x00F00000 | ROM_CmpZeroMask) + +#if CurEmMd <= kEmMd_512Ke +#define Overlay_ROM_CmpZeroMask 0x00100000 +#elif CurEmMd <= kEmMd_Plus +#define Overlay_ROM_CmpZeroMask 0x00020000 +#elif CurEmMd <= kEmMd_Classic +#define Overlay_ROM_CmpZeroMask 0x00300000 +#elif CurEmMd <= kEmMd_PB100 +#define Overlay_ROM_CmpZeroMask 0 +#elif CurEmMd <= kEmMd_IIx +#define Overlay_ROM_CmpZeroMask 0 +#else +#error "Overlay_ROM_CmpZeroMask not defined" +#endif diff --git a/src/HW/SCREEN/SCRNEMDV.c b/src/HW/SCREEN/SCRNEMDV.c index 95b1b2a..cd43c76 100644 --- a/src/HW/SCREEN/SCRNEMDV.c +++ b/src/HW/SCREEN/SCRNEMDV.c @@ -24,15 +24,13 @@ Macintosh port of vMac, by Philip Cummins. */ -#ifndef AllFiles #include "SYSDEPNS.h" #include "UI/MYOSGLUE.h" #include "UTIL/ENDIANAC.h" #include "EMCONFIG.h" #include "GLOBGLUE.h" -#endif - #include "HW/SCREEN/SCRNEMDV.h" +#include "CFGMAN.h" #if ! IncludeVidMem #define kMain_Offset 0x5900 @@ -41,7 +39,54 @@ #define kAlternate_Buffer (kRAM_Size - kAlternate_Offset) #endif -GLOBALPROC Screen_EndTickNotify(void) +// Configuration variables +uint16_t vMacScreenHeight; +uint16_t vMacScreenWidth; +uint16_t vMacScreenDepth; +uint32_t vMacScreenNumPixels; +uint32_t vMacScreenNumBits; +uint32_t vMacScreenNumBytes; +uint32_t vMacScreenBitWidth; +uint32_t vMacScreenByteWidth; +uint32_t vMacScreenMonoNumBytes; +uint32_t vMacScreenMonoByteWidth; +bool UseLargeScreenHack; + +bool Screen_Init(void) +{ + return true; +} + +bool Screen_LoadCfg() +{ + // Load configuration + int64_t temp; + bool okay; + + okay = Config_GetInt(CONFIG_VIDEO_HEIGHT, &temp, 342); + if (!okay) { return false; } + vMacScreenHeight = temp; + okay = Config_GetInt(CONFIG_VIDEO_WIDTH, &temp, 512); + if (!okay) { return false; } + vMacScreenWidth = temp; + okay = Config_GetInt(CONFIG_VIDEO_DEPTH, &temp, 0); + if (!okay) { return false; } + vMacScreenDepth = temp; + okay = Config_GetBool(CONFIG_VIDEO_USEHACK, &UseLargeScreenHack, false); + if (!okay) { return false; } + + // Compute the other sorts of things + vMacScreenNumPixels = vMacScreenHeight * vMacScreenWidth; + vMacScreenNumBits = vMacScreenNumPixels << vMacScreenDepth; + vMacScreenNumBytes = vMacScreenNumBits / 8; + vMacScreenBitWidth = vMacScreenWidth << vMacScreenDepth; + vMacScreenByteWidth = vMacScreenBitWidth / 8; + vMacScreenMonoNumBytes = vMacScreenNumPixels / 8; + vMacScreenMonoByteWidth = (long)vMacScreenWidth / 8; + return true; +} + +void Screen_EndTickNotify(void) { uint8_t * screencurrentbuff; diff --git a/src/HW/SCREEN/SCRNEMDV.h b/src/HW/SCREEN/SCRNEMDV.h index b4ecac5..b172e72 100644 --- a/src/HW/SCREEN/SCRNEMDV.h +++ b/src/HW/SCREEN/SCRNEMDV.h @@ -18,6 +18,20 @@ #ifndef SCRNEMDV_H #define SCRNEMDV_H -EXPORTPROC Screen_EndTickNotify(void); +bool Screen_LoadCfg(void); +bool Screen_Init(void); +void Screen_EndTickNotify(void); + +extern uint16_t vMacScreenHeight; +extern uint16_t vMacScreenWidth; +extern uint16_t vMacScreenDepth; +extern uint32_t vMacScreenNumPixels; +extern uint32_t vMacScreenNumBits; +extern uint32_t vMacScreenNumBytes; +extern uint32_t vMacScreenBitWidth; +extern uint32_t vMacScreenByteWidth; +extern uint32_t vMacScreenMonoNumBytes; +extern uint32_t vMacScreenMonoByteWidth; +bool UseLargeScreenHack; #endif diff --git a/src/HW/SCREEN/SCRNMAPR.c b/src/HW/SCREEN/SCRNMAPR.c deleted file mode 100644 index 792c45a..0000000 --- a/src/HW/SCREEN/SCRNMAPR.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - HW/SCREEN/SCRNMAPR.h - - Copyright (C) 2012 Paul C. Pratt - - You can redistribute this file and/or modify it under the terms - of version 2 of the GNU General Public License as published by - the Free Software Foundation. You should have received a copy - of the license along with this file; see the file COPYING. - - This file 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 - license for more details. -*/ - -/* - SCReeN MAPpeR -*/ - -#include "SCRNMAPR.h" -#include - -void ScrnMapr_DoMap( - rect_t region, rect_t bounds, - const color_t *src, color_t *dst, - uint8_t src_depth, uint8_t dst_depth, - const color_t *map, uint8_t scale -) { - /* check of parameters */ - assert(src_depth >= 0); - assert(src_depth <= 3); - assert(dst_depth >= src_depth); - - /* define variables */ - int x, y, sx, sy; // loop vars - uint16_t line_width = bounds.right - bounds.left; - - for (y = region.top; y < region.bottom; y += 1) - { - for (sy = 0; sy < scale - 1; sy += 1) - { - for (x = region.left; x < region.right; x += 1) - { - color_t color = src[(y+sy)*line_width + x]; - for (sx = 0; sx < scale - 1; sx += 1) - { - dst[(y+sy)*line_width + x*scale + sx] = map[color]; - } - } - } - } -} diff --git a/src/HW/SCREEN/SCRNMAPR.h b/src/HW/SCREEN/SCRNMAPR.h deleted file mode 100644 index 59316f2..0000000 --- a/src/HW/SCREEN/SCRNMAPR.h +++ /dev/null @@ -1,19 +0,0 @@ -/* SCRNMAPR.h */ -#include -#pragma once - -typedef struct { - uint16_t top; - uint16_t left; - uint16_t right; - uint16_t bottom; -} rect_t; - -typedef uint32_t color_t; - -// Copy a rectangular bitmap region, scaling and converting color depth as needed -void ScrnMapr_DoMap( - rect_t bounds, - const uint8_t *src, uint8_t *dst, uint8_t src_depth, uint8_t dst_depth, - const uint8_t *map, uint8_t scale -); diff --git a/src/PATCHES/ROMEMDEV.c b/src/PATCHES/ROMEMDEV.c index aa8f2c3..126ec65 100644 --- a/src/PATCHES/ROMEMDEV.c +++ b/src/PATCHES/ROMEMDEV.c @@ -32,6 +32,7 @@ #include "UTIL/ENDIANAC.h" #include "PATCHES/ROMEMDEV.h" #include "PATCHES/SCRNHACK.h" +#include "PATCHES/SONYDRV.h" #ifdef CurAltHappyMac #include "HPMCHACK.h" #endif diff --git a/src/PATCHES/ROMEMDEV.h b/src/PATCHES/ROMEMDEV.h index f45d195..1766030 100644 --- a/src/PATCHES/ROMEMDEV.h +++ b/src/PATCHES/ROMEMDEV.h @@ -18,9 +18,6 @@ #define ROMEMDEV_H -#ifndef UseLargeScreenHack -#define UseLargeScreenHack 0 -#endif #ifndef DisableRomCheck #define DisableRomCheck 1 #endif @@ -34,4 +31,4 @@ EXPORTFUNC bool ROM_Init(void); -#endif \ No newline at end of file +#endif diff --git a/src/PATCHES/SCRNHACK.c b/src/PATCHES/SCRNHACK.c index 6bafb2f..02e29fe 100644 --- a/src/PATCHES/SCRNHACK.c +++ b/src/PATCHES/SCRNHACK.c @@ -28,13 +28,12 @@ #include "GLOBGLUE.h" #include "incbin/incbin.h" #include "PATCHES/ROMEMDEV.h" +#include "HW/SCREEN/SCRNEMDV.h" -void ScreenHack_Install(uint8_t *pto) +static void ScreenHack_Install_64K(uint8_t **pto) { - uint8_t * patchp = pto; - if (!UseLargeScreenHack) {return; } - -#if CurEmMd <= kEmMd_128K + uint8_t *patchp = *pto; + do_put_mem_long(112 + ROM, kVidMem_Base); do_put_mem_long(260 + ROM, kVidMem_Base); do_put_mem_long(292 + ROM, kVidMem_Base @@ -54,11 +53,11 @@ void ScreenHack_Install(uint8_t *pto) /* screen setup, main */ { - pto = 862 + ROM; - do_put_mem_word(pto, 0x4EB9); /* JSR */ - pto += 2; - do_put_mem_long(pto, kROM_Base + (patchp - ROM)); - pto += 4; + *pto = 862 + ROM; + do_put_mem_word(*pto, 0x4EB9); /* JSR */ + *pto += 2; + do_put_mem_long(*pto, kROM_Base + (patchp - ROM)); + *pto += 4; do_put_mem_word(patchp, 0x21FC); /* MOVE.L */ patchp += 2; @@ -99,58 +98,64 @@ void ScreenHack_Install(uint8_t *pto) do_put_mem_word(2052 + ROM, vMacScreenWidth / 8 - 2); /* cursor handling */ -#if vMacScreenWidth >= 1024 - pto = 3448 + ROM; - do_put_mem_word(pto, 0x4EB9); /* JSR */ - pto += 2; - do_put_mem_long(pto, kROM_Base + (patchp - ROM)); - pto += 4; + if (vMacScreenWidth >= 1024) { + *pto = 3448 + ROM; + do_put_mem_word(*pto, 0x4EB9); /* JSR */ + *pto += 2; + do_put_mem_long(*pto, kROM_Base + (patchp - ROM)); + *pto += 4; - do_put_mem_word(patchp, 0x41F8); /* Lea.L (CrsrSave),A0 */ - patchp += 2; - do_put_mem_word(patchp, 0x088C); - patchp += 2; - do_put_mem_word(patchp, 0x203C); /* MOVE.L #$x,D0 */ - patchp += 2; - do_put_mem_long(patchp, (vMacScreenWidth / 8)); - patchp += 4; - do_put_mem_word(patchp, 0x4E75); /* RTS */ - patchp += 2; -#else - do_put_mem_word(3452 + ROM, 0x7000 + (vMacScreenWidth / 8)); -#endif + do_put_mem_word(patchp, 0x41F8); /* Lea.L (CrsrSave),A0 */ + patchp += 2; + do_put_mem_word(patchp, 0x088C); + patchp += 2; + do_put_mem_word(patchp, 0x203C); /* MOVE.L #$x,D0 */ + patchp += 2; + do_put_mem_long(patchp, (vMacScreenWidth / 8)); + patchp += 4; + do_put_mem_word(patchp, 0x4E75); /* RTS */ + patchp += 2; + } else { + do_put_mem_word(3452 + ROM, 0x7000 + (vMacScreenWidth / 8)); + } + do_put_mem_word(3572 + ROM, vMacScreenWidth - 32); do_put_mem_word(3578 + ROM, vMacScreenWidth - 32); do_put_mem_word(3610 + ROM, vMacScreenHeight - 16); do_put_mem_word(3616 + ROM, vMacScreenHeight); -#if vMacScreenWidth >= 1024 - pto = 3646 + ROM; - do_put_mem_word(pto, 0x4EB9); /* JSR */ - pto += 2; - do_put_mem_long(pto, kROM_Base + (patchp - ROM)); - pto += 4; + + if (vMacScreenWidth >= 1024) { + *pto = 3646 + ROM; + do_put_mem_word(*pto, 0x4EB9); /* JSR */ + *pto += 2; + do_put_mem_long(*pto, kROM_Base + (patchp - ROM)); + *pto += 4; - do_put_mem_word(patchp, 0x2A3C); /* MOVE.L #$x,D5 */ - patchp += 2; - do_put_mem_long(patchp, (vMacScreenWidth / 8)); - patchp += 4; - do_put_mem_word(patchp, 0xC2C5); /* MulU D5,D1 */ - patchp += 2; - do_put_mem_word(patchp, 0xD3C1); /* AddA.L D1,A1 */ - patchp += 2; - do_put_mem_word(patchp, 0x4E75); /* RTS */ - patchp += 2; -#else - do_put_mem_word(3646 + ROM, 0x7A00 + (vMacScreenWidth / 8)); -#endif + do_put_mem_word(patchp, 0x2A3C); /* MOVE.L #$x,D5 */ + patchp += 2; + do_put_mem_long(patchp, (vMacScreenWidth / 8)); + patchp += 4; + do_put_mem_word(patchp, 0xC2C5); /* MulU D5,D1 */ + patchp += 2; + do_put_mem_word(patchp, 0xD3C1); /* AddA.L D1,A1 */ + patchp += 2; + do_put_mem_word(patchp, 0x4E75); /* RTS */ + patchp += 2; + } else { + do_put_mem_word(3646 + ROM, 0x7A00 + (vMacScreenWidth / 8)); + } /* set up screen bitmap */ do_put_mem_word(3832 + ROM, vMacScreenHeight); do_put_mem_word(3838 + ROM, vMacScreenWidth); /* do_put_mem_word(7810 + ROM, vMacScreenHeight); */ +} -#elif CurEmMd <= kEmMd_Plus - +// Currently not functional +static void ScreenHack_Install_128K(uint8_t **pto) +{ + uint8_t *patchp = *pto; + do_put_mem_long(138 + ROM, kVidMem_Base); do_put_mem_long(326 + ROM, kVidMem_Base); do_put_mem_long(356 + ROM, kVidMem_Base @@ -173,11 +178,11 @@ void ScreenHack_Install(uint8_t *pto) /* screen setup, main */ { - pto = 1132 + ROM; - do_put_mem_word(pto, 0x4EB9); /* JSR */ - pto += 2; - do_put_mem_long(pto, kROM_Base + (patchp - ROM)); - pto += 4; + *pto = 1132 + ROM; + do_put_mem_word(*pto, 0x4EB9); /* JSR */ + *pto += 2; + do_put_mem_long(*pto, kROM_Base + (patchp - ROM)); + *pto += 4; do_put_mem_word(patchp, 0x21FC); /* MOVE.L */ patchp += 2; @@ -222,50 +227,50 @@ void ScreenHack_Install(uint8_t *pto) do_put_mem_word(3894 + ROM, vMacScreenWidth / 8 - 2); /* cursor handling */ -#if vMacScreenWidth >= 1024 - pto = 7372 + ROM; - do_put_mem_word(pto, 0x4EB9); /* JSR */ - pto += 2; - do_put_mem_long(pto, kROM_Base + (patchp - ROM)); - pto += 4; + if (vMacScreenWidth >= 1024) { + *pto = 7372 + ROM; + do_put_mem_word(*pto, 0x4EB9); /* JSR */ + *pto += 2; + do_put_mem_long(*pto, kROM_Base + (patchp - ROM)); + *pto += 4; - do_put_mem_word(patchp, 0x41F8); /* Lea.L (CrsrSave), A0 */ - patchp += 2; - do_put_mem_word(patchp, 0x088C); - patchp += 2; - do_put_mem_word(patchp, 0x203C); /* MOVE.L #$x, D0 */ - patchp += 2; - do_put_mem_long(patchp, (vMacScreenWidth / 8)); - patchp += 4; - do_put_mem_word(patchp, 0x4E75); /* RTS */ - patchp += 2; -#else - do_put_mem_word(7376 + ROM, 0x7000 + (vMacScreenWidth / 8)); -#endif + do_put_mem_word(patchp, 0x41F8); /* Lea.L (CrsrSave), A0 */ + patchp += 2; + do_put_mem_word(patchp, 0x088C); + patchp += 2; + do_put_mem_word(patchp, 0x203C); /* MOVE.L #$x, D0 */ + patchp += 2; + do_put_mem_long(patchp, (vMacScreenWidth / 8)); + patchp += 4; + do_put_mem_word(patchp, 0x4E75); /* RTS */ + patchp += 2; + } else { + do_put_mem_word(7376 + ROM, 0x7000 + (vMacScreenWidth / 8)); + } do_put_mem_word(7496 + ROM, vMacScreenWidth - 32); do_put_mem_word(7502 + ROM, vMacScreenWidth - 32); do_put_mem_word(7534 + ROM, vMacScreenHeight - 16); do_put_mem_word(7540 + ROM, vMacScreenHeight); -#if vMacScreenWidth >= 1024 - pto = 7570 + ROM; - do_put_mem_word(pto, 0x4EB9); /* JSR */ - pto += 2; - do_put_mem_long(pto, kROM_Base + (patchp - ROM)); - pto += 4; + if (vMacScreenWidth >= 1024) { + *pto = 7570 + ROM; + do_put_mem_word(*pto, 0x4EB9); /* JSR */ + *pto += 2; + do_put_mem_long(*pto, kROM_Base + (patchp - ROM)); + *pto += 4; - do_put_mem_word(patchp, 0x2A3C); /* MOVE.L #$x,D5 */ - patchp += 2; - do_put_mem_long(patchp, (vMacScreenWidth / 8)); - patchp += 4; - do_put_mem_word(patchp, 0xC2C5); /* MulU D5,D1 */ - patchp += 2; - do_put_mem_word(patchp, 0xD3C1); /* AddA.L D1,A1 */ - patchp += 2; - do_put_mem_word(patchp, 0x4E75); /* RTS */ - patchp += 2; -#else - do_put_mem_word(7570 + ROM, 0x7A00 + (vMacScreenWidth / 8)); -#endif + do_put_mem_word(patchp, 0x2A3C); /* MOVE.L #$x,D5 */ + patchp += 2; + do_put_mem_long(patchp, (vMacScreenWidth / 8)); + patchp += 4; + do_put_mem_word(patchp, 0xC2C5); /* MulU D5,D1 */ + patchp += 2; + do_put_mem_word(patchp, 0xD3C1); /* AddA.L D1,A1 */ + patchp += 2; + do_put_mem_word(patchp, 0x4E75); /* RTS */ + patchp += 2; + } else { + do_put_mem_word(7570 + ROM, 0x7A00 + (vMacScreenWidth / 8)); + } /* set up screen bitmap */ do_put_mem_word(7784 + ROM, vMacScreenHeight); @@ -297,16 +302,19 @@ void ScreenHack_Install(uint8_t *pto) do_put_mem_word(5212 + ROM, vMacScreenHeight / 2 - 101); do_put_mem_word(5214 + ROM, vMacScreenWidth / 2 - 218); #endif +} -#elif CurEmMd <= kEmMd_Classic - +void ScreenHack_Install_256K(uint8_t **pto) +{ + uint8_t *patchp = *pto; + /* screen setup, main */ { - pto = 1482 + ROM; - do_put_mem_word(pto, 0x4EB9); /* JSR */ - pto += 2; - do_put_mem_long(pto, kROM_Base + (patchp - ROM)); - pto += 4; + *pto = 1482 + ROM; + do_put_mem_word(*pto, 0x4EB9); /* JSR */ + *pto += 2; + do_put_mem_long(*pto, kROM_Base + (patchp - ROM)); + *pto += 4; do_put_mem_word(patchp, 0x21FC); /* MOVE.L */ patchp += 2; @@ -357,55 +365,79 @@ void ScreenHack_Install(uint8_t *pto) do_put_mem_word(4586 + ROM, vMacScreenWidth / 8); /* cursor handling */ -#if vMacScreenWidth >= 1024 - pto = 101886 + ROM; - do_put_mem_word(pto, 0x4EB9); /* JSR */ - pto += 2; - do_put_mem_long(pto, kROM_Base + (patchp - ROM)); - pto += 4; + if (vMacScreenWidth >= 1024) { + *pto = 101886 + ROM; + do_put_mem_word(*pto, 0x4EB9); /* JSR */ + *pto += 2; + do_put_mem_long(*pto, kROM_Base + (patchp - ROM)); + *pto += 4; - do_put_mem_word(patchp, 0x41F8); /* Lea.L (CrsrSave),A0 */ - patchp += 2; - do_put_mem_word(patchp, 0x088C); - patchp += 2; - do_put_mem_word(patchp, 0x203C); /* MOVE.L #$x,D0 */ - patchp += 2; - do_put_mem_long(patchp, (vMacScreenWidth / 8)); - patchp += 4; - do_put_mem_word(patchp, 0x4E75); /* RTS */ - patchp += 2; -#else - do_put_mem_word(101890 + ROM, 0x7000 + (vMacScreenWidth / 8)); -#endif + do_put_mem_word(patchp, 0x41F8); /* Lea.L (CrsrSave),A0 */ + patchp += 2; + do_put_mem_word(patchp, 0x088C); + patchp += 2; + do_put_mem_word(patchp, 0x203C); /* MOVE.L #$x,D0 */ + patchp += 2; + do_put_mem_long(patchp, (vMacScreenWidth / 8)); + patchp += 4; + do_put_mem_word(patchp, 0x4E75); /* RTS */ + patchp += 2; + } else { + do_put_mem_word(101890 + ROM, 0x7000 + (vMacScreenWidth / 8)); + } do_put_mem_word(102010 + ROM, vMacScreenWidth - 32); do_put_mem_word(102016 + ROM, vMacScreenWidth - 32); do_put_mem_word(102048 + ROM, vMacScreenHeight - 16); do_put_mem_word(102054 + ROM, vMacScreenHeight); -#if vMacScreenWidth >= 1024 - pto = 102084 + ROM; - do_put_mem_word(pto, 0x4EB9); /* JSR */ - pto += 2; - do_put_mem_long(pto, kROM_Base + (patchp - ROM)); - pto += 4; + + if (vMacScreenWidth >= 1024) { + *pto = 102084 + ROM; + do_put_mem_word(*pto, 0x4EB9); /* JSR */ + *pto += 2; + do_put_mem_long(*pto, kROM_Base + (patchp - ROM)); + *pto += 4; - do_put_mem_word(patchp, 0x2A3C); /* MOVE.L #$x, D5 */ - patchp += 2; - do_put_mem_long(patchp, (vMacScreenWidth / 8)); - patchp += 4; - do_put_mem_word(patchp, 0xC2C5); /* MulU D5, D1 */ - patchp += 2; - do_put_mem_word(patchp, 0xD3C1); /* AddA.L D1, A1 */ - patchp += 2; - do_put_mem_word(patchp, 0x4E75); /* RTS */ - patchp += 2; -#else - do_put_mem_word(102084 + ROM, 0x7A00 + (vMacScreenWidth / 8)); -#endif + do_put_mem_word(patchp, 0x2A3C); /* MOVE.L #$x, D5 */ + patchp += 2; + do_put_mem_long(patchp, (vMacScreenWidth / 8)); + patchp += 4; + do_put_mem_word(patchp, 0xC2C5); /* MulU D5, D1 */ + patchp += 2; + do_put_mem_word(patchp, 0xD3C1); /* AddA.L D1, A1 */ + patchp += 2; + do_put_mem_word(patchp, 0x4E75); /* RTS */ + patchp += 2; + } else { + do_put_mem_word(102084 + ROM, 0x7A00 + (vMacScreenWidth / 8)); + } /* set up screen bitmap */ do_put_mem_word(102298 + ROM, vMacScreenHeight); do_put_mem_word(102304 + ROM, vMacScreenWidth); do_put_mem_word(102324 + ROM, vMacScreenHeight); - -#endif +} + +void ScreenHack_Install(uint8_t **pto) +{ + if (!UseLargeScreenHack) { return; } + + switch(CurEmMd) { + case kEmMd_Twiggy: + case kEmMd_Twig43: + case kEmMd_128K: + ScreenHack_Install_64K(pto); + break; + case kEmMd_512Ke: + case kEmMd_Plus: + ScreenHack_Install_128K(pto); + break; + case kEmMd_SE: + case kEmMd_SEFDHD: + case kEmMd_Classic: + ScreenHack_Install_256K(pto); + break; + default: + // unsupported + break; + } } diff --git a/src/PATCHES/SCRNHACK.h b/src/PATCHES/SCRNHACK.h index dfcfc83..402d0d5 100644 --- a/src/PATCHES/SCRNHACK.h +++ b/src/PATCHES/SCRNHACK.h @@ -1,3 +1,3 @@ #include -void ScreenHack_Install(uint8_t *pto); \ No newline at end of file +void ScreenHack_Install(uint8_t **pto); diff --git a/src/PATCHES/SONYDRV.c b/src/PATCHES/SONYDRV.c index be80a0a..e22df42 100644 --- a/src/PATCHES/SONYDRV.c +++ b/src/PATCHES/SONYDRV.c @@ -12,7 +12,11 @@ #include "UTIL/ENDIANAC.h" #include "UI/MYOSGLUE.h" #include "PATCHES/SONYDRV.h" -#include "PATCHES/SCRNHACK.h" +#include "PATCHES/ROMEMDEV.h" +//#include "PATCHES/SCRNHACK.h" + +// temporary screenhack stuff +#include "HW/SCREEN/SCRNEMDV.h" // Include binaries INCBIN(SonyDriver, "rsrc/SONYDRV.bin"); @@ -66,6 +70,6 @@ void Sony_Install(void) Sony_LoadIcon(pto, &icoSize); pto += icoSize; - // yeah this sucks but it's so awful and intertwined that i have no choice - //ScreenHack_Install(pto); + // currently broken + //ScreenHack_Install(&pto); } diff --git a/src/PROGMAIN.c b/src/PROGMAIN.c index 86be268..c4b8daf 100644 --- a/src/PROGMAIN.c +++ b/src/PROGMAIN.c @@ -46,11 +46,6 @@ #include "PROGMAIN.h" -// Temporary location for config variables -uint16_t vMacScreenHeight = 342; -uint16_t vMacScreenWidth = 512; -uint16_t vMacScreenDepth = 0; - // Let's define a bunch of function structure thingies #define ARRAY_SIZE(array) (sizeof(array) / sizeof(*array)) @@ -257,7 +252,7 @@ const DevMethods_t DEVICES[] = { }, // Screen { - .init = NULL, + .init = Screen_Init, .reset = NULL, .starttick = Sixtieth_PulseNtfy, // VBlank interrupt .endtick = Screen_EndTickNotify, diff --git a/src/UI/COMOSGLU.c b/src/UI/COMOSGLU.c index 6574bdc..17eedec 100644 --- a/src/UI/COMOSGLU.c +++ b/src/UI/COMOSGLU.c @@ -23,8 +23,8 @@ #include "GLOBGLUE.h" #include "MYOSGLUE.h" #include "CNFGRAPI.h" - #include "COMOSGLU.h" +#include "HW/SCREEN/SCRNEMDV.h" GLOBALVAR uint8_t * ROM = nullpr; GLOBALVAR bool ROM_loaded = false; diff --git a/src/UI/CONFIGM.c b/src/UI/CONFIGM.c index a0e8064..aa44f58 100644 --- a/src/UI/CONFIGM.c +++ b/src/UI/CONFIGM.c @@ -1,7 +1,7 @@ /* * CONFIG Mode * - * A replacement for Control Mode, with prettier grapgics and actual settings + * A replacement for Control Mode, with prettier graphics and actual settings * */ diff --git a/src/UI/MYOSGLUE.h b/src/UI/MYOSGLUE.h index 7b63b4f..fe75200 100644 --- a/src/UI/MYOSGLUE.h +++ b/src/UI/MYOSGLUE.h @@ -122,16 +122,6 @@ EXPORTVAR(uint32_t, CurMacDelta) #endif -#define vMacScreenNumPixels \ - ((long)vMacScreenHeight * (long)vMacScreenWidth) -#define vMacScreenNumBits (vMacScreenNumPixels << vMacScreenDepth) -#define vMacScreenNumBytes (vMacScreenNumBits / 8) -#define vMacScreenBitWidth ((long)vMacScreenWidth << vMacScreenDepth) -#define vMacScreenByteWidth (vMacScreenBitWidth / 8) - -#define vMacScreenMonoNumBytes (vMacScreenNumPixels / 8) -#define vMacScreenMonoByteWidth ((long)vMacScreenWidth / 8) - EXPORTVAR(bool, UseColorMode) EXPORTVAR(bool, ColorModeWorks) diff --git a/src/UI/SDL2/OSGLUSD2.c b/src/UI/SDL2/OSGLUSD2.c index ee0bc34..5c08ff3 100644 --- a/src/UI/SDL2/OSGLUSD2.c +++ b/src/UI/SDL2/OSGLUSD2.c @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include "CNFGRAPI.h" #include "SYSDEPNS.h" #include "UTIL/ENDIANAC.h" @@ -32,6 +32,8 @@ #include "STRCONST.h" #include "OSGLUSD2.h" #include "LANG/INTLCHAR.h" +#include "HW/SCREEN/SCRNEMDV.h" +#include "CFGMAN.h" /* --- some simple utilities --- */ @@ -206,7 +208,7 @@ LOCALPROC HandleTheEvent(SDL_Event *event) LOCALVAR int argc; LOCALVAR char **argv; -LOCALFUNC bool Screen_Init(void) +LOCALFUNC bool SDL_InitDisplay(void) { bool v = false; @@ -799,12 +801,12 @@ LOCALPROC CheckForSavedTasks(void) if (RequestMacOff) { RequestMacOff = false; - if (AnyDiskInserted()) { + /*if (AnyDiskInserted()) { MacMsgOverride(kStrQuitWarningTitle, kStrQuitWarningMessage); - } else { + } else {*/ ForceMacOff = true; - } + //} } if (ForceMacOff) { @@ -1043,6 +1045,7 @@ LOCALPROC UninitWhereAmI(void) LOCALFUNC bool InitOSGLU(void) { + if (Config_TryInit()) if (AllocMemory()) #if CanGetAppPath if (InitWhereAmI()) @@ -1057,7 +1060,7 @@ LOCALFUNC bool InitOSGLU(void) #if SoundEnabled if (Sound_Init()) #endif - if (Screen_Init()) + if (SDL_InitDisplay()) if (CreateMainWindow()) if (WaitForRom()) { diff --git a/src/UI/SDL2/VIDEO.c b/src/UI/SDL2/VIDEO.c index 89378ef..6a53086 100644 --- a/src/UI/SDL2/VIDEO.c +++ b/src/UI/SDL2/VIDEO.c @@ -1,8 +1,8 @@ #include #include #include -#include -#include +#include +#include #include "CNFGRAPI.h" #include "SYSDEPNS.h" #include "UTIL/ENDIANAC.h" @@ -10,6 +10,7 @@ #include "UI/COMOSGLU.h" #include "STRCONST.h" #include "OSGLUSD2.h" +#include "HW/SCREEN/SCRNEMDV.h" /* --- video out --- */ diff --git a/src/tomlc99 b/src/tomlc99 new file mode 160000 index 0000000..b539e3f --- /dev/null +++ b/src/tomlc99 @@ -0,0 +1 @@ +Subproject commit b539e3f20ec443d7046153ed4623da277da89170