NAME SETP_MAIN
PAGE 75,132
TITLE SETP.ASM -- PROCEDURE TO SET PAGE LINES AND PERFORATION SKIP
;
;
;        NO STACK SEGMENT
;
DISPLAY  MACRO     MESSAGE
         MOV       AH,09               ;REQUEST DISPLAY
         MOV       DX,OFFSET MESSAGE   ;GET MESSAGE
         INT       21H                 ;DOS SERVICE TO PRINT
         ENDM
;
CODE     SEGMENT   PARA PUBLIC 'CODE'
         ASSUME    CS:CODE,DS:CODE,ES:CODE,SS:CODE
;
         PUBLIC    ASCII,DATE,TIME,ENTRY,SETP
         ORG       100H                ;SETUP FOR .COM FORMAT
ENTRY:   JMP       START
;
;        SKIP OVER DATA SEGMENT
;
SUBTTL   DATA AREA - SKIPPED
;
         DB        'Time_:##:##'       ;TIME STAMP
         DB        'Date_:--------'    ;DATE STAMP
         DB        'S LEOCE'           ;MARKER
;
MONTAB   DB        'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'
;
MSG      DB        'SYSTEM:  Intervention required on LPT1 $'
INFO1    DB        10,13,'LPT1:  Page length set for 11 inches$'
INFO2    DB        10,13,'LPT1:  Perforation skip set to 09 lines$'
INFO3    DB        10,13,'LPT1:  Line printer ready',10,13,'$'
ROWCOL   DW        ?                   ;ROW AND COLUMN FOR CURSOR
CMDLINE  DB        24,27,'9',27,'C',00,11,27,'N',09,27,'2'
         DB        13,'LPT1: SET PAGE LEN=11; LPI=6',09
         DB        'WAITING FOR WORK - ',
;
;
DAY      DB        2 DUP ('0')         ;PAD WITH ZEROS WHEN < 10
         DB        ' '                 ;SEPARATOR
MONTH    DB        3 DUP (0)           ;THE MONTH
         DB        ' '
YEAR     DB        4 DUP (0)           ;THE YEAR  - NULL FOR HERE
         DB        2 DUP (20H)         ;2 SPACES FOR SEPARATION
HOUR     DW        '00'
         DB        ':'
MINS     DW        '00'
         DB        ':'
SECS     DW        '00'
         DB        07,13,27,'<',10
MSGLEN   EQU       $-CMDLINE
;
SUBTTL SETP - PRINTER INIT UTILITY
;
START:                                 ;FAR AWAY FROM DOS 2.10
SETP     PROC      NEAR                ;A PUBLIC PROC FOR OS USE
         STI                           ;RESTART INTERRUPTS
         CALL      B10TST              ;SEE IF PRINTER IS READY
         CALL      DATE                ;GET DATE OF INIT
         CALL      TIME                ;TIME OF INITIALIZATION
         CALL      C10PRT              ;CALL PRINT ROUTINE
         RET
SETP     ENDP      ;END OF UTILITY DRIVER
                                       ;END OF MAIN CODE
;
SUBTTL PRINTER TEST ROUTINE
;
B10TST   PROC      NEAR                ;LOCAL PROCS ARE NEAR BY
         MOV       AH,03               ;FETCH CURSOR POSITION AND SAVE IT
         MOV       BH,00
         INT       10H                 ;BIOS FOR CURSOR SERVICE
         MOV       ROWCOL,DX           ;SAVE THE RETURNED VALUE
B20:
         MOV       AH,02               ;TEST PRINTER STATUS
         MOV       DX,00               ;
         INT       17H                 ;BIOS SERVICE TO TEST DEVICE
         TEST      AH,00101001B        ;SEE IF PRINTER READY ELSE MESSAGE
         JZ        B30                 ;NO - MESSAGE AND EXIT
         CALL      E10MSG              ;PROVIDE MESSAGE
         JMP       B20
B30:
         RET
B10TST   ENDP
;
C10PRT   PROC      NEAR                ;PROCEDURE TO PRINT
         LEA       SI,CMDLINE          ;GET THE PRINTER COMMANDS
         MOV       CX,MSGLEN           ;NUMBER OF BYTES TO PRINT
         CALL      D10OUT              ;DISPLAY THE LINE
         RET
C10PRT   ENDP
;
D10OUT   PROC      NEAR                ;PRINT MESSAGE
         MOV       DX,0000             ;PRINTER #0
D20:
         MOV       AH,00               ;REQUEST PRINT
         MOV       AL,[SI]             ;GET CHAR FROM LINE
         INT       17H                 ;BIOS TO PRINT SERVICE
         INC       SI
         LOOP      D20
         DISPLAY   INFO1
         DISPLAY   INFO2
         DISPLAY   INFO3
         RET
