Sections
Home
Hills
Infinite Hills
Tournaments
Software
Evolving
Optimizer
Community
Newsletter
Discussion
History
Sections
 
For Beginners
First Steps
FAQ
Guides
Lexicon
Benchmarks
For Beginners
> Home > The Corewar Newsletters > Core Warrior > Issue #1

Issue 12                                                      January 15, 1996
______________________________________________________________________________
Core_Warrior_ is a weekly newsletter promoting the game of corewar.  Emphasis
is placed on the most active hills--currently the '94 draft hill and the
beginner hill.  Coverage will follow where ever the action is.  If you have
no clue what I'm talking about then check out these five-star internet locals
for more information:

FAQs are available by anonymous FTP from rtfm.mit.edu as
pub/usenet/news.answers/games/corewar-faq.Z
FTP site is: ftp.csua.berkeley.edu /pub/corewar
Web pages are at:
http://www.stormking.com/~koth                  ;Stormking
http://www.ecst.csuchico.edu/~pizza/koth        ;Pizza
http://pauillac.inria.fr/~doligez/corewar/      ;Planar
______________________________________________________________________________
Greetings.

Everyone get a chance to check out that mega-queue at Pizza?  Sheesh.  It's
interesting that everyone concentrates almost exclusively on the one vs one
coresize equals 8000 hills.  Other hills were created out of discussions in
the newsgroup, and many initially received a lot of activity.  But everyone
eventually moves back to the -94 and -b hills.  The beginners' hill may
condition authors to the one vs one 8000 style hill.  The -94 hill is a 
logical progression.  And since all the veterans still submit there quite  
regularly, that's where all the competition is.  With the corewar farm system
the way it is and the momentum of the -94 draft hill, the situation won't
likely get any more diverse.  Which is a shame since Tuc recently has revised  
Stormking's hills to accomodate a lot of the requests mentioned in various
postings.  Revisions include the following:

;password       identifies the password for this warrior.
;kill           kills a warrior.  Must be used with ;password
;newpasswd      assigns a new password for a warrior.  Must be used with the
		original ;redcode ;name and ;password lines.
;newredcode     assigns a new redcode line for a warrior.  Must include the
		new ;redcode line ;name and ;password lines.  This allows
		allows authors to change from ;redcode quiet to ;redcode
		verbose or whatever the desired response level.

For a complete listing mail kothtest@stormking.com (;help for a menu).  There
are also additional modifications to the web page that let browsers view
strategy lines and source code at the author's discretion.  

Lots of thanks goes to Tuc for his work.  Let's really put his coding skills
to the test and try to break his hills.
______________________________________________________________________________
Current Status of the Internet Pizza Server ICWS '94 Draft Hill:

Hill Specs:
	 coresize: 8000
   max. processes: 8000
	 duration: after 80,000 cycles, a tie is declared.
max. entry length: 100
 minimum distance: 100
    rounds fought: 200
  instruction set: ICWS '94 Draft

Last challenge: Mon Jan 15 05:13:19 PST 1996 

 #  %W/ %L/ %T                      Name               Author   Score     Age
 1  35/ 39/ 26                      quiz              Schitzo     131     388
 2  21/ 12/ 67            Impfinity v4g1               Planar     130     188
 3  31/ 33/ 36                      Test        Robert Macrae     130      38
 4  17/  6/ 77              Evol Cap 6.6       John Wilkinson     129       3
 5  22/ 15/ 63                  Hector 2          Kurt Franke     128     303
 6  25/ 23/ 51           Jack in the box          Beppe Bezzi     128     755
 7  33/ 38/ 29                   Harmony              P.Kline     127      30
 8  16/  6/ 78             Evol Cap 6.2a       John Wilkinson     127      22
 9  34/ 42/ 24             Frontwards v2       Steven Morrell     127     241
