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!
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?
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.
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
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"...
Vous n’êtes pas autorisé(e) à consulter les fichiers insérés à ce message.
Dernière édition par Xavier le 12 Déc 2014, 12:58, édité 1 fois.
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]
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?
Inscription : 13 Jan 2010, 14:25 Message(s) : 2270
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.
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 :
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à....
Inscription : 23 Juin 2013, 01:05 Message(s) : 438
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.
Chuis pas une tête en adressage mémoire, mais pour moi la syntaxe correcte est:
LOAD "dispdat.bin",&4000
_________________ "A L'HEURE OU BLANCHIT LA CAMPAGNE... (COURAGE, FUYONS !!!)"
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...
Copier/coller=
Dernière édition par Xavier le 12 Déc 2014, 21:23, édité 2 fois.
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 8 invité(s)
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas insérer de pièces jointes dans ce forum