1

j'essaye d'écrire directement dans la mémoire flash de la calculatrice mais je me prends plein de "Address Error" dans la figure. Ils ont lieu au niveau du premier EM_write.
J'ai essayé en écrivant les headers à partir de flash_fp au lieu de flash_fp - 22 mais ça change rien.
voici le code que j'utilise:

char save_game_to_flash(void){
	
	unsigned long game_size = get_game_size();//get file size
	
	void *flash_fp;
	//unsigned long offset;
	char c;
	char *str;
	
	clrscr();
	printf("\n\nwriting to flash\nEXPERIMENTAL\npress ENTER to proceed\n");
	if(ngetchx()!=KEY_ENTER) return 0;
	
	flash_fp = EM_findEmptySlot(game_size);
	if(flash_fp == NULL){
		EM_GC(FALSE); //garbadge collect without confirmation dialog
		if(flash_fp == NULL){
			return 0;//FAILURE
		}
	}
	
	str = (char *)malloc(9 * sizeof(char));
	
	c = -32;
	EM_write(&c, flash_fp - 22, sizeof(char));
	
	sprintf(str,"main%c",0);
	EM_write(str, flash_fp + FLASH_HEADER_SIZE - 21, 8*sizeof(char));
	
	sprintf(str,"filename%c",0);
	EM_write(str, flash_fp + FLASH_HEADER_SIZE - 13, 8*sizeof(char));
	
	c = 0;
	EM_write(&c, flash_fp + FLASH_HEADER_SIZE - 5, sizeof(char));
	
	game_size = (unsigned long)1<<31 | (game_size + 1);
	EM_write(&game_size, flash_fp + FLASH_HEADER_SIZE - 1, sizeof(unsigned long));
	
	game_size = get_game_size(); //restore value
	
	//do your stuff
	
	
	free(str);

	return 1;
}


si quelqu'un a une idée...

2

C'est pas plus simple de créer un fichier RAM puis de l'archiver ? (EM_moveSymToExtMem)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

3

en fait, je me suis interessé à cette méthode parceque ma RAM est un peu bondée lorsque j'ai besoin de cette fonction. Ce serait faisable mais bon, ça m'amuse de voir comment cette méthode plus low level marche.

sinon, pour info, j'utilise AMS 2.00 et plus . (les header sont différent par rapport à 1.**)

4

en fait, je me suis interessé à cette méthode parceque ma RAM est un peu bondée lorsque j'ai besoin de cette fonction

Tu as bcp de choses à sauvegarder? Si c'est le cas, tu peux éventuellement envisager de créer un fichier de sauvegarde et de bosser sur le fichier de sauvegarde lui-même, comme ça ça ne te boufferait pas de RAM supplémentaire. Sinon, pas la peine de se faire chier avec ça cheeky (le surcoût de code engendré par l'écriture en Flash dépasserait le gain de RAM que tu pourrais avoir)


Et si tu tiens qd même à faire directement ça en Flash, je peux pas trop t'aider (pas la doc sous la main).

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

5

