@H
@T0
This help file contains the most often used offsets into OS-9 memory modules.

The module header is the same for all type of modules:

  Offset  Size  Name       Description
  ------  ----  ---------  --------------------------------------------------
   0/$00  word  M$ID       Sync Bytes ($4AFC = M$ID12)
   2/$02  word  M$SysRev   Module format Revision ID
   4/$04  long  M$Size     Module size in bytes
   8/$08  long  M$Owner    Owner ID
  12/$0C  long  M$Name     Offset to module name string
  16/$10  word  M$Accs     Access permissions
  18/$12  byte  M$Type     Module Type: 1=Prgrm, 2=Sbrtn, 3=Multi, 4=Data
                                        5=CSDData, 11=TrapLib, 12=Systm
                                        13=Flmgr, 14=Drivr, 15=Devic
  19/$13  byte  M$Lang     Language: 0=Objct,2=ICode,3=PCode, >3=future.
  20/$14  byte  M$Attr     Attributes: ReEntBit=7, GhostBit=6, SupStBit=5
  21/$15  byte  M$Revs     Revision level
  22/$16  word  M$Edit     Edition number
  24/$18  long  M$Usage    Offset to usage string
  28/$1C  long  M$Symbol   Offset to symbol table (not in use)
  32/$20  14    -           reserved (7 words)
  46/$2E  word  M$Parity   Header parity check
  48/$30                   module type dependent (see subtopics)
@D1
Executables : 2
Init_Module : 3
Descriptors : 4 , 5
@T2
Executable modules can be Traphandlers, Programs, Device Drivers, File
Managers and System Modules.

For all executable modules:

  Offset  Size  Name       Description
  ------  ----  ---------  --------------------------------------------------
  48/$30  long  M$Exec     Execution offset
  52/$34  long  M$Excpt    Default User Trap Execution Entry Point

For device drivers, programs and traphandlers:

  Offset  Size  Name       Description
  ------  ----  ---------  --------------------------------------------------
  56/$38  long  M$Mem      Memory Size (data space)

For programs and traphandlers:

  Offset  Size  Name       Description
  ------  ----  ---------  --------------------------------------------------
  60/$3C  long  M$Stack    Stack size (stack data space)
  64/$40  long  M$IData    Offset to initialisation data (in the module)
  68/$44  long  M$IRefs    Offset to reference initialisation data

For traphandlers only:

  72/$48  long  M$Init     Offset to Traphandler initialisation routine
  76/$4C  long  M$Term     Offset to Traphandler termination routine
