GusLib v1.0 By Paul Kimbrel Aug 17, 1994 Documentation Short Description ------------------------------------- GusLib is a public domain/royalty free programming library for the Gravis UltraSound sound card. It's purpose is to allow programmers easy access to the basic functions of the GUS. The library was mainly written for assembly language use but can be easily used with C,C++,Pascal, and other languages. It's features are: Direct DRAM I/O functions DMA DRAM Output Playback routines Register I/O functions This library is designed primarily for output only. Some functions could be used for input as well, though programming experience with the GUS would be required. Disclaimer ------------------------------------- This program is given as is. It is subject to change with out notice or permission. I make no claims as to it's usability or workability. I've made all attempts to test it as much as possible, but I claim no responsibility for any damages caused by this program. In other words, it works here, so if doesn't work there, I can't help it. Enough of the bad guy stuff: I'll be happy to help with any problems and would like to know if any flaws in the programming are found. I'm always looking to improve my programs, so if you have any recommendations, please get a hold of me and let me know. As far as it's status as a program, it's public domain which means you can do just about anything to it you want. I encourage you to dig into the code and make your alterations to it as you wish. Copy the code, use it in other programs, use it as a reference for other GUS applications, whatever. This program is yours to do with as you please. Use it in your games, applications, etc., and don't worry about royalty or credit (although, just mentioning my name would be nice ). If you do use my program in any of your applications, please drop me a note, just so I can keep track of things (and for personal gratification). Files ------------------------------------- The following files are included in the GUSLIB library: GUSLIB.ASM - Source code to GUSLIB GUSLIB.OBJ - Object code to GUSLIB for linking GUSLIB.LIB - Library file to GUSLIB for linking GUSLIB.DOC - Documentation for GUSLIB PLAYVOC.EXE - Sample program using GUSLIB (plays back .VOC files) PLAYVOC.ASM - Sample source code using GUSLIB Stuff that might be important (?) ------------------------------------- Okay, I'll admit it - I hate commenting my programs - especially when I've been working for a solid week on it. It gets to the point of "I could care less if I know how it works just so long as it works." I'm sitting here with an actual working model on my computer and really don't want to go through and comment, so I'm going to let it be for now. However, you can look for more comments in future revisions of the program (I can almost guarantee that there will be). If you have any questions at all about the program, you can find me in the 80XXX echo on Fidonet (as Paul Kimbrel), you can net-mail me at 1:232/10 (again, to Paul Kimbrel), or e-mail me via the internet at dkimbrel@heartland.bradley.edu All answer ALL questions even if it's to say that I haven't the foggiest idea what-so-ever. I'll be working on a better version, but this will at least get some people (including myself) working. I hope you find some kind of usefulness from this program. An IMPORTANT note concerning the DMA channels! - MUST READ!!!!! ------------------------------------- Please note that the only two channels that this program will work with are the 8 bit channels (1 and 3). GUSLIB will allow for the 16 bit channels (5,6 and 7), yet I've never worked with them before. As a result, I make NO assumtions as to if they work or not. If you want to try - go for it, just let it be known that I have tried (yet)... Functions ------------------------------------- To use these functions, simply fill the BX register with the function number and all other registers with the appropriate information (depending on the function). Next, call the procedure GUSLIB. When the function has been executed, a return code will come back in the AX register. If AX reads 00h, then the function was executed successfully. Otherwise, AX contains the error code. Function 00h - Init_Gus ------------------------------------- Short Description: Initializes and sets up the GUS Registers on entry: BX = 0000h Registers on return: AX = Error Code - 00h - No Error 01h - Bad Environmental Variable 02h - Illegal IRQ in Environmental Variable 03h - Illegal DMA channel in Environmental Variable 04h - GUS Reset error 05h - DRAM I/O Error Extended Description: This function preforms several tasks. It first searches and processes the 'ULTRASND=' environmental variable. Then it checks to make sure that all the information in the variable is correct. Third, it resets the GUS. Fourth, it makes sure that the DRAM is okay. Finally, it sets up the library's ISR for the IRQ and programs the computer's PIC (how's THAT for initials!). When the ISR is setup, your program MUST run the deinitialization function do undo what the initialization does. The best thing to do is write your program to ALWAYS execute the deinitialation function before it exits. The functions are made so that it won't undo the ISR if it isn't set up. In other words, if you call the deinitalization function and there's nothing for it to do, it'll automatically return with out doing anything, making it easier for you to keep track of things. Function 01h - Deinit_Gus ------------------------------------- Short Description: Deinitializes and shuts down the GUS Registers on entry: BX = 0001h Registers on return: None Extended Description: This function basically undoes what function 00h does. If function 00h isn't executed, then this function will automatically return with out doing anything. It's best to call this function right before you exit no matter what the situation is. This makes keeping track of the initialization process easier (IOW - you really don't have to). Function 02h - Poke ------------------------------------- Short Description: Pokes data directly into the GUS's memory. Registers on entry: BX = 0002h AL = Value to poke SI:DI = Linear Address in GUS memory. Registers on return: None Extended Description: This function pokes data directly into the GUS's DRAM. SI:DI point to the absolute linear address. Keep in mind that the GUS can only address 1 MEG of memory, so only the lower 20 bits should contain data; all other bits should be set to 0. NOTE: The value in AL is put into memory AS IS. There is no two's- compliment conversion in this function. If a conversion is necessary, you must do it to the value before you call this function. Function 03h - Peek ------------------------------------- Short Description: Peeks data directly from the GUS's memory. Registers on entry: SI:DI = Linear Address in GUS memory Registers on return: BX = 0003h AL = Data at SI:DI Extended Description: This function peeks data directly from the GUS's memory. It's address scheme is the same as that in function 02h. NOTE: The value returned in AL is read AS IS. There is no two's- compliment conversion in this function. If a conversion is necessary, you must do it to the value after you call this function. Function 04h - Set_Active ------------------------------------- Short Description: Sets the number of active voices on the GUS. Registers on entry: BX = 0004h AL = Number of Pages (14-32) Registers on return: None Extended Description: This function sets the number of active voices on the GUS. An explanation of this function is beyond the scope of this documentation. Just keep in mind that you don't using any voices beyond the number that you have set with this function. NOTE: The fewer voices you have, the better the sound quality will be. For more information, see the Gravis Ultrasound SDK. Function 05h - Download_Sound ------------------------------------- Short Description: Uses PC's DMA to send a sound sample to GUS's memory. Registers on entry: BX = 0005h CL = Wait Toggle (0 = no; 1 = yes) DI = GUS DRAM Address (upper 16 bits) ES:SI = PC segment:offset address of sample DX:AX = Size of sample Registers on return: AX = Error Code - 00h - No Error 01h - KeyBoard interrupt (if CL = 1 on entry) 02h - DMA still busy Extended Description: This dumps a sample that is stored in PC memory to the GUS memory via the DMA channel. Note that the GUS DRAM Address (in DI) is only the upper 16 bits of the address. Since the entire linear address is 20 bits, you must take your absolute address and divide it by 16 (that's 16 decimal). As you may have noticed, your DMA address will have to on a 16 byte boundary. The wait toggle specifies to the routine if you want to it to wait until the DMA is done or to just return immediately. CASE: CL = 0 The routine will return as soon as the DMA has started its transfer. No other DMA transfers can take place until the DMA is finished. To check the status of the DMA, execute function 6 or re-execute this function. If you re-execute this function and get an error code of 2, then the DMA is still busy. CASE: CL = 1 The routine will wait until the DMA has finished its transfer before returning. For safety purposes, the program checks the keyboard during the wait. If a key is hit, the function will return and will send back an error code of 1. Function 06h - Dma_Status ------------------------------------- Short Description: Checks on the status of the DMA download (function 5) Registers on entry: BX = 0006h Registers on return: AX = Status Extended Description: Returns the status of the DMA download (function 5). It returns a value of 0 if the DMA is free and available for downloading. If it returns a value of 1, a DMA transfer is taking place and the channel is busy. Function 07h - Set_Volume ------------------------------------- Short Description: Sets the volume of a specific voice. Registers on entry: BX = 0007h AX = Volume (0-4095) CL = Voice (0-active voices) Registers on return: None Extended Description: NOTE: The voice ranges from 0 to the number of active voices-1. For example, if the number of active voices is 14, then the available voices would be 0-13. Likewise, if the number of active voices is 32, then the available voices would be 0-31. Function 08h - Set_Freq ------------------------------------- Short Description: Sets the sampling frequency of a specific voice. Registers on entry: BX = 0008h AX = Frequency (1-44100) CL = Voice Registers on return: None Extended Description: NOTE: The voice ranges from 0 to the number of active voices-1. For example, if the number of active voices is 14, then the available voices would be 0-13. Likewise, if the number of active voices is 32, then the available voices would be 0-31. Function 09h - Set_Loop ------------------------------------- Short Description: Sets the loop back condition of the specific voice. Registers on entry: BX = 0009h AL = Loop control register value (recommended value = 3) CL = Voice Registers on return: None Extended Description: NOTE: The voice ranges from 0 to the number of active voices-1. For example, if the number of active voices is 14, then the available voices would be 0-13. Likewise, if the number of active voices is 32, then the available voices would be 0-31. NOTE: Loop control is beyond the scope of this manual. For more information on loop control, read the Gravis Ultrasound SDK. To disable the loop control, write the value 3 to the function. This is the recommended action before using a voice (to clear any old values). Function 0ah - Set_Start ------------------------------------- Short Description: Sets the starting address (in GUS memory) of the sample. Registers on entry: BX = 000ah DX:AX = Linear 20-bit address in GUS memory CL = Voice Registers on return: None Extended Description: NOTE: The voice ranges from 0 to the number of active voices-1. For example, if the number of active voices is 14, then the available voices would be 0-13. Likewise, if the number of active voices is 32, then the available voices would be 0-31. This sets the starting location for the particular voice. GUSLIB auto- matically adjusts the register to fit this value. When you start playback of the voice, the playback will start at the value in DX:AX. When the voice has stopped or has been stopped (manually), GUSLIB will readjust the register so that it will restart at this address each time. Function 0bh - Set_End ------------------------------------- Short Description: Sets the ending address (in GUS memory) of the sample. Registers on entry: BX = 000bh DX:AX = Linear 20-bit address in GUS memory CL = Voice Registers on return: None Extended Description: NOTE: The voice ranges from 0 to the number of active voices-1. For example, if the number of active voices is 14, then the available voices would be 0-13. Likewise, if the number of active voices is 32, then the available voices would be 0-31. This sets the ending address of the voice. When the playback routine is executed, the GUS will start playback at the and will stop when it reaches this address. Function 0ch - Play_Voice ------------------------------------- Short Description: Starts playback of a specific voice Registers on entry: BX = 000ch AH = Control register (Use 00h for normal operation) AL = Voice Registers on return: None Extended Description: This function starts the playback for a specific voice. To start a normal playback (forward direction, no loop, irq's on, etc.), Simply write 00h to the Control register (in AH). The function will filter out unwanted information in the control register and set important information, so only worry about those bits in which you can modify. The operation of the control register is beyond the scope of this document; Please refer to Gravis Ultrasound SDK for more information. Function 0dh - Stop_Voice ------------------------------------- Short Description: Manually stops the playback of a specific voice. Registers on entry: BX = 000dh AL = Voice Registers on return: None Extended Description: This function will manually stop and reset the specified voice. Function 0eh - Voice_Status ------------------------------------- Short Description: Returns the playback status of a specific voice. Registers on entry: BX = 000eh AL = Voice Registers on return: AX = Status - 00h = Voice is in playback mode 01h = Voice has stopped (not in playback mode)