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 

chargement de plusieurs écrans en mémoire

 
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
Sid


Hors ligne

Inscrit le: 01 Mai 2018
Messages: 58
Masculin
Point(s): 17
Moyenne de points: 0,29

MessagePosté le: Mer 9 Mai - 13:29 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire Répondre en citant

hello 
je bloque sur mon code, soit j'ai pas compris (c'est certainement ce cas la Wink), soit j'ai une coquille dans mon code.
Voila j'aimerai charger et stocker 4 écrans en mémoire du CPC. j'aimerai les mettre dans les banks 1,2,3 et 4.
Ensuite j'aimerai les faire afficher alternativement sur l'écran (adresse c000)
Bon j'arrive pas jusque la car je dois merder dans ma gestion de banks.
Voici le code, tout conseil et critique est bonne à prendre :

Code:

  org #4000
  nolist
  write "demo"
  jp main ; main function
;--------------------------------------------
initamsdos: ; initialisation de la rom 7 (usage du disque)
  ld hl,(#be7d); recup du numero de lecteur dans a
  ld a,(hl)
  push af
  ld c,7 ; init rom 7
  ld de,#40
  ld hl,#abff
  call #bcce
  pop af
  ld hl,(#be7d) ; restit du numero de lecteur
  ld (hl),a
  ret
;--------------------------------------------
openfile:
  call #bc77
  ld hl,#4000 ; adresse de debut du fichier
  call #bc83 ; read all content in memory
  call #bc7a ; close file
  ret 
;--------------------------------------------


switchbank:
  ld hl,#4000 ; out 7f00,&c4:ld hl,#4000:ld de,#8000:ld bc,#4000:ldir:out &7f00,&c0
  ld de,#8000 ; c4 = bank 1 | c5 = bank 2 | c6 = bank 3 | c7 = bank 4
  ld bc,#4000
  ldir
  ld bc,#7fc0
  out(c),c
  ret 


main:
  call initamsdos



  ; load and store file hypto1 in bank 1
  ld de,#8000 ; buffer
  ld b,finhypto1-hypto1
  ld hl,hypto1 ; nom du fichier a charger
  call openfile
  ld bc,#7fc4
  out (c),c
  call switchbank
 
  ; load and store file hypto2 in bank 2
  ld de,#8000 ; buffer
  ld b,finhypto2-hypto2
  ld hl,hypto2 ; nom du fichier a charger
  call openfile
  ld bc,#7fc5
  out (c),c
  call switchbank


  ; load and store file hypto3 in bank 3
  ld de,#8000 ; buffer
  ld b,finhypto3-hypto3
  ld hl,hypto3 ; nom du fichier a charger
  call openfile
  ld bc,#7fc6
  out (c),c
  call switchbank


  ; load and store file hypto4 in bank 4
  ld de,#8000 ; buffer
  ld b,finhypto4-hypto4
  ld hl,hypto4 ; nom du fichier a charger
  call openfile
  ld bc,#7fc7
  out (c),c
  call switchbank


  call waitkey
  ret 


waitkey:
  call #bb06
  ld h,0
  ld l,a


hypto1:
  db "hypto1.scr"
finhypto1


hypto2:
  db "hypto2.scr"
finhypto2


hypto3:
  db "hypto1.scr"
finhypto3


hypto4:
  db "hypto1.scr"
finhypto4


Revenir en haut
Publicité






MessagePosté le: Mer 9 Mai - 13:29 (2018)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 675
Masculin
Point(s): 64
Moyenne de points: 0,02

MessagePosté le: Mer 9 Mai - 14:31 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire Répondre en citant

1. Point A

Ta routine "switchbank" copie toujours le contenu de #4000 à #8000 ! Donc quoiqu'il en soit, tout ce que tu auras copié en bank sera copié en #8000

2. Point B

Code:

 ; load and store file hypto1 in bank 1
  ld de,#8000 ; buffer
  ld b,finhypto1-hypto1
  ld hl,hypto1 ; nom du fichier a charger
  call openfile
  ld bc,#7fc4
  out (c),c
  call switchbank


Il faut d'abord connecter la bank dans laquelle charger ton fichier, soit :

-Connecte Bank1 (#c4)
-Load Fichier

ce qui donnerait

Code:

 ; load and store file hypto1 in bank 1

 [b] ld bc,#7fc4
  out (c),c [/b]
  ld de,#8000 ; buffer
  ld b,finhypto1-hypto1
  ld hl,hypto1 ; nom du fichier a charger
  call openfile
 


3. Point C

Charge d'abord tous tes fichiers en bank, donc :

-Connecte Bank1 (#c4)
-Load Fichier
;
-Connecte Bank2 (#c5)
-Load Fichier
;
-Connecte Bank3 (#c6)
-Load Fichier
;
-Connecte Bank4 (#c7)
-Load Fichier
;
; Et reviens en bank 0 (#c0) pour poiuvoir continuer d'executer ton prog
;
-Connecte Bank0 (#c0)

3. Point D

Ensuite, tu copies le contenue de la bank où tu veux dans la Ram

Code:

ld bc,#7fc4 ; connecte bank1
out (c),c
ld hl,#4000 ; adresse de début
ld de,#c000 ; destination
ld bc,#3fff ; longueur
ldir ; transfère les données
...
etc...


En gros, cela signifie, on prends les données (en bank 1) à partir de #4000, que l'on copie en #c000, avec une longueur de #3fff.

3. Point G, le plus important de tous...

Je n'ai pas exactement saisi ce que tu voulais faire. Tu veux afficher 64 k de video ?
_________________
Ast/iMP4CT

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


Revenir en haut
Sid


Hors ligne

Inscrit le: 01 Mai 2018
Messages: 58
Masculin
Point(s): 17
Moyenne de points: 0,29

MessagePosté le: Mer 9 Mai - 14:49 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire Répondre en citant

réponse au point G : 
faire une animation avec les 4 écrans stockés dans les banks.
Peu être pas la bonne stratégie mais bon je tente.


Revenir en haut
roudoudou


Hors ligne

Inscrit le: 14 Juil 2016
Messages: 389
Localisation: LYON
Masculin
Point(s): 5
Moyenne de points: 0,01

MessagePosté le: Mer 9 Mai - 16:44 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire Répondre en citant

Tu as plus vite fait d'exécuter du code dans les banks et de mettre tes 4 écrans en mémoire basse. Commutation instantanée  Mr. Green

Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 87
Masculin
Point(s): 1
Moyenne de points: 0,01

MessagePosté le: Jeu 10 Mai - 12:09 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire Répondre en citant

Citation:
faire une animation avec les 4 écrans stockés dans les banks.
Peu être pas la bonne stratégie mais bon je tente.


Pourquoi ne te sers tu pas de la réponse faite ici, puisque tu avais déjà posé la question ?
http://www.cpcwiki.eu/forum/programming/switching-screen-bank-strategy/

Tu y trouveras un source qui te permet de switcher le cpc sur la ram secondaire.

Dis autrement les 64k de ram centrale sont copiés dans les 64k complémentaires (les 4 "banques"), et les deux rams sont "permutées"

Ainsi, le système continue de fonctionner comme avant, et tu pourras même animer tes 4 écrans en basic.

Tu travailleras en "aveugle"  car tu ne verras plus ton curseur ou le résultat d'un print car le basic tape dans C000-FFFF de la ram complémentaire (bank 4)
(Les données affichées par CRTC-GA proviennent de C000-FFFF de la ram centrale)
Après tu n'auras que 1+4 OUT à faire en basic pour faire permuter les pages.
out &bc00,12
et après en boucle out &bd00, page (00,&10,&20,&30)


Revenir en haut
Sid


Hors ligne

Inscrit le: 01 Mai 2018
Messages: 58
Masculin
Point(s): 17
Moyenne de points: 0,29

MessagePosté le: Jeu 10 Mai - 15:25 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire Répondre en citant

Merci Longshot je n'avais pas vu que tu aurais répondu. 
Merci pour l'exemple clair😉 
Je vous tiens au jus. 


Merci encore pour vos réponses. 


Revenir en haut
Sid


Hors ligne

Inscrit le: 01 Mai 2018
Messages: 58
Masculin
Point(s): 17
Moyenne de points: 0,29

MessagePosté le: Ven 11 Mai - 11:51 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire Répondre en citant

Merci Longshot et Ast,
je viens enfin de finaliser mon flip.
Petite question quand même, la suppression des interruptions c'est pour ne pas perturber le gate array ?
Doit on doit le faire à chaque fois que l'on utilise le gate array ou le crtc ?


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 675
Masculin
Point(s): 64
Moyenne de points: 0,02

MessagePosté le: Ven 11 Mai - 11:57 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire Répondre en citant

Sid a écrit:
Merci Longshot et Ast,
je viens enfin de finaliser mon flip.
Petite question quand même, la suppression des interruptions c'est pour ne pas perturber le gate array ?


La suppression des interruptions dans le programme de Longshot, c'est simplement parce qu'il utilise Exx et pour éviter qu'une int vienne perturber sa routine.

Citation:

Doit on doit le faire à chaque fois que l'on utilise le gate array ou le crtc ?

pas forcément, quoique, si tu veux faire un raster et utiliser toute la hauteur de l'écran, tu n'auras pas le choix. Idem pour des écrans en rv.
_________________
Ast/iMP4CT

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


Revenir en haut
Longshot


Hors ligne

Inscrit le: 21 Nov 2015
Messages: 87
Masculin
Point(s): 1
Moyenne de points: 0,01

MessagePosté le: Ven 11 Mai - 13:49 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire Répondre en citant

Citation:
Petite question quand même, la suppression des interruptions c'est pour ne pas perturber le gate array ?


Il faut juste que tu te dises que les interruptions (au nombre de 6 par frame) sont utilisées par le basic.

Le système utilise une partie de la ram (en bas entre 00 et 3C et entre A600 et BFFF environ (les puristes corrigeront))
Le système utilise aussi les registres "secondaires" du Z80A auquel tu accèdes avec EXX (qui change juste le bit d'un pointeur sur les registres dans le Z80A)

Donc si tu manipules la mémoire ou que tu modifies ces registres secondaires, et si tu as décider de "conserver" le système, il faut empêcher les interruptions ET remettre la mémoire et les registres dans l'état où tu les as trouvés avant de ré-autoriser les interruptions.

Le code du switch64 n'utilise pas EXX. Donc ce n'est pas la raison du DI.
Lorsque tu copies les 64k de ram vers les 64k de ram supplémentaire, tu copies la zone 8000-BFFF vers la "banque 3" grâce à un LDIR
Pendant ce LDIR si une interruption se produit, ça va potentiellement modifier le contenu géré par le système entre A600-BFFF, ou se trouve également la pile, et que le LDIR est en train de recopier (donc la donnée copiée a pu être mise à jour par le système).
Tu pourrais donc avoir un écart entre ce qui est en ram centrale et en ram supplémentaire.

Citation:
Doit on doit le faire à chaque fois que l'on utilise le gate array ou le crtc ?

Absolument pas. Les interruptions c'est juste l'appel d'une sous routine "asynchrone".
Tout dépend donc de ce que fait ta routine. Si elle modifie la ram, des registres du z80a ou ceux d'un coprocesseur, il faut juste que tu en tiennes compte.
Si tu laisses en place la routine d'interruption du système en place (&38 JP &B941) elle risque de modifier les registres d'index ou les valeurs des circuits (gate array, crtc, ppi,...) et c'est donc à éviter (tu ne pourras pas changer les couleurs, car elles seront réinitialisées par le système par exemple).

Montre nous tes exploits une fois fini!


Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 07:47 (2018)    Sujet du message: chargement de plusieurs écrans en mémoire

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