home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / unix / amiga / 2056 < prev    next >
Encoding:
Text File  |  1992-08-31  |  31.1 KB  |  1,017 lines

  1. Newsgroups: comp.unix.amiga
  2. Path: sparky!uunet!sybus.sybus.com!myrddin!tct!ckctpa!crash
  3. From: crash@ckctpa.UUCP (Frank "Crash" Edwards)
  4. Subject: Here's the source ("Re: Button Number 2?")
  5. Message-ID: <1992Sep1.012945.8448@ckctpa.UUCP>
  6. Date: Tue, 1 Sep 1992 01:29:45 GMT
  7. Reply-To: crash%ckctpa@tct.com (Frank "Crash" Edwards)
  8. References: <BtqrJ2.6E1@agora.rain.com>
  9. Organization: Edwards & Edwards Consulting
  10. Lines: 1005
  11.  
  12. chuff@agora.rain.com (Chris Hufnagel) writes:
  13. >A while back I remember seeing a utility that allowed you to use
  14. >some key combo that would simulate the middle (number 2) button.
  15. >
  16. >Could sombody either e-mail/post it or tell me an ftp site.
  17. >(I don't remember seeing it on amiga.physik).
  18.  
  19. If someone would zoo or tar this together and put it up for anon ftp
  20. I'd appreciate it.  Thanks.
  21.  
  22. >Thanks.
  23. >Chris Hufnagel <chuff@agora.rain.com>| "Where-ever there are teeth, you'll find
  24.  
  25. My pleasure.
  26.  
  27. One note though:  these patches consist of three things.  (1) The
  28. mouse button enhancement that allows both buttons pressed
  29. simultaneously to act as a middle button, (2) the VT100 keypad
  30. enhancement which allows the numeric keypad to generate escape
  31. sequences which can be modified by modifying a keymap, and (3) is the
  32. beginning of support for an A_UNDERSCORE attribute for the console
  33. screens (I loath the idea that the only attribute available is reverse
  34. video -- ugh!).  See the README for more details.
  35.  
  36. ---- cut here ---- cut here ---- cut here ---- cut here ---- cut here ----
  37. Submitted-by: crash%ckctpa@tct.com
  38. Archive-name: AmixConsolePatches/part01
  39.  
  40. #!/bin/sh
  41. # This is AmixConsolePatches, a shell archive (shar 3.21)
  42. # made 09/01/1992 01:26 UTC by crash%ckctpa@tct.com
  43. # Source directory /usr/sys/amiga/console
  44. #
  45. # existing files WILL be overwritten
  46. #
  47. # This shar contains:
  48. # length  mode       name
  49. # ------ ---------- ------------------------------------------
  50. #   2435 -rw-r--r-- README
  51. #   4053 -rw-r--r-- amiga.ti
  52. #  14824 -rw-r--r-- patches
  53. #   3988 -rw-r--r-- keymap
  54. #
  55. if touch 2>&1 | fgrep '[-amc]' > /dev/null
  56.  then TOUCH=touch
  57.  else TOUCH=true
  58. fi
  59. # ============= README ==============
  60. echo "x - extracting README (Text)"
  61. sed 's/^X//' << 'SHAR_EOF' > README &&
  62. XThe middle mouse button hack is just that -- a hack.  I have found
  63. Xthat on occasion the middle button will "stick".  Press and release
  64. Xone of the other buttons to "un-stick" it (usually outside of the
  65. Xwindow you're working in).  If anyone finds out why, I'd appreciate
  66. Xgetting some email so I can keep the patches complete.
  67. X
  68. XThe numeric keypad mods were originally designed to allow the software
  69. Xto fake out the machine so that it thinks the RightAlt key is down.
  70. XThen use an AmigaDOS keymap editor to set up the keypad to generate
  71. Xwhatever sequences you want.  Those sequences can be activated by
  72. Xdoing the following in KSH:
  73. X
  74. X    export TERM=amiga_test    # or whatever terminfo name you use
  75. X    sioc setkmap keymap        # Substitute your keymap filename for "keymap"
  76. X    tput smkx            # "start mode keypad xmit"
  77. X
  78. XNormally I execute "sioc setdefkmap ..." in the /etc/sysinit shell
  79. Xscript so that the keymap is modified at boot time.  One of these days
  80. XI'll make it the system-default keymap, but I'm not in any hurry.
  81. X
  82. XNow press any of the keypad keys to generate the escape sequence.
  83. XTurn off the keypad mode by using "tput rmkx".  You will, of course,
  84. Xneed to install the terminfo file I've provided, "amiga.ti".  This is
  85. Xthe same name as the Commodore-supplied terminfo file, but it contains
  86. Xtheir entry + my other entries.  You may find the "dnet" entry useful
  87. Xif you're currently running DNet under Amix.  The "amiga1" entry is
  88. Xwhat I call my modified terminfo entry, ie. it was called "amiga_test"
  89. Xin the example above.
  90. X
  91. XI've included the keymap I use, which is _not_ exactly the same as the
  92. XVT100 (The VT100 uses <ESC>O for the introducer and I found vi has to
  93. Xdo some funky stuff to detect an <ESC> when the special keys are multi-
  94. Xkeystroke codes when the character following the <ESC> could be a vi
  95. Xcommand.  So I use <CSI> (or "<ESC>[O") as the introducer.  Look at the
  96. Xterminfo source file for the keys that are available (such as <HOME>,
  97. X<END>, <PgUp>, <PgDn>, etc).
  98. X
  99. XThe underlining support is not yet complete (a little more debugging
  100. Xto do) so I haven't enabled it in the terminfo file and hence you won't
  101. Xsee any of it.  When I get it worked out, there'll be new patches to be
  102. Xapplied against the original files, so KEEP YOUR ORIGINALS!
  103. X--
  104. XFrank "Crash" Edwards            King Marine Electronics, Inc.
  105. XHome: 813/786-3675               Work: 813/530-3411
  106. X
  107. XEmail: crash%ckctpa@tct.com, or
  108. X       crash%ckctpa@myrddin.sybus.com
  109. SHAR_EOF
  110. $TOUCH -am 0831211992 README &&
  111. chmod 0644 README ||
  112. echo "restore of README failed"
  113. set `wc -c README`;Wc_c=$1
  114. if test "$Wc_c" != "2435"; then
  115.     echo original size 2435, current size $Wc_c
  116. fi
  117. # ============= amiga.ti ==============
  118. echo "x - extracting amiga.ti (Text)"
  119. sed 's/^X//' << 'SHAR_EOF' > amiga.ti &&
  120. X# Generic DNET-compatible escape sequences for an AmigaDOS CON:
  121. X# window.  Since neither "amiga" nor "vt100" worked for DNet
  122. X# client FTERMs, I built up this one by running script before
  123. X# a vi session and trimming out the escape sequence that the
  124. X# CON: device doesn't handle.
  125. Xdnet|AmigaDOS console screen under DNET V2.10,
  126. X    km, am, xenl,
  127. X
  128. X    bel=^G, cr=\r, ind=\233S, ri=\233T, nel=\n, ht=\t,
  129. X    cub=\233%p1%dD, cub1=\b,
  130. X    cud=\233%p1%dB, cud1=\n,
  131. X    cuf=\233%p1%dC, cuf1=\233C,
  132. X    cuu=\233%p1%dA, cuu1=\233A,
  133. X    cup=\233%i%p1%d;%p2%dH,
  134. X    home=\233H, ed=\233J, el=\233K, clear=\233H\233J,
  135. X
  136. X    ich1=\233@, ich=\233%p1%d@,
  137. X    dch1=\233P,
  138. X    il1=\233L,
  139. X    dl1=\233M,
  140. X
  141. X    smso=\2337m, rmso=\233m,
  142. X    bold=\2331m,
  143. X    rev=\2337m,
  144. X    sgr=\233%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m%?%p9%t^N%e^O%;,
  145. X    sgr0=\2330m,
  146. X
  147. X    khlp=\233?~,
  148. X    kbs=\b, kcub1=\233D, kcuf1=\233C, kcuu1=\233A, kcud1=\233B,
  149. X    kf1=\2330~, kf2=\2331~, kf3=\2332~, kf4=\2333~, kf5=\2334~,
  150. X    kf6=\2335~, kf7=\2336~, kf8=\2337~, kf9=\2338~, kf10=\2339~,
  151. X    kf11=\23310~, kf12=\23311~, kf13=\23312~, kf14=\23313~, kf15=\23314~,
  152. X    kf16=\23315~, kf17=\23316~, kf18=\23317~, kf19=\23318~, kf20=\23319~,
  153. X
  154. X# The original, un-perverted (at least, by me!) console handler description.
  155. Xamiga|Amiga Unix console screen (pseudo-ansi),
  156. X    km, am, xenl,
  157. X
  158. X    cols#80, lines#25,
  159. X
  160. X    bel=^G, cr=\r, ind=\2331;1M, ht=\t,
  161. X    cub=\233%p1%dD, cub1=\b,
  162. X    cud=\233%p1%dB, cud1=\n,
  163. X    cuf=\233%p1%dC, cuf1=\233C,
  164. X    cuu=\233%p1%dA, cuu1=\233A,
  165. X    cup=\233%i%p1%d;%p2%dH,
  166. X    home=\233H, ed=\233J, el=\233K, clear=\233H\233J,
  167. X
  168. X    ich1=\233@, ich=\233%p1%d@,
  169. X    dch1=\233P,
  170. X    il1=\233L, il=\233%p1%dL,
  171. X    dl1=\233M, dl=\233%p1%dM,
  172. X
  173. X    smso=\2337m, rmso=\233m,
  174. X    bold=\2331m,
  175. X    rev=\2337m,
  176. X    sgr=\233%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m%?%p9%t^N%e^O%;,
  177. X    sgr0=\2330m,
  178. X    acsc=``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
  179. X    rmacs=^O, smacs=^N,
  180. X
  181. X    khlp=\233?~,
  182. X    kbs=\b, kcub1=\233D, kcuf1=\233C, kcuu1=\233A, kcud1=\233B,
  183. X    kf1=\2330~, kf2=\2331~, kf3=\2332~, kf4=\2333~, kf5=\2334~,
  184. X    kf6=\2335~, kf7=\2336~, kf8=\2337~, kf9=\2338~, kf10=\2339~,
  185. X    kf11=\23310~, kf12=\23311~, kf13=\23312~, kf14=\23313~, kf15=\23314~,
  186. X    kf16=\23315~, kf17=\23316~, kf18=\23317~, kf19=\23318~, kf20=\23319~,
  187. X
  188. X# Added back_tab keystroke, <Del> as kdch1
  189. X#  Use either <Alt> or <Amiga> modifier key to obtain KEY_BTAB (kmap feature)
  190. Xamiga1|Amiga Unix console screen (pseudo-ansi),
  191. X    km, am, xenl,
  192. X
  193. X    cols#80, lines#25,
  194. X
  195. X    bel=^G, cr=\r, ind=\2331;1M, ht=\t,
  196. X    cub=\233%p1%dD, cub1=\b,
  197. X    cud=\233%p1%dB, cud1=\n,
  198. X    cuf=\233%p1%dC, cuf1=\233C,
  199. X    cuu=\233%p1%dA, cuu1=\233A,
  200. X    cup=\233%i%p1%d;%p2%dH,
  201. X    home=\233H, ed=\233J, el=\233K, clear=\233H\233J,
  202. X    smcup=\E[<, rmcup=\E[>,
  203. X
  204. X    ich1=\233@, ich=\233%p1%d@,
  205. X    dch1=\233P,
  206. X    il1=\233L, il=\233%p1%dL,
  207. X    dl1=\233M, dl=\233%p1%dM,
  208. X
  209. X    smso=\2337m, rmso=\233m,
  210. X    bold=\2331m,
  211. X    rev=\2337m,
  212. X    sgr=\233%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m%?%p9%t^N%e^O%;,
  213. X    sgr0=\2330m,
  214. X    acsc=``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
  215. X    rmacs=^O, smacs=^N,
  216. X
  217. X# half-line down and half-line up (for [nt]roff)
  218. X    hd=\2334b, hu=\2334a,
  219. X# enable subscript, enable superscript
  220. X    ssubm=\2334b, ssupm=\2334a,
  221. X
  222. X# mcud1, mcuu1, mcuf1, mcub1 for micro-movements
  223. X    mcub1=\233d, mcuf1=\233c, mcuu1=\233a, mcud1=\233b,
  224. X    mcub=\233%p1%dd, mcuf=\233%p1%dc, mcuu=\233%p1%da, mcud=\233%p1%db,
  225. X
  226. X# I'm going to add these too pretty soon!!
  227. X# swidm == enable doublewide mode, rwidm == disable doublewide mode
  228. X# smul == enable underline mode, rmul == disable underline mode
  229. X
  230. X# The keypad controls are smkx and rmkx
  231. X    smkx=\233<, rmkx=\233>,
  232. X
  233. X    khlp=\233?0~, kHLP=\233?1~, kcbt=\211,
  234. X    kbs=\b, kcub1=\233D, kcuf1=\233C, kcuu1=\233A, kcud1=\233B,
  235. X    kf1=\2330~, kf2=\2331~, kf3=\2332~, kf4=\2333~, kf5=\2334~,
  236. X    kf6=\2335~, kf7=\2336~, kf8=\2337~, kf9=\2338~, kf10=\2339~,
  237. X    kf11=\23310~, kf12=\23311~, kf13=\23312~, kf14=\23313~, kf15=\23314~,
  238. X    kf16=\23315~, kf17=\23316~, kf18=\23317~, kf19=\23318~, kf20=\23319~,
  239. X    kb2=\233Ou, kpp=\233Oy, knp=\233Os, khome=\233Ow,
  240. X    kend=\233Oq, kent=\233\n, kdch1=\233OM, kich1=\233Op,
  241. X    knxt=\233Ol, kprv=\233On,
  242. SHAR_EOF
  243. $TOUCH -am 0831212592 amiga.ti &&
  244. chmod 0644 amiga.ti ||
  245. echo "restore of amiga.ti failed"
  246. set `wc -c amiga.ti`;Wc_c=$1
  247. if test "$Wc_c" != "4053"; then
  248.     echo original size 4053, current size $Wc_c
  249. fi
  250. # ============= patches ==============
  251. echo "x - extracting patches (Text)"
  252. sed 's/^X//' << 'SHAR_EOF' > patches &&
  253. X*** /mnt/usr/sys/amiga/console/c0.c    Thu Jan  1 00:00:00 1970
  254. X--- c0.c    Tue Aug  4 00:38:02 1992
  255. X***************
  256. X*** 17,23 ****
  257. X  #include "sys/inline.h"
  258. X  #include "sys/systm.h"
  259. X  #include "sys/cred.h"
  260. X! #include "amigahr.h"
  261. X  #include "memory.h"
  262. X  #include "screen.h"
  263. X  #include "console.h"
  264. X--- 17,23 ----
  265. X  #include "sys/inline.h"
  266. X  #include "sys/systm.h"
  267. X  #include "sys/cred.h"
  268. X! /* #include "amigahr.h" /* */
  269. X  #include "memory.h"
  270. X  #include "screen.h"
  271. X  #include "console.h"
  272. X***************
  273. X*** 229,236 ****
  274. X      }
  275. X  }
  276. X  
  277. X- 
  278. X  int console_modes = 0;
  279. X  /* Initialize a console unit, making it ready for display */
  280. X  static int consinit(cp)
  281. X  register struct console *cp;
  282. X--- 229,236 ----
  283. X      }
  284. X  }
  285. X  
  286. X  int console_modes = 0;
  287. X+ 
  288. X  /* Initialize a console unit, making it ready for display */
  289. X  static int consinit(cp)
  290. X  register struct console *cp;
  291. X***************
  292. X*** 241,247 ****
  293. X      if (!coinitflag)
  294. X      coinit();
  295. X  
  296. X!     if (!(sp = cp->screen) && !(sp = OpenScreen()))
  297. X      return ENOCSI;
  298. X  
  299. X      cp->screen = sp;
  300. X--- 241,247 ----
  301. X      if (!coinitflag)
  302. X      coinit();
  303. X  
  304. X!     if (!(sp = cp->screen) && !(sp = OpenScreen(cp)))
  305. X      return ENOCSI;
  306. X  
  307. X      cp->screen = sp;
  308. X***************
  309. X*** 371,377 ****
  310. X      oldpri = splscr();
  311. X      if (!(cp->flags & CF_OPEN))
  312. X      {
  313. X!     if (!cp->screen && !(cp->screen = OpenScreen()))
  314. X      {
  315. X          splx(oldpri);
  316. X          return EAGAIN;
  317. X--- 371,377 ----
  318. X      oldpri = splscr();
  319. X      if (!(cp->flags & CF_OPEN))
  320. X      {
  321. X!     if (!cp->screen && !(cp->screen = OpenScreen(cp)))
  322. X      {
  323. X          splx(oldpri);
  324. X          return EAGAIN;
  325. X*** /mnt/usr/sys/amiga/console/c1.c    Thu Jan  1 00:00:00 1970
  326. X--- c1.c    Mon Aug 24 21:55:11 1992
  327. X***************
  328. X*** 36,45 ****
  329. X--- 36,74 ----
  330. X   *    CSI <N> c    move cursor right N pixels.
  331. X   *    CSI <N> d    move cursor left N pixels.
  332. X   *    CSI <R>;<C> h    move cursor to pixel (R,C)
  333. X+  *
  334. X+  *  Attempting to add these as well:
  335. X+  *    From the vt100-am (w/advanced video):
  336. X+  *    smkx=\E[<, rmkx=\E[>,    # enable/disable keypad xmit mode
  337. X+  *
  338. X+  *    This is how the keypad gets assigned.
  339. X+  *    PF1 (     PF2 )     PF3 /     PF4 *    # these change w/Shift
  340. X+  *    \EOP      \EOQ      \EOR      \EOS    # unshifted
  341. X+  *    \Eop      \Eoq      \Eor      \Eos    # shifted
  342. X+  *
  343. X+  *    7  home   8  up     9  PgUp   -
  344. X+  *    \EOw      \EOx      \EOy      \EOn
  345. X+  *
  346. X+  *    4  left   5         6  right  +
  347. X+  *    \EOt      \EOu      \EOv      \EOl
  348. X+  *
  349. X+  *    1  end    2  down   3  PgDn  E----E
  350. X+  *    \EOq      \EOr      \EOs     N \r N
  351. X+  *                     T    T
  352. X+  *    0................   .        E\E\rE
  353. X+  *    \EOp                \EOM     R----R
  354. X+  *
  355. X+  *    Still to do.
  356. X+  *    From the vt220 (8-bit terminal in 7-bit mode):
  357. X+  *    flash=\E[?5h$<200>\E[?5l,    # Use reverse video to flash the screen
  358. X+  *    mc4=\E[4i, mc5=\E[5i,        # enable/disable transparent print
  359. X+  *    sc=\E7, rc=\E8,            # save/restore cursor location
  360. X   */
  361. X  #include "sys/types.h"
  362. X  #include "sys/param.h"
  363. X  #include "sys/inline.h"
  364. X+ #include "sys/strlog.h"
  365. X+ #include "syslog.h"
  366. X  #include "bfinline.h"
  367. X  #include "amigahr.h"
  368. X  #include "screen.h"
  369. X***************
  370. X*** 87,93 ****
  371. X          copy_lines(),        /* copy pixel lines */
  372. X          moved();        /* move down */
  373. X  
  374. X- 
  375. X  /*
  376. X   * Draw places a character in the bitmap.
  377. X   */
  378. X--- 116,121 ----
  379. X***************
  380. X*** 98,106 ****
  381. X--- 126,141 ----
  382. X  {
  383. X      register struct screen *sp = cp->screen;
  384. X  
  385. X+     if (cp->c_keypad)
  386. X+     strlog(1, __LINE__, LOG_KERN|LOG_DEBUG, SL_TRACE,
  387. X+         "%c (0x%x)\n", cp->c_attr, cp->c_attr);
  388. X      scrcon_putch(sp->bmap, sp->col, sp->row, fp, ch, cp->c_attr);
  389. X  }
  390. X  
  391. X+ #define C_NORMAL    0
  392. X+ #define C_ESCAPE    1
  393. X+ #define C_CSI        2
  394. X+ #define C_MODE_SET    3
  395. X  
  396. X  /*
  397. X   * conput handles all terminal emulation.
  398. X***************
  399. X*** 126,132 ****
  400. X          /*
  401. X           * nothing happening
  402. X           */
  403. X!     case 0:
  404. X          cp->c_argc = cp->c_curarg = 0;
  405. X          cp->c_args[0] = 0;
  406. X  
  407. X--- 161,167 ----
  408. X          /*
  409. X           * nothing happening
  410. X           */
  411. X!     case C_NORMAL:
  412. X          cp->c_argc = cp->c_curarg = 0;
  413. X          cp->c_args[0] = 0;
  414. X  
  415. X***************
  416. X*** 180,189 ****
  417. X          cp->c_attr &= ~(1<<ATTR_FONT1);
  418. X          break;
  419. X          case 0x1b:            /* Escape ... */
  420. X!         cp->c_state = 1;
  421. X          break;
  422. X          case 0x9b:            /* CSI ... */
  423. X!         cp->c_state = 2;
  424. X          break;
  425. X          default:
  426. X          if (c & 0x60)
  427. X--- 215,224 ----
  428. X          cp->c_attr &= ~(1<<ATTR_FONT1);
  429. X          break;
  430. X          case 0x1b:            /* Escape ... */
  431. X!         cp->c_state = C_ESCAPE;
  432. X          break;
  433. X          case 0x9b:            /* CSI ... */
  434. X!         cp->c_state = C_CSI;
  435. X          break;
  436. X          default:
  437. X          if (c & 0x60)
  438. X***************
  439. X*** 218,231 ****
  440. X          /*
  441. X           * Escape seen.
  442. X           */
  443. X!     case 1:
  444. X          switch (c)
  445. X          {
  446. X          case '[':            /* Esc [ -> CSI */
  447. X!         cp->c_state = 2;
  448. X          break;
  449. X          default:            /* Esc weird -> ignore */
  450. X!         cp->c_state = 0;
  451. X          break;
  452. X          }
  453. X          break;
  454. X--- 253,266 ----
  455. X          /*
  456. X           * Escape seen.
  457. X           */
  458. X!     case C_ESCAPE:
  459. X          switch (c)
  460. X          {
  461. X          case '[':            /* Esc [ -> CSI */
  462. X!         cp->c_state = C_CSI;
  463. X          break;
  464. X          default:            /* Esc weird -> ignore */
  465. X!         cp->c_state = C_NORMAL;    /* VT52 emulation would start here */
  466. X          break;
  467. X          }
  468. X          break;
  469. X***************
  470. X*** 232,238 ****
  471. X          /*
  472. X           * CSI seen
  473. X           */
  474. X!     case 2:
  475. X          if (c & 0x40)
  476. X          {
  477. X          int N = (cp->c_argc > 0) ? cp->c_args[0] : 1;
  478. X--- 267,273 ----
  479. X          /*
  480. X           * CSI seen
  481. X           */
  482. X!     case C_CSI:
  483. X          if (c & 0x40)
  484. X          {
  485. X          int N = (cp->c_argc > 0) ? cp->c_args[0] : 1;
  486. X***************
  487. X*** 352,363 ****
  488. X          default:
  489. X              break;
  490. X          }
  491. X!         cp->c_state = 0;
  492. X          }
  493. X          else
  494. X          {
  495. X          switch (c)
  496. X          {
  497. X          case ';':
  498. X              if (cp->c_curarg < MAXARGS-1)
  499. X              cp->c_args[++cp->c_curarg] = 0;
  500. X--- 387,405 ----
  501. X          default:
  502. X              break;
  503. X          }
  504. X!         cp->c_state = C_NORMAL;
  505. X          }
  506. X          else
  507. X          {
  508. X          switch (c)
  509. X          {
  510. X+ #ifdef FJE_KEYPAD
  511. X+         case '<':    /* vt100 mode-setting sequence */
  512. X+         case '>':
  513. X+             cp->c_keypad = (c == '<');    /* False for NumericMode */
  514. X+             cp->c_state = C_NORMAL;    /* True for Application */
  515. X+             break;
  516. X+ #endif /* FJE_KEYPAD */
  517. X          case ';':
  518. X              if (cp->c_curarg < MAXARGS-1)
  519. X              cp->c_args[++cp->c_curarg] = 0;
  520. X***************
  521. X*** 379,385 ****
  522. X              cp->c_args[cp->c_curarg] += (c-'0');
  523. X              break;
  524. X          case 42:
  525. X!             cp->c_state = 0;
  526. X              if ((cp->c_argc>0) && (cp->c_args[0] == '*'))
  527. X              {
  528. X              int x=cp->flags;
  529. X--- 421,427 ----
  530. X              cp->c_args[cp->c_curarg] += (c-'0');
  531. X              break;
  532. X          case 42:
  533. X!             cp->c_state = C_NORMAL;
  534. X              if ((cp->c_argc>0) && (cp->c_args[0] == '*'))
  535. X              {
  536. X              int x=cp->flags;
  537. X***************
  538. X*** 743,752 ****
  539. X  {
  540. X      if (dstbit&7)
  541. X      {
  542. X!     unsigned char mask = 0xff << 8-(dstbit&7);
  543. X      if (nbits+(dstbit&7) < 8)
  544. X      {
  545. X!         mask |= 0xff >> (dstbit&7)+nbits;
  546. X          line[dstbit/8] &= mask;
  547. X          return;
  548. X      }
  549. X--- 785,794 ----
  550. X  {
  551. X      if (dstbit&7)
  552. X      {
  553. X!     unsigned char mask = 0xff << (8-(dstbit&7));
  554. X      if (nbits+(dstbit&7) < 8)
  555. X      {
  556. X!         mask |= 0xff >> ((dstbit&7)+nbits);
  557. X          line[dstbit/8] &= mask;
  558. X          return;
  559. X      }
  560. X*** /mnt/usr/sys/amiga/console/console.h    Thu Jan  1 00:00:00 1970
  561. X--- console.h    Mon Aug 24 21:33:51 1992
  562. X***************
  563. X*** 11,16 ****
  564. X--- 11,19 ----
  565. X  struct console
  566. X  {
  567. X      unsigned short flags;
  568. X+ #ifdef FJE_KEYPAD
  569. X+ # define c_keypad   pad0    /* Keypad mode Numeric or Application? */
  570. X+ #endif /* FJE_KEYPAD */
  571. X      unsigned short pad0;
  572. X      struct strtty *tty;            /* Streams tty structure */
  573. X      struct screen *screen;        /* Screen structure */
  574. X*** /mnt/usr/sys/amiga/console/scrdev.c    Thu Jan  1 00:00:00 1970
  575. X--- scrdev.c    Tue Aug  4 00:38:17 1992
  576. X***************
  577. X*** 256,262 ****
  578. X      {
  579. X      dp->ielist = (struct inputevent *)
  580. X          AllocMem(NIEVENT * sizeof (struct inputevent), 0);
  581. X!     if (!dp || !(sp = OpenScreen()))
  582. X          return ENOSPC;
  583. X      dp->screen = sp;
  584. X      sp->user = (void *)dp;
  585. X--- 256,262 ----
  586. X      {
  587. X      dp->ielist = (struct inputevent *)
  588. X          AllocMem(NIEVENT * sizeof (struct inputevent), 0);
  589. X!     if (!dp || !(sp = OpenScreen(NULL)))
  590. X          return ENOSPC;
  591. X      dp->screen = sp;
  592. X      sp->user = (void *)dp;
  593. X***************
  594. X*** 340,346 ****
  595. X  struct uio *uiop;
  596. X  struct cred *cr;
  597. X  {
  598. X-     register struct scrdev *dp = &scrdev[getminor(dev)];
  599. X      return ENOSPC;
  600. X  }
  601. X  
  602. X--- 340,345 ----
  603. X*** /mnt/usr/sys/amiga/console/screen.c    Thu Jan  1 00:00:00 1970
  604. X--- screen.c    Thu Aug  6 22:33:12 1992
  605. X***************
  606. X*** 8,13 ****
  607. X--- 8,16 ----
  608. X  #include "screen.h"
  609. X  #include "copper.h"
  610. X  
  611. X+ #ifdef FJE_KEYPAD
  612. X+ # include "console.h"
  613. X+ #endif /* FJE_KEYPAD */
  614. X  
  615. X  static void fixstate(), repeat(), dokb();
  616. X  
  617. X***************
  618. X*** 201,207 ****
  619. X  
  620. X      /* Mouse buttons */
  621. X      {
  622. X!     register unsigned char cur_buttons=0, diff;
  623. X      register int i;
  624. X  
  625. X      if (!(ACIAA->pra & 1<<6))
  626. X--- 204,210 ----
  627. X  
  628. X      /* Mouse buttons */
  629. X      {
  630. X!     register unsigned char cur_buttons=0, diff, btn_down;
  631. X      register int i;
  632. X  
  633. X      if (!(ACIAA->pra & 1<<6))
  634. X***************
  635. X*** 213,223 ****
  636. X  
  637. X      if (diff = (cur_buttons^mousebuttons))
  638. X      {
  639. X!         keystates[15] = (keystates[15] & ~(7<<4)) | (cur_buttons<<4);
  640. X!         for ( i=0 ; i<3 ; ++i )
  641. X!         if (diff & 1<<i)
  642. X!             dokb((0x7c+i) | (cur_buttons & (1<<i) ? 0 : 0x80), 0);
  643. X!         mousebuttons = cur_buttons;
  644. X      }
  645. X      }
  646. X  
  647. X--- 216,240 ----
  648. X  
  649. X      if (diff = (cur_buttons^mousebuttons))
  650. X      {
  651. X!         static unsigned char count;
  652. X! 
  653. X!         if (count++ > 3) {
  654. X!         count = 0;
  655. X! 
  656. X!         btn_down = cur_buttons;
  657. X!         if (cur_buttons==(MB_0|MB_2) || mousebuttons==(MB_0|MB_2)) {
  658. X!             diff = MB_1;
  659. X!             if (cur_buttons == (MB_0|MB_2))
  660. X!             btn_down = MB_1;
  661. X!             else
  662. X!             btn_down = 0, cur_buttons = 0;
  663. X!         }
  664. X!         keystates[15] = (keystates[15] & ~(7<<4)) | (btn_down<<4);
  665. X!         for ( i=0 ; i<3 ; ++i )
  666. X!             if (diff & 1<<i)
  667. X!             dokb((0x7c+i) | (btn_down & (1<<i) ? 0 : 0x80), 0);
  668. X!         mousebuttons = cur_buttons;
  669. X!         }
  670. X      }
  671. X      }
  672. X  
  673. X***************
  674. X*** 326,332 ****
  675. X  }
  676. X  
  677. X  
  678. X! struct screen *OpenScreen()
  679. X  {
  680. X      register struct screen *sp;
  681. X      int s=splscr();
  682. X--- 343,349 ----
  683. X  }
  684. X  
  685. X  
  686. X! struct screen *OpenScreen(struct console *cp)
  687. X  {
  688. X      register struct screen *sp;
  689. X      int s=splscr();
  690. X***************
  691. X*** 338,344 ****
  692. X      if (!(sp->flags & Sf_INUSE))
  693. X      {
  694. X          bzero((char *)sp, sizeof (struct screen));
  695. X!         sp->flags = Sf_INUSE|Sf_NEEDCOP;
  696. X          SCREENCHANGE;
  697. X          splx(s);
  698. X          return sp;
  699. X--- 355,364 ----
  700. X      if (!(sp->flags & Sf_INUSE))
  701. X      {
  702. X          bzero((char *)sp, sizeof (struct screen));
  703. X! #ifdef FJE_KEYPAD
  704. X!         sp->console = cp;
  705. X! #endif /* FJE_KEYPAD */
  706. X!         sp->flags = Sf_INUSE | Sf_NEEDCOP;
  707. X          SCREENCHANGE;
  708. X          splx(s);
  709. X          return sp;
  710. X***************
  711. X*** 742,748 ****
  712. X      }
  713. X  }
  714. X  
  715. X- 
  716. X  static int encode(kmap, keyent, sp, repeatflag)
  717. X  struct keymap *kmap;
  718. X  struct keyent keyent;
  719. X--- 762,767 ----
  720. X***************
  721. X*** 829,834 ****
  722. X--- 848,862 ----
  723. X      }
  724. X  }
  725. X  
  726. X+ static unsigned char KeyPadTable[] = {
  727. X+     0,
  728. X+     0x5A, 0x5B, 0x5C, 0x5D, /* Rawcodes for the numeric keypad */
  729. X+     0x3D, 0x3E, 0x3F, 0x4A,
  730. X+     0x2D, 0x2E, 0x2F, 0x5E,
  731. X+     0x1D, 0x1E, 0x1F, 0x43,
  732. X+     0x0F,       0x3C,
  733. X+     0,
  734. X+ };
  735. X  
  736. X  /*
  737. X   * Dispatch a keyboard character.
  738. X***************
  739. X*** 837,842 ****
  740. X--- 865,871 ----
  741. X  unsigned char rawcode;            /* Raw command from kbd */
  742. X  int repeatflag;                /* NZ iff this is a repeat */
  743. X  {
  744. X+     register unsigned char *kpt = KeyPadTable;
  745. X      register struct keymap *kmap;
  746. X      struct screen *sp;
  747. X      unsigned char c = rawcode & 0x7f;
  748. X***************
  749. X*** 880,908 ****
  750. X      unsigned int mask;
  751. X  
  752. X      for ( mask=1, i=0 ; i<16 ; ++i, mask<<=1 )
  753. X!         for ( j=0 ; j<4 ; ++j )
  754. X!         {
  755. X          k = kmap->km_shiftkeys[i][j];
  756. X          if (k>127)
  757. X              break;
  758. X!         if (k == c)
  759. X!         {
  760. X!             if (rawcode&0x80)
  761. X!             {
  762. X              keyboardstate &= ~mask;
  763. X!             for ( j=0 ; j<4 ; ++j )
  764. X!             {
  765. X                  k = kmap->km_shiftkeys[i][j];
  766. X                  if (k>127)
  767. X                  break;
  768. X!                 if (keystates[k>>3] & 1<<(k&7))
  769. X!                 {
  770. X                  keyboardstate |= mask;
  771. X                  break;
  772. X                  }
  773. X              }
  774. X!             }
  775. X!             else
  776. X              keyboardstate |= mask;
  777. X              break;
  778. X          }
  779. X--- 909,931 ----
  780. X      unsigned int mask;
  781. X  
  782. X      for ( mask=1, i=0 ; i<16 ; ++i, mask<<=1 )
  783. X!         for ( j=0 ; j<4 ; ++j ) {
  784. X          k = kmap->km_shiftkeys[i][j];
  785. X          if (k>127)
  786. X              break;
  787. X!         if (k == c) {
  788. X!             if (rawcode&0x80) {
  789. X              keyboardstate &= ~mask;
  790. X!             for ( j=0 ; j<4 ; ++j ) {
  791. X                  k = kmap->km_shiftkeys[i][j];
  792. X                  if (k>127)
  793. X                  break;
  794. X!                 if (keystates[k>>3] & 1<<(k&7)) {
  795. X                  keyboardstate |= mask;
  796. X                  break;
  797. X                  }
  798. X              }
  799. X!             } else
  800. X              keyboardstate |= mask;
  801. X              break;
  802. X          }
  803. X***************
  804. X*** 909,914 ****
  805. X--- 932,946 ----
  806. X          }
  807. X      }
  808. X  
  809. X+ #ifdef FJE_KEYPAD
  810. X+     if (sp->console && sp->console->c_keypad && !(rawcode & 0x80)) {
  811. X+     while (*++kpt)
  812. X+         if (*kpt == rawcode) {
  813. X+         keyboardstate |= 0x0220; /* Pretend RightAlt key is down */
  814. X+         break;
  815. X+         }
  816. X+     }
  817. X+ #endif /* FJE_KEYPAD */
  818. X      switch (encode(kmap,
  819. X             kmap->km_toptable[rawcode],
  820. X             sp, repeatflag))
  821. X***************
  822. X*** 929,934 ****
  823. X--- 961,970 ----
  824. X                  repeatflag?REPTRATE:REPTDELAY);
  825. X      }
  826. X      }
  827. X+ #ifdef FJE_KEYPAD
  828. X+     if (*kpt)
  829. X+     fixstate(sp);
  830. X+ #endif /* FJE_KEYPAD */
  831. X  }
  832. X  
  833. X  
  834. X*** /mnt/usr/sys/amiga/console/screen.h    Thu Jan  1 00:00:00 1970
  835. X--- screen.h    Mon Aug 24 21:33:51 1992
  836. X***************
  837. X*** 87,92 ****
  838. X--- 87,119 ----
  839. X      /* unsigned char km_tablearea[0]; */    /* Lower tables begin here */
  840. X  };
  841. X  
  842. X+ /***
  843. X+  *  keymap.km_shiftkeys[][] is used to determine a bit position for
  844. X+  *  each of the shift-able modifier keys, ie. Alt, Amiga, Control, etc.
  845. X+  *
  846. X+  *  There are 16 entries/bit positions in the mask, just as the first
  847. X+  *  dimension on km_shiftkeys is 16.
  848. X+  *
  849. X+  *  Each bit can be enabled by various combinations; for instance, the
  850. X+  *  LeftShift key is bit0, the RightShift key is bit1, and both of them
  851. X+  *  at the same time would be bit0|bit1|bit8 since bit8 represents both
  852. X+  *  at once.
  853. X+  *
  854. X+  *  Here are the bit positions as determined from usa0.kmap.s:
  855. X+  *
  856. X+  *    15 ----------------- 8   7 ------------------ 0
  857. X+  *    x  x  x  x  x  x  x  x   x  x  x  x  x  x  x  x
  858. X+  *      |  |  |  |  |  |  |  |   |  |  |  |  |  |  |  |
  859. X+  *      |  |  |  |  |  |  | Shft |  |  |  |  |  |  |  LSh
  860. X+  *      |  |  |  |  |  | Alt     |  |  |  |  |  |  RSh
  861. X+  *      |  |  |  |  | Ami        |  |  |  |  |  CLk
  862. X+  *      |  |  |  |Shft           |  |  |  |  Ctl
  863. X+  *      |  |  |Meta              |  |  |  LAlt
  864. X+  *      |  |  |                  |  |  RAlt
  865. X+  *       \ | /                   |  LAmi
  866. X+  *       Unused                  RAmi
  867. X+  */
  868. X+ 
  869. X  /* keymap.km_magic */
  870. X  #define KM_MAGIC 0x2a4b
  871. X  
  872. X***************
  873. X*** 228,233 ****
  874. X--- 255,263 ----
  875. X      struct keymap *kmap;            /* Keyboard map */
  876. X      struct font *font[4];            /* Pointers to current fonts */
  877. X      char name[SCRNAMESIZE];            /* Descriptive name */
  878. X+ #ifdef FJE_KEYPAD
  879. X+     struct console *console;            /* If console, holds &parent */
  880. X+ #endif /* FJE_KEYPAD */
  881. X  };
  882. X  
  883. X  /* screen.flags */
  884. SHAR_EOF
  885. $TOUCH -am 0831203492 patches &&
  886. chmod 0644 patches ||
  887. echo "restore of patches failed"
  888. set `wc -c patches`;Wc_c=$1
  889. if test "$Wc_c" != "14824"; then
  890.     echo original size 14824, current size $Wc_c
  891. fi
  892. # ============= keymap ==============
  893. echo "x - extracting keymap (Binary)"
  894. sed 's/^X//' << 'SHAR_EOF' | uudecode &&
  895. Xbegin 600 keymap
  896. XM*DL`````#Y1@____8?___V+___]C____9/___V7___]F____9____V!A__]D
  897. XM9?__9F?__V!A8O]D96;_________________8``%`&``!21@``5(8``%;&``
  898. XM!9!@``6T8``%V&``!?Q@``8@8``&1&``!FA@``:,8``&L&``!M1P````8``&
  899. XM^&``!PA@``<L8``'4&``!W1@``>88``'O&``!^!@``@$8``(*&``"$Q@``AP
  900. XM8``(E'````!@``BX8``(R&``"-A@``CH8``)#&``"3!@``E48``)>&``"9Q@
  901. XM``G`8``)Y&``"@A@``HL8``*4'````!P````8``*=&``"H1@``J4<````&``
  902. XM"J1@``K(8``*[&``"Q!@``LT8``+6&``"WQ@``N@8``+Q&``"^AP````8``,
  903. XM#&``#!Q@``PL8``,/&``#$Q@``Q88``,8&``#&Q@``Q\8``,B&``#)1P````
  904. XM<````'````!@``R@<````&``#+!@``S48``,^&``#1Q@``[,8``.X&``#O1@
  905. XM``\(8``/'&``#S!@``]$8``/6&``#VQ@``^`8``.,&``#DQ@``YH8``.A&``
  906. XM#J!@``ZP<````'````!P````<````'````!P````<````'````!P````<```
  907. XM`'````!P````<````'````!P````<````'````!P````<````'````!P````
  908. XM<````'````!P````<````'````!P````<````'````!P````<````'````!P
  909. XM````<````'````!P````<````'````!P````<````'````!P````<````'``
  910. XM``!P````<````'````!P````<````'````!P````<````'````!P````<```
  911. XM`'````!P````<````'````!P````<````'````!P````<````'````!P````
  912. XM<````'````!P````<````'````!P````<````'````!P````<````'````!P
  913. XM````<````'````!P````<````'````!P````<````'````!P````<````'``
  914. XM``!P````<````'````!P````<````'````!P````<````'````!P````<```
  915. XM`'````!P````<````'````!P````<````'````!P````<````'````!P````
  916. XM<````'````!P````<````'````!P````<````'````!P````<````'````!P
  917. XM````<````'````!P````<````'````!P````<````'````!P````<````'``
  918. XM``!P````<````'````!P````<````'````!P````<````'````!P````<```
  919. XM`'````!P````<````'````!P````<````'````!P````<````'````!P````
  920. XM<````'````!P````<`````````````$``````````@`````````#`````@``
  921. XM``$```````````@````````!"`````@```$``````````@@````(```"````
  922. XM``````,(```""````0@````(```#`````@````$`````````"``````````*
  923. XM`````@````@`````````"`@````(```(``````````H(```""```"`@````(
  924. XM```*`````@````@```````````````24````G@```(`````>`````````/X`
  925. XM``#@````?@```&````24````@0```)$````!````$0```*$```"Q````(0``
  926. XM`#$```24````@````)(`````````$@```,````"R````0````#(```24````
  927. XM@P```),````#````$P```*,```"S````(P```#,```24````A````)0````$
  928. XM````%````*0```"T````)````#0```24````A0```)4````%````%0```*4`
  929. XM``"U````)0```#4```24````G@```)8````>````%@```-X```"V````7@``
  930. XM`#8```24````A@```)<````&````%P```*8```"W````)@```#<```24````
  931. XMB@```)@````*````&````*H```"X````*@```#@```24````B````)D````(
  932. XM````&0```*@```"Y````*````#D```24````B0```)`````)````$````*D`
  933. XM``"P````*0```#````24````GP```(T````?````#0```-\```"M````7P``
  934. XM`"T```24````BP```)T````+````'0```*L```"]````*P```#T```24````
  935. XMG````)P````<````'````/P```#<````?````%P```14$``'!````#`#FT]P
  936. XM```$W````)$```"1````$0```!$```#1````\0```%$```!Q```$W````)<`
  937. XM``"7````%P```!<```#7````]P```%<```!W```$W````(4```"%````!0``
  938. XM``4```#%````Y0```$4```!E```$W````)(```"2````$@```!(```#2````
  939. XM\@```%(```!R```$W````)0```"4````%````!0```#4````]````%0```!T
  940. XM```$W````)D```"9````&0```!D```#9````^0```%D```!Y```$W````)4`
  941. XM``"5````%0```!4```#5````]0```%4```!U```$W````(D```")````"0``
  942. XM``D```#)````Z0```$D```!I```$W````(\```"/````#P````\```#/````
  943. XM[P```$\```!O```$W````)````"0````$````!````#0````\````%````!P
  944. XM```$E````)L```";````&P```!L```#[````VP```'L```!;```$E````)T`
  945. XM``"=````'0```!T```#]````W0```'T```!=```$5!``",0````Q`YM/<0``
  946. XM!%00``C4````,@.;3W(```14$``(Y````#,#FT]S```$W````($```"!````
  947. XM`0````$```#!````X0```$$```!A```$W````),```"3````$P```!,```#3
  948. XM````\P```%,```!S```$W````(0```"$````!`````0```#$````Y````$0`
  949. XM``!D```$W````(8```"&````!@````8```#&````Y@```$8```!F```$W```
  950. XM`(<```"'````!P````<```#'````YP```$<```!G```$W````(@```"(````
  951. XM"`````@```#(````Z````$@```!H```$W````(H```"*````"@````H```#*
  952. XM````Z@```$H```!J```$W````(L```"+````"P````L```#+````ZP```$L`
  953. XM``!K```$W````(P```",````#`````P```#,````[````$P```!L```$E```
  954. XM`)H```";````&@```!L```"Z````NP```#H````[```$E````((```"'````
  955. XM`@````<```"B````IP```"(````G```$5!``"H`````T`YM/=```!%00``J0
  956. XM````-0.;3W4```14$``*H````#8#FT]V```$W````)H```":````&@```!H`
  957. XM``#:````^@```%H```!Z```$W````)@```"8````&````!@```#8````^```
  958. XM`%@```!X```$W````(,```"#`````P````,```##````XP```$,```!C```$
  959. XMW````)8```"6````%@```!8```#6````]@```%8```!V```$W````((```""
  960. XM`````@````(```#"````X@```$(```!B```$W````(X```".````#@````X`
  961. XM``#.````[@```$X```!N```$W````(T```"-````#0````T```#-````[0``
  962. XM`$T```!M```$E````)P```",````'`````P```"\````K````#P````L```$
  963. XME````)X```".````'@````X```"^````K@```#X````N```$E````)\```"/
  964. XM````'P````\```"_````KP```#\````O```$5!``#!@````N`YM/30``!%00
  965. XM``PH````-P.;3W<```14$``,.````#@#FT]X```$5!``#$@````Y`YM/>0``
  966. XM!%0```"@````(```!$@````(```$3````(D````)```$5!``#'@````-`IL*
  967. XM````!&P!```*`0``#0``!%0!``";`0``&P``!$P```#_````?P``!%00``RL
  968. XM````+0.;3VX```1T$``,T!``#,P0``S($``,Q`*;00`"FU,``IM7``*;4P``
  969. XM``1T$``,]!``#/`0``SL$``,Z`*;0@`"FU0``IM8``*;5`````1T$``-&!``
  970. XM#100``T0$``-#`*;0P`"FU4``IM9``*;50````1T$``-/!``#3@0``TT$``-
  971. XM,`*;1``"FU8``IM:``*;5@````1,$``-4!``#4P#FS!^!)LQ,'X```````1,
  972. XM$``-:!``#60#FS%^!)LQ,7X```````1,$``-@!``#7P#FS)^!)LQ,GX`````
  973. XM``1,$``-F!``#90#FS-^!)LQ,WX```````1,$``-L!``#:P#FS1^!)LQ-'X`
  974. XM``````1,$``-R!``#<0#FS5^!)LQ-7X```````1,$``-X!``#=P#FS9^!)LQ
  975. XM-GX```````1,$``-^!``#?0#FS=^!)LQ-WX```````1,$``.$!``#@P#FSA^
  976. XM!)LQ.'X```````1,$``.*!``#B0#FSE^!)LQ.7X```````1<$``.2!``#D0`
  977. XM```H````/0.;3U`#FV]P```$7!``#F00``Y@````*0```#T#FT]1`YMO<0``
  978. XM!%P0``Z`$``.?````%P````O`YM/4@.;;W(```1<$``.G!``#I@````J````
  979. XM*@.;3U,#FV]S```$5!``#JP````K`YM/;```!$P1``[$$0`.O`2;/S!^````
  980. XM!)L_,7X```````14<````&``#4``````````````!%1P````8``-6```````
  981. XM```````$5'````!@``UP``````````````14<````&``#8@`````````````
  982. XM!%1P````8``-H``````````````$5'````!@``VX``````````````14<```
  983. XM`&``#=``````````````!%1P````8``-Z``````````````$5'````!@``X`
  984. X<``````````````14<````&``#A@`````````````
  985. X`
  986. Xend
  987. SHAR_EOF
  988. $TOUCH -am 0831210792 keymap &&
  989. chmod 0644 keymap ||
  990. echo "restore of keymap failed"
  991. set `wc -c keymap`;Wc_c=$1
  992. if test "$Wc_c" != "3988"; then
  993.     echo original size 3988, current size $Wc_c
  994. fi
  995. exit 0
  996. --
  997. "Have a Nice Day."
  998. --
  999. Frank "Crash" Edwards            King Marine Electronics, Inc.
  1000. Home: 813/786-3675               Work: 813/530-3411
  1001.     Finish the sentence below in 25 words or less:
  1002.         "Love is what you feel just before you give someone a good..."
  1003.     Mail your answer along with the top half of your supervisor to:
  1004.         Love is...
  1005.         P.O. Box 35
  1006.         Baffled Greek, Michigan 69069
  1007. -- 
  1008. Frank "Crash" Edwards            King Marine Electronics, Inc.
  1009. Home: 813/786-3675               Work: 813/530-3411
  1010.  
  1011.     Finish the sentence below in 25 words or less:
  1012.         "Love is what you feel just before you give someone a good..."
  1013.     Mail your answer along with the top half of your supervisor to:
  1014.         Love is...
  1015.         P.O. Box 35
  1016.         Baffled Greek, Michigan 69069
  1017.