;***************************************************************************
; 
; 	                         AUXSBR.SBR
; 	                        VERSION 1.1
; 
;		       Written By: James A. Jarboe IV
;			      1401 19th Street 
;			    Huntsville, TX 77340
;				409-295-5767
;
;				  10/02/88
;                    Copyright (c) James A. Jarboe IV
;                                  GR/AM
;****************************************************************************
;
; Get:
;	AUXSBR.BAS
;       AUXSBR.DOC
;         DUMB.M68
;
; Description:	Turns on terminal auxillary port and prints designated file
;               through the auxilliary port on the terminal, from within
;               a BASIC program
;	
; What it does: Opens the file selected
;		turns the auxillary port on
;		changes current terminal driver to DUMB.TDV
;		dumps out the file to the terminal through the aux port
;	        dumps it a character at a time
;		changes the terminal driver back to the original driver
;		turns the auxillary port off
;		closes the file
;		returns back to BASIC
;
; Requirements: DUMB.TDV must be in the terminal driver section of system 
;		memory as 
;                         TRMDEF PRINTER,AM300=3:DUMB,9600,20,20,20
;               OR
;                         TRMDEF AUXPRT,PSEUDO,DUMB,1,1,1
;					       
;		DUMB.TDV is a driver that just dumps data through.
;Example:
;-------------------------------------------------
;;**************
;;** DUMB.M68
;;**************
;;
;;	OBJNAM	DUMB.TDV
;;
;;DUMB:	WORD	0
;;	RTN
;;	RTN
;;	RTN
;;	RTN
;;	END
;-------------------------------------------------
;
; USAGE:  XCALL AUXSBR,filename.ext,flag
;	
;	Default extension is LST
;
; WHERE:
;	 filename.ext = a String variable
;        flag         = a 1 BINARY NUMBER  returned to basic program
;
; EXAMPLE:
;	MAP1 FILENAME,S,24
;       MAP1 FLAG,B,1		! 0 = all ok & printed
;				! 1 = filename not found
;				! 2 = filename is a RANDOM file	
;				! 3 = DUMB.TDV not on a TRMDEF Statement
;
;
; Other requirments:
;	The terminal must be capable of turning on and off the auxilliary port
;	by software. In some instances (such as a file formatted with control
;	characters for printout on a DIABLO printer), the control codes could
;	affect the terminal display screen and other activities. Therefore,
;	it is best to use an auxilliary port on call that also turns off the
;	output to the terminal. This call is usually refered to as
;	"transparent print on" in the TCRT calls or ? TAB(-1,82);.
;	This is also dependent on the terminal driver attached to your
;	terminal. There are two solutions to this : 
;	1). If your TCRT calls for your terminal "TAB(-1,82)" does not
;	    turn your auxillary port on and your screen off in "transparent
;	    print mode" then change your terminal driver to reflect the 
;	    correct control code to turn the terminal "transparent print"
;	    on and off. The terminal manual usually has these control codes
;	2). If your TCRT codes are already set up in the Terminal driver
;	    to turn the auxillary port on and the screen off in "transparent
;	    print mode" and the TCRT call code I.E."TAB(-1,192)" is different
;	    than TAB(-1,82) then change the AXON=82. to AXON=(your call). Do
;	    the same for AXOFF=83.
;
;	Since some terminal drivers are different and since TCRT calls are
;	not consistant some alterations may have to be made.
;
;	I have tested this program using SOROC terminals (using simultaneous
;       print mode) and FREEDOM 100 terminals (transparent mode) with OKIDATA,
;	TI810, HP-LASERJET, AND DIABLO printers all work very well, using
;       baud rates at 300, 1200, and 9600, using a straight
;	1-25 = 1-25 DB-25 connector.  Even the DIABLO with a file formatted
;	using SuperVue microspace codes. The only change on the DIABLO was
;	to put it into PTR RDY mode with the DIP switches on the front panel.
;
;	If you would like to substitute a special driver instead of the DUMB.TDV
;	then place it in the place of DUMDVR: at the end of this program
;
;	Any questions, answers, are comments to:
;	James A. Jarboe IV
;	GR/AM
;	409-295-5767
;
;       WORKS ON AMOS 1.2 - 1.3 OPERATING SYSTEMS
;
;	 sleep 7.5 secends when through printing for auxport running
;	       	at slower baud rate than main port's baud rate
;		I.E.  MAIN PORT BAUD RATE                    = 9600
;		      AUXILLARY PORT BAUD RATE & PRINTER     = 1200
;

