🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: net.micro.atari
1 messages
1 total messages Started by ModemUserGroupChairman Sun, 22 Sep 1985 00:48
Alterm.s (source) for the ST.
#1075
Author: ModemUserGroupChairman
Date: Sun, 22 Sep 1985 00:48
511 lines
12542 bytes
	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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads