[net.micro.trs-80] TRANSLAT

ronbe@tekred.UUCP (Little Guy) (07/10/85)

Here is the source for TRANSLAT used to convert back and forth
between Intel hex and TRS80 /CMD files.  Using this program, you
can turn a /CMD file into an ASCII file suitable for mailing.
It is also used to convert the Intel hex files that I distribute
into /CMD executables.  i.e. TERM/HEX --> TERM/CMD in the case of
TRSTERM.

This is in a form that my UNIX machine can assemble, you may have
to change some things to get EDTASM or whatever else to assemble
it for you...

		-Ron Bemis

# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by tekred!ronbe on Tue Jul  9 13:08:39 PDT 1985
# Contents:  Makefile translat.doc translat.z80 .note
 
echo x - Makefile
sed 's/^@//' > "Makefile" <<'@//E*O*F Makefile//'
TITLE=	translat
SHAR=	Makefile $(TITLE).doc $(TITLE).z80 .note
ASM=	/usr/local/z80/lasasm
SASM=	/usr/local/z80/asm
LNK=	/usr/local/link/link
HEX=	/usr/local/ehex
CHK=	/usr/local/chks
LST=	/usr/local/lstr

$(TITLE).hex:	$(TITLE).z80
	make msg
	$(SASM) $(TITLE).obj $(TITLE).prn $(TITLE).z80
	$(HEX) -i $(TITLE).obj > $(TITLE).hex
	$(LST) -s $(TITLE).obj > $(TITLE).log

new:	clean
	make

clean:
	rm -f *.obj *.prn *.hex *.rom *.log

list:
	lpr *.log *.prn

msg:
	.note > msg

shar:	$(SHAR)
	shar $(SHAR) > shar
@//E*O*F Makefile//
chmod u=rw,g=r,o=r Makefile
 
echo x - translat.doc
sed 's/^@//' > "translat.doc" <<'@//E*O*F translat.doc//'
		TRANSLATOR

	This program translates Intel Hex to and from TRS80 executable
format.

Syntax:	TRANSLAT

	/CMD suffix assumed for TRS80 executable file
	/HEX suffix assumed for Intel Hex file

	Upon execution, a small menu will appear asking the direction
of the conversion.  Press 1 for Intel Hex to TRS80 executable or 2 for
TRS80 executable to Intel Hex.

	The program will then prompt you for the two file names.
"/CMD" and "/HEX" need not be typed.  If the destination file exists, a
message to that effect will appear, and you will be asked if you want
to overwrite the file.  Press "Y" or "N".

	If the translation is successful,"Translation complete." will
appear.  If there are any errors, they will be displayed and the process
will be aborted.
@//E*O*F translat.doc//
chmod u=rw,g=r,o=r translat.doc
 
echo x - translat.z80
sed 's/^@//' > "translat.z80" <<'@//E*O*F translat.z80//'
VDCLS	EQU	01C9H
VDLINE	EQU	021BH
VDCHAR	EQU	0033H
KBCHAR	EQU	002BH
KBWAIT	EQU	0049H
KBLINE	EQU	0040H
DOS	EQU	402DH
CMDTXT	EQU	4225H
SYNTAX	EQU	441CH
ERRDSP	EQU	4409H
OPEN	EQU	4424H
INIT	EQU	4420H
REWIND	EQU	443FH
READ	EQU	4436H
VERF	EQU	443CH
CLOSE	EQU	4428H
PUTEXT	EQU	444BH

	ORG	7000H		;PROGRAM GOES HERE

START	LD	SP,$

	LD	HL,DIRMES
	CALL	VDLINE
DIR	CALL	KBCHAR
	CP	1		;BREAK?
	JP	Z,DOS		;ABORT IF SO
	CP	'2'		;TRS80 --> INTEL?
	JP	Z,TOHEX
	CP	'1'		;INTEL --> TRS80?
	JR	NZ,DIR

;INTEL TO TRS80 FORMAT
TOCMD	LD	HL,ISOMES
	CALL	VDLINE
	LD	IX,HEXEXT
	CALL	GETSO
	LD	HL,TDEMES
	CALL	VDLINE
	LD	IX,CMDEXT
	CALL	GETDE
