;--------------------------------------------------------------------------- ; PnP Header ; ; The PnP header contains the 72-bit "serial identifier", used by PnP ; initialization software to isolate the PnP device. ;--------------------------------------------------------------------------- 0x1E ; AMD 'GRV0001' Vendor ID Byte 0 0x56 ; AMD 'GRV0001' Vendor ID Byte 1 0x00 ; AMD 'GRV0001' Vendor assigned product number (byte 0) 0x01 ; AMD 'GRV0001' Vendor assigned product number (byte 1) 0x01 ; Serial Number Byte 0 0x00 ; Serial Number Byte 1 0x00 ; Serial Number Byte 2 0x00 ; Serial Number Byte 3 0x3d ; Special LFSR checksum (PnP specification appendix B) ;--------------------------------------------------------------------------- ; PnP Version ; ; The PnP version entry tells the PnP initialization software which ; version of the PnP specification the hardware is compatible with. ;--------------------------------------------------------------------------- 0x0A ; PnP Version - Small item, PnP version tag, 2 bytes 0x10 ; InterWave is compatible with PnP spec 1.0 0x10 ; InterWave EEPROM version 1.0 ;--------------------------------------------------------------------------- ; ANSI Identifier string ; ; The Ansi Identifier string is an ASCII text string to display to the ; user for prompts and messages about the InterWave board. ;--------------------------------------------------------------------------- 0x82 ; ANSI identifier string - Large item, ID string tag 0x14 ; Length byte 0 (low byte) - In total, 9 bytes long 0x00 ; Length byte 1 (high byte) 'InterWave Audio Card' ; Actual ANSI identifier ;=========================================================================== ; Logical Device Block (0) ; ; The logical device defines the resources used by a specific function of ; the PnP device. The first logical device defined for InterWave is the ; InterWave synthesizer. Note that all resource information following ; the Logical Device Block applies to the previous Logical Device, until ; a new Logical Device Block is declared. ;=========================================================================== 0x15 ; Small item, logical device ID, 5 bytes long 0x1E ; AMD 'GRV0001' Vendor ID Byte 0 0x56 ; AMD 'GRV0001' Vendor ID Byte 1 0x00 ; Vendor assigned function ID (byte 0) 0x10 ; Vendor assigned function ID (byte 1) 0x02 ; flags[1] = supports commands at index 0x31 ;--------------------------------------------------------------------------- ; ANSI Identifier string ; ; The Ansi Identifier string is an ASCII text string to display to the user ; for prompts and messages about the InterWave board. ; ; Note - It turns out that the first release of Windows 95 does not use ; the information stored in this field; instead, it uses the .INF file to ; determine the ASCII string for this logical device. However, it does ; show up in the registry. ;--------------------------------------------------------------------------- 0x82 ; ANSI identifier string - Large item, ID string tag 0x0D ; Length byte 0 (low byte) - In total, 13 bytes long 0x00 ; Length byte 1 (high byte) 'Synth & Codec' ; Actual ANSI identifier ;--------------------------------------------------------------------------- ; InterWave Synthesizer IRQ structure ; ; The IRQ structure defines which IRQs are supported for the ; specified logical device. In our case, we require two IRQs ; for the InterWave device, hense the need for two IRQ structures. ; ; Note: The familiar concept of describing ISA bus IRQ 2 as ; "IRQ 2" or "IRQ 2/9" is not valid for the PnP EEPROM. ; Specifying ISA bus IRQ 2 in the EEPROM by setting IRQ 2 ; causes Windows 95 to prevent the interrupt from being ; selected (copnflict with the interrupt controller). The ; correct way to specify ISA bus IRQ 2 in the PnP EEPROM ; is by specifying IRQ 9. ;--------------------------------------------------------------------------- 0x22 ; Small item, IRQ tag, 2 bytes long (Synth IRQ 1) 0xA0 ; Pic 0: A0 = 10100000 (IRQ 7, 5) 0x9E ; Pic 1: 9A = 10011110 (IRQ 15, 12, 11, 9) ;--------------------------------------------------------------------------- ; InterWave Synthesizer DMA structure ; ; The DMA structure defines which DMA channels are supported for ; the specified logical device. In our case, we require two DMA ; channels for the InterWave device, hense the need for two DMA ; structures. ;--------------------------------------------------------------------------- 0x2A ; Small item, DMA descriptor, 2 bytes long (Synth DMA 1) 0xE8 ; E8 = 11101000 (DMA 7, 6, 5, 3) 0x19 ; DMA transfer types: 8-bit and 16-bit transfers supported 0x2A ; Small item, DMA descriptor, 2 bytes long (Synth DMA 2) 0xF8 ; F8 = 11111000 (DMA 7, 6, 5, 4, 3) 0x19 ; DMA transfer types: 8-bit and 16-bit transfers supported ;--------------------------------------------------------------------------- ; InterWave Synthesizer I/O port descriptor ; ; The I/O port descriptor defines which I/O ports are supported ; for the specified logical device. ; ; Note that the "start dependent function", and "end dependent ; function", is not part of the I/O port descriptor. It is used ; to tell the PnP configuration software that this logical device ; has a preferred configuration for this resource (in our case, ; the synthesizer's preferred I/O resource is 220h/320h/32Ch), ; and what that preferred configuration is. ; ; Although the InterWave can support a large number of possible ; I/O port configurations, for backwards compatibility with ; Gravis software (and to make Sound Blaster emulation work), ; the only addresses allowed are 220h/320h/32Ch and ; 240h/340h/34Ch. ;--------------------------------------------------------------------------- ;-----------------------------; ; Configuration 0 (preferred) ; ;-----------------------------; 0x31 ; Small item, start dependent function, 1 byte long 0x00 ; 00 = Preferred I/O resource configuration 0x47 ; Small item, I/O port descriptor, 7 bytes long 0x01 ; 16-bit I/O decode 0x20 ; Lowest I/O base address (low byte) = 220h 0x02 ; Lowest I/O base address (high byte) = 220h 0x20 ; Highest I/O base address (low byte) = 220h 0x02 ; Highest I/O base address (high byte) = 220h 0x10 ; I/O port must be aligned on a 2 byte boundary 0x10 ; MPU-401 requires 2 consecutive I/O ports 0x47 ; Small item, I/O port descriptor, 7 bytes long 0x01 ; 16-bit I/O decode 0x20 ; Lowest I/O base address (low byte) = 320h 0x03 ; Lowest I/O base address (high byte) = 320h 0x20 ; Highest I/O base address (low byte) = 320h 0x03 ; Highest I/O base address (high byte) = 320h 0x08 ; I/O port must be aligned on a 2 byte boundary 0x08 ; MPU-401 requires 2 consecutive I/O ports 0x47 ; Small item, I/O port descriptor, 7 bytes long 0x01 ; 16-bit I/O decode 0x2C ; Lowest I/O base address (low byte) = 32Ch 0x03 ; Lowest I/O base address (high byte) = 32Ch 0x2C ; Highest I/O base address (low byte) = 32Ch 0x03 ; Highest I/O base address (high byte) = 32Ch 0x04 ; I/O port must be aligned on a 2 byte boundary 0x04 ; MPU-401 requires 2 consecutive I/O ports ;------------------------------; ; Configuration 1 (acceptible) ; ;------------------------------; 0x31 ; Small item, start dependent function, 1 byte long 0x01 ; 01 = Acceptable I/O resource configuration, not best 0x47 ; Small item, I/O port descriptor, 7 bytes long 0x01 ; 16-bit I/O decode 0x40 ; Lowest I/O base address (low byte) = 220h 0x02 ; Lowest I/O base address (high byte) = 220h 0x40 ; Highest I/O base address (low byte) = 220h 0x02 ; Highest I/O base address (high byte) = 220h 0x10 ; I/O port must be aligned on a 2 byte boundary 0x10 ; MPU-401 requires 2 consecutive I/O ports 0x47 ; Small item, I/O port descriptor, 7 bytes long 0x01 ; 16-bit I/O decode 0x40 ; Lowest I/O base address (low byte) = 320h 0x03 ; Lowest I/O base address (high byte) = 320h 0x40 ; Highest I/O base address (low byte) = 320h 0x03 ; Highest I/O base address (high byte) = 320h 0x08 ; I/O port must be aligned on a 2 byte boundary 0x08 ; MPU-401 requires 2 consecutive I/O ports 0x47 ; Small item, I/O port descriptor, 7 bytes long 0x01 ; 16-bit I/O decode 0x4C ; Lowest I/O base address (low byte) = 32Ch 0x03 ; Lowest I/O base address (high byte) = 32Ch 0x4C ; Highest I/O base address (low byte) = 32Ch 0x03 ; Highest I/O base address (high byte) = 32Ch 0x04 ; I/O port must be aligned on a 2 byte boundary 0x04 ; MPU-401 requires 2 consecutive I/O ports 0x38 ; Small item, end dependent function, 0 bytes long ;=========================================================================== ; Logical Device Block (1) ; ; The next logical device on the InterWave part is the external ; device decoder (CD-ROM interface). Note that all the resource ; information following this block are setup for a board with an ; ATAPI compatible interface. ;=========================================================================== 0x15 ; Small item, logical device ID, 5 bytes long 0x1E ; AMD 'GRV0001' Vendor ID Byte 0 0x56 ; AMD 'GRV0001' Vendor ID Byte 1 0x00 ; Vendor assigned function ID (byte 0) 0x11 ; Vendor assigned function ID (byte 1) 0x02 ; flags[1] = supports commands at index 0x31 ;--------------------------------------------------------------------------- ; ANSI Identifier string ; ; The Ansi Identifier string is an ASCII text string to display ; to the user for prompts and messages about the InterWave board. ;--------------------------------------------------------------------------- 0x82 ; ANSI identifier string - Large item, ID string tag 0x15 ; Length byte 0 (low byte) - In total, 21 bytes long 0x00 ; Length byte 1 (high byte) 'Disabled ATAPI CD-ROM' ; Actual ASCII identifier ;=========================================================================== ; Logical Device Block (2) ; ; The third logical device on the InterWave part is the joystick ; (game port) interface. The joystick only uses a single ; I/O port. ;=========================================================================== 0x15 ; Small item, logical device ID, 5 bytes long 0x1E ; AMD 'GRV0001' Vendor ID Byte 0 0x56 ; AMD 'GRV0001' Vendor ID Byte 1 0x00 ; Vendor assigned function ID (byte 0) 0x12 ; Vendor assigned function ID (byte 1) 0x02 ; flags[1] = supports commands at index 0x31 ;--------------------------------------------------------------------------- ; Compatible Device Block (2) ; ; The InterWave joystick interface is compatible with the generic ; gameport. We can tell the PnP manager that this is true by ; by specifying a compatible device block. The PnP device ID for ; the generic gameport is PNPB02F (see the Microsoft document ; DEVIDS.TXT). ;--------------------------------------------------------------------------- 0x1C ; Small item, compatible device ID, 4 bytes long 0x41 ; Device ID "PNPB02F" in standard PnP vendor ID notation 0xD0 0xB0 0x2F ;--------------------------------------------------------------------------- ; ANSI Identifier string ; ; The Ansi Identifier string is an ASCII text string to display ; to the user for prompts and messages about the InterWave board. ;--------------------------------------------------------------------------- 0x82 ; ANSI identifier string - Large item, ID string tag 0x09 ; Length byte 0 (low byte) - In total, 9 bytes long 0x00 ; Length byte 1 (high byte) 'Game Port' ; Actual ANSI identifier ;--------------------------------------------------------------------------- ; InterWave Joystick I/O descriptor block ; ; We only support a single I/O address for the joystick, for ; games compatibility. ;--------------------------------------------------------------------------- 0x47 ; Small item, I/O port descriptor, 7 bytes long 0x01 ; 16-bit I/O decode 0x01 ; Lowest I/O base address (low byte) = 330h 0x02 ; Lowest I/O base address (high byte) = 330h 0x01 ; Highest I/O base address (low byte) = 336h 0x02 ; Highest I/O base address (high byte) = 336h 0x01 ; I/O port must be aligned on a 2 byte boundary 0x01 ; MPU-401 requires 2 consecutive I/O ports ;=========================================================================== ; Logical Device Block (3) ; ; The fourth logical device on the InterWave part is the Adlib ; FM register set and Sound Blaster interrupt line. ;=========================================================================== 0x15 ; Small item, logical device ID, 5 bytes long 0x1E ; AMD 'GRV0001' Vendor ID Byte 0 0x56 ; AMD 'GRV0001' Vendor ID Byte 1 0x00 ; Vendor assigned function ID (byte 0) 0x13 ; Vendor assigned function ID (byte 1) 0x02 ; flags[1] = supports commands at index 0x31 ;--------------------------------------------------------------------------- ; ANSI Identifier string ; ; The Ansi Identifier string is an ASCII text string to display ; to the user for prompts and messages about the InterWave board. ;--------------------------------------------------------------------------- 0x82 ; ANSI identifier string - Large item, ID string tag 0x10 ; Length byte 0 (low byte) - In total, 16 bytes long 0x00 ; Length byte 1 (high byte) 'SB Digital Audio' ; Actual ANSI identifier ;=========================================================================== ; Logical Device Block (4) ; ; The last logical device on the InterWave part is the MPU-401 ; device. ;=========================================================================== 0x15 ; Small item, logical device ID, 5 bytes long 0x1E ; AMD 'GRV0001' Vendor ID Byte 0 0x56 ; AMD 'GRV0001' Vendor ID Byte 1 0x00 ; Vendor assigned function ID (byte 0) 0x14 ; Vendor assigned function ID (byte 1) 0x02 ; flags[1] = supports commands at index 0x31 ;--------------------------------------------------------------------------- ; ANSI Identifier string ; ; The Ansi Identifier string is an ASCII text string to display ; to the user for prompts and messages about the InterWave board. ;--------------------------------------------------------------------------- 0x82 ; ANSI identifier string - Large item, ID string tag 0x11 ; Length byte 0 (low byte) - In total, 8 bytes long 0x00 ; Length byte 1 (high byte) 'GM (MPU401) Music' ; Actual ANSI identifier ;=========================================================================== ; End tag ; ; The end tag defines the end of the EEPROM, and the EEPROM ; checksum. Note that the checksum of zero means "unknown ; checksum", and that the PnP manager should not bother to verify ; that the EEPROM checksum is correct. ;=========================================================================== 0x79 0x00