*------------------------------------------------------------------- 
* Utility: VG-INSTALL version 1.0 
*-------------------------------------------------------------------
* (C) 1989 V.J.GUILLAUMIER
*-------------------------------------------------------------------
* This utility as it stands installs the disk in drive df0. When you
* load it from the cli it instructs you to change the disk in drive
* df0 before installing it. The program also checks to see if there 
* is a disk in drive df0, and if the write protect tab is off.
*-------------------------------------------------------------------
* Program written with DEVPAC version 2.12 tab setting 8
*-------------------------------------------------------------------
* Kickstart version 1.2
*-------------------------------------------------------------------

		opt c-,o+,w-                    

* DOS
OUTPUT		EQU	-60
WRITE		EQU	-48

* EXEC		
OPENLIB		EQU	-552
CLOSELIB	EQU	-414
FINDRESIDENT	EQU	-96
ALLOCMEM	EQU	-198
FREEMEM		EQU	-210
OPENDEVICE	EQU	-444
CLOSEDEVICE	EQU	-450
FINDTASK	EQU 	-294
DOIO		EQU	-456
ADDHEAD	 	EQU 	-240
REMHEAD		EQU	-258
DisplayAlert	EQU	-90
ALLOCABS	EQU	-204
AVAILMEM	EQU	-216

* OPEN DOS

STARTP		MOVE.L	4,A6
		MOVEQ	#0,D0
		LEA	DOSNAME(PC),A1
		JSR	OPENLIB(A6)
		TST.L	D0
		BEQ	QUIT
		MOVE.L	D0,DOSBASE

* WRITE MESSAGE

		MOVE.L	DOSBASE,A6
		JSR	OUTPUT(A6)
		MOVE.L	D0,D1
		MOVE.L	#ME1,D2
		MOVE.L	#ME1_LEN,D3
		JSR	WRITE(A6)
		BRA	AM

* NO DISK IN DRIVE MESSAGE

NO_DISK		MOVE.L	DOSBASE,A6
		JSR	OUTPUT(A6)
		MOVE.L	D0,D1
		MOVE.L	#ME2,D2
		MOVE.L	#ME2_LEN,D3
		JSR	WRITE(A6)
		BRA	MB						

* DISK IS WRITE PROTECTED MESSAGE		

WRITE_PROT	MOVE.L	DOSBASE,A6
		JSR	OUTPUT(A6)
		MOVE.L	D0,D1
		MOVE.L	#ME3,D2
		MOVE.L	#ME3_LEN,D3
		JSR	WRITE(A6)
		BRA	MB	

* ALLOCATE MEMORY FOR BUFFER 1024 BYTES
	
AM		MOVE.L	4,A6
		MOVE.L	#1024,D0
		MOVE.L	#$10002,D1
		JSR	ALLOCMEM(A6)
		TST.L	D0
		BEQ	QUIT1
		MOVE.L	D0,BUFFER

* COPY BOOT ROUTINE TO BUFFER AND CALCULATE CHECKSUM

SCOPY		MOVE.L	#BBSIZE/4-1,D7	;COUNTER
		MOVEQ	#0,D2		;CLEAR CHECKSUM
		MOVE.L	BUFFER,A1	;BUFFER ADDRESS IN A1
		MOVE.L	BUFFER,A3	;   "     "      " A3
		LEA	BBSTART(PC),A0	;ROUTINE ADDRESS IN A0
.LOOP		MOVE.L	(A0),(A1)+	;COPY TO BUFFER
		ADD.L	(A0)+,D2	;CALCULATE CHECKSUM
		BCC	.P		;JUMP ON OVERFLOW
		ADDQ.L	#1,D2
.P		DBF	D7,.LOOP
		NOT.L	D2
		MOVE.L	D2,4(A3)		
					

* INITIALISE DISKPORT

		SUB.L	A1,A1		;CLEAR A1
		MOVE.L	4,A6
		JSR	FINDTASK(A6)
		LEA	DiskPort(PC),A0
		MOVE.L	D0,16(A0)	;SAVE TASK ADDRESS IN STRUCTURE

* OPEN DISK DEVICE

		LEA	DISKIOREQ(PC),A1
		MOVEQ	#0,D0		;UNIT NUMBER
		MOVEQ	#0,D1		;FLAGS
		LEA	DiskName(PC),A0
		JSR	OPENDEVICE(A6)
		BNE	QUIT2

* CHECK FOR MOUSE BUTTON

MB		BTST	#6,$BFE001
		BNE	MB
DLY		MOVE.L	#$FFFF,D7
.1		DBF	D7,.1

