phils@tekigm2.TEK.COM (Philip E Staub) (08/09/87)
By popular demand, and after receiving a note from Andy Finkel stating it would be ok to do so, I'm posting the following sources for a Tektronix 4695/4696 printer driver I developed a while back. It was derived from the sources in the RKM, and all files which have copyright notices in the RKM have them in this source. All of my changes are freely redistributable in any way you like. This source compiles/assembles with Manx 3.30c and later. You may need to tweak the makefile to accommodate the path to where you keep things, etc., but otherwise, there shouldn't be any problems rebuilding it. # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # makefile # data.c # dospecial.c # include.c # render.c # macros.i # init.asm # printertag.asm # wait.asm # This archive created: Wed Jul 22 10:14:35 1987 cat << \SHAR_EOF > makefile OBJS = printertag.o init.o wait.o data.o dospecial.o render.o AFLAGS = -D -I//include CFLAGS = +D +Q +Iinclude.pre Tektronix_4695: $(OBJS) copy :lib/cl.lib ram: ln -o Tektronix_4695 $(OBJS) -lcl inc: cc -a +D +Q +Hinclude.pre include.c SHAR_EOF cat << \SHAR_EOF > data.c /* Tektronix 4695 command table */ /****** printer.device/printers/Tektronix_4695_functions ******************** * * Name * Tektronix 4695 functions implemented: * * aIND, aNEL, * aSLPP, * aTBC0, aTBC3, aTBCALL, aTBSALL * * special functions implemented: * aRIN, aSLRM, aSFC, aSBC * **************************************************************************/ char *CommandTable[] = { "\377", /* reset RIS */ "\377", /* initialize RIN */ "\012", /* index IND */ "\015\012", /* new line NEL */ "\377", /* rev index RI */ "\377", /* norm ch set SGR0 */ "\377", /* italics on SGR3 */ "\377", /* italics off SGR23 */ "\022", /* underline on SGR4 */ "\021", /* underlin off SGR24 */ "\377", /* bold on SGR1 */ "\377", /* bold off SGR22 */ "\377", /* set fore col SFC */ "\377", /* set back col SBC */ "\377", /* norm space SHORP0 */ "\377", /* elite on SHORP2 */ "\377", /* elite off SHORP1 */ "\377", /* fine on SHORP4 */ "\377", /* fine off SHORP3 */ "\377", /* enlarged on SHORP6 */ "\377", /* enlarged off SHORP5 */ "\377", /* shadow print on DEN6 */ "\377", /* shadow print off DEN5 */ "\377", /* double strike on DEN4 */ "\377", /* double strike off DEN3 */ "\377", /* NLQ on DEN2 */ "\377", /* NLQ off DEN1 */ "\377", /* superscript on SUS2 */ "\377", /* superscript off SUS1 */ "\377", /* subscript on SUS4 */ "\377", /* subscript off SUS3 */ "\377", /* normalize the line SUS0 */ "\377", /* partial line up PLU */ "\377", /* partial line down PLD */ "\377", /* US Character Set FNT0 */ "\377", /* French Character set FNT1 */ "\377", /* German Character setFNT2 */ "\377", /* UK character set FNT3 */ "\377", /* Danish I character set FNT4 */ "\377", /* Swedish character set FNT5 */ "\377", /* Italian char set FNT6 */ "\377", /* Spanish char set FNT7 */ "\377", /* Jap char set FNT8 */ "\377", /* Norw char set FNT9 */ "\377", /* Danish II char set FNT10 */ "\377", /* Prop on PROP2 */ "\377", /* Prop off PROP1 */ "\377", /* prop clear PROP0 */ "\377", /* set prop offset TSS */ "\377", /* auto left justify JFY5 */ "\377", /* auto right justify JFY7 */ "\377", /* auto full justify JFY6 */ "\377", /* auto justify off JFY0 */ "\377", /* letter space (justify) JFY3 */ "\377", /* word fill (auto center) JFY1 */ "\377", /* 8LPI VERP0 */ "\377", /* 6LPI VERP1 */ "\377", /* set lines/page SLPP */ "\377", /* perf skip PERF */ "\377", /* perf skip off PERF0 */ "\377", /* left margin set LMS */ "\377", /* right margin set RMS */ "\377", /* top margin set TMS */ "\377", /* bottom margin set BMS */ "\377", /* set t&b margin STBM */ "\377", /* set l&r margin SLRM */ "\0334", /* clear all margins CAM */ "\377", /* horizontal tab set HTS */ "\377", /* vertical tab set VTS */ "\0338", /* clear horiz tab TBC0 */ "\0332", /* clear all horiz tabs TBC3 */ "\377", /* clear vert tab TBC1 */ "\377", /* clear all vert tabs TBC4 */ "\0332", /* clear all tabs TBCALL */ /* set default tabs TBSALL */ "033H10100808080808080808080810", "\377" /* extended commands EXTEND */ }; SHAR_EOF cat << \SHAR_EOF > dospecial.c /* Tektronix 4695 special printer functions */ /******* printer.device/printers/Tektronix_4695_special_functions ********** * * Name * Tektronix 4695 special functions implemented: * * aRIN, aSLRM, aSFC *************************************************************************/ #include "exec/types.h" #include "devices/printer.h" #include "devices/prtbase.h" extern struct PrinterData *PD; long DoSpecial(command,outputBuffer,vline,currentVMI,crlfFlag,Parms) register char outputBuffer[]; register UWORD *command; register BYTE *vline; register UBYTE *currentVMI; /* used for color on this printer */ BYTE *crlfFlag; UBYTE Parms[]; { register int x = 0; register int y = 0; static BYTE ISOcolorTable[10] = {'1','3','5','4','7','2','6','0','1','1'}; static unsigned char initMarg[] = "\033H001090"; if(*command==aRIN) { *currentVMI = 0x70; /* white background, black text */ outputBuffer[x++] = '\015'; outputBuffer[x++] = '\012'; Parms[0] = (PD->pd_Preferences.PrintLeftMargin); Parms[1] = (PD->pd_Preferences.PrintRightMargin); *command = aSLRM; } if(*command==aSLRM) { *Parms += 4; if (Parms[0]<5) Parms[0] = 5; Parms[1] += 5; if (Parms[1]>90) Parms[1] = 90; initMarg[4] = (char)((Parms[0]/10)+'0'); initMarg[5] = (char)((Parms[0]-(UBYTE)(Parms[0]/10)*10)+'0'); initMarg[6] = (char)((Parms[1]/10)+'0'); initMarg[7] = (char)((Parms[1]-(UBYTE)(Parms[1]/10)*10)+'0'); while (y<10) outputBuffer[x++] = initMarg[y++]; return(x); } if(*command==aSFC) { if (Parms[0]==39) Parms[0] = 30; /* set defaults */ if (Parms[0]==49) Parms[0] = 47; if (Parms[0]<40) *currentVMI = ((*currentVMI)&240)+(Parms[0]-30); else *currentVMI = ((*currentVMI)&15)+((Parms[0]-40)*16); outputBuffer[x++] = '\033'; outputBuffer[x++] = 'C'; outputBuffer[x++] = ISOcolorTable[(*currentVMI)&15]; outputBuffer[x++] = ISOcolorTable[(((*currentVMI)&240)/16)]; return(x); } if(*command==aRIS) PD->pd_PWaitEnabled = 253; return(0); } SHAR_EOF cat << \SHAR_EOF > include.c #include <exec/types.h> #include <exec/nodes.h> #include <exec/lists.h> #include <exec/memory.h> #include "devices/printer.h" #include "devices/prtbase.h" #include <functions.h> SHAR_EOF cat << \SHAR_EOF > render.c /**********************************************************************/ #include <exec/types.h> #include <exec/nodes.h> #include <exec/lists.h> #include <exec/memory.h> #include "devices/printer.h" #include "devices/prtbase.h" #include <functions.h> extern struct PrinterData *PD; /* for the Tektronix 4695 */ long Render(ct,x,y,status) register ULONG ct; /* was UBYTE for Lattice compiler */ register ULONG x,y; /* was UWORD for Lattice compiler */ ULONG status; /* was UBYTE for Lattice compiler */ { static UWORD ROWSIZE; static UWORD COLORSIZE; static UWORD BUFSIZE; static UWORD colors[4]; static BYTE huns,tens,ones; static UWORD bufptr; register struct PrinterData *pp = PD; register UBYTE *ptr; UWORD i; BYTE err; switch((UBYTE)status) { case 0: /* alloc memory for printer buffer (uses dbl buf) */ ROWSIZE = ((UWORD)x+7)/8; huns = ROWSIZE/100; tens = (ROWSIZE - huns*100)/10; ones = (ROWSIZE - huns*100 - tens*10); ROWSIZE += 6; COLORSIZE = ROWSIZE*4; BUFSIZE = COLORSIZE*4+2; colors[0] = 6; colors[1] = COLORSIZE*2+6; colors[2] = COLORSIZE+6; colors[3] = COLORSIZE*3+6; pp->pd_PrintBuf = (UBYTE *) AllocMem((long)BUFSIZE*2,(long)MEMF_PUBLIC); if(err = (pp->pd_PrintBuf==0)) return(err); if(err = (*(pp->pd_PWrite))("\0334",2L)) return(err); if(err = PWait(1L,0L)) return(err); bufptr = 0; return(0); break; case 1: /* put pixel in buffer (called a max of 16384 * times per print cycle */ i = bufptr+(UWORD)x/8+((UWORD)y&3)*ROWSIZE+colors[(UBYTE)ct]; pp->pd_PrintBuf[i] |= (1 << (7-((UWORD)x&7))); return(0); break; case 2: /* dump buffer to printer */ if (err = (*(pp->pd_PWrite))(&pp->pd_PrintBuf[bufptr], (long)BUFSIZE)) return (err); bufptr = BUFSIZE - bufptr; return(0); break; case 3: /* clear and init buffer */ ptr = &pp->pd_PrintBuf[bufptr]; i = BUFSIZE; while(i--) *ptr++ = 0; for (i = 0; i < 16; i++) { ptr = &pp->pd_PrintBuf[bufptr+i*ROWSIZE]; *ptr++ = 27; *ptr++ = 'I'; *ptr++ = i+'0'; *ptr++ = huns+'0'; *ptr++ = tens+'0'; *ptr++ = ones+'0'; } pp->pd_PrintBuf[bufptr+BUFSIZE-2] = 27; pp->pd_PrintBuf[bufptr+BUFSIZE-1] = 'A'; return(0); break; case 4: /* free the print buffer memory */ err = (*(pp->pd_PBothReady))(); FreeMem(pp->pd_PrintBuf,(long)BUFSIZE*2L); return(err); break; default: return(0); } } SHAR_EOF cat << \SHAR_EOF > macros.i ;************************************************************************** ; printer device macro definitions ;************************************************************************** ; external definition macros XREF_EXE macro XREF _LVO\1 endm XREF_DOS macro XREF _LVO\1 endm XREF_GFX macro XREF _LVO\1 endm XREF_ITU macro XREF _LVO\1 endm ; library dispatch macros CALLEXE macro CALLLIB _LVO\1 endm LINKEXE macro LINKLIB _LVO\1,_SysBase endm CALLDOS macro LINKLIB _LVO\1,_DOSBase endm LINKGFX macro LINKLIB _LVO\1,_GfxBase endm LINKITU macro LINKLIB _LVO\1,_IntuitionBase endm SHAR_EOF cat << \SHAR_EOF > init.asm ; ; Excerpt from Amiga ROM Kernel Reference Manual: Libraries and ; Devices. Used by permission, 1987, Phil Staub. ; ;************************************************************************** ; * ; Copyright 1985, Commodore-Amiga Inc. All rights reserved. * ; No part of this program may be reproduced, transmitted * ; transcribed, stored in retrieval system, or translated into * ; any language or computer language, in any form or by any means, * ; electronic, mechanical, magnetic, optical, chemical, * ; manual or ohterwise, without the prior written permission of * ; Commodore-Amiga Incorporated, 983 University Ave. Building #D, * ; Los Gatos, California, 95030 * ; * ;************************************************************************** section printer ; included files include "exec/types.i" include "exec/nodes.i" include "exec/lists.i" include "exec/memory.i" include "exec/ports.i" include "exec/libraries.i" include "macros.i" ; imported functions XREF_EXE CloseLibrary XREF_EXE OpenLibrary XREF _AbsExecBase XREF _PEDData ; exported globals XDEF _Init XDEF _Expunge XDEF _Open XDEF _Close XDEF _PD XDEF _PED XDEF _SysBase XDEF _DOSBase XDEF _GfxBase XDEF _IntuitionBase ;*********************************************** section printer,data _PD DC.L 0 _PED DC.L 0 _SysBase DC.L 0 _DOSBase DC.L 0 _GfxBase DC.L 0 _IntuitionBase DC.L 0 ;*********************************************** section printer,code _Init: move.l 4(a7),_PD lea _PEDData(pc),a0 move.l a0,_PED move.l a6,-(a7) move.l _AbsExecBase,a6 move.l a6,_SysBase ; open the dos library lea DLName(pc),a1 moveq #0,d0 CALLEXE OpenLibrary move.l d0,_DOSBase beq.l initDLErr ; open the graphics library lea GLName(pc),a1 moveq #0,d0 CALLEXE OpenLibrary move.l d0,_GfxBase beq.l initGLErr ; open the intuition library lea ILName(pc),a1 moveq #0,d0 CALLEXE OpenLibrary move.l d0,_IntuitionBase beq.l initILErr moveq #0,d0 pdiRTS: move.l (a7)+,a6 rts initPAErr: move.l _IntuitionBase,a1 LINKEXE CloseLibrary initILErr: move.l _GfxBase,a1 LINKEXE CloseLibrary initGLErr: move.l _DOSBase,a1 LINKEXE CloseLibrary initDLErr: moveq #-1,d0 bra.s pdiRTS ILName: dc.b 'intuition.library' dc.b 0 DLName: dc.b 'dos.library' dc.b 0 GLName: dc.b 'graphics.library' dc.b 0 ds.w 0 ; _Expunge: move.l _IntuitionBase,a1 LINKEXE CloseLibrary move.l _GfxBase,a1 LINKEXE CloseLibrary move.l _DOSBase,a1 LINKEXE CloseLibrary _Open: moveq #0,d0 rts _Close: moveq #0,d0 rts end SHAR_EOF cat << \SHAR_EOF > printertag.asm ; ; Excerpt from Amiga ROM Kernel Reference Manual: Libraries and ; Devices. Used by permission, 1987, Phil Staub. ; ;************************************************************************** ; * ; Copyright 1985, Commodore-Amiga Inc. All rights reserved. * ; No part of this program may be reproduced, transmitted * ; transcribed, stored in retrieval system, or translated into * ; any language or computer language, in any form or by any means, * ; electronic, mechanical, magnetic, optical, chemical, * ; manual or ohterwise, without the prior written permission of * ; Commodore-Amiga Incorporated, 983 University Ave. Building #D, * ; Los Gatos, California, 95030 * ; * ;************************************************************************** section printer include "exec/types.i" include "exec/nodes.i" include "exec/strings.i" include "devices/prtbase.i" xref _Init xref _Expunge xref _Open xref _Close xref _CommandTable xref _DoSpecial xref _Render xdef _PEDData xdef .begin xdef _main VERSION EQU 31 REVISION EQU 23 .begin: _main: moveq #0,d0 rts dc.w VERSION dc.w REVISION _PEDData: dc.l printerName dc.l _Init dc.l _Expunge dc.l _Open dc.l _Close dc.b PPC_COLORGFX dc.b PCC_YMCB dc.b 80 dc.b 1 dc.w 4 dc.l 1024 dc.l 0 dc.w 120 dc.w 120 dc.l _CommandTable dc.l _DoSpecial dc.l _Render dc.l 60 dc.l 0 printerName: dc.b "Tektronix 4695" dc.b 0 end SHAR_EOF cat << \SHAR_EOF > wait.asm section printer include 'exec/types.i' include 'exec/ports.i' include 'exec/devices.i' include 'exec/io.i' include 'devices/timer.i' XREF_EXE MACRO XREF _LVO\1 ENDM XREF_DOS MACRO XREF _LVO\1 ENDM XREF_GFX MACRO XREF _LVO\1 ENDM XREF_ITU MACRO XREF _LVO\1 ENDM CALLEXE MACRO CALLLIB _LVO\1 ENDM LINKEXE MACRO LINKLIB _LVO\1,_SysBase ENDM LINKDOS MACRO LINKLIB _LVO\1,_DOSBase ENDM LINKGFX MACRO LINKLIB _LVO\1,_GfxBase ENDM LINKITU MACRO LINKLIB _LVO\1,_IntuitionBase ENDM INCLUDE 'devices/prtbase.i' XREF_EXE Forbid XREF_EXE Permit XREF_EXE WaitIO XREF _SysBase XREF _PD XDEF _PWait _PWait: movem.l a4/a6,-(a7) move.l _PD,a4 move.l pd_PBothReady(a4),a0 jsr (a0) tst.l d0 bne.s error lea pd_TIOR(a4),a1 move.w #TR_ADDREQUEST,IO_COMMAND(a1) move.l 12(a7),IOTV_TIME+TV_SECS(a1) move.l 16(a7),IOTV_TIME+TV_MICRO(a1) clr.b IO_FLAGS(a1) move.l IO_DEVICE(a1),a6 jsr DEV_BEGINIO(a6) LINKEXE Forbid lea pd_TIOR(a4),a1 LINKEXE WaitIO LINKEXE Permit moveq #0,d0 tst.l d0 error: movem.l (a7)+,a4/a6 rts end SHAR_EOF # End of shell archive exit 0 -- ------------------------------------------------------------------------------- Phil Staub tektronix!tekigm2!phils (206) 253-5634 Tektronix, Inc., ISI Engineering P.O.Box 3500, M/S C1-904, Vancouver, Washington 98668