Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
PMARS(6)			  Games Manual				PMARS(6)

NAME
     pmars - portable corewar system with ICWS'94 extensions

SYNOPSIS
     pmars [ option ...  ] file1 [ file(s) ]

DESCRIPTION
     pMARS  (portable  Memory  Array Redcode Simulator) is a corewar interpreter
     with multi-platform support.  pMARS currently runs on UNIX systems, PC/DOS,
     VMS, Amiga (AmigaDOS command line), and  the  Mac.   pMARS  implements  the
     ICWS'94 draft standard, but can also be used in ICWS'88 mode. The base sys-
     tem  includes  a  graphical  core	display  for  UNIX  (curses, X-windows),
     PC/linux (svgalib), PC/DOS and the Mac (see APPENDIX). A line-oriented  de-
     bugger  is included to help in writing warriors for the ICWS'94 draft stan-
     dard.

     pMARS runs one or more warriors written in Redcode  that  are  provided  as
     file(s) on the command line.  Running a single warrior is supported for de-
     bugging.  Two warriors are pitted against each other for standard play, but
     up to 36 warriors can be named for "multi-warrior" core war.  If  the  war-
     rior(s) assemble without error they are loaded into the core array and exe-
     cuted  in	round-robin  mode starting with the first warrior.  Warrior 1 is
     loaded starting at core position 0, warrior 2, 3, etc., at either a  random
     or  fixed	position.  For fairness the starting order is rotated after each
     round.

SCORE
     The score is reported after all rounds have been played. A round ends  when
     either  a	single surviving warrior remains or when a maximum number of cy-
     cles has elapsed.	For each  round,  every  surviving  warrior  is  awarded
     points calculated from a score formula (F).  By default, this is (W*W-1)/S,
     where  W  is the total number of warriors participating, S is the number of
     of survivors, and "/" is integer division. Alternative score  formulas  can
     be specified with the = option (see below).

     When  two	warriors  battle,  the results are reported as wins1, wins2, and
     ties, where wins1 and wins2 are the numbers of  rounds  that  each  warrior
     won,  and ties are the number of rounds in which both warriors lasted until
     time-out.	The score is then:

	     warrior 1:  points = wins1 * F + ties * F
	     warrior 2:  points = wins2 * F + ties * F

     F is a score formula containing the W and S parameters.  When more than two
     warriors (W) participate in  a  game,  results  are  reported  as	wins[1],
     wins[2],  ..,  wins[W],  losses for each warrior, where the index indicates
     the number of warriors that survived until the  end  (S  parameter  in  the
     score  formula). The total number of points for each warrior is then calcu-
     lated as:

	     points =  sum (S=1..W) (wins[S] * F)

     A few alternative score formulas:
	     10
	     (W+1)/S
	     (x=W-S+1)*(x+1)/2
	     (S==3)*5 + (S==2)*3 + (S==1)
	     (S == 1)*W + (S != 1)

