Posté le 10/05/2023 13:16
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 34 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 10/05/2023 13:29 | #
Oh trop cool j'avais pas encore testé mais j'avais vu ça sur le "serveur" discord de circuit10 !
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 10/05/2023 13:38 | #
Pareil
J'ai vu ça hier sur le Discord, et j'ai recherché un fichier g3a, mais rien
Merci beaucoup, Parisse !
Citer : Posté le 10/05/2023 17:38 | #
moi qui rêvait d'avoir une numworks, je crois que j'en ai plus besoinJe teste ça de suite, plus sérieusement !
Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Citer : Posté le 10/05/2023 18:49 | #
J'ai testé 5 minutes upsilon sur ma 90+e, et voilà mon avis:
C'est juste incroyable comment on a pu porté ça sur un hardware totalement différent, avec ni crash, ni lag vraiment perceptible (en tout cas c'est totalement utilisable pour moi, à part physium qui laggue bien plus que mon app python sur CX (pas encore en ligne) ).
J'en reste encore bluffé :o ! et j'invite tous ceux qui ont une 90+E à tester cet add-in (l'un des meilleurs jamais sorti, si ce n'est le meilleur). Un simple petit programme utilisant kandinsky permet de se rendre compte de la vitesse en Python (notamment le remplissage d'écran pixel par pixel qui est 30x plus rapide, sans double-buffering en plus, contrairement à la 90+E )
-Sinon, plusieurs bugs que j'ai noté ( très peu nombreux! )-
-L'add-in ne sauvegarde rien du tout (ni fichiers python, ni réglages systèmes tels que la langue)
-La touche del ne fonctionne pas lorsque le clavier est en alpha (minuscule)
-les lettres majuscules ne peuvent pas être saisies ( ALPHA en majuscule c'est bien pour ça ? J'ai pas de numworks donc je ne sais pas si ça sert à ça.
-le menu built-in est quand à lui encore "absent', juste un carré noir qui apparaît.
Je n'ai pas trouvé , ni de crash , ni de bug en python ( ça va être difficile de tester tout seul ),et sinon on a par moment des "lags" lorsqu'on scrolle des menus.
Encore bravo!
Btw, c'est assez flippant au début, quand on sait pas qu'il faut appuyer sur menu pendant longtemps pour quitter
Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Citer : Posté le 10/05/2023 21:08 | #
J'ai un peu testé, et ça semble déjà très bien. Il manque effectivement principalement la sauvegarde/restauration de l'état de la calculatrice et l'accès au filesystem Casio depuis Upsilon, mais ça va surement se faire. C'est génial, ça va me permettre de proposer à mes étudiants qui ont une Numworks verrouillées d'emprunter des Graph 90 avec KhiCAS en retrouvant leurs habitudes Numworks dessus!
Citer : Posté le 10/05/2023 23:16 | #
Mais le lancement d'add-ins numworks de puis un add-in sur une G90+e c'est compliqué, non : le processeur est différent donc va sûrement falloir tout porter pour pouvoir les recompiler pour G90+e et tout coder pour pouvoir en lancer sur G90+e dans l'add-in Upsilon sans casser des choses, non ?
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 11/05/2023 07:04 | #
J'ai un peu testé, et ça semble déjà très bien. Il manque effectivement principalement la sauvegarde/restauration de l'état de la calculatrice et l'accès au filesystem Casio depuis Upsilon, mais ça va surement se faire.
À priori, c'est le portage du simulateur et non du firemware. Donc sûrement pas.
Citer : Posté le 11/05/2023 07:31 | #
J'ai un peu testé, et ça semble déjà très bien. Il manque effectivement principalement la sauvegarde/restauration de l'état de la calculatrice et l'accès au filesystem Casio depuis Upsilon, mais ça va surement se faire.
À priori, c'est le portage du simulateur et non du firemware. Donc sûrement pas.
Ca n'a pas de rapport. Il me semble que la persistance n'est pas très difficile à mettre en oeuvre, il suffit de sauvegarder le "workshop" d'Epsilon dans un fichier quand on quitte par MENU (long) et de le recharger au lancement de l'addin. La sauvegarde de fichiers individuels/l'accès au filesystem Casio est plus délicate à mettre en oeuvre.
Citer : Posté le 11/05/2023 07:33 | #
Mais le lancement d'add-ins numworks de puis un add-in sur une G90+e c'est compliqué, non : le processeur est différent donc va sûrement falloir tout porter pour pouvoir les recompiler pour G90+e et tout coder pour pouvoir en lancer sur G90+e dans l'add-in Upsilon sans casser des choses, non ?
Impossible de lancer du code arm sur du sh4 en effet. Mais peut-être qu'on pourrait lancer des addins Casio depuis le menu d'Upsilon, sans avoir à repasser par le menu Casio.
Citer : Posté le 11/05/2023 09:01 | #
Si tu lances un add-in Casio ça va décharger Upsilon donc après l'add-in tu reviendras au menu principal, pas au menu d'Upsilon. On peut imaginer des arrangements bizarres pour essayer de contourner ça mais c'est très vite inutilement compliqué
Citer : Posté le 11/05/2023 09:55 | #
Btw, c'est assez flippant au début, quand on sait pas qu'il faut appuyer sur menu pendant longtemps pour quitter
EDIT : Si on reste dans l'add-in durant la veille on peut même plus quitter:
Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Citer : Posté le 11/05/2023 10:18 | #
oui, en fait ça n'a pas d'intérêt de lancer des addins depuis le menu d'Upsilon, vu qu'il suffit de faire un MENU long.
Pour avoir Upsilon en francais par défaut, il suffit de changer dans apps/global_preferences.h
m_language((I18n::Language)1),
Je suis en train d'essayer de faire marcher la persistence. Ca se passe dans le fichier ion/src/simulator/fxcg/main.cpp. L'idée serait de sauvegarder dans un fichier nwstate.nws quand on tape OFF, et il semble que quand on quitte par MENU ça appelle aussi runPowerOffSafe (ce serait mieux de faire ça dans le handler de quit, mais je ne connais pas gint).
J'ai un problème avec fwrite, il semble que quand on met une taille trop grande dans storage_length (normalement c'est 60000 pour le storage d'Upsilon et 32768 dans Epsilon) ça plante. Du coup il faut faire plusieurs fwrite à la suite?
#include "main.h"
#include "display.h"
#include "platform.h"
#include <gint/display-cg.h>
#include <gint/gint.h>
#include <gint/display.h>
#include <gint/keyboard.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <ion.h>
#include <ion/events.h>
void * storage_address(); // ion/src/simulator/shared/platform_info.cpp
const int storage_length=1024;
const char * storage_name="nwstore.nws";
extern "C" {
int main() {
Ion::Simulator::Main::init();
ion_main(0, NULL);
Ion::Simulator::Main::quit();
return 0;
}
}
namespace Ion {
namespace Simulator {
namespace Main {
static bool sNeedsRefresh = false;
void init() {
#if 0
FILE * f=fopen(storage_name,"rb");
if (f){
fread(storage_address(),1,storage_length,f);
fclose(f);
}
#endif
Ion::Simulator::Display::init();
setNeedsRefresh();
}
void setNeedsRefresh() {
sNeedsRefresh = true;
}
void refresh() {
if (!sNeedsRefresh) {
return;
}
Display::draw();
sNeedsRefresh = false;
}
void quit() {
Ion::Simulator::Display::quit();
}
void EnableStatusArea(int opt) {
__asm__ __volatile__ (
".align 2 \n\t"
"mov.l 2f, r2 \n\t"
"mov.l 1f, r0 \n\t"
"jmp @r2 \n\t"
"nop \n\t"
".align 2 \n\t"
"1: \n\t"
".long 0x02B7 \n\t"
".align 4 \n\t"
"2: \n\t"
".long 0x80020070 \n\t"
);
}
extern "C" void *__GetVRAMAddress(void);
uint8_t xyram_backup[16 * 1024];
uint8_t ilram_backup[4 * 1024];
void worldSwitchHandler(void (*worldSwitchFunction)(), bool prepareVRAM) {
// Back up XYRAM
uint8_t* xyram = (uint8_t*) 0xe500e000;
memcpy(xyram_backup, xyram, 16 * 1024);
// Back up ILRAM
uint8_t* ilram = (uint8_t*) 0xe5200000;
memcpy(ilram_backup, ilram, 4 * 1024);
if (prepareVRAM) {
// Copying the screen to the OS's VRAM avoids a flicker when powering on
uint16_t* dst = (uint16_t *) __GetVRAMAddress();
uint16_t* src = gint_vram + 6;
for (int y = 0; y < 216; y++, dst += 384, src += 396) {
for (int x = 0; x < 384; x++) {
dst[x] = src[x];
}
}
// Disable the status area
EnableStatusArea(3);
}
worldSwitchFunction();
// Restore XYRAM
memcpy(xyram, xyram_backup, 16 * 1024);
// Restore ILRAM
memcpy(ilram, ilram_backup, 4 * 1024);
}
void runPowerOffSafe(void (*powerOffSafeFunction)(), bool prepareVRAM) {
if (1 || Ion::Storage::sharedStorage()->numberOfRecords()){
FILE * f=fopen(storage_name,"wb");
dclear(C_WHITE);
dtext(1, 1, C_BLACK, "Saving Epsilon store.");
dupdate();
getkey();
if (f){
fwrite(storage_address(),1,storage_length,f);
fclose(f);
}
}
gint_world_switch(GINT_CALL(worldSwitchHandler, powerOffSafeFunction, prepareVRAM));
}
}
}
}
Citer : Posté le 11/05/2023 10:23 | #
Bernard, avec gint il faut encapsuler les opérations sur les fichiers dans des gint_world_switch().
Tu remarqueras qu'il y en a un juste après dans la fonction runPowerOff()
Citer : Posté le 11/05/2023 11:18 | #
En clair, ca veut dire qu'il faut faire
gint_world_switch(GINT_CALL(fopen,storage_name,"wb"));
puis
gint_world_switch(GINT_CALL(fwrite,storage_address(),1,storage_length,f));
puis
gint_world_switch(GINT_CALL(fclose,f));
?
Ou bien tout mettre dans une seule fonction?
Après c'est loin de résoudre tout, parce que je ne vois pas comment on peut restaurer le nwstate automatiquement sans fouiller beaucoup dans le code source d'Epsilon.
Il vaut peut-être mieux localiser la fonction qui lit les touches clavier et intercepter certains raccourcis pour sauvegarder/restaurer.
Citer : Posté le 11/05/2023 12:43 | #
L'Ideal est de mettre tout dans une fonction et de faire un call à cette fonction via un unique gint_world_switch().
Mais tu peux aussi faire pour chacune des opérations.
C'est pas critique dans ton cas, mais le world switch prend du temps pour tout sauvegarder/restaurer l'état de la machine avant de faire l'opération, donc l'exécuter moins de fois est mieux.
Citer : Posté le 11/05/2023 16:24 | #
Alors voilà un prototype très préliminaire avec possibilité de sauvegarde/restauration en tapant sur OFF
https://www-fourier.univ-grenoble-alpes.fr/~parisse/tmp/epsilon.g3a
Ca a l'air de marcher pour les scripts Python en tout cas. Je suis sur que l'auteur du port va pouvoir nous sortir quelque chose de bien mieux...
ion/src/simulator/fxcg/main.cpp
#include "main.h"
#include "display.h"
#include "platform.h"
#include <gint/display-cg.h>
#include <gint/gint.h>
#include <gint/display.h>
#include <gint/keyboard.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <ion.h>
#include <ion/events.h>
void * storage_address(); // ion/src/simulator/shared/platform_info.cpp
const int storage_length=32768;
const char * storage_name="nwstore.nws";
int load_state(const char * fname){
FILE * f=fopen(fname,"rb");
if (f){
fread(storage_address(),1,storage_length,f);
fclose(f);
return 1;
}
return 0;
}
int save_state(const char * fname){
if (1 || Ion::Storage::sharedStorage()->numberOfRecords()){
FILE * f=fopen(storage_name,"wb");
if (f){
fwrite(storage_address(),1,storage_length,f);
fclose(f);
return 1;
}
return 0;
}
return 2;
}
extern "C" {
int main() {
Ion::Simulator::Main::init();
ion_main(0, NULL);
Ion::Simulator::Main::quit();
return 0;
}
}
namespace Ion {
namespace Simulator {
namespace Main {
static bool sNeedsRefresh = false;
void init() {
Ion::Simulator::Display::init();
setNeedsRefresh();
}
void setNeedsRefresh() {
sNeedsRefresh = true;
}
void refresh() {
if (!sNeedsRefresh) {
return;
}
Display::draw();
sNeedsRefresh = false;
}
void quit() {
Ion::Simulator::Display::quit();
}
void EnableStatusArea(int opt) {
__asm__ __volatile__ (
".align 2 \n\t"
"mov.l 2f, r2 \n\t"
"mov.l 1f, r0 \n\t"
"jmp @r2 \n\t"
"nop \n\t"
".align 2 \n\t"
"1: \n\t"
".long 0x02B7 \n\t"
".align 4 \n\t"
"2: \n\t"
".long 0x80020070 \n\t"
);
}
extern "C" void *__GetVRAMAddress(void);
uint8_t xyram_backup[16 * 1024];
uint8_t ilram_backup[4 * 1024];
void worldSwitchHandler(void (*worldSwitchFunction)(), bool prepareVRAM) {
// Back up XYRAM
uint8_t* xyram = (uint8_t*) 0xe500e000;
memcpy(xyram_backup, xyram, 16 * 1024);
// Back up ILRAM
uint8_t* ilram = (uint8_t*) 0xe5200000;
memcpy(ilram_backup, ilram, 4 * 1024);
if (prepareVRAM) {
// Copying the screen to the OS's VRAM avoids a flicker when powering on
uint16_t* dst = (uint16_t *) __GetVRAMAddress();
uint16_t* src = gint_vram + 6;
for (int y = 0; y < 216; y++, dst += 384, src += 396) {
for (int x = 0; x < 384; x++) {
dst[x] = src[x];
}
}
// Disable the status area
EnableStatusArea(3);
}
worldSwitchFunction();
// Restore XYRAM
memcpy(xyram, xyram_backup, 16 * 1024);
// Restore ILRAM
memcpy(ilram, ilram_backup, 4 * 1024);
}
void runPowerOffSafe(void (*powerOffSafeFunction)(), bool prepareVRAM) {
dclear(C_WHITE);
dtext(1,1, C_BLACK, "STO: save state");
dtext(1,17,C_BLACK,"EXE: load state");
dtext(1,33,C_BLACK,"other key: OFF/leave");
dupdate();
#if 0
int opt=GETKEY_DEFAULT,timeout=3; key_event_t ev=getkey_opt(opt,&timeout);
#else
key_event_t ev=getkey();
#endif
int key=ev.key;
if (key==KEY_STORE){
gint_world_switch(GINT_CALL(save_state,storage_name));
setNeedsRefresh();
return;
}
else if (key==KEY_EXE){
gint_world_switch(GINT_CALL(load_state,storage_name));
setNeedsRefresh();
return;
}
gint_world_switch(GINT_CALL(worldSwitchHandler, powerOffSafeFunction, prepareVRAM));
}
}
}
}
Citer : Posté le 11/05/2023 17:38 | # | Fichier joint
Mais en fait nos casios sont bien meilleures : Numworks a juste un meilleur os !
(La hardware des numworks : )
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 11/05/2023 18:02 | #
Je ne dirais pas cela. Le CPU de la Numworks par exemple est bien plus rapide que celui des Casio, mais il consomme certainement plus aussi, d'un autre coté la quantité de RAM disponible sur Numworks est vraiment trop faible. L'UI de Numworks est plus facile à prendre en main, mais l'OS de Casio est supérieur par bien des cotés, par exemple de par la présence d'un filesystem, et d'une certaine manière pouvoir faire tourner l'OS de Numworks comme un addin Casio est un signe de robustesse de l'OS de Casio, et de gint aussi bien sur.
Citer : Posté le 11/05/2023 18:06 | #
Oui mais à part le CPU je pense que la numworks est moins bien
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 11/05/2023 19:06 | #
Je suis pas assez calé hardware pour donner une critique, mais ce n'est pas si simple.
La Numworks est idéal pour le Python ; La G90 supporte Python et à Python extra. Mais je ne recommanderai pas une G90 pour une personne qui veut coder en Python.
La G90 est une plate-forme super pour le gaming et pour créer des jeux/utilitaires. La Numworks, moins voir pas du tout.
Bref, je vais pas vous pondre un pavé, c'est compliqué quoi. Ça dépend du ou des besoins.