; KickReboot.asm geschrieben von Patrick Ohly
; nach ColdReboot.asm veröffentlicht von Commodore


ABSEXECBASE			EQU 4					;Zeiger auf ExecBase
MAGIC_ROMEND		EQU $01000000		;Ende des Kickstart-ROMs
MAGIC_SIZEOFFSET	EQU -$14				;Offset vom Ende des ROMs zur Größe
_LVOSupervisor		EQU -30				;Offset der Supervisor-Funktion
_LVODisable			EQU -120				;Offset der Disable-Funktion
CHKSUM				EQU $52				;Offset für Library-Checksum
PRA					EQU $bfe001			;Register mit linker Maustaste
LMB					EQU 6					;Bit für die linke Maustaste


   section text,code

   XDEF _KickReboot
_KickReboot:
		move.l	ABSEXECBASE,a6
		jsr	_LVODisable(a6)			;schalte Interrupts ab
		addq.w	#1,CHKSUM(a6)			;erzwingt Neuaufbau der ExecBase
		lea.l	Loop(pc),a5             ;Adresse des auszuführenden Codes 
		jsr	_LVOSupervisor(a6)      ;Code anspringen
		;Funktion wird nicht beendet!


		ds.l		0
Loop: move.b PRA,d0		;Auf Mausklick warten ...
		btst #LMB,d0
		bne  Loop

		lea.l	MAGIC_ROMEND,a0			;Adresse der Initialisierungs-
		sub.l	MAGIC_SIZEOFFSET(a0),a0 ;Routine im ROM ausrechnen ...
		move.l	4(a0),a0
		subq.l	#2,a0
		reset									;Reset ...
		jmp	(a0)                    ;Routine anspringen
