Amstrad Plus Forum Index

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

 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> Gate Array
Previous topic :: Next topic  
Author Message
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Tue 4 Jul - 15:12 (2017)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

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 ; #8x
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 ; #84 ; Connexion Rom haute + Mode 0
out (c),c
...




















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

Code:
ld bc,#7f00+%100000100 ; #84 ; 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 ; #89 ; 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 ; #8E ; 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 de la 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-#c0),v#8000,v#c000
s#4000 (Page 1-#c4), s#4000 (Page 2-#c5), s#4000 (Page 3-#c6), s#4000 (page 4-#c7)

v=page vidéo
s=page secondaire

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

En mode #C2, nous aurons :
 
s#4000 (Page 1-#c4), s#4000 (Page 2-#c5), s#4000 (Page 3-#c6), s#4000 (page 4-#c7


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

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


Last edited by Ast on Mon 24 Feb - 00:51 (2020); edited 6 times in total
Back to top
Publicité






PostPosted: Tue 4 Jul - 15:12 (2017)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
cmp


Offline

Joined: 08 Sep 2014
Posts: 185
Localisation: nord
Masculin Balance (23sep-22oct)
Point(s): 8
Moyenne de points: 0.04

PostPosted: Tue 4 Jul - 16:36 (2017)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

Ah oui Smile Je m'en rappelle ^^


Merci pour cet article
_________________
CMP from impact cpc


Back to top
Skype
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Tue 4 Jul - 16:38 (2017)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

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

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


Back to top
cmp


Offline

Joined: 08 Sep 2014
Posts: 185
Localisation: nord
Masculin Balance (23sep-22oct)
Point(s): 8
Moyenne de points: 0.04

PostPosted: Wed 5 Jul - 09:56 (2017)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

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


Back to top
Skype
cmp


Offline

Joined: 08 Sep 2014
Posts: 185
Localisation: nord
Masculin Balance (23sep-22oct)
Point(s): 8
Moyenne de points: 0.04

PostPosted: Wed 5 Jul - 10:09 (2017)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

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


Back to top
Skype
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Wed 5 Jul - 11:06 (2017)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

cmp wrote:
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 wrote:
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 wrote:






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


Last edited by Ast on Wed 5 Jul - 13:27 (2017); edited 1 time in total
Back to top
cmp


Offline

Joined: 08 Sep 2014
Posts: 185
Localisation: nord
Masculin Balance (23sep-22oct)
Point(s): 8
Moyenne de points: 0.04

PostPosted: Wed 5 Jul - 11:25 (2017)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

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


Back to top
Skype
roudoudou


Offline

Joined: 14 Jul 2016
Posts: 427
Localisation: LYON
Masculin
Point(s): 46
Moyenne de points: 0.11

PostPosted: Fri 21 Jul - 20:56 (2017)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

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


Back to top
Ast
Administrateur

Offline

Joined: 05 Sep 2014
Posts: 2,976
Masculin
Point(s): 389
Moyenne de points: 0.13

PostPosted: Wed 7 Aug - 11:17 (2019)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

Salut, 


j'ai mis à jour cet article avec quelques ajouts et surtout quelques couleurs qui permettent de remarquer tout de suite, les différences entre les modes #c1, #c2 et #c3.



J'aime bien tes macros Roudoudou !
_________________
Ast/iMP4CT

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


Back to top
Longshot


Offline

Joined: 21 Nov 2015
Posts: 93
Masculin
Point(s): 8
Moyenne de points: 0.09

PostPosted: Thu 8 Aug - 18:05 (2019)    Post subject: *****Programmation des Rom/Ram sur Cpc/Cpc Plus Reply with quote

Roud: Mon regard s'est attardé sur tes macros....
Ca a l'air dédié à l'Asic puisqu'il y a 2 outs GA.pour sélectionner et connecter une rom.

Quelques remarques
Ton bloc de test de l'Asic=ON devrait je pense être dans le case #0000.
Car Asic=ON avec Adresse=#8000 donne un Asic OFF...

Sauf si le CPC avait 8 modes graphiques, tu dois modifier "if {VideoMode}>7", car si VideoMode=7 tu déconnectes la rom Rolling Eyes

Enfin, sur les 2 macros pour la rom haute, si tu sélectionnes le no de rom physique avant de la commuter dans l'espace adressable, pourquoi ne pas le faire aussi sur l'autre macro ?

Sur ce sujet, sélectionner la rom avant de la commuter est-il pertinent ?

En effet, sauf à ce qu'une interruption tombe au milieu du code de la macro et soit définie pour appeler du code entre C000-FFFF, peu de chance que ça pose un quelconque problème.
On peut supposer que même avec une commutation après sélection, on appelle pas une routine sans savoir si l'interruption risque de survenir dans la ram ou la rom.


Back to top
Display posts from previous:   
Post new topic   Reply to topic    Amstrad Plus Forum Index -> Programmation Cpc -> Gate Array All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  

Index | Administration Panel | Create a forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group