home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / code / cshar_at.sit < prev    next >
Text File  |  1988-06-20  |  33KB  |  1,256 lines

  1. 18-Jun-88 15:15:10-MDT,34654;000000000000
  2. Return-Path: <u-lchoqu%sunset@cs.utah.edu>
  3. Received: from cs.utah.edu by SIMTEL20.ARPA with TCP; Sat, 18 Jun 88 15:14:32 MDT
  4. Received: by cs.utah.edu (5.54/utah-2.0-cs)
  5.     id AA22719; Sat, 18 Jun 88 14:48:20 MDT
  6. Received: by sunset.utah.edu (5.54/utah-2.0-leaf)
  7.     id AA24845; Sat, 18 Jun 88 14:48:16 MDT
  8. Date: Sat, 18 Jun 88 14:48:16 MDT
  9. From: u-lchoqu%sunset@cs.utah.edu (Lee Choquette)
  10. Message-Id: <8806182048.AA24845@sunset.utah.edu>
  11. To: rthum@simtel20.arpa
  12. Subject: atprint.c.shar
  13.  
  14. #! /bin/sh
  15. #
  16. # This is a shell archive.  Save this into a file, edit it
  17. # and delete all lines above this comment.  Then give this
  18. # file to sh by executing the command "sh file".  The files
  19. # will be extracted into the current directory owned by
  20. # you with default permissions.
  21. #
  22. # The files contained herein are:
  23. #
  24. #    1 README
  25. #    1 Makefile
  26. #   20 atprint.c
  27. #    2 atprint.h
  28. #    2 atprint.rc
  29. #    1 naked-mac-spec
  30. #    4 rs.s
  31. #
  32. echo 'Extracting README'
  33. if test -f README; then echo 'shar: will not overwrite README'; else
  34. sed 's/^X//' << '________This_Is_The_END________' > README
  35. XThis directory/shar-file contains ATPrint, a
  36. X{RS232 -> Mac -> AppleTalk -> LaserWriter} spool program.
  37. X
  38. XA program running on an Mac that takes characters from the
  39. XRS232 (modem) port and prints them over AppleTalk to an LaserWriter
  40. Xas raw PostScript files. In other words it lets you SHARE the LW
  41. Xbetween the timesharing computer and your Macs.
  42. X
  43. XSe the beginning of atprint.c for more info.
  44. X
  45. XFiles are:
  46. XREADME        This file
  47. Xatprint.c    The main program
  48. Xatprint.h    Headers...
  49. Xatprint.rc    Definitions for Rmaker.
  50. XMakefile    Food for Make
  51. Xrs.s        The ram serial driver glue routines...
  52. X
  53. XRemember to add the SuMacC-programs to the search path before typing "make"...
  54. X
  55. XTo run the program also needs the SERD resource Include it with ResEdit
  56. Xor REdit. As a way of avoiding development frustration the program first looks
  57. Xfor the file SERD on the current floppy and loads the SERD resource from that.
  58. X
  59. X
  60. X
  61. ________This_Is_The_END________
  62. if test `wc -l < README` -ne 26; then
  63.     echo 'shar: README was damaged during transit'
  64.   echo '      (should have been 26 bytes)'
  65. fi
  66. fi        ; : end of overwriting check
  67. echo 'Extracting Makefile'
  68. if test -f Makefile; then echo 'shar: will not overwrite Makefile'; else
  69. sed 's/^X//' << '________This_Is_The_END________' > Makefile
  70. X.SUFFIXES:  .b .c .s
  71. X
  72. XOBJECTS = atprint.b rs.b
  73. X
  74. X.c.b:
  75. X    cc68  -c $<
  76. X.s.b:
  77. X    cc68  -c $<
  78. X
  79. Xatprint.rsrc:  atprint.rc b.out
  80. X    rmaker atprint.rc
  81. X
  82. Xb.out: atprint.b rs.b
  83. X    cc68 -z -m ${OBJECTS}
  84. X
  85. Xshar:    
  86. X    shar README atprint.c atprint.h atprint.rc Makefile rs.s naked-mac-spec > atprint.shar
  87. ________This_Is_The_END________
  88. if test `wc -l < Makefile` -ne 17; then
  89.     echo 'shar: Makefile was damaged during transit'
  90.   echo '      (should have been 17 bytes)'
  91. fi
  92. fi        ; : end of overwriting check
  93. echo 'Extracting atprint.c'
  94. if test -f atprint.c; then echo 'shar: will not overwrite atprint.c'; else
  95. sed 's/^X//' << '________This_Is_The_END________' > atprint.c
  96. X /*                 
  97. X  atprint === {RS232 -> Mac -> AppleTalk -> LaserWriter} spool program. V86.1b
  98. X
  99. X    January 86. May be copied but not sold. (Written in SuMacC)
  100. X
  101. X    A program running on an Mac that takes characters from the
  102. X    RS232 (modem) port and prints them over AppleTalk to an LaserWriter
  103. X    as raw PostScript files. In other words it lets you SHARE the LW
  104. X    between the timesharing computer and your Macs.
  105. X
  106. X    It tries somewhat to behave as the LW itself in serial mode.  No
  107. X    intelligence except Xon/Xoff. The file is considered ended by either
  108. X    a CTRL-D (as on the LW) or if no chars arrive it waits 30 secs
  109. X    then sends a XON and waits 15 more seconds then assumes end of job.
  110. X
  111. X    ATPrint was designed to be usable as a printer spooler running on a
  112. X    dedicated Mac, ie it starts up that way, listening in
  113. X    9600 baud and waiting to print everything. Thus you can have it as a
  114. X    startup application on your boot disk. (For the moment we use a
  115. X    dedicated 128k-mac w/o keyboard&mouse. But we have tested using only
  116. X    a naked spare 128k Mac board, an external power supply and an external
  117. X    disk drive as a standalone print-spool-device)
  118. X
  119. X    ATPrint can also be used more temporarily as it has a primitive(!)
  120. X    terminal emulator to allow you to log in to the remote host thru the
  121. X    RS232-connection and initiate a print command with a special dialog
  122. X    box.
  123. X    
  124. X      It also allows you to dump a PS file on the mac-disk to the LW.
  125. X    (a la the PSDUMP (or Downloading) program from Apple's LW disk)
  126. X    
  127. X    Remember that "Choose Printer" must have been done before...
  128. X
  129. X    Notice that the PostScript program that is sent to ATPrint must do
  130. X    somewhat more initializations than in the normal case. This is of
  131. X    course due to the fact that we are coexsiting with the Macs and the
  132. X    definitions in the LaserPrep file. For example you have to do
  133. X    "initmatrix" in order not to get everything mirrored.
  134. X    This is of course no problem if you use a more complex application like
  135. X    TeX with dvi2ps. The recently posted lpscript doesn't to this though.
  136. X
  137. X    ATPrint has been tested with the "laser" program by Matti Rendahl
  138. X    at my dept (also posted on USENET). Laser converts ordinary text files
  139. X    like lpscript. The laser command for use in the "Send Command" dialog
  140. X    is "laser -l file" (REMEBER to shut off echo and turn off prompt)
  141. X    from other terminals use "laser -lttyxx file" when
  142. X    you don't have a dedicated Mac.
  143. X
  144. X--------------------------
  145. X
  146. X    The code could be cleaner. I do not have very much time for
  147. X    programming nowadays so I wanted to get it working as fast
  148. X    as possible...    (it was only thanks to Xmas holiday that I could
  149. X    do anything at all). Also more should be in resources but I don't
  150. X    like the idea of putting numbers on everything. I want symbolic
  151. X    references that are defined ONCE! A preprocessor that produced a
  152. X    .h-file and a resource file could maybe do the trick!
  153. X    
  154. X    Parts of the code are from the first version of MacKermit
  155. X    by Stephen Engel.
  156. X
  157. X    One thing I had to to was to move a more recent version of
  158. X    RAMSD{open&close} (of course in Motorola syntax...)
  159. X    to SuMacC as the distributed version of these
  160. X    routines was too old. As I was lazy, both routines have 3 dummy
  161. X    args, instead of the correct 1.
  162. X
  163. X    Things could be added to the program, among them:
  164. X    o    Compression of various sorts for hex strings and maybe
  165. X        everything. To speed up downloading.
  166. X    o    Real text printing mode.
  167. X    o    Better terminal emulation :-)
  168. X    o    It could say "Starting print job" etc using MacinTalk (just to
  169. X        make everyone crazy within hearing range) Or play a
  170. X        tune everytime a file is printed.
  171. X    o     More interaction with LW, eg notice "Printer Out of Paper"
  172. X        etc. (how do I do that?)
  173. X    o    More communication with RS232, to inform dowloading program
  174. X        of printing progress.
  175. X    o     I have one experienced the LW crashing when downloading
  176. X        TeX output converted by dvi2ps. Maybe the LW gets memory
  177. X        overflow or something else. I would like to know what
  178. X        the problem is.        
  179. X
  180. X    MacXL: For some reason something seems to get out of phase (XON/XOFF?!)
  181. X    after about two pages of PostScript when ATPrint is running
  182. X    on a MacXL. The XL is of course slower, but XON/XOFF seems to
  183. X    work fine in terminal emulation. Strange! Anyone knows why?
  184. X
  185. X---------------
  186. X Anders Hillbo, NADA (= CS Dept), Royal Inst. of Technology, Stockholm, Sweden
  187. X        EAN: ahi@cs.kth.sunet
  188. X        ARPA: anders_hillbo_nada%qzcom.mailnet@mit-multics
  189. X        USENET: seismo!enea!ttds!ahi
  190. X
  191. X*/
  192. X#include "atprint.h"
  193. X#define FileMenu 0
  194. X#define   aboutItem 1
  195. X#define   psprintItem 2
  196. X#define   textprintItem 3
  197. X#define   selecItem 4
  198. X#define   quitItem 5
  199. X#define EditMenu 1
  200. X#define CommandMenu 2
  201. X#define   connItem 1
  202. X#define   cmdItem 2
  203. X#define   b1200Item 3
  204. X#define   b9600Item 4
  205. X#define      debugItem 5
  206. X
  207. X#define NIL 0
  208. X#define iPrDevCtl 7
  209. X#define iPrIOCtl 5
  210. X#define lPrReset 0x00010000    /* DocOpen */
  211. X#define PageOpen 0x00040000
  212. X#define lPrPageEnd 0x00020000    /* PageClose */
  213. X#define DocClose 0x00050000
  214. X#define ShowBuf 0    /* Text stream (ps show call) */
  215. X#define StdBuf 1    /* Raw dump of postscript */
  216. X
  217. X#define TOPMARGIN 10        /* Terminal display constants */
  218. X#define BOTTOMMARGIN 286
  219. X#define LEFTMARGIN 12
  220. X#define RIGHTMARGIN 480
  221. X#define LINEHEIGHT 12
  222. X#define CHARWIDTH 6
  223. X
  224. Xint
  225. X
  226. X    topmargin=TOPMARGIN,    /* Edges of adjustable window */
  227. X    bottommargin=BOTTOMMARGIN,
  228. X    textstyle=0,
  229. X    overrun=FALSE,
  230. X    conned=0,
  231. X    debug,
  232. X    numinbuffer;        /* Number of read in characters waiting to be
  233. X                   printed */
  234. XRgnHandle dumptr;        /* Dummy ptr to satisfy scrollbits */
  235. XPoint p;
  236. XRect scrollrect;
  237. Xint config1200, config9600;
  238. Xchar text[255];
  239. X
  240. X/* main --- Initialize windows, communications, and wait for menu selection */
  241. Xmain()
  242. X{
  243. X
  244. X    int     err,
  245. X            code;
  246. X    struct QDVar    QDVar;
  247. X    int     ccount;
  248. X
  249. X    QD = &QDVar;
  250. X
  251. X    InitGraf (&thePort);
  252. X    InitFonts ();
  253. X    InitWindows ();
  254. X    SetupMenus ();
  255. X    TEInit();
  256. X    InitDialogs ((ProcPtr) NULL);
  257. X    SetCursor (&QD -> arrow);
  258. X    theWindow = NewWindow (&wRecord, (Rect *) wirect, "ATPrint", VIS,
  259. X        documentProc, (WindowPtr) - 1, 1, 0);
  260. X    SetPort (theWindow);
  261. X    theWindow -> txFont = 4;    /* Monaco font with non-proportional spacing */
  262. X    theWindow -> txSize = 9;
  263. X    PenSize (1, 1);
  264. X    FlushEvents (everyEvent, 0);
  265. X    err = GetVol (volname, &volnum);
  266. X    if (err)
  267. X    printerr ("Bad volume name: ", err);
  268. X
  269. X    config1200 = 94 + 16384 + 8192 + 3072;
  270. X    config9600 = 10 + 16384 + 8192 + 3072;
  271. X /* baud, 1 stop bit, no par, 8 bits (9600=10, 1200=94) */
  272. X
  273. X    SetupIO ();
  274. X    dumptr = NewRgn ();
  275. X    SetRect (&scrollrect, 0, 0, 500, 390);
  276. X    SetPort (theWindow);
  277. X    MoveTo (0, LINEHEIGHT);
  278. X    debug = 0;
  279. X    text[0]=(char)0;
  280. X    CheckItem (myMenus[CommandMenu], debugItem, debug);
  281. X    DisableItem (myMenus[FileMenu], textprintItem);
  282. X    DisableItem (myMenus[FileMenu], selecItem);
  283. X/*    DisableItem (myMenus[CommandMenu], cmdItem); */
  284. X
  285. X/* Main loop:  look for events, ignore unless its a menu selection
  286. X *              If it is call DoCommand to do the dispatching */
  287. X
  288. X    for (;;) {
  289. X    SystemTask ();
  290. X    SerGetBuf (innum, &ccount);
  291. X    if (ccount > 0) {
  292. X        if (conned)
  293. X        DoTermOutput (ccount);
  294. X        else
  295. X        (void) DoPrinting (ccount);
  296. X    }
  297. X    GetNextEvent (everyEvent, &myEvent);
  298. X    switch (myEvent.what) {
  299. X        case autoKey:
  300. X        case keyDown:
  301. X        if (conned) {
  302. X            int     i;
  303. X            char    c;
  304. X            c = (char) myEvent.message & 0x7f;
  305. X            if (myEvent.modifiers & cmdKey)
  306. X            c &= 0x1f;
  307. X            switch (c) {
  308. X            case 0x08:
  309. X                c = 0x7f;
  310. X                break;/* BS -> DEL */
  311. X            }
  312. X            i = 1;
  313. X            FSWrite (outnum, &i, &c);
  314. X        }
  315. X        break;
  316. X        case mouseDown:
  317. X        code = FindWindow (&myEvent.where, &whichWindow);
  318. X        switch (code) {
  319. X            case inMenuBar:
  320. X            DoCommand (MenuSelect (&myEvent.where));
  321. X            break;
  322. X        }        /* switch */
  323. X    }            /* switch */
  324. X    }                /* for */
  325. X}
  326. X
  327. X
  328. X/* SetupIO --- Initialize the RS232 connection. */
  329. XSetupIO()
  330. X{
  331. X  int err;
  332. X               /* Set up IO drivers */
  333. X    innum=OpenDriver(".AIn");
  334. X    outnum=OpenDriver(".AOut");
  335. X/*    asm(".word 0xa9ff"); /* Go into MacsBug */
  336. X    err=OpenResFile ("SERD");
  337. X/*    if (err==-1) printerr("Couldn't open res file: ", err); */
  338. X    err=_RAMSDOpen(1,1,1); /* Specially hacked RamSDopen for SuMacC */
  339. X    if (err) fatal("Can't open ramdriver: ", err);
  340. X    controlparam.serConfig=config9600;
  341. X    CheckItem (myMenus[CommandMenu], b9600Item, TRUE);
  342. X    err=Control(innum,8,&controlparam);
  343. X    if (err) fatal("Can't open idriver: ",err);
  344. X    err=Control(outnum,8,&controlparam);    
  345. X    if (err) fatal ("Can't open odriver: ",err);
  346. X
  347. X  /* Replace driver buffer with larger one */
  348. X    controlparam.serInBuff.serBPtr=mybuff;
  349. X    controlparam.serInBuff.serBLen=(short)MYBUFSIZE;
  350. X    err=Control(innum,9,&controlparam);
  351. X    if (err) printerr("Trouble making io buffer:",err);
  352. X  /* Specify handshake options */
  353. X    controlparam.serShk.fXOn=(char)TRUE;
  354. X    controlparam.serShk.fCTS=(char)FALSE;
  355. X    controlparam.serShk.xOn=(char) 17;
  356. X    controlparam.serShk.xOff=(char) 19;
  357. X    controlparam.serShk.errs=(char)FALSE;
  358. X    controlparam.serShk.evts=(char)FALSE;
  359. X    controlparam.serShk.fInX=(char)TRUE;
  360. X    err=Control(outnum,10,&controlparam);
  361. X    if (err) printerr("Trouble with handshake: ",err);
  362. X}
  363. X
  364. X
  365. X/* SetupMenus --- Install command menus. */
  366. X
  367. XSetupMenus()
  368. X{
  369. X    int i;
  370. X     char fnamcnv[13];
  371. X
  372. X
  373. X    InitMenus();
  374. X    myMenus[0]=NewMenu(filemenu,"File");
  375. X    AppendMenu(myMenus[0], "About ATPrint...");
  376. X    AppendMenu(myMenus[0], "Print PS file");
  377. X    AppendMenu(myMenus[0], "Print Text File");
  378. X    AppendMenu(myMenus[0], "Print Selection");
  379. X    AppendMenu(myMenus[0], "Quit");
  380. X    myMenus[1]=NewMenu(modemenu,"Edit");
  381. X    AppendMenu(myMenus[1],"Undo");
  382. X    AppendMenu(myMenus[1],"(-");
  383. X    AppendMenu(myMenus[1],"Cut");
  384. X    AppendMenu(myMenus[1],"Copy");
  385. X    AppendMenu(myMenus[1],"Paste");
  386. X    AppendMenu(myMenus[1],"Clear");
  387. X    myMenus[2]=NewMenu(optionmenu,"Command");
  388. X    AppendMenu(myMenus[2],"Connected");
  389. X    AppendMenu(myMenus[2],"Send Command");
  390. X    AppendMenu(myMenus[2],"1200");
  391. X    AppendMenu(myMenus[2],"9600");
  392. X    AppendMenu(myMenus[2],"Debug");
  393. X    for (i=0;i<numMenu;i++)
  394. X        InsertMenu(myMenus[i],0);
  395. X    DrawMenuBar();
  396. X}
  397. X
  398. X
  399. X/* DoCommand --- Menu dispatcher */
  400. X
  401. XDoCommand(mResult)
  402. Xint mResult;
  403. X{
  404. X    int theMenu=mResult>>16, theItem=(mResult &0xffff);
  405. X
  406. X    if (mResult !=0) {
  407. X      switch(theMenu) {
  408. X        case filemenu:
  409. X          switch (theItem) {
  410. X        case aboutItem:
  411. X          Alert (3, NULL);
  412. X          break;
  413. X        case psprintItem:
  414. X          printfile (TRUE);
  415. X          break;
  416. X        case textprintItem:
  417. X          printfile (FALSE);
  418. X          break;
  419. X        case selecItem:
  420. X          break;
  421. X        case quitItem:
  422. X          _RAMSDClose(1,1,1); /* Specially hacked for SuMacC */
  423. X          ExitToShell();
  424. X          break;
  425. X          };
  426. X          break;
  427. X        case modemenu:
  428. X          /* Dispatch to the correct routines */
  429. X          switch(theItem) {
  430. X          default:
  431. X          break;
  432. X           };
  433. X          break;
  434. X        case optionmenu:
  435. X          switch(theItem) {
  436. X        case connItem:
  437. X          conned = !conned;
  438. X          CheckItem(myMenus[2],connItem,conned);
  439. X          break;
  440. X        case cmdItem: {
  441. X          char cmd[255]; int goon=1; char *xx; int count;
  442. X          int ticks;
  443. X
  444. X          while (goon>0) {
  445. X            goon=gettext(cmd); if (goon==0) break;
  446. X            SendCmd (cmd);
  447. X            /* Wait 45 secs for chars to arrive */
  448. X            screenstring ("* Waiting for chars from RS232, click mouse to interrupt\r\n");
  449. X            SerGetBuf (innum, &count); ticks = TickCount();
  450. X            while (count==0) {
  451. X              SystemTask();
  452. X              if (checkuser()) break;
  453. X              SerGetBuf (innum, &count);
  454. X              if ((TickCount()-ticks) > 60*45) break;          
  455. X            }
  456. X            if (debug) count=0;
  457. X            if (count>0) while(DoPrinting (count));
  458. X             /* while just empty ^D's */
  459. X          }
  460. X
  461. X          break;
  462. X            }
  463. X        case b1200Item: {
  464. X          SerReset (innum, config1200);
  465. X          SerReset (outnum, config1200);
  466. X          CheckItem (myMenus[2], b1200Item, TRUE);
  467. X          CheckItem (myMenus[2], b9600Item, FALSE);
  468. X          break;
  469. X        }
  470. X        case b9600Item: {
  471. X          SerReset (innum, config9600);
  472. X          SerReset (outnum, config9600);
  473. X          CheckItem (myMenus[2], b1200Item, FALSE);
  474. X          CheckItem (myMenus[2], b9600Item, TRUE);
  475. X          break;
  476. X        }
  477. X        case debugItem: {
  478. X          debug = !debug;
  479. X          CheckItem (myMenus[CommandMenu], debugItem, debug);
  480. X          break;
  481. X        }
  482. X          };
  483. X          break;
  484. X      };
  485. X    };
  486. X    HiliteMenu(0);
  487. X}
  488. X
  489. X/* DoTermOutput --- Handle screen output of chars from host. */
  490. XDoTermOutput(count)
  491. Xint count;
  492. X{
  493. X  char c; int i;
  494. X
  495. X  SetPort (theWindow);
  496. X  while (count>0) {
  497. X    if (count==1) { i=1; FSRead (innum, &i, &c); screenchar (c); }
  498. X    else {
  499. X      for(;count>1;count--) {
  500. X    i=1;
  501. X        FSRead (innum, &i, &c);
  502. X    screenchar (c);
  503. X      }
  504. X    }
  505. X    SerGetBuf(innum, &count);
  506. X  }
  507. X}
  508. X
  509. X#define PBUFSIZ 1024
  510. X#define CtrlD 4
  511. X#define CtrlQ 17
  512. X#define CtrlJ 10
  513. X#define PrintAsPS StdBuf /* The strange Apple name for it... */
  514. Xchar pbuf[PBUFSIZ+1]; int dummy;
  515. Xint pbufc;
  516. X
  517. X/* PrintCtoLW --- Send a char to LaserWriter. Buffers it in pbuf first */
  518. XPrintCtoLW (c)
  519. Xchar c;
  520. X{
  521. X/*  if (c==CtrlJ) return; /* LW doesn't like LF's from ATalk */
  522. X  if ((c==CtrlD) && (pbufc>0)) {
  523. X    PrCtlCall(iPrIOCtl, (long)pbuf, pbufc, PrintAsPS);
  524. X    if (debug) { pbuf[pbufc]=(char)0; screenstring (pbuf);}
  525. X    pbufc=0;
  526. X  }
  527. X  else {
  528. X    pbuf[pbufc++]=c;
  529. X    if (pbufc==PBUFSIZ) {
  530. X      PrCtlCall(iPrIOCtl, (long)pbuf, pbufc, PrintAsPS);
  531. X      if(debug) { pbuf[pbufc]=(char)0; screenstring (pbuf);}
  532. X      pbufc=0;
  533. X    }
  534. X  }
  535. X}
  536. X
  537. X/* DoPrinting --- Print all chars from RS232 line on AppleTalk LW */
  538. Xint DoPrinting(count)
  539. Xint count;
  540. X{
  541. X  char c; int i;
  542. X  long tick1; long ptype;
  543. X
  544. X  pbufc=0;
  545. X  /* Ignore excess Ctrl-D's */
  546. X  i=1; FSRead (innum, &i, &c); c &=0x7f;
  547. X  if (c==CtrlD) return(1);
  548. X  else PrintCtoLW (c);
  549. X  SerGetBuf(innum, &count);
  550. X
  551. X  PrClose();
  552. X  PrDrvrOpen();
  553. X  screenstring ("**Starting print job**\r\n");
  554. X  PrCtlCall(iPrDevCtl, lPrReset, 0, 0);
  555. X  if (debug) screenstring("---");
  556. X  while (TRUE) {
  557. X    if (checkuser()) break;
  558. X    if (count==1) { i=1; FSRead (innum, &i, &c); c &=0x7f; PrintCtoLW (c); }
  559. X    else if (count>0){
  560. X      for(;count>1;count--) {
  561. X    i=1; FSRead (innum, &i, &c); c &=0x7f;
  562. X    PrintCtoLW (c); if (c==CtrlD) break;
  563. X      }
  564. X    }
  565. X    if (c==CtrlD) break;
  566. X    SerGetBuf(innum, &count); tick1=TickCount();
  567. X    /* Wait for 30 Secs for more chars */
  568. X    while (count==0) {
  569. X      SystemTask();
  570. X      SerGetBuf(innum, &count);
  571. X      if ( (TickCount()-tick1) > 60*30 ) break;
  572. X    }
  573. X    /* Before giving up, try Xoff and wait 15 secs, in case anything hung */
  574. X    if (count==0) {
  575. X      i=1; c=CtrlQ; FSWrite(outnum, &i, &c);
  576. X      Delay (60*15, &i);
  577. X      SerGetBuf(innum, &count);
  578. X    }
  579. X    if (count==0) { PrintCtoLW(CtrlD); screenstring("**Timeout\r\n"); break; }
  580. X  }
  581. X  screenstring ("**Ending print job**\r\n");
  582. X/*  PrCtlCall(iPrDevCtl, lPrPageEnd, 0, 0);  */
  583. X  PrDrvrClose();
  584. X}
  585. X
  586. X/* checkuser --- Test if user has interupted */
  587. Xint checkuser()
  588. X{
  589. X  SystemTask();
  590. X  GetNextEvent(everyEvent, &myEvent);
  591. X  if (myEvent.what==mouseDown) return (1); else return(0);
  592. X}
  593. X
  594. X/* printfile --- Ask for a file and dump as PostScript to LW */
  595. Xprintfile(ps)
  596. Xint ps;
  597. X{
  598. X  int refnum,ok=0; char name[100]; char buff[512]; long count,ptype;
  599. X
  600. X  if (ps) ptype=StdBuf; else ptype=ShowBuf;
  601. X  refnum=open_file(name);
  602. X  if (refnum!=NULL) {
  603. X    PrClose();
  604. X    PrDrvrOpen();
  605. X    PrCtlCall(iPrDevCtl, lPrReset, 0, 0);
  606. X    while (ok!=eoFErr){
  607. X      count=512;
  608. X      ok=FSRead(refnum, &count, (long)buff);
  609. X      if (count>0) {
  610. X        screenchar('*');
  611. X        PrCtlCall(iPrIOCtl, (long)buff, count, ptype);
  612. X      }
  613. X    }
  614. X    PrCtlCall(iPrDevCtl, lPrPageEnd, 0, 0);
  615. X    PrDrvrClose();
  616. X    FSClose (refnum);
  617. X  }
  618. X}
  619. X
  620. X
  621. X#define cmdBtn    OK
  622. X#define cmdquitBtn Cancel
  623. X#define quitBtn 3
  624. X#define cmdText 6
  625. X
  626. Xint gettext(str)
  627. Xchar str[];
  628. X{
  629. X  DialogPtr d; int itemHit; Handle item; int type, i; Rect r;
  630. X
  631. X  d = GetNewDialog (1, 0L, (char *)-1);
  632. X  GetDItem (d, cmdText, &type, &item, &r);
  633. X  if (strlen (text)>0) { SetIText (item, text); SelIText (d, cmdText, 0, 400);}
  634. X  ModalDialog (0L, &itemHit);
  635. X  if (itemHit==quitBtn) { DisposDialog (d); return (0); }
  636. X  for (i=0;i<255;i++) text[i]=(char)0;
  637. X  GetIText (item, text); /* This one returns a c-string i SuMacc ? */
  638. X  if (debug) {
  639. X    for (i=1;i<text[0];i++) screenchar (text[i]); screenstring ("\r\n");}
  640. X  if (debug) screenstring (text);
  641. X  strcpy (str, text);
  642. X  if (strlen (str)>0) strcat (str, "\r");
  643. X  if (debug) screenstring (str);
  644. X  DisposDialog (d);
  645. X  if (itemHit==cmdBtn) return (1); else return (-1);
  646. X}
  647. X
  648. XSendCmd (cmd)
  649. Xchar *cmd;
  650. X{
  651. X  int count;
  652. X  count=strlen(cmd);
  653. X  if (count>0) FSWrite (outnum, &count, cmd);
  654. X}
  655. X
  656. X/*
  657. X*  Printerr ---
  658. X*    Display error message and number in standard error box
  659. X*/
  660. X
  661. Xprinterr(str,err)
  662. Xchar *str;
  663. Xint err;
  664. X{
  665. X    int i;
  666. X    char error[10];
  667. X
  668. X    if (err) /* Err=0 signals message only */
  669. X    {
  670. X        /* Make sure string will be null terminated */
  671. X        for(i=0;i<10;error[i++]='\0');
  672. X
  673. X        NumToString(err,error);  /* Convert err number */
  674. X        ParamText(str,error,"",""); /* Insert strings into error box */
  675. X    }
  676. X    else
  677. X        ParamText(str,"","","");
  678. X    StopAlert(1,(ProcPtr) NULL);
  679. X
  680. X}
  681. X
  682. X
  683. X/*
  684. X*   Fatal ---
  685. X*    Printerr, close file, and exit to shell.
  686. X*/
  687. X
  688. Xfatal(str,err)
  689. Xchar *str;
  690. Xint err;
  691. X{
  692. X    printerr(str,err);
  693. X    ExitToShell();
  694. X}
  695. X
  696. X/*
  697. X*   Printnum ---
  698. X*    Print out number as an ascii string.
  699. X*/
  700. X
  701. Xprintnum(num)
  702. Xint num;
  703. X{
  704. X    int i;
  705. X    char numstr[10];
  706. X
  707. X    /* Make sure string will be null terminated. */
  708. X
  709. X    for(i=0;i<10;numstr[i++]='\0');
  710. X    NumToString(num,numstr);
  711. X    DrawString(numstr);
  712. X
  713. X}
  714. X
  715. X
  716. X/*
  717. X*    open_file  --- used to open the file for reading
  718. X*       returns value of refNum if successful, NULL if not
  719. X*       returns file name in fNamePtr if successful, NULL if not
  720. X*/
  721. X
  722. Xint open_file (fNamePtr)    /*returns refNum if file opened, NULL if not*/
  723. Xchar fNamePtr[];
  724. X{
  725. X    SFReply reply;
  726. X    Point where;
  727. X    int i, err=0, length, refNum;
  728. X
  729. X    /*position of dialog box*/
  730. X    SetPt (&where,30,30);
  731. X
  732. X    /*initializes fNamePtr to NULLs for safety*/
  733. X    for (i=0; i<64; i++)
  734. X        reply.fName[i] = NULL;
  735. X
  736. X    /*handles user interface*/
  737. X    SFGetFile (&where, NULL, NULL, -1, NULL, NULL, &reply);
  738. X
  739. X    /*
  740. X    *    convert Pascal string to C string --
  741. X    *    remove leading number and add a trailing NULL
  742. X    */
  743. X    length = reply.fName[0];
  744. X    for (i=0; i< length; i++)
  745. X        fNamePtr[i] = reply.fName[i + 1];
  746. X    fNamePtr[i] = NULL;
  747. X
  748. X    for (i=0; i< length; i++)
  749. X        reply.fName[i] = reply.fName[i + 1];
  750. X    reply.fName[i] = NULL;
  751. X
  752. X    if (reply.good)        /*user did not press Cancel Button*/
  753. X        {
  754. X        err = FSOpen (reply.fName, (int) reply.vRefNum, &refNum);
  755. X        if(err)
  756. X            printerr("Bad SFgetopen",err);
  757. X    }
  758. X
  759. X    else            /*user did press Cancel Button*/
  760. X        {
  761. X        refNum = NULL;
  762. X        fNamePtr[0] = NULL;
  763. X        }
  764. X    
  765. X    return (refNum);
  766. X}
  767. X
  768. X/* screenchar --- Place a char on the screen (window) */
  769. Xscreenchar(chr)
  770. Xchar chr;
  771. X{
  772. X  chr &= 0x7f;
  773. X  if (chr==0x0d)
  774. X    carriage_return();
  775. X  else if (chr==0x0a)
  776. X    line_feed();
  777. X  else if (chr==0x08)
  778. X    back_space();
  779. X  else if (chr==0x09)
  780. X    tab();
  781. X  else if (chr==0x20)
  782. X    space();
  783. X  else {
  784. X    GetPen (&p);
  785. X    if(p.h>RIGHTMARGIN)
  786. X      {
  787. X    overrun=FALSE;
  788. X    carriage_return();
  789. X    line_feed();
  790. X    overrun=TRUE;
  791. X      }
  792. X    DrawChar(chr);
  793. X  }
  794. X}
  795. X
  796. X/* screenstring --- Print a string on the scren */
  797. Xscreenstring (s)
  798. Xchar *s;
  799. X{
  800. X  while(*s) screenchar (*s++);
  801. X}
  802. X
  803. Xline_feed()
  804. X{
  805. X    if(!overrun)
  806. X    {
  807. X        GetPen(&p);
  808. X        if(p.v>=bottommargin)
  809. X        {
  810. X            ScrollRect((Rect *)&scrollrect,0,-LINEHEIGHT,dumptr);
  811. X            EraseRgn(dumptr);
  812. X        }
  813. X        else
  814. X            MoveTo(p.h,p.v+LINEHEIGHT);
  815. X    }
  816. X    else
  817. X        overrun=FALSE;
  818. X}
  819. X
  820. Xcarriage_return()
  821. X{
  822. X    GetPen(&p);
  823. X    MoveTo(LEFTMARGIN,p.v);
  824. X}
  825. X
  826. Xback_space()
  827. X{
  828. X    GetPen( &p);
  829. X    if (p.h-CHARWIDTH>0)
  830. X        Move(-CHARWIDTH,0);
  831. X    else
  832. X        carriage_return();
  833. X}
  834. X
  835. Xspace()
  836. X{
  837. X    /* Regular quickdraw space does not cover previous characters */
  838. X    Point p; short currect[4];
  839. X
  840. X    GetPen(&p);
  841. X    currect[0]=p.v-LINEHEIGHT+3;
  842. X    currect[1]=p.h;
  843. X    currect[2]=p.v+3;
  844. X    currect[3]=p.h+CHARWIDTH;
  845. X    EraseRect((Rect*) currect);
  846. X    Move(CHARWIDTH,0);
  847. X
  848. X}
  849. X
  850. Xtab()
  851. X{
  852. X    int index; Point p;
  853. X
  854. X    GetPen(&p);
  855. X
  856. X    index=p.h/CHARWIDTH;
  857. X    index=((index+8)/8);
  858. X    index=index*8*CHARWIDTH;
  859. X    MoveTo(index,p.v);
  860. X}
  861. ________This_Is_The_END________
  862. if test `wc -l < atprint.c` -ne 765; then
  863.     echo 'shar: atprint.c was damaged during transit'
  864.   echo '      (should have been 765 bytes)'
  865. fi
  866. fi        ; : end of overwriting check
  867. echo 'Extracting atprint.h'
  868. if test -f atprint.h; then echo 'shar: will not overwrite atprint.h'; else
  869. sed 's/^X//' << '________This_Is_The_END________' > atprint.h
  870. X/* atprint.h - Definitions for ATPrint spooler program    */
  871. X
  872. X#include <stdio.h>             /* Standard io definitions */
  873. X#include "mac/quickdraw.h"    /* Macintosh C interface */
  874. X#include "mac/osintf.h"
  875. X#include "mac/toolintf.h"
  876. X#include "mac/packintf.h"
  877. X#include "mac/libmac.h"
  878. X
  879. X/* Symbol Definitions */
  880. X
  881. X#define TRUE        -1      /* Boolean constants */
  882. X#define FALSE       0
  883. X
  884. X#define    numMenu        3        /* Number of menus in program */
  885. X#define filemenu    256     /* Reference numbers for menus */
  886. X#define modemenu    257
  887. X#define optionmenu  255
  888. X#define VIS         1       /* Sets window visisble */
  889. X#define MYBUFSIZE   2048
  890. X#define BUFSIZE        1024
  891. X/* #define noErr        0       /* Macintosh error codes */
  892. X#define eoFErr      (-39)
  893. X#define TOPMARGIN 10        /* Terminal display constants */
  894. X#define BOTTOMMARGIN 286
  895. X#define LEFTMARGIN 12
  896. X#define RIGHTMARGIN 480
  897. X#define CHARWIDTH 6
  898. X
  899. X
  900. X/* Macro Definitions */
  901. X
  902. X/* Global Variables */
  903. X
  904. Xint    innum,            /* Input driver refnum */
  905. X    outnum,            /* Output driver refnum */
  906. X
  907. X                    /* Mode of data transmission */
  908. X        image=FALSE ,       /* 8-bit transmission */
  909. X    volnum,
  910. X        debug=FALSE;
  911. X
  912. Xchar    volname[256],       /* Current volume name */
  913. X        filnam[80],            /* Current file name */
  914. X    mybuff[MYBUFSIZE];  /* Serial drivers new buffer */
  915. X
  916. XMenuHandle myMenus[numMenu];
  917. XEventRecord myEvent;
  918. XWindowPtr theWindow, whichWindow;
  919. XWindowRecord wRecord;
  920. X                 /* Rectangles */
  921. Xshort wirect[]={40,5,335,505}, /* window in global */
  922. X    inrect[]  = { 0, 0, 390, 500}; /* and local coords */
  923. X
  924. XCSParam  controlparam;      /* To change serial driver params OpParamType */
  925. X
  926. Xshort config;                 /* Current Serial driver configuration */
  927. X
  928. ________This_Is_The_END________
  929. if test `wc -l < atprint.h` -ne 58; then
  930.     echo 'shar: atprint.h was damaged during transit'
  931.   echo '      (should have been 58 bytes)'
  932. fi
  933. fi        ; : end of overwriting check
  934. echo 'Extracting atprint.rc'
  935. if test -f atprint.rc; then echo 'shar: will not overwrite atprint.rc'; else
  936. sed 's/^X//' << '________This_Is_The_END________' > atprint.rc
  937. X*
  938. X* File atprint.rc
  939. X*
  940. X* This file contains the resources for rmaker for the atprint program
  941. X
  942. X* Specify output file of executable code
  943. X
  944. Xatprint.rsrc
  945. X
  946. X*
  947. XType DLOG
  948. X  ,1
  949. X 40 20 330 500
  950. XVisible 1 NoGoAway 0
  951. X  5
  952. XSend command
  953. X
  954. XType ALRT
  955. X,1
  956. X90 50 180 400
  957. X2
  958. X5555
  959. X
  960. XType ALRT
  961. X,3
  962. X30 30 300 480
  963. X4
  964. XCCCC
  965. X
  966. X* Error box
  967. XType DITL
  968. X,2
  969. X2
  970. XBtnItem Enabled
  971. X65 20 85 60
  972. XOK
  973. X
  974. XStatText Disabled
  975. X65 80 85 400
  976. XError: ^0  ^1
  977. X
  978. X* About
  979. XType DITL
  980. X,4
  981. X6
  982. XBtnItem Enabled
  983. X230 230 260 290
  984. XOK
  985. X
  986. XBtnItem Disabled
  987. X400 400 400 400
  988. XCancel
  989. X
  990. XStatText Disabled
  991. X10 10 40 450
  992. XATPrint {RS232 -> Mac -> AppleTalk -> LaserWriter} spool program. V86.1b
  993. X
  994. XStatText Disabled
  995. X50 10 90 450
  996. XPrints all characters from RS232 on a LaserWriter over AppleTalk (no interpretation, i e only PostScript files work).
  997. X
  998. XStatText Disabled
  999. X90 10 120 450
  1000. XMay be copied but not sold.
  1001. X
  1002. XStatText Disabled
  1003. X120 10 150 450
  1004. Xseismo!enea!ttds!ahi --- Anders Hillbo, Royal Inst of Technology, Stockholm
  1005. X
  1006. X* Send Command
  1007. XType DITL
  1008. X ,5
  1009. X6
  1010. X* 1
  1011. XBtnItem Enabled
  1012. X250 30 270 140
  1013. XSend command
  1014. X
  1015. X* 2
  1016. XBtnItem Enabled
  1017. X250 150 270 380
  1018. XSend command & Quit
  1019. X
  1020. X* 3
  1021. XBtnItem Enabled
  1022. X250 390 270 440
  1023. XQuit
  1024. X
  1025. X* 4
  1026. XStatText Disabled
  1027. X30 30 120 470
  1028. 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
  1029. Xe give up.
  1030. X
  1031. X* 5
  1032. XStatText Disabled
  1033. X100 30 200 470
  1034. 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
  1035. XH do "stty -echo" and "set prompt=")
  1036. X
  1037. X* 6
  1038. XEditText Disabled
  1039. X220 30 240 460
  1040. X
  1041. X
  1042. X* Compiled program code
  1043. X
  1044. XType CODE
  1045. X  b.out,0
  1046. X
  1047. X
  1048. ________This_Is_The_END________
  1049. if test `wc -l < atprint.rc` -ne 111; then
  1050.     echo 'shar: atprint.rc was damaged during transit'
  1051.   echo '      (should have been 111 bytes)'
  1052. fi
  1053. fi        ; : end of overwriting check
  1054. echo 'Extracting naked-mac-spec'
  1055. if test -f naked-mac-spec; then echo 'shar: will not overwrite naked-mac-spec'; else
  1056. sed 's/^X//' << '________This_Is_The_END________' > naked-mac-spec
  1057. XThis gives some hints when connecting a naked-mac logic board to an
  1058. Xexternal power supply./Ragge Sundblad, NADA, KTH, Stockholm
  1059. X
  1060. XYou can find a connector on the logic-card wich connects the logic-card with
  1061. Xthe analog card. This is a spec how you can connect the power-supply you
  1062. Xwant. For example, you can use a multibus-power-supply if you've got
  1063. Xa multibus-machine (like sun) and want to get the power out of it.
  1064. XIf you want, you can connect a speaker to the card so you can hear it booting.
  1065. X
  1066. X
  1067. XNo pin!  Speaker (you can even take this signal in the speaker-connector
  1068. X     |     |      in the back of the card)
  1069. X     V     V
  1070. X  o  .  o  o  o  o  o  o  o  o  o <-Normally battery
  1071. X           |    +5  0 -12 0 +12 +5
  1072. X          _/|       |
  1073. X         |_ |       |
  1074. X           \|       |
  1075. X           |________|
  1076. X
  1077. ________This_Is_The_END________
  1078. if test `wc -l < naked-mac-spec` -ne 20; then
  1079.     echo 'shar: naked-mac-spec was damaged during transit'
  1080.   echo '      (should have been 20 bytes)'
  1081. fi
  1082. fi        ; : end of overwriting check
  1083. echo 'Extracting rs.s'
  1084. if test -f rs.s; then echo 'shar: will not overwrite rs.s'; else
  1085. sed 's/^X//' << '________This_Is_The_END________' > rs.s
  1086. X| RAMSDOpen & RAMSDClose routines for opening the SERD RAM serial driver
  1087. X| resource. For use with SuMacC. 1986-01-05 20:01:26
  1088. X| I translated this from "Motorola" syntax into Unix syntax, but I
  1089. X| was in a hurry and didn't want to learn the parameter mechanism. Thus both
  1090. X| routines have 3 dummy args and always use PortA (modem).
  1091. X
  1092. X    .text
  1093. X    .globl _RAMSDOpen, _RAMSDClose
  1094. XIOQElSize=50
  1095. XIOFileName=18
  1096. XIORefNum=24
  1097. XIODrvNum=22
  1098. XIOPermssn=27
  1099. XRSDHndl=0x28a
  1100. X|||    OSErr RamSDOpen(whichPort) | Originally but here _RAMSDopen(0,0,0)
  1101. X_RAMSDOpen:
  1102. X    link    a6,#-IOQElSize
  1103. X    moveml    #0x3030,sp@-    |    movem.l    d2-d3/a2-a3,-(sp)|save regs !!!
  1104. X    movl    #0x14,d0        |offset to AIn DCE handle
  1105. X|
  1106. X|
  1107. X|
  1108. X| Always do a-port...
  1109. X    movl    0x11c,a0        |get Unit table base address
  1110. X    movl    a0@(0,d0:w),d0        |get the DCE
  1111. X    beq    AsyncOK            |no open
  1112. X    movl    d0,a0            |DCE handle
  1113. X    movl    a0@,d0            |get and test pointer
  1114. X    beq    AsyncOK            |driver purged
  1115. X    movl    d0,a0            |copy pointer
  1116. X    tstb    a0@(7)            |check DCtlQueue+1 for new version
  1117. X    bne    AsyncOK            |yes, go open it
  1118. X    movl    RSDHndl,d0        |get resource handle
  1119. X    bgt    RamSDIn            | there already
  1120. X    movl    #2,D1            |id for XL
  1121. X    movl    0x2ae,a0        |get address of Rom base
  1122. X    movw    a0@(8),d0        |get version word
  1123. X    cmpb    #0xff,d0        |XL?
  1124. X    beq    2$            |yes
  1125. X    lsrw    #8,d0            |check high byte
  1126. X    bne    AsyncOK            |new Mac, ok
  1127. X    movl    #1,d1            |id for old Mac
  1128. X2$:
  1129. X    subw    #4,sp
  1130. X    movl    serd,sp@-        |open SERD resourc
  1131. X    movw    d1,sp@-            |push id number
  1132. X    .word    0xa9a0            |GetResource
  1133. X    movl    sp@,d3            |check return
  1134. X    bne    4$            |got it
  1135. X    addw    #4,sp            |fix stack
  1136. X    movw    0xa60,d0        |pass on resource error
  1137. X    bne    3$            |skip if there was one
  1138. X    movl    #-192,d0        |else set to resource not found
  1139. X3$:
  1140. X    bra    RamSDExit        |and quit
  1141. X4$:
  1142. X    .word    0xa992            |DetachResource
  1143. X    movl    d3,a0            |get handle
  1144. X    bset    #7,a0@            |lock it in memory
  1145. X    movl    a0,RSDHndl        |and save for later incarnations
  1146. XRamSDIn:
  1147. X    movl    RSDHndl,a3        |get handle to driver
  1148. X    movl    a3@,a3            |dereference
  1149. X    movl    #-23,d0            |assume openErr
  1150. X    cmpl    #0x53455244,a3@(4)    |must be SERD resource
  1151. X    bne    RamSDExit
  1152. X    movb    #0,d1    |A-port    |whichPort
  1153. X    btst    d1,RSDHndl        |installed already?
  1154. X    bne    AsyncOK            |yes
  1155. X    bsr    ClsPorts        |close the ROM ports
  1156. X    bset    d1,RSDHndl        |mark as installed
  1157. X    movl    #1,d0            |call install routine
  1158. X    jsr    a3@            |by calling through entry
  1159. X
  1160. XAsyncOK:
  1161. X    movl    #1,d2            |set up d2 for looping
  1162. X    lea    a6@(-IOQElSize),a0    |get ptr to param block
  1163. X    lea    drvANames,a1        |start with port A
  1164. X|    tstb    a6@(8)            |check whichPort
  1165. X|    beq    5$            |skip if A
  1166. X|    lea    drvBNames,a1        |get port B names
  1167. X5$:
  1168. X    movl    a1,a0@(IOFileName)    |set ptr to name
  1169. X    clrw    a0@(IODrvNum)
  1170. X    clrb    a0@(IOPermssn)        |open for read/write
  1171. X    .word    0xa000            |Open
  1172. X
  1173. X
  1174. X
  1175. X
  1176. X
  1177. X
  1178. X
  1179. X
  1180. X
  1181. X    bne    RamSDExit        |exit on error
  1182. X    movl    #0,d1            |zero out high bits
  1183. X    movb    a1@+,d1         |length of string
  1184. X    addw    d1,a1            |skip to next name
  1185. X    dbra    d2,5$            |loop
  1186. X    movl    #0,d0            |no error
  1187. XRamSDExit:
  1188. X    extl    d0            |sign extend
  1189. X    moveml  sp@+,#0x0c0c    |    movem.l    sp@+,d2-d3/a2-a3    |restore regs
  1190. X    unlk    a6
  1191. X    rts
  1192. X
  1193. X|
  1194. X|    RamSDClose(whichPort)
  1195. X|
  1196. X
  1197. X_RAMSDClose:
  1198. X    link    a6,#-IOQElSize        |space for pb
  1199. X    moveml     #0x3030,sp@-        | movem.l d2-d3/a2-a3,-(sp) |save regs
  1200. X    movb    #0,d1            |A-port whichPort
  1201. X    bsr    ClsPorts        |close the ports
  1202. X    movl    RSDHndl,d0        |get handle
  1203. X    ble    RamSDExit        |exit if not there
  1204. X    andl    0x31a,d0        |MaskBC
  1205. X    movl    d0,a0            |move to a0
  1206. X    movl    a0@,a0            |dereference
  1207. X    cmpl    #0x53455244,a0@(4)    |must be SERD
  1208. X    bne    RamSDExit        |else quit
  1209. X    bclr    d1,RSDHndl        |mark as not installed
  1210. X    movl    #0,d0            |call driver to remove
  1211. X    jsr    a0@
  1212. X    tstb    RSDHndl            |is it used by anyone?
  1213. X    bne    RamSDExit        |yes, quit
  1214. X    movl    RSDHndl,d0        |no, get handle
  1215. X    movl    d0,a0            |copy to a0
  1216. X    .word    0xa023            |DisposeHandle
  1217. X    movl    #-1,d0            |set handle to -1
  1218. X    movl    d0,RSDHndl        |to make it invalid
  1219. X    bra    RamSDExit        |and quit
  1220. X
  1221. XClsPorts:
  1222. X    movl    #-6,d0            |serial A input refnum
  1223. X    tstb    d1            |whichPort
  1224. X    beq    6$            |skip if A
  1225. X    movl    #-8,d0            |serial B input refnum
  1226. X6$:
  1227. X    lea    a6@(-IOQElSize),a0    |ptr to pb record
  1228. X    movw    d0,a0@(IORefNum)    |set up refnum
  1229. X    .word    0xa001            |Close
  1230. X    subw    #1,a0@(IORefNum)    |refnum of output driver
  1231. X    .word    0xa001            |Close also
  1232. X    rts
  1233. X
  1234. XdrvANames:
  1235. X    .byte    4
  1236. X    .ascii    ".AIn"
  1237. X    .byte    5
  1238. X    .ascii    ".AOut"
  1239. X.even
  1240. XdrvBNames:
  1241. X    .byte 4
  1242. X    .ascii    ".BIn"
  1243. X    .byte 5
  1244. X    .ascii    ".BOut"
  1245. X
  1246. X.even
  1247. Xserd:
  1248. X    .ascii "SERD"
  1249. ________This_Is_The_END________
  1250. if test `wc -l < rs.s` -ne 163; then
  1251.     echo 'shar: rs.s was damaged during transit'
  1252.   echo '      (should have been 163 bytes)'
  1253. fi
  1254. fi        ; : end of overwriting check
  1255. exit 0
  1256.