home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Carousel
/
CAROUSEL.cdr
/
mactosh
/
code
/
cshar_at.sit
< prev
next >
Wrap
Text File
|
1988-06-20
|
33KB
|
1,256 lines
18-Jun-88 15:15:10-MDT,34654;000000000000
Return-Path: <u-lchoqu%sunset@cs.utah.edu>
Received: from cs.utah.edu by SIMTEL20.ARPA with TCP; Sat, 18 Jun 88 15:14:32 MDT
Received: by cs.utah.edu (5.54/utah-2.0-cs)
id AA22719; Sat, 18 Jun 88 14:48:20 MDT
Received: by sunset.utah.edu (5.54/utah-2.0-leaf)
id AA24845; Sat, 18 Jun 88 14:48:16 MDT
Date: Sat, 18 Jun 88 14:48:16 MDT
From: u-lchoqu%sunset@cs.utah.edu (Lee Choquette)
Message-Id: <8806182048.AA24845@sunset.utah.edu>
To: rthum@simtel20.arpa
Subject: atprint.c.shar
#! /bin/sh
#
# This is a shell archive. Save this into a file, edit it
# and delete all lines above this comment. Then give this
# file to sh by executing the command "sh file". The files
# will be extracted into the current directory owned by
# you with default permissions.
#
# The files contained herein are:
#
# 1 README
# 1 Makefile
# 20 atprint.c
# 2 atprint.h
# 2 atprint.rc
# 1 naked-mac-spec
# 4 rs.s
#
echo 'Extracting README'
if test -f README; then echo 'shar: will not overwrite README'; else
sed 's/^X//' << '________This_Is_The_END________' > README
XThis directory/shar-file contains ATPrint, a
X{RS232 -> Mac -> AppleTalk -> LaserWriter} spool program.
X
XA program running on an Mac that takes characters from the
XRS232 (modem) port and prints them over AppleTalk to an LaserWriter
Xas raw PostScript files. In other words it lets you SHARE the LW
Xbetween the timesharing computer and your Macs.
X
XSe the beginning of atprint.c for more info.
X
XFiles are:
XREADME This file
Xatprint.c The main program
Xatprint.h Headers...
Xatprint.rc Definitions for Rmaker.
XMakefile Food for Make
Xrs.s The ram serial driver glue routines...
X
XRemember to add the SuMacC-programs to the search path before typing "make"...
X
XTo run the program also needs the SERD resource Include it with ResEdit
Xor REdit. As a way of avoiding development frustration the program first looks
Xfor the file SERD on the current floppy and loads the SERD resource from that.
X
X
X
________This_Is_The_END________
if test `wc -l < README` -ne 26; then
echo 'shar: README was damaged during transit'
echo ' (should have been 26 bytes)'
fi
fi ; : end of overwriting check
echo 'Extracting Makefile'
if test -f Makefile; then echo 'shar: will not overwrite Makefile'; else
sed 's/^X//' << '________This_Is_The_END________' > Makefile
X.SUFFIXES: .b .c .s
X
XOBJECTS = atprint.b rs.b
X
X.c.b:
X cc68 -c $<
X.s.b:
X cc68 -c $<
X
Xatprint.rsrc: atprint.rc b.out
X rmaker atprint.rc
X
Xb.out: atprint.b rs.b
X cc68 -z -m ${OBJECTS}
X
Xshar:
X shar README atprint.c atprint.h atprint.rc Makefile rs.s naked-mac-spec > atprint.shar
________This_Is_The_END________
if test `wc -l < Makefile` -ne 17; then
echo 'shar: Makefile was damaged during transit'
echo ' (should have been 17 bytes)'
fi
fi ; : end of overwriting check
echo 'Extracting atprint.c'
if test -f atprint.c; then echo 'shar: will not overwrite atprint.c'; else
sed 's/^X//' << '________This_Is_The_END________' > atprint.c
X /*
X atprint === {RS232 -> Mac -> AppleTalk -> LaserWriter} spool program. V86.1b
X
X January 86. May be copied but not sold. (Written in SuMacC)
X
X A program running on an Mac that takes characters from the
X RS232 (modem) port and prints them over AppleTalk to an LaserWriter
X as raw PostScript files. In other words it lets you SHARE the LW
X between the timesharing computer and your Macs.
X
X It tries somewhat to behave as the LW itself in serial mode. No
X intelligence except Xon/Xoff. The file is considered ended by either
X a CTRL-D (as on the LW) or if no chars arrive it waits 30 secs
X then sends a XON and waits 15 more seconds then assumes end of job.
X
X ATPrint was designed to be usable as a printer spooler running on a
X dedicated Mac, ie it starts up that way, listening in
X 9600 baud and waiting to print everything. Thus you can have it as a
X startup application on your boot disk. (For the moment we use a
X dedicated 128k-mac w/o keyboard&mouse. But we have tested using only
X a naked spare 128k Mac board, an external power supply and an external
X disk drive as a standalone print-spool-device)
X
X ATPrint can also be used more temporarily as it has a primitive(!)
X terminal emulator to allow you to log in to the remote host thru the
X RS232-connection and initiate a print command with a special dialog
X box.
X
X It also allows you to dump a PS file on the mac-disk to the LW.
X (a la the PSDUMP (or Downloading) program from Apple's LW disk)
X
X Remember that "Choose Printer" must have been done before...
X
X Notice that the PostScript program that is sent to ATPrint must do
X somewhat more initializations than in the normal case. This is of
X course due to the fact that we are coexsiting with the Macs and the
X definitions in the LaserPrep file. For example you have to do
X "initmatrix" in order not to get everything mirrored.
X This is of course no problem if you use a more complex application like
X TeX with dvi2ps. The recently posted lpscript doesn't to this though.
X
X ATPrint has been tested with the "laser" program by Matti Rendahl
X at my dept (also posted on USENET). Laser converts ordinary text files
X like lpscript. The laser command for use in the "Send Command" dialog
X is "laser -l file" (REMEBER to shut off echo and turn off prompt)
X from other terminals use "laser -lttyxx file" when
X you don't have a dedicated Mac.
X
X--------------------------
X
X The code could be cleaner. I do not have very much time for
X programming nowadays so I wanted to get it working as fast
X as possible... (it was only thanks to Xmas holiday that I could
X do anything at all). Also more should be in resources but I don't
X like the idea of putting numbers on everything. I want symbolic
X references that are defined ONCE! A preprocessor that produced a
X .h-file and a resource file could maybe do the trick!
X
X Parts of the code are from the first version of MacKermit
X by Stephen Engel.
X
X One thing I had to to was to move a more recent version of
X RAMSD{open&close} (of course in Motorola syntax...)
X to SuMacC as the distributed version of these
X routines was too old. As I was lazy, both routines have 3 dummy
X args, instead of the correct 1.
X
X Things could be added to the program, among them:
X o Compression of various sorts for hex strings and maybe
X everything. To speed up downloading.
X o Real text printing mode.
X o Better terminal emulation :-)
X o It could say "Starting print job" etc using MacinTalk (just to
X make everyone crazy within hearing range) Or play a
X tune everytime a file is printed.
X o More interaction with LW, eg notice "Printer Out of Paper"
X etc. (how do I do that?)
X o More communication with RS232, to inform dowloading program
X of printing progress.
X o I have one experienced the LW crashing when downloading
X TeX output converted by dvi2ps. Maybe the LW gets memory
X overflow or something else. I would like to know what
X the problem is.
X
X MacXL: For some reason something seems to get out of phase (XON/XOFF?!)
X after about two pages of PostScript when ATPrint is running
X on a MacXL. The XL is of course slower, but XON/XOFF seems to
X work fine in terminal emulation. Strange! Anyone knows why?
X
X---------------
X Anders Hillbo, NADA (= CS Dept), Royal Inst. of Technology, Stockholm, Sweden
X EAN: ahi@cs.kth.sunet
X ARPA: anders_hillbo_nada%qzcom.mailnet@mit-multics
X USENET: seismo!enea!ttds!ahi
X
X*/
X#include "atprint.h"
X#define FileMenu 0
X#define aboutItem 1
X#define psprintItem 2
X#define textprintItem 3
X#define selecItem 4
X#define quitItem 5
X#define EditMenu 1
X#define CommandMenu 2
X#define connItem 1
X#define cmdItem 2
X#define b1200Item 3
X#define b9600Item 4
X#define debugItem 5
X
X#define NIL 0
X#define iPrDevCtl 7
X#define iPrIOCtl 5
X#define lPrReset 0x00010000 /* DocOpen */
X#define PageOpen 0x00040000
X#define lPrPageEnd 0x00020000 /* PageClose */
X#define DocClose 0x00050000
X#define ShowBuf 0 /* Text stream (ps show call) */
X#define StdBuf 1 /* Raw dump of postscript */
X
X#define TOPMARGIN 10 /* Terminal display constants */
X#define BOTTOMMARGIN 286
X#define LEFTMARGIN 12
X#define RIGHTMARGIN 480
X#define LINEHEIGHT 12
X#define CHARWIDTH 6
X
Xint
X
X topmargin=TOPMARGIN, /* Edges of adjustable window */
X bottommargin=BOTTOMMARGIN,
X textstyle=0,
X overrun=FALSE,
X conned=0,
X debug,
X numinbuffer; /* Number of read in characters waiting to be
X printed */
XRgnHandle dumptr; /* Dummy ptr to satisfy scrollbits */
XPoint p;
XRect scrollrect;
Xint config1200, config9600;
Xchar text[255];
X
X/* main --- Initialize windows, communications, and wait for menu selection */
Xmain()
X{
X
X int err,
X code;
X struct QDVar QDVar;
X int ccount;
X
X QD = &QDVar;
X
X InitGraf (&thePort);
X InitFonts ();
X InitWindows ();
X SetupMenus ();
X TEInit();
X InitDialogs ((ProcPtr) NULL);
X SetCursor (&QD -> arrow);
X theWindow = NewWindow (&wRecord, (Rect *) wirect, "ATPrint", VIS,
X documentProc, (WindowPtr) - 1, 1, 0);
X SetPort (theWindow);
X theWindow -> txFont = 4; /* Monaco font with non-proportional spacing */
X theWindow -> txSize = 9;
X PenSize (1, 1);
X FlushEvents (everyEvent, 0);
X err = GetVol (volname, &volnum);
X if (err)
X printerr ("Bad volume name: ", err);
X
X config1200 = 94 + 16384 + 8192 + 3072;
X config9600 = 10 + 16384 + 8192 + 3072;
X /* baud, 1 stop bit, no par, 8 bits (9600=10, 1200=94) */
X
X SetupIO ();
X dumptr = NewRgn ();
X SetRect (&scrollrect, 0, 0, 500, 390);
X SetPort (theWindow);
X MoveTo (0, LINEHEIGHT);
X debug = 0;
X text[0]=(char)0;
X CheckItem (myMenus[CommandMenu], debugItem, debug);
X DisableItem (myMenus[FileMenu], textprintItem);
X DisableItem (myMenus[FileMenu], selecItem);
X/* DisableItem (myMenus[CommandMenu], cmdItem); */
X
X/* Main loop: look for events, ignore unless its a menu selection
X * If it is call DoCommand to do the dispatching */
X
X for (;;) {
X SystemTask ();
X SerGetBuf (innum, &ccount);
X if (ccount > 0) {
X if (conned)
X DoTermOutput (ccount);
X else
X (void) DoPrinting (ccount);
X }
X GetNextEvent (everyEvent, &myEvent);
X switch (myEvent.what) {
X case autoKey:
X case keyDown:
X if (conned) {
X int i;
X char c;
X c = (char) myEvent.message & 0x7f;
X if (myEvent.modifiers & cmdKey)
X c &= 0x1f;
X switch (c) {
X case 0x08:
X c = 0x7f;
X break;/* BS -> DEL */
X }
X i = 1;
X FSWrite (outnum, &i, &c);
X }
X break;
X case mouseDown:
X code = FindWindow (&myEvent.where, &whichWindow);
X switch (code) {
X case inMenuBar:
X DoCommand (MenuSelect (&myEvent.where));
X break;
X } /* switch */
X } /* switch */
X } /* for */
X}
X
X
X/* SetupIO --- Initialize the RS232 connection. */
XSetupIO()
X{
X int err;
X /* Set up IO drivers */
X innum=OpenDriver(".AIn");
X outnum=OpenDriver(".AOut");
X/* asm(".word 0xa9ff"); /* Go into MacsBug */
X err=OpenResFile ("SERD");
X/* if (err==-1) printerr("Couldn't open res file: ", err); */
X err=_RAMSDOpen(1,1,1); /* Specially hacked RamSDopen for SuMacC */
X if (err) fatal("Can't open ramdriver: ", err);
X controlparam.serConfig=config9600;
X CheckItem (myMenus[CommandMenu], b9600Item, TRUE);
X err=Control(innum,8,&controlparam);
X if (err) fatal("Can't open idriver: ",err);
X err=Control(outnum,8,&controlparam);
X if (err) fatal ("Can't open odriver: ",err);
X
X /* Replace driver buffer with larger one */
X controlparam.serInBuff.serBPtr=mybuff;
X controlparam.serInBuff.serBLen=(short)MYBUFSIZE;
X err=Control(innum,9,&controlparam);
X if (err) printerr("Trouble making io buffer:",err);
X /* Specify handshake options */
X controlparam.serShk.fXOn=(char)TRUE;
X controlparam.serShk.fCTS=(char)FALSE;
X controlparam.serShk.xOn=(char) 17;
X controlparam.serShk.xOff=(char) 19;
X controlparam.serShk.errs=(char)FALSE;
X controlparam.serShk.evts=(char)FALSE;
X controlparam.serShk.fInX=(char)TRUE;
X err=Control(outnum,10,&controlparam);
X if (err) printerr("Trouble with handshake: ",err);
X}
X
X
X/* SetupMenus --- Install command menus. */
X
XSetupMenus()
X{
X int i;
X char fnamcnv[13];
X
X
X InitMenus();
X myMenus[0]=NewMenu(filemenu,"File");
X AppendMenu(myMenus[0], "About ATPrint...");
X AppendMenu(myMenus[0], "Print PS file");
X AppendMenu(myMenus[0], "Print Text File");
X AppendMenu(myMenus[0], "Print Selection");
X AppendMenu(myMenus[0], "Quit");
X myMenus[1]=NewMenu(modemenu,"Edit");
X AppendMenu(myMenus[1],"Undo");
X AppendMenu(myMenus[1],"(-");
X AppendMenu(myMenus[1],"Cut");
X AppendMenu(myMenus[1],"Copy");
X AppendMenu(myMenus[1],"Paste");
X AppendMenu(myMenus[1],"Clear");
X myMenus[2]=NewMenu(optionmenu,"Command");
X AppendMenu(myMenus[2],"Connected");
X AppendMenu(myMenus[2],"Send Command");
X AppendMenu(myMenus[2],"1200");
X AppendMenu(myMenus[2],"9600");
X AppendMenu(myMenus[2],"Debug");
X for (i=0;i<numMenu;i++)
X InsertMenu(myMenus[i],0);
X DrawMenuBar();
X}
X
X
X/* DoCommand --- Menu dispatcher */
X
XDoCommand(mResult)
Xint mResult;
X{
X int theMenu=mResult>>16, theItem=(mResult &0xffff);
X
X if (mResult !=0) {
X switch(theMenu) {
X case filemenu:
X switch (theItem) {
X case aboutItem:
X Alert (3, NULL);
X break;
X case psprintItem:
X printfile (TRUE);
X break;
X case textprintItem:
X printfile (FALSE);
X break;
X case selecItem:
X break;
X case quitItem:
X _RAMSDClose(1,1,1); /* Specially hacked for SuMacC */
X ExitToShell();
X break;
X };
X break;
X case modemenu:
X /* Dispatch to the correct routines */
X switch(theItem) {
X default:
X break;
X };
X break;
X case optionmenu:
X switch(theItem) {
X case connItem:
X conned = !conned;
X CheckItem(myMenus[2],connItem,conned);
X break;
X case cmdItem: {
X char cmd[255]; int goon=1; char *xx; int count;
X int ticks;
X
X while (goon>0) {
X goon=gettext(cmd); if (goon==0) break;
X SendCmd (cmd);
X /* Wait 45 secs for chars to arrive */
X screenstring ("* Waiting for chars from RS232, click mouse to interrupt\r\n");
X SerGetBuf (innum, &count); ticks = TickCount();
X while (count==0) {
X SystemTask();
X if (checkuser()) break;
X SerGetBuf (innum, &count);
X if ((TickCount()-ticks) > 60*45) break;
X }
X if (debug) count=0;
X if (count>0) while(DoPrinting (count));
X /* while just empty ^D's */
X }
X
X break;
X }
X case b1200Item: {
X SerReset (innum, config1200);
X SerReset (outnum, config1200);
X CheckItem (myMenus[2], b1200Item, TRUE);
X CheckItem (myMenus[2], b9600Item, FALSE);
X break;
X }
X case b9600Item: {
X SerReset (innum, config9600);
X SerReset (outnum, config9600);
X CheckItem (myMenus[2], b1200Item, FALSE);
X CheckItem (myMenus[2], b9600Item, TRUE);
X break;
X }
X case debugItem: {
X debug = !debug;
X CheckItem (myMenus[CommandMenu], debugItem, debug);
X break;
X }
X };
X break;
X };
X };
X HiliteMenu(0);
X}
X
X/* DoTermOutput --- Handle screen output of chars from host. */
XDoTermOutput(count)
Xint count;
X{
X char c; int i;
X
X SetPort (theWindow);
X while (count>0) {
X if (count==1) { i=1; FSRead (innum, &i, &c); screenchar (c); }
X else {
X for(;count>1;count--) {
X i=1;
X FSRead (innum, &i, &c);
X screenchar (c);
X }
X }
X SerGetBuf(innum, &count);
X }
X}
X
X#define PBUFSIZ 1024
X#define CtrlD 4
X#define CtrlQ 17
X#define CtrlJ 10
X#define PrintAsPS StdBuf /* The strange Apple name for it... */
Xchar pbuf[PBUFSIZ+1]; int dummy;
Xint pbufc;
X
X/* PrintCtoLW --- Send a char to LaserWriter. Buffers it in pbuf first */
XPrintCtoLW (c)
Xchar c;
X{
X/* if (c==CtrlJ) return; /* LW doesn't like LF's from ATalk */
X if ((c==CtrlD) && (pbufc>0)) {
X PrCtlCall(iPrIOCtl, (long)pbuf, pbufc, PrintAsPS);
X if (debug) { pbuf[pbufc]=(char)0; screenstring (pbuf);}
X pbufc=0;
X }
X else {
X pbuf[pbufc++]=c;
X if (pbufc==PBUFSIZ) {
X PrCtlCall(iPrIOCtl, (long)pbuf, pbufc, PrintAsPS);
X if(debug) { pbuf[pbufc]=(char)0; screenstring (pbuf);}
X pbufc=0;
X }
X }
X}
X
X/* DoPrinting --- Print all chars from RS232 line on AppleTalk LW */
Xint DoPrinting(count)
Xint count;
X{
X char c; int i;
X long tick1; long ptype;
X
X pbufc=0;
X /* Ignore excess Ctrl-D's */
X i=1; FSRead (innum, &i, &c); c &=0x7f;
X if (c==CtrlD) return(1);
X else PrintCtoLW (c);
X SerGetBuf(innum, &count);
X
X PrClose();
X PrDrvrOpen();
X screenstring ("**Starting print job**\r\n");
X PrCtlCall(iPrDevCtl, lPrReset, 0, 0);
X if (debug) screenstring("---");
X while (TRUE) {
X if (checkuser()) break;
X if (count==1) { i=1; FSRead (innum, &i, &c); c &=0x7f; PrintCtoLW (c); }
X else if (count>0){
X for(;count>1;count--) {
X i=1; FSRead (innum, &i, &c); c &=0x7f;
X PrintCtoLW (c); if (c==CtrlD) break;
X }
X }
X if (c==CtrlD) break;
X SerGetBuf(innum, &count); tick1=TickCount();
X /* Wait for 30 Secs for more chars */
X while (count==0) {
X SystemTask();
X SerGetBuf(innum, &count);
X if ( (TickCount()-tick1) > 60*30 ) break;
X }
X /* Before giving up, try Xoff and wait 15 secs, in case anything hung */
X if (count==0) {
X i=1; c=CtrlQ; FSWrite(outnum, &i, &c);
X Delay (60*15, &i);
X SerGetBuf(innum, &count);
X }
X if (count==0) { PrintCtoLW(CtrlD); screenstring("**Timeout\r\n"); break; }
X }
X screenstring ("**Ending print job**\r\n");
X/* PrCtlCall(iPrDevCtl, lPrPageEnd, 0, 0); */
X PrDrvrClose();
X}
X
X/* checkuser --- Test if user has interupted */
Xint checkuser()
X{
X SystemTask();
X GetNextEvent(everyEvent, &myEvent);
X if (myEvent.what==mouseDown) return (1); else return(0);
X}
X
X/* printfile --- Ask for a file and dump as PostScript to LW */
Xprintfile(ps)
Xint ps;
X{
X int refnum,ok=0; char name[100]; char buff[512]; long count,ptype;
X
X if (ps) ptype=StdBuf; else ptype=ShowBuf;
X refnum=open_file(name);
X if (refnum!=NULL) {
X PrClose();
X PrDrvrOpen();
X PrCtlCall(iPrDevCtl, lPrReset, 0, 0);
X while (ok!=eoFErr){
X count=512;
X ok=FSRead(refnum, &count, (long)buff);
X if (count>0) {
X screenchar('*');
X PrCtlCall(iPrIOCtl, (long)buff, count, ptype);
X }
X }
X PrCtlCall(iPrDevCtl, lPrPageEnd, 0, 0);
X PrDrvrClose();
X FSClose (refnum);
X }
X}
X
X
X#define cmdBtn OK
X#define cmdquitBtn Cancel
X#define quitBtn 3
X#define cmdText 6
X
Xint gettext(str)
Xchar str[];
X{
X DialogPtr d; int itemHit; Handle item; int type, i; Rect r;
X
X d = GetNewDialog (1, 0L, (char *)-1);
X GetDItem (d, cmdText, &type, &item, &r);
X if (strlen (text)>0) { SetIText (item, text); SelIText (d, cmdText, 0, 400);}
X ModalDialog (0L, &itemHit);
X if (itemHit==quitBtn) { DisposDialog (d); return (0); }
X for (i=0;i<255;i++) text[i]=(char)0;
X GetIText (item, text); /* This one returns a c-string i SuMacc ? */
X if (debug) {
X for (i=1;i<text[0];i++) screenchar (text[i]); screenstring ("\r\n");}
X if (debug) screenstring (text);
X strcpy (str, text);
X if (strlen (str)>0) strcat (str, "\r");
X if (debug) screenstring (str);
X DisposDialog (d);
X if (itemHit==cmdBtn) return (1); else return (-1);
X}
X
XSendCmd (cmd)
Xchar *cmd;
X{
X int count;
X count=strlen(cmd);
X if (count>0) FSWrite (outnum, &count, cmd);
X}
X
X/*
X* Printerr ---
X* Display error message and number in standard error box
X*/
X
Xprinterr(str,err)
Xchar *str;
Xint err;
X{
X int i;
X char error[10];
X
X if (err) /* Err=0 signals message only */
X {
X /* Make sure string will be null terminated */
X for(i=0;i<10;error[i++]='\0');
X
X NumToString(err,error); /* Convert err number */
X ParamText(str,error,"",""); /* Insert strings into error box */
X }
X else
X ParamText(str,"","","");
X StopAlert(1,(ProcPtr) NULL);
X
X}
X
X
X/*
X* Fatal ---
X* Printerr, close file, and exit to shell.
X*/
X
Xfatal(str,err)
Xchar *str;
Xint err;
X{
X printerr(str,err);
X ExitToShell();
X}
X
X/*
X* Printnum ---
X* Print out number as an ascii string.
X*/
X
Xprintnum(num)
Xint num;
X{
X int i;
X char numstr[10];
X
X /* Make sure string will be null terminated. */
X
X for(i=0;i<10;numstr[i++]='\0');
X NumToString(num,numstr);
X DrawString(numstr);
X
X}
X
X
X/*
X* open_file --- used to open the file for reading
X* returns value of refNum if successful, NULL if not
X* returns file name in fNamePtr if successful, NULL if not
X*/
X
Xint open_file (fNamePtr) /*returns refNum if file opened, NULL if not*/
Xchar fNamePtr[];
X{
X SFReply reply;
X Point where;
X int i, err=0, length, refNum;
X
X /*position of dialog box*/
X SetPt (&where,30,30);
X
X /*initializes fNamePtr to NULLs for safety*/
X for (i=0; i<64; i++)
X reply.fName[i] = NULL;
X
X /*handles user interface*/
X SFGetFile (&where, NULL, NULL, -1, NULL, NULL, &reply);
X
X /*
X * convert Pascal string to C string --
X * remove leading number and add a trailing NULL
X */
X length = reply.fName[0];
X for (i=0; i< length; i++)
X fNamePtr[i] = reply.fName[i + 1];
X fNamePtr[i] = NULL;
X
X for (i=0; i< length; i++)
X reply.fName[i] = reply.fName[i + 1];
X reply.fName[i] = NULL;
X
X if (reply.good) /*user did not press Cancel Button*/
X {
X err = FSOpen (reply.fName, (int) reply.vRefNum, &refNum);
X if(err)
X printerr("Bad SFgetopen",err);
X }
X
X else /*user did press Cancel Button*/
X {
X refNum = NULL;
X fNamePtr[0] = NULL;
X }
X
X return (refNum);
X}
X
X/* screenchar --- Place a char on the screen (window) */
Xscreenchar(chr)
Xchar chr;
X{
X chr &= 0x7f;
X if (chr==0x0d)
X carriage_return();
X else if (chr==0x0a)
X line_feed();
X else if (chr==0x08)
X back_space();
X else if (chr==0x09)
X tab();
X else if (chr==0x20)
X space();
X else {
X GetPen (&p);
X if(p.h>RIGHTMARGIN)
X {
X overrun=FALSE;
X carriage_return();
X line_feed();
X overrun=TRUE;
X }
X DrawChar(chr);
X }
X}
X
X/* screenstring --- Print a string on the scren */
Xscreenstring (s)
Xchar *s;
X{
X while(*s) screenchar (*s++);
X}
X
Xline_feed()
X{
X if(!overrun)
X {
X GetPen(&p);
X if(p.v>=bottommargin)
X {
X ScrollRect((Rect *)&scrollrect,0,-LINEHEIGHT,dumptr);
X EraseRgn(dumptr);
X }
X else
X MoveTo(p.h,p.v+LINEHEIGHT);
X }
X else
X overrun=FALSE;
X}
X
Xcarriage_return()
X{
X GetPen(&p);
X MoveTo(LEFTMARGIN,p.v);
X}
X
Xback_space()
X{
X GetPen( &p);
X if (p.h-CHARWIDTH>0)
X Move(-CHARWIDTH,0);
X else
X carriage_return();
X}
X
Xspace()
X{
X /* Regular quickdraw space does not cover previous characters */
X Point p; short currect[4];
X
X GetPen(&p);
X currect[0]=p.v-LINEHEIGHT+3;
X currect[1]=p.h;
X currect[2]=p.v+3;
X currect[3]=p.h+CHARWIDTH;
X EraseRect((Rect*) currect);
X Move(CHARWIDTH,0);
X
X}
X
Xtab()
X{
X int index; Point p;
X
X GetPen(&p);
X
X index=p.h/CHARWIDTH;
X index=((index+8)/8);
X index=index*8*CHARWIDTH;
X MoveTo(index,p.v);
X}
________This_Is_The_END________
if test `wc -l < atprint.c` -ne 765; then
echo 'shar: atprint.c was damaged during transit'
echo ' (should have been 765 bytes)'
fi
fi ; : end of overwriting check
echo 'Extracting atprint.h'
if test -f atprint.h; then echo 'shar: will not overwrite atprint.h'; else
sed 's/^X//' << '________This_Is_The_END________' > atprint.h
X/* atprint.h - Definitions for ATPrint spooler program */
X
X#include <stdio.h> /* Standard io definitions */
X#include "mac/quickdraw.h" /* Macintosh C interface */
X#include "mac/osintf.h"
X#include "mac/toolintf.h"
X#include "mac/packintf.h"
X#include "mac/libmac.h"
X
X/* Symbol Definitions */
X
X#define TRUE -1 /* Boolean constants */
X#define FALSE 0
X
X#define numMenu 3 /* Number of menus in program */
X#define filemenu 256 /* Reference numbers for menus */
X#define modemenu 257
X#define optionmenu 255
X#define VIS 1 /* Sets window visisble */
X#define MYBUFSIZE 2048
X#define BUFSIZE 1024
X/* #define noErr 0 /* Macintosh error codes */
X#define eoFErr (-39)
X#define TOPMARGIN 10 /* Terminal display constants */
X#define BOTTOMMARGIN 286
X#define LEFTMARGIN 12
X#define RIGHTMARGIN 480
X#define CHARWIDTH 6
X
X
X/* Macro Definitions */
X
X/* Global Variables */
X
Xint innum, /* Input driver refnum */
X outnum, /* Output driver refnum */
X
X /* Mode of data transmission */
X image=FALSE , /* 8-bit transmission */
X volnum,
X debug=FALSE;
X
Xchar volname[256], /* Current volume name */
X filnam[80], /* Current file name */
X mybuff[MYBUFSIZE]; /* Serial drivers new buffer */
X
XMenuHandle myMenus[numMenu];
XEventRecord myEvent;
XWindowPtr theWindow, whichWindow;
XWindowRecord wRecord;
X /* Rectangles */
Xshort wirect[]={40,5,335,505}, /* window in global */
X inrect[] = { 0, 0, 390, 500}; /* and local coords */
X
XCSParam controlparam; /* To change serial driver params OpParamType */
X
Xshort config; /* Current Serial driver configuration */
X
________This_Is_The_END________
if test `wc -l < atprint.h` -ne 58; then
echo 'shar: atprint.h was damaged during transit'
echo ' (should have been 58 bytes)'
fi
fi ; : end of overwriting check
echo 'Extracting atprint.rc'
if test -f atprint.rc; then echo 'shar: will not overwrite atprint.rc'; else
sed 's/^X//' << '________This_Is_The_END________' > atprint.rc
X*
X* File atprint.rc
X*
X* This file contains the resources for rmaker for the atprint program
X
X* Specify output file of executable code
X
Xatprint.rsrc
X
X*
XType DLOG
X ,1
X 40 20 330 500
XVisible 1 NoGoAway 0
X 5
XSend command
X
XType ALRT
X,1
X90 50 180 400
X2
X5555
X
XType ALRT
X,3
X30 30 300 480
X4
XCCCC
X
X* Error box
XType DITL
X,2
X2
XBtnItem Enabled
X65 20 85 60
XOK
X
XStatText Disabled
X65 80 85 400
XError: ^0 ^1
X
X* About
XType DITL
X,4
X6
XBtnItem Enabled
X230 230 260 290
XOK
X
XBtnItem Disabled
X400 400 400 400
XCancel
X
XStatText Disabled
X10 10 40 450
XATPrint {RS232 -> Mac -> AppleTalk -> LaserWriter} spool program. V86.1b
X
XStatText Disabled
X50 10 90 450
XPrints all characters from RS232 on a LaserWriter over AppleTalk (no interpretation, i e only PostScript files work).
X
XStatText Disabled
X90 10 120 450
XMay be copied but not sold.
X
XStatText Disabled
X120 10 150 450
Xseismo!enea!ttds!ahi --- Anders Hillbo, Royal Inst of Technology, Stockholm
X
X* Send Command
XType DITL
X ,5
X6
X* 1
XBtnItem Enabled
X250 30 270 140
XSend command
X
X* 2
XBtnItem Enabled
X250 150 270 380
XSend command & Quit
X
X* 3
XBtnItem Enabled
X250 390 270 440
XQuit
X
X* 4
XStatText Disabled
X30 30 120 470
XThis lets you send a print command to the remote host. We wait 45 secs for anything to happen (chars to arrive from RS232) before w
Xe give up.
X
X* 5
XStatText Disabled
X100 30 200 470
XREMEMBER that the remote host must have the echo turned off and that it should not prompt again after the command... (on unix in CS
XH do "stty -echo" and "set prompt=")
X
X* 6
XEditText Disabled
X220 30 240 460
X
X
X* Compiled program code
X
XType CODE
X b.out,0
X
X
________This_Is_The_END________
if test `wc -l < atprint.rc` -ne 111; then
echo 'shar: atprint.rc was damaged during transit'
echo ' (should have been 111 bytes)'
fi
fi ; : end of overwriting check
echo 'Extracting naked-mac-spec'
if test -f naked-mac-spec; then echo 'shar: will not overwrite naked-mac-spec'; else
sed 's/^X//' << '________This_Is_The_END________' > naked-mac-spec
XThis gives some hints when connecting a naked-mac logic board to an
Xexternal power supply./Ragge Sundblad, NADA, KTH, Stockholm
X
XYou can find a connector on the logic-card wich connects the logic-card with
Xthe analog card. This is a spec how you can connect the power-supply you
Xwant. For example, you can use a multibus-power-supply if you've got
Xa multibus-machine (like sun) and want to get the power out of it.
XIf you want, you can connect a speaker to the card so you can hear it booting.
X
X
XNo pin! Speaker (you can even take this signal in the speaker-connector
X | | in the back of the card)
X V V
X o . o o o o o o o o o <-Normally battery
X | +5 0 -12 0 +12 +5
X _/| |
X |_ | |
X \| |
X |________|
X
________This_Is_The_END________
if test `wc -l < naked-mac-spec` -ne 20; then
echo 'shar: naked-mac-spec was damaged during transit'
echo ' (should have been 20 bytes)'
fi
fi ; : end of overwriting check
echo 'Extracting rs.s'
if test -f rs.s; then echo 'shar: will not overwrite rs.s'; else
sed 's/^X//' << '________This_Is_The_END________' > rs.s
X| RAMSDOpen & RAMSDClose routines for opening the SERD RAM serial driver
X| resource. For use with SuMacC. 1986-01-05 20:01:26
X| I translated this from "Motorola" syntax into Unix syntax, but I
X| was in a hurry and didn't want to learn the parameter mechanism. Thus both
X| routines have 3 dummy args and always use PortA (modem).
X
X .text
X .globl _RAMSDOpen, _RAMSDClose
XIOQElSize=50
XIOFileName=18
XIORefNum=24
XIODrvNum=22
XIOPermssn=27
XRSDHndl=0x28a
X||| OSErr RamSDOpen(whichPort) | Originally but here _RAMSDopen(0,0,0)
X_RAMSDOpen:
X link a6,#-IOQElSize
X moveml #0x3030,sp@- | movem.l d2-d3/a2-a3,-(sp)|save regs !!!
X movl #0x14,d0 |offset to AIn DCE handle
X|
X|
X|
X| Always do a-port...
X movl 0x11c,a0 |get Unit table base address
X movl a0@(0,d0:w),d0 |get the DCE
X beq AsyncOK |no open
X movl d0,a0 |DCE handle
X movl a0@,d0 |get and test pointer
X beq AsyncOK |driver purged
X movl d0,a0 |copy pointer
X tstb a0@(7) |check DCtlQueue+1 for new version
X bne AsyncOK |yes, go open it
X movl RSDHndl,d0 |get resource handle
X bgt RamSDIn | there already
X movl #2,D1 |id for XL
X movl 0x2ae,a0 |get address of Rom base
X movw a0@(8),d0 |get version word
X cmpb #0xff,d0 |XL?
X beq 2$ |yes
X lsrw #8,d0 |check high byte
X bne AsyncOK |new Mac, ok
X movl #1,d1 |id for old Mac
X2$:
X subw #4,sp
X movl serd,sp@- |open SERD resourc
X movw d1,sp@- |push id number
X .word 0xa9a0 |GetResource
X movl sp@,d3 |check return
X bne 4$ |got it
X addw #4,sp |fix stack
X movw 0xa60,d0 |pass on resource error
X bne 3$ |skip if there was one
X movl #-192,d0 |else set to resource not found
X3$:
X bra RamSDExit |and quit
X4$:
X .word 0xa992 |DetachResource
X movl d3,a0 |get handle
X bset #7,a0@ |lock it in memory
X movl a0,RSDHndl |and save for later incarnations
XRamSDIn:
X movl RSDHndl,a3 |get handle to driver
X movl a3@,a3 |dereference
X movl #-23,d0 |assume openErr
X cmpl #0x53455244,a3@(4) |must be SERD resource
X bne RamSDExit
X movb #0,d1 |A-port |whichPort
X btst d1,RSDHndl |installed already?
X bne AsyncOK |yes
X bsr ClsPorts |close the ROM ports
X bset d1,RSDHndl |mark as installed
X movl #1,d0 |call install routine
X jsr a3@ |by calling through entry
X
XAsyncOK:
X movl #1,d2 |set up d2 for looping
X lea a6@(-IOQElSize),a0 |get ptr to param block
X lea drvANames,a1 |start with port A
X| tstb a6@(8) |check whichPort
X| beq 5$ |skip if A
X| lea drvBNames,a1 |get port B names
X5$:
X movl a1,a0@(IOFileName) |set ptr to name
X clrw a0@(IODrvNum)
X clrb a0@(IOPermssn) |open for read/write
X .word 0xa000 |Open
X
X
X
X
X
X
X
X
X
X bne RamSDExit |exit on error
X movl #0,d1 |zero out high bits
X movb a1@+,d1 |length of string
X addw d1,a1 |skip to next name
X dbra d2,5$ |loop
X movl #0,d0 |no error
XRamSDExit:
X extl d0 |sign extend
X moveml sp@+,#0x0c0c | movem.l sp@+,d2-d3/a2-a3 |restore regs
X unlk a6
X rts
X
X|
X| RamSDClose(whichPort)
X|
X
X_RAMSDClose:
X link a6,#-IOQElSize |space for pb
X moveml #0x3030,sp@- | movem.l d2-d3/a2-a3,-(sp) |save regs
X movb #0,d1 |A-port whichPort
X bsr ClsPorts |close the ports
X movl RSDHndl,d0 |get handle
X ble RamSDExit |exit if not there
X andl 0x31a,d0 |MaskBC
X movl d0,a0 |move to a0
X movl a0@,a0 |dereference
X cmpl #0x53455244,a0@(4) |must be SERD
X bne RamSDExit |else quit
X bclr d1,RSDHndl |mark as not installed
X movl #0,d0 |call driver to remove
X jsr a0@
X tstb RSDHndl |is it used by anyone?
X bne RamSDExit |yes, quit
X movl RSDHndl,d0 |no, get handle
X movl d0,a0 |copy to a0
X .word 0xa023 |DisposeHandle
X movl #-1,d0 |set handle to -1
X movl d0,RSDHndl |to make it invalid
X bra RamSDExit |and quit
X
XClsPorts:
X movl #-6,d0 |serial A input refnum
X tstb d1 |whichPort
X beq 6$ |skip if A
X movl #-8,d0 |serial B input refnum
X6$:
X lea a6@(-IOQElSize),a0 |ptr to pb record
X movw d0,a0@(IORefNum) |set up refnum
X .word 0xa001 |Close
X subw #1,a0@(IORefNum) |refnum of output driver
X .word 0xa001 |Close also
X rts
X
XdrvANames:
X .byte 4
X .ascii ".AIn"
X .byte 5
X .ascii ".AOut"
X.even
XdrvBNames:
X .byte 4
X .ascii ".BIn"
X .byte 5
X .ascii ".BOut"
X
X.even
Xserd:
X .ascii "SERD"
________This_Is_The_END________
if test `wc -l < rs.s` -ne 163; then
echo 'shar: rs.s was damaged during transit'
echo ' (should have been 163 bytes)'
fi
fi ; : end of overwriting check
exit 0