amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (03/29/91)
Submitted-by: karl@sugar.hackercorp.com (Karl Lehenbauer) Posting-number: Volume 91, Issue 076 Archive-name: midi/casio/part01 [ includes uuencoded executables ...tad ] Here is my program to download 16-bit samples from a Casio FZ-1 to an Amiga. You'll need Bill Barton's MIDI library, version 2, to make it work. Also to do much useful with it, you'll need a Casio FZ-1 (the kicker), and FZIFF, a companion program (simultaneously posted) to downconvert the 16-bit samples to the 8-bit Amiga IFF 8SVX format. Audiomaster, or equivalent, is also required to do some tweaking, see the README in the FZIFF kit for details. These requirements limit the potential audience of the program a good deal of course, but the people that do have the necessary prerequisites will be able to create Amiga sounds of unparalleled quality. #!/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: Makefile README casio.c casio.h casio.uu cleanup.c # dumpvoice.c fz1.h hilo.c hilo.uu prototypes.h timer.c # Wrapped by tadguy@ab20 on Thu Mar 28 11:19:52 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(205 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' Xall: casio hilo X XOFILES= casio.o timer.o X XCFLAGS= -bs X XSDBFLAGS= -g X Xcasio: $(OFILES) X ln $(SDBFLAGS) $(OFILES) -lhack -lc X Xdebug: X cc -n casio.c X ln +q -g casio.o -lmidi -lc X Xhilo: hilo.o X ln hilo.o -lc END_OF_FILE if test 205 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(3066 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' XHere is CASIO, a primitive program to download 16-bit voices from the XCasio FZ-1 synthesizer to the Amiga computer. X XThis program only has a limited audience, but for those who have an XFZ-1 and want the ultimate in sample quality on the Amiga, it will Xbe a godsend. X XYou'll need Bill Barton's MIDI library, version 2.0. It's around, Xon Fred Fish disks, archive sites, etc. Contact me for it as a last Xresort. X XThe program includes the binary, CASIO, and the source code, plus a XMakefile for Aztec C 5.0 or later. X XTo use CASIO, get your Casio FZ-1 MIDI'ed up bidirectionally to the Amiga X(out-to-in and in-to-out, the Amiga needs a bidirectional link so it can Xack or nack the packets as it receives them) X XVerify the link with some other program that you know works. X XFinally, use the Casio front panel to select an output device of XMIDI, run CASIO with an argument being the filename you want Xwritten on the Amiga, as in "casio train_whistle", then select X"voice dump" on the Casio and hit "save". X XThe Casio firmware is sensitive to data errors at the wrong point in the Xprotocol, so if you get one, your Casio will hang and it will have Xto be power-cycled. Thus it's probably a good idea to save a killer Xvoice to disk on the Casio before trying to download it to the Amiga, Xjust in case. X XRemember that MIDI is pretty slow for samples, MIDI goes at 3000 bytes Xper sample, but the transfer format only sends 4 bits per byte, plus Xthere are delays for acks, so for example a 100 Kbyte sample would Xtake at least a couple of minutes to transfer. You should see the Xsame indication on the Casio you see when it is saving to disk (a moving Xblip), but it will move much, much slower when going to MIDI. X XTo convert the raw 16-bit data of the Casio FZ-1 over to the Amiga XIFF 8SVX sample format, use my FZIFF program, a companion release. X XNote that the Amiga cannot play back a sample faster than around X25,000 samples per second. This pretty much dictates that you use Xthe 18K sample rate on the Casio when sampling for the Amiga. X XMy recently posted SMUS player is particularly useful with Xthese samples, because you can create multisampled instruments that Xdo not suffer from the one-sample-per-octave and each-sample-must-be- Xof-exactly-the-same-length problems that the IFF 8SVX. X XThe program HILO, which is included, simply traverses a sample file Xyou've received from your FZ-1 and prints the highest and lowest Xsample values found. The highest possible value is 32767 and the Xlowest is -32768. If you run it and the values aren't in this Xvicinity, you might want to resample at a higher volume. Of course Xif they're exactly those values or really really close, the voulme Xmight be too high, resulting in distortion. If it's just close, you Xusually won't notice -- let your ear be the judge. This distortion Xusually shows up as a sort of crackling sound when played back, or when Xplayed back on the Amiga. X XShare and Enjoy, X XKarl Lehenbauer X3918 Panorama XMissouri City, TX 77459 X XInternet/BITNET: karl@sugar.hackercorp.com XUsenet: uunet!sugar!karl X END_OF_FILE if test 3066 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'casio.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'casio.c'\" else echo shar: Extracting \"'casio.c'\" \(10606 characters\) sed "s/^X//" >'casio.c' <<'END_OF_FILE' X/* casio - download sample data from a casio fz-1 */ X X/* Copyright (C) 1988 Hackercorp. All Rights Reserved */ X X#include <libraries/dos.h> X#include <clib/macros.h> X#include <midi/midi.h> X#include <functions.h> X#include <stdio.h> X#include <devices/timer.h> X X#include "casio.h" X#include "prototypes.h" X Xchar *program_name = "casio fz1 download program"; X X#define CheckMsg(m) (m->mp_MsgList.lh_Head->ln_Succ != 0) X Xextern struct timerequest *timer_request; X X/* message ids for fz-1 system exclusive messages */ X#define OPEN_MIDI_MSG 0x70 X#define CLOSE_MIDI_MSG 0x71 X#define OK_MIDI_MSG 0x72 X#define ERR_MIDI_MSG 0x73 X#define DATA_MIDI_MSG 0x74 X#define EFFECT_MIDI_MSG 0x76 X#define REMOTE_MIDI_MSG 0x7f X X/* additional messages I define as responses from its_an_fz1_message */ X#define NOT_A_FZ_MESSAGE 0 X#define NOT_THE_REQUESTED_FZ_CHANNEL 1 X#define DATA_ERROR 2 X X/* states for the i/o loop */ X#define WAITING_FOR_OPEN 0 X#define READING_FZ_DATA 1 X X#define MAX_RETRIES 10 X X#define CAPTURE_BUFFER_SIZE 16384 XUBYTE capture_buffer[CAPTURE_BUFFER_SIZE]; X Xvoid *MidiBase = NULL; Xvoid *IntuitionBase = NULL; X Xstruct MDest *dest = NULL; Xstruct MSource *source = NULL; X Xstruct MRoute *route_a = NULL; Xstruct MRoute *route_b = NULL; X XUBYTE *msg; /* buffer this in case we get shut down before freeing the current message */ X Xint capture_position = 0; X Xvoid midi_cleanup(void) X{ X /* if (msg) X FreeMidiMsg(msg); */ X X if (IntuitionBase) X CloseLibrary(IntuitionBase); X X if (dest) X DeleteMDest(dest); X if (source) X DeleteMSource(source); X X if (route_a) X DeleteMRoute(route_a); X if (route_b) X DeleteMRoute(route_b); X X if (MidiBase) X CloseLibrary(MidiBase); X} X X/* if channel is -1, any channel is ok (within FZ-1 System Exclusive message) */ X X/* validate the incoming message, including all sorts of stuff about the header X * and anything we know specifically within the message type as well */ X XUBYTE its_an_fz1_message(UBYTE *msg, int requested_channel) X{ X int channel, length, expected_length; X struct FZ1_Message *p; X X p = (struct FZ1_Message *)msg; X X /* compare first bytes of message, X extract channel number and verify, X return function code X */ X length = MidiMsgLength(msg); X X if ((p->casio_id != 0x44) || (p->fz1_id != 0x200) X || ((p->encoded_channel & 0xf0) != 0x70)) X return(NOT_A_FZ_MESSAGE); X X channel = (p->encoded_channel & 0x0f); X if ((requested_channel != -1) && (channel != requested_channel)) X return(NOT_THE_REQUESTED_FZ_CHANNEL); X X switch(p->command) X { X case OPEN_MIDI_MSG: X expected_length = 16; X break; X X case CLOSE_MIDI_MSG: X expected_length = 7; X break; X X case DATA_MIDI_MSG: X expected_length = 136; X if (length == expected_length && (p->body.datamsg.checksum != calc_checksum(p))) X { X fprintf(stderr,"checksum error, expected %x, saw %x\n", X p->body.datamsg.checksum,calc_checksum(p)); X return(DATA_ERROR); X } X break; X X /* haven't seen any of these yet */ X case OK_MIDI_MSG: X case ERR_MIDI_MSG: X case EFFECT_MIDI_MSG: X case REMOTE_MIDI_MSG: X panic("got a message I don't know how to handle"); X X /* it wasn't a message we understood yet it had all the makings of X * being one, it must be garbled */ X default: X return(DATA_ERROR); X } X if (length != expected_length) X return(DATA_ERROR); X X return(p->command); X} X Xvoid commune_with_fz1(struct MSource *source, struct MDest *dest, int channel, int outfd) X{ X long len; X UBYTE *ip; X int command, retry_count = 0; X int state = WAITING_FOR_OPEN; X ULONG waitflags; X int packets_received = 0, error_count = 0, done = 0; X struct FZ1_Message *p; X X /* wait for a message or control-C or "done" control var to be set */ X while ((!((waitflags = Wait(-1)) & SIGBREAKF_CTRL_C)) && !done) X { X /* if ((waitflags & SIGBREAKF_CTRL_D) && (state = READING_FZ_DATA)) X { X printf("saw a ^d\n"); X goto data_error; X } */ X X /* while there are messages to process, process messages */ X while (!done && (msg = GetMidiMsg(dest))) X { X /* discard all but system exclusive data - should be done X * by the route, check someday to see if we can find our X * route and change it if it isn't */ X if (*msg != MS_SYSEX) X goto message_done; X X p = (struct FZ1_Message *)msg; X command = its_an_fz1_message((UBYTE *)p,channel); X X if (state == WAITING_FOR_OPEN) X { X if (command != OPEN_MIDI_MSG) X panic("out of sync - looking for 'Open' from FZ1"); X X /* we need to specify a channel ID in our messages X * if we're not looking for a specific one, reply X * with the one we got in the first message */ X if (channel == -1) X channel = p->encoded_channel & 0x0f; X state = READING_FZ_DATA; X dump_open(p); X send_fz(source,channel,OK_MIDI_MSG); X goto message_done; X } X X if (state == READING_FZ_DATA) X { X abort_timeout_timer(); X switch(command) X { X case DATA_MIDI_MSG: X send_fz(source,channel,OK_MIDI_MSG); X start_timeout_timer(); X packets_received++; X if ((packets_received % 10) == 0) X { X printf("%4d ok \r",packets_received); X fflush(stdout); X } X capture(p,outfd); X retry_count = 0; X break; X X case DATA_ERROR: X data_error: X send_fz(source,channel,ERR_MIDI_MSG); X start_timeout_timer(); X printf("%4d err\r",packets_received); X fflush(stdout); X error_count++; X if (++retry_count > MAX_RETRIES) X panic("exceeded max retries for a packet - transfer failed"); X break; X X /* we get this when the fz is done */ X case CLOSE_MIDI_MSG: X fprintf(stderr,"casio is done\n"); X done = 1; X break; X X default: X fprintf(stderr,"unknown command = 0x%x\n",command); X if (state = READING_FZ_DATA) X { X fprintf(stderr,"will try treating it as a data error\n"); X goto data_error; X } X else X panic("unknown command and not in 'read' mode"); X } X goto message_done; X } X X panic("state variable fried"); X X message_done: FreeMidiMsg(msg); /* free it */ X } X X if (CheckMsg(timer_request->tr_node.io_Message.mn_ReplyPort) && X (GetMsg(timer_request->tr_node.io_Message.mn_ReplyPort)) ) X { X if (state == READING_FZ_DATA) X { X send_fz(source,channel,ERR_MIDI_MSG); X printf("%4d tmo\r",packets_received); X fflush(stdout); X error_count++; X if (++retry_count > MAX_RETRIES) X panic("exceeded max retries for a packet - transfer failed"); X } X } X } X if (capture_position != 0) X { X if (write(outfd,capture_buffer,capture_position) != capture_position) X perror("output file"); X } X printf("total packets received %d (%d retries)\n",packets_received,error_count); X} X Xvoid send_fz(struct MSource *source, int channel_id, int message_id) X{ X static UBYTE buf[] = {0xf0, 0x44, 0x02, 0x00, 0x70,0x00,0xf7}; X buf[4] |= channel_id; X buf[5] = message_id; X PutMidiMsg(source,buf); X} X Xint calc_checksum(struct FZ1_Message *p) X{ X UBYTE *ip, lownibble, hinibble; X int len, running_sum; X X /* I assume the message has already been validated as a Casio FZ-1 X * data message X */ X X ip = &p->body.datamsg.data[0]; X X for (len = 0, running_sum = 0; len < 128; len++) X { X running_sum += *ip++; X } X return((0 - running_sum) & 0x7f); X} X Xvoid capture(struct FZ1_Message *p, int outfd) X{ X UBYTE *ip, lownibble, hinibble; X int len; X X ip = &p->body.datamsg.data[0]; X X for (len = 0; len < 64; len++) X { X lownibble = *ip++; X hinibble = *ip++; X capture_buffer[capture_position++] = (hinibble << 4) | lownibble; X if (capture_position >= CAPTURE_BUFFER_SIZE) X { X if (write(outfd,capture_buffer,CAPTURE_BUFFER_SIZE) != CAPTURE_BUFFER_SIZE) X { X perror("output file"); X } X capture_position = 0; X } X } X} X Xstruct MRouteInfo myrouteinfo = X{ X MMF_SYSEX,0xffff,0,0,{0},{0} X}; X Xmain(int argc,char *argv[]) X{ X X char *sname, *dname, *filename; X int outfd; X int wanted_channel = -1; X X fprintf(stderr,"ready to talk to casio, the routes are done automatically from\n"); X fprintf(stderr,"midi_in if it's available, else MidiIn and to MidiOut.\n"); X fprintf(stderr,"I download and exit when done. I automatically do retries.\n"); X fprintf(stderr,"Nonetheless, I may 'hang' when uploading. This is soft.\n"); X fprintf(stderr,"Hit ^D to retry. Or hit ^C, I'll exit.\n"); X fprintf(stderr,"I write to the file on the fly (every 256 packets), so watch it.\n"); X if (argc != 2) X { X fprintf(stderr,"usage: casio filename, routes are automatic, then\n"); X fprintf(stderr," select FZ output device as 'midi' and do a voice save\n"); X exit(1); X } X X sname = "FZ1out"; X dname = "FZ1in"; X filename = argv[1]; X X if ((outfd = creat(filename,0666)) == -1) X { X fprintf(stderr,"couldn't create output file\n"); X perror(filename); X exit(2); X } X X if (!(IntuitionBase = OpenLibrary("intuition.library",0))) X { X fprintf(stderr,"can't open intuition.library\n"); X goto clean; X } X X add_cleanup(midi_cleanup); X X if (!(MidiBase = OpenLibrary(MIDINAME,MIDIVERSION))) X { X fprintf(stderr,"can't open midi.library\n"); X goto clean; X } X X /* create our public source node */ X if (!(source = CreateMSource(sname,NULL))) X { X fprintf(stderr,"can't create Source port %s\n",sname); X goto clean; X } X X /* create our dest node (public) */ X if (!(dest = CreateMDest(dname,NULL))) X { X fprintf(stderr,"can't create Dest port %s\n",dname); X goto clean; X } X X route_a = MRoutePublic("midi_in",dname,&myrouteinfo); X if (!route_a) X route_a = MRoutePublic("MidiIn",dname,&myrouteinfo); X X route_b = MRoutePublic(sname,"MidiOut",&myrouteinfo); X X init_timer(); X X commune_with_fz1(source,dest,wanted_channel,outfd); /* process until shutdown */ X Xclean: X close(outfd); X cleanup(); X exit(0); X} X Xvoid _abort(void) /* abort routine called when CTRL-C is hit (Aztec) */ X{ X /* fflush(stdout); cleanup(); exit(1); */ X} /* we're polling it in the loop */ X Xvoid dump_open(struct FZ1_Message *p) X{ X unsigned int nblocks; X X printf("dump of Open MIDI message received from Casio FZ-1\n"); X printf("channel %d, status %d, ",p->encoded_channel & 0x0f,p->body.openmsg.status); X printf("banks %d, voices %d, ",p->body.openmsg.banks,p->body.openmsg.voices); X X if(p->body.openmsg.status != 1 || p->body.openmsg.banks != 0 X || p->body.openmsg.voices != 1) X panic("I don't know how to do anything other than save a single voice"); X X nblocks = (p->body.openmsg.nblocks_hinibble << 12) X | (p->body.openmsg.nblocks_next_to_hinibble << 8) X | (p->body.openmsg.nblocks_next_to_lonibble << 4) X | p->body.openmsg.nblocks_lonibble; X printf("nblocks %d, ",nblocks); X printf("edit bank %d, edit voice %d\n",p->body.openmsg.edit_bank,p->body.openmsg.edit_voice); X} X X/* end of casio.c */ X END_OF_FILE if test 10606 -ne `wc -c <'casio.c'`; then echo shar: \"'casio.c'\" unpacked with wrong size! fi # end of 'casio.c' fi if test -f 'casio.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'casio.h'\" else echo shar: Extracting \"'casio.h'\" \(561 characters\) sed "s/^X//" >'casio.h' <<'END_OF_FILE' X/* casio.h - casio fz1 midi include file */ X Xstruct FZ1_OpenMsg X{ X UBYTE status; X UBYTE banks; X UBYTE voices; X UBYTE nblocks_lonibble; X UBYTE nblocks_next_to_lonibble; X UBYTE nblocks_next_to_hinibble; X UBYTE nblocks_hinibble; X UBYTE edit_bank; X UBYTE edit_voice; X UBYTE eox; X}; X Xstruct FZ1_DataMsg X{ X UBYTE data[128]; X UBYTE checksum; X UBYTE eox; X}; X Xstruct FZ1_Message X{ X UBYTE sysex; X UBYTE casio_id; X short fz1_id; X UBYTE encoded_channel; X UBYTE command; X union { X struct FZ1_DataMsg datamsg; X struct FZ1_OpenMsg openmsg; X } body; X}; X X/* end of casio.h */ END_OF_FILE if test 561 -ne `wc -c <'casio.h'`; then echo shar: \"'casio.h'\" unpacked with wrong size! fi # end of 'casio.h' fi if test -f 'casio.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'casio.uu'\" else echo shar: Extracting \"'casio.uu'\" \(18036 characters\) sed "s/^X//" >'casio.uu' <<'END_OF_FILE' Xbegin 644 casio XM```#\P`````````#``````````(```N,```0[@````$```/I```+C$[Z%KYC3 XM87-I;R!F>C$@9&]W;FQO860@<')O9W)A;0``3E7__$CG``!*K(`*9P``%BM.P XM__PB;(`*+&R#4DZN_F(L;?_\2JR`#F<``!8K3O_\(&R`#BQL@`9.KO^^+&W_N XM_$JL@!)G```6*T[__"!L@!(L;(`&3J[_T"QM__Q*K(`69P``%BM.__P@;(`6O XM+&R`!DZN_Z8L;?_\2JR`&F<``!8K3O_\(&R`&BQL@`9.KO^F+&W__$JL@`9GP XM```6*T[__")L@`8L;(-23J[^8BQM__Q,WP``3EU.=4Y5_^Q(YP``*VT`"/_P@ XM*T[_["!M``@L;(`&3J[_=BQM_^PK0/_X(&W_\`PH`$0``68``"H@;?_P#&@"E XM```"9@``'"!M__!P`!`H``0"@````/`,@````'!G```,<`!,WP``3EU.=2!MC XM__!P`!`H``0"@`````\K0/_\#*W_____``QG```2("W__+"M``QG```&<`%@[ XMR"!M__!P`!`H``5@``"J*WP````0__1@``"R*WP````'__1@``"F*WP```"(- XM__0@+?_XL*W_]&8``$HO+?_P3KH%Q%A/(&W_\'(`$B@`AK"!9P``,"\M__!.) XMN@6J6$\O`"!M__!P`!`H`(8O`$AZ`'Q(;(&\3KH2#D_O`!!P`F``_TA@``!&\ XM2'H`ATZZ#TQ83W`"8`#_-/]&_U+_OO^^_U[_R/^^_\C_R/_(_\C_R/_(_\C_Y XMR/^^!$``<`Q``!!DT-!`,#L`TD[[```@+?_XL*W_]&<```AP`F``_NX@;?_P< XM<``0*``%8`#^X&-H96-K<W5M(&5R<F]R+"!E>'!E8W1E9"`E>"P@<V%W("5XW XM"@!G;W0@82!M97-S86=E($D@9&]N)W0@:VYO=R!H;W<@=&\@:&%N9&QE`$Y5^ XM_]1(YP``0JW_\$*M_^Q"K?_D0JW_X$*M_]PK3O_4</\L;(-23J[^PBQM_]0K? XM0/_H"```#&8``J)*K?_<9@`"FDJM_]QF``((*T[_U"!M``PL;(`&3J[_CBQM` XM_]0I0(-69P`!["!L@U8,$`#P9@`!R"ML@U;_V"\M`!`O+?_83KK]L%!/`H``% XM``#_*T#_]$JM_^QF``!B#*T```!P__1G```,2'H"?DZZ#?983PRM_____P`0/ XM9@``%B!M_]AP`!`H``0"@`````\K0``0*WP````!_^PO+?_83KH*$EA/2'@`I XM<B\M`!`O+0`(3KH#H$_O``Q@``%"#*T````!_^QF``$L3KH-5"`M__1@``$&B XM2'@`<B\M`!`O+0`(3KH#<$_O``Q.N@SR4JW_Y'(*("W_Y$ZZ)$!F```:+RW_B XMY$AZ`@Y.NA$F4$](;(&F3KHA!EA/+RT`%"\M_]A.N@/$4$]"K?_P8```Q$AX8 XM`',O+0`0+RT`"$ZZ`QA/[P`,3KH,FB\M_^1(>@'13KH0X%!/2&R!IDZZ(,!8C XM3U*M_^!2K?_P#*T````*__!O```,2'H!LDZZ#.Y83V```')(>@'82&R!O$ZZ, XM#XA03RM\`````?_<8```6"\M__1(>@')2&R!O$ZZ#VI/[P`,*WP````!_^QG" XM```42'H!Q4AL@;Q.N@].4$]@`/]D2'H!V4ZZ#)183V```!A5@&<`_U`$@```& XM`&]GF%>`9P#^ZF"J8```#$AZ`=A.N@QL6$\K3O_4(&R#5BQL@`9.KO^"+&W_P XMU&``_?0@;(-:(&@`#B!H`!1*D&<``'8K3O_4(&R#6B!H``XL;(-23J[^C"QM. XM_]1*@&<``%@,K0````'_[&8``$Q(>`!S+RT`$"\M``A.N@'T3^\`#"\M_^1($ XM>@%W3KH/P%!/2&R!IDZZ'Z!83U*M_^!2K?_P#*T````*__!O```,2'H!6$ZZ- XM"\Y83V``_41*K(`>9P``*"\L@!Y(;(->+RT`%$ZZ)7Q/[P`,L*R`'F<```Q(J XM>@%:3KH.;EA/+RW_X"\M_^1(>@%43KH/5$_O``Q,WP``3EU.=6]U="!O9B!S_ XM>6YC("T@;&]O:VEN9R!F;W(@)T]P96XG(&9R;VT@1EHQ`"4T9"!O:R`-`"4T3 XM9"!E<G(-`&5X8V5E9&5D(&UA>"!R971R:65S(&9O<B!A('!A8VME="`M('1RH XM86YS9F5R(&9A:6QE9`!C87-I;R!I<R!D;VYE"@!U;FMN;W=N(&-O;6UA;F0@. XM/2`P>"5X"@!W:6QL('1R>2!T<F5A=&EN9R!I="!A<R!A(&1A=&$@97)R;W(*A XM`'5N:VYO=VX@8V]M;6%N9"!A;F0@;F]T(&EN("=R96%D)R!M;V1E`'-T871EZ XM('9A<FEA8FQE(&9R:65D`"4T9"!T;6\-`&5X8V5E9&5D(&UA>"!R971R:65S% XM(&9O<B!A('!A8VME="`M('1R86YS9F5R(&9A:6QE9`!O=71P=70@9FEL90!T\ XM;W1A;"!P86-K971S(')E8V5I=F5D("5D("@E9"!R971R:65S*0H`3E7__$CGZ XM``!P`!`L@":`K0`,&4"`)AEM`!.`)RM.__Q![(`B(D@@;0`(+&R`!DZN_X@L9 XM;?_\3-\``$Y=3G5.5?_R2.<``"MM``C__%RM__Q"K?_V0JW_\F````92K?_V! XM#*T```"`__9L```4(&W__%*M__QP`!`0T:W_\F#><`"0K?_R`H````!_3-\`W XM`$Y=3G5.5?_V2.<``"MM``C__%RM__Q"K?_V8```!E*M__8,K0```$#_]FP`L XM`'8@;?_\4JW__!M0__L@;?_\4JW__!M0__IP`!`M__KI@'(`$BW_^X"!(BR`, XM'E*L@!Y![(->$8`8``RL``!``(`>;0``+DAX0`!(;(->+RT`#$ZZ(M!/[P`,C XM#(```$``9P``#$AZ`!A.N@O`6$]"K(`>8`#_?DS?``!.74YU;W5T<'5T(&9IU XM;&4`3E7_Y$CG```K?/______[$AZ`F9(;(&\3KH+8%!/2'H"F$AL@;Q.N@M2S XM4$](>@+"2&R!O$ZZ"T103TAZ`O%(;(&\3KH+-E!/2'H#'4AL@;Q.N@LH4$](/ XM>@,X2&R!O$ZZ"QI03PRM`````@`(9P``*$AZ`V!(;(&\3KH+`%!/2'H#A4AL* XM@;Q.N@KR4$](>``!3KHB\%A/0?H#I2M(__Q!^@.D*TC_^"!M``PK:``$__1(J XM>`&V+RW_]$ZZ$:903RM`__`,@/____]F```D2'H#?$AL@;Q.N@JD4$\O+?_T> XM3KH*P%A/2'@``DZZ(IA83RM._^AP`$/Z`W$L;(-23J[]V"QM_^@I0(`*9@``\ XM%$AZ`VM(;(&\3KH*9%!/8``!/DAZ]HA.N@AV6$\K3O_H<`=#^@-G+&R#4DZN] XM_=@L;?_H*4"`!F8``!1(>@-<2&R!O$ZZ"BI03V```00K3O_HD\D@;?_\+&R`L XM!DZN_]8L;?_H*4"`$F8``!HO+?_\2'H#04AL@;Q.N@GV3^\`#&```,XK3O_H_ XMD\D@;?_X+&R`!DZN_\0L;?_H*4"`#F8``!HO+?_X2'H#*$AL@;Q.N@G`3^\`T XM#&```)A([40`_^1![(`J)$@B;?_X0?H#'RQL@`9.KO^43.U$`/_D*4"`%DJL( XM@!9F```H2.U$`/_D0>R`*B1((FW_^$'Z`ODL;(`&3J[_E$SM1`#_Y"E`@!9(3 XM[40`_^1![(`J)$A#^@+>(&W__"QL@`9.KO^43.U$`/_D*4"`&DZZ!;0O+?_P8 XM+RW_["\L@`XO+(`23KKWVD_O`!`O+?_P3KHBVEA/3KH';$*G3KHA%EA/3-\`O XM`$Y=3G5R96%D>2!T;R!T86QK('1O(&-A<VEO+"!T:&4@<F]U=&5S(&%R92!DO XM;VYE(&%U=&]M871I8V%L;'D@9G)O;0H`;6ED:5]I;B!I9B!I="=S(&%V86EL% XM86)L92P@96QS92!-:61I26X@86YD('1O($UI9&E/=70N"@!)(&1O=VYL;V%D- XM(&%N9"!E>&ET('=H96X@9&]N92X@($D@875T;VUA=&EC86QL>2!D;R!R971RE XM:65S+@H`3F]N971H96QE<W,L($D@;6%Y("=H86YG)R!W:&5N('5P;&]A9&EN7 XM9RX@(%1H:7,@:7,@<V]F="X*`$AI="!>1"!T;R!R971R>2X@($]R(&AI="!>/ XM0RP@22=L;"!E>&ET+@H`22!W<FET92!T;R!T:&4@9FEL92!O;B!T:&4@9FQYJ XM("AE=F5R>2`R-38@<&%C:V5T<RDL('-O('=A=&-H(&ET+@H`=7-A9V4Z(&-AQ XM<VEO(&9I;&5N86UE+"!R;W5T97,@87)E(&%U=&]M871I8RP@=&AE;@H`('-E6 XM;&5C="!&6B!O=71P=70@9&5V:6-E(&%S("=M:61I)R!A;F0@9&\@82!V;VECF XM92!S879E"@!&6C%O=70`1EHQ:6X`8V]U;&1N)W0@8W)E871E(&]U='!U="!F: XM:6QE"@!I;G1U:71I;VXN;&EB<F%R>0!C86XG="!O<&5N(&EN='5I=&EO;BYL& XM:6)R87)Y"@!M:61I+FQI8G)A<GD`8V%N)W0@;W!E;B!M:61I+FQI8G)A<GD*H XM`&-A;B=T(&-R96%T92!3;W5R8V4@<&]R="`E<PH`8V%N)W0@8W)E871E($1E# XM<W0@<&]R="`E<PH`;6ED:5]I;@!-:61I26X`36ED:4]U=`!.50``2.<``$S?9 XM``!.74YU3E7__$CG``!(>@#\3KH';EA/(&T`"'``$"@`!B\`(&T`"'``$"@`, XM!`*`````#R\`2'H!"$ZZ!T9/[P`,(&T`"'``$"@`""\`(&T`"'``$"@`!R\`5 XM2'H`_$ZZ!R)/[P`,(&T`"`PH``$`!F8``!P@;0`(2B@`!V8``!`@;0`(#"@`8 XM`0`(9P``#$AZ`-Y.N@,D6$\@;0`(<``0*``,<@SCH"!M``AR`!(H``OA@8"!K XM(&T`"'(`$B@`"NF!@($@;0`(<@`2*``)@($K0/_\+RW__$AZ`-5.N@:F4$\@( XM;0`(<``0*``.+P`@;0`(<``0*``-+P!(>@#`3KH&A$_O``Q,WP``3EU.=61UC XM;7`@;V8@3W!E;B!-241)(&UE<W-A9V4@<F5C96EV960@9G)O;2!#87-I;R!&\ XM6BTQ"@!C:&%N;F5L("5D+"!S=&%T=7,@)60L(`!B86YK<R`E9"P@=F]I8V5SV XM("5D+"``22!D;VXG="!K;F]W(&AO=R!T;R!D;R!A;GET:&EN9R!O=&AE<B!T5 XM:&%N('-A=F4@82!S:6YG;&4@=F]I8V4`;F)L;V-K<R`E9"P@`&5D:70@8F%NW XM:R`E9"P@961I="!V;VEC92`E9`H``$Y5__A(YP`P0J="ITZZ#HQ03R1`(`IFO XM```,<`!,WPP`3EU.=4AX`"@O"DZZ#XA03R9`(`MF```.+PI.N@\:6$]P`^ XM*T[_^'(`(DL@+0`(0?H`*BQL@U).KOY$+&W_^"M`__Q*K?_\9P``#B\+3KH`3 XM&EA/<`!@I"`+8*!T:6UE<BYD979I8V4``$Y5__Q(YP`P)&T`""`*9P``+B9J$ XM``X@"V<```HO"TZZ#JQ83RM.__PB2BQL@U).KOX^+&W__"\*3KH//%A/3-\,0 XM`$Y=3G5.5?_\2.<``"M.__PB;(-:+&R#4DZN_B`L;?_\*7S_____PUXO+(-:O XM3KK_D%A/3-\``$Y=3G5.50``2.<``$*G3KK^[EA/*4"#6F8```Q(>@`D3KH`3 XMO%A/(&R#6BEH`!3#7DAZ_YQ.N@%T6$],WP``3EU.=4-A;B=T(&-R96%T92!T! XM:6UE<BX`3E7__$CG```@;(-:,7P`"0`<(&R#6B%\`````P`@(&R#6D*H`"0KN XM3O_\(FR#6BQL@U).KOXR+&W__$S?``!.74YU3E7__$CG```K3O_\(FR#6BQL^ XM@U).KOX@+&W__$S?``!.74YU2'@`"4AZ`)9(>``"3KH9X$ZZ`11(>``*3KH:) XMO$_O`!!.=4Y5_YQ(YR`@=`!*;(`X9Q9(>@"T2'H`L$AZ`&I.N@&8=`%/[P`,- XM.7P``8`X0>T`#"1(+PHO+0`(2&W_G$ZZ#B1(>@"$2'H`@$AM_YQ.N@%H2D)/? XM[P`89A!.N@"J2'@`"DZZ&E)83V`*2'@`%$ZZ&D983TS?!`1.74YU7D,@86)OU XM<G0*`$1O=6)L92!P86YI8R!D971E8W1E9"$@(%-Y<W1E;2!M87D@8F4@=6YR! XM96QI86)L92!U;FQE<W,@<F5B;V]T960A`%!!3DE#`$CG`"`O#G(!<`@L;(-2L XM3J[_.BQ?)$!*@&8*2'H`4$ZZ_Q183R2O``@E;(`Z``0I2H`Z3-\$`$YU2.<`J XM,$JL@#IG)"1L@#H@;(`Z*6@`!(`Z)E(O#G`((DHL;(-23J[_+BQ?3I-@UDS?& XM#`!.=55N86)L92!T;R!A;&QO8V%T92!M96UO<GD@9F]R(&$@8VQE86YU<"!F] XM=6YC=&EO;@``2.<@("1O``PD+P`40A(5?``!``$5?``!``)*@F<$<`9@`G`!P XM-4``!$J"9P1P`V`"<``U0``&0JH`"$*J`!`E;P`0``P@"DS?!`1.=4Y5_TQ(F XMYR`@)&T`"$AZ`-I(;?]@3KH6RB\L@`)(;?]@3KH*GDAX``%(;?]@2&W_[&&"1 XM6&W_\EAM__`O+?_X3KH1FB0`2'@``2\*2&W_V$ZZ_V0O"DZZ$82P@D_O`#!OJ XM"B\*3KH1=B0`6$]![?_8*TC__`9M`!+_WEAM_]Q(>``!+RT`#$AM_\1.NO\JD XM2'@``2\M`!!(;?^P3KK_&DCM3`S_3'9"("W_3"(`YXC0@0:`````*"0`<@!PP XM`$'M_[`F2$'M_\0D2$'M_^PB2)'(+&R`"DZN_J1,[4P,_TQ/[P`83-\$!$Y=4 XM3G5-97-S86=E(&9R;VT@`$CG("!![P`4)$@O"B\O`!0O+P`43KH+ZB0`(`)/* XM[P`,3-\$!$YU2.<`("1O``@@"F<>2A)G&DAL@;PO"DZZ`)9(;(&\2'H`2$ZZR XM`(I/[P`0+RS#8DZZ`CPD0$J`6$]G*$H29R1(;(&\+RS#8DZZ`B183R\`3KH`F XM7DAL@;Q(>``*3KH`$$_O`!!,WP0`3G4Z(```2.<@("0O``PD;P`0(`IG!DIJ' XM``QF"'#_3-\$!$YU(%*QZ@`$9`P@4E*2$()P`!`"8.9P`!`"+P`O"DZZ$+Y0@ XM3V#62.<@,"9O`!`D;P`48#0@4K'J``1D#"!24I(0@G``$`)@#G``$`(O`"\*G XM3KH0C%!/#(#_____9@AP_TS?#`1.=5*+%!-FR'``8/!(YR`@0>\`$"1(+PHO; XM+P`02&R!IDZZ"LPD`"`"3^\`#$S?!`1.=0!.;R!S=6-H(&9I;&4@;W(@9&ERN XM96-T;W)Y`$%R9R!L:7-T('1O;R!L;VYG`$)A9"!F:6QE(&1E<V-R:7!T;W(`T XM3F]T(&5N;W5G:"!M96UO<GD`1FEL92!E>&ES=',`26YV86QI9"!A<F=U;65NF XM=`!&:6QE('1A8FQE(&]V97)F;&]W`%1O;R!M86YY(&]P96X@9FEL97,`3F]TM XM(&$@8V]N<V]L90!097)M:7-S:6]N(&1E;FEE9`!)+T\@97)R;W(`3F\@<W!AX XM8V4@;&5F="!O;B!D979I8V4`4F5S=6QT('1O;R!L87)G90!!<F=U;65N="!O. XM=70@;V8@9&]M86EN`$5X96,@9F]R;6%T(&5R<F]R`%)E860M;VYL>2!F:6QE9 XM('-Y<W1E;0!#<F]S<RUD979I8V4@<F5N86UE`$YO=&AI;F<@=&\@<F5A9`!(B XMYR``)"\`"$J";1H,@@```!)N$B`"Y8!![(`^(#`(`$S?``1.=4'Z``8@"&#R, XM56YK;F]W;B!E<G)O<@`J3V%R0^R#4D7L@U*UR68.,CP0&6L(=``BPE')__PIB XM3\-F+'@`!"E.@U)(YX"`""X`!`$I9Q!+^@`(3J[_XF`&0J?S7TYS0_H`(DZN= XM_F@I0,-J9@PN/``#@`=.KO^48`8J3TZZ`!I03TYU9&]S+FQI8G)A<GD`2?D`_ XM`'_^3G5(YP`@2.<``B(\``$``#`L@TC!_``&+&R#4DZN_SI,WT``*4##;F8>T XM2.<!!IO-+CP``0``+&R#4DZN_Y1,WV"`+FS#9DYU(&S#;D)H``0@;,-N,7P`K XM`0`0(&S#;C%\``$`"B!LPV8@+,-FD*@`!%"`*4##<B!LPW(@O$U!3EA(YP`"< XMD\DL;(-23J[^VDS?0``D0$JJ`*QG/"\O``PO+P`,+PI.N@$,*7P````!PW8@0 XM;,-N6(@P$`!`@``P@"!LPV[1_`````HP$`!`@``P@$_O``Q@:DCG``(@2M'\M XM````7"QL@U).KOZ`3-]``$CG``(@2M'\````7"QL@U).KOZ,3-]``"E`PWH@6 XM;,-Z2J@`)&<F2.<``B!LPWH@:``D(A`L;,-J3J[_@DS?0``O+,-Z+PI.N@1.\ XM4$\I;,-ZPWY(YP`"+&S#:DZN_\I,WT``(&S#;B"`2.<``BQLPVI.KO_$3-]`5 XM`"!LPVXA0``&9R1(YR`")#P```/M0?H`-"((+&S#:DZN_^),WT`$(&S#;B%`8 XM``PO+,-^+RS#@DZZ[YY03R\`3KH3&%A/3-\$`$YU*@!(YS@R)B\`'"@O`"`F( XM;P`D($-*J`"L9Q0@0R`H`*SE@"Q`("X`$.6`)$!@!"1L@TH0$DB`2,#0A%2`Y XM*4##ADCG``)R`"`LPX8L;(-23J[_.DS?0``I0,.*9@9,WTP<3G40$DB`2,`D% XM`"\"($I2B"\(+RS#BDZZ!&Q(>@%*($+1[,.*+PA.NA!H+P0O"R\LPXI.N@$T. XM(&S#BD(P*``I?`````'#@B1"U>S#BE**)DI/[P`@$!)(@$C`)``,@````"!GE XM(`R"````"6<8#((````,9Q`,@@````UG"`R"````"F8$4HI@S`P2`"!M=@P2: XM`")F*E**$!I(@$C`)`!G'!;"#((````B9A`,$@`B9@12BF`&0BO__V`"8-I@` XM.!`:2(!(P"0`9RP,@@```"!G)`R"````"6<<#((````,9Q0,@@````UG#`R"M XM````"F<$%L)@RD(;2H)F`E.*4JS#@F``_U)"$TCG``)R`"`LPX+E@%B`+&R#Z XM4DZN_SI,WT``*4##?F8(0JS#@F``_M!T`"1LPXI@&B`"Y8`@;,-^(8H(`"\*V XM3KH*1-7`4HI83U*"M*S#@FW@(`+E@"!LPWY"L`@`8`#^F"``3.\#```$(`@BD XM+P`,2AAF_%.($-E7R?_\!($``0``:O)"($YU+R\`"$AX`P$O+P`,809/[P`,J XM3G5(YSXR+&\`)"@O`"A.NA#&)FS#;G0`8!!R!B`"3KH3`$JS"`!G$%*",&R#) XM2+'";NAV"&```4X(!``)9UY(YR`"=/\B+P`$+&S#:DZN_ZQ,WT`$*@!G1$CG0 XM``(B!2QLPVI.KO^F3-]``$CG``(B%RQLPVI.KO^X3-]``$J`9AQ(YP`"+&S#? XM:DZN_WQ,WT``)@`,@````,UF``#J2.<@`B0\```#[2(O``0L;,-J3J[_XDS?> XM0`0D0"`*9@``I`@$``AF!G8!8```O$CG(`(D/````^XB+P`$+&S#:DZN_^),4 XMWT`$)$!*@&862.<``BQLPVI.KO]\3-]``"8`8```ADCG``)P(4/Z`,`L;(-2= XM3J[]V$S?0``L`&<42.<``B)&+&R#4DZN_F),WT``8#!(YS`"=@%!^@">)`@B_ XM"BQLPVI.KO_03-]`#$CG,`)V_W0`(@HL;,-J3J[_ODS?0`Q@,"`$`H````4`W XM#(````4`9B!(YP`"(@HL;,-J3J[_W$S?0`!V!2E#PV)P_TS?3'Q.=7(&(`).4 XMNA&*)XH(`'(&(`).NA%^-X0(!`@$``MG%DCG,`)V`70`(@HL;,-J3J[_ODS?[ XM0`P@`F#"9&]S+FQI8G)A<GD```!(YS`R+&\`&$CG``)P`$/Z`-8L;(-23J[]7 XMV$S?0``I0,..9@9,WTP,3G5(YP`"(&\`("!H`"0@:``$+&S#CDZN_[),WT``( XM)$!*@&=^2.<``D/Z`*$@:@`V+&S#CDZN_Z!,WT``)`!G4$CG(`(D/````^TBO XM%RQLPVI.KO_B3-]`!"9`2H!G,B`+Y8`F`"!#+6@`"`"D+4L`G$CG(`(D/```0 XM`^U!^@!6(@@L;,-J3J[_XDS?0`0M0`"@2.<``B!*+&S#CDZN_Z9,WT``2.<`( XM`B)LPXXL;(-23J[^8DS?0`!"K,..8`#_0&EC;VXN;&EB<F%R>0!724Y$3U<`7 XM*@!,[P,```0@"$H89OQ32!#99OQ.=4SO`P``!"`((B\`#&`"$-E7R?_\9PP$E XM@0`!``!J\$YU0AA1R?_\!($``0``:O).=4CG(#`F;P`02.<``G#_+&R#4DZN@ XM_K9,WT``)``,@/____]F"'``3-\,!$YU2.<``B(\``$``7`B+&R#4DZN_SI,X XMWT``)$!*@&862.<``B`"+&R#4DZN_K!,WT``<`!@QB5+``H5;P`7``D5?``$G XM``A"*@`.%4(`#TCG``*3R2QL@U).KO[:3-]``"5``!`@"V<42.<``B)*+&R#T XM4DZN_IY,WT``8!`@2M'\````%"\(3KH&-EA/(`I@`/]L2.<`("1O``A*J@`*/ XM9Q)(YP`"(DHL;(-23J[^F$S?0``5?`#_``@E?/____\`%$CG``)P`!`J``\L? XM;(-23J[^L$S?0`!(YP`"<"(B2BQL@U).KO\N3-]``$S?!`!.=4CG(#`F;P`0< XM)"\`%"`+9@AP`$S?#`1.=4CG``(B/``!``$@`BQL@U).KO\Z3-]``"1`2H!F" XM!'``8-@5?``%``@U0@`2)4L`#B`*8,9(YP`@)&\`""`*9@9,WP0`3G45?`#_C XM``@E?/____\`%"5\_____P`82.<``G``,"H`$B)*+&R#4DZN_RY,WT``8,I.@ XM5?_J2.<@("1M``@[?`0(__8K2O_J*TK_\BM*_^X&K0``?___[B\M`!`O+0`,6 XM2&W_ZDZZ`!8D`$(R*``@`D_O``Q,WP0$3EU.=4Y5_?1(YS\R)FT`""QM`!!^_ XM`"1M``P6$F8*(`=,WTS\3EU.=5**#`,`)6=")`<@4['K``1D#"!34I,0@W``_ XM$`-@#G``$`,O`"\+3KH%0%!/#(#_____9P`$9%*"%A)F!"`"8+A2B@P#`"5F& XMPBX">``K?````"#__!8:<``0`V!F",0``&#R",0``6#L",0``F#F",0``V#@_ XM6(XD+O_\2H)L!@C$``!$@A8:8%8K?````##__'0`8!@@`N>`<@`2`]"!T(+0J XM@B0`!((````P%AIP`!`#0>R`CQ`P``!(@`@```)FU&`<!$``(&>@5T!GHE]`] XM9Z130&>.54!GA%=`9ZQ@LBM"__@D/```?<8,`P`N9EP6&@P#`"IF%%B.)"[_O XM_$J";`8D/```?<86&F`P=`!@&"`"YX!R`!(#T('0@M"")``$@@```#`6&G``( XM$`-![("/$#```$B`"````F;4#((``'W&9P@K?````"#__"H"#`,`:&8&",0`X XM!V`6#`,`;&8&",0`!F`*#`,`3&8&",0`"!8:*TH`#'``$`-@``&.8``#&@@$G XM``=G"EB.(&[__#"'8!@(!``&9PI8CB!N__P@AV`(6(X@;O_\((=T`&```:A8" XMCB1N__PO"DZZ`P@D``R%``!]QEA/9P:TA6\")`5@``&&6(X6+O__0>W]^"1(D XM$(-T`6```7)T"&`0`$0`2'9X=!!@!@C$``1T"@P#`%AF"$'Z`IX@"&`&0?H"T XMIR`(*T#]]`@$``9G"%B.+"[__&`4"`0`!&<(6(XL+O_\8`98CBPN__P(!``$& XM9PI*AFP&1(8(Q``%0>W_^"1(#(4``'W&9@)Z`4J&9@1*A6<<(@(@!DZZ!;X@7 XM;?WT%3`(`"("(`9.N@6Z+`!FY$'M__B1RB0("`0``V=N#`,`;V842H)G"@P25 XM`#!G"+2%;00J`E*%8%0,`P!X9P8,`P!89DA*@F=$#!(`,&<^M(5L$$'M_?JQ^ XMRF0(%3P`,%*"8.P(!```9AP,K0```##__&82(`)4@+"M__AL""HM__A5A6#*1 XM%0,5/``P5(*TA6P00>W]^+'*9`@5/``P4H)@[&!,!$``)6<`_L@$0``S9P#^M XMV`1```MG`/ZR4T!G`/[.6T!G`/[(6T!G`/Y04T!G`/ZN4T!G`/ZL5T!G`/YL. XM54!G`/ZN5T!G`/Z@8`#^*@@$``1G*`@$``5G!A4\`"U@&@@$``%G!A4\`"M@W XM#@@$``)G!A4\`"!@`E."4H+>@@@$``!F``"0#*T````P__QF0@@$``1G/#`$: XM`D``)F<T(%.QZP`$9`X@4U*3$)IP`!`J__]@#G``$!HO`"\+3KH!I%!/#(#_Z XM____9P``R%.M__A3@F`T(%.QZP`$9!`@4U*3$*W__W``$"W__V`0<``0+?__L XM+P`O"TZZ`6I03PR`_____V<``(Y2AR`M__A3K?_XL()NP"H"(`)3@DJ`9RX@. XM4['K``1D#B!34I,0FG``$"K__V`.<``0&B\`+PM.N@$D4$\,@/____]G2&#*M XM"`0``&<\)`5@+"!3L>L`!&0.(%-2DQ"\`"!P`'`@8`Q(>``@+PM.N@#N4$\,4 XM@/____]G$E*'("W_^%.M__BP@F[(8`#[6'#_8`#[7#`Q,C,T-38W.#E!0D-$A XM148`,#$R,S0U-C<X.6%B8V1E9@`@;P`$(`A*&&;\4TB1P"`(3G4@;P`$((A86 XMD$*H``0A2``(3G5(YP`@)&\`""`*9D1![(&0)$A*:@`,9R8P*@`,`D`""&8<; XM2'C__R\*3KH`6@R`_____U!/9@AP_TS?!`!.==7\````%D'L@TBUR&7&<`!@F XMZ$AX__\O"DZZ`"Q03V#:2.<`($'L@9`D2"\*3KH!OEA/U?P````60>R#2+7(H XM9>I,WP0`3G5(YSP@)&\`&"@O`!P@"F<``9`T*@`,9P`!B`@"``EF``&`"`(`J XM`V8``7@@2M'\````##`0`D#O_3"`2JH`"&8<#(3_____9@AP`$S?!#Q.=2\*2 XM3KH"R#0J``Q83P@"``YF-"!2L>H`"&,>2'@``2`2D*H`!"\`$"H`#DB`2,`O2 XM`$ZZ!$Q/[P`,)*H`""!J`!#1TB5(``0,A/____]F!'8`8`(6!"`2D*H`""H`L XM,`("0`"@9TX,A/____]G(B!24I(0@R!*T?P````,,!`(P``.,(`T`$'Z_P0IK XM2,.24H4,A/____]G#`P#``IG!KJJ`!!E!'C_8`PE4@`$<``0`V``_TH(`@`.X XM9S!*A6<<+P4O*@`($"H`#DB`2,`O`$ZZ!':PA4_O``QF7B!*T?P````,,!`(5 XM@``.,(`,A/____]F$B2J``@E:@`(``1P`!`#8`#^^D'Z_H8I2,.2($K1_```* XM``PP$`C```XP@"2J``@@:@`0T=(E2``$(%)2DA"#<``0`V``_L8@2M'\````= XM##`0",```C"`)6H`"``$)*H`"'#_8`#^IDY5__9(YS@@)&T`"'0`(`IG!DIJA XM``QF"G#_3-\$'$Y=3G4(*@`!``QF"B\*3KK]J(2`6$\0*@`.2(!(P"\`3KH&Y XM3H2`""H````-6$]G"B\J``A.N@&66$]*:@`49TY(>@!J2&W_]TZZ`E`X*@`4T XM=@!03W``,`1R"DZZ`'P&@````#!R!Y*#0>W_]Q&`&`!(Q(G\``I2@PR#````) XM!6W40BW__TAM__=.N@,26$]"DD*J``1"J@`(0FH`#$J"9P9P_V``_UAP`&``! XM_U)435``2.=(`$*$2H!J!$2`4D1*@6H&1($*1``!83Y*1&<"1(!,WP`22H!./ XM=4CG2`!"A$J`:@1$@%)$2H%J`D2!81H@`6#8+P%A$B`!(A]*@$YU+P%A!B(?^ XM2H!.=4CG,`!(04I!9B!(038!-`!"0$A`@,,B`$A`,@*"PS`!0D%(04S?``Q.L XM=4A!)@$B`$)!2$%(0$)`=`_0@-.!MH%B!)*#4D!1RO_R3-\`#$YU2.<@("1O0 XM``QT01`J``Y(@$C`+P!.N@$Z2H!83V<"="$E?```!```$$AX!`!.N@#&)4``F XM"%A/9A@E?`````$`$"!*T?P````/)4@`"#0\`(`@2M'\````#'``,!`R`DC!Z XM@($P@"5J``@`!"2J``A,WP0$3G5(YP`PE\LD;,.68!`@2E"((F\`#+/(9PXFG XM2B12(`IF[$S?#`!.=2`+9P0FDF`$*5+#EDCG``(@*@`$4(`B2BQL@U).KO\N- XM3-]``*.<`,"1LPY9@'"922.<``B`J``10@")*+&R#4DZN_RY,WT``)$L@F XM"F;@0JS#EDS?#`!.=4CG("`D+P`,2H)F"'``3-\$!$YU2.<``G(`(`)0@"QLL XM@U).KO\Z3-]``"1`2H!F!'``8-I!^O^6*4C#FB2LPY8E0@`$*4K#EB`*4(!@/ XMP$SO`P``!"`($-EF_$YU2.<@("0O``QR!B`"3KH$$B1`U>S#;DJ";0PP;(-(` XML<)O!$J29A`I?`````/#8G#_3-\$!$YU2.<``G(&(`).N@/@(&S#;B(P"``LC XM;,-J3J[_*$S?0`!*@&<$<`%@`G``8,Y(YS`@)"\`$$ZZ`6IR!B`"3KH#K"1`7 XMU>S#;DJ";0PP;(-(L<)O!$J29A`I?`````/#8G#_3-\$#$YU2.<P`B`O`"13W XM@"8`)"\`("(2+&S#:DZN_[Y,WT`,)@`,@/____]F&$CG``(L;,-J3J[_?$S?& XM0``I0,-B</]@NDCG,`)V`'0`(A(L;,-J3J[_ODS?0`Q@HDCG``(B+P`(+&S#R XM:DZN_[A,WT``2H!F&$CG``(L;,-J3J[_?$S?0``I0,-B</].=7``8/I(YS`@Q XM)"\`$$ZZ`*1R!B`"3KH"YB1`U>S#;DJ";0PP;(-(L<)O!$J29A`I?`````/#^ XM8G#_3-\$#$YU,"H`!`)```-F#"E\````!L-B</]@Y`@J``,`!&<62.<P`G8!U XM=``B$BQLPVI.KO^^3-]`#$CG,`(F+P`D)"\`("(2+&S#:DZN_]!,WT`,)@`,7 XM@/____]F&$CG``(L;,-J3J[_?$S?0``I0,-B</]@BB`#8(9(YR``2.<``B(\@ XM```0`'``+&R#4DZN_LY,WT``)``(```,9Q)*K,-V9@@@`DS?``1.=4ZZX9!PK XM`&#R2JS#GF<4(&S#GB!H``1.D"!LPYXI4,.>8.9*K,.29P8@;,.23I`O+P`$A XM3KH`!EA/3G5(YS``)B\`#$JLPVYG,G0`8`HO`DZZ`7!83U*",&R#2+'";NY(Y XMYP`","R#2,'\``8B;,-N+&R#4DZN_RY,WT``2JS#FF<&(&S#FDZ02JR#3F<4< XM2.<``B(L@TXL;,-J3J[_IDS?0`!*K,.B9P@@;,.B(*S#IDJLPZIG%$CG``(B" XM;,.J+&R#4DZN_F),WT``2JS#KF<42.<``B)LPZXL;(-23J[^8DS?0`!*K,.R^ XM9Q1(YP`"(FS#LBQL@U).KOYB3-]``$JLP[9G%$CG``(B;,.V+&R#4DZN_F),: XMWT``2.<`!BQX``0(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G,J7TJLPWIF/$JLW XMPXIG-$CG``(@+,.&(FS#BBQL@U).KO\N3-]``$CG``(@+,."Y8!8@")LPWXL$ XM;(-23J[_+DS?0`!@)$CG``(L;(-23J[_?$S?0`!(YP`"(FS#>BQL@U).KOZ&" XM3-]``$CG``(B;,-J+&R#4DZN_F),WT``(`,N;,-F3G5,WP`,3G5(YR`@)"\`P XM#'(&(`).N@!*)$#5[,-N2H)M##!L@TBQPF\$2I)F$"E\`````\-B</],WP0$A XM3G4P*@`$`D"``&822.<``B(2+&S#:DZN_]Q,WT``0I)P`R.=P`#0!Q,`F! XM`4A#QL!(0T)#U(-(0,#!2$!"0-""3-\`#DYU``````/L`````0````$``!<X: XM`````````_(```/J````U`````0`````````````````````````````````Z XM````\$0"`'``]P`$`/__````````````````````````%38``!4W```540``< XM%6,``!5W```5B0``%94``!6F```5N@``%<X``!7<```5[@``%?@``!80```6V XM(0``%C@``!9*```68```%G0````3`"`@("`@("`@(#`P,#`P("`@("`@("`@2 XM("`@("`@("`@D$!`0$!`0$!`0$!`0$!`0`P,#`P,#`P,#`Q`0$!`0$!`"0D)# XM"0D)`0$!`0$!`0$!`0$!`0$!`0$!`0%`0$!`0$`*"@H*"@H"`@("`@("`@("_ XM`@("`@("`@("`D!`0$`@````````````````````````````````````````T XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM`````````````````````````````@````````$```````````````````0`' XM`0`````!```````````````````$``(``````0``````````````````````) XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM%``````````````#[````!0``````````````#P```!`````1````$@```!,K XM````4````%0```!8````7````&````!D````:````&P```!P````=````'@`, X?``!\````@````(0````````#\@```^L````!```#\FP`% X`` Xend Xsize 12856 END_OF_FILE if test 18036 -ne `wc -c <'casio.uu'`; then echo shar: \"'casio.uu'\" unpacked with wrong size! fi # end of 'casio.uu' fi if test -f 'cleanup.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'cleanup.c'\" else echo shar: Extracting \"'cleanup.c'\" \(1419 characters\) sed "s/^X//" >'cleanup.c' <<'END_OF_FILE' X/* cleanup - Peter and Karl's standard cleanup management X * X * "cleaned up" the documentation 3/1/88 X * X */ X X#include <exec/types.h> X#include <functions.h> X#include <exec/memory.h> X#include <stdio.h> X Xstruct _clean X{ X int (*function)(); X struct _clean *next; X} *cleanlist = NULL; X X/* add_cleanup X * given a function, add it to a list of functions to call when cleanup X * is executed X */ Xadd_cleanup(function) Xint (*function)(); X{ X struct _clean *ptr; X X ptr = AllocMem(sizeof(struct _clean), MEMF_PUBLIC); X if(!ptr) X return 0; X ptr->function = function; X ptr->next = cleanlist; X cleanlist = ptr; X} X X/* cleanup X * call all the functions that were passed as arguments to add_cleanup X * this run X */ Xcleanup() X{ X struct _clean *ptr; X int (*f)(); X X fflush(stdout); X fflush(stderr); X X while(cleanlist) X { X /* locate the next cleanup function and get the function pointer */ X ptr = cleanlist; X cleanlist = cleanlist->next; X f = ptr->function; X X /* cleanup must clean up after itself */ X FreeMem(ptr, sizeof(struct _clean)); X X /* execute the function */ X (*f)(); X X fflush(stdout); X fflush(stderr); X } X} X X/* panic - abort with an error message */ X Xshort panic_in_progress = 0; X Xpanic(s) Xchar *s; X{ X fflush(stdout); X fprintf(stderr,"panic: %s\n",s); X fflush(stderr); X if (!panic_in_progress) X { X cleanup(); X exit(10); X } X fprintf(stderr,"double panic!\n"); X} X X_abort() X{ X panic("^C or other C library abort"); X} END_OF_FILE if test 1419 -ne `wc -c <'cleanup.c'`; then echo shar: \"'cleanup.c'\" unpacked with wrong size! fi # end of 'cleanup.c' fi if test -f 'dumpvoice.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'dumpvoice.c'\" else echo shar: Extracting \"'dumpvoice.c'\" \(1885 characters\) sed "s/^X//" >'dumpvoice.c' <<'END_OF_FILE' X/* dumpvoice */ X X#include "casio.h" X#include "fz1.h" X#include <stdio.h> X Xdumpvoice(p) Xstruct voicedata *p; X{ X printf("wave_start_address %ld, wave_end_address %ld\n",wave_start_address,wave_end_address); X printf("generator_start_address %ld, generator_end_address %ld\n",generator_start_address,generator_end_addresss); X X printf("loop_style %d, sustain_loop_number %d, multi_loop_end_number %d\n",loop_style,sustain_loop_number,multi_loop_end_number); X X for (i = 0; i < 8; i++) X { X printf("loop_start_addresses[%d] %ld, loop_end_address[%d] %ld\n",i,loop_start_addresses[i],i,loop_end_addresses[i]); X printf("loop_cross_feed_time[%d] %ld, loop_time[%d] %ld\n",loop_cross_feed_time[i],loop_time[i]); X } X X printf("voice_pitch %d, frequency_offset %d, filter_Q_offset %d\n",voice_pitch,frequency_offset,filter_Q_offset); X X X printf("dca_envelope_sustain_point %d, dca_envelope_end_point %d\n",dca_envelope_sustain_point,dca_envelope_end_point); X BYTE dca_envelope_sustain_point; X BYTE dca_envelope_end_point; X BYTE dca_envelope_rate_values[NLOOPS]; X UBYTE dca_envelope_stop_values[NLOOPS]; X X BYTE dcf_envelope_sustain_point; X BYTE dcf_envelope_end_point; X BYTE dcf_rate_envelope_rate_values[NLOOPS]; X UBYTE dcf_envelope_stop_values[NLOOPS]; X X unsigned short lfo_delay_time; X UBYTE lfo_waveform; X UBYTE lfo_attack_value; X BYTE lfo_rate; X BYTE lfo_pitch_depth; X BYTE lfo_amplitude_depth; X BYTE lfo_filter_depth; X BYTE lfo_filter_Q_depth; X BYTE initial_touch_Q_follow; X X BYTE dca_keyboard_follow_depth; X BYTE dca_noterate_scaling_depth; X BYTE dcf_keyboard_follow_depth; X BYTE dcf_noterate_scaling_depth; X X BYTE initial_touch_dca_key_follow; X BYTE initial_touch_dca_rate_scaling; X BYTE initial_touch_dcf_key_follow; X BYTE initial_touch_dca_rate_scaling; X X UBYTE high_width_MIDI_code; X UBYTE low_width_MIDI_code; X UBYTE keynote_center; X X UBYTE sampling_frequency_index; X X char name[14]; X} X X END_OF_FILE if test 1885 -ne `wc -c <'dumpvoice.c'`; then echo shar: \"'dumpvoice.c'\" unpacked with wrong size! fi # end of 'dumpvoice.c' fi if test -f 'fz1.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'fz1.h'\" else echo shar: Extracting \"'fz1.h'\" \(1453 characters\) sed "s/^X//" >'fz1.h' <<'END_OF_FILE' X/* Casio FZ-1 data structure definitions */ X X#define NLOOPS 8 X Xstruct voicedata X{ X long wave_start_address; X long wave_end_address; X long generator_start_address; X long generator_end_address; X X short loop_style; X BYTE sustain_loop_number; X BYTE multi_loop_end_number; X long loop_start_addresses[NLOOPS]; X X long loop_end_addresses[NLOOPS]; X X short loop_cross_feed_time[NLOOPS]; X unsigned short loop_time[NLOOPS]; X X short voice_pitch; /* voice pitch with detune */ X BYTE frequency_offset; X BYTE filter_Q_offset; X X BYTE dca_envelope_sustain_point; X BYTE dca_envelope_end_point; X BYTE dca_envelope_rate_values[NLOOPS]; X UBYTE dca_envelope_stop_values[NLOOPS]; X X BYTE dcf_envelope_sustain_point; X BYTE dcf_envelope_end_point; X BYTE dcf_rate_envelope_rate_values[NLOOPS]; X UBYTE dcf_envelope_stop_values[NLOOPS]; X X unsigned short lfo_delay_time; X UBYTE lfo_waveform; X UBYTE lfo_attack_value; X BYTE lfo_rate; X BYTE lfo_pitch_depth; X BYTE lfo_amplitude_depth; X BYTE lfo_filter_depth; X BYTE lfo_filter_Q_depth; X BYTE initial_touch_Q_follow; X X BYTE dca_keyboard_follow_depth; X BYTE dca_noterate_scaling_depth; X BYTE dcf_keyboard_follow_depth; X BYTE dcf_noterate_scaling_depth; X X BYTE initial_touch_dca_key_follow; X BYTE initial_touch_dca_rate_scaling; X BYTE initial_touch_dcf_key_follow; X BYTE initial_touch_dca_rate_scaling; X X UBYTE high_width_MIDI_code; X UBYTE low_width_MIDI_code; X UBYTE keynote_center; X X UBYTE sampling_frequency_index; X X char name[14]; X} X X END_OF_FILE if test 1453 -ne `wc -c <'fz1.h'`; then echo shar: \"'fz1.h'\" unpacked with wrong size! fi # end of 'fz1.h' fi if test -f 'hilo.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'hilo.c'\" else echo shar: Extracting \"'hilo.c'\" \(1753 characters\) sed "s/^X//" >'hilo.c' <<'END_OF_FILE' X/* hilo - print highest and lowest sample values */ X X#include <stdio.h> X Xshort buffer[512]; X Xmain(argc,argv) Xint argc; Xchar *argv[]; X{ X FILE *fopen(), *fp; X short sample, i, average; X short blockhisample, blocklosample; X short grandhisample = -32768, grandlosample = 32767; X long grandtotal = 0, nsamples = 0; X long blocktotal; X unsigned long blockvariance, grandvariance = 0; X unsigned long sample_squared; X X if (argc != 2) X { X fprintf(stderr,"usage: hilo casiodumpfilename\n"); X printf("argc %d\n",argc); X exit(1); X } X X if ((fp = fopen(argv[1],"r")) == NULL) X { X perror(argv[1]); X exit(2); X } X X if (fseek(fp,1024L,1) == -1) X { X perror(argv[1]); X exit(3); X } X X while (fread(buffer,1024,1,fp) != 0) X { X nsamples += 512; X X blockhisample = -32768; X blocklosample = 32767; X blocktotal = 0; X blockvariance = 0; X X for (i = 0; i < 512; i++) X { X sample = buffer[i]; X /* printf("%4x ",(sample >> 4) & 0xf); */ X X /* compute block values */ X blocktotal += sample; X if (sample < blocklosample) X blocklosample = sample; X if (sample > blockhisample) X blockhisample = sample; X X /* compute grand values */ X grandtotal += sample; X if (sample < grandlosample) X grandlosample = sample; X if (sample > grandhisample) X grandhisample = sample; X X /* compute variance */ X sample_squared = ((sample / 32) * (sample / 32)); X blockvariance += sample_squared; X grandvariance += sample_squared; X } X average = blocktotal/512; X X printf("512 samples: avg %d, hi %d, lo %d, variance %ld\n",average,blockhisample,blocklosample,blockvariance * 2); X } X average = grandtotal/nsamples; X X printf("totals: nsamples %ld, avg %d, hi %d, lo %d, variance %ld\n",nsamples,average,grandhisample,grandlosample,grandvariance * 2); X exit(0); X} END_OF_FILE if test 1753 -ne `wc -c <'hilo.c'`; then echo shar: \"'hilo.c'\" unpacked with wrong size! fi # end of 'hilo.c' fi if test -f 'hilo.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'hilo.uu'\" else echo shar: Extracting \"'hilo.uu'\" \(12525 characters\) sed "s/^X//" >'hilo.uu' <<'END_OF_FILE' Xbegin 644 hilo XM```#\P`````````#``````````(```?$```!W`````$```/I```'Q$[Z".).; XM5?_62.<``#M\@`#_\#M\?___[D*M_^I"K?_F0JW_V@RM`````@`(9P``*$AZI XM`@I(;(&`3KH"F%!/+RT`"$AZ`A=.N@0&4$](>``!3KH<B%A/2'H"#"!M``PO> XM*``$3KH%R%!/*T#__&8``!H@;0`,+R@`!$ZZ`MQ83TAX``).NAQ66$](>``!K XM2'@$`"\M__Q.N@/>3^\`#`R`_____V8``!H@;0`,+R@`!$ZZ`J983TAX``-.R XMNAP@6$\O+?_\2'@``4AX!`!(;(,63KH"*$_O`!!*@&<``1@&K0```@#_YCM\A XM@`#_]#M\?___\D*M_^)"K?_>0FW_^&````92;?_X#&T"`/_X;```JC`M__A(; XMP-"`0>R#%CMP"`#_^C!M__H@"-&M_^(P+?_ZL&W_\FP```@[;?_Z__(P+?_Z? XML&W_]&\```@[;?_Z__0P;?_Z(`C1K?_J,"W_^K!M_^YL```(.VW_^O_N,"W_^ XM^K!M__!O```(.VW_^O_P,&W_^B`(<B!.NA<2+P`P+?_Z2,!R($ZZ%P0B`"`?Q XM3KH=3BM`_]8@+?_6T:W_WB`M_];1K?_:8`#_3"(\```"`"`M_^).NA;6.T#_0 XM]B`M_][0@"\`,&W_\B\(,&W_]"\(,&W_]B\(2'H`@DZZ`F9/[P`48`#^SB(MU XM_^8@+?_J3KH6G#M`__8@+?_:T(`O`#!M_^XO"#!M__`O"#!M__8O""\M_^9(` XM>@!U3KH"*$_O`!A"ITZZ&JI83TS?``!.74YU=7-A9V4Z(&AI;&\@8V%S:6]D: XM=6UP9FEL96YA;64*`&%R9V,@)60*`'(`-3$R('-A;7!L97,Z(&%V9R`E9"P@9 XM:&D@)60L(&QO("5D+"!V87)I86YC92`E;&0*`'1O=&%L<SH@;G-A;7!L97,@R XM)6QD+"!A=F<@)60L(&AI("5D+"!L;R`E9"P@=F%R:6%N8V4@)6QD"@``2.<@! XM($'O`!0D2"\*+R\`%"\O`!1.N@W")``@`D_O``Q,WP0$3G5(YSPP)F\`'"HOO XM`"`D;P`H2H5F"'``3-\,/$YU=`!@-"8%8"H@4K'J``1D"B!24I)P`!`08`@OW XM"DZZ`A983R@`#(#_____9Q(6A%*+4X-*@V;24H*TKP`D9<8@`F"X2.<`("1ON XM``@@"F<>2A)G&DAL@8`O"DZZ`)9(;(&`2'H`2$ZZ`(I/[P`0+RR'%DZZ!2(D* XM0$J`6$]G*$H29R1(;(&`+RR'%DZZ!0I83R\`3KH`7DAL@8!(>``*3KH`$$_O\ XM`!!,WP0`3G4Z(```2.<@("0O``PD;P`0(`IG!DIJ``QF"'#_3-\$!$YU(%*Q: XMZ@`$9`P@4E*2$()P`!`"8.9P`!`"+P`O"DZZ$B903V#62.<@,"9O`!`D;P`48 XM8#0@4K'J``1D#"!24I(0@G``$`)@#G``$`(O`"\*3KH1]%!/#(#_____9@API XM_TS?#`1.=5*+%!-FR'``8/!(YR`@0>\`$"1(+PHO+P`02&R!:DZZ#$8D`"`"P XM3^\`#$S?!`1.=4CG/B`D;P`<+"\`("@O`"0@"F<``+PZ*@`,9P``M"!*T?P`! XM```,,!`"0._],(`(!0`.9Q1(>/__+PI.NA%T2H!03V8``(Q@7`R$`````F=4H XM("H`!)"2)@!O2C`%`D`8@&8X)`9*A&8<2'@``4*G$"H`#DB`2,`O`$ZZ%@209 XM@Y2`3^\`#"`2D*H`"-"";0RT@VX(($+1TB2(8"X,A`````%F`IR#)6H`"``$_ XM)*H`""\$+P80*@`.2(!(P"\`3KH5P$J`3^\`#&T(<`!,WP1\3G5P_V#V2.<PM XM,"1O`!0@"F<6<``P*@`,)@!G#`@#``IF!@@#``-G"'#_3-\,#$YU(%*QZ@`$Q XM90``IDJJ``AF""\*3KH3NEA/,"H`#`)``*!G,$'L@50F2'``,"L`#`*```!`2 XM(`R```!`(&8(+PM.N@_N6$_7_````!9![(,,M\AEUB!*T?P````,,!`"0*__R XM,(`O*@`0+RH`"!`J``Y(@$C`+P!.N@C\)`!/[P`,;B!*@F8$<`)@`G`$($K1" XM_`````QR`#(0@($P@'#_8`#_7"2J``@@0M'J``@E2``$(%)2DG``$!!@`/]"* XM2'C__TZZ`.XO`"\O`!`O+P`03KH`"$_O`!!.=4CG/#(L;P`@)&\`)"9O`"@H4 XM+P`L)CP```0`$!)(@$C`*@`,@````')F#B0\```0`"8\```"`&`H#(4```!WS XM9@@D/```$P%@&`R%````868()#P``!D!8`AP`$S?3#Q.=5**$!)(@`Q``"MFE XM#!`J``%(@`Q``&)G#!`22(`,0`!B9@I2B@C#``0(@@`,$!)(@`Q``"MF&B`"\ XM"(```"0`",(``2`#`H#___G_)@`(PP`+(`YG#"\"+PY.N@8.*`!03TJ$;90,; XMA````!1LC!=$``XW0P`,(`M@@DCG`"!![(%4)$A*:@`,9QC5_````!9![(,,K XMM<AF"'``3-\$`$YU8.)":@`40I)"J@`$0JH`""`*8.8`3F\@<W5C:"!F:6QE' XM(&]R(&1I<F5C=&]R>0!!<F<@;&ES="!T;V\@;&]N9P!"860@9FEL92!D97-CT XM<FEP=&]R`$YO="!E;F]U9V@@;65M;W)Y`$9I;&4@97AI<W1S`$EN=F%L:60@7 XM87)G=6UE;G0`1FEL92!T86)L92!O=F5R9FQO=P!4;V\@;6%N>2!O<&5N(&9IG XM;&5S`$YO="!A(&-O;G-O;&4`4&5R;6ES<VEO;B!D96YI960`22]/(&5R<F]R, XM`$YO('-P86-E(&QE9G0@;VX@9&5V:6-E`%)E<W5L="!T;V\@;&%R9V4`07)GW XM=6UE;G0@;W5T(&]F(&1O;6%I;@!%>&5C(&9O<FUA="!E<G)O<@!296%D+6]NL XM;'D@9FEL92!S>7-T96T`0W)O<W,M9&5V:6-E(')E;F%M90!.;W1H:6YG('1O# XM(')E860`2.<@`"0O``A*@FT:#((````2;A(@`N6`0>R``B`P"`!,WP`$3G5!: XM^@`&(`A@\E5N:VYO=VX@97)R;W(`*D]A<D/L@Q9%[(,6M<EF#C(\`19K"'0`P XM(L)1R?_\*4^'&BQX``0I3H<>2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].Y XM<T/Z`").KOYH*4"'(F8,+CP``X`'3J[_E&`&*D].N@`:4$].=61O<RYL:6)R[ XM87)Y`$GY``!__DYU2.<`($CG``(B/``!```P+(,,P?P`!BQLAQY.KO\Z3-]`X XM`"E`AR9F'DCG`0:;S2X\``$``"QLAQY.KO^43-]@@"YLAQI.=2!LAR9":``$? XM(&R')C%\``$`$"!LAR8Q?``!``H@;(<:("R'&I"H``10@"E`ARH@;(<J(+Q-. XM04Y82.<``I/)+&R''DZN_MI,WT``)$!*J@"L9SPO+P`,+R\`#"\*3KH!#"E\> XM`````8<N(&R')EB(,!``0(``,(`@;(<FT?P````*,!``0(``,(!/[P`,8&I(; XMYP`"($K1_````%PL;(<>3J[^@$S?0`!(YP`"($K1_````%PL;(<>3J[^C$S?0 XM0``I0(<R(&R',DJH`"1G)DCG``(@;(<R(&@`)"(0+&R'(DZN_X),WT``+RR'I XM,B\*3KH$Z%!/*6R',H<V2.<``BQLAR).KO_*3-]``"!LAR8@@$CG``(L;(<BV XM3J[_Q$S?0``@;(<F(4``!F<D2.<@`B0\```#[4'Z`#0B""QLAR).KO_B3-]`8 XM!"!LAR8A0``,+RR'-B\LASI.NO4&4$\O`$ZZ$=183TS?!`!.=2H`2.<X,B8O- XM`!PH+P`@)F\`)"!#2J@`K&<4($,@*`"LY8`L0"`N`!#E@"1`8`0D;(,.$!)(& XM@$C`T(14@"E`ASY(YP`"<@`@+(<^+&R''DZN_SI,WT``*4"'0F8&3-],'$YUC XM$!)(@$C`)``O`B!*4H@O""\LAT).N@3R2'H!2B!"T>R'0B\(3KH.ZB\$+PLOL XM+(="3KH!-"!LAT)","@`*7P````!ASHD0M7LAT)2BB9*3^\`(!`22(!(P"0`X XM#(`````@9R`,@@````EG&`R"````#&<0#((````-9P@,@@````IF!%**8,P,Z XM$@`@;78,$@`B9BI2BA`:2(!(P"0`9QP6P@R"````(F80#!(`(F8$4HI@!D(KY XM__]@`F#:8#@0&DB`2,`D`&<L#((````@9R0,@@````EG'`R"````#&<4#((`9 XM```-9PP,@@````IG!!;"8,I"&TJ"9@)3BE*LASI@`/]20A-(YP`"<@`@+(<ZH XMY8!8@"QLAQY.KO\Z3-]``"E`AS9F"$*LASI@`/[0=``D;(="8!H@`N6`(&R'L XM-B&*"``O"DZZ"-C5P%**6$]2@K2LASIMX"`"Y8`@;(<V0K`(`&``_I@@`$SO_ XM`P``!"`((B\`#$H89OQ3B!#95\G__`2!``$``&KR0B!.=2\O``A(>`,!+R\`^ XM#&$&3^\`#$YU2.<^,BQO`"0H+P`H3KH/2"9LAR9T`&`0<@8@`DZZ$;Q*LP@`3 XM9Q!2@C!L@PRQPF[H=@A@``%."`0`"6=>2.<@`G3_(B\`!"QLAR).KO^L3-]`R XM!"H`9T1(YP`"(@4L;(<B3J[_IDS?0`!(YP`"(A<L;(<B3J[_N$S?0`!*@&8<3 XM2.<``BQLAR).KO]\3-]``"8`#(````#-9@``ZDCG(`(D/````^TB+P`$+&R'X XM(DZN_^),WT`$)$`@"F8``*0(!``(9@9V`6```+Q(YR`")#P```/N(B\`!"QLH XMAR).KO_B3-]`!"1`2H!F%DCG``(L;(<B3J[_?$S?0``F`&```(9(YP`"<"%#$ XM^@#`+&R''DZN_=A,WT``+`!G%$CG``(B1BQLAQY.KOYB3-]``&`P2.<P`G8!? XM0?H`GB0((@HL;(<B3J[_T$S?0`Q(YS`"=O]T`"(*+&R'(DZN_[Y,WT`,8#`@+ XM!`*````%``R````%`&8@2.<``B(*+&R'(DZN_]Q,WT``=@4I0X<6</],WTQ\H XM3G5R!B`"3KH01B>*"`!R!B`"3KH0.C>$"`0(!``+9Q9(YS`"=@%T`"(*+&R'2 XM(DZN_[Y,WT`,(`)@PF1O<RYL:6)R87)Y````2.<P("0O`!!.N@UX<@8@`DZZ0 XM#_0D0-7LAR9*@FT,,&R##+'";P1*DF80*7P````#AQ9P_TS?!`Q.=3`J``1(5 XMP`*``````PR``````68,*7P````&AQ9P_V#:2.<P`B8O`"0D+P`@(A(L;(<BW XM3J[_UDS?0`PF``R`_____V882.<``BQLAR).KO]\3-]``"E`AQ9P_V">(`-@^ XMFDCG,#(L;P`82.<``G``0_H`UBQLAQY.KOW83-]``"E`AT9F!DS?3`Q.=4CGB XM``(@;P`@(&@`)"!H``0L;(=&3J[_LDS?0``D0$J`9WY(YP`"0_H`H2!J`#8LT XM;(=&3J[_H$S?0``D`&=02.<@`B0\```#[2(7+&R'(DZN_^),WT`$)D!*@&<R* XM(`OE@"8`($,M:``(`*0M2P"<2.<@`B0\```#[4'Z`%8B""QLAR).KO_B3-]`3 XM!"U``*!(YP`"($HL;(=&3J[_IDS?0`!(YP`"(FR'1BQLAQY.KOYB3-]``$*L; XMAT9@`/]`:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$SO`P``!"`((B\`#&`"$-E7C XMR?_\9PP$@0`!``!J\$YU0AA1R?_\!($``0``:O).=4Y5_?1(YS\R)FT`""QM6 XM`!!^`"1M``P6$F8*(`=,WTS\3EU.=5**#`,`)6=")`<@4['K``1D#"!34I,0: XM@W``$`-@#G``$`,O`"\+3KH%+E!/#(#_____9P`$9%*"%A)F!"`"8+A2B@P#< XM`"5FPBX">``K?````"#__!8:<``0`V!F",0``&#R",0``6#L",0``F#F",0`' XM`V#@6(XD+O_\2H)L!@C$``!$@A8:8%8K?````##__'0`8!@@`N>`<@`2`]"!+ XMT(+0@B0`!((````P%AIP`!`#0>R`4Q`P``!(@`@```)FU&`<!$``(&>@5T!GB XMHE]`9Z130&>.54!GA%=`9ZQ@LBM"__@D/```?<8,`P`N9EP6&@P#`"IF%%B.? XM)"[__$J";`8D/```?<86&F`P=`!@&"`"YX!R`!(#T('0@M"")``$@@```#`6/ XM&G``$`-![(!3$#```$B`"````F;4#((``'W&9P@K?````"#__"H"#`,`:&8&Z XM",0`!V`6#`,`;&8&",0`!F`*#`,`3&8&",0`"!8:*TH`#'``$`-@``&.8``#- XM&@@$``=G"EB.(&[__#"'8!@(!``&9PI8CB!N__P@AV`(6(X@;O_\((=T`&``G XM`:A8CB1N__PO"DZZ`P@D``R%``!]QEA/9P:TA6\")`5@``&&6(X6+O__0>W]! XM^"1($(-T`6```7)T"&`0`$0`2'9X=!!@!@C$``1T"@P#`%AF"$'Z`IX@"&`&; XM0?H"IR`(*T#]]`@$``9G"%B.+"[__&`4"`0`!&<(6(XL+O_\8`98CBPN__P([ XM!``$9PI*AFP&1(8(Q``%0>W_^"1(#(4``'W&9@)Z`4J&9@1*A6<<(@(@!DZZ\ XM!:P@;?WT%3`(`"("(`9.N@6H+`!FY$'M__B1RB0("`0``V=N#`,`;V842H)GL XM"@P2`#!G"+2%;00J`E*%8%0,`P!X9P8,`P!89DA*@F=$#!(`,&<^M(5L$$'M^ XM_?JQRF0(%3P`,%*"8.P(!```9AP,K0```##__&82(`)4@+"M__AL""HM__A5* XMA6#*%0,5/``P5(*TA6P00>W]^+'*9`@5/``P4H)@[&!,!$``)6<`_L@$0``SW XM9P#^V`1```MG`/ZR4T!G`/[.6T!G`/[(6T!G`/Y04T!G`/ZN4T!G`/ZL5T!G) XM`/YL54!G`/ZN5T!G`/Z@8`#^*@@$``1G*`@$``5G!A4\`"U@&@@$``%G!A4\6 XM`"M@#@@$``)G!A4\`"!@`E."4H+>@@@$``!F``"0#*T````P__QF0@@$``1GU XM/#`$`D``)F<T(%.QZP`$9`X@4U*3$)IP`!`J__]@#G``$!HO`"\+3KH!DE!/- XM#(#_____9P``R%.M__A3@F`T(%.QZP`$9!`@4U*3$*W__W``$"W__V`0<``0, XM+?__+P`O"TZZ`5A03PR`_____V<``(Y2AR`M__A3K?_XL()NP"H"(`)3@DJ`R XM9RX@4['K``1D#B!34I,0FG``$"K__V`.<``0&B\`+PM.N@$24$\,@/____]G> XM2&#*"`0``&<\)`5@+"!3L>L`!&0.(%-2DQ"\`"!P`'`@8`Q(>``@+PM.N@#<) XM4$\,@/____]G$E*'("W_^%.M__BP@F[(8`#[6'#_8`#[7#`Q,C,T-38W.#E!# XM0D-$148`,#$R,S0U-C<X.6%B8V1E9@`@;P`$(`A*&&;\4TB1P"`(3G5(YP`@; XM)&\`""`*9D1![(%4)$A*:@`,9R8P*@`,`D`""&8<2'C__R\*3KH`6@R`____` XM_U!/9@AP_TS?!`!.==7\````%D'L@PRUR&7&<`!@Z$AX__\O"DZZ`"Q03V#:T XM2.<`($'L@50D2"\*3KH!OEA/U?P````60>R##+7(9>I,WP0`3G5(YSP@)&\`C XM&"@O`!P@"F<``9`T*@`,9P`!B`@"``EF``&`"`(``V8``7@@2M'\````##`0P XM`D#O_3"`2JH`"&8<#(3_____9@AP`$S?!#Q.=2\*3KH"R#0J``Q83P@"``YF. XM-"!2L>H`"&,>2'@``2`2D*H`!"\`$"H`#DB`2,`O`$ZZ!$Q/[P`,)*H`""!JS XM`!#1TB5(``0,A/____]F!'8`8`(6!"`2D*H`""H`,`("0`"@9TX,A/____]GF XM(B!24I(0@R!*T?P````,,!`(P``.,(`T`$'Z_P0I2(=*4H4,A/____]G#`P#M XM``IG!KJJ`!!E!'C_8`PE4@`$<``0`V``_TH(`@`.9S!*A6<<+P4O*@`($"H`N XM#DB`2,`O`$ZZ!':PA4_O``QF7B!*T?P````,,!`(@``.,(`,A/____]F$B2JM XM``@E:@`(``1P`!`#8`#^^D'Z_H8I2(=*($K1_`````PP$`C```XP@"2J``@@^ XM:@`0T=(E2``$(%)2DA"#<``0`V``_L8@2M'\````##`0",```C"`)6H`"``$V XM)*H`"'#_8`#^IDY5__9(YS@@)&T`"'0`(`IG!DIJ``QF"G#_3-\$'$Y=3G4(L XM*@`!``QF"B\*3KK]J(2`6$\0*@`.2(!(P"\`3KH&B(2`""H````-6$]G"B\J) XM``A.N@&66$]*:@`49TY(>@!J2&W_]TZZ`E`X*@`4=@!03W``,`1R"DZZ`'P&Q XM@````#!R!Y*#0>W_]Q&`&`!(Q(G\``I2@PR#````!6W40BW__TAM__=.N@,2% XM6$]"DD*J``1"J@`(0FH`#$J"9P9P_V``_UAP`&``_U)435``2.=(`$*$2H!JY XM!$2`4D1*@6H&1($*1``!83Y*1&<"1(!,WP`22H!.=4CG2`!"A$J`:@1$@%)$@ XM2H%J`D2!81H@`6#8+P%A$B`!(A]*@$YU+P%A!B(?2H!.=4CG,`!(04I!9B!(( XM038!-`!"0$A`@,,B`$A`,@*"PS`!0D%(04S?``Q.=4A!)@$B`$)!2$%(0$)`[ XM=`_0@-.!MH%B!)*#4D!1RO_R3-\`#$YU2.<@("1O``QT01`J``Y(@$C`+P!.) XMN@$Z2H!83V<"="$E?```!```$$AX!`!.N@#&)4``"%A/9A@E?`````$`$"!*9 XMT?P````/)4@`"#0\`(`@2M'\````#'``,!`R`DC!@($P@"5J``@`!"2J``A,? XMWP0$3G5(YP`PE\LD;(=.8!`@2E"((F\`#+/(9PXF2B12(`IF[$S?#`!.=2`+6 XM9P0FDF`$*5*'3DCG``(@*@`$4(`B2BQLAQY.KO\N3-]``*.<`,"1LATY@[ XM'"922.<``B`J``10@")*+&R''DZN_RY,WT``)$L@"F;@0JR'3DS?#`!.=4CGK XM("`D+P`,2H)F"'``3-\$!$YU2.<``G(`(`)0@"QLAQY.KO\Z3-]``"1`2H!F% XM!'``8-I!^O^6*4B'4B2LATXE0@`$*4J'3B`*4(!@P$SO`P``!"`($-EF_$YUR XM2.<@("0O``QR!B`"3KH$3"1`U>R')DJ";0PP;(,,L<)O!$J29A`I?`````.'I XM%G#_3-\$!$YU2.<``G(&(`).N@0:(&R')B(P"``L;(<B3J[_*$S?0`!*@&<$# XM<`%@`G``8,Y(YS`@)"\`$$ZZ`6IR!B`"3KH#YB1`U>R')DJ";0PP;(,,L<)OU XM!$J29A`I?`````.'%G#_3-\$#$YU2.<P`B`O`"13@"8`)"\`("(2+&R'(DZNY XM_[Y,WT`,)@`,@/____]F&$CG``(L;(<B3J[_?$S?0``I0(<6</]@NDCG,`)V: XM`'0`(A(L;(<B3J[_ODS?0`Q@HDCG``(B+P`(+&R'(DZN_[A,WT``2H!F&$CG[ XM``(L;(<B3J[_?$S?0``I0(<6</].=7``8/I(YS`@)"\`$$ZZ`*1R!B`"3KH#: XM("1`U>R')DJ";0PP;(,,L<)O!$J29A`I?`````.'%G#_3-\$#$YU,"H`!`)`L XM``-F#"E\````!H<6</]@Y`@J``,`!&<62.<P`G8!=``B$BQLAR).KO^^3-]`+ XM#$CG,`(F+P`D)"\`("(2+&R'(DZN_]!,WT`,)@`,@/____]F&$CG``(L;(<BN XM3J[_?$S?0``I0(<6</]@BB`#8(9(YR``2.<``B(\```0`'``+&R''DZN_LY,Y XMWT``)``(```,9Q)*K(<N9@@@`DS?``1.=4ZZ``9P`&#R2.<P`G8$0?H`+B0(] XM+P,O`BQLAR).KO_$(@`D'R8?+&R'(DZN_]!,WT`,2'@``4ZZ``I83TYU7D,*X XM`$JLAU9G%"!LAU8@:``$3I`@;(=6*5"'5F#F2JR'2F<&(&R'2DZ0+R\`!$ZZ_ XM``983TYU2.<P`"8O``Q*K(<F9S)T`&`*+P).N@%P6$]2@C!L@PRQPF[N2.<`8 XM`C`L@PS!_``&(FR')BQLAQY.KO\N3-]``$JLAU)G!B!LAU).D$JL@Q)G%$CGP XM``(B+(,2+&R'(DZN_Z9,WT``2JR'6F<((&R'6B"LAUY*K(=B9Q1(YP`"(FR'V XM8BQLAQY.KOYB3-]``$JLAV9G%$CG``(B;(=F+&R''DZN_F),WT``2JR':F<46 XM2.<``B)LAVHL;(<>3J[^8DS?0`!*K(=N9Q1(YP`"(FR';BQLAQY.KOYB3-]`2 XM`$CG``8L>``$""X`!`$I9Q!+^@`(3J[_XF`&0J?S7TYS*E]*K(<R9CQ*K(="= XM9S1(YP`"("R'/B)LAT(L;(<>3J[_+DS?0`!(YP`"("R'.N6`6(`B;(<V+&R'J XM'DZN_RY,WT``8"1(YP`"+&R''DZN_WQ,WT``2.<``B)LAS(L;(<>3J[^ADS?F XM0`!(YP`"(FR'(BQLAQY.KOYB3-]``"`#+FR'&DYU3-\`#$YU2.<@("0O``QR' XM!B`"3KH`2B1`U>R')DJ";0PP;(,,L<)O!$J29A`I?`````.'%G#_3-\$!$YU> XM,"H`!`)`@`!F$DCG``(B$BQLAR).KO_<3-]``$*2<`!@V$CG<``T`<3`)@%(# XM0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.=0`````#[`````$````!```)7```G XM``````/R```#Z@```,4```=:```'6P``!W4```>'```'FP``!ZT```>Y```'1 XMR@``!]X```?R```(````"!(```@<```(-```"$4```A<```(;@``"(0```B8] XM````$P`@("`@("`@("`P,#`P,"`@("`@("`@("`@("`@("`@()!`0$!`0$!`S XM0$!`0$!`0$`,#`P,#`P,#`P,0$!`0$!`0`D)"0D)"0$!`0$!`0$!`0$!`0$!\ XM`0$!`0$!0$!`0$!`"@H*"@H*`@("`@("`@("`@("`@("`@("`@)`0$!`(```* XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM``````(````````!```````````````````$``$``````0``````````````) XM````!``"``````$`````````````````````````````````````````````' XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM`````````````````````````````````````!0``````````````^P````36 XM```````````````$````"`````P````0````%````!@````<````(````"0`T XM```H````+````#`````T````.````#P```!`````1````$@````````#\@``M X*`^L````!```#\C``4 X`` Xend Xsize 8920 END_OF_FILE if test 12525 -ne `wc -c <'hilo.uu'`; then echo shar: \"'hilo.uu'\" unpacked with wrong size! fi # end of 'hilo.uu' fi if test -f 'prototypes.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'prototypes.h'\" else echo shar: Extracting \"'prototypes.h'\" \(649 characters\) sed "s/^X//" >'prototypes.h' <<'END_OF_FILE' X X/* casio.c */ Xvoid midi_cleanup(void); XUBYTE its_an_fz1_message(UBYTE *msg, int requested_channel); Xvoid commune_with_fz1(struct MSource *source, struct MDest *dest, int channel, int outfd); Xvoid send_fz(struct MSource *source, int channel_id, int message_id); Xint calc_checksum(struct FZ1_Message *p); Xvoid capture(struct FZ1_Message *p, int outfd); Xmain(int argc,char *argv[]); Xvoid _abort(void); Xvoid dump_open(struct FZ1_Message *p); X X/* timer.c */ Xstruct timerequest *CreateTimer(int unit); Xint DeleteTimer(struct timerequest *tr); Xvoid trash_timer(void); Xvoid init_timer(void); Xvoid start_timeout_timer(void); Xvoid abort_timeout_timer(void); END_OF_FILE if test 649 -ne `wc -c <'prototypes.h'`; then echo shar: \"'prototypes.h'\" unpacked with wrong size! fi # end of 'prototypes.h' fi if test -f 'timer.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'timer.c'\" else echo shar: Extracting \"'timer.c'\" \(1620 characters\) sed "s/^X//" >'timer.c' <<'END_OF_FILE' X/* casio reader timer stuff */ X X#include <stdio.h> X#include <exec/types.h> X#include <functions.h> X#include <intuition/intuition.h> X#include <devices/timer.h> X#include <devices/audio.h> X X#include "prototypes.h" X Xstruct timerequest *timer_request; X Xstruct Device *TimerBase; X Xstruct timerequest *CreateTimer(int unit) X{ X long error; X X register struct MsgPort *timerport; X register struct timerequest *timermsg; X X timerport = CreatePort(0L, 0L); X X if (!timerport) X return 0; X X timermsg = (struct timerequest *)CreateExtIO(timerport, (long)sizeof(struct timerequest)); X X if (!timermsg) X { X DeletePort(timerport); X return 0; X } X X error = OpenDevice(TIMERNAME, (long)unit, timermsg, 0L); X if (error) X { X DeleteTimer(timermsg); X return 0; X } X return timermsg; X} X XDeleteTimer(register struct timerequest *tr) X{ X register struct MsgPort *tp; X X if (tr) X { X tp = tr->tr_node.io_Message.mn_ReplyPort; X if(tp) X DeletePort(tp); X CloseDevice((struct IORequest *)tr); X DeleteExtIO((struct IORequest *)tr); X } X} X Xvoid trash_timer(void) X{ X AbortIO((struct IORequest *)timer_request); X TimerBase = (struct Device *)-1; X DeleteTimer(timer_request); X} X Xvoid init_timer(void) X{ X if (!(timer_request = CreateTimer(UNIT_MICROHZ))) X panic("Can't create timer."); X X TimerBase = timer_request->tr_node.io_Device; X add_cleanup(trash_timer); X} X Xvoid start_timeout_timer(void) X{ X timer_request->tr_node.io_Command = TR_ADDREQUEST; X X timer_request->tr_time.tv_secs = 3; X timer_request->tr_time.tv_micro = 0; X X SendIO((struct IORequest *)timer_request); X} X Xvoid abort_timeout_timer(void) X{ X AbortIO((struct IORequest *)timer_request); X} END_OF_FILE if test 1620 -ne `wc -c <'timer.c'`; then echo shar: \"'timer.c'\" unpacked with wrong size! fi # end of 'timer.c' 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.