(et je présume aussi que c'est totalement incompatible avec Pedrom)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

6

d'accord ... je pose une question et on me répond en disant que ça sert à rien. (ce qui est sans doute vrai smile )
enfin, j'aimerai quand même savoir comment faire même si c'est pas propre, goret en RAM (quoique 20000 bytes ça commence à faire beaucoup) et pas du C std.
si quelqu'un à quand même une réponse constuctive, feel free to post...

7

dionoea :
d'accord ... je pose une question et on me répond en disant que ça sert à rien. (ce qui est sans doute vrai smile )

Pour ce qui est de répondre à la question, je t'ai dit que je ne pouvais pas, pas la peine de s'énerver cheeky (et je ne prétends pas avoir répondu à ta question, je te préviens juste que tu risques de t'en vouloir après)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

8

dionoea> Tu aurais plus de chances avec FL_write que EM_write... grin (cf. doc de TIGCC) En revanche,le reste m'a l'air correct bien que je n'ai pas regardé en détail (mais tout laisse supposer que tu sais ce que tu fais smile)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

9

j'ai aussi essayé avec FL_write mais ça ne change rien. enfin, c pas grave, je vais laisser tomber et utiliser la solution plus pratique d'écrire directement dans la RAM puis archiver le fichier.
les idées sont quand même bienvenues

10

l'écriture en flash, c le bordel...
on m'avait dit, dans le temps, qu'on ne peut écrire en flash que pour DIMINUER la valeur des octets...
au garbage collection, les octets de flash sont mis à 0xFF... et ensuite, la seule chose qu'on puisse faire, c diminuer leur valeur, mais pas la monter (la seule façon de monter est un garbage collection, qui remettre le secteur à 0xFF)
enfin, c ce qu'on m'avait dit dans le temps.... me semble que j'avais vérifié en testant, en plus, et que ct pas faux (enfin, ça date, aussi)

pr les adresse error, ça serait pas un pb d'écriture de mot / mot long à une adresse impaire ?
(c souvent pr ça, l'adress error...)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

11

on a pas le droit d'écrire dans une adresse impaire ?!?

12

squale92>c ça en effet, mais ça ne dérange pas vraiment pour ce qu'il veut faire
En ce qui concerne les addresses impaires, en effet, d'après mes souvenirs, c'est possible (grin) que les routines d'écriture en flash n'acceptent que les word (dont par conséquent les addresses paires), mais faudrait que je revérifie
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

13

Je connais pas assez le C pour bien relire to code, mais je crois comprendre que t'écris bien un header avec nom de fichier et de répertoire.
Le -32 me semble incorrect pour le premier truc : les valeurs valides sont 0xFFFF; 0xFFFE, 0xFFFC, 0xFFE0 et 0xFFC0 ainsi que 0xFFFA (je suis pas sûr de la dernière).
Tout ça sera effacé au prochain GC ! Pour qu'un truc ne soit pas effacé après un garbage collector, faut que le header commence par 0xFFE0 ou 0xFFFE (à moins que ce soit 0xFFC0 et 0xFFFC) ET qu'il corresponde à un handle valide. Et tu peux pas t'approprier proprement un handle en flash.
Tes adresses sont effectivement incorrectes, faut qu'elles soient paires.
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

14

on a pas le droit d'écrire dans une adresse impaire ?!?

A une adresse impaire, on ne peut écrire que un seul octet à la fois
(char, ou unsigned char)
si on veut écire plus d'un octet à la fois (short, int, long), il faut que ce soit à une adresse paire.
c'est le processeur qui veut ça.

avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

15

... et surtout, en Flash, on ne peut écrire que par mots. Si la fonction de l'AMS ne gère pas ça, alors il suffira que tu paddes de part et d'autre avec des 0xFF (pas des 0 !) pour avoir une taille paire et le bon alignement.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

16

Est-ce vraiment nécéssaire de remplir avec des 0xFF ? Si l'AMS traîte les bloc par tailles paires, ça ne doit pas vraiment déranger et pour le reste, à moins que le programmeur veuille écrire les données octet par octet (mais c'est tellement lent que ça n'a strictement aucun intérêt smile), je ne vois pas trop pourquoi c'est nécéssaire.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

17

bah si tu remplis pas avec des FF, et que l'AMS remplit par taille paire, les octets manquants seront considérés comme étant à 0, non ? Comme on peut pas les remettre à FF après ... (à moins de flasher tout le bloc ...)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

18

Pollux
: (et je présume aussi que c'est totalement incompatible avec Pedrom)

PedroM ne ferra rien du tout (FL_write ne fait qu'un rts).

19

Ce qui est une erreur à mon avis (qu'on l'appelle "bogue" ou "erreur de design", peu importe). La compatibilité avec AMS est importante. Il y a déjà des jeux qui utilisent ça, et il y en aura plus, pas moins.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

20

C'est pour eviter ce genre de trucs infames, non-portables, et foncierement buggues (./1).
Il existe une methode simple, efficace, portable et SURE pour le faire (Creer une fichier tampon puis l'archiver quitte a le mettre in-use).
Cette methode complexe, inefficace, non-portable, et BUGGUE ne sera JAMAIS supportee par PedroM.

21

* infames: Pourquoi? Si AMS exporte ces ROM_CALLs, c'est pour qu'ils soient utilisés...
* non-portables: Comment ça? Ça marche avec tout AMS 2, et ça marcherait avec PedroM si tu utilisais le même format de mémoire archive.
* boguées: Pas si on l'utilise correctement. Corridor utilise ça et marche très bien.
* complexe: Moins que de créer un fichier en RAM juste pour avoir quelque chose à archiver.
* inefficace: Au contraire, ça économise de la RAM! (Pas besoin de créer un fichier temporaire.)

Quant à l'idée du flag in-use, c'est bien pire comme hack...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

22

Je persiste et signe:
pencil

23

Je sens le moment du fork se rapprocher de plus en plus... grin
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

24

Tu fais ce que tu veux.

25

Je connais pas assez le C pour bien relire to code, mais je crois comprendre que t'écris bien un header avec nom de fichier et de répertoire.
Le -32 me semble incorrect pour le premier truc : les valeurs valides sont 0xFFFF; 0xFFFE, 0xFFFC, 0xFFE0 et 0xFFC0 ainsi que 0xFFFA (je suis pas sûr de la dernière).
Tout ça sera effacé au prochain GC ! Pour qu'un truc ne soit pas effacé après un garbage collector, faut que le header commence par 0xFFE0 ou 0xFFFE (à moins que ce soit 0xFFC0 et 0xFFFC) ET qu'il corresponde à un handle valide. Et tu peux pas t'approprier proprement un handle en flash. Tes adresses sont effectivement incorrectes, faut qu'elles soient paires.


je comprends pas très bien ces valeurs. Dans l'aide de l'de tigcc il disent qu'il faut écrire le mot -32 pour signifier que le block est utilisé. Par contre je viens de me rendre compte que j'écrivais des char et pas des word (c'est bien 2byte?). Je vais voire si ça marche. ET essayer de passer mes adresses en adresses paires

26

Ce n'est pas toi qui dois t'occuper de signaler le bloc comme utilisé ou libre (le TIOS s'occupe déjà de l'allocation des blocs, va chercher dans les blocs pas pleins, t'alloue l'adresse que tu veux, et si c'est un bloc qui était vide, il le marque comme utilisé).

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)