@T3
The init module contains system startup parameters.

  Offset  Size  Name       Description
  ------  ----  ---------  --------------------------------------------------
  48/$30  long  -          reserved
  52/$34  word  M$Pollsz   Number of IRQ polling table entries
  54/$36  word  M$DevCnt   Number of entries in the device table
  56/$38  word  M$Procs    Initial process table size (in # of processes)
  58/$3A  word  M$Paths    Initial path table size (in # of paths)
  60/$3C  word  M$Sparam   Offset to parameter string for startup module
  62/$3E  word  M$SysGo    Offset to name of startup module (usually: "sysgo")
  64/$40  word  M$SysDev   Offset to path of system device (usually a disk)
  66/$42  word  M$Consol   Offset to initial standard I/O path (often "/term")
  68/$44  word  M$Extens   Offset to name of customisation module
  70/$46  word  M$Clock    Offset to name of clock module
  72/$48  word  M$Slice    Number of ticks per time slice
  74/$4A  6     -          reserved (3 words)
  80/$50  word  M$Instal   Offset to installation name string
  82/$52  long  M$CPUTyp   CPU Type: 68000,68010,68020,68030 (as a number !)
  86/$56  long  M$OS9Lvl   Byte0=Level, Byte1.Byte2=Version, Byte3=Edition
  90/$5A  word  M$OS9Rev   Offset to revision name string
  92/$5C  word  M$SysPri   Initial system priority
  94/$5E  word  M$MinPty   Initial system minimum executable priority
  96/$60  word  M$MaxAge   Initial system maximal natural age
  98/$62  4     -          reserved (2 words)
 102/$66  word  M$Events   Initial event table size (in # of events)
 104/$68  byte  M$Compat   Revision compatibility byte: Bit0:1=save regs on IRQ
                           Bit1:1=ignore ghost bit, Bit2:1=kernel doesn't STOP
                           Bit3:1=no cache burst (68030), Bit4:1=memory fill on
                           allocate/deallocate, Bit5:1=do not start clock.
 105/$69  byte  -          reserved
 106/$6A  word  M$MemList  Offset to colored memory list (0 if none)
 108/$6C  word  M$IRQStk   Size of IRQ stack (in long words)
 110/$6E  word  M$ColdTrys # of retries to CHD to system device at coldstart
 112/$70  20    -          reserved

 here the strings (+ ev. the colored memory list) referenced above will follow.
@T4
All device descriptors have the following module offsets in common:

  Offset  Size  Name       Description
  ------  ----  ---------  --------------------------------------------------
  48/$30  long  M$Port     absolute port address of the device
  52/$34  byte  M$Vector   Vector number for IRQ
  53/$35  byte  M$IRQLvl   IRQ interrupt level
  54/$36  byte  M$Prior    IRQ polling priority
  55/$37  byte  M$Mode     Device mode capabilities (Bits: dsi--ewr)
  56/$38  word  M$FMgr     Offset to file manager name
  58/$3A  word  M$PDev     Offset to device driver name
  60/$3C  word  M$DevCon   Offset to device dependent configuration data
  62/$3E  8     -          reserved (4 words)
  70/$46  word  M$Opt      number of option bytes
  72/$48  byte  M$DTyp     device type  (0=SCF, 1=RBF, 2=PIPE, 3=SBF, 4=NFM)

  the following fields are dependent on the file manager (see subtopics).
@D5 W=19
SCF_Descriptor : 6
RBF_Descriptor : 7
SBF_Descriptor : 8
@T6
The following fields are specific for SCF device descriptors.

(*) The names (PD_xxx) refer to offsets into the path descriptor and therefore
    are not module offsets. Use the following expression to obtain real device
    descriptor offsets: PD_xxx-PD_Opt+M$Opt. Please note also that the numbers
    in the "Offset column" *are* module offsets, not path descriptor offsets!

  Offset  Size  Name (*)   Description
  ------  ----  ---------  --------------------------------------------------
  72/$48  byte  PD_DTP     Device type (=same offset as M$DTyp), value=0 (SCF)
  73/$49  byte  PD_UPC     if<>0: uppercase lock is on.
  74/$4A  byte  PD_BSO     if=0: SCF echoes PD_BSE for backspace (PD_BSP)
                           if<>0: SCF echoes PD_BSE, space, PD_BSE
  75/$4B  byte  PD_DLO     if=0: SCF erases line using repeated backspace
                           if<>0: SCF echoes CR/LF when the line is deleted
  76/$4C  byte  PD_EKO     if<>0: input characters will be echoed
  77/$4D  byte  PD_ALF     if<>0: automatic linefeed sent after CR
  78/$4E  byte  PD_NUL     # of null ($00) chars to be sent after CR/LF
  79/$4F  byte  PD_PAU     if<>0: auto page pause enabled (after PD_PAG lines)
  80/$50  byte  PD_PAG     page length in lines (used for auto page pause)
  81/$51  byte  PD_BSP     Backspace input character (usually ^H)
  82/$52  byte  PD_DEL     Delete line input character (usually ^X)
  83/$53  byte  PD_EOR     End of record input character (alomst always CR=^M)
  84/$54  byte  PD_EOF     End of file input character (usually ESC=^[ or ^Z)
  85/$55  byte  PD_RPR     Reprint line input character (usually ^R)
  86/$56  byte  PD_DUP     Duplicate from previous line input char (usually ^A)
  87/$57  byte  PD_PSC     Pause character (usually ^W)
  88/$58  byte  PD_INT     Keyboard interrupt (S$Intrpt=3, usually ^C)
  89/$59  byte  PD_QUT     Keyboard abort character (S$Abort=2, usually ^E)
  90/$5A  byte  PD_BSE     Backspace echo character (often ^H)
  91/$5B  byte  PD_OVF     Line overflow signal character (usually BEL=^G)
  92/$5C  byte  PD_PAR     Serial Params: Bits1&0: 00=no 01=odd, 11=even parity
                                          Bits3&2: 00=8, 01=7, 02=6, 03=5 bits
                                          Bits5&4: 00=1, 01=1.5, 10=2 stop bits
                                          Bits7&6: reserved
  93/$5D  byte  PD_BAU     Baudrate: 0=50, 1=75, 2=110, 3=134.5, 4=150, 5=300,
                                     6=600, 7=1200, 8=1800, 9=2000, A=2400,
                                     B=3600, C=4800, D=7200, E=9600, F=19200,
                                     FF=external
  94/$5E  word  PD_D2P     Output device name string offset (usually=M$Name)
  96/$60  byte  PD_XON     X-on character (0=none, usually DC1=^Q)
  97/$61  byte  PD_XOFF    X-off character (0=none, usually DC3=^S)
  98/$62  byte  PD_Tab     Tab character (usually ^I)
  99/$63  byte  PD_Tabs    Tab field size (usually 4)
@T7
The following fields are specific for RBF device descriptors.

(*) The names (PD_xxx) refer to offsets into the path descriptor and therefore
    are not module offsets. Use the following expression to obtain real device
    descriptor offsets: PD_xxx-PD_Opt+M$Opt. Please note also that the numbers
    in the "Offset column" *are* module offsets, not path descriptor offsets!

  Offset  Size  Name (*)   Description
  ------  ----  ---------  --------------------------------------------------
  72/$48  byte  PD_DTP     Device type (=same offset as M$DTyp), value=1 (RBF)
  73/$49  byte  PD_DRV     Drive number (0..n-1, where n= max # of drives)
  74/$4A  byte  PD_STP     Step rate (0=fast..3=slow, see manual)
  75/$4B  byte  PD_TYP     Disk type: Bit0: 0=5"floppy, 1=8"floppy
                                      Bit5: 0=track0 SD, 1=track0 DD
                                      Bit7: 0=floppy disk, 1=hard disk
  76/$4C  byte  PD_DNS     Density:   Bit0: 0=SD, 1=DD
                                      Bit1: 0=40 Track, 1=80 Track (48/96TpI)
                                      Bit2: reserved for quad density
  77/$4D  byte  -          reserved
  78/$4E  word  PD_CYL     Number of cylinders
  80/$50  byte  PD_SID     Number of heads (harddisks) or sides (floppies)
  81/$51  byte  PD_VFY     0=verify disk writes, 1=don't verify
  82/$52  word  PD_SCT     Number of sectors per track (default)
  84/$54  word  PD_TOS     Number of sectors on track 0 (default)
  86/$56  word  PD_SAS     Segment allocation size
  88/$58  byte  PD_ILV     Sector interleave factor (1 = no interleaving)
  89/$59  byte  PD_TFM     DMA transfer mode (implementation specific)
  90/$5A  byte  PD_TOffs   Track base offset
  91/$5B  byte  PD_SOffs   Sector base offset
  92/$5C  word  PD_SSize   Sector size in bytes (currently fixed on 256)
  94/$5E  word  PD_Cntl    Control word: Bit0: 1=formatting disabled
                                         Bit1: 1=multisector I/O possible
                                         Bit3: 1=autosizing media
                                         Bit4: 1=can format single track
  96/$60  byte  PD_Trys    Number of retries: 0=default, 1=none, 2..255=#trys
  97/$61  byte  PD_LUN     Logical Unit number of SCSI Drive
  98/$62  word  PD_WPC     Cylinder to begin write precomensation
 100/$64  word  PD_RWR     Cylinder to begin reduced write current
 102/$66  word  PD_PARK    Cylinder to park disk head
 104/$68  long  PD_LSNOffs Logical sector offset (for partitioned SCSI drives)
 108/$6C  word  PD_TotCyls Total number of cylinders on partitioned SCSI drive
 110/$6E  byte  PD_CtrlrID SCSI controller ID (bitmask/number, impl.dependent)
 112/$70  long  PD_ScsiOpt SCSI option flags: Bit0: 1=SCSI parity enabled
                                              Bit1: 1=ATN support enabled
                                              Bit2: 1=synchronous transfer
                                              Bit3: 1=target mode supported

here device specific data may follow if M$DevCon is<>0. This often includes
additional parameters for SCSI controller setup etc. DevCon data is highly
hardware and implementation specific.
@T8
The following fields are specific for SBF device descriptors.

(*) The names (PD_xxx) refer to offsets into the path descriptor and therefore
    are not module offsets. Use the following expression to obtain real device
    descriptor offsets: PD_xxx-PD_Opt+M$Opt. Please note also that the numbers
    in the "Offset column" *are* module offsets, not path descriptor offsets!

  Offset  Size  Name (*)   Description
  ------  ----  ---------  --------------------------------------------------
  72/$48  byte  PD_DTP     Device type (=same offset as M$DTyp), value=3 (SBF)
  73/$49  byte  PD_TDrv    Tape Drive number (0..n-1, where n= max # of drives)
  74/$4A  byte  PD_SBF     reserved
  75/$4B  byte  PD_NumBlk  Maximum number of blocks to allocate
  76/$4C  long  PD_BlkSiz  Size of blocks allocated
  80/$50  word  PD_Prior   Driver process priority
  82/$52  byte  PD_Flags   Drive capability flags: Bit0: 1=rewind on close
                                                   Bit1: 1=offline on close
                                                   Bit2: 1=erase to eot on clos
  83/$53  byte  -          reserved for driver
  84/$54  word  PD_DMAMode DMA mode. Hardware and implementation specific
  86/$56  byte  PD_ScsiID  SCSI controller ID (bitmask/number, impl.dependent)
  87/$57  byte  PD_ScsiLUN Logical Unit number of SCSI Tape Drive
  88/$58  long  ??         SCSI option flags: Bit0: 1=SCSI parity enabled
                                              Bit1: 1=ATN support enabled
                                              Bit2: 1=synchronous transfer
                                              Bit3: 1=target mode supported

