Egy Tierra program Tom Ray nyomán
0107aaa.tie ötlete
Assembly nyelven programozva, ha a programunkhoz hozzáadunk egy nop utasítást, akkor általában nem sok változást tapasztalunk. Persze, Assembly-ben is lehet olyan programot írni, ahol dramatikus hatása van egy nop-nak, de nem ez a jellemző. A Tierra kódjában azonban már néhány nop-pal is jelentősen megváltoztathatjuk programunk hatását! Emlékezzünk vissza a template címzés módszerére, ahol a jump utasítás egy kiegészítő (inverz) template-et keres meg ugrási célnak.
Ha például a kódunkba több helyre is elhelyezünk egy template-et, akkor előfordulhat, hogy a genetikai változások hatására a következő template-re ugrik a jump, ezzel jelentősen megváltoztatva a kód működését.
Tierra kódok írásakor elfogatott, hogy mindenki szeretné kissebb méretű önreprodukáló kódot írni, ami kihívásnak tűnik. Azonban más irányban is lehet próbálkozni. Tom Ray 0080aaa "ős programját" úgy vátoztattam, meg hogy 5 különböző 5 db nop-ból álló template-et tettem bele. A változtatás látszólag semmit nem jelent, nincs meg az aminek párja lehet a beírt template, nem csak összefüggő kóddarabokat választanak el ezek a template-ek (amitől az lenne várható, hogy hamar "szét esik" és nem tud tovább szaprodni a genom, hamar leáll a tierra futása).
Az így készült 0107aaa.tie mégis hasonlóan életképes (azonos indításai paraméterekkel) mint a kiválasztott ős.
0107aaa.tie
A pluszban beírt template nop utasításokhoz nem írtam kommentet.
**** begin genome file (note blank line at top of file)
format: 3 bits: 3
genotype: 0107aaa genetic. 0,107 parent genotype: 0666god
CODE
track 0:
nop1 ; 110 01 0 beginning marker
nop1 ; 110 01 1 beginning marker
nop1 ; 110 01 2 beginning marker
nop1 ; 110 01 3 beginning marker
zero ; 110 04 4 put zero in cx
not0 ; 110 02 5 put 1 in first bit of cx
shl ; 110 03 6 shift left cx (cx = 2)
nop0
nop0
nop1
nop1
nop1
shl ; 110 03 7 shift left cx (cx = 4)
nop0
nop1
nop1
nop1
nop1
nop1
movDC ; 110 18 8 move cx to dx (dx = 4)
adrb ; 110 1c 9 get (backward) address of beginning marker -> ax
nop0 ; 100 00 10 complement to beginning marker
nop0 ; 100 00 11 complement to beginning marker
nop0 ; 100 00 12 complement to beginning marker
nop0 ; 100 00 13 complement to beginning marker
subAAC ; 110 07 14 subtract cx from ax, result in ax
movBA ; 110 19 15 move ax to bx, bx now contains start address of mother
adrf ; 110 1d 16 get (forward) address of end marker -> ax
nop0 ; 100 00 17 complement to end marker
nop0 ; 100 00 18 complement to end marker
nop0 ; 100 00 19 complement to end marker
nop1 ; 100 01 20 complement to end marker
incA ; 110 08 21 increment ax, to include dummy instruction at end
subCAB ; 110 06 22 subtract bx from ax to get size, result in cx
nop1 ; 110 01 23 reproduction loop marker
nop1 ; 110 01 24 reproduction loop marker
nop0 ; 110 00 25 reproduction loop marker
nop1 ; 110 01 26 reproduction loop marker
mal ; 110 1e 27 allocate space (cx) for daughter, address to ax
call ; 110 16 28 call template below (copy procedure)
nop0 ; 100 00 29 copy procedure complement
nop0 ; 100 00 30 copy procedure complement
nop1 ; 100 01 31 copy procedure complement
nop1 ; 100 01 32 copy procedure complement
divide ; 110 1f 33 create independent daughter cell
jmpo ; 110 14 34 jump to template below (reproduction loop)
nop0 ; 100 00 35 reproduction loop complement
nop0 ; 100 00 36 reproduction loop complement
nop1 ; 100 01 37 reproduction loop complement
nop0 ; 100 00 38 reproduction loop complement
ifz ; 000 05 39 dummy instruction to separate templates
nop1 ; 110 01 40 copy procedure template
nop1 ; 110 01 41 copy procedure template
nop0 ; 110 00 42 copy procedure template
nop0 ; 110 00 43 copy procedure template
pushA ; 110 0c 44 push ax onto stack
pushB ; 110 0d 45 push bx onto stack
pushC ; 110 0e 46 push cx onto stack
nop1 ; 110 01 47 copy loop template
nop0 ; 110 00 48 copy loop template
nop1 ; 110 01 49 copy loop template
nop0 ; 110 00 50 copy loop template
movii ; 110 1a 51 move contents of [bx] to [ax] (copy one instruction)
decC ; 110 0a 52 decrement cx (size)
ifz ; 110 05 53 if cx == 0 perform next instruction, otherwise skip it
jmpo ; 110 14 54 jump to template below (copy procedure exit)
nop0 ; 110 00 55 copy procedure exit complement
nop1 ; 110 01 56 copy procedure exit complement
nop0 ; 110 00 57 copy procedure exit complement
nop0 ; 110 00 58 copy procedure exit complement
incA ; 110 08 59 increment ax (address in daughter to copy to)
incB ; 110 09 60 increment bx (address in mother to copy from)
jmpo ; 110 14 61 bidirectional jump to template below (copy loop)
nop0 ; 100 00 62 copy loop complement
nop1 ; 100 01 63 copy loop complement
nop0 ; 100 00 64 copy loop complement
nop1 ; 100 01 65 copy loop complement
ifz ; 000 05 66 this is a dummy instruction to separate templates
nop1 ; 110 01 67 copy procedure exit template
nop0 ; 110 00 68 copy procedure exit template
nop1 ; 110 01 69 copy procedure exit template
nop1 ; 110 01 70 copy procedure exit template
popC ; 110 12 71 pop cx off stack (size)
nop0
nop1
nop1
nop0
nop0
popB ; 110 11 72 pop bx off stack (start address of mother)
nop0
nop1
nop1
nop1
nop0
popA ; 110 10 73 pop ax off stack (start address of daughter)
nop1
nop0
nop0
nop1
nop1
ret ; 110 17 74 return from copy procedure
nop1 ; 100 01 75 end template
nop1 ; 100 01 76 end template
nop1 ; 100 01 77 end template
nop0 ; 100 00 78 end template
ifz ; 000 05 79 dummy instruction to separate creature
**** end genome file