Programmation de du en ASM
La page dédié à la programmation du MSX
Logiciel Compilateur/Assembleur VASM
Il existe plusieurs logiciel pour faire de l'asm en Z80 en cross dev. Je vous propose VASM mais je n'exclue pas de tester d'autre logiciel.
Lien
Télécharger la version adéquate de votre machine. Je suis sur windows donc ce tuto sera pour windows. A vous d'adapter ça.
La préparation est simple. Vous avez téléchargé un dossier qui ce nomme vbcc. Dedans il y a trois dossier, un readme et trois pdf.
Le fichier vasm.pdf est le mode d'emploie du compilateur/assembleur asm.
Vasm permet d'assembler du code assembleur pour plusieurs type de processeur ce qui est cool.
Le dossier config et targets osef.
Le dossier bin est important dedans il y a les logiciel d'assemblage. Pour le max on à le droit à deuxlogiciel.
vasmz80_oldstyle.exe
vasmz80_std.exe
Ce qui change c'est la façon écrire son code et de retrouver ou garder une portabilité avec du vieux code. Personnellement je vais rester sur oldstyle.
Les MSX
Il existe 4 machines officiel MSX. (Enfin des standards).
Le MSX 1
Le MSX 2
Le MSX 2+
Et le Turbo R
Les 4 pages du MSX (ou Slot)
Le MSX 1 possède 4 pages de 16Ko ce qui fait 64ko de ram. Cela tombe bien le processeur Z80 peut voir que 64ko !!! A cause de son registre PC qui est sur 16 bits !


Page 0 : Adresse $0 - $3FFF : C'est l'emplacement du Bios du MSX qui peut être désactivé pour récupéré de la ram si le MSX à de la ram en dessous !!!

Page 1:$4000 - $7FFF : C'est la Rom Basic. Idem que la page 0. Elle peut être désactivé pour récupéré la Ram en dessous. Si cette ram existe !!! Ou de la Rom pour les cartouches :

Page 2:$8000 - $BFFF : C'est la Ram (pour les machine 32ko ou plus je pense), Possibilité de slot pour de la Rom (32ko !)

Page 3:$C000 - $FFFF : C'est la Ram pour les system 16ko ou plus. Attention en fin de ram il y a de la ram system ! Note pour les msx 8ko la ram débute en $E000
Header de cartouche
Pour faire une cartouche (16ko ou 32ko), il y a besoin d'un header. CE qui permet au MSX de detecter la cartouche.
; ***********************
; *     Header MSX      *
; ***********************

  org $4000  ; adresse de début du programme sur msx
  
; ==================
; * Header Rom MSX *
; ==================
  db "AB"             ; Signature obligatoire pour l'auto-demarrage
  dw INIT_MSX         ; Adresse d'exécution du programme
  dw 0                ; CALL d'activation (0 = aucun)
  dw 0                ; Table des périphériques (0 = aucune)
  dw 0                ; Chaîne d'initialisation BASIC (0 = aucune)
  dw 0,0,0            ; Réservé / Remplissage
On place le programme en $4000 (page 1) ce qui permet aussi d'avoir la page 2 pour faire une cartouche de 32ko. (Il faut sécurisé la page je vais vous donnez plus loins le listing) Le INIT_MSX est un point d'entrée arbitraire pour savoir ou va commencer à lire le programme dans votre code source. c'est le MAIN (vous appellez ça ou vous voulez !)
Securiser la page 2 pour les cartouches 32ko
Pour les cartouches 32ko il faut je securiser la page 2. L'initier quoi.
Bon la j'ai pas annalysé ce code, c'est l'ia Gemini qui me la pondu et ça fonctionne. Je cherche pas plus loin.
Je vous donne ça aussi.
; -----------------------------------------
; CODE DE SÉCURISATION DE LA PAGE 2 ($8000)
; ----------------------------------------
  call $138           ; Routine BIOS "RSLREG" : lit l'état des slots
  rrca
  rrca                ; On décale pour obtenir le slot de la Page 1
  and %00000011       ; On isole les 2 bits du slot principal
  ld h, a             ; On stocke le slot principal dans H

  ; Est-ce un slot étendu (sous-slot) ?
  ld a, ($FCC1)       ; Table du BIOS des slots étendus
  ld l, a
  ld a, h
  ld b, 0
  ld c, a
  add hl, bc
  ld a, (hl)          ; On lit si ce slot est étendu
  and $80
  jr z, .not_expanded ; Si non étendu, on saute directement à l'activation
    
; Si le slot est étendu, on doit récupérer le sous-slot actuel
  ld a, ($FFFF)       ; Registre des sous-slots (lu inversé sur MSX)
  cpl
  rrca
  rrca                ; On décale pour s'aligner sur la Page 1
  and %00000011       ; On isole les bits du sous-slot
    
