[net.micro.atari] Alterm.s

mugc@utecfa.UUCP (ModemUserGroupChairman) (09/22/85)

	Don't flame me for posting here; the issue is debatable.
	Compile and enjoy.

	This program has some simple ascii capture facilites that
	the DA does not have.

--------------- Snip Snip here here ----------------------------------

.TEXT
* =============================================================================
* TERMINAL PROGRAM FOR ST WITH DISK CAPTURE AND FILE SEND
* By Alan Page - August 1985
* Public Domain
* NOTE: THE AUTHOR IS NOT RESPONSIBLE FOR ANY BUGS OR MALFUNCTIONS THAT MAY
* EXIST IN THIS PROGRAM OR ANY LOSS OF DATA THAT MAY RESULT FROM
* SUCH MALFUNCTIONS.
* =============================================================================
* ADMITTEDLY A SLOPPY LOOKING LISTING
* BUT WHAT THE HECK, IT WORKS, AND AS SOON AS
* A DECENT COMMERCIAL PROGRAM IS AVAILABLE, INTO THE TRASH IT GOES!
* -----------------------------------------------------------------------------
* CHANGE NAME TO TERM.S BEFORE ASSEMBLING
* ASSEMBLE WITH AS68 -L -P TERM.S
* LINK WITH LO68 -R -O TERM.68K TERM.O
* THEN RELMOD TERM.68K TERM.TOS
	MOVE.L	A7,A5	* CODE FROM APSTART.S
	MOVE.L	#USTK,A7
	MOVE.L	4(A5),A5
	MOVE.L	$C(A5),D0
	ADD.L	$14(A5),D0
	ADD.L	$1C(A5),D0
	ADD.L	#$100,D0
	MOVE.L	D0,-(SP)
	MOVE.L	A5,-(SP)
	MOVE	D0,-(SP)
	MOVE	#$4A,-(SP)
	TRAP	#1
	ADD.L	#12,SP
	MOVE.B	#$1B,D3	* ESC,$76 SETS UP LINEWRAP ON CONSOLE
	BSR	SHOWBYTE	* SHOWS BYTE ON SCREEN
	MOVE.B	#$76,D3
	BSR	SHOWBYTE
	LEA	HELLO,A0
	BSR	PSTRING
	MOVE.B	#0,FLAG	* SET ALL FLAGS TO ZERO
	MOVE.W	#7,D0	* 1200 BAUD DEFAULT
	MOVE.W	#7,BAUD
	BSR	SETBAUD
	LEA	BAUD12,A0
	BSR	PSTRING
TOP:	BSR	CKSER	* SERIAL STATUS
	CMP.W	#$FFFF,D0
	BNE	NOFILE
	BSR	GETSER	* GET A SERIAL BYTE
	MOVE.W	D0,D3
	ANDI.W	#$7F,D3	* STRIP 8 TH BIT
	BSR	SHOWBYTE	* THEN SHOW BYTE ON CONSOLE (IN D3)
*	BTST	#0,FLAG	* IS PFLAG SET?
*	BEQ	NOPRINT
*	BSR	PRNT	* PRINTER OUTPUT
* NOPRINT:	* SEE IF FILE OUTPUT
	BTST	#1,FLAG
	BEQ	NOFILE
* D3 CONTAINS BYTE TO OUTPUT
* DOESN'T SEND MOST CONTROL CHARACTERS TO FILE
* FOR NEATER DOWNLOADS. OMIT IF YOU WISH
	CMP.B	#$20,D3
	BGE	NOCTL2
	MULU	#2,D3
	LEA	PTABLE,A0
	MOVE.W	#0(A0,D3.W),D0
	MOVE.W	D0,D3