10  15/  5/ 79               Night Train           Karl Lewin     126     275
11  24/ 23/ 54                  La Bomba          Beppe Bezzi     125     383
12  28/ 33/ 39                 Mason 2.0        Robert Macrae     124     124
13  14/  5/ 81              DoorMat v0.1              K Lewin     124     237
14  33/ 42/ 25             Provascan 3.0          Beppe Bezzi     123     138
15  17/ 11/ 71                Cheap Hack           M R Bremer     123      75
16  31/ 39/ 31                Boombastic    Maurizio Vittuari     123     123
17  30/ 37/ 33     Koolaid II: WoGG v2.2         David Boeren     123       5
18  16/ 10/ 73           Evol Cap VII .3       John Wilkinson     123      19
19  13/  5/ 82            .2 Evolve VIII       John Wilkinson     122       9
20  31/ 39/ 30                  testnorm    Maurizio Vittuari     122       7
21  26/ 30/ 43                 Torch t18              P.Kline     122     767
22  20/ 19/ 61          juliet and paper M R Bremer, B. Bezzi     121     384
23  29/ 38/ 33                     paris                Kafka     120       2
24  24/ 28/ 48               Blue Funk 5       Steven Morrell     120      24
25  10/  0/ 90               Evolve VIII       John Wilkinson     119       1

The hill has aged 47 this week.  Average scores continue downward to 120 (128 
last week, 136 the week before) as the five versions of evol* tie everything  
on the hill.  Only 12 points separate number 1 from number 25.  The average 
age is 182 compared with 162 last week.  

Torch has been suffering lately.  It was seen as high as fifth, but it has
been sulking in the high teens and low twenties the last few challenges.  
Jack in the box continues to prove effective.  With the loss of interest in 
pspace and as a result--brainwashing, Jack can adapt fairly well to new 
warriors.  Redundant scanners and Torch style bombers are effective against  
it, but some--Pulido's FireMaster and Macrae's Harm--were forced off the hill 
earlier.  Now Jack rides in 6th place.

Dat bombers seem to be ineffective.  Aeka and juliet storm were removed from 
the hill after debuting quite well.  The newest version of Tornado was also 
eliminate.  Blue Funk 5 still clings to life, but with a tenuous grasp at 
best.  It did shoot up the hill into the top ten with the introduction of a
few scanners, but they were very short lived.  Impfinity seems to be an 
exception, even with a published source code.  Also successful is Macrae's 
Test warrior which the strategy lines proclaim to be a quick scan / bomber.

quiz is on top of the heap as usual.  However it's grasp is not the steel
fist it once was.  Impfinity, Test, and Frontwards have all been in first
place this week.
______________________________________________________________________________
94 - What's New
 
 3  31/ 33/ 36                      Test        Robert Macrae     130      38
 4  17/  6/ 77              Evol Cap 6.6       John Wilkinson     129       3
17  30/ 37/ 33     Koolaid II: WoGG v2.2         David Boeren     123       5
18  16/ 10/ 73           Evol Cap VII .3       John Wilkinson     123      19
19  13/  5/ 82            .2 Evolve VIII       John Wilkinson     122       9
20  31/ 39/ 30                  testnorm    Maurizio Vittuari     122       7
23  29/ 38/ 33                     paris                Kafka     120       2
24  24/ 28/ 48               Blue Funk 5       Steven Morrell     120      24
25  10/  0/ 90               Evolve VIII       John Wilkinson     119       1

Test entered the hill in first place and reclaims that spot every few hill
challenges.  Perhaps Macrae will give his warrior a name sometime soon.
______________________________________________________________________________
94 - What's No More

26   2/  2/  0                     test9    Maurizio Vittuari       5       2
26   3/  1/  0                     itest                   ai       8       8
26  25/ 47/ 28          John's Zizzor 2h       John Wilkinson     103       2
26  17/ 19/ 65                     myOmy             Paulsson     114      15
26  28/ 35/ 37            Tornado 2.0 h1          Beppe Bezzi     122     193
26   0/  0/  4              Evol Cap 6.2       John Wilkinson       4      38
26  25/ 30/ 45                endpoint .           M R Bremer     121      37
26  24/ 24/ 52              juliet storm           M R Bremer     124      59
26  34/ 47/ 19               seventyfive         Anders Ivner     121      82

Tornado is the biggest loss at age 193.  
______________________________________________________________________________
What's Old

