-
Notifications
You must be signed in to change notification settings - Fork 1
/
HWYENC.MAC
4585 lines (4466 loc) · 167 KB
/
HWYENC.MAC
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
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
.TITLE HWYENC
.MCALL .EXIT
.MACRO PUSH RR
MOV RR,-(SP)
.ENDM
.MACRO POP RR
MOV (SP)+,RR
.ENDM
; Game screen start address: #104304
;------------------------------------------------------------------------------
.ASECT
.=001000
START::
CLR @#177560
;MTPS #200 ; Запретить прерывания
CALL STPAL ; Установить игровую палитру
MOV #GAMESC, R1 ; Строка для подготовки игрового экрана
CALL PRINT
CALL PAUSE ; подождём пока очистится экран
CALL PRESHT ; Прешифт спрайтов в свободную невидимую область экрана
;30$: BR 30$ ;DEBUG
JMP LB0DE ; Start point
FINISH:
MOV #EXITSC, R1 ; Строка очистки экрана перед выходом
CALL PRINT
.EXIT
;------------------------------------------------------------------------------
; Подпрограмма: Печать строки: R1 = адрес строки, строка завершается 0; портит R0
PRINT:
10$: MOVB (R1)+, R0 ; Конец строки?
BEQ RETN ; да => выходим
20$: TSTB @#177564 ; Источник канала 0 готов?
BPL 20$ ; нет => ждём
MOV R0, @#177566 ; передаём символ в канал 0
BR 10$
;Подпрограмма: пауза после очистки экрана чтобы ПП закончил работу
PAUSE: ; Pause to let PPU finish the previous commands
MOV #177777, R5
1$: NOP
SOB R5, 1$
RETN: RETURN
; Подпрограмма: Ожидание символа с клавиатуры: R0 = полученный символ
WTKEY: TSTB @#177560
BPL WTKEY
CLR R0
MOVB @#177562, R0 ; символ в R0
CMPB R0, #33
BNE RETN
ESCKEY: TSTB @#177560
BPL ESCKEY
MOVB @#177562, R0 ; символ в R0
BIS #15400,R0 ; #33 в верхний байт
RETURN
; Подпрограмма: Получение символа с клавиатуры: флаг Z=0 = есть символ, R0 = полученный символ
GETKEY: TSTB @#177560 ; есть символ?
BPL 10$ ; нет символа => выходим
MOVB @#177562, R0 ; символ в R0
CMPB R0, #33 ; Esc ?
BEQ ESCKEY
RETURN
10$: CLR R0 ; возвращаем пустой код клавиши
RETURN
;------------------------------------------------------------------------------
.IIF GT <.-001200>, ERR012
.=1200
SPRITE::
.INCLUDE /SPRITE.MAC/
;------------------------------------------------------------------------------
.IIF GT <.-051400>, ERR514
.=51400
;WARN: Важно чтобы теневой экран был по чётному адресу!
LD900: .BLKB 704.
; Shadow screen, 24. char-lines, 24. * 8. lines, 32. * 24. * 8. = 6144. bytes
LDBC0: .BLKB 832.
LDF00: .BLKB 2560.
LE900: .BLKB 512. ; Условное начало второго теневого экрана
LEB00: .BLKB 4608.
LFD00: .BLKB 553. ; Drawing markers area
LFF29: .BYTE 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
.BYTE 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
.EVEN
;------------------------------------------------------------------------------
GAMESC: ; Строка подготовки игрового экрана
; .BYTE 33,246,061 ; Формат экрана 80x24 ;DEBUG
.BYTE 33,246,62 ; Формат экрана 40x24
.BYTE 33,240,63 ; Цвет символа
.BYTE 33,241,60 ; Цвет знакоместа 0
.BYTE 33,242,60 ; Цвет фона 0
.BYTE 14 ; Clear screen
.BYTE 0
EXITSC: ; Строка очистки экрана перед выходом
.BYTE 33,246,061 ; Формат экрана 80x24
.BYTE 33,240,67 ; Цвет символа
.BYTE 33,241,61 ; Цвет знакоместа 1
.BYTE 33,242,61 ; Цвет фона 1
.BYTE 14 ; Очистить экран
.BYTE 0
.EVEN
; Прешифт всех 57. спрайтов в свободную правую (невидимую) часть экрана
; Размещаем прешифтнутые спрайты в 20. колонок, в 3 строки
; Прешифт на 4px освобождает один из 3-х байт, поэтому для маски и пикселей нужно хранить по два байта.
PRESHT:
CLR R0 ; текущий номер спрайта
MOV #LB8F0, R2 ; адрес начала спрайтов
MOV #100050, R3 ; косвенный адрес
MOV #20., PSHCOL ; счётчик колонок
; Цикл по спрайтам
05$: MOV #24., R5
PUSH R0
PUSH R3
; Цикл по строкам спрайта; R2 = данные спрайта, R3 = косвенный адрес
10$: MOV (R2)+, R0 ; Get mask byte 0/1
CLR R1
BISB (R2)+, R1 ; Get mask byte 2
ASRB R1 ; Shift by 1
ROR R0 ;
ASRB R1 ; Shift by 2
ROR R0 ;
ASRB R1 ; Shift by 3
ROR R0 ;
ASRB R1 ; Shift by 4
ROR R0 ;
MOV R3, @#176640
MOV R0, @#176642 ; Save bytes 0/1
INC @#176640
;
CLR R0
BISB (R2)+, R0 ; Get pixels byte 0
MOV (R2)+, R1 ; Get pixels byte 1/2
ASR R1 ; Shift by 1
RORB R0 ;
ASR R1 ; Shift by 2
RORB R0 ;
ASR R1 ; Shift by 3
RORB R0 ;
ASR R1 ; Shift by 4
RORB R0 ;
SWAB R0
BISB R1, R0
SWAB R0
MOV R0, @#176642 ; Save bytes 0/1
;
ADD #80., R3 ; next line
SOB R5, 10$ ; продолжение цикла по строкам спрайта
;
POP R3 ; восстанавливаем косвенный адрес
POP R0 ; восстанавливаем номер спрайта
INC R3 ; сдвигаем к следующей колонке из спрайтов
INC R3
DEC PSHCOL
BNE 20$
ADD #<<24.*80.>-40.>, R3 ; к следующей строке из спрайтов
MOV #20., PSHCOL
20$: INC R0
CMP R0, #57. ; это был последний спрайт?
BNE 05$ ; продолжение цикла по спрайтам
RETURN
PSHCOL: .WORD 0 ; счётчик по колонкам для прешифта
;------------------------------------------------------------------------------
.IIF GT <.-075000>, ERR750
.=075000
L7A00: ; Table with sprite addresses
.WORD LD480, LD510, LD5A0, LD630, LD6C0, LD750, LD7E0, LD870 ; 000 Main Vorton
.WORD LD240, LD2D0, LD360, LD3F0, LD120, LD1B0, LD120, LD1B0 ; 020 Lasertron, 030 Shot
.WORD LD000, LD090, LD000, LD090, LC700, LC790, LC820, LC8B0 ; 040 Laser, 050 Pawn
.WORD LC940, LC9D0, LCA60, LCAF0, LCB80, LCC10, LCCA0, LCD30 ; 060 Grammy, 070 Frog
.WORD LCDC0, LCE50, LCEE0, LCF70, LC280, LC310, LC3A0, LC430 ; 100 Star, 110 Fire
.WORD LC0D0, LC0D0, LC0D0, LC0D0, LC4C0, LC550, LC5E0, LC670 ; 120 Glass, 130 Block crashing
.WORD LC1F0, LC1F0, LC1F0, LC1F0, LC160, LC160, LC160, LC160 ; 140 Block, 150 Barrel
.WORD LC040, LC040, LC040, LC040, LBAA0, LBB30, LBAA0, LBB30 ; 160 Auto-Vorton, 170 Ufo
.WORD LBCE0, LBCE0, LBCE0, LBCE0, LBCE0, LBCE0, LBCE0, LBCE0 ; 200 Explosion 0
.WORD LBD70, LBD70, LBD70, LBD70, LBD70, LBD70, LBD70, LBD70 ; 220 Explosion 1
.WORD LBE00, LBE00, LBE00, LBE00, LBE00, LBE00, LBE00, LBE00 ; 240 Explosion 2
.WORD LBE90, LBE90, LBE90, LBE90, LBE90, LBE90, LBE90, LBE90 ; 260 Explosion 3
.WORD LBF20, LBF20, LBF20, LBF20, LBF20, LBF20, LBF20, LBF20 ; 300 Explosion 4
.WORD LBFB0, LBFB0, LBFB0, LBFB0, LBFB0, LBFB0, LBFB0, LBFB0 ; 320 Explosion 5
.WORD LBBC0, LBBC0, LBBC0, LBBC0, LBC50, LBA10, LB980, LBC50 ; 340 Flat blocker, 350 BlockB
.WORD LBA10, LBA10, LBA10, LBA10, LC0D0, LC0D0, LC0D0, LC0D0 ; 360 ???, 370 Glass
; Global objects table, 16. bytes per record, max 240. records
; +$01,+$02 -- object position
; +$03,+$04 -- this plus current zone offset ($8F03) gives address on the screen
; +$05 -- base sprite number, index in 7A00 table
; +$06 -- movement pattern: 000 = Vorton, 006 = Fire, 012 = Block, 026 = Flat blocker, 032 = Barrel
; +$07 -- direction, copied from (IX+$0С) AND $07, values 0..7
; +$08 -- movement flags ?? 0 = stop, 1 = move; bit 7 = 1: explosion
; +$09 -- horz offset (bits 2-3 only)
; +$0A -- offset from $8F00, where we have sprite number: 015,017,020,021,022,023
; +$0B -- continuation point number from table $9000
; +$0C -- initial direction, copied to +$07
; +$0D,+$0E,+$0F -- initial values for +$00,+$01,+$02
; $00 $01 $02 $03 $04 $05 $06 $07 $08 $09 $0A $0B $0C $0D $0E $0F
L7B00: .BYTE 376,336,001,231,334,330,002,002,001,014,021,054,004,044,164,002 ; Pawn Zone 28
.BYTE 066,120,002,246,324,140,006,000,000,004,022,334,000,070,120,002 ; Fire? Zone 28
.BYTE 076,120,002,045,324,140,012,000,000,004,015,334,000,100,120,002 ; Block? Zone 28
.BYTE 106,120,002,244,323,140,012,000,000,004,015,334,000,110,120,002 ; Block? Zone 28
.BYTE 000,170,002,222,325,110,006,000,000,000,020,204,000,000,170,002 ; Fire Zone 28
.BYTE 066,212,002,015,321,150,032,006,000,010,015,334,000,040,306,001 ; Barrel Zone 29
.BYTE 010,330,001,375,336,150,032,001,001,000,015,334,000,022,316,001 ; Barrel Zone 29
.BYTE 000,332,001,136,337,150,032,001,000,004,015,334,000,006,324,001 ; Barrel Zone 29
.BYTE 100,216,002,054,320,150,032,006,000,014,015,334,000,050,330,001 ; Barrel Zone 29
.BYTE 066,322,001,166,334,150,032,000,000,010,015,334,000,066,322,001 ; Barrel Zone 29
.BYTE 102,326,001,165,333,150,032,000,000,010,015,334,000,102,326,001 ; Barrel Zone 29
.BYTE 044,300,003,366,276,350,030,000,000,010,015,260,000,050,264,003 ; BlockB Zone 26
.BYTE 044,310,003,167,276,350,030,000,000,010,015,260,000,040,334,003 ; BlockB Zone 26
.BYTE 044,320,003,370,275,350,032,000,000,010,015,260,000,055,356,003 ; Barrel Zone 26
.BYTE 064,264,003,263,276,120,032,000,000,000,015,232,000,064,372,003 ; Glass? Zone 27
.BYTE 024,334,003,074,276,120,003,000,001,000,021,232,006,024,262,005 ; Glass? Zone 27
L7C00: .BYTE 074,264,003,062,276,100,005,002,001,000,017,156,002,102,264,003 ; Star
.BYTE 014,334,003,275,276,100,005,002,001,000,017,156,006,010,334,003 ; Star
.BYTE 054,034,003,241,310,130,027,000,000,000,015,260,000,054,370,002 ; Glass?
.BYTE 054,044,003,042,310,130,006,000,000,000,020,260,000,020,060,003 ; Fire?
.BYTE 064,034,003,040,310,130,006,000,000,000,022,260,000,070,060,003 ; Fire?
.BYTE 034,054,003,245,310,130,027,000,000,000,015,260,000,034,010,003 ; Glass?
.BYTE 034,064,003,046,310,130,003,000,001,000,021,260,006,070,262,005 ; Pawn?
.BYTE 024,064,003,247,310,130,002,000,001,000,021,260,004,044,344,002 ; Pawn?
.BYTE 376,262,002,266,320,330,002,004,001,014,021,054,004,030,356,002 ; Pawn?
.BYTE 376,372,002,031,311,330,002,004,001,010,021,054,004,060,356,002 ; Pawn?
.BYTE 044,220,004,020,262,060,003,004,001,010,021,102,004,044,220,004 ; Grammy? Zone 25
.BYTE 024,200,004,020,264,060,003,002,001,010,022,102,002,024,200,004 ; Grammy? Zone 25
.BYTE 074,144,004,110,263,150,032,000,000,000,015,334,000,074,144,004 ; Barrel Zone 25
.BYTE 000,100,004,113,271,140,012,000,000,000,015,334,000,000,100,004 ; Block? Zone 25
.BYTE 010,100,004,312,270,140,012,000,000,000,015,334,000,010,100,004 ; Block? Zone 25
.BYTE 076,250,004,360,256,140,012,000,000,004,015,334,000,100,250,004 ; Block? Zone 25
.BYTE 106,250,004,157,256,140,012,000,000,004,015,334,000,110,250,004 ; Block? Zone 25
.BYTE 010,350,004,137,256,340,026,000,000,000,015,204,000,010,350,004 ; Flat blocker
.BYTE 020,370,004,340,254,340,026,000,000,000,015,204,000,020,370,004 ; Flat blocker
.BYTE 010,010,005,143,254,340,026,000,000,000,015,204,000,010,010,005 ; Flat blocker
.BYTE 000,040,005,147,253,340,026,000,000,000,015,204,000,000,040,005 ; Flat blocker
.BYTE 000,100,005,153,251,340,026,000,000,000,015,204,000,000,100,005 ; Flat blocker
.BYTE 020,130,005,354,246,340,026,000,000,000,015,204,000,020,130,005 ; Flat blocker
.BYTE 110,360,004,330,251,340,026,000,000,000,015,204,000,110,360,004 ; Flat blocker
.BYTE 070,000,005,334,251,340,026,000,000,000,015,204,000,070,000,005 ; Flat blocker
.BYTE 110,030,005,135,247,340,026,000,000,000,015,204,000,110,030,005 ; Flat blocker
.BYTE 100,060,005,141,246,340,026,000,000,000,015,204,000,100,060,005 ; Flat blocker
.BYTE 044,010,007,337,212,060,003,004,001,010,022,102,004,044,154,006 ; Fire?
.BYTE 025,021,007,102,213,060,003,004,001,010,022,102,004,025,141,006 ; Fire?
.BYTE 063,021,007,136,211,060,003,004,001,014,022,102,004,064,166,006 ; Fire?
.BYTE 006,040,007,106,213,060,003,004,001,004,022,102,004,006,212,006 ; Fire?
.BYTE 102,040,007,176,207,060,003,004,001,014,022,102,004,102,204,006 ; Fire?
L7E00: .BYTE 010,370,007,301,175,070,004,000,001,000,020,130,000,010,370,007 ; Frog?
.BYTE 070,020,010,076,171,070,004,002,001,000,022,130,002,070,020,010 ; Frog?
.BYTE 060,000,010,275,172,070,004,004,001,000,017,130,004,060,000,010 ; Frog?
.BYTE 040,010,010,100,173,070,004,001,001,000,020,130,001,040,010,010 ; Frog?
.BYTE 020,040,010,305,172,070,006,001,000,000,017,130,000,034,344,010 ; Star?
.BYTE 110,110,005,143,244,340,026,000,000,000,015,204,000,110,110,005 ; Flat blocker
.BYTE 070,140,005,350,243,340,026,000,000,000,015,204,000,070,140,005 ; Flat blocker
.BYTE 030,070,005,147,250,050,002,002,001,000,021,054,002,030,070,005 ; Pawn?
.BYTE 050,040,005,342,250,050,002,006,001,000,021,054,006,050,040,005 ; Pawn?
.BYTE 034,354,005,375,234,140,012,000,000,000,015,334,000,034,354,005 ; Block?
.BYTE 054,354,005,373,233,140,012,000,000,000,015,334,000,054,354,005 ; Block?
.BYTE 044,364,005,375,233,150,032,000,000,000,015,334,000,044,364,005 ; Barrel
.BYTE 044,354,005,174,234,100,005,006,001,000,020,156,006,044,354,005 ; Star?
.BYTE 064,050,010,001,170,070,004,001,002,010,017,130,001,064,050,010 ; Frog?
.BYTE 034,024,010,302,172,070,004,007,002,000,020,130,007,034,024,010 ; Frog?
.BYTE 000,160,007,261,206,340,006,000,000,000,020,204,000,020,160,007
.BYTE 010,160,007,060,206,340,006,000,000,000,022,204,000,070,160,007 ; Fire?
.BYTE 020,170,007,060,205,340,026,000,000,000,015,204,000,020,170,007 ; Flat blocker
.BYTE 020,200,007,261,204,340,026,000,000,000,015,204,000,020,200,007 ; Flat blocker
.BYTE 110,160,007,050,202,340,026,000,000,000,015,204,000,110,160,007 ; Flat blocker
.BYTE 100,160,007,251,202,340,026,000,000,000,015,204,000,100,160,007 ; Flat blocker
.BYTE 070,170,007,253,202,340,026,000,000,000,015,204,000,070,170,007 ; Flat blocker
.BYTE 070,200,007,054,202,340,026,000,000,000,015,204,000,070,200,007 ; Flat blocker
.BYTE 020,160,007,257,205,110,026,000,000,000,015,204,000,000,160,007 ; Flat blocker
.BYTE 070,160,007,052,203,110,026,000,000,000,015,204,000,010,160,007 ; Flat blocker
.BYTE 046,050,007,303,210,150,032,000,000,004,015,334,000,046,050,007 ; Barrel
.BYTE 036,070,007,106,210,150,032,000,000,004,015,334,000,036,070,007 ; Barrel
.BYTE 024,072,007,307,210,150,032,000,000,014,015,334,000,024,072,007 ; Barrel
.BYTE 064,104,007,045,206,150,032,000,000,000,015,334,000,064,104,007 ; Barrel
.BYTE 020,170,010,120,165,070,004,003,002,000,022,130,003,020,170,010 ; Frog?
.BYTE 060,160,010,313,163,070,004,004,002,000,021,130,004,060,160,010 ; Frog?
.BYTE 050,206,010,356,162,070,004,003,002,014,020,130,003,050,206,010 ; Frog?
L8000: .BYTE 070,040,011,140,150,350,006,000,000,000,020,260,000,054,344,010 ; BlockB
.BYTE 100,040,011,337,147,350,010,000,000,000,015,260,000,044,340,010 ; BlockB
.BYTE 110,040,011,136,147,350,010,000,000,000,015,260,000,044,350,010 ; BlockB
.BYTE 022,066,011,147,151,150,032,000,000,010,015,334,000,022,066,011 ; Barrel Zone 18
.BYTE 062,146,011,151,144,150,032,000,000,010,015,334,000,062,146,011 ; Barrel Zone 18
.BYTE 060,124,011,247,145,100,005,006,001,010,020,156,006,060,124,011 ; Star? Zone 18
.BYTE 026,124,011,112,147,100,005,002,001,014,020,156,002,026,124,011 ; Star? Zone 18
.BYTE 060,340,011,371,134,140,012,000,000,000,015,334,000,060,340,011 ; Block?
.BYTE 020,040,012,005,133,140,012,000,000,000,015,334,000,020,040,012 ; Block?
.BYTE 010,050,012,007,133,140,012,000,000,000,015,334,000,010,050,012 ; Block?
.BYTE 050,360,011,174,134,100,005,002,001,000,020,156,002,050,360,011 ; Star? Zone 17
.BYTE 042,376,011,376,133,100,005,002,001,010,020,156,002,042,376,011 ; Star? Zone 17
.BYTE 034,014,012,201,133,100,005,002,001,000,020,156,002,034,014,012 ; Star? Zone 17
.BYTE 044,264,012,225,120,140,012,000,000,000,015,334,000,044,264,012 ; Block? Zone 16
.BYTE 034,274,012,227,120,140,012,000,000,000,015,334,000,034,274,012 ; Block? Zone 16
.BYTE 054,274,012,225,117,140,012,000,000,000,015,334,000,054,274,012 ; Block? Zone 16
.BYTE 044,304,012,227,117,140,012,000,000,000,015,334,000,044,304,012 ; Block? Zone 16
.BYTE 044,274,012,026,120,170,023,006,002,000,022,102,006,044,274,012 ; Ufo?
.BYTE 000,040,013,047,114,340,006,000,000,000,021,204,000,020,060,013 ; Pawn?
.BYTE 010,050,013,047,113,340,006,000,000,000,020,204,000,070,060,013
.BYTE 020,060,013,047,112,340,026,000,000,000,015,204,000,000,040,013 ; Flat blocker Zone 15
.BYTE 110,040,013,236,107,340,026,000,000,000,015,204,000,110,040,013 ; Flat blocker Zone 15
.BYTE 100,050,013,240,107,340,026,000,000,000,015,204,000,100,050,013 ; Flat blocker Zone 15
.BYTE 070,060,013,242,107,340,026,000,000,000,015,204,000,010,050,013 ; Flat blocker Zone 15
.BYTE 010,240,013,266,103,170,023,004,001,000,023,102,002,030,366,013 ; Ufo? Zone 14
.BYTE 030,240,013,264,102,170,023,004,002,000,023,102,004,050,366,013 ; Ufo? Zone 14
.BYTE 060,240,013,061,101,170,023,004,001,000,023,102,006,070,366,013 ; Ufo? Zone 14
.BYTE 100,240,013,057,100,170,023,004,002,000,023,102,002,020,020,014 ; Ufo? Zone 14
.BYTE 020,320,013,073,100,170,023,004,002,000,023,102,000,040,020,014 ; Ufo? Zone 14
.BYTE 010,340,013,276,077,170,023,004,002,000,023,102,006,060,020,014 ; Ufo? Zone 14
.BYTE 070,320,013,266,075,170,027,004,000,000,015,102,000,020,330,013 ; Glass?
.BYTE 100,340,013,067,074,170,027,004,000,000,015,102,000,060,320,013 ; Glass?
L8200: .BYTE 030,050,014,105,072,340,027,000,000,000,015,204,000,030,050,014 ; Glass?
.BYTE 060,050,014,302,070,340,027,000,000,000,015,204,000,060,050,014 ; Glass?
.BYTE 040,050,014,304,071,350,027,000,000,000,015,260,000,004,374,013 ; BlockB
.BYTE 050,050,014,103,071,350,027,000,000,000,015,260,000,104,014,014 ; BlockB
.BYTE 050,336,016,071,016,140,012,000,000,014,015,334,000,050,336,016 ; Block?
.BYTE 036,352,016,034,016,140,012,000,000,010,015,334,000,036,352,016 ; Block?
.BYTE 006,350,016,277,017,140,012,000,000,004,015,334,000,006,350,016 ; Block?
.BYTE 064,344,016,031,015,140,012,000,000,000,015,334,000,064,344,016 ; Block?
.BYTE 104,360,016,130,013,140,012,000,000,010,015,334,000,104,360,016 ; Block?
.BYTE 020,350,016,036,017,140,012,000,000,000,015,334,000,020,350,016 ; Block?
.BYTE 102,152,017,350,003,150,003,000,002,000,020,334,004,040,072,021 ; Barrel
.BYTE 062,156,017,252,004,150,032,000,000,010,015,334,000,062,156,017 ; Barrel
.BYTE 072,202,017,354,002,150,032,000,000,000,015,334,000,072,202,017 ; Barrel
.BYTE 072,220,017,015,002,150,032,000,000,014,015,334,000,072,220,017 ; Barrel
.BYTE 070,014,020,175,372,100,005,006,001,010,020,156,006,070,014,020 ; Star?
.BYTE 070,034,020,177,371,100,005,006,001,010,020,156,006,070,034,020 ; Star?
.BYTE 020,054,020,006,373,100,005,002,001,010,020,156,002,020,054,020 ; Star?
.BYTE 020,074,020,010,372,100,005,002,001,010,020,156,002,020,074,020 ; Star?
.BYTE 004,220,014,024,065,150,032,000,000,010,015,334,000,004,210,014 ; Barrel Zone 9?
.BYTE 014,316,014,273,060,150,032,000,000,004,015,334,000,016,316,014 ; Barrel Zone 9?
.BYTE 010,332,014,075,060,150,032,000,000,004,015,334,000,022,332,014 ; Barrel Zone 9?
.BYTE 044,160,015,054,045,100,005,006,001,010,020,156,006,044,160,015 ; Star?
.BYTE 054,150,015,052,045,100,005,005,001,010,020,156,005,054,150,015 ; Star?
.BYTE 034,150,015,054,046,100,005,003,001,010,020,156,003,034,150,015 ; Star?
.BYTE 000,172,016,362,026,070,004,001,001,004,020,130,001,000,172,016 ; Frog?
.BYTE 110,172,016,151,022,070,004,007,001,004,022,130,007,110,172,016 ; Frog?
.BYTE 032,230,016,162,023,050,002,004,002,014,022,054,004,032,230,016 ; Pawn?
.BYTE 056,230,016,060,022,050,002,004,002,004,022,054,004,056,230,016 ; Pawn?
.BYTE 022,242,016,125,023,060,003,004,001,000,020,102,004,022,242,016
.BYTE 072,242,016,320,020,060,003,004,001,000,020,102,004,072,242,016
.BYTE 050,334,020,231,356,140,012,000,000,010,015,334,000,050,334,020 ; Block?
.BYTE 040,344,020,233,356,140,005,000,001,010,020,334,005,040,344,020
L8400: .BYTE 030,354,020,235,356,140,012,000,000,010,015,334,000,030,354,020 ; Block?
.BYTE 040,364,020,235,355,140,012,000,000,010,015,334,000,040,364,020 ; Block?
.BYTE 050,354,020,233,355,140,005,000,001,010,020,334,001,050,354,020
.BYTE 060,344,020,231,355,140,012,000,000,010,015,334,000,060,344,020 ; Block?
.BYTE 050,344,020,032,356,050,002,000,002,010,021,054,000,050,344,020 ; Pawn? Zone 7?
.BYTE 040,354,020,034,356,050,002,000,002,010,021,054,000,040,354,020 ; Pawn? Zone 7?
.BYTE 044,112,023,107,310,170,023,004,002,014,023,102,004,044,112,023 ; Ufo?
.BYTE 020,160,023,057,307,170,023,004,002,000,023,102,004,020,160,023 ; Ufo?
.BYTE 010,206,023,122,306,170,023,004,002,014,023,102,004,010,206,023 ; Ufo?
.BYTE 070,160,023,252,304,170,023,004,002,000,023,102,004,070,160,023 ; Ufo?
.BYTE 100,206,023,313,302,170,023,004,002,014,023,102,004,100,206,023 ; Ufo?
.BYTE 010,000,023,242,316,110,006,000,000,000,017,204,000,010,000,023 ; Star?
.BYTE 020,010,023,242,315,110,006,000,000,000,020,204,000,020,010,023 ; Fire?
.BYTE 070,010,023,035,313,110,006,000,000,000,022,204,000,070,010,023 ; Fire?
.BYTE 100,000,023,033,313,110,006,000,000,000,020,204,000,100,000,023 ; Fire?
.BYTE 000,330,021,176,341,340,006,000,000,000,021,204,000,000,330,021 ; Pawn?
.BYTE 030,300,021,170,341,340,026,000,000,000,015,204,000,030,300,021 ; Flat blocker
.BYTE 030,310,021,371,340,340,026,000,000,000,015,204,000,030,310,021 ; Flat blocker
.BYTE 020,310,021,172,341,340,026,000,000,000,015,204,000,020,310,021 ; Flat blocker
.BYTE 110,330,021,365,334,340,006,000,000,000,020,204,000,110,330,021
.BYTE 060,300,021,365,337,340,026,000,000,000,015,204,000,060,300,021 ; Flat blocker
.BYTE 060,310,021,166,337,340,026,000,000,000,015,204,000,060,310,021 ; Flat blocker
.BYTE 070,310,021,365,336,340,026,000,000,000,015,204,000,070,310,021 ; Flat blocker
.BYTE 020,350,021,176,337,340,026,000,000,000,015,204,000,020,350,021 ; Flat blocker
.BYTE 030,350,021,375,336,340,026,000,000,000,015,204,000,030,350,021 ; Flat blocker
.BYTE 030,360,021,176,336,340,026,000,000,000,015,204,000,030,360,021 ; Flat blocker
.BYTE 060,350,021,172,335,340,026,000,000,000,015,204,000,060,350,021 ; Flat blocker
.BYTE 070,350,021,371,334,340,026,000,000,000,015,204,000,070,350,021 ; Flat blocker
.BYTE 060,360,021,373,334,340,026,000,000,000,015,204,000,060,360,021 ; Flat blocker Zone 5?
.BYTE 024,110,022,111,331,120,007,000,000,010,015,232,000,020,110,022 ; Glass? Zone 5?
.BYTE 064,110,022,105,327,120,007,000,000,010,015,232,000,074,110,022 ; Glass? Zone 5?
.BYTE 044,110,022,107,330,100,005,002,002,010,020,156,002,044,110,022 ; Star Zone 5?
L8600: .BYTE 040,130,021,152,347,060,003,004,002,000,022,102,004,040,130,021 ; Fire?
.BYTE 060,250,021,162,341,060,003,000,002,000,021,102,000,060,250,021 ; Pawn?
.BYTE 030,220,021,162,344,070,004,001,002,000,020,130,001,030,220,021 ; Frog?
.BYTE 070,170,021,353,343,070,004,000,002,000,022,130,000,070,170,021 ; Frog?
.BYTE 072,336,024,327,255,150,032,000,000,010,015,334,000,072,336,024 ; Barrel
.BYTE 074,360,024,231,254,150,032,000,000,010,015,334,000,074,360,024 ; Barrel
.BYTE 050,374,024,035,255,150,032,000,000,010,015,334,000,050,374,024 ; Barrel
.BYTE 376,000,000,000,000,000,032,000,000,000,015,000,000,002,120,023 ; Barrel?
.BYTE 376,000,000,000,000,000,005,000,001,000,020,000,001,070,050,024
.BYTE 376,000,000,000,000,000,005,000,001,000,020,000,003,050,066,024
.BYTE 376,000,000,000,000,000,005,000,001,000,020,000,002,040,100,024
.BYTE 376,000,000,000,000,000,005,000,001,000,020,000,005,030,132,024
.BYTE 376,000,000,000,000,000,005,000,001,000,020,000,007,074,136,024
.BYTE 376,000,000,000,000,000,005,000,001,000,020,000,002,110,116,024
.BYTE 376,000,000,000,000,000,023,000,002,000,023,000,004,044,132,025
.BYTE 376,000,000,000,000,000,023,000,002,000,023,000,004,010,144,025
.BYTE 376,000,000,000,000,000,023,000,002,000,023,000,004,030,144,025
.BYTE 376,000,000,000,000,000,023,000,002,000,023,000,004,060,144,025
.BYTE 376,000,000,000,000,000,023,000,002,000,023,000,004,100,144,025
.BYTE 376,000,000,000,000,000,032,000,000,000,015,000,000,074,314,023 ; Barrel
.BYTE 376,000,000,000,000,000,002,000,001,000,022,000,006,044,010,005 ; Fire?
.BYTE 376,000,000,000,000,000,002,000,001,000,022,000,002,044,056,005 ; Fire?
.BYTE 376,000,000,000,000,000,006,000,000,000,020,000,000,010,170,006
.BYTE 376,000,000,000,000,000,006,000,000,000,021,000,000,110,250,006 ; Pawn?
.BYTE 376,000,000,000,000,000,010,000,000,000,015,000,000,020,170,006
.BYTE 376,000,000,000,000,000,004,000,002,000,020,000,000,020,350,017
.BYTE 376,000,000,000,000,000,004,000,002,000,017,000,000,046,350,017 ; Star?
.BYTE 376,000,000,000,000,000,004,000,002,000,022,000,003,100,350,017 ; Fire?
.BYTE 376,000,000,000,000,000,002,000,002,000,022,000,004,000,310,022 ; Fire?
.BYTE 376,000,000,000,000,000,002,000,002,000,022,000,004,000,270,022 ; Fire?
.BYTE 376,000,000,000,000,000,002,000,002,000,022,000,004,000,250,022 ; Fire?
.BYTE 376,000,000,000,000,000,002,000,002,000,022,000,004,110,310,022 ; Fire?
L8800: .BYTE 376,000,000,000,000,000,002,000,002,000,022,000,004,110,270,022 ; Fire?
.BYTE 376,000,000,000,000,000,002,000,002,000,022,000,004,110,250,022 ; Fire?
.BYTE 376,000,000,000,000,000,010,000,000,000,015,000,000,000,000,016
.BYTE 376,000,000,000,000,000,010,000,000,000,015,000,000,010,000,016
.BYTE 376,000,000,000,000,000,010,000,000,000,015,000,000,100,070,016
.BYTE 376,000,000,000,000,000,010,000,000,000,015,000,000,110,070,016
.BYTE 376,070,006,000,000,340,026,000,000,000,015,204,000,100,210,014 ; Flat blocker
.BYTE 376,300,006,000,000,340,026,000,000,000,015,204,000,010,230,014 ; Flat blocker
.BYTE 376,250,006,000,000,340,026,000,000,000,015,204,000,000,240,014 ; Flat blocker
.BYTE 376,240,006,000,000,340,026,000,000,000,015,204,000,020,300,014 ; Flat blocker
.BYTE 376,170,006,000,000,340,026,000,000,000,015,204,000,010,340,014 ; Flat blocker
.BYTE 376,130,006,000,000,340,026,000,000,000,015,204,000,110,350,014 ; Flat blocker
.BYTE 376,150,006,000,000,340,026,000,000,000,015,204,000,060,310,014 ; Flat blocker
.BYTE 376,100,006,000,000,340,026,000,000,000,015,204,000,070,260,014 ; Flat blocker
.BYTE 006,036,026,106,235,370,006,000,000,000,021,232,000,006,202,025 ; Pawn?
.BYTE 025,036,026,144,234,370,006,000,000,000,017,232,000,025,203,025 ; Star?
.BYTE 044,036,026,142,233,370,006,000,000,004,022,232,000,044,172,025 ; Fire?
.BYTE 063,036,026,200,232,370,006,000,000,004,020,232,000,063,203,025
.BYTE 102,036,026,176,231,370,006,000,000,010,021,232,000,102,202,025 ; Pawn?
.BYTE 050,214,025,057,244,050,025,002,001,010,022,156,002,050,214,025 ; Pawn? Zone 0?
.BYTE 006,202,025,362,246,110,031,000,000,010,015,204,000,006,202,025 ; Fire? Zone 0?
.BYTE 025,203,025,360,245,110,031,000,000,014,015,204,000,025,203,025 ; Fire? Zone 0?
.BYTE 044,202,025,016,245,110,031,000,000,014,015,204,000,044,202,025 ; Fire? Zone 0?
.BYTE 063,203,025,015,244,110,031,000,000,000,015,204,000,063,203,025 ; Fire? Zone 0?
.BYTE 102,202,025,053,243,110,031,000,000,000,015,204,000,102,202,025 ; Fire? Zone 0?
.BYTE 050,374,025,075,235,050,025,006,001,010,022,156,006,050,374,025 ; Pawn? Zone 0?
.BYTE 006,230,000,365,362,370,031,000,000,004,015,232,000,006,230,000
.BYTE 022,230,000,063,362,370,031,000,000,014,015,232,000,022,230,000
.BYTE 036,230,000,162,361,370,031,000,000,004,015,232,000,036,230,000
.BYTE 052,230,000,260,360,370,031,000,000,014,015,232,000,052,230,000
.BYTE 066,230,000,357,357,370,031,000,000,004,015,232,000,066,230,000
.BYTE 102,230,000,055,357,370,031,000,000,014,015,232,000,102,230,000
; Objects table, 9. fixed records, 16. bytes each record
; $0E,+$0F -- address of the object record in $7B00 table
; $00 $01 $02 $03 $04 $05 $06 $07 $08 $09 $0A $0B $0C $0D $0E $0F
L8A00: .BYTE 034,250,003,364,300,000,000,005,000,010,016,000,000,044,260,000 ; Main Vorton
L8A10: .BYTE 044,230,003,161,301,160,020,000,001,010,015,000,000,030,130,000 ; 1st Auto-Vorton
L8A20: .BYTE 044,240,003,362,300,160,020,000,001,010,015,000,000,060,144,000 ; 2nd
L8A30: .BYTE 044,250,003,163,300,160,020,000,001,010,015,000,000,030,160,000 ; 3rd
L8A40: .BYTE 044,260,003,364,277,160,020,000,001,010,015,000,000,060,174,000 ; 4th
L8A50: .BYTE 044,270,003,165,277,020,011,000,000,010,015,306,000,044,300,000 ; Lasertron
L8A60: .BYTE 376,171,002,115,323,030,001,000,004,014,021,026,000,376,260,000
.BYTE 376,316,003,134,300,030,001,000,004,014,022,026,000,376,260,000
.BYTE 376,322,003,035,300,030,001,000,004,004,021,026,000,376,260,000
; Objects table, 44. dynamic records, 16. bytes each
; $0E,+$0F -- address of the object record in $7B00 table
L8A90: .BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
L8AC0: .BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
L8AD0: .BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
L8AF0: .BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377
; List of objects to draw, order from far to nearest by Z-coord
; 1st word -- ?? (000 = end of table) -- NOTE: byte replaced with word here
; 2nd word -- address in $8A00 table
L8D52: .WORD 000, 0
.WORD 000, 0
.WORD 000, 0
.WORD 000, 0
.WORD 000, 0
.WORD 000, 0
.WORD 000, 0
.WORD 000, 0
L8D6A: .WORD 000, 0
.WORD 000, 0
.WORD 000, 0
.WORD 000, 0
.WORD 000, 0
; .WORD 000
; .BYTE 377,377,377,377,377,377
; .BYTE 377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377
.BYTE 377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,000
.EVEN
; Table used in object movement procedure, 8 bytes each record
; +$00 -- ??
; +$01,+$02 -- object position change
; +$03 -- horz offset change
; +$06,+$07 -- offset change
; $00 $01 $02 $03 $04 $05 $06 $07 $00 $01 $02 $03 $04 $05 $06 $07
L8E00: .BYTE 000,002,000,004,340,377,341,377, 377,001,000,004,000,000,001,000
.BYTE 376,000,000,004,040,000,041,000, 377,377,377,000,040,000,040,000
.BYTE 000,376,377,374,040,000,037,000, 001,377,377,374,000,000,377,377
.BYTE 002,000,000,374,340,377,337,377, 001,001,000,000,340,377,340,377
.BYTE 000,004,000,010,300,377,301,377, 376,002,000,010,000,000,001,000
.BYTE 374,000,000,010,100,000,101,000, 376,376,377,000,100,000,100,000
.BYTE 000,374,377,370,100,000,077,000, 002,376,377,370,000,000,377,377
.BYTE 004,000,000,370,300,377,277,377, 002,002,000,000,300,377,300,377
.BYTE 000,006,000,014,240,377,241,377, 375,003,000,014,000,000,001,000
.BYTE 372,000,000,014,140,000,141,000, 375,375,377,000,140,000,140,000
.BYTE 000,372,377,364,140,000,137,000, 003,375,377,364,000,000,377,377
.BYTE 006,000,000,364,240,377,237,377, 003,003,000,000,240,377,240,377
.BYTE 000,010,000,000,201,377,201,377, 374,004,000,000,001,000,001,000
.BYTE 370,000,000,000,201,000,201,000, 374,374,377,000,200,000,200,000
.BYTE 000,370,377,000,177,000,177,000, 004,374,377,000,377,377,377,377
.BYTE 010,000,000,000,177,377,177,377, 004,004,000,000,200,377,200,377
;------------------------------------------------------------------------------
; Variables
; NOTE: Часть переменных находится из кода как ($8F00 + смещение), поэтому важно смещение от начала области переменных
L8F00: .BYTE 001 ; Zone number?
.BYTE 0 ; Filler
L8F01: .WORD L8A00 ; Object table address, 16 bytes per record; first record is currently active Vorton
L8F03: .WORD 5352 ; Current zone offset, used to draw sprites
L8F05: .WORD 0 ; Current zone low pos = base pos - 128.
L8F07: .WORD 260 ; Current zone high pos
L8F09: .WORD 200 ; Current zone base pos = high pos - 48.
.BYTE 0 ; Filler
L8F0D: .BYTE 0 ; +015 Default sprite phase
L8F0E: .BYTE 0 ; +016 Main Vorton sprite phase
L8F0F: .BYTE 0 ; +017 Star sprite phase
L8F10: .BLKB 3. ; +020, +021, +022 -- sprite phases
L8F13: .BYTE 0 ; +023 Ufo sprite phase
L8F14: .BYTE 0 ; Current action in animation mode (see A34D routine)
L8F15: .BYTE 0
L8F16: .BYTE 0 ; Counter for Lasertron movement indicator
L8F17: .BYTE 0 ; Current vorton indicator offset
L8F18: .BYTE 3 ; Current Power indicator offset
L8F19: .BYTE 40 ; Mission Time high counter
L8F0B: .WORD 0 ; Address in 8D52 table; NOTE: Moved here for proper alignment of other fields
L8F1A: .WORD 2000 ; Mission Time low counter
L8F1C: .BYTE 1 ; Zone number? $01..$1F
L8F1D: .BLKB 5.
L8F22: .BYTE 0
L8F23: .BYTE 0
; Initial values for the Variables block
L8F25:
.BYTE 001
.BYTE 0 ; Filler
.WORD L8A00
.WORD 5352
.WORD 0
.WORD 260
.WORD 200
.BYTE 0 ; Filler
.BYTE 000,000,000, 004,000,004,000
.BYTE 0
.BYTE 0
.BYTE 0
.BYTE 0
.BYTE 3
.BYTE 40
.WORD 0
.WORD 2000
.BYTE 001
.BYTE 000,000,000,000,000
.BYTE 000
L8F48: .BYTE 0
L8F4A: .BYTE 000,000, 030,026, 050,054, 060,102, 070,130, 100,156, 110,204, 120,232
.BYTE 130,260, 020,306, 140,334, 160,000, 040,026, 170,054, 170,102, 070,130
.BYTE 050,156, 340,204, 370,232, 350,260, 360,306, 150,334, 303,160, 242,303
.BYTE 147,243, 303,321, 231,303, 046,232, 303,160, 232,303, 063,231
L8F88: .BYTE 000,000
.EVEN
L8FF0: .BYTE 001,000, 001,004, 001,002, 001,006, 003,000, 003,004, 000,002, 000,006
; Continuation points, see 9E6C
L9000: .WORD L9ED7,L9FDF,L9F20,L9F20,L9F20,L9F20,L9F20,L9ED7 ; 000
.WORD L9ED7,L9E6D,L9EBF,L9FEF,L9F02,L9F54,L9F54,L9F54 ; 020
.WORD L9FEF,L9F02,LA001,L9F7D,L9F02,L9EBB,L9FB5,L9F06 ; 040
.WORD LA008,LA008,LA008,LA008,LA008,LA008,LA008,LA008 ; 060
.WORD LA008,L9FB5,L9F06,LA014,LA014,LA014,LA014,L9F02 ; 100
.WORD LA014,LA014,LA014,LA014,L9FB5,L9F06,LA020,LA020 ; 120
.WORD LA020,LA020,LA020,LA020,LA020,LA020,LA020,L9FB5 ; 140
.WORD L9FDF,LA02C,LA02C,LA02C,LA02C,L9F02,LA02C,LA02C ; 160
.WORD LA02C,LA02C,L9E12,L9E12,L9E12,L9E12,L9E12,L9E12 ; 200
.WORD L9E12,L9E12,L9E12,L9E12,L9E12,L9E12,L9E12,L9E12 ; 220
.WORD L9E12,L9E12,L9E12,L9E12,L9E12,L9E12,L9E12,L9E12 ; 240
.WORD L9E12,L9E12,L9E12,L9E12,L9E12,L9E12,L9E12,L9E12 ; 260
.WORD L9E12,L9E12,L9E12,L9E12,L9F02,L9E12,L9E12,L9E12 ; 300
.WORD L9E12,L9F02,L9E12,L9E12,L9F02,L9E12,L9E12,L9F02 ; 320
.WORD L9E12,L9E12,L9E12,L9E12,L9E12,L9E12,L9E12,L9E12 ; 340
.WORD L9E8E
;------------------------------------------------------------------------------
L8F89: .BYTE 000
.EVEN
; Routine: ?? work on table $7B00
L8F8A:
MOV #L7B00, R4 ; 8F8A LD IX,$7B00 global objects table
MOVB L8F89, R0 ; 8F8E LD A,($8F89)
; 8F91 AND A
BNE L8F93 ; 8F92 RET Z
RETURN
L8F93: DEC R0 ; 8F93 DEC A
MOVB R0, L8F89 ; 8F94 LD ($8F89),A
L8F97: MOVB 6(R4), R0 ; 8F97 LD A,(IX+$06) get movement pattern
BIC #177420, R0 ; 8F9A RES 4,A
CMP R0, #5 ; 8F9C CP $05
BHIS L8FA3 ; 8F9E JR NC,$8FA3
DECB 10(R4) ; 8FA0 DEC (IX+$08) alter movement
L8FA3: ; 8FA3 LD DE,$0010
ADD #16., R4 ; 8FA6 ADD IX,DE next record
CMP R4, #L8A00 ; 8FA8 LD A,IXh
; 8FAA CP $8A
BLO L8F97 ; 8FAC JR C,$8F97
BR L8F8A ; 8FAE JR $8F8A repeat
; Routine: GAME MODE
L90F2: CLR LKEY
CALL LA450 ; 90F2 CALL $A450 check score
MOV #<LA480+1>, R3 ; 90F5 LD HL,$A481 Score
MOV #6, R1 ; 90F8 LD B,$06 counter = 6
L90FA: CLRB (R3) ; 90FA LD (HL),$00 < clear score digit
INC R3 ; 90FC INC HL |
SOB R1, L90FA ; 90FD DJNZ $90FA repeat
MOVB #1, (R3) ; 90FF LD (HL),$01
CALL LA42B ; 9101 CALL $A42B print score
CALL L8F8A ; 9104 CALL $8F8A ?? work on table $7B00
L9107: CALL LA291 ; 9107 CALL $A291 Prepare tables and show the starting animation
L910A: ; 910A LD A,$FD
; 910C IN A,($FE)
CMP LKEY, #003 ;^C ; 910E AND $11 Check for abort key
BNE L911F ; 9110 JP NZ,$911F
MOV #L9232, R3 ; 9113 LD HL,$9232 "MISSION ABORTED"
; 9116 LD A,$01
MOVB #1, L8F23 ; 9118 LD ($8F23),A
L911B: CALL LB890 ; 911B CALL $B890 Print text
MOV #14., R1 ; pause counter
1$: PUSH R1
CALL GETKEY ; Swallow any keys pressed
CALL PAUSE ; wait a bit
POP R1
SOB R1, 1$
; MOV #LB839, R3 ; "PRESS ANY KEY"
; CALL LB890
RETURN ; 911E RET Exit GAME MODE
L911F: ; 911F LD A,$BF
; 9121 IN A,($FE)
CMP LKEY, #020 ;^P ; 9123 BIT 4,A Check for pause key
BNE L9163 ; 9125 JR NZ,$9163
MOV #L92A0, R3 ; 9127 LD HL,$92A0 "PAUSE MODE"
CALL LB890 ; 912A CALL $B890 Print text
CALL WTKEY ; Wait for any key pressed
; Clear the "PAUSE MODE" sign
MOV #176640, R2 ; Адрес порта адреса косвенной записи УКНЦ
MOV #133416, (R2) ; set screen address
MOV #1200, R1 ; 8 lines on the screen
1$: CLR @#176642 ; clear
INC (R2) ; next screen address
SOB R1, 1$
L9163: CALL L9822 ; 9163 CALL $9822 Remove objects from the shadow screen
CALL LA03B ; 9166 CALL $A03B Objects logic
CALL L9C7B ; 9169 CALL $9C7B Process object movement
CALL L985A ; 916C CALL $985A Prepare table 8D52 (sort out objects by depth), and draw the objects
CALL L9A9B ; 916F CALL $9A9B Draw the shadow screen on the real screen, using draw markers
MOVB L8F00, R0 ; 9172 LD A,($8F00) Zone number
CMPB R0, #30. ; 9175 CP $1E zone 30.?
BLO L918C ; 9177 JP C,$918C less => jump
; Zone >= 30.
MOV #<L8A50+1>, R3 ; 917A LD HL,$8A51 Lasertron object + $01
CLR R2 ; 917D LD E,(HL)
BISB (R3)+, R2 ; 917E INC L
SWAB R2
BISB (R3), R2 ; 917F LD D,(HL)
SWAB R2
; 9180 LD HL,$156C
MOV R2, R3 ; 9183 EX DE,HL
; 9184 AND A
SUB #5484., R3 ; 9185 SBC HL,DE ???
MOV R3, R0 ; 9187 LD A,H
SWAB R0
BIC #177400, R0 ; 9188 AND A
BNE L918C ; 9189 JP Z,$A617 => Animation in Zone 30.
JMP LA617
L918C: MOV L8F1A, R3 ; 918C LD HL,($8F1A) get Mission Time low counter
DEC R3 ; 918F DEC HL time's ticking
; 9190 LD A,L
; 9191 OR H
; 9192 AND A time's out?
BNE L91C3 ; 9193 JR NZ,$91C3 no => jump
; Show Mission Time change
MOVB L8F19, R0 ; 9195 LD A,($8F19) get high counter
;NOTE: Block 9198..919E removed, not needed
DECB R0 ; 91A1 DEC A
MOVB R0, L8F19 ; 91A2 LD ($8F19),A
MOV R0, R2 ; 91A5 XOR A
ASH #-3, R2 ; Divide by 8.
ADD #141127, R2 ; Screen address Mission Time
BIC #177770, R0
MOV R0, R4
SUB #7, R4
MOV #377, R0
ASH R4, R0 ; shift right by 0..7 bits
BIC #177421, R0
SWAB R0
MOV #7, R1 ; 91A6 LD B,$07 7 lines
MOV R2, @#176640
L91A8: MOV R0, @#176642 ; 91A8 LD (HL),A
ADD #80., @#176640 ; 91A9 INC H next line
SOB R1, L91A8 ; 91AA DJNZ $91A8
; 91AC LD A,L
MOVB L8F19, R0 ; 91AD CP $D4
BNE L91C0 ; 91AF JP NC,$91C0
; Mission Time is out
MOV #L9247, R3 ; 91B2 LD HL,$9247 "TOO LATE MISSION TERMINATED"
JMP L911B ; 91B5 JP $911B Print text and Exit
;
;NOTE: Block 91B8..91BE removed, not needed
L91C0: MOV #2000, R3 ; 91C0 LD HL,$0DAC reset Mission Time low counter
L91C3: MOV R3, L8F1A ; 91C3 LD ($8F1A),HL save the counter
L91C6: ; 91C6 LD A,R
; 91C8 SLL A
MOV L8F01, R3 ; 91CA LD HL,($8F01) get object table address
CLR R1 ; 91CD LD A,($8F17)
BISB L8F17, R1 ; 91D0 LD C,A
; 91D1 JR NC,$91C6 delay
MOVB (R3), R0 ; 91D3 LD A,(HL)
CMPB R0, #376 ; 91D4 CP $FE dead Vorton?
BHIS L91D9 ; 91D6 JP C,$910A no => continue main loop
JMP L910A
L91D9: MOV #16., R2 ; 91D9 LD DE,$0010
L91DC: ADD R2, R3 ; 91DC ADD HL,DE next record
INCB R1 ; 91DD INC C
INCB R1 ; 91DE INC C next Vorton indicator
; 91DF LD A,L
CMP R3, #L8A50 ; 91E0 CP $50 Are we out of Vortons?
BLO L91EB ; 91E2 JP C,$91EB
; Sorry, all Vortons are dead, game over
MOV #L926F, R3 ; 91E5 LD HL,$926F "GAME OVER ALL VORTONS DESTROYED"
JMP L911B ; 91E8 JP $911B Print text and Exit
L91EB: MOVB (R3), R0 ; 91EB LD A,(HL)
CMPB R0, #376 ; 91EC CP $FE skip?
BHIS L91D9 ; 91EE JP NC,$91D9 yes => jump
MOV R3, L8F01 ; 91F1 LD ($8F01),HL set object table address to next Vorton
MOV #10, R2 ; 91F4 LD DE,$0008
ADD R2, R3 ; 91F7 ADD HL,DE to movement flags
BITB #128., (R3) ; 91F8 BIT 7,(HL) explosion?
BNE L91DC ; 91FA JP NZ,$91DC yes => jump
; HL points to (+$08) of Auto-Vorton to convert into Main Vorton
MOV R1, R0 ; 91FD LD A,C
MOVB R0, L8F17 ; 91FE LD ($8F17),A
PUSH R3 ; 9201 PUSH HL
; Put white hat on the new Main Vorton indicator
MOV #137072, R2 ; screen address
MOV #<L6020+546>, R3 ; Addr in the indicator panel sprite
ADD R1, R2
MOV #4., R1 ; 4 lines
1$: MOV R2, @#176640 ; set screen address
CLR R0
BISB (R3), R0
SWAB R0
BISB (R3)+, R0
MOV R0, @#176642
INC @#176640
CLR R0
BISB (R3), R0
SWAB R0
BISB (R3), R0
MOV R0, @#176642
ADD #80., R2 ; next line
ADD #<32.-1>, R3
SOB R1, 1$ ; continue the loop
POP R3 ; 921B POP HL HL points to (+$08)
DEC R3 ; 921C DEC L
DEC R3 ; 921D DEC L HL points to (+$06)
BICB #20, (R3) ; 921E RES 4,(HL)
DEC R3 ; 9220 DEC L HL points to (+$05)
CLRB (R3) ; 9221 LD (HL),$00 set base sprite number = Main Vorton
; 9223 LD DE,$0005
ADD #5, R3 ; 9226 ADD HL,DE HL points to (+$0A)
MOVB #14., (R3) ; 9227 LD (HL),$0E set sprite number offset
; Reset the scene to continue with the new Main Vorton
CALL L92CE ; 9229 CALL $92CE Prepare objects for the current Zone
CALL L95EF ; 922C CALL $95EF Show the screen
JMP L910A ; 922F JP $910A continue main loop
L9232: .WORD 105505
.BYTE 131,212,135,131,143,143,131,137,136,115,121,122,137,142,144,125,124,212,376,000 ; "MISSION ABORTED"
.EVEN
L9247: .WORD 115116
.BYTE 130,212,115,144,137,137,115,134,121,144,125,115,212,377 ; "TOO LATE"
.WORD 116312
.BYTE 131,212,135,131,143,143,131,137,136,115,144,125,142,135,131,136,121,144,125,124,212,376 ; "MISSION TERMINATED"
L926F: .WORD 113717
.BYTE 130,312,127,121,135,125,115,137,146,125,142,312,377,000 ; "GAME OVER"
.WORD 116316
.BYTE 131,212,121,134,134,115,146,137,142,144,137,136,143,212,377,000 ; "ALL VORTONS"
.WORD 117516
.BYTE 131,212,115,124,125,143,144,142,137,151,125,124,115,212,376,000 ; "DESTROYED"
L92A0: .WORD 133415
.BYTE 131,312,140,121,145,143,125,115,135,137,124,125,312,376 ; "PAUSE MODE"
.EVEN
; Routine: Prepare objects for the current Zone
L92CE: MOV #L8D52, R3 ; 92CE LD HL,$8D52 start of 8D52 table
CLR (R3) ; 92D1 LD (HL),$00 clear the table (00 = table end marker)
MOV #L8A90, R4 ; 92D3 LD IX,$8A90 current zone objects
L92D7: MOVB (R4), R0 ; 92D7 LD A,(IX+$00)
CMPB R0, #377 ; 92DA CP $FF end of table marker?
BEQ L92F5 ; 92DC JR Z,$92F5 yes => jump
MOV 16(R4), R3 ; 92DE LD L,(IX+$0E)
; 92E1 LD H,(IX+$0F) HL = address of the source record
MOV R4, R2 ; 92E4 LD E,IXl
; 92E6 LD D,IXh
; 92E8 EX DE,HL
MOV #7, R1 ; 92E9 LD BC,$000E 14. bytes
1$: MOV (R2)+, (R3)+ ; 92EC LDIR copy
SOB R1, 1$
; 92EE LD BC,$0010
ADD #16., R4 ; 92F1 ADD IX,BC next record
BR L92D7 ; 92F3 JR $92D7 repeat
L92F5:
MOV L8F01, R3 ; 92F5 LD HL,($8F01) object table address
INC R3 ; 92F8 INC HL
CLR R2 ; 92F9 LD E,(HL)
BISB (R3)+, R2 ; 92FA INC HL HL points to (+$02)
SWAB R2
BISB (R3), R2 ; 92FB LD D,(HL) DE = object position
SWAB R2
CMP R2, #260 ; 92FC LD A,D
; 92FD AND A
; 92FE JR NZ,$930A
; 9300 LD A,E
; 9301 CP $B0 DE < 176. ?
BHIS L930A ; 9303 JR NC,$930A no => jump
DEC R3 ; 9305 DEC HL HL points to (+$01)
MOV #260, R2 ; 9306 LD (HL),$B0
MOVB R2, (R3) ; 9308 LD E,A
; 9309 LD E,(HL)
L930A: MOV #1, R0 ; 930A LD A,$01 initial Zone number
MOV #260, R3 ; 930C LD HL,$00B0 initial position
MOV #3760, R4 ; 930F LD IX,$07F0 initial offset
L9313: ; 9313 EX AF,AF' save A (Zone number)
PUSH R2 ; 9314 PUSH DE
; 9315 EX DE,HL
; 9316 AND A
SUB R3, R2 ; 9317 SBC HL,DE
; 9319 EX DE,HL
CMP R2, #260 ; 931A LD A,D
; 931B AND A
; 931C JR NZ,$9323
; 931E LD A,E
; 931F CP $B0
BLO L9331 ; 9321 JR C,$9331
L9323: POP R2 ; 9323 POP DE
; 9324 LD BC,$00B0
ADD #260, R3 ; 9327 ADD HL,BC
; 9328 LD BC,$0AEA 87.*32. = offset from one zone to another
ADD #5352, R4 ; 932B ADD IX,BC
; 932D EX AF,AF' restore A (Zone number)
INC R0 ; 932E INC A next Zone
BR L9313 ; 932F JR $9313 repeat
L9331: POP R2 ; 9331 POP DE
MOV R3, L8F07 ; 9332 LD ($8F07),HL current zone high pos
; 9335 LD BC,$FFD0 -48.
SUB #48., R3 ; 9338 ADD HL,BC
MOV R3, L8F09 ; 9339 LD ($8F09),HL current zone base pos
; 933C LD BC,$FF80 -128.
SUB #128., R3 ; 933F ADD HL,BC
MOV R3, L8F05 ; 9340 LD ($8F05),HL current zone low pos
MOV R4, L8F03 ; 9343 LD ($8F03),IX current zone offset
MOV #L8F00, R3 ; 9347 LD HL,$8F00
; 934A EX AF,AF' restore A
MOVB R0, L8F1C ; 934B LD ($8F1C),A set Zone number
CMPB R0, #40 ; 934E CP $20 zone 32. ?
BLO L9359 ; 9350 JR C,$9359 less => jump
MOV #40, R0 ; 9352 LD A,$20 32.
MOVB R0, (R3) ; 9354 LD (HL),A
DEC R0 ; 9355 DEC A
BR L935A ; 9356 JP $935A
L9359: MOVB R0, (R3) ; 9359 LD (HL),A
L935A: MOV R0, R1 ; 935A LD B,A
MOV #37, R0 ; 935B LD A,$1F 31.
MOV #10., R5 ; 935D LD C,$0A
SUB R1, R0 ; 935F SUB B user-friendly zone number
CMP R0, #10. ; 9360 CP C < 10. ?
BHIS L9367 ; 9361 JR NC,$9367 no => jump
MOV #10., R1 ; 9363 LD B,C space
MOV R0, R5 ; 9364 LD C,A lower digit
BR L936F ; 9365 JR $936F
L9367: CLR R1 ; 9367 LD B,$00
L9369: INC R1 ; 9369 INC B в B набираем старшую десятичную цифру
SUB R5, R0 ; 936A SUB C -10.
CMP R0, R5 ; 936B CP C < 10. ?
BHIS L9369 ; 936C JR NC,$9369 no => jump
MOV R0, R5 ; 936E LD C,A lower digit
L936F: MOV R1, R0 ; 936F LD A,B working with upper digit
ADD R0, R0 ; 9370 ADD A,A = X*2
ADD R1, R0 ; 9371 ADD A,B = X*2+X
ADD R0, R0 ; 9372 ADD A,A = (X*2+X)*2 = X*6
MOV #L94F9, R3 ; 9373 LD HL,$94F9 адрес списка с индексами спрайтов для больших цифр
MOV R0, R2 ; 9376 LD D,$00
; 9378 LD E,A
MOV R5, R0 ; 9379 LD A,C get lower digit
ADD R0, R0 ; 937A ADD A,A = X*2
ADD R5, R0 ; 937B ADD A,C = X*2+X
ADD R0, R0 ; 937C ADD A,A = (X*2+X)*2 = X*6
PUSH R0 ; 937D EX AF,AF'
ADD R2, R3 ; 937E ADD HL,DE
MOV #L95E3, R4 ; 937F LD IX,$95E3 адрес массива адресов на экране для цифр ZONE
CALL L9394 ; 9383 CALL $9394 show first ZONE digit
MOV #L94F9, R3 ; 9386 LD HL,$94F9 адрес списка с индексами спрайтов для больших цифр
; 9389 LD D,$00
POP R0 ; 938B EX AF,AF'
; 938C LD E,A
ADD R0, R3 ; 938D ADD HL,DE
CALL L9394 ; 938E CALL $9394 show second ZONE digit
BR L93B7 ; 9391 JP $93B7
; Procedure: Draw digit with size of 16x24 pixels into the ZONE indicator
; R3 = адрес массива из 6-ти номеров спрайтов 8x8
; R4 = адрес массива из 6-ти адресов на экране
L9394:
MOV #6, R5 ; 9394 LD C,$06 нужно вывести 6. спрайтов
L9396: MOVB (R3)+, R2 ; 9396 LD E,(HL) взяли номер спрайта
PUSH R3 ; 9397 PUSH HL
; 9398 LD D,$00
MOV R2, R3 ; 939A LD HL,$953B
; 939D EX DE,HL
ASH #3, R3 ; 939E ADD HL,HL
; 939F ADD HL,HL
; 93A0 ADD HL,HL * 8.
ADD #L953B, R3 ; 93A1 ADD HL,DE получили адрес спрайта 8x8
MOV (R4)+, R2 ; 93A2 LD E,(IX+$00) address on the screen
; 93A5 LD D,$50
MOV #8., R1 ; 93A7 LD B,$08 counter = 8.
MOV R2, @#176640
L93A9: CLR R0 ; 93A9 LD A,(HL) получаем 8 пикселов спрайта
BISB (R3)+, R0
SWAB R0 ; 93AA LD (DE),A
MOV R0, @#176642 ; 93AB INC HL write into screen
ADD #80., @#176640 ; 93AC INC D next line