CPC Rulez
https://cpcrulez.fr/forum/

[RESOLU] Problème mémoire et radotages!
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=5378
Page 1 sur 2

Auteur :  Xavier [ 12 Déc 2014, 07:51 ]
Sujet du message :  [RESOLU] Problème mémoire et radotages!

Salut,
Mes excuses pour cette question, qui semble redondante et déjà documentée...
Mais, j'ai besoin d'une nouvelle approche sur mon problème afin de continuer mon projet!

J'ai donc en projet d'adapter un jeu d'aventure en Basic.
Il s'agit de "Transylvania", déjà adapté pour Exel...
On en parle ici :http://forum.system-cfg.com/viewtopic.php?f=25&t=4549&start=90

Ce jeu fait dans les 20k, mais il charge une quantité impressionnante de données en variables.
Le jeu original semble utiliser une mémoire ... qui me manque cruellement sur une adaptation sur un CPC464 classique.
Il me faut donc utiliser (en partie) la mémoire étendue du 6128.
Avant même de "rêver" utiliser des méthodes de maquillage cosmétique!

Donc, pour faire maigrir le programme Basic, j'ai exporté le texte vers de l'assembleur.
En h8000 et h9E0B ... mais, un MEMORY &7FFF me coupe le programme Basic...
(Il traite toutes les conditions de déplacement, et de texte...)

Est-il possible de commuter les appels CALL Basic vers la RAM miroir de la banque?
Afin de lancer les programmes ASM depuis le basic...
Tout en restant avec un programme Basic supérieur à 16k (>h7FFF limite de banque!).
Sinon, Est-il possible de faire migrer ces routines en miroir de hC000 pour éviter l'effacement des données Basic lors du Swap de banque?

Code :
programme|  ASM:
Basic:   |
h4000    |  h8000
h9FFF    |  h9E0B
---------| ------
hA000 RSX|
hC000    |  SP GR