21  26/ 30/ 43                 Torch t18              P.Kline     122     767
 6  25/ 23/ 51           Jack in the box          Beppe Bezzi     128     755
 1  35/ 39/ 26                      quiz              Schitzo     131     388
22  20/ 19/ 61          juliet and paper M R Bremer, B. Bezzi     121     384
11  24/ 23/ 54                  La Bomba          Beppe Bezzi     125     383
 5  22/ 15/ 63                  Hector 2          Kurt Franke     128     303
10  15/  5/ 79               Night Train           Karl Lewin     126     275
 9  34/ 42/ 24             Frontwards v2       Steven Morrell     127     241
13  14/  5/ 81              DoorMat v0.1              K Lewin     124     237

Another of Lewin's warriors, DoorMat, enters the over 200 mark.  La Bomba,
juliet and paper, and quiz all begin their journey up the hall of fame ranks.
______________________________________________________________________________
HALL OF FAME
* means the warrior is still running.

Pos    Name                  Author          Age     Strategy
 1  Iron Gate 1.5          Wayne Sheppard    926    CMP scanner
 2  Agony II               Stefan Strack     912    CMP scanner
 3  Blue Funk              Steven Morrell    869    Stone/ imp
 4  Thermite 1.0           Robert Macrae     802    Qscan -> bomber
 5  Torch t18              P.Kline           767 *  Bomber
 6  Blue Funk 3            Steven Morrell    766    Stone/ imp
 7  Jack in the box        Beppe Bezzi       755 *  P-warrior
 8  HeremScimitar          A.Ivner,P.Kline   666    Bomber
 9  myVamp v3.7            Paulsson          643    Vampire
10  Armory - A5            Wilkinson         609    P-warrior
11  Phq                    Maurizio Vittuari 589    Qscan -> replicator
12  B-Panama X             Steven Morrell    518    Stone/ replicator
13  quiz                   Schitzo           388 *  scanner/ bomber
14  NC 94                  Wayne Sheppard    387    Stone/ imp
15  juliet and paper       Bremer & Bezzi    384 *  P-warrior
16  La Bomba               Beppe Bezzi       383 *  Qscan -> replicator
17  Cannonade              P.Kline           382    Stone/ imp
18  Torch t17              P.Kline           378    Bomber
19  Lucky 3                Stefan Strack     355    Stone/ imp
20  Derision               M R Bremer        351    Scanner
21  Request v2.0           Brant D. Thomsen  347    Qvamp -> vampire
22  Dragon Spear           c w blue          346    CMP scanner
23  Leprechaun on speed    Anders Ivner      344    Qscan -> scanner/bomber

The hall of fame will be slowly expanded to 25 slots to match the number of
rankings on the '94 hill.
______________________________________________________________________________
Current Status of the Internet Pizza Server Beginner's Hill:

Hill Specs:
	 coresize: 8000
   max. processes: 8000
	 duration: after 80,000 cycles, a tie is declared.
max. entry length: 100
 minimum distance: 100
      maximum age: At age 100, warriors are retired.
    rounds fought: 200
  instruction set: ICWS '94 Draft

Last challenge: Sun Jan 14 17:35:23 PST 1996 

 #  %W/ %L/ %T                      Name               Author   Score     Age
 1  57/ 23/ 20          Fire Master v1.6            JS Pulido     191       4
 2  58/ 27/ 15 Koolaid II: The Wrath of          David Boeren     190      34
 3  51/ 29/ 20               Our Vamp v2 R Bartolome & JS Pul     173      83
 4  48/ 36/ 16              Assassin XII       Andy Nevermind     160      16
 5  34/  9/ 57             RingWorm_v2.5           Calvin Loh     160      23
 6  46/ 36/ 19                   Monitor           M R Bremer     155      12
 7  36/ 22/ 42              Spacehead1.1                Warpi     151      95
 8  32/ 19/ 48             Thunder V 1.0       Andy Nevermind     145      30
 9  39/ 34/ 27           Winter Werewolf         W. Mintardjo     143      75