VMAJOR=1
VEDIT=100		; Written
VEDIT=101		; Fancied up

	OBJNAM  AUXSBR.SBR

	SEARCH	SYS
	SEARCH  SYSSYM
	SEARCH	TRM

DEFINE	CRTF	X			; define an easy way
	MOVW	#X+177400,D1		; to print 
	TCRT				; TAB(-1,?);
	ENDM

DEFINE	PRTTAB	AA,BB
	PUSH	D1
	MOVB	#AA,D1
	LSLW	D1,#10
	MOVB	#BB,D1
	TCRT
	POP	D1
ENDM

	ASECT
.=0
XP.TOP:	BLKW	1
TYPE1:	BLKW	1			; type of arg 1
ADDR1:	BLKL	1			; address of arg1
SIZE1:	BLKL	1			; size arg1
TYPE2:	BLKW	1			; type of arg 2
ADDR2:	BLKL	1			; address of arg2
SIZE2:	BLKL	1			; size of arg2
TYPE3:	BLKW	1
ADDR3:	BLKL	1
SIZE3:	BLKL	1

	PSECT
	.=0
ASECT
AREA:	BLKB	616.
BUFFER: BLKB    8.
PRTDVR: BLKB	8.
WASDVR:	BLKB	8.
	EVEN
	ENDIMP=.
	PSECT
; TCRT CALLS
;
AXON=82.
AXOFF=83.
	
	PHDR	-1,0,PH$REE!PH$REU
;
; Check for variable & set up variables
;
SETUP:
	CMPW	XP.TOP(A3),#2		; got 2 variables ?
	JNE	QTYVAR			; no
	CMPW	TYPE1(A3),#2		; first one a string ?
	JNE	STRVAR			; no
	CMPW	TYPE2(A3),#6		; is var 2 binary
	JNE	BINNUM			; no
	MOV	ADDR1(A3),A6
	CMPB	@A6,#0		        ; is var1 empty
	BNE	NEWDVR			; no
	MOV	ADDR2(A3),A6		; send flag 1
	MOVW	#1,@A6			; back to basic
	RTN
NEWDVR:
	SAVE	A0
	JOBIDX	A0			; job index to a0
	MOV	JOBTRM(A0),A1		; get job goodies
 	MOV	T.TDV(A1),A1		; point to current driver
 	SUB	#4,A1			; get just the driver name
 	LEA	A2,WASDVR(A4)		; give it to wasdriver
 	UNPACK				; unload rad50
 	UNPACK				; to ascii
FSTDVR:
 	MOV	TRMTDC,D0		; address of first terminal driver
10$:					; in memory
 	CTRLC	20$			; if ^C then quit
 	MOV	D0,A2			; move address to A2
 	CMM	4(A2),DUMDVR		; compare it to DUMB.TDV
 	BEQ	AUXON			; found it ? ..
 	MOV	@A2,D0			; no..get address of next driver
 	BNE	10$			; do it again
	MOV	ADDR2(A3),A6		; no DUMB.TDV found so
	MOVW	#3,@A6			; send a 3 back to basic in flag
20$:
 	REST    A0
 	RTN				; Return to basic

AUXON:
 	CRTF	AXON			; turn aux port on
	JOBIDX	A0			; get job goodies
 	MOV	JOBTRM(A0),A1		; point to terminal driver place
 	ADD	#10,A2			; add 10 to it
 	MOV	A2,T.TDV(A1)		; put new driver in action
	REST    A0
	MOV	A0,AREA(A4)		; A0->DDB...
					; 
