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