From 40b7d95e9b16252d1aebb0706f3bba885f6e67cf Mon Sep 17 00:00:00 2001
From: spicyjpeg <88942473+spicyjpeg@users.noreply.github.com>
Date: Mon, 7 Feb 2022 01:06:33 +0100
Subject: Add LIBPSN00B_GENERATOR option, fix .incbin alignment
---
.github/workflows/build.yml | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
(limited to '.github/workflows')
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a72f5d3..a2a5510 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -83,9 +83,11 @@ jobs:
# No surprises here either. The GitHub Actions VMs even come with most of the
# dependencies required to build PSn00bSDK preinstalled.
+ # NOTE: the workaround to allow the toolchain cache to be loaded (see below)
+ # doesn't seem to work on Windows Server 2022 currently.
build-sdk-windows:
name: Build PSn00bSDK on Windows
- runs-on: windows-latest
+ runs-on: windows-2019
needs: build-gcc
steps:
@@ -111,12 +113,8 @@ jobs:
- name: Fetch repo contents
uses: actions/checkout@v2
with:
- path: sdk
-
- - name: Update repo submodules
- run: |
- cd sdk
- git submodule update --init --recursive
+ path: sdk
+ submodules: recursive
- name: Build and package PSn00bSDK
run: |
@@ -159,12 +157,8 @@ jobs:
- name: Fetch repo contents
uses: actions/checkout@v2
with:
- path: sdk
-
- - name: Update repo submodules
- run: |
- cd sdk
- git submodule update --init --recursive
+ path: sdk
+ submodules: recursive
- name: Build and package PSn00bSDK
run: |
--
cgit v1.2.3
From 6174931fe58b1dc0fc64029dbe3abefc81aa67d5 Mon Sep 17 00:00:00 2001
From: spicyjpeg <88942473+spicyjpeg@users.noreply.github.com>
Date: Sun, 27 Feb 2022 23:54:39 +0100
Subject: Refactor io/system573, switch to MSVC for CI builds
---
.github/workflows/build.yml | 6 +-
CHANGELOG.md | 36 ++++++
CMakePresets.json | 2 +-
cpack/setup.cmake | 2 +-
examples/io/system573/iso.xml | 20 +++-
examples/io/system573/k573io.c | 123 +++++++++++++++++++
examples/io/system573/k573io.h | 258 ++++++++++++++++++++++++++++++++++++++++
examples/io/system573/main.c | 264 ++++++++++-------------------------------
tools/CMakeLists.txt | 2 +-
9 files changed, 503 insertions(+), 210 deletions(-)
create mode 100644 examples/io/system573/k573io.c
create mode 100644 examples/io/system573/k573io.h
(limited to '.github/workflows')
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a2a5510..b2ca311 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -108,7 +108,7 @@ jobs:
- name: Install prerequisites
run: |
- pacman -S --noconfirm mingw-w64-x86_64-ninja mingw-w64-x86_64-gcc
+ pacman -S --noconfirm mingw-w64-x86_64-ninja
- name: Fetch repo contents
uses: actions/checkout@v2
@@ -118,7 +118,7 @@ jobs:
- name: Build and package PSn00bSDK
run: |
- cmake --preset ci -S sdk -DPSN00BSDK_TC=${{ github.workspace }}\gcc\windows
+ cmake --preset ci -S sdk -G "Visual Studio 16 2019" -DPSN00BSDK_TC=${{ github.workspace }}\gcc\windows
cmake --build build
cmake --build build -t package
@@ -162,7 +162,7 @@ jobs:
- name: Build and package PSn00bSDK
run: |
- cmake --preset ci -S sdk -DPSN00BSDK_TC=${{ github.workspace }}/gcc/linux
+ cmake --preset ci -S sdk -G "Ninja" -DPSN00BSDK_TC=${{ github.workspace }}/gcc/linux
cmake --build build
cmake --build build -t package
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0203265..b8a57b9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,42 @@ to ensure the changelog can be parsed correctly.
-------------------------------------------------------------------------------
+## 2022-02-27: 0.19
+
+spicyjpeg:
+
+- libpsn00b: Added `hwregs_c.h` header and renamed some registers in
+ `hwregs_a.h`. Added `assert()` as a proper macro.
+
+- psxpress: Added new MDEC library.
+
+- psxspu: Fixed critical bug in `SpuSetReverb()`.
+
+- psxetc: Fixed minor typos and bugs in `dlfcn.h`. Replaced `DL_CALL()` macro
+ with `DL_PRE_CALL()`.
+
+- psxapi: Rewritten all BIOS API stubs using a Python script and a JSON list,
+ both of which are included in the library's source directory.
+
+- examples: Updated `io/system573` with bugfixed I/O board code and separated
+ the APIs into a separate source file. Fixed timing bugs in `io/pads`.
+
+- mkpsxiso: Switched back to the master repository. The `dumpsxiso` command is
+ now included in PSn00bSDK installations.
+
+- Added `psn00bsdk_target_incbin()` and `psn00bsdk_target_incbin_a()` CMake
+ functions for quickly embedding binary files into executables and libraries.
+ The examples have been modified to use this function where applicable.
+
+- Added `LIBPSN00B_GENERATOR` CMake option to allow the host-side tools to be
+ compiled with MSVC or Xcode while still using Ninja or `make` to build the
+ libraries and examples. This is required as neither MSBuild nor Xcode support
+ custom toolchains.
+
+- Updated `LICENSE.md` with additional license information as well as a full
+ copy of the GPLv2 and GPLv3 (under which `mkpsxiso` and GCC are licensed
+ respectively).
+
## 2022-01-17
Lameguy64:
diff --git a/CMakePresets.json b/CMakePresets.json
index 822d773..b103270 100644
--- a/CMakePresets.json
+++ b/CMakePresets.json
@@ -36,7 +36,7 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"BUNDLE_TOOLCHAIN": "ON",
- "MKPSXISO_NO_LIBFLAC": "ON",
+ "LIBPSN00B_GENERATOR": "Ninja",
"PSN00BSDK_TARGET": "$env{GCC_TARGET}",
"PSN00BSDK_GIT_TAG": "$env{GITHUB_REF_NAME}",
"PSN00BSDK_GIT_COMMIT": "$env{GITHUB_SHA}"
diff --git a/cpack/setup.cmake b/cpack/setup.cmake
index a5d71ff..a65055d 100644
--- a/cpack/setup.cmake
+++ b/cpack/setup.cmake
@@ -89,7 +89,7 @@ if(NOT DEFINED CPACK_GENERATOR)
# TODO: add a macOS installer and related options
set(CPACK_GENERATOR ZIP)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
- set(CPACK_GENERATOR ZIP DEB RPM)
+ set(CPACK_GENERATOR ZIP DEB)
else()
set(CPACK_GENERATOR ZIP)
endif()
diff --git a/examples/io/system573/iso.xml b/examples/io/system573/iso.xml
index 09b4d85..0bb84d5 100644
--- a/examples/io/system573/iso.xml
+++ b/examples/io/system573/iso.xml
@@ -16,16 +16,26 @@
+
+
+
+
diff --git a/examples/io/system573/k573io.c b/examples/io/system573/k573io.c
new file mode 100644
index 0000000..a8748d6
--- /dev/null
+++ b/examples/io/system573/k573io.c
@@ -0,0 +1,123 @@
+/*
+ * PSn00bSDK Konami System 573 example (I/O driver)
+ * (C) 2022 spicyjpeg - MPL licensed
+ *
+ * Note that this is far from being a complete driver. It currently lacks:
+ * - ATAPI driver
+ * - Flash erasing/writing APIs
+ * - JVS bus APIs
+ * - Functions for accessing the digital I/O board's MP3 decoder
+ */
+
+#include
+#include
+
+#include "k573io.h"
+
+K573_IOBoardType _board_type = IO_TYPE_ANALOG;
+
+/* I/O board light control */
+
+static void _k573_set_lights_analog(uint32_t lights) {
+ uint32_t bits = 0xffffffff;
+
+ bits ^= (lights & 0x01010101) << 7; // Lamp n*8+0 -> bit n*8+7
+ bits ^= (lights & 0x02020202) << 5; // Lamp n*8+1 -> bit n*8+6
+ bits ^= (lights & 0x04040404) >> 1; // Lamp n*8+2 -> bit n*8+1
+ bits ^= (lights & 0x08080808) >> 3; // Lamp n*8+3 -> bit n*8+0
+ bits ^= (lights & 0x10101010) << 1; // Lamp n*8+4 -> bit n*8+5
+ bits ^= (lights & 0x20202020) >> 1; // Lamp n*8+5 -> bit n*8+4
+ bits ^= (lights & 0x40404040) >> 3; // Lamp n*8+6 -> bit n*8+3
+ bits ^= (lights & 0x80808080) >> 5; // Lamp n*8+7 -> bit n*8+2
+
+ K573_IO_BOARD[ANALOG_IO_REG_LIGHTS0] = (bits) & 0xff;
+ K573_IO_BOARD[ANALOG_IO_REG_LIGHTS1] = (bits >> 8) & 0xff;
+ K573_IO_BOARD[ANALOG_IO_REG_LIGHTS2] = (bits >> 16) & 0xff;
+ K573_IO_BOARD[ANALOG_IO_REG_LIGHTS3] = (bits >> 24) & 0xff;
+}
+
+// This function controls light outputs on digital I/O boards (i.e. the ones
+// that also include MP3 playback hardware, used by most Bemani games).
+// TODO: test this on real hardware -- it might not work if lights are handled
+// by the board's FPGA, which requires a binary blob...
+static void _k573_set_lights_digital(uint32_t lights) {
+ uint32_t bits = 0xffffffff;
+
+ bits ^= (lights & 0x11111111); // Lamp n*4+0 -> bit n*4+0
+ bits ^= (lights & 0x22222222) << 1; // Lamp n*4+1 -> bit n*4+2
+ bits ^= (lights & 0x44444444) << 1; // Lamp n*4+2 -> bit n*4+3
+ bits ^= (lights & 0x88888888) >> 2; // Lamp n*4+3 -> bit n*4+1
+
+ K573_IO_BOARD[DIGITAL_IO_REG_LIGHTS0] = ((bits) & 0xf) << 12;
+ K573_IO_BOARD[DIGITAL_IO_REG_LIGHTS1] = ((bits >> 4) & 0xf) << 12;
+ K573_IO_BOARD[DIGITAL_IO_REG_LIGHTS2] = ((bits >> 8) & 0xf) << 12;
+ K573_IO_BOARD[DIGITAL_IO_REG_LIGHTS3] = ((bits >> 12) & 0xf) << 12;
+ K573_IO_BOARD[DIGITAL_IO_REG_LIGHTS4] = ((bits >> 16) & 0xf) << 12;
+ K573_IO_BOARD[DIGITAL_IO_REG_LIGHTS5] = ((bits >> 20) & 0xf) << 12;
+ //K573_IO_BOARD[DIGITAL_IO_REG_LIGHTS6] = ((bits >> 24) & 0xf) << 12;
+ K573_IO_BOARD[DIGITAL_IO_REG_LIGHTS7] = ((bits >> 28) & 0xf) << 12;
+}
+
+static const void (*_k573_set_lights[])(uint32_t) = {
+ &_k573_set_lights_analog,
+ &_k573_set_lights_digital
+};
+
+/* Public API */
+
+uint32_t K573_GetJAMMAInputs(void) {
+ uint32_t inputs;
+
+ inputs = K573_IO_CHIP[IO_REG_IN2];
+ inputs |= ((K573_IO_CHIP[IO_REG_IN3_LOW] >> 8) & 0x0f) << 16;
+ inputs |= ((K573_IO_CHIP[IO_REG_IN3_HIGH] >> 8) & 0x0f) << 20;
+ inputs |= ((K573_IO_CHIP[IO_REG_IN1_HIGH] >> 8) & 0x1f) << 24;
+ inputs |= (K573_IO_CHIP[IO_REG_IN1_LOW] & 0x07) << 29;
+
+ return inputs;
+}
+
+void K573_SetLights(uint32_t lights) {
+ if (_board_type > IO_TYPE_DIGITAL)
+ return;
+
+ _k573_set_lights[_board_type](lights);
+}
+
+void K573_SetBoardType(K573_IOBoardType type) {
+ _k573_set_lights[_board_type](0);
+ _board_type = type;
+}
+
+/*void K573_DDRStageCommand(uint32_t value, uint32_t length) {
+ uint32_t last_bit = 0;
+ uint32_t mask = 1;
+
+ for (uint32_t i = 0; i < length; i++) {
+ uint32_t bit = DDR_LIGHT_P1_MUX_DATA | DDR_LIGHT_P2_MUX_DATA;
+ if (value & mask)
+ bit = 0;
+
+ K573_SetLights(last_bit | DDR_LIGHT_P1_MUX_CLK | DDR_LIGHT_P2_MUX_CLK);
+ _k573_delay_hblanks(20);
+ K573_SetLights(bit | DDR_LIGHT_P1_MUX_CLK | DDR_LIGHT_P2_MUX_CLK);
+ _k573_delay_hblanks(20);
+ K573_SetLights(bit);
+ _k573_delay_hblanks(20);
+
+ last_bit = bit;
+ mask <<= 1;
+ }
+
+ K573_SetLights(0);
+}*/
+
+//K573_DDRStageCommand(0x000c90, 13);
+//K573_DDRStageCommand(0x000001, 22);
+
+void K573_Init(void) {
+ EXP1_ADDR = 0x1f000000;
+ EXP1_CTRL = 0x24173f47; // 573 BIOS uses this value
+
+ K573_RESET_WATCHDOG();
+}
diff --git a/examples/io/system573/k573io.h b/examples/io/system573/k573io.h
new file mode 100644
index 0000000..cf125e2
--- /dev/null
+++ b/examples/io/system573/k573io.h
@@ -0,0 +1,258 @@
+/*
+ * PSn00bSDK Konami System 573 example (I/O driver)
+ * (C) 2022 spicyjpeg - MPL licensed
+ */
+
+#ifndef __K573IO_H
+#define __K573IO_H
+
+#include
+
+/* Register definitions */
+
+#define EXP1_ADDR *((volatile uint32_t *) 0x1f801000)
+#define EXP1_CTRL *((volatile uint32_t *) 0x1f801008)
+
+#define K573_BANK_SWITCH *((volatile uint16_t *) 0x1f500000)
+#define K573_IDE_RESET *((volatile uint16_t *) 0x1f560000)
+#define K573_WATCHDOG *((volatile uint16_t *) 0x1f5c0000)
+#define K573_EXT_OUT *((volatile uint16_t *) 0x1f600000)
+#define K573_JVS_INPUT *((volatile uint16_t *) 0x1f680000)
+#define K573_SECURITY_OUT *((volatile uint16_t *) 0x1f6a0000)
+
+#define K573_FLASH ((volatile uint16_t *) 0x1f000000)
+#define K573_IO_CHIP ((volatile uint16_t *) 0x1f400000)
+#define K573_IDE_CS0 ((volatile uint16_t *) 0x1f480000)
+#define K573_IDE_CS1 ((volatile uint16_t *) 0x1f4c0000)
+#define K573_RTC ((volatile uint16_t *) 0x1f620000)
+#define K573_IO_BOARD ((volatile uint16_t *) 0x1f640000)
+
+typedef enum _K573_IOChipRegister {
+ IO_REG_IN0 = 0x0,
+ IO_REG_IN1_LOW = 0x2,
+ IO_REG_IN1_HIGH = 0x3,
+ IO_REG_IN2 = 0x4,
+ IO_REG_IN3_LOW = 0x6,
+ IO_REG_IN3_HIGH = 0x7
+} K573_IOChipRegister;
+
+typedef enum _K573_IOBoardRegister {
+ ANALOG_IO_REG_LIGHTS0 = 0x40,
+ ANALOG_IO_REG_LIGHTS1 = 0x44,
+ ANALOG_IO_REG_LIGHTS2 = 0x48,
+ ANALOG_IO_REG_LIGHTS3 = 0x4c,
+
+ // The digital I/O board has a lot more registers than these, but there
+ // seems to be no DIGITAL_IO_LIGHTS6 register. WTF
+ DIGITAL_IO_REG_LIGHTS1 = 0x70,
+ DIGITAL_IO_REG_LIGHTS0 = 0x71,
+ DIGITAL_IO_REG_LIGHTS3 = 0x72,
+ DIGITAL_IO_REG_LIGHTS7 = 0x73,
+ DIGITAL_IO_REG_LIGHTS4 = 0x7d,
+ DIGITAL_IO_REG_LIGHTS5 = 0x7e,
+ DIGITAL_IO_REG_LIGHTS2 = 0x7f,
+
+ FISHBAIT_IO_REG_UNKNOWN = 0x08,
+ FISHBAIT_IO_REG_MOTOR = 0x40,
+ FISHBAIT_IO_REG_BRAKE = 0x44,
+ FISHBAIT_IO_REG_ENCODER = 0x4c,
+ FISHBAIT_IO_REG_RESET_Y = 0x50
+} K573_IOBoardRegister;
+
+// The 573's real-time clock chip is an M48T58, which behaves like a standard
+// 8 KB battery-backed SRAM with a bunch of special registers. Official games
+// store highscores and settings in RTC RAM.
+typedef enum _K573_RTCRegister {
+ RTC_REG_CTRL = 0x1ff8,
+ RTC_REG_SECONDS = 0x1ff9,
+ RTC_REG_MINUTES = 0x1ffa,
+ RTC_REG_HOURS = 0x1ffb,
+ RTC_REG_DAY_OF_WEEK = 0x1ffc,
+ RTC_REG_DAY_OF_MONTH = 0x1ffd,
+ RTC_REG_MONTH = 0x1ffe,
+ RTC_REG_YEAR = 0x1fff
+} K573_RTCRegister;
+
+/* Inputs and lights bitfields */
+
+typedef enum _K573_JAMMAInputs {
+ // IO_REG_IN2 bits 0-15
+ JAMMA_P2_LEFT = 1 << 0,
+ JAMMA_P2_RIGHT = 1 << 1,
+ JAMMA_P2_UP = 1 << 2,
+ JAMMA_P2_DOWN = 1 << 3,
+ JAMMA_P2_BUTTON1 = 1 << 4,
+ JAMMA_P2_BUTTON2 = 1 << 5,
+ JAMMA_P2_BUTTON3 = 1 << 6,
+ JAMMA_P2_START = 1 << 7,
+ JAMMA_P1_LEFT = 1 << 8,
+ JAMMA_P1_RIGHT = 1 << 9,
+ JAMMA_P1_UP = 1 << 10,
+ JAMMA_P1_DOWN = 1 << 11,
+ JAMMA_P1_BUTTON1 = 1 << 12,
+ JAMMA_P1_BUTTON2 = 1 << 13,
+ JAMMA_P1_BUTTON3 = 1 << 14,
+ JAMMA_P1_START = 1 << 15,
+
+ // IO_REG_IN3_LOW bits 8-11
+ JAMMA_P1_BUTTON4 = 1 << 16,
+ JAMMA_P1_BUTTON5 = 1 << 17,
+ JAMMA_TEST = 1 << 18,
+ JAMMA_P1_BUTTON6 = 1 << 19,
+
+ // IO_REG_IN3_HIGH bits 8-11
+ JAMMA_P2_BUTTON4 = 1 << 20,
+ JAMMA_P2_BUTTON5 = 1 << 21,
+ JAMMA_UNKNOWN = 1 << 22,
+ JAMMA_P2_BUTTON6 = 1 << 23,
+
+ // IO_REG_IN1_HIGH bits 8-12
+ JAMMA_COIN1 = 1 << 24,
+ JAMMA_COIN2 = 1 << 25,
+ JAMMA_PCMCIA1 = 1 << 26,
+ JAMMA_PCMCIA2 = 1 << 27,
+ JAMMA_SERVICE = 1 << 28,
+
+ // IO_REG_IN1_LOW bits 0-2
+ JAMMA_DIP1 = 1 << 29,
+ JAMMA_DIP2 = 1 << 30,
+ JAMMA_DIP3 = 1 << 31
+} K573_JAMMAInputs;
+
+typedef enum _K573_Light {
+ // Dance Dance Revolution (2-player)
+ DDR_LIGHT_P1_UP = 1 << 0,
+ DDR_LIGHT_P1_LEFT = 1 << 1,
+ DDR_LIGHT_P1_RIGHT = 1 << 2,
+ DDR_LIGHT_P1_DOWN = 1 << 3,
+ DDR_LIGHT_P1_MUX_DATA = 1 << 4, // Used for stage commands
+ DDR_LIGHT_P1_MUX_CLK = 1 << 7, // Used for stage commands
+ DDR_LIGHT_P2_UP = 1 << 8,
+ DDR_LIGHT_P2_LEFT = 1 << 9,
+ DDR_LIGHT_P2_RIGHT = 1 << 10,
+ DDR_LIGHT_P2_DOWN = 1 << 11,
+ DDR_LIGHT_P2_MUX_DATA = 1 << 12, // Used for stage commands
+ DDR_LIGHT_P2_MUX_CLK = 1 << 15, // Used for stage commands
+ DDR_LIGHT_P1_BUTTONS = 1 << 17,
+ DDR_LIGHT_P2_BUTTONS = 1 << 18,
+ DDR_LIGHT_MARQUEE_BR = 1 << 20,
+ DDR_LIGHT_MARQUEE_BL = 1 << 21,
+ DDR_LIGHT_MARQUEE_TL = 1 << 22,
+ DDR_LIGHT_MARQUEE_TR = 1 << 23,
+ DDR_LIGHT_SPEAKER_DIGITAL = 1 << 28, // Speaker neon on digital I/O boards
+ DDR_LIGHT_SPEARKER_ANALOG = 1 << 30, // Speaker neon on analog I/O boards
+
+ // Dance Dance Revolution Solo
+ DDRSOLO_LIGHT_EXTRA4 = 1 << 8,
+ DDRSOLO_LIGHT_EXTRA2 = 1 << 9,
+ DDRSOLO_LIGHT_EXTRA1 = 1 << 10,
+ DDRSOLO_LIGHT_EXTRA3 = 1 << 11,
+ DDRSOLO_LIGHT_SPEAKER = 1 << 16,
+ DDRSOLO_LIGHT_BUTTONS = 1 << 20,
+ DDRSOLO_LIGHT_BODY_CENTER = 1 << 21,
+ DDRSOLO_LIGHT_BODY_RIGHT = 1 << 22,
+ DDRSOLO_LIGHT_BODY_LEFT = 1 << 23,
+
+ // DrumMania 1st Mix
+ DM_LIGHT_HIHAT = 1 << 16,
+ DM_LIGHT_HIGH_TOM = 1 << 17,
+ DM_LIGHT_LOW_TOM = 1 << 18,
+ DM_LIGHT_SNARE = 1 << 19,
+ DM_LIGHT_CYMBAL = 1 << 20,
+ DM_LIGHT_START_BUTTON = 1 << 21,
+ DM_LIGHT_SELECT_BUTTON = 1 << 22,
+ DM_LIGHT_NEON_BOTTOM = 1 << 27,
+ DM_LIGHT_SPOT = 1 << 30,
+ DM_LIGHT_NEON_TOP = 1 << 31,
+
+ // DrumMania 2nd Mix and later
+ DM2_LIGHT_HIHAT = 1 << 0,
+ DM2_LIGHT_HIGH_TOM = 1 << 1,
+ DM2_LIGHT_LOW_TOM = 1 << 2,
+ DM2_LIGHT_SNARE = 1 << 3,
+ DM2_LIGHT_SPOT = 1 << 8,
+ DM2_LIGHT_NEON_TOP = 1 << 9,
+ DM2_LIGHT_NEON_BOTTOM = 1 << 11,
+ DM2_LIGHT_CYMBAL = 1 << 12,
+ DM2_LIGHT_START_BUTTON = 1 << 13,
+ DM2_LIGHT_SELECT_BUTTON = 1 << 14
+} K573_Light;
+
+/* System information structures */
+
+typedef enum _K573_IOBoardType {
+ IO_TYPE_ANALOG = 0, // Light control board (early Bemani)
+ IO_TYPE_DIGITAL = 1, // Light control + MP3 playback board (late Bemani)
+ IO_TYPE_FISHBAIT = 2, // Fishing reel controls interface (Fisherman's Bait)
+ IO_TYPE_GUNMANIA = 3, // Gun control board (Gun Mania)
+ IO_TYPE_KARAOKE = 4, // Karaoke I/O + video mux board (DDR Karaoke Mix)
+ IO_TYPE_SERIAL = 5 // Serial port (debug?) board (Great Bishi Bashi Champ)
+ // TODO: does PunchMania have its own board?
+} K573_IOBoardType;
+
+typedef enum _K573_DDRStageType {
+ DDR_TYPE_NONE = 0,
+ DDR_TYPE_2PLAYER = 1,
+ DDR_TYPE_SOLO = 2
+} K573_DDRStageType;
+
+/* Public API */
+
+#define K573_RESET_WATCHDOG() { \
+ K573_WATCHDOG = 0; \
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Returns a bitfield containing the state of all JAMMA inputs and DIP
+ * switches. All bits are inverted as they represent the actual signal levels
+ * on the JAMMA pins (i.e. normally pulled up by resistors, shorted to ground
+ * when a button is pressed).
+ *
+ * @return Inverted logical OR of K573_JAMMAInputs flags
+ */
+uint32_t K573_GetJAMMAInputs(void);
+
+/**
+ * @brief Sets the 32 light outputs provided by the the analog and digital I/O
+ * boards to match the provided bitfield. K573_SetBoardType(IO_TYPE_ANALOG) or
+ * K573_SetBoardType(IO_TYPE_DIGITAL) must be called beforehand to set the I/O
+ * board type.
+ *
+ * @param lights Non-inverted logical OR of K573_Light flags
+ */
+void K573_SetLights(uint32_t lights);
+
+/**
+ * @brief Sets the installed I/O board type. Currently only IO_TYPE_ANALOG and
+ * IO_TYPE_DIGITAL are supported.
+ *
+ * @param type
+ */
+void K573_SetBoardType(K573_IOBoardType type);
+
+/**
+ * @brief Sends a command to the multiplexer PCB embedded into DDR stage units
+ * (if the system is a DDR cabinet) by bitbanging it through the light outputs.
+ * K573_SetBoardType(IO_TYPE_ANALOG) or K573_SetBoardType(IO_TYPE_DIGITAL) must
+ * be called beforehand to set the I/O board type.
+ *
+ * @param value
+ * @param length Number of bits to send (1-32)
+ */
+//void K573_DDRStageCommand(uint32_t value, uint32_t length);
+
+/**
+ * @brief Initializes the expansion port registers to enable System 573 I/O
+ * access.
+ */
+void K573_Init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/examples/io/system573/main.c b/examples/io/system573/main.c
index a06c4e5..64722d7 100644
--- a/examples/io/system573/main.c
+++ b/examples/io/system573/main.c
@@ -1,15 +1,14 @@
/*
* PSn00bSDK Konami System 573 example
- * (C) 2021 spicyjpeg - MPL licensed
+ * (C) 2022 spicyjpeg - MPL licensed
*
* This is a minimal example demonstrating how to target the Konami System 573
* using PSn00bSDK. The System 573 is a PS1-based arcade motherboard that
* powered various Konami arcade games throughout the late 1990s, most notably
* Dance Dance Revolution and other Bemani rhythm games. It came in several
* configurations, with slightly different I/O connectors depending on the game
- * and two optional add-on modules (known as the "analog I/O" and "digital I/O"
- * boards respectively) providing light control outputs and, in the case of the
- * digital I/O board, MP3 audio playback.
+ * and optional add-on boards providing extra features such as light control
+ * outputs or MP3 audio playback.
*
* Unlike other arcade systems based on PS1 hardware, the 573 is mostly
* identical to a regular PS1, with almost all custom extensions mapped into
@@ -62,60 +61,15 @@
#include
#include
#include
-#include
#include
#include
-#include
-
-/* Register definitions */
-
-#define EXP1_ADDR *((volatile uint32_t *) 0x1f801000)
-#define EXP1_CTRL *((volatile uint32_t *) 0x1f801008)
-
-#define K573_IN0 *((volatile uint16_t *) 0x1f400000)
-#define K573_IN1_L *((volatile uint16_t *) 0x1f400004)
-#define K573_IN1_H *((volatile uint16_t *) 0x1f400006)
-#define K573_IN2 *((volatile uint16_t *) 0x1f400008)
-#define K573_IN3_L *((volatile uint16_t *) 0x1f40000c)
-#define K573_IN3_H *((volatile uint16_t *) 0x1f40000e)
-#define K573_BANK *((volatile uint16_t *) 0x1f500000)
-#define K573_WATCHDOG *((volatile uint16_t *) 0x1f5c0000)
-
-#define K573_IDE_CS0 ((volatile uint16_t *) 0x1f480000)
-#define K573_IDE_CS1 ((volatile uint16_t *) 0x1f4c0000)
-#define K573_RTC ((volatile uint16_t *) 0x1f620000)
-#define K573_IO_BOARD ((volatile uint16_t *) 0x1f640000)
-
-typedef enum {
- ANALOG_IO_LIGHTS0 = 0x20,
- ANALOG_IO_LIGHTS1 = 0x22,
- ANALOG_IO_LIGHTS2 = 0x24,
- ANALOG_IO_LIGHTS3 = 0x26,
-
- // The digital I/O board has a lot more registers than these, but there
- // seems to be no DIGITAL_IO_LIGHTS6 register. WTF
- DIGITAL_IO_LIGHTS1 = 0x70,
- DIGITAL_IO_LIGHTS0 = 0x71,
- DIGITAL_IO_LIGHTS3 = 0x72,
- DIGITAL_IO_LIGHTS7 = 0x73,
- DIGITAL_IO_LIGHTS4 = 0x7d,
- DIGITAL_IO_LIGHTS5 = 0x7e,
- DIGITAL_IO_LIGHTS2 = 0x7f
-} IO_BOARD_REG;
-
-// The 573's real-time clock chip is an M48T58, which behaves like a standard
-// 8 KB battery-backed SRAM with a bunch of special registers. Official games
-// store highscores and settings in RTC RAM.
-typedef enum {
- RTC_CTRL = 0x1ff8,
- RTC_SECONDS = 0x1ff9,
- RTC_MINUTES = 0x1ffa,
- RTC_HOURS = 0x1ffb,
- RTC_DAY_OF_WEEK = 0x1ffc,
- RTC_DAY_OF_MONTH = 0x1ffd,
- RTC_MONTH = 0x1ffe,
- RTC_YEAR = 0x1fff
-} RTC_REG;
+
+#include "k573io.h"
+
+const char *const IO_BOARD_TYPES[] = {
+ "ANALOG",
+ "DIGITAL"
+};
#define btoi(x) ((((x) >> 4) & 0xf) * 10 + ((x) & 0xf))
@@ -179,89 +133,6 @@ void display(CONTEXT *ctx) {
SetDispMask(1);
}
-/* Input polling utilities */
-
-typedef struct {
- uint8_t p1_joy, p1_btn;
- uint8_t p2_joy, p2_btn;
- uint8_t coin, dip_sw;
-} JAMMAInputs;
-
-void get_jamma_inputs(JAMMAInputs *output) {
- uint16_t in1l = K573_IN1_L;
- uint16_t in1h = K573_IN1_H;
- uint16_t in2 = K573_IN2;
- uint16_t in3l = K573_IN3_L;
- uint16_t in3h = K573_IN3_H;
- uint8_t p1_btn, p2_btn, coin;
-
- // Rearrange the bits read from the input register into something that's
- // easier to parse and display. Refer to MAME for information on what each
- // bit in the IN* registers does.
- p1_btn = ((in2 >> 15) & 0x0001); // Bit 0 = start button
- p1_btn |= ((in2 >> 8) & 0x0007) << 1; // Bit 1-3 = buttons 1-3
- p1_btn |= ((in3l >> 8) & 0x0003) << 4; // Bit 4-5 = buttons 4-5
- p1_btn |= ((in3l >> 11) & 0x0001) << 6; // Bit 6 = button 6
- p2_btn = ((in2 >> 7) & 0x0001); // Bit 0 = start button
- p2_btn |= ((in2 >> 4) & 0x0007) << 1; // Bit 1-3 = buttons 1-3
- p2_btn |= ((in3h >> 8) & 0x0003) << 4; // Bit 4-5 = buttons 4-5
- p2_btn |= ((in3h >> 11) & 0x0001) << 6; // Bit 6 = button 6
- coin = ((in1h >> 8) & 0x0003); // Bit 0-1 = coin switches
- coin |= ((in1h >> 12) & 0x0001) << 2; // Bit 2 = service button
- coin |= ((in3l >> 10) & 0x0001) << 3; // Bit 3 = test button
- coin |= ((in1h >> 10) & 0x0003) << 4; // Bit 4-5 = PCMCIA cards
-
- output->p1_joy = (in2 >> 8) & 0x000f;
- output->p1_btn = p1_btn;
- output->p2_joy = in2 & 0x000f;
- output->p2_btn = p2_btn;
- output->coin = coin;
- output->dip_sw = in1l & 0x000f;
-}
-
-/* I/O board (light control) utilities */
-
-// This function controls light outputs on analog I/O boards.
-void set_lights_analog(uint32_t lights) {
- uint32_t bits;
-
- bits = (lights & 0x01010101) << 7; // Lamp n*8+0 -> bit n*8+7
- bits |= (lights & 0x02020202) << 5; // Lamp n*8+1 -> bit n*8+6
- bits |= (lights & 0x04040404) >> 1; // Lamp n*8+2 -> bit n*8+1
- bits |= (lights & 0x08080808) >> 3; // Lamp n*8+3 -> bit n*8+0
- bits |= (lights & 0x10101010) << 1; // Lamp n*8+4 -> bit n*8+5
- bits |= (lights & 0x20202020) >> 1; // Lamp n*8+5 -> bit n*8+4
- bits |= (lights & 0x40404040) >> 3; // Lamp n*8+6 -> bit n*8+3
- bits |= (lights & 0x80808080) >> 5; // Lamp n*8+7 -> bit n*8+2
-
- K573_IO_BOARD[ANALOG_IO_LIGHTS0] = (bits) & 0xff;
- K573_IO_BOARD[ANALOG_IO_LIGHTS1] = (bits >> 8) & 0xff;
- K573_IO_BOARD[ANALOG_IO_LIGHTS2] = (bits >> 16) & 0xff;
- K573_IO_BOARD[ANALOG_IO_LIGHTS3] = (bits >> 24) & 0xff;
-}
-
-// This function controls light outputs on digital I/O boards (i.e. the ones
-// that include MP3 playback hardware in addition to the light control).
-// TODO: test this on real hardware -- it might not work if lights are handled
-// by the board's FPGA, which requires a binary blob...
-void set_lights_digital(uint32_t lights) {
- uint32_t bits;
-
- bits = (lights & 0x11111111); // Lamp n*4+0 -> bit n*4+0
- bits |= (lights & 0x22222222) << 1; // Lamp n*4+1 -> bit n*4+2
- bits |= (lights & 0x44444444) << 1; // Lamp n*4+2 -> bit n*4+3
- bits |= (lights & 0x88888888) >> 2; // Lamp n*4+3 -> bit n*4+1
-
- K573_IO_BOARD[DIGITAL_IO_LIGHTS0] = ((bits) & 0xf) << 12;
- K573_IO_BOARD[DIGITAL_IO_LIGHTS1] = ((bits >> 4) & 0xf) << 12;
- K573_IO_BOARD[DIGITAL_IO_LIGHTS2] = ((bits >> 8) & 0xf) << 12;
- K573_IO_BOARD[DIGITAL_IO_LIGHTS3] = ((bits >> 12) & 0xf) << 12;
- K573_IO_BOARD[DIGITAL_IO_LIGHTS4] = ((bits >> 16) & 0xf) << 12;
- K573_IO_BOARD[DIGITAL_IO_LIGHTS5] = ((bits >> 20) & 0xf) << 12;
- //K573_IO_BOARD[DIGITAL_IO_LIGHTS6] = ((bits >> 24) & 0xf) << 12;
- K573_IO_BOARD[DIGITAL_IO_LIGHTS7] = ((bits >> 28) & 0xf) << 12;
-}
-
/* Main */
static CONTEXT ctx;
@@ -270,101 +141,96 @@ static CONTEXT ctx;
#define SHOW_ERROR(...) { SHOW_STATUS(__VA_ARGS__); while (1) __asm__("nop"); }
int main(int argc, const char* argv[]) {
- // Reinitialize the heap and relocate the stack to allow the 573's full 4
- // MB of RAM to be used. This isn't strictly required; executables designed
- // for 2 MB of RAM will also run fine on the 573 (obviously).
- // FIXME: this seems to be broken currently
- //__asm__ volatile("li $sp, 0x803fffe0");
- //_mem_init(0x400000, 0x20000);
-
- EXP1_ADDR = 0x1f000000;
- EXP1_CTRL = 0x24173f47; // 573 BIOS uses this value
- K573_WATCHDOG = 0;
-
init_context(&ctx);
+ K573_Init();
- // Determine whether we are running on a 573 by fetching the version string
- // from the BIOS.
const char *const version = (const char *const) GetSystemInfo(0x02);
//if (strncmp(version, "Konami OS", 9))
//SHOW_ERROR("ERROR: NOT RUNNING ON A SYSTEM 573!\n\n[%s]\n", version);
uint32_t counter = 0;
- uint8_t last_joystick = 0xff;
- uint8_t last_buttons = 0xff;
+ uint32_t inputs = K573_GetJAMMAInputs();
+ uint32_t last_inputs = 0xff;
uint32_t current_light = 0;
- uint32_t is_digital = 0;
+
+ // DIP switch 1 is used to determine if an analog or digital I/O board is
+ // installed.
+ K573_IOBoardType io_type = (inputs & JAMMA_DIP1)
+ ? IO_TYPE_ANALOG
+ : IO_TYPE_DIGITAL;
+
+ K573_SetBoardType(io_type);
+ K573_SetLights(1);
while (1) {
- FntPrint(-1, "COUNTER=%d\n", counter++);
+ inputs = K573_GetJAMMAInputs();
- JAMMAInputs inputs;
- get_jamma_inputs(&inputs);
+ FntPrint(-1, "COUNTER=%d\n", counter++);
FntPrint(-1, "\nJAMMA INPUTS:\n");
- FntPrint(-1, " P1 JOYSTICK =%04@\n", inputs.p1_joy);
- FntPrint(-1, " P1 BUTTONS =%07@\n", inputs.p1_btn);
- FntPrint(-1, " P2 JOYSTICK =%04@\n", inputs.p2_joy);
- FntPrint(-1, " P2 BUTTONS =%07@\n", inputs.p2_btn);
- FntPrint(-1, " COIN/SERVICE=%04@\n", inputs.coin & 0xf);
- FntPrint(-1, " DIP SWITCHES=%04@\n", inputs.dip_sw);
+ FntPrint(-1, " IN2 =%016@\n", inputs & 0xffff);
+ FntPrint(-1, " IN3_L=%04@\n", (inputs >> 16) & 0x0f);
+ FntPrint(-1, " IN3_H=%04@\n", (inputs >> 20) & 0x0f);
+ FntPrint(-1, " IN1_H=%05@\n", (inputs >> 24) & 0x1f);
FntPrint(-1, "\nCABINET LIGHTS:\n");
- FntPrint(-1, " BOARD=%s I/O\n", is_digital ? "DIGITAL" : "ANALOG");
- FntPrint(-1, " LIGHT=%d\n\n", current_light);
- FntPrint(-1, " [START] CHANGE BOARD TYPE\n");
- FntPrint(-1, " [LEFT/RIGHT] SELECT LIGHT TO TEST\n");
+ FntPrint(-1, " BOARD=%s\n", IO_BOARD_TYPES[io_type]);
+ FntPrint(-1, " LIGHT=%d\n", current_light);
+ FntPrint(-1, "\n [DIP SW1] CHANGE BOARD TYPE\n");
+ FntPrint(-1, "\n [TEST SW] CHANGE ACTIVE LIGHT\n");
// Request the current date/time from the RTC and display it.
- K573_RTC[RTC_CTRL] |= 0x40;
+ K573_RTC[RTC_REG_CTRL] |= 0x40;
FntPrint(-1, "\nRTC:\n");
FntPrint(
-1,
" %02d-%02d-%02d %02d:%02d:%02d\n",
- btoi(K573_RTC[RTC_YEAR]),
- btoi(K573_RTC[RTC_MONTH]),
- btoi(K573_RTC[RTC_DAY_OF_MONTH] & 0x3f),
- btoi(K573_RTC[RTC_HOURS]),
- btoi(K573_RTC[RTC_MINUTES]),
- btoi(K573_RTC[RTC_SECONDS] & 0x7f)
+ btoi(K573_RTC[RTC_REG_YEAR]),
+ btoi(K573_RTC[RTC_REG_MONTH]),
+ btoi(K573_RTC[RTC_REG_DAY_OF_MONTH] & 0x3f),
+ btoi(K573_RTC[RTC_REG_HOURS]),
+ btoi(K573_RTC[RTC_REG_MINUTES]),
+ btoi(K573_RTC[RTC_REG_SECONDS] & 0x7f)
);
FntPrint(-1, "\nSYSTEM:\n");
FntPrint(-1, " KERNEL=%s\n", version);
- FntPrint(-1, " PCMCIA=%02@\n", inputs.coin >> 4);
+ FntPrint(-1, " DIP SW=%03@\n", inputs >> 29);
+ FntPrint(-1, " PCMCIA=%02@\n", (inputs >> 26) & 0x3);
FntFlush(-1);
display(&ctx);
// Reset the watchdog. This must be done at least once per frame to
// prevent the 573 from rebooting.
- K573_WATCHDOG = 0;
+ K573_RESET_WATCHDOG();
- if (is_digital)
- set_lights_digital(1 << current_light);
- else
- set_lights_analog(1 << current_light);
-
- // Handle inputs.
- if ((last_joystick & 0x01) && !(inputs.p1_joy & 0x01)) // Left
- current_light--;
- if ((last_joystick & 0x02) && !(inputs.p1_joy & 0x02)) // Right
- current_light++;
- if ((last_buttons & 0x02) && !(inputs.p1_btn & 0x02)) // Button 1
- current_light--;
- if ((last_buttons & 0x04) && !(inputs.p1_btn & 0x04)) // Button 2
+ // Change the currently active light if the test button on the 573's
+ // front panel is pressed. DDR non-light outputs are skipped.
+ if ((last_inputs & JAMMA_TEST) && !(inputs & JAMMA_TEST)) {
current_light++;
- if ((last_buttons & 0x01) && !(inputs.p1_btn & 0x01)) { // Start
- is_digital = !is_digital;
- if (is_digital)
- set_lights_analog(0);
- else
- set_lights_digital(0);
+ if (
+ (current_light == 4) || // DDR_LIGHT_P1_MUX_DATA
+ (current_light == 7) || // DDR_LIGHT_P1_MUX_CLK
+ (current_light == 12) || // DDR_LIGHT_P2_MUX_DATA
+ (current_light == 15) // DDR_LIGHT_P2_MUX_CLK
+ ) current_light++;
+
+ current_light %= 32;
+ K573_SetLights(1 << current_light);
+ }
+
+ // if DIP switch 1 is toggled, change the I/O board type.
+ if ((last_inputs & JAMMA_DIP1) != (inputs & JAMMA_DIP1)) {
+ io_type = (inputs & JAMMA_DIP1)
+ ? IO_TYPE_ANALOG
+ : IO_TYPE_DIGITAL;
+
+ K573_SetBoardType(io_type);
+ K573_SetLights(1 << current_light);
}
- current_light %= 32;
- last_joystick = inputs.p1_joy;
- last_buttons = inputs.p1_btn;
+ last_inputs = inputs;
}
return 0;
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index af99046..6f604d5 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -14,7 +14,7 @@ include(GNUInstallDirs)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>")
set(CMAKE_C_STANDARD 11)
-set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD 17)
## Dependencies
--
cgit v1.2.3
From 93f0a6d23ebed50833f565f949f351c2b80853ac Mon Sep 17 00:00:00 2001
From: spicyjpeg <88942473+spicyjpeg@users.noreply.github.com>
Date: Mon, 7 Mar 2022 22:17:50 +0100
Subject: Fix critical ldscript bug and CI, add BIOS setjmp
---
.github/workflows/build.yml | 28 ++++++------------
examples/io/system573/k573io.c | 5 ++--
examples/io/system573/k573io.h | 3 --
libpsn00b/include/psxapi.h | 12 ++++++++
libpsn00b/ldscripts/dll.ld | 1 +
libpsn00b/ldscripts/exe.ld | 11 +++----
libpsn00b/psxapi/stubs.json | 12 ++++++++
libpsn00b/psxapi/sys.s | 18 +++++++++++-
libpsn00b/readme.txt | 67 +++++++++++++++++++++---------------------
9 files changed, 94 insertions(+), 63 deletions(-)
(limited to '.github/workflows')
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index b2ca311..6f42e41 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -16,6 +16,9 @@ env:
jobs:
# This is based on doc/toolchain.md, no surprises here other than the cache.
+ # Since actions/cache@v2 has bugs when restoring on Windows caches created on
+ # Linux, v1 is used instead.
+ # https://github.com/actions/cache/issues/576
build-gcc:
name: Build GCC toolchain
runs-on: ubuntu-latest
@@ -23,7 +26,7 @@ jobs:
steps:
- name: Initialize toolchain cache
id: _cache
- uses: actions/cache@v2
+ uses: actions/cache@v1
with:
key: gcc-${{ env.GCC_TARGET }}-${{ env.GCC_VERSION }}
path: gcc
@@ -83,25 +86,19 @@ jobs:
# No surprises here either. The GitHub Actions VMs even come with most of the
# dependencies required to build PSn00bSDK preinstalled.
- # NOTE: the workaround to allow the toolchain cache to be loaded (see below)
- # doesn't seem to work on Windows Server 2022 currently.
build-sdk-windows:
name: Build PSn00bSDK on Windows
- runs-on: windows-2019
+ runs-on: windows-2022
needs: build-gcc
steps:
- # Due to a bug in the cache action (and in order to use Ninja and pacman)
- # the directories MSys2 stores binaries in must be added to PATH. For
- # some reason they are not present in PATH by default.
- # https://github.com/actions/cache/issues/576
- name: Add MSys2 to PATH
run: |
echo "C:\msys64\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "C:\msys64\usr\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: Initialize toolchain cache
- uses: actions/cache@v2
+ uses: actions/cache@v1
with:
key: gcc-${{ env.GCC_TARGET }}-${{ env.GCC_VERSION }}
path: gcc
@@ -118,7 +115,7 @@ jobs:
- name: Build and package PSn00bSDK
run: |
- cmake --preset ci -S sdk -G "Visual Studio 16 2019" -DPSN00BSDK_TC=${{ github.workspace }}\gcc\windows
+ cmake --preset ci -S sdk -G "Visual Studio 17 2022" -DPSN00BSDK_TC=${{ github.workspace }}\gcc\windows
cmake --build build
cmake --build build -t package
@@ -144,7 +141,7 @@ jobs:
steps:
- name: Initialize toolchain cache
- uses: actions/cache@v2
+ uses: actions/cache@v1
with:
key: gcc-${{ env.GCC_TARGET }}-${{ env.GCC_VERSION }}
path: gcc
@@ -178,12 +175,6 @@ jobs:
name: psn00bsdk-linux-deb
path: build/packages/*.deb
- - name: Upload build artifacts (RPM)
- uses: actions/upload-artifact@v2
- with:
- name: psn00bsdk-linux-rpm
- path: build/packages/*.rpm
-
# This job takes care of creating a new release and upload the build
# artifacts if the last commit is associated to a tag.
create-release:
@@ -194,7 +185,7 @@ jobs:
steps:
- name: Initialize toolchain cache
if: ${{ github.ref_type == 'tag' }}
- uses: actions/cache@v2
+ uses: actions/cache@v1
with:
key: gcc-${{ env.GCC_TARGET }}-${{ env.GCC_VERSION }}
path: gcc
@@ -236,4 +227,3 @@ jobs:
psn00bsdk-windows-nsis/*
psn00bsdk-linux/*
psn00bsdk-linux-deb/*
- psn00bsdk-linux-rpm/*
diff --git a/examples/io/system573/k573io.c b/examples/io/system573/k573io.c
index a8748d6..bc13852 100644
--- a/examples/io/system573/k573io.c
+++ b/examples/io/system573/k573io.c
@@ -11,6 +11,7 @@
#include
#include
+#include
#include "k573io.h"
@@ -116,8 +117,8 @@ void K573_SetBoardType(K573_IOBoardType type) {
//K573_DDRStageCommand(0x000001, 22);
void K573_Init(void) {
- EXP1_ADDR = 0x1f000000;
- EXP1_CTRL = 0x24173f47; // 573 BIOS uses this value
+ EXP1_ADDR = 0x1f000000;
+ EXP1_DELAY_SIZE = 0x24173f47; // 573 BIOS uses this value
K573_RESET_WATCHDOG();
}
diff --git a/examples/io/system573/k573io.h b/examples/io/system573/k573io.h
index cf125e2..7095a7c 100644
--- a/examples/io/system573/k573io.h
+++ b/examples/io/system573/k573io.h
@@ -10,9 +10,6 @@
/* Register definitions */
-#define EXP1_ADDR *((volatile uint32_t *) 0x1f801000)
-#define EXP1_CTRL *((volatile uint32_t *) 0x1f801008)
-
#define K573_BANK_SWITCH *((volatile uint16_t *) 0x1f500000)
#define K573_IDE_RESET *((volatile uint16_t *) 0x1f560000)
#define K573_WATCHDOG *((volatile uint16_t *) 0x1f5c0000)
diff --git a/libpsn00b/include/psxapi.h b/libpsn00b/include/psxapi.h
index e7c2e1e..1298d29 100644
--- a/libpsn00b/include/psxapi.h
+++ b/libpsn00b/include/psxapi.h
@@ -121,6 +121,12 @@ struct EXEC {
unsigned int sp,fp,rp,ret,base;
};
+struct JMP_BUF {
+ unsigned int ra, sp, fp;
+ unsigned int s0, s1, s2, s3, s4, s5, s6, s7;
+ unsigned int gp;
+};
+
// Not recommended to use these functions to install IRQ handlers
typedef struct {
@@ -211,6 +217,12 @@ void ChangeClearRCnt(int t, int m);
int Exec(struct EXEC *exec, int argc, char **argv);
void FlushCache(void);
+// BIOS setjmp functions
+void b_setjmp(struct JMP_BUF *buf);
+void b_longjmp(struct JMP_BUF *buf, int param);
+void SetDefaultExitFromException(void);
+void SetCustomExitFromException(struct JMP_BUF *buf);
+
// Misc functions
int GetSystemInfo(int index);
void *GetB0Table(void);
diff --git a/libpsn00b/ldscripts/dll.ld b/libpsn00b/ldscripts/dll.ld
index a03a504..15158e4 100644
--- a/libpsn00b/ldscripts/dll.ld
+++ b/libpsn00b/ldscripts/dll.ld
@@ -86,6 +86,7 @@ SECTIONS {
* as we don't have to worry about managing .bss separately from the
* main DLL blob.
*/
+ . = ALIGN((. != 0) ? 4 : 1);
__bss_start = .;
*(.bss .bss.* .gnu.linkonce.b.*)
diff --git a/libpsn00b/ldscripts/exe.ld b/libpsn00b/ldscripts/exe.ld
index c6b9f29..583d76a 100644
--- a/libpsn00b/ldscripts/exe.ld
+++ b/libpsn00b/ldscripts/exe.ld
@@ -82,6 +82,11 @@ SECTIONS {
/* BSS sections, i.e. uninitialized variables */
+ /*
+ * Align all BSS sections to 4 bytes to ensure _start() doesn't perform
+ * unaligned memory accesses when clearing them.
+ */
+ . = ALIGN((. != 0) ? 4 : 1);
__bss_start = .;
.sbss (NOLOAD) : {
@@ -91,13 +96,9 @@ SECTIONS {
.bss (NOLOAD) : {
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
-
- /*
- * This crap was in the stock GCC linker script.
- */
- . = ALIGN((. != 0) ? 4 : 1);
} > APP_RAM
+ . = ALIGN((. != 0) ? 4 : 1);
_end = .;
/* Dummy section */
diff --git a/libpsn00b/psxapi/stubs.json b/libpsn00b/psxapi/stubs.json
index 14ef935..9198b06 100644
--- a/libpsn00b/psxapi/stubs.json
+++ b/libpsn00b/psxapi/stubs.json
@@ -47,6 +47,18 @@
"name": "putc",
"file": "stdio.s"
},
+ {
+ "type": "a",
+ "id": 19,
+ "name": "b_setjmp",
+ "file": "sys.s"
+ },
+ {
+ "type": "a",
+ "id": 20,
+ "name": "b_longjmp",
+ "file": "sys.s"
+ },
{
"type": "a",
"id": 57,
diff --git a/libpsn00b/psxapi/sys.s b/libpsn00b/psxapi/sys.s
index ef57124..e54bd98 100644
--- a/libpsn00b/psxapi/sys.s
+++ b/libpsn00b/psxapi/sys.s
@@ -6,7 +6,23 @@
.set noreorder
-## A0 table functions (5)
+## A0 table functions (7)
+
+.section .text.b_setjmp
+.global b_setjmp
+.type b_setjmp, @function
+b_setjmp:
+ li $t2, 0xa0
+ jr $t2
+ li $t1, 0x13
+
+.section .text.b_longjmp
+.global b_longjmp
+.type b_longjmp, @function
+b_longjmp:
+ li $t2, 0xa0
+ jr $t2
+ li $t1, 0x14
.section .text.b_InitHeap
.global b_InitHeap
diff --git a/libpsn00b/readme.txt b/libpsn00b/readme.txt
index cfff733..6a6be5a 100644
--- a/libpsn00b/readme.txt
+++ b/libpsn00b/readme.txt
@@ -18,33 +18,39 @@ recommended version as that is what LibPSn00b is most tested most on.
Brief summary of libraries:
- libc - Standard C library. Covers only a small subset of the full
- standard C library such as basic string and memory manipulation
- functions. Should include libgcc to avoid libc/libgcc linker
- hell (endless cross referencing).
-
- psxgpu - GPU library for video, graphics control, and interrupt service
- subsystem that other libraries that uses interrupts depend on.
-
- psxgte - GTE library for hardware accelerated vector transformations
- that are integral for high performance 3D graphics on the PS1
- (it is a Geometry Transformation Engine, NOT Transfer Engine).
-
- psxapi - Provides function calls for using functions provided by the PS1
- BIOS.
-
- psxetc - Provides some miscellaneous features used by the other libraries
- as well as a dynamic linker for loading DLLs at runtime.
-
- psxspu - SPU library (work in progress). Currently supports hardware
- init, sample data upload via DMA and playing sound samples.
- Lacks support for reverb and a sequenced music subsystem.
-
- psxcd - CD-ROM library for loading files, parsing directories
- (PSn00bSDK addition), CD Audio/XA playback with provisions for
- data streaming. Also supports multi-session discs (must be
- selected manually).
-
+ libc - Standard C library. Covers only a small subset of the full
+ standard C library such as basic string and memory manipulation
+ functions. Should include libgcc to avoid libc/libgcc linker
+ hell (endless cross referencing).
+
+ psxgpu - GPU library for video, graphics control, and interrupt service
+ subsystem that other libraries that uses interrupts depend on.
+
+ psxgte - GTE library for hardware accelerated vector transformations
+ that are integral for high performance 3D graphics on the PS1
+ (it is a Geometry Transformation Engine, NOT Transfer Engine).
+
+ psxapi - Provides function calls for using functions provided by the PS1
+ BIOS.
+
+ psxetc - Provides some miscellaneous features used by the other libraries
+ as well as a dynamic linker for loading DLLs at runtime.
+
+ psxspu - SPU library (work in progress). Currently supports hardware
+ init, sample data upload via DMA and playing sound samples.
+ Lacks support for reverb and a sequenced music subsystem.
+
+ psxcd - CD-ROM library for loading files, parsing directories
+ (PSn00bSDK addition), CD Audio/XA playback with provisions for
+ data streaming. Also supports multi-session discs (must be
+ selected manually).
+
+ psxpress - Experimental MDEC library. Currently provides APIs to feed data
+ to the MDEC and retrieve decoded images, as well as a
+ decompressor for the Huffman encoding used in FMVs encoded using
+ Sony tools. A custom decompressor based on arithmetic coding
+ might be implemented in the future.
+
Each library has its own readme file that contains a todo list, credits
and some additional details of the library. Changes of all the libraries
must be covered in the changelog.txt file.
@@ -52,7 +58,7 @@ Brief summary of libraries:
Compiling:
- Refer to INSTALL.md in the parent directory for up-to-date installation
+ Refer to installation.md in the doc directory for up-to-date installation
instructions.
--- THE SECTION BELOW IS OUTDATED AND ONLY KEPT FOR REFERENCE ---
@@ -144,11 +150,6 @@ LibPSn00b Library to-do list:
psxmcrd - Better and faster memory card library with provisions for
low-level card access. The psxpad library would provide
communication routines for the card library.
-
- psxpress - MDEC and data decompression library. May use DEFLATE or LZ77
- for compressing MDEC data instead of Huffman as used in the
- official libraries. It may yield better compression which may
- potentially result in higher quality FMVs.
psxexp - Support library for various devices connected to the serial or
expansion port, including both official ones (e.g. PCMCIA cards
--
cgit v1.2.3