        TITLE   SET_OKI PRINTER MODES
        PAGE    80,132

; THIS PROGRAM SENDS CONTROL CHARACTERS TO AN OKIDATA MICROLINE 92
; PRINTER CONNECTED AS LPT1.
;
; THE USER IS PRESENTED WITH A MENU OF 16 ITEMS. ANY NUMBER OF
; CONTROL FUNCTIONS MAY BE PERFORMED.
;
; DOS 2.00 WITH ANSI.SYS IS REQUIRED.

CSEG    SEGMENT PARA PUBLIC 'CODE'
        ORG     100H

SET_OKI PROC    FAR
        ASSUME  CS:CSEG,DS:CSEG,ES:NOTHING
SET:    PUSH    DS
        XOR     AX,AX   ;SET RETURN CODE
        PUSH    AX
        PUSH    CS      ;SET DATA SEG
        POP     DS

        MOV     DX,OFFSET TITLES      ;START-UP MESSAGE
        MOV     AH,9
        INT     21H

PROMPT: MOV     AH,8  pe"w*:hr AAL NNO ECHO
        INT     21H     ; CALL DOS TO DO IT
        CMP     AL,0    ;EXTENDED CODE?
        JE      ERROR   ;YES, INVALID
        CMP     AL,27   ; OR ESCAPE?
        JE      DONE

        MOV     WHAT,AL
        CMP     AL,97   ;IS IT LOWER CASE
        JL      UPPER   ; NO, SEE IF LETTER
        SUB     AL,97   ;FORM OFFSET
        ADD     AL,10   ; ADJUST FOR LETTER CODE
        JMP     LETTER

UPPER:  CMP     AL,65   ;IS IT A LETTER?
        JL      NUMBER  ; NO, ASSUME NUMBER
        SUB     AL,65   ;GET OFFSET
        ADD     AL,10
        JMP     LETTER

NUMBER: CMP     AL,57   ;VALID NUMBER?
        JA      ERROR   ; NOPE
        SUB     AL,48   ;TO BINARY VALUE
        JS      ERROR   ;IF LESS THAN ZERO
LETTER: MOV     SI,AX   ;SAVE BINARY CODE
        CMP     AL,15   ;EXCEEDED MENU LIST?
        JA      ERROR   ;YES, OOPS
        ADD     AL,AL   ;TIMES 2 FOR INDEXING
        MOV     BL,AL   ;COPY OFFSET
        SUB     BH,BH   ;CLEAR HI-BYTE
        MOV     CX,WORD PTR CMDS[BX]

        MOV     AX,SI   ;GET CODE BACK
        MUL     TEXT_SIZE
        MOV     BX,AX   ; AS INDEX TO ATTRIBUTE
        MOV     TEXT+2[BX],'1'  ; AND HI-LITE CHOSEN TEXT
        MOV     TEXT+39[BX],'$' ; AND PRINT STOPPER

        MOV     DL,CL
        MOV     AH,5    ;PRINT CHAR IN DL
        INT     21H

        MOV     DL,CH
        MOV     AH,5    ;PRINT CHAR IN DL
        INT     21H

        MOV     DX,OFFSET WORD PTR TEXT
        ADD     DX,BX   ;HI-LITE SELECTED OPTION
        MOV     AH,9
        INT     21H
        MOV     DX,OFFSET ANSWER
        MOV     AH,9    ;CONFIRM SELECTION
        INT     21H
        JMP     PROMPT  ;GET ANOTHER SELECTION

ERROR:  MOV     AH,9
        MOV     DX,OFFSET ERR_MSG       ;INVALID ENTRY
        INT     21H
        JMP     PROMPT

DONE:   MOV     AH,9
        MOV     DX,OFFSET END_MSG       ;ALL SET
        INT     21H
        RET             ;RETURN TO DOS
        PAGE
TEXT_SIZE DB    40      ;LENGTH OF SELECTION ITEMS
TITLES  DB      27,'[2J',27,'[=2H',27,'[0M'
VERSION DB      'SET OKIDATA(R) PRINTER - VER. 1.0'
        DB      27,'[1;41H (C) 1984 VERNON D. BUERG'
;        EACH ENTRY MUST BE 40 BYTES AND IN NUMBER SEQUENCE
TEXT    DB      27,'[0M',27,'[3;1H0 = SIX (6) LPI               ';2754
        DB      27,'[0M',27,'[4;1H1 = PICA 10 CPI               ';3000
        DB      27,'[0M',27,'[5;1H2 = ELITE 12 CPI              ';2800
        DB      27,'[0M',27,'[6;1H3 = CONDENSED 17 CPI          ';2900
        DB      27,'[0M',27,'[7;1H4 = CORRESPONDENCE QUALITY    ';2749
        DB      27,'[0M',27,'[8;1H5 = EMPHASIZED PRINT          ';2784
        DB      27,'[0M',27,'[9;1H6 = STOP ENHANCED/EMPHASIZE   ';2773
        DB      27,'[0M',27,'[10;1H7 = UNDERLINED               ';2767
        DB      27,'[0M',27,'[3;41H8 = EIGHT (8) LPI            ';2756
        DB      27,'[0M',27,'[4;41H9 = DOUBLE PICA, 5 CPI       ';3031
        DB      27,'[0M',27,'[5;41HA = DOUBLE ELITE, 6 CPI      ';2831
        DB      27,'[0M',27,'[6;41HB = DOUBLE CONDENSED, 8.5CPI ';2931
        DB      27,'[0M',27,'[7;41HC = DATA PROCESSING QUALITY  ';2748
        DB      27,'[0M',27,'[8;41HD = ENHANCED PRINT           ';2772
        DB      27,'[0M',27,'[9;41HE = FORM FEED                ';1200
        DB      27,'[0M',27,'[10;41HF = STOP UNDERLINING        ';2768

MSG     DB      27,'[14;18HENTER SELECTION =>     '
        DB      27,'[17;18HESCAPE TO EXIT'
        DB      27,'[14;37H$'

ANSWER  DB      27,'[0M',27,'[15;18H'
WHAT    DB      0,' HAS BEEN PROCESSED',27,'[14;37H $'

ERR_MSG DB      07,27,'[1M',27,'[15;18HINVALID ENTRY           '
        DB      27,'[0M',27,'[14;37H $'

END_MSG DB      27,'[19;20H',27,'[1M ALL SET',27,'[0M$'

CMDS    DB      27,54 ;0        TWO BYTE DECIMAL CODES
        DB      30,00 ;1        REFER TO USER'S MANUAL
        DB      28,00 ;2
        DB      29,00 ;3
        DB      27,49 ;4
        DB      27,84 ;5
        DB      27,73 ;6
        DB      27,67 ;7
        DB      27,56 ;8
        DB      30,31 ;9
        DB      28,31 ;A
        DB      29,31 ;B
        DB      27,48 ;C
        DB      27,72 ;D
        DB      12,00 ;E
        DB      27,68 ;F

SET_OKI ENDP
CSEG    ENDS
        END     SET
  POP     DX
        POP     SI
        RET
