CpcAlive est un
environnement
de programmation
compatible
Amstrad CPC
pour création
d'animations
 graphiques.






Cpc en ligne

Z80: opcodes et programmation

Les mots clés du basic Cpc

Les messages d'erreur du basic Cpc

La mémoire

La gestion des disquettes


La palette du cpc 6128 par défaut

Les couleurs affectées aux
crayons du cpc 6128 par défaut

Installateur CpcAlive pour Windows
& pour DosBox

Documentation CpcAlive

SmallAsm est un assembleur Z80
pour Dos






English

Exemple de création d'une ROM Amstrad Cpc contenant des instructions BASIC programmables (Resident System eXtension)


Entête Rom:

.org 0C000h

Les Roms Cpc contenant des instructions Basic programmables sont situées en mémoire de 0C000h a 0FFFFh.

                .db 1                    
; Rom type=BackGround Rom

Ceci indique au BASIC que cette ROM contient un programme qui sera exécuté en tâche de fond (Background), contrairement à la ROM BASIC qui contient la valeur &80 pour indiquer qu'il s'agit de la tâche principale (ForeGround)
              
                 
; version 1.23
                .db 1                    
; Rom Mark Number
                .db 2                    
; Rom Version Number
                .db 3                    
; Rom Modif Level

Informations complémentaires, mais non indispensables. Exemple pour la version 1.23 il faudra mettre les octets 01h 02h 03h.


                .dw MnemoTb   
; adresse de la table des noms qui seront
                                           
; utilisés pour appeler les routines via le BASIC
                jp RomIni           
;1er vecteur. Ce vecteur sera automatiquement
                                            
; appelé à chaque initialisation du système Cpc
                jp commande1   
; 2ème vecteur
                jp commande2   
; . . .


Table des noms:

MnemoTb   .db "ROMIN"        ; |ROMINI   (appelle le sous-programme "RomIni")
                    .db 049h | 080h        
; "I" or 080h
                    .db "NOM"             
; |NOM1    (appelle le sous-programme "commande1")
                    .db 031h | 080h         ; "1" or 080h
                    .db "NOM"             
; |NOM2    (appelle le sous-programme "commande2")
                    .db 032h | 080h         ; "2" or 080h
                    .db 0                          
; 0=marque "fin de table"

La fin de chaque nom est indiquée grâce à la présence du bit 7 sur la dernière lettre. Pour appeler la commande, il suffira de taper le nom précédé du signe "barre verticale | ", à partir de l'interpréteur basic du CPC. Il est aussi possible de transférer des paramètres aux routines à partir du basic 
de la mème manière qu'avec l'instruction basic CALL. Voir pour cela le chapitre Appel d'un programme machine à partir de l'instruction Basic "CALL"


Initialisation Rom:

RomIni:           push hl

                         ld hl,IniMes            ; message à afficher au démarrage terminé par 0
                         call TxtAffi
                         pop hl
                         scf                           
; carry = tout s'est bien passé
                         ret


IniMes              .db " Programme V1.23",10,13,0

En entrée, HL contient la dernière adresse de mémoire libre. Si la seule autre ROM utilisée est AMSDOS, alors HL vaudra &A700, car AMSDOS et le BASIC utilisent la zone mémoire de &A700 a &BFFF. En sortie, HL contient la nouvelle adresse de mémoire libre. Par exemple si la ROM requiert 9 octets en RAM pour stocker des informations, il faudra retourner dans HL sa valeur en entrée moins 9. Les autres registres (sauf AF) ne doivent pas être affectés. De plus, si l'initialisation s'est bien passée, alors il faut positionner le Carry à 1. Dans le cas contraire (pas assez de mémoire par exemple) alors mettre le carry à 0. En retour, le BASIC va tenir compte de cette nouvelle valeur pour la prochaine ROM à installer (sachant que le BASIC cherche d'abord à installer la ROM 255, puis 254, etc, jusqu'à 0). Bien sur, plus la ROM nécessite de RAM pour être utilisée, plus la valeur Max de HIMEM en BASIC va diminuer.


Programmes:

commande1:     ld hl,Ok1Mes          ; message à afficher
                          call TxtAffi             
; afficher texte
                          ret

commande2:      ld hl,Ok2Mes         
; message à afficher
                           call TxtAffi             
; afficher texte
                           ret

Ok1Mes           .db "OK1",10,13,0
Ok2Mes           .db "OK2",10,13,0

; ** AFFICHE TEXTE **
; Entrée: HL=offset 1er caractère chaîne terminée par 0
TxtAffi:             ld a,(hl)
                          inc hl
                          or a                   
; fin du message ?
                          ret z                  
; oui alors "retour"
                          call 0BB5Ah     
; routine système "Afficher caractère"
                          jr TxtAffi

.end