1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
.. RST source for xexsplit(1) man page. Convert with:
.. rst2man.py xexsplit.rst > xexsplit.1
.. rst2man.py comes from the SBo development/docutils package.
.. TODO: add -n option (same as -v, but no output)?
========
xexsplit
========
--------------------------------------------------------------------------------------
Split a multi-segment Atari 8-bit executable (XEX) into multiple single-segment files.
--------------------------------------------------------------------------------------
.. include:: manhdr.rst
SYNOPSIS
========
*xexsplit* [*-hvr*] *infile.xex* [*outfile-prefix*]
DESCRIPTION
===========
xexsplit reads an Atari executable (XEX/BIN/COM/etc) from *infile* and
writes each segment to a separate file. To read from standard input,
infile may be omitted, or given as **-**.
Output files are named **outfile-prefix.NNN.SSSS.EEEE.EXT**, where
**NNN** is the segment number (decimal, 3 digits, with leading
zeroes), **SSSS** is the start address of the segment (4 digits,
hex), **EEEE** is the end address of the segment (4 digits, hex),
and **EXT** is *.xex* for .xex output or *.bin* for raw (**-r**)
output. If *outfile-prefix* is omitted, the default prefix is the
input filename.
By default, each output file is a valid single-segment Atari
executable, including the required *$FFFF* header. They may be joined
back together (possibly after being modified) with xexcat or plain old
**cat**\(1).
OPTIONS
=======
-r
Raw output: the output files will just contain the data from each
segment, without the *$FFFF* header, start, and end addresses.
Useful for feeding the results to tools like disassemblers that
don't understand the .xex format.
-h
Print a short help message and exit.
-v
Verbose operation. Each segment's information is printed to
standard error, including start/end address and length.
NOTES
=====
The terms "Atari executable", "binary load file", and "XEX file"
all refer to the same thing. Also, there is no difference between
Atari executables named with "XEX", "COM", "BIN", "EXE", etc. The
Atari and its DOS don't care about the names, only the contents.
It is not possible to use **-** to write to standard output. This makes
sense, because there's no way to write multiple, separate files to stdout.
The output filenames were chosen so they will sort in the order they
were created, when used with the shell's globbing. This means that you
can join them back into a single valid XEX file with a command like::
cat prefix.* > joined.xex
or use **xexcat**\(1) instead of **cat**::
xexcat -o joined.xex prefix.*
The Atari binary load format requires the *$FFFF* header only for
the first segment in a file. The second and subsequent segments may
also have a *$FFFF* header, but it's optional. **xexsplit**'s output
files will always have the *$FFFF* header, regardless of whether
the segments in the original file had it or not (in fact, **xexsplit**
can handle an invalid XEX file which is missing the initial $FFFF
header for the first segment).
A segment starting at address **$02E2** contains an init address.
During loading, Atari DOSes JSR to the init address immediately
after its segment has loaded. Init addresses are optinal; there's no
rule that says that every file has to have one. It's also normal
and fairly common for there to be several init addresses in a
multi-segment file. An init address segment is normally located
right after the code segment it's intended to run, but this is not
a requirement.
A segment starting at address **$02E0** contains a run address.
After all segments have been loaded, Atari DOSes JSR to the run
address to run the program just loaded. The run address is optional;
a file containing no run address segment will simply be loaded into
memory and not executed (user will be returned to the DOS menu).
It's legal for a multi-segment file to contain multiple run
address segments, but only the last run address will actually be
used. Normally, there is only one run address; if there are more than
one, only the last one is used. The run address is normally the last
segment in the file, but this is not a requirement.
Attempting to run a single-segment file consisting of a run or init
address only, will generally crash the Atari.
Some Atari executables contain raw blocks of data, which are meant
to be read into memory by the init routine. These blocks do not
have start/end address headers, so **xexsplit** is unable to handle
them. Raw data blocks usually occur in files created with "packer"
or "compressor" programs, or occasionally in other large programs
(Turbo BASIC is an example). Raw data blocks are generally found just
after an init address segment. If you have an executable that loads
just fine on a real Atari or emulator, but fails with **xexsplit**,
a raw data block is usually the reason why.
.. other sections we might want, uncomment as needed.
.. FILES
.. =====
.. ENVIRONMENT
.. ===========
.. EXIT STATUS
.. ===========
.. BUGS
.. ====
.. EXAMPLES
.. ========
.. include:: manftr.rst
|