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)