-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path28 - Tutorial Twenty Eight - Paranoid.asm
551 lines (438 loc) · 14.4 KB
/
28 - Tutorial Twenty Eight - Paranoid.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
;*******************************************************************************
;* Tutorial Twenty-Eight Paranoid Coversion *
;* *
;* Written By John C. Dale *
;* Tutorial #28 *
;* Date : 5th Jan, 2018 *
;* *
;*******************************************************************************
;* Change History : *
;* 20th May 2018 : Fixed the AddTwosCompliment Routine *
;* : Fixed the Random Generator as pointed out by EgonOlsen71 *
;* : Modified Code to EOR Pixel and not ORA to see effect *
;*******************************************************************************
; 10 SYS (2064)
;*******************************************************************************
;* *
;* Debug Watch Variables *
;* *
;*******************************************************************************
WATCH Prog_X
WATCH Prog_Y
WATCH Prog_DX
WATCH Prog_DY
WATCH Prog_Y1
WATCH Prog_X1
WATCH Prog_Pos
WATCH Prog_YA
WATCH Prog_YB
WATCH Prog_XA
WATCH Prog_XB
WATCH Prog_XC
;*******************************************************************************
;* *
;* BASIC Auto Run Loader *
;* *
;*******************************************************************************
*=$0801
BYTE $0E, $08, $0A, $00, $9E, $20, $28, $32, $30, $36, $34, $29, $00, $00, $00
*=$0810
;*******************************************************************************
;* *
;* Assembley Reference Variables *
;* *
;*******************************************************************************
VIC = $D000 ; 53248
SCRNSTART = $0400 ; 1024
GRAPHICSSRT = $2000 ; 8192
X_START = 79
Y_START = 49
POINTADDRESS= $14
;*******************************************************************************
;* *
;* Program Start *
;* *
;*******************************************************************************
jmp START
;*******************************************************************************
;* *
;* Code Variables *
;* *
;*******************************************************************************
Prog_BA
BYTE 00
Prog_PArray
BYTE %10000000,%01000000,%00100000,%00010000,%00001000
BYTE %00000100,%00000010,%00000001
Prog_X
WORD 00
Prog_Y
WORD 00
Prog_DX
BYTE 00
Prog_DY
BYTE 00
Prog_Y1
WORD 00
Prog_X1
WORD 00
Prog_Pos
WORD 00
Prog_YA
BYTE 00
Prog_YB
BYTE 00
Prog_XA
BYTE 00
Prog_XB
BYTE 00
Prog_XC
BYTE 00
;*******************************************************************************
;* *
;* G^Ray Defender - Randomiser Code from G-Pac Clone Game *
;* *
;*******************************************************************************
;============================================================
Init_Random
lda #$FF ; maximum frequency value
sta $D40E ; voice 3 frequency low byte
sta $D40F ; voice 3 frequency high byte
lda #$80 ; noise SIRENform, gate bit off
sta $D412 ; voice 3 control register
rts
Rand
lda $D41B ; get random value from 0-255
rts
;============================================================
;*******************************************************************************
;* *
;* Defined Macros *
;* *
;*******************************************************************************
;*******************************************************************************
;* *
;* Fill Video Memory Bank With A Value *
;* *
;*******************************************************************************
defm FillVideoMemoryBank ; StartAddress
; Start Address of Bank
ldx #0
@Looper
sta /1,x
sta /1 + $0100,x
sta /1 + $0200,x
sta /1 + $0300,x
inx
bne @Looper
endm
;*******************************************************************************
;* *
;* Evaluate a Delta Code from a Random Number *
;* *
;*******************************************************************************
defm EvaluateNextDeltaNumber ; Delta Variable
;DX=INT(RND(1)*3-1) Results in a number of either -1, 0, +1
@TryAgain
jsr Rand
and #%00000011 ; just give me the 2 least significant bits
cmp #3 ; is the end result 3?
beq @TryAgain ; Yes, then try again
sec
sbc #1
sta /1
endm
;*******************************************************************************
;* *
;* Copy a Word from One Address to Another Address *
;* *
;*******************************************************************************
defm CopyWord ; WordSource, WordTarget
lda /1
sta /2
lda /1 + 1
sta /2 + 1
endm
;*******************************************************************************
;* *
;* Subtract a Number from a Memory Location and Store result in another location
;* *
;*******************************************************************************
defm SubtractNumberWord ; wrdSourceNumber, wrdSubtract, wrdTarget
lda #</1
sec
sbc /2
sta /3
lda #>/1
sbc /2 + 1
sta /3 + 1
endm
;*******************************************************************************
;* *
;* Add a twos compliment Byte to an Existing Twos Compliment Word *
;* *
;*******************************************************************************
defm AddTwosComplimentNumbers ; wrdSource, bytAddition, wrdTarget
clc
lda /2
adc /1
sta /3
lda /2
bpl @JumpCLC
clc
@JumpCLC
lda #0
; adc /1 + 1
adc #0 ; We dont have a hi Byte for a BYTE Parameter, so this is to
sta /3 + 1 ; Add the carry over to the HiByte of the wrdTarget
endm
;*******************************************************************************
;* *
;* Multiply a word source by 2 *
;* *
;*******************************************************************************
defm MultiplyWordByTwo ; wrdSource, wrdTarget
lda /1
asl
sta /2
lda /1 + 1
rol
sta /2 + 1
endm
;*******************************************************************************
;* *
;* Divide the Source Word by eight, and store the result and the remainder *
;* *
;*******************************************************************************
defm DivideSourceWordByEight ; wrdSource, bytResult, bytRemainder
lda /1
sta /2
lda /1 + 1
lsr ; Divide by 2
ror /2
lsr ; Divide By 4
ror /2
lsr ; Divide By 8
ror /2
lda /1
and #%00000111
sta /3
endm
;*******************************************************************************
;* *
;* Main Routine *
;* *
;*******************************************************************************
START
jsr Init_Random
Line0
;BACKGROUND=1
lda #1
sta Prog_BA
Line5
;POKE55,255:POKE56,31
; Dont need to convert line 5, as this is related to protecting basic
Line6
;DIMP(7):FORI=0TO7:P(I)=2^(7-I):NEXT
;ldx #0
;lda #$80
@Line6Loop
;sta p,x
;lsr
;inx
;cpx#8
;bne @Line6Loop
Line10
;V=53248:POKEV+32,0:POKEV+33,0
lda #0
sta VIC + 32
sta VIC + 33
Line30
;POKEV+24,PEEK(V+24)OR8
lda VIC + 24
ora #8
sta VIC + 24
Line40
;POKEV+17,PEEK(V+17)OR32
lda VIC + 17
ora #32
sta VIC + 17
Line50
;FORI=1024TO2024:POKEI,BA:NEXT
lda Prog_BA
FillVideoMemoryBank SCRNSTART
Line60
;FORI=8192TO8192+8*1024:POKEI,0:NEXT
lda #0
FillVideoMemoryBank GRAPHICSSRT
FillVideoMemoryBank $2400
FillVideoMemoryBank $2800
FillVideoMemoryBank $2C00
FillVideoMemoryBank $3000
FillVideoMemoryBank $3400
FillVideoMemoryBank $3800
FillVideoMemoryBank $3C00
Line100
;X=79:Y=49:DX=INT(RND(1)*3-1):DY=INT(RND(1)*3-1):IFDX=0ANDDY=0THEN100
ldx #X_START
stx Prog_X
ldy #Y_START
sty Prog_Y
lda #0
sta Prog_X + 1
sta Prog_Y + 1
EvaluateNextDeltaNumber Prog_DX
EvaluateNextDeltaNumber Prog_DY
lda Prog_DX
bne Line105
lda Prog_DY
bne Line105
jmp Line100
Line105
;Y1=Y:X1=X:GOSUB1000:X1=319-X:GOSUB1000:Y1=199-Y:GOSUB1000:X1=X:GOSUB1000
CopyWord Prog_Y, Prog_Y1
CopyWord Prog_X, Prog_X1
jsr Line1000
SubtractNumberWord $013F, Prog_X, Prog_X1
jsr Line1000
SubtractNumberWord $00C7, Prog_Y, Prog_Y1
jsr Line1000
CopyWord Prog_X, Prog_X1
jsr Line1000
Line107
;Y1=Y*2:X1=X*2:GOSUB1000:Y1=199-Y1:X1=319-X1:GOSUB1000
MultiplyWordByTwo Prog_Y, Prog_Y1
MultiplyWordByTwo Prog_X, Prog_X1
jsr Line1000
SubtractNumberWord $00C7, Prog_Y1, Prog_Y1
SubtractNumberWord $013F, Prog_X1, Prog_X1
jsr Line1000
Line110
;X=X+DX:Y=Y+DY:IFX<0ORX>159THENDX=-DX:GOTO110
AddTwosComplimentNumbers Prog_X, Prog_DX, Prog_X
AddTwosComplimentNumbers Prog_Y, Prog_DY, Prog_Y
lda Prog_X + 1
bmi @Line110Error
lda Prog_X
cmp #159
bcs @Line110Error
jmp Line115
@Line110Error
lda Prog_DX
eor #$FF
clc
adc #01
sta Prog_DX
jmp Line110
Line115
;IFY<0ORY>99THENDY=-DY:GOTO110
lda Prog_Y + 1
bmi @Line115Error
lda Prog_Y
cmp #99
bcs @Line115Error
jmp Line120
@Line115Error
lda Prog_DY
eor #$FF
clc
adc #1
sta Prog_DY
jmp Line110
Line120
;IFRND(1)>.9THENDX=INT(RND(1)*3-1)
jsr Rand
cmp #225 ; 90% of 256
bcc Line130
EvaluateNextDeltaNumber Prog_DX
Line130
;IFRND(1)>.9THENDY=INT(RND(1)*3-1)
jsr Rand
cmp #225 ; 90% of 256
bcc Line135
EvaluateNextDeltaNumber Prog_DY
Line135
;IFDX<>0ORDY<>0THEN105
lda Prog_DX
bne @Line135
lda Prog_DY
bne @Line135
jmp Line140
@Line135
jmp Line105
Line140
;DX=INT(RND(1)*3-1):DY=INT(RND(1)*3-1):IFDX=0ANDDY=0THEN140
EvaluateNextDeltaNumber Prog_DX
EvaluateNextDeltaNumber Prog_DY
lda Prog_DX
bne Line150
lda Prog_DY
bne Line150
jmp Line140
Line150
;GOTO105
jmp Line105
Line1000
;YA=INT(Y1/8):YB=Y1-YA*8:XA=INT(X1/8):XB=X1-XA*8
DivideSourceWordByEight Prog_Y1, Prog_YA, Prog_YB
DivideSourceWordByEight Prog_X1, Prog_XA, Prog_XB
Line1005
;P=8*1024+YA*320+XA*8+YB:XC=P(XB)
; 8*1024
lda #0
sta Prog_Pos
lda #$20
sta Prog_Pos + 1
; YA*320
ldy Prog_YA
@line1005Loop1
clc
lda #$40
adc Prog_Pos
sta Prog_Pos
lda #1
adc Prog_Pos + 1
sta Prog_Pos + 1
dey
bne @Line1005Loop1
; XA*8
lda Prog_XA
asl ; Multiply By 2
asl ; Multiply By 4
asl ; Multiply By 8
pha
; Add Carry to Position Hi Byte
lda #0
adc Prog_Pos + 1
sta Prog_Pos + 1
pla
clc
adc Prog_Pos
sta Prog_Pos
lda Prog_Pos + 1
adc #0
sta Prog_Pos + 1
; YB
lda Prog_YB
clc
adc Prog_Pos
sta Prog_Pos
lda #0
adc Prog_Pos + 1
sta Prog_Pos + 1
; XC=P(XB)
ldy Prog_XB
lda Prog_PArray,y
sta Prog_XC
Line1010
; POKEP,PEEK(P)ORXC:RETURN
lda Prog_Pos
sta POINTADDRESS
lda Prog_Pos + 1
sta POINTADDRESS + 1
ldy #0
lda (POINTADDRESS),y
ora Prog_XC
; eor Prog_XC
sta (POINTADDRESS),y
rts