[comp.sources.atari.st] v01i055: joinprnt -- echo console output to printer

koreth@ssyx.ucsc.edu (Steven Grimm) (06/14/88)

Submitted-by: uunet!mcvax!philmds!leo (Leo de Wit)
Posting-number: Volume 1, Issue 55
Archive-name: joinprnt

The following nice little program (JOINPRNT.PRG) should be placed in the AUTO 
folder, so that it is made resident at startup time.
After pressing ^P (control-P) all screen output (but not the graphic part)
is also directed to the printer. In this way every program can have its
hardcopy without any trouble. Pressing ^P again toggles back to normal 
behaviour.
A few remarks:
A) The BIOS vector is altered to achieve this. This is however done 
transparently (using the old vector when necessary).
B) VT52 escape sequences are not send to the printer (the ESC and the following
character are ignored).
C) The ^P has to be read first (by whatever program; presumably a shell); this
is generally not a problem.
D) The program has been used by myself for about a month now, without problems.

The program was assembled and linked with the assembler and linker that come
with the GST-C compiler, using the commands:
ASM.PRG JOINPRNT
LINK.PRG JOINPRNT
The resulting code was 246 bytes in size.

    L.J.M. de Wit
    Nachtegaallaan 7
    5731XP Mierlo
    Holland

---------------------  H E R E   I T   A L L   S T A R T S  -------------------


      MODULE  JOINPR
      SECTION S.CCODE

GEMDOS    EQU 1
BIOS      EQU 13
PTERMRES  EQU $31
SETEXC    EQU 5
PTERM     EQU $4c
JOINON    EQU 0
HADESC    EQU 1

JOINIT
      MOVE.L   #-1,-(SP)
      MOVE.W   #$2D,-(SP)
      MOVE.W   #SETEXC,-(SP)
      TRAP     #BIOS             * Save old BIOS vector
      ADDQ.L   #8,SP
      LEA.L    OLDVEC(PC),A0
      MOVE.L   D0,(A0)
      PEA      JOINPR
      MOVE.W   #$2D,-(SP)
      MOVE.W   #SETEXC,-(SP)
      TRAP     #BIOS             * Set new BIOS vector
      ADDQ.L   #8,SP
      MOVE.L   4(SP),A0
      MOVE.L   #$100,D0          * Base page
      ADD.L    12(A0),D0         * + text length
      ADD.L    20(A0),D0         * + data length
      ADD.L    28(A0),D0         * + bss length
      CLR.W    -(SP)             * Return value: 0 for success
      MOVE.L   D0,-(SP)          * # bytes to keep
      MOVE.W   #PTERMRES,-(SP)   * Keep process
      TRAP     #GEMDOS           * Stops here...

* Entry point for 'embedded TRAP #13' in JOINPR
OLDTRAP
      MOVE.W   SR,-(SP)
* Entry point if not
OLDGEM
      MOVE.L   OLDVEC(PC),-(SP)
      RTS

* Altered BIOS routine
JOINPR
      LEA.L   FLAGS(PC),A1       * A1 will point to flags block
      MOVE.L  USP,A0             * A0 points to parameters to TRAP #13
      BTST    #5,(A7)
      BEQ.S   JOINUSER
      LEA     6(A7),A0           * If called from supervisor mode
JOINUSER
      CMP.W    #2,2(A0)          * console ?
      BNE.S    OLDGEM
      CMPI.W   #2,(A0)           * Bconin?
      BEQ.S    BCONIN
      CMPI.W   #3,(A0)           * Not Bconout
      BNE.S    OLDGEM
      TST.B    JOINON(A1)        * Flag set?
      BEQ.S    OLDGEM
      TST.B    HADESC(A1)        * Escape set?
      SF       HADESC(A1)        * reset flag first
      BNE.S    OLDGEM            * If flag was set
      CMP.W    #$1B,4(A0)        * Escape char?
      SEQ      HADESC(A1)
      BEQ.S    OLDGEM            * If escape
      MOVE.W   4(A0),-(SP)       * Make an extra copy of the word to print
      MOVE.W   4(A0),-(SP)
      MOVE.W   #0,-(SP)
      MOVE.W   #3,-(SP)
      BSR.S    OLDTRAP
      ADDQ.L   #6,SP
      MOVE.W   #2,-(SP)
      MOVE.W   #3,-(SP)
      BSR.S    OLDTRAP
      ADDQ.L   #6,SP
      RTE

BCONIN
      MOVE.W   #2,-(SP)
      MOVE.W   #2,-(SP)
      BSR.S    OLDTRAP
      ADDQ.L   #4,SP
      CMP.W    #'P'-'@',D0       * Control P?
      BNE.S    BCONEND
      LEA.L    FLAGS(PC),A1      * A1 points again to flags block
      NOT.B    JOINON(A1)        * Toggle flag
      BRA      JOINPR            * This discards current char
BCONEND
      RTE

      SECTION  S.DATA

OLDVEC   DC.L  0
FLAGS    DC.W  0                 * Two flag bytes: JOINON and HADESC

      END