Page Assembleur :intro:1:
Des assembleurs
Pour programmer le commodore 64, il faut un logiciel dit Assembleur.
Ce logiciel à pour but de transformer votre code ecrit en Assembleur (vous savez les trucs avec lda, des sta, des inc ...) en code machine. Le code machine c'est les instructions en binaire que le processeur comprend.
VASM/VBCC
Il permet assembler dans différent langage. (Z80,6502, 68000..).
Telecharger
Lien
La version que je propose en téléchargement fonctionne bien sur un windows 11 64 bits.
Le logiciel utilisé est vasm6502. il existe deux exe. En mode _std et en mode oldstyle. A l'heure actuel j'utilise le mode oldstyle.
La création d'un .prg est simple. on fait manger au compilateur le .asm , avec des options et on sort un fichier.prg.
En gros ça fait : vasm6502_oldstyle.exe -dotdir -Fbin -cbm-prg -ldots main.asm -o c64.prg
A noter qu'il faut bien linker les au fichier bat pour savoir ou se trouve vasm6502, le fichier main.asm et ou placer le .c64.prg mais on en parlera dans un future proche...
TMP
The Turbo Macro Pro cross assembler by Style, ne compile que du 6502 (et 6510).
Télécharger
Lui aussi fonctionne sur un windows 11 64 bits
ACME
Un autre Compilateur ASM.
Télécharger
Lui aussi fonctionne sur un windows 11 64 bits
Le github de Meonwax
exemple d'une ligne de compilation ACME.exe --cpu 6510 -f cbm -o test.prg main.asm
--cpu : on peux repasser en 6502 voir en 65c02 !
-f : cbm permet d'ajouter les 2 octets du header qui indique l'adresse de départ du fichier pour le lecteur de disquette.
Emulateur Vice
Quand on fait du Cross Dev, il faut un logiciel pour tester notre programme. Ce logiciel se nomme un émulateur.
Une fois téléchargé (voir le lien) aller dans le dossier bin du dossier et lancer l'émulateur en utilisant l'exe x64sc.exe pour tester vos programmer déplacer votre.prg généré directement dans la fêtre du logiciel. (ou votre D64/crt mais ça on verra bien plus tard comment crée ça) Lien
Le Header
Le Commodore 64 à besoin d'un header. (a vrais dire non mais le code header permet de lancer automatiquement le programme chargé.)

; ===================
; * Header File C64 *
; ===================

; * Code ecrit pour VBCC old style * 
  *=$0800  
  .byte $00,$0c,$08,$0a,$00,$9e,$20,$32 
  .byte $30,$36,$34,$00,$00,$00,$00,$00
  

En gros ce morceau de code permet de lancer le programme chargé qui se loge à l'adresse $800.
Ce code fait un sys 2064 ($810); Le début de votre code se trouve donc à $810 !
Retour sur la Ram Map !

Bloc Adresse Note
$0000 - $ 03FF - Variable System
- Branchement du Vic II ($0000 - $3FFF)
$0400 - Screen Memory
$0800 - $9FFF - Ram Libre (Basic)
$A000 - $BFFF - Rom Basic
$C000 - $CFFF - Ram
$D000 - $DFFF - Io
$E000 - $FFFF - Kernal
Voici la Cartorgraphique (simplifié) de la mémoire du Commodore 64 quand on le démarre.
La puce Vic20 est se trouve au début de la ram. Elle peut lire que 16ko et donc lire les adresse qui sont comprise entre l'adresse $0000 et $3FFF.
La mémoire écran (ou Screen Ram) se trouve à l'adresse $0400. C'est dans cette endroit ou on va demander au commodore 64 d'afficher les tiles à l'endroit voulue !
La Ram Libre pour notre programme se trouve à l'adresse $0800 ce qui correspond bien à notre header qui début à bien en $0800. Cette ram libre fini en $9FFF ce qui fait 38911 octets de libre pour écrire notre programme.(Tien c'est la valeur affiché a l'écran de démarage d'un commodore 64. 38911 Basic Bytes Free hihi
En $A000 se trouve la Rom Basic. Elle se fini en $BFFF (8191ko)
En $C000 se trouve de la Ram exploitable. Elle se fini en $CFFF.(4095 octets de libre).
En $D000 débute les entrée et la color ram.
En E000 se trouve la Rom du Kernal. (system exploitation).
Vu comme ça, on peux dire qu'on à 43006 octets de libre pour écrire notre programme.

