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

demande d'aide sur Basic (problème mémoire)
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=6438
Page 1 sur 1

Auteur :  garvalf [ 20 Déc 2020, 23:00 ]
Sujet du message :  demande d'aide sur Basic (problème mémoire)

bonjour,

je ne connais pas grand chose en programmation basic et en hardware amstrad, mais j'aimerais pouvoir sortir un petit jeu d'aventure en mode texte, avec image + musique d'intro.
J'ai image + musique d'un côté, le jeu en basic de l'autre, ça fonctionne séparément, mais lorsque j'ai les 2 ensemble ça fait des conflits de mémoire.

La musique est réalisée avec arkos. J'ai un loader de ce type :


Code :
10 MEMORY &3FFF
20 LOAD "PLAYMUS.BIN",&4000
35 MODE 0:ink 0,0:ink 1,23:ink 2,21:ink 3,13:ink 4,10:ink 5,25 :ink 6,26:ink 7,15:ink 8,0:ink 9,0:ink 10,0:ink 11,0:ink 12,0:ink 13,0:ink 14,0:ink 15,0
36 load"IMAGE.SCR",&C000
40 call &4000   'initialize the music.
50 call &bd19:call &4003   'plays one frame of the music, at 50hz.
60 if inkey(47)<>0 then 50  'loops as long as space is not pressed.
70 call &4006   'stops the music.


Si je rajoute ensuite du code en basic (truc assez simple avec des goto), ça fonctionne s'il n'y en a pas trop, mais au bout d'un moment, ça indique :

Code :
 Memory full in 10


à l'adresse MEMORY &3FFF justement.
Comment faire pour concilier le code et la musique ? Je ne sais pas où va se loger le code basic en mémoire. Est-ce que c'est avant 3FFF et qu'il faut donc augmenter vers 4FFF ? J'ai essayé et je n'ai toujours pas assez de mémoire (même erreur). Si je passe à 5FFF ça dit juste memory full. Quelles sont les limites ? Est-ce qu'il faut que j'essaye de caler la musique ailleurs que sur 4000 ? J'ai essayé 2000, j'ai essayé plus que 4000 mais je bloque, je n'arrive pas à ajuster correctement. Merci de votre aide :sweatingbullets:

Auteur :  Nemo59 [ 20 Déc 2020, 23:24 ]
Sujet du message :  Re: demande d'aide sur Basic (problème mémoire)

Bonsoir,

Le « memory 3fff » réduit considérablement la place mémoire qui reste pour ton programme basic. Si les deux parties sont totalement indépendantes le plus plus simple est de finir ta première partie (intro et musique) par un RUN « nom programme » de ta seconde partie en libérant la mémoire pour la musique qui ne servira plus si j’ai bien compris.

Pour reprendre ton exemple tu peux essayer d’ajouter ces 2 lignes basic:

5 m=himem

80 memory m : run « aventure »

Auteur :  markerror [ 21 Déc 2020, 09:32 ]
Sujet du message :  Re: demande d'aide sur Basic (problème mémoire)

Bonjour,

Normalement, quand on mixe du Basic avec du code assembleur (routines appelées par des CALL, musique, RSX, etc... ), on implante des données le plus haut possible dans la mémoire allouée au Basic (Himem vqut &A67B sur un CPC standard avec lecteur de disquette).

En fonction de la taille de la musique, il faut faire un petit calcul (&A67B - taille musique) et arrondir à une valeur "simple" en dessous.
Si ta musique occupe par exemple &1200 octets (ce qui est déjà conséquent), ça nous fera &A67B-&1200=&957B.

A noter qu'il est prudent de réserver une plage de mémoire en dessous de &A67B pour être compatible avec les machines équipées de roms supplémentaires (ces dernières réservent de la mémoire). Il n'y a pas de valeur étalon, mais &A4FF par exemple devrait faire l'affaire (ça laisse 379 octets libre, ce qui est déjà pas mal).

Bon bricolage :-).

Auteur :  garvalf [ 21 Déc 2020, 11:39 ]
Sujet du message :  Re: demande d'aide sur Basic (problème mémoire)

super ! :winner:

merci à vous 2, ça fonctionne avec les 2 pistes.

Pour la mémoire, si j'utilise

Code :
10 MEMORY &7FFF
20 LOAD "PLAYMUS.BIN",&8000


ça met le chargement de la musique plus haut en mémoire. Sur un programme en basic, ça passe, sur un autre, ça bloque. Reste à voir si avec une routine musicale plus longue, la mémoire que ça laisse. Sur une autre musique, à la compilation ça prend plus de &1000 octets.
Par contre si on met tout dans le même fichier, ça rend l'ensemble assez long à charger (plus de 30 secondes sur l'émulateur)