; Remplacement des SHL : on décale de 2 bits vers la gauche avec ADD A,A
  add a, a            ; Décalage 1
  add a, a            ; Décalage 2
    
  or h                ; On fusionne avec le slot principal
   or $80              ; On ajoute le flag "slot étendu"
  ld h, a             ; H contient maintenant l'ID complet (Slot + Sous-slot)

.not_expanded:
; Ici, H contient le slot exact de ta cartouche
  ld a, h
  ld h, $80           ; On dit à ENASLT qu'on veut cibler la Page 2 ($8000)
  call $0024          ; Routine BIOS "ENASLT" -> La Page 2 est enfin active !
Forcer le mode Z80 sur un turbo R
C'est sympathique de penser aussi à cette machine ! Comme ça votre programme fonction sur beaucoup de MSX ! et le morceau de code est pas long.
; ----------------------------------
; * Passage en Z80 pour le turbo R *
; ----------------------------------
   
  ld A,($2d)  ; Registre type MSX (3 pour turbo R)
  cp 3
  jr NZ,END_TEST_TR  
  
  xor A    ; Valeur pour passer en mode z80
  call $180

END_TEST_TR:
Organisation de votre code header
A vous de voir comment organiser votre header. Ce n'est qu'un exemple :
; Code de detection de la cartouche qui pointe sur INIT_MSX 
; .......................
di ; qui permet de desactiver les interuptions
; Code de detection du TR et passage en z80
; Code pour sécurisé la page 2 si vous faite une cartouche 32ko
; ei ; Active les interuptions
jp MAIN ; On saute au début du programme qui débute par MAIN: (comme En C hihi)
Encore une fois le MAIN est un exemple.Vous pouvez débuter votre code du jeu directement la. no soucie, c'est votre organisation !
Le Footer !!!
Il n'y as pas de pied de page a proprement parlé sur Z80. Mais il faut remplire les espace vide pour faire une cartouche 16 ou 32ko ! un petit ORG $BFFF
byte 0
A la fin de votre code permet d'avoir un fichier binaire de 32ko
et ORG $7FFF
Pour une cartouche de 16ko
Le VDP du msx 1
Le VDP TMS9918A/TMS9928A/TMS9929A, c'est la puce graphique du MSX 1. C'est la meme que dans la colecovision,SG1000,TI-99/4A.

- Elle intègre une Ram dédiés au processeur, (La Video Ram) de 16ko.
- Une palette de 16 couleurs dont l'index 0 est une couleur transparente.
- 32 sprites de 8x8 pixels mono couleurs avec une limitation de 4 sprites par ligne.
- Résolution de 256x192px (Coucou Master system).
- 4 modes vidéos.
Mode Video Screen 2
Très certainement le mode vidéo que vous allez utiliser pour faire un jeu sur MSX 1
Il fonctionne en tiles de 8x8 pixel. Une ligne de chaque tiles peux afficher deux couleurs maximum.
Le Fonctionnement du mode Screen 2 peut être difficile à comprendre au début :
L'écran est decoupés en 3 partie de 256x64 pixel.
Chaque partie possède son jeu de tileset et data Color lié a son tiles.
Un jeu de tileset c'est 256 tiles...
Avec ce system de découpage on peu injecter une "image" entière à l'écran chose qu'on peux pas faire sur la Master system en Mode 4 et sur Commodore 64 par exemple hors mode bitmap !
Ce system est très permicive. Par exemple pour un jeu aventure/text, d'afficher les images que sur les 2 premiers partie de l'écran, et injecter les Font dans la 3em parties...
VRAM de base du screen 2 !
Voici les adresses de la VRAM en mode Screen 2. Notons qu'il est possible de bouger les adresses !
- Pattern Generator Table : Le Tileset quoi
Le générateur débute à l'adresse $0000. L'espace est de 6144 octets.
Chaque tileset possède 256 tiles et chaque tiles fait 8 octets. (1 octets par ligne) donc 2048 octets par tileset.
Notons que l'écran est divisé en trois parties : Il faut injecter un tileset dans chacune des trois parties de l'écran. (Qui peut être le meme tileset la plupart du temps) ce qui fait :

$0000: Tileset Partie 1
$0800: Tileset Partie 2
$1000: Tileset Partie 3

- Pattern Name Table qui débute à l'adresse $1800 et qui fait 768 octets.
C'est dans cette partie de la VRAM ou on donne le numero du tiles à afficher...
L'écran est divisé en grilles de 8x8 pixel. Soit 32*24 tiles affichables. (768 tiles à l'ecran)
Placer la valeur 8 à l'octet $1800 de la Vram permet d'afficher le 9em tiles du tileset !
Attention l'écran est divisé en Trois ! Trois zone de 32*8 tiles.

$1800 : Pattern Name Table 1
$1900 : Pattern Name Table 2
$1A00 : Pattern Name Table 3

- Sprite Attribute Table en $1B00. 128 octets

- Color table en $2000. 6144 octets.

Sprite Generator Table en $3800 soit 2048 octets
Site réalisé par Jean Monos