OPTIONS
     Command line options may occur anywhere on the command line.  Single-letter
     options  without  a parameter can be combined as in -fbe. The special argu-
     ment - (dash) stands for standard input (stdin). It can  be  combined  with
     the  -@  option (see below) to signify reading options from stdin, or the -
     can take the place of a  warrior  filename,  in  which  case  warrior  code
     starting with a ;redcode line and ending with an END statement is extracted
     from  stdin. The END statement can be omitted if the next ;redcode line im-
     mediately follows the last instruction. Several warriors, each specified by
     a separate dash on the command line and bracketed by  ;redcode/END  can  be
     piped  into  pMARS.   #-  (where # is a positive number) is a shorthand for
     writing this number of dashes on the command line.

     -r #   This options sets the number of rounds to play. The default is 1. -r
	    0 produces assembly output (unless -b is specified),  but  does  not
	    execute the warrior(s). A maximum of 32787 rounds can be specified.

     -s #   The  -s  option  specifies	the size of core memory in number of in-
	    structions.  It defaults to 8000. Maximum core size is  platform-de-
	    pendent, but usually at least 65535.

     -c #   -c sets the maximum number of cycles per round.  A cycle consists of
	    one  execution  of	each  warrior. A round ends when either a single
	    warrior remains executing or when the maximum number of  cycles  has
	    elapsed.

     -p #   This  option sets the maximum number of processes a warrior can run.
	    The default is 8000.

     -l #   This sets the maximum length of a warrior source  file  in	instruc-
	    tions.  It defaults to 100 and can be up to 500.

     -d #   This  option  specifies  the  minimum distance between the first in-
	    struction of each warrior. It cannot be  smaller  than  the  maximum
	    length (-l option) and defaults to 100 instructions.

     -S #   The  -S  option sets the size of the P-space to # cells. The default
	    is 1/16th of core size if core size is evenly divisible by	sixteen,
	    or	the next larger divisible fraction. See also the P-SPACE section
	    below.

     -f     The -f option instructs the loader to use  a  fixed  series  of  ad-
	    dresses  for  positioning warriors. This is done by initializing the
	    pseudo random number generator with a checksum  value  derived  from
	    the  source of all warriors.  Thus, initial placements will still be
	    "random" from round to round, but will be the same if the same  war-
	    riors  are	run  again.  As a consequence, the result of battles run
	    with the -f option will show no statistical fluctuations.  This  op-
	    tions  is  useful for validating ports of pMARS to new platforms and
	    for providing an absolute, albeit arbitrary performance measure  for
	    warriors.

     -F #   This  option  server  two  purposes.  It  sets the seed value of the
	    pseudo random number generator, and also tells the loader to install
	    warrior 2 at the given address # for  round  1.  If  the  number  is
	    larger  than  the  core  size minus the minimum warrior distance, it
	    will be wrapped around to the range of available starting positions.
	    This option is useful for testing different versions  of  a  warrior
	    with  constant  initial placement.	Warrior 1 is always installed at
	    address 0.	The -F and -f options are mutually exclusive. If neither
	    option is specified, the pseudo random number generator is	initial-
	    ized with the system time.

     -P     This option makes pMARS use an alternative algorithm for positioning
	    warriors.  This algorithm uses all possible combinations of starting
	    order and position in a random sequence, and will not use  the  same
	    combination  twice	unless	all  the  combinations have already been
	    used. If the -r option is not given, the  number  of  rounds  fought
	    will be the number of all possible combinations.  Trying to use this
	    option with more (or less) than two warriors causes an error.

     -e     If this option is specified, the cdb debugger is entered immediately
	    after loading warriors into core.

     -b     This  options runs pMARS in brief output mode. -b suppresses warrior
	    listings after assembly.

     -k     With the -k option, pMARS uses the same output format  as  the  KotH
	    program.  This option enables pMARS to work with scripts written for
	    the KotH server.

     -8     This options enforces strict compliance with  the  ICWS'88	standard
	    and  disables  all ICWS'94 language extensions, which are flagged as
	    syntax errors by the assembler.  Since  ICWS'94  is  a  superset  of
	    ICWS'88, this options is not necessary to run ICWS'88 warriors.

     -o     When  this option is given, pMARS reports scores in decreasing order
	    rather than in the order warriors were named on  the  command  line.
	    This is mostly useful for multi-warrior play.

     -V     The  assembler  generates  verbose	output with this option. This is
	    only useful for debugging.

     -v     This option sets the display mode for UNIX and DOS display	versions
	    (see APPENDIX).

     -@ <fn>
	    pMARS  continues  reading  options	and filenames from the parameter
	    file <fn>.	If <fn> is a - (dash) standard input is parsed. Comments
	    in the parameter file start with a semicolon.

     -= <string>
	    The = (equal) option allows you to specify a  custom  score  formula
	    (see  SCORE).  The	formula  may contain the standard arithmetic and
	    logical operators (as in the C language), as well as the  parameters
	    W  (number of warriors participating) and S (number of warriors sur-
	    viving this round). You need to  enclose  the  formula  string  with
	    quotes  if it contains spaces or characters interpreted by the oper-
	    ating system.

     -Q #   The "query" option is intended for use in scripts that run pMARS  in
	    batch  mode.  Depending on the number code following -Q, the program
	    returns an informative number as the exit status.  "pmars  -Q  1000"
	    e.g.  will	cause pMARS to exit with a code that spells out the pro-
	    gram version. More on -Q arguments and exit codes can  be  found  in
	    the ADDENDUM.

     $	    The  $  (dollar)  parameter  is not preceded by a dash and cannot be
	    grouped with other options. It terminates reading command line para-
	    meters and is used in parameter files or input streams (-@ fn).  The
	    $ is necessary if you want to combine two or more  of  command  line
	    parameters,  warrior  code and cdb commands in the same input stream
	    or file. Below an example of such a combined input file:
		;Below the command line parameters:
		-r 10 -beF 1000 2- $
		;redcode
		;name Imp 1
		;assert 1
		mov 0,1
		end
		;redcode
		;name Imp 2
		;assert 1
		mov 0,2
		mov 0,2
		end
		!! cdb commands follow:
		sk 1000
		reg
		quit

X-WINDOWS OPTIONS
     The X-Windows display version of pMARS has these  additional  command  line
     options:

     -display <string>
	    Expects  a string specifying the display where the window should ap-
	    pear.  Following X standards, this display specification has a  for-
	    mat  of  hostname.domain:display.screen  where  the  part before the
	    colon is the standard internet host specification  and  display  and
	    screen  are  integers.  The screen specification can be omitted. For
	    an example,  consider  you	are  working  at  an  X  terminal  named
	    ncd13.complang.tuwien.ac.at   and	remotely   logged   in	at  host
	    stud1.tuwien.ac.at where the binary of pmars lies, you can	use  the
	    following command line

       stud1$ pmars -display ncd13.complang.tuwien.ac.at:0 -b aeka.red aeka.red
       and the window will appear at you local screen.

     -geometry <string>
	    Lets  you  specify	the initial size and position of the window. The
	    format is widthxheight+x+y where width, height, x,	y  are	integers
	    and + may be replaced by -. Either of the two parts (widthxheight or
	    +x+y)  may	be  omitted. This overrides the -v switch concerning the
	    window geometry. As an example, pmars -geometry 600x400+30+100  ....
	    will  open	a  window  of  600  by 400 pixels at the screen position
	    (30,100).  pmars -geometry 1024x768 ... creates a window of 1024x768
	    pixels and pmars -geometry -20+300 ... creates a window  with  stan-
	    dard size with its left upper corner at position (-20,300), i.e. out
	    of the left side of the screen.

     -fn <string>
	    The  string  following this argument specifies the X font to use. By
	    default, a terminal font is used.  If  this  font  can't  be  found,
	    "fixed" is used for a font ("fixed" should be present at every X in-
	    stallation).   Use	the command 'xlsfonts' to get a listing of fonts
	    that can be used at your X server. 'xfontsel' provides a comfortable
	    way to select a font. "fixed" is the fallback if the specified  font
	    can't  be  found.	It  is strongly recommended to use a fixed pitch
	    font.

     The argument of the -v display option has an additional fourth digit in the
     X-Windows version: 0  (the  default)  enables  the  color	display,  1  the
     grayscale,  and  2  the  black  and  white  display  (e.g.  -v 1033 for the
     grayscale display).

