;**** GrabKick.a ******************************************

	NOLIST
	INCDIR	AINCLUDE:
	INCLUDE	libraries/dosextens.i
	INCLUDE lvo.i
	INCLUDE dos/dos.i
	INCLUDE	exec/execbase.i
	INCLUDE	workbench/startup.i
	INCLUDE	workbench/workbench.i
	INCLUDE	libraries/asl.i
	LIST

; Programmheader
;
;	Name:		GrabKick
;	Author:		SDI
;	Distribution:	PD
;	Description:	liest Kickstart aus und schreibt ihn in Datei
;	Compileropts:	-
;	Linkeropts:	-
;	CLI-Parameter:	FILENAME
;
; 1.2   07.08.95 : neue Berechnung für Revisionsnummer gleicht Rechen-
;	fehler von MaxonC++ aus - Länge 880
; 1.3   03.12.95 : Mit Assembler neukompiliert - Länge 244
; 1.4   04.12.95 : etwas verkürzt - Länge 236
; 1.5   10.12.95 : etwas verkürzt - Länge 228
; 1.6   19.12.95 : läuft auch von WB aus - Länge 300
; 1.7   05.01.96 : CLI Parameter Filename eingebaut, Fehler entfernt
;	Länge 332
; 1.8   10.02.96 : Asl-Requester bei Workbench-Start, neues Icon - Länge 508
; 1.9   11.02.96 : etwas gekürzt, Text kommentiert - Länge 488
; 1.10  12.02.96 : kleine Änderung - Länge 484
; 1.11  14.02.96 : CMPA.L #0,Ax durch MOVE.L Ax,D0 ersetzt - Länge 476

;**** Programm ********************************************

	SECTION "GrabKick",CODE
	SUBQ.W	#1,D0		; SUBQ statt Offset -1, da TST statt CMP #1
	CLR.B	(A0,D0.W)		;Letztes Zeichen 0 - CString
	MOVE.L	A0,D5				;D5 - CLI-Parameter Name!
	TST.W	D0	;Wenn nur ein Zeichen, dann kein Param. angegeben!
	BNE.B	.start
	MOVEQ	#0,D5				;D5 - löschen, da leer
.start	MOVEQ	#0,D7				;D7 - später StartupM! = 0
	MOVEA.L	4.W,A6
	MOVEA.L	ThisTask(A6),A4
	TST.L	pr_CLI(A4)		;Laufen wir unter WB?
	BNE.B	.CLI
	LEA	pr_MsgPort(A4),A0
	JSR	_LVOWaitPort(A6)	;Warte auf Start-Message
	LEA	pr_MsgPort(A4),A0
	JSR	_LVOGetMsg(A6)		;Hole Msg
	MOVE.L	D0,D7				;D7 - WBStartUp Message
.CLI	LEA	KICKEND(PC),A2			;A2 - KickStr-Ende
	MOVEQ	#33,D0
	LEA	DOSNAME(PC),A1
	JSR	_LVOOpenLibrary(A6)	;Open Dos-Lib
	TST.L	D0			;Fataler Fehler : Librarybase = 0?
	BEQ.B	.goend			;statt BEG.W ENDE (-2 Byte)
	MOVEA.L	D0,A5				;A5 - DosBase
	TST.L	D7
	BEQ.B	.NoWB
	MOVEA.L	D7,A0
	MOVEA.L	sm_ArgList(A0),A0	;Bei WB-Start Progdir ermitteln
	MOVE.L	A0,D0			;statt CMPA.L #0,A0 (-4 Byte)
.goend	BEQ.W	ENDE
	MOVE.L	(A0),D1			;und setzen
	MOVEA.L	A5,A6
	JSR	_LVOCurrentDir(A6)
.NoWB	LEA	$01000000,A3		;Kick-ROM Ende -> feste Adresse
	MOVE.L	-20(A3),D3			;D3 - RomSize
	SUBA.L	D3,A3				;A3 - Romstart
	MOVE.W	12(A3),D4			;D4 - Romvers
	MULU	#1000,D4
	ADD.W	14(A3),D4			;D4 - Fullversion
.LOOP					;kick..... Namen berechnen
	MOVE.L	D4,D2
	DIVU	#10,D2			;durch Zehn teilen
	MOVE.W	D2,D4			;Ergebnis nach D4
	SWAP	D2
	ADD.B	D2,-(A2)		;Rest in Namensfile
	TST.L	D4
	BNE.B	.LOOP
