Added Cpmtris
This commit is contained in:
parent
36f5f5207d
commit
2ca3187553
14
cpmtris/Makefile
Normal file
14
cpmtris/Makefile
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# makefile for cpmtris
|
||||||
|
|
||||||
|
all: cpmtris.com
|
||||||
|
|
||||||
|
SRC=cpmtris.z rand.z conio.z
|
||||||
|
|
||||||
|
cpmtris.com: $(SRC)
|
||||||
|
cat $(SRC) >out.z
|
||||||
|
zmac/zmac out.z
|
||||||
|
mv out.bin cpmtris.com
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) *~ *.lst *.bin out.z
|
||||||
|
|
45
cpmtris/README.md
Normal file
45
cpmtris/README.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# cpmtris
|
||||||
|
|
||||||
|
A Tetris clone for Z80-based CP/M machines
|
||||||
|
(c) 1996,1999 Russell Marks, GPLv2
|
||||||
|
|
||||||
|
Originally part of the ZCN repository: https://github.com/jamesots/zcn
|
||||||
|
|
||||||
|
I modified cpmtris so that "vt100" and "8 MHz" are the default values.
|
||||||
|
|
||||||
|
``cpmtris.com`` is the assembled binary that uses these settings.
|
||||||
|
|
||||||
|
See README.orig for full documentation.
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
|
||||||
|
| Action | Key |
|
||||||
|
| ---------- | --- |
|
||||||
|
| Rotate | s |
|
||||||
|
| Left/Right | k/l |
|
||||||
|
| Drop | d |
|
||||||
|
|
||||||
|
## Command-Line Options
|
||||||
|
|
||||||
|
``cpmtris [termtype [mhz*10]]``
|
||||||
|
|
||||||
|
``termtype`` specifies the terminal type:
|
||||||
|
|
||||||
|
| Type | Terminal |
|
||||||
|
| ---- | --------------------------- |
|
||||||
|
| 0 | as defined in patch area |
|
||||||
|
| 1 | VT100 (default) |
|
||||||
|
| 2 | VT52 (PCW, +3, etc.) |
|
||||||
|
| 3 | ZCN (this is auto-detected) |
|
||||||
|
| 4 | VC404 |
|
||||||
|
|
||||||
|
``mhz*10`` defines the speed of the machine "times 10", e.g. for a
|
||||||
|
3.5 MHz machine, use "35" or for 8 MHz (default) use "80".
|
||||||
|
|
||||||
|
E.g.: ``cpmtris 1 80`` for a VT100 8 MHz machine, which is the default.
|
||||||
|
|
||||||
|
## ZMAC
|
||||||
|
|
||||||
|
The ZMAC Z80 macro assembler, which is used for cpmtris, is also available in the ``zmac/`` folder.
|
||||||
|
When assembling cpmtris using the Makefile, zmac is used (but needs to be compiled first)
|
||||||
|
|
101
cpmtris/README.orig
Normal file
101
cpmtris/README.orig
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
* -*- outline -*-
|
||||||
|
|
||||||
|
Cpmtris v1.1 - (c) 1996,1999 Russell Marks
|
||||||
|
|
||||||
|
A tetris clone for Z80-based CP/M machines.
|
||||||
|
|
||||||
|
|
||||||
|
* License
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
[The GNU GPL is in the file 'COPYING'.]
|
||||||
|
|
||||||
|
|
||||||
|
* About cpmtris
|
||||||
|
|
||||||
|
Cpmtris is a free tetris clone for CP/M machines. It works as is on
|
||||||
|
VT52s (PCW and +3) and ZCN boxes, works with VT100s with 'cpmtris 1',
|
||||||
|
and is patchable for other machines and terminals.
|
||||||
|
|
||||||
|
It's a conversion of my Psion series 3 OPL tetris program, via my ZX81
|
||||||
|
tetris. Both are free like cpmtris, and available on request.
|
||||||
|
|
||||||
|
|
||||||
|
* Playing cpmtris
|
||||||
|
|
||||||
|
It's tetris. Surely you've played tetris!?
|
||||||
|
|
||||||
|
Ok, the basics. Blocks fall from the top of the screen. You have to
|
||||||
|
fit them together to make solid horizontal lines, as a horizontal line
|
||||||
|
of blocks disappears to make room for more blocks. And why is this the
|
||||||
|
case? Well, if the pile of blocks reaches the top of the screen, it's
|
||||||
|
game over. So it quickly gets important to fit the shapes together
|
||||||
|
well, and not leave any gaps.
|
||||||
|
|
||||||
|
You can rotate the blocks with 's', move them left or right with 'k'
|
||||||
|
and 'l', and 'drop' them with 'd'.
|
||||||
|
|
||||||
|
Cpmtris does not (yet) speed up. It starts pretty fast and stays that
|
||||||
|
way. If you want to play it faster, specify a MHz rating on the
|
||||||
|
command-line (see below) lower than your machine's actually is.
|
||||||
|
|
||||||
|
* Command-Line Options
|
||||||
|
|
||||||
|
In Unix terms, the synopsis (usage) is 'cpmtris [termtype [mhz10]]'.
|
||||||
|
|
||||||
|
If 'termtype' is specified, it must be a single digit corresponding to
|
||||||
|
a terminal type. If 'mhz10' is specified, it should be ten times the
|
||||||
|
speed (in MHz) of the Z80 the machine has. For example, on a 3.5MHz
|
||||||
|
machine you'd use '35'. You must have a 'termtype' specified to use
|
||||||
|
'mhz10'.
|
||||||
|
|
||||||
|
To explain this 'terminal type' stuff: It's traditional for
|
||||||
|
full-screen CP/M programs to either include a configuration program,
|
||||||
|
or (more usually) document patches which need to be made to support
|
||||||
|
different terminals. Cpmtris does have a patch area (100h-17fh), but
|
||||||
|
also has built-in support for a few terminals. These are:
|
||||||
|
|
||||||
|
Type Terminal
|
||||||
|
0 as defined in patch area
|
||||||
|
1 VT100
|
||||||
|
2 VT52 (PCW, +3, etc.) - this is the default
|
||||||
|
3 ZCN (this is auto-detected)
|
||||||
|
4 VC404
|
||||||
|
|
||||||
|
The idea behind being able to specify both terminal type and speed
|
||||||
|
when you run cpmtris is that it's more convenient if you sometimes use
|
||||||
|
your machine via a terminal or terminal emulator. With most programs
|
||||||
|
you have to devise some method of patching them when you want to use
|
||||||
|
something other than the default configuration. With cpmtris, if (for
|
||||||
|
example) I'm using my ZCN box via kermit on my Linux box - not
|
||||||
|
uncommon - then it's just a matter of using 'cpmtris 1'.
|
||||||
|
|
||||||
|
See the source (cpmtris.z) for details of the patch area.
|
||||||
|
|
||||||
|
|
||||||
|
* Acknowledgements
|
||||||
|
|
||||||
|
The original text-mode PC tetris game (which a surprising number of
|
||||||
|
people have never played, it seems). It's inspired more clones than
|
||||||
|
any other game since space invaders, I think. :-)
|
||||||
|
|
||||||
|
Rush's "Presto" album. I listened to it constantly while hacking up
|
||||||
|
cpmtris.
|
||||||
|
|
||||||
|
|
||||||
|
* Contacting the Author
|
||||||
|
|
||||||
|
You can email me at russell.marks@ntlworld.com.
|
65
cpmtris/conio.z
Normal file
65
cpmtris/conio.z
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
;conio - console I/O routines
|
||||||
|
;mostly just repackaged BDOS stuff
|
||||||
|
|
||||||
|
;for cpm zmac:
|
||||||
|
;ZZglobal putchar
|
||||||
|
;ZZglobal putbyte
|
||||||
|
;ZZglobal getchar
|
||||||
|
;ZZglobal getch
|
||||||
|
;ZZglobal kbhit
|
||||||
|
|
||||||
|
|
||||||
|
;putchar - put char in a
|
||||||
|
;puts CR before any LF output
|
||||||
|
;f corrupt, others preserved
|
||||||
|
putchar:
|
||||||
|
cp 10
|
||||||
|
jr nz,putbyte
|
||||||
|
ld a,13
|
||||||
|
call putbyte
|
||||||
|
ld a,10
|
||||||
|
;FALLS THROUGH
|
||||||
|
|
||||||
|
;putbyte - put char in a without translation
|
||||||
|
;preserves all regs
|
||||||
|
putbyte:
|
||||||
|
push af
|
||||||
|
push bc
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
ld e,a
|
||||||
|
ld c,2
|
||||||
|
call 5
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
|
pop af
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
;getchar - get char into a (without echo)
|
||||||
|
;preserves all but f
|
||||||
|
getch: ;same
|
||||||
|
getchar:
|
||||||
|
push bc
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
getchlp:
|
||||||
|
call kbhit
|
||||||
|
jr nc,getchlp
|
||||||
|
ld e,0ffh
|
||||||
|
ld c,6
|
||||||
|
call 5
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
;kbhit - like the common DOS C function
|
||||||
|
;returns c if key pressed, nc if not
|
||||||
|
kbhit:
|
||||||
|
ld c,11
|
||||||
|
call 5
|
||||||
|
rra
|
||||||
|
ret
|
BIN
cpmtris/cpmtris.com
Normal file
BIN
cpmtris/cpmtris.com
Normal file
Binary file not shown.
1379
cpmtris/cpmtris.z
Normal file
1379
cpmtris/cpmtris.z
Normal file
File diff suppressed because it is too large
Load Diff
96
cpmtris/rand.z
Normal file
96
cpmtris/rand.z
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
;rand - simple random number generator
|
||||||
|
;requires maths.z
|
||||||
|
;algorithm adapted from the one I used for 8086 kirsten.
|
||||||
|
|
||||||
|
;for cpm zmac:
|
||||||
|
;ZZglobal seed
|
||||||
|
;ZZglobal srand
|
||||||
|
;ZZglobal rand16
|
||||||
|
;ZZglobal rand
|
||||||
|
|
||||||
|
;uses these:
|
||||||
|
;ZZglobal multiply
|
||||||
|
;ZZglobal divide
|
||||||
|
|
||||||
|
|
||||||
|
seed: defb 'ZX81' ;don't ask :-)
|
||||||
|
|
||||||
|
|
||||||
|
;set random number seed from R
|
||||||
|
;entry: none, exit: none
|
||||||
|
;af/hl corrupt
|
||||||
|
srand:
|
||||||
|
ld a,r
|
||||||
|
ld h,a
|
||||||
|
ld a,r
|
||||||
|
ld l,a
|
||||||
|
ld (seed),hl
|
||||||
|
ld a,r
|
||||||
|
ld h,a
|
||||||
|
ld a,r
|
||||||
|
ld l,a
|
||||||
|
ld (seed+2),hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
;get random number in range 0 to hl-1 inclusive
|
||||||
|
;entry: hl=range size
|
||||||
|
;exit: hl=random number in range 0 to range_size-1
|
||||||
|
;af/bc/de corrupt
|
||||||
|
;this is equivalent to 'rand()%range_size' in C; the Linux 'rand'
|
||||||
|
;man page suggests this alternative if you need a better distribution,
|
||||||
|
;which may be a good idea for numbers bigger than a few thousand:
|
||||||
|
;
|
||||||
|
; > To ensure a good distribution for a subrange of values,
|
||||||
|
; > use code like the below:
|
||||||
|
; > i = RAND_MAX / my_range
|
||||||
|
; > i *= my_range
|
||||||
|
; > while ((j = rand()) >= i) continue;
|
||||||
|
; > return j % i;
|
||||||
|
; > (code example based on code from Karl Lehenbauer's fortune
|
||||||
|
; > cookie program, which credits Ken Arnold, Unix Review,
|
||||||
|
; > October 1987).
|
||||||
|
;
|
||||||
|
;replace rand() above with a call to rand16, and RAND_MAX with FFFFh.
|
||||||
|
;there are multiply/divide/mod routines in maths.z. Note that using the
|
||||||
|
;above algorithm will be significantly slower than calling this
|
||||||
|
;routine, probably half the speed at best.
|
||||||
|
rand:
|
||||||
|
push hl
|
||||||
|
call rand16
|
||||||
|
pop de
|
||||||
|
call divide
|
||||||
|
ex de,hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;get random number between 0 and 65535 inclusive
|
||||||
|
;entry: none
|
||||||
|
;exit: hl=random number
|
||||||
|
;af/bc/de corrupt
|
||||||
|
rand16:
|
||||||
|
ld hl,(seed+2)
|
||||||
|
ld d,l
|
||||||
|
add hl,hl
|
||||||
|
add hl,hl
|
||||||
|
ld c,h
|
||||||
|
ld hl,(seed)
|
||||||
|
ld b,h
|
||||||
|
rl b
|
||||||
|
ld e,h
|
||||||
|
rl e
|
||||||
|
rl d
|
||||||
|
add hl,bc
|
||||||
|
ld (seed),hl
|
||||||
|
ld hl,(seed+2)
|
||||||
|
adc hl,de
|
||||||
|
res 7,h
|
||||||
|
ld a,h
|
||||||
|
and 080h
|
||||||
|
jr nz,rand16a
|
||||||
|
inc h
|
||||||
|
rand16a:
|
||||||
|
ld (seed+2),hl
|
||||||
|
ld hl,(seed) ;now hl=16-bit rand. num.
|
||||||
|
ret
|
76
cpmtris/zmac/COPYRIGHT
Normal file
76
cpmtris/zmac/COPYRIGHT
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
The copyright situation regarding zmac is not totally clear.
|
||||||
|
This is what Russell Marks had to say when I asked him:
|
||||||
|
|
||||||
|
"
|
||||||
|
> [...] I would
|
||||||
|
> like to make double sure that zmac is indeed public domain and so
|
||||||
|
> freely distributable and modifyable. Can you confirm this? Have the
|
||||||
|
> various authors of zmac over the years agreed to give away their
|
||||||
|
> copyright?
|
||||||
|
|
||||||
|
This is a difficult area, partly because I'm not a lawyer. :-) None of
|
||||||
|
them seemed to explicitly give away their copyright, but equally, none
|
||||||
|
of them asserted it either. If you really want to be sure that it's
|
||||||
|
all entirely public domain, the sort of thing that would definitely
|
||||||
|
stand up in court, you'll have to try and contact all three previous
|
||||||
|
contributors (my changes are definitely PD, you wouldn't have to worry
|
||||||
|
about that). I have vague memories of seeing both Colin Kelley and
|
||||||
|
John Providenza's names mentioned in more recent things than zmac, but
|
||||||
|
I don't know any contact addresses for them (nor for Bruce Norskog).
|
||||||
|
|
||||||
|
OTOH, if you're just after some general reassurance that it's ok to
|
||||||
|
distribute a hacked version, I'd say it's fine - if nothing else,
|
||||||
|
Colin Kelley posted it to comp.sources.unix in 1987, so he must have
|
||||||
|
thought it freely distributable and modifiable (the latter because he
|
||||||
|
made changes himself). I think an earlier version had featured in
|
||||||
|
simtel's "UNIX-C" directory too.
|
||||||
|
|
||||||
|
Also, this point from the copyright FAQ may be relevant:
|
||||||
|
|
||||||
|
> 2.2) What is "public domain?"
|
||||||
|
>
|
||||||
|
> In contrast to copyright is "public domain." A work in the public domain
|
||||||
|
> is one that can be freely used by anyone for any purpose.
|
||||||
|
>
|
||||||
|
> It used to be that if a work was published without notice, it lost all
|
||||||
|
> copyright, and entered the public domain. That's no longer true, and now
|
||||||
|
> public domain is more the exception than the rule.
|
||||||
|
>
|
||||||
|
> There are still a number of ways that a work may be public domain.
|
||||||
|
[...]
|
||||||
|
> - The copyright might have been forfeited. For example, the work
|
||||||
|
> may have been published without notice prior to the change in
|
||||||
|
> the law that eliminated the notice requirement (March 1, 1988,
|
||||||
|
> the effective date of the Berne Convention Implementation Act,
|
||||||
|
> PL 100-568, 102 Stat. 2853).
|
||||||
|
|
||||||
|
zmac was published without a copyright notice in 1987 (and, one
|
||||||
|
assumes, long before then as well). This is the main reason I describe
|
||||||
|
zmac as public domain - the 1987 posting was published source with no
|
||||||
|
copyright notice and no license being distributed for free by one of
|
||||||
|
the authors. That smells of PD to me, even without the above. :-) I
|
||||||
|
just don't see what else it could really be. But getting real,
|
||||||
|
legally-sound confirmation of this would be a challenge.
|
||||||
|
|
||||||
|
I know this isn't the "yep, no problem, and here are all the authors'
|
||||||
|
current addresses so you can check for yourself" you may have been
|
||||||
|
looking for, but there it is.
|
||||||
|
|
||||||
|
FWIW, I distribute zmac with ZCN (my GPL'd CP/M-like OS for the
|
||||||
|
Amstrad NC100). In case that contributes anything to this. :-)
|
||||||
|
"
|
||||||
|
|
||||||
|
[Needless to say, I too forfeit any copyright claim on my changes!]
|
||||||
|
|
||||||
|
I am therefore assuming that zmac is public domain (note, however,
|
||||||
|
that the Act above is probably an American one and different
|
||||||
|
conditions may apply in e.g. the European Union). I am not a
|
||||||
|
lawyer, though, and I would strongly suggest you don't abuse this.
|
||||||
|
In particular, I wouldn't use zmac or portions thereof in any
|
||||||
|
commercial product.
|
||||||
|
|
||||||
|
If any of the authors of zmac requests so, I will immediately
|
||||||
|
withdraw this release.
|
||||||
|
|
||||||
|
|
||||||
|
Mark RISON, <mrison@hotmail.com>, 1999-07-19
|
336
cpmtris/zmac/ChangeLog
Normal file
336
cpmtris/zmac/ChangeLog
Normal file
@ -0,0 +1,336 @@
|
|||||||
|
2000-07-02 Mark RISON <mrison@hotmail.com>
|
||||||
|
|
||||||
|
* Version 1.3.
|
||||||
|
|
||||||
|
* Improve man page (including portability fixes by Tim).
|
||||||
|
|
||||||
|
* From Matthew, Tim and Russell: compiler warning avoidance.
|
||||||
|
|
||||||
|
2000-06-25 Mark RISON <mrison@hotmail.com>
|
||||||
|
|
||||||
|
* Version 1.3b4.
|
||||||
|
|
||||||
|
* Allow benign EQU redefinition.
|
||||||
|
|
||||||
|
* Cut down on warnings in pass 1.
|
||||||
|
|
||||||
|
* Find and (hopefully!) fix nasty bug in error recovery in arglists.
|
||||||
|
|
||||||
|
* Allow JP HL/IX/IY syntax. A warning is issued.
|
||||||
|
|
||||||
|
* Revamp man page.
|
||||||
|
|
||||||
|
* From Tim Mann: resolve r/r conflict for parentheses in expressions.
|
||||||
|
|
||||||
|
2000-06-18 Mark RISON <mrison@hotmail.com>
|
||||||
|
|
||||||
|
* Version 1.3b3.
|
||||||
|
|
||||||
|
* BeOS now supported (just treat as a Un*x variant!).
|
||||||
|
|
||||||
|
* Upgrade to bison 1.28 so alloca () no longer a problem.
|
||||||
|
|
||||||
|
* Document the operator zoo.
|
||||||
|
|
||||||
|
* Allow normal parentheses in expressions.
|
||||||
|
(FIXME: is there a way to tell bison the r/r conflict is OK?)
|
||||||
|
|
||||||
|
* From Tim Mann: sort out operator precedence; make it C-like.
|
||||||
|
|
||||||
|
2000-05-25 Mark RISON <mrison@hotmail.com>
|
||||||
|
|
||||||
|
* Version 1.3b2.
|
||||||
|
|
||||||
|
* Fix error handling fix (with Tim's help!).
|
||||||
|
|
||||||
|
* From Tim Mann: add relationals and synonyms for NOT, MOD, SHL, SHR.
|
||||||
|
|
||||||
|
2000-03-18 Mark RISON <mrison@hotmail.com>
|
||||||
|
|
||||||
|
* Version 1.3b1.
|
||||||
|
|
||||||
|
* Fix error handling.
|
||||||
|
|
||||||
|
* Allow a leading colon or no special character at all
|
||||||
|
to introduce a label.
|
||||||
|
|
||||||
|
* Allow $ and # to introduce hex constants.
|
||||||
|
|
||||||
|
* Allow COND and ENDC as synoyms for IF and ENDIF.
|
||||||
|
|
||||||
|
* More ANSI C pedantry.
|
||||||
|
|
||||||
|
* From Tim Mann: remove the nasty and buggy hack to allow AND,
|
||||||
|
OR and XOR to be used as binary operators and do it properly.
|
||||||
|
|
||||||
|
* From Tim Mann: fix bug which prevented & from being used as
|
||||||
|
a binary operator when it was allowed to introduce a hex constant.
|
||||||
|
|
||||||
|
* From Matthew Phillips: try filename as given before trying
|
||||||
|
to add a '.z' extension.
|
||||||
|
|
||||||
|
2000-02-27 Mark RISON <mrison@hotmail.com>
|
||||||
|
|
||||||
|
* Version 1.2.
|
||||||
|
|
||||||
|
* Stop trying to add an extension to INCLUDEd files
|
||||||
|
(this stupid idea was a misfeature introduced in 1.1.1.1).
|
||||||
|
Instead, define canonical form, which is automatically
|
||||||
|
decanonicalised according to the local OS requirements
|
||||||
|
(see the man page for more details).
|
||||||
|
|
||||||
|
* Add support for RISC OS.
|
||||||
|
|
||||||
|
* Increase the maximum number of IFs to 1024.
|
||||||
|
|
||||||
|
* Issue warning when SLL is used.
|
||||||
|
|
||||||
|
* Further ANSI C-ify.
|
||||||
|
(FIXME: anyone know how to convince bison not to use alloca ()?)
|
||||||
|
|
||||||
|
* Tweak command-line error reporting.
|
||||||
|
|
||||||
|
* Remove legacy non-ANSI C garbage.
|
||||||
|
|
||||||
|
* From Matthew Phillips: add support for outputting AMSDOS header.
|
||||||
|
|
||||||
|
* From Matthew Phillips: add support for RISC OS DDE throwback.
|
||||||
|
|
||||||
|
2000-02-11 Russell Marks <russell.marks@dtn.ntl.com>
|
||||||
|
|
||||||
|
* zmac.1: updated man page.
|
||||||
|
|
||||||
|
* zmac.y: changed `-O' warning output to look more like gcc
|
||||||
|
(`foo.z:N: warning: wibble' rather than `foo.z:N: wibble
|
||||||
|
warning').
|
||||||
|
|
||||||
|
* zmac.y: changed to use my old getoptn() getopt clone instead of
|
||||||
|
`real' getopt(), as I know Mark likes his portability :-) (and it
|
||||||
|
probably wouldn't work on DOS otherwise, which even I would like
|
||||||
|
it to...).
|
||||||
|
|
||||||
|
* zmac.y: merged in changes (relative to 1.1) from my current
|
||||||
|
zmac. These were:
|
||||||
|
|
||||||
|
* zmac.y: minor changes to avoid egcs/gcc `ambiguous else'
|
||||||
|
warnings.
|
||||||
|
|
||||||
|
* zmac.y: changes from Chris Smith [slightly changed to fit zmac
|
||||||
|
1.1.1.x]. `-o' now specifies output file; `-x' specifies listing
|
||||||
|
file (`-x -' does the same as the old `-o' option); the
|
||||||
|
undocumented `sll' opcode is now allowed; "Cannot open foo file"
|
||||||
|
errors now give the filename; a `.z' extension is only added to
|
||||||
|
source filename if it has no extension; args are now parsed with
|
||||||
|
getopt().
|
||||||
|
|
||||||
|
* Makefile: fix missing dependencies for zmac.
|
||||||
|
|
||||||
|
1999-10-03 Mark RISON <mrison@hotmail.com>
|
||||||
|
|
||||||
|
* Version 1.1.1.2.
|
||||||
|
|
||||||
|
* Fix bug in nested ELSEs.
|
||||||
|
|
||||||
|
* Pad .bin file when multiple ORGs are used.
|
||||||
|
|
||||||
|
* `-O' option invokes optimisation suggester
|
||||||
|
for JP, RLC/RRC/RL/RR/SLA A and LD A, 0.
|
||||||
|
|
||||||
|
* Reinstate 0x02, 0x0a, 0x12 and 0x1a as valid 8080 opcodes.
|
||||||
|
|
||||||
|
* Add zmac.c to .zip file (for those who don't have yacc/bison).
|
||||||
|
|
||||||
|
* Make makefile no longer depend on GNU make implicit rules.
|
||||||
|
|
||||||
|
1999-07-18 Mark RISON <mrison@hotmail.com>
|
||||||
|
|
||||||
|
* Version 1.1.1.1 (nee 1.1.1).
|
||||||
|
|
||||||
|
* Extend symbol significance from 15 to 40 chars.
|
||||||
|
A warning is issued regarding truncated symbols.
|
||||||
|
|
||||||
|
* Make continuous listing be the default.
|
||||||
|
|
||||||
|
* Add ELSE to IF/ENDIF construct.
|
||||||
|
|
||||||
|
* Allow INCLUDE filename to be delimited by " or '.
|
||||||
|
|
||||||
|
* Allow labels to be defined using .name (as well as name:).
|
||||||
|
|
||||||
|
* Allow ADD/SBC/ADD s syntax (implicit "A, ").
|
||||||
|
A warning is issued.
|
||||||
|
|
||||||
|
* Issue warning for SUB/AND/XOR/OR/CP A, s syntax (explicit "A, ").
|
||||||
|
|
||||||
|
* Issue warning for CMP and JMP opcodes, and V and NV condition codes.
|
||||||
|
|
||||||
|
* Catch division by zero in expressions.
|
||||||
|
|
||||||
|
* Allow hex constants to be specified using a leading '&'.
|
||||||
|
(FIXME: what's all this testing of nextchar () against '$' for?)
|
||||||
|
|
||||||
|
* Add DB, DEFM and TEXT as synonyms for DEFB.
|
||||||
|
|
||||||
|
* Add DS and RMEM as synonyms for DEFS.
|
||||||
|
|
||||||
|
* Add DW as synonym for DEFW.
|
||||||
|
|
||||||
|
* Add READ as synonym for INCLUDE.
|
||||||
|
|
||||||
|
* Allow strings to be specified using " too.
|
||||||
|
|
||||||
|
* Allow AND, OR and XOR to be used as binary operators.
|
||||||
|
(FIXME: a bit of a nasty hack; can it be done more cleanly?)
|
||||||
|
|
||||||
|
* Make file handing consistent for source and INCLUDE:
|
||||||
|
for both, try to open with ".z" first, then with no extension.
|
||||||
|
|
||||||
|
1998-12-15 Russell Marks <rus@lifeson>
|
||||||
|
|
||||||
|
* Version 1.1.
|
||||||
|
|
||||||
|
* Added support for --help and --version.
|
||||||
|
|
||||||
|
* zmac.1: mentioned `title' pseudo-op.
|
||||||
|
|
||||||
|
* Converted revision history from zmac.y into Emacs change log
|
||||||
|
format (roughly).
|
||||||
|
|
||||||
|
* Now outputs errors more like a C compiler (one per line,
|
||||||
|
prefixed with filename and line-in-file), useful for `M-x compile'
|
||||||
|
in Emacs. New `-S' option makes it show the error-causing line
|
||||||
|
like it used to.
|
||||||
|
|
||||||
|
* Made it output current file for error reports.
|
||||||
|
|
||||||
|
* Added `void' to prototypes for funcs with no args.
|
||||||
|
|
||||||
|
* Removed unnecessary `char *ctime()' and `fflush(stderr)'.
|
||||||
|
|
||||||
|
* Made it support filenames longer than 14 chars!
|
||||||
|
|
||||||
|
1998-02-26 Russell Marks <rus@lifeson>
|
||||||
|
|
||||||
|
* Version 1.0 (for the sake of argument).
|
||||||
|
|
||||||
|
* Made usage message say what the program is. :-)
|
||||||
|
|
||||||
|
1998-02-12 Russell Marks <rus@lifeson>
|
||||||
|
|
||||||
|
* Added verbose inline errors in listing and made the original
|
||||||
|
terse one-letter ones available via new `-t' option.
|
||||||
|
|
||||||
|
* Added `-c' option to produce continuous listing (no page breaks
|
||||||
|
or page headers).
|
||||||
|
|
||||||
|
* Corrected plurals in listing so you don't get things like "1
|
||||||
|
symbols" any more.
|
||||||
|
|
||||||
|
* Added `-z' option to output 8080-compatible code only - i.e., to
|
||||||
|
flag Z80-specific ops as errors.
|
||||||
|
|
||||||
|
1998-02-11 Russell Marks <rus@lifeson>
|
||||||
|
|
||||||
|
* Fixed LIST-without-args segfault.
|
||||||
|
|
||||||
|
* Allowed decimal constants to be up to 65535 (rather than up to
|
||||||
|
32767 before; I checked and there was no reason for the previous
|
||||||
|
exception for decimal even on systems with 16-bit ints).
|
||||||
|
|
||||||
|
* Removed the `-d' debug option.
|
||||||
|
|
||||||
|
* Removed the `-t' option. It did everything as normal *except*
|
||||||
|
for not reporting errors. I can't imagine any valid reason for
|
||||||
|
wanting that.
|
||||||
|
|
||||||
|
* Made exit status 1 if there were errors in the assembly.
|
||||||
|
|
||||||
|
* Fixed `equ' bug - it now detects forward refs to `equ's with
|
||||||
|
forward refs and flags them as errors (because of course you'd
|
||||||
|
need three passes to resolve them). The fix is pretty
|
||||||
|
nasty-looking but it was really the only way I could see to do it.
|
||||||
|
Some assemblers (e.g. Hisoft's GENS4) don't allow forward refs in
|
||||||
|
`equ's at all, so count yourselves lucky! :-)
|
||||||
|
|
||||||
|
* Changed symbol table listing so it fits in 80 columns.
|
||||||
|
|
||||||
|
* Fixed `if' to not depend on internals of yacc parser (which
|
||||||
|
appear to have changed, anyway).
|
||||||
|
|
||||||
|
* Added support for normal `rst' format (0, 8, 10h, 18h...; still
|
||||||
|
allows the previous 0, 1, 2, 3...).
|
||||||
|
|
||||||
|
* Made default output binary (as .bin), added `-h' to get .hex.
|
||||||
|
|
||||||
|
* ANSIfied the thing (painful!) and cleaned up a little.
|
||||||
|
|
||||||
|
1987-02-05 Colin Kelley
|
||||||
|
|
||||||
|
* Added 'cmp' as a synonym for 'cp', 'jmp' as a synonym for 'jp',
|
||||||
|
and added tolerance of accumulator specification for arithmetic
|
||||||
|
and logical instructions. (For example, 'or a,12' is now accepted,
|
||||||
|
same as 'or 12'.)
|
||||||
|
|
||||||
|
1987-01-18 Colin Kelley
|
||||||
|
|
||||||
|
* Added MIO code to emulate 'mfile' using malloc()'d memory. This
|
||||||
|
was needed to get the code to work when compiled under MSC 4.0 on
|
||||||
|
a PC, and it's probably faster anyway.
|
||||||
|
|
||||||
|
1986-10-02 Colin Kelley
|
||||||
|
|
||||||
|
* Added some more typecasts to keep lint a little happier. Removed
|
||||||
|
several unused variables. Changed most vars declared as char to
|
||||||
|
int, since many of them were being compared with -1! I still don't
|
||||||
|
know what's going on with est[][] being malloc'd and free'd
|
||||||
|
everywhere...it looks pretty fishy...
|
||||||
|
|
||||||
|
1986-09-20 Colin Kelley
|
||||||
|
|
||||||
|
* Converted to run on a Pyramid. This meant changing yylval to be
|
||||||
|
a %union, and then putting in the appropriate typecasts where ints
|
||||||
|
are pointers are used interchangeably. The current version still
|
||||||
|
probably won't run on machines where
|
||||||
|
sizeof(int) != sizeof(char *).
|
||||||
|
Also changed emit() to use varargs, and got rid of the old
|
||||||
|
style = in front of yacc action code.
|
||||||
|
|
||||||
|
1984-08-27 John Providenza
|
||||||
|
|
||||||
|
* Added PHASE/DEPHASE commands.
|
||||||
|
|
||||||
|
1984-05-22 John Providenza
|
||||||
|
|
||||||
|
* Added include files ala ormac.
|
||||||
|
|
||||||
|
1984-05-11 John Providenza
|
||||||
|
|
||||||
|
* Added code to print unused labels out with the symbol table.
|
||||||
|
Also sped up the macro processor by using stdio.
|
||||||
|
|
||||||
|
1983-06-07 John Providenza
|
||||||
|
|
||||||
|
* Fixed bug in the ADD IX,... instruction.
|
||||||
|
|
||||||
|
1983-02-15 John Providenza
|
||||||
|
|
||||||
|
* Fixed 'getlocal' to return better local labels. It used to crash
|
||||||
|
after 6 invocations.
|
||||||
|
|
||||||
|
1982-03-15 John Providenza
|
||||||
|
|
||||||
|
* Changed maximum number of characters in a label to 15 from 7.
|
||||||
|
Note that 'putsymtab' uses this value inside of a quoted string,
|
||||||
|
so we use 15.
|
||||||
|
|
||||||
|
* Added underscore as a character type in the lex table 'numpart'
|
||||||
|
(0x5F).
|
||||||
|
|
||||||
|
1982-03-08 John Providenza
|
||||||
|
|
||||||
|
* Converted to run on Vax, updated syntax to conform better to the
|
||||||
|
Zilog standard.
|
||||||
|
|
||||||
|
1978-04-?? Bruce Norskog
|
||||||
|
|
||||||
|
* Initial version.
|
43
cpmtris/zmac/MAXAM
Normal file
43
cpmtris/zmac/MAXAM
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
Notes on MAXAM compatibility
|
||||||
|
============================
|
||||||
|
|
||||||
|
MAXAM is an assembler for Amstrad CPC machines
|
||||||
|
(a CP/M version also exists).
|
||||||
|
|
||||||
|
zmac tries to be MAXAM-compatible.
|
||||||
|
|
||||||
|
Note the following major differences with MAXAM 1.14, though:
|
||||||
|
|
||||||
|
- zmac allows ' and " strings to be specified using '''' and """".
|
||||||
|
MAXAM only allows '"' and "'", which zmac also allows.
|
||||||
|
|
||||||
|
- zmac will truncate symbols to 40 characters.
|
||||||
|
MAXAM has no such restriction.
|
||||||
|
|
||||||
|
- MAXAM allows strings to be terminated by end-of-line.
|
||||||
|
zmac does not.
|
||||||
|
|
||||||
|
- When using the READ directive, MAXAM will take the first
|
||||||
|
non-whitespace character as the filename delimiter. zmac only
|
||||||
|
allows ' or " as a filename delimiter.
|
||||||
|
|
||||||
|
- AMSDOS restrictions prevent MAXAM from supporting nested
|
||||||
|
READs, which zmac allows. AMSDOS restrictions also prevent
|
||||||
|
MAXAM from supporting directories.
|
||||||
|
|
||||||
|
- zmac has a pretty decent expression parser.
|
||||||
|
MAXAM does not (no parentheses, no precedence).
|
||||||
|
|
||||||
|
- zmac handles multiple ORGs by inserting padding bytes in
|
||||||
|
the .bin file, but of course this means retrograde ORGs are
|
||||||
|
not possible.
|
||||||
|
|
||||||
|
- MAXAM allows multiple statements on the same line, separated
|
||||||
|
by colons. zmac does not.
|
||||||
|
|
||||||
|
- zmac has many synonyms for operators, directives, labels, hex
|
||||||
|
constants, etc., which MAXAM does not support. The easiest
|
||||||
|
thing is not to find out about them!
|
||||||
|
|
||||||
|
|
||||||
|
Mark RISON, <mrison@hotmail.com>, 2000-05-25
|
47
cpmtris/zmac/Makefile
Normal file
47
cpmtris/zmac/Makefile
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Makefile for zmac
|
||||||
|
|
||||||
|
# Edit any defs which are wrong - these should be OK for Linux though.
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
|
||||||
|
YACC = bison -y
|
||||||
|
|
||||||
|
MV = mv
|
||||||
|
|
||||||
|
ZIP = zip
|
||||||
|
|
||||||
|
CFLAGS = -O -Wall
|
||||||
|
|
||||||
|
PREFIX = /usr/local
|
||||||
|
BINDIR = $(PREFIX)/bin
|
||||||
|
MANDIR = $(PREFIX)/man/man1
|
||||||
|
|
||||||
|
|
||||||
|
all: zmac
|
||||||
|
|
||||||
|
zmac: zmac.c mio.c getoptn.c
|
||||||
|
$(CC) $(CFLAGS) -o zmac zmac.c mio.c getoptn.c
|
||||||
|
|
||||||
|
zmac.c: zmac.y
|
||||||
|
$(YACC) zmac.y
|
||||||
|
$(MV) y.tab.c zmac.c
|
||||||
|
|
||||||
|
dev: /tmp/zmac
|
||||||
|
|
||||||
|
/tmp/zmac: zmac.c mio.c getoptn.c
|
||||||
|
$(CC) $(CFLAGS) --ansi --pedantic --extra-warnings --all-warnings -o /tmp/zmac zmac.c mio.c getoptn.c
|
||||||
|
chmod 777 /tmp/zmac
|
||||||
|
|
||||||
|
install: zmac
|
||||||
|
install -s -m 511 zmac $(BINDIR)
|
||||||
|
install -m 444 zmac.1 $(MANDIR)
|
||||||
|
|
||||||
|
zip:
|
||||||
|
$(RM) zmac.zip
|
||||||
|
man -l -7 zmac.1 | sed 's/.//g' >zmac.doc
|
||||||
|
$(ZIP) zmac.zip zmac.y zmac.c mio.c mio.h getoptn.c getoptn.h zmac.1 \
|
||||||
|
zmac.doc Makefile README NEWS COPYRIGHT ChangeLog MAXAM RISCOS \
|
||||||
|
file_id.diz
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) *.o y.tab.c zmac.c *~ zmac
|
76
cpmtris/zmac/NEWS
Normal file
76
cpmtris/zmac/NEWS
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
* Changes between versions -*- mode:indented-text; mode:outline-minor -*-
|
||||||
|
|
||||||
|
This file (NEWS) documents the significant changes between all
|
||||||
|
versions of zmac (since version 1.0), with the newest changes first.
|
||||||
|
|
||||||
|
|
||||||
|
* Changes in zmac 1.3
|
||||||
|
|
||||||
|
- Allow ':label' and 'label', and '$' and '#' for hex constants.
|
||||||
|
|
||||||
|
- Add relationals.
|
||||||
|
|
||||||
|
- Add more synonyms.
|
||||||
|
|
||||||
|
- Fix logical operator bugs.
|
||||||
|
|
||||||
|
- Fix error handling.
|
||||||
|
|
||||||
|
- Make operator precedence C-like.
|
||||||
|
|
||||||
|
- Allow normal parentheses in expressions.
|
||||||
|
|
||||||
|
- Revamp man page and add plain text version.
|
||||||
|
|
||||||
|
|
||||||
|
* Changes in zmac 1.2
|
||||||
|
|
||||||
|
- Make filename handling more portable.
|
||||||
|
|
||||||
|
- Introduce -x and new -o options (old -o is now '-x -').
|
||||||
|
|
||||||
|
- Improve ANSI C-ness.
|
||||||
|
|
||||||
|
- Add support for writing out files with AMSDOS headers.
|
||||||
|
|
||||||
|
- Add support for RISC OS throwback.
|
||||||
|
|
||||||
|
|
||||||
|
* Changes in zmac 1.1.1.2
|
||||||
|
|
||||||
|
- Fix nested ELSE bug.
|
||||||
|
|
||||||
|
- Pad .bin file when multiple ORGs used.
|
||||||
|
|
||||||
|
- Add optimisation suggester.
|
||||||
|
|
||||||
|
- Tweak list of valid 8080 opcodes.
|
||||||
|
|
||||||
|
|
||||||
|
* Changes in zmac 1.1.1.1
|
||||||
|
|
||||||
|
- Add ELSE, READ, DB, DS, DW, DEFM, TEXT and RMEM directives.
|
||||||
|
|
||||||
|
- Allow & to introduce a hex constant, " as a string delimiter
|
||||||
|
and . to introduce labels.
|
||||||
|
|
||||||
|
- Allow AND, OR and XOR to be used as binary operators.
|
||||||
|
|
||||||
|
- Warn for truncated symbols and non-standard syntax.
|
||||||
|
|
||||||
|
|
||||||
|
* Changes in zmac 1.1
|
||||||
|
|
||||||
|
- Fixed the nasty assumption that filenames were never more than 14
|
||||||
|
chars (which was *never* valid, as filenames can include the path to
|
||||||
|
the file).
|
||||||
|
|
||||||
|
- Error reports now conform to the canonical format for compilers and
|
||||||
|
the like (as the GNU coding standards put it,
|
||||||
|
"SOURCE-FILE-NAME:LINENO: MESSAGE"). This is a lot more sensible
|
||||||
|
than the previous OVERALL-LINENO: MESSAGE\nERROR-LINE\n (and means
|
||||||
|
you can easily jump to errors when using Emacs' `M-x compile'), but
|
||||||
|
you can get SOURCE-FILE-NAME:LINENO: MESSAGE\nERROR-LINE\n if you
|
||||||
|
use the `-S' option.
|
||||||
|
|
||||||
|
- Now supports GNU-ish `--help' and `--version' options.
|
145
cpmtris/zmac/README
Normal file
145
cpmtris/zmac/README
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
zmac 1.3, a Z80 macro cross-assembler.
|
||||||
|
Public domain by Bruce Norskog, John Providenza and Colin Kelley.
|
||||||
|
Cleaned up somewhat and documented by Russell Marks.
|
||||||
|
Tweaked by Mark RISON, Chris Smith, Matthew Phillips and Tim Mann.
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
zmac is a rather good Z80 macro cross-assembler which hardly anyone
|
||||||
|
seems to know about, but which I've used for about four or five years
|
||||||
|
now for various things.
|
||||||
|
|
||||||
|
I'd taken to, whenever I uploaded any of my Z80 sources, including a
|
||||||
|
diff to get zmac minimally working (being a relatively old program, it
|
||||||
|
made some assumptions which were a little odd in a modern context) and
|
||||||
|
a pointer to where the shar archives could be found. (FWIW, that's
|
||||||
|
comp.sources.unix volume 9.) But eventually, I decided it'd be a Good
|
||||||
|
Thing if I got a more reasonable zmac package together, especially
|
||||||
|
since I couldn't ever remember seeing a Z80 cross-assembler on
|
||||||
|
sunsite. Honestly, why bother wasting space on junk like the kernel
|
||||||
|
and gcc when you could be using it for *useful* stuff like Z80
|
||||||
|
assemblers? :-)
|
||||||
|
|
||||||
|
So I made the code ANSI C and got it through gcc's `-Wall', fixed a
|
||||||
|
couple of obscure bugs I'd found in it, wrote a man page, and added
|
||||||
|
the option of only accepting 8080-compatible instructions so you can
|
||||||
|
write programs in Z80 which will also run on the 8080 and 8085 (see
|
||||||
|
the man page for details), and a couple of other minor features. And
|
||||||
|
that's essentially what's here.
|
||||||
|
|
||||||
|
The documentation is in the file zmac.doc (derived from the Un*x
|
||||||
|
man page in the file zmac.1 ).
|
||||||
|
|
||||||
|
|
||||||
|
Installation on Un*x
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
You'll need an ANSI C compiler. gcc is fine - so should most other
|
||||||
|
compilers be, these days. (You'll also need bison or yacc, if you
|
||||||
|
want to build from scratch, but that shouldn't be a problem.)
|
||||||
|
|
||||||
|
Check/edit the Makefile first. (It should be fine, though.) Then do
|
||||||
|
`make', then (as root) `make install'. This installs the man page
|
||||||
|
as well as the executable.
|
||||||
|
|
||||||
|
|
||||||
|
Installation on BeOS
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
You'll need an ANSI C compiler. gcc is fine.
|
||||||
|
|
||||||
|
You should be able to use the Makefile provided, otherwise just
|
||||||
|
do whatever you need to do to compile zmac.c, mio.c and getoptn.c
|
||||||
|
together.
|
||||||
|
|
||||||
|
Then put the executable in /boot/home/config/bin/ or
|
||||||
|
/boot/beos/bin/ .
|
||||||
|
|
||||||
|
|
||||||
|
Installation on DOS
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
You'll need an ANSI C compiler.
|
||||||
|
|
||||||
|
You may be able to use the Makefile provided, if you're using
|
||||||
|
djgpp, otherwise just do whatever you need to do to compile
|
||||||
|
zmac.c, mio.c and getoptn.c together; in both cases make sure
|
||||||
|
the preprocessor token MSDOS is defined.
|
||||||
|
|
||||||
|
Then put the executable somewhere in your PATH.
|
||||||
|
|
||||||
|
|
||||||
|
Installation on RISC OS
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
You'll need an ANSI C compiler. Acorn C/C++ is fine, and
|
||||||
|
so should gcc and lcc be.
|
||||||
|
|
||||||
|
You may be able to use the Makefile provided, otherwise just
|
||||||
|
do whatever you need to do to compile zmac.c, mio.c and getoptn.c
|
||||||
|
together; in both cases make sure the preprocessor token __riscos
|
||||||
|
or __riscos__ is defined (this is the case for Acorn C/C++,
|
||||||
|
gcc and lcc).
|
||||||
|
|
||||||
|
Then put the executable somewhere in your Run$Path.
|
||||||
|
|
||||||
|
[Also see the file RISCOS.]
|
||||||
|
|
||||||
|
|
||||||
|
Installation on other OSes
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
You'll need an ANSI C compiler.
|
||||||
|
|
||||||
|
You'll probably need to add filename-handling support for
|
||||||
|
your OS. This involves adding appropriate definitions
|
||||||
|
of OS_DIR_SEP and OS_EXT_SEP and adding appropriate code
|
||||||
|
to decanonicalise (). In those cases where directories in
|
||||||
|
pathnames are syntactically distinct to leafnames (e.g. VMS)
|
||||||
|
changes will also be needed in suffix () and suffix_if_none ().
|
||||||
|
|
||||||
|
You may be able to use the Makefile provided, otherwise just
|
||||||
|
do whatever you need to do to compile zmac.c, mio.c and getoptn.c
|
||||||
|
together.
|
||||||
|
|
||||||
|
Then put the executable somewhere appropriate, and feed your
|
||||||
|
changes back to <mrison@hotmail.com> so they can become part
|
||||||
|
of the source source!
|
||||||
|
|
||||||
|
|
||||||
|
History
|
||||||
|
-------
|
||||||
|
|
||||||
|
Bruce Norskog wrote zmac in 1978, "modeled after the ... macro
|
||||||
|
cross-assembler for the Intel 8080 by Ken Borgendale."
|
||||||
|
|
||||||
|
John Providenza made some changes and bugfixes in the early 80s.
|
||||||
|
|
||||||
|
Colin Kelley did much the same in the mid-80s.
|
||||||
|
|
||||||
|
And of course, I've just messed about with it in the late 90s,
|
||||||
|
together with Mark RISON, Chris Smith, Matthew Phillips
|
||||||
|
and Tim Mann. :-)
|
||||||
|
|
||||||
|
I assigned the first version I hacked on the version number 1.0 just
|
||||||
|
for the sake of argument (previous versions didn't have a version
|
||||||
|
number). A version number of about 4.0 or 5.0 would probably be a
|
||||||
|
better reflection of what the code's been through over the years...
|
||||||
|
|
||||||
|
|
||||||
|
Contacting me
|
||||||
|
-------------
|
||||||
|
|
||||||
|
You can email me at <russell.marks@ntlworld.com>. However,
|
||||||
|
Mark RISON now maintains zmac, so you should generally
|
||||||
|
email him instead at <mrison@hotmail.com>.
|
||||||
|
|
||||||
|
The latest version of zmac is currently available from
|
||||||
|
|
||||||
|
http://www.nenie.org/cpcip/index.html#zmac
|
||||||
|
|
||||||
|
Share and enjoy!
|
||||||
|
|
||||||
|
-Rus (with a few tweaks by Mark).
|
5
cpmtris/zmac/README.1st
Normal file
5
cpmtris/zmac/README.1st
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
This copy omits zmac.c to save space, but is otherwise identical
|
||||||
|
to zmac 1.3 as released. The C is normally built from zmac.y, so
|
||||||
|
this shouldn't cause any problems.
|
||||||
|
|
||||||
|
-Rus.
|
19
cpmtris/zmac/RISCOS
Normal file
19
cpmtris/zmac/RISCOS
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Notes for compilation under RISC OS
|
||||||
|
===================================
|
||||||
|
|
||||||
|
zmac 1.2 has been compiled and tested on RISC OS 3.71, using
|
||||||
|
Acorn C/C++ Release 5. It has not been compiled with gcc, lcc
|
||||||
|
or Easy C.
|
||||||
|
|
||||||
|
To compile with Acorn C/C++ you will need to rename the five
|
||||||
|
source and header files to place them in directories called
|
||||||
|
"c" and "h" and create the object directory "o". Ignore
|
||||||
|
the supplied Makefile -- it is very easy to build a RISC OS
|
||||||
|
one using Acorn !Make. Do not forget to link in C:o.stubs.
|
||||||
|
|
||||||
|
A full RISC OS binary distribution, with desktop front end,
|
||||||
|
is available for download from
|
||||||
|
|
||||||
|
http://users.ox.ac.uk/~chri0264/software/
|
||||||
|
|
||||||
|
Matthew Phillips, <matthew.phillips@chch.ox.ac.uk>, 2000-03-12
|
3
cpmtris/zmac/file_id.diz
Normal file
3
cpmtris/zmac/file_id.diz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Z80 macro cross-assembler
|
||||||
|
|
||||||
|
Cross-assembleur macro Z80
|
58
cpmtris/zmac/getoptn.c
Normal file
58
cpmtris/zmac/getoptn.c
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/* getoptn.c - a getopt() clone, so that cmdline option parsing will
|
||||||
|
* work on non-Unix systems.
|
||||||
|
*
|
||||||
|
* PD by RJM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "getoptn.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* equivalents of optopt, opterr, optind, and optarg */
|
||||||
|
int optnopt=0,optnerr=0,optnind=1;
|
||||||
|
char *optnarg=NULL;
|
||||||
|
|
||||||
|
/* holds offset in current argv[] value */
|
||||||
|
static unsigned int optnpos=1;
|
||||||
|
|
||||||
|
|
||||||
|
/* This routine assumes that the caller is pretty sane and doesn't
|
||||||
|
* try passing an invalid 'optstring' or varying argc/argv.
|
||||||
|
*/
|
||||||
|
int getoptn(int argc,char *argv[],char *optstring)
|
||||||
|
{
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
/* check for end of arg list */
|
||||||
|
if(optnind==argc || *(argv[optnind])!='-' || strlen(argv[optnind])<=1)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
if((ptr=strchr(optstring,argv[optnind][optnpos]))==NULL)
|
||||||
|
return('?'); /* error: unknown option */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
optnopt=*ptr;
|
||||||
|
if(ptr[1]==':')
|
||||||
|
{
|
||||||
|
if(optnind==argc-1) return(':'); /* error: missing option */
|
||||||
|
optnarg=argv[optnind+1];
|
||||||
|
optnpos=1;
|
||||||
|
optnind+=2;
|
||||||
|
return(optnopt); /* return early, avoiding the normal increment */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now increment position ready for next time.
|
||||||
|
* no checking is done for the end of args yet - this is done on
|
||||||
|
* the next call.
|
||||||
|
*/
|
||||||
|
optnpos++;
|
||||||
|
if(optnpos>=strlen(argv[optnind]))
|
||||||
|
{
|
||||||
|
optnpos=1;
|
||||||
|
optnind++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(optnopt); /* return the found option */
|
||||||
|
}
|
5
cpmtris/zmac/getoptn.h
Normal file
5
cpmtris/zmac/getoptn.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
/* getoptn.h */
|
||||||
|
|
||||||
|
extern int optnopt,optnerr,optnind;
|
||||||
|
extern char *optnarg;
|
||||||
|
extern int getoptn(int argc,char *argv[],char *optstring);
|
126
cpmtris/zmac/mio.c
Normal file
126
cpmtris/zmac/mio.c
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* mio.c - Colin Kelley 1-18-87
|
||||||
|
* routines to emulate temporary file handling with memory instead
|
||||||
|
*
|
||||||
|
* rjm 980212 - changed to use memcpy rather than bcopy
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define UNUSED(var) ((void) var)
|
||||||
|
|
||||||
|
#define MALLOC_SIZE 10000
|
||||||
|
#define JUNK_FPTR stdin /* junk ptr to return (unused) */
|
||||||
|
|
||||||
|
static unsigned char *mhead; /* pointer to start of malloc()d area */
|
||||||
|
static unsigned char *mend; /* pointer to current (just beyond) EOF*/
|
||||||
|
static unsigned char *mptr; /* pointer to current position */
|
||||||
|
static unsigned int msize; /* size of chunk mhead points to */
|
||||||
|
|
||||||
|
FILE *mfopen(char *filename,char *mode)
|
||||||
|
{
|
||||||
|
UNUSED (filename);
|
||||||
|
UNUSED (mode);
|
||||||
|
if ((mhead = malloc(MALLOC_SIZE)) == NULL) {
|
||||||
|
msize = 0;
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
msize = MALLOC_SIZE;
|
||||||
|
mend = mptr = mhead;
|
||||||
|
return (JUNK_FPTR); /* not used */
|
||||||
|
}
|
||||||
|
|
||||||
|
int mfclose(FILE *f)
|
||||||
|
{
|
||||||
|
UNUSED (f);
|
||||||
|
if (mhead) {
|
||||||
|
free(mhead);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mfputc(unsigned int c,FILE *f)
|
||||||
|
{
|
||||||
|
unsigned char *p;
|
||||||
|
UNUSED (f);
|
||||||
|
while (mptr >= mhead + msize) {
|
||||||
|
if ((p = realloc(mhead,msize+MALLOC_SIZE)) == (unsigned char *)-1) {
|
||||||
|
fputs("mio: out of memory\n",stderr);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msize += MALLOC_SIZE;
|
||||||
|
mptr = (unsigned char *) (p + (unsigned int)(mptr - mhead));
|
||||||
|
mhead = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*mptr = c & 255;
|
||||||
|
mend = ++mptr;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mfgetc(FILE *f)
|
||||||
|
{
|
||||||
|
UNUSED (f);
|
||||||
|
if (mptr >= mend) /* no characters left */
|
||||||
|
return (-1);
|
||||||
|
else
|
||||||
|
return (*mptr++);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mfseek(FILE *f,long loc,int origin)
|
||||||
|
{
|
||||||
|
UNUSED (f);
|
||||||
|
if (origin != 0) {
|
||||||
|
fputs("mseek() only implemented with 0 origin",stderr);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
mptr = mhead + loc;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mfread(char *ptr, unsigned int size, unsigned int nitems, FILE *f)
|
||||||
|
{
|
||||||
|
unsigned int i = 0;
|
||||||
|
UNUSED (f);
|
||||||
|
while (i < nitems) {
|
||||||
|
if ((mptr + size) > mend)
|
||||||
|
break;
|
||||||
|
memcpy(ptr,mptr,size);
|
||||||
|
ptr += size;
|
||||||
|
mptr += size;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mfwrite(char *ptr, int size, int nitems, FILE *f)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
unsigned char *p;
|
||||||
|
UNUSED (f);
|
||||||
|
while (i < nitems) {
|
||||||
|
while (mptr + size >= mhead + msize) {
|
||||||
|
if ((p = realloc(mhead,msize+MALLOC_SIZE)) == (unsigned char *)-1){
|
||||||
|
fputs("mio: out of memory\n",stderr);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msize += MALLOC_SIZE;
|
||||||
|
mptr = (unsigned char *) (p + (unsigned int)(mptr - mhead));
|
||||||
|
mhead = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((mptr + size) > mhead + msize)
|
||||||
|
break;
|
||||||
|
memcpy(mend,ptr,size);
|
||||||
|
ptr += size;
|
||||||
|
mend += size;
|
||||||
|
mptr = mend;
|
||||||
|
}
|
||||||
|
return (i);
|
||||||
|
}
|
9
cpmtris/zmac/mio.h
Normal file
9
cpmtris/zmac/mio.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/* prototypes for mio.h */
|
||||||
|
|
||||||
|
extern FILE *mfopen(char *filename,char *mode);
|
||||||
|
extern int mfclose(FILE *f);
|
||||||
|
extern int mfputc(unsigned int c,FILE *f);
|
||||||
|
extern int mfgetc(FILE *f);
|
||||||
|
extern int mfseek(FILE *f,long loc,int origin);
|
||||||
|
extern int mfread(char *ptr, unsigned int size, unsigned int nitems, FILE *f);
|
||||||
|
extern int mfwrite(char *ptr, int size, int nitems, FILE *f);
|
412
cpmtris/zmac/zmac.1
Normal file
412
cpmtris/zmac/zmac.1
Normal file
@ -0,0 +1,412 @@
|
|||||||
|
.\" -*- nroff -*-
|
||||||
|
.\"
|
||||||
|
.\" zmac - Z80 macro cross-assembler
|
||||||
|
.\" Public domain by Bruce Norskog and others.
|
||||||
|
.\"
|
||||||
|
.\" zmac.1 - man page
|
||||||
|
.\"
|
||||||
|
.\" (version number below is purely for the sake of argument;
|
||||||
|
.\" it's probably about the millionth version IRL :-))
|
||||||
|
.\"
|
||||||
|
.TH zmac 1 "2000-07-02" "Version 1.3" "Development Tools"
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH NAME
|
||||||
|
zmac \- Z80 macro cross-assembler
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.PD 0
|
||||||
|
.B zmac
|
||||||
|
.RB [ --help ]
|
||||||
|
.RB [ --version ]
|
||||||
|
.RB [ -AbcdefghilLmnOpsStTz ]
|
||||||
|
.RB [ -o
|
||||||
|
.IR outfile ]
|
||||||
|
.RB [ -x
|
||||||
|
.IR listfile ]
|
||||||
|
.RI [ filename ]
|
||||||
|
.PD 1
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH DESCRIPTION
|
||||||
|
zmac is a Z80 macro cross-assembler. It has all the features you'd
|
||||||
|
expect. It assembles the specified input file (with a `.z' extension
|
||||||
|
if there is no pre-existing extension and the file as given doesn't
|
||||||
|
exist) and produces raw binary output
|
||||||
|
in a `.bin' file. (It can optionally produce CP/M-style Intel hex
|
||||||
|
format - see below.) By default it also produces a nicely-formatted
|
||||||
|
listing of the m/c alongside the source, in a `.lst' file.
|
||||||
|
.PP
|
||||||
|
As well as normal Z80 programs, zmac lets you write 8080 programs in
|
||||||
|
Z80 assembly. (See the `-z' option below.)
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH OPTIONS
|
||||||
|
Most of the options control aspects of the listing.
|
||||||
|
.TP
|
||||||
|
.I --help
|
||||||
|
Display a list of options and a terse description of what the options
|
||||||
|
do.
|
||||||
|
.TP
|
||||||
|
.I --version
|
||||||
|
Print version number.
|
||||||
|
.TP
|
||||||
|
.I -A
|
||||||
|
Add an AMSDOS header to the generated binary file (this option
|
||||||
|
automatically disables generation of hex output).
|
||||||
|
.TP
|
||||||
|
.I -b
|
||||||
|
Don't generate the m/c output at all.
|
||||||
|
.TP
|
||||||
|
.I -c
|
||||||
|
Make the listing continuous, i.e. don't generate any page breaks or
|
||||||
|
page headers. Can make things less confusing if you're going to
|
||||||
|
consult the listing online rather than printing it. This is the default.
|
||||||
|
.TP
|
||||||
|
.I -d
|
||||||
|
Make the listing discontinuous.
|
||||||
|
.TP
|
||||||
|
.I -e
|
||||||
|
Omit the `error report' section in the listing.
|
||||||
|
.TP
|
||||||
|
.I -f
|
||||||
|
List instructions not assembled due to `if' expressions being
|
||||||
|
false. (Normally these are not shown in the listing.)
|
||||||
|
.TP
|
||||||
|
.I -g
|
||||||
|
List only the first line of equivalent hex for a source line.
|
||||||
|
.TP
|
||||||
|
.I -h
|
||||||
|
Output CP/M-ish Intel hex format (using extension `.hex') rather than
|
||||||
|
the default of a simple binary file (extension `.bin').
|
||||||
|
.TP
|
||||||
|
.I -i
|
||||||
|
Don't list files included with `include'.
|
||||||
|
.TP
|
||||||
|
.I -l
|
||||||
|
Don't generate a listing at all.
|
||||||
|
.TP
|
||||||
|
.I -L
|
||||||
|
Generate listing no matter what. Overrides any conflicting options.
|
||||||
|
.TP
|
||||||
|
.I -m
|
||||||
|
List macro expansions.
|
||||||
|
.TP
|
||||||
|
.I -n
|
||||||
|
Omit line numbers from listing.
|
||||||
|
.TP
|
||||||
|
.I -o
|
||||||
|
Output assembled code to
|
||||||
|
.IR outfile .
|
||||||
|
.TP
|
||||||
|
.I -O
|
||||||
|
Suggest possible optimisations. (These are shown as warnings.)
|
||||||
|
.TP
|
||||||
|
.I -p
|
||||||
|
Use a few linefeeds for page break in listing rather than ^L.
|
||||||
|
.TP
|
||||||
|
.I -s
|
||||||
|
Omit the symbol table from the listing.
|
||||||
|
.TP
|
||||||
|
.I -S
|
||||||
|
When reporting an error, show the line which caused it. Without this
|
||||||
|
option zmac reports errors in the canonical format, one-per-line (but
|
||||||
|
see the first item in the
|
||||||
|
.B BUGS
|
||||||
|
section).
|
||||||
|
.TP
|
||||||
|
.I -t
|
||||||
|
Give terse (single-letter) error codes in listing (with a key at the
|
||||||
|
end). (Normally the full error message is given.)
|
||||||
|
.TP
|
||||||
|
.I -T
|
||||||
|
Enable DDE throwback for reporting warnings and errors. This option
|
||||||
|
only exists for RISC OS builds.
|
||||||
|
.TP
|
||||||
|
.I -x
|
||||||
|
Output listing to
|
||||||
|
.IR listfile .
|
||||||
|
(It outputs to stdout if you specify the file as `-'.)
|
||||||
|
This has no effect if used with
|
||||||
|
.IR -l .
|
||||||
|
.TP
|
||||||
|
.I -z
|
||||||
|
Accept 8080-compatible instructions only; flag any Z80-specific ones
|
||||||
|
as errors. This lets you write 8080 programs in Z80 assembly, without
|
||||||
|
having to worry about the deeply nasty 8080 assembly syntax. :-)
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH "INPUT FORMAT"
|
||||||
|
zmac uses the standard Zilog mnemonics, and the pseudo-ops are also
|
||||||
|
largely as you'd expect.
|
||||||
|
.PP
|
||||||
|
Input can be upper or lowercase.
|
||||||
|
.PP
|
||||||
|
Comments start with `;' and carry on
|
||||||
|
to the end of the line.
|
||||||
|
.PP
|
||||||
|
Labels are declared with
|
||||||
|
`label:', `.label', `:label' or just `label' -
|
||||||
|
indentation is unimportant. (Labels can be up to 40 chars long.)
|
||||||
|
.PP
|
||||||
|
Number constants can take a trailing h or a leading &, $ or # for hex,
|
||||||
|
a trailing b for binary, a trailing o or q for octal, or a trailing
|
||||||
|
d for decimal.
|
||||||
|
.PP
|
||||||
|
Here is how other things work:
|
||||||
|
.TP
|
||||||
|
.B defb 42
|
||||||
|
A byte. `ascii', `byte', `db', `defm' and `text' are synonyms.
|
||||||
|
.TP
|
||||||
|
.B defb 'foobar'
|
||||||
|
An ASCII character string (not NUL-terminated).
|
||||||
|
Double quotes can also be used.
|
||||||
|
.TP
|
||||||
|
\fBdefb 'Who needs MS-DOG when you have *CP/M*?', 13, 10, '$'\fP
|
||||||
|
Strings, bytes, and comp.os.msdos.programmer troll. :-)
|
||||||
|
.TP
|
||||||
|
.B defw 2112
|
||||||
|
A word (16 bits). `word' and `dw' are synonyms.
|
||||||
|
.TP
|
||||||
|
.B defs 500
|
||||||
|
Insert 500 zero bytes. `block', `ds' and `rmem' are synonyms.
|
||||||
|
.TP
|
||||||
|
.B org
|
||||||
|
Set the address to assemble to.
|
||||||
|
.TP
|
||||||
|
.B equ
|
||||||
|
Define a symbol to have a fixed value. The symbol can be used before it
|
||||||
|
is defined. A symbol defined with `equ' or as a label can be defined only
|
||||||
|
once, except that a symbol defined with `equ' may be redefined to the
|
||||||
|
same value.
|
||||||
|
.TP
|
||||||
|
.B defl
|
||||||
|
Define a symbol to have a changeable value. The symbol cannot be used
|
||||||
|
before it is defined, and it can be redefined to a different value later
|
||||||
|
with another `defl'.
|
||||||
|
.TP
|
||||||
|
.B end
|
||||||
|
Ends the input. Any lines after an `end' are silently ignored.
|
||||||
|
If an arg is given, it declares the entry address for the program.
|
||||||
|
This has no effect if zmac is writing a raw binary file. In an Intel
|
||||||
|
hex file, it generates an S-record directing 0 bytes of data to be loaded
|
||||||
|
at the given address.
|
||||||
|
.TP
|
||||||
|
\fBif\fP ... [ \fBelse\fP ... ] \fBendif\fP
|
||||||
|
For conditional assembly. If you do `if foo' and foo evaluates to
|
||||||
|
zero, all the lines up until the next corresponding `else' or `endif'
|
||||||
|
are completely ignored. Conversely, if foo evaluates to non-zero, any
|
||||||
|
lines from a corresponding `else' to the `endif' are ignored. Ifs can
|
||||||
|
be nested. `cond'/`endc' are synonyms for `if'/`endif'.
|
||||||
|
.TP
|
||||||
|
\fBrsym\fP and \fBwsym\fP
|
||||||
|
Read/write a symbol file. These simply load/save the currently defined
|
||||||
|
symbols from/to the file specified (in a non-portable format). `rsym'
|
||||||
|
takes place at the point it is encountered in the file (on the first
|
||||||
|
pass); `wsym' is delayed until assembly has finished.
|
||||||
|
.TP
|
||||||
|
.B include
|
||||||
|
Include a file. Like C's (well, cpp's) #include, but the filename arg
|
||||||
|
lacks the angle brackets or quotes (though quotes may be used).
|
||||||
|
`read' is a synonym.
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH "ODDITIES"
|
||||||
|
There are the following oddities:
|
||||||
|
.TP
|
||||||
|
.B cmp
|
||||||
|
Same as `cp'.
|
||||||
|
.TP
|
||||||
|
.B jmp
|
||||||
|
Same as `jp'.
|
||||||
|
.TP
|
||||||
|
.B jp hl
|
||||||
|
Same as `jp (hl)'. Ditto for ix and iy.
|
||||||
|
.TP
|
||||||
|
.B ld hl, 'LH'
|
||||||
|
Oh, yes! Ditto for bc, de, sp, ix and iy.
|
||||||
|
.TP
|
||||||
|
\fBmin\fP and \fBmax\fP
|
||||||
|
Same as `defl' except that the symbol is defined as the
|
||||||
|
smaller or bigger of two comma-separated expressions.
|
||||||
|
.TP
|
||||||
|
\fBv\fP and \fBnv\fP
|
||||||
|
These are alternatives to `pe' and `po' respectively in `jp'
|
||||||
|
and `call' instructions, meaning that tests on the Z80's
|
||||||
|
(parity/)overflow flag can be written in the same
|
||||||
|
format (`x'/`nx') as for those on the zero or carry flags.
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH "LISTING PSEUDO-OPS"
|
||||||
|
There are several pseudo-ops for controlling the listing. None of
|
||||||
|
these ops appear in the listing themselves:
|
||||||
|
.TP
|
||||||
|
.B eject
|
||||||
|
Start a new listing page.
|
||||||
|
.TP
|
||||||
|
.B nolist
|
||||||
|
Do nothing. This can be used to have a comment in the source but not
|
||||||
|
the listing, I suppose.
|
||||||
|
.TP
|
||||||
|
.B "elist, flist, glist, mlist"
|
||||||
|
These have the same effect as the similarly-named command-line
|
||||||
|
options, though possibly with the sense reversed depending on the
|
||||||
|
default. Use an arg >0 (or no arg) to enable, and an arg <0 to
|
||||||
|
disable.
|
||||||
|
.TP
|
||||||
|
.B list
|
||||||
|
Sets whether to list or not. You can use this to avoid listing certain
|
||||||
|
parts of the source. Takes same optional arg as `elist', etc..
|
||||||
|
.TP
|
||||||
|
.B title
|
||||||
|
Set title (used in listing and symbol file).
|
||||||
|
.TP
|
||||||
|
.B space
|
||||||
|
Output arg blank lines in the listing, or one line if no arg is given.
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH "EXPRESSIONS"
|
||||||
|
Expressions are reasonably full-featured; here is the complete
|
||||||
|
list of operators, highest-precedence first. Operators separated
|
||||||
|
only by a space are synonyms; for example, `~' is the same as `not'.
|
||||||
|
.IP
|
||||||
|
! (logical), ~ not (bitwise), + (unary), - (unary)
|
||||||
|
.IP
|
||||||
|
*, /, % mod
|
||||||
|
.IP
|
||||||
|
+, -
|
||||||
|
.IP
|
||||||
|
<< shl, >> shr
|
||||||
|
.IP
|
||||||
|
< lt, > gt, <= le, >= ge
|
||||||
|
.IP
|
||||||
|
== = eq, != <> ne
|
||||||
|
.IP
|
||||||
|
& and (bitwise)
|
||||||
|
.IP
|
||||||
|
^ xor (bitwise)
|
||||||
|
.IP
|
||||||
|
| or (bitwise)
|
||||||
|
.PP
|
||||||
|
You can use normal parentheses or square brackets to override
|
||||||
|
the precedence rules; use square brackets where parentheses would
|
||||||
|
conflict with Z80 mnemonic syntax.
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH "MACROS"
|
||||||
|
The following defines a macro named m with zero or more formal parameters
|
||||||
|
p1, p2, ..., pn, zero or more local symbols ?s1, ?s2, ..., ?sm, and
|
||||||
|
body b1, b2, ...:
|
||||||
|
.IP
|
||||||
|
m macro p1, p2, ..., pn, ?s1, ?s2, ..., ?sm
|
||||||
|
.IP
|
||||||
|
b1
|
||||||
|
.IP
|
||||||
|
b2
|
||||||
|
.IP
|
||||||
|
...
|
||||||
|
.IP
|
||||||
|
endm
|
||||||
|
.PP
|
||||||
|
The macro is called by writing:
|
||||||
|
.IP
|
||||||
|
m v1, v2, ..., vn
|
||||||
|
.PP
|
||||||
|
A macro call expands to the text of the macro's body, with each
|
||||||
|
occurrence of a formal parameter pk replaced by the corresponding
|
||||||
|
value vk, and with each local symbol ?sk replaced by a new, unique
|
||||||
|
symbol invented for this call. Invented symbols begin with `?',
|
||||||
|
so you should avoid using such symbols elsewhere in your program.
|
||||||
|
.PP
|
||||||
|
zmac currently does not check that you have provided the right number
|
||||||
|
of parameters when calling a macro. If you provide too few, unmatched
|
||||||
|
formals are replaced with the empty string. If you provide too
|
||||||
|
many, the additional values begin to replace local symbols as if
|
||||||
|
they were ordinary parameters. (This could be considered a feature.)
|
||||||
|
After the local symbols are all replaced, additional parameters
|
||||||
|
are silently ignored.
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH "FILENAMES"
|
||||||
|
To allow source files to be portable, a canonical format should be
|
||||||
|
used for filenames in source files (i.e. in include, rsym or wsym
|
||||||
|
statements). This canonical format is basically the Un*x
|
||||||
|
format: `/' as the directory separator, `.' as the extension separator,
|
||||||
|
".." as the parent directory, "." as the current directory,
|
||||||
|
and a leading `/' as the root directory
|
||||||
|
(this should be avoided as it makes moving the source non-trivial).
|
||||||
|
.PP
|
||||||
|
For maximum portability, no element of such a filename should have
|
||||||
|
more than 10 characters, contain characters other than 0-9, a-z,
|
||||||
|
underscore and `.', or contain more than one `.'.
|
||||||
|
.PP
|
||||||
|
Filenames passed as command-line arguments (i.e. for the source
|
||||||
|
specification, or for the
|
||||||
|
.IR -o
|
||||||
|
or
|
||||||
|
.IR -x
|
||||||
|
options), however, are assumed to
|
||||||
|
be in the local (non-canonical) format; this includes the
|
||||||
|
extension separator (whether supplied or added) and any drive specifiers.
|
||||||
|
.PP
|
||||||
|
The OSes which are currently supported are Un*x, BeOS, DOS and RISC OS.
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH "MISCELLANEOUS"
|
||||||
|
In the symbol table listing, the `=' prefix is given for those symbols
|
||||||
|
defined by `equ' or `defl', and the `+' suffix is given for those
|
||||||
|
which were not used.
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH "EXIT STATUS"
|
||||||
|
.TP
|
||||||
|
.B 0
|
||||||
|
No errors.
|
||||||
|
.TP
|
||||||
|
.B 1
|
||||||
|
One or more errors were found during assembly, or zmac exited with a
|
||||||
|
fatal error.
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH BUGS
|
||||||
|
zmac reports each error in a line separately. This is probably a good
|
||||||
|
thing, but tends to effectively result in the same overall problem
|
||||||
|
being reported twice (e.g. a reference to an undefined symbol causes
|
||||||
|
both an undeclared error and a value error).
|
||||||
|
.PP
|
||||||
|
The man page isn't what you'd call extensive. This shouldn't be too
|
||||||
|
surprising as I had to RTFS to WTFM. :-)
|
||||||
|
.PP
|
||||||
|
What do phase/dephase do (they seem to be some way of temporarily
|
||||||
|
moving the program location -- for overlays?)?
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.IR as "(1)"
|
||||||
|
.\"
|
||||||
|
.\"------------------------------------------------------------------
|
||||||
|
.\"
|
||||||
|
.SH AUTHOR
|
||||||
|
Bruce Norskog (in 1978!).
|
||||||
|
.PP
|
||||||
|
Updates and bugfixes over the years by John Providenza, Colin Kelley,
|
||||||
|
and more recently by Russell Marks, Mark RISON, Chris Smith,
|
||||||
|
Matthew Phillips and Tim Mann.
|
||||||
|
.PP
|
||||||
|
Russell Marks wrote most of the man page, with tweaks by Mark RISON
|
||||||
|
and Tim Mann.
|
462
cpmtris/zmac/zmac.doc
Normal file
462
cpmtris/zmac/zmac.doc
Normal file
@ -0,0 +1,462 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
zmac(1) Development Tools zmac(1)
|
||||||
|
|
||||||
|
|
||||||
|
NAME
|
||||||
|
zmac - Z80 macro cross-assembler
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
zmac [--help] [--version] [-AbcdefghilLmnOpsStTz] [-o out-
|
||||||
|
file] [-x listfile] [filename]
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
zmac is a Z80 macro cross-assembler. It has all the fea-
|
||||||
|
tures you'd expect. It assembles the specified input file
|
||||||
|
(with a `.z' extension if there is no pre-existing exten-
|
||||||
|
sion and the file as given doesn't exist) and produces raw
|
||||||
|
binary output in a `.bin' file. (It can optionally produce
|
||||||
|
CP/M-style Intel hex format - see below.) By default it
|
||||||
|
also produces a nicely-formatted listing of the m/c along-
|
||||||
|
side the source, in a `.lst' file.
|
||||||
|
|
||||||
|
As well as normal Z80 programs, zmac lets you write 8080
|
||||||
|
programs in Z80 assembly. (See the `-z' option below.)
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
Most of the options control aspects of the listing.
|
||||||
|
|
||||||
|
--help Display a list of options and a terse description
|
||||||
|
of what the options do.
|
||||||
|
|
||||||
|
--version
|
||||||
|
Print version number.
|
||||||
|
|
||||||
|
-A Add an AMSDOS header to the generated binary file
|
||||||
|
(this option automatically disables generation of
|
||||||
|
hex output).
|
||||||
|
|
||||||
|
-b Don't generate the m/c output at all.
|
||||||
|
|
||||||
|
-c Make the listing continuous, i.e. don't generate
|
||||||
|
any page breaks or page headers. Can make things
|
||||||
|
less confusing if you're going to consult the list-
|
||||||
|
ing online rather than printing it. This is the
|
||||||
|
default.
|
||||||
|
|
||||||
|
-d Make the listing discontinuous.
|
||||||
|
|
||||||
|
-e Omit the `error report' section in the listing.
|
||||||
|
|
||||||
|
-f List instructions not assembled due to `if' expres-
|
||||||
|
sions being false. (Normally these are not shown in
|
||||||
|
the listing.)
|
||||||
|
|
||||||
|
-g List only the first line of equivalent hex for a
|
||||||
|
source line.
|
||||||
|
|
||||||
|
-h Output CP/M-ish Intel hex format (using extension
|
||||||
|
`.hex') rather than the default of a simple binary
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.3 2000-07-02 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
zmac(1) Development Tools zmac(1)
|
||||||
|
|
||||||
|
|
||||||
|
file (extension `.bin').
|
||||||
|
|
||||||
|
-i Don't list files included with `include'.
|
||||||
|
|
||||||
|
-l Don't generate a listing at all.
|
||||||
|
|
||||||
|
-L Generate listing no matter what. Overrides any con-
|
||||||
|
flicting options.
|
||||||
|
|
||||||
|
-m List macro expansions.
|
||||||
|
|
||||||
|
-n Omit line numbers from listing.
|
||||||
|
|
||||||
|
-o Output assembled code to outfile.
|
||||||
|
|
||||||
|
-O Suggest possible optimisations. (These are shown as
|
||||||
|
warnings.)
|
||||||
|
|
||||||
|
-p Use a few linefeeds for page break in listing
|
||||||
|
rather than ^L.
|
||||||
|
|
||||||
|
-s Omit the symbol table from the listing.
|
||||||
|
|
||||||
|
-S When reporting an error, show the line which caused
|
||||||
|
it. Without this option zmac reports errors in the
|
||||||
|
canonical format, one-per-line (but see the first
|
||||||
|
item in the BUGS section).
|
||||||
|
|
||||||
|
-t Give terse (single-letter) error codes in listing
|
||||||
|
(with a key at the end). (Normally the full error
|
||||||
|
message is given.)
|
||||||
|
|
||||||
|
-T Enable DDE throwback for reporting warnings and
|
||||||
|
errors. This option only exists for RISC OS
|
||||||
|
builds.
|
||||||
|
|
||||||
|
-x Output listing to listfile. (It outputs to stdout
|
||||||
|
if you specify the file as `-'.) This has no
|
||||||
|
effect if used with -l.
|
||||||
|
|
||||||
|
-z Accept 8080-compatible instructions only; flag any
|
||||||
|
Z80-specific ones as errors. This lets you write
|
||||||
|
8080 programs in Z80 assembly, without having to
|
||||||
|
worry about the deeply nasty 8080 assembly syntax.
|
||||||
|
:-)
|
||||||
|
|
||||||
|
INPUT FORMAT
|
||||||
|
zmac uses the standard Zilog mnemonics, and the pseudo-ops
|
||||||
|
are also largely as you'd expect.
|
||||||
|
|
||||||
|
Input can be upper or lowercase.
|
||||||
|
|
||||||
|
Comments start with `;' and carry on to the end of the
|
||||||
|
line.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.3 2000-07-02 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
zmac(1) Development Tools zmac(1)
|
||||||
|
|
||||||
|
|
||||||
|
Labels are declared with `label:', `.label', `:label' or
|
||||||
|
just `label' - indentation is unimportant. (Labels can be
|
||||||
|
up to 40 chars long.)
|
||||||
|
|
||||||
|
Number constants can take a trailing h or a leading &, $
|
||||||
|
or # for hex, a trailing b for binary, a trailing o or q
|
||||||
|
for octal, or a trailing d for decimal.
|
||||||
|
|
||||||
|
Here is how other things work:
|
||||||
|
|
||||||
|
defb 42
|
||||||
|
A byte. `ascii', `byte', `db', `defm' and `text'
|
||||||
|
are synonyms.
|
||||||
|
|
||||||
|
defb 'foobar'
|
||||||
|
An ASCII character string (not NUL-terminated).
|
||||||
|
Double quotes can also be used.
|
||||||
|
|
||||||
|
defb 'Who needs MS-DOG when you have *CP/M*?', 13, 10, '$'
|
||||||
|
Strings, bytes, and comp.os.msdos.programmer troll.
|
||||||
|
:-)
|
||||||
|
|
||||||
|
defw 2112
|
||||||
|
A word (16 bits). `word' and `dw' are synonyms.
|
||||||
|
|
||||||
|
defs 500
|
||||||
|
Insert 500 zero bytes. `block', `ds' and `rmem'
|
||||||
|
are synonyms.
|
||||||
|
|
||||||
|
org Set the address to assemble to.
|
||||||
|
|
||||||
|
equ Define a symbol to have a fixed value. The symbol
|
||||||
|
can be used before it is defined. A symbol defined
|
||||||
|
with `equ' or as a label can be defined only once,
|
||||||
|
except that a symbol defined with `equ' may be
|
||||||
|
redefined to the same value.
|
||||||
|
|
||||||
|
defl Define a symbol to have a changeable value. The
|
||||||
|
symbol cannot be used before it is defined, and it
|
||||||
|
can be redefined to a different value later with
|
||||||
|
another `defl'.
|
||||||
|
|
||||||
|
end Ends the input. Any lines after an `end' are
|
||||||
|
silently ignored. If an arg is given, it declares
|
||||||
|
the entry address for the program. This has no
|
||||||
|
effect if zmac is writing a raw binary file. In an
|
||||||
|
Intel hex file, it generates an S-record directing
|
||||||
|
0 bytes of data to be loaded at the given address.
|
||||||
|
|
||||||
|
if ... [ else ... ] endif
|
||||||
|
For conditional assembly. If you do `if foo' and
|
||||||
|
foo evaluates to zero, all the lines up until the
|
||||||
|
next corresponding `else' or `endif' are completely
|
||||||
|
ignored. Conversely, if foo evaluates to non-zero,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.3 2000-07-02 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
zmac(1) Development Tools zmac(1)
|
||||||
|
|
||||||
|
|
||||||
|
any lines from a corresponding `else' to the
|
||||||
|
`endif' are ignored. Ifs can be nested.
|
||||||
|
`cond'/`endc' are synonyms for `if'/`endif'.
|
||||||
|
|
||||||
|
rsym and wsym
|
||||||
|
Read/write a symbol file. These simply load/save
|
||||||
|
the currently defined symbols from/to the file
|
||||||
|
specified (in a non-portable format). `rsym' takes
|
||||||
|
place at the point it is encountered in the file
|
||||||
|
(on the first pass); `wsym' is delayed until assem-
|
||||||
|
bly has finished.
|
||||||
|
|
||||||
|
include
|
||||||
|
Include a file. Like C's (well, cpp's) #include,
|
||||||
|
but the filename arg lacks the angle brackets or
|
||||||
|
quotes (though quotes may be used). `read' is a
|
||||||
|
synonym.
|
||||||
|
|
||||||
|
ODDITIES
|
||||||
|
There are the following oddities:
|
||||||
|
|
||||||
|
cmp Same as `cp'.
|
||||||
|
|
||||||
|
jmp Same as `jp'.
|
||||||
|
|
||||||
|
jp hl Same as `jp (hl)'. Ditto for ix and iy.
|
||||||
|
|
||||||
|
ld hl, 'LH'
|
||||||
|
Oh, yes! Ditto for bc, de, sp, ix and iy.
|
||||||
|
|
||||||
|
min and max
|
||||||
|
Same as `defl' except that the symbol is defined as
|
||||||
|
the smaller or bigger of two comma-separated
|
||||||
|
expressions.
|
||||||
|
|
||||||
|
v and nv
|
||||||
|
These are alternatives to `pe' and `po' respec-
|
||||||
|
tively in `jp' and `call' instructions, meaning
|
||||||
|
that tests on the Z80's (parity/)overflow flag can
|
||||||
|
be written in the same format (`x'/`nx') as for
|
||||||
|
those on the zero or carry flags.
|
||||||
|
|
||||||
|
LISTING PSEUDO-OPS
|
||||||
|
There are several pseudo-ops for controlling the listing.
|
||||||
|
None of these ops appear in the listing themselves:
|
||||||
|
|
||||||
|
eject Start a new listing page.
|
||||||
|
|
||||||
|
nolist Do nothing. This can be used to have a comment in
|
||||||
|
the source but not the listing, I suppose.
|
||||||
|
|
||||||
|
elist, flist, glist, mlist
|
||||||
|
These have the same effect as the similarly-named
|
||||||
|
command-line options, though possibly with the
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.3 2000-07-02 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
zmac(1) Development Tools zmac(1)
|
||||||
|
|
||||||
|
|
||||||
|
sense reversed depending on the default. Use an arg
|
||||||
|
>0 (or no arg) to enable, and an arg <0 to disable.
|
||||||
|
|
||||||
|
list Sets whether to list or not. You can use this to
|
||||||
|
avoid listing certain parts of the source. Takes
|
||||||
|
same optional arg as `elist', etc..
|
||||||
|
|
||||||
|
title Set title (used in listing and symbol file).
|
||||||
|
|
||||||
|
space Output arg blank lines in the listing, or one line
|
||||||
|
if no arg is given.
|
||||||
|
|
||||||
|
EXPRESSIONS
|
||||||
|
Expressions are reasonably full-featured; here is the com-
|
||||||
|
plete list of operators, highest-precedence first. Opera-
|
||||||
|
tors separated only by a space are synonyms; for example,
|
||||||
|
`~' is the same as `not'.
|
||||||
|
|
||||||
|
! (logical), ~ not (bitwise), + (unary), - (unary)
|
||||||
|
|
||||||
|
*, /, % mod
|
||||||
|
|
||||||
|
+, -
|
||||||
|
|
||||||
|
<< shl, >> shr
|
||||||
|
|
||||||
|
< lt, > gt, <= le, >= ge
|
||||||
|
|
||||||
|
== = eq, != <> ne
|
||||||
|
|
||||||
|
& and (bitwise)
|
||||||
|
|
||||||
|
^ xor (bitwise)
|
||||||
|
|
||||||
|
| or (bitwise)
|
||||||
|
|
||||||
|
You can use normal parentheses or square brackets to over-
|
||||||
|
ride the precedence rules; use square brackets where
|
||||||
|
parentheses would conflict with Z80 mnemonic syntax.
|
||||||
|
|
||||||
|
MACROS
|
||||||
|
The following defines a macro named m with zero or more
|
||||||
|
formal parameters p1, p2, ..., pn, zero or more local sym-
|
||||||
|
bols ?s1, ?s2, ..., ?sm, and body b1, b2, ...:
|
||||||
|
|
||||||
|
m macro p1, p2, ..., pn, ?s1, ?s2, ..., ?sm
|
||||||
|
|
||||||
|
b1
|
||||||
|
|
||||||
|
b2
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
endm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.3 2000-07-02 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
zmac(1) Development Tools zmac(1)
|
||||||
|
|
||||||
|
|
||||||
|
The macro is called by writing:
|
||||||
|
|
||||||
|
m v1, v2, ..., vn
|
||||||
|
|
||||||
|
A macro call expands to the text of the macro's body, with
|
||||||
|
each occurrence of a formal parameter pk replaced by the
|
||||||
|
corresponding value vk, and with each local symbol ?sk
|
||||||
|
replaced by a new, unique symbol invented for this call.
|
||||||
|
Invented symbols begin with `?', so you should avoid using
|
||||||
|
such symbols elsewhere in your program.
|
||||||
|
|
||||||
|
zmac currently does not check that you have provided the
|
||||||
|
right number of parameters when calling a macro. If you
|
||||||
|
provide too few, unmatched formals are replaced with the
|
||||||
|
empty string. If you provide too many, the additional
|
||||||
|
values begin to replace local symbols as if they were
|
||||||
|
ordinary parameters. (This could be considered a fea-
|
||||||
|
ture.) After the local symbols are all replaced, addi-
|
||||||
|
tional parameters are silently ignored.
|
||||||
|
|
||||||
|
FILENAMES
|
||||||
|
To allow source files to be portable, a canonical format
|
||||||
|
should be used for filenames in source files (i.e. in
|
||||||
|
include, rsym or wsym statements). This canonical format
|
||||||
|
is basically the Un*x format: `/' as the directory separa-
|
||||||
|
tor, `.' as the extension separator, ".." as the parent
|
||||||
|
directory, "." as the current directory, and a leading `/'
|
||||||
|
as the root directory (this should be avoided as it makes
|
||||||
|
moving the source non-trivial).
|
||||||
|
|
||||||
|
For maximum portability, no element of such a filename
|
||||||
|
should have more than 10 characters, contain characters
|
||||||
|
other than 0-9, a-z, underscore and `.', or contain more
|
||||||
|
than one `.'.
|
||||||
|
|
||||||
|
Filenames passed as command-line arguments (i.e. for the
|
||||||
|
source specification, or for the -o or -x options), how-
|
||||||
|
ever, are assumed to be in the local (non-canonical) for-
|
||||||
|
mat; this includes the extension separator (whether sup-
|
||||||
|
plied or added) and any drive specifiers.
|
||||||
|
|
||||||
|
The OSes which are currently supported are Un*x, BeOS, DOS
|
||||||
|
and RISC OS.
|
||||||
|
|
||||||
|
MISCELLANEOUS
|
||||||
|
In the symbol table listing, the `=' prefix is given for
|
||||||
|
those symbols defined by `equ' or `defl', and the `+' suf-
|
||||||
|
fix is given for those which were not used.
|
||||||
|
|
||||||
|
EXIT STATUS
|
||||||
|
0 No errors.
|
||||||
|
|
||||||
|
1 One or more errors were found during assembly, or
|
||||||
|
zmac exited with a fatal error.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.3 2000-07-02 6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
zmac(1) Development Tools zmac(1)
|
||||||
|
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
zmac reports each error in a line separately. This is
|
||||||
|
probably a good thing, but tends to effectively result in
|
||||||
|
the same overall problem being reported twice (e.g. a ref-
|
||||||
|
erence to an undefined symbol causes both an undeclared
|
||||||
|
error and a value error).
|
||||||
|
|
||||||
|
The man page isn't what you'd call extensive. This
|
||||||
|
shouldn't be too surprising as I had to RTFS to WTFM. :-)
|
||||||
|
|
||||||
|
What do phase/dephase do (they seem to be some way of tem-
|
||||||
|
porarily moving the program location -- for overlays?)?
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
as(1)
|
||||||
|
|
||||||
|
AUTHOR
|
||||||
|
Bruce Norskog (in 1978!).
|
||||||
|
|
||||||
|
Updates and bugfixes over the years by John Providenza,
|
||||||
|
Colin Kelley, and more recently by Russell Marks, Mark
|
||||||
|
RISON, Chris Smith, Matthew Phillips and Tim Mann.
|
||||||
|
|
||||||
|
Russell Marks wrote most of the man page, with tweaks by
|
||||||
|
Mark RISON and Tim Mann.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.3 2000-07-02 7
|
||||||
|
|
||||||
|
|
3886
cpmtris/zmac/zmac.y
Normal file
3886
cpmtris/zmac/zmac.y
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user