* CHECK IF DISK IS IN DRIVE DF0

		MOVE.L	4,A6
		LEA	DISKIOREQ(PC),A1
		MOVE.W	#14,28(A1)	;IO_CMD CHANGESTATE
		JSR	DOIO(A6)
		MOVE.L	32(A1),D0
		BNE	NO_DISK

* CHECK IF DISK IS WRITE PROTECTED

		LEA	DISKIOREQ(PC),A1
		MOVE.W	#15,28(A1)	;IO_CMD PROTSTATUS
		JSR	DOIO(A6)
		MOVE.L	32(A1),D0
		BNE	WRITE_PROT			

* WRITE BOOT BLOCK TO DISK

		LEA	DISKIOREQ(PC),A1
		MOVE.W	#3,28(A1)	;IO_CMD WRITE
		MOVE.L	#1024,36(A1)
		MOVE.L	BUFFER,40(A1)
		JSR	DOIO(A6)

* FLUSH ALL DATA TO DISK		
			 	
		MOVE.W	#4,28(A1)	;IO_CMD FLUSH
		JSR	DOIO(A6)
		TST.L	D0
		BNE	QUIT3

* SHUT DOWN MOTOR
		
		MOVE.W	#9,28(A1)	;IO_CMD MOTOR
		CLR.L	36(A1)		;CLEAR IO_LENGTH
		JSR	DOIO(A6)
		TST.L	D0
		BEQ	QUIT3		
		
QUIT3		LEA	DISKIOREQ(PC),A1
		JSR	CLOSEDEVICE(A6)				
QUIT2		MOVE.L	4,A6
		MOVE.L	BUFFER,A1
		MOVE.L	#1024,D0
		JSR	FREEMEM(A6)
			
QUIT1		MOVE.L	4,A6
		MOVE.L	DOSBASE,A1
		JSR	CLOSELIB(A6)
QUIT		RTS 


*------------------------------------------------------
*		 START OF BOOTBLOCK AREA
*------------------------------------------------------

BBSTART		DC.B	'DOS',0		;DISK ID
		DC.L	0		;CHECKSUM 
		DC.L	880		;ROOTBLOCK
*-------------------------------------------------------
*		START OF INSTALL ROUTINE
*-------------------------------------------------------
		MOVE.L	4,A6
		LEA	DOSNAME(PC),A1
		JSR	FINDRESIDENT(A6)
		TST.L	D0
		BEQ	GURU
		MOVE.L	D0,A0
		MOVE.L	$16(A0),A0
		MOVEQ	#0,D0
		RTS
GURU		MOVEQ	#-1,D0
		RTS		
DOSNAME		DC.B	'dos.library',0

		
BBEND
BBSIZE	EQU	BBEnd-BBStart
*--------------------------------------------------------
*		END OF BOOTBLOCK
*--------------------------------------------------------
		CNOP 	0,4
BUFFER		DC.L	0
DOSBASE		DC.L	0

DiskName	DC.B	'trackdisk.device',0
		EVEN
ME1		DC.B	10,'VG-INSTALL version 1.0'
		DC.B	10,'INSTALLING DISK ',10
		DC.B	10,'Insert disk in drive df0 and press left mouse button ',10
ME1_LEN		EQU	*-ME1
		EVEN
ME2		DC.B	10,'No disk in drive df0.',10
		DC.B	'Insert disk and press mouse button.',10
ME2_LEN		EQU	*-ME2
		EVEN
ME3		DC.B	10,'Disk is write protected.',10
		DC.B	'Press mouse button when ready.',10
ME3_LEN		EQU	*-ME3								

		CNOP	0,4
DiskPort	DC.L	0	;0
		DC.L	0	;4
		DC.W	$0400	;8
		DC.L	0	;10
		DC.B	0	;14
		DC.B	31	;15
		DC.L	0	;16	Task addr goes here
LH1		DC.L	LH2	;20
LH2		DC.L	0	;24
		DC.L	LH1	;28
		DC.B	0	;32
		DC.B	0	;33
DiskIOReq	DC.L	0	;0
		DC.L	0	;4
		DC.B	5	;8
		DC.B	0	;9
		DC.L	0	;10
		DC.L	DiskPort ;14
		DC.W	48	;18
		DC.L	0	;20
		DC.L	0	;24
		DC.W	0	;28 IO_CMD
		DC.W	0	;30
		DC.L	0	;32
		DC.L	0	;36 IO_LENGTH
		DC.L	0	;40 IO_DATA
		DC.L	0	;44 IO_OFFSET
 		DC.L	0
		DC.L	0

		END



		



		