10  35/ 32/ 33              Inherit v0.9             Philemon     138      14
11  37/ 37/ 25                RedPixel.2           John Lewis     137      31
12  37/ 38/ 25             Test Stone #1         David Boeren     135      50
13  35/ 39/ 26                    test.1        Anton Marsden     131       1
14  31/ 34/ 34 Everybody Must Get Vamped       Nathan Summers     129      42
15  22/ 21/ 57              Spiral Again           Calvin Loh     122      24
16  21/ 21/ 57              Spiral Again           Calvin Loh     121      22
17  29/ 40/ 31 EveryoneMustGetStoned 2.5       Nathan Summers     117      41
18  11/  5/ 84              Evol Cap 6.1       John Wilkinson     117      13
19  17/ 19/ 65               SpiralTest2           Calvin Loh     115      33
20  25/ 36/ 39            StoneTest v2.1       Raul Bartolome     114       8
21  29/ 44/ 27     Forked Lite Ning 4.07 Ansel Greenwood Serm     114       5
22  23/ 44/ 33                 Mixed 0.1             Philemon     101       7
23  23/ 47/ 29            StoneTest v1.2       Raul Bartolome      99      11
24  24/ 50/ 26            FireSilk v1.3B       Raul Bartolome      98      20
25  26/ 56/ 17                      Test          Ian Oversby      96       2

Koolaid had a lock on the top spot until Pulido re-introduced Fire Master.
However, Koolaid has settled in on the '94 draft hill at 17th place while
Fire Master was pushed off.  Don't be discouraged if your warrior does well  
on the b-hill and not the '94 draft hill.  The composition of the hill has
a lot to do with a warrior's success.  Keep trying.  A big welcome to some
of the new names I've seen here.  The core war community is generally willing
to answer your questions in the rec.games.corewar newgroup.  Don't be shy.
The 'Monitor'ing warrior I submitted to track the hill is included below.  
Feel free to hack any piece of it for yourself.

;redcode-b
;name Monitor
;author M R Bremer
;kill Monitor 
;strategy Need to track the b-hill.
;strategy 3-shot to scan to partial spl dat clear
;strategy Not the time or energy for full double spl/dat

u       jmp o, o        
s       add.f inc, 2
	mov.i off, @1
p       mov.i >-2, @0
	jmz.a -3, *-1
	djn.b -4, #2
o       spl #20, 10     ; self hit in b field sometimes
	mov.i @u, }p
	mov.i @u, }p
	djn.f -2, <-20        
d       dat 20, <2667
for 27
	dat 0, 0
rof
off     dat 1, 445
inc     dat -445, 445*2
______________________________________________________________________________
The Hint 

C.  The speed of light.  Authors use C to denote the speed of a scan or bomb
pattern.  A sne/seq/mov quick scan operates at 2c or 200% of C until it finds 
something.  An add/mov/djn bomber dat bombs at .33c.  The decrement or 
increment in the move and the djn stream typically makes it more viscious.  
At times, a corewar challenge simply reduces to who can find who first.  So  
the quest becomes to increase speed while keeping as small a profile as 
possible.

A cmp scanner usually uses an add/cmp/slt/djn engine.  This warrior will
search core at .66c.  By postponing the djn and 'unrolling' the engine, we
can increase the speed to .8c.  Taking Names is a good example.  Notice the
scan engine now uses an add/sne/add/seq/slt/djn sequence.  If the sne spots 
something, the second add is skipped and the seq will fall through to the slt
instruction.

;redcode-94 quiet
;name Taking Names
;kill Taking Names
;author P.Kline
;strategy sne.x/seq.x scanner using spl-spl-jmp bomb
;strategy and continuous forward-clear

step    equ    98
clrptr  dat    jump+2
	dat    0,0
reset   dat    #step-2,#step
    for 19
	dat    0,0
    rof
    
