home *** CD-ROM | disk | FTP | other *** search
/ The Equalizer BBS / equalizer-bbs-collection_2004.zip / equalizer-bbs-collection / DEMOSCENE-STUFF / NL-DEM83.ZIP / DN_2OF3.082 < prev    next >
Text File  |  1995-02-05  |  45KB  |  859 lines

  1. DemoNews.082.continued.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.part.2.of.3
  2.  
  3.              SECTIONS          ARTICLES
  4.              ----------------  -----------------------------------
  5.              Music             Interview with Maelcum/KFMF
  6.              Code              Optimizing Vector Transforms. on P5
  7.              Denthor's High    The Perfect Body
  8.                School Essays
  9.              Back Issues       How to Get 'em, Descriptions
  10.              Advertisements    Mind Side Out
  11.                                Help Me!
  12.              Closing Comments  DemoNews Top 10 LIst
  13.  
  14. .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,
  15.  
  16.  <<Music>>
  17.  
  18. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  19.  
  20. _____Interview with Maelcum
  21.        _    _               _
  22.       / \  / \  ___  _____ | | ____ __      _   _
  23.      /   \/   \/ _ \/ ___ \| |/ __// /   __/ \_/ \  Interview with Maelcum
  24.  ---/  /\__/\  \/ \ \ \_/ /| | /   \ \   \ \/\_/\ \------------------------
  25.     \  \    /  /\_/  \   /_| |\ \___\ \__/ /\   / /     of the Kosmic
  26.      \__\  /__/\___/\_\_____\| \____\\____/\_\ /_/  Free Music Foundation
  27.  
  28.  GD = GraveDigger of uuDW/CoRE ............. digger@freeside.scsd.k12.ny.us
  29.  MA = Maelcum of Kosmic .................... dan@bowker.com
  30.  --------------------------------------------------------------------------
  31.  
  32.  Maelcum is the head man of the Kosmic Free Music Foundation, a group of
  33.  18 composers, 2 artists (who are also musicians), 2 coders (one is also
  34.  a musician), and 2 PR members, totaling 24 people. Maelcum himself has
  35.  written somewhere in the range of 1500-2000 tracks in his lifetime, and he
  36.  currently prefers Renaissance's MultiTracker for composing.
  37.  
  38.  With such a large number of tunes under his belt, Maelcum probably boasts the
  39.  largest personal PC music library. "This will sound like I'm an ego-maniac,"
  40.  he told me, "but I haven't talked to anyone else who's written more than half
  41.  the amount of stuff I've written that I can remember. The only person I can
  42.  remember being anywhere close is Sidewinder. I think he's been tracking a lot
  43.  longer than me though :)"
  44.  
  45.  In 1994, Maelcum released 52 tracks under Kosmic (an average of one a week).
  46.  This makes up a little more than 1/3 of Kosmic's 125 total releases in 1994.
  47.  
  48.  When I first approached Maelcum about being interviewed for DemoNews, I
  49.  asked if he wanted to set up a time to meet on IRC to conduct the interview.
  50.  He then suggested that I mail him a list of questions instead. This sounded
  51.  like the better option, due to the fact that I was unlikely to find time to
  52.  do this anyways, with my finals approaching. I mailed him three sets of
  53.  questions, and in each case, got the responses less than a day later.
  54.  
  55.  Due to the fact that it was already Saturday by the time I got the first
  56.  completed list of questions, and DemoNews comes out on Sundays... plus, the
  57.  interview had not yet been completely formatted and Maelcum doesn't like to
  58.  use capital letters, this interview is actually a week late. I tried to get
  59.  it done in time, but despite Snowman's plea to have it done to avoid another
  60.  small issue of DemoNews, well... here it is, however late it may be.
  61.  --------------------------------------------------------------------------
  62.  
  63.  GD: How old are you, where do you go to school, and what is your major?
  64.  
  65.  MA: I'm 20 years old. I dropped out of Union County College (cheapo state
  66.      school) in 1993. I was studying Communications.
  67.  
  68.  GD: Where are you living? Are you currently employed?
  69.  
  70.  MA: I live with my mother in a small house. I do freelance music and graphics
  71.      work for different companies. Mostly music for video games and graphics
  72.      for different corporate computer companies. I also do consulting, mostly
  73.      to at-home PC users in my area.
  74.  
  75.  GD: Give us a run-down of a typical "Day in the life of Maelcum.."
  76.  
  77.  MA: Wake up anywhere from 6am-6pm (depending on when I last fell asleep),
  78.      watch some tv or go onto the net, eat food, listen to news radio or
  79.      those lame top 40 stations, read email, write some music (never when
  80.      i've just woken up though). Not necessarily in that order! I go through
  81.      phases...
  82.  
  83.  GD: What's been keeping you busy recently?
  84.  
  85.  MA: Right now I'm just sitting around a lot trying to get different things
  86.      organized and keep up with different things that interest me, like the
  87.      Russians slaughtering the Chechen people and the various things going on
  88.      in Congress. if I had some iniative perhaps I might have gone into
  89.      politics.
  90.  
  91.  GD: Tell us about your songwriting... Do you follow a specific pattern when
  92.      composing?
  93.  
  94.  MA: Not really. I mean, subconsciously I'm sure I do, but I don't
  95.      intentionally try to follow any 'rules'. That's one of the things that
  96.      I hate about a lot of music - the really stupid rules. My only rule is
  97.      it has to sound good, or at least interesting. Actually a lot of the
  98.      "melodies", "riffs" or whatever they're all called, I just make up
  99.      randomly. Like I'll just hit some keys on the keyboard to randomly enter
  100.      notes, then go back and mess around with them till I get something
  101.      interesting.
  102.  
  103.  GD: Approximately when did you start composing?
  104.  
  105.  MA: From what I can tell, sometime in late 1991. I think the oldest song
  106.      that I have here (excluding the 1000+ on QIC-80s, some of those might be
  107.      older) is from October 4th, 1991. I couldn't have been composing for more
  108.      than a few weeks at that time.
  109.  
  110.  GD: What made you decide to begin tracking?
  111.  
  112.  MA: I really can't answer that, because I'm not sure. I basically just
  113.      started fooling around with Modedit when v1.0 came out. I'd been doing
  114.      stuff with waveform editors, multitracks and other stuff for about two
  115.      years before that, but i didn't really own any equipment so i couldn't
  116.      do much.
  117.  
  118.  GD: What's the best part about composing?
  119.  
  120.  MA: I dunno, maybe the money and the girls.
  121.  
  122.  GD: How do you know when you've written a good tune?
  123.  
  124.  MA: When i like what i've written. :)
  125.  
  126.  GD: Do you have any background in music theory?
  127.  
  128.  MA: I really don't know much real music stuff, even though my mom was a music
  129.      teacher. I probably know a lot of stuff that I just don't know what terms
  130.      to use for it - that's the downside to not having any clue about the
  131.      theory, I probably am re-inventing the wheel half the time. But I guess
  132.      that's some of the fun.
  133.  
  134.  GD: What kind of sound equipment do you own?
  135.  
  136.  MA: I use a Gravis UltraSound with 16-bit daughtercard and 1mb of ram
  137.      currently. It's hooked up to a Sony 70 watt/channel ProLogic (surround
  138.      sound) receiver which drives two 10 inch speakers left and right, a 6
  139.      inch center channel speaker, and two 7 inch rear channel speakers. All
  140.      my speakers are really old ones, I think the newest ones are probably
  141.      almost as old as I am. I have a few really cheap microphones, a bottom-of
  142.      the line Japanese DJ mixer, and a few really lousy MIDI modules from the
  143.      early to mid 80s. Probably my most expensive single piece of equipment is
  144.      the receiver, which cost $250 :)
  145.  
  146.  GD: Of the 1500-2000 tracks you have composed, do you still have all of them?
  147.  
  148.  MA: I *think* I have most of them. I say think because many of them
  149.      (primarily 4 channel and FastTracker 1 .MODs) are on QIC-80 tapes which
  150.      I have not been able to access for over a year since my tape backup drive
  151.      died. It would be really cool if someone would donate one, and it would
  152.      let me release a lot of material that's never been heard before :)
  153.  
  154.  GD: What software do you use for sampling/tracking, and why? Are there any
  155.      programs that you hate?
  156.  
  157.  MA: Usually I use Goldwave 2.10 (Windows program) to sample stuff in 16-bit,
  158.      edit everything in 16-bit and then resample it down to 8-bit samples and
  159.      load into MMEDIT v1.01b. I just use what works for me. A lot of people
  160.      say MMEDIT sucks compared to Screamtracker but I just can't stand the
  161.      interface of ScreamTracker. I couldn't exactly explain why but it really
  162.      slows me down. I've been thinking about starting to use Fasttracker 2
  163.      though, since I was using Fasttracker 1 before I used mmedit.
  164.  
  165.  GD: From what source do you get the majority of your samples? How many of
  166.      the samples that you use are originals?
  167.  
  168.  MA: I sample 90% or so of my stuff from different CDs. I have the x-static
  169.      goldmine sampling cds, but so many people use those same sounds that I
  170.      don't like to use them a lot unless I totally change them, like
  171.      re-sequence the drum loops, add reverb and flanging, that kind of thing.
  172.      A lot of people think they're great because you don't have to spend hours
  173.      trying to come up with the perfect sound, but I think that a good tracker
  174.      musician has to be able to make their own sounds.
  175.  
  176.  GD: So, you frown on ripping samples?
  177.  
  178.  MA: Ripping samples is fine, I do it quite a bit myself, but if everyone just
  179.      rips, the music will get really dull. Come to think of it, maybe that's
  180.      why so much of it sucks right now.
  181.  
  182.  GD: What's the strangest thing you ever did to create a sound which you
  183.      sampled and used in a song?
  184.  
  185.  MA: I don't know, I try to do a lot of things randomly. I guess maybe the
  186.      samples I made for "Bang A Can" where I smacked the microphone against a
  187.      PC tower case and then edited them to bits in goldwave was pretty
  188.      strange.
  189.  
  190.  GD: There's something I'd never do! Of course, I'd probably end up wrecking
  191.      something in the process.
  192.      What is your favorite tracked music?
  193.  
  194.  MA: I don't really listen to a lot of tracked music that I don't write. I
  195.      think a lot of people listen to too much of it - that's the only reason
  196.      I can possibly see for why amiga-style demo muzak which was popular six
  197.      years ago is still the most written kind of music by pc composers! It's
  198.      really sad I think, a real de-evolution. There are some good composers
  199.      out there though.
  200.  
  201.  GD: Who, then, do you think of as a good composer?
  202.  
  203.  MA: Everyone says Necros to these kinds of questions, and it's certainly
  204.      true. Nec is a great musician. December.s3m was one of the best tracked
  205.      songs i've ever heard. Krystall is also really good, he does just great
  206.      trance songs, those are always really good. There's a lot of people out
  207.      there who do a few great songs, but tons of crap. I'd like to see people
  208.      try to be more consistent in their creativity. Floss is a really creative
  209.      musician - here is a perfect example. The guy is really doing what needs
  210.      to be done - taking some inspiration perhaps from the tired old demo
  211.      muzak and really inventing something that no one else has thought about.
  212.      His stuff is always great.
  213.  
  214.  GD: What's your opinion on the rest of the KFMF composers?
  215.  
  216.  MA: The whole Kosmic group is full of really great musicians - yes, maybe
  217.      I'm biased, but I haven't seen another group which has so many diverse
  218.      and stylish musicians. I think it really is like a "Dream Team" of
  219.      tracker music.
  220.  
  221.  GD: Yes, you are really lucky to have such a wide range of styles.
  222.      What kinds of professionally-recorded music do you prefer?
  223.  
  224.  MA: As far as real music goes, it would take far too long to list it all. I'm
  225.      into lots of techno, ambient, trance, world music - I love lots of middle
  226.      eastern music, it's just so much more interesting than most western music.
  227.      Some groups, I guess would be like Orbital, Front 242, Depeche Mode,
  228.      Erasure, Brian Eno, Aphex Twin, Stone Temple Pilots, De La Soul, A Tribe
  229.      Called Quest, Tim Simenon (Bomb The Bass), The Orb, Bill Nelson, Public
  230.      Image Limited, Negativland, Enya, Moby, Bjork, Renegade Soundwave,
  231.      Primus, Ravi Shankar, Material... I just listen to lots of different
  232.      music. As much as there is crap music out there, there's some great
  233.      stuff too - you just gotta look for it.
  234.      A lot of people might find this funny, but the groups that I grew up on
  235.      were stuff like The Police, Men At Work, Dire Straits, the Pretenders..
  236.      Johnny Cash and U2 are huge influences.
  237.  
  238.  GD: What are some favorite songs of your own?
  239.  
  240.  MA: Well, right now I like a song I wrote called "Calling Heaven" quite a
  241.      lot. It's going to be on the Intelligent Dance Music list's compilation
  242.      CD "Threads". It's really simple, but the simplicity works. Of my past
  243.      KLF releases, some favorites are "That Noise," my remix of Material's
  244.      "Mantra,".. there's just too many. I used to hate everything I had
  245.      written more than 2 weeks ago, but looking back on it all i'm really
  246.      happy with most of it.
  247.  
  248.  GD: Over the years you have been composing, your music has undergone changes
  249.      in style. Can you explain what causes that?
  250.  
  251.  MA: I'm not really sure! I guess the easy answer is that it is because my
  252.      tastes have changed. Like in 1993 - I was totally into rave and
  253.      traditional techno. The prodigy, stuff like that. then I got into a lot
  254.      of IDM type stuff - orbital, black dog productions.. later in 1994 I
  255.      really started to get heavily into ambient music like Irresistable Force
  256.      and other weird stuff. Now i'm kind of coming out of that phase - a lot
  257.      of the stuff on the second FTZ album which i'm writing with IQ of Kosmic
  258.      is back to the hard techno stage. My latest thing though is not really
  259.      any kind of classified music that I know of. It might be 'trip hop' but
  260.      I really haven't heard anything that I knew IS trip-hop, so i'm not sure
  261.      what that is. A lot of slower, heavy groove things with different styles
  262.      of percussion use. It's music to bob your head to. So far 'loend' is
  263.      probably the only thing i've released that demonstrates this new
  264.      direction.
  265.  
  266.  GD: Do you have any goals, such as tracking for a full-blown demo?
  267.  
  268.  MA: I'm working on something like that right now - but that's not really a
  269.      major goal for me. I mean, this sounds cocky or something, but i've
  270.      already worked with people who are like the Steven Spielbergs of the
  271.      video game world on things that put my music in front of an audience of
  272.      40,000 people or more, so I really can't see demos as such a big thing.
  273.      It's the same thing as with music. Perfect test is to put the end result
  274.      on tape. Would you watch most PC demos on videotape? I wouldn't! MTV's
  275.      crap is more interesting! I guess changing the face of PC demos is one
  276.      goal i'd like to pursue. I'm much more interested as a long term goal in
  277.      things like doing music for a motion picture, and getting a lyrics-free
  278.      video on U.S. MTV.
  279.  
  280.  GD: I have to agree, I wouldn't bother watching a PC demo on TV. It would
  281.      just take all the magic out of it. MTV, though, is a different kind of
  282.      media, and like you say, relies heavily on lyrics.
  283.      How and when did KLF come to be?
  284.  
  285.  MA: I started it in either late 1991 or the very beginning of 1992 I think,
  286.      although I might be wrong by a year.. 1992 was basically the year it
  287.      began though. It started as a VGA and Ansi group, but we sucked pretty
  288.      hard at Ansi, so when I got into tracking it gradually became more and
  289.      more of a music group. by 1993 it was nearly all music. the group died
  290.      in spring 1993 but we resurrected it as a music-only group in September
  291.      of 1993. Now it's on it's way back away from music-only :)
  292.  
  293.  GD: About a month ago, a decision was made to change the group's name from
  294.      Kosmic Loader Foundation [KLF] to Kosmic Free Music Foundation [KFMF].
  295.      Is this something you had been thinking about for a while? What made you
  296.      decide to change the name?
  297.  
  298.  MA: Yeah, we had been considering a name change for at least half a year. We
  299.      needed to get away from being confused with both The KLF and Keen Like
  300.      Frogs, and we had started to use "Free Music Foundation" some, so it was
  301.      a pretty logical decision. This lets us put our names on CDs with a lot
  302.      less problem too :)
  303.  
  304.  GD: So you're thinking in terms of an identity crisis and commercially...
  305.      which makes sense... why let others get any credit for your work? :)
  306.      On December 23, "Santro" was released with a track composed by you for
  307.      accompaniment. How much time went into "Santro?"
  308.  
  309.  MA: I don't know exactly how much time went into Santro, because my only
  310.      involvement was writing the music. I wrote the music in two or three
  311.      hours I guess, all in one sitting. I think the whole coding was only
  312.      about the same, and Sophisto's cheezy santa anim can't have taken too
  313.      long :) It was put together really quickly.
  314.  
  315.  GD: You usually write MTM's. Why was the DSM music format used for "Santro"?
  316.  
  317.  MA: Ask GooRoo why DSM was used - I gave him an MTM in the first place :)
  318.      It's probably because we used DSIK for sound.
  319.  
  320.  GD: What do you see in the future of Kosmic?
  321.  
  322.  MA: Hopefully a lot more exposure. We'd like to get the word out to more
  323.      non-hacker people. That's probably going to mean doing less "free"
  324.      music, but we'll always be doing some. I'm really interested in working
  325.      out a kind of 'shareware' music - giving people a way to support
  326.      musicians directly if they like what they're doing. I think most of my
  327.      songs are worth at least $0.25 :)
  328.  
  329.  GD: A quarter? Hmm. You might have some trouble with your shareware music,
  330.      then. :) How do you expect people to react to this "shareware music"
  331.      concept?
  332.  
  333.  MA: While people might say "Oh no! That would suck!" They need to look at
  334.      the other side of it - if we could support ourselves doing this, or at
  335.      least help to support ourselves, we could do a lot more music, and a lot
  336.      better music. Most of us don't even have MIDI gear, and we're already
  337.      making music on a par with most commercial music.
  338.  
  339.  GD: You've been working on a CD project... Any news on that?
  340.  
  341.  MA: The sister of Kosmic, Area 51 Records, will be releasing my first CD
  342.      hopefully right around NAID. My partner Riku Nuottajarvi and I are
  343.      working really hard to get the company off the ground and well
  344.      established, and I think you'll be seeing some crossover between Area 51
  345.      and Kosmic.
  346.  
  347.  GD: In early January 1995, Kosmic's "Egg2: Trancescrambled" MusicDisk was
  348.      released. What are your future musicdisk plans, if any?
  349.  
  350.  MA: There will be another musicdisk or two in 1995, but right now other
  351.      things are the priority.
  352.  
  353.  GD: What experience do you have in writing music for games?
  354.  
  355.  MA: Well, i've written music for several already, and hopefully I'll be
  356.      getting more work in this field this year. I'd like to warn other
  357.      musicians out there that it's not necessarily as great as it sounds. The
  358.      first few were fun but I've had some projects that were really not much
  359.      fun. It's not a good thing to do just for money, as I've learned the hard
  360.      way. I am going to be more selective about what jobs I take in the
  361.      future, to only be involved with things that I can be happy with.
  362.  
  363.  GD: Are you planning to attend and compete in NAID? If so, will you be taking
  364.      the "Kosmic Train" to get there?
  365.  
  366.  MA: I'm hopefully going to attend NAID, although I don't know yet if I will
  367.      compete. I'm not too sure about how i'm going to get there though.
  368.  
  369.  GD: What kind of advice could you give to other musicians out there, who are
  370.      just starting out?
  371.  
  372.  MA: Don't listen to people who dis you and push you down - just keep working
  373.      at it. The best way to improve is to just keep writing lots of music. The
  374.      more you write, the better you'll get. And don't be discouraged if it
  375.      seems to take you a long time - some people just get it faster than
  376.      others. It took me three years to get to where I really feel "good".
  377.      Above all, try hard to be your own person. Individuality and creativity
  378.      is what separates great music from good music. Technical prowess may be
  379.      wonderful, but you're nothing more than a performer if you don't have
  380.      your own style.
  381.  
  382.  GD: We better throw in a Kosmic plug... Where can others find your songs, as
  383.      well as other KFMF releases via FTP, and is there any WWW sites for the
  384.      KFMF?
  385.  
  386.  MA: We have two FTP sites, one in the U.S. and one in Europe. Both of them
  387.      are really big sites but have occasional hardware problems, so if one is
  388.      down, try the other:
  389.  
  390.      US:     ftp.wit.com in /klf/songs/ subdirectories
  391.      Europe: ftp.luth.se in /pub/misc2/kosmic/songs/ subdirectories
  392.  
  393.      We also have WWW sites on both of these machines, in various states of
  394.      disrepair:
  395.  
  396.      US:     http://www.wit.com/~klf/
  397.      Europe: http://ftp.luth.se/pub/misc2/kosmic/www/
  398.  
  399.  
  400.  GD: Thanks for doing this interview! Hope to hear more from you and the rest
  401.      of the Kosmic guys in the future. Anything you'd like to add before we
  402.      close?
  403.  
  404.  MA: Yes. A huge thank you to all the people out there who listen and who have
  405.      really let me know they appreciate the music. You are the reason behind
  406.      the KFMF!
  407.  
  408. .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,
  409.  
  410.  <<Code>>
  411.  
  412. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  413.  
  414. _____Optimizing Vector Transformations on a Pentium by Tom Verbeure
  415.  
  416.  About 7 years ago, I sold my Commodore 128 after 2 years programming and
  417.  playing games (in C=64 mode) and bought my first 'big' computer: a 8088
  418.  clone, running at 8 Mhz with a hard disk of 32 MB.
  419.  
  420.  A few months later, I was programming in assembler and trying to get the
  421.  maximum possible out of the processor. It was fun trying to make clever
  422.  combinations of exotic instructions instead of the normal ones, just to win
  423.  a few cycles. Back then, optimizing was a real art and the rules were not
  424.  clear.
  425.  
  426.  Things have changed. Optimizing code on a 486 can be described by a
  427.  few simple rules:
  428.  
  429.    1. try to avoid anything but MOV, ADD and a bunch of other
  430.       core-instructions.
  431.    2. Don't use the result of an instruction as in the next one.
  432.  
  433.  Demo coders might add:
  434.  
  435.    3. Avoid floating point, use fixed point math. It's almost always faster.
  436.  
  437.  One of the only challenges left, is trying to find the best mapping of
  438.  registers to avoid memory variables in a main loop.
  439.  
  440.  Since I bought a Pentium-90 about two months ago (yep, it has the famous
  441.  FDIV bug), things have changed again and optimizing is fun again too: not
  442.  only is the order in which instructions are executed extremely important,
  443.  there's also a major shift in the way calculations are done: under optimal
  444.  conditions, floating point adds are as fast as integer ones (1 cycle) and,
  445.  much more important,  floating point multiplications can be more than 5
  446.  times as fast as their integer brothers!
  447.  
  448.  During the rest of the article, I will show you how I optimized a standard
  449.  vector transformation in floating point. Starting with the compiler
  450.  generated code, ending with a routine that is about 40% faster.
  451.  
  452.   Testing Environment:
  453.  * Pentium 90MHz with 8 mb ram
  454.  * C Compiler: Watcom 10.0a C/C++. 32-bits protected mode.
  455.  * Assembler: Tasm 3.0
  456.  * Dos extender: PMODE/W, public domain dos extender of Tran.
  457.  * Timer: ZenTimer of Michael Abrash, converted to 32-bits, with a
  458.    precision of 1 microsecond.
  459.  
  460.    ZenTimer and PMODE/W are available at Hornet.
  461.  
  462.  Timings were done as follows:
  463.  
  464.  Diskcache disabled, to prevent disk operations during timings. First a dummy
  465.  loop was executed to time all overhead. The dummy loop had exactly the same
  466.  instructions, only the call to XformVect was replaced by XformVectDummy, an
  467.  empty routine in another c-file. (Don't place the dummy routine in the
  468.  C-file with the timing code. Watcom is clever enough to eliminate the dummy
  469.  code completely!) After the dummy loop, the main loop was executed, with
  470.  XformVect. By subtracting the dummy time from the real time, one gets the
  471.  time spend in XformVect.
  472.  
  473.  Results:
  474.  
  475.  I will upload the results and source code to Hornet as soon as possible. I
  476.  hope to have FTP-access on Friday, but no promises...
  477.  
  478.  XFORMVECT:
  479.  
  480.  The caller of XformVect has to give three parameters: a source and
  481.  destination vector and one 3x4 matrix to transform between them. As the
  482.  bottom row of a transformation matrix is mostly [0.0 0.0 0.0 1.0], I
  483.  removed it.
  484.  
  485.  XformVect, written in C, was already in optimized form: every loop was
  486.  completely unrolled, it was just a sequence of 9 muls and 9 adds.
  487.  
  488.  As a worst case test, I compiled XformVect with full debugging mode on,
  489.  without any optimizations. I used wdisasm to convert the resulting .obj
  490.  file into a readable .asm file. The result (M1.ASM) is horrible and takes
  491.  98 cycles to execute (still faster than the best 486 code!). No further
  492.  comments required.
  493.  
  494.  The second and third test were also compiled C code, with full
  495.  optimizations enabled. Both resulted in the same code and would be near
  496.  optimal on a 486. The calculations for the X,Y and Z components are
  497.  identical, so just duplicate the listing below 2 times, update the offsets
  498.  and you get the actual routine (M2.ASM).  Next to the assembler
  499.  instructions, the stack is listed as it is after execution of the
  500.  instruction on the left . The first one being ST(0) and so on...
  501.  
  502.  C code:   D->X=M[0][0]*S->X+M[0][1]*S->Y+M[0][2]*S->Z+M[0][3]
  503.  
  504.      EBX: Source Vector
  505.      EDX: Matrix
  506.      EAX: Destination Vector
  507.                                        ST(0)     ST(1)
  508.  Asm FLD      DWORD PTR [edx+4H]     ; M01
  509.      FMUL     DWORD PTR [ebx+4H]     ; M01*S->Y
  510.      FLD      DWORD PTR [edx]       ; M00       M01*S->Y
  511.      FMUL     DWORD PTR [ebx]        ; M00*S->X  M01*S->Y
  512.      FADDP    st(1)                  ; M00*S->X+M01*S->Y
  513.      FLD      DWORD PTR [edx+8H]     ; M02       M00*S->X+M01*S->Y
  514.      FMUL     DWORD PTR [ebx+8H]     ; M02*S->Z  M00*S->X+M01*S->Y
  515.      FADDP    st(1)                  ; M02*S->Z+M00*S->X+M01*S->Y
  516.      FADD     DWORD PTR [edx+0cH]    ; D->X
  517.      FSTP     DWORD PTR [eax]        ; <empty>
  518.  
  519.  >From now on, S->X will be noted S0 and so on...
  520.  
  521.  This is very straightforward code and easy to understand. For those who
  522.  have never played with floating point assembler: FLD pushes a float on the
  523.  stack. FMUL multiplies its operand with the top of the stack and puts the
  524.  result at the top of the stack, FADDP adds its operand to the top of the
  525.  stack, places the result in the specified element and pops the top of the
  526.  stack. FSTP stores the top of the stack and removes it.
  527.  
  528.  Ok. This code (3 times) takes 58 cycles to execute, resulting in nearly 28
  529.  MFlops at 90MHz. These are workstation-like numbers! At first, it doesn't
  530.  seem a lot can be won by optimizing. However, several bad things happened
  531.  in this code: FADDP is executed immediately after FMUL, causing one extra
  532.  cycle and it is using the same register, causing another extra cycle.
  533.  
  534.         Please note that FLD after FMUL/FADD never adds an extra
  535.         cycle to the FMUL/FADD, because we're not using the arithmetic unit
  536.         or the result of a previous calculation. So, the first 4
  537.         instructions are optimal.
  538.  
  539.  How to avoid the extra cycles? Well, there is an instruction named FXCH
  540.  that switches the top of the stack with its operand. So FXCH ST(2) puts
  541.  ST(0) in ST(2) and vice versa. On a 486, FXCH costs about 3 cycles, so it
  542.  wasn't used very often on that processor. On the Pentium however, it's the
  543.  only floating point instruction that can run in the second pipeline
  544.  parallel to a limited set of other instructions. It's no coincidence that
  545.  this set consists of the most used instructions: FADD, FSUB, FMUL, FLD,
  546.  FCOM, FUCOM, FCHS, FTST, FABS and, most famous of all (except in Australia
  547.  ?), FDIV.
  548.  
  549.  This means that using FXCH after one of these instructions, no cycle
  550.  penalty is generated. It is FREE, use it! This leads us to the first
  551.  handcoded assembler version (M4.ASM). Only the code for one component has
  552.  been modified.
  553.  
  554.          FLD     DWORD PTR [EDX]         ; M00
  555.          FMUL    DWORD PTR [EBX]         ; M00*S0
  556.          FLD     DWORD PTR [EDX+4]       ; M01     M00*S0
  557.          FMUL    DWORD PTR [EBX+4]       ; M01*S1  M00*S0
  558.          FLD     DWORD PTR [EDX+8]       ; M02     M01*S1  M00*S0
  559.          FMUL    DWORD PTR [EBX+8]       ; M02*S2  M01*S1  M00*S0
  560.  ==>     FXCH    ST(2)                   ; M00*S0  M01*S1  M02*S2
  561.          FADDP   ST(1), ST               ; M00*S0+M01*S1   M02*S2
  562.          FADDP   ST(1), ST               ; M00*S0+M01*S1+M02*S2
  563.          FADD    DWORD PTR [EDX+12]      ; D0
  564.          FSTP    DWORD PTR [EAX]
  565.  
  566.  What has changed? After the FMUL, ST(0) is exchanged with ST(2), costing us
  567.  nothing. Next, two already calculated values are added, causing no extra
  568.  cycle to FMUL, because FADDP isn't executed immediately after FMUL and
  569.  FADDP doesn't use a result of FMUL. This code takes 56 cycles, exactly the
  570.  number we expected. Using this 'trick' for the 3 components, results in...
  571.  52 cycles (M5.ASM).
  572.  
  573.  Looking at each component separately won't help us much: there's just
  574.  nothing to move or to load after the first FADDP.
  575.  
  576.  The first FSTP costs 2 cycles and uses the result for the previous
  577.  instruction. That's a shame, because it costs us a cycle. We have 8
  578.  registers in our copro, so, just leave D[0] on stack and group all the
  579.  FSTPs at the end. This is gives us M6.ASM: two FSTP's removed and placed at
  580.  the end of XformVect. The last lines of M6.ASM now look like this:
  581.  
  582.          FADD    DWORD PTR [EDX+44]      ; D2  D1  D0
  583.          FSTP    DWORD PTR [EAX+8]       ; D1  D0
  584.          FSTP    DWORD PTR [EAX+4]       ; D0
  585.          FSTP    DWORD PTR [EAX]
  586.  
  587.  Execution time of M6.ASM is 46 cycles. 6 less than M5.ASM. That's 2 cycles
  588.  for each replaced FSTP ?! Two? Don't ask me why, I'm happy with it. But
  589.  wait! We're doing it again: D[2] is stored immediately after it was
  590.  calculated. Replace the last 4 lines with this (M7.ASM) ...
  591.  
  592.          FADD    DWORD PTR [EDX+44]      ; D2  D1  D0
  593.          FXCH    ST(2)                   ; D0  D1  D2
  594.          FSTP    DWORD PTR [EAX]         ; D1  D2
  595.          FSTP    DWORD PTR [EAX+4]       ; D2
  596.          FSTP    DWORD PTR [EAX+8]
  597.  
  598.  ... and ze rezultz ov ze Belgian Jury are... 43 cycles! I think that the
  599.  trick of moving FSTP to the end of the file also helps for a 486. If
  600.  someone can confirm this, please let me know.
  601.  
  602.  At this point, we have done everything to optimize individual calculations
  603.  for the separate components and it was relatively easy to follow everything
  604.  without writing down a complete stack-trace. We have shaved of 15 cycles
  605.  from the initial 58, which is already a substantial improvement. Looking at
  606.  the code, we can see that there are two conflicts for each component: two
  607.  ADDs are executed after an ADD. If we can remove these conflicts, a 2*3=6
  608.  cycle improvement should be possible. These improvements are not as easy as
  609.  before: a lot of instructions have to be moved to get the wanted speed.
  610.  
  611.  Let us first remove the conflicts in the first component.
  612.  
  613.  The original code looked like this:
  614.  
  615.  1       FADDP   ST(1), ST               ; M00*S0+M01*S1  M02*S2
  616.  2       FADDP   ST(1), ST               ; M00*S0+M01*S1+M02*S2
  617.  3       FADD    DWORD PTR [EDX+12]      ; D0
  618.  
  619.  4       FLD     DWORD PTR [EDX+16]      ; M10 D0
  620.  5       FMUL    DWORD PTR [EBX]         ; M10*S0  D0
  621.  
  622.  Conflicts are at the (2) and (3).
  623.  
  624.  To remove the first conflict, place (4) immediately after (1). Exchange
  625.  M[1][0] with M[0][2]*S[2]. There are no more calculations pending, now
  626.  execute the FADDP (2). Exchange the result of the add with M[1][0] (hopping
  627.  back to ST(0)). We can now safely execute (5). Exchange the result with the
  628.  only remaining number on the stack et voile, we've eliminated the first
  629.  conflict. Do the same with the second conflict and you get this result
  630.  (M8.ASM) :
  631.  
  632.  1       FADDP   ST(1), ST               ; M00*S0+M01*S1  M02*S2
  633.  4       FLD     DWORD PTR [EDX+16]      ; M10 M00*S0+M01*S1  M02*S2
  634.          FXCH    ST(2)                   ; M02*S2  M00*S0+M01*S1  M10
  635.  
  636.  2       FADDP   ST(1), ST               ; M00*S0+M01*S1+M02*S2  M10
  637.          FXCH    ST(1)                   ; M10  M00*S0+M01*S1+M02*S2
  638.  
  639.  5       FMUL    DWORD PTR [EBX]         ; M10*S0  M00*S0+M01*S1+M02*S2
  640.          FXCH    ST(1)                   ; M00*S0+M01*S1+M02*S2  M10*S0
  641.  
  642.  3       FADD    DWORD PTR [EDX+12]      ; D0  M10*S0
  643.          FXCH    ST(1)                   ; M10*S0  D0
  644.  
  645.  After dust had fallen back on the ground, one could time that, as expected,
  646.  everything ran in 41 cycles, 2 cycles less.
  647.  
  648.  It is left as an exercise (don't you hate that phrase?) to do the same for
  649.  the second component.
  650.  
  651.  Now let's have a look at the third component. Same problem here, but not
  652.  the same solution: there isn't anything to load anymore! Let's have a look
  653.  at it:
  654.  
  655.  1       FADDP   ST(1), ST               ; M20*S0+M21*S1  M22*S2  D1  D0
  656.  2       FADDP   ST(1), ST               ; M20*S0+M21*S1+M22*S2  D1  D0
  657.  3       FADD    DWORD PTR [EDX+44]      ; D2  D1  D0
  658.  
  659.          FXCH    ST(2)                   ; D0  D1  D2
  660.  4       FSTP    DWORD PTR [EAX]         ; D1  D2
  661.  5       FSTP    DWORD PTR [EAX+4]       ; D2
  662.  6       FSTP    DWORD PTR [EAX+8]
  663.  
  664.  Well. When there's nothing to load, let's store!
  665.  
  666.  After the first add, put A1 on top of the stack with FXCH and store it.
  667.  This is the result (M9):
  668.  
  669.  1       FADDP   ST(1)                   ; M20*S0+M21*S1  D1  D0  M22*S2
  670.          FXCH    ST(1)                   ; D1 M20*S0+M21*S1  D0  M22*S2
  671.  5       FSTP    DWORD PTR [EAX+4]       ; M20*S0+M21*S1  D0  M22*S2
  672.  
  673.  2       FADDP   ST(2)                   ; D0 M22*S2+M20*S0+M21*S1
  674.  4       FSTP    DWORD PTR [EAX]         ; M22*S2+M20*S0+M21*S1
  675.  
  676.  3       FADD    DWORD PTR [EDX+44]      ; D2
  677.  6       FSTP    DWORD PTR [EAX+8]       <---- Conflict. Aaaargh.
  678.  
  679.  And now for the big disappointment: I've been moving instructions around
  680.  and tried various combinations, but I can't eliminate the conflict on the
  681.  last line. If someone can resolve it, please send your solution to DemoNews
  682.  as soon as possible.
  683.  
  684.  As expected, we have saved (only) one cycle during the last step, giving a
  685.  total running time of 38 cycles. On a 90MHz machine, this gives us almost
  686.  43 MFlops, or more than 11 000 000 vector transformations/second! These
  687.  numbers certainly are comparable to lots of workstations.
  688.  
  689.  It is very important to notice that this kind of optimization is unlike
  690.  traditional optimization techniques, used in demos or games: we haven't
  691.  replaced calculations by tables or removed mults using a special trick. On
  692.  the contrary: we have added instructions and haven't removed a single one!
  693.  On a 486, one could suppose there were some RISCy things hidden behind the
  694.  surface, now, it is so apparent, you just can't ignore it. Make use of it!
  695.  
  696.  I wasn't able to time my code on a 486, but as we have added 10 FXCH
  697.  instructions, I think M9.ASM might be slower than the original, compiler
  698.  generated code. Moving FSTP to the end should be beneficial for both
  699.  processors, though.
  700.  
  701.  What are the implications of all this:
  702.  
  703.  First, when your program is speed-critical and math-intensive, you can't
  704.  just ignore the 486 and are almost forced to create a separate version for
  705.  each processor. If you can avoid floating point math but need lots of
  706.  multiplications, create an integer version for the 486 and a float point
  707.  version for the Pentium.
  708.  
  709.  Secondly, even when you don't hand-optimize your floating point code, the
  710.  speed-increase can be big. If you do optimize, it can be Very Big.
  711.  
  712.  Perhaps the most important implication, is that one might win even more by
  713.  redesigning the whole algorithm. I have a specific routine of my 3D engine
  714.  in mind, but I haven't tested it. I will try it in the future. If I was
  715.  right, I'll write about it.
  716.  
  717.  I realize that a lot of people don't have a Pentium yet, and that it will
  718.  take some time until it becomes the standard machine at demo parties.
  719.  Nevertheless, I think one has to be ready for a big shift in the way we
  720.  approach algorithms, code optimization and the use of floating point,
  721.  especially in demos.
  722.  
  723.  -Tom Verbeure / Synergy Design
  724.  
  725.  References:
  726.  * Pentium Processor User's Manual: Volume 3, Architecture and
  727.    programming Manual, Intel 1994, ISBN 1-55512-223-X
  728.  * Pentium Optimizations and Numeric Performance, Stephen S. Fried,
  729.    Dr. Dobb's Journal, January 1995
  730.  * Zen of Code Optimization, Michael Abrash, Coriolis Group Books 1994,
  731.    ISBN 1-883577-03-9
  732.  * Mijn eerste kompjoeter, Annie M.G. Schmidt
  733.  
  734.  Starting with the "begin 600" is a uuencoded copy of the source code
  735.  referred to in this article.
  736.  
  737. begin 600 vector_t.zip
  738. M4$L#!!0  @ ( %J@.QZJ=8:)"@$  ,8+   &    33$N05--W99+B\(P%(7W
  739. M0O]#E@Y&:$(7,KL98NFBI:$/9T!$^HC@0BR3+OKSI\$9%]-KQJ)5FKO)XGPY
  740. MO6ERX'[NCE^'E2CJ[2M2Q=/84ZLH&FN"_M19E'N-6.K$O.J*0;A"/R(6$@#B
  741. M]/T$R K;IRJ\RS[L(XP8XDF$UJWEO&4W6&3-U1L6BB^OYQW%YQJ^_3CN?J/+
  742. MNS[K^&?-S(%8C3?(NT'JW\&[1]^#-0V!;XSQ=I7UE+Q@60]V%XL![P+NXU$G
  743. M4S'I90YO^+]?-T[XK:^ES\'(2/,S([9G9(:(N2$BSPW1H,^1CC5'U- <47-S
  744. M1)^<(_V?E14&!UD><G1QRCV+X'S\*TJ=",WDT3*Q)M]02P,$%  "  @ 9Z [
  745. M'F/Q*,"<    / ,   8   !-,BY!4TVMD#T+PC 0AN<4^A\R*NG0"P[B)IRA
  746. M0\40XP=(*;7&302;H3_?+E:K)D/)C??POMP]Q^O]<=N;VI8+2D2.E.!AHY!*
  747. MK>C)7%HVRXHX(MV(]2X?P/,G_$VZ8R^R1)2DL1.8)HUU]K"Y[X(W_-?6[;[;
  748. MTKI/;+4<T*IU?\-@M @&:19,!H2U 3X;_J_X>"$\H! >5@CW"NGKU$K'T1-0
  749. M2P,$%  "  @ =* ['IFB 1S_ 0  &@@   8   !--"Y!4TVUE6UOVC 0QU\[
  750. M$M_AWF4MT50\-*&BOC"QRZKE2;&S(B&$& G:I%)0""H?O[83J/+0C$[4BHA]
  751. M=[__70YR?.T/OF\[!D(><1G(Y1(A+^=1V1S?)@[O&!V#CD,_"N"TCD?;][BP
  752. M]">VYI0(8LU'7"-SP2;BC0#.QB[S!-!'/Z001"/GP0;3]BDS(>+L&U89">>1
  753. MJL/FMSEO47Z;)[?X<:=+(^&8<4'LGRH70H4>3%:;=/TK669S91\"(Q.X YKL
  754. M,F74%JHL[B)+_Q[T>:3.?+-/ETD>TS'>5" (?1L\1D*990@/SUFZB??+)(;-
  755. M<P*KP_*/SK]ZBA&*7S9I#-LLA6D2'V9(QJ^G-S-YJ8CU_JD4\;L4<;TKPNI"
  756. MW?[L&->;00V0NJJ]9>D2(T.;P(9,@Q.%)3!MY^L/5.)EW!DBLH&J^EWV!5\A
  757. M5&U(,UYH*WP1Q]L<[UU9\E93Z)XA@,[%NPUTM86]W+/+MB7/XC#3/Y1[A^JW
  758. MH7@+1%A0_1\*NW<CI^I57V;N? >]:4&UAU :G)JTRUJD!FU5%,X&-6EJ4EOF
  759. M !=!U;LHGNG]4O#_-P1?KB'XH@W!K0T9% T)F2@-(.;10#F:9JKTZ5D[O+O$
  760. MZAAZD/]K9NMA#:8:]F8=^922\,=+PI]7DOZ?^UB7JLC%2QIQ#F>6)$/-.G&L
  761. M""&Y4YM74$L#!!0  @ ( (*@.QYP&=]89 (  *$*   &    338N05--M59;
  762. MCYI %'X>$__#>;-;2>.,UI@U^X! 3%,5XV#7Q!##"MMMLE8#F/KS.Q? 80'%
  763. MQ#5$8?@NAS-?\'SK#?J'9@.AF3ZUT%1WV#%YY@L3V] GM-EH-LSQPE[.$4+R
  764. MU[!GU-'$-]$VIN[HVF9$!7+C6"N' :DUGEHS!\QG>V'"?#F:_#"@9=BFU8(E
  765. MM;J$&^B4+IFG01\%#323/DHKC:9GHA!],;:HHQL_N05"4@ZM7O?A[E>PC3=\
  766. M>0B6OH(G,(,HYHMBQ>0K4R\._YS$]8A?T_TQW 82TVR<56"^L V86?J"F0R!
  767. M>KL O BFW\7ERS&&*-Z'002_P_WQ$/C@Q1"_!1#\]45=K^\^(/_?/O3A$(>P
  768. M#OR3"XRY6W=<=G#$[OB>0[SD$%^C!%84:O?<%(==*!"*NCD"PV$7U7 99"3"
  769. M7-8JO9:IRF<XDIA62IRV;RB*OY 'Q#[Y/I0Q$U'.]'S_P*GX06/;4F"W[\=N
  770. MEY _]@T3_N">>*J*UN*^[ WF+@GT0B!P5DR&+1$EG4Q4/F8)K3H;6,U&3<,S
  771. ME:2&2I?KV0\4C30E5W4*4<%J5 KT1#FCE^XX5G?\KA+M*H5"0P<R.=B]')\N
  772. MD4TC27QPC0P1M8OXXKYV^YF\?/XJ;G6:B)JF&ZQ[G8Q?^M*YH9*!HI0&B]02
  773. M*Z2+J.DJ:)PW%E_)!U'S<7^=]D690JM[,FP?H5%\R$&]I)770+WS6Z_LODQS
  774. M&,2Y?UEK9L[Y#75<8&MB?!@^W>/3;(C9I&H,$?,'M/C<TCI#/Z4$<D,-Y!.*
  775. M$,-9O1I2Z-U+&%%ZI0*&:&7 U%^<\9/_4$L#!!0  @ ( (N@.QYFP(-HB@(
  776. M .,*   &    33<N05--M59;;Z) %'X>$__#>7.[FDUG2@RIZ0,":3:K8AS<
  777. M-FF(H8*IB8J!,=N?OW-!0 &EB6U(Q>&[G#GS!<\O3>_OVRV$)L;81F/#Y=?H
  778. M12R,'-,8T7:KW;*>9\Y\BA!2GZ8SH6Y/_B>]A66X1F\QI!*Y<.U7EP.I_3RV
  779. M)RY8+\[,@NE\./IM0L=T++L#<VH_$&%@4#KGGB9]E#3H6?116?7H\4X68LR>
  780. M;>H:YA]A@9"20Z^K*-[^#9=L(98'8!NO\ 16F#"Q*%<LL3+V6;S^E-^'XCN-
  781. M#O$R5)AV*U>!Z<PQ86(;,VXR@,3?AN G,.[#^X'!>L?B*#@L0UA]+C_ 9\ ^
  782. M0@AW@02S",+->KO>^2R$A$5Q",MHM]JLE0E:;0((_D5Q 'L6PUL8?'J .&_[
  783. M=N_Q2R"VAPTJ0MX%)$/\3%)82:BK>9D2]J!$*.L*1D;@..RAZRYZ[D*XRUN1
  784. MWLA4]W(^QY'4M%:"=QDE[ >Y0PB=]:&*F8H*IA\$>T'%=SU^%B5V]W;L;@49
  785. MG34.$[%Q7^ZJNK6XG_86"Y<4>B$0."LFPY9%R7TNJK990:O/!BYFHYFAEAN2
  786. MHV&AR\WL=2_7.*;DJDXI*K@8E1(]5<[HE2>.BR=^4XENG<)Y<HBNDH.]B_%Y
  787. M(&GC21H?W"!#I-A%?.E<'_JYO-I_';<^3:28IN;6VGUN7?G2^4(ENI<K'8-%
  788. M&HF5TD6*Z2IIY >+K^2#%/-Q>YWN19GSL&F:"MLIM&+_?J%!ZJ67L/V)FJ]"
  789. M=@73S0QKGNO*/P[9R:^T/;&FXD%QW.!K<OP8/-WBK]V2LTW=&"/G%^B(N:>3
  790. M0[^E!/*%&L@W%"&'NV8U'*$W+V%(Z94*.**3 8_^\DZEY#]02P,$%  "  @
  791. ME: ['NMQV_>  @  [ L   8   !-."Y!4TVU5F^+HD <?CU!WV'>=;O*T4P1
  792. MLK$O3"6.*XW&;H.0\++E#C8*<[D^_CDS:F,SFD(;4C8^S_/[,\_([_O0&)VZ
  793. M'0!<<^Z N>FGU^R-+LP\RYR1;J?;L:=+;[4  /!?RW.)K[-OK&]MTS?U[80P
  794. MY-9WUGX*),YT[K@^M-^\I0T7J\GLAP5[EF<[/;@BS@#3 "8AJS2F15X8#>HV
  795. M>>&A=)+?L43,Y=0AOFG]I"$ X')@_7Z,#[_VNV1+E\?0,=?P%=K[<T(7V8I-
  796. M5^9A$O^]L/\3^I\</^/=GF.ZG:L*7"P]"[J.N61AWC\B"*)_QSB"IR2&FWUT
  797. M"2 8P\.F'Z0711P^/TJ(WR7$\SF#R4+:,,AQ*( 20=8M$5(<"D"#*$9!PFF4
  798. MC4AO%%3DISB<!:V4N.S^@'/R#3^!]%/N@XJ9B?)NAU%THF3TI,-S(O&U.CXM
  799. M'MP6CT8\>T0UVFBIJL@>PWH=Q(W1MASM-@0*R@U%12J\F(92/!.%204M)M%<
  800. M4)%2JZ(RJV0=DK8,TRT+LXR0RELWK<C2#PM5Q2G _<((Z$8X(]:=."2>. 53
  801. M%?!*+4J_=<G=\(:@D9^]NSJ2=9%X "5ZOCLY76E:).[O0R6T*@6IH0;W!0KJ
  802. M=WJ >=-PP)N"ZCJ<O:JQV$54NZ^#42'/ZZ_B5KL)BVYJ$7K8+_C*5WF+3 Q!
  803. M*3<6;B0FN0N+[I(TKAN+[O@#B_YXO(Y6*R.U>LC-5H8JZ@^%!O%WXSDYE=1"
  804. M;K([&*T(6/'<X/'C?5(:5QS77M 'XMR5KK$Y;/SZB$^WPX:\JGF.#7*P1P?
  805. MWA7Z)2G@%CG@+TB"3;G-<LBA#T]A0LB=#%)$KP#F\=D==\E_4$L#!!0  @ (
  806. M +&@.QX(Z!)TI (  'T-   &    33DN05--M9=O:^) $,9?K^!WV'=>+^$P
  807. M:Q"I]$5,@ARGB;CQ*D@0SUCNH*+$E.O'O_V3Q(W979.C%6GM=I[?/+,[DVZ_
  808. MV:/AN=L!('#F/I@[$7G/GNG"+'2=&>YVNAUON@Q7"P  _^Z& 8Y,]A696\^)
  809. M'',[P2QR&_GKB 1B?SKW@PAZS^'2@XO59/;=A3TW]/P>7&%_@&@"!^,5R>GB
  810. M1R:#IH<?>2H3%Y^8$6<Y]7'DN#]H"@ X#JQ?3NGQYV&?;>GR&/K.&CY![W#)
  811. MZ");\>C*?)>E?][9SQ/Z,SZ]I?L#C^EVKA2X6(8N#'QGR=*\O"80)']/:0+/
  812. M60HWA^0]AF ,CYM^3-XTXOCV6HGX58GX>LG#ZB##CHLX*X8U09U;$9 X*P8-
  813. MLHQ*$2)9-J*\45)13^)0GE2)>-__!I?L"WH Y%7=!YDRA_+=WB7)F8JM!Q->
  814. MLIK>T.EI\>"V>&O(W5N4T8:EJ4*CA$6J]N48"DYIQ2JM\&(:HK@329,*+(9H
  815. M#I18:E54WBKY#M6.#-$CV^6.K)OVKITPZI<G3$]#IM-/DR6<9?.L5W%9F):B
  816. M'R[K=I/N.)*UA-"0(DYEINC-@<C0J PQB6)7!HB7@^*KO TR+VM0[?1ZK J-
  817. M9*-WAV5H49('05[<G7(JV#LSB(09;(>5V/N/,O7SB$9\'LFVRU3R1AB6C<";
  818. MV-+D5(\FJ@R"BB%U8/=+!"H4558+.R.!54YI4W/Y"=G5!BH?N5J,XH]CG60T
  819. M!=6>';M\GC0L&>62G2N[M!,/K3E(K N5CF[C#"55;N4Z5PT BK:W;=[VRG)'
  820. M7)L>LLK]T0^\!?V%>!$F:^QB/'[ZB%>WPV[=J@LVNUG#'KV1]ZZAGV(!M?"
  821. M/L$$^[>CF8<B],,M3#"^XX!$],K (C_[Q+OD'U!+ P04  ( " #.H#L>7\XV
  822. M,9,!  !^!   "0   $U!5$U!5$@N0ZU276OB0!1]CN!_N+@O2<RV)L*^6/M4
  823. M L):%]LMMD5*,%>]D)G S*3$7?K?.Q_5&'!!82?SDG//.??<F?E&?%54.<*-
  824. M5(+XYFI[V^TT(,O4UD)'8*\>YE?;WC&B:8[9L\P<U\01O+0H14KUM"KNYWX=
  825. M[0+/K\-=8#C78;?C/:#ZS4GM%NM2,(-Z$_U+64$248"%(2LD(/(M4BYU$T%U
  826. MMQ->=SOO)>70<O 7Z6P^=3+=Y*_V(ZZ 1M::(9.H?%N-!I&D/UBNG20('$67
  827. M?!H/1G0S'%&_KST\S_)?::GW>'+_&/]X>YR]I3]G\W2R\&,C_#C,8[E/N%+6
  828. M[0D%0TZ;]ZK(:0,/9256:*K 4($2&9>&GRE"-Q=,C\8SGQWQ8.K_FND 0PCO
  829. M4"H#1+ JN53@QG;B/;;G-EV_3F0O_GZ[&$/K@IS!ZV"I=]3H-#& OCD*,.L?
  830. MDK@M>3Y#DK0E+\>2AC5<NKMI<C^?SAU?GCN^/'=\5N[X5.Z7T[F3RW,GE^=.
  831. MSLJ='')_G'J!=Q5CN__R#+_L/P%02P,$%  "  @ TZ ['GC40MJY 0  )P0
  832. M  D   !-051415-4+D.UDUUKVS 4AJ]E\'\0'BERICE.PBZV+H.M:TJAJ4WK
  833. MCJSDQK/EY#!9#K8<&DK_>RW%B=QT;.QB%P;I.1_O>P[RH&];:/8EBLYO(^_,
  834. MMII;Q"J)*\'XBD&*-[' >2Q+>, ;5N9,P')3\Q26():VU1^HDC<@$EZG#'^J
  835. M9 J%M_I\Q#C\/())(5XE-C(KC;IPR00K8W[,G8=QZJV<+FG*=QT<G9FR# 1#
  836. M7R\OKH(@O+Z;H;%O\)ZA\7O?]U7!IH 4Y3$(HDZN;3TVN[B\CL8C!%3MY*RH
  837. MA:01)+\J^JW.\ZT^GMH61O-I<#/3BYMG19DW#(6!JD7A</(X]'S:?D_=T.A4
  838. MZ3;@ELD[ 7*KB\FAC:OCJ.*,K<FPO1GEB:^:38N2 #53NLHV"N\CR%D9"-*6
  839. MZ3PSQ3Y919 6^\X2J7N3DW!$#Q[H2;A7/C3-LD-7X^;MI UK 9V GG;OZ?^8
  840. M_2>??[&X+D'(C#@+T<L<&HZ\N0Z^PC]^C^];&1-8"+.9C[C'@>(A3A6:]#*<
  841. M;!/.*J?SBB@F&2]BZ1HT(.W<_<Z^^A_\(PL+\5)D]Z_F->\*O=0@^OK.2+E_
  842. MTM(;>@902P$"%  4  ( " !:H#L>JG6&B0H!  #&"P  !@         ! "
  843. M        33$N05--4$L! A0 %  "  @ 9Z ['F/Q*,"<    / ,   8
  844. M     0 @    +@$  $TR+D%335!+ 0(4 !0  @ ( '2@.QZ9H@$<_P$  !H(
  845. M   &          $ (    .X!  !--"Y!4TU02P$"%  4  ( " ""H#L><!G?
  846. M6&0"  "A"@  !@         ! "     1!   338N05--4$L! A0 %  "  @
  847. MBZ ['F; @VB* @  XPH   8          0 @    F08  $TW+D%335!+ 0(4
  848. M !0  @ ( )6@.Q[K<=OW@ (  .P+   &          $ (    $<)  !-."Y!
  849. M4TU02P$"%  4  ( " "QH#L>".@2=*0"  !]#0  !@         ! "    #K
  850. M"P  33DN05--4$L! A0 %  "  @ SJ ['E_.-C&3 0  ?@0   D
  851. M 0 @    LPX  $U!5$U!5$@N0U!+ 0(4 !0  @ ( -.@.QYXU$+:N0$  "<$
  852. M   )          $ (    &T0  !-051415-4+D-02P4&      D "0#: 0
  853. &31(
  854.  
  855. end
  856.  
  857. ................................................................continued...
  858.  
  859.