l'idéal aussi serait d'arriver à charger le jeu pendant l'affichage de l'image et la diffusion de la musique.

Pour le coup d'appeler un RUN depuis le programme basic, c'est tellement évident que je n'y avais même pas pensé !

J'ai essayé de rajouter ton code avec m=himem puis à la fin d'appeler memory m : run"programme

ça fonctionne bien avec un programme basic, sur un autre ça bloque, du coup j'imagine que ça ne doit pas libérer toute la mémoire, j'ai peut-être manqué un truc ?

je vais aller lire https://www.cpcwiki.eu/forum/programmin ... ming-tips/ pour en apprendre un peu plus sur la gestion mémoire.

ça me fait penser que je voulais utiliser un système pour la génération automatisée de "livre dont vous êtes le héros", ça fonctionne en html et dans d'autres langages, et j'étais un peu coincé pour le basic avec la numérotation de lignes. Mais vu que l'on peut appeler d'autres programmes depuis un programme basic, ça pourrait être une solution (au prix d'un temps de chargement un peu plus long entre 2 commandes)

Auteur :  Longshot [ 21 Déc 2020, 13:41 ]
Sujet du message :  Re: demande d'aide sur Basic (problème mémoire)

Salut,

Si tu décides de faire ton jeu sur un 6128 tu peux aussi faire ça...

Chargement de ta musique:
20 OUT &7F00,&C1: LOAD "PLAYMUS.BIN",&C000: OUT &7F00,&C0

Idem pour la jouer:
40 OUT &7F00,&C1:call &C000 'initialize the music.
50 call &bd19:call &C003 'plays one frame of the music, at 50hz.
60 if inkey(47)<>0 then 50 'loops as long as space is not pressed.
70 call &C006: OUT &7F00,&C0 'stops the music.

Tu n'as plus de HIMEM à faire, et tu ne perds plus un seul octet en BASIC...

Auteur :  garvalf [ 21 Déc 2020, 23:15 ]
Sujet du message :  Re: demande d'aide sur Basic (problème mémoire)

j'ai essayé ce dernier code, mais ça ne charge rien du tout (ça recharge la séquence de boot on dirait). J'ai modifié l'adresse de la musique pour la mettre à 8000, peut-être que c'est ça.

J'ai essayé d'adapter :

Code :
20 OUT &7F00,&C1: LOAD "PLAYMUS.BIN",&8000: OUT &7F00,&C0
40 OUT &7F00,&C1:call &8000 'initialize the music.
50 call &bd19:call &8003 'plays one frame of the music, at 50hz.
60 if inkey(47)<>0 then 50 'loops as long as space is not pressed.
70 call &C006: OUT &7F00,&C0 'stops the music.
80 run"quest



j'ai publié les exemples sur github : https://github.com/farvardin/8bit_music ... os_exports (pour amstrad et z spectrum)

Auteur :  Longshot [ 22 Déc 2020, 00:54 ]
Sujet du message :  Re: demande d'aide sur Basic (problème mémoire)

Je ne sais pas si le player de musique est auto-relogeable.
J'ai supposé que oui, car un coup, tu l'as chargé en &4000, et ensuite en &8000.
Si ce n'est pas le cas, il faut l'assembler pour qu'il fonctionne en &C000.

Pour l'explication technique, le "OUT &7F00,&C1" connecte entre &C000 et &FFFF une zone de 16k présente dans la ram additionnelle.
Tout ce que tu mets dans cette zone n'affecte plus l'écran mais cette mémoire.
Lorsque tu fais "OUT &7F00,&C0", tu déconnectes cette page.

5 MODE 0:ink 0,0:ink 1,23:ink 2,21:ink 3,13:ink 4,10:ink 5,25 :ink 6,26:ink 7,15:ink 8,0:ink 9,0:ink 10,0:ink 11,0:ink 12,0:ink 13,0:ink 14,0:ink 15,0
10 load"IMAGE.SCR",&C000
20 OUT &7F00,&C1: LOAD "PLAYMUS.BIN",&C000
40 call &C000 'initialize the music.
50 call &bd19:call &C003 'plays one frame of the music, at 50hz.
60 if inkey(47)<>0 then 50 'loops as long as space is not pressed.
70 call &C006:OUT &7F00,&C0 'stops the music

Auteur :  markerror [ 22 Déc 2020, 09:06 ]
Sujet du message :  Re: demande d'aide sur Basic (problème mémoire)

Bonjour,

Les players de Starkos ou Arkos tracker ne sont pas relogeables, il faut les recompiler pour les faire fonctionner en &C000. La technique de sioux de Longshot devrait alors fonctionner :-). Après, ça limite la diffusion de ton programme aux machines ayant 128ko (ou alors, il faut faire un test pour ne pas utiliser de musique si c'est lancé sur une machine 64ko).

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