[comp.sources.amiga] v91i060: Lightpenhandler 1.1 - use a lightpen like a mouse, Part01/01

amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (03/14/91)

Submitted-by: akk%trantor.informatik.uni-erlangen.de@taurus.cs.nps.navy.mil (Andy Klingler)
Posting-number: Volume 91, Issue 060
Archive-name: devices/lightpen-1.1/part01

[ includes uuencoded executable and icon  ...tad ]

Every  Amiga  has a hardware build in to connect a lightpen to it.  However
this  feature  is  rarely  used,  so I decided to write a software to use a
lightpen  just  like  you  use the mouse.  You even can use the mouse and a
lightpen  simultaniously and your applications don`t notice any difference.
Unfortunately  the  resolution  of the light pen registers is not very high
(vertical 1 non-interlaced scan line, horizontal 2 low-res pixels), but for
normal menu selections and gadget pressing it is more than sufficient.

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  README lp.c lp.info.uu lp.uu makefile
# Wrapped by tadguy@ab20 on Wed Mar 13 20:25:05 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(4145 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X                             Lightpen-Handler
X			     ================
X
X                 (c) Copyright by Andreas Klingler 1988,1991
X
XThis  program is freely distributable but is NOT public domain.  It MAY NOT
Xbe  included  in  any  commercial  package, or sold for ANY amount, without
Xwritten  permission  from  the  author.   However if may be included on any
Xfreely  distributable  package,  including  packages  for  which  a nominal
Xcopying fee of no more than $5 is charged, as long as this copyright notice
Xkeeps intact.
XThis software is distributed as-is, without any warranty.
XDon`t blame me for any trouble this gets you into.
X
XWhat`s it all about?
X--------------------
X
XEvery  Amiga  has a hardware build in to connect a lightpen to it.  However
Xthis  feature  is  rarely  used,  so I decided to write a software to use a
Xlightpen  just  like  you  use the mouse.  You even can use the mouse and a
Xlightpen  simultaniously and your applications don`t notice any difference.
XUnfortunately  the  resolution  of the light pen registers is not very high
X(vertical 1 non-interlaced scan line, horizontal 2 low-res pixels), but for
Xnormal menu selections and gadget pressing it is more than sufficient.
X
XFiles in the distribution:
X
X		README	- Guess what? You are reading this!
X		lp	- Ready to go code
X		lp.info - Yes, you can start it from workbench, too
X		lp.c	- SAS/C source
X		makefile- for SAS/C LMK
X
X
XTo use the handler
X
Xjust plug in your lightpen in
X		Joyport 1 (the right one) on an A2000
X		Joyport 0 (the front one) on an A1000
Xand start the program from CLI or Workbench (you don`t need to RUN it).  To
Xremove  the  handler  just  run  it again.  If you start it from the CLI it
Xgives some output on what`s going on.  KS 2.0 should be no problem.  As you
Xmay have noticed there is a difference between the A1000 and the A2000 (and
Xthe other Amigas?):  On the A1000 you have to plug the lightpen in the same
Xport  the  mouse  goes.  To be still able to use the mouse you should first
Xrun a program which attaches the mouse to the other port.
X(However buttonsupport is hardwired for port1, but you can change it
Xto port0 in the source)
X
X
XThe  lightpenhandler  is  done as an InputEvent-Handler. It links into the
XInputEvent  stream  just  ahead  of  Intuition.  This might not be the best
Xchoice  (normaly  an interrupt-handler would be the way to do such things),
Xbut  as  I  had  to  generate  some InputEvents anyway, and there is a good
Xexample of an InputEvent-Handler in the RKMs I took this way.  We just link
Xour  faked mouse events at the end of each bypassing input event chain.  We
Xcan`t starve here, because at least every 1/10 sec.  there is a timer event
Xto which we can link.
X
X
XOf  course  for  the  hardware you are on your own, but I will give a short
Xdescription  how  to  make  a  *very*  simple  lightpen.   If there is some
Xhardware guy outthere who has a good and simple solution and likes to share
Xit:  feel free to mail it to me!
X
XOn every Amiga one of the joystick/mouse ports as an input to support
Xa lightpen. Unfortunately the line used for the beam trigger (6) is the same
Xwhich is normaly used as the left mousebutton. So to emulate the
Xmousebuttons I had to use other lines:
X
X
X			Pin 3	 left penbutton
X			    4	right penbutton
X			    5	pen pressed to screen (not used here)
X			    6	capture beam position
X			    7	+5V (125 mA)
X			    8	GND
X
XThe beam counter is triggered by pulling pin 6 to ground.
XFor a simple start try the following circuit:
X(I don`t feel responsible for any damage this might do to your computer!)
X
X   ------------------------------------ 7 (+5V)
X   |
X  | |
X  | | 5k6
X   | 
X   |__________________________________ 6 Beam
X |/ 
X |\ BPX 81 (Phototransistor)
X   |
X   |
X   ------------------------------------ 8 GND
X
XFor the buttons you need some switches which connect the appropriate pin
Xto ground when you press them.
X
XThis works only for very bright areas on the screen. You might also want to
Xtry to hack-up one of these cheap C64 lightpens.
X
X
X
XHave fun with it!
X
XAndreas Klingler
XKoehlerstrasse 12
X8551 Hemhofen
XGermany
XFAX: +49 9195 3730
XEMail: asklingl@informatik.uni-erlangen.de
END_OF_FILE
if test 4145 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'lp.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'lp.c'\"
else
echo shar: Extracting \"'lp.c'\" \(8348 characters\)
sed "s/^X//" >'lp.c' <<'END_OF_FILE'
X/*************************************************
X*       Name :	   lightpen
X* This code installs a lightpendriver as an
X* InputEvent-Handler.
X* Left  Mousebutton on Pin 3
X* Right Mousebutton on Pin 4
X*
X* For SAS/C compile with -v
X* (no stack checking)
X*
X*	(c) Copyright by Andreas Klingler 1988,1991
X*
X* This program is freely distributable but is NOT public domain.
X* It MAY NOT be included in any commercial package, or sold for
X* ANY amount, without written permission from the author.
X* However if may be included on any freely distributable package,
X* including packages for which a nominal copying fee of no more than
X* $5 is charged, as long as this copyright notice keeps intact.
X* This software is distributed as-is, without any warranty.
X*
X*	      created 31.10.88 akk
X*	      cleanup 27.01.91 akk
X*************************************************/
X#include <exec/types.h>
X#include "intuition/intuition.h"
X#include <exec/ports.h>
X#include <exec/io.h>
X#include <exec/memory.h>
X#include <devices/input.h>
X#include <exec/devices.h>
X#include <devices/inputevent.h>
X#include "stdio.h"
X#include "stdlib.h"
X#include "graphics/gfxbase.h"
X#include "graphics/view.h"
X#include "proto/dos.h"
X#include "proto/exec.h"
X#include "proto/intuition.h"
X#include "proto/graphics.h"
X#include "hardware/custom.h"
X
X/***************** CONSTANTS ********************/
X#define LP_ENABLE 0x08
X#define XCOMPENSATE 42 /* This is to compensate some timing problems.
X			  You might need to change this. Uh! Again the
X			  answer is 42! What was the question!? */
X
X#define BANNER "\x9B\x30;33mLightpenhandler Version 1.1\x9B\x30m (c) by Andreas Klingler 1988,1991\n"
X#define ACTIVATED " Handler installed\n"
X#define TERMINATING " Handler removed\n"
X#define PORTNAME "lightpen_AKK.port"
X
X/****************** GLOBAL VARIABLES ************/
Xextern struct Custom __far custom;
X
Xstruct MsgPort *inputDevPort;
Xstruct IOStdReq *inputRequestBlock;
Xstruct Interrupt handlerStuff;
Xstruct OURMSG {
X    struct Message msgpart;
X    short dummy;
X    } msg;
X
Xstruct LpInfo { short *ViewX, *ViewY;  } handlerdata;
X
X/* Prototypes for functions defined in lp.c */
Xstruct InputEvent * __regargs __saveds myhandler(struct InputEvent *,
X                                                 struct LpInfo *);
Xvoid main(void);
Xvoid chkabort(void);
X
X
X/* Declarations for CBACK */
Xextern BPTR _Backstdout;         /* standard output when run in background */
Xlong _BackGroundIO = 1;          /* Flag to tell it we want to do I/O      */
Xlong _stack = 4000;              /* Amount of stack space our task needs   */
Xchar *_procname = "Lightpenhandler";  /* The name of the task to create    */
Xlong _priority = 20;             /* The priority to run us at              */
X
X/******************* Here goes the Handler ****************/
Xstruct InputEvent *
X__regargs __saveds myhandler(ev, mydata)
X	struct InputEvent *ev;  /* and a pointer to a list of events */
X	struct LpInfo *mydata;  /* system will pass me a pointer to my 
X				      own data space. */
X		
X{ 
X	static struct InputEvent lpev; 
X	struct InputEvent *retwert;
X	BOOL lpen_invalid = FALSE,button_pressed = FALSE;
X	static BOOL left_down,right_down;
X	ULONG pos;
X	static ULONG *lpen = (ULONG *)&custom.vposr;
X	register short x,y;
X
X	pos = *lpen;	/* read pen position (we read two
X			   registers here: VPOSR,VHPOSR) */
X
X	Forbid();
X	  if ((pos != *lpen) || /* Test, if Lpen has been
X				   triggered since VBLANK */
X	     ((pos & 0x1ffff) > 0x12a00)) {  retwert=ev; lpen_invalid=TRUE; }
X	   else retwert = &lpev;
X
X	/* Translate in HIRES INLACE coordinates (depending of position of
X	   the View). That`s what mouse coordinates are in.
X	   Since we have only 8 bits for the horizonal position it gets
X	   a little bit tricky (there are 640 pixel in one line in hires!) */
X	  x = (short)((pos <<1) & 0x1ff);
X	  if (x < 100) x += 454;
X 	  y = ((short) (pos >> 8) &0x1ff) - *(mydata->ViewY);
X 	  x -= (*(mydata->ViewX) + XCOMPENSATE);
X
X	  lpev.ie_NextEvent = ev;  /* link lpen ahead of event stream */
X	  lpev.ie_Class = IECLASS_POINTERPOS;
X	  lpev.ie_Code = IECODE_NOBUTTON;
X	  lpev.ie_Qualifier = 0;
X	  lpev.ie_TimeStamp.tv_secs = 0;
X	  lpev.ie_TimeStamp.tv_micro = 0;
X	  lpev.ie_X = x << 1;
X	  lpev.ie_Y = y << 1;
X
X	/* Button on lightpen pressed ? */
X	  if (right_down) {
X	  	if (!(custom.joy1dat & 1)) { lpev.ie_Code = IECODE_RBUTTON |
X							      IECODE_UP_PREFIX;
X				  	     right_down = FALSE;
X					     button_pressed = TRUE;
X					   }
X		        }
X	  else if (custom.joy1dat & 1) { lpev.ie_Code = IECODE_RBUTTON;
X				         right_down = TRUE;
X					 button_pressed = TRUE;
X					}
X	  if (left_down) {
X	  		if (!(custom.joy1dat & 0x100)){
X					lpev.ie_Code = IECODE_LBUTTON |
X						       IECODE_UP_PREFIX;
X					left_down = FALSE;
X					button_pressed = TRUE;
X					}
X		        }
X		else    if (custom.joy1dat & 0x100) {
X					lpev.ie_Code = IECODE_LBUTTON;
X					left_down = TRUE;
X					button_pressed = TRUE;
X					}
X
X	/* Append positiondata only if it is valid */
X	  if (button_pressed && lpen_invalid) {
X			lpev.ie_Class = IECLASS_RAWMOUSE;
X			lpev.ie_Qualifier = IEQUALIFIER_RELATIVEMOUSE;
X			lpev.ie_X = lpev.ie_Y = 0; 
X			retwert = &lpev;
X			}
X	Permit();
X	return (retwert);
X}
X
X
Xvoid main()
X{
X	struct MsgPort *port;
X	SHORT error;
X
X
X	if (_Backstdout) Write(_Backstdout, BANNER, sizeof(BANNER));
X
X	/* now see if we are allready installed */
X      if (!(port = FindPort(PORTNAME)))  {
X        /* if not, install ourself : */
X	if ((port = CreatePort(PORTNAME,0)) == NULL) _exit (19);
X
X	GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0);
X	if (!GfxBase) _exit(20);
X	
X	IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
X	if (!IntuitionBase) _exit(21);
X			
X	/* Tell the OS about the lightpen and enable the hardware */
X	GfxBase->system_bplcon0 |= LP_ENABLE;
X	RemakeDisplay();
X
X	/* Determine position of the View. Attention: if someone pokes
X	   around with Preferences while we are running, we can`t handle
X	   this! */	       
X	handlerdata.ViewX = (short *)&(GfxBase->ActiView->DxOffset);
X	handlerdata.ViewY = (short *)&(GfxBase->ActiView->DyOffset);
X
X	inputDevPort = CreatePort(0,0);		/* for input device */
X	if(inputDevPort == NULL) _exit(1);	/* error during createport */
X	inputRequestBlock=CreateStdIO(inputDevPort);
X	if(inputRequestBlock == 0) { DeletePort(inputDevPort); _exit(2); }
X					/* error during createstdio */
X
X
X	handlerStuff.is_Data = (APTR)&handlerdata;
X			/* address of its data area */
X	handlerStuff.is_Code = (void *)myhandler;
X			/* address of entry point to handler */
X	handlerStuff.is_Node.ln_Pri = 51;
X			/* set the priority one step higher than
X		 	 * Intuition, so that our handler enters
X			 * the chain ahead of Intuition.
X			 */
X	error = OpenDevice("input.device",0,(struct IORequest *)inputRequestBlock,0);
X	if(error) _exit(23);
X
X	inputRequestBlock->io_Command = IND_ADDHANDLER;
X	inputRequestBlock->io_Data = (APTR)&handlerStuff;
X		
X	DoIO((struct IORequest *)inputRequestBlock);  /* Activate the Handler */
X	
X	/* The Handler is running. Close everything we don`t need
X	   anymore and wait until it is time to uninstall the handler.
X	   All the dirty work is done by the handler */
X
X	CloseLibrary((struct Library *)IntuitionBase);
X	CloseLibrary((struct Library *)GfxBase);
X
X	if (_Backstdout) { Write(_Backstdout,ACTIVATED, sizeof(ACTIVATED));
X			   Close(_Backstdout);
X			   }
X	WaitPort(port);  		/* Wait until we get message */
X	GetMsg(port);			/* to exit, then remove it */
X					/* and get out		   */
X
X	inputRequestBlock->io_Command = IND_REMHANDLER;
X	inputRequestBlock->io_Data = (APTR)&handlerStuff;
X	DoIO((struct IORequest *)inputRequestBlock);
X
X	/* close the input device */
X	CloseDevice((struct IORequest *)inputRequestBlock);
X
X	/* delete the IO request */
X	DeleteStdIO(inputRequestBlock);
X
X	/* free other system stuff */
X	DeletePort(inputDevPort);
X	DeletePort(port);
X      }   /* this is the end of the BIG-IF (and of the program */
X
X      else  /* in this case the handler is already installed, so we
X	       send a message to it to make it deinstall itself */
X	{
X	msg.msgpart.mn_Length = sizeof(struct OURMSG);
X	PutMsg(port,(struct Message *)&msg);
X	if (_Backstdout) { Write(_Backstdout, TERMINATING, sizeof(TERMINATING));
X			   Close(_Backstdout);
X			   }
X       }
X}					/* end of main */
X
Xvoid MemCleanup() {}	/* We don`t want this out of lc.lib */
X
Xvoid chkabort() {}
END_OF_FILE
if test 8348 -ne `wc -c <'lp.c'`; then
    echo shar: \"'lp.c'\" unpacked with wrong size!