REDCODE
     pMARS implements an extension of the proposed ICWS'94 standard. The new in-
     struction modifiers .A,.B,.AB,.F,.X, and .I,  the	arithmetic  instructions
     MUL,  DIV	and  MOD,  as well as post-increment indirect (>) are supported.
     pMARS currently does not implement read/write ranges, although they may  be
     added in future versions.

     Version  0.5  of pMARS adds support for three experimental opcodes that are
     currently not included in the ICWS'94 draft:

     SEQ (Skip if EQual): this is a synonym for CMP and is included  mainly  for
     clarity  (future  versions of pMARS may implement SEQ as a "predefined EQU"
     rather than a true opcode).

     SNE (Skip if Not Equal): the opposite of SEQ.

     NOP (No OPerations): do nothing.

     Version 0.6 adds three new indirect addressing modes that use  the  A-field
     instead of the B-field as the pointer for indirection:

     * - indirect using A-field

     { - predrecement indirect using A-field

     } - postincrement indirect using A-field

     The  new  P-space	instructions of version 0.8 are discussed under separate
     heading below.

     The assembler also supports multi-line EQU statements, a  feature	not  in-
     cluded in the current ICWS'94 draft.  The format for multi-line EQUates is
	 <label> EQU <line1>
		 EQU <line2>
		 [...]
		 EQU <lineN>
     <label>  in  the  warrior	source	is replaced by <line1> <newline> <line2>
     <newline> [....] lineN. In contrast to KotH, pmars  EQUs  substitute  arbi-
     trary  text,  and not just expressions.  EQU expressions are not implicitly
     parenthesized.

     pMARS features the non-standard FOR text-repetition macro.  This macro  re-
     peats the text between FOR and ROF a specified number of times:
     <labels> <counter> FOR <times>
			[..]
			ROF
     <times>  is  an expression specifying the number of expansions; it may con-
     tain EQUates and labels as long  as  they	have  been  defined  before  the
     FOR/ROF  block.   <counter>  is the last label before the FOR word, but not
     necessarily on the same line.  It is expanded to 01,  02,	..,  <times>  in
     each  repetition.	The  optional <labels> label the first instruction after
     FOR expansion. An example:
	     ORG start
     start
     sp      FOR 2
     a&sp	 SPL a&sp
		 JMP a&sp
	     ROF

     becomes after expansion

     start
     a01     SPL a01
	     JMP a01
     a02     SPL a02
	     JMP a02
     The symbol & concatenates 'a' and 01, 02 to form a valid label.  EQU expan-
     sion and FOR/ROF processing is done in the same pass.  It is therefore pos-
     sible to write
     dest01  EQU 500
     dest02  EQU 1000
     dest03  EQU 1500

     idx     FOR 3
		 MOV src,dest&idx
		 MOV src+1,dest&idx
	     ROF

     src     MOV <-1,<-1
	     JMP src,<-2
     Using predefined EQUates (see below) it  is  possible  to	define	adaptive
     FOR/ROF  blocks. The next example fills the remainder of the warrior (up to
     MAXLENGTH lines) with decoy instructions:
	 FOR MAXLENGTH-CURLINE
	     DAT 1,1
	 ROF
     Since true logical expressions have a value of "1" and false expressions  a
     value  of	"0",  you  can	write  conditionally  assembled code enclosed by
     FOR/ROF:
	 FOR CORESIZE == 8000
	 <some code>
	 ROF

	 FOR CORESIZE != 8000
	 <other code>
	 ROF
     pMARS uses KotH-style ;name and ;author comments to describe warriors.   If
     a line starting with ;redcode is present, all text preceding it is ignored.
     This makes it possible to run posted warriors without removing mail headers
     and descriptive text.  The ;version, ;strategy and other comments mentioned
     in the ICWS'94 draft are currently not used.

     As another "non-standard" extension, the assembler predefines the following
     run-time  variables:  CORESIZE, MAXPROCESSES, MAXCYCLES, MAXLENGTH, MINDIS-
     TANCE, ROUNDS, and PSPACESIZE.  They can be used in your Redcode as  though
     they were defined by EQUs like
	 CORESIZE     EQU 55440  ;current value of -s parameter
	 MAXPROCESSES EQU 10000  ;current value of -p parameter
	 [etc.]
     The  run-time  variable CURLINE holds the current instruction number offset
     from the first instruction. WARRIORS is initialized with the number of war-
     riors specified on the command line.

     pMARS supports the ;assert directive as a way of checking whether a warrior
     is run under the parameters it was designed for. If the expression  follow-
     ing  ;assert  evaluates  to  "0" (false), assembly is aborted with an error
     message. If an ;assert is missing, a warning is issued. Examples:
	 ;assert CORESIZE == 55440 && MAXLENGTH >= 200
	 ;assert !(CORESIZE % 4)  ; is multiple of 4
	 ;assert 1 ; if warrior works under all settings
     The run-time variable VERSION holds the current pMARS version (e.g. "60" is
     v0.6.0) and is useful in ;assert expressions.

     With the -8 option, pMARS is fully ICWS'88 compatible, except that a  comma
     is  required  between  operands.  Extensions like predefined and multi-line
     EQUs and FOR/ROF are supported even in ICWS'88 mode.

     A full treatment of corewar and ICWS'94 in particular is beyond  the  scope
     of  this document. General information about corewar as well as the ICWS'94
     draft is available by anonymous FTP from soda.berkeley.edu in pub/corewar.

