Un compilateur C dans PockEmul

Il y a quelques temps, j’ai commencé à intégrer dans PockEmul un compilateur C rudimentaire. J’ai traduit en C++ LittleC compiler développé par Simon (http://www.lehmayr.de/) en Delphi. C’est un compilateur assez simple qui m’a permis de mieux comprendre le principe de fonctionnement d’un tel module.
Le compilateur produit du code ASM qui est ensuite transformé en code machine par un Assembleur également développé par Simon.
J’ai donc ajouté un IDE avec la possibilité d’installer directement le code généré dans un pocket en cours d’émulation.
Afin que cela soit plus attrayant, j’ai également ajouté une librairie d’IO pour le Sharp PC-1350 permétant de faire un getc et putc et d’utiliser les fonctions graphiques:

  • cls()
  • line(x1 , y1 , x2 , y2 , Flag)
    Flag pouvant prendre les valeurs GSET, GRESET, GINV ,GBOX et GBOXF permettant respectivement d’afficher un point, de l’éteindre, de l’inverser, de faire un rectangle ou un rectangle rempli.
  • pset(x1 , x2 , Flag)

Un premier exemple est le code suivant:



Le résultat final est le très classique:

Le point intéressant est le temps d’exécution. En BASIC standard, le Pocket met 294 secondes. En C il ne met plus que 38 secondes.

#org __PC_DEFAULT_ORG__
#include <graph.h>
#include <stdio.h>
#include <string.h>
#include <sound.h>

char xram g[]="un test de String !!!! ";
char xram r[10];

byte i,j;
main() {
	
	while (onbreak()==0) {
		ps_clrscr();
		
		for (j=0;j<10;j++) {
			for (i=65;i<140;i++) {			
				ps_putchar_con(i);
				if (onbreak()>0) return;
			}
		}
		
		for (i=40;i<150;i+=10) {
			beep(i,4);
			if (onbreak()>0) return;
		}
		for (i=150;i>40;i-=10) {
			beep(i,4);
			if (onbreak()>0) return;
		}	
		
		ps_clrscr();
		for (i=0;i<__DISP_GR_COLS__;i++) {
			for (j=0;j<__DISP_GR_ROWS__;j++) {
				if (onbreak()>0) return;	
				ps_pset(j|i ,j,GSET);
			}
		}
		ps_clrscr();
		ps_inv();
		for (i=0;i<__DISP_GR_ROWS__;i++) {
			for (j=0;j<__DISP_GR_COLS__;j++) {
				if (onbreak()>0) return;	
				ps_pset(j|i ,i,GRESET);
			}
		}
		
		ps_inv();
		ps_wait(500);
		ps_inv();
		ps_wait(500);
		ps_inv();
		ps_wait(500);
		
		ps_clrscr();
		
		for (i=0;i<__DISP_GR_COLS__;i=i+3) {
			ps_line(i,0,__DISP_GR_COLS__/2,50);
			if (onbreak()>0) return;
		}
		
		ps_inv();
		ps_wait(500);
		ps_inv();
		ps_wait(500);
		
		ps_clrscr();
		
		for (i=0;i<50;i++) {
			ps_putstr(&amp;g);
			if (onbreak()>0) return;
		}
		
		ps_clrscr();
		
		for (i=1;i<123;i++) {
			btoa(i,&amp;r,10);
			ps_putstr(&amp;r);
			ps_putchar_con(13);
		}
		
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *