We've just updated MediaWiki and its underlying software. If anything doesn't look or work quite right, please mention it to us. --RanAS
SPC700/Driver Upload: Difference between revisions
From SnesLab
(explain what blocks are) |
(what is PT0) |
||
Line 5: | Line 5: | ||
! Official Port Name !! Port Name (SPC side) !! Port Address (SPC side) !! Port Name (5A22 side) !! Port Address (5A22 side) !! Data | ! Official Port Name !! Port Name (SPC side) !! Port Address (SPC side) !! Port Name (5A22 side) !! Port Address (5A22 side) !! Data | ||
|+ | |+ | ||
| PORT0 || CPUIO0 || 00F4h || APUIO0 || 2140h || The [[SPC IPL]] writes AAh here when ready, kick and kickback (as described by [[fullsnes]]) also go through here | | PORT0 || CPUIO0 || 00F4h || APUIO0 || 2140h || The [[SPC IPL]] writes AAh here when ready, kick and kickback (as described by [[fullsnes]]) also go through here. '''PT0''' is Nintendo's official name for the data the 5A22 writes to this port. | ||
|+ | |+ | ||
| PORT1 || CPUIO1 || 00F5h || APUIO1 || 2141h || The SPC IPL writes BBh here when ready, the 5A22 writes which command ("transfer" or "entry" as described by fullsnes) it wants the IPL to run here, and the driver data is uploaded through here too | | PORT1 || CPUIO1 || 00F5h || APUIO1 || 2141h || The SPC IPL writes BBh here when ready, the 5A22 writes which command ("transfer" or "entry" as described by fullsnes) it wants the IPL to run here, and the driver data is uploaded through here too |
Revision as of 22:56, 2 July 2023
In order to use main audio (Blargg's trick notwithstanding), the 5A22 must first upload a sound driver to the SPC700 over the following four ports:
Official Port Name | Port Name (SPC side) | Port Address (SPC side) | Port Name (5A22 side) | Port Address (5A22 side) | Data |
---|---|---|---|---|---|
PORT0 | CPUIO0 | 00F4h | APUIO0 | 2140h | The SPC IPL writes AAh here when ready, kick and kickback (as described by fullsnes) also go through here. PT0 is Nintendo's official name for the data the 5A22 writes to this port. |
PORT1 | CPUIO1 | 00F5h | APUIO1 | 2141h | The SPC IPL writes BBh here when ready, the 5A22 writes which command ("transfer" or "entry" as described by fullsnes) it wants the IPL to run here, and the driver data is uploaded through here too |
PORT2 | CPUIO2 | 00F6h | APUIO2 | 2142h | The 5A22 writes the low byte of the upload destination ARAM address here, and the low byte of the entrypoint into the SPC program once all blocks have been uploaded |
PORT3 | CPUIO3 | 00F7h | APUIO3 | 2143h | The 5A22 writes the high byte of the upload destination ARAM address here, and the high byte of the entrypoint into the SPC program once all blocks have been uploaded. |
The official Super Nintendo development manual describes the driver upload process in Appendix D of Book I. [1] Fullsnes has pseudocode for the upload procedure in https://problemkaputt.de/fullsnes.htm#snesapumaincpucommunicationport, and anomie's SPC700 Doc also lists a very similar 11 step procedure.
For the purposes of uploading to the SPC, the sound driver SPC700 machine code is divided into some number of contiguous data blocks. Each block has a four byte header which consists of:
- the block size (2 bytes)
- the target address where the block will end up in ARAM (another 2 bytes) [2]
References
- [1] https://archive.org/details/SNESDevManual/book1/page/n236
- [2] page D-3 "Data Block Organization" of the official dev manual