From editor@juno.com Tue Oct 29 14:05:34 1996 Newsgroups: comp.os.cpm Subject: Re: *.LBR etc. From: editor@juno.com (Bruce Morgen) Date: Tue, 29 Oct 1996 06:05:34 GMT Axel_Berger@k2.maus.de (Axel Berger) wrote: >*rcampbell@seanet.com* wrote on Tue, 96-10-22 02:08 in comp.os.cpm: >RC>*.LBR & *.ARC files are the types of compressed archives that were >RC>used on CPM systems. > >Does anybody have the algorithms for these? While having become a >collector - without any original eighties experience though - I prefer >to to my archiving etc. on the Atari ST. A compiled GFA Basic ought to >be fast enaugh. > OK, Axel, I dug up and unsqueezed LUDEF5.DQC for you: _________________________________________________________________________ File: LUDEF5.DOC Date: 84-08-19 ; Replaces: LUDEF4.DOC Dated: 84-08-04 ; ; From: Gary P. Novosielski ; To: All LU users ; ; Subj: .LBR format definition ; ; This file is a revision of and obsoletes the previous ; version. Revised material is indicated by a vertical ; bar (|) to the left of the text. ; ; 0. Introduction ;| This is the fifth revision of the formal definition of ; the format of library (.LBR) files as used by the LU Library ; Utility program and the LRUN command-file load-and-go utility. ;| Many thanks to all of those who have taken the time to ;|make suggestions for improvements to this definition. Purely ;|voluntary compliance with this standard by scores of program- ;|mers on many differing operating systems has allowed the .LBR ;|format to evolve into a successful exchange tool in many ;|segments of the computing community. Additional suggestions ;|are encouraged. ;| Please note that the current version of LU does not support ;|the full directory format as defined here. This revision has ;|been distributed as an aid to programmers working on various ;|other programs on non-CP/M operating systems, to allow support ;|for new features in a standardized manner. ; ; 1. Library Overview ;| A library is a data file which is assumed to be logically ; divided into one or more subparts called members. The library ; may have any filename and filetype, except that ".LBR" is ; considered to be the default filetype. Programs must assume ; and may optionally require the .LBR extension on any file ; which is to be treated as a library. ; ; 2. Disk Access Method ; Libraries are usually treated as Random Record files by ; programs, but must never contain unallocated "holes" which ; are normally allowed in Random Record files. A library can ; therefore be safely treated as a sequential file if desired. ; This allows copy programs, compacting programs, and remote ; transfer programs to process the library sequentially, and to ; safely make the assumption that the first occurrence of a ; no-record-found condition truly indicates the physical end of ; the library. ; ; 3. Internal Organization ; A library must contain at least one member, the directory, ; and may contain an arbitrary number of other members, up to ; the limits of file size imposed by the operating system. The ; library may also contain unused sectors which are not assigned ; to any member. These sectors may occur as a result of the ; deletion of members, or of an unsuccessful add operation. ; There are no constraints on the contents of members, except ; for the directory, which is always the first member in the ;|library, and has a specific format defined later. The entire ;|library file and each of its members are conceptually ;|organized into "sectors", each sector being 128 bytes long. ; Each sector of the file belongs to at most one library member. ;|Each member comprises a whole number of sectors. The last ;|sector of a member may, however, be logically declared as a ;|"Short Sector". Although it physically contains 128 bytes, ;|a Short Sector contains one or more "pad" bytes at the end ;|for the purpose of maintaining the structure of the library ; file as a whole. A member may have as few as 0 sectors. ; ; Members may be referred to by a name of up to 8 characters, ; and an extension of up to 3 characters. The naming rules ; are identical to those for the naming of CP/M-80 disk files. ;|Members must be uniquely named; any given combination of name ;|and extension may identify at most one member. ; ; The start and end points of each member are defined by the ; pointers in a "directory entry" for the member. There are no ; embedded start or end marks separating the members. All ; sectors between the start and end sectors of a member belong ;|to that member. The members need not appear in the library ;|in the same order that their directory entries appear in the ;|directory. Thus the directory may be sorted, within certain ;|ordering constraints defined below, without physically moving ;|the members themselves. ; ; 4. Directory Format ; The directory is the first member of a library, and must ; begin in sector 0 of the file. It must contain at least one ; sector, and may contain an arbitrary number of sectors. The ;|directory may not contain a Short Sector. ; The directory is composed of entries. Each entry is 32 ; bytes in length, so that the number of entries is equal to ; four times the number of sectors in the directory. The ;|number of entries present determines the maximum number of ;|members in the library. Each directory entry contains the ;|name, starting point, size, and other information for one ;|of the members in the library. ; Each entry is initialized to one of three possible states: ; Active, Deleted, or Unused. The first entry is always active, ; and is the entry corresponding to the directory itself. ; Unused entries always occur after all active and deleted ; entries. If the directory is scanned beginning with the ; first entry, and an unused entry is found, then all remaining ; entries from there through the end of the directory must also ; be tagged as unused. ; However, active and deleted entries may be mixed in any ; order. Finding a deleted entry does not guarantee that all ; active entries have been scanned. ; ; 5. Directory Entry Format ; ; The 32 bytes of each entry have the following significance: ; ; Byte Meaning ; ---- ------------------------------------------ ; 0 STATUS Possible values (in hexadecimal) are: ; 00 Active Entry ; FE Deleted Entry ; FF Unused Entry ; Any other value should be treated as ; a deleted entry. ; ; 1-8 NAME Rules are identical with those which ; govern the naming of disk files. Names ; shorter than the maximum are padded with ; spaces. ; ; 9-11 EXTENSION Rules are the same as for NAME. ; ; 12-13 INDEX Pointer to the first sector of the ; member within the library. Stored as ; a two-byte binary value, least significant byte ;| first. For example, an index of value of 9 ;| indicates that the first sector of the member ;| occurs 9 sectors, or 9 * 128 = 1152 bytes from ;| the beginning of the library. ; ; 14-15 LENGTH The length of the member in sectors. ; Stored as a two-byte binary value, ; least significant byte first. If this value is ; zero, then the member is empty, and the Index ; field (above) is meaningless. ; ; 16-17 CRC The Cyclic Redundancy Check value for ; the member. Stored as a two-byte ; binary value, least significant byte first. ; This value is calculated using the CCITT ; algorithm as used in the widely supported ; XMODEM protocol. If each of the bytes in the ;| member (including any pad bytes inserted in the ;| possibly "short" last sector) are processed by ;| this algorithm, followed by the two bytes of ; the CRC itself (high order first) the resulting ; value will be zero. ;| Special-case processing is required for the ;| CRC value of the directory member. See below. ;| ;| The next four 16-bit words are reserved for library ;| member time and date stamping. They are all stored ;| as two-byte binary values, least significant byte ;| first. Programs not implementing time and date ;| stamping shall explicitly set any unused values to ;| zero when creating a new entry. Programs must convert ;| the time and date formats, if any, defined by their own ;| operating system into the given formats to insure ;| transportability of the resulting library file. ; ;| 18-19 CREATION DATE The date of creation of the ;| file. Its value may be prior ;| to the date the file was added as a member of ;| the library, if the operating system can supply ;| the original creation date of the file. On ;| extracting the member from the library, this ;| date may be passed to the operating system for ;| its use in restoring the original creation ;| date. The format for the date conforms to ;| Digital Research MP/M (and CP/M+) julian date ;| format. This is a binary 16-bit integer ;| value representing the number of days since ;| December 31, 1977. For example: Jan 1, 1978 ;| is day 1 (0001H), and July 4, 1984 is 2377 ;| (0949H). A zero value indicates this date is ;| not available. ; ;| 20-21 LAST CHANGE DATE The date of last change to ;| the member. Assumed to be ;| no earlier than the creation date, and may ;| pre-date the addition of the file as a member. ;| Storage format is identical to creation date. ;| If the operating system supplies only one file ;| date, it should be stored in Creation Date, ;| and Last Change Date left unused (set to zero.) ;| A zero value is assumed to be equal to the ;| creation date. A program which makes any ;| in-place changes to the member while it resides ;| in the library should update the value of this ;| field with the current date if known, or if ;| not known, should overwrite with zeros. For ;| the purpose of this definition, the performing ;| of a strictly reversable process, such as the ;| encryption, compression, or translation of a ;| member does not require a change of date. ; ;| 22-23 CREATION TIME If available, the time-of-day ;| corresponding to the creation ;| date as defined above. The storage format ;| conforms to MS-DOS standards, wherein the 16- ;| bit word comprises three sub-fields as follows: ;| ;| byte: <==23==> <==22==> ;| bit: 76543210 76543210 ;| field: hhhhhmmm mmmsssss ;| ;| legend: ;| h = Hours. Treated as a 5-bit binary integer ;| in the range 0..23 ;| m = Minutes. Treated as a 6-bit binary integer ;| in the range 0..59 ;| s = Seconds/2. Treated as a 5-bit binary ;| integer in the range 0..29, allowing ;| resolution to the nearest 2-second ;| interval. May be zeros in a system ;| supporting only hour/minutes. ;| ;| 24-25 LAST CHANGE TIME If available, the time of ;| day corresponding to the ;| Last Change Date defined above. Format is the ;| same as Creation Time. ; ;| 26 PAD COUNT Valid range: 00H to 7FH. This ;| byte is for use with non-CP/M ;| systems, such as MS-DOS and UNIX, where file ;| lengths are not necessarily a multiple of 128 ;| bytes. It allows the exact size of the member ;| to be expressed in the directory entry. The ;| value in PAD COUNT represents the number of pad ;| bytes (from 0 to 127) which were inserted in ;| the final sector of the member to bring its ;| size up to the required 128 bytes. The value ;| of each pad byte inserted should be a hexi- ;| decimal 1A (ASCII SUB character) which is ;| a normal end-of-file mark under CP/M. ;| ;| For example, a Pad Count of 10 hexidecimal (16 ;| decimal) implies that the last 16 bytes of the ;| final sector of the member are pad characters, ;| i.e. that only the first 112 bytes (128-16) are ;| actually part of the member file. The pad ;| characters may be ignored when the member is ;| extracted from the library. The resulting file ;| is then the same length as the original. ;| Specifically, it is ((LENTH * 128) - PAD COUNT) ;| bytes long. ;| ;| Note well, however, that the pad characters are ;| in fact physically present in the library file, ;| and are counted as significant characters in ;| the CRC check value calculations discussed ;| above. This is necessary to provide downward ;| compatibility with older libraries, and with ;| programs which do not implement this feature, ;| such as CP/M-only versions of LU. Any program ;| not implementing this feature shall explicitly ;| set this byte to zero when creating a new ;| entry. (Libraries built by any program which ;| properly adhered to prior versions of this ;| standard have therefore been properly created.) ;| In this case, the last sector of the member ;| will be assumed to be a full 128 bytes long, ;| which was always the case in the past. ; ; 27-31 FILLER Reserved for future use. In unused ; and deleted entries, these bytes are ; garbage. In all active entries, they are explicitly ; set to binary zero. ; Any future enhancements to the .LBR format which ; make use of these bytes will recognize this zero ; value as a non-error condition to allow a library ; created with an old version of LU to be processed by ; future versions. ; ;| 6. Directory Control Entry ;| The Directory Control Entry is always the first entry in ;| the directory, and is the entry which corresponds to the ;| directory member itself. This entry is similar in form to ;| any other entry, but is specified more completely here for ;| clarification. ;| ;| STATUS Always 00, Active. The directory must ;| always be an active member. ;| ;| NAME Always 8 blanks. This is the unique ;| name of the directory member. ;| ;| EXTENSION Always 3 blanks. ;| ;| INDEX Always 0000; the directory must be ;| physically located at the beginning of ;| the library file. ;| ;| LENGTH Never 0000. The directory must contain ;| at least one sector. The actual length ;| of the directory is found here. ;| ;| If any program finds, in the first sixteen bytes of a library ;| file, one or more values which conflict with the above ;| specifications, this fact shall be interpreted as a fatal ;| indication that the file is not a valid LBR-format library. ;| Errors in the following bytes are non-fatal: ;| ;| CRC Since the directory contains its own ;| entry, and hence its own CRC value, a ;| logical conflict would arise if the CRC value were ;| calculated in the normal manner. The act of storing ;| the CRC value in the entry would render it invalid. ;| For this reason, the CRC value of the directory member ;| is calculated after explicitly storing a 0000 value ;| in the CRC word of the first entry. The resulting ;| calculated value is then stored in this word before ;| closing the library. ;| When checking the CRC of an existing directory, the ;| old CRC value in the first entry is saved in temporary ;| storage and replaced by 0000 before calculating the ;| new CRC value. The old and new values should then be ;| compared for equality. ; ; CREATION DATE If used, the date of creation of the ; library. Reorganization of the library ; to reclaim space may leave this date unchanged. ; ; LAST CHANGE DATE If used, the date of last change to ; the directory. The directory is ; changed by adding, deleting, or renaming members, and ; by reorganizing the library. ; ; CREATION TIME If used, the time of creation of the ; library. ; ; LAST CHANGE TIME If used, the time of last change to ; the directory. ; ; PAD COUNT Value ignored and assumed 0. Directory ; sectors are always a full 128 bytes. ; Set to 0 when library is created or reorganized. ; ; FILLER Set to 0 as in any other entry. ; ; Notes: ; In unused and deleted entries all bytes except the ; Status byte are undefined. ; ; The contents of any data sectors which are not ; assigned to an active member are not defined. ; They remain allocated to the .LBR file, to provide ; for sequential processing, as noted above, but no ; assumptions should be made as to their contents. ; These sectors are eliminated from the library when ; it is reorganized. ; ; For systems which do not implement the CRC validation ; functions, the CRC value of member entries should ;| be set to 0000. Libraries created by very early ;| versions of LU may have garbage in the last 16 bytes ;| of the first directory entry, but all other entries ;| will conform to this convention. These old library ;| files may generate spurious (but non-fatal) error ;| messages caused by a garbage Directory CRC. Attempts ;| to support the detection of this condition, and the ;| supression of these error messages has become more and ;| more complex to implement, and more difficult to ;| justify. Beginning with this definition, such attempts ;| are forsaken. Users experiencing a problem with this ;| are encouraged to make a minor change to such libraries ;| with a version 3.0 or higher LU. A dummy add/delete or ;| reorganization will suffice. My appologies for any ;| inconvenience this may cause. ; ; 6. Conclusion ; If there are any further questions, comments, or requests ; regarding library format, or if you note any ambiguities or ; contradictions in these specifications, please feel free to ; contact me. ; ; Gary P. Novosielski ; ; Voice phone: (201)935-4087 Evenings and weekends ; MCI Mail: GNOVOSIELSKI ; CompuServe: [70160,120] EMAIL or CP-MIG ; Telex: 650-195-2395 6501952395 MCI ; ; End of file. ; _________________________________________________________________________