WCOLON	CALL	GETBYT
	CP	':'
	JR	NZ,WCOLON
	XOR	A
	LD	(SUM),A		;INITIALIZE CHECKSUM
	CALL	GET2		;GET THE LENGTH
	LD	(LENGTH),A
	CALL	GET2		;GET ADDRESS MSB
	LD	(ADRMSB),A
	CALL	GET2		;GET ADDRESS LSB
	LD	(ADRLSB),A
	CALL	GET2
	OR	A
	JR	Z,HDATA		;GO IF CONTROL = 0
	DEC	A		;1 --> 0
	JP	NZ,BADIN	;CONTROL NOT 0 OR 1
	CALL	GET2		;ADD IN CHECKSUM
	LD	A,(SUM)		;POINT TO COMPUTED CS
	OR	A		;IS IT 0?
	JP	NZ,CHERR	;GO IF NOT
;WRITE OUT THE LAST LINE
	LD	A,2		;END BYTE
	CALL	PUTBYT
	LD	A,2		;LENGTH OF 2
	CALL	PUTBYT
	LD	A,(ADRLSB)	;ENTRY ADDRESS LSB
	CALL	PUTBYT
	LD	A,(ADRMSB)	;ENTRY ADDRESS MSB
	CALL	PUTBYT
	JP	OKEND

HDATA	LD	A,1		;LOAD BYTE
	CALL	PUTBYT
	LD	A,(LENGTH)	;LENGTH
	INC	A
	INC	A
	CALL	PUTBYT
	LD	A,(ADRLSB)	;ADDRESS LSB
	CALL	PUTBYT
	LD	A,(ADRMSB)	;ADDRESS MSB
	CALL	PUTBYT
HLOOP	CALL	GET2
	CALL	PUTBYT
	LD	A,(LENGTH)
	DEC	A
	JR	Z,GETCHK
	LD	(LENGTH),A
	JR	HLOOP

GETCHK	CALL	GET2		;ADD IN CHECKSUM
	LD	A,(SUM)		;POINT TO COMPUTED CS
	OR	A		;IS IT 0?
	JP	NZ,CHERR	;GO IF NOT
	CALL	GETBYT
	CP	0DH		;RETURN?
	JP	NZ,BADIN
	JP	WCOLON

;TRS80 TO INTEL FORMAT
TOHEX	LD	HL,TSOMES
	CALL	VDLINE
	LD	IX,CMDEXT
	CALL	GETSO
	LD	HL,IDEMES
	CALL	VDLINE
	LD	IX,HEXEXT
	CALL	GETDE
NEWSEC	CALL	GETBYT
	LD	(CNTL),A	;SAVE FOR LATER
	CALL	GETBYT
	DEC	A
	DEC	A
	LD	(LENGTH),A
	CALL	GETBYT
	LD	(ADRLSB),A
	CALL	GETBYT
	LD	(ADRMSB),A
	LD	A,(CNTL)	;GET CNTL BYTE BACK
	CP	1
	JR	Z,ADATA
	CP	2
	JR	Z,ENDATA
	CP	5
	JP	NZ,BADIN	;CONTROL NOT 1,2, OR 5
;SECTION IS A COMMENT - READ AND IGNORE
COMENT	CALL	GETBYT
	LD	A,(LENGTH)
	DEC	A
	JR	Z,NEWSEC	;END OF COMMENT
	LD	(LENGTH),A
	JR	COMENT

ENDATA	LD	A,(LENGTH)
	OR	A
	JP	NZ,BADIN	;LENGTH OF ENTRY NOT 0
	LD	A,':'
	CALL	PUTBYT
	XOR	A
	LD	(SUM),A		;INITIALIZE CHECKSUM
	CALL	PUT2		;WRITE LENGTH OF 0
	LD	A,(ADRMSB)
	CALL	PUT2
	LD	A,(ADRLSB)
	CALL	PUT2
	LD	A,1		;ENTRY ADDRESS
	CALL	PUT2
	LD	A,(SUM)
	CPL			;1'S COMPLEMENT
	INC	A		;2'S COMPLEMENT
	CALL	PUT2
	LD	A,0DH
	CALL	PUTBYT
	JP	OKEND

