|
mxInit.c |
/* mxInit.c */
#include "mxInit.h"
#include "mxStrukturen.h"
#include "mxInterpreter.h"
#include "mxUnterbrechung.h"
#include "mxAbbruch.h"
#include "mxSystem.h"
#include "mxSeriell.h"
#include "mxLED.h"
#define COPYDATA
/**********************
** Globale Varibalen **
**********************/
#ifdef COPYDATA
int _copydata = -1;
#endif
extern unsigned long _btext, _etext, _bdata, _edata, _end; /* Vom Linker generierte Variablen */
char *_static_top;
char **environ; /* Standart-Variablen in ANSI-C */
int errno; /* (werden von MinMax nicht benutzt) */
/* -------------------------------------------------------------------------------------------------------------------- */
/***************
** Funktionen **
***************/
void _move_sp_to_top_and_jump_to_program(int stackmagi, char**argv, char**envp) {
/*
* Hier faengt MinMax an zu laufen, diese Funktion MUSS am Anfang stehen
* Diese Funktion darf keine lokalen Variablen benutzen, da sie den sp verschiebt
* Der sp liegt dann unter der RAM-Disk und das Programm wird angesprungen
*/
asm("MOVE.L (SP)+, D0 "); /* Stackinhalt kopieren */
asm("MOVE.L (SP)+, D1 ");
asm("MOVE.L (SP)+, D2 ");
asm("MOVE.L (SP)+, D3 ");
asm("MOVE.L #0x20000, SP"); /* Stack nach cRAMDiskStart */
asm("MOVE.L D3, -(SP) ");
asm("MOVE.L D2, -(SP) ");
asm("MOVE.L D1, -(SP) ");
asm("BRA __start ");
}
void _start(int stackmagi, char **argv, char **envp)
{
long cnt; /* Counter fuer Argumente zum Kern (ist NULL) */
static char *nix = (char *) 0; /* leeres Array (fuer Argumente & Environment) */
unsigned long *dest, *src, *data;
char **cpp;
int code;
data = (unsigned long*)((char*)&_btext + *(&_btext-7) /*- 32*/);
if(data != &_bdata){
for(src = data, dest = &_bdata; dest < &_edata;)
*dest++ = *src++;
#ifdef COPYDATA
*(&_btext-7) = (char*)&_bdata - (char*)&_btext /*+ 32*/;
}
if (_copydata) {
for(src = &_bdata, dest = &_end; src < &_edata;)
*dest++ = *src++;
_copydata = 0;
} else {
for(src = &_end, dest = &_bdata; dest < &_edata;)
*dest++ = *src++;
_copydata = 0;
#endif
}
for(dest = &_edata; dest < &_end; *dest++ = 0); /* BSS-Segment loeschen */
_static_top = (char *)&_end; /* statische und globale Variablen init. */
if(stackmagi == STACK_MAGIC) { /* Gibts Parameter? */
for(cpp = argv, cnt = 0; *cpp++ != (char *) 0; cnt++); /* ja => dann in einer Schleife zaehlen */
} else {
argv = envp = &nix; /* nein => Argument- & Environmentliste = leer */
cnt = 0; /* und Anzahl der Args. = 0 */
environ = envp; /* Environmentpointer setzen */
}
code = main(cnt, argv); /* Aufruf des Hauptprogramms */
Setze7SegmentZahl(-1,-1); /* LED abschalten */
//Setze7SegmentZahl(42,2);
SchreibSeriell(cEndeZeichen); /* Termination anzeigen */
// SchreibSeriell('l');SchreibSeriell('a');
StelleInterruptVektorenWiederHerUndSperreUhrInterrupt(); /* genau das */
_exit(code); /* fertig */
} /* _start */
/* -------------------------------------------------------------------------------------------------------------------- */
void _exit(int ret)
{
Lock(); /* Systemmodus und Unterbrechungen gesperrt */
asm("MOVE.L 4(SP),D0"); /* Rueckgabewert (momentan ungenutzt) */
asm("TRAP #7"); /* Der Bootmonitor erkennt einen Trap #7 als */
/* exit (d0 enthaelt den Exit-Code) */
while(TRUE); /* Compiler erkennt nicht, dass hier Schluss ist*/
} /* _exit */
/* -------------------------------------------------------------------------------------------------------------------- */
Bei Problemen mit der Seite bitte eine Mail an Marek
Converted with C2HTML V0.669 by Iluvatar
Prozeßdatenverarbeitung