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