ADATA	LD	A,':'
	CALL	PUTBYT
	XOR	A
	LD	(SUM),A		;INITIALIZE CHECKSUM
	LD	A,(LENGTH)
	CALL	PUT2
	LD	A,(ADRMSB)
	CALL	PUT2
	LD	A,(ADRLSB)
	CALL	PUT2
	XOR	A		;DATA TO LOAD
	CALL	PUT2
ALOOP	CALL	GETBYT
	CALL	PUT2
	LD	A,(LENGTH)
	DEC	A
	JR	Z,AEND		;END OF DATA
	LD	(LENGTH),A
	JR	ALOOP

AEND	LD	A,(SUM)
	CPL			;1'S COMPLEMENT
	INC	A		;2'S COMPLEMENT
	CALL	PUT2
	LD	A,0DH
	CALL	PUTBYT
	JP	NEWSEC

;GET THE SOURCE FILENAME
GETSO	LD	HL,CMDTXT
	LD	B,25
	CALL	KBLINE
	JP	C,DOS		;IF BREAK PRESSED
	LD	HL,CMDTXT
	LD	DE,DCBIN
	CALL	SYNTAX
	JP	NZ,ERROR
	PUSH	IX		;SOURCE EXTENSION
	POP	HL
	CALL	PUTEXT		;ADD EXTENSION
	LD	DE,DCBIN
	LD	HL,BUFIN
	LD	B,0
	CALL	OPEN
	JP	NZ,ERROR
	JP	NEWREC

;GET THE DESTINATION FILENAME
GETDE	LD	HL,CMDTXT+25
	LD	B,25
	CALL	KBLINE
	JP	C,DOS		;IF BREAK PRESSED
	LD	HL,CMDTXT+25
	LD	DE,DCBOUT
	CALL	SYNTAX
	JP	NZ,ERROR
	PUSH	IX		;DESTINATION EXTENSION
	POP	HL
	CALL	PUTEXT
	LD	HL,BUFOUT
	LD	(PTOUT),HL
	LD	B,0
	CALL	INIT
	JP	NZ,ERROR
	RET	C		;NEW FILE
	LD	HL,OWRMES
	CALL	VDLINE
	CALL	KBWAIT
	CP	'Y'
	JR	Z,OUTOK		;OVERWRITE IT
	CP	'y'
	JP	NZ,DOS		;ABORT
OUTOK	LD	A,'Y'
	CALL	VDCHAR
	LD	A,0DH
	JP	VDCHAR

GET2	CALL	ASC2HX
	SLA	A
	SLA	A
	SLA	A
	SLA	A
	LD	B,A
	CALL	ASC2HX
	ADD	A,B
	PUSH	AF		;SAVE CHARACTER
	LD	HL,SUM		;POINT TO CHECKSUM
	ADD	A,(HL)		;ADD IN NEW CHARACTER
	LD	(HL),A		;SAVE IT BACK
	POP	AF		;RESTORE ORGINAL
	RET

ASC2HX	CALL	GETBYT
	CP	'0'-1
	JP	M,BADIN
	CP	'9'+1
	JP	M,OK
	CP	'A'
	JP	M,BADIN
	CP	'F'+1
	JP	P,BADIN
	SUB	7
OK	AND	0FH		;BOTTOM NIBBLE ONLY
	RET

GETBYT	LD	HL,(PTIN)
	LD	A,(HL)
	INC	HL
	LD	(PTIN),HL
	EX	AF,AF
	LD	DE,BUFIN+256
	OR	A
	SBC	HL,DE
	CALL	Z,NEWREC
	EX	AF,AF
	RET

NEWREC	LD	DE,DCBIN
	CALL	READ
	JP	NZ,ERROR
	LD	HL,BUFIN
	LD	(PTIN),HL
	RET

PUT2	PUSH	AF		;SAVE CHARACTER
	LD	HL,SUM		;POINT TO CHECKSUM
	ADD	A,(HL)		;ADD IN NEW CHARACTER
	LD	(HL),A		;SAVE IT BACK
	POP	AF		;RESTORE ORGINAL
	PUSH	AF		;SAVE ORIGINAL
	SRL	A		;GET MS NIBBLE
	SRL	A
	SRL	A
	SRL	A
	CALL	HX2ASC
	POP	AF		;RESTORE ORIGINAL
	AND	0FH		;GET LS NIBBLE
