Programmation Super Nintendo / Super Famicom

Mes petits tests de programmation sur la Super Nintendo. Note : Peu importe le nom que j'utilise pour désigner la console. (SNES, Super NES, Super Famicom...), cela reste la même console.

Mise à jour le 24/09/2021

Des liens !
SFC Development Wiki
Caractéristiques de la Super Nintendo / Super Famicom

- Processeur : 16 bits 65C816 avec 3 modes de fréquence. 3,58 - 2,68 - 1,79 MHz
- Ram : 128 Ko
- Vram : 64 Ko
- Résolution : 256x224 / 256x239 / 512x224 / 512x239 / 512x448
- Palette : 32 768 couleurs et 256 index.
- Sprites : 128 sprites. 32 sprites par ligne maximum. Taille 8x8/16x16/32x32/64x64
- Son : SPC700 8 canaux.

Installation de l'assembleur et démarrage

Téléchargez WLA-DX. Voici une version de WLA DX. C'est le assembleur et linker pour plusieurs cibles. (Z80,6502,huc6280,65c02,Z80GB,SPC700...) Mais pour nous c'est le wla-65c02.exe et wlalink.exe qui nous intéressent.

Placez le dossier wla_dx dans un dossier snes par exemple. où vous le souhaitez.

Il vous faut également un émulateur SNES. Je vous propose bsnes_v115. Je vous propose aussi ça. Perso je le place dans le dossier SNES

A la racine du dossier SNES, créez un dossier projets. Ce dossier va contenir tous les dossiers de vos projets/jeu/test..