Soit :
* h4000-h9FFF : Programme Basic.
* hA000-RSX : RSX GRAPHIQUE "Super-Sprite" (CALL &A000)
* h8000-h9E0A : Routine affichage de réponses.(CALL &8000)
* h9E0B : Routine affichage de lieux. (CALL &9E0B)
* hC000 : Routine affichage des scènes GFX. (CALL &C000 miroir)
(programmes d'affichage GFX de 16x14 caractères stockés en mémoire vidéo banque miroir)

Merci de votre aide, car je ne sais plus où mettre mes routines ASM !!!

Auteur :  TotO [ 12 Déc 2014, 10:25 ]
Sujet du message :  Re: Problème mémoire et radotages!

Bonjour Xavier,

J'ai posté hier un programme BASIC qui permet de détecter la quantité de RAM sur un CPC.
viewtopic.php?f=2&t=5361#p27519

Tu peux t'en inspirer pour utiliser les 64K suplémentaires du 6128 (modes C0 et C4 à C7) et stocker tes données en &4000. C'est la façon la plus simple et la plus courante d'exploirer une extension RAM sur CPC.

J'espère que ça te sera utile. :)

Auteur :  demoniakparadox [ 12 Déc 2014, 11:51 ]
Sujet du message :  Re: Problème mémoire et radotages!

Pour résumer l'adressage mémoire du CPC 6128 :

Code :
                                    Numéro "bank" (out &7F00,xx)
               C0            C1            C2            C3            C4            C5            C6            C7
Adr Z80                                    Adr "logique"                     
0000-3FFF   00000-03FFF   00000-03FFF   10000-13FFF   00000-03FFF   00000-03FFF   00000-03FFF   00000-03FFF   00000-03FFF
4000-7FFF   04000-07FFF   04000-07FFF   14000-17FFF   0C000-0FFFF   10000-13FFF   14000-17FFF   18000-1BFFF   1C000-1FFFF
8000-BFFF   08000-0BFFF   08000-0BFFF   18000-1BFFF   08000-0BFFF   08000-0BFFF   08000-0BFFF   08000-0BFFF   08000-0BFFF
C000-FFFF   0C000-0FFFF   1C000-1FFFF   1C000-1FFFF   1C000-1FFFF   0C000-0FFFF   0C000-0FFFF   0C000-0FFFF   0C000-0FFFF

Auteur :  Xavier [ 12 Déc 2014, 12:42 ]
Sujet du message :  Re: Problème mémoire et radotages!

Salut,
Pièce jointe :
ram.jpg


Donc, 64 k sur le Gate-Array et 64 K en CPU ?
Ou 64k et pas 128k?
ça expliquerait que la banque ne soit pas active...
Car l'émulateur n'est pas configuré avec la bonne ram...
Sur WinApe, le débogeur n'indique que les 64k, sauf en "any" ou l'on peut modifier la banque mémoire.

Mon exemple:
Dans le code suivant, je lis à l'écran des datas texte.
Sans l'appel en rom, car j'y ajoute des balises CRLF et un bit7 de validation au lieu de &00.
Donc, je mets ça en h8000 (ou plus haut...) et les datas en &4000 (16k); sur le miroir basic!
J'ai du louper un truc au niveau des substitutions et activations mémoire!
Un LD HL,(h8000) correspond bien à deux valeurs sur la partie 64K basse et 64k haute?
;* zone &4000-&7FFF I r1=&C1 I e1=&C5
LD HL,(h8000) et LD HL,(h8000+64k)
Ou bien le GA repositionne les banques dans tout les sens... ça m'a traversé l'esprits !!! Désolé...

Code :
;* BLOC
WRITE "ROOMDISP.BIN"

;* MEMORY BANK               I bank etendue
;* zone &0000-&3FFF I r0=&C0 I e0=&C4
;* zone &4000-&7FFF I r1=&C1 I e1=&C5
;* zone &8000-&BFFF I r2=&C2 I e2=&C6
;* zone &C000-&FFFF I r3=&C3 I e3=&C7

;*LD H,&00
;*LD L,&00
;*CALL &BB75      ; CURSOR POSITION @ (L,H)

ORG &9EB0
   DI
   CALL RES_RET
   CALL DISPLAY_REP
   EI
RET_TAG1
   NOP ; or RET if no key.
   CALL RES_RET
   CALL &BB00
   CALL &BB06
   CALL &BB00
   RET
RES_RET
   EX af,af'
   XOR A      ; A=0
   ld (RET_TAG1),A
   ld (RET_TAG2),A
   EX af,af'
   RET

DISPLAY_REP
   CP &2
        JR nz,no_key
   ld A,&C9
   ld (RET_TAG1),A
   ld (RET_TAG2),A
no_key
       LD b,(IX+&0)
       ld hl,TXT_DATAS
   inc b
   
SCAN_LOOP
   bit 7,(HL)
   inc HL
   jr z,SCAN_LOOP
   DJNZ SCAN_LOOP


loop_imp_cadena
      ld a,(hl)
      cp &7C
      jr z,new_line
      AND &7F
ret_nl
            call &bb5a
      BIT 7,(hl) ;  b7 TEST
      jr nz,exit_loop_imp_cadena

      inc hl
      jr loop_imp_cadena

exit_loop_imp_cadena

RET_TAG2   NOP ; or RET if no key.
           ld A,&C9
           ld (RET_TAG2),A
             ld hl,TXT_DATAS+1
      JR loop_imp_cadena

new_line
      ld a,&0d   ; para terminar hace un salto de línea
      call &bb5a
      ld a,&0a
      jr ret_nl
TXT_DATAS   
          ret
db &0d,&0a,&0d,&0a,"< PRESS A KEY ",&BE

db "facing an ancient stump covered with faint writin","g" or 128
db "standing near a broken horse|wago","n" or 128
db "in a dark area of the fores","t" or 128


Certains commentaires ont honteusement étaient copier "As IS"...

Auteur :  Xavier [ 12 Déc 2014, 12:54 ]
Sujet du message :  Re: Problème mémoire et radotages!

Mais, PC pointe dans quelle banque dans ce cas?
:oops:
OUT >>> Banque DATA
NOP ||| LD a,(HL)
NOP...NOP....NOP ||| <<< OUT banque CPU
on continue le programme sur la banque CPU ?
Donc, dans ce cas, il faut prévoir un retour sur la banque miroir en vis à vis ?
Dois-je embaucher un comptable pour tous ces problèmes bancaires?

[EDIT]
*on continue le programme sur la banque CPU ?
J'ai la fâcheuse habitude de répondre à mes propres questions ... dans mes messages.
Donc, le PC reste à la même adresse, si le contenu de la ram change, les mnémoniques suivantes sont modifiées.
*Donc, dans ce cas, il faut prévoir un retour sur la banque miroir en vis à vis ?
Bhen, pas si c'est une banque différente!
[/EDIT]

Auteur :  Xavier [ 12 Déc 2014, 14:32 ]
Sujet du message :  Re: Problème mémoire et radotages!

????
Code :
60 OUT &7F00,&C0:POKE &4000,&EE:OUT &7F00,&C0:vga=PEEK(&4000)

Faut-il basculer le gate-array à chaque lecture/écriture?
Apparemment, c'est le cas!!!
ça expliquerait la disparition des infos dans mon programme!
C'est le basic ou une bascule hard au niveau CSram?

Auteur :  TotO [ 12 Déc 2014, 15:52 ]
Sujet du message :  Re: Problème mémoire et radotages!

Non, il faut juste s'assurer de faire un OUT &7F00,&C0 avant de rendre la main au BASIC.
La ligne 60 et 70 de mon programme sont la par principe, mais ne servent pas à grand chose vu que tous les CPC on au moins 64K de RAM en C0.

En gros, &C0 pointe sur les 16K en &4000-&7FFF internes à tous CPC.
&C4, &C5, &C6, &C7 correspondes au 4x16K des 64K du 6128 sur cette même plage d'adresses.

Du coup, il faut voir le 6128 comme utilisant 48K fixes + 5x16K interchangeables.
C'est donc ici que tu vas stocker tout ce qui te prends de la place mais que tu n'es pas obligé d'avoir en même temps.
(si une portion est obligatoirement fixe, il faudra la dupliquer 5 fois)

En suite, via un OUT à adresse &7F00 tu choisis simplement quelle page tu utilises.

Auteur :  Xavier [ 12 Déc 2014, 17:43 ]
Sujet du message :  Re: Problème mémoire et radotages!

C'est OK!
Je fais les modifs dans mes routines, pour libérer les 8K... et envoyer les datas en h4000.

Auteur :  Xavier [ 12 Déc 2014, 19:06 ]
Sujet du message :  Re: Problème mémoire et radotages!

Donc,
1 MODE 1: MEMORY &9FFF
4 LOAD "disp.bin",&A000:BORDER 6:OUT &7F00,&C5:LOAD "dispdat.bin":',&4000

Me fait un "memory full" sur le chargement en &4000... au dessous du RAMtop!
C'est bête, je réservais &C3 pour les routines d'affichage!

En modifiant ainsi?
1 MODE 1:OUT &7F00,&C5:LOAD "dispdat.bin": MEMORY &9FFF:LOAD "disp.bin",&A000

dispdat.bin=data à afficher.
disp.bin=ASM de lecture Datas.

[EDIT]Nan! Memory foool... même chose.[/EDIT]

Auteur :  Subaru [ 12 Déc 2014, 19:14 ]
Sujet du message :  Re: Problème mémoire et radotages!

Xavier a écrit :
Donc,
1 MODE 1: MEMORY &9FFF
4 LOAD "disp.bin",&A000:BORDER 6:OUT &7F00,&C5:LOAD "dispdat.bin":',&4000

Me fait un "memory full" sur le chargement en &4000... au dessous du RAMtop!
C'est bête, je réservais &C3 pour les routines d'affichage!
...


Pourquoi ya un :' aprés ton load ????

Citer :
LOAD "dispdat.bin":',&4000

Auteur :  AsT [ 12 Déc 2014, 19:50 ]
Sujet du message :  Re: Problème mémoire et radotages!

Mis à part, l'erreur que souligne notre charmante Subaru, quand tu charges un fichier en #4000, un memory #3fff est nécessaire.
Ton loader donne donc :
Code :
10 mode 1:memory &3fff
20 out&7fc5:load"dispdat.bin",&4000
30 load"disp.bin",&a000

Auteur :  Xavier [ 12 Déc 2014, 20:30 ]
Sujet du message :  Re: Problème mémoire et radotages!

@Subaru
Citer :
Pourquoi ya un :' aprés ton load ????

Curiosité du Basic ferroviaire !
10 ' ****** REM *******
20 ?"***PRINT*****"

A noter:
20 ?"***PRINT*****" ' affichage.
Fonctionne.
20 ?"***PRINT*****" REM affichage.
Ne fonctionne pas sans les deux points.
20 ?"***PRINT*****" ? "affichage"
Ne fonctionne pas.

Cette fonction REM :" ' " ne fait pas gagner de place mémoire car codée sur 2 octets
Alors que la fonction REM, l'est sur un seul.

Donc, pour être "Faire-play" avec Subaru...
Il y a effectivement une erreur : [ LOAD"truc" ' ,&4000 ] aurai suffit (je gagne un octet!)
Bien vu et bien joué!


@AsT
Citer :
Mis à part, l'erreur que souligne notre charmante Subaru, quand tu charges un fichier en #4000, un memory #3fff est nécessaire.

Oui, mais mon programme Basic fait 20k sans les variables d'exécution.
Et le "OUT &7F00,&C5:" change la banque mémoire vers l'adressage h14000 de la mémoire paginée du CPC6128. Donc, sur ce coup là, le basic ne voie pas la différence entre &4000 et &14000 ... Pas bon.
Avec un &3FFF, je perds la suite du programme Basic... et j'ai fait le teste du OPENOUT"D":MEMORY&3FF:CLOSEOUT... mais pas de possibilité de réinitialiser le MEMORY!
(Merci pour les liens vers CPClive!)
Donc, walà....

Auteur :  AsT [ 12 Déc 2014, 20:53 ]
Sujet du message :  Re: Problème mémoire et radotages!

Après tu peux faire un

Out &7f00,&c1: load"dispdat.bin",&c000:Out &7f00,&c0
Mais le fichier sera chargé dans la Bank c7 et non c5....

Voilà.

Auteur :  Subaru [ 12 Déc 2014, 20:56 ]
Sujet du message :  Re: Problème mémoire et radotages!

Xavier a écrit :
@Subaru
Citer :
Pourquoi ya un :' aprés ton load ????

Curiosité du Basic ferroviaire !
10 ' ****** REM *******
20 ?"***PRINT*****"

A noter:
20 ?"***PRINT*****" ' affichage.
Fonctionne.
20 ?"***PRINT*****" REM affichage.
Ne fonctionne pas sans les deux points.
20 ?"***PRINT*****" ? "affichage"
Ne fonctionne pas.

Cette fonction REM :" ' " ne fait pas gagner de place mémoire car codée sur 2 octets
Alors que la fonction REM, l'est sur un seul.

Donc, pour être "Faire-play" avec Subaru...
Il y a effectivement une erreur : [ LOAD"truc" ' ,&4000 ] aurai suffit (je gagne un octet!)
Bien vu et bien joué!


En fait, c'est surtout que si tu fous un ":" et/ou un " ' "aprés ton load, bah... ton adressage "&4000" passe à la trappe. Image

Chuis pas une tête en adressage mémoire, mais pour moi la syntaxe correcte est:

LOAD "dispdat.bin",&4000

Image

Auteur :  Xavier [ 12 Déc 2014, 21:02 ]
Sujet du message :  Re: Problème mémoire et radotages!

Tu me fous le cafard!
ça va finir par un jeu sans texte et sans dessins...
Le &1C000 je le réservais pour les données graphiques.
Je peux essayer de faire un tampon en 1C000 et faire un LDIR vers le 4000, au nez et à la barbe du basic!
Je vais faire le test...

@Subaru
J'ai déjà donné l'offset &4000 à l'enregistrement, donc nul besoin de le réorienté.
Non, le chtruc d'après le "load" est un reliquat de test... :oops:

Copier/coller= :pig:

Page 1 sur 2 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/