NOCTL2:	CMP.B	#0,D3	* NO NULLS TO FILE
	BEQ	NOFILE
	LEA	BUFFER,A0
	MOVE.W	BUFFCOUNT,D0	* D0 CONTAINS # OF BYTES IN BUFFER
	MOVE.B	D3,#0(A0,D0.W)
	ADD.W	#1,D0
	MOVE.W	D0,BUFFCOUNT
	CMP.W	#32000,D0	* IF BUFFER FULL, SEND IT TO FILE
	BNE	NOFILE
	EXT.L	D0
	BSR	SENDBF
NOFILE: BSR	CKKB	* SEE IF KEYPRESS
	CMP.W	#$FFFF,D0
	BNE	TOP
	BSR	GETKB	* GET KEYPRESS
* F1 TOGGLE BAUD RATE
	CMP.B	#$3B,D0
	BNE	NOFN1
	CMPI.W	#9,BAUD
	BEQ	SPEEDUP
	LEA	BAUD3,A0
	BSR	PSTRING
	MOVE.W	#9,D0
	MOVE.W	D0,BAUD
	BSR	SETBAUD
	BRA	TOP
SPEEDUP:
	LEA	BAUD12,A0
	BSR	PSTRING
	MOVE.W	#7,D0
	MOVE.W	D0,BAUD
	BSR	SETBAUD
	BRA	TOP
* F2 FILE CAPTURE TOGGLE FUNCTION
NOFN1:	CMP.B	#$3C,D0
	BNE	NOFN2
	BTST	#2,FLAG	* FILE OPEN?
	BNE	OKFL
	LEA	FERROR,A0
	BSR	PSTRING
	BRA	TOP		* IF FILE NOT OPEN, NO ACTION
OKFL:	BCHG	#1,FLAG	* TOGGLE FLAG
	BNE	DOFF
	LEA	STARTF,A0
	BSR	PSTRING
	BRA	TOP
DOFF:	LEA	STOPF,A0
	BSR	PSTRING
	BRA	TOP
* UNDO TO EXIT
NOFN2:	CMP.B	#$61,D0
	BNE	NOUNDO
	BTST	#2,FLAG	* SEE IF FILE EXISTS TO BE CLOSED
	BEQ	EXIT
	BSR	FILEND	* OUTPUT LAST OF BUFFER AND CLOSE FILE
EXIT:	MOVE.W	#0,-(SP)
	TRAP	#1
* F3 = CREATE AND OPEN FILE FOR INPUT
NOUNDO:	CMP.B	#$3D,D0
	BNE	NOFN3
	BTST	#2,FLAG
	BEQ	NOTMADE
* A FILE ALREADY EXISTS, CLOSE IT AND CREATE ANOTHER
	BSR	FILEND
NOTMADE:	* ZERO COUNT OF BYTES IN BUFFER
	MOVE.W	#0,BUFFCOUNT
	MOVE.L	#0,FPTR
	LEA	PROMPT,A0
	BSR	PSTRING
	BSR	GETFN	* GET FILENAME
	BSR	OPENFR	* OPEN IT TO SEE IF ALREADY EXISTS
	TST.L	D0
	BMI	NXT1	* DOESN'T EXIST
	MOVE.W	D0,FHNDL3
	LEA	WARN,A0
	BSR	PSTRING
	BSR	YESNO	* ASK IF FILE TO BE DESTROYED BY (RE)CREATION
	BRA	TOP
NXT1:	BSR	FILECR	* CREATE FILE
	TST.L	D0
	BPL	CONTF	* IF ERROR IN CREATION, DON'T OPEN FILE, EXIT
	BRA	TOP
CONTF:	BSR	OPENFW
	TST.L	D0
	BPL	SAVEFH
	LEA	FERROR2,A0
	BSR	PSTRING
	BRA	TOP
SAVEFH:	MOVE.W	D0,FHNDLE
	BSET	#2,FLAG
	LEA	OKMSG,A0
	BSR	PSTRING
	BRA	TOP
* F4 GET FILENAME FOR FILE TO BE OUTPUT
NOFN3:	CMP.B	#$3E,D0
	BNE	NOFN4
	BTST	#4,FLAG	* IF FILE EXISTS AND HASN'T BEEN SENT POST ERROR3
	BEQ	OKFL4
	LEA	FERR3,A0
	BSR	PSTRING
	BRA	TOP
