www.cpcalive.com
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 princiaple
(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 7, puis 6, 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