Les applications PedroM seront des fichiers kernels (extension '68kP') dont avec un header kernel avec quelques contraintes. En plus d'avoir le flag ReadOnly mis, la fonction '_exit' est detourne :
_exit:
jmp event
dc.l 'Pedr' ; Signature
dc.w 'oM',$8000
; Library Import Table
dc.b "genlib",0,1 ; name,0,Version
dc.b 0,1,2,3,4,5,6,$FF ; List of imported functions. Finish with $FF
dc.b "filelib",0,1
dc.b 2,$FF
dc.b 0 ; Finish Import Lib Table
Good:
+ Possibilite d'utiliser les romcalls / ramcalls / bss / libraries comme en kernel.
+ Possibilite d'importer des libraries en RAM ou en APPS ! C'est transparent.
+ La section BSS pour les vars globales est autorisé.
+ Le bloc BSS possedera un numero d'handle FIXE. Lorsque l'application ne s'en sert pas, cet handle est de taille 2 octets. Sinon, il est de la taille de la section BSS.
Bad:
+ Limite a 64K comme les programmes kernels !
+ Consomme un secteur entier quelque soit la taille utilisé.
+ Les vars globales avec le code sont interdites (forcement...), donc la librarie statique Tigcc ne marchera pas pour produire des applications (y'a des vars globales partout !).
+ Pas de self modifying code (donc genlib ne marchera pas en APPS...)
FUNCTION EVENT :
long event(short id asm("d0"), long data asm("d1"));
Switch (id) :
+ Idle: Le systeme glande...
+ Boot: Le systeme boote.
+ Clean: Commande 'clean' appellée.
+ CrashExit: L'application a declenche une operation illegale..
+ StartProgram: Un programme va etre lance (data = HANDLE)
+ EndProgram: Fin d'un programme
+ Shell KeyPress
+ Shell ClrScr
+ Get Unkown RomCall Ptr.
+ Get Unkown RamCall Ptr.
+ Get Unkown Library Ptr.
+ Install
+ Uninstall.
TO IMPROVE.
MAIN Function :
int _main(int argc, char *argc[])
Les programmes kernels peuvent bien sur importer les fonctions exportees des applications !
Tout comme le contraire
PedroM Library (Built-in) :
_globals_struct *ropen(void);
Ouverture des ressources de l'application.
ie. reallocation de l'handle de la section BSS et importation des libraries.
Doit etre appelle a l'interieur de l'application.
Si les ressources sont deja ouvertes, ne fait juste que redeference le pointeur vers ces ressources.
void rclose(void);
Fermeture des ressources de l'application.
Internal Functions :
AppInit
Recherche des applications installées et reservation des handles.
Appelle apres FlashCheck.
AppInstall(HANDLE h, char *name)
Installe l'application h qui est en RAM.
Appelle automatiquement par la procedure de link si elle reconnait une application.
1. Check taille fichier (< 65536-20).
2. Check signature (_exit.w, et _exit +6.ll).
3. Recherche d'un secteur libre ($FFFF).
4. TailleBss = ReadBssSize(h). WriteBssSize(h) = 2
5. Rellocation du handle h avec comme destination le secteur trouvé. (Modifie legerement PreOS).
6. Remet la vrai taille du segment BSS et fixe le counter de reloc a 3.
7. Write Extra Header (Statut = 0FFFE). Folder : apps.
8. Write handle h.
AppUninstall(void *addr)
Desinstalle l'application.
1. Get sector base.
2. Check Extra Header
3. Verifie que le reloc count de l'application est a 3.
Oui: 3' : Met ce reloc count a 0.
3'': Appel function event(Uninstall).
4. Free BSS Handle.
5. FlashErase(Sector)
AppRun(void *addr)
Execute l'application (appelle la fonction _main).
1. Get sector base.
2. Check Apps
3. Saut a main.
AppOpenRessource(void)
Ouvre le fichier de ressources si necessaire.
Si le fichier est realloue, il est remplis a 0 !
1. Pop PC, get sector base.
2. Get BSS Handle, Check size
3. Size == 2
4. Realloc a sa taille normale.
5. Locke it.
6. Clean it.
7. Realloc des libraries (find_librarie, reloc).
8. Copie les adresses des fonctions dans la section BSS.
9. Retourne Ptr or NULL.
AppCloseRessource(void)
Ferme le fichier de ressource.
1. Pop PC, get sector base.
2. Get BSS Handle, Check size
3. Size != 2
4. UnRealloc des libraries (unreloc).
5. UnLocke it.
6. Realloc a 2.
8. Retourne Ptr or NULL.
Example:
#define RESSOURCE "res.h"
#include <pedrom.h>
long event(short id asm("d0"), long data asm("d1"))
{
return 0;
}
int main(int argc, char *argv[])
{
g = ropen();
printf( "Hello world from Application !\n"
"Counter: %d", g->counter);
g->counter++;
//rclose(); // We don't close the ressource file to keep the globals.
}
IDEE :
Au lieu du point d'entree _exit, utilise _main et ceci :
rts
dc.l 'Pedr'
dc.w 'oM'
etc
Suivi d'un format type 'Commentaire _nostub' ?
Dans ce cas, on reserverait comme truc :
* Point d'entree. (main)
* Evenement (event)
* Flags (Tableau de bit des evenements supportes)
* Dialogue
* Nom dans la Console
* Table d'import de libraries
IDEE:
* Au lieu d'utiliser event, utiliser directement le systeme d'exportation d'offset
et reserver des types. Donc au lieu d'avoir une seule fonction, on aura autant de fonctions
que d'evenements ?