OKFL4:	LEA	PROMPT2,A0
	BSR	PSTRING
	BSR	GETFN
	BSR	OPENFR
	TST.L	D0
	BPL	SAVFH2
	LEA	FERROR2,A0
	BSR	PSTRING
	BRA	TOP
SAVFH2:	MOVE.W	D0,FHNDL2
	BSET	#4,FLAG
	LEA	OKMSG2,A0
	BSR	PSTRING
	BRA	TOP
* F5 SEND A FILE OUT SERIAL PORT
NOFN4:	CMP.B	#$3F,D0
	BNE	NOFN5
	BTST	#4,FLAG	* SEE IF FILE EXISTS TO BE SENT
	BNE	OKF4
	LEA	FERROR,A0
	BSR	PSTRING
	BRA	TOP
* START SENDING BYTES
OKF4:	LEA	STARTU,A0
	BSR	PSTRING
LOOP4:	PEA	TEMP
	MOVE.L	#1,-(SP)
	MOVE.W	FHNDL2,-(SP)
	MOVE.W	#$3F,-(SP)
	TRAP	#1
	ADDA.L	#12,SP
* DID NOT RECEIVE A BYTE IF D0 = 0 
* IF NO BYTE RECEIVED, THEN IS EOF.
* SEND RECEIVING COMPUTER AN EOF
	CMP.B 	#0,D0
	BEQ	ABORT 
	MOVE.B	TEMP,D3
	CMP.B	#$0A,D3
	BNE	NOLF
	CMP.B	#$0D,TEMP2	* CURRENT CHAR IS LF FOLLOWING CR
	BNE	NOLF	* THIS WILL NOT BE SENT
	BTST	#5,FLAG
	BNE	CRNOLF	*IF SET, WILL NOT SEND LF AFTER CR
NOLF:	BSR	SENDSR
CRNOLF:	BSR	CKSER
	CMP.W 	#$FFFF,D0
	BNE	NOSERL
	BSR	GETSER
	MOVE.W	D0,D3
	ANDI.W	#$7F,D3
	BSR	SHOWBYTE
NOSERL:	BSR	CKKB
	CMP.W	#$FFFF,D0
	BNE	NOKB
	BSR	GETKB
* CONTROL-Z ABORTS FILE TRANSFER (AND SENDS CONTROL-Z TO RECEIVING END)
	CMP.B	#$1A,D3
	BEQ	SSR
NOKB:	MOVE.B	TEMP,D3
	MOVE.B	D3,TEMP2
	CMP.B	#$1A,D3
	BEQ	SSR
	CMP.B	#0,D3
	BNE	LOOP4
ABORT:	CMP.B	#$1A,TEMP2
	BEQ	SSR
	MOVE.B	#$1A,D3
SSR:	BSR	SENDSR
	MOVE.W	FHNDL2,-(SP)
	MOVE.W	#$3E,-(SP)
	TRAP	#1
	ADDA.L	#4,SP
	BCLR	#4,FLAG
	LEA	STOPU,A0
	BSR	PSTRING
	BRA	TOP
* F6 TOGGLE DUPLEX
NOFN5:	CMP.B	#$40,D0
	BNE	NOFN6
	BCHG	#3,FLAG
	BRA	TOP
* F7 TOGGLES LF AFTER CR FOR FILE UPLOADS
NOFN6:	CMP.B	#$41,D0
	BNE	NOFN7
	BCHG	#5,FLAG
	BEQ	LFOFF
	LEA	MLFON,A0
	BSR	PSTRING
	BRA	TOP
LFOFF	LEA	MLFOFF,A0
	BSR	PSTRING
	BRA	TOP
* HELP
NOFN7:	CMP.B	#$62,D0
	BNE	NOHELP
	LEA	HELP,A0
	BSR	PSTRING
	BRA	TOP
