Amstrad Plus Index du Forum

Amstrad Plus
Découverte de la gamme Old et Plus des Cpc d'Amstrad.

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

*****Programmation des Rom/Ram sur Cpc/Cpc Plus

 
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation
Sujet précédent :: Sujet suivant  
Auteur Message
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 049

MessagePosté le: Mar 4 Juil - 15:12 (2017)    Sujet du message: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Répondre en citant

J'y pense depuis 2 ou 3 jours, mais il m'apparait évident de vous concocter un petit article sur la Gestion des Rom et des Ram sur Cpc et Cpc Plus.

Avant de commencer cette rubrique, il faut savoir que tout accès à la Rom ou à la Ram se fera par le biais du port #7F, soit, par le biais du Gate Array. En ce qui concerne la ram, c'est le PAL qui s'occupe de gérer cela, toujours par le biais du Gate Array.

Commençons en premier lieu, par disséquer les bits utilisés par le port #7F.

Bit 7 : **
Bit 6 :  **
Bit 5 : Utilisé sur Cpc Plus pour le Délockage de l'Asic
Bit 4 : Diviseur d'interruption
Bit 3 : 0:Connexion Rom Haute | 1:Deconnexion Rom Haute
Bit 2 : 0:Connexion Rom Basse | 1:Deconnexion Rom Basse
Bit 1 : ***
Bit 0 : ***

Les bits 7 et 6 sont utilisés tel quels :

*** Bits 7|6
            0|0 : Changement Registre des Palettes
            0|1 : Choix de la couleur à envoyer
            1|0 : Sélection Commutation Rom
            1|1 : Sélection "Extra Ram"

Les bits 1 et 0 déterminent le mode graphique du Cpc (0 à 3)

****Bits 0|1
             0|0  ; Mode 0 ; 16 couleurs
             0|1  ; Mode 1 ; 4 couleurs
             1|0  ; Mode 2 ; 2 couleurs
             1|1  ; Mode 3 ; 4 couleurs

1. La Gestion des Rom :

Il existe 2 types de Roms sur Cpc, la rom haute, située dans la plage mémoire #c000-#ffff, et la rom basse en 0-#3fff.
Nous avons la possibilité de les sélectionner, comme bon nous semble.

Afin de sélectionner les rom, nous devrons mettre le bit 7 à 1, et le bit 6 à 0.
La procédure reste fort simple, allons donc y jeter un œil.

Code:
ld bc,#7F00+%10xxxxxx
out (c),c
...














Reste plus qu'à sélectionner la rom haute ou basse, voire les deux.
Un exemple peut-être ?

Code:
ld bc,#7f00+%10000100 ; Connexion Rom haute + Mode 0
out (c),c
...














Sélectionner la Rom se fera par le port #df donc :

Code:
ld bc,#7f00+%100000100 ; Connexion Rom Haute + Mode 0
out (c),c
ld bc,#df00 ; on sélectionne la Rom 0
out (c),c
...














Dans cet exemple, la Rom 0 sélectionnée sera mappée en #c000. Simple non ?

Maintenant si nous voulions sélectionner la rom basse, il faudrait donc faire :

Code:
ld bc,#7F00+%10001010 ; Connexion Rom Basse+ Mode 2 
out (c),c
...














Regardons de plus près, l'état des bits afin d'en comprendre le sens.

Bit 7 à 1 et 6 à 0 : Commutation des rom
Bit 5 à 0 ; pas de page Asic à connecter
Bit 4 à 0 ; Diviseur d'int off
Bit 3 à 1 ; Déconnexion Rom Haute
Bit 2 à 0 : Connexion Rom Basse
Bit 1 à 1  et Bit 0 à 0 ; Mode 2

C'est plus facile ainsi d'en comprendre la structure.

Code:
ld bc,#7f00+%10001110 ; Déconnexion Rom Haute & Basse + Mode 2
out (c),c
...














S'il est utile de savoir connecter les rom, il est aussi utile de savoir les déconnecter.

2. La gestion des Ram :
Les Cpc de base sont dotés de 64K de Ram. Avec l'arrivée des 6128, 64K supplémentaire ont été ajoutés. La question à se poser est "Comment utiliser ces 64K supplémentaire ?" Voici un début de réponse.

Les 64k de ram supplémentaire sont divisés en 4 pages de 16K situées entre #4000 et #7fff, et appelées Page 1, 2, 3 ou 4, la page 0 étant la page des premiers 64K. Pour utiliser ces pages, il suffit simplement de les commuter. Comment ?

Si nous relisons attentivement le début de l'article sur la dissection des bits, il suffit simplement de mettre les Bits 7 & 6 à 1, ce qui aura pour effet de sélectionner la Page de 16K désirée via les bits 0 à 3.
Donc, plus question ici ni de sélectionner les mode écran, ni de connecter/déconnecter les rom.

----Bits 7|6|5|4|3|2|1|0
            1|1|0|0|0|0|0|0 ; Mode #C0 ; La page 0 est connectée
            1|1|0|0|0|1|0|0 ; Mode #C4 ; La page 1 est connectée
            1|1|0|0|0|1|0|1 ; Mode #C5 ; La page 2 est connectée
            1|1|0|0|0|1|1|0 ; Mode #C6 ; La page 3 est connectée
            1|1|0|0|0|1|1|1 ; Mode #C7 ; La page 4 est connectée
           
Code:
ld bc,#7F00+%11000110 ; Mode #C6 -> Page 3 connectée
out (c),c







Petit Bonus, et non des moindres que nous devons à Overflow... Merci à toi de m'avoir expliqué cela il y a quelques années déjà...

Si vous observez attentivement, je n'ai pas parlé du cas ou le bit 2 serait à zéro. Dans ce cas là, les pages #C1, #C2 et #C3 serait connectées. Mais qui en connaît les effets ?

Pour résumer, la mémoire du Cpc en mode #c0 est paginée telle quelle, à savoir :

v#0000,v#4000 (Page 0),v#8000,v#c000
s#4000 (Page 1), s#4000 (Page 2), s#4000 (Page 3), s#4000 (page 4)

v=page vidéo
s=page secondaire

En mode #C1, nous aurons :
v#0000,v#4000,v#8000,s#4000 (Page 4)

En mode #C2, nous aurons :
s#4000 (Page 1), s#4000 (Page 2), s#4000 (Page 3), s#4000 (page 4)

En mode #C3 :
v#0000,v#c000,v#8000,s#4000 (Page 4)

