From: s1110238@giaeb.cc.monash.edu.au (Lee Hollingworth)
Subject: Re: Specifying printer ports
Keywords: printer
Organization: Monash University, Melb., Australia.
Date: Fri, 13 Nov 1992 12:17:23 GMT

rickt@aruba.UUCP (Rickey Thomas Tom) writes:

>    I have an application that requires printing through the parallel port.
>Normally, I could say something like

>        fprintf( stdprn,".....");

>However, I believe that this will send output to LPT1. But, in my application, I
>am using LPT1 to do other things (interrupt driven data acquisition). I need a
>way of forcing output to LPT2 within the program. I have several TSR program
>which would work, but I would like to avoid using them if I can.

Note sure if this will help, but here is some code I use in a text editor
I wrote...

Lee Hollingworth
s1110238@giaeb.cc.monash.edu.au

# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by Lee Hollingworth <s1110238@giaeb> on Fri Nov 13 23:35:19 1992
#
# This archive contains:
#	biosibm.asm	biosibm.h	readme.1st	utils.c		
#

LANG=""; export LANG
PATH=/bin:/usr/bin:$PATH; export PATH

echo x - biosibm.asm
cat >biosibm.asm <<'@EOF'
;---------------------------------------------------------------------------
; file:       biosibm.asm
; purpose:    int 16h keyboard status functions and int 17h printer functions
; assembler:  MASM 6.0
; compile:    ml /c /Cp /Cx /W3 biosibm.asm
; author:     Lee Hollingworth s1110238@giaeb.cc.monash.edu.au
; header:     biosibm.h
;---------------------------------------------------------------------------

key_ready   equ     11h             ; function K_READY

            .model small
            .code
public      _bioskeybrd
;----------------------- bioskeybrd ----------------------------------------
;   call    unsigned int bioskeybrd(service);
;           unsigned int service;
;   services
;           K_READ      read character and scan code, wait if none ready
;           K_READY     check if a key is waiting to be read
;           K_STATUS    get the current keyboard status
;               refer to biosibm.h for defines
;----------------------------------------------------------------------------
_bioskeybrd proc
            push    bp
            mov     bp, sp              ; mov stack pointer to base pointer
            push    si
            push    di

            mov     ah, [bp+4]          ; get service argument
            cmp     ah, key_ready       ; special case for key_ready service
            jne     key_read_status     ; jump if not key_ready
            int     16h
            jnz     alldone             ; jmp if character waiting to be read
            xor     ax, ax              ; otherwise return 0
            jmp     alldone

key_read_status:
            int     16h                 ; simple call for read or status

alldone:
            pop     di
            pop     si
            pop     bp
            ret
_bioskeybrd endp

public      _prnwrite
;------------------------- prnwrite ----------------------------------------
;   call    unsigned int prnwrite(ch, port);
;           unsigned char ch
;           unsigned int port
;               refer to biosibm.h for defines
;----------------------------------------------------------------------------
_prnwrite   proc
            push    bp
            mov     bp, sp              ; mov stack pointer to base pointer
            push    si
            push    di

            mov     al, [bp+4]          ; get character to print
            mov     dx, [bp+6]          ; get port number
            mov     ah, 00h
            int     17h
            xor     al, al              ; clear al

            pop     di
            pop     si
            pop     bp
            ret
_prnwrite   endp

public      _prninit
;------------------------- prninit ----------------------------------------
;   call    unsigned int prninit(port);
;           unsigned int port
;               refer to biosibm.h for defines
;----------------------------------------------------------------------------
_prninit   proc
            push    bp
            mov     bp, sp              ; mov stack pointer to base pointer
            push    si
            push    di

            mov     al, [bp+4]          ; get printer port
            mov     ah, 01h
            int     17h
            xor     al, al              ; clear al

            pop     di
            pop     si
            pop     bp
            ret
_prninit   endp

public      _prnstatus
;------------------------- prnstatus ----------------------------------------
;   call    unsigned int prnstatus(port);
;           unsigned int port
;               refer to biosibm.h for defines
;----------------------------------------------------------------------------
_prnstatus   proc
            push    bp
            mov     bp, sp              ; mov stack pointer to base pointer
            push    si
            push    di

            mov     al, [bp+4]          ; get printer port
            mov     ah, 02h
            int     17h
            xor     al, al              ; clear al

            pop     di
            pop     si
            pop     bp
            ret
