blitz -h
========================================
=====
=====
===== The BLITZ Machine Emulator =====
=====
=====
========================================
Copyright
2001-2007, Harry H. Porter III
========================================
Original Author:
02/05/01 - Harry H. Porter
III
Command
Line Options
====================
These command line options may be given
in any order.
filename
The input
executable file. If missing,
"a.out" will be used.
-h
Print
this help info. Ignore other
options and exit.
-d filename
Disk file
name. If missing, "DISK"
will be used.
-g
Automatically begin emulation of the a.out program, bypassing
the command
line interface.
-i filename
Terminal
input file name. If missing,
"stdin" will be used.
-o filename
Terminal
output file name. If missing,
"stdout" will be used.
-r integer
Set the
random seed to the given integer, which must be > 0.
-raw
User
input for BLITZ terminal I/O will be in "raw" mode; the
default
is "cooked", in which case the running BLITZ code
is
relieved from echoing keystrokes, processing backspaces, etc.
-wait
This option
applies only when input is coming from an interactive
terminal
and a 'wait' instruction is executed with no other pending
interrupts. Without this
option, execution will halt; with it the
emulator
will wait for input.
kpl -h
==============================
=====
=====
===== The KPL Compiler =====
=====
=====
==============================
Copyright
2002-2007, Harry H. Porter III
========================================
Original Author:
06/15/02 - Harry H. Porter
III
Modifcations by:
03/15/06 - Harry H. Porter
III
Command
Line Options
====================
Command line options may be given in
any order.
-h
Print this help
info. All other options are
ignored.
packageName
Compile the
package with this name. The input
will come from the files
called
"packageName.h" and "packageName.c". No extension should be
given on the
command line. Only one package may
be compiled at once.
The packageName
is required.
-d directoryPrefix
When looking
for header and code files, the default is to look in the
current
directory. With this option, the
current directory is first
searched. If that fails, then the directoryPrefix
is prepended to the
file name and
the resulting file name is used.
For example:
kpl myPack
-d ~harry/BlitzLib/
will first try
to open "myPack.h" and, if that fails, will try to open
"~harry/BlitzLib/myPack.h".
-unsafe
Allow unsafe
language constructs.
-o filename
If there are no
errors, an assembly code file will be created. This
option can be
used to give the output file a specific name. If
missing, the
name of the output file will be computed from the name of
the package and
appending ".s". For
example:
myPackage --> myPackage.s
COMPILER
DEBUGGING: If packageName and output filename are missing,
stdout will be
used.
-testLexer
COMPILER
DEBUGGING: Scan tokens only, and print tokens out. Input may
come from
stdin.
-testParser
COMPILER
DEBUGGING: Parse program only, and print data structures out.
Input may come
from stdin.
-s
COMPILER
DEBUGGING: Print the symbol table on stdout.
-p
COMPILER
DEBUGGING: Pretty-print the AST.
-ast
COMPILER
DEBUGGING: Dump the full AST.
asm -h
=================================
=====
=====
===== The BLITZ Assembler =====
=====
=====
=================================
Copyright
2000-2007, Harry H. Porter III
========================================
Original Author:
11/12/00 - Harry H. Porter
III
Modifcations by:
03/15/06 - Harry H. Porter
III
04/25/07 - Harry H. Porter
III - Support for little endian added
Command
Line Options
====================
Command line options may be given in
any order.
filename
The input
source will come from this file.
(Normally this file
will end with
".s".) If an input file
is not given on the command
line, the
source must come from stdin. Only
one input source is allowed.
-h
Print this help
info. All other options are
ignored.
-l
Print a listing
on stdout.
-s
Print the
symbol table on stdout.
-d
Print internal
assembler info (for debugging asm.c)
-o filename
If there are no
errors, an object file will be created.
This
option can be
used to give the object file a specific name.
If this option
is not used, then the input .s file must be named on
the command
line (i.e., the source must not come from stdin.) In this
case, the name
of the object file will be computed from the name of
the input file
by removing the ".s" extension, if any, and appending
".o". For
example:
test.s --> test.o
foo
--> foo.o
Lexical
issues:
===============
Identifiers - May contain letters,
digits, and underscores. They must
begin with a letter or
underscore. Case is
significant. Identifiers
are limited in length to
200 characters.
Integers - May be specified in decimal
or in hex.
Integers must range from 0
to 2147483647. Hex notation is,
for
example, 0x1234abcd. 0x1234ABCD is equivalent. Shorter numbers like
0xFFFF are not
sign-extended.
Strings - Use double quotes. The following escape sequences are
allowed:
\0 \a \b \t \n \v \f \r \" \' \\ \xHH
where HH are any two hex
digits. Strings may not contain
newlines directly;
in other words, a
string may not span multiple
lines. The source file may
not contain unprintable
ASCII characters; use the escape sequences if you
wish to include unprintable
characters in string or character constants.
String constants are
limited in length to 200 characters.
Characters - Use single quotes. The same escape sequences are allowed.
Comments - Begin with the exclamation
mark (!) and extend thru end-of-line.
Punctuation symbols - The following
symbols have special meaning:
, [
] : .
+ ++ -
-- * /
<< >> >>> & | ^
~ ( )
=
Keywords - The following classes of
keywords are recognized:
BLITZ instruction op-codes
(e.g., add, sub, syscall, ...)
Synthetic instructions
(e.g., mov, set, ...)
Assembler pseudo-ops (e.g., .text, .import, .byte,
...)
Registers (r0, r1, ... r15)
White space - Tabs and space characters
may be used between tokens.
End-of-line - The EOL (newline)
character is treated as a token, not
as white space; the EOL is
significant in syntax parsing.
Assembler
pseudo-ops
====================
.text The following instructions and data will be
placed in the
"text" segment, which will be read-only during execution.
.data The following instructions and data will be
placed in the
"data" segment, which will be read-write during execution.
.bss The following bytes will be reserved in
the "bss" segment,
which
will be initialized to zero at program load time.
.ascii This operand expects a single string operand. These bytes
will
be loaded into memory. Note that
no terminating NULL
('\0')
character will be added to the end of the string.
.byte This pseudo-op expects a single expression as an
operand.
This
expression will be evaluated at assembly time, the value
will
be truncated to 8 bits, and the result used to initialize
a
single byte of memory.
.word This pseudo-op expects a single expression as an
operand.
This
expression will be evaluated at assembly time to a
32 bit
value, and the result used to initialize four bytes
of
memory. The assembler does not
require alignment for .word.
.double This pseudo-op expects a single floating-point constant as
an
operand. Examples include
1.2, -3.4E-21, and +4.5e+21.
.export This pseudo-op expects a single symbol as an operand. This
symbol
must be given a value in this file.
This symbol with
its value
will be placed in the object file and made available
during
segment linking.
.import This pseudo-op expects a single symbol as an operand. This
symbol
must not be given a value in this file; instead it will
receive its value from another .s file during segment linking.
All
uses of this symbol in this file will be replaced by that
value
at segment-link time.
.skip This pseudo-op expects a single expression as an
operand.
This
expression must evaluate to an absolute value. The
indicated number of bytes will be skipped in the current
segment.
.align This instruction will insert 0, 1, 2, or 3 bytes into
the
current segment as necessary to bring the location up to an
even
multiple of 4. No operand is used
with .align.
= Symbols may be given
values with a line of the following
format:
symbol = expression
These
are called "equates".
Equates will be processed
during
the first pass, if possible. If
not, they will be
processed after the program has been completely read in.
The
expression may use symbols that are defined later in the
file,
but this may cause the equate to be given a value
slightly later in the assembly.
After the first pass, an
attempt will be made to evaluate all the equates. At this
time,
errors may be generated. After the
equates have been
processed, the machine code can be generated in the final
pass.
Segments
========
This assembler is capable of assembling
BLITZ instructions and data
and placing them in one of three
"segments":
.text
.data
.bss
At run-time, the bytes placed in the
.text segment will be read-only.
At run-time, the bytes places in the
.data segment will be read-write.
At run-time, the bytes places in the
.bss segment will be read-write.
The read-only nature of the bytes in
the .text segment may or may not
be enforced by the operating system at
run-time.
Instructions and data may be placed in
either the .text or .data
segment. No instructions or data may be placed in the .bss segment.
The only things that may follow the
.bss pseudo-op are the following
pseudo-ops:
.skip
.align
The assembler may reserve bytes in the
.bss segment but no initial
values may be placed in these
locations. Instead, all bytes of
the
.bss segment will be initialized to
zeros at program-load time. These
addresses may be initialized and
modified during program execution.
Segment control is done using the
following pseudo-ops:
.text
.data
.bss
After any one of these pseudo-ops, all
following instructions and data
will be placed in the named
segment. A "location
counter" for each of
the three segments is maintained by the
assembler. If, for example, a
.text pseudo-op has been used to switch
to the ".text" segment, then
all subsequent instructions will be
placed in the ".text" segment.
Any labels encountered will be be given
values relative to the
".text" segment. As each instruction is encountered, the
location
counter for the ".text"
segment will be incremented. If a
.data
pseudo-op is the encountered, all
subsequent instructions will be placed
in the ".data" segment. The location counters are not
reset; if a
.text pseudo-op is again encountered,
subsequent instructions will be
placed in the ".text" segment
following the instructions encountered
earlier, before the .data pseudo-op was
seen. Thus, we can "pick
up"
in the .text segment where we left off.
Symbols
=======
The assembler builds a symbol table,
mapping identifiers to values.
Each symbol is given exactly one value:
there is no notion of scope
or lexical nesting levels, as in
high-level languages. Each symbol
is given a value which will be either:
absolute
relative
external
An absolute value consists of a 32-bit
quantity. A relative value
consists of a 32-bit (signed) offset
relative to either a segment
or to an external symbol. An external symbol will have its value
assigned in some other assembly file
and its value will not be
available to the code in this file
until segment-linking time.
However,
an external symbol may be used in
expressions within this file; the
actual data will not be filled in until
segment-linking time.
Symbols may be defined internally or
externally. If a symbol is used
in this file, but not defined, then it
must be "imported" using
the .import pseudo-op. If a symbol is defined in this file and
used
in other files, then it must be
"exported" using an .export
pseudo-op. If a symbol is not exported, then its value will not be
known to the linker; if this same
symbol is imported in other files,
then an "undefined symbol"
error will be generated at segment-linking
time.
Symbols may be defined in either of two
ways:
labels
= equates
If a symbol is defined by being used as
a label, then it is given a
value which consists of an offset
relative to the beginning of whichever
segment is current when the label is
encountered. This is determined by
whether a .text, .data, or .bss
pseudo-op was seen last, before the label
was encountered. Each label occurs in a segment and
names a location in
memory. At segment-link time, the segments are placed in their final
positions in memory. Only at segment-link time does the
actual address of
the location in memory become
known. At this time, the label is
assigned
an absolute value.
Expression
Evaluation
=====================
Instructions and pseudo-ops may contain
expressions in their operands.
Expressions have the form given by the
following Context-Free Grammar.
(In this grammar, the following
meta-notation is used: characters
enclosed in double quotes are
terminals. The braces { } are used
to
mean "zero or more"
occurences. The vertical bar | is
used to mean
alternation. Parentheses are used for grouping. The start symbol
is "expr".)
expr ::= expr1 { "|" expr1 }
expr1 ::= expr2 {
"^" expr2 }
expr2 ::= expr3 {
"&" expr3 }
expr3 ::= expr4 { (
"<<" | ">>" | ">>>" ) expr4
}
expr4 ::= expr5 { (
"+" | "-" ) expr5 }
expr5 ::= expr6 { (
"*" | "/" | "%" ) expr6 }
expr6 ::= "+"
expr6 | "-" expr6 | "~" expr6
| ID | INTEGER | STRING | "(" expr ")"
This syntax results in the following
precedences and associativities:
highest: unary+ unary- ~
(right associative)
* /
%
(left associative)
+ -
(left associative)
<< >> >>> (left
associative)
&
(left associative)
^
(left associative)
lowest: |
(left associative)
If a string is used in an expression,
it must have exactly 4 characters.
The string will be interpreted as a 32
bit integer, based on the ASCII
values of the 4 characters. ("Big Endian" order is used:
the first
character will determine the most
significant byte.)
The following operators are recognized
in expressions:
unary+ nop
unary- 32-bit signed arithmetic
negation
~ 32-bit logical
negation (NOT)
* 32-bit
multiplication
/ 32-bit integer
division with 32-bit integer result
% 32-bit modulo,
with 32-bit result
binary+ 32-bit signed addition
binary- 32-bit signed subtraction
<<
left shift logical (i.e., zeros shifted in from right)
>>
right shift logical (i.e., zeros shifted in from left)
>>> right
shift arithmetic (i.e., sign bit shifted in on left)
&
32-bit logical AND
^ 32-bit logical
Exclusive-OR
| 32-bit logical OR
With the shift operators (<<,
>>, and >>>) the second operand must
evaluate to an integer between 0 and
31. With the division operators
(/ and %), the first operand must be
non-negative and the second
operand must be positive, since these
operators are implemented with
"C" operators, which are
machine-dependent with negative operands.
All operators except addition and
subtraction require both operands to
evaluate to absolute values. All arithmetic is done with signed
32-bit
values. The addition operator + requires that at least one of the
operands
evaluates to an absolute value. If one operand is relative, then the
result will be relative to the same
location. The subtraction operator
requires that the second operand
evaluates to an absolute value. If
the
first operand is relative, then the
result will be relative to the same
location. Only absolute values can be negated.
All expressions are evaluated at
assembly-time. An expression may
evaluate to either an absolute 32-bit
value, or may evaluate to a
relative value. A relative value is a 32-bit offset
relative to some
some symbol. The offset will
be relative to the beginning of the .text
segment, the .data segment, or the .bss
segment, or the offset will be
relative to some external symbol. If the expression evaluates to a
relative value, its value will not be
determined until segment-link
time. At this time, the absolute locations of the .text, .data,
and
.bss segments will be determined and
the absolute values of external
symbols will be determined. At segment-link time, the final,
absolute
values of all expressions will be
determined by adding the values of the
symbols (or locations of the segments)
to the offsets.
Expressions may be used in:
.byte
.word
.skip
=
various BLITZ instructions
The .skip pseudo-op requires the
expression evaluates to an absolute value.
In the case of an = (equate) pseudo-op,
the expression may evaluate to
either a relative or absolute
value. In either case, the equated
symbol
will be given a relative or absolute
value (respectively). At segment-
linking time, when the actual value is
determined, the value will be
filled in in the byte, word, or appropriate
field in the instruction.
Instruction
Syntax
==================
Each line in the assembly source file
has the following general syntax:
[ label: ] [ opcode operands ] [ "!" comment
] EOL
The label is optional. It need not begin in column one. It must be
followed by a colon token. A label may be on a line by
itself. If
so, it will be given an offset from the
current value of the location
counter, relative to the current
segment.
The opcode must be a legal BLITZ instruction. The opcode is given in
lowercase. The exact format of the operands depends on the instruction;
some BLITZ instructions take no
operands while some require several
operands. Operands are separated by
commas.
A comment is optional and extends to
the end of the line if present.
Each line is independent. End-of-line (EOL) is a separate
token. An
instruction must be on only one line,
although lines may be arbitrarily long.
Assembler pseudo-ops have the same
general syntax. Some permit labels
and others forbid labels.
The following formatting and spacing
conventions are recommended:
Labels should begin in
column 1.
The op-code should be
indented by 1 tab stop.
The operands, if any,
should be indented by 1 additional tab stop.
Each BLITZ instruction
should be commented.
The comment should be
indented by 2 additional tab stops.
A single space should
follow the ! comment character.
Block comments should occur
before each routine.
Comments should be indented
with 2 spaces to show logical organization.
Here is an example of the recommended
style for BLITZ assembly code.
(The first line shows standard tab
stops.)
1 t t t t t t
! main ()
!
! This routine does such and such.
!
.text
.export main
main: push r1
! Save registers
push r2
! .
loop:
! LOOP
cmp
r1,10 ! IF r1>10 THEN
ble
endif
! .
sub
r2,1,r2
! r2--
endif:
! ENDIF
sub
r1,r2,r3
! r3 := r1-r2
...
Labels
======
A label must be followed by a colon
token, but the colon is not part of
the label. A label may appear on a line by itself or the label may
appear
on a line containing a BLITZ
instruction or one of the following pseudo-ops:
.ascii .byte .word .skip
Labels are not allowed on any other
assembler pseudo-ops.
The label will define a new symbol, and
the symbol will be given an
offset relative to the beginning of the
current segment. Labels defined
in the current file may be exported and
labels defined in other files may
be imported. A label will name an address in memory, and as such a label
cannot be given a final value until
segment-linking time. During the
assembly of the current file, labels in
the file are given offsets relative
to either the beginning of the .text,
.data, or .bss segments.
Operand
Syntax
==============
See the BLITZ instruction reference
manual for details about what
operands each instruction
requires. Operands are separated
by
commas. Registers are specified in lowercase (e.g., r4). A memory
reference may be in one of the
following forms, although not all forms
are allowed in all instructions. (Here "R" stands for any
register.)
[R]
[R+R]
[R+expr]
[expr]
[--R]
[R++]
Some instructions allow data to be
included directly; in such cases
the operand will consist of an
expression. The expression may
evaluate
to an absolute or relative value. Certain instructions (like jmp, call,
and the branch instructions) require
the operand to be relative to the
segment in which the instruction
occurs.
Here are several sample instructions to
illustrate operand syntax:
add
r3,r4,r5
mul
r7,size,r7
sub r1,
((x*23) << (y+1)), r1
call foo
push r6,[--r14]
pop
[r14++],r6
load [r3],r9
load [r3+r4],r9
load
[r3+arrayBase],r9
load [x],r9
jmp r3
bne loop
set
0x12ab34cd,r8
syscall 3
reti
tset [r4],r9
ldptbr r5
Note that whenever an instruction reads
or writes memory, brackets are
used.
lddd -h
==============================
=====
=====
===== The BLITZ Linker =====
=====
=====
==============================
Copyright
2000-2007, Harry H. Porter III
========================================
Original Author:
12/29/00 - Harry H. Porter
III
Modifcations by:
03/15/06 - Harry H. Porter
III
04/27/07 - Harry H. Porter
III - Support for little endian added
Command
Line Options
====================
These command line options may be given
in any order.
filename1 filename2
filename3 ...
The input
object files, which will normally end with ".o".
There
must be at least one input file.
-h
Print
this help info. Ignore other
options and exit.
-o filename
If there
are no errors, an executable file will be created. This
option
can be used to give the object file a specific name.
If this
option is not used, then the output file will be named
"a.out".
-l
Print a
listing on stdout.
-s
Print the
symbol table on stdout.
-p integer
The page
size. The integer must be a
multiple of 4 greater than
zero. (The default is 8192
= 8K.)
-a integer
The
logical address at which to load the program at run-time.
The
integer must be a non-negative multiple of the page size.
(The
default is 0.)
dumpObj -h
================================================
=====
=====
===== The BLITZ Object File Dump Program =====
=====
=====
================================================
Copyright
2000-2007, Harry H. Porter III
========================================
Original Author:
11/12/00 - Harry H. Porter
III
Modifcations by:
03/15/06 - Harry H. Porter
III
04/30/07 - Harry H. Porter
III - Support for little endian added
Overview
========
This program prints out a BLITZ
".o" or "a.out" file in human-readable
form. This program does some (very limited) error checking on the
file.
Command
Line Options
====================
Command line options may be given in
any order.
-h
Print this
info. The input source is ignored.
filename
The input
source will come from this file.
(This file should be a
".o"
or "a.out" file.) If an
input file is not named on the command
line, the
source must come from stdin. Only
one input source is allowed.
diskUtil -h
========================================
=====
=====
===== The BLITZ Disk Utility =====
=====
=====
========================================
Copyright
2004-2007, Harry H. Porter III
========================================
Original Author:
10/07/04 - Harry H. Porter
III
Modifications by:
04/30/07 - Harry H. Porter
III - Support for little endian added
This
command can be used to manipulate the BLITZ "DISK" file.
The BLITZ
emulator simulates the BLITZ disk using a Unix file on the host
machine. This program allows that file to be
manipulated. For example,
it can be
used to copy an executable file containing a user program to the
BLITZ disk
so that the BLITZ OS kernel can then access, load, and run it.
The BLITZ
DISK is organized as follows. The
disk contains a single directory
and this
is kept in sector 0. The files are
placed sequentially on the
disk, one
after the other. Each file will
take up an integral number of
sectors. Each file has an entry in the directory. Each entry contains
(1) The starting sector
(2) The file length, in bytes (possibly
zero)
(3) The number of characters in the file
name
(4) The file name
The
directory begins with three numbers:
(1) Magic Number (0x73747562 =
"stub")
(2) Number of files (possibly zero)
(3) Number of the next free sector
These are
followed by the entries for each file.
Once
created, a BLITZ file may not have its size increased. When a file is
removed,
the free sectors become unusable; there is no compaction or any
attempt to
reclaim the lost space.
Each time
this program is run, it performs one of the following functions:
Initialize set up a new file system on the BLITZ
disk
List
list the directory on the BLITZ disk
Create create a new
file of a given size
Remove remove a file
Add
copy a file from Unix to BLITZ
Extract copy a file from
BLITZ to Unix
Write write
sectors from a Unix file to the BLITZ disk
The
following command line options tell which function is to be performed:
-h
Print this help info.
Ignore other options and exit.
-d DiskFileName
The
file used to emulate the BLITZ disk.
If missing, "DISK" will be used.
-i
Initialize the file system
on the BLITZ "DISK" file.
This will
effectively remove all files on the BLITZ disk and reclaim all available
space.
-l
List the directory on the BLITZ disk.
-c BlitzFileName SizeInBytes
Create
a file of the given size on the BLITZ disk. The BLITZ
disk must not already contain a file with this name. Only the
directory will be modified; the actual data in the file will be
whatever bytes happened to be on the disk already.
-r BlitzFileName
Remove the file with the given name from the directory on the BLITZ
disk.
-a UnixFilename BlitzFileName
Copy a file from Unix to the BLITZ disk. If BlitzFileName already
exists, it must be large enough to accomodate the new data.
-e BlitzFileName UnixFileName
Extract a file from the BLITZ disk to Unix. This command will copy
the
data from the BLITZ disk to a Unix file.
The Unix file may or may
not
already exist; its size will be shortened or lengthened as necessary.
-w UnixFileName SectorNumber
The
UnixFileName must be an existing Unix file. The SectorNumber is an
integer. The Unix file data
will be written to the BLITZ disk,
starting
at
sector SectorNumber. The directory
will not be modified.
-v
Verbose; print lots of messages.
Only one
of -i, -l, -c, -r, -a, -e, or -w may be used at a time.