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.