aus AddIns auf Matrix/Liste zugreifen

Hilfe beim Programmieren mit dem fx-9860G SDK.

aus AddIns auf Matrix/Liste zugreifen

Beitragvon Paul94 » So 7. Mär 2010, 15:38

Hi!

Ich möchte aus einem AddIn auf eine Matrix oder eine Liste zugreifen. Ist das irgendwie möglich?

Danke, Paul
Paul94
 
Beiträge: 95
Registriert: Do 14. Mai 2009, 07:50
Taschenrechner: FX 9860G II (gehackte Firmware)

Re: aus AddIns auf Matrix/Liste zugreifen

Beitragvon SimonLothar » So 7. Mär 2010, 16:26

Ja.
LISTs und MATs werden im Main-Memory gespeichert. Man benötigt ein oder zwei SysCalls (wenn man nur lesen will, reicht einer). Die LIST- und MAT-Elemente sind außerdem BCD-codiert. Man benötigt in einem C-Programm also auch einen BCD/double-Konvertierer. Willst Du trotzdem Beispielcode? Ist nichts Wildes.
SimonLothar
 
Beiträge: 67
Registriert: Mi 27. Mai 2009, 11:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII

Re: aus AddIns auf Matrix/Liste zugreifen

Beitragvon Paul94 » So 7. Mär 2010, 17:55

Danke für deine Antwort!
Willst Du trotzdem Beispielcode? Ist nichts Wildes.

Wäre super, wenn du mir den code für die Syscalls und eine kurze Erklärung für die Funktionen geben kannst.

Es geht mir hauptsächlich ums Lesen, wie man darein schreibt interessiert mich aber auch.

Danke, Paul
Paul94
 
Beiträge: 95
Registriert: Do 14. Mai 2009, 07:50
Taschenrechner: FX 9860G II (gehackte Firmware)

Re: aus AddIns auf Matrix/Liste zugreifen

Beitragvon SimonLothar » So 7. Mär 2010, 19:42

Zunächst die SysCalls.

In SYSCALLS.SRC (siehe viewtopic.php?p=21817#p21817) folgende Zeilen anfügen:

Code: Alles auswählen
   SYSCALL 0376,   _MCS_SearchDirectoryItem
   SYSCALL 0500,   _BCDtoInternal


Jetzt nicht erschrecken.
Pack die Interfaces und Strukturen in eine Header-Datei, dann sieht alles schon viel übersichtlicher aus.

Code: Alles auswählen
// Die zugehörigen Interfaces verfügbar machen:
int MCS_SearchDirectoryItem( unsigned char*dir, unsigned char*item, char*flags_0, void*item_ptr, int*data_ptr, int*data_length );
int BCDtoInternal( void*p1, void*p2 );

// zwei Strukturen zum inneren Aufbau der BCD-Werte, mit denen der fx-9860 arbeitet
typedef struct{
  unsigned char hnibble:4;
  unsigned char lnibble:4;
} TBCDbyte;

typedef struct{
  unsigned short exponent:12;
  unsigned short mantissa0:4;
  TBCDbyte mantissa[7];
  char flags[3];
} TBCDvalue;
// Anders ausgedrückt: eine BCD-Dezimalzahl im fx-9860 besteht aus 3 nibbles Exponent und 15 nibbles Mantisse.

// Basisstruktur einer Liste oder Matrix im fx-9860
typedef struct{
  char Name[8];
  short rows;
  short cols;
  int reserved;
  TBCDvalue value[ 0x8000 ];
} TFX9860ListMat;
// Hinweis: mit TFX9860ListMat darf man keine Variablen, sondern nur Zeiger auf TFX9860ListMat deklarieren!

// Um das in eine C-Variable von Typ double umzuwandeln benötigt man zunächst die folgende Struktur:

// diese Struktur wird nur intern in BCDtoDouble verwendet.
// Sie hat ansonsten keine Bedeutung, also ggf. sofort vergessen und in einer Headerdatei vergraben.
typedef struct{
  int exponent;
  int sign;
  int reserve;
  char mantissa[15];
} TBCDInternal;

// und die Funktion
//
double BCDtoDouble( TBCDvalue*pvalue ){
double result=0;
int i;
double factor = 1;
TBCDInternal work;

  BCDtoInternal( &work, pvalue );
  result = work.mantissa[0];
  for (i=1;i<15;i++){
    factor /= 10;
    if (work.mantissa[i]){ result += factor * work.mantissa[i]; };
  };
  while ( work.exponent++ < 0 ){ result /= 10;};
  while ( --work.exponent > 0 ){ result *= 10;};
  result *= work.sign;
 
  return result;
};

// Das Hauptprogramm:

//
int AddIn_main(int isAppli, unsigned short OptionNum)
{
int result;
double dw;
char flags_0;
int item_ptr;
int data_length;
TFX9860ListMat*data_ptr;


   // holt den Zeiger auf Mat A
   result = MCS_SearchDirectoryItem( (unsigned char*)"main", (unsigned char*)"MAT_A", &flags_0, &item_ptr, (int*)&data_ptr, &data_length );
   if (!result){
   // jetzt kann über den pointer data_ptr auf die Matrix zugegriffen werden
   
      dw = BCDtoDouble( &(*data_ptr).value[3] );   // holt den letzten Wert eine 2x2 Matrix

/*
WICHTIG! (*data_ptr).rows und (*data_ptr).cols geben die Dimensionen der Matrix wieder.
Der Index in (*data_ptr).value[ index ] darf ( (*data_ptr).rows * (*data_ptr).cols - 1 ) nie überschreiten.
Wenn man in den durch data_ptr definierten Datenbereich unkontrolliert hineinschreibt,
dann kann der Inhalt des MainMemory's Schaden nehmen!
*/
   
   }
   
   // holt den Zeiger auf List1
   result = MCS_SearchDirectoryItem( (unsigned char*)"main", (unsigned char*)"1LIST1", &flags_0, &item_ptr, (int*)&data_ptr, &data_length );
   if (!result){
   // jetzt kann (wie oben) über den pointer data_ptr auf die Liste zugegriffen werden
   
   }
   
   return 1;
}
SimonLothar
 
Beiträge: 67
Registriert: Mi 27. Mai 2009, 11:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII

Re: aus AddIns auf Matrix/Liste zugreifen

Beitragvon Paul94 » Mo 8. Mär 2010, 15:39

Vielen Dank für den Code, ich werde mal schauen, was sich da machen lässt.
Paul94
 
Beiträge: 95
Registriert: Do 14. Mai 2009, 07:50
Taschenrechner: FX 9860G II (gehackte Firmware)


Zurück zu fx-9860G SDK (Alle fx-9860G Modelle)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast