*******************************************************************************
* COMPARE   vergleicht die game disk mit der getrainten disk und speichert    *
* alle unterschiedlichen blöcke in file: datenfile des akktuellen Dirs ab !   *
* Format :          							      *
*  offset: 0   .w  :     anzahl der zu schreibenden blöcke !		      *
*          2-  .w  :     offsets des blockes auf der disk !                   *
*	   512     :     erster block  512 byte lang dan der nächste	      *
*                                V 1.00          [GRAiN/DTC 07/19/92]         *
*******************************************************************************

                include "dh0:code/include/exec/exec_lib.i"
last	=	2*20		* letzter Block (11*79*2)



_LVOOutput	 equ    -60		;DOS: Output-Handle holen
_LVOWrite	 equ    -48		;     Ausgabe

x:		move.l	a0,clineadd	* cli-command  addr
		move.l	d0,clinelen	* cli-command  lenght
		move.b	#0,-1(a0,d0)

		move.l	#databuffer+2,datavector
		move.l	#blockbuffer,curbufvector



_main		move.l	#dosname,a1		;Name der DOS-Lib 
		moveq	#0,d0			;Version egal
		move.l  _SysBase,a6		;Basis Exec
   		jsr     _LVOOpenLibrary(a6)	;DOS-Lib oeffnen
		tst.l	d0			;Fehler?
		beq	fini			;wenn Fehler, Ende
		move.l	d0,DOSBase		;Zeiger merken

		move.l	#curoff,tsource
		move.l	#5,tlaenge
		bsr	print

		move.l	#text1,tsource
		move.l	#(text1e-text1),tlaenge
		bsr	print

		
		cmp.l	#1,clinelen
		bne	nohelptext
		move.l	#help,tsource
		move.l	#helpe-help,tlaenge
		bsr	print
		bra	ente


nohelptext:
                move.l	#0,a1
                CALLEXEC FindTask               * Task suchen
                move.l  d0,ReplyPort+16	        * MsgPort
                lea     ReplyPort,a1            * initialisieren und
                CALLEXEC AddPort                * einfügen


                lea     DiskIO0,a1              * IOTrackDisk laden
                move.l  #0,d0			* Laufwerk  dfx (0)
                moveq   #0,d1                   * keine Spezial-Flags
                lea     DevName,a0              * Name des Devices
                CALLEXEC OpenDevice             * Device öffnen
		tst.l   d0                      * hat's geklappt?
                beq	drive1device   	

		move.l	#noDrive0,tsource
		move.l	#(noDrive0e-nodrive0),tlaenge
		bsr	print
		bra	Abort          

drive1device:
		bsr	enter

                lea     DiskIO1,a1               * IOTrackDisk laden
                move.l  #1,d0                	* Laufwerk  dfx (0)
                moveq   #0,d1                   * keine Spezial-Flags
                lea     DevName,a0              * Name des Devices
                CALLEXEC OpenDevice             * Device öffnen
		tst.l   d0                      * hat's geklappt?
                beq	starttest   	

		move.l	#noDrive1,tsource
		move.l	#(noDrive1e-nodrive1),tlaenge
		bsr	print
		bra	Abort          


******************************************************************************
starttest:	bsr	enter
loadnext:
		bsr	loadblock

		move.l	#line,tsource
		move.l	#2,tlaenge
		bsr	print
		bsr	trackprint
		bsr	compare		
		bsr	freeprint
	
		add	#1,curtrack
		cmp	#160,curtrack
		bne	loadnext
		

		move	savecounter,databuffer

		move.l	#savtxt,tsource
		move.l	#savtxte-savtxt,tlaenge
		bsr	print


		move.l	dosbase,a6
		move.l	#1006,d2	* Mode :  NEWFILE
		move.l	clineadd,d1
		jsr	-30(a6)		* open
		move.l	d0,datei
		beq	endoftest
		

		move.l	#databuffer,d2
		move.l	#000,d3
		move	savecounter,d3
		asl.l	#8,d3
		asl.l	#1,d3
		add.l	#512,d3
*		move.l	#90112,d3
		move.l	datei,d1
		jsr	-48(a6)		* write
		tst	d0
		bmi	withclose

		
		move.l	#endtxt,tsource
		move.l	#endtxte-endtxt,tlaenge
		bsr	print

		


****************************************************************************** 
withclose:

		move.l	datei,d1
		jsr	-36(a6)		* close
		

endoftest:	
		jsr	-132(a6)
		move.l	d0,$60004

ende:
		lea     DiskIO0,a1
                CALLEXEC CloseDevice            * Device schließen

		lea     DiskIO1,a1
                CALLEXEC CloseDevice            * Device schließen


Abort:		lea     ReplyPort,a1
		CALLEXEC RemPort                * Port entfernen

