A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
1
2 * * * * * * * * * * * * * * *
3 * *
4 * S P E C T E M U *
5 * *
6 * Version 0.94 *
7 * *
8 * * * * * * * * * * * * * * *
9
10
11This package contains a 48k ZX-Spectrum emulator for Linux and other
12UNIX operating systems, with full Z80 instruction set, comprehensive
13screen, sound and tape emulation, and snapshot file saving and
14loading. It can run on a Linux console, or in an X11 window.
15
16The program is free software and is copyrighted under the GNU General
17Public License. It comes with absolutely no warranty. See the file
18COPYING for details.
19
20Written by Miklos Szeredi
21Email: mszeredi@inf.bme.hu
22
23It can be downloaded by FTP from:
24 tsx-11.mit.edu:/pub/linux/ALPHA/spectemu/spectemu-0.94.tar.gz
25or
26 sunsite.unc.edu:/pub/Linux/system/emulators/zx/spectemu-0.94.tar.gz
27
28For news and updates have a look at the Spectemu Page:
29 http://www.inf.bme.hu/~mszeredi/spectemu/
30
31
32You can also join a mailing list (at the Spectemu Page), to receive a
33notice when new versions of spectemu are available.
34
35
36Table of contents
37=================
38
39 1. Requirements
40
41 2. Recommended
42
43 3. Features
44
45 4. Drawbacks
46
47 5. Compiling and installation
48
49 6. Using the emulator
50
51 6.1 Command line arguments and configuration files (NEW)
52
53 6.2 Using the Spectrum keyboard
54
55 6.3 Keys that control the emulator
56
57 6.4 Effects of changing frame frequency and sound buffer size
58
59 7. Where can I get ZX Spectrum games for this emulator
60
61 8. Tape files
62
63 8.1 Loading a tape file
64
65 8.2 Quick loading of tape files
66
67 8.3 Saving to a tape file
68
69 8.4 Saving a tape file to real tape
70
71 8.5 Making a tape file from a real tape
72
73 9. Bug reports
74
75 10. Credits
76
77
781. Requirements
79===============
80
81Linux or other UNIX OS.
82Color X11 server (depths 8, 16 and 32 bits are supported)
83 and/or
84SVGALIB console graphics library on Linux.
85
862. Recommended
87==============
88
89A sound-card on Linux for wonderful spectrum 1-bit sound. And well, a
90fast enough processor... (Especially for the X11 version.)
91
923. Features
93===========
94
95 - Very fast because of assembly code in emulation (only on Intel
96 processors).
97
98 - Emulation also in C, which is slower, but supports any processor.
99
100 - X support (with MITSHM if available, optionally double size window)
101
102 - Linux console graphics (with SVGALIB)
103
104 - Sound support (through Linux kernel sound-card driver,
105 or SUN sound drivers)
106
107 - Snapshot saving and loading (.Z80 and .SNA format)
108
109 - Tape emulation: loading from tape files (.TAP and .TZX format)
110
111 - Optional quick loading of tapes.
112
113 - Saving to tape files.
114
115 - Separate utility to save tape files to real tape
116
117 - Configurable with config files and from command line
118
1194. Drawbacks
120============
121
122 - Poor user interface
123
124See the file TODO for a list of things which still need to be done (Maybe
125by YOU)
126
1275. Compiling and installation
128=============================
129
130To install the precompiled Linux executables just run 'make install'
131as root.
132
133To recompile the programs on other platforms first type
134
135 ./configure
136
137This tries to determine the system type and parameters. Probably you
138won't have to give any options to configure, but here is the list of
139the most important options:
140
141 --help Print a full list of options
142
143 --prefix=PREFIX Install files under PREFIX (default is /usr/local)
144 Executables go under PREFIX/bin, ...
145
146 --without-readline Do not use the readline library (default is to
147 use it if it's available on your system)
148
149 --without-i386asm Do not use the Intel assembly code (default is
150 to use it, if your system is Intel based)
151
152You may want to have a look at the produced `Makefile' and `config.h'.
153Then just type
154
155 make clean
156 make
157
158Then to install the program, login as root, and run
159
160 make install
161
162(If you want to compile on another machine be sure to `make realclean'
163before re-configuring and re-making the program!)
164
165At the moment, there are two executable programs for running the emulator:
166
167 xspect the X11 version
168 vgaspect the Linux console version
169
170'vgaspect' uses the SVGALIB library. If you do not have this installed
171on your system 'vgaspect' cannot be started. You _MUST_ have SVGALIB
172version 1.2.10 or greater installed, and it is STRONGLY recommended,
173that you get version 1.2.11 or later!
174
175SVGALIB is available at:
176sunsite.unc.edu:/pub/Linux/libs/graphics/
177
178If you have SVGALIB version 1.2.11 or later, the emulator can run in
179background when you switch virtual consoles.
180
1816. Using the emulator
182=====================
183
184After starting 'xspect' or 'vgaspect' you should get the '(C) 1982 Sinclair
185Research Ltd' message, and after pressing a key, the flashing cursor. If
186not, then all I can say, is hard luck to you (if you are ambitious, compile
187the programs with debug information, and try to figure out what is causing
188the problem). Do not start the emulator processes in the background, the
189terminal is needed when loading or saving files.
190
191To load a snapshot immediately after the start of the emulator, you
192can enter the name of the snapshot file on the command line. (Also see
193section 6.1)
194
195E.g.
196
197xspect snap/chuckie2
198
199In X you can resize the window. Window size can only be a multiple of
200the smallest window size (320x256). Smaller window means faster
201emulation, so if emulation doesn't run at full speed, try making the
202window smaller.
203
2046.1 Command line arguments and configuration files
205--------------------------------------------------
206
207You can give options to Spectemu in three different ways:
208
209 1) In a configuration file (either ~/.spectemurc, or
210 /usr/local/share/spectemu/spectemu.cfg)
211
212 2) With the X Resource Database (.Xdefaults), this applies only to 'xspect'
213
214 3) On the command line
215
216Most of the options are common to all three methods, only the syntax
217differs slightly. Here are examples of the different syntax:
218
219Config File:
220 scale = 1
221 private-map = true
222 sound = false
223 color-type = grayscale
224
225.Xdefaults:
226 xspect.scale: 1
227 xspect.privateMap: true
228 xspect.sound: false
229 xspect.colorType: grayscale
230
231Command line:
232 xspect -scale 1 -private-map -no-sound -color-type grayscale
233
234List of common options:
235~~~~~~~~~~~~~~~~~~~~~~~
236
237 NAME RANGE DEFAULT DESCRIPTION
238 ---- ----- ------- -----------
239
240 frame-skip 1... 2 The smaller this is, the more
241 often the screen is updatated
242
243 scale 1..4 2 Window size of 'xspect'
244
245 private-map yes/no no Use private colormap in 'xspect'
246
247 mit-shm yes/no yes Use MIT-SHM extension in X server
248 if available
249
250 vga-mode 320x200 320x240 Resolution to use in 'vgaspect',
251 320x240 320x200 is faster (but not so nice)
252
253 sound yes/no yes Spectrum sound, if availble
254
255 sound-delay 1... 4 The amount of frames (1/50 seconds)
256 to delay sound. See section 6.4
257
258 sound-device filename (system The name of the sound device
259 dependent)
260
261 sound-sample-rate 4000... ~15625 Sample rate of sound device
262
263 sound-autoclose yes/no yes Whether to close sound device when
264 unused (so other programs can use it)
265
266 sound-dsp-setfrag yes/no yes Set this to 'no' if you use PCSND
267 sound driver
268
269 keyboard-type extended extended Specifies the mapping of the keys,
270 spectrum from the PC keyboard to the spectrum
271 compat keys. See section 6.2
272 custom
273
274 cursor-type shifted shifted How to use the arrow keys on the
275 raw PC keyboard. See section 6.2
276 joystick
277
278 allow-ascii yes/no yes Interpret other keys on the PC
279 keyboard. See section 6.2
280
281 true-shift <modif>* alt Modifier to get shifted symbol
282 as on the PC.
283
284 func_shift <modif>* control Modifier to get control functions.
285
286 color-type normal normal What type of colors to use. Gray-
287 grayscale scale looks better on monochrome
288 custom displays.
289
290 pause-on-iconify yes/no no Whether to pause emulator, when it
291 is iconified ('xspect' only)
292
293 vga-pause-bg yes/no no Whether to pasue emulator, when you
294 switch to a different console
295
296 quick-load yes/no no Use built in (quick) loader for
297 tapefiles.
298
299 auto-stop yes/no no Pause tape after each segment when
300 quick loading.
301
302 load-immed yes/no no Load tapefile immediately (as if
303 you typed LOAD "" / ENTER)
304
305 pause yes/no no Pause the emulator on startup
306
307
308* <modif> can be one of: none, shift, lock, control, alt,
309 mod2, mod3, mod4, mod5
310
311Extra command line parameters:
312~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
313
314On the command line you may also use the following options:
315
316 -help Prints usage information, and a list of available
317 options
318
319 -version Prints out the version
320
321
322Also on the command line, a snapshot file and/or a tapefile can be
323specified. Spectemu figures out the type of file from the extension.
324You can omit the extension, e.g. you have a snapshot file 'snap.z80'
325and you start spectemu with 'xspect snap', then it will add the '.z80'
326extension.
327
328You can specify what type is the file by preceding it with one of
329'-z80', '-sna', '-tap' or '-tzx' options. This is useful for cases,
330when the filename does not have an extension (e.g. automatic starting
331with the midnight commander).
332
333Extra config file options:
334~~~~~~~~~~~~~~~~~~~~~~~~~~
335
336Color configuration
337'''''''''''''''''''
338You can configure the custom colors in the config files (and the X
339Resource Database) with:
340
341 color[0..15] = R G B
342
343e.g.
344
345 color-type = custom
346
347 color0 = 10 20 30
348 color7 = 40 50 60
349
350changes the 0-th (black) and the 7-th (white) colors.
351
352Keyboard configuration
353''''''''''''''''''''''
354You can set custom key bindings in the config file:
355
356 Key_<keysym_name> = K ...
357 ...
358
359Or in the X resource database:
360
361 xspect.keys: <keysym_name> = K ...; ...
362
363
364The <keysym_name> can be set to any keysym (defined in 'spkey_p.h').
365The K arguments are the spectrum keys to be assigned to the given PC
366key. K can be any letter, number (a..z, 0..9) or the following:
367
368 none, space, enter, capsshift, symbolshift,
369 kempston_up, kempston_down, kempston_left, kempston_right, kempston_fire
370
371e.g.
372
373 keyboard-type = custom
374 true-shift = none
375
376 Key_Insert = capsshift 9
377 Key_Tab = capsshift symbolshift
378 Key_Shift_R = kempston_fire
379 Key_Alt_L = symbolshift
380 Key_Alt_R = symbolshift
381
382or as it would appear in a .Xdefaults file:
383
384 xspect.keyboardType: custom
385 xspect.trueShift: none
386
387 xspect.keys: Insert = capsshift 9; \
388 Tab = capsshift symbolshift; \
389 Shift_R = kempston_fire; \
390 Alt_L = symbolshift; Alt_R = symbolshift
391
3926.2 Using the Spectrum keyboard
393-------------------------------
394
395Those of you that have at some time used a Spectrum know, that the keyboard
396of this little computer is something very strange, with a LOT of keywords
397and symbols on and around each key. If you have not seen this keyboard (or
398have somehow managed to forget some bit of information that is on it) we
399produced quite a good copy of it, found in the 'spectkey.gif' file.
400
401If you are using 'xspect' than pressing 'Ctrl-k' brings up the picture
402of the spectrum keyboard. You can press keys with the mouse (even more
403than one if you like), and it also shows which keys are pressed. (You
404can see what the emulator does when, for example you press 'BackSpace'
405or a '[' key on the PC keyboard).
406
407The default mapping of the spectrum's keyboard to the PC's is the
408following:
409
410The numbers, the letters, Enter and Space are the same. The left Shift on
411the PC corresponds to the CAPS SHIFT key of the Spectrum, and the right
412Shift corresponds to the SYMBOL SHIFT. This is quite simple and with these
413keys you can get all the functionality of the original Spectrum (assuming
414of course, you know how).
415
416But...
417
418To make life a bit easier, you can also use the Backspace, the arrow
419keys, and the following symbols as on a PC keyboard: ,./;'-=<>?:"_+[]{}\|~
420(unless you turn the 'allow-ascii' option off)
421
422To get a symbol which is written above the numbers on the PC, and not
423the function or symbol that is on the Spectrum, press Alt (actually
424the value of the 'true-shift' option) instead of Shift.
425
426You can slightly modify the mapping with the 'keyboard-type' and
427'cursor-type' options. Every mapping includes the basic keys (letters,
428numbers, Space and Enter). Here are the mappings special to each
429keyboard type and cursor type:
430
431 PC Key Spectrum Key
432 ------ ------------
433
434(Keyboard Types)
435
436extended: (default)
437 Left Shift -> Caps Shift
438 Right Shift -> Symbol Shift
439 Back Space -> Caps Shift + '0'
440 Escape -> Caps Shift + '1'
441
442spectrum: (spectrum-like layout, useful for some games, e.g. Jumping Jack)
443 < same as extended, plus: >
444 Comma (,) -> Symbol Shift
445 Period (.) -> Space
446 Semicolon (;) -> Enter
447
448compat: (similar to other emulators' layouts, e.g. Z80, X128, XZX ...)
449 Shift (both) -> Caps Shift
450 Alt -> Symbol Shift
451 Back Space -> Caps Shift + '0'
452 Escape -> Caps Shift + '1'
453
454custom:
455 Use key bindings specified in the config file (see section 6.1)
456
457(Cursor Types)
458
459shifted: (default)
460 Left Arrow -> Caps Shift + '5'
461 Down Arrow -> Caps Shift + '6'
462 Up Arrow -> Caps Shift + '7'
463 Right Arrow -> Caps Shift + '8'
464
465raw:
466 Left Arrow -> '5'
467 Down Arrow -> '6'
468 Up Arrow -> '7'
469 Right Arrow -> '8'
470
471
472joystick:
473 Left Arrow -> Kempston Left
474 Down Arrow -> Kempston Down
475 Up Arrow -> Kempston Up
476 Right Arrow -> Kempston Right
477 Keypad Ins -> Kempston Fire
478 Keypad Del -> Kempston Fire
479 Keypad Home -> Kempston Up + Left
480 Keypad PgUp -> Kempston Up + Right
481 Keypad End -> Kempston Down + Left
482 Keypad PgDn -> Kempston Down + Right
483
484
4856.3 Keys that control the emulator
486----------------------------------
487
488All control keys are produced by pressing the Ctrl key and another key.
489
490 Ctrl-c, F10 Quit the emulator immediately
491
492 Ctrl-l, F3 Load a snapshot file; you must type the path and
493 filename on the terminal where you started the emulator,
494 e.g. 'snap/chuckie2'. The type and extension of the
495 file is determined automatically (.z80 or .sna).
496
497 Ctrl-t, F2 Save the current state of the emulator in a snapshot file.
498 Format depends on the extension (.z80 or .sna). If no
499 extension is given, .z80 is appended.
500
501 Ctrl-w, Ctrl-F2 Save a snapshot to a temporary file
502
503 Ctrl-e, Ctrl-F3 Restore last temporary snapshot saved with 'Ctrl-w'
504
505 Ctrl-q, F5 Reset the Spectrum
506
507 Ctrl-f Fast mode
508
509 Ctrl-n Normal speed mode
510
511 Ctrl-b Pause/Unpause emulator (you can do operations like loading
512 a snapshot file, etc... in paused mode too)
513
514 Ctrl-m Toggle sound on/off
515
516 Ctrl-h, F1 Print help
517
518 Ctrl-k Display (undisplay) keyboard of spectrum. See section 6.2.
519
520 Ctrl-p, F4 Play tape. Tape file must be entered on the terminal.
521 Optionally the starting segment can be entered;
522 e.g. 'tape/tape1.tap' or 'tape/tape1.tzx 13'
523
524 Ctrl-s, F7 Stop tape
525
526 Ctrl-y Toggle quick loading
527
528 Ctrl-o, F6 Pause and unpause during tapefile playing (restarts the
529 current segment).
530
531 Ctrl-r Record to tape file. See section 8.3.
532
533 Ctrl-\, F9 Refresh screen, reset keyboard state and
534 refresh colors.
535
536 Ctrl-j Toggle private colormap mode (only X)
537
538 Ctrl-comma Decrease window size (only X)
539
540 Ctrl-dot Increase window size (only X)
541
542 Ctrl-equals Skip more screen frames
543
544 Ctrl-minus Skip less screen frames
545
546 Ctrl-] Increase sound buffer size
547
548 Ctrl-[ Decrease sound buffer size
549
550
5516.4 Effects of changing frame frequency and sound buffer size
552-------------------------------------------------------------
553
554ONLY READ THIS IF YOU ARE NOT TOTALLY SATISFIED WITH THE EMULATOR'S
555PERFORMANCE
556
557This should be totally automatic, so I'm now programming you to do what
558the emulator should. (Luckily you are much easier to program)
559
560Frame skipping determines, after how many frames the emulator displays one
561on the screen. There are 50 frames in one second, and normally every other
562frame is displayed (25 per second). If the emulator is too slow under X,
563increasing frame skipping can have a good effect on performance, but at the
564cost of poorer quality. But the interesting thing is, that increasing frame
565skipping may cause a worsening of both performance and of picture quality
566(I will not explain it here why).
567
568Decreasing frame skipping has the opposite effect of the above.
569
570If the emulator uses sound, but sound is not continuous, then experiment
571with increasing sound buffer size, and increasing frame skipping. If you
572are lucky you can make things a bit better. Increasing sound buffer size
573has also the negative effect of delaying more the sound effects.
574
5757. Where can I get ZX Spectrum games for this emulator
576======================================================
577
578On the Spectemu homepage (http://www.inf.bme.hu/~mszeredi/spectemu/)
579you can find a list of sites worth checking. Here are some:
580
581http://www.void.demon.nl/spectrum.html
582http://www.nvg.unit.no/sinclair/planet/
583
584The fact is, that there were a lot of Spectrum games around on audio tapes,
585and some of them are really good. There were always cracked and copyable
586versions around, and nobody was interested in copyrights. Unfortunately the
587big FTP archives do not allow non free software on their servers, so I
588can't include any games in this distribution.
589
590(Because Spectrums have died out, and perhaps some of the software
591companies do not exist any more, probably some games could be distributed
592freely. But I will not check on those things.)
593
594I've included a program named 'spconv', written by Henk de Groot
595(hegr@ensae.ericsson.se) which can convert between snapshot file formats.
596
597Alternatively if you have some old spectrum tapes laying around, and you
598are very brave, you can check out section 8.5.
599
6008. Tape files
601=============
602
6038.1 Loading a tape file
604-----------------------
605
606The emulator now supports G.A. Lunter's .TAP and Tomaz Kac's .TZX tape
607files. To load a file, enter
608
609LOAD ""
610
611to the spectrum (by pressing keys j""), then press 'Ctrl-p'.
612On the terminal enter the name of the tape file to load, e.g.
613
614tape/cnamemat
615
616The emulator will now load from the tape file 'tape/cnamemat.tzx' or
617'tape/cnamemat.tap' whichever exists. Playing automatically stops at
618the end of the tape file. To stop loading before this press Ctrl-s.
619
620The default extensions are '.tap' / '.tzx' or '.TAP' / '.TZX' depending
621on whether the entered tape file is upper or lower case.
622
623While loading try pressing Ctrl-f, which can speed things up. After loading
624the file press press Ctrl-n to restore normal speed.
625
6268.2 Quick loading of tape files
627-------------------------------
628
629Quick loading means bypassing of the tape loading routine in the
630spectrum ROM, and loading of tape blocks directly into the memory.
631Some programs use their own tape loading routines, and in that case
632the tape blocks are always "slow loaded" (see above section).
633
634Quick loading is optional and can be toggled with the 'Ctrl-y' key.
635
636When quick loading is on, after entering 'LOAD ""' you are immediately
637prompted for a tapefile. If the tapefile can't be loaded, the quick
638loading of the first header block is cancelled, but you can still load
639the rest of tape by pressing 'Ctrl-p' and entering the tapefile name.
640
641Even in quick load mode, the playing of tapes is not automatically
642paused, when the program doesn't load more blocks, so with '.tap'
643files containing multipart games, you have to pause the tape at the
644end of each part with 'Ctrl-o' ('.tzx' tapefiles can contain a
645"Stop the Tape" mark, to automatically pause playing).
646
6478.3 Saving to a tape file
648-------------------------
649
650If you want to save something to a tape file using the spectrum's "SAVE"
651command, do the following:
652
6531) Enter 'SAVE "file"' on the spectrum
6542) press Ctrl-r to start the recording
6553) on the terminal enter the name of the tapefile to use
6564) press a key on the spectrum
6575) wait for the recording to stop
6586) press Ctrl-s to stop recording
659
660If the specified tape file already exists, the newly saved segments are
661appended to the old tapefile.
662
663
6648.4 Saving a tape file to real tape
665-----------------------------------
666
667The utility 'tapeout' enables you to save tape files (.tap and .tzx)
668to real tape via the soundcard. At the moment it only works on Linux,
669because it uses the OSS sound driver. (You can compile it for non
670linux systems, by adding -DNO_SOUNDCARD to CFLAGS in Makefile. Then
671instead of writing to the sound device, the program writes to a
672headerless wav file (bits: 8, sample rate: what you've given).)
673
674You can compile 'tapeout' by entering
675
676 make tapeout
677
678in the main directory of spectemu. The command line parameters are:
679
680 tapeout sample_rate tapefile [start_block [output_file]]
681
682The default value for start_block is 0, for output_file it is "/dev/dsp"
683(or if compiled -DNO_SOUNDCARD it is "tape.out").
684
685You can stop recording to the tape by pressing Ctrl-C.
686
6878.5 Making a tape file from a real tape
688---------------------------------------
689
690WARNING, ONLY TRY THIS IF YOU REALLY-REALLY WANT TO!
691
692Well it's not so bad as that, I've digitized a lot Spectrum tapes with
693ease, but I have the advantage of having played with tapes a lot on the
694real Spectrum, and of being able to modify the code which does the
695digitization.
696
697First of all you must have a sound-card to do this. If you've got it, then
698you have a small chance of succeeding.
699
700First get the cassette player which you used to play Spectrum tapes. Then
701plug it in your sound-card's 'line-in' or 'mic' inputs. Then somehow set the
702sound driver so that it reads things form the input in which you plugged
703your cassette (I use 'xmmix' the 'Motif Audio Mixer' to do this). And if
704you've managed to get this far, go to the directory where you want to store
705the tape files (remember, there will be a lot of little files: one for each
706little segment!), and enter the following command:
707
708 recs - 32000 | filt | spload tapefile
709
710 or
711
712 recs - 32000 | spload tapefile
713
714(The first type worked better for me)
715
716Where 'recs', 'filt' and 'spload' are programs found in the utils
717directory, and 'tapefile' is the name of the tape file without the '.spt'
718extension.
719
720'.spt' tape files only exist because of historical reasons (the tape
721digitizing program preceeded the emulator, and also at that time I didn't
722know of the '.TAP' format), and now it isn't suppurted by the emulator
723any more. So you must convert '.spt' files to '.tap' with the utility
724spt2tap (in the utils directory) to use it with the emulator.
725
726(The contents of the utils directory can be remade by changing to that
727directory and entering the command: 'make realclean; make')
728
729Now you can put your favorite Spectrum cassette in the cassette player, and
730press the Play button.
731
732'spload' will write a lot of information on the terminal, of which you
733might try to make some sense. Also you can do a 'tail -f tapefile.spt' in
734another terminal, to see what is happening. Again if nothing happens, then
735you are on your own (and most probably at first nothing will happen).
736
737And remember that this digitizer is not better than the real Spectrum, so
738if you cannot load a program with a Spectrum, you'll most probably will not
739be able to load it with 'spload'.
740
741Good Luck!
742
7439. Bug reports
744==============
745
746Please send bug reports to:
747
748mszeredi@inf.bme.hu
749
750If you make any changes to the source, please mail me the 'diff -u' of the
751file(s) changed, and also why were the changes needed.
752
753Please also tell me if you would like to maintain, or to continue
754developing spectemu.
755
75610. Credits
757===========
758
759Szeredi Tamas, for testing the emulator, and for helping with the
760'spectkey.gif'.
761
762Egmont Koblinger for helping to write some parts of the emulator, and for
763a lot of useful suggestions.
764
765Dani Nagy and Zsazsa for helping to test the emulator.
766
767G.A. Lunter for a very good description of the Spectrum, the undocumented
768features of Z80, and the '.z80' snapshot file format.
769
770And lots of others, who sent me good ideas and modifications.