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