P-SPACE
     Originating from discussions on rec.games.corewar, P-space is an attempt at
     making warriors more "intelligent" by giving them a memory.  P-space, short
     for "private", "permanent" or "priviledged" space is a memory area separate
     from core whose contents is not cleared between rounds. Every  warrior  has
     its  own  P-space for gathering information about the opposing warrior, but
     there is a provision for sharing P-space in team play (see below).

     P-space cells contain values in the range 0..CORESIZE-1. The number  of  P-
     space cells can be adjusted with the -S command line option; by default, P-
     space  size  is 1/16th of CORESIZE. This number is available to warriors as
     the predefined variable PSPACESIZE.  pMARS updates P-space cell  0  at  the
     beginning	of each round with the result of the previous round: 0 signifies
     a loss in the previous round, a number larger than zero means that the war-
     rior survived until the end of the round, the value indicating  the  number
     of  surviving warriors. That is, a value of "1" means that the warrior sur-
     vived by itself (a "win" in a two-warrior battle), a value of "2" that  two
     warriors  lasted until the end (a "tie" in a two warrior battle), etc..  In
     the first round, P-cell 0 is set to -1 (actually  CORESIZE-1)  to	indicate
     that there is no previous result.

     There are two new instructions for accessing P-space:

     LDP    (Load  P-space) loads P-space cell specified by A-value into core at
	    B-address.

     STP    (Store P-space) stores A-value into P-space  cell  specified  by  B-
	    value.

     It  is important to note that P-space cells are refered to by A/B-values as
     opposed to A/B-addresses. As an example, "STP #9,#1" stores number 9 in  P-
     cell 1.

     Since  all  P-space access is only via these two instructions, it takes too
     much time and space to use P-space for working variables where  they  would
     be  safe  from  the opposing warrior. P-space was made deliberately hard to
     access, unlike a set of general purpose registers.

     P-space can also be used for communication between warriors belonging to  a
     team  in  multi-warrior core war. To allow communication, P-space has to be
     declared as "shared". You do this by including  the  PIN  pseudo-opcode  in
     your source:

     PIN    (P-space  Identification Number) has a single numerical argument. If
	    two or more participating warriors have the same PIN argument,  they
	    share  the	same P-space. If the PIN pseudo-opcode is missing from a
	    warrior's source, its P-space is strictly private. The PIN	argument
	    is	not normalized to [0..CORESIZE-1] before comparison. "PIN 0" and
	    "PIN CORESIZE" are therefore not the same.

     P-cell #0 holding the result of the last round is exempt from sharing, i.e.
     every warrior has its own last round cell even though the rest  of  its  P-
     space may be shared.

CDB DEBUGGER
     Cdb  is a line-oriented debugger. It is invoked either by specifying the -e
     option (enter cdb immediately), by including debugging commands in the war-
     rior source, or by hitting Ctrl-C during the simulation.  The  debugger  is
     also entered whenever a warrior terminates ("post-mortem") if execution was
     started  with the go command.  cdb is very powerful and has an overwhelming
     number of commands. You may want to start with only  the  most  often  used
     commands: step (single step execution), go (execute until breakpoint), list
     (look  at	core), trace and untrace (set and remove breakpoints), and go on
     to more complex ones later.

     The following commands are available at the cdb prompt; commands can be ab-
     breviated to the first unambiguous substring.

     <Enter>
	    repeats the last command issued at the cdb prompt.

     help   displays a brief command summary.

     progress
	    displays the status of the current game in progress.

     registers
	    displays the current state of the simulator, including program coun-
	    ters and task queues.

     go     runs the simulator until an instruction whose trace bit  is  set  is
	    executed.  If  there  are  no  traced instructions go returns to the
	    post-mortem debugger.

     step   executes the next instruction in the task queue and returns  to  the
	    cdb prompt.

     continue
	    returns to the simulator to complete the game without interruptions.

     thread
	    is	similar  to  step  except  that  only the current task thread is
	    traced.

     skip [count]
	    executes the next [count] instructions in the queue silently  before
	    returning to the cdb prompt.

     execute [address]
	    resets  the  task queue of the current warrior to [address] and exe-
	    cutes it. This is useful in conjunction with edit.

     quit   aborts pMARS and returns to the OS prompt.

     trace [range]
	    sets the trace bit of the specified address or address range.

     untrace [range]
	    clears the trace bit of the specified address or address range.

     moveable on|off
	    specifies whether the trace bit is copied by the MOV.I  instruction.
	    The default is on.

     list [range]
	    displays  the  specified range of core addresses, a set trace bit is
	    indicated by 'T'.  Unmodified addresses (DAT.F  0,0)  are  shown  as
	    blank.

     edit [range]
	    allows  modifying core. The specified addresses are edited by typing
	    in new instructions. Typing one or more spaces leaves the  core  ad-
	    dress unchanged, just hitting <return> repeats the last input, and a
	    syntax  error aborts the edit. The full Redcode syntax including la-
	    bels and (multi-line) EQUates can be used. Label and EQUate  defini-
	    tions  remain in effect until the program terminates.  The edit com-
	    mand is useful for modifying warriors and trying out single instruc-
	    tions without having to exit and restart pMARS.

     fill [range]
	    is similar to edit.  Instructions in the  specified  range	are  re-
	    placed  by one typed in instruction. Entering DAT.F 0,0 ,e.g. clears
	    the address range.

     search [pattern]
	    searches core instructions for a text pattern in the forward  direc-
	    tion.  The	next  instruction  matching  [pattern] is displayed. The
	    search includes the address number and trace symbol  (T),  is  case-
	    and  space-insensitive  and  may  contain  wildcards:  *  (asteriks)
	    matches any number of characters; ? (question mark) matches  exactly
	    one  character.  E.g. "search ," searches for the next non-blank ad-
	    dress; "search dat*, ?0t" searches for the next DAT instruction that
	    is traced and has a zero B-operand value, regardless of modifier, A-
	    operand and B-mode.

     write [file]
	    opens a file for logging subsequent cdb output to.	The  logfile  is
	    closed by issuing write without an argument.

     echo [string]
	    is	used mostly inside macros. [string] is echoed to the screen fol-
	    lowed by <newline>.

     remark [string]
	    is ignored by cdb and can therefore be used to comment macros.

     cls    clears the screen. The no-display UNIX version does this by  echoing
	    an	ANSI  escape sequence; if this doesn't work for you, you need to
	    change the CLRSCR string in config.h and recompile.  clear is a syn-
	    onym for cls .

     display clear|on|off|nnn
	    (available in display versions only) allows clearing the  core  dis-
	    play  (display  clear)  or	changing  the  display mode.  display on
	    changes the display to the default mode, display off (same	as  dis-
	    play  0  ) suspends all display updates, and display nnn , where nnn
	    is a 1 to 3-digit number, sets the display to this	mode.  "nnn"  is
	    interpreted  like  the  parameter to the -v command line option (see
	    APPENDIX).

     switch [1|2]
	    (available in display versions only) makes the left (1) or right (2)
	    panel the current panel for cdb output. Without  a	number	argument
	    switch  changes to the other panel. If the right panel doesn't exist
	    (initially, or after close, see below), it is created first.

     close  (available in display versions only) closes the right cdb panel  (if
	    it exists) and makes the left panel fullscreen.

     calc expr1[,expr2]
	    is	a  command line calculator. Since calc has no side-effects other
	    than echoing the result of expression 1 (and expression  2	if  pro-
	    vided).  In the context of cdb macros it is also used to assign val-
	    ues to the register variables 'c' through 'z'.

     macro [name][,file]
	    loads, executes or lists macros. A macro expands to one line of  cdb
	    commands  separated  by the tilde character (~) (a so-called command
	    chain, see below).	 The  command  macro  name  executes  the  macro
	    "name";  if  "name"  is left out, all currently available macros are
	    listed.  macro name,file loads macro definitions  from  file  "file"
	    and executes macro "name"; again, if "name" is missing, only a list-
	    ing  is produced. Macro definitions are appended to the list of pre-
	    viously loaded definitions or replace a previously loaded macro def-
	    inition with the same name. If you are trying  to  execute	or  list
	    macros,  but  no macros have been loaded yet, the default macro file
	    "pmars.mac" is loaded automatically. The special macro  file  "user"
	    can  be  specified to input macro definitions directly from the key-
	    board. Macro definitions consist of a macro name,  followed  by  the
	    equal  sign, followed by a command (chain).  The macro name can con-
	    sist of any printable character excluding  <space>	and  comma;  the
	    equal  sign  is only allowed at the end of a macro name.  Individual
	    macro lines have a limit of 80 characters, but  macro  calls  inside
	    macro expansions are allowed.  Cdb can hold up to 200 macros in mem-
	    ory.  See also the section on cdb macro programming below.

     if <expression>
	    controls  execution of commands in macros or command chains. If <ex-
	    pression> evaluates to zero, the next command block  is  skipped.  A
	    command  block  consists of either a single command or any number of
	    commands bracketed by !! (loop start) and ![e] (loop end,  see  sec-
	    tion  on macro programming below).	<expression> may contain C-style
	    comparison and boolean operators (see  below).   An  if  immediately
	    preceeding a loop end (![e]) can skip out of the loop.

     reset  is used inside macros in conjunction with if to terminate macro exe-
	    cution, e.g. inside an infinite loop (...~if A==0~reset~...~!).

     pqueue [1|2|..|off]
	    switches cdb into "process queue mode". In this mode, list, edit and
	    fill  operate  on  the process queue instead of the core array, i.e.
	    you can view and modify the process queue as easily as the core  ar-
	    ray.  This	is  especially	useful	for debugging complicated multi-
	    process warriors.  pqueue without argument uses the process queue of
	    the current warrior. With argument 1,2,.., uses the process queue of
	    warrior 1,2,.., respectively.  pqueue off returns to normal mode.

     wqueue [off]
	    stands for "warrior queue" and is similar  to  pqueue,  except  that
	    numbers  provided  as arguments for list, edit and fill now refer to
	    warriors: "list 0" now shows the program counter of warrior 1, "list
	    1" that of warrior 2 and so on.  wqueue off returns to  normal  "ad-
	    dress mode".

     pspace [1|2|..|off]
	    complements  the  pqueue  and wqueue commands. If a number is speci-
	    fied, the P-space of that warrior is selected  for	viewing/editing.
	    Without  an argument, the P-space of the currently executing warrior
	    is selected. "pspace off" returns to core mode.

     go, step, continue and thread may have a single address argument. The  pro-
     gram counter of the current warrior is set to this address before execution
     continues.

     The  range  argument  of  the  list,  trace,  etc.  commands has the format
     <start>,<stop>. Addresses <start> and <stop> are numbers,	special  symbols
     or  C-style  expressions  including  special symbols.  If either <start> or
     <stop> is omitted, it defaults to the current address.  If both  are  omit-
     ted,  the	range of the last cdb command is used. A single address (without
     the comma) acts on only that address. Addresses starting with a + or -  are
     interpreted relative to the current address.

     Expressions  may  contain	the arithmetic operators -,+,*,/,% (modulo), the
     comparison operators ==, !=, <=, >=, and the boolean operators && (AND), ||
     (OR), and ! (negation).  Expressions may also include register variables  C
     through  Z  and the assignment operator =. Operator precedence is like that
     of the C-language and may be overridden by parentheses. Assignment, compar-
     ison and boolean operations are mostly used with calc and	if  commands  in
     macros, but can also be used in Redcode operands.

     Special address symbols used in cdb commands:

      .     (dot) is the current address (displayed last).
      $     (dollar) is the last core address.
      A     is the A value of the current instruction.
      B     is the B value of the current instruction.
      PC    is the program counter of the currently executing warrior.
      PC1   is the program counter of warrior 1.
      PC2   is the program counter of warrior 2.
      LINES is the number of lines available to the cdb display
      CYCLE is the current execution cycle (counted down)

     In  process queue (pq), warrior queue (wq) or pspace (ps) mode (see pqueue,
     wqueue, pspace), most of these symbols have a different meaning:

      .     (dot) is the current process number (pq),
	    warrior (wq), or P-space cell (ps) which was displayed last.
      $     (dollar) is the last process in the process queue (pq),
	    the last warrior (wq), or the last P-space cell (ps).
      A     is the A value of the instruction of the current process (pq),
	    the next executing process of the current warrior (wq), or
	    the P-space selector (ps, same as warrior number if unshared).
      B     is the B value of the instruction of the current process (pq),
	    the next executing process of the current warrior (wq), or
	    the P-space selector (ps).
      PC    is 0.
      PC1.. are 0

     Preceding a command with the character '@' (ampersand)  will  suppress  its
     screen  output,  but not output to a logfile.  Preceding a command with '&'
     will suppress both screen and logfile output, which is useful  if	you  are
     only  interested  in  the	"side-effects" of a command.  Starting a command
     with a <Space> character suppresses saving it to the "last-command"  buffer
     that is recalled by <Enter>.

COMMAND CHAINS AND MACRO PROGRAMMING
     Several  commands	can  be  issued  on one line when separated by the tilde
     character ( ). These "command chains" are useful for repeating long command
     sequences, since <Enter> recalls the entire chain (see the examples below).
     Commands requiring user intervaention (list, edit, fill)  also  read  their
     input from the chain.

     The  "empty  command"  (two consecutive tildes or a tilde at the end of the
     chain) repeats the last command in the  chain.   A  command  consisting  of
     <Space> is a null command and is used to simulate pressing <Enter> in list,
     edit and fill.

     The  exclamation mark (!) character is a special "chain repetitor" command.
     The optional expression following '!' specifies how many times the  command
     chain  starting  at  the beginning of the line or the last '!' is executed.
     '!' without an expression repeats until the program terminates.

     The symbol '!!' is used for nested loops and marks the start of  a  command
     block  to	be  repeated. The command block is closed by '![expression]' and
     may contain other command blocks. A command block immediately following  an
     if command is executed only if the condition is true.

     With  loops, subroutines (macros calling macros), variables (C..Z), expres-
     sions involving comparisons and boolean operations, and conditional  execu-
     tion  (if),  the  cdb command language can be used to construct complicated
     macros for e.g. executing a  warrior  until  a  certain  core  address  has
     changed,  controlling  the 2-panel display, automatically finding the right
     constants for a warrior, etc. See the file "pmars.mac" for examples.

EXAMPLE CDB COMMANDS
     list ,+20
	    lists the next 20 instructions.

     trace pc-10,pc+10
	    traces 21 addresses centered around the program counter of the  cur-
	    rently executing warrior.

     untrace 0,$
	    clears all trace bits.

     go   reg	l+a,+b
	    chains  these commands: execute until the next traced address or end
	    of round, display the simulator status and	list  addresses  in  the
	    range A-number to B-number of the current instruction.

     @fill0,100 dat.f 0,0
	    fills  addresses  0  through  100  with 'dat.f 0,0', not echoing the
	    changed addresses to the screen.

     write trace.log step !
	    produces a continuous execution trace by repeating step until  pMARS
	    terminates, saving the output to logfile "trace.log".

     @l x=5 !! @ed x~dat x,0 if (x=x+1)<$+1 !
	    This command chain could be useful for debugging a stone-type, self-
	    modifying warrior, which is assumed to occupy address 0 through 4 in
	    this example. The command fills core starting at address 5 with "dat
	    5,0",  "dat  6,0",	a.s.o.,  so that you can tell where a bomb which
	    overwrites the warrior came from. To save some typing, you can  turn
	    this  command  into  a  macro (foo=@l x=5~..). This is how it works,
	    step by step: Assign 5 to register x and make it the current address
	    (@l x=5). Start a loop (!!) and change address x to "dat  x,0"  (@ed
	    x~dat  x,0).  Increment  x,  if x is then smaller than the core size
	    ($+1), continue looping (if (x=x+1)<$+1~!). The '@' in front of  the
	    list and edit commands suppresses screen output.

     @s @4 if b<2 || b>=$-3 reset !
	    This  command  executes  a	warrior  until	the B-field of address 4
	    points to address 0 through 5: Step and make address 4  the  current
	    address  (@s~@4).  If  the B-field is less than 2 or greater than or
	    equal to 7996 (CORESIZE-1-3) stop execution, else  continue  looping
	    (if b<2 || b>=$-3~reset~!).

SOURCE DEBUGGING DIRECTIVES
     Trace  bits  can also be set by including debugging commands in the warrior
     source. A comment format is used to retain  compatibility	with  simulators
     that do not support source-embedded debugging commands.

     ;debug [static/off]
	    This  command  enables/disables  all subsequent source-embedded com-
	    mands.  It is used for commenting out other source	comments.   ;de-
	    bug static	has  the  same effect as the command moveable off at the
	    cdb command prompt.  ;debug is implicitly added in	front  of  every
	    warrior.  The  last  ;debug  or  ;debug static encountered specifies
	    whether the trace bit is copied by a MOV.I instruction or not.

     ;trace [off]
	    ;trace starts setting the trace bit with the next instruction  until
	    EOF or a ;trace off command is encountered.

     ;break
	    sets the trace bit of the next instruction.

FUTURE DIRECTIONS
     We  will be glad to assist in porting pMARS to other, currently unsupported
     platforms. This program is still under development and we will continue  to
     enhance  functionality  and  speed, as well as adapt to changes in the pro-
     posed ICWS'94 standard. If there is demand, future versions of  pMARS  will
     also implement read/write ranges

BUGS
     None whatsoever (right).  Contact for bug reports and suggestions is Stefan
     Strack  (stst@vuse.vanderbilt.edu).   Please be detailed and include a log-
     file of the cdb session if applicable. Bug reports and suggestions concern-
     ing the Macintosh display and interface should also  be  directed	to  Alex
     MacAulay (macaulay@mundil.cs.mu.oz.au).

AUTHORS
     The  portable MARS project was initiated after discussing the ICWS'94 draft
     on the rec.games.corewar newsgroup. We realized that we needed  a	portable
     system to try out the proposed standard and to accept, modify or reject it.
     The  people who started portable MARS and are responsible for the base code
     as well as the DOS and UNIX displays are:

     Albert Ma (ama@athena.mit.edu)
     Nandor Sieben (nandor.sieben@asu.edu)
     Stefan Strack (stst@vuse.vanderbilt.edu)
     Mintardjo Wangsaw (wangsawm@csos.orst.edu)

     Alex MacAulay (macaulay@mundil.cs.mu.oz.au)  wrote  the  Macintosh  display
     version.	Martin	Maierhofer (m.maierhofer@ieee.org) contributed the linux
     SVGA and X windows display.  Nathan Summers (00ncsummers@bsuvc.bsu.edu) did
     the port to VMS.

ACKNOWLEDGMENTS
     We thank Planar (Damien.Doligez@inria.fr) for expert  help  with  debugging
     and  porting  pMARS to different UNIX machines. We also appreciate the help
     of Chris Lindensmith (lind0014@student.tc.umn.edu) and  Pierre  Baillargeon
     (dak@info.polymtl.ca)  with  the  initial Mac and Amiga ports respectively.
     Mark Durham (durham@ricevm.rice.edu) spearheaded development of the ICWS'94
     draft and we thank him for writing the  sample  interpreter  code	included
     with the draft.

APPENDIX
PMARSV
     pMARSv  is  a  DOS  version of pMARS with a graphical core display. You can
     chose between EGA/VGA graphics or text mode with the -v  command  line  op-
     tions or by pressing 'v' during the game. The -v option takes a three digit
     argument  'xyz'.  Digit  'x' specifies the initial display speed and ranges
     from 0 (fastest) to 7 (slowest). 'y' is the initial  display  mode:  0  for
     text  mode, 1 for standard VGA graphics, 2 and 3 for SVGA, 4 and 5 for EGA,
     and 6 for CGA graphics.

     The display level 'z' specifies how much is displayed:

     0	    Display nothing. This greatly speeds up execution,	especially  when
	    in graphics mode.

     1	    Display  execution	of  addresses. In text mode, a black '0' on blue
	    background is shown for warrior 1, a black '1' on green for  warrior
	    2,	a.s.o..  Numbers  blink  in white when a DAT instruction is exe-
	    cuted. In graphics mode, a blue square represents warrior 1, a green
	    square warrior 2, a.s.o.. These colors are also used for other  core
	    accesses.

     2	    Also  display  write accesses. In text mode, they appear as dots; in
	    graphics mode, they appear as two pixels, offset diagonally.

     3	    Also display decrements and increments. They are shown  as	'+'  and
	    '-' in text mode and as two pixels offset vertically or horizontally
	    in graphics mode.

     4	    Also  display read accesses, which appear as small dots in text mode
	    and as single pixels in graphics mode.

     The more is displayed, the slower runs the simulation.  The argument for -v
     defaults to 103, i.e. speed=1, mode=text, level=3.

     The text mode display is very fast, but contains less on-screen information
     than the graphics display. The core display and the cdb debugger run  full-
     screen on separate display pages.

     In graphics mode, core and debugger share the same screen. The mouse can be
     used  to  navigate  around core when debugging is enabled: clicking a mouse
     button on any core location lists addresses starting there. The mouse  cur-
     sor follows the current program counter when in single step mode.

     In  both  graphics  and  text mode, the cdb display can be divided into two
     side-by-side panels. You can switch between panels with the switch  command
     (or  the  <Tab>  macro) and close the right panel with close (or the <Shft-
     Tab> macro).  Extended (function keys, arrow/page keys, ALT keys, etc.) and
     control keys generate macro calls at the cdb prompt; some of these "hot key
     macros" have been defined in "pmars.mac"; you can easily change them or add
     more with a text editor.  E.g. <PgDn>  and  <PgUp>  keys  currently  invoke
     macros that scroll through core one screen at a time.

     A	white  line  at the top of the display, called the time meter, indicates
     the time required to finish the current simulation. The amount of time  de-
     pends  on	the number of warriors still alive in the arena. After a warrior
     dies it no longer needs simulation time so the required time to finish  the
     simulation becomes less. On the time meter this is indicated by a disconti-
     nuity.  One  can count the number of dead warriors in the arena by counting
     the number of discontinuities on the time meter.

     Just below, the length of "process meters" in the	color  of  the	warriors
     they represent show how many processes each warrior has running.

     The following keys are available at the core display screen:

     0..4   selects the display level (see above).

     v	    switches from text display to graphics display and vice versa.

     >	    increases the display speed.

     <	    decreases the display speed. The current speed is indicated by a red
	    bar in graphics mode.

     d	    enters  the  cdb debugger. "Debug" on the graphics menu bar is high-
	    lighted in red inside cdb.

     <space>
	    (also 'r') refreshes the core display.

     <escape>
	    (also 'q') exits to DOS.

     You can define additional keys and commands associated with them by  defin-
     ing "key-x" macros ("x" is any printable character). E.g.:
     key-p= progress~registers~continue
     Function-key and other macros can also be invoked from the core display.

CURSES DISPLAY
     The  curses display is very similar to the DOS text mode display. There are
     separate pages for core and debugger.  There is a status bar at the  bottom
     of the core display:

     Rave [0]: 1	Lucky 3 [1]: 3702  Cycle: 72967  R: 2/5 (0 0 1)

     The  display symbol that indicates execution is shown in brackets after the
     warrior name. The number after the colon shows the number of processes  ac-
     tive.  The "2/5 (0 0 1)" means that this is round 2 of 5; the result so far
     is one tie. Only cycle and round information is shown if more than two war-
     riors are run.

     There  is	no "hot key" user interface during the core display, but you can
     enter the debugger by hitting Ctrl-C and clearing the display, changing the
     display mode, etc. from within cdb.  Only the first and third digit of  the
     -v option and display command argument, namely the display speed and level,
     have  an  effect  (see PMARSV above). The display speed setting (0=fastest,
     7=slowest) adjusts the screen refresh rate; depending on the size	of  your
     display,  movement in core may appear "jerky" at fast speeds.  Control keys
     at the cdb prompt generate a macro call like in the DOS versions.

     If you redirect standard input (by supplying a '-'  filename  or  parameter
     file), all interactive input is disabled.

MACINTOSH DISPLAY
     MacpMARS  is a Macintosh version of pMARS with a graphical core display and
     standard Macintosh user interface. It has two windows, the Core window  and
     Text  window.  The  display of the core uses four patterns for each warrior
     (black and white backgrounds respectively) to show what is happening in the
     core:

     '/' when the core location is written to (including incrementing and decre-
     menting);

     '\' when a process has died at the core location;

     '-' when a process has executed at the core location;

     '|' when a process is waiting to execute at the core location.

     If you click on a core location in the Core window while a battle is  being
     run, the contents will be displayed in the Text window.

     Two warriors can be in memory at any one time. To assemble a warrior choose
     "Choose Warrior n..." from the File menu. To remove the warrior from memory
     choose  "Remove Warrior n...". You can modify the settings used by choosing
     "Preferences..." (this can only be done when no battle is being  run).  Al-
     ternatively,  you can type in a command line in the same way as if you were
     typing from a unix prompt (if you're used to that sort of thing) by  choos-
     ing "Command Line...". The Edit menu is just the normal Macintosh Edit menu
     and  can  be used to cut and paste text in the Text window and dialogs. The
     items in the Play menu are fairly self-explanatory: "Go" starts (or contin-
     ues) a battle; "Step" executes one instruction  and  enters  the  debugger;
     "Halt" halts the battle and enters the debugger; "Abort" aborts the battle.
     The  Window menu is used to show and bring either of the two windows to the
     front of the screen.

     The cdb commands display, switch and close are not available in MacpMARS.

     Note: to use very large core sizes (up to about 65000) and  process  limits
     you  may  need  to increase the memory partition for MacpMARS.  To do this,
     choose "Get Info" from the File menu in the Finder and  set  the  preferred
     memory size to about 1200K.

EXIT CODES
     The  following is mainly useful for people who write scripts or batch files
     for pMARS.  Upon normal exit, the program returns 0. Below is a listing  of
     what  the	abnormal  exit codes mean. Your operating system may not support
     negative exit codes; in this case you have to convert the value to its  un-
     signed counterpart.

	 -4	 graphics error
	 -3	 trying to execute 80386 code on a lesser processor
	 -2	 memory allocation error
	 -1	 serious program logic error, contact developers
	  1	 file not found
	  2	 command line error
	  3	 assembly error
	  4	 user aborted program
     The  exit	codes  of  the	VMS  version conform to the VMS standard. The -Q
     (Query) command line option (see OPTIONS) allows you to customize the pMARS
     exit code. E.g. "pmars -Q 1000" returns the current  pMARS  version.  Below
     the -Q arguments and what the resulting exit codes mean.

     1..W   exit  code	is  score of this warrior, 1: first in result output, 2:
	    second, a.s.o.. If the -o option is also given, "1" gives the  score
	    of the highest scoring warrior, etc..

     101..1W
	    returns  the number of this warrior in the result output. Usually -Q
	    101 returns 1, -Q 102 returns 2 etc., so this is not very useful. If
	    you also specify the "-o" (order results) option, -Q 101 returns the
	    position of the highest scoring warrior on the command line, -Q  110
	    the position of the 10th highest scoring warrior, etc..

     1000   exit  code is the pMARS version in the same format as the predefined
	    VERSION variable.

     1001   returns the pMARS "variant": 0 if the program was compiled with  the
	    SERVER  option (no debugger), 1 with debugger but without display, 2
	    with debugger and core display.

     1002   returns a combination of version and variant: 10*variant+version.

     1003   the exit code is the core address size in bytes. On  a  32-bit  CPU,
	    this  is sizeof(int), usually 4. With SMALLMEM compilation, core ad-
	    dress size is sizeof(unsigned short), usually 2.

     2000   returns how many warriors share one or more P-spaces. A value of  4,
	    e.g.  means that either four warriors share one P-space, or that two
	    pairs of warriors share two P-spaces.

PMARS v0.9.2			December 25, 2000			PMARS(6)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=pmars&sektion=6&manpath=FreeBSD+Ports+15.1.quarterly>

home | help