______/\___________________________ __ ________________ ___ /\_______ \____ \ ________ _ _ ______ \ / \| \ ________ | \/ ______/ / | \ _) \ \_/ \ | \ / \ \ _) \ | \______ \ / | \ \ | \ | \/ \ \ /~\ \ / \ \_____ /_______/___| /________/\____\_____/_______/_________/________/ ===\_____/============|____/========================================[+tZ^]== DemoNews Issue #81 January 29, 1995 - February 4, 1995 ------------ DemoNews is a weekly publication for the demo scene. It is produced at the Internet FTP site ftp.eng.ufl.edu (HORNET). This newsletter focuses on many aspects of demos and demo making. Everyone is welcomed to contribute articles, rumors, and advertisements. Information about HORNET and DemoNews can be found under /demos/README Start.of.DemoNews.081,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., SIZE: 52,846 SUBSCRIBERS: Last week: 1220 This week: 1241 Change: +21 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' SECTIONS ARTICLES ---------------- ----------------------------------- General HORNET has been busy! New Uploads Files recieved at HORNET NAID Survival Guide Editorial General Protection Relationships Code Ctrl-Alt-Delete, Now Its a Game! Assembly Part 3 (It ain't no party) BSP Trees Back Issues How to Get 'em, Descriptions Closing Comments Quote for the Week, etc. ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., <> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' _____HORNET has been busy! Here are just a few things I would like to make the readers of DemoNews aware of: -ANSI: The ANSI is back on HORNET! After more flames than I could count (even with my socks off), I have decided to have an area on HORNET where the "packs" will be stored. Syntax Error (organizer of iCE) is now HORNET's main coorespondent in this field, and he will be maintaining the files in this area. However, there will not be an /incoming/ansi directory, only a /demos/ansi. Most of the previous problems stemmed from misuse of the /incoming/ansi directory. Syntax Error will keep up to 10 megs of the most current and wanted packs on HORNET. He will be personally responsible for keeping this directory updated. Also, any ANSI-related mail will be forwarded to him. You can reach Syntax Error at syntax@io.com. -MC3PLAY: MikMak, Rao, Stony, and Air Richter are currently working on a Music Contest ]I[ player. This will be used by the judges and contestants alike for playing MC3 entries. Remember, this contest will be officially announced at NAID on April 15, 1995. -DNDP: DemoNews Plus for DOS. Ior, Psibelius, and Zoltar are currently working on a DOS-based version of DemoNews. More than a plain vanilla- ascii reader, this is a full-fledged diskmag! It will include graphics, music, additional articles from the DemoNews staff, and best of all, will be released on a MONTHLY basis. Stay tuned for more details. -DN/HTML: Jeff (White Noise) / HORNET deserves a lot of appreciation. In the past couple of weeks, he has made enormous strides in making the World Wide Web version of DemoNews come to life. As the entire DemoWorld project becomes more concrete, you can expect quite a bit of coverage of it in DemoNews. -SLACKING: I have been very slow in getting two interviews done. The first is with Stone/Dust, and the second is with Gore/FC. I finally got the questions out to Stone, but the Gore interview still has yet to take shape. My apologies to these two individuals as well as the readers of DemoNews for the delay. -NEW FACES: Two new individuals have joined the staff of HORNET as columnists. They are Tom Verbeure and GraveDigger. I met Tom through Jason Nunn (dee-cug, another DN columnist and friend). Tom is an expert in the nuiances of hard core Assembler. GraveDigger is another new addition. Recently he did an incredible review of the Egg music for DemoNews, and this week he has done a "Survival Guide for NAID". I am very pleased to have both of these gentlemen furthering the HORNET mission. -LISTSERVER: There are two people not mentioned very often in this newsletter who do a lot of work for HORNET. Pi is the TRUE listserver coordinator for HORNET. Whenever the listserver crashes or goes buggy, Pi is the guy I count on to bring it back up. In a slighly different area, Martin M. Pedersen does one of the janitorial jobs here at HORNET. :) Each week when DemoNews goes out, I recieve lots of bounced mail notifications. I forward all of these to Martin and he sends me a list of who I need to (un)subscribe or help out. This is not a fun job and I really appreciate his help. -ASPHYXIA TRAINER: Over the past several months, I have been working on converting Denthor's "VGA Demo Trainer Guide" source code from Pascal to C++. In the background of the whole thing, FateGrinder and I shoot around ideas about how to optimize different assembler routines, etc. If you look at my code hard enough, you're bound to find some of his influence in there. I know I'm forgetting something... :) ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., <> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' NOTE: All locations start with /demos and then their respective sub- directory. Please note however that the actual base directories (like /pub/msdos/demos) may differ from mirror to mirror. Location Filename.Ext Size Description ---------------- ------------ ---- ---------------------------------------- /demos /alpha/NEW answer .zip 40 Answer by Warlock of Amnesty dfuse .zip 10 Digital Fuse intro by Uncle Bob/Zion einstein.zip 9 BBS Intro for Einstein BBS friends .zip 875 Straight Line Connection for 3S Party 94 greetro .zip 199 Happy New Year by Sunrise kiddo .zip 132 A.P.E.X Presents an Intro called Kiddo mciesc .zip 14 BBStro for MCI Escapes by Subsystem meet95 .arj 708 Something from Sti/Euphoria (GUS) naidtro .zip 144 The NAID Party Intro (SB only) southfix.zip 79 BBS Intro for South of Heaven by Omicron tornado .zip 23 Shocker presents Tornado Intro (no mus) xmas_dem.zip 658 Christmas Demo by The Paralytic Minds /diskmags bm9 .zip 580 Blackmail Issue #9 (stuff from TP94) yahoo04 .zip 286 Yahoo #4, The Hangover Issue /nets dginfo18.zip 16 Demogroups Interchange InfoPacked v1.8 /news nad_u01 .zip 1428 New Age Demo Database Upgrade: 1 /code /demosrc fcsp2src.zip 31 FC's StarPort BBS ][ Source incosrc .zip 241 Source to Inconexia demo by Iguana isad2src.zip 20 ASM source for Immortal Syndicate BBS kuk2src .lzh 159 Source for Pleasure Access BBS sea_code.zip 33 ASM Source to Seasick / VLA sqd1_src.zip 21 ASM Source to Squid1.com (BBS Intro) /graph/lens lenssrc .zip 40 BAS, ASM example of a Lens /graph/pallette fadecode.zip 30 C,ASM source for fades and pallette rot palrot .lzh 2 Pallette Rotate by Draeden / VLA /graph/plasma c_plasma.zip 55 C source code to color plasma jclplasm.zip 88 ASM,C For NICE color Plasma /graph/shadebob jeffbobs.lzh 75 PAS source for Shade Bobs /graph/tutor tut9new .zip 43 Part 9 of Asphxia VGA demo tutor in C++ /pmode dpmispec.arj 33 Protected Mode API For DOS Extended Apps protect .lzh 15 ASM Protected Mode programming example /sound fmed101 .zip 147 OPL3 FM Sound Editor for Programmers gp15-pas.zip 46 PAS source for GUS Modplayer gusenv .zip 1 ULTRASND environment checking in ASM gusp15 .lzh 19 ASM source for GUS Modplayer pps110 .lzh 84 Protracker Playing Source/Josh Jensen /utils basm10 .zip 297 Basic to ASM Language Translator frmi!150.exe 38 Flat Real Mode Interface v1.5 /music /disks f10_pck2.zip Force Ten Pack #2 f10_pck3.zip Force Ten Pack #3 f10_pck4.zip Force Ten Pack #4 rot .zip Rotation by Neophyte mini musicdisk traxx36 .zip Latest Traxx album /programs/frntend mplay12 .zip Musicplay 12.0 frontend music program /programs/misc readcda .zip Read digital data from CD using CDROM /programs/players radv1_0a.zip ADLIB tracker package (anyone use FM!?) /songs/s3m belly .zip Belly's Theme by Falcon (FM ADLIB) cannabis.zip Cannabis sativa by Transee dnc2trnc.arj Dance to the Trance by Hector doom-hth.arj Doom and Stuff by Hector dreary .arj Dreary as all hell by Hector epi-opus.zip Opuscule by MusicMan/Epinicion firesirn.arj Firesiren by Hector gonnadie.arj We're All Gonna Die by Hector k-udream.zip Unfaithful Dream by Boomer the Bass Pig messiah .zip Messiah by Transee mindrave.zip Mind of a Raver by Avatar mystwat2.zip Myst Water by Hector/DMK mystwatr.zip Part 2 of the above nois .zip Nois by Kevin, Fast drums & strange sou pl_dt .zip Song by Plastique/Dep pl_heart.zip " pl_know .zip " pl_move .zip " pl_rave .zip " pl_thund.zip " pl_uknow.zip " pl_who .zip " pl_zany .zip " renais .zip Renaissance by Null rh_cyu .zip Song by Red Horizon/Dep rh_insom.zip " rh_nw .zip " rh_ready.zip " rh_real .zip " rh_samur.zip " rh_sea .zip " rh_tod .zip " rh_vp2 .zip " sky_jung.zip Jungle Baby Love by D.J. Skyjump trn-imh .zip In my Hough by Transee trn-medi.zip Mental Diary by Transee wait4u .zip Waiting for You by Falcoln (Adlib) /songs/xm mftp .arj Music for the People by (see below) moby-go .arj Moby-Go by Pieter Van Den Veen /text life .zip Some text about a new group ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., <> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' _____Survival Guide by GraveDigger + . /\ . + . . / \ . + _____ 3\ __3____ \__/_______ Official Survival Guide \__ \3 \ 3\ \ + __ \ \ for the . / \ \ / _ \ / \ \____ \ . North American International Demo / _ \/ /_ \/ \/ 3 \ Competition . / \____/ \__/ __/__ \ April 15 - 16, 1995 \ / . \____/ \__/ + \______/ww :::\__/:::::::::::::::::::::::::::::::: Here is a practical(?!) guide to surviving NAID, the upcoming North American International Demoparty, which is to be held in Quebec on April 15th and 16th. There's still a few months left to prepare yourself for this event, so I decided to provide this guide for anyone who intends to attend. I hope you find this guide helpful, and remember to pack light. If you plan to sleep at the school, there will be a lot of people in one big room, unless you've reserved a room for a group. Of course, feel free to donate me some space if you're getting a hotel room. By the way, the above NAID logo was borrowed from the FILE_ID.DIZ of the naidtro.zip archive. I couldn't draw a logo of my own, and I liked that one a lot, so there it is. Personally, I have never attended a demoparty, though I have some ideas on how to prepare for it, as I'm more familiar with Canada than I am with Finland or Denmark. I'm hoping this guide can help everyone have the best possible time at NAID. This being the first party of this kind on this side of the puddle, I would like to see the date go down in history, and the party repeated in years to come. We need to show the Euros that we know how to party, too! Please keep in mind that this guide is intended merely as a complement to your regular luggage checklist. For your convenience, though, a small box has been placed next to each item so you can check it off as you pack it. Even though you now have this list, don't forget items like toothbrushes, toothpaste, deodorant or anti-perspirant... Oh, hell with it. I'll probably be the first to forget these items anyways. (Hope there's a drugstore in the vicinity?) _ |_| 1. First, you will need an English-French dictionary. As you know, Quebec is the French-speaking region of Canada. Comment vas tu? Tu habites aux Etats-Unis? Parlez-vous francais? Hmm. You might need to work on your accent, too. _ |_| 2. Next, you might want to take a life-jacket. Considering that a large portion of you will be crossing the St. Lawrence River to get to the school where NAID is being held, you don't want to take your chances with those bridges. _ |_| 3. You will want to have a source of caffeine. Whether it be in the form of money for soda machines or coffee, or your own beverage supply, it will be required to stay up after hours and party, at which time you will probably consume more caffeine, and party some more... and hell, who really wants to sleep anyways? _ |_| 4. Be sure to pack your teddy bear if you have one. Yeah, just look at that poor little guy sitting on your bed. How do you think he feels when you just leave him there? _ |_| 5. Bring along unfinished programs and songs and such, and maybe you can get together with someone else who has a pute and some knowledge, and work on it with them. In fact, here's a C program that I started which I need help with. If anyone can assist me, please let me know. (I just recently took up C as a hobby, so please bear with me.) -----[cut]-----[blah.c]----- #include /* Blah v1.0.0 */ /* 1/04/95 */ void main() { printf("The program is now running."); } -----[cut]-----[blah.c]----- I'm not sure what this program is going to be used for, but I'm sure once it is completed it will be really cool. :) _ |_| 6. If you bring your own computer to NAID, be sure to lock it up, if at all possible. At other recent demoparties, especially The Party 94, equipment was stolen or damaged. This only applies if you're not bringing your kid brother's CoCo, in which case you should leave it out in plain sight, and hope it gets stolen. Then, when the culprit is caught, everyone can point and laugh, and this should prove to be a funny experience, for all except one person. Hey, win some, lose some, right? _ |_| 7. You might want your own roll of toilet paper. Hey, you never know... I can imagine that it sucks to get stuck on the can without toilet paper. Have you ever hobbled down the hall to your toilet paper supply with your pants down? Uhh.. not that I ever have, I just don't imagine it being something any of you would want to get stuck doing. Yeah, that's it. _ |_| 8. If you have a flashlight, bring it with you. This can be used for finding the bathroom in the middle of the night, or just for reading porno magazines in your sleeping bag. For the latter option, this will let everyone around you locate you, and you can then trade porno magazines with each other. However, please keep in mind that I do not read porno magazines, nor do I promote pornography. _ |_| 9. If you have a beeper or pager, leave it home if possible. It would be just plain annoying to be watching a demo when all of a sudden, someone's beeper goes off, half the crowd turns to find the source of the noise, and misses the best part of the demo. Though it would be funny to hear a tune with such a sound in it, or even a phone ringing, and watch everyone looking for it. _ |_| 10. Keep a calculator with you and keep track of the exchange rate for your currency. You don't want to get ripped off when buying stuff or exchanging your money. And in the event you want to sell something, you can rip them off if you do it right. _ |_| 11. You might want to bring some homework with you. You'll most likely be away from home all weekend, and you might have some extra time during which you can study. Or if you're really lucky, your books will get stolen and you won't bother going to class anymore. _ |_| 12. Bring a portable radio. If you live somewhat far from Quebec, you can occupy yourself by finding cool radio stations that you'll never be able to hear again after Sunday. You'll also have something to look forward to when NAID '96 is planned. _ |_| 13. Two words: breath mints. :) _ |_| 14. Grab a flat-head screwdriver to take with you. What for? I don't know. Wait, hmm. Looks like I have run out of ideas for this list. I hope this guide becomes a part of your trip to NAID. Print it out, have it translated into french, sign language, and braille. Share this guide with others planning to attend. Fax it, snail mail it, tape it to your forehead. Memorize it backwards. Also, If you have any additions to this above list, please contact me at the email address below. Anyways, hope to see you there! GraveDigger [uuDW/CoRE] digger@freeside.scsd.k12.ny.us ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., <> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Much response was generated by last week's humorous editorial entitled Codethink(School);. This week, I take a U-turn from humorous to dramatic (hey, you can't expect me to be in the same mood every week). One small note: I will make frequent use of the pronoun "they" as being third-person singular. It is incorrect grammatically to have a sentence such as "Ask someone a question and THEY will give you an answer". The sentence should be "Ask someone a question and he or she will give you an answer". However, I will be using "they" as in the above example rather than filling this editorial with "he/she" everywhere. Enough said, let's go on... _____General Protection Relationships re-la-tion-ship, noun 1. a connection, association, or involvement. Without exception, every one of us in the demo scene has two things in common: we interact with computers and we interact with humans. In essence, we have relationships with both. Under close inspection, these relationships can actually reveal an amazing amount about who we are as individuals and how successfully we deal with others in our lives. Ask a computer what the sum of two plus two is and it will tell you four. Ask a human the same question and they will probably raise their eyebrows and wonder which mediation you've been taking. Ask that same person if they want to go and see a movie. Mabey they're sick, or busy, or tired, or just don't want to. If you're lucky they might even say "yes". Ask a computer if it wants to run a program. It might have difficulty, but that computer will die, trying to make you happy. If you think about it, a computer is your ultimate friend. It never tells you to get some sleep or do your homework. Its always there, waiting patiently for you to make a request. With games, demos, and various GIFs, the computer can give you hours and hours of entertainment. Even more, your computer actually changes with you: it remembers what you have done in the past and keeps track of what's new in your life. How many times have you had an argument with someone and gone to your room to watch Second Reality or play a game of DOOM? In that respect, a computer can help relieve stress. The computer is always in your corner, willing to help out with any problem you might have at the time. Over the years, I have had a lot of difficulty in forming lasting relation- ships with members of the opposite sex. Part of this stems from my inability to correctly guess what they "mean" all of the time. Say I ask woman X if she wants to go and eat at McDonalds. The reply is "well...ok". Let's just take a few possible interpretations of this answer: 1. "I am tired of eating at McDonalds, can't you think of anywhere else?" 2. "I don't really care where we eat." 3. "While I was saying the word 'well', I was actually trying to think of some place else we could eat. I couldn't, so I guess McDonalds is 'ok'." 4. "That was just a silly answer. You know I always love to at at McDonalds!" 5. "The only reason my answer came out like that was because I was watching the road for you to make a mistake while driving." 6. "What? Are you trying to tell me I'm FAT?" The list of guesses goes on and on. A computer only HAS two answers, yes and no (1 and 0). Its nice not having to play mind games once in a while. The computer is a shield between you and reality. It can transport your mind away from the physical world; away from the problems, the headaches, the work, and the daily routines that we go through every day. The more I think about it, I realize that our "Escape" CD was very appropriately named. As this article draws to a close, I begin to wonder if its any good or if I should just delete the whole thing and call it a day. I just asked my computer if it likes the article and it wouldn't tell me. Oddly enough, I feel like calling my parents right about now. -Christopher G. Mann / HORNET January 29, 1995 ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., <> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' _____Ctrl-Alt-Delete, Now Its a Game! by Denthor Telephone conversation : Fanus : Hello, Buys residence. Denthor : Hi there Fanus, whats up? Can I speak to Piet? Fanus : Ummm ... he's not in ... ummm ... who is this? I don't recognize you. Denthor : Don't worry, it must be my new haircut. Fanus : Oh. This must be Denthor. Hi all! I am back after a two week absence from the Demuan List. Today I am going to introduce you to two new games, which should make sitting at the computer and listening to music a lot more fun. The first game is one I have described before in my trainers. It requires two people and a computer. I like to call it Control-Alt-Delete. Here is how it works. One person gets the delete button, and the other person gets the Control and Alt buttons. Player one must then hit delete very quickly, while player two has to try and hit control and alt at the same time. If the computer reboots, player two wins, otherwise player one stays at his station. When player one wins, they swap sides and begin again. This game can provide hours of enjoyment, and really is great fun in between really boring lectures about stuff you learned years ago. When I invented the game, I thought I was doing really badly against Pipsy until I realised that the computer had frozen. Note : People have caught on how to play at the local university, and sneak up and play it on my computer while I am telnetting. Be warned. Also, the game isn't as much of a challenge when you play it by yourself. The second game I invented while I was on holiday last week (one of the reasons I didn't write an article) ... we were down the South Coast, stuck in a hotel room while it poured with rain outside. The Tugela river overflowed it's banks, the sand bars dissapeared, and the tan I was hoping to get never appeared. (I have been programming so much I haven't seen the sun for the past three months, so when I finally get to go away, it rains, of course. Way to go, Murphy.) Anyway, with no computers, no phone, South African TV and no nightlife, we had no choice but to listen to the radio. After a while of mind numbing boredom, I invented a new game. I haven't named it yet, but here goes. You listen to a song on the radio. Every time the singer says a word that is more then one syllable long, you add a point. You don't count words twice, or all songs would get a high score. Most of the songs got between three and five, but we lost count when they played a Counting Crows song. Ace of Base did surprisingly well, wile some rap artists didn't score anything. Try it, you'll be amazed. The PC Games Programming Encyclopedia part two will be out on the 10th of Febuary, I will make sure that Hornet is one of the first sites to get it. I hope to have up to number 20 of my trainer series in it. So, I leave you to pick a game and start playing! Byeeeee... Denthor - denthor@beastie.cs.und.ac.za PS. This no-GUS thing is a Creative Labs conspiracy, isn't it? _____Assembly Part 3 by Jason Nunn \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\[ "Implementation Techniques" - Assembly Part III \\\\\\\[[ By Jason Nunn \\\\\[[[[ \\[[[[[[[ ____________________________________________________________________ In this issue I will be discussing the basic nuts and bolts on how to implement an assembly program geared towards a demo. This article is intended for the C or Pascal programmer who hasn't quite got the confidence to use a full blown assembly compiler. In the first part, you may remember me telling you of a friend that has reached a turning point in his coding development, yet he still won't "take the plunge" because he doesn't have access to all the nice perks of 3GL's, like sine, cosine, and random functions and larger precision variables than the chip itself. This issue will hopefully provide that incentive. But...., before we do that, I would like to first finish off last article's talk on optimization. I forgot to include the fast string functions. I'm not going to waffle on too much about this now, as this article is dedicated to "assembly techniques". All I will do here is show my results, and give out some tips. Same things apply on this run - my machine is a 486-33 ISA, operating in P-mode, and the lower the number, the faster a given instruction is. STOSB [209729] MOV [EDI],AL [134226] INC EDI STOSD [306805] MOV [EDI],EAX [244208] INC EDI LODSB [209729] MOV AL,[ESI] [134226] INC ESI STOSD [306805] MOV EAX,[ESI] [244208] INC ESI MOVSB [228550] MOV AL,[ESI] [142124] MOV [EDI],AL INC ESI INC EDI MOVSD [384379] MOV EAX,[ESI] [324112] MOV [EDI],EAX INC ESI INC EDI Of course, REP operations are faster than their equivalent by about half. In general, it is better to use MOV's and INC's to perform one off operations. So if you're coding with these instructions, chances are that you can get a bit more speed out of your code. Ok, now on with the main talk. Generally, I won't be going into great depth as there are plenty of tutorials and manuals on the net that explain the rank basics of assembly. My role here will be to highlight and familiarize extrordinary things about coding methods of assembly. If you've never coded in assembly, then it may pay you to write your equivalent program in a 3GL first and before converting it over. I guess it depends on the person. I prefer to implement idea's in straight assembler. I'm comfortable with the language enough to mumble it in my sleep and their are no barriers or contingencies like there are in 3GL code. You can also run into serious problems when converting to your target language, but I'm sure that there are as many negative points about doing this as they are positive points. How to crunch huge numbers -------------------------- One of the first questions a new demo coder may ask is how he/she could add, multiply or subtract a number that is larger than the precision of the chip. Well, this really doesn't apply now, as the standard is 32 bits. This is ample for nearly all calculations, but for those of you that may want to perform a 64 bit ADD calculation, this is how you do it: ADD EAX,ECX ADC EDX,0 In this example, we don't have a 64 bit register, therefore we must make two data sources, whether they be registers or memory references to act as one large register. In our case, EDX and EAX act as one. EAX contains the least significant data and the EDX contains the most significant data of our 64 bit number. ECX contains the number we are adding to this 64 bit concatenated register. The basic idea behind this is that we first add ECX to EAX. If the number in the EAX register "clocks" then the CPU's carry flag will be set. The next instruction - ADC (for those of you that don't know) is a funny sort of ADD instruction that performs two add instructions. It will first add the source register to the destination register, and then add 1 to the source register if the carry is set. Hence the name "ADD ON CARRY". In our example, if the carry flag is set, we will only add in the carry flag as the source value is zero. Therefore, if the least significant component of our 64 bit variable (EAX) clocks, the it will carry over to the EDX component. Although the above example only adds a 32 number to the 64 bit number. If you wanted to add a 64 bit number to a 64 number then you would adopt the following: ADD EAX,ECX ADC EDX,0 ADD EDX,EBX Where EDX:EAX is the destination 64 register, and EBX:ECX is the source register. To add larger precision's, we simply chain!. Here we are adding a 32 bit number that resides in EAX to a 128 bit number which is stored in EDX,EBX,ECX and ESI. ADD EDX,EAX ADC EBX,0 ADC ECX,0 ADC ESI,0 To subtract, the same principle applies, accept we use SUB and SBB instructions: (a) (b) SUB EAX,ECX SUB EAX,ECX SBB EDX,0 SBB EDX SUB EDX,EBX With the 486's math coprocessor, the large multiplication and division is more viable than our old conventional way of calculating large numbers; which as you will see and very slow. Pretty soon, I will be exclusively using coprocessor calculations in my demos, as they are extremely popular now. Hence rendering the following code (for me) obsolete. However, for names sake, I'll discuss the old way of doing things... For multiplying a 64 bit variable to a 32 bit variable you can use this algorithm: MOV EAX,ESI MUL EBX PUSH EAX EDX MOV EAX,ESI MUL ECX POP ECX EBX ADD ECX,EAX As a formula, the code is equivalent to this: ECX:EBX = ECX:EBX*ESI. Note that you can chain this one also by taking the EDX value from the second MUL and multiplying it by the next significant register of the source and adding that answer into the respective register of the destination. Dividing is a little bit more complex. How complex?...this complex: PROC LONG_DIV OR EBP,EBX JZ @@jump_0599 PUSH EBP MOV EBP,ECX OR EBX,EBX PUSHF JNS @@jump_0548 NOT ECX NOT EBX ADD ECX,01 ADC EBX,00 @@jump_0548: OR EDX,EDX PUSHF JNS @@jump_0557 NOT EAX NOT EDX ADD EAX,01 ADC EDX,00 @@jump_0557: MOV ESI,ECX MOV EDI,EBX XOR ECX,ECX XOR EBX,EBX MOV EBP,0021h @@jump_0562: RCL ECX,1 RCL EBX,1 SUB ECX,ESI SBB EBX,EDI JNB @@jump_0570 ADD ECX,ESI ADC EBX,EDI @@jump_0570: CMC RCL EAX,1 RCL EDX,1 DEC EBP JNZ @@jump_0562 POPF JNS @@jump_058A NOT ECX NOT EBX ADD ECX,01 ADC EBX,00 POPF JNS @@jump_058D JMP @@jump_0597 @@jump_058A: POPF JNS @@jump_0597 @@jump_058D: NOT EAX NOT EDX ADD EAX,0001 ADC EDX,00 @@jump_0597: POP EBP @@jump_0599: RET ENDP This formula divides EDX:EAX by EBX:ECX. Just in case anybody recognizes this thing, I've reversed it from a certain popular commercial package (not giving any names) hehe :). I havn't used it since my real mode days (which, for the record is about 2 years ago when coding TC669), and it's basically optimized for that. I've made no attempt to optimize it for P-mode, as I most likely will never use it ever again. How to implement a Decimal point (or rather - a hexadecimal point :) -------------------------------------------------------------------- Now that we have discussed the ways in which we can do a whole range of calculations, your next question is how to implement floating/none discrete calculations. For that, we must take a register/memory unit and divide it into two parts. The number and a mantissa. For the sake of efficiency, you would typically contain this in a single register, namely a 32 bit register. I usually use this type of construct (represented in binary): /------------32 bits------------\ NNNNNNNNNNNNNNNN.MMMMMMMMMMMMMMMM Here you have a 16 bit actual number, with a 16 bit mantissa. As you can see the actual number is of a higher order than normal. If to wanted to extract the number from this variable, you can simply perform a SHR 16. This will arrive you at the "NNN...." component of the number. Here is an example of 1 and a half: 0000000000000001 1000000000000000b If we wanted the discrete part of the number (ie the "1" part), then just perform a SHR 16, which arrives us at: 0000000000000001. As you can see, there is no real difference between discrete and non-discrete variables. To the machine, it's all the same thing. The difference is the way you interpret the product. Calculations are still no different to normal numbers. If we wanted to add a "half" to this number then it's as simple that this: MOV EAX,00000000000000010000000000000000b ; this is a decimal "1" ADD EAX,00000000000000001000000000000000b ;this is a decimal "0.5" So, as you can see, it's not very hard. For multiplication, you're going to have to include a SHRD instruction, as the number will now be in EDX and the mantissa in EAX, hence the precision is now larger. This will return the number back to the EAX 32 bit precision that it should be. Here is an example: MUL ECX SHRD EDX,EAX,16 Here, we multiply EAX by ECX, which arrives at EDX:EAX. Then we just step down this answer to arrive at the result, witch will now be contained in EAX. With division, it's the opposite: MOV EDX,0 SHLD EDX,EAX,16 DIV ECX Here we are dividing EAX by ECX. Note the preparation just before the divide. Signed Data ----------- As of now, we have only discussed unsigned data. Generally speaking, these calculations are very simular, but there are some major differences. Contained in a given 32 register, unsigned numbers go from 0 to FFFFFFFFh, where as 32 signed data range from 80000000h which is the lowest number and 7FFFFFFFh begin the highest number. When using signed data, there are only a couple of extra things you must know. Signed data has its own multiplication and division instructions (ie IMUL and IDIV), and its own set of conditional jump instructions. JL (jump if less than) and JLE (jump if less than or equal to) are a signed equivalent to JB (jump if below) and JBE (jump if below or equal to). JG (jump if greater) and JGE (jump if greater than or equal to) are the signed equivalent to JA (jump if above) and JAE (jump if above or equal to). To change our unsigned divider from this.... MOV EDX,0 SHLD EDX,EAX,16 DIV ECX ...To a signed divider, simply substitute the MOV EDX,0 with a CDQ. The CDQ extends a signed number in EAX into EDX. Example given: CDQ SHLD EDX,EAX,16 IDIV ECX Implementing Complex mathematical relationships ----------------------------------------------- At one time or another, a coder is going to have to use some sort of complex mathematical function like triangle ratios, logarithmic factors and random numbers to implement various things. To create a function that maps a relationship in real time is basically impossible in efficiently terms. The only way you can do this is to store relationships in the form of tables. This may not be apparent to users of compilers like turbo C etc but electronic calculators, compliers, maths coprocessors, spreadsheets all use this method of mapping these relationships. it a very fast a convenient way of doing things. The first common function is the random function. A random signal can be achieved using the following algorithm. The product of this function is a random number stored in the EAX register. ;input: NIL; output: EAX proc random mov ebx,[random_seed1] lea ebx,[ebx*4] mov eax,[ebx+@@rantable] mov ebx,[random_seed2] lea ebx,[ebx*4] add eax,[ebx+@@rantable] mov [ebx+@@rantable],eax inc [byte random_seed1] and [byte random_seed1],01111b dec [byte random_seed2] and [byte random_seed2],01111b ret random_seed1 dd 2 random_seed2 dd 13 @@rantable: dd 0fd8fce7ah,02d7ad7b7h,0f48a8f3ab,04a3b8f8bh dd 0f2dec542h,0a847fab7h,0f4da81aab,04a348f86h dd 024547edah,03b535a43h,0b35a535ab,0aa333483h dd 0fd2f4e7ah,0c525a5b7h,016d3b4a4b,0643b4fd3h endp If you expand the table to 256 entries then you could eliminate two instructions, but there again, it's not worth doing. This random function will give you a very random signal :). There is only one problem with this algorithm, and that is, the randomness will always follow the same pattern. If this feature undesirable, then you may like to make an initiation module that jumbles up the seeds or the numbers a bit. An obvious way of randomly choosing a seed, would be to store a fixed reference variable in memory. For example: proc randomise mov al,[043253445h] mov [byte random_seed1],al mov al,[012345678h] mov [byte random_seed2],al ret endp Anyway, I'm going to stop here as it's getting very close the deadline time. One day, I'll learn not to leave things till last minute. In the next part, I'll be hopefully finishing up this assembly series and moving on to my talks of sound/tracker programming (the interesting stuff). I'll be soon releasing a tracker that I have written called FunkTracker. With this will be the full source code listing. My discussions will be based around my knowledge and experience when producing current and past trackers and players, and discussing implementation and hardware issues. I also plan to discuss reverse engineering using microsoft CodeView, and plan to obtain hack docs on the AWE32 card. So this will be all coming up!. until next time. See ya :Jason Nunn _____BSP Trees by Tom Verbeure Problem situation: sorting polygons is slow and can be incorrect for certain view-angles. Heavily influenced by Computer Graphics, Principles and Practice, I have written this small tutorial for BSP trees, which solves the problem for static objects and for every view angle. As I already said: Binary Space Partitioning Tree. Unlike many other abbreviations, this one really explains a lot of the algorithm: it uses a tree. It partitions space and it partitions in two parts. First: it is only usefull in static scenes: no 3D morphing or other goodies are allowed. Let's go to the 2D case, 3D is exactly the same. Take a sample scene: A\ ----- C| \ B E | ------ | | / . / V D/ The positive side of the polygons is the side with the defining character... Ignore V for now. One could sort this thing during rendering, but as there can be no correct sort criterium and sorting is slow, we don't want that. Besides, we have memory to spare :-) Now, we're going to build a tree that is totally viewpoint independent: Take polygon B as the root. Polygon B divides space in to parts: the positive and the negative side (Geee!) We have partitoned space in two. First, scrap B from the 'not-used' polygons-array and classify the remaining polygons. Group those on the + side, and those on the - side. As you can see, polygon C is both on the + and the - side. What to do? Create 2 new polygons C+ and C-, erase C. Is there another complainer ? Nope: all poly's are on either the + or the - side. Now we have this situation: B / \ A,C+,E D,C- Not really a tree yet, but we've only started... Now, do the same thing for the groups at the child nodes, without caring about those in another child-node. For the + side of B, we have polys A,C+ and E. Take A as next node polygon. Neither C+ nor E are on it's negative side (we ignore D and C-). For the other node, take D as next node polygon. Only C- remains there, and it is on the negative side. That side of the tree is finished. We have the following situation: B / \ / \ A D \ \ C+,E C- There's one child with more that one poly left. Take C+ as node polygon, E become it's child, on the positive side. We're finished. Situation: B / \ / \ A D \ \ C+ C- / E Now, what can we do with it? A lot... Suppose the viewpoint is at position V. In which order do we have to sort the polygons, when using a back to front rendering algorithm ? Answer: walk the tree, make sure all nodes (including children) are visited. Start at the root. Is V on the positive side? Nope, well, we want the polys far away first, so walk the positive way. Are we on the positive side of A? Yep, walk the negative way. It is empty! Ah. Well, draw A first. The go the positive way. Are we positive of C+? Yep. Negative way of C+ is empty. Draw C+ poly. Go positive way of C+. E has no child, draw it. Go up until a non-empty branch is found, draw all node polygon not drawn already. We now arrive at B again. Draw it. Negative is not visited yet, walk it. We're negative of D. Positive way is empty. Draw D and go negative. C- has no child. Draw it. All nodes have been visited. The end. We have drawn the polygons in following order: A, C+, E, B, D, C- which is a correct order. The BSP tree has to be constructed only once and for all. From then on, sorting the polygons is always correct and in linear time. Standard sorting algorithms can be proved to be of n*log(n) order of time, so we have an increase in speed as well. Disadvantages: - Memory: one has to have the tree in memory. This can be substantial for lots of polygons. - Polygon splitting: one ends up with more split polygons. It is almost always unavoidable to do splitting. - Polygons are not allowed to move. A BSP tree is NOT unique: just pick another polygon as a node and one gets a different one. In this case, one can avoid splitting polygons: start with a root and build the following, correct, BSP tree: C / B / \ A D / E Tadaam! No polygon splitting! Building a tree with as little splitting as possible is an exponential of the number of polygons. As Foley and Van Dam says, just try a limited number of nodepolygons, pick the one with the least splitting and the tree will be good enough. Voila. That's it. Not too difficult I think. Notice BSP trees are also usefull to sort objects, by using planes that divide the space in such a way that Object A is on the negative and Object B is on the positive side of the plane. Very useful (only for non-intersecting objects). This text is written without the Bible (Computer Graphics, P&P) besides me, but since I read their chapter about BSP trees many times, it contains almost the same info. For polygon splitting algorithmes, there is one in Graphics Gems. I don't know which one, but buy all four books, you won't be disappointed... :-) Tom Verbeure Synergy Design ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., <> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' _____How to Get 'em After reading this issue of DemoNews, you may be wondering how you can get previous ones. Well fear not! There are two different ways to do so: 1: FTP to hornet.eng.ufl.edu and go to /pub/msdos/demos/news/OLD_NEWS and start downloading anything you see. 2: Now you can request back issues of DemoNews via e-mail. Start a letter to listserver@oliver.sun.ac.za (any subject line) and in the body of the letter include "get demuan-list " where INDEX refers to the index number of the issue. For example: get demuan-list 43 This would retrieve DemoNews #76 (part 1 of 2). For more recent issues that are split into multiple parts, you must send an individual request for each index number. _____Descriptions Issue Index Date Size Description ----- ----- -------- ------ ---------------------------------------------- 75 41,42 12/18/94 68009 A DemoNews Reader, The Birth of Commercial Life, Editorial: Calm Before the Storm, Interview with Mello-D, US Demo Scene (Renaissance meeting), Jelly Tots and Pizza Shops, Review of Wired '94 Graphics. 76 43,44 12/25/94 92589 Interview with EMF, DemoNews Readers Write, Kimba's Life Story, X-Mas in the Demo Scene, CORE, Demo & Music Database, Interview with Purple Motion/Future Crew, Interview with Krystall/Astek, Common Sense ][ by Perisoft, Its X-Mas in Africa, Interview with Maxwood of Majic 12, Assembly Part ][, Common Sense Response by Stony. 77 45,46 01/01/95 101100 Chart History, Snowman Near-Disaster, Son of Snowman, The Party 1994, Making Waves, Using Assembly Part 2. 78 47-49 01/08/95 111185 The Party 1994: Results and Reviews, Report by Stony and Friends, What happened to PC- Demo competition. Editorial: TP94 = ASM94 part 2. Egg2: Trancescrambled Review, More on Fast Tracker 2.03. General Rambling by Denthor. 79 51 01/15/95 41832 A Day in the Life of Snowman, Ambient Sample CD 1, Where's the Sound Blaster, TP94 Graphics review. 80 55 01/22/95 27028 DemoNews/HTML, Traffic Jam, CodeThink(School); The Solo Sample CD ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., <> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' The quote this week comes from "Assembly Language for the PC, Third Edition". p.174 "A program is never done...but it must be stopped somewhere." This was intended as a moral for programmers, but with a little rewording the message is applicable to many areas in life. See you in CyberSpace, -Christopher G. Mann (Snowman)- r3cgm@dax.cc.uakron.edu ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,End.of.DemoNews.081.