Un petit détail qui a son importance.... Dans tous les cas de connexion (#C1, #C2 ou #C3), la page 4 est située au même endroit.
En gros, quel que soit le mode on aura toujours la page 4 de la bank 4 (#c7) #c000.

L'avantage ? Si on veut gérer proprement ce mode et naviguer parmi ceux ci sans trop se casser la tête, il suffit de mettre le code en #c000 et le tour est joué. C'est compris ?

Des petites choses à ajouter ? C'est le moment...



_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Dernière édition par Ast le Mer 5 Juil - 13:23 (2017); édité 2 fois
Revenir en haut
Publicité






MessagePosté le: Mar 4 Juil - 15:12 (2017)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
cmp


En ligne

Inscrit le: 08 Sep 2014
Messages: 42
Localisation: nord

MessagePosté le: Mar 4 Juil - 16:36 (2017)    Sujet du message: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Répondre en citant

Ah oui Smile Je m'en rappelle ^^


Merci pour cet article
_________________
CMP from impact cpc


Revenir en haut
Skype
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 049

MessagePosté le: Mar 4 Juil - 16:38 (2017)    Sujet du message: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Répondre en citant

Bon bin au moins ça te servira Okay
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
cmp


En ligne

Inscrit le: 08 Sep 2014
Messages: 42
Localisation: nord

MessagePosté le: Mer 5 Juil - 09:56 (2017)    Sujet du message: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Répondre en citant

Donc pour résumer Smile




ld bc,#7FC4
out (c),c




Soit pour #C4


1100 0100 (valeur de C4 en binaire)


11 Extra Ram
00 no delock + pas de diviseur d'int




01     ;Connexion Rom Haute
       ;Déconnexion Rom Basse   
00     ;Mode 0







Peux-tu nous en parler un peu plus de cela Wink


ld bc,#7FC3
OUT (c),c




_________________
CMP from impact cpc


Revenir en haut
Skype
cmp


En ligne

Inscrit le: 08 Sep 2014
Messages: 42
Localisation: nord

MessagePosté le: Mer 5 Juil - 10:09 (2017)    Sujet du message: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Répondre en citant

Voilà un exemple constructif pour résumer les propos de AST



Code:
org #2000

table_irq equ #8000
;
  ld bc,&7fc4    ;la page C4 = 0000 à 3fff en mode sequencé
  out (c),c
;
  ld hl,#2000        ;copie tout le code en banque 1
  ld de,#4000+#2000 ;car on va sauter en page e0 donc en 2000 apres commutation
  ld bc,#4000-#2000
  ldir
;
  JP NEXT2

NEXT2:
;
  DI
  ld bc,&7fc2     ;les 4 pages de 16kb (#c4,#c5,#c6,#c7) pour 
  out (c),c       ;former une nouvelle ram de 64 kb... 0 à #ffff

  LD A,#80  ;pointe en 80xx sur la nouvelle banque 
  LD I,a
  ld h,a
  ld l,0
  inc a
  ld (hl),a
  ld d,h
  ld e,1
  ld bc,#100
  ldir
  ld h,a
  ld l,a
  ld (hl),#fb
  inc hl
  ld (hl),#c9

  im 2

  jp code_afterc2

code_afterc2:

      ei

vbl ld b,#f5
 in a,(c)
 rra
 jp nc,vbl


 halt

  ld bc,#7f00
  out (c),c
  ld a,#5c
  out (c),a
  
 halt

    ld bc,#7f00
    out (c),c
    ld a,#5c
    out (c),a

 halt

    ld bc,#7f00
    out (c),c
    ld a,#4c
    out (c),a

 halt

    ld bc,#7f00
    out (c),c
    ld a,#4e
    out (c),a

 halt

    ld bc,#7f00
    out (c),c
    ld a,#4b
    out (c),a

    ld bc,#7fc7
    out (c),c

    ld hl,#c000
    ld de,#c001
    ld bc,80-1
    ld a,80
    ld (hl),a
    ldir

   ld bc,#7fc2
    out (c),c

      jp vbl



_________________
CMP from impact cpc


Revenir en haut
Skype
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 049

MessagePosté le: Mer 5 Juil - 11:06 (2017)    Sujet du message: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Répondre en citant

cmp a écrit:
Donc pour résumer Smile



ld bc,#7FC4
out (c),c




Soit pour #C4


1100 0100 (valeur de C4 en binaire)


11 Extra Ram

00 no delock + pas de diviseur d'int




01     ;Connexion Rom Haute
       ;Déconnexion Rom Basse   
00     ;Mode 0














A cela, je répondrais :


Ast a écrit:
2. La gestion des Ram :
Les Cpc de base sont dotés de 64K de Ram. Avec l'arrivée des 6128, 64K supplémentaire ont été ajoutés. La question à se poser est "Comment utiliser ces 64K supplémentaire ?" Voici un début de réponse.

Les 64k de ram supplémentaire sont divisés en 4 pages de 16K situées entre #4000 et #7fff, et appelées Page 1, 2, 3 ou 4, la page 0 étant la page des premiers 64K. Pour utiliser ces pages, il suffit simplement de les commuter. Comment ?

Si nous relisons attentivement le début de l'article sur la dissection des bits, il suffit simplement de mettre les Bits 7 & 6 à 1, ce qui aura pour effet de sélectionner la Page de 16K désirée via les bits 0 à 3.
Donc, plus question ici ni de sélectionner les mode écran, ni de connecter/déconnecter les rom.

----Bits 7|6|5|4|3|2|1|0
            1|1|0|0|0|0|0|0 ; Mode #C0 ; La page 0 est connectée
            1|1|0|0|0|1|0|0 ; Mode #C4 ; La page 1 est connectée
            1|1|0|0|0|1|0|1 ; Mode #C5 ; La page 2 est connectée
            1|1|0|0|0|1|1|0 ; Mode #C6 ; La page 3 est connectée
            1|1|0|0|0|1|1|1 ; Mode #C7 ; La page 4 est connectée


...





Et j'ajouterais ceci : souviens toi que la gestion des Ram est faite par le PAL via le port #7f.

cmp a écrit:






Peux-tu nous en parler un peu plus de cela Wink


ld bc,#7FC3
OUT (c),c













Que veux tu savoir de plus ?
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Dernière édition par Ast le Mer 5 Juil - 13:27 (2017); édité 1 fois
Revenir en haut
cmp


En ligne

Inscrit le: 08 Sep 2014
Messages: 42
Localisation: nord

MessagePosté le: Mer 5 Juil - 11:25 (2017)    Sujet du message: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Répondre en citant

Un autre exemple

Code:
main
         ld b,#f5
vsync in a,(c)
         rra
         jr nc,vsync
commut
         ld a,#ff
         xor #ff
         ld (commut+1),a
         or a ; <-------------------NDAsT : Pas nécessaire !!!!
         jr z,screen2
screen1
         ld bc,#7fc3 ; Work on #C000 Page
         out (c),c
         ld a,#10 ;display je montre &4000
         ld bc,#bc0c     ;is
         out (c),c       ;#4000  
         inc b
         out (c),a
         jr suite_code

screen2 
         ld bc,#7fc0 ; Work on #4000 Page 
         out (c),c
         ld a,#30 ; display
         ld bc,#bc0c     ;is
         out (c),c       ;#C000
         inc b
         out (c),a

suite_code
....



_________________
CMP from impact cpc


Revenir en haut
Skype
roudoudou


Hors ligne

Inscrit le: 14 Juil 2016
Messages: 186
Localisation: LYON

MessagePosté le: Ven 21 Juil - 20:56 (2017)    Sujet du message: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Répondre en citant

Coucou, je passais par là
Si je peux faire de la retape pour Rasm, allons-y :p
Y a un moment où on aime perdre du temps sur AUTRE chose que connecter les ROMs comme il faut
Pour ma part, je me suis fait des macros

Code:
; A=video mode
; E=lower rom number
Macro GenericSelectLowerRom Numero,Adresse,Asic,VideoMode

if {Asic}==ON
rmr2_page=%11000
else
rmr2_page=0
endif

switch {adresse}
case #0000
; rmr2 déjà mis comme il faut
break
case #4000
rmr2_page=%01000
break
case #8000
rmr2_page=%10000
break
default
print 'impossible de selection l\'adresse ',{HEX}{adresse},' pour une ROM basse'
stop
endswitch

if {numero}>7
print 'ROM basse doit etre entre 0 et 7 uniquement'
stop
elseif {numero}<0
print 'ROM basse doit etre entre 0 et 7 uniquement'
stop
endif

if {VideoMode}>7
print 'Mode video doit etre entre 0 et 3 uniquement'
stop
elseif {VideoMode}<0
print 'Mode video doit etre entre 0 et 3 uniquement'
stop
endif

ld a,rmr2_page+%10100000+{Numero}
ld b,#7F
out (c),a
ld a,%10001000+{VideoMode} ; up deco, low co, mode 0
out (c),a
mend

;-------------------------------------------- pour les ROM hautes c'est plus simple!

; pour connecter une ROM haute et garder la ROM basse active
; A=video mode
; E=upper rom number
Macro GenericSelectUpperLowerRom
push af
ld a,e
or #80
and %10011111
ld bc,#DF00
out (c),a
pop af
and %11
or #80
ld b,#7F
out (c),a
;
ret
mend

; pour connecter la ROM haute et désactiver la ROM basse au passage
; A=video mode
; E=rom number
Macro GenericSelectUpperRom
and %11
or %10000100
ld b,#7F
out (c),a
ld a,e
or #80
and %10011111
ld b,#DF
out (c),a
ret
Mend



Bon là j'ai mis des RET en fin de macro afin de les utiliser comme fonctions mais on peut virer le RET au besoin et faire des paramètres plus souples encore


Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 22:30 (2017)    Sujet du message: *****Programmation des Rom/Ram sur Cpc/Cpc Plus

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  

Index | Panneau d’administration | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com