Premier programme !!!

On va tester un première programme pour voir si tout fonctionne. On va afficher juste la lettre A en Haut à Gauche de l'écran ! Nous allons utiliser le compilateur TMPx 1.01.
Telechargement
Voici une archive avec une code source, le compilateur TMPx, vice.
(Bon pour Windows xd)
Lancer le .bat Compilation.bat.
Compilateur
Une fois la compilation terminé, dans le dossier bin, il y a un prg. Déplacer le dans l'émulateur vice.

Un A devrait apparait en haut gauche de l'écran du commodore 64.
le main.asm possède un peu de code.

; ======================================
; * Titre du programme ..... : Tuto 01 * 
; * Compilateur .............: TMPx    *
; * Cible ...................: C64     *
; ======================================

; ===================
; * Header File C64 *
; ===================

; -------------------------------------------------
; - Charge le fichier en $0800 et fais un sys 810 -
; -------------------------------------------------

  *=$0800  
  .byte $00,$0c,$08,$0a,$00,$9e,$20,$32 
  .byte $30,$36,$34,$00,$00,$00,$00,$00
  
; -----------------
; * Fonction Main *
; -----------------
F_MAIN ; Creation d'une etiquette

  lda #1 ; Charger une valeur dans le registre A.
  sta $400 ; envoyer le contenue du Registre à l'adresse $400
  
  jmp F_MAIN ; aller à F_MAIN
  

  
Nous allons pas revenir sur le header.
Note : Les écritures après un point virgule (;) sont des commentaires. C'est ignoré par le compilateur.
J'utilise souvent les commentaires pour faire des "cartouches", des séparateurs, et documenter du code. En assembleur c'est vraiment vitale.
*=$0800 c'est une instruction du préprocesseur qui permet de définire le début de calcule des adresses.
.byte c'est une commande du préposesseur. Elle permet injecté des valeur dans le fichier binaire. Ici à partie de $800 on place les valeur $00,$0C...
F_MAIN c'est une étiquette. Le compilateur va lui assigner une adresse.
lda #1 lda est une instruction du 6502. Cette instruction permet de charger dans A (l'accumulateur) une valeur. Le #1 veux dire charge la valeur 1 dans A.
sta $400 sta est une instruction du 6502. Cette instruction permet d'envoyer le contenue de A à une adresse mémoire. Ici c'est l'adresse $400. Le $ avant une valeur designe une valeur en hexadecimale.
jmp F_MAIN jmp est une instruction du 6502. Elle permet de sauter à une adresse mémoire du programme. Ici c'est F_MAIN. F_MAIN sera remplacé par la bonne adresse du compilateur.

Alors pourquoi un A en haut à gauche avec ce programme ? Car ce programme modifie le contenue de la case mémoire $400 en lui injectant la valeur 1.
En état des chose : la valeur 1 corespond au A majuscule en Petscii, et l'adresse 400$ c'est la première case de notre écran.
le jmp fait un saut et le programme boucle. Bon pour le bouclage ici cela ne sert à rien. Mais ça permet d'apprendre une instruction. (Pour les personnes qui font du basic, jmp c'est tout simplement goto !!!)
Le compilateur va donc transformer ce code en instruction lissible par le commodore 64 et son processeur 6510(c'est un 6502 ).
On va regarder dans un éditeur Hexadecimale.
(Valeur en Hexadecimal)
00 08 00 0C 08 0A 00 9E 20 32 30 36 34 00 00 00 00 00 A9 01 8D 00 04 4C 10 08
Un 00 08 est ajouté au début du fichier binaire. (un prg reste un fichier binaire comme tout les fichiers sur votre ordinateur). C'est le vrais header du fichier. A vrais dire c'est pour savoir ou va se placer le fichier en memoire. Le fichier va aller dans le lecteur de disquette, et copier les autres octets en mémoire dans le C64. Le 00 et 08 ne se retrouve pas en mémoire du commodore 64.
A oui en ce qui concerne les adresses le 6502 inverse l'encodage. donc 00/08 ne veux pas dire adresse 8. Mais si on inverse... 08/00 cela donne bien $0800.

Fin
Voila pour ce première tuto. vous avez un assembleur, un Header, un premier programme de test, un emulateur. Préparer vous pour la suite !!!
Site réalisé par Jean Monos