***********************************************************
*                      RESET 4                            *
* Resetroutine über den ColdCapture & CoolCapture-Vektor  *
* von ExecBase. Programm wird in die Memorylist           *
* eingetragen.                                            *
* Frank Schäfer & Kickstart in 88/89                      *
* Für den DevPac-Assembler                                *
***********************************************************

        opt  d+                 * Debugger möglich machen

        incdir "dh1:Assembler/Devpac/Include/" * Wo sind die Includes
        INCLUDE exec/execbase.i  * ExecBase wird benötigt
        INCLUDE exec/exec_lib.i  * SysBase von hier
        INCLUDE RESETMACROS      * Die eigenen Macros

* Das eigentliche Programm zum Eintragen der Restroutine

        move.l  _SysBase,a6     * ExecBase nach a6
        jsr     copy            * Speicher belegen
        move.l  Ziel,a0         * Speicheradresse
        move.l  _SysBase,a6     * ExecBase nach a6
        move.l  a0,CoolCapture(a6)  * Memory belegen
        adda.l  #reset-memory,a0    * Offset bestimmen
        move.l  a0,ColdCapture(a6)  * ResetRoutine
        PRUEFSUMME              * Prüfsumme errechnen
        rts                     * Ins CLI zurück

NoMem:  addq.l   #4,a7          * Stack kooregieren
        move.w   #$FFF,$dff180  * Blinken
        rts      * zurück

* Die Memory-Routine wird vom CoolCapture-Pointer
* aufgerufen

copy:   move.l    #resetEnd-memory,d0 * Wie groß ist der
                                        * resetfeste Teil
        moveq     #2,d1         * Keine best. Speicherart
        CALLEXEC  AllocMem      * Speicher belegen
        move.l    d0,Ziel       * Adresse sichern
        beq       NoMem         * Kein Speicher verfügbar
        lea.l     memory,a0     * Von Wo
        move.l    d0,a1         * Nach Wo
        move.l    #resetEnd-memory,d0 * Wie groß
        CALLEXEC  CopyMem       * Kopieren
        rts                     * Und fertig


* Die memory-Routine wird vom CoolCapture-Vektor aus
* angesprungen und erklärt den benutzten Speicher
* als belegt.

memory: movem.l  d0-d7/a0-a6,-(sp)
        move.l   #resetEnd-memory,d0 * Speicherbereichgröße
        lea.l    Ziel(pc),a1
        move.l   (a1),a1             * Adresse des Breiches
        CALLEXEC AllocAbs            * Speicher belegen
        movem.l  (sp)+,d0-d7/a0-a6
        rts                          * Nach Exec zurück


* Die folgende Routine wird beim Reset, ColdCapture-Vektor,
* angesprungen

reset:  lea.l   Zurück(pc),a0
        move.l  a5,(a0)
        move.l  _SysBase,a6           * ExecBase nach a6
        lea.l   reset(pc),a0
        move.l  a0,ColdCapture(a6)  * Resetroutine

        DoSomethink             * Eigenes Programm

        lea.l   Zurück(pc),a0
        move.l  (a0),a5
        jmp     (a5)            * In Exec-Reset-Routine

Zurück  dc.l    0               * Rücksprungadresse
Ziel    dc.l    0               * Nach wo wurde kopiert

resetEnd:                       * Speicher bis hier belegen

        END

