logo

 

Bourricot est le nom débile donné à mon loader d'ISO pour NeoGeo CD.

C'est une sorte de (gros) modchip permettant de remplacer le lecteur CD par une carte microSD remplie de fichiers ISO et WAV.

L'avantage est non seulement d'éliminer une fois pour toutes les problèmes liés à l'usure du lecteur CD (mécanique, optique), mais aussi de réduire considérablement les temps de chargement, entachant depuis toujours la réputation de la console.

Documents utilisés:
*TODO
*Spritesmind
*Datasheets
*Source de MESS

De base, le cheminement des données depuis le CD jusqu'à la RAM se passe comme suit:

- CPU est le processeur de la console, le 68000.
- µC est un microcontrôleur 4 bits utilisé pour automatiser le lecteur CD.
- Host est le décodeur et le correcteur d'erreurs (un Sanyo LC89515).
- Buffer est une RAM de 64ko uniquement utilisée comme tampon pour le host.
- MGA (NEO-MGA) est un ASIC SNK servant entre autres d'interface entre le CPU et le microcontrôleur du lecteur CD.
- PUPPET est un gestionnaire de périphériques pour le CPU (un Sanyo LC8953), et un contrôleur DMA.

Le CPU demande au lecteur CD via MGA de commencer à lire le CD a partir d'une durée donnée (en minutes, secondes, frames : MSF).
L'µC positionne le bloc optique correctement en échangeant avec le DSP.
Le DSP envoie les données lues directement depuis les "points et tirets" de la surface du CD au host.
Le host réalise le décodage et la correction d'erreur à la volée puis commence à stocker les secteurs dans le buffer.
Le CPU est informé via PUPPET qu'un secteur est prêt et initie une copie DMA depuis le buffer vers la DRAM appropriée (sprites, code, audio, ...).

Bourricot remplace non seulement la partie lecteur CD, mais aussi le host pour gagner en vitesse, vu que toute l'étape décodage devient inutile si on utilise une carte SD et des fichiers ISO.

Il serait aussi possible de remplacer MGA mais cela n'apporterait aucun avantage, ni en espace, ni en fiabilité, ni en vitesse.

Le pinout du host est le suivant:

Comme le buffer n'est plus utile, les broches dédiées n'ont plus besoin d'être utilisées : RA0~15, IO1~8, ERA, et signaux de contrôle.

Toutes les broches utilisées pour définir le mode de fonctionnement du host ne sont plus utiles non plus (elles sont toutes reliées à la masse ou au 5V) : /SELDRQ, LMSEL, CSEL, TEST*.

Toutes les broches en rapport avec le lecteur CD peuvent également être ignorées : MCK, C2PO, C4LR, BCK, SDATA, LRCK ; ainsi que les broches d'horloge XTAL et XTALCK.

Ce qui fait qu'il ne reste plus les broches suivantes à gérer :

- HD0~7 est le bus pour les données CD.
- D0~7 est le bus pour lire et ecrire dans les registres du host.

Le lecteur CD est couramment appelé CDD (CD Drive) et le host CDC (CD Controller).

Pendant qu'un jeu tourne, les interruptions 1 et 2 sont mappées au vblank et au compteur de pixels grâce au PUPPET.

Pendant un chargement CD, les interruptions sont reconfigurées en 1: interruption CDD, 2: interruption CDC.

Modifier le fabuleux émulateur MESS permet d'obtenir un log des accès aux CDD et CDC. Afin de raccourcir celui-ci, j'ai regroupé les parties qui se répètent (commentaires à venir) :