;Schleifenende					;D4 wieder frei
	MOVEA.L	D5,A2				;A2 - CLI-Name oder
	TST.L	D5
	BNE.B	.GoOn
	LEA	KICKSTR(PC),A2			;A2 - kick.....
.GoOn	MOVEQ	#0,D6				;D6 - später Asl-Base!  = 0
	MOVEQ	#0,D5				;D5 - später Lock! = 0
	TST.L	D7			;WB ?, dann Asl, sonst normal weiter
	BEQ.B	Open
	MOVEA.L	4.W,A6
	LEA	ASLNAME(PC),A1
	MOVEQ	#37,D0
	JSR	_LVOOpenLibrary(A6)	;Open asl.library
	MOVE.L	D0,D6				;D6 - AslBase
	BEQ.B	Open			;failed ?, dann weiter wie in CLI
	MOVEA.L	D6,A6
	MOVEQ	#ASL_FileRequest,D0
	LEA	TAGITEM(PC),A0
	JSR	_LVOAllocAslRequest(A6)	;Struktur anlegen
	MOVEA.L	D0,A4				;A4 - FileRequester
	TST.L	D0
	BEQ.B	Open			;failed ?, dann weiter wie in CLI
	MOVEA.L	A4,A0
	LEA	TAGITEM(PC),A1
	JSR	_LVOAslRequest(A6)	;Requester aufrufen
	TST.L	D0
	BEQ.B	CLEANUP			;failed?, dann beenden
	MOVE.L	fr_Drawer(A4),D1
	MOVEQ	#SHARED_LOCK,D2			;Zugriffsmodus
	MOVEA.L	A5,A6
	JSR	_LVOLock(A6)		;Lock auf Verzeichnis
	MOVE.L	D0,D5				;D5 - Lock
	BEQ.B	CLEANUP			;failed?, dann beenden
	MOVE.L	D5,D1
	JSR	_LVOCurrentDir(A6)	;und dieses als aktuelles Verzeichnis
	MOVEA.L	fr_File(A4),A2			;A2 - Asl-Name
Open	MOVE.L	A2,D1			;Name-Parameter
	MOVE.W	#MODE_NEWFILE,D2	;Modus-Parameter
	MOVEA.L	A5,A6
	JSR	_LVOOpen(A6)
	MOVE.L	D0,D4				;D4 - Filehandle
	BEQ.B	CLEANUP
					;Anzahl-Parameter D3 hat schon Wert
	MOVE.L	D4,D1			;Filehandle-Parameter
	MOVE.L	A3,D2			;Puffer-Parameter
	JSR	_LVOWrite(A6)
	MOVE.L	D0,D2		;D2 - Write Rückgabe
	MOVE.L	D4,D1			;Filehandle-Parameter
	JSR	_LVOClose(A6)
	CMP.L	D3,D2		;D2 != D3, dann File löschen
	BEQ.B	CLEANUP
	MOVE.L	A2,D1
	JSR	_LVODeleteFile(A6)
CLEANUP
	MOVE.L	D5,D1
	BEQ.B	.next
	JSR	_LVOUnLock(A6)		;Lock freigeben
.next	TST.L	D6
	BEQ.B	.clsdos
	MOVE.L	A4,D0		;statt CMPA.L #0,A4 (-4 Byte)
	BEQ.B	.clsasl
	MOVEA.L	A4,A0
	MOVEA.L	D6,A6
	JSR	_LVOFreeAslRequest(A6)	;Filerequester schließen
.clsasl	MOVEA.L	4.W,A6
	MOVEA.L	D6,A1
	JSR	_LVOCloseLibrary(A6)	;Close Asl
.clsdos	MOVEA.L	4.W,A6
	MOVEA.L	A5,A1
	JSR	_LVOCloseLibrary(A6)	;Close Dos
ENDE
	TST.L	D7			;von Workbench ?
	BEQ.B	.exit			;nein - war CLI

	JSR	_LVOForbid(A6)		;Schutzmaßnahme
	MOVEA.L	D7,A1			;Message holen
	JSR	_LVOReplyMsg(A6)

	MOVEQ	#0,D0
.exit	RTS	
DOSNAME	CSTRING	'dos.library'
ASLNAME	CSTRING	'asl.library'
KICKSTR	DC.B	'kick00000'
KICKEND	DC.B	0
TAGITEM	DC.L	ASLFR_InitialFile,KICKSTR,0
	CSTRING	'$VER: GrabKick 1.11 (14.02.96) (PD) by SDI'
	END

