From ef776e728cfa67fbca38bb375152b336fa0b5200 Mon Sep 17 00:00:00 2001 From: spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> Date: Mon, 27 Jun 2022 22:18:11 +0200 Subject: Clean up io/system573 example and libpsxpress --- examples/io/system573/k573io.c | 7 ++++++- examples/io/system573/k573io.h | 38 +++++++++++++++++++++----------------- examples/io/system573/main.c | 2 +- 3 files changed, 28 insertions(+), 19 deletions(-) (limited to 'examples/io') diff --git a/examples/io/system573/k573io.c b/examples/io/system573/k573io.c index bc13852..53c109f 100644 --- a/examples/io/system573/k573io.c +++ b/examples/io/system573/k573io.c @@ -75,7 +75,7 @@ uint32_t K573_GetJAMMAInputs(void) { inputs |= ((K573_IO_CHIP[IO_REG_IN1_HIGH] >> 8) & 0x1f) << 24; inputs |= (K573_IO_CHIP[IO_REG_IN1_LOW] & 0x07) << 29; - return inputs; + return ~inputs; } void K573_SetLights(uint32_t lights) { @@ -120,5 +120,10 @@ void K573_Init(void) { EXP1_ADDR = 0x1f000000; EXP1_DELAY_SIZE = 0x24173f47; // 573 BIOS uses this value + // Bit 6 of this register controls the audio DAC and must be set, otherwise + // no sound will be output. Most of the other bits are data clocks/strobes + // and should be pulled high when not in use. + K573_IO_CHIP[IO_REG_OUT0] = 0x01e7; + K573_RESET_WATCHDOG(); } diff --git a/examples/io/system573/k573io.h b/examples/io/system573/k573io.h index 7095a7c..424e3e4 100644 --- a/examples/io/system573/k573io.h +++ b/examples/io/system573/k573io.h @@ -25,6 +25,7 @@ #define K573_IO_BOARD ((volatile uint16_t *) 0x1f640000) typedef enum _K573_IOChipRegister { + IO_REG_OUT0 = 0x0, IO_REG_IN0 = 0x0, IO_REG_IN1_LOW = 0x2, IO_REG_IN1_HIGH = 0x3, @@ -34,26 +35,29 @@ typedef enum _K573_IOChipRegister { } 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, + 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 + DIGITAL_IO_REG_LIGHTS1 = 0x70, + DIGITAL_IO_REG_LIGHTS0 = 0x71, + DIGITAL_IO_REG_LIGHTS3 = 0x72, + DIGITAL_IO_REG_LIGHTS7 = 0x73, + DIGITAL_IO_REG_DS2401 = 0x77, + DIGITAL_IO_REG_FPGA_STATUS = 0x7b, + DIGITAL_IO_REG_FPGA_UPLOAD = 0x7c, + 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 diff --git a/examples/io/system573/main.c b/examples/io/system573/main.c index 64722d7..3404ee4 100644 --- a/examples/io/system573/main.c +++ b/examples/io/system573/main.c @@ -207,7 +207,7 @@ int main(int argc, const char* argv[]) { // 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)) { + if (!(last_inputs & JAMMA_TEST) && (inputs & JAMMA_TEST)) { current_light++; if ( (current_light == 4) || // DDR_LIGHT_P1_MUX_DATA -- cgit v1.2.3 From c800972bc13ad0c7015b7d44fe9f124b719e792e Mon Sep 17 00:00:00 2001 From: spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> Date: Sun, 17 Jul 2022 11:40:02 +0200 Subject: Change I/O base address to 0xbf80, use size_t in stdlib --- examples/io/system573/k573io.h | 26 ++++---- libpsn00b/include/hwregs_a.h | 2 +- libpsn00b/include/hwregs_c.h | 142 ++++++++++++++++++++--------------------- libpsn00b/include/stdlib.h | 14 ++-- libpsn00b/libc/start.c | 8 +-- libpsn00b/psxpress/mdec.c | 8 +-- 6 files changed, 101 insertions(+), 99 deletions(-) (limited to 'examples/io') diff --git a/examples/io/system573/k573io.h b/examples/io/system573/k573io.h index 424e3e4..8655237 100644 --- a/examples/io/system573/k573io.h +++ b/examples/io/system573/k573io.h @@ -10,19 +10,19 @@ /* Register definitions */ -#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) +#define K573_BANK_SWITCH *((volatile uint16_t *) 0xbf500000) +#define K573_IDE_RESET *((volatile uint16_t *) 0xbf560000) +#define K573_WATCHDOG *((volatile uint16_t *) 0xbf5c0000) +#define K573_EXT_OUT *((volatile uint16_t *) 0xbf600000) +#define K573_JVS_INPUT *((volatile uint16_t *) 0xbf680000) +#define K573_SECURITY_OUT *((volatile uint16_t *) 0xbf6a0000) + +#define K573_FLASH ((volatile uint16_t *) 0xbf000000) +#define K573_IO_CHIP ((volatile uint16_t *) 0xbf400000) +#define K573_IDE_CS0 ((volatile uint16_t *) 0xbf480000) +#define K573_IDE_CS1 ((volatile uint16_t *) 0xbf4c0000) +#define K573_RTC ((volatile uint16_t *) 0xbf620000) +#define K573_IO_BOARD ((volatile uint16_t *) 0xbf640000) typedef enum _K573_IOChipRegister { IO_REG_OUT0 = 0x0, diff --git a/libpsn00b/include/hwregs_a.h b/libpsn00b/include/hwregs_a.h index 8a504f5..d8f6c72 100644 --- a/libpsn00b/include/hwregs_a.h +++ b/libpsn00b/include/hwregs_a.h @@ -4,7 +4,7 @@ # 2019 Meido-Tek Productions -.set IOBASE, 0x1f80 # IO segment base +.set IOBASE, 0xbf80 # IO segment base (KSEG1) ## GPU diff --git a/libpsn00b/include/hwregs_c.h b/libpsn00b/include/hwregs_c.h index e533c56..a9f4ee3 100644 --- a/libpsn00b/include/hwregs_c.h +++ b/libpsn00b/include/hwregs_c.h @@ -19,111 +19,111 @@ /* GPU */ -#define GPU_GP0 _MMIO32(0x1f801810) -#define GPU_GP1 _MMIO32(0x1f801814) +#define GPU_GP0 _MMIO32(0xbf801810) +#define GPU_GP1 _MMIO32(0xbf801814) /* CD drive */ -#define CD_STAT _MMIO8(0x1f801800) -#define CD_CMD _MMIO8(0x1f801801) -#define CD_DATA _MMIO8(0x1f801802) -#define CD_IRQ _MMIO8(0x1f801803) +#define CD_STAT _MMIO8(0xbf801800) +#define CD_CMD _MMIO8(0xbf801801) +#define CD_DATA _MMIO8(0xbf801802) +#define CD_IRQ _MMIO8(0xbf801803) -#define CD_REG(N) _MMIO8(0x1f801800 + (N)) +#define CD_REG(N) _MMIO8(0xbf801800 + (N)) /* SPU */ -#define SPU_MASTER_VOL_L _MMIO16(0x1f801d80) -#define SPU_MASTER_VOL_R _MMIO16(0x1f801d82) -#define SPU_REVERB_VOL_L _MMIO16(0x1f801d84) -#define SPU_REVERB_VOL_R _MMIO16(0x1f801d86) -#define SPU_KEY_ON _MMIO32(0x1f801d88) -#define SPU_KEY_OFF _MMIO32(0x1f801d8c) -#define SPU_FM_MODE _MMIO32(0x1f801d90) -#define SPU_NOISE_MODE _MMIO32(0x1f801d94) -#define SPU_REVERB_ON _MMIO32(0x1f801d98) -#define SPU_CHAN_STATUS _MMIO32(0x1f801d9c) - -#define SPU_REVERB_ADDR _MMIO16(0x1f801da2) -#define SPU_IRQ_ADDR _MMIO16(0x1f801da4) -#define SPU_ADDR _MMIO16(0x1f801da6) -#define SPU_DATA _MMIO16(0x1f801da8) - -#define SPU_CTRL _MMIO16(0x1f801daa) -#define SPU_DMA_CTRL _MMIO16(0x1f801dac) -#define SPU_STAT _MMIO16(0x1f801dae) - -#define SPU_CD_VOL_L _MMIO16(0x1f801db0) -#define SPU_CD_VOL_R _MMIO16(0x1f801db2) -#define SPU_EXT_VOL_L _MMIO16(0x1f801db4) -#define SPU_EXT_VOL_R _MMIO16(0x1f801db6) -#define SPU_CURRENT_VOL_L _MMIO16(0x1f801db8) -#define SPU_CURRENT_VOL_R _MMIO16(0x1f801dba) +#define SPU_MASTER_VOL_L _MMIO16(0xbf801d80) +#define SPU_MASTER_VOL_R _MMIO16(0xbf801d82) +#define SPU_REVERB_VOL_L _MMIO16(0xbf801d84) +#define SPU_REVERB_VOL_R _MMIO16(0xbf801d86) +#define SPU_KEY_ON _MMIO32(0xbf801d88) +#define SPU_KEY_OFF _MMIO32(0xbf801d8c) +#define SPU_FM_MODE _MMIO32(0xbf801d90) +#define SPU_NOISE_MODE _MMIO32(0xbf801d94) +#define SPU_REVERB_ON _MMIO32(0xbf801d98) +#define SPU_CHAN_STATUS _MMIO32(0xbf801d9c) + +#define SPU_REVERB_ADDR _MMIO16(0xbf801da2) +#define SPU_IRQ_ADDR _MMIO16(0xbf801da4) +#define SPU_ADDR _MMIO16(0xbf801da6) +#define SPU_DATA _MMIO16(0xbf801da8) + +#define SPU_CTRL _MMIO16(0xbf801daa) +#define SPU_DMA_CTRL _MMIO16(0xbf801dac) +#define SPU_STAT _MMIO16(0xbf801dae) + +#define SPU_CD_VOL_L _MMIO16(0xbf801db0) +#define SPU_CD_VOL_R _MMIO16(0xbf801db2) +#define SPU_EXT_VOL_L _MMIO16(0xbf801db4) +#define SPU_EXT_VOL_R _MMIO16(0xbf801db6) +#define SPU_CURRENT_VOL_L _MMIO16(0xbf801db8) +#define SPU_CURRENT_VOL_R _MMIO16(0xbf801dba) // These are not named SPU_VOICE_* to avoid name clashes with SPU attribute // flags defined in psxspu.h. -#define SPU_CH_VOL_L(N) _MMIO16(0x1f801c00 + 16 * (N)) -#define SPU_CH_VOL_R(N) _MMIO16(0x1f801c02 + 16 * (N)) -#define SPU_CH_FREQ(N) _MMIO16(0x1f801c04 + 16 * (N)) -#define SPU_CH_ADDR(N) _MMIO16(0x1f801c06 + 16 * (N)) -#define SPU_CH_ADSR(N) _MMIO32(0x1f801c08 + 16 * (N)) -#define SPU_CH_LOOP_ADDR(N) _MMIO16(0x1f801c0e + 16 * (N)) +#define SPU_CH_VOL_L(N) _MMIO16(0xbf801c00 + 16 * (N)) +#define SPU_CH_VOL_R(N) _MMIO16(0xbf801c02 + 16 * (N)) +#define SPU_CH_FREQ(N) _MMIO16(0xbf801c04 + 16 * (N)) +#define SPU_CH_ADDR(N) _MMIO16(0xbf801c06 + 16 * (N)) +#define SPU_CH_ADSR(N) _MMIO32(0xbf801c08 + 16 * (N)) +#define SPU_CH_LOOP_ADDR(N) _MMIO16(0xbf801c0e + 16 * (N)) /* MDEC */ -#define MDEC0 _MMIO32(0x1f801820) -#define MDEC1 _MMIO32(0x1f801824) +#define MDEC0 _MMIO32(0xbf801820) +#define MDEC1 _MMIO32(0xbf801824) /* SPI controller port */ // IMPORTANT: even though JOY_TXRX is a 32-bit register, it should only be // accessed as 8-bit. Reading it as 16 or 32-bit works fine on real hardware, // but leads to problems in some emulators. -#define JOY_TXRX _MMIO8(0x1f801040) -#define JOY_STAT _MMIO16(0x1f801044) -#define JOY_MODE _MMIO16(0x1f801048) -#define JOY_CTRL _MMIO16(0x1f80104a) -#define JOY_BAUD _MMIO16(0x1f80104e) +#define JOY_TXRX _MMIO8(0xbf801040) +#define JOY_STAT _MMIO16(0xbf801044) +#define JOY_MODE _MMIO16(0xbf801048) +#define JOY_CTRL _MMIO16(0xbf80104a) +#define JOY_BAUD _MMIO16(0xbf80104e) /* Serial port */ -#define SIO_TXRX _MMIO8(0x1f801050) -#define SIO_STAT _MMIO16(0x1f801054) -#define SIO_MODE _MMIO16(0x1f801058) -#define SIO_CTRL _MMIO16(0x1f80105a) -#define SIO_BAUD _MMIO16(0x1f80105e) +#define SIO_TXRX _MMIO8(0xbf801050) +#define SIO_STAT _MMIO16(0xbf801054) +#define SIO_MODE _MMIO16(0xbf801058) +#define SIO_CTRL _MMIO16(0xbf80105a) +#define SIO_BAUD _MMIO16(0xbf80105e) /* IRQ controller */ -#define IRQ_STAT _MMIO32(0x1f801070) -#define IRQ_MASK _MMIO32(0x1f801074) +#define IRQ_STAT _MMIO32(0xbf801070) +#define IRQ_MASK _MMIO32(0xbf801074) /* DMA */ -#define DMA_DPCR _MMIO32(0x1f8010f0) -#define DMA_DICR _MMIO32(0x1f8010f4) +#define DMA_DPCR _MMIO32(0xbf8010f0) +#define DMA_DICR _MMIO32(0xbf8010f4) -#define DMA_MADR(N) _MMIO32(0x1f801080 + 16 * (N)) -#define DMA_BCR(N) _MMIO32(0x1f801084 + 16 * (N)) -#define DMA_CHCR(N) _MMIO32(0x1f801088 + 16 * (N)) +#define DMA_MADR(N) _MMIO32(0xbf801080 + 16 * (N)) +#define DMA_BCR(N) _MMIO32(0xbf801084 + 16 * (N)) +#define DMA_CHCR(N) _MMIO32(0xbf801088 + 16 * (N)) /* Timers */ -#define TIMER_VALUE(N) _MMIO32(0x1f801100 + 16 * (N)) -#define TIMER_CTRL(N) _MMIO32(0x1f801104 + 16 * (N)) -#define TIMER_RELOAD(N) _MMIO32(0x1f801108 + 16 * (N)) +#define TIMER_VALUE(N) _MMIO32(0xbf801100 + 16 * (N)) +#define TIMER_CTRL(N) _MMIO32(0xbf801104 + 16 * (N)) +#define TIMER_RELOAD(N) _MMIO32(0xbf801108 + 16 * (N)) /* Memory control */ -#define EXP1_ADDR _MMIO32(0x1f801000) -#define EXP2_ADDR _MMIO32(0x1f801004) -#define EXP1_DELAY_SIZE _MMIO32(0x1f801008) -#define EXP3_DELAY_SIZE _MMIO32(0x1f80100c) -#define BIOS_DELAY_SIZE _MMIO32(0x1f801010) -#define SPU_DELAY_SIZE _MMIO32(0x1f801014) -#define CD_DELAY_SIZE _MMIO32(0x1f801018) -#define EXP2_DELAY_SIZE _MMIO32(0x1f80101c) -#define COM_DELAY_CFG _MMIO32(0x1f801020) -#define RAM_SIZE_CFG _MMIO32(0x1f801060) +#define EXP1_ADDR _MMIO32(0xbf801000) +#define EXP2_ADDR _MMIO32(0xbf801004) +#define EXP1_DELAY_SIZE _MMIO32(0xbf801008) +#define EXP3_DELAY_SIZE _MMIO32(0xbf80100c) +#define BIOS_DELAY_SIZE _MMIO32(0xbf801010) +#define SPU_DELAY_SIZE _MMIO32(0xbf801014) +#define CD_DELAY_SIZE _MMIO32(0xbf801018) +#define EXP2_DELAY_SIZE _MMIO32(0xbf80101c) +#define COM_DELAY_CFG _MMIO32(0xbf801020) +#define RAM_SIZE_CFG _MMIO32(0xbf801060) #endif diff --git a/libpsn00b/include/stdlib.h b/libpsn00b/include/stdlib.h index 4c4fcd3..fd4b36c 100644 --- a/libpsn00b/include/stdlib.h +++ b/libpsn00b/include/stdlib.h @@ -9,6 +9,8 @@ #ifndef _STDLIB_H #define _STDLIB_H +#include + #define RAND_MAX 0x7fff /* Conversion functions (not yet implemented) */ @@ -30,7 +32,7 @@ extern "C" { extern int __argc; extern const char **__argv; -int rand(); +int rand(void); void srand(unsigned long seed); int abs(int j); @@ -44,11 +46,11 @@ double strtod(const char *nptr, char **endptr); float strtof(const char *nptr, char **endptr); // Memory allocation functions -void _mem_init(int ram_size, int stack_max_size); -void InitHeap(unsigned int *addr, int size); -int SetHeapSize(int size); -void *malloc(int size); -void *calloc(int number, int size); +void _mem_init(size_t ram_size, size_t stack_max_size); +void InitHeap(void *addr, size_t size); +int SetHeapSize(size_t size); +void *malloc(size_t size); +void *calloc(size_t number, size_t size); void free(void *ptr); #ifdef __cplusplus diff --git a/libpsn00b/libc/start.c b/libpsn00b/libc/start.c index bfe9c9b..87ac951 100644 --- a/libpsn00b/libc/start.c +++ b/libpsn00b/libc/start.c @@ -62,10 +62,10 @@ extern uint8_t _end[]; // useful though to change the stack size and/or reinitialize the heap on // systems that have more than 2 MB of RAM (e.g. emulators, devkits, PS1-based // arcade boards). -void _mem_init(int ram_size, int stack_max_size) { - void *exe_end = _end + 4; - int exe_size = (int) exe_end - (int) __text_start; - int ram_used = (0x10000 + exe_size + stack_max_size) & 0xfffffffc; +void _mem_init(size_t ram_size, size_t stack_max_size) { + void *exe_end = _end + 4; + size_t exe_size = (size_t) exe_end - (size_t) __text_start; + size_t ram_used = (0x10000 + exe_size + stack_max_size) & 0xfffffffc; InitHeap(exe_end, ram_size - ram_used); } diff --git a/libpsn00b/psxpress/mdec.c b/libpsn00b/psxpress/mdec.c index ba190d4..b8d16b5 100644 --- a/libpsn00b/psxpress/mdec.c +++ b/libpsn00b/psxpress/mdec.c @@ -115,9 +115,9 @@ void DecDCTin(const uint32_t *data, int mode) { if (mode == DECDCT_MODE_RAW) MDEC0 = header; else if (mode & DECDCT_MODE_24BPP) - MDEC0 = header | 0x30000000; + MDEC0 = 0x30000000 | (header & 0xffff); else - MDEC0 = header | 0x38000000 | ((mode & 2) << 24); // Bit 25 = mask + MDEC0 = 0x38000000 | (header & 0xffff) | ((mode & 2) << 24); // Bit 25 = mask DecDCTinRaw((const uint32_t *) &(data[1]), header & 0xffff); } @@ -142,7 +142,7 @@ int DecDCTinSync(int mode) { if (mode) return (MDEC1 >> 29) & 1; - for (uint32_t i = MDEC_SYNC_TIMEOUT; i; i--) { + for (int i = MDEC_SYNC_TIMEOUT; i; i--) { if (!(MDEC1 & (1 << 29))) return 0; } @@ -167,7 +167,7 @@ int DecDCToutSync(int mode) { if (mode) return (DMA_CHCR(1) >> 24) & 1; - for (uint32_t i = MDEC_SYNC_TIMEOUT; i; i--) { + for (int i = MDEC_SYNC_TIMEOUT; i; i--) { if (!(DMA_CHCR(1) & (1 << 24))) return 0; } -- cgit v1.2.3