*	DATAMAKER für Devpac Assembler
*
*	Autor     : Roger Fischlin
*	Datum     : September 1988
*	Sprache   : 68000-Assembler 
*	Assembler : Devpac Assembler von HiSoft

	incdir	"vd0:include/"
	include	"exec/exec.i"
	include	"exec/exec_lib.i"
	include	"libraries/dos.i"
	include	"libraries/dos_lib.i"
	include	 "libraries/dosextens.i

Anzahl_der_bytes equ 16	;Wert kann verändert werden (1-40)
	

	clr.l	WBenchMsg		; Startup-Code	
	sub.l	a1,a1	
	CALLEXEC	FindTask	
	move.l	d0,a4	
	tst.l	pr_CLI(a4)    
	beq.s	fromWorkbench	
	bra	run    	
fromWorkbench	lea	pr_MsgPort(a4),a0
	CALLEXEC	WaitPort		
	lea	pr_MsgPort(a4),a0	
	CALLEXEC	GetMsg		
	move.l	d0,WBenchMsg		
run	bsr.s	main		
	tst.l	WBenchMsg             
	beq.s	exit		
	CALLEXEC 	Forbid		
	move.l	WBenchMsg(pc),a1	
	CALLEXEC 	ReplyMsg		
exit	clr.l	d0
	rts
				
WBenchMsg	ds.l	1

