	opt	l- 			;nur wenn DevPac-Assembler

* ABC = Assembler Basic Converter
* Object-File -> Basic-DATA-Zeilen
* (c) 1987 Peter Wollchlaeger
* --------------------------------

_SysBase         equ	4		;Basis von Exec
_LVOOpenLibrary  equ    -552  		;Library oeffnen
_LVOCloseLibrary equ    -414		;Library schliessen

_LVOOutput	 equ    -60		;StdOut-Handle holen
_LVOWrite	 equ    -48		;Schreiben (auf File)
_LVORead	 equ    -42		;Lesen
_LVOOpen         equ     -30		;File oeffnen
_LVOClose	 equ     -36		;     schliessen
MODE_OLDFILE	 equ	1005		;File existiert
MODE_NEWFILE	 equ	1006		;File neu/ueberschreiben

* Einige simple Makros zum File-Handling
* --------------------------------------

OPEN    macro
	move.l	\1,d1		;Name
	move.l	\2,d2		;Mode
	jsr     _LVOOpen(a6)
	endm

READ	macro
	move.l	\1,d1		;Handle
	move.l	\2,d2		;Puffer-Adr
	move.l	\3,d3		;Max.
	jsr	_LVORead(a6)
	endm

WRITE	macro
	move.l	\1,d1		;Handle
	move.l	\2,d2		;Puffer-Adr
	move.l	\3,d3		;Anzahl
	jsr	_LVOWrite(a6)
	endm

CLOSE	macro
	move.l	\1,d1		;Handle
	jsr	_LVOClose(a6)
	endm
* --------------------------------------


	movem.l	 a0/d0,-(sp)		;Parms. Kommandozeile

* DOS-Lib oeffnen:

_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,a6    		;Zeiger merken


* Kommandozeile parsen
* --------------------
	movem.l	(sp)+,a0/d0		;hole Parms
        move.b	#' ',-1(a0,d0.l)	;terminiere mit Blank weil
;					 mein Parser das will
	lea	quelle,a1		;Puffer Name Quellfile
	bsr	parse			;hole ihn
	lea	ziel,a1			;Name Zielfile
	bsr	parse			;dito

* Beide Files oeffnen
* -------------------
	OPEN	#quelle,#MODE_OLDFILE
	move.l	d0,d4			;Handle
	tst.l	d0			;ging was schief?
	bne	weiter			;wenn nicht
	jsr	_LVOOutput(a6)		;Hole Output-Handle
	WRITE	d0,#msg1,#len1		;und melde Fehler
	bra	cl_lib			;und Ende

weiter	OPEN	#ziel,#MODE_NEWFILE	;wie vor nun mit Zielfile
	move.l	d0,d5
	tst.l	d0
	bne	start
	jsr	_LVOOutput(a6)		;Hole Output-Handle
	WRITE	d0,#msg2,#len2
	bra	cl_q

* Hier geht's nun los
* -------------------
start	READ	d4,#buffer,#16		;Header skippen

loop	READ	d4,#buffer,#16		;Lese 16 Bytes oder weniger
	tst.l	d0			;End of File?
	beq	fertig			;wenn ja

	asr	#1,d0			;gelesene Bytes durch 2
	subq	#1,d0			;- 1 wegen dbra-loop
	move	d0,d6			;Anzahl Worte merken

	WRITE	d5,#data,#6		;write LF + 'DATA '

	lea     buffer,a4		;Zeiger auf Quelle
conv	move    (a4)+,d2		;ein Wort
	lea	hbuf,a0			;         soll dahin
	bsr	hex			;als Hex-String
	WRITE	d5,#hbuf,#4		;auf Zielfile
	cmp	#0,d6			;letztes Wort in Zeile?
	beq	no			;wenn nicht
        WRITE   d5,#komma,#1		;sonst ein Komma dahinter	
no	dbra    d6,conv			;bis Zeile fertig
	bra	loop			;bis EOF
fertig	WRITE   d5,#LF,#1		;LF zum Schluss


cl_z	CLOSE	d5			;Close Zielfile
cl_q	CLOSE	d4			;und Quellfile

cl_lib  move.l  a6,a1                   ;DOS-Lib-Basis
	move.l  _SysBase,a6		;Basis Exec
        jsr     _LVOCloseLibrary(a6)	;Funktion "Schliessen"

fini	rts				;Return zum CLI

* Einfacher Parser; kennt nur Blanks als Delimeter
* ------------------------------------------------
parse	cmp.b	#' ',(a0)+		;fuehrende Blanks
	beq	parse			;skippen				
	subq.l	#1,a0			;wir waren 1 zu weit
p1	move.b	(a0)+,(a1)+		;nun kopiere
	cmp.b	#' ',(a0)		;bis wieder ein Blank
	bne	p1	
	clr.b	(a1)			;Terminiere mit 0-Byte
	rts

* Konvertiere d2.w in ASCII-String ab (a0)
* ---------------------------------------- 
hex
	moveq	#3,d1		;fuer 4 Nibble 
next	rol	#4,d2		;hole 1 Nibble
	move	d2,d3		;nach d3 retten 
	and.b	#$0f,d3		;maskiere es
        add.b   #48,d3		;in ASCII wandeln
	cmp.b	#58,d3		;ist es >9 ?
	bcs     out		;wenn nicht
	addq.b	#7,d3		;sonst muss es A-F sein
out	move.b	d3,(a0)+	;1 Zeichen abspeichern
	dbra	d1,next		;next nibble
	rts

* -----------------------------------------------------
* Datenbereich:

dosname	 dc.b	'dos.library',0
	 cnop	0,2

data	 dc.b   10,'DATA '
	 cnop	0,2
komma    dc.b   ','
LF	 dc.b	10
msg1	 dc.b	'Quellfile nicht gefunden',10
len1	 equ	*-msg1
	 cnop   0,2
msg2	 dc.b	'Konnte Zielfile nicht oeffnen',10
len2	 equ	*-msg2
	 cnop   0,2

quelle	 ds.b	40
ziel	 ds.b   40
buffer   ds.b   16
hbuf	 ds.b   4

	 end
       