attack  mov    jump,*comp           ; drop wide bomb on a-pointer
compptr mov    split,{comp
	mov    split,{comp          ; after bombing, reset to
	sub    reset,@compptr       ; make b-pointer the next a-pointer
	
scan    add    split,@compptr
comp    sne    2*step,3*step        ; take a look
	add    split,@compptr
	seq    *comp,@comp          ; take another look
	slt    #100+step,@compptr   ; don't attack self
ctr     djn    scan,#1000           ; countdown to finish
	jmn    attack,-1

split   spl.i  #(2*step),#(2*step)
clear   mov    reset,>clrptr        ; continuous forward clear
jump    jmp    -1
    for 30
	dat    0,0
    rof
    for 12
	dat    #1,1                 ; simple decoy
	mov.i  #attack+1000,2667
    rof
	end    comp

Of course you pay for the increased speed with increased size.  Is an 
increase from .66c to .8c worth 2 extra instructions?  Perhaps.  Another way
to increase speed is to use on of your bombs as a pointer for the other.  A
.5c jmz scan can be increase to .66c using just one more instruction.

bomb    add.ab #8, scan         ;of course you can use anything as the bomb
	mov.i bomb, @scan       ;the bomb falls wherever scan points to
scan    jmz.f -2, *XXXX         ;the scan is made +8 addresses from the bomb

This loop can be further modified to scan/bomb at .75c by adding yet another
instruction.

	add.f inc, stone        ;you'll need an inc and bomb line
	mov.i bomb, @stone
stone   mov.i XX, @XX
	jmz.f -3, *-1

Ivner created a .75c bomber using the following code.  While more a hybrid
scanner/bomber, this fragment bombs normally until the cmp finds something.
Then the bomb pattern is realigned so that the bomb hits the scanned 
locations.

b1      dat     #2*STEP,#2*STEP
c       dat     #3*STEP,#3*STEP

loop    add     c,      pt
	mov     b1,     @pt
pt      cmp     A,      @A-STEP
	sub     b1,     pt
	djn     loop,   #COUNT

Here is the full code to Anders Ivner's seventyfive.

;redcode-94
;name seventyfive
;kill seventyfive       
;author Anders Ivner
;assert (CORESIZE == 8000)
;strategy 75% bomber -> separate multipass coreclear
;strategy Credits to Karl Lewin for crow.

STEP    EQU     14
	ORG     bomber
STEPB   EQU     85
COUNT   EQU     500
A       equ     (jump+STEPB*2)

head    dat     #0,     #tail+100
d1      dat     <0,     <tail-head+5
s2      spl     #3450,  #tail-head+5
s1      spl     #3450,  #tail-head+5
incr    spl.a   #-STEP, <-STEP
go      mov.i   @tail,  >head
	mov.i   @tail,  >head
tail    djn.b   go,     {s1
for 74
	dat     0,0
rof
bd      dat     #2*STEPB,#2*STEPB
incrb   spl     #3*STEPB,#3*STEPB
	dat     0,      0
bomber  mov     bd,     @pt
pt      cmp     A,      @A-STEPB
	sub     bd,     pt
	add     incrb,  pt
jump    djn.b   bomber, #COUNT
	jmp     incr

	end

Porch Swing takes this type of idea and expands it to .8c by adding another
bombing line before the cmp instruction and changing the cmp to indirect 
addressing in the a field.  However, Porch Swing does not loop back to the
beginning when the scan finds something like seventyfive does.  Once the scan
finds something, PS moves on to a core clear.  It is simple to change this
into a bombing loop if desired.

;redcode-94
;name Porch Swing
;kill Porch Swing
;Author Randy Graham
;assert 1
;strategy Swing with a little wider range.
;strategy Now 80% bomb/scan with djn-stream once-thru

STEP    equ    12
EXTRA   equ    4
DJNOFF  equ    (-426-EXTRA)

	dat.f  #gate-10,  step-gate+5
gate    dat.f  #gate-10,  sneer-STEP+1
dat2    dat.f  #gate-20,  step-gate+5
dat1    dat.f  #gate-25,  step-gate+5
site2   spl.a  #gate-30,  step-gate+5
site    spl.a  #gate-40,  step-gate+5
for EXTRA
	dat.f  0,         0
rof

adder   sub.f  sweeper,   sneer
hithigh mov.i  step,      *sneer
hitlow  mov.i  step,      @sneer
sneer   sne.i  @gate+STEP*6-1-EXTRA, *gate+STEP*3-EXTRA  ;so we bomb step
looper  djn.b  adder,     <DJNOFF
setup   add.f  sneer,     gate
sweeper spl.a  #-STEP*4+1,<-STEP*4+1
mover   mov.i  @swinger,  >gate
swinger djn.b  mover,     {site
step    dat.f  <STEP,     <-STEP

end     hithigh


Other successful warriors that use these techniques to increase speed include 
Tornado, HeremScimitar, and Leprechaun deluxe.  Perhaps all your warrior 
needs is a little extra adrenaline to challenge the king of the hill.
______________________________________________________________________________
Planar's Corner

Stefan Strack, aka Macro Master, is kind enough to provide us with the third
sequence of the CDB tutorial.  Macros can eliminate some of the tedium of
debugging complex warriors.  Planar has also appended the answers to the 
exercises presented in part 2 of the tutorial last week.    


			  CDB tutorial, part 3

In the last part of the CDB tutorial, Planar showed us command sequences,
loops and tests and how to combine them into fairly long command lines.
In practice, you would rarely want to type such a long command line at the
CDB prompt, unless you have a way to copy and paste previous commands (as in
MacpMARS). This is where macros come into play.

Macro input
-----------

Macros are short-hands for long command sequences. A macro definition looks
like this:
    name=command1 ~ command2 ~ ..
The sequence "command1 ~ .." is assigned to the macro "name". There are two
ways to input macro definitions into CDB: You can create a text file with
macro definitions (or add definitions to the default macro file pmars.mac)
and read the macro file using the "macro" command:

(cdb) macro ,mymacro.mac

The comma is important here. If it is omitted, CDB thinks "mymacro.mac" is
a macro to be executed.

The second way to input macros is to type them straight into CDB memory.
That`s useful if you don't think you'll need a macro for more than one CDB
session. Try this:

(cdb) m=
F1=help
hello=echo hello world
.   
(cdb)

What kind of a command is "m="? It's actually a macro that expands into
    @macro ,user
The special file name "user" tells CDB to read macros from the console instead
of a file. We've already learned about the "@" operator; it suppresses the
macro listing produced by the "macro" command. The line with the period in
the example above marks the end of input. The EOF character (^Z or ^D)
followed by <Enter> does the same thing.

Macro execution
---------------

Macros are executed, you guessed it, with the "macro" command. To continue
our example above,

(cdb) m hello

prints the line "hello world". With the PC version of pMARS, you can display
the help screen by pressing the "F1" key. With other versions of pMARS you
have to execute this macro with "m F1". Of course, macros can call other
macros. This way, you can write complicated macro programs that are longer
than one line. I am explaining some of them below. They are contained in
the default macro file "pmars.mac".

Predefined macros
-----------------

ctrl-n= m next
next= echo Advancing to next round~@pq~@f0,$~dat 0,0~@pq off~@go~@st

This macro aborts the current round and advances to the beginning of the
next round. This may be much quicker than waiting it out with the "go"
command. To kill the current program, "next" uses a command we haven't
talked about yet: the process queue or pqueue command. In pqueue mode,
"list", "edit" and "fill" operate on the process queue instead of core
addresses.  What the "@f0,$~dat 0,0" sequence does is to fill each core
address about to be executed with dat 0,0. We could have gotten the same
effect by wiping out the entire core, but this would've been slower.

-------------------------------------------------------------------------
count= &ca z=.~m w?~&ca x=.,c=0~!!~m w?~&ca c=c+1~if .!=x~!~ca c~&l z
w?= &search ,

"Count" is extremely useful if you want to find out things like how many
bombs have been dropped, how far paper replication has gone, etc.. The macro
reports the number of core addresses the match the search string given in
the "w?" macro. As is, "count" searches for a comma, which matches all
non-zero addresses. To count something else, say all SPL instructions,
simply replace the "w?" macro from within CDB:

(cdb) m=
w?= &search spl
. 
(cdb)

By the way, the "&" operator is similar to "@", but whereas "@" only 
suppresses screen output, "&" also suppresses output to logfiles.

-------------------------------------------------------------------------
pcur - count number of processes pointing to the current address
pcur= m _pstep~if.==z~@ca n=n+1~m _pend
These two (sub)macros are shared code:
_pstep=@ca z=.,c=n=0~!!~@pq~@l c=(c+1)%($+1)~@pq off
_pend=if c!=0~!~ca n~@l z

pseg - calculates how many processes are operating inside segment [x,y]
pseg= m _pstep~m _ptest~m _pend
_ptest= if y>=x && x<=. && y>=. || y<x && !(x<=. && y>=.)~@ca n=n+1

"pcur" and "pseg" are related macros that use shared submacros. It is a good
idea to use a special naming convention for macros that are not to be called
directly from the CDB prompt. In "pmars.mac", submacros start with the
underscore character. One scenario where, e.g. "pseg" is useful: You want to
find out how many processes are still alive in an imp-spiral at the end of a
round, but you also have a self-splitting stone, so "registers" won't work.
Simply exclude the range that the stone occupies and run "pseg".  Suppose
the stone extends from 0 to 4:

(cdb) ca x=5,y=7999
5,7999
(cdb) m pseg
19
(cdb)

-------------------------------------------------------------------------
Macro check: execute until a core segment [x,y] changes
check= if x==y && x==0~m c_err~@ca c=0~!!~m c_step ~m _check~if z==c~!~m _cd

Subroutine c_step, advance execution. Change this to "@skip n" for more speed
c_step= @step

Subroutine _check computes the actual checksum, expects x,y; uses i,j;
returns z
_check= @ca (i=x)&&(j=(y+1)%($+1)),z=0~!!~@l i~m _c2
_c2= @ca z=z+i+(A+B),i=(i+1)%($+1)~if i != j~!~if !c~@ca c=z

A difference was detected
_cd=@ca c=z~echo Code segment has changed

Usage info if x and y were not set
_ce= echo Set x to start, y to end of code to be checksummed (x <= y)~reset

"Check" is one the more complex macros in "pmars.mac". It is does the same
thing as Planar's commands to detect self-bombing of "Fahrenheit", but is
more general. The macro steps and then calculates a checksum over a
user-defined core range. If the range has changed, the macro stops with the
message "Code segment has changed". A warning: "check" is very slow, and it
is not practical to use a range of more than 10 addresses or so. You can
speed up execution by rewriting the "c_step" submacro. Replacing the
"@step" with "@skip 10" will do the trick, or set a break point inside a
loop and use "@go".


-------------------------------------------------------------------------
Exercises:

1) The "next" macro only works for battles with one or two warriors. Modify
it so it skips to the next round even if more than 2 warriors are loaded.

2) Write a macro that steps until the number of processes of a warrior
decreases (Hint: use the pqueue command).

-------------------------------------------------------------------------
Answers to the exercises from part 2:

Hello, this is Planar again.  I got only one answer to my request for
answers to the exercises.  Are you all sleeping or what ?  Since I'm
very lazy, I'll mostly quote.

(I didn't have the time to test the following, so a good exercise is
to find the bugs and fix them.)

>From: jgpletin@vub.ac.be (Pletinckx Jurgen)
>
>Okay. Let's see about this. Your original instructions were:
>
>(cdb) ca C=1003,X=3039
>(cdb) !!~ca C=C+1,D=0~@ed1~mov.i<100,<C~!!~@ca D=D+1~@s~@0~if \
>B==X~!~ca d~@g~@s~!4
>
>First off, I rewrote this to a couple of macros. (I _am_ new to cdb, 
>it's just that I'm lazy enough to dig macro's.)
>
>tilt=@ca c=999~!!~m prep~m inn~@g~@s~!8
>prep=@ca c=c+1,d=0~@ed1~mov.i <100, <c
>inn=!!~@ca d=d+1~@s~@0~if b==3039~!~ca c,d
>
>where "prep" does the preparation and "inn" is the inner loop.
>"tilt" would mean "boinkers", or perhaps "wacko", if you need to know.
>
>|1. The above loop will take a lot of time.  Accelerate it by stepping
>|   10 by 10 instead of 1 by 1.
>
>Pretty easy. I just change "inn" to
>
>inn=!!~@ca d=d+10~sk9~@0~if b==3039~!~ca c,d
		   ^ maybe you should insert an @ here
>
>|2. We're only interested in the value that gives the greatest number
>|   of cycles.  Change the command line to display only that value and
>|   the corresponding number of cycles.
>
>Let's say I store the maximum number of steps in e, and the correspon-
>ding constant in f. I don't need to change "prep", and I can leave off
>the last ca in "inn":
>
>tilt=@ca c=999,e=0~!!~m prep~m inn~if d>e~@ca e=d,f=c~@g~@s~!8~ca f,e
>inn=!!~@ca d=d+1~@s~@0~if b==3039~!
>
>|3. Use "fill" to abort the current battle instead of finishing it with
>|   "go".  How much faster is this ?
>
>Pass. If I understand correctly, you'd want to fill lines 0-4 with 
>"dat0,0", so that the warrior crashes on its next step? So that you can
>replace the "g" with a single "s"?

Yes, or you can use what Stefan taught us today and change the "@g~@s"
in "tilt" to a "@m next":

tilt=@ca c=999,e=0~!!~m prep~m inn~if d>e~@ca e=d,f=c~@m next~!8~ca f,e

>|4. Even faster: instead of doing the inner loop step by step all the
>|   way, skip to the greatest number of cycles so far, and start
>|   stepping from there if the SPL is still not bombed.  (Is that
>|   clear ?)
>
>I can nicely use the counter d for this. Add a skip to "tilt", and initialise
>d to maximum-1, instead of to 0. To make it work, I need to initialise
>e to 1 instead of to 0. And I keep the modifications from question 2.
>
>tilt=@ca c=999,e=1~!!~m prep~sk d~m inn~if d>e~@ca e=d,f=c~@g~@s~!8~ca f,e
>prep=@ca c=c+1,d=e-1~@ed1~mov.i <100, <c

You're missing an @ again.

>|5. Figure out a way of putting a sequence of instructions under an
>|   "if" instead of a single instruction, so that the sequence is
>|   executed only when the condition is true.
>
>Pass. Something with !!, if I recall correctly. But what's the point of
>a tutorial, if I have to go look things up in a manual :)?

OK, then I'll give you the answer: use a loop with a counter of 1.
When the next command after an "if" is a loop, CDB will skip the whole
loop if the condition is false.  If it's true, CDB will loop once,
i.e. execute the sequence, so you'd write:

   if condition ~ !! ~ command 1 ~ command 2 ~ !1

For a real example, you'll have to wait a few weeks, or you can look
up "_sd" in pmars.mac.

>|6. [hard] The inner loop fails to stop if the self-bombing doesn't
>|   occur on the SPL.  How do you make it work in all cases ?
>
>I haven't got a clue. You can't just go and check each line, I guess.
>And neither can you just store away an untouched version of the warrior
>since it wouldn't remain untouched in the core for very long. Hmpf.
>Sounds like an important question, though.

You could stop at the bombing lines and check what they are going to
bomb.  You could try to use the macro "check" but the "ADD" line will
get in the way.  I was hoping that somebody could come up with a
better idea.  I'll publish one or two solutions next week.

>-- 
>      Jurgen Pletinckx                Department of Ultrastructure
>      Vrije Universiteit Brussel      Belgium   jgpletin@vub.ac.be
>      *****************  Kwaliteit drijft boven  *****************


Congratulations Jurgen, you gave the best answer to every exercise.
You win a lifetime subscription to Core Warrior :-)
______________________________________________________________________________
Questions?  Concerns?  Comments?  Complaints?  Mail them to people who care:
Beppe Bezzi <bezzi@iol.it>, Myer R Bremer <bremermr@ecn.purdue.edu> or
Maurizio Vittuari <pan0178@iperbole.bologna.it>
© 2002-2005 corewar.info. Logo © C. Schmidt