Encore la Algebra FX...
J'ai modifié mon logiciel pour utiliser l'accès à l'afficheur directe, sans les utilitaires de la librairie.
L'écran est organisé comme ça :
(source:
http://graph100.com/doku.php?id=afficheur)
Les numéros de Fibonacci sont organises en colonnes de largeur 1. Par contre, les pixels sur l'affichage sont organisés en colonnes de largeur 8. Il faut qu'on combine et transpose 8 numéros pour remplir une colonne de l'afficheur. Parce-que le bit faible soit être affiché en haut de l'écran mais les positions sont numérotés du bas vers le haut, il faut qu'on mette les numéros sur leurs têtes (les pauvres
). C'est tout effectué par la routine
transpose() appelée une seul fois après la création des numéros et avant accès à l'écran. Chaque groupe de 8 numéros est remplacés par leur représentation sur l'affichage.
Il suffit de copier cette représentation directement dans la mémoire de l'écran, si il n'y a pas un offset (déplacement) horizontal qui n'est pas divisible par 8. En ce cas, le programme combine deux colonnes et ajuste les positions de bits par un décalage. C'est moins rapide mais inévitable.
Le logiciel
Code : Tout sélectionner
/*
* FIBTRI.C
*
* (c) Marcus von Cube - marcus@mvcsys.de
*
* Platform: Casio Algebra FX (AFX) ROM-DOS
*
* Compute and display the Fibonacci triangle
*
* 21.01.2011 new
* 23.01.2011 DIRECT_GRAPH
*/
#define DIRECT_GRAPH
#include <casio2.h> /* Na-Prod Casio Development Kit 2 */
#ifdef DIRECT_GRAPH
/*
* Direct access to screen buffer from C
*/
#define SCREEN_BASE 0x1A20
#include <mem.h>
#define clearscreen() _fmemset( MK_FP( SCREEN_BASE, 0 ), 0, 1024 )
#define Page 0
#else
/*
* Access to screen bitwise through library, uses double buffering
*/
#include <prgnuls.h>
short Page;
#define clearscreen() clearpage_2072(Page)
#endif
/*
* Size of data, each column is a number
*/
#define COLS 512
#define ROWS ((COLS*7+9)/10)
#define NUMSIZE ((ROWS+7)/8)
typedef unsigned char NUMBER[ NUMSIZE ];
/*
* Local subroutines
*/
void add( NUMBER n1, NUMBER n2, NUMBER result );
void display( void );
void draw( short col );
#ifdef DIRECT_GRAPH
void transpose( void );
#endif
/*
* Global data
*/
NUMBER Numbers[ COLS ];
short Xoff, Yoff;
/*
* Entry point and user interaction
*/
int main( void )
{
int i;
short key = 0;
int is_ctrl = 0;
int is_optn = 0; /* DEBUG keys */
int update = 1;
#ifndef DIRECT_GRAPH
setpage( 0 );
#endif
clearscreen();
gotoxy( 6, 3 ); printf( "Fibonacci" );
gotoxy( 7, 4 ); printf( "Triangle" );
gotoxy( 4, 6 ); printf( "Use Ctrl+Arrows" );
key = getch();
if ( key != K_ESC && key != K_ACon ) {
/*
* Precompute the triangle
*/
gotoxy( 2, 6 ); printf( "Compute %3d Numbers", COLS );
Numbers[ 0 ][ 0 ] = 1;
Numbers[ 1 ][ 0 ] = 1;
for ( i = 2; i < COLS; ++i ) {
add( Numbers[ i - 2 ], Numbers[ i - 1 ], Numbers[ i ] );
}
#ifdef DIRECT_GRAPH
/*
* Align bits horizontally for fastest access
*/
printf( "." );
transpose();
#endif
}
/*
* Interactive loop allows shifting the image
* CTRL switches to a larger increment
* OPTN turns on debugging
*/
while ( key != K_ESC && key != K_ACon ) {
if ( update ) {
display();
update = 0;
}
setPix( 0, 63, Page, is_ctrl );
if ( is_optn ) {
gotoxy( 1, 8 ); printf( "%4X", key );
}
switch ( key = getch() ) {
case 0:
continue;
case K_CTRL:
is_ctrl = !is_ctrl;
continue;
case K_OPTN:
is_optn = !is_optn;
continue;
case K_GAUCHE:
Xoff -= ( is_ctrl ? 32 : 1 );
update = 1;
break;
case K_DROITE:
Xoff += ( is_ctrl ? 32 : 1 );
update = 1;
break;
case K_HAUT:
Yoff -= ( is_ctrl ? 16 : 1 );
update = 1;
break;
case K_BAS:
Yoff += ( is_ctrl ? 16 : 1 );
update = 1;
break;
}
if ( Xoff < 0 ) Xoff = 0;
if ( Xoff > COLS - 128 ) Xoff = COLS - 128;
if ( Yoff < 0 ) Yoff = 0;
if ( Yoff > ROWS - 64 ) Yoff = ROWS - 64;
}
/*
* Clean up and exit
*/
clearscreen();
#ifndef DIRECT_GRAPH
setpage( 0 );
#endif
return 0;
}
/*
* Add two big integers
*/
void add( NUMBER n1, NUMBER n2, NUMBER result )
{
int i = NUMSIZE;
unsigned short carry = 0;
unsigned short sum;
while ( i-- ) {
sum = carry + (unsigned short) *n1++ + (unsigned short) *n2++;
carry = sum >> 8;
*result++ = (unsigned char) sum;
}
}
#ifndef DIRECT_GRAPH
/*
* Draw number on screen, single colummn using library calls
*/
void draw( short col )
{
unsigned char *p = (unsigned char *) Numbers[ col ];
unsigned char mask = 1;
int row;
p += Yoff / 8;
mask <<= ( Yoff & 7 );
for ( row = 0; row < 64; ++row ) {
if ( *p & mask ) {
setbPix( col - Xoff, row, Page );
}
if ( mask == 0x80 ) {
++p;
mask = 1;
}
else {
mask <<= 1;
}
}
}
/*
* Display the triangle
*/
void display( void )
{
int i;
Page = 1 - Page;
clearpage( Page );
for ( i = 0; i < 128; ++i ) {
draw( i + Xoff );
}
setpage( Page );
}
#else /* Mode DIRECT_GRAPH */
/*
* Transpose the numbers in groups of 8 to align the bits horizontally
*/
void transpose( void )
{
unsigned char buffer[ 8 * NUMSIZE ];
unsigned char *p, *q;
unsigned char mask;
short row, col;
for ( col = 0; col < COLS; col += 8 ) {
/*
* Transpose 8 adjacent columns
*/
p = buffer;
q = (unsigned char *) Numbers[ col ];
/*
* Make a copy of the source, original data will be replaced
*/
memcpy( p, q, 8 * NUMSIZE );
p += NUMSIZE - 1;
for ( row = 0; row < ROWS; row += 8, --p ) {
/*
* Transpose 8 rows, highest bit comes first
*/
for ( mask = 0x80; mask != 0; mask >>= 1 ) {
/*
* Transpose 8 bits
*/
*q++ = ( 0 != ( p[ 0 * NUMSIZE ] & mask ) ) << 7
| ( 0 != ( p[ 1 * NUMSIZE ] & mask ) ) << 6
| ( 0 != ( p[ 2 * NUMSIZE ] & mask ) ) << 5
| ( 0 != ( p[ 3 * NUMSIZE ] & mask ) ) << 4
| ( 0 != ( p[ 4 * NUMSIZE ] & mask ) ) << 3
| ( 0 != ( p[ 5 * NUMSIZE ] & mask ) ) << 2
| ( 0 != ( p[ 6 * NUMSIZE ] & mask ) ) << 1
| 0 != ( p[ 7 * NUMSIZE ] & mask );
}
}
}
}
/*
* Display the triangle
*/
void display( void )
{
unsigned char far *screen = MK_FP( SCREEN_BASE, 0 );
unsigned char *p = (unsigned char *) Numbers[ ( 128 + Xoff ) & ~7 ];
short row, col;
short shift = 8 - ( Xoff & 7 );
/*
* Point to the bottom of the right most column
*/
p -= 64 + Yoff;
for ( col = 120; col >= 0; col -= 8 ) {
/*
* Draw 8 numbers on screen with direct access
* The bits are already arranged horizontally
*/
if ( shift == 0 ) {
/*
* direct copy to screen
*/
_fmemcpy( screen, p, 64 );
screen += 64;
}
else {
/*
* We need to shift the bits because Xoff is not a multiple of 8
* The right most bits come from the next 8 columns
*/
for ( row = 0; row < 64; ++row, ++p ) {
*screen++ =
( ( (short) *p << 8 ) | p[ 8 * NUMSIZE ] ) >> shift;
}
p -= 64;
}
/*
* Point to previous 8 columns
*/
p -= 8 * NUMSIZE;
}
}
#endif
Comment installer un tel logiciel sur la AFX ?
Vous avez besoin de la logiciel
Flash100 de de David Quaranta. J'ai une configuration qui recrée l'image ROM-DISK automatiquement, chaque fois le EXE change :
Il suffit de envoyer lecteur N (dans mon cas) à la calculatrice. J'utilise
GComm du même auteur comme récepteur.
Comment ajouter un icône ?
Vous devez recevoir la zone système de votre calculatrice une fois pour la modifier (double clique) :
L'icône en format BMP peut être importé. Il est utile d'ajouter un lettre d'accès (K sur la mienne).
Cette zone sera envoyé une seul fois à la calculatrice pour activer le menu.
---------------
Vous trouvez mes fichiers sur mon site:
http://www.mvcsys.de/temp/fibtri-afx.zip