OPEN:					; make our own ddb
	CLEAR	@A4,D.DDB		; clear it...
	LEA	A6,D.DDB(A4)		; A6->I/O buffer...
	MOV	A6,D.BUF(A4)		; put into DDB...
	MOVB	#D$INI,D.FLG(A4)	; set INITed...
	MOV	ADDR1(A3),A2		; A2->filename...
	FSPEC	@A4,LST			; put filename into DDB, and
	LOOKUP  @A4			; lookup the file
	BEQ	10$			; if found then process
	CALL    AUXOFF			; not found .. turn aux off
	MOV	ADDR2(A3),A6		; send flag of 1
	MOVW	#1,@A6			; back to basic
	RTN
10$:
	;lets check for random files while we are here
	CMPW	D.WRK+6(A4),#-1		; RANDOM ?
	BNE	20$			; no
	CALL    AUXOFF			; yes.. turn aux off
	MOV     ADDR2(A3),A6		; send a flag of 2 
	MOVW	#2,@A6			; back to basic
	RTN
20$:
	OPENI	@A4			; open it.
LOOP:
	CTRLC   EOF
	FILINB	@A4			; ask for next byte...
	TST	D.SIZ(A4)		; anything left?
	BEQ	EOF			; br if not...
	TTY 				; put it out
	BR	LOOP			; do it again
EOF:
	MOVB	#12.,D1			; send a form feed to auxport
	TTY				; put it out
	CLOSE   @A4			; close the file
QUIT:
	CALL	AUXOFF			; turn aux off
 	SLEEP	#75000.			; sleep 7.5 sec [101]
					; just in case auxport baud rate
					; is slower than main port baud rate
					; can comment out or increase or
					; decrease time according to your
					; specs
	MOV	ADDR2(A3),A6		; send flag 0
	MOVW	#0,@A6			; back to basic
	RTN
;
; Turn Aux port off and reset orginal driver
;
AUXOFF:
	LEA	A2,WASDVR(A4)		; point to original driver
	LEA	A1,PRTDVR(A4)		; point to new place
	PACK				; repack it since
	PACK				; we unpacked it to see it
	MOV	TRMTDC,D0		; tell us where Term drivers are
10$:
	MOV	D0,A2			; point to next driver
	CMM	4(A2),PRTDVR(A4)	; compare memory to chosen driver
	BEQ	CHON			; found it ? ..
	MOV	@A2,D0			; no..get address of next driver
	BNE	10$			; do it again
	JMP	NOFNDV			; no find original driver
CHON:
 	JOBIDX	A0			; get job goodies
 	MOV	JOBTRM(A0),A1		; point them to a1
 	ADD	#10,A2			; add 10 to a2 to get driver
  	MOV	A2,T.TDV(A1)		; put original driver back in
	CRTF	AXOFF			; aux port off
	RTN
;
; Error Reporting
;
; Not enough variables
QTYVAR:
	PRTTAB	24.,1
	CRTF	11.
	TYPE    <Must pass >
	CRTF	12.
	TYPE	<2 >
	CRTF	11.
	TYPE	<variables >
	JMP	INAUX
;variable 2 must be a binary 1
BINNUM:
	TYPECR  
	PRTTAB	24.,1	
	CRTF	11.
	TYPE	<Variable >
	CRTF	12.
	TYPE	<2 >
	CRTF	11.
	TYPE	<must be a >
	CRTF	12.
	TYPE	<BINARY 1 >	
	BR 	INAUX
;variable 1 must be a string
STRVAR:
	TYPECR  
	PRTTAB	24.,1	
	TYPE	<First >
	CRTF	11.
	TYPE	<Variable must be a >
	CRTF	12.
	TYPE	<STRING >	
	BR 	INAUX
; could not find original driver !! bad bad problem !!
NOFNDV:
	TYPE  	<Original Terminal Driver Could not be found >
INAUX:
	CRTF	11.
	TYPE	<in >
	CRTF	12.
	TYPE	<AUXSBR.SBR >
	SLEEP	#75000.
	RTN

DUMDVR:	RAD50	/DUMB/			; if you want to use a different
	RAD50   /TDV/			; driver change data in DUMDVR
	EVEN				; even memory
	END