SNES Programmation

Mes petits tests de programmation sur la Super Nintendo. Note : Peux 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éristique de la Super Nintendo / Super Famicom

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

Installation d'un assembleur et démarage

Télécharger WLA_DX. Voici une version de WLA DX. C'est le compilateur linker pour divers cible. (Z80,6502,huc6280,65c02,Z80GB,SPC700...) Mais pour nous c'est le wla-65c02.exe et wlalink.exe qui nous botte.

Placer le dossier wla_dx dans un dossier snes par exemple. Et ou vous voulez.

Il vous faut un emulateur 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ée un dossier projets. Ce dossier va contenir tous les dossiers de vos projets/jeu/test..

Dans le dossier projets, faite un dossier test par exemple. Dans celui si, trois dossier :
- 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é par le linker près à être lu par une snes/émulateur snes)
- src (Qui va contenir votre code source

Nous allons créer aussi 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 appaller 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

Et voilou, le compilateur est près. Reste à faire un fichier header.asm à inclure dans votre programme pour bien paramétrer votre code 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
Mode Video

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

Tableeau des plans
Mode Video 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.

Pointeur de tiles

Deux registres gerent 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 poid faible pointe sur 1 et 3.
Chaque poid fort pointee sur 2 et 4.
L'adresse pointe sur valeur * $2000.(A verifier)

La palette de couleur

La SNES permet de mémoriser 256 couleurs en même temps. Chaque couleur est encodé sur 2 octets en utilisant que 15 bit. 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 envois l'octet faible en mémoire en premier donc : VVVR RRRR / BBBB B0VV
Le registre $2121 permet de selectionner l'index de la palette à modifier.
Le registre $2122 permet d'ecrire 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 *
; ============================

; + ----------------- +
; * Premier operation *
; + ----------------- +
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 Possiblité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 adresse des paternes.

Data des sprites

La Snes permet d'afficher 128 sprites à l'écran et 32 sprites par ligne.
Chaque sprite est encodé sur 4 octets envoyer à l'adresse des OAM
- Position X
- Position Y
- Index du patern
- 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 selectionner l'id du sprite à travailler.

Site réalisé par Jean Monos