![]() |
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 |