NOHELP:	CMP.W	#0,D3
	BEQ	TOP
	BSR	SENDSR		* SEND KEYPRESS TO SERIAL
	BTST	#3,FLAG		* IF HALP DUPLEX, SHOW KEYPRESS
	BEQ	TOP
	BSR	SHOWBYTE
	BRA	TOP
* NOT SURE WHY, BUT HAVE TO SET FILE POINTER
SENDBF:	MOVE.W	D0,D5
	BSR	XOFF
	CLR.W 	-(SP)
	MOVE.W	FHNDLE,-(SP)
	MOVE.L	FPTR,-(SP)
	MOVE.W	#$42,-(SP)
	TRAP	#1
	ADDA.L	#10,SP
	PEA	BUFFER
* MUST HAVE # OF BYTES TO TRANSFER IN D0
	MOVE.W	D5,D0
	MOVE.L	D0,-(SP)
	MOVE.W	FHNDLE,-(SP)
	MOVE.W	#$40,-(SP)
	TRAP	#1
	ADDA.L	#12,SP
	MOVE.W	#0,BUFFCOUNT
	ADD.L	D0,FPTR
	BSR	XON
	RTS
* SEND A SERIAL BYTE (IN D3)
SENDSR:	MOVE.W	D3,-(SP)
	MOVE.W	#1,-(SP)
	MOVE.W	#3,-(SP)
	TRAP	#$D
	ADDQ.L	#6,SP
	RTS
PSTRING:	* SEND A STRING TO CONSOLE
	MOVE.L	A0,-(SP)
	MOVE.W	#9,-(SP)
	TRAP	#1
	ADDQ.L	#6,SP
	RTS
SHOWBYTE:	* EXPECTS BYTE TO DISPLAY IN D3
	MOVE.W	D3,-(A7)
	MOVE.W	#2,-(A7)
	MOVE.W	#3,-(A7)
	TRAP	#$D
	ADDQ.L	#6,A7
	RTS
* GET KEYBOARD STATUS
CKKB:	MOVE.W	#2,-(A7)
	MOVE.W	#1,-(A7)
	TRAP	#$D
	ADDQ.L	#4,A7
	RTS
* GET KEYCODE
GETKB:	MOVE.W	#2,-(A7)
	MOVE.W	#2,-(A7)
	TRAP	#$D
	ADDQ.L	#$4,A7
	MOVE.W	D0,D3
	SWAP	D0
	RTS
* TRAP TO GET SERIAL STATUS
CKSER:	MOVE.W	#1,-(A7)
	MOVE.W	#1,-(A7)
	TRAP	#$D
	ADDQ.L	#4,A7
	RTS
* TRAP TO GET SERIAL BYTE
GETSER:	MOVE.W	#1,-(A7)
	MOVE.W	#2,-(A7)
	TRAP	#$D
	ADDQ.L	#4,A7
	RTS
* GET FILE NAME IN FNBUFF
GETFN:	PEA	FNBUFF
	MOVE.W	#$A,-(SP)
	TRAP	#1
	ADDA.L	#6,SP
	LEA	FNBUFF,A0
	CLR.B	#2(A0,D0.W)	* PUT ZERO AT END OF FILENAME
	RTS
YESNO:	BSR	CKKB
	CMP.W	#$FFFF,D0
	BNE	YESNO
	BSR	GETKB
	BSR	SHOWBYTE
	CMP.B	#$59,D3
	BEQ	NXT1
	MOVE.W	FHNDL3,-(SP)
	MOVE.W	#$3E,-(SP)
	TRAP	#1
	ADDA.L	#4,SP
	RTS
* SUBR TO CREATE A FILE - NAME IN FNBUFF
FILECR:	MOVE.W	#0,-(SP)
	PEA	FNBUFF+2
	MOVE.W	#$3C,-(SP)
	TRAP	#1
	ADDA.L	#8,SP
	TST.L	D0
	BPL	NOERR
	LEA	FERROR2,A0
	BSR	PSTRING
NOERR:	RTS
* SUBROUTINE TO SEND BYTE TO PRINTER
* NOTE: THIS TRAPS CONTROL BYTES
* CHECK FOR A CONTROL BYTE < $20
* AT PRESENT NOT USED (NO GOOD AT 1200 BAUD)
PRNT:	CMP.B	#$20,D3
	BGE	NOCTL
	MULU	#2,D3	* MULTIPLY * 2 SINCE TABLE IS IN WORDS
	LEA	PTABLE,A0
	MOVE.W	#0(A0,D3.W),D0	* SUBSTITUE A NEW VALUE FOR PRINTER
	MOVE.W	D0,D3
NOCTL:	CMP.B	#0,D3
	BEQ	NONULL	* DON'T BOTHER SENDING NULLS TO PRINTER
PRSTATUS:	* GET PRINTER STATUS AND LOOP UNTIL READY
	MOVE.W	#0,-(A7)
	MOVE.W	#1,-(A7)
	TRAP	#$D
	ADDQ.L	#4,A7
	CMP.W	#$FFFF,D0
	BEQ	PRSTATUS
* PRINT THE BYTE
	MOVE.W	D3,-(A7)
	MOVE.W	#0,-(A7)
	MOVE.W	#3,-(A7)
	TRAP	#$D
	ADDQ.L	#6,A7
NONULL:	RTS
XOFF	MOVEM.L	D0-D3/A0-A3,-(SP)
	MOVE.B	#$13,D3
	BSR	SENDSR
	MOVEM.L	(SP)+,D0-D3/A0-A3
	RTS
XON	MOVEM.L	D0-D3/A0-A3,-(SP)
	MOVE.B	#$11,D3
	BSR	SENDSR
	MOVEM.L	(SP)+,D0-D3/A0-A3
	RTS
OPENFR:	MOVE.W	#0,-(SP)	* OPEN FILE - READ ONLY
	PEA	FNBUFF+2
	MOVE.W	#$3D,-(SP)
	TRAP	#1
	ADDA.L	#8,SP
	RTS
* OPEN A FILE FOR WRITING
OPENFW:	MOVE.W	#1,-(SP) * WRITE ONLY
	PEA	FNBUFF+2
	MOVE.W	#$3D,-(SP)
	TRAP	#1
	ADDA.L	#8,SP	* ROUTINE TO PROPERLY CLOSE FILE
	RTS
* DUMP PARTIAL BUFFER
FILEND:	LEA	BUFFCOUNT,A1
	LEA	BUFFER,A0
	MOVE.W	(A1),D0
	MOVE.B	#$1A,D3	* PUT EOF MARKER
	MOVE.B	D3,#0(A0,D0.W)
	ADD.W	#1,D0
	MOVE.W	D0,BUFFCOUNT
	EXT.L	D0
	BSR	SENDBF
* CLOSE FILE BEFORE EXITING
CLOSED:	MOVE.W	#$0D,-(SP) * FUNCTION NUMBER FOR RESET DISK
	TRAP	#1
	ADDA.L	#2,SP
	RTS
SETBAUD:
	MOVE.W	#-1,-(A7)
	MOVE.W	#-1,-(A7)
	MOVE.W	#-1,-(A7)
	MOVE.W	#-1,-(A7)
	MOVE.W	#-1,-(A7)
	MOVE.W	D0,-(A7)
	MOVE.W	#15,-(A7)
	TRAP	#14
	ADDA.L	#14,A7
	RTS
* ESC CODE SUBSTITUTION TABLE
.DATA
EVEN
PTABLE:		DC.W  0,0,0,0,0,0,0,0,127,9,10,10,10,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
* MESSAGE SECTION
HELLO:		DC.B ' * * * TERMINAL PROGRAM WITH ASCII DOWNLOAD/UPLOAD * * *',$0D,$0A
		DC.B ' * * * PUBLIC DOMAIN.  By Alan Page - August 1985 * * * ',$0D,$0A
		DC.B ' * * * PRESS "HELP" FOR FUNCTION KEY DEFINITIONS * * * ',$0D,$0A
		DC.B ' * * * PRESS "UNDO" TO EXIT TO DESKTOP * * * ',$0D,$0A,0
