;---------------------------------------------------------------------------- ; MRCI.INC - Microsoft Real-Time Compression Interface definitions ; ; Microsoft Confidential ; Copyright (C) Microsoft Corporation 1992 ; All Rights Reserved. ; ; History: ; 18-Jul-92 bens Initial version. ; 25-Jul-92 billkru Adapted for use by MS-Flash & ROMDOS environment. ;---------------------------------------------------------------------------- intMRCIROM equ 1Ah ; ROM MRCI interrupt number mrciDETECTROM equ 0B001h ; ROM intMRCI AX for detecting MRCI server intMRCI equ 2Fh ; MRCI interrupt number mrciDETECT equ 4a12h ; intMRCI AX for detecting MRCI server mrciBackPatch equ 4a13h ;---------------------------------------------------------------------------- ; sigOLD_CX, sigOLD_DX, sigNEW_CX, sigNEW_DX - MRCI Server detection ; ; These values are used to verify that the response from issuing ; intMRCI is coming from an MRCI server, and not some other piece ; of code. ; ; The *old* values are passed on the mrciQUERY call, and the server ; must change CX/DX to the *new* values, so that the caller can ; trust that the MRCI server was responding, and not some other ; interrupt hooker. ; ; The Server uses this code sequence to transform CX/DX: ; ; ;------------- entry: cx='ab' dx='cd' ; xchg ch,cl ; cx='ba' dx='cd' ; xchg dh,dl ; cx='ba' dx='dc' ; xchg dx,cx ; cx='dc' dx='ba' ;---------------------------------------------------------------------------- sigOLD_CX equ 'MR' sigOLD_DX equ 'CI' sigNEW_CX equ 'IC' sigNEW_DX equ 'RM' ;---------------------------------------------------------------------------- ; mcXXXX - flag values passed to MRCI operations ; ; MRCCompress and MRCDecompress take a flag to indicate whether the ; client is a *system* component (and hence may call with InDOS ; set), or an *application*. ; ; If a system client calls MRCCompress/MRCDecompress with mcSYSTEM, ; then it is the clients responsibility to ensure that one of the ; following is true: ; 1) InDOS is set ; 2) The call is made at interrupt time. ; ; FAILING TO FOLLOW THE ABOVE RULE WILL LIKELY RESULT IN A SYSTEM ; HANG AND LOSS OF USER DATA. ;---------------------------------------------------------------------------- mcAPPLICATION equ 0 ; Client is an application mcSYSTEM equ 1 ; Client is a file system driver ;---------------------------------------------------------------------------- ; MRCI Server Busy flag values ;---------------------------------------------------------------------------- MRCI_SERVER_IDLE equ 0 ;---------------------------------------------------------------------------- ; MRCINFO - MRC Information data structure ; ; A pointer to an MRCINFO structure is returned from MRCQuery, and sent ; on MRCNotifyLoad. This structure contains information on the MRCI ; server and its capabilities. ;---------------------------------------------------------------------------- MRCINFO struc mi_lVendor dd ? ; A 4-byte vendor ID. ; Microsoft's vendor ID is "MSFT". mi_wVendorVersion dw ? ; Version number of the MRC server. ; High byte is major number, low byte is minor. ; EXAMPLES: v3.20 = 0314h, v10.01 = 0A01h mi_wMRCIVersion dw ? ; Version number of the MRCI supported by ; this server. mi_pfnOperate dd ? ; Far pointer of the server compression entry ; point. mi_flCapability dw ? ; Bit field of server capabilities ; See micapXXX for bit definitions mi_flHWAssist dw ? ; Bit field of hardware assisted ; server capabilities. One-to-one ; correspondance with mi_flCapability ; bits. A bit set in this field ; indicates the corresponding ; capability is hardware assisted. mi_cbMax dw ? ; Maximum number of bytes that the compression ; services provider can compress or decompress. ; Requests to compress or decompress buffers in ; excess of this length will fail. ; All MRCI servers must support at least ; 8192 byte (8Kb) blocks. MRCINFO ends ;---------------------------------------------------------------------------- ; micapXXXXX - bit flags for MRCINFO.mi_flCapabilities ; ; These define both the capabilities of the Server, and also double ; as *operation* codes passed to the mi_pfnOperate entry point in ; the server. ; 111111 ; 5432109876543210 ;---------------------------------------------------------------------------- micapNONE equ 0000000000000000b ; No capabilities micapSTANDARD equ 0000000000000001b ; Standard compress micapDECOMPRESS equ 0000000000000010b ; Standard compress micapUPDATE equ 0000000000000100b ; Update compress micapSUPER equ 0000000000001000b ; SuperCompress(tm) micapSUPERUPDATE equ 0000000000010000b ; Update SuperCompress(tm) micapINCDECOMP equ 0000000000100000b ; Incremental Decompress ; Remaining bits (6..14) are RESERVED and must be 0 micapREADONLY equ 1000000000000000b ; MRCINFO structure is read-only micapDEINSTALL equ 1111111111111111b ; Server deinstall service ;---------------------------------------------------------------------------- ; MRCREQUEST - MRC compress/decompress Request packet ; ; This structure is used to pass parameters to the server for ; compress/decompress operations. ; ; General Notes ; ------------- ; 1) and MUST NOT OVERLAP! ; ; 2) The safest practice is for mr_cbSrc and mr_cbDst to be identical ; (except for decompress where mr_cbSrc is ignored and mr_cbDst is ; the count of bytes to uncompress). ; ; Details on Structure Members ; ---------------------------- ; mr_pbSrc ; This points to the *source* buffer. ; ; On a *compress* operation, the contents of this buffer are ; *uncompressed* data. ; ; On an *update* operation, the contents of this buffer starting ; at offset mr_offUpdate is valid, uncompressed data. The contents ; from the start of the buffer to the byte just prior to ; mr_OffUpdate are ignored. ; ; On a *decompress* operation, the contents of this buffer are ; *compressed* data. ; ; mr_cbSrc ; This is the size of the *source* buffer. ; ; This is the amount of data to be compressed or decompressed. ; NOTE: For a decompress operation, this value may be ignored ; by many implentations, since the MRC Format encoding has ; a special code to indicate the end of the compressed data. ; ; mr_offUpdate ; NOTE: This is used for Update(Super)Compress only. ; ; On INPUT, this is the offset (same segment as mr_pbSrc) in the ; *source* buffer where the changed uncompressed data starts. ; ; On OUTPUT, this is the offset (same segment as mr_pbDst) in the ; *destination* buffer where the changed compressed data starts. ; ; mr_pbDst ; This points to the *destination* buffer. ; ; On a *compress* operation, this buffer receives the *compressed* ; result of the operation. ; ; On an *update* operation, the contents of this buffer MUST be ; the compressed representation of the uncompressed data in the ; *source* buffer. After the operation is completed, this buffer ; receives the *compressed* result of the operation. ; ; On a *decompress* operation, this buffer receives the ; *uncompressed* result of the operation. ; ; mr_cbDst ; On a *compress* operation and on INPUT, this is the size of ; the *destination* buffer. If, during the operation, the ; Server would overflow this buffer length, then the operation ; fails and the server returns the error MRCI_ERROR_BUFFER_OVERFLOW. ; ; On a *decompress* operation and on INPUT, this is what the ; *decompressed* size should be. If, during the operation, the ; Server would overflow this length, then the operation fails ; and the server returns the error MRCI_ERROR_BUFFER_OVERFLOW. ; ; On OUTPUT, the Server updates this field with the actual size ; of the resulting compressed/uncompressed data. ; ; mr_cbChunk ; This is information that the Server compress routines can use to ; "early out" of the compression as early as possible. ; ; Valid values are 1 (client is interested in savings as small as ; 1 byte) to 32767. DblSpace passes 512, and MS-Flash passes 1. ; ; This field is most easily explained by giving an example: ; ; Example: ; DblSpace does space allocation in chunks of 512 bytes (the ; common sector size on a disk). ; ; The compression server can use this information for two ; optimizations: ; ; 1) If the Server cannot compress the uncompressed data ; enough to save at least 512 bytes, then the data is ; *incompressible* as far as DblSpace is concerned, even ; if it could be compressed to save fewer than 512 bytes. ; ; 2) While compressing, if the Server gets to a point where ; the remaining uncompressed data is of such a length that ; it can be encoded simply (without table lookups, etc.) ; and not cross a 512 byte boundary, then the Server can ; do the simple encoding. ; ; It is likely that these optimizations will be hard to perform ; quickly in software, but it is possible that hardware can do ; these optimizations without any performance loss. ;---------------------------------------------------------------------------- MRCREQUEST struc mr_pbSrc dd ? ; Pointer to source buffer mr_cbSrc dw ? ; Size of source buffer, in bytes mr_offUpdate dw ? ; For UpdateCompress only: offset of (source) destination ; buffer where changed (un)compressed data starts. mr_pbDst dd ? ; Pointer to destination buffer mr_cbDst dw ? ; Size of destination buffer, in bytes mr_cbChunk dw ? ; Client compressed data storage chunk size (see above!) mr_dwIncDecomp dd ? ; Incremental Decompression state MRCREQUEST ends ;---------------------------------------------------------------------------- ; MRCI_ERROR_XXX definitions ; ; Error codes returned from a request ;---------------------------------------------------------------------------- MRCI_ERROR_NONE equ 0 ; No error MRCI_ERROR_NOT_SUPPORTED equ 1 ; Unsupported operation requested MRCI_ERROR_BUSY equ 2 ; Server is busy MRCI_ERROR_BUFFER_OVERFLOW equ 3 ; Destination buffer too small MRCI_ERROR_NOT_COMPRESSIBLE equ 4 ; Data could not be compressed MRCI_ERROR_BAD_MRC_FORMAT equ 5 ; Compressed data format is bad ;--------------------------------------------------------------------------- ; DblSpace MRCI Server constants ;--------------------------------------------------------------------------- MRCIVERSION equ 0100h ; MRCI version supported by this server MYVERSION equ 0100h ; Version of this server/driver MYVENDOR equ 5446534Dh ; "MSFT" (reversed for byte ordering) MYVENDORhi equ 5446h ; High word of MYVENDOR MYVENDORlo equ 534Dh ; Low word of MYVENDOR ; Max buffer size set to 32k to avoid problems with compression code and ; buffer offsets near 0E000h. See comments in rcomp.asm for details. MYCBMAX equ (32*1024) ; Maximum compression buffer size ; This server's capabilities. micapMINE = micapSTANDARD or micapDECOMPRESS or micapINCDECOMP MYHWASSIST equ 0 ;we have no hardware assist