1;redcode-94nop 2;name Son of Vain 3;author Oversby/Pihlaja 4;assert 1 5load0 z for 0 6 rof 7 8ofs equ (-2) ; offset boot distances by this much. 9 10; stone constants 11step equ 6457 ; primary step 12hop equ 3643 ; decr. ofs from bomb 13dbofs equ 9 ; bomb distance from stone 14tgt equ 2 ; first mutation target 15time equ 2293 ; bombs before first mutation 16sdist equ (2599+ofs) ; boot distance 17 18; clear constants 19dgate equ (dclr-9) 20dwipeofs equ (-947) ; offset of clear trail from stone 21ddist equ (7328+ofs) ; boot distance 22dmopa equ <2667 ; mop a-field 23 24; spin constants 25ldist equ (7426+ofs) ; boot distance 26ldecoy equ (5956+ofs) ; decoy distance 27idist equ (7471+ofs) ; imp trail dist. 28 29; qscan constants 30 31a1 equ 3922 ; factors and scan offsets 32a2 equ 1999 33b1 equ 609 34b2 equ 6686 35b3 equ 4763 36c2 equ 2149 37d equ 5014 38 39; qbomb constants 40 41qrep equ 13 ; repeats of bomb loop 42qinc1 equ 7 ; attack step 43qhop equ 60 ; offset of bomb 44 45 46;;-- primary boot 47;; 48 49boot spl misc , >b1 ; start secondary boot 50t2 spl 1 , >b2 ; t2 = qscan decode table 51 spl 1 , >b3 52 mov <dsrc , <ddst 53 mov <ssrc , {sdst 54 mov <lsrc , {ldst 55sdst ddst spl load0+sdist+4, load0+ddist+4 56ldst jmp load0+ldist+4, <chk_flag 57 58 dat 0,0 59 dat 0,0 60 dat 0,0 61 dat 0,0 62 dat 0,0 63 dat 0,0 64;;-- imp launcher 65;; 66lsrc 67spin spl #1 , 4 ; the a-field is checked by misc boot. 68 add.a #2667 , 1 69 djn.f spin+idist-ldist-1-2667,<spin-ldist+ldecoy 70 dat 0 , 0 71 72 dat 0,0 73 dat 0,0 74t3 dat.a qhop , c2 ; t3 = qscan decode table 75 dat 0,0 ; & attack bomb. 76 dat 0,0 77 dat 0,0 78 dat 0,0 79 80;;-- clear 81;; 82 83imp mov.i #10 , 2667 84db dat.a >hop , >1 ; dat bomb for stone 85dmop dat.a dmopa , dclr+8-dgate ; dat bomb for clear 86 dat 0,0 87 dat 0,0 88 dat 0,0 89 dat 0,0 90 dat 0,0 91 dat 0,0 92dsrc 93dclr spl #0 , 4 94 spl #0 , {dgate 95 mov dgate+2 , >dgate 96 djn.f -1 , >dgate 97 98 dat 0,0 99 dat 0,0 100 dat 0,0 101 dat 0,0 102 dat 0,0 103 dat 0,0 104 dat 0,0 105 dat 0,0 106 dat 0,0 107 dat 0,0 108;;-- qscan body 109;; 110qscan seq qb + d , qb + d + b2 111 jmp q1 112 113 sne qb + d * a1, qb + d * a1 + b2 114 seq <t1-1 , qb + d * (a1-1) + b2 ; t1-1 + a1-1 115 djn.a q0 , {q0 ; == qb+d*(a1-1) 116 117 sne qb + d * a2, qb + d * a2 + b2 118 seq <t1 , qb + d * (a2-1) + b2 ; t1 + a2-1 119 jmp q0 , {q0 ; == qb+d*(a2-1) 120 121 sne qb + d * b1, qb + d * b1 + b1 122 seq <t2-1 , qb + d * (b1-1) + (b1-1); t2-1 + b1-1 123 jmp q0 , {q2 ; == qb+d*(b1-1) 124 125 sne qb + d * b3, qb + d * b3 + b3 126 seq <t2+1 , qb + d * (b3-1) + (b3-1); t2+1 + b3-1 127 jmp q0 , }q2 ; == qb+d*(b3-1) 128 129 seq qb + d * (b1-2),qb + d * (b1-2) + (b1-2); must follow the 130 djn q0 , {q2 ; <t2-1 scan 131 132 sne qb + d * c2, qb + d * c2 + b2 133 seq <t3 , qb + d * (c2-1) + b2 ; t3 + c2-1 134 jmp q0 , }q0 ; == qb+d*(c2-1) 135 136 sne qb + d * b2, qb + d * b2 + b2 137 seq <t2 , qb + d * (b2-1) + (b2-1); t2 + b2-1 138 ; == qb+d*(b2-1) 139 jmp q0 , >a1 ; q0-1 and boot-1 140t1 jmp boot , >a2 ; must be dat 0,0's. 141 142;;-- stone 143;; 144spl0 145ssrc ;spl 0 , 0 146st spl 0 , 4 147 mov -1+dbofs, @2 148 add #step , @-1 149 djn.a @-1 , *st+(tgt-hop)-(step*time) 150 151 dat 0,0 152 dat 0,0 153 dat 0,0 154 dat 0,0 155 dat 0,0 156 dat 0,0 157 dat 0,0 158 dat 0,0 159 160;;-- misc. boot 161;; 162 ; bmbdist: address of stone bomb. 163 ; gatedist: address of clear gate. 164 ; wipedist: address of clear wipe start. 165bmbdist equ (sdist+dbofs) 166gatedist equ (ddist+dgate-dclr) 167wipedist equ (sdist+dwipeofs-ddist+dclr-dgate) 168 169misc mov imp , load0+idist 170 mov db , load0+bmbdist 171pmop mov dmop , load0+gatedist+2 172 mov spl0 , {sdst 173 mov dmop , <pmop 174 mov.x #wipedist, <pmop 175 spl @ddst ; start clear. 176chk_flag djn.a dclr+1 , *ldst+4 177 dat 0,0 178 179;;-- qbomb 180;; 181; dat 0,0 ; dat be here. 182q0 mul.b *2 , qb 183q1 sne {t1 , @qb 184q2 add.b t2 , qb 185 mov t3 , @qb 186qb mov t3 , *d 187 sub #qinc1 , qb 188 djn -3 , #qrep 189 jmp boot 190 191 end qscan 192 193