; FORMS.SBR
;
;
;
; PROPRIETARY PROGRAM MATERIAL
;
; THIS MATERIAL IS THE PROPERTY OF DALE A. EICHBAUER,
; 692 E. FREELAND ROAD, MERRILL, MICHIGAN, 48637. PERMISSION
; TO COPY & USE IS GRANTED FOR NON-PROFIT USES ONLY.
;
;
;
;
; -----------EITHER 2 OR 3 ARGUMENTS ARE PASSED-------------------------
;
; THE FIRST IS A 1-BYTE STRING CHARACTER INDICATING
; THE PRINTER TYPE -- CURRENTLY "T" FOR TI-810,
; "N" FOR NEC SPINWRITER, "P" FOR THE IDS PRISM
; AND AM-304 (DATAPRODUCTS) FAMILY OF PRINTERS,
; "A" FOR THE AM302, AND "E" FOR THE EPSON MX80
; ARE ONLY ONES ACCEPTED.
; THE SECOND BYTE IS A 1-BYTE BINARY VALUE INDICATING
; THE NUMBER OF LINES PER PAGE.
; THE THIRD (OPTIONAL) ARGUMENT IS A STRING INTO WHICH
; THE CODES ARE PASSED, IF THE OPTION IS
; SPECIFIED, RATHER THAN DIRECT OUTPUT.
;
; VARIABLE STORAGE AREAS:
;
; 0(A4) -- PRINTER TYPE ADDRESS
; 4(A4) -- FORM LINE COUNT TO SET IN PRINTER
; 10(A4) -- DDB ADDRESS OF FILE # 4(PRINTER) (CHANGE TO SUIT NEEDS)
; 14(A4) -- ADDRESS OF BUFFER IN DDB
SEARCH SYS
SEARCH SYSSYM
AUTOEXTERN
OBJNAM FORMS.SBR
VMAJOR=2.
VMINOR=6.
VSUB=0.
VEDIT=100.
VWHO=1.
; OFFSETS FROM A3 FOR PARAMETERS PASSED FROM BASIC
PTR.L=0 ; ADDRESS OF PRINTER TYPE VARIABLE
LINES.L=4 ; ADDRESS OF NUMBER OF LINES IN FORM VARIABLE
DDB.L=10 ; ADDRESS OF PRINT FILE DDB (IF SPECIFIED)
BUFF.L=14 ; ADDRESS OF PRINT FILE DDB BUFFER (IF SPECIFIED)
DEFINE XY A,B
MOV #^D<A_8.+B>,D1
TCRT
ENDM
PHDR -1,PV$RPD,PH$REE!PH$REU
BR START
ASCII / COPYRIGHT (C) 1983, 1984 DALE A. EICHBAUER /
EVEN
START: JOBIDX A6
MOV JOBTRM(A6),A2
ORW #33,@A2 ; SET NOECHO, IMAGE MODE, DATA TRANSPARENCY, & ENABLE LOWER CASE
MOV ADD.1(A3),PTR.L(A4) ; PRINTER TYPE ADDRESS
MOV ADD.2(A3),LINES.L(A4) ; NUMBER OF LINES ADDRESS
CMPW PARMS(A3),#2 ; SEE IF ONLY 2 PARAMETERS PASSED
BLE FILE ; IF SO, DO FILE OUTPUT
CMPW TYPE.3(A3),#2 ; SEE IF STRING OR UNFORMATTED
JGT PARMERR ; IF NOT, ABORT
MOV ADD.3(A3),BUFF.L(A4) ; GET THE ADDRESS OF THE STRING
MOV BUFF.L(A4),A2 ; USE THIS DOWN BELOW
MOV SIZE.3(A3),D1 ; GET THE STRING SIZE
CMP D1,#132. ; MUST BE 132 LONG AT LEAST
JLT PARMERR ; IF BAD, ABORT
BR L47004 ; AND GO FILL THE STRING
FILE: MOV #4.,D1 ; FILE #4 IS THE PRINTER (CHANGE AS NEEDED)
CALL $FLSET ; FIND THE DDB
JNE L01570
MOV A2,DDB.L(A4) ; STORE THE DDB ADDRESS
MOV D.BUF(A2),BUFF.L(A4) ; STORE THE PRINTER BUFFER ADDRESS
TST D.IDX(A2) ; SEE IF ANYTHING ALREADY IN BUFFER
BEQ SKIP ; IF NOT, GO AROUND
MOV D.IDX(A2),D.SIZ(A2) ; SET BUFFER SIZE TO BYTES LEFT
WRITE @A2 ; ELSE PUT IT OUT FIRST
JNE FILERR ; IF ERROR, ABORT
SKIP: MOV #132.,D.SIZ(A2) ; SET RECORD LENGTH TO 132 CHARS.
MOV D.SIZ(A2),D1 ; LOAD BUFFER SIZE FOR COUNTER
MOV BUFF.L(A4),A2 ; GET BUFFER STARTING ADDRESS
L47004: MOVB #0,(A2)+ ; MOVE IN A NULL
SOB D1,L47004 ; & BACK TILL DONE
MOV BUFF.L(A4),A2 ; GET BUFFER STARTING ADDRESS AGAIN
MOV PTR.L(A4),A1 ; GET THE TYPE CHARACTER
CMPB @A1,#'T ; SEE IF "T"
BEQ L40001 ; NO FORMFEED IF IT IS
CMPB @A1,#'t ; SEE IF "t"
BNE L45000 ; GO ON TO NEC CHECK
; TYPE IS TI-810
L40001: MOVB #177,(A2)+ ; CLEAR LINE BUFFER
MOVB #33,(A2)+ ; ESCAPE
MOVB #62,(A2)+ ; COMMAND # 62
MOV LINES.L(A4),A1 ; POINT TO PAGE LENGTH VALUE
MOVB @A1,(A2)+ ; LOAD THE PAGE LENGTH
MOVB #15,(A2)+ ; CR
JMP ENDIT ; OUTPUT THEM
L45000: MOV PTR.L(A4),A1 ; GET THE TYPE CHARACTER
CMPB @A1,#'N ; SEE IF "N"
BEQ L45001 ; NO FORMFEED IF IT IS
CMPB @A1,#'n ; SEE IF "n"
BNE PRISM ; NO MATCH, TRY PRISM
; TYPE IS NEC
L45001: MOVB #33,(A2)+ ; ESCAPE
MOVB #67,(A2)+ ; COMMAND # 7 -- CLEAR ALL TABS & FF LENGTH
MOVB #33,(A2)+ ; ESCAPE
MOVB #77,(A2)+ ; COMMAND # ? -- INHIBIT PAPER MOVEMENT
MOV LINES.L(A4),A1 ; POINT TO PAGE LENGTH VALUE
CLR D1
MOVB @A1,D1 ; LOAD THE PAGE LENGTH
L45002: MOVB #12,(A2)+ ; PUT OUT LINE FEEDS EQUAL TO PAGE LENGTH
SOB D1,L45002
MOVB #33,(A2)+ ; ESCAPE
MOVB #100,(A2)+ ; COMMAND # @ -- RESET FORMAT MODE (NORMAL)
MOVB #33,(A2)+ ; ONE LAST ESCAPE SEQUENCE
MOVB #114,(A2)+ ; COMMAND # L -- SET FORM FEED LENGTH
JMP ENDIT
PRISM: CMPB @A1,#'P ; SEE IF "P"
BEQ PRISM1 ; NO FORMFEED IF IT IS
CMPB @A1,#'p ; SEE IF "P"
BNE AM302 ; NO MATCH, TRY AM-302
PRISM1: MOVB #33,(A2)+ ; SET UP VERTICAL ADV-1 FIRST
MOVB #'B,(A2)+
MOVB #',,(A2)+ ; SEND SEPERATOR
MOVB #'8,(A2)+ ; MAKE IT 6 LPI (8 UNITS PER LINE)
MOVB #',,(A2)+ ; ANOTHER SEPERATOR
MOVB #'$,(A2)+ ; AND TERMINATOR
MOVB #15,(A2)+ ; NOW TERMINATE COMMAND WITH CR
MOVB #10,(A2)+ ; AND LF
MOVB #33,(A2)+ ; ESCAPE
MOVB #'L,(A2)+ ; INDICATE FORM LENGTH SEQUENCE
MOVB #',,(A2)+ ; SEND COMMA SEPERATOR
MOV LINES.L(A4),A1 ; POINT TO PAGE LENGTH VALUE
CLR D1
MOVB @A1,D1 ; LOAD THE PAGE LENGTH
MUL D1,#10 ; MULTIPLY # LINES BY 8 INCREMENTS PER LINE
DCVT 0,10 ; SEND TO BUFFER
MOVB #',,(A2)+ ; SEND COMMA SEPERATOR
MOV LINES.L(A4),A1 ; POINT TO PAGE LENGTH VALUE
CLR D1
MOVB @A1,D1 ; LOAD THE PAGE LENGTH
DEC D1 ; MAKE THIS ONE LINE LESS
MUL D1,#10 ; MULTIPLY # LINES BY 8 INCREMENTS PER LINE
DCVT 0,10 ; SEND TO BUFFER
MOVB #',,(A2)+ ; SEND COMMA SEPERATOR
MOVB #'$,(A2)+ ; AND THE TERMINATOR
MOVB #15,(A2)+ ; CR
MOVB #10,(A2)+ ; LF
BR ENDIT ; OUTPUT ALL OF THIS
AM302: CMPB @A1,#'A ; SEE IF "A"
BEQ ALPHA ; IF SO, WE'RE SET
CMPB @A1,#'a ; SEE IF "a"
BNE MX80 ; IF NO MATCH, TRY EPSON MX80
; TYPE IS AM-302
ALPHA: MOVB #33,(A2)+ ; ESCAPE
MOVB #14,(A2)+ ; FF CHARACTER
MOV LINES.L(A4),A1 ; POINT TO PAGE LENGTH VALUE
MOVB @A1,(A2)+ ; LOAD THE PAGE LENGTH
MOVB #15,(A2)+ ; TERMINATE WITH 'RETURN'
BR ENDIT
MX80: CMPB @A1,#'E ; SEE IF "E"
BEQ EPSON ; IF SO, WE'RE SET
CMPB @A1,#'e ; SEE IF "e"
BNE BASIC ; IF NO MATCH, BACK TO CALLING PROGRAM
; TYPE IS EPSON MX-80
EPSON: MOVB #33,(A2)+ ; ESCAPE
MOVB #'@,(A2)+ ; MASTER RESET CHARACTER
MOVB #15,(A2)+ ; TERMINATE WITH 'RETURN'
MOVB #33,(A2)+ ; ESCAPE
MOVB #'C,(A2)+ ; FORMLENGTH CHARACTER
MOV LINES.L(A4),A1 ; POINT TO PAGE LENGTH VALUE
MOVB @A1,(A2)+ ; LOAD THE PAGE LENGTH
MOVB #15,(A2)+ ; TERMINATE WITH 'RETURN'
;
ENDIT: CMPW PARMS(A3),#2 ; SEE IF ONLY 2 PARAMETERS PASSED
BGT BASIC ; IF NOT, ALL DONE
MOV DDB.L(A4),A2 ; LOAD A2 WITH ADDRESS OF DDB
MOV #120,D.SIZ(A2) ; PUT RECORD LENGTH IN DDB
MOV #0,D.IDX(A2) ; INDEX IS AT ZERO
WRITE @A2 ; OUTPUT RECORD
JNE FILERR ; IF ERROR, ABORT
BASIC: RTN ; BACK TO BASIC
L01570: XY 24,1
XY -1,9
TYPE <?Bad file channel passed to FORMS.SBR>
SLEEP #30000.
RTN
FILERR: XY 24,1
XY -1,9
TYPE <?Error while writing to file in FORMS.SBR>
SLEEP #30000.
RTN
PARMERR:
XY 24,1
XY -1,9
TYPE <?Bad parameter passed to FORMS.SBR>
SLEEP #30000.
RTN
ASCII / COPYRIGHT (C) 1983, 1984 DALE A. EICHBAUER /
EVEN