HX2ASC	ADD	A,'0'		;ASCII OFFSET
	CP	'9'+1		;>'9'?
	JP	M,DIGIT
	ADD	A,7		;CHANGE TO LETTER
DIGIT	CALL	PUTBYT
	RET

PUTBYT	EXX
	LD	HL,(PTOUT)
	LD	(HL),A
	INC	HL
	LD	(PTOUT),HL
	LD	DE,BUFOUT+256
	OR	A		;NO CARRY
	SBC	HL,DE
	JR	NZ,NOTYET
	LD	DE,DCBOUT
	CALL	VERF		;WRITE AND VERIFY
	JP	NZ,ERROR
	LD	HL,BUFOUT
	LD	(PTOUT),HL
NOTYET	EXX
	RET

OKEND	CALL	CLOSUP
	LD	HL,DONMES
	CALL	VDLINE
	JP	DOS

BADIN	LD	HL,ERRMES
	CALL	VDLINE
	JP	BADEND

CHERR	LD	HL,CSEMES
	CALL	VDLINE

BADEND	CALL	CLOSUP
	LD	HL,ABTMES
	CALL	VDLINE
	JP	DOS

CLOSUP	LD	DE,DCBIN
	CALL	CLOSE
	LD	A,1AH		;EOF MARKER
	CALL	PUTBYT
	LD	DE,DCBOUT
	CALL	VERF
	CALL	CLOSE
	RET

ERROR	OR	0C0H		;DISPLAY DETAILED MSG
	CALL	ERRDSP
	JP	BADEND

DIRMES	BYTE	1CH		;TOP OF SCREEN
	BYTE	1FH		;CLEAR TO END OF SCREEN
	WORD	0A0AH		;LINE FEEDS
	ASCII	'TRANSLATION PROGRAM  INTEL HEX <--> TRS80 EXECUTABLE'
	WORD	0A0AH
	ASCII	'1) INTEL HEX --> TRS80 CMD'
	BYTE	0AH
	ASCII	'2) TRS80 CMD --> INTEL HEX'
	WORD	0A0AH
	ASCII	'Enter your selection:  '
	BYTE	0EH
	BYTE	03H

ISOMES	BYTE	'1'
	BYTE	0AH
	ASCII	'Source filename (/HEX):  '
	BYTE	03H

TDEMES	ASCII	'Destination filename (/CMD):  '
	BYTE	03H

TSOMES	BYTE	'2'
	BYTE	0AH
	ASCII	'Source filename (/CMD):  '
	BYTE	03H

IDEMES	ASCII	'Destination filename (/HEX):  '
	BYTE	03H

OWRMES	ASCII	'Destination file exists, overwrite?  '
	BYTE	03H

DONMES	ASCII	'Translation complete.'
	BYTE	0DH

ERRMES	BYTE	0AH
	ASCII	'*** INPUT FILE PARAMETER ERROR ***'
	BYTE	0DH

CSEMES	BYTE	0AH
	ASCII	'*** CHECKSUM ERROR IN INPUT FILE ***'
	BYTE	0DH

ABTMES	ASCII	'TRANSLATION ABORTED.'
	BYTE	0DH

HEXEXT	ASCII	'HEX'
CMDEXT	ASCII	'CMD'

DCBIN	BLOCK	50
DCBOUT	BLOCK	50
PTIN	BLOCK	2
PTOUT	BLOCK	2
BUFIN	BLOCK	256
BUFOUT	BLOCK	256
CNTL	BLOCK	1
LENGTH	BLOCK	1
ADRLSB	BLOCK	1
ADRMSB	BLOCK	1
SUM	BLOCK	1

	END	START
@//E*O*F translat.z80//
chmod u=rw,g=r,o=r translat.z80
 
echo x - .note
sed 's/^@//' > ".note" <<'@//E*O*F .note//'
#! /bin/csh
# This puts you on a mailing list for updates
set name = `who am i`
mail ronbe@tekred@tektronix.uucp << EOF
TRANSLAT installed by $name[1] on `date`
EOF
@//E*O*F .note//
chmod u=rwx,g=rx,o=rx .note
 
exit 0
-- 
Be careful tonight, if you drive, don't park.
Remember, accidents are the major cause of people.
	...tektronix!tekred!ronbe (Ron Bemis)