HELP:		DC.B $0D,$0A,'<F1> = TOGGLE 300/1200 BAUD  <F2> = TOGGLE CAPTURE  <F3> = CREATE CAPTURE FILE',$0D,$0A
		DC.B '<F4> = OPEN UPLOAD FILE  <F5> = UPLOAD TEXT FILE  <F6> = TOGGLE DUPLEX',$0D,$0A
		DC.B '<F7> = TOGGLES LF AFTER CR RETURN (UPLOADS ONLY) ',$0D,$0A,0
WARN:		DC.B $0D,$0A,' * * * THIS FILE ALREADY EXISTS, OPENING IT FOR DOu.LOAD WILL DESTROY IT * * * ',$0D,$0A
		DC.B ' PRESS <Y> TO PROCEED, ANY OTHER KEY ABORTS > ',0
STARTF:		DC.B $0D,$0A,' * * * START DISK CAPTURE * * * ',$0D,$0A,0
STOPF:		DC.B $0D,$0A,' * * * STOP DISK CAPTURE * * * ',$0D,$0A,0
STARTU:		DC.B $0D,$0A,' * * * STARTING FILE UPLOAD * * * ',$0D,$0A,0
STOPU:		DC.B $0D,$0A,' * * * UPLOAD COMPLETE * * * ',$0D,$0A,0
MLFON:		DC.B $0D,$0A,' * * * LF SENT AFTER CR (DURING UPLOADS) * * * ',$0D,$0A,0
MLFOFF:		DC.B $0D,$0A,' * * * LF NOT SENT AFTER CR (DURING UPLOADS) * * * ',$0D,$0A,0
FERROR:		DC.B $0D,$0A,' * * * FILE NOT OPEN * * * ',$0D,$0A,0
FERROR2:	DC.B $0D,$0A,' * * * TOS FILE ERROR * * * ',$0D,$0A,0
FERR3:		DC.B $0D,$0A,' * * * AN OUTPUT FILE ALREADY EXISTS! * * * ',$0D,$0A,0
PROMPT:		DC.B $0D,$0A,'ENTER FILE NAME (FOR DISK CAPTURE)  > ',0
PROMPT2:	DC.B $0D,$0A,'ENTER FILE NAME (TO BE TRANSMITTED) > ',0
OKMSG:		DC.B $0D,$0A,' * * * FILE CREATED * * * ',$0D,$0A,0
OKMSG2:		DC.B $0D,$0A,' * * * FILE OPENED FOR OUTPUT * * * ',$0D,$0A,0
BAUD12:		DC.B $0D,$0A,' * * * 1200 BAUD * * * ',$0D,$0A,0
BAUD3:		DC.B $0D,$0A,' * * * 300 BAUD * * * ',$0D,$0A,0
FLAG:		DC.B 0
EVEN
BAUD:		DC.B 7
FPTR:		DC.L 0
FHNDLE:		DS.W 1
FHNDL2:		DS.W 1
FHNDL3:		DS.W 1
BUFFCOUNT:	DC.W 0
FNBUFF:		DC.B 80,0
		DS.B 80
EVEN
TEMP:		DS.W 1
TEMP2		DS.W 1
.BSS
EVEN
		DS.L 256
USTK		DS.L 1
BUFFER:		DS.B 32000
.END

--------------------------------------------------------------------

-- 
			Anees Munshi
			{allegra,ihnp4,linus,decvax}!utzoo!utcsri!utecfa!mugc
                        {ihnp4|decvax|utzoo|utcsri}!utecfa!mugc


Subject: Subject: Terminal prg for ST (assembler source, long)
Newsgroups: Newsgroups: net.micro.atari