Dans le dossier projets, créez un dossier test par exemple. Dans celui-ci, trois dossiers :
- obj (Qui va contenir le fichier binaire compilé par WLA et un autre fichier temps que nous allons créer)
- out (Qui va contenir votre rom générée par le linker, prête à être lue par une snes/émulateur snes)
- src (Qui va contenir vos fichiers source

Nous allons également créer un fichier Compilation.bat


echo off

..\..\wla_dx\wla-65816 -I src\ -o obj\main.obj src\main.asm  
..\..\wla_dx\wlalink -v -r obj\temp out\game.smc
pause

Ce fichier va rechercher wla-65816 pour appeler main.asm et sortir un game.smc dans le dossier out.

Dans le dossier obj, créer un fichier temps. On va configurer le linker

[objects]
obj\main.obj

La chaîne de compilation est maintenant, le compilateur est prêt. Reste à faire un fichier header.asm à inclure dans votre programme pour bien paramétrer vos fichiers source et que cela soit lisible sur une snes.

.MEMORYMAP 
    SLOTSIZE $8000
    DEFAULTSLOT 0
    SLOT 0 $8000
.ENDME 

.ROMBANKSIZE $8000 
.ROMBANKS 8 

.SNESHEADER 
    ID    "SNES" 
    NAME  "TEST1                " 
    ;     "123456789012345678901" 
    LOROM 
    SLOWROM 
    CARTRIDGETYPE $00 
    ROMSIZE $08 ;size rom 08-0c 
    SRAMSIZE $00 
    COUNTRY $02 ;0 = japan , 1 = US , 2 = Europe 
    LICENSEECODE $00 
    VERSION 00 
.ENDSNES 

.SNESNATIVEVECTOR 
    COP    $0000 
    BRK    $0000 
    ABORT  $0000 
    NMI    VBlank 
    UNUSED $0000 
    IRQ    $0000 
.ENDNATIVEVECTOR 

.SNESEMUVECTOR 
    COP    $0000 
    UNUSED $0000 
    ABORT  $0000 
    NMI    VBlank 
    RESET  Main 
    IRQBRK $0000 
.ENDEMUVECTOR
Modes vidéo

La Snes possède 8 modes vidéo.
Le choix du mode vidéo se fait avec le bit 0,1,2 du registre $2105
Chaque mode vidéo permet d'activer ou pas différents backgrounds et une limitation de couleur par background.
Mode : Couleur plan 1/Couleur plan 2/Couleur plan 3/Couleur plan 4

Tableeau des plans
Modes vidéo Couleurs Background 0 Couleurs Background 1 Couleurs Background 2 Couleurs Background 3 Note
Mode 0 4 4 4 4 n/d
Mode 1 16 16 4 n/d n/d
Mode 2 16 16 n/d n/d n/d
Mode 3 256 16 n/d n/d n/d
Mode 4 256 4 n/d n/d n/d
Mode 5 16 4 n/d n/d n/d
Mode 6 16 n/d n/d n/d n/d
Mode 7 256 n/d n/d n/d n/d
Mode 0 : 4/4/4/4
Mode 1 : 16/16/4/ND
Mode 2 : 16/16/ND/ND
Mode 3 : 256/16/ND/ND
Mode 4 : 256/4/ND/ND
Mode 5 : 16/4/ND/ND
Mode 6 : 16/ND/ND/ND
Mode 7 : 256/ND/ND/ND

Configuration du background

Chaque background peut être configuré.
Les registre de configuration :
$2107 : Background 1
$2108 : Background 2
$2109 : Background 3
$210A : Background 4

L'encodage se fait sur 1 octet.
Les bits 0 et 1 permet de configurer la taille du background.
00 : 32x32 (AA/AA)
01 : 64x32 (AB/AB)
10 : 32x64 (AA/BB)
11 : 64x64 (AB/CD)

Les bits 2 à 7 permetent de configurer le pointeur de tilemap des backgrounb.

Pointeurs de tiles

Deux registres gèrent le pointeur de tile de chaque background.
- $210B qui gère le background 1 et 2
- $210C qui gère le background 3 et 4
Chaque poids faible pointe sur 1 et 3.
Chaque poids fort pointe sur 2 et 4.
L'adresse pointe sur valeur * $2000.(A verifier)

La palette de couleurs

La SNES permet de mémoriser 256 couleurs en même temps. Chaque couleur est encodée sur 2 octets en utilisant que 15 bits. 5 bits par composant de couleurs. (32 rouges, 32 bleu, 32 vert, soit 32768 teintes).
L'ordre exacte (Utile la nuance du vert) est la suivante BBBB B0VV / VVVR RRRR
Mais on envoie l'octet faible en mémoire en premier donc : VVVR RRRR / BBBB B0VV
Le registre $2121 permet de sélectionner l'index de la palette à modifier.
Le registre $2122 permet d'écrire dans la palette. Il faut deux opérations sur ce registre.
Note : Une fois les deux opérations effectué, le registre $2121 s'incrémente de 1 tout seul

; ***************************************************
; *                                                 *
; * Exemple de configuration d'une couleur sur SNES *
; * Programmation en Assembleur                     *
; *                                                 *
; ***************************************************

; ================================
; * Prépare à écrire à l'index 0 *
; ================================
lda #$00
sta $2121

; ============================
; * Couleur noir à l'index 0 *
; ============================

; + ----------------- +
; * Première opération *
; + ----------------- +
lda #$00
sta $2122

; + ------------------ +
; * Deuxième opération *
; + ------------------ +
lda #$00
sta $2122

Configuration de sprite

Le registre $2101 permet de configurer les sprites.
- Bit 7-6-5 : 6 possibilités de configuration de sprites individuel en fonction de l'option individuel small Sprite/Large Sprite:
000 : 8x8 / 16x16
001 : 8x8 / 32x32
010 : 8x8 / 64x64
011 : 16x16 / 32x32
100 : 16x16 / 64x64
101 : 32x32 / 64x64

- bit 4-3-2 ?
- bit 1-0 : Pointeur vers l'adresse des patterns.

Données des sprites

La Snes permet d'afficher 128 sprites à l'écran et 32 sprites par ligne.
Chaque sprite est encodé sur 4 octets envoyés à l'adresse des OAM
- Position X
- Position Y
- Index du pattern
- Attribut du sprite :
-- Bit 7 : Flip vertical
-- Bit 6 : Flip Horizontal
-- Bit 5-4 : Priorité affichage
-- Bit 3-2-1 : Palette
-- Bit 0 : Tileset (?)

L'adresse $2102 permet de sélectionner l'id du sprite à travailler.

Site rétro réalisé par Jean Monos • Amistrad