CDD INTERRUPT 
- Write CDC reg address 0x0A 
- Write CDC reg data 0x00 
- Write CDC reg address 0x0E 
- Write CDC reg data 0x10 
CDD INTERRUPT 
CDD INTERRUPT 
...
CDD INTERRUPT 
CDD INTERRUPT 
CDDTX: 02 00 00 04 00 00 00 00 00 04 
CDDRX: 09 04 00 01 00 01 00 00 00 0B 
CDD INTERRUPT 
CDDTX: 02 00 00 03 00 00 00 00 00 05 
CDDRX: 09 03 00 00 01 05 04 00 00 04 
CDD INTERRUPT 
CDDTX: 02 00 00 05 00 01 00 00 00 02 
CDDRX: 09 05 00 00 00 02 08 00 01 01 
CDD INTERRUPT 
CDD INTERRUPT 
...
CDD INTERRUPT 
CDD INTERRUPT 
- Write CDC reg address 0x01 
- Write CDC reg data 0xE2 
- Write CDC reg address 0x0A 
- Write CDC reg data 0xA7 
- Write CDC reg data 0xF0 
CDD INTERRUPT 
CDD INTERRUPT 
CDDTX: 03 00 00 00 00 02 01 03 00 01 (PLAY)
MSF TO LBA: 0x0000000D 
CDDRX: 01 02 00 01 00 00 00 00 00 06 
CDD INTERRUPT 
Read CD sector to buffer 
Current LBA: 0x0000000E 
CDC INTERRUPT ! 
- Write CDC reg address 0x01 
- Read 89515 reg data 0xDF 
- Write CDC reg address 0x0A 
- Write CDC reg data 0xA7 
- Write CDC reg address 0x0F 
- Read 89515 reg data 0x20 
CDD INTERRUPT 
Read CD sector to buffer 
Current LBA: 0x0000000F 
CDC INTERRUPT ! 
CDDTX: 02 00 00 01 00 00 00 00 00 07 
CDDRX: 01 01 00 00 00 00 01 05 00 02 
- Write CDC reg address 0x01 
- Read 89515 reg data 0xDF 
- Write CDC reg address 0x0F 
- Read 89515 reg data 0x20 
- Write CDC reg address 0x0D 
- Read 89515 reg data 0x00 
- Write CDC reg address 0x0F 
- Read 89515 reg data 0x20 
- Write CDC reg address 0x04 
- Read 89515 reg data 0x00 
- Read 89515 reg data 0x02 
- Read 89515 reg data 0x14 
- Read 89515 reg data 0x01 
CDD INTERRUPT 
Read CD sector to buffer 
Current LBA: 0x00000010 
CDC INTERRUPT ! 
CDDTX: 02 00 00 02 00 00 00 00 00 06 
CDDRX: 01 02 00 01 00 00 00 00 00 06 
- Write CDC reg address 0x01 
- Read 89515 reg data 0xDF 
- Write CDC reg address 0x0F 
- Read 89515 reg data 0x20 
- Write CDC reg address 0x0D 
- Read 89515 reg data 0x00 
- Write CDC reg address 0x0F 
- Read 89515 reg data 0x20 
- Write CDC reg address 0x04 
- Read 89515 reg data 0x00 
- Read 89515 reg data 0x02 
- Read 89515 reg data 0x15 
- Read 89515 reg data 0x01 
CDD INTERRUPT 
Read CD sector to buffer 
Current LBA: 0x00000011 
CDC INTERRUPT ! 
CDDTX: 02 00 00 06 00 00 00 00 00 02 
CDDRX: 01 06 00 00 00 00 08 00 08 03 
- Write CDC reg address 0x01 
- Read 89515 reg data 0xDF 
- Write CDC reg address 0x0F 
- Read 89515 reg data 0x20 
- Write CDC reg address 0x0D 
- Read 89515 reg data 0x00 
- Write CDC reg address 0x0F 
- Read 89515 reg data 0x20 
- Write CDC reg address 0x04 
- Read 89515 reg data 0x00 
- Read 89515 reg data 0x02 
- Read 89515 reg data 0x16 
- Read 89515 reg data 0x01 
- Write CDC reg address 0x0C 
- Read 89515 reg data 0x80 
- Read 89515 reg data 0x00 
- Read 89515 reg data 0x00 
- Read 89515 reg data 0x20 
- Write CDC reg address 0x0A 
- Write CDC reg data 0xA7 
- Write CDC reg address 0x08 
- Read 89515 reg data 0xC0 
- Read 89515 reg data 0x24 
- Write CDC reg address 0x02 
- Write CDC reg data 0xFF 
- Write CDC reg data 0x07 
- Write CDC reg data 0xC4 
- Write CDC reg data 0x24 
- Write CDC reg data 0x24 
DMA copy one sector from CDC to DRAM 		READ CD001 ID SECTOR
- Write CDC reg address 0x0A 
- Write CDC reg data 0x00 
- Write CDC reg address 0x01 
- Write CDC reg data 0xE2 
- Write CDC reg address 0x0A 
- Write CDC reg data 0xA7 
- Write CDC reg data 0xF0 
CDD INTERRUPT 
Read CD sector to buffer 
Current LBA: 0x00000012 
CDC INTERRUPT ! 
CDDTX: 02 00 00 00 00 00 00 00 00 08 
CDDRX: 01 00 00 00 00 02 01 08 00 0E 
- Write CDC reg address 0x01 
- Read 89515 reg data 0xDF 
- Write CDC reg address 0x0A 
- Write CDC reg data 0xA7 
- Write CDC reg address 0x0F 
- Read 89515 reg data 0x20 
CDD INTERRUPT 
Read CD sector to buffer 
Current LBA: 0x00000013 
CDC INTERRUPT ! 
Play
CDDTX: 03 00 00 00 00 02 01 07 00 0D 
MSF TO LBA: 0x00000011 
1 Track played
CDDRX: 01 02 00 01 00 00 00 00 00 06 
...
Plusieurs fichiers sont lus (ABS, BIB, CPY, ainsi que la FAT bien entendu. Mais pas l'IPL !)
... CDD INTERRUPT Read CD sector to buffer CDDTX: 02 00 00 00 00 00 00 00 00 08 CDDRX: 01 00 00 00 00 02 02 01 00 04 CDD INTERRUPT Read CD sector to buffer CDDTX: 01 00 00 00 00 00 00 00 00 09 (STOP ALL) CDDRX: 0E 00 00 00 00 00 00 00 00 0C CDD INTERRUPT CDD INTERRUPT ...

Et ce n'est qu'après toutes ces opérations que le "PUSH START" pour démarrer le jeu s'affiche dans le menu ;)

footer
symbol symbol symbol symbol symbol