From 57139b87b559e59b2572065a0d064b86bf415996 Mon Sep 17 00:00:00 2001 From: spicyjpeg Date: Fri, 12 Jul 2024 20:14:35 +0200 Subject: [PATCH] Add splash screen and FAQ/troubleshooting page --- README.md | 16 ++++---- doc/assets/buttonMapping.png | Bin 0 -> 16658 bytes doc/faq.md | 67 +++++++++++++++++++++++++++++++ doc/index.md | 2 +- src/common/gpu.cpp | 5 --- src/common/gpu.hpp | 9 ++++- src/main/app/app.cpp | 62 +++++++++++++++++++---------- src/main/app/app.hpp | 6 ++- src/main/app/cartactions.cpp | 1 + src/main/app/cartactions.hpp | 7 +++- src/main/app/tests.cpp | 4 +- src/main/uibase.cpp | 75 +++++++++++++++++++++++------------ src/main/uibase.hpp | 31 ++++++++++----- src/main/uicommon.cpp | 25 +++++------- src/main/uicommon.hpp | 7 +--- 15 files changed, 218 insertions(+), 99 deletions(-) create mode 100644 doc/assets/buttonMapping.png create mode 100644 doc/faq.md diff --git a/README.md b/README.md index 05a97dc..572f630 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- 573in1 logo + 573in1 logo

573in1 is a full-featured homebrew maintenance and troubleshooting tool, game @@ -43,17 +43,17 @@ instructions. **Reading the documentation before proceeding is highly** ## Screenshots

- Main menu + Main menu Cartridge information screen + width="320" /> Cartridge system ID editor + width="320" /> Storage device information screen + width="320" /> IDE drive file picker + width="320" /> Monitor test pattern + width="320" />