D10OUT   ENDP
;
E10MSG   PROC      NEAR                ;DISPLAY A MESSAGE
         MOV       AH,02               ;REQUEST SET CURSOR FUNCTION
         MOV       BH,00               ;
         MOV       DX,ROWCOL           ;OLD POSITION SAVED
         INT       10H                 ;BIOS FOR DISPLAY SERVICE
         LEA       DX,MSG              ;GET ERROR MESSAGE
         MOV       AH,09H
         INT       21H
         RET
E10MSG   ENDP
;
COMMENT  * THIS PROCEDURE WRITES THE DOS TIME WITHOUT PROMPTING FOR THE
           NEW TIME LIKE THE DOS TIME COMMAND DOES.  SOMETIMES YOU JUST
-          NEED TO SEE THE TIME, SAY IN A BATCH PROCEDURE WITHOUT ACTUALLY
           RESETTING IT.  DOS MAKES THIS UNCOMFORTABLE
         *
;
SUBTTL TIME CONVERSION UTILITY
;
TIME     PROC      NEAR
         PUBLIC    TIME                ;
         MOV       AH,02CH             ;REQUEST DOS FETCH TIME
         INT       21H                 ;
         MOV       AL,CH               ;HOURS - 0..23 IN AL
         CALL      CONVT               ;CONVERT
         MOV       HOUR,'00'           ;BLANK FOR NOW
         ADD       HOUR,AX             ;ASCII ADD
         MOV       AL,CL               ;DO SAME FOR MINUTES
         CALL      CONVT
         MOV       MINS,'00'
         ADD       MINS,AX
         MOV       AL,DH               ;SECONDS
         CALL      CONVT
         MOV       SECS,'00'           ;ASCII ZEROES
         ADD       SECS,AX
         RET
TIME     ENDP
;
;
SUBTTL - DATE CONVERSION UTILITY
DATE     PROC      NEAR                ;DATE PROCEDURE
         PUBLIC    DATE                ;MAKE PUBLIC FOR LINKER
;
         MOV       AH,2AH              ;GET DATE FROM DOS
         INT       21H                 ;RETURN IN CX,DX
         PUSH      CX                  ;SAVE THE CURRENT CONTENTS
         PUSH      DX                  ;SAVE THE WHOLE DATE NOW
         MOV       DI,OFFSET DAY+1     ;THE DAY OF THE MONTH
         SUB       DH,DH               ;ZERO THE HIGH PART OF DX
         MOV       AX,DX               ;THE DAY NUMBER
         SUB       DX,DX               ;ZERO THE DX REGISTER
         CALL      ASCII
         POP       AX                  ;GET THE OLD VALUE BACK FROM STK
         MOV       DI,OFFSET MONTH     ;THE MONTH NUMBER
         MOV       SI,OFFSET MONTAB    ;MONTH TABLE
         SUB       AL,AL               ;GET RID OF DAYS...
         XCHG      AH,AL               ;SWAP POSITIONS FOR CORRECT ADD LEN
         MOV       CX,0003             ;SETUP ADDR IS SI+3*MONTH-3 BYTES
         MUL       CL
         SUB       AX,3
         ADD       SI,AX               ;ADD OFFSET AND MOVE 3 BYTES
         CLD                           ;CLEAR DIRECTION TO FWD
REP      MOVSB                         ;MOVE STRING BYTES
         MOV       DI,OFFSET YEAR+3
         POP       AX
         SUB       DX,DX
         CALL      ASCII
         RET                           ;BACK TO CALLER
DATE     ENDP
;
SUBTTL   ASCII CONVERSION ROUTINE
;
ASCII    PROC      NEAR                ;CONVERT
         MOV       BX,0AH              ;DIVISOR
         MOV       CL,30H              ;CONVERSION FACTOR FOR ASCII
RPT1:
         XOR       DX,DX
         DIV       BX                  ;CLEAR DX
         OR        DL,CL
         MOV       [DI],DL
         DEC       DI                  ;GET NEXT CHAR
         CMP       AX,0                ;DONE YET?
         JNZ       RPT1                ;NO - MORE
         RET                           ;YES - QUIT
ASCII    ENDP
;
CONVT    PROC      NEAR
         PUBLIC    CONVT               ;CONVERT THE TIME SEGMENTS
         PUSH      CX
         XOR       AH,AH               ;
         MOV       CL,10               ;DIVISOR FOR ASCII ADJUST
         DIV       CL
         POP       CX                  ;RESTORE OLD VALUES
         RET                           ;DONE
CONVT    ENDP
;
CODE     ENDS
         END       ENTRY