_prnstatus   endp

            end
@EOF

chmod 600 biosibm.asm

echo x - biosibm.h
cat >biosibm.h <<'@EOF'
/****
 * file:    biosibm.h
 * purpose: defines for biosibm.asm
 * author:  Lee Hollingworth s1110238@giaeb.cc.monash.edu.au
 ****/

#ifndef BIOSKEYS
#define BIOSKEYS

/* bioskeybrd services */
#define K_READ      0x10
#define K_READY     0x11
#define K_STATUS    0x12

/* enhanced keyboard status bits */
#define K_RSHIFT    0x0000         /* right shift is down   */
#define K_LSHIFT    0x0002         /* left shift is down    */
#define K_CTRL      0x0004         /* both Ctrl keys down   */
#define K_ALT       0x0008         /* both Alt keys down    */
#define K_SCROLL    0x0010         /* scroll lock toggle on */
#define K_NUM       0x0020         /* num lock toggle on    */
#define K_CAP       0x0040         /* cap lock toggle on    */
#define K_INS       0x0080         /* insert toggle is on   */
#define K_LCTRL     0x0100         /* left Ctrl key down    */
#define K_LALT      0x0200         /* left Alt key down     */
#define K_RCTRL     0x0400         /* right Ctrl key down   */
#define K_RALT      0x0800         /* right Alt key down    */
#define K_PSCROLL   0x1000         /* scroll key is down    */
#define K_PNUM      0x2000         /* num key is down       */
#define K_PCAP      0x4000         /* cap key is down       */
#define K_SYSRQ     0x8000         /* sys rq key is down    */

#endif

#ifndef BIOSPRN
#define BIOSPRN

#define LPT1            0           /* printer port 1 */
#define LPT2            1           /* printer port 2 */
#define LPT3            2           /* printer port 3 */

#define PR_TIME_OUT     0x0100      /* printer timed out */
#define PR_IO_ERROR     0x0800      /* printer i/o error occurred */
#define PR_SELECETED    0x1000      /* printer selected */
#define PR_OUT_OF_PAPER 0x2000      /* out of paper */
#define PR_ACK          0x4000      /* printer acknowlege */
#define PR_NOT_BUSY     0x8000      /* printer is not busy */

#endif


extern unsigned bioskeybrd(unsigned int service);
extern unsigned prnwrite(unsigned int ch, unsigned int port);
extern unsigned prninit(unsigned int port);
extern unsigned prnstatus(unsigned int port);
@EOF

chmod 600 biosibm.h

echo x - readme.1st
cat >readme.1st <<'@EOF'

The functions in these files have been cut out of another application
and are not expected to run as is -- they must be included into the
body of another program.

Lee Hollingworth
s1110238@giaeb.cc.monash.edu.au
@EOF

chmod 600 readme.1st

echo x - utils.c
cat >utils.c <<'@EOF'
#include <stdio.h>
#include "common.h"     /* global variables */
#include "biosibm.h"

/***
 * function: print
 * purpose : print the current text file
 * passed  : fname -- file name
 ***/
status print(char *fname)
{
    FILE *infile;
    unsigned count = 0;             /* lines counted so far */
    int ch;                         /* character to print */
    int i = 0;                      /* loop counter */
    extern unsigned g_prn_port;     /* global printer port */
    extern unsigned g_lines_pp;     /* global lines per page */

    if ((infile = fopen(fname, "r")) == NULL) {
        perror(fname);
        return ERROR;
    }
    prninit(g_prn_port);
    while ((ch = fgetc(infile)) != EOF) {
        if (ch == '\n') {
            prnwrite(CR, g_prn_port);
            prnwrite(LF, g_prn_port);
            if (g_lines_pp) {
                if (++count >= g_lines_pp) {
                    count = 0;
                    prnwrite(FF, g_prn_port);
                }
            }
        }
        else if (ch != FF || ch != VT) {
            prnwrite(ch, g_prn_port);
        }
    }
    prnwrite(FF, g_prn_port);
    fclose(infile);
    return OK;
}


@EOF

chmod 600 utils.c

exit 0
Newsgroups: comp.os.msdos.programmer