;       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

       PARMS=0
       TYPE.1=2
       ADD.1=4
       SIZE.1=10
       TYPE.2=14
       ADD.2=16
       SIZE.2=22
       TYPE.3=26
       ADD.3=30
       SIZE.3=34

;       OFFSETS FROM A4 (IMPURE STORAGE)

       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

       END