*------------------------------------------------------------------- 
* Utility: VG-INSTALL version 1.0 
*-------------------------------------------------------------------
* (C) 1989 V.J.GUILLAUMIER
*-------------------------------------------------------------------
* This program installs a disk's boot block with 'FastRam version 1.2'
* a utility to switch on the Fast Ram expansion on an Amiga 1000
*
* See INSTALL-FAST.doc for a brief explanation.
*-------------------------------------------------------------------
* 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 FASTRAM ENABLE ROUTINE 	
*-------------------------------------------------------

*	CHECK IF RAM EXPANSION EXISTS

		MOVEM.L	D0-D7/A0-A6,-(A7)
		JSR	CHECKRAM(PC)
		BTST	#1,(A5)		;IF FLAG=1 BOOT
		BNE	BOOT
		MOVEM.L	(A7)+,D0-D7/A0-A6		
		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

CHECKRAM	LEA	$200000,A2
		MOVE.L	#$FBFBFBFB,$20(A2)	;CHECK IF RAM EXPANSION EXISTS
		CMPI.L	#$FBFBFBFB,$20(A2)
		BNE	EXIT1
		MOVE.L	#0,$20(A2)		;CLEAR RAM

*	DISPLAY	ALERT

		LEA	MEMPTR(PC),A5
		MOVE.L	4,A6
		MOVEQ	#0,D0		;VERSION DON'T CARE
		LEA	INTNAME(PC),A1
		JSR	OPENLIB(A6)	
		TST.L	D0
		BEQ	EXIT1
		MOVE.L	d0,4(A5)	;STORE TO DOSBASE

*	CHECK IF RAM HAS ALREADY BEEN ADDED

		MOVE.L	#4,D1
		JSR	AVAILMEM(A6)
		BEQ	DA
		BSET	#0,(A5)		;IF BIT 0 OF FLAG=1 THEN FASTRAM=ON 

*	ALERT PARAMETERS

DA		MOVE.L	4(A5),A6
		BTST	#0,(A5)
		BNE	M2		
		LEA	MESSAGE(pc),A0
		CLR.L	D0
		MOVE.L	#$60,D1
		JSR	DisplayAlert(a6)
		BNE	ADDRAM		;IF YES THEN ADD RAM
		BRA	CLOSE_LIB
M2		LEA	MESSAGE1(pc),A0
		CLR.L	D0
		MOVE.L	#$40,D1
		JSR	DisplayAlert(a6)		
		BEQ	NO_BOOT
		BSR	CLOSE_LIB
		BSET	#1,(A5)
		RTS

*	CLOSE	INTUITION LIBRARY

CLOSE_LIB	MOVE.L	4,A6
		MOVE.L	4(A5),A1
		JSR	CLOSELIB(A6)
EXIT1		RTS

NO_BOOT		BSR	CLOSE_LIB
		BCLR	#1,(A5)
		RTS

ADDRAM		BSR	CLOSE_LIB
		MOVE.L	#$200000,A2	;START OF FAST RAM
		MOVE.L	A2,A3		
		MOVE.L	A2,A4
		ADD.L	#$7FFF8,A2
NEXT		MOVE.L	#$FBFBFBFB,(A2)
		CMPI.L	#$FBFBFBFB,(A2)
		BNE	NO_MORE_RAM
		MOVE.L	#0,(A2)		;CLEAR RAM
		ADD.L	#$80000,A2	;CHECK THE NEXT HALF MEG.
		BRA	next
NO_MORE_RAM	SUB.L	#$80000,A2	;GET END ADDRESS OF EXP. RAM 
		SUB.L	A4,A2		;AVAILABLE RAM
		ADD.L	A2,A3		;END ADDRESS OF RAM
			
*	ADD Ram expansion

ADD		MOVE.L	A4,A1		;START OF FAST RAM ADDRESS
		MOVE.L	#$7B8,A0	;LIST structure	ADDRESS
		MOVE.B	#$A,$8(A1)
		MOVE.W	#5,$E(A1)
		MOVE.L	A1,$14(A1)
		MOVE.L	A3,$18(A1)	;UPPER ADDRESS OF FAST RAM
		ADD.L	#$20,A4		;ADD $20 BYTES TO FAST RAM
		MOVE.L	A4,$10(A1)	;ADDRESS  	
		SUB.L	#$20,A2		;AVAILABLE RAM
		MOVE.L	A2,$1C(A1)	
		MOVE.L	$1C(A1),$24(A1)
		MOVE.L	4,A6
		JSR	ADDHEAD(A6)
		BSET	#1,(A5)		
		RTS 
BOOT		MOVEM.L	(A7)+,D0-D7/A0-A6
		JMP	$FE88D6

MEMPTR				;MEMPTR IN A5
FLAG		DC.L	0	;0
Intbase		DC.L	0	;4	
IntName		DC.B	'intuition.library',0		
		EVEN
DOSNAME		DC.B	'dos.library',0
		EVEN
message		DC.B	$00,$5f,$12,' FASTRAM memory switch on for the Amiga 1000 ',0,1
		DC.B	$00,$F7,$20,' version 1.2 ',0,1
		DC.B	$00,$77,$2D,' - (C) 1989, V. J. Guillaumier, Malta - ',0,1
		DC.B	$00,$5F,$43,' You have Fast Ram fitted to the expansion port. ',0,1		
		DC.B	$00,$5F,$4E,' Do you want to add it to the systems memory ?',0,1 
		DC.B	$00,$05,$59,' Yes ',0,1
		DC.B	$02,$50,$59,' No ',0,0		
		EVEN
MESSAGE1	DC.B	$00,$52,$15,' You have Fast Ram added to the systems memory ',0,1
		DC.B	$00,$89,$25,' Do you want to boot another disk ?',0,1
		DC.B	$00,$05,$35,' Yes ',0,1
		DC.B	$02,$50,$35,' No ',0,0
		


ENDC



		
BBEND
BBSIZE	EQU	BBEnd-BBStart
*-------------------------------------------------------
*		END OF BOOTBLOCK AREA
*-------------------------------------------------------

		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 FASTRAM version 1.2',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



		



		
