psx.wiki

I/O Access Width: Difference between revisions

Revision as of 04:48, 23 October 2026
RemmyLee
(Main page: drop the Hardware Tests lede)
Revision as of 05:11, 23 October 2026
RemmyLee
(Hardware tests: 72 more test pages, listed on the main page by area; RUN.toml no longer published)
Line 1:Line 1:
+---
+title: I/O Access Width
+type: test
+summary: Writes 12345678h to memory and I/O registers as a byte, halfword and word and reads back what arrived.
+category: Hardware tests
+info: Machine = SCPH-5501
+info: Program = cpu/io-access-bitwidth (ps1-tests)
+---
+
+## Overview
+
+For each address the program clears the location at the read width, then stores the CPU register value 12345678h with SB, SH and SW in turn and reads the location back. It repeats the table three times, reading back as a word, a halfword and a byte. The old value is put back after each row.[^src]
+
+The stores use the plain SB, SH and SW instructions. JOY_CTRL, SIO_CTRL and SPUCNT are not word aligned, so a word store there raises an address error. The program prints "--CRASH--" when the store raised an exception. Its own word reads of those three registers use an LWL and LWR pair, so they include the bytes of the next register.[^src]
+
+## Results
+
+RAM and the scratchpad keep exactly the bytes written: a byte store leaves 78h and a halfword store 5678h. The BIOS ROM ignores all stores and reads 3C080013h.[^run]
+
+The DMA and timer registers take the whole 32-bit CPU register from a byte or halfword store. A byte store of 12345678h to DMA control (1F8010F0h) read back 12345678h, and timer 0's target read 5678h after a byte store. DMA channel 0's address register kept 345678h from every width, so it holds 24 bits.[^run]
+
+Table: Read back as a word after each store width
+
+| Register | Address | SB | SH | SW |
+| --- | --- | --- | --- | --- |
+| RAM | 80080000h | 00000078h | 00005678h | 12345678h |
+| BIOS ROM | BFC00000h | 3C080013h | 3C080013h | 3C080013h |
+| Scratchpad | 1F800000h | 00000078h | 00005678h | 12345678h |
+| Expansion 2 | 1F802000h | FFFFFFFFh | FFFFFFFFh | FFFFFFFFh |
+| Expansion 3 | 1FA00000h | FFFFFFFFh | FFFFFFFFh | FFFFFFF7h |
+| DMA0 MADR | 1F801080h | 00345678h | 00345678h | 00345678h |
+| DPCR | 1F8010F0h | 12345678h | 12345678h | 12345678h |
+| DICR | 1F8010F4h | 00340038h | 00340038h | 00340038h |
+| JOY_MODE | 1F801048h | 38h | 38h | 38h |
+| JOY_CTRL | 1F80104Ah | 0 | 0 | address error |
+| SIO_MODE | 1F801058h | 78h | 78h | 78h |
+| SIO_CTRL | 1F80105Ah | C0C00000h | C0C00000h | address error |
+| CD-ROM status | 1F801800h | 18181818h | 1A1A1A1Ah | 1A1A1A1Ah |
+| GPUSTAT | 1F801814h | 14802000h | 14802000h | 14802000h |
+| MDEC status | 1F801824h | 80040000h | 80040000h | 80040000h |
+| SPUCNT | 1F801DAAh | 5678h | 5678h | address error |
+
+I_MASK at 1F801074h and timer 0's target at 1F801108h kept only their low bits: 678h for I_MASK and 5678h for the target. Their upper halves read back a different value in each run, among them 14A2h, A085h, 0200h, 0C00h and 1F80h, so those bits are not storage.[^run]
+
+The CD-ROM status port reads the same byte in all four positions of a word. A byte store left 18h and a halfword or word store left 1Ah. GPUSTAT and the MDEC status do not change from any store.[^run]
+
+Read back as a halfword or a byte, each register gave the low part of the word values above. MDEC status read 0 at those widths, and GPUSTAT read 0 as a byte.[^run]
+
+## Runs
+
+### 25 September 2026
+
+[03IOB.txt](/tests/raw/20260925T0000Z-5501a-card-main/main/03IOB.txt)
+
+```
+===== 03 IOB IO BITWIDTH | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+
+cpu/io-access-bitwidth
+Test how writes with different bitwidths behaves for different io devices
+Note: Disable "Exception Handling Surveillance" in Caetla first"
+
+Reading as 32bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit 32bit
+RAM (0x80080000) 0x78 0x5678 0x12345678
+BIOS (0xbfc00000) 0x3c080013 0x3c080013 0x3c080013
+SCRATCHPAD (0x1f800000) 0x78 0x5678 0x12345678
+EXPANSION2 (0x1f802000) 0xffffffff 0xffffffff 0xffffffff
+EXPANSION3 (0x1fa00000) 0xffffffff 0xffffffff 0xfffffff7
+DMA0_ADDR (0x1f801080) 0x345678 0x345678 0x345678
+DMAC_CTRL (0x1f8010f0) 0x12345678 0x12345678 0x12345678
+DMAC_INTR (0x1f8010f4) 0x340038 0x340038 0x340038
+JOY_MODE (0x1f801048) 0x38 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0 --CRASH--
+SIO_MODE (0x1f801058) 0x78 0x78 0x78
+SIO_CTRL (0x1f80105a) 0xc0c00000 0xc0c00000 --CRASH--
+I_MASK (0x1f801074) 0x14a20678 0xa0850678 0x678
+T0_TARGET (0x1f801108) 0x1f805678 0x1f805678 0x1f805678
+CDROM_STAT (0x1f801800) 0x18181818 0x1a1a1a1a 0x1a1a1a1a
+GPUSTAT (0x1f801814) 0x14802000 0x14802000 0x14802000
+MDECSTAT (0x1f801824) 0x80040000 0x80040000 0x80040000
+SPUCNT (0x1f801daa) 0x5678 0x5678 --CRASH--
+
+Reading as 16bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit
+RAM (0x80080000) 0x78 0x5678
+BIOS (0xbfc00000) 0x13 0x13
+SCRATCHPAD (0x1f800000) 0x78 0x5678
+EXPANSION2 (0x1f802000) 0xffff 0xffff
+EXPANSION3 (0x1fa00000) 0xffff 0xffff
+DMA0_ADDR (0x1f801080) 0x5678 0x5678
+DMAC_CTRL (0x1f8010f0) 0x5678 0x5678
+DMAC_INTR (0x1f8010f4) 0x38 0x38
+JOY_MODE (0x1f801048) 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0
+SIO_MODE (0x1f801058) 0x78 0x78
+SIO_CTRL (0x1f80105a) 0 0
+I_MASK (0x1f801074) 0x678 0x678
+T0_TARGET (0x1f801108) 0x5678 0x5678
+CDROM_STAT (0x1f801800) 0x1818 0x1a1a
+GPUSTAT (0x1f801814) 0x2000 0x2000
+MDECSTAT (0x1f801824) 0 0
+SPUCNT (0x1f801daa) 0x5678 0x5678
+
+Reading as 8bit, writing as:
+SEGMENT ( ADDRESS) 8bit
+RAM (0x80080000) 0x78
+BIOS (0xbfc00000) 0x13
+SCRATCHPAD (0x1f800000) 0x78
+EXPANSION2 (0x1f802000) 0xff
+EXPANSION3 (0x1fa00000) 0xff
+DMA0_ADDR (0x1f801080) 0x78
+DMAC_CTRL (0x1f8010f0) 0x78
+DMAC_INTR (0x1f8010f4) 0x38
+JOY_MODE (0x1f801048) 0x38
+JOY_CTRL (0x1f80104a) 0
+SIO_MODE (0x1f801058) 0x78
+SIO_CTRL (0x1f80105a) 0
+I_MASK (0x1f801074) 0x78
+T0_TARGET (0x1f801108) 0x78
+CDROM_STAT (0x1f801800) 0x18
+GPUSTAT (0x1f801814) 0
+MDECSTAT (0x1f801824) 0
+SPUCNT (0x1f801daa) 0x78
+Done.
+```
+
+### 27 September 2026
+
+[03IOB.txt](/tests/raw/20260927T0000Z-5501a-card-2/main/s024/03IOB.txt)
+
+```
+===== 03 IOB IO BITWIDTH | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+
+cpu/io-access-bitwidth
+Test how writes with different bitwidths behaves for different io devices
+Note: Disable "Exception Handling Surveillance" in Caetla first"
+
+Reading as 32bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit 32bit
+RAM (0x80080000) 0x78 0x5678 0x12345678
+BIOS (0xbfc00000) 0x3c080013 0x3c080013 0x3c080013
+SCRATCHPAD (0x1f800000) 0x78 0x5678 0x12345678
+EXPANSION2 (0x1f802000) 0xffffffff 0xffffffff 0xffffffff
+EXPANSION3 (0x1fa00000) 0xffffffff 0xffffffff 0xfffffff7
+DMA0_ADDR (0x1f801080) 0x345678 0x345678 0x345678
+DMAC_CTRL (0x1f8010f0) 0x12345678 0x12345678 0x12345678
+DMAC_INTR (0x1f8010f4) 0x340038 0x340038 0x340038
+JOY_MODE (0x1f801048) 0x38 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0 --CRASH--
+SIO_MODE (0x1f801058) 0x78 0x78 0x78
+SIO_CTRL (0x1f80105a) 0xc0c00000 0xc0c00000 --CRASH--
+I_MASK (0x1f801074) 0x2000678 0x2000678 0x1f800678
+T0_TARGET (0x1f801108) 0x1f805678 0x2005678 0x1f805678
+CDROM_STAT (0x1f801800) 0x18181818 0x1a1a1a1a 0x1a1a1a1a
+GPUSTAT (0x1f801814) 0x14802000 0x14802000 0x14802000
+MDECSTAT (0x1f801824) 0xa0041bfc 0xa0041bfc 0xa0041bfc
+SPUCNT (0x1f801daa) 0x5678 0x5678 --CRASH--
+
+Reading as 16bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit
+RAM (0x80080000) 0x78 0x5678
+BIOS (0xbfc00000) 0x13 0x13
+SCRATCHPAD (0x1f800000) 0x78 0x5678
+EXPANSION2 (0x1f802000) 0xffff 0xffff
+EXPANSION3 (0x1fa00000) 0xffff 0xffff
+DMA0_ADDR (0x1f801080) 0x5678 0x5678
+DMAC_CTRL (0x1f8010f0) 0x5678 0x5678
+DMAC_INTR (0x1f8010f4) 0x38 0x38
+JOY_MODE (0x1f801048) 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0
+SIO_MODE (0x1f801058) 0x78 0x78
+SIO_CTRL (0x1f80105a) 0 0
+I_MASK (0x1f801074) 0x678 0x678
+T0_TARGET (0x1f801108) 0x5678 0x5678
+CDROM_STAT (0x1f801800) 0x1818 0x1a1a
+GPUSTAT (0x1f801814) 0x2000 0x2000
+MDECSTAT (0x1f801824) 0 0
+SPUCNT (0x1f801daa) 0x5678 0x5678
+
+Reading as 8bit, writing as:
+SEGMENT ( ADDRESS) 8bit
+RAM (0x80080000) 0x78
+BIOS (0xbfc00000) 0x13
+SCRATCHPAD (0x1f800000) 0x78
+EXPANSION2 (0x1f802000) 0xff
+EXPANSION3 (0x1fa00000) 0xff
+DMA0_ADDR (0x1f801080) 0x78
+DMAC_CTRL (0x1f8010f0) 0x78
+DMAC_INTR (0x1f8010f4) 0x38
+JOY_MODE (0x1f801048) 0x38
+JOY_CTRL (0x1f80104a) 0
+SIO_MODE (0x1f801058) 0x78
+SIO_CTRL (0x1f80105a) 0
+I_MASK (0x1f801074) 0x78
+T0_TARGET (0x1f801108) 0x78
+CDROM_STAT (0x1f801800) 0x18
+GPUSTAT (0x1f801814) 0
+MDECSTAT (0x1f801824) 0
+SPUCNT (0x1f801daa) 0x78
+Done.
+```
+
+### 27 September 2026 run 2
+
+[03IOB.txt](/tests/raw/20260927T0000Z-5501a-card-b/main/s034/03IOB.txt)
+
+```
+===== 03 IOB IO BITWIDTH | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+
+cpu/io-access-bitwidth
+Test how writes with different bitwidths behaves for different io devices
+Note: Disable "Exception Handling Surveillance" in Caetla first"
+
+Reading as 32bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit 32bit
+RAM (0x80080000) 0x78 0x5678 0x12345678
+BIOS (0xbfc00000) 0x3c080013 0x3c080013 0x3c080013
+SCRATCHPAD (0x1f800000) 0x78 0x5678 0x12345678
+EXPANSION2 (0x1f802000) 0xffffffff 0xffffffff 0xffffffff
+EXPANSION3 (0x1fa00000) 0xffffffff 0xffffffff 0xfffffff7
+DMA0_ADDR (0x1f801080) 0x345678 0x345678 0x345678
+DMAC_CTRL (0x1f8010f0) 0x12345678 0x12345678 0x12345678
+DMAC_INTR (0x1f8010f4) 0x340038 0x340038 0x340038
+JOY_MODE (0x1f801048) 0x38 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0 --CRASH--
+SIO_MODE (0x1f801058) 0x78 0x78 0x78
+SIO_CTRL (0x1f80105a) 0xc0c00000 0xc0c00000 --CRASH--
+I_MASK (0x1f801074) 0x2000678 0x2000678 0x1f800678
+T0_TARGET (0x1f801108) 0x1f805678 0x2005678 0x1f805678
+CDROM_STAT (0x1f801800) 0x18181818 0x1a1a1a1a 0x1a1a1a1a
+GPUSTAT (0x1f801814) 0x14802000 0x14802000 0x14802000
+MDECSTAT (0x1f801824) 0x80040000 0x80040000 0x80040000
+SPUCNT (0x1f801daa) 0x5678 0x5678 --CRASH--
+
+Reading as 16bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit
+RAM (0x80080000) 0x78 0x5678
+BIOS (0xbfc00000) 0x13 0x13
+SCRATCHPAD (0x1f800000) 0x78 0x5678
+EXPANSION2 (0x1f802000) 0xffff 0xffff
+EXPANSION3 (0x1fa00000) 0xffff 0xffff
+DMA0_ADDR (0x1f801080) 0x5678 0x5678
+DMAC_CTRL (0x1f8010f0) 0x5678 0x5678
+DMAC_INTR (0x1f8010f4) 0x38 0x38
+JOY_MODE (0x1f801048) 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0
+SIO_MODE (0x1f801058) 0x78 0x78
+SIO_CTRL (0x1f80105a) 0 0
+I_MASK (0x1f801074) 0x678 0x678
+T0_TARGET (0x1f801108) 0x5678 0x5678
+CDROM_STAT (0x1f801800) 0x1818 0x1a1a
+GPUSTAT (0x1f801814) 0x2000 0x2000
+MDECSTAT (0x1f801824) 0 0
+SPUCNT (0x1f801daa) 0x5678 0x5678
+
+Reading as 8bit, writing as:
+SEGMENT ( ADDRESS) 8bit
+RAM (0x80080000) 0x78
+BIOS (0xbfc00000) 0x13
+SCRATCHPAD (0x1f800000) 0x78
+EXPANSION2 (0x1f802000) 0xff
+EXPANSION3 (0x1fa00000) 0xff
+DMA0_ADDR (0x1f801080) 0x78
+DMAC_CTRL (0x1f8010f0) 0x78
+DMAC_INTR (0x1f8010f4) 0x38
+JOY_MODE (0x1f801048) 0x38
+JOY_CTRL (0x1f80104a) 0
+SIO_MODE (0x1f801058) 0x78
+SIO_CTRL (0x1f80105a) 0
+I_MASK (0x1f801074) 0x78
+T0_TARGET (0x1f801108) 0x78
+CDROM_STAT (0x1f801800) 0x18
+GPUSTAT (0x1f801814) 0
+MDECSTAT (0x1f801824) 0
+SPUCNT (0x1f801daa) 0x78
+Done.
+```
+
+### 27 September 2026 run 3
+
+[03IOB.txt](/tests/raw/20260927T0000Z-5501a-card-g/main/03IOB.txt)
+
+```
+===== 03 IOB IO BITWIDTH | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+
+cpu/io-access-bitwidth
+Test how writes with different bitwidths behaves for different io devices
+Note: Disable "Exception Handling Surveillance" in Caetla first"
+
+Reading as 32bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit 32bit
+RAM (0x80080000) 0x78 0x5678 0x12345678
+BIOS (0xbfc00000) 0x3c080013 0x3c080013 0x3c080013
+SCRATCHPAD (0x1f800000) 0x78 0x5678 0x12345678
+EXPANSION2 (0x1f802000) 0xffffffff 0xffffffff 0xffffffff
+EXPANSION3 (0x1fa00000) 0xffffffff 0xffffffff 0xfffffff7
+DMA0_ADDR (0x1f801080) 0x345678 0x345678 0x345678
+DMAC_CTRL (0x1f8010f0) 0x12345678 0x12345678 0x12345678
+DMAC_INTR (0x1f8010f4) 0x340038 0x340038 0x340038
+JOY_MODE (0x1f801048) 0x38 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0 --CRASH--
+SIO_MODE (0x1f801058) 0x78 0x78 0x78
+SIO_CTRL (0x1f80105a) 0xc0c00000 0xc0c00000 --CRASH--
+I_MASK (0x1f801074) 0x2000678 0x2000678 0x1f800678
+T0_TARGET (0x1f801108) 0x1f805678 0x2005678 0x1f805678
+CDROM_STAT (0x1f801800) 0x18181818 0x1a1a1a1a 0x1a1a1a1a
+GPUSTAT (0x1f801814) 0x14802000 0x14802000 0x14802000
+MDECSTAT (0x1f801824) 0x80040000 0x80040000 0x80040000
+SPUCNT (0x1f801daa) 0x5678 0x5678 --CRASH--
+
+Reading as 16bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit
+RAM (0x80080000) 0x78 0x5678
+BIOS (0xbfc00000) 0x13 0x13
+SCRATCHPAD (0x1f800000) 0x78 0x5678
+EXPANSION2 (0x1f802000) 0xffff 0xffff
+EXPANSION3 (0x1fa00000) 0xffff 0xffff
+DMA0_ADDR (0x1f801080) 0x5678 0x5678
+DMAC_CTRL (0x1f8010f0) 0x5678 0x5678
+DMAC_INTR (0x1f8010f4) 0x38 0x38
+JOY_MODE (0x1f801048) 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0
+SIO_MODE (0x1f801058) 0x78 0x78
+SIO_CTRL (0x1f80105a) 0 0
+I_MASK (0x1f801074) 0x678 0x678
+T0_TARGET (0x1f801108) 0x5678 0x5678
+CDROM_STAT (0x1f801800) 0x1818 0x1a1a
+GPUSTAT (0x1f801814) 0x2000 0x2000
+MDECSTAT (0x1f801824) 0 0
+SPUCNT (0x1f801daa) 0x5678 0x5678
+
+Reading as 8bit, writing as:
+SEGMENT ( ADDRESS) 8bit
+RAM (0x80080000) 0x78
+BIOS (0xbfc00000) 0x13
+SCRATCHPAD (0x1f800000) 0x78
+EXPANSION2 (0x1f802000) 0xff
+EXPANSION3 (0x1fa00000) 0xff
+DMA0_ADDR (0x1f801080) 0x78
+DMAC_CTRL (0x1f8010f0) 0x78
+DMAC_INTR (0x1f8010f4) 0x38
+JOY_MODE (0x1f801048) 0x38
+JOY_CTRL (0x1f80104a) 0
+SIO_MODE (0x1f801058) 0x78
+SIO_CTRL (0x1f80105a) 0
+I_MASK (0x1f801074) 0x78
+T0_TARGET (0x1f801108) 0x78
+CDROM_STAT (0x1f801800) 0x18
+GPUSTAT (0x1f801814) 0
+MDECSTAT (0x1f801824) 0
+SPUCNT (0x1f801daa) 0x78
+Done.
+```
+
+### 27 September 2026 run 4
+
+[03IOB.txt](/tests/raw/20260927T0000Z-5501a-card-g3/main/03IOB.txt)
+
+```
+===== 03 IOB IO BITWIDTH | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+
+cpu/io-access-bitwidth
+Test how writes with different bitwidths behaves for different io devices
+Note: Disable "Exception Handling Surveillance" in Caetla first"
+
+Reading as 32bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit 32bit
+RAM (0x80080000) 0x78 0x5678 0x12345678
+BIOS (0xbfc00000) 0x3c080013 0x3c080013 0x3c080013
+SCRATCHPAD (0x1f800000) 0x78 0x5678 0x12345678
+EXPANSION2 (0x1f802000) 0xffffffff 0xffffffff 0xffffffff
+EXPANSION3 (0x1fa00000) 0xffffffff 0xffffffff 0xfffffff7
+DMA0_ADDR (0x1f801080) 0x345678 0x345678 0x345678
+DMAC_CTRL (0x1f8010f0) 0x12345678 0x12345678 0x12345678
+DMAC_INTR (0x1f8010f4) 0x340038 0x340038 0x340038
+JOY_MODE (0x1f801048) 0x38 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0 --CRASH--
+SIO_MODE (0x1f801058) 0x78 0x78 0x78
+SIO_CTRL (0x1f80105a) 0xc0c00000 0xc0c00000 --CRASH--
+I_MASK (0x1f801074) 0xc000678 0xc000678 0x1f800678
+T0_TARGET (0x1f801108) 0x1f805678 0xc005678 0x1f805678
+CDROM_STAT (0x1f801800) 0x18181818 0x1a1a1a1a 0x1a1a1a1a
+GPUSTAT (0x1f801814) 0x14802000 0x14802000 0x14802000
+MDECSTAT (0x1f801824) 0x80040000 0x80040000 0x80040000
+SPUCNT (0x1f801daa) 0x5678 0x5678 --CRASH--
+
+Reading as 16bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit
+RAM (0x80080000) 0x78 0x5678
+BIOS (0xbfc00000) 0x13 0x13
+SCRATCHPAD (0x1f800000) 0x78 0x5678
+EXPANSION2 (0x1f802000) 0xffff 0xffff
+EXPANSION3 (0x1fa00000) 0xffff 0xffff
+DMA0_ADDR (0x1f801080) 0x5678 0x5678
+DMAC_CTRL (0x1f8010f0) 0x5678 0x5678
+DMAC_INTR (0x1f8010f4) 0x38 0x38
+JOY_MODE (0x1f801048) 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0
+SIO_MODE (0x1f801058) 0x78 0x78
+SIO_CTRL (0x1f80105a) 0 0
+I_MASK (0x1f801074) 0x678 0x678
+T0_TARGET (0x1f801108) 0x5678 0x5678
+CDROM_STAT (0x1f801800) 0x1818 0x1a1a
+GPUSTAT (0x1f801814) 0x2000 0x2000
+MDECSTAT (0x1f801824) 0 0
+SPUCNT (0x1f801daa) 0x5678 0x5678
+
+Reading as 8bit, writing as:
+SEGMENT ( ADDRESS) 8bit
+RAM (0x80080000) 0x78
+BIOS (0xbfc00000) 0x13
+SCRATCHPAD (0x1f800000) 0x78
+EXPANSION2 (0x1f802000) 0xff
+EXPANSION3 (0x1fa00000) 0xff
+DMA0_ADDR (0x1f801080) 0x78
+DMAC_CTRL (0x1f8010f0) 0x78
+DMAC_INTR (0x1f8010f4) 0x38
+JOY_MODE (0x1f801048) 0x38
+JOY_CTRL (0x1f80104a) 0
+SIO_MODE (0x1f801058) 0x78
+SIO_CTRL (0x1f80105a) 0
+I_MASK (0x1f801074) 0x78
+T0_TARGET (0x1f801108) 0x78
+CDROM_STAT (0x1f801800) 0x18
+GPUSTAT (0x1f801814) 0
+MDECSTAT (0x1f801824) 0
+SPUCNT (0x1f801daa) 0x78
+Done.
+```
+
+### 28 September 2026
+
+[03IOB.txt](/tests/raw/20260928T0000Z-5501a-card-h/main/03IOB.txt)
+
+```
+===== 03 IOB IO BITWIDTH | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+
+cpu/io-access-bitwidth
+Test how writes with different bitwidths behaves for different io devices
+Note: Disable "Exception Handling Surveillance" in Caetla first"
+
+Reading as 32bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit 32bit
+RAM (0x80080000) 0x78 0x5678 0x12345678
+BIOS (0xbfc00000) 0x3c080013 0x3c080013 0x3c080013
+SCRATCHPAD (0x1f800000) 0x78 0x5678 0x12345678
+EXPANSION2 (0x1f802000) 0xffffffff 0xffffffff 0xffffffff
+EXPANSION3 (0x1fa00000) 0xffffffff 0xffffffff 0xfffffff7
+DMA0_ADDR (0x1f801080) 0x345678 0x345678 0x345678
+DMAC_CTRL (0x1f8010f0) 0x12345678 0x12345678 0x12345678
+DMAC_INTR (0x1f8010f4) 0x340038 0x340038 0x340038
+JOY_MODE (0x1f801048) 0x38 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0 --CRASH--
+SIO_MODE (0x1f801058) 0x78 0x78 0x78
+SIO_CTRL (0x1f80105a) 0xc0c00000 0xc0c00000 --CRASH--
+I_MASK (0x1f801074) 0xc000678 0xc000678 0x1f800678
+T0_TARGET (0x1f801108) 0x1f805678 0xc005678 0x1f805678
+CDROM_STAT (0x1f801800) 0x18181818 0x1a1a1a1a 0x1a1a1a1a
+GPUSTAT (0x1f801814) 0x14802000 0x14802000 0x14802000
+MDECSTAT (0x1f801824) 0x80040000 0x80040000 0x80040000
+SPUCNT (0x1f801daa) 0x5678 0x5678 --CRASH--
+
+Reading as 16bit, writing as:
+SEGMENT ( ADDRESS) 8bit 16bit
+RAM (0x80080000) 0x78 0x5678
+BIOS (0xbfc00000) 0x13 0x13
+SCRATCHPAD (0x1f800000) 0x78 0x5678
+EXPANSION2 (0x1f802000) 0xffff 0xffff
+EXPANSION3 (0x1fa00000) 0xffff 0xffff
+DMA0_ADDR (0x1f801080) 0x5678 0x5678
+DMAC_CTRL (0x1f8010f0) 0x5678 0x5678
+DMAC_INTR (0x1f8010f4) 0x38 0x38
+JOY_MODE (0x1f801048) 0x38 0x38
+JOY_CTRL (0x1f80104a) 0 0
+SIO_MODE (0x1f801058) 0x78 0x78
+SIO_CTRL (0x1f80105a) 0 0
+I_MASK (0x1f801074) 0x678 0x678
+T0_TARGET (0x1f801108) 0x5678 0x5678
+CDROM_STAT (0x1f801800) 0x1818 0x1a1a
+GPUSTAT (0x1f801814) 0x2000 0x2000
+MDECSTAT (0x1f801824) 0 0
+SPUCNT (0x1f801daa) 0x5678 0x5678
+
+Reading as 8bit, writing as:
+SEGMENT ( ADDRESS) 8bit
+RAM (0x80080000) 0x78
+BIOS (0xbfc00000) 0x13
+SCRATCHPAD (0x1f800000) 0x78
+EXPANSION2 (0x1f802000) 0xff
+EXPANSION3 (0x1fa00000) 0xff
+DMA0_ADDR (0x1f801080) 0x78
+DMAC_CTRL (0x1f8010f0) 0x78
+DMAC_INTR (0x1f8010f4) 0x38
+JOY_MODE (0x1f801048) 0x38
+JOY_CTRL (0x1f80104a) 0
+SIO_MODE (0x1f801058) 0x78
+SIO_CTRL (0x1f80105a) 0
+I_MASK (0x1f801074) 0x78
+T0_TARGET (0x1f801108) 0x78
+CDROM_STAT (0x1f801800) 0x18
+GPUSTAT (0x1f801814) 0
+MDECSTAT (0x1f801824) 0
+SPUCNT (0x1f801daa) 0x78
+Done.
+```
+
+## References
+
+[^src]: ps1-tests, cpu/io-access-bitwidth. https://github.com/JaCzekanski/ps1-tests.
+[^run]: SCPH-5501 output: [main/03IOB.txt](/tests/raw/20260925T0000Z-5501a-card-main/main/03IOB.txt) and the files beside it, with the other runs listed under Runs.