ente:

		move.l	#curon,tsource
		move.l	#5,tlaenge
		bsr	print

		move.l	DOSBase,a1		;Basis der Lib
		move.l  _SysBase,a6		;Basis Exec
        	jsr     _LVOCloseLibrary(a6)	;Funktion "Schliessen"



fini:
		move.l	clineadd,$60000
		move.l	#00000,d0
		rts				;Return zum CLI




******************* S U B R O U T I N E S *******************************
compare:
		lea	buffer0,a0
		lea	buffer1,a1
		move.l	a0,curgameblock
		move.l	a1,curtrainblock

		move	#11-1,d6
cmp_3:		move	#512/4-1,d7
		move.l	curtrainblock,a1
		move.l	curgameblock,a0
		
cmp_1:		
		cmpm.l	(a0)+,(a1)+
		bne	saveblock
		dbf	d7,cmp_1
		move.l	#equal,tsource
		move.l	#6,tlaenge
		bsr	print
		bra	cmp_e
saveblock:
		move.l	datavector,a2
		move	curblock,(a2)+
		move.l	a2,datavector	
		move.l	curtrainblock,a2
		move.l	curbufvector,a3
		move	#512/4-1,d7
cmp_2:		move.l	(a2)+,(a3)+			
		dbf	d7,cmp_2
		add	#1,savecounter
		add.l	#512,curbufvector
		cmp	#255,savecounter
		bhi	endofsave
		move.l	#nequal,tsource
		move.l	#6,tlaenge
		bsr	print
		bra	cmp_e
cmp_e:		
		add	#1,curblock
		add.l	#512,curtrainblock
		add.l	#512,curgameblock
		dbf	d6,cmp_3
		rts

endofsave:	move.l	#toomany,tsource
		move.l	#toomanye-toomany,tlaenge
		bsr	print
		move.l	(sp)+,a0
		bra	endoftest

		

LoadBlock:    


                lea     DiskIO0,a1                                         
                move.l  #ReplyPort,14(a1)        * Nachrichten-Port laden
		move.w  #2,28(a1)		* Kommando: lesen         
                move.l  #512*11,36(a1)		* Länge: 512 Bytes * track
                move.l  #buffer0,40(a1)		* Adresse
		moveq	#0,d0
                move	curblock,d0
                asl.l	#8,d0
                asl.l	#1,d0            
                move.l	d0,44(a1)		* Byte-Offset startblock    
		movem.l d1-d3/a1-a3,-(SP)               
                CALLEXEC DoIO			* und 'reinladen!         
		movem.l (SP)+,d1-d3/a1-a3    
		move	d0,error
		beq	loaddf1

		move.l	#noDisk0,tsource
		move.l	#(noDisk0e-nodisk0),tlaenge
		bsr	print
		move.l	(sp)+,a0
		bra	ende

loaddf1:
                lea     DiskIO1,a1                                         
                move.l  #ReplyPort,14(a1)        * Nachrichten-Port laden
		move.w  #2,28(a1)		* Kommando: lesen         
                move.l  #512*11,36(a1)		* Länge: 512 Bytes * track
                move.l  #buffer1,40(a1)		* Adresse
		moveq	#0,d0
                move	curblock,d0
                asl.l	#8,d0
                asl.l	#1,d0            
                move.l	d0,44(a1)		* Byte-Offset startblock    
		movem.l d1-d3/a1-a3,-(SP)               
                CALLEXEC DoIO			* und 'reinladen!         
		movem.l (SP)+,d1-d3/a1-a3    
		move	d0,error

		beq	return	
errors:
		move.l	#noDisk1,tsource
		move.l	#(noDisk1e-nodisk1),tlaenge
		bsr	print
		move.l	(sp)+,a0
		bra	ende
return:
		rts				

			
trackprint:
		moveq	#0,d0
		move	curblock,d0
		beq	trpri_0
trpri_0:	divu	#11,d0
		lea 	printbuffer,a0
		move.b	#"0",(a0)
		cmp	#100,d0
		bmi	trpri_1
		move.b	#"1",(a0)
		sub	#100,d0
trpri_1:	
		lea	1(a0),a0
		move.l	d0,d1
		divu	#10,d0				
		move.b	d0,(a0)
		add.b	#$30,(a0)+
		mulu	#10,d0
		sub	d0,d1
		move.b	d1,(a0)
		add.b	#$30,(a0)+
		move.b	#":",(a0)+
		move.b	#" ",(a0)+
		move.l	#printbuffer,tsource
		move.l	#5,tlaenge
		bsr	print
		rts
