Thread View: comp.sources.apple2
1 messages
1 total messages
Started by Jonathan A. Chandross
Mon, 09 Nov 1992 00:12
v001SRC070: coff (OMF Disassembler) 05/09
Author: Jonathan A. Chandross
Date: Mon, 09 Nov 1992 00:12
Date: Mon, 09 Nov 1992 00:12
1665 lines
77415 bytes
77415 bytes
Submitted-by: Albert Chin-A-Young (26285659t@servax.fiu.edu)
Posting-number: Volume 1, Source:70
Archive-name: utility/gs/disassem/coff/part05
Architecture: ONLY_2gs
Version-number: 1.1
=coff.tex
-\font\headbf=cmssbx10 scaled\magstep1
-\font\headrm=cmss10 scaled\magstep1
-\font\rm=cmss10 scaled\magstep1
-\font\bf=cmssbx10 scaled\magstep1
-\font\bff=cmssdc10 scaled\magstep1
-\font\it=cmssi10 scaled\magstep1
-\font\omf=cmssdc10 scaled\magstep1
-\font\text=cmtt10 scaled\magstep1
-\font\textsl=cmsltt10 scaled\magstep1
-\font\super=cmss10 scaled\magstep1
-\font\sample=cmtt10
-\font\sectionbf=cmssbx10 scaled\magstep1
-
-% options
-%
-\baselineskip=13pt
-\parskip=8pt
-\parindent=2pc
-\raggedbottom
-\interlinepenalty=100
-\widowpenalty=250
-\clubpenalty=250
-\brokenpenalty=250
-
-% define macro to create section titles
-%
-\def\bull{\vrule height .9ex width .8ex depth -.1ex } % square bullet
-\def\section#1{\noindent{\sectionbf{#1}}}
-\def\subsection#1{\indent{\sectionbf{#1}}}
-\def\synopsis#1{\setbox0=\hbox{#1\thinspace}
- \hangindent\parindent
- \advance\hangindent by\wd0
- \indent\box0}
-\def\segtype{\setbox0=\hbox{$\bullet$\enspace}
- \hangindent\parindent
- \advance\hangindent by\wd0
- \indent\box0}
-\def\description{\hangindent\parindent}
-\def\option#1{{\it#1}\parskip=0pt\par
- \hangindent2\parindent\indent\indent\parskip=8pt}
-\def\note#1#2{\setbox0=\hbox{#1\enspace}
- \hangindent\parindent
- \advance\hangindent by\wd0
- \indent\box0{\bf#2}}
-\def\notenote{\setbox0=\hbox{\bull\enspace}
- \hangindent\parindent
- \advance\hangindent by\wd0
- \indent\hbox to\wd0{\hfil}}
-\def\operator#1#2#3{\setbox0=\hbox{\bull\enspace}
- \indent\hbox to\wd0{\hfil}%
- \hbox to2pc{#1\hfil}\hbox to12pc{#2\hfil}(#3)\par}
-\def\expr#1{\setbox0=\hbox{#1\enspace}
- \setbox1=\hbox{\bull\enspace}
- \hangindent\parindent
- \advance\hangindent by\wd0
- \advance\hangindent by\wd1
- \indent\hbox to\wd1{\hfil}\box0}
-\def\head#1{\setbox0=\hbox to5pc{\omf #1\hfil}
- \hangindent\parindent
- \advance\hangindent by 5pc
- \indent\box0}
-\def\headhead{\hangindent\parindent
- \advance\hangindent by 5pc
- \indent\hbox to5pc{\hfil}}
-\def\headnote#1{\setbox0=\hbox{\bf #1\enspace}
- \hangindent\parindent
- \advance\hangindent by 5pc
- \advance\hangindent by\wd0
- \indent\hbox to5pc{\hfil}\box0}
-\def\body#1#2{\setbox0=\hbox to6pc{\omf #1\hfil}
- \setbox1=\hbox to5pc{#2\hfil}
- \hangindent\parindent
- \advance\hangindent by 11pc
- \indent\box0\box1}
-\def\bodybody{\hangindent\parindent
- \advance\hangindent by 11pc
- \indent\hbox to11pc{\hfil}}
-\def\bodynote#1{\setbox0=\hbox{\bf #1\enspace}
- \hangindent\parindent
- \advance\hangindent by 11pc
- \advance\hangindent by\wd0
- \indent\hbox to11pc{\hfil}\box0}
-\def\beginsample{\begingroup
- \obeylines\obeyspaces
- \parskip=0pt\baselineskip=10pt\sample
- \catcode`\$=11 % take out definition of special chars
- \catcode`\_=11 % that might appear in sample text
- \catcode`\#=11 % hash mark is macro parameter character
- \catcode`\~=11}
-\def\endsample{\catcode`\$=3 % dollar sign is math shift
- \catcode`\_=8 % underline for subscripts
- \catcode`\#=6 % hash mark is macro parameter character
- \catcode`\~=\active % tilde is active
- \endgroup}
-
-% define header and footer
-%
-\headline={\line{\headbf COFF (1)\hfil USER COMMANDS\hfil COFF (1)}}
-\footline={\vbox{\vskip4pc
- \line{\headbf tao Developer Project\hfil Last change: 28
-September 1992\hfil\headrm\folio}}}
-\topskip=4pc
-\vsize=8.6in
-
-% start of text
-%
-\rm\bigskip\bigskip
-
-\section{NAME}
-
-{\bf coff} - Common Object File Format Disassembler/Dumper
-
-\bigskip
-
-\section{SYNOPSIS}
-
-\synopsis{\bf coff} [-acdefhilmnopstvxDT] [+asm] [+nodefault] [+header]
-[+help] [+hex] [+infix]\break [+label] [+merlin] [+noheader] [+nooffset]
-[+orca] [+postfix] [+shorta] [+shorti] [+tool] [+version] [+compress]
-[+exact] [+thanks] {\it file} [{\it segments...}] [{\it loadsegments...}]
-
-\bigskip
-
-\section{DESCRIPTION}
-
-\description
-This manual page documents {\bf coff}. {\bf coff} outputs Apple IIgs
-OMF (Object Module Format) files in either OMF format (dump) or as 65816
-object code (disassembly). {\bf coff} takes file {\it file} as an argument
-and outputs the disassembly to the standard output. If {\it segment} or
-{\it loadsegment} arguments are given, those segments/loadsegments are
-output in place of the entire file ({\it segment} and {\it loadsegment}
-do not have to match the segment/loadsegment names in the OMF file exactly).
-
-\bigskip
-
-\section{OPTIONS}
-
-\option{-a, +shorta}{\bf coff} assumes it will be disassembling an OMF
-file that was created for the Apple IIgs computer. Therefore, it assumes
-16-bit addressing mode for the accumulator. This option disables 16-bit
-addressing mode for the accumulator and assumes 8-bit addressing mode.
-
-\option{-d, +asm}Disassemble output of OMF file. 65816 code is output. This
-option is the same as +merlin as {\bf coff} uses the Merlin 16+ assembler
-format as its default 65816 disassembly format.
-
-\option{-f, +nooffset}Output for the body of OMF files is given by a
-displacement value into the file and an object displacement into the file.
-The displacement value is the actual position in the file where the OMF
-record occurs. The object displacement is the number of bytes of code the
-segment will link to. Enable this option to disable this output.
-
-\option{-h, +help}Display list of options for {\bf coff}. The list contains
-the short and long options in addition to a brief description of each
-option.
-
-\option{-i, +shorti}{\bf coff} assumes it will be disassembling an OMF file
-that was created for the Apple IIgs computer. Therefore, it assumes 16-bit
-addressing mode for the index registers. This option disables 16-bit
-addressing mode for the index registers and assumes 8-bit addressing mode.
-
-\option{-l, +label}In assembly language programs certain routines have
-labels associated with them (i.e. {\text jsr print}). When this is assembled
-into an OMF file, the label `{\text print}' is replaced by an offset from
-the beginning of the segment it is contained in. Enabling this option will
-cause {\bf coff} to output the name of the label, `{\text print}', rather
-than its offset, `$<$segname$>$+$<$offset$>$'.
-
-\option{-m, +merlin}65816 code is output in Merlin 16+ format. This is
-the default format for the +asm option.
-
-\option{-n, +noheader}Default is to output the header of each segment.
-Enable this option to disable this default.
-
-\option{-o, +orca}65816 code is output in Orca/M format.
-
-\option{-p, +postfix}Expressions are output in postfix notation (i.e.
-`{\text lda x+y}' will be output as `{\text lda x y +}'.
-
-\option{-s, +header}Only the headers for each segment are output. If the
-+hex option is added to this option, output of the headers id displayed
-in hex format, as opposed to the usual text representation of the headers
-given in OMF disassembly.
-
-\option{-t, +infix}Expressions are output in infix notation.
-
-\option{-v, +version}Display version number of {\bf coff}.
-
-\option{-x, +hex}Dump OMF segment body in hexadecimal. File displacement is
-given but no code displacement. ASCII values of each hex digit is output to
-the right of each line. If used with the +asm option, outputs the hex and
-ASCII code of each disassembled line (useful for determining where ASCII
-code is in a program).
-
-\option{-D, +nodefault}Disable default options attached with the {\bf coff}
-program. The options are stored in the resource fork. Default options are
-read in last, if +nodefault is not enabled. Thus, it is not possible
-to disable an option in the list of default options. Instead, you must
-enable this option and all options in the default option list minus the
-option(s) not required.
-
-\option{-T, +tool}Interprets certain hex code sequences and displays them as
-Toolbox calls. Also interprets certain ROM and RAM addresses into their
-english equivalents (i.e. BREAK, HOME, WAIT, KEYIN).
-
-\option{-c, +compress}Two OMF record with the largest output are
-{\omf CONST} and {\omf LCONST} records. These records contain byte
-sequences that are not interpreted by the linker. They are included
-directly into the executable file. When disassembling an executable
-file such as an EXE or S16 type file, these records often contain large
-amounts of data. Enabling this option will only display the length of
-the bytes generated by the records.
-
-\option{-e, +exact}When a {\it segment} or {\it loadsegment} option is given
-to {\bf coff} on the command line, it is often convenient to display all
-segment/loadsegments that begin with the {\it segment} or {\it loadsegment}
-given on the command line. This is {\bf coff}'s default option. However, in
-case an exact match is needed for the command-line options, enable this
-option.
-
-\option{+thanks}List of individuals who helped on the {\bf coff} project.
-
-\vfill\eject
-
-% examples of coff program
-%
-
-\section{EXAMPLES}
-
-\description
-The following is sample output with no options enabled:
-
-\bigskip
-\beginsample
-block count : $00000001 1
-reserved space: $00000000 0
-length : $00008045 32837
-label length : $00 0
-number length : $04 4
-version : $01 1
-bank size : $00010000 65536
-kind : $00 static code
-org : $00000000 0
-alignment : $00000000 0
-number sex : $00 0
-segment number: $0000 0
-entry : $00000000 0
-disp to names : $002c 44
-disp to data : $003a 58
-load name :
-segment name : one
-\medskip
-00003a 000000 | USING (e4) | common
-000042 000000 | CONST (04) | Length: 4 ($4) bytes
-000043 000000 | | f4 34 12 22 - .4."
-000047 000004 | LEXPR (f3) | truncate result to 3 bytes
-00004f 000004 | | (one+$8041)
-00004f 000007 | CONST (06) | Length: 6 ($6) bytes
-000050 000007 | | 22 a8 00 e1 10 20 - "....
-000056 00000d | EXPR (eb) | truncate result to 4 bytes
-00005e 00000d | | (one+$8041)
-00005e 000011 | DS (f1) | insert 32768 zeros
-000064 008011 | CONST (03) | Length: 3 ($3) bytes
-000065 008011 | | 74 65 ad - te.
-000068 008014 | BEXPR (ed) | truncate result to 2 bytes
-00006e 008014 | | t
-00006e 008016 | CONST (1f) | Length: 31 ($1f) bytes
-00006f 008016 | | a9 00 00 10 fb 10 00 a9 00 00 - ..........
-000079 008020 | | 10 17 6a a7 04 a9 34 12 20 34 - ..j...4. 4
-000083 00802a | | 12 af 56 34 12 22 a8 00 e1 10 - ..V4."....
-00008d 008034 | | 20 -
-00008e 008035 | EXPR (eb) | truncate result to 4 bytes
-000096 008035 | | (one+$8041)
-000096 008039 | CONST (0c) | Length: 12 ($c) bytes
-000097 008039 | | 4a c9 00 00 d0 fa f0 f8 c0 00 - J.........
-0000a1 008043 | | 00 b2 - ..
-0000a3 008045 | END (00)
-\endsample
-\medskip
-
-\description
-The header of the output gives a detailed description of the
-contents of the body of the OMF segment. The body of the OMF segment
-consists of the byte offset (offset into file), code offset, OMF types and
-their hex values, and a detailed description of each OMF type in the
-segment. All {\omf CONST, LCONST} records are displayed with their hex
-values and ASCII equivalent of those values, as indicated above. If a hex
-value does not have an ASCII equivalent (7-bit ASCII), it is replaced with
-a period.
-
-\vfill\eject
-
-\description
-The following is sample output with the +hex option enabled:
-
-\bigskip
-\beginsample
-block count : $00000001 1
-reserved space: $00000000 0
-length : $00000079 121
-label length : $00 0
-number length : $04 4
-version : $01 1
-bank size : $00010000 65536
-kind : $00 static code
-org : $00000000 0
-alignment : $00000000 0
-number sex : $00 0
-segment number: $0000 0
-entry : $00000000 0
-disp to names : $002c 44
-disp to data : $003a 58
-load name :
-segment name : two
-\medskip
-00023a | 4d f4 04 1a 22 00 00 e1 af 20 00 e1 a2 13 20 - M...".... ....
-000249 | 22 b0 00 e1 f4 ff ff 22 00 00 e1 a2 ff ff 22 - "......"......"
-000258 | b0 00 e1 a9 00 00 ad 00 c0 af 00 c0 e0 8d 01 - ...............
-000267 | c0 af 56 34 12 af 80 00 e1 ad ff cf 22 a8 00 - ..V4........"..
-000276 | e1 13 20 78 56 34 12 ea 20 00 bf c0 34 12 20 - .. xV4.. ...4.
-000285 | 00 bf c0 eb 02 83 04 70 61 72 6d 00 03 20 00 - .......parm.. .
-000294 | bf eb 01 83 04 63 61 6c 6c 00 eb 02 83 04 70 - .....call.....p
-0002a3 | 61 72 6d 00 06 22 a8 00 e1 13 20 eb 04 83 04 - arm..".... ....
-0002b2 | 70 61 72 6d 00 04 22 a8 00 e1 eb 02 83 04 63 - parm..".......c
-0002c1 | 61 6c 6c 00 eb 04 83 04 70 61 72 6d 00 01 af - all.....parm...
-0002d0 | eb 03 83 06 69 6e 6c 69 6e 65 81 01 00 00 00 - ....inline.....
-0002df | 01 00 01 bf eb 03 83 06 69 6e 6c 69 6e 65 81 - ........inline.
-0002ee | 01 00 00 00 01 00 eb 02 83 04 63 61 6c 6c 81 - ..........call.
-0002fd | 01 00 00 00 01 00 eb 04 83 04 70 61 72 6d 81 - ..........parm.
-00030c | 01 00 00 00 01 00 02 59 53 00 6c 69 6e 65 81 - .......YS.line.
-00031b | 01 00 00 00 01 00 01 bf eb 03 83 06 69 6e 6c - ............inl
-00032a | 69 6e 65 81 01 00 00 00 01 00 eb 02 83 04 63 - ine...........c
-000339 | 61 6c 6c 81 01 00 00 00 01 00 eb 04 83 04 70 - all...........p
-000348 | 61 72 6d 81 01 00 00 00 01 00 02 59 53 00 6c - arm........YS.l
-000357 | 69 6e 65 81 01 00 00 00 01 00 01 bf eb 03 83 - ine............
-000366 | 06 69 6e 6c 69 6e 65 81 01 00 00 00 01 00 eb - .inline........
-000375 | 02 83 04 63 61 6c 6c 81 01 00 00 00 01 00 eb - ...call........
-000384 | 04 83 04 70 61 72 6d 81 01 00 00 00 01 00 02 - ...parm........
-000393 | 59 53 00 6c 69 6e 65 81 01 00 00 00 01 00 01 - YS.line........
-0003a2 | bf eb 03 83 06 69 6e 6c 69 6e 65 81 01 00 00 - .....inline....
-0003b1 | 00 01 00 eb 02 83 04 63 61 6c 6c 81 01 00 00 - .......call....
-0003c0 | 00 01 00 eb 04 83 04 70 61 72 6d 81 01 00 00 - .......parm....
-0003cf | 00 01 00 02 59 53 00 6c 69 6e 65 81 01 00 00 - ....YS.line....
-0003de | 00 01 00 01 bf eb 03 83 06 69 6e 6c 69 6e 65 - .........inline
-0003ed | 81 01 00 00 00 01 00 eb 02 83 04 63 61 6c 6c - ...........call
-0003fc | 81 01 00 00 01 00 00 00 00 00 00 00 28 00 00 - ............(..
-\endsample
-\medskip
-
-\description
-This is the output of the same segment as on the previous page. As discussed
-before, when the +hex option is enabled, only the byte offset into the file
-is given. The hex codes of the OMF body are output along with their ASCII
-equivalent to the right of each line.
-
-\vfill\eject
-
-\description
-The following is sample output with the +orca and +hex options enabled
-(default options are read in when {\bf coff} starts):
-
-\bigskip
-\beginsample
-block count : $00000001 1
-reserved space: $00000000 0
-length : $00000079 121
-label length : $00 0
-number length : $04 4
-version : $01 1
-bank size : $00010000 65536
-kind : $00 static code
-org : $00000000 0
-alignment : $00000000 0
-number sex : $00 0
-segment number: $0000 0
-entry : $00000000 0
-disp to names : $002c 44
-disp to data : $003a 58
-load name :
-segment name : two
-\medskip
-00023a 000000 | longa on
-00023a 000000 | longi on
-00023a 000000 | two start
-00023a 000000 | _ClosePort
-000242 000007 | lda IRQ.APTALK af 20 00 e1 - . ..
-000246 00000b | _WriteGS
-00024d 000012 | pea $ffff f4 ff ff - ...
-000250 000015 | jsl DISPATCH1 22 00 00 e1 - "...
-000254 000019 | ldx #$ffff a2 ff ff - ...
-000257 00001c | jsl GS/OS 22 b0 00 e1 - "...
-00025b 000020 | lda #$0000 a9 00 00 - ...
-00025e 000023 | lda IOADR ad 00 c0 - ...
-000261 000026 | lda e0_IOADR af 00 c0 e0 - ....
-000265 00002a | sta SET80COL 8d 01 c0 - ...
-000268 00002d | lda |$123456 af 56 34 12 - .V4.
-00026c 000031 | lda TOWRITEBR af 80 00 e1 - ....
-000270 000035 | lda $cfff ad ff cf - ...
-000273 000038 | _WriteGS $345678
-00027d 000042 | nop ea - .
-00027e 000043 | _CreateP8 $1234
-000284 000049 | _CreateP8 parm
-000291 00004f | jsr PRO8MLI 20 00 bf - ..
-000295 000052 | dc i1'call'
-00029e 000053 | dc i2'parm'
-0002a7 000055 | _WriteGS parm
-0002b7 00005f | jsl PRO16MLI 22 a8 00 e1 - "...
-0002bc 000063 | dc i2'call'
-0002c5 000065 | dc i4'parm'
-0002ce 000069 | lda |inline + $1
-0002e0 00006d | lda |inline + $1,x
-0002f2 000071 | dc i2'call + $1'
-000301 000073 | dc i4'parm + $1'
-000310 000077 | dc h'5953' 59 53 - YS
-000313 000079 | end
-\endsample
-\medskip
-
-\description
-The +default option enables the `+tool, +infix, +label' options. The +tool
-options enable {\bf coff} to interpret certain hex sequences as toolbox
-calls. Only the toolbox calls are interpreted, not the parameters passed to
-any toolbox call. The +infix option enables expressions to be displayed in
-infix format. Selecting +orca without any other options enables the default
-postfix option. It is easier to read the disassembly when it is in infix
-form. Also, if you enable infix notation, parentheses in expressions during
-the conversion from postfix to infix are minimized. This will be apparent
-in the next example. The +tool option also recognizes the ROM addresses such
-as SET80COL, TOWRITEBR, and PRO16MLI. If the address is accessed in bank
-\$e0, the call is preceded with `e0\_' as IOADR is above. GS/OS and ProDOS
-calls are also recognized.
-
-\description
-The +hex option that, if enabled with any of the disassembly options,
--dom, will display the hex and ASCII value of the instruction being
-displayed. This is useful for displaying ASCII strings contained in the
-code. While the disassembly will not make much sense while displaying the
-ASCII data, the +hex option does provide a more meaningful way to interpret
-why the disassembly does not make sense.
-
-\vfill\eject
-
-\description
-The following is sample output with the +orca option enabled:
-
-\medskip
-\beginsample
-block count : $00000002 2
-reserved space: $00000000 0
-length : $000001a5 421
-label length : $00 0
-number length : $04 4
-version : $01 1
-bank size : $00000000 0
-kind : $01 static data
-org : $00000000 0
-alignment : $00000000 0
-number sex : $00 0
-segment number: $0000 0
-entry : $00000000 0
-disp to names : $002c 44
-disp to data : $003d 61
-load name : ~globals
-segment name : common
-\medskip
-00003d 000000 | longa on
-00003d 000000 | longi on
-00003d 000000 | common data
-00003d 000000 | aa equ $30
-000049 000000 | bb equ z + $1
-000059 000000 | cc equ q1
-000064 000000 | a dc h'0102030405060708090a0b0c0d0e0f1011121314'
-00007a 000014 | dc h'1516171819202122'
-000086 00001c | b dc i1'254,10,12,13,14,15,16,17,18,19,20'
-000093 000027 | dc i1'21,22,23,24,25,26,27,28,29,30'
-0000a1 000031 | c dc f'1.1234,2.3456,3.45679'
-0000af 00003d | dc f'4.4,5.5,6.12346'
-0000bb 000049 | dc f'7.1234'
-0000c3 00004d | d dc d'1.1,2.2,3.3'
-0000dd 000065 | dc d'4.4,5.5,6.6'
-0000f5 00007d | dc d'7.7,8.8,9.9'
-00010d 000095 | dc d'10.1'
-000119 00009d | e dc c'now is the time for all of us to leave i'
-000143 0000c5 | dc c't and all the'
-000154 0000d2 | f ds 200
-00015f 00019a | g dc i1'a + b + c + f'
-00017e 00019b | h dc i3'q - (r - s)'
-000191 00019e | i dc i1'a'
-00019e 00019f | j dc i2'a * ((b + c) * d * e + f)'
-0001c9 0001a1 | k dc r'reference'
-0001d8 0001a1 | l dc s'soft_reference'
-0001ef 0001a3 | m equ $0
-0001fb 0001a3 | n equ a + b + c
-000213 0001a3 | o dc i2'albert'
-000223 0001a5 | end
-\endsample
-\medskip
-
-\description
-As indicated before, the +infix option minimizes the parentheses in the
-output during the postfix to infix conversion. This takes out much
-confusion in reading the expression. It is also necessary when disassembling
-addressing modes such as Direct Page Indirect, Direct Page Indexed
-Indirect,X, and Stack Relative Indirect Indexed,Y. In the above output, the
-+label option has been enabled by the +default switch. Thus, when {\bf coff}
-encounters a label (either {\text GLOBAL} or {\text LOCAL}), it saves it
-and, if the label is referenced again, the name of the label is used in
-place of the default output.
-
-\description
-When disassembling labels, output is formatted in either Orca/M or Merlin as
-indicated by the user. However, certain type attributes of labels, such as
-double-precision floating-point-type or floating-point-type are not
-supported by the Merlin assembler and are output in Orca/M format. When
-disassembling integer-type labels, all integers are assumed to be signed.
-
-\vfill\eject
-
-\description
-The following is sample with the +header option enabled:
-
-\bigskip
-\beginsample
-byte count : $0000065c 1628
-reserved space: $00000000 0
-length : $000003e2 994
-label length : $00 0
-number length : $04 4
-version : $02 2
-bank size : $00010000 65536
-kind : $2000 static position-independent
- code
-org : $00000000 0
-alignment : $00000000 0
-number sex : $00 0
-segment number: $0002 2
-entry : $00000000 0
-disp to names : $002c 44
-disp to data : $003b 59
-load name :
-segment name : INIT
-\medskip
-byte count : $00005ded 24045
-reserved space: $00000000 0
-length : $00005627 22055
-label length : $00 0
-number length : $04 4
-version : $02 2
-bank size : $00010000 65536
-kind : $0000 static code
-org : $00000000 0
-alignment : $00000000 0
-number sex : $00 0
-segment number: $0003 3
-entry : $00000000 0
-disp to names : $002c 44
-disp to data : $003b 59
-load name :
-segment name : MAIN
-\endsample
-\medskip
-
-\description
-Headers can be displayed in both disassembled and hex format. The above
-display is the disassembly output. The hex output is similar to the +hex
-option but applies to the header. Below is a sample of this:
-
-\bigskip
-\beginsample
-00012d | 5c 06 00 00 00 00 00 00 e2 03 00 00 00 00 04 - \..............
-00013c | 02 00 00 01 00 00 20 00 00 00 00 00 00 00 00 - ...... ........
-00014b | 00 00 00 00 02 00 00 00 00 00 2c 00 3b 00 00 - ..........,.;..
-00015a | 00 00 00 00 00 00 00 00 00 04 49 4e 49 54 - ..........INIT
-\medskip
-000789 | ed 5d 00 00 00 00 00 00 27 56 00 00 00 00 04 - .]......'V.....
-000798 | 02 00 00 01 00 00 00 00 00 00 00 00 00 00 00 - ...............
-0007a7 | 00 00 00 00 03 00 00 00 00 00 2c 00 3b 00 00 - ..........,.;..
-0007b6 | 00 00 00 00 00 00 00 00 00 04 4d 41 49 4e - ..........MAIN
-\endsample
-\medskip
-
-\vfill\eject
-
-
-% Format of OMF files
-%
-
-\section{OMF FORMAT}
-
-\description
-The OMF (Object Module Format) file format is a specification for code
-object files output by assemblers and compilers. OMF files consist of
-object files, library files, load files, and run-time library files.
-Each OMF file consists of segments which are composed of a header and OMF
-records. The general format of an OMF file is given in Figure 1.
-\medskip
-
-\subsection{Segment types and attributes}
-
-\description
-Each OMF segment has a segment type and can have several attributes. The
-following segment types are defined by OMF:
-
-\segtype {\bf Code} and {\bf Data} segments are object segments
-provided to support languages (such as assembly language) that distinguish
-program code from data.
-
-\segtype {\bf Jump-table} segments and pathname segments are load
-segments that facilitate the dynamic loading of segments.
-
-\segtype {\bf Pathname segment}.
-
-\segtype {\bf Library dictionary} segments allow the linker to scan
-library files quickly for needed segments.
-
-\segtype {\bf Initialization segments} are optional parts of load
-files that are used to perform any initialization required by the
-application during an initial load. If used, they are loaded and executed
-immediately as the System Loader encounters them and are re-executed any
-time the program is restarted from memory.
-
-\segtype {\bf Direct-page/stack} segments are load segments used to
-preset the location and contents of the direct page and stack for an
-application.
-\smallskip
-
-\description
-A Segment can have only one segment {\it type} but can have any combination
-of {\it attributes}. The following segment attributes are defind by the
-object module format:
-
-\segtype {\bf Reload} segments are load segments that the loader
-must reload even if the program is restartable and is restarted from
-memory. They usually contain data that must be restored to its initial
-values before a program can be restarted.
-
-\segtype {\bf Absolute-bank} segments are load segments that are
-restricted to a specified bank but that can be relocated within that bank.
-The {\omf org} field in the segment header specifies the bank to which the
-segment is restricted.
-
-\segtype {\bf Loadable in special memory} means that a segment can
-be loaded in banks \$00, \$01, \$E0, and \$E1. Because these are the banks
-used by programs running under ProDOS 8 in standard-Apple II emulation mode,
-you may prevent your program from being loaded in these banks so that it can
-remain in memory while programs are run under ProDOS 8.
-
-\segtype {\bf Position-independent} segments can be moved by the
-Memory Manager during program execution if they have been unlocked by the
-program.
-
-\segtype {\bf private code} segment is a code segment whose name is
-available only to other code segments within the same object file (The
-labels within a code segment are local to that segment).
-
-\segtype A {\bf private data} segment is a data segment whose labels
-are available only to code segments in the same object file.
-
-\segtype {\bf Static} segments are load segments that are loaded at
-program execution time and are not unloaded during execution; {\bf dynamic}
-segments are loaded and unloaded during program execution as needed.
-
-\segtype {\bf Bank-relative} segments must be loaded at a specified
-address within any bank. The {\omf org} field in the segment header
-specifies the bank-relative address (the address must be less than \$10000).
-
-\segtype {\bf Skip} segments will not be linked by the linker or
-loaded by the System Loader. However, all references to global definitions
-in a Skip object segment will be processed by a linker.
-
-{\bf Segment Header}
-
-\description
-Each segment in an OMF file has a header that contains general information
-about the segment, such as its name and length. The format of the segment
-header is illustrated in Figure 2. The following is a detailed description of
-the fields that comprise the segment header:
-
-\head{bytecnt} A 4-byte field indicating the number of bytes in the file
-that the segment requires. This number includes the segment header, so you
-can calculate the starting mark of the next segment from the starting mark
-of this segment plus {\omf bytecnt} (OMF 1.0 segments are a multiple of
-512 bytes). Segments need not be aliged to block boundaries.
-
-\head{resspc} A 4-byte field specifying the number of bytes of 0's to add
-to the end of the segment. This field can be used in an object segment
-instead of a large blocks of zeros at the end of the segment. This field
-duplicates the effect of a {\omf ds} record at the end of the segment.
-
-\head{length} A 4-byte field field specifying the memory size that the
-segment will require when loaded. It includes the extra memory specified
-by {\omf resspc.}
-
-\headhead
-{\omf length} is followed by one undefined byte. and aldsjf lkjdsaf ljadsf
-ldfkj als fdjlasd jflasjd flasjdf lakjsdf lkasjdf lkajsdf lkdsafasdkfj
-lkasjdf lkjdsa flkjasd flsaj fljas dflajsd flksaj flksaj flaksjd flksajdf
-
-\head{lablen} A 1-byte field indicating the length, in bytes, of each name
-or label record in the segment body. If {\omf lablen} is 0, the length of
-each name of label is specified in the first byte of the record (that is, the
-first byte of the record specifies how many bytes follow). {\omf lablen}
-also specifies the length of the {\omf segname} field of the segment header,
-or, if {\omf lablen} is 0, the first byte of {\omf segname} specifies how
-many bytes follow. (The {\omf loadname} field always has a length of 10
-bytes). Fixed-length labels are always left justified and padded with spaces.
-
-\head{numlen} A 1-byte field indicating the length, in bytes, of each number
-field in the segment body. This field is 4 bytes for the Apple IIgs.
-
-\head{version} A 1-byte field indicating the version number of the object
-module format with which the segment is compatible. OMF is currently at
-version 2.0.
-
-\head{revision} A 1-byte field indicating the revision number of the object
-module format with which the segment is compatible. Together with the
-{\omf version} field, {\omf revision} specifies the OMF compatibility level
-of this segment. OMF is current at revision 0.
-
-\head{banksize} A 4-byte binary number indicating the maximum memory-bank
-size for the segment. If the segment is in an object file, the linker ensures
-that the segment is not larger that this value. (The linker returns an error
-if the segment is too large). If the segment is in a load file, the loader
-ensures that the segment is loaded into a memory block that does not cross
-this boundary. For Apple IIgs code segments, this field must be
-\$00010000, indicating a 64K bank size. A value of 0 in this field indicates
-that the segment can cross bank boundaries. Apple IIgs data segments can use
-any number from \$00 to \$00010000 for {\omf banksize.}
-
-\head{kind} A 2-byte field specifying the type and attributes of the
-segment. The bits are defined as shown in {\bf Table 1}.
-
-\headnote{Important:} If segment {\omf kind}s are specified in the
-source file, and the {\omf kind}s of the object segments placed in a given
-load segment are not all the same, the segment {\omf kind} of the first
-object segment determines the segment {\omf kind} of the entire load segment.
-
-\headhead
-{\omf kind} is followed by two undefined bytes, reserved for future changes
-to the segment header specification.
-
-\bigskip
-
-\headhead
-{\bf Table1}: {\omf kind} field definition\par
-\nobreak
-\vbox{\tabskip=0pt
-\def\tablerule{\noalign{\moveright 7pc\vbox{\hrule width32pc}}}
-\def\space{\omit&height2pt&\omit&&\omit&&\omit&}
-\smallskip\offinterlineskip
-\halign to39pc{\hbox to7pc{\hfil}\strut#& \vrule#\tabskip=1em plus2em&
- \thinspace#\hfil& \vrule#&
- \thinspace#\hfil& \vrule#&
- \thinspace#\hfil& \vrule#\tabskip=0pt\cr\tablerule
-\space\cr
-&&\bf Bit(s)&&\bf Values&&\bf Meaning&\cr
-\space\cr\tablerule
-\space\cr
-&&\rm 0-4&&&&\it Segment Type subfield&\cr
-\space\cr
-&&&&\$00&&\rm Code&\cr
-&&&&\$01&&\rm Date&\cr
-&&&&\$02&&\rm Jump-table segment&\cr
-&&&&\$04&&\rm Pathname segment&\cr
-&&&&\$08&&\rm Library dictionary segment&\cr
-&&&&\$10&&\rm Initialization Segment&\cr
-&&&&\$12&&\rm Direct-page/stack segment&\cr
-\space\cr\tablerule
-\space\cr
-&&8-15&&&&\it Segment Attributes bits&\cr
-&&\rm 8&&if = 1&&Bank-relative segment&\cr
-&&9&&if = 1&&Skip segment&\cr
-&&10&&if = 1&&Reload segment&\cr
-&&11&&if = 1&&Absolute-bank segment&\cr
-&&12&&if = 0&&Can be loaded in special memory&\cr
-&&13&&if = 1&&Position independent&\cr
-&&14&&if = 1&&Private&\cr
-&&15&&if = 0&&Static; otherwise dynamic&\cr
-\space\cr\tablerule}}
-
-\medskip
-
-\head{org} A 4-byte field indicating the absolute address at which this
-segment is to be loaded in memory, or, for an absolute-bank segment, the
-bank number. A value of 0 indicates that this segment is relocatable and
-can be loaded anywhere in memory. A value of 0 is normal for the Apple
-IIgs.
-
-\head{align} A 4-byte binary number indicating the boundary on which this
-segment must be aligned. For example, if the segment is to be aligned on a
-page boundary, this field is \$00000100; if the segment is to be aligned on
-a bank boundary, this field is \$00010000. A value of 0 indicates that no
-alignment is needed. For the Apple IIgs, this field must be a power
-of 2, less than or equal to \$00010000.
-
-\head{numsex} A 1-byte field indicating the order of the bytes in a number
-field. If this field is 0, the least significant byte is first. If this
-field is 1, the most significant byte is first. This field is set to 0 for
-the Apple IIgs.
-
-\headhead
-{\omf numsex} is followed by one undefined byte, reserved for future changes
-to the segment header specification.
-
-\head{segnum} A 2-byte field specifying the segment number. The segment
-number corresponds to the relative position of the segment in the file
-(starting with 1).
-
-\head{entry} A 4-byte field indicating the offset into the segment that
-corresponds to the entry point of the segment.
-
-\head{dispname} A 2-byte field indicating the displacement of the
-{\omf loadname} field within the segment header. Currently, {\omf dispname}
-= 44. {\omf dispname} is provided to allow for future additions to the
-segment header; any new fields will be added between {\omf dispdata}
-and {\omf loadname}. {\omf dispname} allows you to reference {\omf loadname}
-and {\omf segname} no matter what the actual size of the header.
-
-\head{dispdata} A 2-byte field indicating the displacement from the start
-of the segment header to the start of the segment body. {\omf dispdata} is
-provided to allow for future additions to the segment header; any new fields
-will be added between {\omf dispdata} and {\omf loadname}. {\omf dispdata}
-allows you to reference the start of the segment body no matter what the
-actual size of the header.
-
-\head{tempORG} A 4-byte field indicating the temporary origin of the Object
-segment. A nonzero value indicates that all references to globals within
-this segment will be interpreted as if the Object segment started at that
-location. However, the actual load address of the Object segment is still
-determined by the {\omf org} field.
-
-\head{loadname} A 10-byte field specifying the name of the load segment
-that will contain the code generated by the linker for this segment. More
-than one segment in an object file can be merged by the linker into a single
-segment in the load file. This field is unused in a load segment. The
-position of {\omf loadname} may change in future versions of the OMF;
-therefore, you should always use {\omf dispname} to reference {\omf loadname.}
-
-\head{segname} A field that is {\omf lablen} bytes long, and that specifies
-the name of the segment. The position of {\omf segname} may change in future
-revisions of the OMF; therefore, you should always use {\omf dispname} to
-reference {\omf segname.}
-
-{\bf Segment Body}
-
-\description
-The body of each segment is composed of sequential records, each of which
-starts with a 1-byte operation code. Each record contains either program
-code or information for the linker or loader. All names and labels included
-in these record are {\omf lablen} bytes long, and all numbers and addresses
-are {\omf numlen} bytes long (unless otherwise specified in the following
-definitions).
-
-\description
-Several of the OMF records contain expressions that have to be evaluated by
-the linker. The operation and syntax of expressions are described in
-{\bf Expressions}. If the description of the record type does not explicitly
-state that the opcode is followed by an expression, then an expression cannot
-be used. Expressions are never used in load segments.
-
-\description
-The operation codes and segment records are described below, listed in order
-of the opcodes. {\bf Table 2} provides an alphabetical cross-reference
-between segment record types and opcodes. Library files consist of object
-segments and so can use any record type that can be used in an object
-segment. The table also lists the segment types in which each record type
-can be used.
-
-\bigskip
-
-\description
-{\bf Table 2}: Segment-body record types\par
-\nobreak
-\vbox{\tabskip=0pt
-\catcode`\$=11
-\def\tablerule{\noalign{\moveright 2pc\vbox{\hrule width37pc}}}
-\def\space{\omit&height2pt&\omit&\omit&\omit&&\omit&\omit&\omit&}
-\smallskip\offinterlineskip
-\halign to39pc{\hbox to2pc{\hfil}\strut#&\vrule#\tabskip=0em plus1em&
- \omf#\hfil&#\hfil&
- #\hfil&\vrule#&
- \omf#\hfil&#\hfil&
- #\hfil&\vrule#\tabskip=0pt\cr\tablerule
-\space\cr
-&&\bf Record Type&\bf Opcode&\bf Found in what&&
-\bf Record Type&\bf Opcode&\bf Found in what&\cr
-&&\omit&\omit&\bf segment types&&\omit&\omit&\bf segment types&\cr
-\space\cr\tablerule
-\space\cr
-&&ALIGN&$E0&Object&&\omf BEXPR&$ED&Object&\cr
-&&cINTERSEG&$F6&Load&&CONST&$01-$DF&Object&\cr
-&&cRELOC&$F5&Load&&DS&$F1&All&\cr
-&&END&$00&All&&ENTRY&$F4&Run-time Library&\cr
-&&\omit&\omit&\omit&&\omit&\omit&Dictionary&\cr
-&&EQU&$F0&Object&&EXPR&$EB&Object&\cr
-&&GEQU&$E7&Object&&GLOBAL&$E6&Object&\cr
-&&INTERSEG&$E3&All&&LCONST&$F2&All&\cr
-&&LEXPR&$F3&Object&&LOCAL&$EF&Object&\cr
-&&MEM&$E8&Object&&ORG&$E1&Object&\cr
-&&RELEXPR&$EE&Object&&RELOC&$E2&Load&\cr
-&&STRONG&$E5&Object&&SUPER&$F7&Load&\cr
-&&USING&$E4&Object&&ZEXPR&$EC&Object&\cr
-\space\cr\tablerule}
-\catcode`\$=3}
-
-\medskip
-
-\body{END}{\$00} This record indicates the end of the segment.
-
-\body{CONST}{\$01-\$DF} This record contains absolute data that needs no
-relocation. The operation code specifies how many bytes of data follow.
-
-\body{ALIGN}{\$E0} This record contains a number that indicates an alignment
-factor. The linker inserts as many 0 bytes as necessary to move to the
-memory boundary indicated by this factor. The value of this factor is in the
-same format as the {\omf ALIGN} field in the segment header and cannot have
-a value greater than that in the {\omf ALIGN} field. {\omf ALIGN} must equal
-a power of 2.
-
-\body{ORG}{\$E1} This record contains a number that is used to increment or
-decrement the location counter. If the location counter is incremented
-({\omf ORG} is positive), 0's are inserted to get to the new address. If
-the location counter is decremented ({\omf ORG} is a complement negative
-number of 2), subsequent code overwrites the old code.
-
-\body{RELOC}{\$E2} This is a relocation record, which is used in three
-relocation dictionary of a load segment. It is used to patch an address in a
-load segment with a reference to another address in the same load segment.
-It contains two 1-byte counts followed by two offsets. The first count is the
-number of bytes to be relocated. The second count is a bit-shift operator,
-telling how many times to shift the relocated address before inserting the
-result into memory. If the bit-shift operator is positive, the number is
-shifted to the left, filling vacated bit positions with 0's (arithmetic
-shift left). If the bit-shift operator is (two's complement) negative, the
-number is shifted right (logical shift right) and 0-filled.
-
-\bodybody
-The first offset gives the location (relative to the start of the
-segment) of the first byte of the number that is to be patched (relocated).
-The second offset is the location of the reference relative to the start of
-the segment; that is, it is the value that the number would have if the
-segment containing it started at address \$000000. For example, suppose the
-segment includes the following lines:
-
-\smallskip
-
-\text
-\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to0.5in{\hfil}&\hbox to1in{\hfil}&\cr
-\+&35&label&$\bullet \bullet \bullet$\cr
-\+&&$\bullet$\cr
-\+&&$\bullet$\cr
-\+&&$\bullet$\cr
-\+&400&lda&label+4\cr
-
-\rm\smallskip
-
-\bodybody
-The {\omf RELOC} record contains a patch to the operand of the {\text lda}
-instruction. The value of the patch is {\text label+4}, so the value of the
-last field in the {\omf RELOC} record is \$39-the value the patch would have
-if the segment started at address \$000000. {\text label+4} is two bytes long;
-that is, the number of bytes to be relocated is 2. No bit-shift operation is
-needed. The location of the patch is 1025 (\$401) bytes after the start of
-the segment (immediately after the {\text lda}, which is one byte).
-
-\bodybody
-The {\omf RELOC} record for the number to be loaded into the A register by
-this statement would therefore look like this (note that the values are
-stored low byte first, as specified by {\omf numsex}):
-
-\text\bodybody
-E2020001 04000039 000000
-
-\rm\bodybody
-This sequence corresponds to the following values:
-
-\smallskip
-
-\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&\text\$E2&\rm operation code\cr
-\+&\text\$02&\rm number of bytes to be relocated\cr
-\+&\text\$00&\rm bit-shift operator\cr
-\+&\text\$00000401&\rm offset of value from start of segment\cr
-\+&\text\$00000039&\rm value if segment started at \$000000\cr
-
-\rm\smallskip
-
-\bodynote{Note:} Certain types of arithmetic expressions are illegal in a
-relocatable segment; specifically, any expression that the assembler cannot
-evaluate (relative to the start of the segment) cannot be used. The
-expression {\text LAB$\vert$4} can be evaluated, for example, since the
-{\omf RELOC} record includes a bit-shift operator. The expression
-{\text LAB$\vert$4+4} cannot be used, however, because the assembler would have
-to know the absolute value of {\text LAB} to perform the bit-shift operation
-before adding 4 to it. Similarly, the value of {\text LAB*4} depends on the
-absolute value of {\text LAB} and cannot be evaluated relative to the start
-of the segment, so multiplication is illegal in expressions in relocatable
-segments.
-
-\body{INTERSEG}{\$E3} This record is used in the relocation dictionary of a
-load segment. It contains a patch to a long call to an external reference;
-that is, the {\omf INTERSEG} record is used to patch an address in a load
-segment with a reference to another address in a different load segment. It
-contains two 1-byte counts followed by an offset, a 2-byte file number, a
-2-byte segment number, and a second offset. The first count is the number of
-bytes to be relocated, and the second count is a bit-shift operator, telling
-how many times to shift the relocated address before inserting the result
-into memory. If the bit-shift operator is positive, the number is shifted to
-the left, filling vacated bit positions with 0's (arithmetic shift left). If
-the bit-shift operator is (two's complement) negative, the number is shifted
-right (logical shift right) and 0-filled.
-
-\bodybody
-The first offset is the location (relative to the start of the segment) of
-the (first byte of the) number that is to be relocated. If the reference is
-to a static segment, the file number, segment number, and second offset
-correspond to the subroutine referenced. (The linker assigns a file number
-to each load file in a program. This feature is provided primarily to support
-run-time libraries. In the normal case of a program having one load file,
-the file number is 1. The load segments in a load file are numbered by their
-relative locations in the laod file, where the frist load segment is number
-1). If the reference is to a dynamic segment, the file and segment number
-correspond to the jump-table segment, and the second offset corresponds to
-the call to the Loader for that reference.
-
-\bodybody
-For example, suppose the segment includes an instruction such as:
-
-\text\bodybody
-\hbox to1in{jsl\hfil}ext
-
-\rm\smallskip
-
-\bodybody
-The label {\text ext} is an external reference to a location in a static
-segment.
-
-\bodybody
-If this instruction is at relative address \$720 within its segment and ext
-is at relative address \$345 in segment \$000a in file \$0001, the linker
-creates an {\omf INTERSEG} record in the relocation dictionary that looks
-like this (note that the values are stored low byte first, as specified by
-{\omf NUMSEX}):
-
-\text\bodybody
-E3030021 07000001 000A0045 030000
-
-\rm\bodybody
-This sequence corresponds to the following values:
-
-\smallskip
-
-\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&\text\$E3&\rm operation code\cr
-\+&\text\$03&\rm number of bytes to be relocated\cr
-\+&\text\$00&\rm bit-shift operator\cr
-\+&\text\$00000721&\rm offset of instruction's operand\cr
-\+&\text\$0001&\rm file number\cr
-\+&\text\$000A&\rm segment number\cr
-\+&\text\$00000345&\rm offset of subroutine referenced\cr
-
-\rm\smallskip
-
-\bodybody
-When the loader processes the relocation dictionary, it uses the first offset
-to find the {\text jsl} and patches in the address corresponding to the file number,
-segment number, and offset of the referenced subroutine.
-
-\bodybody
-If the {\text jsl} is to an external reference in a dynamic segment, the
-{\omf INTERSEG} records refer to the file number, segment number, and offset
-of the call to the Loader in the jump-table segment.
-
-\bodybody
-If the jump-table segment is in segment 6 of file 1, and the call to the
-Loader is at relative location \$2A45 in the jump-table segment, then the
-{\omf INTERSEG} record looks like this (note that the values are stored low
-byte first, as specified by {\omf NUMSEX}):
-
-\text\bodybody
-E3030021 07000001 00060045 2A0000
-
-\rm\bodybody
-This sequence corresponds to the following values:
-
-\smallskip
-
-\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&\text\$E3&\rm operation code\cr
-\+&\text\$03&\rm number of bytes to be relocated\cr
-\+&\text\$00&\rm bit-shift operator\cr
-\+&\text\$00000721&\rm offset of instruction's operand\cr
-\+&\text\$0001&\rm file number of jump-table segment\cr
-\+&\text\$0006&\rm segment number of jump-table segment\cr
-\+&\text\$00002A45&\rm offset of call to loader\cr
-
-\smallskip
-
-\bodybody
-The jump-table segment entry that corresponds to the external reference
-{\text ext} contains the following values:
-
-\smallskip
-
-\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&\bf User ID\cr
-\+&\text\$0001&\rm file number\cr
-\+&\text\$0005&\rm segment number\cr
-\+&\text\$00000200&\rm offset of instruction call to Loader\cr
-
-\smallskip
-
-\bodybody
-{\omf INTERSEG} records are used for any long-address reference to a static
-segment.
-
-\body{USING}{\$E4} This record contains the name of a data segment. After this
-record is encountered, local labels from that data segment can be used in the
-current segment.
-
-\body{STRONG}{\$E5} This record contains the name of a segment that must be
-included during linking, even if no external references have been made to it.
-
-\body{GLOBAL}{\$E6} This record contains the name of a global label followed
-by three attribute fields. The label is assigned the current value of the
-location counter. The first attribute field is two bytes long and gives the
-number of bytes generated by the line that defined the label. If this field
-is \$FFFF, it indicates that the actual length is unknown but that it is
-greater than or equal to \$FFFF. The second attribute field is one byte long
-and specifies the type of operation in the line that defined the label. The
-following type attributes are defined (uppercase ASCII characters with the
-high bit off):
-
-\smallskip
-
-\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&A&address-type {\text dc} statement\cr
-\+&B&boolean-type {\text dc} statement\cr
-\+&C&character-type {\text dc} statement\cr
-\+&D&double-precision floating-point-type {\text dc} statement\cr
-\+&F&floating-point-type {\text dc} statement\cr
-\+&G&{\text equ} or {\text gequ} statement\cr
-\+&H&hexadecimal-type {\text dc} statement\cr
-\+&I&integer-type {\text dc} statement\cr
-\+&K&reference-address-type {\text dc} statement\cr
-\+&L&soft-reference-type {\text dc} statement\cr
-\+&M&instruction\cr
-\+&N&assembler directive\cr
-\+&O&{\text org} statement\cr
-\+&P&{\text align} statement\cr
-\+&S&{\text ds} statement\cr
-\+&X&arithmetic symbolic parameter\cr
-\+&Y&boolean symbolic parameter\cr
-\+&Z&character symbolic parameter\cr
-
-\smallskip
-
-\bodybody
-The third attribute field is one byte long and is the private flag (1 =
-private). This flag is used to designate a code or data segment as private.
-
-\body{GEQU}{\$E7} This record contains the name of a global label followed by
-three attribute fields and an expression. The label is given the value of the
-expression. The first attribute field is 2 bytes long and gives the number of
-bytes generated by the line that defined the label. The second attribute
-field is 1 byte long and specifies the type of operation in the line that
-defined the label, as listed in the discussion of the {\omf GLOBAL} record.
-The third attribute field is 1 byte long and is the private flag (1 =
-private). This flag is used to designate a code or data segment as private.
-
-\body{MEM}{\$E8} This record contains two numbers that represent the starting
-and ending addresses of a range of memory that must be reserved. If the size
-of the numbers is not specified, the length of the numbers is defined by the
-{\omf NUMLEN} field in the segment header.
-
-\body{EXPR}{\$EB} This record contains a 1-byte count followed by an
-expression. The expression is evaluated, and its value is truncated to the
-number of bytes specified in the count. The order of the truncation is from
-most significant to least significant.
-
-\body{ZEXPR}{\$EC} This record contains a 1-byte count followed by an
-expression. {\omf ZEXPR} is identical to {\omf EXPR}, except that any bytes
-truncated must be al 0's. If the bytes are not 0's, the record is flagged as
-an error.
-
-\body{BEXPR}{\$ED} This record contains a 1-byte count followed by an
-expression. {\omf BEXPR} is identical to {\omf EXPR,} except that any bytes
-truncated must match the corresponding bytes of the location counter. If the
-bytes don't match, the record is flagged as an error. This record allows the
-linker to make sure that an expression evaluates to an address in the current
-memory bank.
-
-\body{RELEXPR}{\$EE} This record contains a 1-byte length followed by an
-offset and an expression. The offset is {\omf NUMLEN} bytes long.
-{\omf RELEXPR} is used to generate a relative branch value that involves an
-external location. The length indicates how many bytes to generate for the
-instruction, the offset indicates where the origin of the branch is relative
-to the current location counter, and the expression is evaluated to yeild the
-destination of the branch. For example, a {\text bne loc} instruction, where
-{\text loc} is external, generates this record. For the 6502 and 65816
-microprocessors, the offset is 1.
-
-\body{LOCAL}{\$EF} This record contains the name of a local label followed by
-three attribute fields. The label is assigned the value of the current
-location counter. The first attribute field is two bytes long and gives the
-number of bytes generated by the line that defined the label. The second
-attribute field is one byte long and specifies the type of operation in the
-line that defined the label, as listed in the discussion of the {\omf GLOBAL}
-record. The third attribute field is one byte long and is the private flag
-(1 = private). This flag is used to designate a code or data segment as private.
-
-\body{EQU}{\$F0} This record contains the name of a local label followed by
-three attribute fields and an expression. The label is given the value of the
-expression. The first attribute field is two bytes long and gives the number
-of bytes generated by the line that defined the label. The second attribute
-field is one byte long and specifies the type of operation in the line that
-defined the label, as listed in the discussion of the {\omf GLOBAL} record.
-The third attribute field is one byte long and is the private flag (1 =
-private). This flag is used to designate a code or data segment as private.
-
-\body{DS}{\$F1} This record contains a long integer indicating how many bytes
-of 0's to insert at the current location counter.
-
-\body{LCONST}{\$F2} This record contains a 4-byte count followed by absolute
-code or data. The count indicates the number of bytes of data. The
-{\omf LCONST} record is similar to {\omf CONST} except that it allows for a
-much greater number of data bytes. Each relocatable load segment consists of
-{\omf LCONST} records, {\omf DS} records, and a relocation dictionary. See
-the discussions on {\omf INTERSEG} records, {\omf RELOC} records, and the
-relocation dictionary for more information.
-
-\body{LEXPR}{\$F3} This record contains a 1-byte count followed by an
-expression. The expression is evaluated, and its value is truncated to the
-number of bytes specified in the count. The order of the truncation is from
-most significant to least significant.
-
-\bodybody
-Because the {\omf LEXPR} record generates an intersegment reference, only
-simple expressions are allowed in the expression field, as follows:
-
-\medskip
-
-\begingroup
-\parskip=0pt\baselineskip=10pt
-\advance\parindent by 11pc\text
-LABEL $\pm$ const\par
-LABEL $\pm$ const\par
-(LABEL $\pm$ const) $\vert$ $\pm$ const\par
-\endgroup
-
-\bodybody
-In addition, if the expression evaluates to a single label with a fixed,
-constant offset, and if the label is in another segment and that segment is
-a dynamic code segment, then the linker creates an entry for that label in
-the jump-table segment. (The jump-table segment provides a mechanism to allow
-dynamic loading of segments as they are needed).
-
-\body{ENTRY}{\$F4} This record is used in the run-time library entry
-dictionary; it contains a 2-byte number and an offset followed by a label.
-The number is the segment number. The label is a code-segment name or entry,
-and the offset is the relative location within the load segment of the label.
-
-\body{cRELOC}{\$F5} This record is the compressed version of the {\omf RELOC}
-record. It is identical to the {\omf RELOC} record, except that the offsets
-are two bytes long rather than four bytes. The {\omf cRELOC} record can be
-used only if both offsets are less than \$10000 (65,536). The following
-example compares a {\omf RELOC} record and a {\omf cRELOC} record for the
-same reference:
-
-\medskip
-
-\vbox{\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&\bf RELOC&\bf cRELOC\cr
-\+&\text\$E2&\$02\cr
-\+&\$02&\$02\cr
-\+&\$00&\$00\cr
-\+&\$00000401&\$0401\cr
-\+&\$00000039&\$0039\cr
-\+&\rm(11 bytes)&(7 bytes)\cr}
-
-\smallskip
-
-\body{cINTERSEG}{\$F6} This record is the compressed version of the
-{\omf INTERSEG} record. It is identical to the {\omf INTERSEG} record,
-except that the offsets are two bytes long rather than four bytes, the
-segment number is one byte rather than two bytes, and this record does
-not inclue the 2-byte file number. The {\omf cINTERSEG} record can be used
-only if both offsets are less than \$10000 (65,536), the segment number is
-less than 256, and the file number associated with the reference is 1 (that
-is, the initial load file). References to segments in run-time library files
-must use {\omf INTERSEG} records rather than {\omf cINTERSEG} records.
-
-\bodybody
-The following example compares an {\omf INTERSEG} record and a
-{\omf cINTERSEG} record for the same reference:
-
-\medskip
-
-\vbox{\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&\bf INTERSEG&\bf cINTERSEG\cr
-\+&\text\$E3&\$F6\cr
-\+&\$03&\$03\cr
-\+&\$00&\$00\cr
-\+&\$00000720&\$0720\cr
-\+&\$0001\cr
-\+&\$000A&\$0A\cr
-\+&\$00000345&\$0345\cr
-\+&\rm(15 bytes)&(8 bytes)\cr}
-
-\smallskip
-
-\body{SUPER}{\$F7} This is a supercompressed relocation-dicationary record.
-Each {\omf SUPER} record is the equivalent of many {\omf cRELOC},
-{\omf cINTERSEG}, and {\omf INTERSEG} records. It contains a 4-byte length,
-a 1-byte record type, and one or more subrecords of variable size, as
-follows:
-
-\medskip
-
-\filbreak
-\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&\bf Opcode:&\text\$F7\cr
-\+&\bf Length:&\rm number of bytes in the rest of the record (4 bytes)\cr
-\+&\bf Type:&\text 0-37\rm (1 byte)\cr
-\+&\bf Subrecords:&\rm (variable size)\cr
-
-\smallskip
-
-\bodybody
-When {\omf SUPER} records are used, some of the relocation information is
-stored in the {\omf LCONST} record at the address to be patched.
-
-\bodybody
-The length field indicates the number of bytes in the rest of the {\omf SUPER}
-record (that is, the number of bytes exclusive of the opcode and the length
-field).
-
-\bodybody
-The type byte indicates the type of {\omf SUPER} record. There are 38 types
-of {\omf SUPER} records:
-
-\medskip
-
-\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&\bf Value&SUPER record type\cr
-\+&\text 0&\super SUPER RELOC2\cr
-\+&\text 1&\super SUPER RELOC3\cr
-\+&\text 2-37&\super SUPER INTERSEG1 {\rm -} SUPER INTERSEG36\cr
-
-\smallskip
-
-\bodybody
-{\super SUPER RELOC2}: This record can be used instead of {\omf cRELOC}
-records that have a bit-shift count of zero and that relocate two bytes.
-
-\bodybody
-{\super SUPER RELOC3}: This record can be used instead of {\omf cRELOC}
-records that have a bit-shift count of zero and that relocate three bytes.
-
-\bodybody
-{\super SUPER INTERSEG1}: This record can be used instead of {\omf cINTERSEG}
-records that have a bit-shift count of zero and that relocate three bytes.
-
-\bodybody
-{\super SUPER INTERSEG2} through {\super SUPER INTERSEG12}: The number in the
-name of the record referes to the file number of the file in which the
-record is used. For example, to relocate an address in file 6, use a
-{\super SUPER INTERSEG6} record. These records can be used instead of
-{\super INTERSEG} records that meet the following criteria:
-
-\begingroup
-\parskip=3pt\baselineskip=10pt
-\advance\parindent by 11pc
-{$\bullet$\enspace} Both offsets are less than \$10000.\par
-{$\bullet$\enspace} The segment number is less than 256.\par
-{$\bullet$\enspace} The bit-shift count is 0.\par
-{$\bullet$\enspace} The record relocates 3 bytes.\par
-{$\bullet$\enspace} The file number is from 2 through 12.\par
-\endgroup
-
-\bodybody
-{\super SUPER INTERSEG13} through {\super SUPER INTERSEG24:} These records
-can be used instead of {\omf cINTERSEG} records that have a bit-shift count
-of zero, that relocate two bytes, and that have a segment number of {\it n}
-minus 12, where {\it n} is a number from 13 to 24. For example, to replace a
-{\omf cINTERSEG} record in segment 6, use a {\super SUPER INTERSEG18} record.
-
-\bodybody
-{\super SUPER INTERSEG25} through {\super SUPER INTERSEG36:} These records
-can be used instead of {\omf cINTERSEG} records that have a bit-shift count
-of \$F0 (-16), that relocate two bytes, and that have a segment number of
-{\it n} minus 24, where {\it n} is a number from 25 to 36. For example, to
-replace a {\omf cINTERSEG} record in segment 6, use a {\super SUPER
-INTERSEG30} record.
-
-\bodybody
-Each subrecord consists of either a 1-byte offset count followed by a list of
-1-byte offsets, or a 1-byte skip count.
-
-\bodybody
-Each offset count indicates how many offsets are listed in this subrecord.
-The offsets are one byte each. Each offset corresponds to the low byte of the
-first (2-byte) offset in the equivalent {\omf INTERSEG}, {\omf cRELOC}, or
-{\omf cINTERSEG} record. The high byte of the offset is indicated by the
-location of this offset count in the {\omf SUPER} record: Each subsequent
-offset count indicates the next 256 bytes of the load segment. Each skip
-count indicates the number of 256-byte pages to skip; that is, a skip count
-indicates that there are no offsets within a certain number of 256-byte pages
-of the load segment.
-
-\bodybody
-For example, if patches must be made at offsets {\text 0020}, {\text 0030},
-{\text 0140}, and {\text 0550} in the load segment, the subrecords would
-include the following fields:
-
-\medskip
-
-\begingroup
-\parskip=0pt
-\bodybody\advance\hangindent by1in
-\hbox to1in{\text 2 20 30\hfil}the first 256-byte page of the load segment
-has two patches: one at offset {\text 20} and one at offset {\text 30}\par
-\bodybody\advance\hangindent by1in
-\hbox to1in{\text 1 40\hfil}the second 256-byte page has one patch at offset
-{\text 40}\par
-\bodybody\advance\hangindent by1in
-\hbox to1in{skip-3\hfil}skip the next three 256-byte pages\par
-\bodybody\advance\hangindent by1in
-\hbox to1in{\text 1 50\hfil}the sixth 256-byte page has one patch at offset
-{\text 50}\par
-\endgroup
-
-\smallskip
-
-\bodybody
-In the actual {\omf SUPER} record, the patch count byte is the number of
-offsets minus one, and the skip count byte has the high bit set. A
-{\super SUPER INTERSEG1} record with the offsets in the preceding example
-would look like this:
-
-\smallskip
-
-\filbreak
-\settabs\+\indent\hbox to 11pc{\hfil}&\hbox to1in{\hfil}&\cr
-\+&\text\$F7&\rm opcode\cr
-\+&\text\$00000009&\rm number of bytes in the rest of the record\cr
-\+&\text\$02&\super INTERSEG1\rm-type {\omf SUPER} record\cr
-\+&\text\$01&\rm the first 256-byte page has two patches\cr
-\+&\text\$20&\rm patch the load segment at offset \text\$0020\cr
-\+&\text\$30&\rm patch the segment at \text\$0030\cr
-\+&\text\$00&\rm the second page has one patch\cr
-\+&\text\$40&\rm patch the segment at \text\$0140\cr
-\+&\text\$83&\rm skip the next three 256-byte pages\cr
-\+&\text\$00&\rm the sixth page has one patch\cr
-\+&\text\$50&\rm patch the segment at \text\$0550\cr
-
-\smallskip
-
-\bodybody
-A comparison with the {\omf RELOC} record shows that a {\super SUPER RELOC}
-record is missing the offset of the reference. Similarly, the
-{\super SUPER INTERSEG1} through {\super SUPER INTERSEG12} records are
-missing the segment number and offset of the subroutine referenced. The
-offsets (which are two bytes long) are stored in the {\omf LCONST} record at
-the ``to be patched'' location. For the {\super SUPER INTERSEG1} through
-{\super SUPER INTERSEG12} records, the segment number is stored in the third
-byte of the ``to be patched'' location.
-
-\bodybody
-For example, if the example given in the discussion of the {\super INTERSEG}
-record were instead referenced through a {\super SUPER INTERSEG1} record, the
-value {\text\$0345} (the offset of the subroutine referenced) would be stored
-at offset {\text\$0721} in the load segment (the offset of the instruction's
-operand). The segment number ({\text\$0A}) would be stored at offset
-{\text\$0723}, as follows:
-
-\smallskip
-
-\bodybody
-{\text 4503 0A}
-
-{\bf Expressions}
-
-\description
-Several types of OMF records contain expressions. Expressions form an
-entremely flexible reverse-Polish stack language that can be evaluated
-by the linker to yeild numeric values such as addresses and labels. Each
-expression consists of a series of operators and operands together with
-the values on which they act.
-
-\description
-An operator takes one or two values from the evaluation stack, performs some
-mathematical or logical operation on them, and places a new value onto the
-evaluation stack. The final value on the evaluation stack is used as if it
-were a single value in the record. Note that this evaluation stack is
-purely a programming concept and does not relate to any hardware stack in
-the computer. Each operation is stored in the object module file in postfix
-form; that is, the value or values come first, followed by the operator.
-For example, since a binary operation is stored as {\textsl Value1 Value2
-Operator}, the operation {\textsl Num1 minus Num2} is stored as
-
-\description
-{\text Num1Num2$-$}
-
-\description
-The operators are as follows:
-
-\note{\bull}{Binary math operators:} These operators take two numbers (as
-two's-complement signed integers) from the top of the evaluation stack,
-perform the specified operation, and place the single-integer result back
-on the evaluation stack. The binary math operators include:
-
-\medskip\begingroup\parskip=0pt
-\operator{\$01}{addition}{$+$}
-\operator{\$02}{subtraction}{$-$}
-\operator{\$03}{multiplication}{$*$}
-\operator{\$04}{division}{$/$, {\text DIV}}
-\operator{\$05}{integer remainder}{$//$, {\text MOD}}
-\operator{\$06}{bit shift}{$<<$, $>>$}
-\endgroup
-
-\notenote
-The subtraction operator subtracts the second number from the first number.
-The division operator divides the first number by the second number. The
-integer-remainder operator divides the first number by the second number
-and returns the unsigned integer remainder to the stack. The bit-shift
-operator shifts the first number by the number of bit positions specified
-by the second number. If the second number is positive, the first number
-is shifted to the left, filling vacated bit positions with 0's (arithmetic
-shift left). If the second number is negative, the first number is shifted
-right, filling vacated bit positions with 0's (logical shift right).
-
-\note{\bull}{Unary math operator:} A unary math operator takes a number as
-a two's-complement signed integer from the top of the evaluation stack,
-performs the operation on it, and places the integer result back on the
-evaluation stack. The only unary math operator currently available is
-
-\medskip\begingroup\parskip=0pt
-\operator{\$06}{negation}{$-$}
-\endgroup
-
-\note{\bull}{Comparison operators:} These operators take two numbers as
-two's-complement signed integers from the top of the evaluation stack,
-perform the comparison, and place the single-integer result back on the
-evaluation stack. Each operator compares the second number in the stack
-(TOS - 1) with the number at the top of the stack (TOS). If the comparison
-is TRUE, a 1 is placed on the stack; if FALSE, a 0 is placed on the stack.
-The comparison operators include
-
-\medskip\begingroup\parskip=0pt
-\operator{\$0C}{less than or equal to}{$<=$, $\le$}
-\operator{\$0D}{greater than or equal to}{$>=$, $\ge$}
-\operator{\$0E}{not equal}{$<>$, $\ne$, {\text !=}}
-\operator{\$0F}{less than}{$<$}
-\operator{\$10}{greater than}{$>$}
-\operator{\$11}{equal to}{$=$ or $==$}
-\endgroup
-
-\note{\bull}{Binary logical operators:} These operators take two numbers as
-Boolean values from the top of the evaluation stack, perform the operation,
-and place the single Boolean result back on the stack. Boolean values are
-defined as being FALSE for the number 0 and TRUE for any other number.
-Logical operators always return a 1 for TRUE. The binary logical operators
-include
-
-\medskip\begingroup\parskip=0pt
-\operator{\$08}{AND}{$**$, {\text AND}}
-\operator{\$09}{OR}{$++$, {\text OR}, $\vert$}
-\operator{\$0A}{EOR}{$--$, {\text XOR}}
-\endgroup
-
-\note{\bull}{Unary logical operator:} A unary logical operator takes a
-number as a Boolean value from the top of the evaluation stack, performs
-the operation on it, and places the Boolean result back on the stack. The
-only unary logical operator currently available is
-
-\medskip\begingroup\parskip=0pt
-\operator{\$0B}{NOT}{$\neg$, {\text NOT}}
-\endgroup
-
-\note{\bull}{Binary bit operators:} These operators take two numbers as
-binary values from the top of the evaluation stack, perform the operation,
-and place the single binary result back on the stack. The operations are
-performed on a bit-by-bit basis. The binary bit operators include
-
-\medskip\begingroup\parskip=0pt
-\operator{\$12}{Bit AND}{logical AND}
-\operator{\$13}{Bit OR}{inclusive OR}
-\operator{\$14}{Bit EOR}{exclusive OR}
-\endgroup
-
-\note{\bull}{Unary bit operator:} This operator takes a number as a binary
-value from the top of the evaluation stack, performs the operation on it,
-and places the binary result back on the stack. The unary bit operator is
-
-\medskip\begingroup\parskip=0pt
-\operator{\$15}{Bit NOT}{complement}
-\endgroup
-
-\note{\bull}{Termination operator:} All expressions end with the termination
-operator \$00.
-
-\description
-An {\bf operand} causes some value, such as a constant or a label, to be
-loaded onto the evaluation stack. The operands are as follows:
-
-\note{\bull}{Location-counter operand (\$80):} This operand loads the value
-of the current location counter onto the top of the stack. Because the
-location counter is loaded before the bytes from the expression are placed
-into the code stream, the value loaded is the value of the location counter
-before the expression is evaluated.
-
-\note{\bull}{Constant operand (\$81):} This operand is followed by a number
-that is loaded on the top of the stack. If the size of the number is not
-specified, its length is specified by the {\omf numlen} field in the
-segment header.
-
-\note{\bull}{Label-reference operands (\$82-\$86):} Each of these operand
-codes is followed by the name of a label and is acted on as follows:
-
-\expr{\$82} Weak reference (see the note below).
-
-\expr{\$83} The value assigned to the label is placed on the top of the
-stack.
-
-\expr{\$84} The length attribute of the label is placed on the top of the
-stack.
-
-\expr{\$85} The type attribute of the label is placed on the top of the
-stack. (Type attributes are listed in the discussion of the {\omf GLOBAL}
-record in the section ``{\bf Segment Body}'' earlier).
-
-\expr{\$86} The count attribute is placed on the top of the stack. The
-count attribute is 1 if the label is defined and 0 if it is not.
-
-\note{\bull}{Relative offset operand (\$87):} This operand is followed by a
-number that is treated as a displacement from the start of the segment. Its
-value is added to the value that the location counter had when the segment
-started, and the result is loaded on the top of the stack.
-
-\medskip
-
-\note{$\diamond$}{\it Note:} The operand code \$82 is referred to as the
-weak reference. The weak reference is an instruction to the linker that
-asks for the value of a label, if it exists. It is not an error if the
-linker cannot find the label. However, the linker does not load a segment
-from a library if only weak references to it exist. If a label does not
-exist, a 0 is loaded onto the top of the stack. This operand is generally
-used for creating jump tables to library routines that may or may not
-be needed in a particular program.
-
-\vfill\eject
-
-\bye
+ END OF ARCHIVE
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads