Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Upsilon (Numworks) porté sur Graph 90
Parisse Hors ligne Membre Points: 484 Défis: 0 Message

Upsilon (Numworks) porté sur Graph 90

Posté le 10/05/2023 13:16

Je viens de lire sur cemetech cette info dont planète casio n'a pas encore parlé me semble-t-il:
Upsilon, un des principaux OS alternatifs à (et fork de) Epsilon pour Numworks a été porté comme un addin sur Casio Graph 90/fxcg50.
https://www.cemetech.net/forum/viewtopic.php?t=19114
Un pont intéressant entre calculatrices me semble-t-il et pourquoi pas la base d'un OS alternatif ? Même si la licence n'est pas libre, elle est suffisamment ouverte pour pouvoir faire des choses.


1, 2, 3 Suivante
Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message

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 !
Acrocasio Hors ligne Membre Points: 974 Défis: 0 Message

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 !
Captainluigi Hors ligne Membre Points: 815 Défis: 1 Message

Citer : Posté le 10/05/2023 17:38 | #


moi qui rêvait d'avoir une numworks, je crois que j'en ai plus besoin

Je teste ça de suite, plus sérieusement !
Les bons artistes copient, les grands artistes volent. Picasso
Synthwave/Musique électro 80s sur ma chaine Youtube

Jouez à Mario sans arrêt sur votre Casio !
Cliquez pour découvrir
Cliquez pour recouvrir
Captainluigi Hors ligne Membre Points: 815 Défis: 1 Message

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
Les bons artistes copient, les grands artistes volent. Picasso
Synthwave/Musique électro 80s sur ma chaine Youtube

Jouez à Mario sans arrêt sur votre Casio !
Cliquez pour découvrir
Cliquez pour recouvrir
Parisse Hors ligne Membre Points: 484 Défis: 0 Message

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!
Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message

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 ?
Acrocasio Hors ligne Membre Points: 974 Défis: 0 Message

Citer : Posté le 11/05/2023 07:04 | #


Parisse a écrit :
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.
Parisse Hors ligne Membre Points: 484 Défis: 0 Message

Citer : Posté le 11/05/2023 07:31 | #


Acrocasio a écrit :
Parisse a écrit :
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.
Parisse Hors ligne Membre Points: 484 Défis: 0 Message

Citer : Posté le 11/05/2023 07:33 | #


Mb88 a écrit :
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.
Lephenixnoir En ligne Administrateur Points: 24232 Défis: 170 Message

Citer : Posté le 11/05/2023 09:01 | #


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.

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é
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Captainluigi Hors ligne Membre Points: 815 Défis: 1 Message

Citer : Posté le 11/05/2023 09:55 | #


Captainluigi a écrit :

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:
Les bons artistes copient, les grands artistes volent. Picasso
Synthwave/Musique électro 80s sur ma chaine Youtube

Jouez à Mario sans arrêt sur votre Casio !
Cliquez pour découvrir
Cliquez pour recouvrir
Parisse Hors ligne Membre Points: 484 Défis: 0 Message

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));
}

}
}
}
Slyvtt Hors ligne Maître du Puzzle Points: 2309 Défis: 17 Message

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()
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Parisse Hors ligne Membre Points: 484 Défis: 0 Message

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.
Slyvtt Hors ligne Maître du Puzzle Points: 2309 Défis: 17 Message

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.
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Parisse Hors ligne Membre Points: 484 Défis: 0 Message

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));
}

}
}
}
Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message

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 : )

Parisse Hors ligne Membre Points: 484 Défis: 0 Message

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.
Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message

Citer : Posté le 11/05/2023 18:06 | #


Oui mais à part le CPU je pense que la numworks est moins bien
Acrocasio Hors ligne Membre Points: 974 Défis: 0 Message

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.
1, 2, 3 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 61 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