## Project status @@ -78,6 +78,8 @@ to lowest priority: flash or a PCMCIA card, allowing the 573 BIOS to boot them automatically even with no CD-ROM drive present. - Cleaning up the codebase, which currently contains *many* bad practices. +- Adding support for JVS bus scanning and using JVS I/O boards in place of the + JAMMA button inputs. - Adding UTF-8 support to the font and text rendering code. This is a rather low priority feature, but it would allow 573in1 to be translated to other languages. diff --git a/doc/assets/buttonMapping.png b/doc/assets/buttonMapping.png new file mode 100644 index 0000000000000000000000000000000000000000..cffd57bc1a1d79e9758947e4fc53e146494479a2 GIT binary patch literal 16658 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 literal 0 HcmV?d00001 diff --git a/doc/faq.md b/doc/faq.md new file mode 100644 index 0000000..21ed2d9 --- /dev/null +++ b/doc/faq.md @@ -0,0 +1,67 @@ + +# FAQ and troubleshooting + +## Running 573in1 + +### I cannot get past the BIOS "hardware error" screen and into the main menu + +- Make sure the disc image has been burned correctly (and not by e.g. dragging + the image file onto the disc). The disc should appear as `573IN1_xxxxx` and + contain a bunch of files named `README.TXT`, `PSX.EXE` and so on. +- Try using a different disc and/or another CD-ROM drive. A list of drives known + to be compatible with the stock System 573 BIOS can be found + [here](https://psx-spx.consoledev.net/konamisystem573/#known-working-replacement-drives). +- Ensure the BIOS is not reporting an actual hardware error with the 573. A + CD-ROM error will result in `CDR BAD` being displayed, while other errors will + be reported under the PCB location of the chip that failed (e.g. `18E BAD` for + a JVS MCU error). A list of BIOS errors can be found + [here](https://psx-spx.consoledev.net/konamisystem573/#boot-sequence). + +### I get an error about a missing file or the CD-ROM being incorrect + +- You have booted into the game currently installed on the 573's internal flash + rather than from the disc. Turn off DIP switch 4 (the rightmost one) and power + cycle the 573. + +## Security cartridges + +### My cartridge does not get recognized + +- Make sure the cartridge's contacts are clean and the security cartridge + connector on the 573 has no bent pins and is not worn out, corroded or + otherwise damaged. + +## IDE devices + +### My IDE cable does not fit into the 573 + +- The 573 motherboard has pin 20 populated on the IDE connector, but most cables + use it as a keying pin (as per later versions of the IDE specification) and + thus have it blocked off. You may either try to find another cable or drill a + small hole in the cable's connector. +- You can also cut or desolder pin 20 on the 573, however this is not + recommended. + +### My IDE drive, CF card or adapter does not show up + +- Try using a different drive or adapter. Some CF cards, SD card adapters and + IDE-to-SATA converters are known to be problematic. + +### My IDE drive, CF card or adapter shows up but is unreadable + +- Ensure the drive supports LBA addressing. All CF cards, SD card adapters and + the vast majority of hard drives do, however older hard drives (typically ones + with a capacity lower than 8 GB or manufactured before the mid 1990s) may only + support CHS addressing. +- Ensure the drive is formatted with a single FAT12, FAT16, FAT32 or exFAT + partition. Other filesystems such as NTFS or ext4 are not supported. + +## Miscellaneous + +### How do I obtain more information about an error that happened? + +- You may press the test button on your 573 or cabinet at any time to toggle the + log window, which will contain detailed information about errors. +- If an IDE hard drive is connected you can also take screenshots by holding + down the test button. Screenshots are saved to the `573in1` directory in the + root of the filesystem. diff --git a/doc/index.md b/doc/index.md index 39f51c8..661cc60 100644 --- a/doc/index.md +++ b/doc/index.md @@ -8,7 +8,7 @@ - TODO: ~~[Installing games and working with flash memory devices](flash.md)~~ - TODO: ~~[Connecting an IDE hard drive](hdd.md)~~ - TODO: ~~[Installing 573in1 as a BIOS ROM](bios.md)~~ -- TODO: ~~[FAQ and troubleshooting](faq.md)~~ +- [FAQ and troubleshooting](faq.md) ## Development resources diff --git a/src/common/gpu.cpp b/src/common/gpu.cpp index b2a144a..9ac6d93 100644 --- a/src/common/gpu.cpp +++ b/src/common/gpu.cpp @@ -326,11 +326,6 @@ void Context::drawGradientRectD( cmd[7] = gp0_xy(x + width, y + height); } -void Context::drawBackdrop(Color color, BlendMode blendMode) { - setBlendMode(blendMode, true); - drawRect(0, 0, width, height, color, true); -} - /* Image class */ void Image::initFromVRAMRect( diff --git a/src/common/gpu.hpp b/src/common/gpu.hpp index 230e75f..845ee4f 100644 --- a/src/common/gpu.hpp +++ b/src/common/gpu.hpp @@ -143,6 +143,14 @@ public: ); } + inline void drawBackdrop(Color color) { + drawRect(0, 0, width, height, color); + } + inline void drawBackdrop(Color color, BlendMode blendMode) { + setBlendMode(blendMode, true); + drawRect(0, 0, width, height, color, true); + } + void setResolution( VideoMode mode, int width, int height, bool forceInterlace = false, bool sideBySide = false @@ -169,7 +177,6 @@ public: int x, int y, int width, int height, Color top, Color middle, Color bottom, bool blend = false ); - void drawBackdrop(Color color, BlendMode blendMode); }; /* Image class */ diff --git a/src/main/app/app.cpp b/src/main/app/app.cpp index 3ed76f8..582d1c9 100644 --- a/src/main/app/app.cpp +++ b/src/main/app/app.cpp @@ -180,6 +180,8 @@ void FileIOManager::closeResourceFile(void) { static constexpr size_t _WORKER_STACK_SIZE = 0x20000; +static constexpr int _SPLASH_SCREEN_TIMEOUT = 5; + App::App(ui::Context &ctx) #ifdef ENABLE_LOG_BUFFER : _logOverlay(_logBuffer), @@ -238,6 +240,7 @@ void App::_loadResources(void) { res.loadTIM(_background.tile, "assets/textures/background.tim"); res.loadTIM(_ctx.font.image, "assets/textures/font.tim"); res.loadStruct(_ctx.font.metrics, "assets/textures/font.metrics"); + res.loadTIM(_splashOverlay.image, "assets/textures/splash.tim"); res.loadStruct(_ctx.colors, "assets/app.palette"); res.loadData(_stringTable, "assets/app.strings"); @@ -303,6 +306,36 @@ bool App::_takeScreenshot(void) { return true; } +void App::_updateOverlays(void) { + // Date and time overlay + static char dateString[24]; + util::Date date; + + io::getRTCTime(date); + date.toString(dateString); + + _textOverlay.leftText = dateString; + + // Splash screen overlay + int timeout = _ctx.gpuCtx.refreshRate * _SPLASH_SCREEN_TIMEOUT; + + if ((_workerStatus.status == WORKER_DONE) || (_ctx.time > timeout)) + _splashOverlay.hide(_ctx); + + // Log overlay + if ( + _ctx.buttons.released(ui::BTN_DEBUG) && + !_ctx.buttons.longReleased(ui::BTN_DEBUG) + ) + _logOverlay.toggle(_ctx); + + // Screenshot overlay + if (_ctx.buttons.longPressed(ui::BTN_DEBUG)) { + if (_takeScreenshot()) + _screenshotOverlay.animate(_ctx); + } +} + void App::_runWorker( bool (App::*func)(void), ui::Screen &next, bool goBack, bool playSound ) { @@ -361,40 +394,27 @@ void App::_interruptHandler(void) { _fileIO.loadResourceFile(nullptr); _loadResources(); - char dateString[24]; - - _textOverlay.leftText = dateString; - _textOverlay.rightText = "v" VERSION_STRING; - _screenshotOverlay.callback = [](ui::Context &ctx) -> bool { - return APP->_takeScreenshot(); - }; + _textOverlay.rightText = "v" VERSION_STRING; _ctx.backgrounds[0] = &_background; _ctx.backgrounds[1] = &_textOverlay; + _ctx.overlays[0] = &_splashOverlay; #ifdef ENABLE_LOG_BUFFER - _ctx.overlays[0] = &_logOverlay; + _ctx.overlays[1] = &_logOverlay; #endif - _ctx.overlays[1] = &_screenshotOverlay; + _ctx.overlays[2] = &_screenshotOverlay; -#ifdef ENABLE_AUTOBOOT _runWorker(&App::_ideInitWorker, _warningScreen); -#else - // If autoboot is disabled, show the warning screen before initializing the - // drives in order to give them enough time to spin up. - _runWorker(nullptr, _warningScreen); -#endif _setupInterrupts(); + + _splashOverlay.show(_ctx); _ctx.sounds[ui::SOUND_STARTUP].play(); for (;;) { - util::Date date; - - io::getRTCTime(date); - date.toString(dateString); - _ctx.update(); - _ctx.draw(); + _updateOverlays(); + _ctx.draw(); switchThreadImmediate(&_workerThread); _ctx.gpuCtx.flip(); } diff --git a/src/main/app/app.hpp b/src/main/app/app.hpp index 5100dbe..69359ac 100644 --- a/src/main/app/app.hpp +++ b/src/main/app/app.hpp @@ -180,12 +180,13 @@ private: ResolutionScreen _resolutionScreen; AboutScreen _aboutScreen; + ui::TiledBackground _background; + ui::TextOverlay _textOverlay; + ui::SplashOverlay _splashOverlay; #ifdef ENABLE_LOG_BUFFER util::LogBuffer _logBuffer; ui::LogOverlay _logOverlay; #endif - ui::TiledBackground _background; - ui::TextOverlay _textOverlay; ui::ScreenshotOverlay _screenshotOverlay; ui::Context &_ctx; @@ -214,6 +215,7 @@ private: char *output, size_t length, const char *path, int maxIndex = 9999 ); bool _takeScreenshot(void); + void _updateOverlays(void); void _runWorker( bool (App::*func)(void), ui::Screen &next, bool goBack = false, bool playSound = false diff --git a/src/main/app/cartactions.cpp b/src/main/app/cartactions.cpp index 972e1fa..7db6dcb 100644 --- a/src/main/app/cartactions.cpp +++ b/src/main/app/cartactions.cpp @@ -239,6 +239,7 @@ void QRCodeScreen::show(ui::Context &ctx, bool goBack) { _title = STR("QRCodeScreen.title"); _prompt = STR("QRCodeScreen.prompt"); + _image = &_code; _imageScale = _QR_CODE_SCALE; _imagePadding = _QR_CODE_SCALE * _QR_CODE_PADDING; _backdropColor = 0xffffff; diff --git a/src/main/app/cartactions.hpp b/src/main/app/cartactions.hpp index 39e7f29..eb5150a 100644 --- a/src/main/app/cartactions.hpp +++ b/src/main/app/cartactions.hpp @@ -45,6 +45,9 @@ public: }; class QRCodeScreen : public ui::ImageScreen { +private: + gpu::Image _code; + public: bool valid; @@ -52,14 +55,14 @@ public: : valid(false) {} inline bool generateCode(const char *textInput) { - if (!gpu::generateQRCode(_image, 960, 256, textInput)) + if (!gpu::generateQRCode(_code, 960, 256, textInput)) return false; valid = true; return true; } inline bool generateCode(const uint8_t *binaryInput, size_t length) { - if (!gpu::generateQRCode(_image, 960, 256, binaryInput, length)) + if (!gpu::generateQRCode(_code, 960, 256, binaryInput, length)) return false; valid = true; diff --git a/src/main/app/tests.cpp b/src/main/app/tests.cpp index bef5477..77fddd9 100644 --- a/src/main/app/tests.cpp +++ b/src/main/app/tests.cpp @@ -303,9 +303,7 @@ void TestPatternScreen::_drawTextOverlay( void TestPatternScreen::draw(ui::Context &ctx, bool active) const { _newLayer(ctx, 0, 0, ctx.gpuCtx.width, ctx.gpuCtx.height); - ctx.gpuCtx.drawRect( - 0, 0, ctx.gpuCtx.width, ctx.gpuCtx.height, _BACKGROUND_COLOR - ); + ctx.gpuCtx.drawBackdrop(_BACKGROUND_COLOR); } void TestPatternScreen::update(ui::Context &ctx) { diff --git a/src/main/uibase.cpp b/src/main/uibase.cpp index fc8dc2a..f7a71d1 100644 --- a/src/main/uibase.cpp +++ b/src/main/uibase.cpp @@ -234,11 +234,6 @@ void Context::draw(void) { void Context::update(void) { buttons.update(); - for (auto layer : overlays) { - if (layer) - layer->update(*this); - } - auto screen = getCurrentScreen(); if (screen) @@ -294,22 +289,56 @@ void TextOverlay::draw(Context &ctx, bool active) const { } } -LogOverlay::LogOverlay(util::LogBuffer &buffer) -: _buffer(buffer) { - _slideAnim.setValue(0); +void SplashOverlay::draw(Context &ctx, bool active) const { + int brightness = _fadeAnim.getValue(ctx.time); + + if (!brightness) + return; + + // Backdrop + _newLayer(ctx, 0, 0, ctx.gpuCtx.width, ctx.gpuCtx.height); + ctx.gpuCtx.drawBackdrop( + gp0_rgb(brightness, brightness, brightness), GP0_BLEND_SUBTRACT + ); + + if (brightness < 0xff) + return; + + // Image + int x = (ctx.gpuCtx.width - image.width) / 2; + int y = (ctx.gpuCtx.height - image.height) / 2; + + image.draw(ctx.gpuCtx, x, y); +} + +void SplashOverlay::show(Context &ctx) { + if (!_fadeAnim.getTargetValue()) +#if 0 + _fadeAnim.setValue(ctx.time, 0, 0xff, SPEED_SLOWEST); +#else + _fadeAnim.setValue(0xff); +#endif +} + +void SplashOverlay::hide(Context &ctx) { + if (_fadeAnim.getTargetValue()) + _fadeAnim.setValue(ctx.time, 0xff, 0, SPEED_SLOWEST); } void LogOverlay::draw(Context &ctx, bool active) const { int offset = _slideAnim.getValue(ctx.time); + if (!offset) return; + // Backdrop _newLayer( ctx, 0, offset - ctx.gpuCtx.height, ctx.gpuCtx.width, ctx.gpuCtx.height ); ctx.gpuCtx.drawBackdrop(ctx.colors[COLOR_BACKDROP], GP0_BLEND_SUBTRACT); + // Text int screenHeight = ctx.gpuCtx.height - SCREEN_MIN_MARGIN_Y * 2; int linesShown = screenHeight / ctx.font.metrics.lineHeight; @@ -330,15 +359,11 @@ void LogOverlay::draw(Context &ctx, bool active) const { } } -void LogOverlay::update(Context &ctx) { - if ( - ctx.buttons.released(BTN_DEBUG) && !ctx.buttons.longReleased(BTN_DEBUG) - ) { - bool shown = !_slideAnim.getTargetValue(); +void LogOverlay::toggle(Context &ctx) { + bool shown = !_slideAnim.getTargetValue(); - _slideAnim.setValue(ctx.time, shown ? ctx.gpuCtx.height : 0, SPEED_SLOW); - ctx.sounds[shown ? SOUND_ENTER : SOUND_EXIT].play(); - } + _slideAnim.setValue(ctx.time, shown ? ctx.gpuCtx.height : 0, SPEED_SLOW); + ctx.sounds[shown ? SOUND_ENTER : SOUND_EXIT].play(); } void ScreenshotOverlay::draw(Context &ctx, bool active) const { @@ -353,13 +378,9 @@ void ScreenshotOverlay::draw(Context &ctx, bool active) const { ); } -void ScreenshotOverlay::update(Context &ctx) { - if (ctx.buttons.longPressed(BTN_DEBUG)) { - if (callback(ctx)) { - _flashAnim.setValue(ctx.time, 0xff, 0, SPEED_SLOW); - ctx.sounds[ui::SOUND_SCREENSHOT].play(); - } - } +void ScreenshotOverlay::animate(Context &ctx) { + _flashAnim.setValue(ctx.time, 0xff, 0, SPEED_SLOW); + ctx.sounds[ui::SOUND_SCREENSHOT].play(); } /* Base screen classes */ @@ -381,15 +402,17 @@ void AnimatedScreen::hide(Context &ctx, bool goBack) { } void BackdropScreen::show(Context &ctx, bool goBack) { - _backdropAnim.setValue(ctx.time, 0, 0x50, SPEED_FAST); + if (!_fadeAnim.getTargetValue()) + _fadeAnim.setValue(ctx.time, 0, 0x50, SPEED_FAST); } void BackdropScreen::hide(Context &ctx, bool goBack) { - _backdropAnim.setValue(ctx.time, 0x50, 0, SPEED_FAST); + if (_fadeAnim.getTargetValue()) + _fadeAnim.setValue(ctx.time, 0x50, 0, SPEED_FAST); } void BackdropScreen::draw(Context &ctx, bool active) const { - int brightness = _backdropAnim.getValue(ctx.time); + int brightness = _fadeAnim.getValue(ctx.time); if (!brightness) return; diff --git a/src/main/uibase.hpp b/src/main/uibase.hpp index 3928743..16cb4ae 100644 --- a/src/main/uibase.hpp +++ b/src/main/uibase.hpp @@ -64,7 +64,8 @@ enum Sound { enum AnimationSpeed { SPEED_FASTEST = 10, SPEED_FAST = 15, - SPEED_SLOW = 20 + SPEED_SLOW = 20, + SPEED_SLOWEST = 30 }; static constexpr int SCREEN_MARGIN_X = 16; @@ -214,7 +215,6 @@ protected: public: virtual void draw(Context &ctx, bool active = true) const {} - virtual void update(Context &ctx) {} }; class TiledBackground : public Layer { @@ -234,15 +234,29 @@ public: void draw(Context &ctx, bool active = true) const; }; +class SplashOverlay : public Layer { +private: + util::Tween _fadeAnim; + +public: + gpu::Image image; + + void draw(Context &ctx, bool active = true) const; + void show(Context &ctx); + void hide(Context &ctx); +}; + class LogOverlay : public Layer { private: util::LogBuffer &_buffer; util::Tween _slideAnim; public: - LogOverlay(util::LogBuffer &buffer); + inline LogOverlay(util::LogBuffer &buffer) + : _buffer(buffer) {} + void draw(Context &ctx, bool active = true) const; - void update(Context &ctx); + void toggle(Context &ctx); }; class ScreenshotOverlay : public Layer { @@ -250,13 +264,8 @@ private: util::Tween _flashAnim; public: - bool (*callback)(ui::Context &ctx); - - inline ScreenshotOverlay(void) - : callback(nullptr) {} - void draw(Context &ctx, bool active = true) const; - void update(Context &ctx); + void animate(Context &ctx); }; /* Base screen classes */ @@ -286,7 +295,7 @@ public: class BackdropScreen : public Screen { private: - util::Tween _backdropAnim; + util::Tween _fadeAnim; public: virtual void show(Context &ctx, bool goBack = false); diff --git a/src/main/uicommon.cpp b/src/main/uicommon.cpp index 824af1d..d4431a4 100644 --- a/src/main/uicommon.cpp +++ b/src/main/uicommon.cpp @@ -24,13 +24,6 @@ namespace ui { /* Common screens */ -void PlaceholderScreen::draw(Context &ctx, bool active) const { - _newLayer(ctx, 0, 0, ctx.gpuCtx.width, ctx.gpuCtx.height); - ctx.gpuCtx.drawRect( - 0, 0, ctx.gpuCtx.width, ctx.gpuCtx.height, ctx.colors[COLOR_WINDOW2] - ); -} - TextScreen::TextScreen(void) : _title(nullptr), _body(nullptr), _prompt(nullptr) {} @@ -128,16 +121,17 @@ void TextScreen::update(Context &ctx) { } ImageScreen::ImageScreen(void) -: _imageScale(1), _imagePadding(0), _title(nullptr), _prompt(nullptr) {} +: _image(nullptr), _imageScale(1), _imagePadding(0), _title(nullptr), +_prompt(nullptr) {} void ImageScreen::draw(Context &ctx, bool active) const { _newLayer(ctx, 0, 0, ctx.gpuCtx.width, ctx.gpuCtx.height); - if (_image.width && _image.height) { + if (_image) { int x = ctx.gpuCtx.width / 2; int y = ctx.gpuCtx.height / 2; - int width = _image.width * _imageScale / 2; - int height = _image.height * _imageScale / 2; + int width = _image->width * _imageScale / 2; + int height = _image->height * _imageScale / 2; if (_prompt) y -= (SCREEN_PROMPT_HEIGHT - ctx.font.metrics.lineHeight) / 2; @@ -153,9 +147,12 @@ void ImageScreen::draw(Context &ctx, bool active) const { } // Image - _image.drawScaled( - ctx.gpuCtx, x - width - 1, y - height - 1, width * 2, height * 2 - ); + if (_imageScale > 1) + _image->drawScaled( + ctx.gpuCtx, x - width - 1, y - height - 1, width * 2, height * 2 + ); + else + _image->draw(ctx.gpuCtx, x - width, y - height); } // Text diff --git a/src/main/uicommon.hpp b/src/main/uicommon.hpp index 2ba9091..7f72727 100644 --- a/src/main/uicommon.hpp +++ b/src/main/uicommon.hpp @@ -25,11 +25,6 @@ namespace ui { /* Common screens */ -class PlaceholderScreen : public AnimatedScreen { -public: - void draw(Context &ctx, bool active) const; -}; - class TextScreen : public AnimatedScreen { private: util::Tween _scrollAnim; @@ -54,7 +49,7 @@ public: class ImageScreen : public AnimatedScreen { protected: - gpu::Image _image; + gpu::Image *_image; int _imageScale, _imagePadding; gpu::Color _backdropColor;