main	moveq	#0,d0	; Hauptprogramm
	lea.l	dosname,a1	; Dos-Library öffnen
	CALLEXEC	OpenLibrary
	tst.l	d0
	beq	end
	move.l	d0,_DOSBase

	move.l	#Window,d1	; Window öffnen
	move.l	#1005,d2
	CALLDOS	Open
	tst.l	d0
	beq	error0
	move.l	d0,Window_handle

	move.l	d0,d1	; Text (Name,Autor etc) ausgeben
	move.l	#TEXT_A,d2
	move.l	#TA_l,d3
	CALLDOS	Write

	move.l	Window_handle,d1 ;Name des 1.Files holen
	lea.l	filename1,a2
	move.l	a2,d2
	move.l	#49,d3
	CALLDOS	Read
	cmp.l	#1,d0	;Wenn nur RETURN gedrückt wurde,
	beq	error1	;Programm abbrechen
	move.b	#0,-1(a2,d0) 	; Name mit 0 terminieren

	move.l	Window_handle,d1	; Text ausgeben
	move.l	#TEXT_B,d2
	move.l	#TB_l,d3
	CALLDOS	Write

	move.l	Window_handle,d1 ;Name des 2.Files holen (s.o.)
	lea.l	filename2,a2
	move.l	a2,d2
	move.l	#49,d3
	CALLDOS	Read
	cmp.l	#1,d0
	beq	error1
	move.b	#0,-1(a2,d0)

	move.l	#filename1,d1	;File 1 öffen, bei Fehler 
	move.l	#1005,d2	;abbrechen 
	CALLDOS	Open
	tst.l	d0
	beq	DiskError1
	move.l	d0,file1_handle

	move.l	#filename2,d1	;File 2 öffnen, bei Fehler
	move.l	#1006,d2	;abbrechen
	CALLDOS	Open
	tst.l	d0
	beq	DiskError2
	move.l	d0,file2_handle

	move.l	Window_handle,d1	;Text("Bitte
	move.l	#TEXT_E,d2		;warten) aus-
	move.l	#TE_l,d3		;geben
	CALLDOS	Write

label1	move.l	#Anzahl_der_bytes,d3	;Bytes für eine
	move.l	file1_handle,d1	;Zeile lesen
	move.l	#puffer,d2
	CALLDOS	Read
	tst.l	d0
	beq	nomore	
	move.l	d0,d6
	move.l	file2_handle,d1	;Text für Begin der
	move.l	#text3,d2		;der Zeile schreiben
	move.l	#6,d3
	CALLDOS	Write
	subq	#1,d6	; Bytes nacheinander in ASCII umwandeln
	lea.l	puffer,a5	; und ins File 2 schreiben
label2	move.b	(a5)+,d0
	bsr	printzahl
	dbra	d6,label2
	bra	label1
	
nomore	move.l	file2_handle,d1	; Alles schließen..
	CALLDOS	Close
error2	move.l	file1_handle,d1
	CALLDOS	Close
error1	move.l	Window_handle,d1
	CALLDOS	Close
error0	move.l	_DOSBase,a1
	CALLEXEC	CloseLibrary
end	clr.l	d0
	rts
dosname	DOSNAME
filename1	ds.b	50
	even
filename2	ds.b	50
	even
Window	dc.b	"con:120/15/400/170/DATAMAKER",0
	even
TEXT_A	dc.b	$a,$9b,"1;33;40",$6d,"DATAMAKER "
	dc.b	$9b,"0;31;40",$6d,"für den DEVPAC ASSEMBLER",$a
	dc.b	$9b,"3;32;40",$6d,"von Roger Fischlin  9/88",$a,$a
	dc.b	$9b,"0;31;40",$6d
	dc.b	$9b,"4;31;40",$6d,"Dieses Programm ist Public-Domain-Soft",$a
	dc.b	$a,$a,$a,$9b,"0;32;40",$6d,"Name des Files : "
	dc.b	$9b,"0;31;40",$6d,$a
TA_l equ *-TEXT_A
TEXT_B	dc.b	$a,$9b,"0;32;40",$6d,"Wie soll das Text-File heißen ?"
	dc.b	$9b,"0;31;40",$6d,$0a
TB_l equ *-TEXT_B
	even
TEXT_C	dc.b	$a,$a,$9b,"0;32;40",$6d
	dc.b	$9b,"7;31;42",$6d,"Fehler beim Öffnen der ersten Datei !"
TC_l equ *-TEXT_C
	even
TEXT_D	dc.b	$a,$a,$9b,"0;32;40",$6d
	dc.b	$9b,"7;31;42",$6d,"Fehler beim Öffnen der zweiten Datei !"
TD_l equ *-TEXT_D
TEXT_E	dc.b	$a,$a,$9b,"0;33;40",$6d,"Bitte einen Moment warten..."
	dc.b	$a
TE_l equ *-TEXT_E

file1_handle	dc.l	0
file2_handle	dc.l	0
Window_handle	dc.l	0
bytes	dc.l	0
_DOSBase	dc.l	0
puffer	ds.b	100
zahlen	dc.b	"0123456789abcdef"
text3	dc.b	$09,"dc.b "
	even
text1	dc.b	"$00,"
	even
text2	dc.b	"$00",10
	even
printzahl	and.l	#$ff,d0	;Byte in d0 in ASCII umwandeln
	move.l	d0,d1	;und ins File 2 schreiben
	divu	#16,d0	;1. Nibble (Bit 7-4) für erste
	lea.l	zahlen,a0	; Hex-Ziffer bereitstellen
	move.b	(a0,d0.w),text1+1 ;mit Hilfe der Tabelle ASCII-
	move.b	(a0,d0.w),text2+1 ;Code holen
	and.b	#$0f,d1	;2. Nibble (bit 3-0) ....(s.o.)
	move.b	(a0,d1.w),text1+2
	move.b	(a0,d1.w),text2+2
	move.l	file2_handle,d1
	move.l	#4,d3
	tst.l	d6	; letztes Byte ?
	bne	morebytes	;Wenn ja Text für Zeilenende
	move.l	#text2,d2	;schreiben
	bra	printit
morebytes	move.l	#text1,d2
printit	CALLDOS	Write
	rts
	
DiskError1	move.l	Window_handle,d1 ;Ausgabe einer Fehlermeldung
	move.l	#TEXT_C,d2
	move.l	#TC_l,d3
	CALLDOS	Write

	move.l	Window_handle,d1 ; auf RETURN warten
	move.l	puffer,d2
	move.l	#1,d3
	CALLDOS	Read
	bra	error1

DiskError2	move.l	Window_handle,d1 ;Ausgabe einer Fehlermeldung
	move.l	#TEXT_D,d2
	move.l	#TD_l,d3
	CALLDOS	Write

	move.l	Window_handle,d1 ; auf RETURN warten
	move.l	puffer,d2
	move.l	#1,d3
	CALLDOS	Read
	bra	error2
	
		
	
