	*************************************************
	* Programmname:	FReset (von A.Schranz)		*
	*						*
	* Funktion:	schneller Reset bei A1200	*
	*						*
	* Sprache:	Assembler (DEVPAC 2.14D)	*
	*************************************************

		INCDIR	INCLUDE/
		INCLUDE	EXEC/EXECBASE.I
		INCLUDE	EXEC/EXEC_LIB.I
		INCLUDE	EXEC/RESIDENT.I
		INCLUDE	HARDWARE/CUSTOM.I
		INCLUDE	LIBRARIES/DOSEXTENS.I

	IFND	DMA
DMA		EQU	$DFF000
	ENDC

		Section	S,CODE
S		MOVE.L	$4.W,A6
		MOVE.L	ThisTask(A6),A3
		MOVEQ	#0,D0
		TST.L	pr_CLI(A3)
		BNE.S	.CLI
		LEA	pr_MsgPort(A3),A0
		JSR	_LVOWaitPort(A6)
		LEA	pr_MsgPort(A3),A0
		JSR	_LVOGetMsg(A6)
.CLI		MOVE.L	D0,-(SP)
		LEA	S-4(PC),A2		;Ist es der erste Programm-
		MOVE.L	(A2),D0			;aufruf, so wird das
		ADDQ.L	#1,D0			;zweite Segment von ersten
		ADD.L	D0,D0			;getrennt.
		ADD.L	D0,D0			;deshalb sollte A2 vor denn
		MOVE.L	D0,-(SP)		;Programmpunkt .1ST in (INIT)
		RTS				;nicht geändert werden.

;--------------------------------------------->	INIT.routine
		Section	InitRes,CODE_C
INIT		LEA	RES_NAME(PC),A1		;testen ob wir schon
		JSR	_LVOFindResident(A6)	;resident sind
		TST.L	D0
		BEQ.S	.G0
.WB_CHECK	MOVE.L	(SP)+,D0
		BEQ.S	.NO_WB
		MOVE.L	D0,A1
		JSR	_LVOReplyMsg(A6)
		MOVEQ	#0,D0			;ja
.NO_WB		RTS
.G0		MOVE.L	KickTagPtr(A6),D0	;falls noch kein Reset
		BEQ.S	.1ST			;durchgeführt wurde,
.NEXT_LIST	MOVE.L	D0,A0			;testen ob wir in einer der
.L0		MOVE.L	(A0)+,D0		;KickTagPointers stehen
		BEQ.S	.1ST			;wenn 0 dann letzter eintrag
		BPL.S	.SEARCH			;falls negativ, handelt
		BCLR	#31,D0			;es sich um einen Zeiger
		BRA.S	.NEXT_LIST		;auf die nächste Liste
.SEARCH		LEA	RES_NAME(PC),A1		;ist es unsere ResidentStruktur?
		MOVE.L	D0,A3
		MOVE.L	RT_NAME(A3),A3
.L1		CMPM.B	(A1)+,(A3)+
		BNE.S	.L0
		TST.B	-1(A3)
		BNE.S	.L1
		BRA.S	.WB_CHECK		;ja !
.1ST		MOVE.L	D0,(A2)			;Sind noch nicht im System
		LEA	KICKTAG_TABLE(PC),A0	;(aber jetzt !!!)
		LEA	RES_MEM_LIST(PC),A1
		MOVE.L	KickTagPtr(A6),4(A0)	;falls schon eine Liste
		BEQ.S	.NO_KICKTAG		;vorhanden dann mit vorzeichen
		OR.B	#$80,4(A0)		;in unser eintragen.
.NO_KICKTAG	MOVE.L	A0,KickTagPtr(A6)
		MOVE.L	KickMemPtr(A6),D0	;da wir unser Programm nicht
		BEQ.S	.1ST_KICKMEM		;bei jedem Reset allokieren
		MOVE.L	D0,LN_SUCC(A1)		;wollen, tragen wir die
		MOVE.L	D0,A0			;MemoryNode in den KickMemPtr
		MOVE.L	A1,LN_PRED(A0)		;ein.
.1ST_KICKMEM	MOVE.L	A1,KickMemPtr(A6)	;zum schluß noch die
		JSR	_LVOSumKickData(A6)	;KickData Checksumme berechnen
		MOVE.L	D0,KickCheckSum(A6)	;und eintragen
		BRA.S	.WB_CHECK

;--------------------------------------------->	RESIDENT.routine
REM_SCSI	MOVEM.L	D1-2/A0-2/A6,-(SP)
		LEA	SCSI_N(PC),A1
		MOVE.L	$4.W,A6
		JSR	_LVOFindResident(A6)
		TST.L	D0
		BEQ.S	.ERROR
		MOVE.L	ResModules(A6),A0
.L0		MOVE.L	(A0)+,D1
		BEQ.S	.ERROR
		BPL.S	.G0
		BCLR	#31,D1
		MOVE.L	D1,A0
		BRA.S	.L0
.G0		CMP.L	D0,D1
		BNE.S	.L0
		MOVE.L	D0,A2
		LEA	NEW_SCSI(PC),A1
		MOVE.B	RT_PRI(A2),RT_PRI(A1)
		MOVE.L	A2,RT_SIZE(A1)
		MOVE.L	A1,-4(A0)
		MOVEM.L	(SP)+,D1-2/A0-2/A6
		MOVEQ	#0,D0
		RTS
.ERROR		MOVEQ	#-1,D0
		MOVEQ	#9,D2
		LEA	DMA,A5
.L1		MOVE.W	vhposr(A5),D1
		AND.W	#$F33,D1
		MOVE.W	D1,$180(A5)
		DBF	D0,.L1
		DBF	D2,.L1
		MOVEM.L	(SP)+,D1-2/A0-2/A6
		RTS

REPARE		LEA	NEW_SCSI(PC),A0
		MOVE.L	$4.W,A6
		MOVE.L	ResModules(A6),A1
.L0		MOVE.L	(A1)+,D0
		BEQ.S	.FIN
		BPL.S	.CHECK
		BCLR	#31,D0
		MOVE.L	D0,A1
		BRA.S	.L0
.CHECK		CMP.L	D0,A0
		BNE.S	.L0
		MOVE.L	RT_SIZE(A0),-4(A1)
.FIN		RTS
;--------------------------------------------->	DATAFIELD's
		CNOP	0,4
NEW_SCSI	DC.W	RTC_MATCHWORD
		DC.L	NEW_SCSI,RES_END
		DC.B	1,1,0,0
		DC.L	SCSI_N
		DC.L	SCSI_N
		DC.L	REPARE
		DS.L	1			;hier wird die Original
		CNOP	0,4			;ResidentStruktur gerettet
RES_STRUCT	DC.W	RTC_MATCHWORD
		DC.L	RES_STRUCT,RES_END	;ab ResEnd weiter suchen !
		DC.B	1			;RT_FLAGS
		DC.B	1			;RT_VERSION
		DC.B	0			;RT_TYPE
		DC.B	104			;RT_PRI
		DC.L	RES_NAME		;RT_NAME
		DC.L	RES_NAME		;RT_IDSTRING
		DC.L	REM_SCSI		;RT_INIT
		CNOP	0,4
KICKTAG_TABLE	DC.L	RES_STRUCT
		DS.L	1
RES_MEM_LIST	DS.L	2
		DC.B	NT_MEMORY,0
		DC.L	RES_NAME
		DC.W	1
		DC.L	REM_SCSI,RES_END-REM_SCSI
RES_NAME	DC.B	'FReset',0
SCSI_N		DC.B	'scsi.device',0
		EVEN
RES_END