fi
# end of 'lp.c'
fi
if test -f 'lp.info.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'lp.info.uu'\"
else
echo shar: Extracting \"'lp.info.uu'\" \(392 characters\)
sed "s/^X//" >'lp.info.uu' <<'END_OF_FILE'
Xbegin 644 lp.info
XMXQ```0```````````"0`#@`$``,``0#`UO@`````````````````````````\
XM`````P```````````````4X````"```````````````````````D``T``@`!(
XM<)`#``````````````````!X``````"&```````"```````.```````/@```@
XM````@``````0@``````>@``0```?@```````8```````,```````$```````]
XM``````````````\``````'\``````?X`````!_@`````?X`````#_``````/9
X=P``````/````````````````````````````````/
X``
Xend
Xsize 254
END_OF_FILE
if test 392 -ne `wc -c <'lp.info.uu'`; then
    echo shar: \"'lp.info.uu'\" unpacked with wrong size!
fi
# end of 'lp.info.uu'
fi
if test -f 'lp.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'lp.uu'\"
else
echo shar: Extracting \"'lp.uu'\" \(4227 characters\)
sed "s/^X//" >'lp.uu' <<'END_OF_FILE'
Xbegin 644 lp
XM```#\P`````````#``````````(```#-````X0```7T```/I````S4CG?OY+6
XM[P`T)$@D`$GY`````"QX``0I3@!:*4\`8D*L`%Y'^0```>!R`"`\````:6`".
XM)L%1R/_\)FX!%'``(CP``#``3J[^SBEK`)@`5DJK`*QG``%080`"J"(L`%8L@
XM;`.`3J[_H"E``%8@:P"LT<C1R")H`!#3R=/)(`)R`!(9*`DF`=*!T(%:@.6(&
XMT*P`%"E``!1![```+'@`!$ZN_R(B0"\`(FD`$$?I`/(@1"`#8`(6V%'(__P6.
XM_``@($H@`F`"%MA1R/_\0ALI2P!V($0@`V`"%MA1R/_\0A-%Z0!P*4H`&D7Z]
XM_Q8B_````#PF">2+(M)"DD7Z`38@/````.D2VE'(__Q*K`"(9P``&D'L`(8BD
XM""0\```#[2QL`X!.KO_B*4``<BQX``1.KO]\(BP`H"0L`*0H+`",+&P#@$ZNC
XM_W8F3DJ`9@``("1?(FH`$"(L`%9.KO^F($HL>``$3J[_''!H8```)B1`(E]%.
XMZO^D0>H`2D'H``0@*``$(4D`!"*((T``!"!`((EP`"QX``1.KO]V(DLL>``$A
XM3J[^8DS??WY.=2EK`#H`)@:L````@``F80`!3$7Z`.PI2@`:80`!6"E``%XOI
XM`"1`("H`)&<2+&P#@"!`(B@``"E!`%9.KO^"(BH`(&<:)#P```/M3J[_XBE`0
XM`&YG"N6(($`G:``(`*0@;`!>+PA(;``B(&@`)"EH``0`=DZZ`11.N0```VAP4
XM`&```(`````\`````"`/2.=^_BI`+'@`!$GY`````"E/`&)A``"ZD\F3R4ZNS
XM_MHF0"EK`#H`)@:L````@``F(&L`@-'(T<@B:``,T\G3R2E1`!XA40`,(BP`Y
XM5BQL`X!.KO^"2'H`DDZY```#9$ZY```#:%A/+&P#@"(L`%9.KO^F<``@+`!.S
XM9P0@0$Z03KD```->3KD```-F2JP`7F<>(BP`;F<(+&P#@$ZN_]PL>``$3J[_:
XM?")L`%Y.KOZ&)FP`8B(L`!XL;`.`3J[_9").+'@`!$ZN_F(N2TS??WY.=4/L)
XM`'IP`$ZN_=@I0`.`9P``!$YU<&1@C$'K`%Q.KOZ`0>L`7$ZN_HQ.=0``3OD`O
XM``-D<&$```/L`````P````$````D```"/`````X````&`````@```K8```*P-
XM```"D````AP```**```#+@````````/R```#Z@```'@`````````````````'
XM```!`````0```/).^0``````````````````````````````````````````[
XM`````````````````````````````````````````````````````````````
XM`````````````````````````&1O<RYL:6)R87)Y`"H``````0``#Z!,:6=H'
XM='!E;FAA;F1L97(`````D````!0`W_`$FS`[,S-M3&EG:'1P96YH86YD;&5R^
XM(%9E<G-I;VX@,2XQFS!M(*D@8GD@06YD<F5A<R!+;&EN9VQE<B`Q.3@X+#$YX
XM.3$*`)LP.S,S;4QI9VAT<&5N:&%N9&QE<B!697)S:6]N(#$N,9LP;2"I(&)Y8
XM($%N9')E87,@2VQI;F=L97(@,3DX."PQ.3DQ"@!L:6=H='!E;E]!2TLN<&]R*
XM=`!L:6=H='!E;E]!2TLN<&]R=`!G<F%P:&EC<RYL:6)R87)Y``!I;G1U:71IR
XM;VXN;&EB<F%R>0!I;G!U="YD979I8V4``"!(86YD;&5R(&EN<W1A;&QE9`H`6
XM($AA;F1L97(@:6YS=&%L;&5D"@`@2&%N9&QE<B!R96UO=F5D"@`@2&%N9&QEN
XM<B!R96UO=F5D"@```````"@```/L`````0````$```"@`````````_(```/IH
XM```!?4Y5__!(YS\Z2?D`````)D@D27X`?``@;`"H*U#_]"QX``1.KO]\("W_<
XM]"!L`*@B$+*`9A`B/``!___"@`R!``$J`&,(*TO__'X!8`A![`'@*TC__"(`Z
XMTH$"@0```?\J`7)DND%L!`9%`<;@B`)``?\@:@`$D%`H`"!2<"K04)I`*4L!/
XMX!E\``0!Y#E\`/\!YG``.4`!Z'(`*4$![BE!`?(D!=1".4(!ZB0$U$(Y0@'L^
XM2FP!^&<:-#D`W_`,"`(``&8H.7P`Z0'F?`$Y0`'X8!HT.0#?\`P(`@``9PXY^
XM?`!I`>9V`2P#.4,!^$IL`?9G%`@"``AF(CE\`.@!YGP!.4`!]F`4"`(`"&<.5
XM.7P`:`'F=`$L`CE"`?9*1F<@2D=G'!E\``(!Y#E\@``!Z#E``>PY0`'J0>P!6
XMX"M(__Q.KO]V("W__$S?7/Q.74YU2.<Q,DJL`')G%"(L`')![`"L)`AV1BQL&
XM`X!.KO_00^P!."QX``1.KOYZ)D`@"V8``:I"ITAL`4I.N@-^4$\F0"`+9@I(-
XM>``33KH#_EA/0^P!7'``+'@`!$ZN_=@I0`-\2H!F"DAX`!1.N@/>6$]#[`%N4
XM<``L>``$3J[]V"E``WA*@&8*2'@`%4ZZ`[Y83R!L`WPP*`"D`$``""!L`WPQ7
XM0`"D+&P#>$ZN_H`B;`-\(&D`(D7H``XI2@(N(&D`(D7H``PI2@(R0J="ITZZL
XM`NQ03RE``?IF"DAX``%.N@-L6$\O+`'Z3KH"EEA/*4`!_DJ`9A(O+`'Z3KH"G
XM&$AX``).N@-(4$]![`(N*4@"$$'Z_:8I2`(4&7P`,P(+0>P!@'``(FP!_B(`S
XM+'@`!$ZN_D0N`$I'9PI(>``73KH##EA/(&P!_C%\``D`'$'L`@(B;`'^(T@`S
XM*"QX``1.KOXX(FP#>$ZN_F(B;`-\3J[^8DJL`')G'"(L`')![`&.)`AV%"QL%
XM`X!.KO_0(BP`<DZN_]P@2RQX``1.KOZ`($M.KOZ,(&P!_C%\``H`'$'L`@(B4
XM;`'^(T@`*$ZN_C@B;`'^3J[^/B\L`?Y.N@$>+JP!^DZZ`4(NBTZZ`3Q83V`R-
XM.7P`%@(J($M#[`(83J[^DDJL`')G'"(L`')![`&V)`AV$BQL`X!.KO_0(BP`N
XM<DZN_]Q,WTR,3G5.=4YU``!.=4YU3E7_=$CG`3`F;P"@?@!P(+Z`;```@A`3C
XM<B"P`6<,<@FP`6<&<@JP`68$4HM@Z$H39V0@!^6`4H=![?]TT<`D2'`BL!-FQ
XM)E*+)(M*$V<*<"*P$V<$4HM@\DH39@Q(>``!3KH`6EA/8*9"&V"B)(M*$V<8X
XM$!-R(+`!9Q!R";`!9PIR"K`!9P12BV#D2A-F`F`&0AM@`/]Z2H=G!D'M_W1@3
XM!"!L`%XO""\'3KK].D*73KH`#$SM#(#_:$Y=3G5.^0```!@```````!(YP`2!
XM)F\`#!=\`/\`"#!\__\G2``4)T@`&")+<#`L>``$3J[_+DS?2`!.=4CG`!(FJ
XM;P`,2JL`"F<*(DLL>``$3J[^F!=\`/\`"'#_)T``%'``$"L`#RQX``1.KOZPB
XM(DMP(DZN_RY,WT@`3G4O!RXO``A*K`!29P1.NOZV(@<L;`.`3J[_W'``+A]..
XM=0```````````````$CG`#(F;P`0(`MF!'``8"9P,"(\``$``2QX``1.KO\ZC
XM)$`@"F<.%7P`!0`(0BH`"25+``X@"DS?3`!.=4CG`S(F;P`8+B\`''#_+'@`5
XM!$ZN_K8L``P&`/]F!'``8&9P(B(\``$``4ZN_SHD0"`*9@IP`!`&3J[^L&!(.
XM)4L`"B`'%4``"15\``0`"$(J``X51@`/D\E.KO[:)4``$"`+9P@B2DZN_IY@C
XM&D'J`!@E2``40>H`%"5(`!Q"J@`8%7P``@`@(`I,WTS`3G4``$CG!P`N+P`0D
XM("P!W%.`+`!*1FLP(`9(P.>`0>P"."HP"`!*!6<:"`4`!&84(`9(P.>`0>P"0
XM."\P"`1.NO[,6$]31F#,+P=.NOY(6$],WP#@3G4`````````````````````:
X:`^P````"`````0``!"8````*`````````_+@[
X``
Xend
Xsize 2996
END_OF_FILE
if test 4227 -ne `wc -c <'lp.uu'`; then
    echo shar: \"'lp.uu'\" unpacked with wrong size!
fi
# end of 'lp.uu'
fi
if test -f 'makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(269 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X# Makefile for the Lightpen-Handler
X# (SAS/C and LMK)
X
XCC	= lc
XFLAGS	= -caf -v
X
Xlp:	lp.o
X	blink <with <
X		DEFINE __main=__tinymain
X		FROM LIB:cback.o+lp.o
X		TO lp
X		LIBRARY LIB:lc.lib+LIB:amiga.lib
X		SMALLCODE
X		SMALLDATA
X		NODEBUG
X		<
X
Xlp.o:	lp.c
X	$(CC) $(FLAGS) lp.c
END_OF_FILE
if test 269 -ne `wc -c <'makefile'`; then
    echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.misc.