freeprint:
		moveq	#0,d0
		move	savecounter,d0
		lea 	printbuffer,a0
		move.b	#" ",(a0)+
		move.b	#$1b,(a0)+
		move.l	#"[31m",(a0)+
		
		move.l	d0,d1
		divu	#100,d0
		move.b	d0,(a0)
		add.b	#$30,(a0)+
		mulu	#100,d0
		sub	d0,d1

		move.l	d1,d0
		divu	#10,d0				
		move.b	d0,(a0)
		add.b	#$30,(a0)+
		mulu	#10,d0
		sub	d0,d1

		move.b	d1,(a0)
		add.b	#$30,(a0)+
		move.b	#10,(a0)+
		move.l	#printbuffer,tsource
		move.l	#10,tlaenge
		bsr	print
		rts

enter:		move.l	#enterc,tsource
		move.l	#1,tlaenge
		bsr	print
		rts

Print:	        move.l	DOSBase,a6		;DOS-Funktion rufen	
		jsr	_LVOOutput(a6)		;Hole Output-Handle
		move.l	d0,d1			;und in d1 merken

		move.l	tsource,d2		;Address Text
		move.l	tlaenge,d3			;Laenge Text
        	move.l  DOSBase,a6             ;Basis DOS
		jsr	_LVOWrite(a6)		;Funktion "Schreiben"
		rts




*********************** Datenbereich **********************************
savecounter:	dc.w	0		* anzahl der gesavten blöcke	
datavector:	dc.l	0		* auf akkt DATENstand 
curbufvector:	dc.l	0		* auf akkt BUFFERstand
curgameblock:	dc.l	0		* zwischenspeicher  
curtrainblock:	dc.l	0		* zwischenspeicher  
curtrack:	dc.w	0		* akueller track
curblock:	dc.w	0		* akueller block 	
lasblock:	dc.w	1749		* letzer track

clineadd:	dc.l	0		* cli-command
clinelen:	dc.l	0		* cli-command

error:		dc.w	0		* ErrorStatus
drive:		dc.l	0		* DFx (?)
*********************** Datenbereich **********************************

tsource:	dc.l	0
tlaenge:	dc.l	0
DiskIO0:         ds.b 	80                         * IOStdReq-Record drive 0
DiskIO1:         ds.b 	80                         * IOStdReq-Record drive 1
ReplyPort:      ds.b 	34                         * MsgPort-Record
DevName:        dc.b 	"trackdisk.device",0
 		even

Memory:         dc.l    0

DOSBase: 	dc.l	0
dosname:	dc.b	'dos.library',0
	 	even
filename:	dc.b	"df0:daten",0
		even
datei:		dc.l	0			* datei - identification


text1:		dc.b   	$1B,$5B,$31,$6D,"Compare da Disks "
		dc.b	$1B,$5B,$3b,$6D,"V0.90 by Grain/Dytec",10
		dc.b 	"insert game disk in df0: and train disk in df1:",10
text1e:		even
help:		dc.b	"it compares two disks (game and train disk) and"
		dc.b 	" save the",10
		dc.b	"different blocks from the traindisk (the installed "
		dc.b	"trainer)",10,"to make an Install.exe !!",10
		dc.b	10,"Usage: Compare (Datenfilename)",10,10
helpe:		even


noDisk0:	dc.b	10,"No Disk in Drive df0:",10
noDisk0e:	even
noDisk1:	dc.b	10,"No Disk in Drive df1:",10
noDisk1e:	even
noDrive0	dc.b	"Drive df0: not ready",10
noDrive0e:	even
noDrive1	dc.b	"Drive df1: not ready",10
noDrive1e:	even
toomany:	dc.b	10,10,"Too many different blocks! (over 300!)",10
toomanye:	even
savtxt:		dc.b	10,"Now saving DatenFile",10
savtxte:	even
endtxt:		dc.b	"All work done!",10
endtxte:	even
curoff:		dc.b	$1b,"[0 p"
		even
curon:		dc.b	$1b,"[1 p"
		even
nul:		dc.b	"0"
		even
one:		dc.b	"1"
		even
next:		dc.b	" "
		even
enterc:		dc.b	10
		even
equal:		dc.b	$1b,"[32m."
		even
nequal:		dc.b	$1b,"[31m."
		even
line:		dc.b	$1b,"M"		* return + Crs 1 zeile hoch
		even
                section sectors,bss_p
printbuffer:	ds.b	100
buffer0:	ds.b	512*11			* Trackbuffer drive 0
		even
buffer1:	ds.b	512*11			* Trackbuffer drive 1
		even
databuffer:	ds.b	512			* für blockwerte und so 
blockbuffer:	ds.b	512*255			* 255 blöcke 



           **************************************************
           * ON THE LONG TRIP  THIS TEXTFILE TRAVELD TO THE *
           * DOORS OF BEVERLY HILLS HOUSE ON THE 20-Jul-92  * 
           *          TIME UPLOADED IS 01:07:34             *
           *   CALL NOW ++49 (0)30 662 55 02 = DO IT NOW!   *
           **************************************************

