home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 144.lha / disk.tutor < prev    next >
Text File  |  1986-11-21  |  47KB  |  969 lines

  1.             An Explanation of AmigaDOS Storage Device Structure
  2.  
  3.   In order for you to use a disk editor to its full disk-saving/disk-altering
  4. potential, you must first understand the structure of an AmigaDOS device.
  5. References will be made to a P.D. disk editor called 'Sectorama', though the
  6. basic information and principals presented in this doc will be applicable to
  7. all disk editors.  Note that to avoid confusion and to provide immediately
  8. applicable info, the block formats presented in this doc are specifically for
  9. 512 byte blocks.  For larger blocks, the size of the Hash Table will vary and
  10. all info after the hash table will be displaced ahead of the hash table so
  11. the secondary-type word is at the end of the block.  All devices I know of to
  12. this point use a 512 byte block.
  13.  
  14.   This document is basically written in two parts.  The first part is an
  15. explanation of what each word in each type of block, how various types
  16. of blocks are structured, and how all these blocks relate to one another on
  17. an AmigaDOS storage device.  The second part is an explanation of how to do
  18. things with a disk editor such as sectorama.
  19.  
  20.  
  21.  
  22. I) BLOCK BASICS
  23.    ============
  24.  
  25.   Generally, each block on an AmigaDOS device contains a checksum, a header
  26. key whose value is the disk address of the block, and a block type which tells
  27. you what type of block this is so you know what format that particular block
  28. uses.  Note that when I use the term, 'block', I am referring to a 512 byte
  29. chunk of storage space on an AmigaDOS device.  For example, on a floppy or
  30. hard drive, a block refers to a 512 byte sector.  In VDO: and RAM:, a block
  31. refers to 512 contiguous bytes somewhere in memory.  Also note that the size
  32. of each datum in a block is a 32 bit word.  For all blocks, the first
  33. six words are as follows:
  34.  
  35.      +--------------------+
  36.    0 |    Block Type      |
  37.      +--------------------+
  38.    1 |    Header Key      |
  39.      +--------------------+
  40.    2 |  Number or count   |
  41.      +--------------------+
  42.    3 | Table or Data size |
  43.      +--------------------+
  44.    4 | First or next data |
  45.      +--------------------+
  46.    5 |     Checksum       |
  47.      +--------------------+
  48.      :                    :
  49.  
  50. Block Type  - This identifies the general size and structure of this block.
  51.               It currently has one of three values:
  52.  
  53.               T.SHORT = 00000002  This indicates the block is at the head of
  54.                                   a list (i.e. a HEADER BLOCK).
  55.  
  56.               T.LIST  = 00000010  This indicates the block is a LIST BLOCK.
  57.                                   A list block is a member of a linked list
  58.                                   list blocks and contains a table of pointers
  59.                                   to data blocks.
  60.  
  61.               T.DATA  = 00000008  This indicates the block is a DATA BLOCK.
  62.                                   A data block is simply a block that contains
  63.                                   data and will be described later in this
  64.                                   doc.
  65.  
  66. Header Key  - This 32-bit word is the device's address for this block.  It
  67.               is a pointer to this block.
  68.  
  69. Number or Count - If this not a data block, this is a total count of data
  70.                   blocks (and, hence, the highest sequence number of any
  71.                   data block) pointed-to by this block.
  72.  
  73.                 - If this block is a data block, this number is the sequence
  74.                   number of this data block.  That is, it tells us this data
  75.                   block is the n'th member of a list of data blocks.
  76.  
  77. Table or Data Size - This is a count of how many 32-bit words there are in
  78.                      the table or data starting at word # 6 in this block.
  79.  
  80.  
  81. First or Next Data - This is a pointer to the data block following this block.
  82.                      If this block is a header or a list block, then this
  83.                      pointer will point to the first data block in a list
  84.                      of data blocks.
  85.  
  86. Checksum - When this number and the values of all other words in this block
  87.            are added up, the sum must be zero.  This is how bad blocks are
  88.            detected by AmigaDOS.
  89.  
  90. For all types of blocks excepting data blocks, the last four words have the
  91. following format:
  92.  
  93.      :                :
  94.      +----------------+
  95.   7C |   Hashchain    |
  96.      +----------------+
  97.   7D |    Parent      |
  98.      +----------------+
  99.   7E |   Extension    |
  100.      +----------------+
  101.   7F | Secondary Type |
  102.      +----------------+
  103.  
  104. Hashchain - points to the next entry on this hash chain.
  105.  
  106. Parent - pointer to the parent directory.  The parent directory is the
  107.          directory block which either points to this block or points to a
  108.          linked list (i.e. hash chain) of which this block is a member.
  109.  
  110. Extension - pointer to the next extension block which essentially extends the
  111.             table which starts at word # 6 of this block.
  112.  
  113. Secondary Type - This exactly identifies what kind of block this is.  This
  114.                  tells us exactly what function and structure this block has.
  115.                  The possible codes in this word are:
  116.  
  117.                  ST.ROOT    = 00000001  This identifies the ROOT BLOCK, which
  118.                                         is the device's 'root directory'.
  119.                                         This block ultimately points to all
  120.                                         the files and directories on the
  121.                                         storage device.
  122.  
  123.                  ST.USERDIR = 00000002  This identifies a USER DIRECTORY BLOCK
  124.                                         which points to all the files and
  125.                                         directories which have been defined
  126.                                         for this directory.
  127.  
  128.                  ST.FILE    = FFFFFFFD  This identifies either a FILE HEADER
  129.                                         BLOCK, if the block type at word # 1
  130.                                         is T.SHORT, or a FILE LIST BLOCK if
  131.                                         the block type is T.LIST.
  132.                                         A FILE HEADER BLOCK points to all the
  133.                                         data blocks that make up the file.  If
  134.                                         there are too many data blocks to be
  135.                                         pointed to by this block, a list of
  136.                                         FILE LIST BLOCKS is pointed-to by the
  137.                                         extension pointer at word # 7E.  A
  138.                                         FILE LIST BLOCK simply extends the
  139.                                         table and points to the next FILE LIST
  140.                                         BLOCK if more data block pointers are
  141.                                         required.
  142.  
  143. Note that the above-mentioned word definitions are not applicable to some
  144. block types and functions.  Where their function is non-applicable, their
  145. value is usually set at zero.
  146.  
  147.  
  148.  
  149. II) THE ROOT BLOCK
  150.     ==============
  151.  
  152.   The block that ultimately points to everything on the disk is called the
  153. 'Root Block'.  This block usually resides in the exact center of a storage
  154. device to minimize the distance a read/write head of a floppy or hard disk
  155. must move when travelling from an outer cylinder to the Root Block.  The
  156. format of the Root Block is as follows:
  157.  
  158.         symbolic    usual
  159.          value      value
  160.      +----------------------+
  161.    0 |  T.SHORT  = 00000002 |  Indicates this is a 512 byte header block
  162.      +----------------------+
  163.    1 |        0  = 00000000 |  Header Key (Always zero in a root block)
  164.      +----------------------+
  165.    2 |        0  = 00000000 |  Highest sequence number in chain (0 for root)
  166.      +----------------------+
  167.    3 |  HT SIZE  = 00000048 |  Hashtable size (=blocksize-56 = 512/4-56 words)
  168.      +----------------------+
  169.    4 |        0  = 00000000 |
  170.      +----------------------+
  171.    5 | CHECKSUM  =    ?     |  Checksum for this block
  172.  ----+----------------------+
  173. {  6 |                      |
  174. {    |      Hash Table      |
  175. { to :                      :
  176. {    :                      :
  177. { 4D |                      |
  178.  ----+----------------------+
  179.   4E |   BMFLAG  = FFFFFFFF |  True (all F's) if device or disk bitmap valid
  180.  ----+----------------------+
  181. { 4F |                      |
  182. {    |     Bitmap Pages     |
  183. { to :                      :
  184. {    :                      :
  185. { 68 |                      |
  186.  ----+----------------------+
  187.   69 |     DAYS  =    ?     |  Volume last altered date and time.
  188.      +----------------------+  Date is in packed format.
  189.   6A |     MINS  =    ?     |  Time is rated in minutes and ticks.
  190.      +----------------------+  One tick is 1/60th of a second.
  191.   6B |    TICKS  =    ?     |
  192.  ----+----------------------+
  193. { 6C |                      |  Volume name as a BCPL string of 30 characters
  194. {    |      Disk Name       |  or less, though the amount of space to store
  195. { to :                      :  this string always remains the same size.
  196. {    :                      :
  197. { 78 |                      |
  198.  ----+----------------------+
  199.   79 |CREATEDAYS =    ?     |  Date and time when this volume was created.
  200.      +----------------------+  Format here, as well as all date/time data
  201.   7A |CREATEMINS =    ?     |  presented in other types of blocks are in the
  202.      +----------------------+  format shown for the above volume last altered
  203.   7B |CREATETICKS=    ?     |  date and time.
  204.      +----------------------+
  205.   7C |        0  = 00000000 |  Next entry on this hash chain (0 for root)
  206.      +----------------------+
  207.   7D |        0  = 00000000 |  Parent directory (always 0 for root)
  208.      +----------------------+
  209.   7E |        0  = 00000000 |  Extension  (always 0 for root)
  210.      +----------------------+
  211.   7F |  ST.ROOT  = 00000001 |  Secondary type indicates this is a Root Block
  212.      +----------------------+
  213.  
  214. -> What the heck is a HASH TABLE?
  215.  
  216.   A HASH TABLE is a table of pointers to files and to lists of files.  To
  217. locate a particular file in the table, the name of the file is used to
  218. calculate where in the table it is to be located.  This location may not be
  219. unique to the name of this file.  In this case, the pointer will point to a
  220. linked list of file headers which must be traversed until the file header for
  221. the file we're searching for is found.  This linked list is referred to as a
  222. HASH CHAIN.
  223.  
  224.   The actual searching-out of files will be discussed in more practical terms
  225. in the practical portion of this document.
  226.  
  227. -> What things are pointed-to by pointers in a HASH TABLE?
  228.  
  229.   Each non-zero pointers in the hash table points to either a FILE HEADER
  230. BLOCK or a USER DIRECTORY BLOCK which, in turn, may have a hash chain pointer
  231. which will point to the next file header block or user directory block in
  232. the hash chain.
  233.  
  234. -> What are bitmap pages?
  235.  
  236.   The words in the list of bitmap pages point to 512 byte blocks which
  237. simply map-out which blocks on the device are used, and which are free for
  238. usage.  I don't yet understand how the bitmaps are set-up or maintained,
  239. but as soon as I find out, I'll slip the info into this document.
  240.  
  241. -> What is a BCPL string?
  242.  
  243.   This is a string of bytes where the first byte indicates the number of
  244. characters in the string (say, 'n' characters), the next 'n' characters
  245. contain the ASCII values for the string, and the rest of the string is
  246. ignored.  For example, on my Workbench disk, a hex dump of the string looks
  247. like this:
  248.  
  249. 09576F72 6B62656E 63686F72 6B62656E .Workbenchorkben
  250. 63680000 00000000 00000000 00000000 ch..............
  251. 00000000 00000000                   ........
  252.  
  253. Where the 09 at the beginning specifies that only the next nine characters
  254. are valid characters of the string and the rest are ignored.
  255.  
  256. Note that for the root block, zeros are always in the Header Key, Sequence
  257. Number, Hash cain, Parent, and Extension fields.  This is because a ROOT BLOCK
  258. is always at a specific spot on the device (for a disk, it is exactly
  259. cenetered between the outer- and inner-most cylinders), it never require hash
  260. table extensions, it is not pointed-to by a hash table and is not part of a
  261. hash list, and it does not have a parent directory.
  262.  
  263.  
  264.  
  265. III) USER DIRECTORY BLOCKS
  266.      =====================
  267.  
  268.   A user directory block is created when a new directory is made in a storage
  269. device.  It contains its own name and protection status, its parent directory,
  270. as well as a hash table pointing to files and user directories that have been
  271. placed into this directory.  The hash table functions exactly the same way as
  272. that in the ROOT BLOCK.  The format of a USER DIRECTORY BLOCK is as follows:
  273.  
  274.         symbolic    usual
  275.          value      value
  276.      +----------------------+
  277.    0 |  T.SHORT  = 00000002 |  Indicates this is a 512 byte header block
  278.      +----------------------+
  279.    1 |  OWN KEY  =    ?     |  Header Key (pointer to this very block)
  280.      +----------------------+
  281.    2 |        0  = 00000000 |  Highest sequence number in chain (always zero)
  282.      +----------------------+
  283.    3 |        0  = 00000000 |
  284.      +----------------------+
  285.    4 |        0  = 00000000 |
  286.      +----------------------+
  287.    5 | CHECKSUM  =    ?     |  Checksum for this block
  288.  ----+----------------------+
  289. {  6 |                      |
  290. {    |      Hash Table      |
  291. { to :                      :
  292. {    :                      :
  293. { 4D |                      |
  294.  ----+----------------------+
  295.   4E |    SPARE  = 00000000 |
  296.   4F |    SPARE  = 00000000 |
  297.      +----------------------+
  298.   50 |  PROTECT  =    ?     |  Protection bits (Read/Write/Execute/Delete)
  299.      +----------------------+
  300.   51 |        0  = 00000000 |  Unused (always zero)
  301.  ----+----------------------+
  302. { 52 |                      |
  303. {    |       COMMENT        |  Stored as a BCPL string
  304. { to :                      :  (up to 90 characters)
  305. {    :                      :
  306. { 68 |                      |
  307.  ----+----------------------+
  308.   69 |     DAYS  =    ?     |  Directory creation date and time.
  309.      +----------------------+
  310.   6A |     MINS  =    ?     |
  311.      +----------------------+
  312.   6B |    TICKS  =    ?     |
  313.  ----+----------------------+
  314. { 6C |                      |
  315. {    |    Directory Name    |  Directory name as a BCPL
  316. { to :                      :  (up to 30 characters)
  317. {    :                      :
  318. { 7B |                      |
  319.  ----+----------------------+
  320.   7C |HASHCHAIN  =    ?     |  Next entry with same hash value
  321.      +----------------------+
  322.   7D |   PARENT  =    ?     |  Back pointer to parent directory
  323.      +----------------------+
  324.   7E |        0  = 00000000 |  Extension
  325.      +----------------------+
  326.   7F |  ST.ROOT  = 00000002 |  Secondary type (user directory block)
  327.      +----------------------+
  328.  
  329.  
  330.  
  331. IV) FILE HEADER BLOCK
  332.     =================
  333.  
  334.   This block is the first block of any given file.  It contains file
  335. information such as the name, size, protection status, creation date, and a
  336. pointer to the parent directory block of the file.  It also contains a table
  337. of pointers to all the data blocks that make up the file.  If there are more
  338. data blocks than there are pointers in the table of data block pointers (at
  339. words # 6 to 4D), an extension pointer is provided to a FILE LIST BLOCK which
  340. contains a similar table of data block pointers.  If the file list block
  341. still doesn't provide enough pointers, it will provide yet another extension
  342. pointer to another FILE LIST BLOCK.  This list of FILE LIST BLOCKS extends
  343. until enough pointers are provided to point to all the data blocks of the
  344. file.
  345.  
  346.         symbolic    usual
  347.          value      value
  348.      +----------------------+
  349.    0 |  T.SHORT  = 00000002 |  Indicates this is a 512 byte header block
  350.      +----------------------+
  351.    1 |  OWN KEY  =    ?     |  Header Key (pointer to this very block)
  352.      +----------------------+
  353.    2 |HIGHEST SEQ=    ?     |  Number of data blocks pointed-to by this block
  354.      +----------------------+
  355.    3 |DATA SIZE  =    ?     |
  356.      +----------------------+
  357.    4 |FIRST DATA =    ?     |  Pointer to the first data block of the file
  358.      +----------------------+
  359.    5 | CHECKSUM  =    ?     |  Checksum for this block
  360.  ----+----------------------+
  361. {  6 |          :           |
  362. {    :          :           :  List of pointers to data blocks
  363. { to :          :           :  (i.e. Data block keys)
  364. {    |     DATA BLOCK 3     |
  365. {    |     DATA BLOCK 2     |
  366. { 4D |     DATA BLOCK 1     |
  367.  ----+----------------------+
  368.   4E |    SPARE  = 00000000 |
  369.   4F |    SPARE  = 00000000 |
  370.      +----------------------+
  371.   50 |  PROTECT  =    ?     |  Protection bits (Read/Write/Execute/Delete)
  372.      +----------------------+
  373.   51 | BYTESIZE  =    ?     |  Total size of file in bytes
  374.  ----+----------------------+
  375. { 52 |                      |
  376. {    |       COMMENT        |  Stored as a BCPL string
  377. { to :                      :  (up to 90 characters)
  378. {    :                      :
  379. { 68 |                      |
  380.  ----+----------------------+
  381.   69 |     DAYS  =    ?     |  File creation date and time.
  382.      +----------------------+
  383.   6A |     MINS  =    ?     |
  384.      +----------------------+
  385.   6B |    TICKS  =    ?     |
  386.  ----+----------------------+
  387. { 6C |                      |
  388. {    |      File Name       |  File  name as a BCPL string
  389. { to :                      :  (up to 30 characters)
  390. {    :                      :
  391. { 7B |                      |
  392.  ----+----------------------+
  393.   7C |HASHCHAIN  =    ?     |  Next entry with same hash value
  394.      +----------------------+
  395.   7D |   PARENT  =    ?     |  Back pointer to parent directory
  396.      +----------------------+
  397.   7E |EXTENSION  =    ?     |  Pointer to a FILE LIST BLOCK (if required)
  398.      +----------------------+
  399.   7F |  ST.ROOT  = FFFFFFFD |  Secondary type (file header block)
  400.      +----------------------+
  401.  
  402.  
  403.  
  404. V) FILE LIST BLOCK
  405.    ===============
  406.  
  407.   This type of block is used to extend the table of data block keys
  408. (pointers) of a FILE HEADER BLOCK when the table in the FILE HEADER BLOCK
  409. hasn't enough pointers to point to all the file's data blocks.  If a FILE
  410. LIST BLOCK doesn't have enough pointers to point to the rest of the file's
  411. data blocks, the EXTENSION pointer of the block will point to yet another
  412. FILE LIST BLOCK.  The extension list continues until enough pointers are
  413. provided for all the data blocks in the file.
  414.  
  415.         symbolic    usual
  416.          value      value
  417.      +----------------------+
  418.    0 |  T.LIST   = 00000010 |  Indicates this is a file list block
  419.      +----------------------+
  420.    1 |  OWN KEY  =    ?     |  Header Key (pointer to this very block)
  421.      +----------------------+
  422.    2 |BLOCK COUNT=    ?     |  Number of data blocks pointed-to by this block
  423.      +----------------------+
  424.    3 |DATA SIZE  = 00000000 |
  425.      +----------------------+
  426.    4 |FIRST DATA = 00000000 |  
  427.      +----------------------+
  428.    5 | CHECKSUM  =    ?     |  Checksum for this block
  429.  ----+----------------------+
  430. {  6 |          :           |
  431. {    :          :           :  Extended list of pointers to data blocks
  432. { to :          :           :  (i.e. Data block keys)
  433. {    |     DATA BLOCK 3     |
  434. {    |     DATA BLOCK 2     |
  435. { 4D |     DATA BLOCK 1     |
  436.  ----+----------------------+
  437. { 4E |                      |
  438. {    |        unused        |  unused (all zeros)
  439. { to :                      :
  440. {    :                      :
  441. { 7B |                      |
  442.  ----+----------------------+
  443.   7C |        0  = 00000000 |  Next in hash list (always zero for list block)
  444.      +----------------------+
  445.   7D |   PARENT  =    ?     |  Points to the file header block of this file
  446.      +----------------------+
  447.   7E |EXTENSION  =    ?     |  Points to the next FILE LIST BLOCK (if required)
  448.      +----------------------+
  449.   7F |  ST.ROOT  = FFFFFFFD |  Secondary type (file header block)
  450.      +----------------------+
  451.  
  452.  
  453.  
  454. VI)  DATA BLOCK
  455.      ==========
  456.  
  457.   A data block contains data from a file and is pointed-to by preceding
  458. data blocks and by a pointer in a table in either a FILE HEADER BLOCK or a
  459. FILE LIST BLOCK.  Thus, the data block can be accessed directly from a header
  460. or list block of a file, or sequentially by following the linked list of data
  461. blocks.  Each data block also points to the FILE HEADER BLOCK which describes
  462. the file which contains this data block.  A sequence number is also present
  463. in a data block, and indicates that this data block is the n'th data block
  464. in the list of the file's data blocks.
  465.  
  466.         symbolic    usual
  467.          value      value
  468.      +----------------------+
  469.    0 |  T.DATA   = 00000008 |  Indicates this is a data block
  470.      +----------------------+
  471.    1 |  HEADER   =    ?     |  Header key pointing to the file header block.
  472.      +----------------------+
  473.    2 |  SEQ NUM  =    ?     |  Sequence number
  474.      +----------------------+
  475.    3 | DATA SIZE = 00000000 |  Number of words of data in this block
  476.      +----------------------+
  477.    4 | NEXT DATA =    ?     |  Pointer to the next data block
  478.      +----------------------+
  479.    5 | CHECKSUM  =    ?     |  Checksum for this block
  480.  ----+----------------------+
  481. {  6 |                      |
  482. {    |         DATA         |
  483. { to :                      :
  484. {    :                      :
  485. { 7F |                      |
  486.      +----------------------+
  487.  
  488.  
  489.  
  490. VII)  HOW DO THE BLOCKS FIT TOGETHER?
  491.       ===============================
  492.  
  493.   The ROOT BLOCK is located at a fixed location, exactly between the highest
  494. and lowest addresses available on a storage device.  The ROOT BLOCK contains
  495. a table of pointers (the hash table) to linked lists (hash chains) of USER
  496. DIRECTORY BLOCKS and FILE HEADER BLOCKS which describe user directories and
  497. files accessible from the root directory.
  498.  
  499.   A USER DIRECTORY BLOCK contains the name and protection status of a user
  500. directory, as well as a hash table containing pointers to hash chains of
  501. USER DIRECTORY BLOCKS and FILE HEADER BLOCKS which describe user directories
  502. and files accessible from that user directory.  Since the USER DIRECTORY
  503. itself is a member of a hash chain, it also contains pointers to its parent
  504. directory block and to the next USER DIRECTORY BLOCK or FILE HEADER BLOCK in
  505. the header chain.
  506.  
  507.   A FILE HEADER BLOCK contains information describing the file it represents,
  508. as well as a table of pointers to DATA BLOCKS that make up the file.  If
  509. there aren't enough pointers in this table to point to all the file's DATA
  510. BLOCKS, an EXTENSION pointer points to a list of FILE LIST BLOCKS which
  511. extend the table.  Since the FILE HEADER BLOCK is a member of a hash chain,
  512. it contains pointers to its parent directory and to the next USER DIRECTORY
  513. BLOCK or FILE HEADER BLOCK in the header chain.
  514.  
  515.   A FILE LIST BLOCK contains a table of pointers to DATA BLOCKS and extends
  516. the table of the FILE HEADER BLOCK or FILE LIST BLOCK which points to this
  517. FILE LIST BLOCK.  If there aren't enough pointers in this table to point to
  518. the remainder of the file's DATA BLOCKS, an EXTENSION pointer in the FILE
  519. LIST BLOCK points to the next FILE LIST BLOCK to extend its data block table.
  520.  
  521.   A DATA BLOCK's main content is data.  It is part of a linked list of DATA
  522. BLOCKS and includes a pointer to the next DATA BLOCK in the list.  It also
  523. includes a sequence number indicating that this DATA BLOCK is the n'th DATA
  524. BLOCK in the list.  Each DATA BLOCK is pointed-to both by the preceding DATA
  525. BLOCK in the list, and by a pointer in a data block table in either a FILE
  526. HEADER BLOCK or a FILE LIST BLOCK.  Each DATA BLOCK also contains a pointer
  527. to the FILE HEADER BLOCK which describes the file which the DATA BLOCK is a
  528. member of.
  529.  
  530.   Confused?  Don't worry, practical stuff is coming up next...
  531.  
  532.  
  533.  
  534. VIII) UNDERSTANDING YOUR DISK EDITOR
  535.       ==============================
  536.  
  537.   Before we begin playing with a disk editor, I recommend that you create a
  538. backup of a densely populated disk, like your workbench, so that if a wrong
  539. key is pressed while looking through the backup, you haven't done damage to
  540. your one and only copy.
  541.  
  542. a) A Look at Sectorama
  543.    ===================
  544.      For those of you lucky enough to have a copy of sectorama handy, fire it
  545.    up and I can explain what all those obscure thingies on the right side and
  546.    of the top line of the screen mean and where, from the block you are
  547.    looking at, the information was taken.
  548.  
  549.      The lower right hand portion of the display identifies the storage
  550.    device currently being examined by this sectorama display.  It gives us
  551.    the device name (as a volume name), the device unit number, and the
  552.    filename of the device driver that communicates with the device.
  553.  
  554.      The display section immediately above this info contains hardware-
  555.    dependant information.  The middle column shows us the the sector, track
  556.    cylinder, surface, and block numbers of the block currently being
  557.    displayed.  This information is all given in decimal values.  All these
  558.    statistics are all determined by a set of info used by the device driver.
  559.    For a floppy, for example, these tell us on which cylinder the read/write
  560.    head is currently positioned, which sector on which surface (top or bottom)
  561.    is being read by the read/write head, and the hardware-specific track and
  562.    block numbers for that sector.  The rightmost column are device statistics.
  563.    These tell us how many of each category there are on this device.
  564.  
  565.      Note that by pointing at any of the figures in the center column of this
  566.    section, you can change the current values.  By changing sector, surface,
  567.    or block number, you can examine any sector of the device immediately.
  568.  
  569.      The section immediately above the hardware information contains
  570.    information about (and from) the block currently being displayed:
  571.  
  572.      Date       -refers to the creation date which is taken from word # 69.
  573.  
  574.      Time       -is calculated from words # 6A (to get hours and minutes) and
  575.                  # 6B (to get seconds).
  576.  
  577.      Highest Seq # -is taken from word # 2 and refers to the number of
  578.                          words used in the table starting at word # 6.
  579.  
  580.      Data Size  -refers to the size of the table at word # 6.
  581.  
  582.      Protect    -refers to the protection status of a user directory block or
  583.                  a file header block and is taken from the value at word # 50
  584.  
  585.      File Bytes -refers to the size of a file in kilobytes.  This value is
  586.                  1/1000'th the value of word # 51.
  587.  
  588.      The section at the upper right corner of the display is a list of
  589.    keyboard commands with current values beside them.  All except the
  590.    checksum are pointers to other blocks in the device.  The checksum is the
  591.    current block's checksum value taken from word # 5.  This value must be
  592.    recalculated every time you make an alteration to a block.  The pointers
  593.    shown beside each command are as follows:
  594.  
  595.      R-Go Root     -points to the root directory of this disk.  This pointer
  596.                     is a constant value which has been calculate for this
  597.                     storage device.
  598.  
  599.      P-Go Parent   -points to a FILE HEADER BLOCK's or USER DIRECTORY BLOCK's
  600.                     parent directory block.  This pointer is taken from
  601.                     word # 7D.
  602.  
  603.      C-Go Hash Chain -points to the next FILE HEADER BLOCK or USER
  604.                       DIRECTORY BLOCK in this blocks hash chain.  This
  605.                       pointer is taken from word # 7C.
  606.  
  607.      X-Go Extension -points to the next FILE LIST BLOCK in an extension
  608.                      chain.  This pointer is taken from word # 7E.
  609.  
  610.      H-Go Header    -for DATA BLOCKS, this points to the FILE HEADER BLOCK
  611.                      to which this DATA BLOCK belongs.
  612.                     -for other blocks, this points to the block currently
  613.                      being examined.
  614.                     -in both cases, this pointer is taken from word # 1.
  615.  
  616.      For all the above commands, if you type the letter to initiate the
  617.    command, sectorama will jump to the block corresponding to the pointer
  618.    displayed beside the command.
  619.  
  620.      At the top of the display are three more information displays.  On the
  621.    left is the block number of the block currently being displayed.  Next to
  622.    that is the Type of the block being displayed.  The block type is
  623.    determined by word # 0, which contains the block type, and word # 7F,
  624.    which contains the secondary type.
  625.  
  626.      Next to the block type is the Name of the block.  This name may be a
  627.    volume name or a directory name or a file name, depending on if this block
  628.    is a ROOT BLOCK, a USER DIRECTORY BLOCK, or a FILE HEADER BLOCK,
  629.    respectively.
  630.  
  631.  
  632. b) Sectorama commands
  633.    ==================
  634.      All the sectorama commands are adequately described in the documentation
  635.    file that accompanies it.
  636.  
  637.  
  638. c) A Practical Session
  639.    ===================
  640.    i) Touring a floppy, a summary
  641.       ---------------------------
  642.          I suggest that as you progress through this little step-by-step
  643.       blathering that each time you come across a new type of block, you
  644.       compare the data being displayed by sectorama to the block
  645.       descriptions shown above so that you become more familiar about where
  646.       things are located in each type of block.
  647.  
  648.          The steps for performing the operations summarized below with
  649.       Sectorama are described in detail, with a running commentary, in
  650.       section ii) Touring a floppy with Sectorama.  For following these
  651.       steps with any other disk editor, I suggest that you quickly read
  652.       through the Sectorama tour to familiarize yourself with what is
  653.       being attempted, then attempt the summarized steps below to familiarize
  654.       yourself with your disk editor and AmigaDOS.
  655.  
  656.          Steps 1 thru 8 will guide you from a disk's ROOT BLOCK, into a file
  657.       and through all the data blocks in that file.  A quick summary of
  658.       these steps is as follows:
  659.  
  660.          Steps 9 thru 14 show you how to alter a block and write it to disk.
  661.  
  662.      _A step-by-step of the tour, in summary is as follows:
  663.  
  664.     / 1. Run the disk editor.
  665.     |
  666.     | 1a.  (Load the root block.  This is done automatically by Sectorama.)
  667.     |
  668.     | 2. Locate the 'c' directory by using the hash function.
  669. Part< 3. Load the USER DIRECTORY BLOCK for the c directory.
  670.  1a | 4. Locate the 'dir' command file by using the hash function.
  671.     | 5. Load the FILE HEADER BLOCK for the 'dir' file.
  672.     | 6. Load the first DATA BLOCK of the 'dir' file.
  673.     | 7. Load and examine each consecutive DATA BLOCK of the 'dir' file until
  674.     |      the last DATA BLOCK in the file has been loaded and examined.
  675.     \_8. Load the FILE HEADER BLOCK pointed-to by the final DATA BLOCK.
  676.      _
  677.     / 9.  Locate and select the first word in the comment filed of the FILE
  678.     |       HEADER BLOCK for the 'dir' file.
  679.     | 10. Edit the ASCII values of the comment field.
  680. Part< 11. Edit the hexadecimal value of the first byte of the first word of
  681.  1b |       the comment field to insert the string length of the comment
  682.     |       created in step 10.
  683.     | 12. Re-calculate the checksum for this block.
  684.     | 13. Write the altered block to disk.
  685.     \_14. Quit the disk editor.
  686.  
  687.  
  688.  
  689.   ii) Touring a floppy with Sectorama...
  690.       ----------------------------------
  691.  
  692.  
  693.       1.   O.K., get your disk editor up and running (if it isn't already)
  694.          and begin examining a back-up copy of your workbench disk.  For
  695.          sectorama, the CLI command line for this if the disk was in df0:
  696.          would look like:
  697.  
  698.          1> run sec df0:
  699.  
  700.          What you will see on your display (in neato-keen hi-res) is data
  701.       of the ROOT BLOCK of df0:.  On top of the display is 'Type=ROOT DIR'
  702.       which indicates that the block currently being displayed is a
  703.       ROOT BLOCK.
  704.  
  705.       2.  Now that we are at the ROOT BLOCK, lets find the c directory.  The
  706.       first step for this is to find out what value we get when we use the
  707.       hash function on the string 'c'.  To do this you must envoke the hash
  708.       function by picking 'COMPUTE HASH VALUE' under the SEARCH menu, then
  709.       typing the file or directory name, in this case the letter c followed
  710.       by a <RETURN>.  This highlights the block address of the hash chain
  711.       which contains the c directory.
  712.  
  713.       3.  Now that you've found the possible whereabouts of the c directory
  714.       jump to it by hitting the j key.  If (more likely than not) on top of
  715.       the display is 'Name=c' then the display is currently displaying the
  716.       contents of the c directory and the top of the display has
  717.       'Type=DIRECTORY' indicating that what is being displayed is a USER
  718.       DIRECTORY BLOCK, which is essentially the c directory of df0:.
  719.  
  720.       4.  Now that we're at the c directory, let's look at a file containing
  721.       loadable/executable code for a well-known function... say, the file
  722.       called 'dir'.  Envoke the hash function as before using the string
  723.       dir.  The block address of the hash chain that contains the dir file
  724.       will be highlighted.
  725.  
  726.       5.  Press the j key to jump to the beginning of the hash chain which
  727.       will have (again, more likely than not) 'Type=FILE   Name=dir'
  728.       displayed above the table of block data.  The Type=FILE indicates that
  729.       this is the header block for the file indicated by Name=dir.  This is a
  730.       fairly short file, so that all the block addresses for the DATA BLOCKS
  731.       for this file are included in this block and that no extension blocks
  732.       are required for this file, which is why the block address beside
  733.       'X-Go Extension=' is 00000000.
  734.  
  735.         Also notice that the block address beside 'D-Go Next Data' is the
  736.       same as the last entry in the data table of this block (at word # 4D
  737.       according to my version of dir).  This is because data blocks are
  738.       arranged in this table starting at the end of the table and working
  739.       towards the beginning.
  740.  
  741.       6.  Let's take a look at the first DATA BLOCK, then, by hitting the
  742.       d key to 'Go Next Data'.  What will be displayed is the first DATA
  743.       BLOCK of the dir file.  On top of the display will be 'Type=DATA BLOCK'
  744.       confirming that fact.  Note that word # 04, which has the same value as
  745.       is displayed beside D-Go Next Data =, points to the next DATA BLOCK for
  746.       this file.
  747.  
  748.       7.  Let's traverse the entire list of DATA BLOCKS to see what the last
  749.       one in the list looks like.  You can do this by hitting the D key
  750.       about 16 times or so.  While you do this, note that the value beside
  751.       H-Go Header =  stays constant for each data block while all the other
  752.       values remain constant.  The value beside H-Go Header =  points to
  753.       the FILE HEADER BLOCK which owns the DATA BLOCK.  If this ever changes
  754.       as you are traversing a list of DATA BLOCKS, you KNOW there is a
  755.       problem with the file.  Also note that as you jump from block to block,
  756.       the HISTORY list at the bottom of the display keeps track of your last
  757.       eight jumps.  This is a valuable feature when you overshoot a problem
  758.       area and need to know where you've been in previous jumps.  Also note
  759.       that for each successive DATA BLOCK that you display, the sequence
  760.       number displayed in the middle of the right part of the screen is
  761.       incremented by one.  This helps you figure out exactly where you are in
  762.       the file you are looking through.  If ever this sequence number jumps
  763.       up or down by more that one, you know the DATA BLOCK is out of its
  764.       proper sequence.
  765.  
  766.       8.  Once you've reach the end of the DATA BLOCK list, you will find that
  767.       hitting the D key will now only cause the display to flash, indicating
  768.       that this is indeed the end of the DATA BLOCK list for this file.  Lets
  769.       jump back to the FILE HEADER BLOCK for the 'dir' file by hitting the
  770.       h key (for H-Go Header).
  771.  
  772.  
  773.       9.  Now that we've jumped around the disk doing some block reading,
  774.       let's get more adventurous.  Let's modify a block on the disk.  By
  775.       comparing the FILE HEADER BLOCK description above, we note that the
  776.       comment field in this block begins at word # 52 and ends at word # 68.
  777.       Move your pointer to word # 52 and click your left mouse button to
  778.       highlight it.
  779.  
  780.       10. Next, press the A key to enter ASCII edit mode (the command list on
  781.       the right of the display describes it as Edir ASCII).  Now type a space
  782.       and then some sort of short comment, being careful not to type past
  783.       word #68.  For example, I typed the comment ' dir, oh dir' beginning
  784.       in word #52.  Note that the delete key and backspace key do not work
  785.       normally in this mode, and actually produce their own special ascii
  786.       values.  To re-type something, you must either move your pointer to the
  787.       desired location and click, or use your cursor keys to move the
  788.       highlighter to the desired character, then type your correction.
  789.       To exit this edit mode, simply hit <RETURN>.
  790.  
  791.       11. To make our comment a proper BCPL string, we must put a character
  792.       count at word # 52.  Count how many characters there are in your string
  793.       and convert this number to hexadecimal.  Next, enter the hexadecimal
  794.       edit mode by hitting the e key (for Edit), type your two-digit
  795.       hexadecimal value and hit return.  For example, in my 'dir, oh dir'
  796.       comment there are eleven characters.  Eleven converts to 0B in
  797.       hexadecimal, so I edit word #52, type 0B, and hit return.
  798.  
  799.       12. Since we've altered the contents of this block, the checksum for
  800.       this block is no longer valid.  We must hit the k key to calculate a
  801.       new checksum.  When you have done this, you will note that the value
  802.       beside K-Checksum = and at word # 05 have changed to the newly
  803.       calculated checksum.
  804.  
  805.       13.  Note that any changes you have made so far haven't been written to
  806.       disk at all.  Nothing is ever written to disk until you actually write
  807.       it by hitting the u key to 'Update block'.  To incorporate your new
  808.       file comment for the file called 'dir', hit the u key.
  809.  
  810.       14.  Then quit Sectorama, and list df0:c/dir to see the
  811.       change that you've just made.  Note that you may have to list the whole
  812.       c directory to see the change since AmigaDOS keeps track of which
  813.       sectors of which device it currently has in buffers, and will avoid
  814.       fetching your modified sector if it is currently in df0:'s buffer.
  815.  
  816.  
  817.         What we've just done is to examine a disk, seek-out a specific file,
  818.       look through the file's data, then modify the FILE HEADER BLOCK of
  819.       that file.  What we haven't seen yet are two important data
  820.       structures which we will look for now.  Specifically, these structures
  821.       are the hash chain, and the file list.
  822.  
  823.       1. to 3.  Same as steps 1. to 3. above. (Locate & load the c directory)
  824.  
  825.       4. Now calculate the hash value for Echo using the Calculate Hash Value
  826.       function.  Write the highlighted number down.
  827.  
  828.       5. Calculate the hash value for Quit using the same hash function used
  829.       in step 4.
  830.  
  831.       6. Calculate the hash value for Why using the hash function.  You will
  832.       find that the value you have written down for the value calculated for
  833.       Why, Quit, and Echo are all identical, implying that if you jump to
  834.       this number, you will have access to all three files.
  835.          What this really means is that the FILE HEADER BLOCKS of these three
  836.       files are members of the same hash chain.
  837.  
  838.       7. Jump to the first file in the hash chain by hitting the j key.  I
  839.       cannot say exactly which FILE HEADER BLOCK you will be shown, since
  840.       that depends on in what order the files in the chain were created on
  841.       this disk.  Note that the value beside P-Go Parent =  is that of the
  842.       USER DIRECTORY BLOCK of the directory containing this file, namely the
  843.       c directory.
  844.  
  845.       8.  Note that the block address beside C-Go Hash Chain =  is non-zero.
  846.       At least, if the files Echo, Quit, and Why are in the c directory on
  847.       this disk, the value will be non-zero.  Otherwise, this demonstration
  848.       will not be successful.  To display the header of the next file or
  849.       directory in this hash chain, hit the c key (indicated by C-Go Hash
  850.       Chain).
  851.  
  852.       9.  Note that the value beside P-Go Parent hasn't changed.  This is
  853.       because all members of a hash chain always belong to the same
  854.       directory.  To traverse the hash chain and find the last FILE HEADER
  855.       BLOCK or USER DIRECTORY BLOCK in the chain, keep hitting the c key
  856.       until the value beside C-Go Hash Chain becomes zero.  When this
  857.       happens, further presses of the c key will merely cause the display
  858.       to flash, indicating you are at the end of the hash chain.
  859.  
  860.       10. Jump back to the ROOT BLOCK by hitting the r key.
  861.  
  862.  
  863.         To find what an extension file looks like, we must look for a large
  864.       file... one where the amount of data is large enough that more pointers
  865.       are available in a FILE HEADER BLOCK's DATA BLOCK pointer table.  A
  866.       DATA BLOCK pointer table usually has 72 available entries.  Since each
  867.       BLOCK is 512 bytes long, we need a file that is over 72 x 512 = 36864
  868.       bytes long.  The Preferences file is about twice that length, so let's
  869.       take a look at it.
  870.  
  871.       11. Calculate the hash value for Preferences using the hash function.
  872.  
  873.       12. Jump to the FILE HEADER BLOCK for the Preferences file by hitting
  874.       the j key.  You will note that all the entries in the DATA BLOCK
  875.       pointer table in this FILE HEADER BLOCK are used-up.  You will find
  876.       the rest of the pointers required to point to the rest of the DATA
  877.       BLOCKS for this file in the file list.  The block number of the first
  878.       FILE LIST BLOCK in the file list is shown beside X-Go Extension.
  879.  
  880.       13. Hit the x key to jump to the first FILE LIST BLOCK.  Note that the
  881.       block number displayed beside P-Go Parent is the same as the block
  882.       number of the FILE HEADER BLOCK to which this FILE LIST BLOCK belongs.
  883.       Also note that the value beside X-Go Extension is now zero.  If the
  884.       required even more DATA BLOCKS, that is, if the file was longer than
  885.       about 73kbytes, the value beside X-Go Extension would point to the next
  886.       FILE LIST BLOCK in the file list.
  887.  
  888.         So, that pretty well wraps-up the tour.  We've seen all the data
  889.       structures used by AmigaDOS and have had a chance to modify a block.
  890.       There are a number of implications of AmigaDOS structure that this
  891.       document hasn't covered, but these things will become apparent as you
  892.       are given the opportunity to apply the disk editor.
  893.  
  894.         I hope the information forwarded by this document will help you solve
  895.       or at least understand problems that may occur from time to time when
  896.       storing things on AmigaDOS compatible devices.
  897.  
  898. A Trouble-shooting Example
  899. --------------------------
  900.         This information was recently invaluable to me as I discovered a
  901.       problem with my hard drive recently that could have blossomed into a
  902.       fairly major disaster.  A file was written on top of another file.
  903.  
  904.         I kept getting a read/write error when I tried to copy the
  905.       over-written file to another device.  So, I examined the hard drive
  906.       with Sectorama.  I used the hash function to locate which hash chain
  907.       the file was stored under, traversed the hash chain until I found the
  908.       file header block of the file in question.  I then traversed the list
  909.       of data blocks for the file by hitting the d key repeatedly.  The
  910.       list seemed to be intact since I was able to follow the list to its
  911.       last block.
  912.  
  913.         I then hit the h key to display the file header block again.  It
  914.       was the file header block of an entirely different file!  So, I jump
  915.       back to the root, jumped to the file I was originally investigating,
  916.       and again traversed the data block list while watching the value
  917.       beside H-Go Header for any changes.  About half-way through the file
  918.       the value changed.  I noted the block number of that data block,
  919.       hit the h key to jump to the wrong file header block again, and noted
  920.       that the block number of the erroneous data block was listed.  I went
  921.       back to the root block and back to the original file header block and
  922.       found that the same erroneous data block was listed here, too.
  923.  
  924.         I checked all the files on the hard disk, and found that only one
  925.       file was unreadable.  Thus, that file had been overwritten.  This
  926.       implied that somehow the bitmap of the disk was erroneous since the
  927.       data block used by the file was claimed by another file.  I had to
  928.       backup-up new files, format the hard drive to prevent further calamity,
  929.       and copy back all the files.  That cured the whole problem.
  930.  
  931.         I had a directory problem a while ago that I now know how to fix
  932.       recover from with a disk editor.  The directory of a device wrapped
  933.       around so that when I executed a list command, I got an endless
  934.       repetition of the same files, while other files on the disk would
  935.       never be listed.  When I listed the ignored files by naming them
  936.       directly, they would show up.  If I executed a dir command, the
  937.       storage device was searched and searched and searched until the
  938.       computer crashed.  I believe that is due to dir's method of collecting
  939.       all files in a directory for sorting until the end of the directory
  940.       is reached, which, in this case, it never did.
  941.  
  942.         Solving this is a matter of copying all files possible to another
  943.       device.  This means individually copying all the files since wildcards
  944.       cause a directory search which, in this case, would never end.  The
  945.       files you cannot see can be searched-out with Sectorama using wildcards
  946.       since Sectorama provides full-disk searches without consulting a
  947.       directory.  After finding and copying all your files to another device,
  948.       I'd recommend formatting the device to remove anything that might cause
  949.       a relapse of the problem.
  950.  
  951.  
  952.       If you have any corrections, comments, or suggestions about the above
  953. document, please send them to me or tell me about them.  You can reach me at:
  954.  
  955.      //
  956.    \X/ Tesseract BBS
  957.        (306)757-5699
  958.        (24 hours, 8N1, 300 or 1200 baud)
  959.  
  960. address:  Dwayne Miller
  961.           770 Robinson Street
  962.           Regina, Saskatchewan, Canada  (Yup, way up there!)
  963.           S4T 2M1
  964.  
  965.   voice: (306)525-1652
  966.  
  967. P.S. Sectorama was written by David Joiner of MicroIllusions and is commonly
  968.      available, often named 'sec.arc' or 'sector.arc' or 'sectoram.arc' etc.
  969.