Jim Norris
Members-
Content Count
57 -
Joined
-
Last visited
Content Type
Profiles
Member Map
Forums
Blogs
Gallery
Calendar
Store
Everything posted by Jim Norris
-
Are you up for programming questions Mr. Price? If you are, I have a million. What to label things is probably the hardest part of programming for me. I've read on here that you've used things like whatever is on HBO for your labels in the past. I'm tempted to try that but my memory isn't so good anymore. Do you still use this technique, and if so, how do you figure out what you did when you look at it later? Do you use a specific process when programming? In my mind I'm picturing some super artist zen thing where you get in the zone but I know the military doesn't go so much for that stuff. I came from the embedded world where you can't assume there is unlimited memory. When I learned C++ I found out there were serious issues with the memory model. Particularly if you don't get the memory during a constructor, or during an exception (if I remember correctly. I think at one job we had a rule to not allocate memory in C++ constructors.) It's been a long time since this time but I was wondering if the standards committee ever addressed these issues? C and C++ also don't have an easy way to incorporate more complex types of compile time data in the language itself. Instead you have to load it from a file or use code to fill out structures and stuff. I don't know if the standard covers it, but the modern C++ compilers out there still don't have uniform ways of initializing things like arrays of structures at compile time. Do you know why? I also remember pre-ordering the Dungeon and getting it in the mail with that flyer advertising for programmers. (At least I think it was with this game, been a long time.) I was so naive I didn't realize what that meant. For years I wanted to grow up and make games like you, and was very curious about your story. Then one day I found it online and it wasn't what I expected. I followed the news all along and when AR Online looked like it might happen I was very excited. But that fell through too. (I was also wondering how I would play it since it seemed to need some really advanced hardware... but anyways...) I was wondering how things worked out for you. Have you found anything you truly enjoy doing? Or another way of asking this, what would you do if you could do anything you wanted to do? Do you like the job you have now?
-
Seems a shame they should win, and that the kids won't get to see our favorite game the way we got to see it. How hard would it be to make a version using the AR Wrapper that runs on the Atari800 emulator for IOS or Android? Non commercial of course. Although, the Atari800 emulator people had some legal issues with the Android market because (I think... my memory is terrible) a lawyer for Atari sent out letters to everyone using the word 'Atari' asking them to cease and desist. So the Android people banned the Atari800 people until it was resolved. I'm not sure how it all worked out. I see that the Apple store takes a different approach. From Apple's web interface it appears Apple's lawyers hook you up with the infringer via email and let you work it out amongst yourselves. In the meantime the app stays on the store. Does this mean anyone could take just take any old game, put it in an emulator, and sell it on the app stores, with no consequences?
-
Alternate Reality Advanced Music Processor Disassembly
Jim Norris replied to Jim Norris's topic in Atari 8-Bit Computers
Apparently I didn't remember correctly, and the setup notes are out of date. Here's what I did to get it to work last time I tried: I managed to get it up and running under Vista and Mysql 5.2ish. It is available from http://www.rainbarrel.com/ardisassembly30dec2012.zip To use it, copy the ardisassembly folder to c:\inetpub\wwwroot\ First you need to associate .dglu with diaperglu.exe in Vista's internet information services for the ardisassembly subfolder. (you may also have to enable cgi... but I think it comes already enabled.) Then you need to have mysql installed with the mysql odbc connector. Then you have to make a data connection under windows. Then you need to make an empty database called 'alternaterealitydb' using mysql. I was not able to create a database through the ardisassembly project interface.... a permissions problem probably. Then you need to edit config.dgluinc to set up your connection string to the database. If you use the values in config.dgluinc to set up your data connection then you won't need to change config.dgluinc. You set up the connection at: control panel -> Administrative tools -> Data Sources -> system dsn tab After this everything is automated. Open your browser and go to http://localhost/ardisassembly/index.dglu. Then click on the Administrator button on the left. On the Administrator page there is an option to unpack the database from a packed file. Enter ardbbackup17jan2009.pkl in the file field and 'whensomearelost' in the password field and enter. It will take awhile but the database should be set up. Then you should be good to go. It's not exactly the most user friendly thing, and it IS possible to mess up the database if you aren't careful. However you can always just use the unpack feature again to wipe the database and reinitialize it. And you can use the pack feature to save your progress. The message features do not work because the tables for the messages are not in the database. -
Alternate Reality Advanced Music Processor Disassembly
Jim Norris replied to Jim Norris's topic in Atari 8-Bit Computers
Yay! For those asking to see the disassembly project, you can download a copy of it here: http://www.rainbarrel.com/ardisassembly30dec2012.zip It's not easy to set up, and it's very picky about the versions of server software you use. I think it's in the setup notes. In particular I think there is an issue with newer versions of iis and pathing/permissions requirements. Microsoft changed something to become standards compliant and enforced a rule they were originally lax on if I remember correctly. Something that is fixed in newer versions of Diaperglu. Good luck. -
Alternate Reality Advanced Music Processor Disassembly
Jim Norris replied to Jim Norris's topic in Atari 8-Bit Computers
That would explain the branch never instruction :-) I don't think anyone has yet as far I know, which is a shame. The ones I've seen, like Garage Band and Voyetra, also don't allow volume envelopes or frequency envelopes which means you can't do things like sfortzandos. Or do things like a slow crescendo over one long held note. You also can't adjust the pitches used in the scale and are instead locked into the even tempered scale. I noticed Gary did both frequency and volume vibratos in the music for the games using the A.M.P. Something that is still not possible on the modern music editors I know about. I mean, there is vibrato... but I think you pick it for the instrument and are locked into it for the whole track... with the A.M.P. you could specify it on a per note basis and even do things like have it get faster or slower over the note, and then do something different on the next note. Or even make it random so it sounds a little different every time. I wish someone would make a better music editor/synthesizer which had the features of the A.M.P. In particular, I'd like the ability to adjust the frequencies of the scale, or the ability to play any frequency possible so you could do true orchestral tunings and get perfect cords. That way you could hear how a classical piece was supposed to sound, or even get the barbershop feel for barbershop music and other a capella music. (For the people who don't know, most music is based on a compromise scale called the even tempered scale where each note is slightly out of tune. That way no matter which key the music is in, each note isn't too far out of tune. But if you have a piece in the key of G for example, you 'could' tune the instrument to that key and get much better sounding chords. But if you try to play a piece in another key... the relationships between the notes of the primary chords are not matched as well so it doesn't sound so good. I've been told this is why Liberace used multiple pianos in his performances and is also the secret to why his playing sounded so good. I also suspect Gary took advantage of the Atari's ability to set a wide range of frequencies and was able to get nice chords, whereas other developers copied scales using frequencies close to the even tempered frequencies.) For those who want to see the ampdoc in a nicer html format, I've reposted it here: http://www.rainbarrel.com/ampdoc.htm Also, Phil, if you are still reading this, someone has asked to see the AR disassembly project but I can't afford to put it up anymore. I was gonna send him a copy but the database that goes with it contains the original disk images in it... I was wondering if it was OK to post the disassembly project with the database containing the disk images publicly? -
Alternate Reality Advanced Music Processor Disassembly
Jim Norris replied to Jim Norris's topic in Atari 8-Bit Computers
I could send a copy of the disassembly project to you. It's kind of a pain to get set up though. Here's what I found out about the AMP: Alternate Reality the City Advanced Music Processor Docs by Jim Norris v1.1 March 5, 2010 Twenty-five years later and the Advanced Music Processor still seems to be ahead of it's time. An independent script for each of the four hardware channels. One level deep subroutines. Counted loops (repeats). Volume, frequency, and distortion modulation (vibratos and sfortzanos). Volume and frequency slides. (slurs, crescendos, and decrescendos). Randomized delayed channel syncing. Randomized script branching (for choosing random verses). Karaoke text with one syllable highlighted at a time. Advanced Music Processor script format: Each script contains a series commands. Each command contains a command byte followed by 0 or more data bytes. Advanced Music Processor script command documentation format: Command title (code start address) Command byte code format Command description Advanced Music Processor features: A.M.P. Script Commands Repeat From Beginning (0x85B5) 0xFF Jump back to the beginning of current channel's audio script. Call Subscript (0x8617) 0xFE addrlo addrhi One level deep subscript call for current audio channel. Return address is saved to a variable so this command can be used pretty much anywhere unless you are already in a subscript call from this command. Command 0xFD is used to return from this call. Subscript Return (0x862A) 0xFD Return from audio subscript started using command 0xFE Set Audio Control (0x855F) 0xFC n1 Set audio control to n1. Begin/End Counted Audio Loop2 (0x85C4) 0xFB n1 ... loop contents ... 0xFB Repeat secondary audio script loop n1 times. if secondary stanza repeat counter is 0 { if secondary 'already in a stanza' flag is not set { use next byte of script as number of repeats (secondary counter actually set to n-1) set secondary 'already in a stanza' flag remember current script address as beginning of secondary stanza} else { (secondary stanza just finished last repeat so...) clear secondary 'already in a stanza' flag (script will move on with next command)}} else { decrement secondary stanza repeat counter jump audio script ptr to remembered beginning of secondary stanza} Begin/End Counted Audio Loop1 (0x8578) 0xFA n1 ... loop contents ... 0xFA Repeat primary audio script loop n1 times. if primary stanza repeat counter is 0 { if primary 'already in a stanza' flag is not set { use next byte of script as number of repeats (primary counter actually set to n-1) set primary 'already in a stanza' flag remember current script address as beginning of primary stanza} else { (primary stanza just finished last repeat so...) clear primary 'already in a stanza' flag (script will move on with next command)}} else { decrement primary stanza repeat counter jump audio script ptr to remembered beginning of primary stanza} Disable Modulation (0x86B4) 0xF9 Clear modulating state flag bit 0. Further commands 0x00 - 0xDF with distortion/volume bit 4 set and volume not 0 will not be modulated. Enable Modulation (0x8681) 0xF8 n1 Set modulation wave ptr [x] to modulation wave n1. n1 indexes pointer at (2*n) + A000 + [900C+x]]. Then set modulating state flag bit 0. Further commands 0x00 - 0xDF with volume bit 4 set and volume not 0 will be modulated from the beginning of the current channel's modulation offset waveform. This feature can be used to do volume, distortion, and frequency envelopes for notes. Exit audio script loop. (0x867B) 0xF7 Sets the current channel's exit audio script loop flag so that the script processor will continue with the next channel or if it's the last channel, continue with updating the audio hardware output registers. Jump back to main audio script. (0x8667) 0xF6 Jump back to main audio script loop pointer for this channel and clear the exit audio script loop flag for this channel. Set aux waveform. (0x8637) 0xF5 n1 Load aux pointer with audio waveform n1. [n1 indexes table at (2*n1) + A000 + [900C+x]]. Aux audio script runs when bit 4 of script commands 0x00 to 0xDF is set, but only if volume part of command is not 0 and exit script flag is not already set. Aux audio script probably needs an 0xF6 at the end before exiting the script loop to get back to the main script. Set frequency slide up. (0x85CA) 0xF4 step slidespernoteb Set frequency slide adder step and number of slides per note counter b. The true number of slides per note is the multiple of counter a times b, so if you set a frequency and volume slide at the same time you should probably set one of the slides per note counters to a duration of 1. Set frequency slide down. (0x85DA) 0xF3 step slidespernoteb Set frequency slide subtractor step and number of slides per note counter b. The true number of slides per note is the multiple of counter a times b, so if you set a frequency and volume slide at the same time you should probably set one of the slides per note counters to a duration of 1. Set volume slide up. (0x85EA) 0xF2 step slidespernotea Set volume slide adder step and number of slides per note counter a. The true number of slides per note is the multiple of counter a times b, so if you set a frequency and volume slide at the same time you should probably set one of the slides per note counters to a duration of 1. Set volume slide down. (0x85FA) 0xF2 step slidespernotea Set volume slide subtractor step and number of slides per note counter a. The true number of slides per note is the multiple of counter a times b, so if you set a frequency and volume slide at the same time you should probably set one of the slides per note counters to a duration of 1. Set volume slide boundaries. (0x860A) 0xF0 hibound lobound Volume is bound to be greater or equal to the lobound, and less than or equal to the hibound. While volume is less than the lobound, the lobound is repeatedly added to the volume. While the volume goes greater than the hibound, the hibound is repeatedly subtracted from the volume. Do audio frequency waveform n1. (0x8549) 0xEF n1 n1 indexes wavefrom ptr table at 0xA000. When doing commands 0x00 through 0xDF, frequency settings for this channel will come from this waveform instead of the command. All channels share the same array. Stop using channel 1's frequency waveform. (0x8543) 0xEE Clears channel 1 audio frequency waveform ptr hi. This command will end playing channel 1's frequency waveform which I suspect is a bug since this command doesn't affect the current audio channel. (Should it be 8545 sta (+x) BFAE?). Repeat from beginning never (0x852E) 0xED Looks like BFA1 is never initialized and will always be 0 so this command probably always does nothing. if [bFA1] is not 0 then { jump back to beginning of script inc audio script not playing flag [A1+x]} Randomize sync flag. (0x8509) 0xEC mask offset All channels sync flag [4C] = (rnd and mask) + offset. Delayed synced jump. (0x84EB) 0xEB scriptaddrlo scriptaddrhi If sync flag is not 0 start a countdown to a jump to the script address. Each vertical blank the counter is decremented and when it reaches 0 the jump is taken. if [4C] is not 0 { set 'countdown to next' counter duration for this channel to [4C] set 'next' script ptr for this channel to next two bytes of script (countdown to next counter will decrement each vbi and when it gets to 0 it will force script to jump to address in 'next' script ptr)} else { skip next two bytes of script} Synced jump if greater or equal. (0x8519) 0xEA n1 scriptaddrlo scriptaddrhi If n1 is greater or equal to sync flag [4C], then jump to the script address. Jump (0x8520) 0xE9 scriptaddrlo scriptaddrhi Audio script jump using next two bytes of script as address. [2CAF] = n1 0xE8 n1 No idea what this command does, yet. It may have something to do with enabling a dli drumbeat routine. Nop 0xE7 This command does nothing. Draw current karaoke text line. 0xE6 notused sn cn Redraws the current text line with the syllable sn highlighted using color register cn (0 to 3). Set color register. 0xE5 cn value Set color register cn (0 to 3) with the color value. Draw current karaoke text line. 0xE4 sn cn Redraws the current text line with the syllable sn highlighted using color register cn (0 to 3). Syllables are marked using ascii upper case letters. Characters are drawn using a 64 character font which displays lower case letters as upper case. Clear current karaoke text line. 0xE3 Clear the karaoke text line and block further karaoke text updates. Set text song base pointer. 0xE2 n1 Karaoke text song pointer = [[4A 4B] + (2*n1)]. [4A 4B] is set during initialization from the bytes 4 and 5 of the song file which is loaded at addresses 0x9000. [9004 9005]. Set text current line pointer. 0xE1 n1 or 0xE0 n1 Karaoke text current line pointer = songbase + (n1*20). Each text line in a song is 20 characters long. Jump to aux script. 0x10, 0x30, 0x50, 0x70, 0x90, 0xB0, or 0xD0 If the exit script loop flag is not set then the script continues with the current aux waveform. if bit 4 of command byte is set and volume setting of command is 0 and exit script loop flag is not set { set audio script main ptr to current audio script ptr position jump audio script ptr to subscript at aux ptr [probably need jump back to main at end of aux script] set exit script loop flag rts to go back to beginning of script loop} Play next note. <=0xDF duration frequency Set note distortion, volume, ticks per slide duration and frequency for the current channel. Distortion is set using the upper 3 bits of the command byte. Volume is set using the lower 4 bits of the command byte. If the frequency waveform pointer for the current channel is set, the next frequency waveform setting is used instead of the frequency setting from this command. If bit 4 of the command byte is clear, the note is not modulated. If bit 4 of the command byte is set (and the volume setting is not 0), then the note settings from this command are modulated starting with the beginning of the current modulation waveform for this channel. Note duration in vbis is the ticks between slides * slides per note a * slides per note b. drop return address to exit script loop get volume from current byte of script and set volume shadow get ticks per slide duration from next byte of script and set ticks per slide duration and counter move script pointer to next byte in script if frequency waveform ptr hi[x] is not 0 { set frequency shadow using use next byte at frequency waveform ptr [x] increment frequency waveform ptr[x]} else { get current byte in script and set frequency shadow} if bit 4 of volume shadow = 0 { disable modulation by clearing modulating flag bit 1} else { if volume shadow volume != 0 { set modulation wave duration to 1 set bit 1 of modulating flag set modulation wave current offset to 0 (go back to beginning)} else { disable modulation by clearing modulating flag bit 1}} bump audio script ptr to current position (add y to audio ptr) continue audio loop with check to see if modulating waveform (at 8437) A.M.P. Data Formats AMP file format. 9002,3 - pointer to 4 entry array of pointers to the beginning of each channel's script 9004,5 - pointer to array of pointers to the beginning of each karaoke song's text 900C - byte offset from A000 to channel 1's array of pointers to modulation or aux waveforms 900E - byte offset from A000 to channel 2's array of pointers to modulation or aux waveforms 9010 - byte offset from A000 to channel 3's array of pointers to modulation or aux waveforms 9012 - byte offset from A000 to channel 4's array of pointers to modulation or aux waveforms A000 - base address for arrays of pointers to frequency waveforms (all channels share same array) Karaoke text line format. Always 20 characters. Capital ASCII letters mark the beginning of each syllable. Ascii is converted to font before being rendered which displays characters in the lower case range (0x60-0x7F) as upper case, and characters in the control character range (0x00-0x1F) as characters in the 0x20-0x3F range. Frequency waveform format. Just an array of bytes. Each byte in the waveform is a frequency setting. A.M.P. Vertical Blank Routine Psuedocode Vertical Blank Audio Processing channel 3 and 4 volume off calculation if [AB] != 0 and [891E] = 0 channel 3 and 4 volume is off or if [AB] != 0 and [AA] = 0 channel 3 and 4 volume is off channel 1 and 2 volume off calculation if [A9] = 0 channel 1 and 2 volume is off do audio channel processing, 3 parts if a delayed audio script jump is pending ([4D+x] != 0) { decrement delayed jump counter (dec [55+X]) if delayed jump counter has reached 0 ([55+x] = 0) { make delayed jump no longer pending ([4D+x] = 0) jump audio script to delayed jump address ([3A 3B] <- [5D 5E +x]) init audio channel[x] (8273)}} dec [bFF5+x] (ticks till next slide counter) if [bFF5+x] = 0 { freqshad[x] = freqshad[x] - negfreqslide[x] + posfreqslide[x] [bFF5+x] = [bFC5+x] reload ticks till slide counter a = volshad[x] - negvolslide[x] + posvolslide[x] // < 0 check is probably not necessary due to immediate and with 0x0F after if a < 0 { a = a + 0x0F} begin { a = a & 0x0F if a >= [0xBF93+x] { if a > [0xBF94+x] { a = a - [bF94+x]} else { break}} a = a + [bF93+x]} repeat volshadow[x] = a //number of slides per note is slides per note a * slides per note b //when slides per note is finished, the audio script continues with the next command dec [333A+x] (decrement slides per note counter a) if [333A+x] = 0 (slides per note counter a = 0) { [333A+x] = [3339+x] (reload slides per note counter a) dec [bFD5+x] (decrement slides per note counter b) if [bFD5+x] = 0 (if slides per note counter b = 0) { [bFD5+x] = [bFD6+x] (reload slides per note counter b) //init and enter audio script loop y=0 push loop begin address onto return stack to entry audio script loop (the next rts brings you back to here unless you drop the return address) a = [[3A]+y] (get next byte of audio script) if a >= 0xE0 { if a < 0xE9 { do audio commands 0xE0 through 0xE8} else { do audio commands 0xE9 through 0xFF}} else { do audio commands 0x00 through 0xDF}}}} // ticks per slide and slides per note counters not 0 (address 0x8437) if [bF8B+x] = 3 (waveform data processing state, 3 = modulating) { dec [bF8C+x] (waveform note setting duration counter) if [bF8C+x] = 0 (if waveform note setting duration counter = 0) { [38 39] = [bF22+x] (load waveform data ptr) y = [bF84+x] (load waveform data current offset) a = [0xBFF6+x] (a = volshad[x]) a = a & 0x0F psha volshad[x] = volshad[x] & 0xF0 (set volume to 0, keep distortion) pula a = a + [[38]+y] (add extracted volume to next byte of waveform) // bit 4 of volshad should always be 0.... so // this masks volume overflows so it adds the old volume to the next byte in the a = a and 0xEF // this effectively uses the next byte in the waveform and uses it to add to // both volume and distortion separately volshad[x] = volshad[x] + a iny (go to next byte in waveform) [bF8C+x] = [[38]+y] (set waveform note setting duration counter) iny (go to next byte in waveform) [bFC6+x] = [bFC6+x] + [[38]+y] iny (go to next byte in waveform) [bF84+x] = y (save waveform data current offset)}} if x < 4 (if channel is 1 or 2) and [24B] != 0 { // skip updating channels 1 and 2 if don't update channels 1 and 2 flag is set} else { [D200+x] = [bFC6+x] (set frequency from shadow) [D201+x] = [bFF6+x] & 0xEF (set distortion and volume from shadow)} [bF32+x BF33+x] = [3A 3B] (save audio script pointer) dex dex (next audio channel) until x = 0 if [24B] = 0 (if do not update audio control flag is not 0) { if [bFA3] != [bFA2] (if audio control shadow2 != audio control shadow1) { [D208] = [bFA2] = [bFA3] (audio control = audio control shadow2 = audio control shadow1)}} exit vbi A.M.P. Memory Map AMP Memory Map [46] = character counter [48] = number of characters to do [49] = character with index bits rotated to high position - used during ascii to font conversions [4a 4b] = pointer to array of song text base pointers set during file init from [9004 9005] [38 39] = frequency waveform ptr or modulation waveform ptr [43 44] = pointer to current karaoke text line [4a 4b] = pointer to array of pointers to karaoke text lines [4C] = randomized sync flag for all channels [4D] = audio channel 1 delayed jump pending when 0 flag [4E] = [4F] = audio channel 2 delayed jump pending when 0 flag [50] = [51] = audio channel 3 delayed jump pending when 0 flag [52] = [53] = audio channel 4 delayed jump pending when 0 flag [54] = [55] = audio channel 1 vbis until delayed jump counter [56] = [57] = audio channel 2 vbis until delayed jump counter [58] = [59] = audio channel 3 vbis until delayed jump counter [5A] = [5B] = audio channel 4 vbis until delayed jump counter [5C] = [5D 5E] = audio channel 1 delayed jump address ptr [5F 60] = audio channel 2 delayed jump address ptr [61 62] = audio channel 3 delayed jump address ptr [63 64] = audio channel 4 delayed jump address ptr [A1] = audio channel 1 playing when not 0 flag [A2] = [A3] = audio channel 2 playing when not 0 flag [A4] = [A5] = audio channel 3 playing when not 0 flag [A6] = [A7] = audio channel 4 playing when not 0 flag [A8] = [A9] = audio channels 1 and 2 playing when not 0 flag [AA] = [AB] = audio channels 3 and 4 playing when not 0 flag [3331] = audio channel 1 volume slide adder [3332] = audio channel 1 volume slide subtractor [3333] = audio channel 2 volume slide adder [3334] = audio channel 2 volume slide subtractor [3335] = audio channel 3 volume slide adder [3336] = audio channel 3 volume slide subtractor [3337] = audio channel 4 volume slide adder [3338] = audio channel 4 volume slide subtractor [3339] = audio channel 1 slides per note a [333A] = audio channel 1 slides per note counter a [333B] = audio channel 2 slides per note a [333C] = audio channel 2 slides per note counter a [333D] = audio channel 3 slides per note a [333E] = audio channel 3 slides per note counter a [333F] = audio channel 4 slides per note a [3340] = audio channel 4 slides per note counter a [bF12 BF13] = audio channel 1 aux script command ptr [bF14 BF15] = audio channel 1 aux script command ptr [bF16 BF17] = audio channel 1 aux script command ptr [bF18 BF19] = audio channel 1 aux script command ptr [bF1A BF1B] = audio channel 1 script command subscript return ptr [bF1C BF1D] = audio channel 2 script command subscript return ptr [bF1E BF1F] = audio channel 3 script command subscript return ptr [bF20 BF21] = audio channel 4 script command subscript return ptr [bF22 BF23] = audio channel 1 modulation waveform base ptr [bF24 BF25] = audio channel 2 modulation waveform base ptr [bF26 BF27] = audio channel 3 modulation waveform base ptr [bF28 BF29] = audio channel 4 modulation waveform base ptr [bF2A BF2B] = audio channel 1 script command ptr [bF2C BF2D] = audio channel 2 script command ptr [bF2E BF2F] = audio channel 3 script command ptr [bF30 BF31] = audio channel 4 script command ptr [bF32 BF33] = audio channel 1 script command ptr [bF34 BF35] = audio channel 2 script command ptr [bF36 BF37] = audio channel 3 script command ptr [bF38 BF39] = audio channel 4 script command ptr [bF83] = audio channel 1 exit command script loop when set flag [bF84] = audio channel 1 modulation waveform current offset [bF85] = audio channel 2 exit command script loop when set flag [bF86] = audio channel 2 modulation waveform current offset [bF87] = audio channel 3 exit command script loop when set flag [bF88] = audio channel 3 modulation waveform current offset [bF89] = audio channel 4 exit command script loop when set flag [bF8A] = audio channel 4 modulation waveform current offset [bF8B] = modulating audio channel 1 when = 3 flag [bF8C] = audio channel 1 modulation entry offsets duration counter [bF8D] = modulating audio channel 2 when = 3 flag [bF8E] = audio channel 2 modulation entry offsets duration counter [bF8F] = modulating audio channel 3 when = 3 flag [bF90] = audio channel 3 modulation entry offsets duration counter [bF91] = modulating audio channel 4 when = 3 flag [bF92] = audio channel 4 modulation entry offsets duration counter [bF93] = audio channel 1 volume lobound (adder) [bF94] = audio channel 1 volume hibound (subtractor) [bF95] = audio channel 2 volume lobound (adder) [bF96] = audio channel 2 volume hibound (subtractor) [bF97] = audio channel 3 volume lobound (adder) [bF98] = audio channel 3 volume hibound (subtractor) [bF99] = audio channel 4 volume lobound (adder) [bF9A] = audio channel 4 volume hibound (subtractor) [bF9B] = temp var for audio script command 0xF5 [bF9C] = temp var [holds audio channel x] [bFA1] = audio command 0xED jump to beginning of script when not 0 flag [bFAD BFAE] = audio frequency waveform channel 1 ptr (not using this if hi byte 0) [bFAF BFB0] = audio frequency waveform channel 2 ptr (not using this if hi byte 0) [bFB1 BFB2] = audio frequency waveform channel 3 ptr (not using this if hi byte 0) [bFB3 BFB4] = audio frequency waveform channel 4 ptr (not using this if hi byte 0) [bFB5] = audio channel 1 script command beginning of stanza repeat ptr a lo [bFB6] = audio channel 1 script command beginning of stanza repeat ptr b lo [bFB7] = audio channel 2 script command beginning of stanza repeat ptr a lo [bFB8] = audio channel 2 script command beginning of stanza repeat ptr b lo [bFB9] = audio channel 3 script command beginning of stanza repeat ptr a lo [bFBA] = audio channel 3 script command beginning of stanza repeat ptr b lo [bFBB] = audio channel 4 script command beginning of stanza repeat ptr a lo [bFBC] = audio channel 4 script command beginning of stanza repeat ptr b lo [bFBD] = audio channel 1 script command beginning of stanza repeat ptr a hi [bFBE] = audio channel 1 script command beginning of stanza repeat ptr b hi [bFBF] = audio channel 2 script command beginning of stanza repeat ptr a hi [bFC0] = audio channel 2 script command beginning of stanza repeat ptr b hi [bFC1] = audio channel 3 script command beginning of stanza repeat ptr a hi [bFC2] = audio channel 3 script command beginning of stanza repeat ptr b hi [bFC3] = audio channel 4 script command beginning of stanza repeat ptr a hi [bFC4] = audio channel 4 script command beginning of stanza repeat ptr b hi [bFC5] = audio channel 1 vbis between slides (it repeats each slide) [bFC6] = audio channel 1 frequency shadow [bFC7] = audio channel 2 vbis between slides (it repeats each slide) [bFC8] = audio channel 2 frequency shadow [bFC9] = audio channel 3 vbis between slides (it repeats each slide) [bFCA] = audio channel 3 frequency shadow [bFCB] = audio channel 4 vbis between slides (it repeats each slide) [bFCC] = audio channel 4 frequency shadow [bFCD] = audio channel 1 frequency slide adder [bFCE] = audio channel 1 frequency slide subtractor [bFCF] = audio channel 2 frequency slide adder [bFD0] = audio channel 2 frequency slide subtractor [bFD1] = audio channel 3 frequency slide adder [bFD2] = audio channel 3 frequency slide subtractor [bFD3] = audio channel 4 frequency slide adder [bFD4] = audio channel 4 frequency slide subtractor [bFD5] = audio channel 1 slides per note b [bFD6] = audio channel 1 slides per note counter b [bFD7] = audio channel 2 slides per note b [bFD8] = audio channel 2 slides per note counter b [bFD9] = audio channel 3 slides per note b [bFDA] = audio channel 3 slides per note counter b [bFDB] = audio channel 4 slides per note b [bFDC] = audio channel 4 slides per note counter b [bFDD] = audio channel 1 script command stanza repeat counter a [bFDE] = audio channel 1 script command stanza repeat counter b [bFDF] = audio channel 2 script command stanza repeat counter a [bFE0] = audio channel 2 script command stanza repeat counter b [bFE1] = audio channel 3 script command stanza repeat counter a [bFE2] = audio channel 3 script command stanza repeat counter b [bFE3] = audio channel 4 script command stanza repeat counter a [bFE4] = audio channel 4 script command stanza repeat counter b [bFE5] = audio channel 1 script command using stanza repeat counter when not 0 flag a [bFE6] = audio channel 1 script command using stanza repeat counter when not 0 flag b [bFE7] = audio channel 2 script command using stanza repeat counter when not 0 flag a [bFE8] = audio channel 2 script command using stanza repeat counter when not 0 flag b [bFE9] = audio channel 3 script command using stanza repeat counter when not 0 flag a [bFEA] = audio channel 3 script command using stanza repeat counter when not 0 flag b [bFEB] = audio channel 4 script command using stanza repeat counter when not 0 flag a [bFEC] = audio channel 4 script command using stanza repeat counter when not 0 flag b [bFED BFEE] = audio channel 1 beginning of command script ptr [bFEF BFF0] = audio channel 2 beginning of command script ptr [bFF1 BFF2] = audio channel 3 beginning of command script ptr [bFF3 BFF4] = audio channel 4 beginning of command script ptr [bFF5] = audio channel 1 vbis between slides counter [bFF6] = audio channel 1 distortion and volume shadow [bFF7] = audio channel 2 vbis between slides counter [bFF8] = audio channel 2 distortion and volume shadow [bFF9] = audio channel 3 vbis between slides counter [bFFA] = audio channel 3 distortion and volume shadow [bFFB] = audio channel 4 vbis between slides counter [bFFC] = audio channel 4 distortion and volume shadow -
Hi everyone, I've been slowly disassembling Alternate Reality the City for the Atari 8-bit over the last few years and have have mostly figured out another part of the game, the Advanced Music Processor. I've mostly disassembled the A.M.P. used during the main part of the game and put what I've found into a document here: http://www.diaperglu.com/ardisassembly/ampdoc.htm This is the code used for playing the 8 or 9 walking around sounds, the tavern songs, and the guild song.
