www.cpcalive.com

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


.org 0C000h

                .db 1                   ; 0C000h     Rom type=BackGround Rom
              
                ; version 1.23
                .db 1                   ; 0C001h      Rom Mark Number
                .db 2                   ; 0C002h      Rom Version Number
                .db 3                   ; 0C003h      Rom Modif Level

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

; 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"

; remarque:
; 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"


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

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

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

IniMes              .db " Programme V1.23",10,13,0
Ok1Mes           .db "OK1",10,13,0
Ok2Mes           .db "OK2",10,13,0

; ** AFFICHE TEXTE **
; <HL=offset 1er caractère
;  rem: 0=marque de fin
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