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
Site réalisé par Jean Monos