-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathS2CORE.MAC
5475 lines (5449 loc) · 138 KB
/
S2CORE.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 S2CORE
.ASECT
; Special comments-warnings in the code:
; !!MUT-CMD!! - the command mutable, means other code changes it
; !!MUT-ARG!! - the command argument is mutable
; !!MUT-2ndARG!! - the command 2nd argument is mutable
;------------------------------------------------------------------------------
.MACRO PUSH RR
MOV RR, -(SP)
.ENDM
.MACRO POP RR
MOV (SP)+, RR
.ENDM
.MACRO NOP1
NOP
.ENDM
.MACRO NOP2
NOP
NOP
.ENDM
.MACRO NOP3
NOP
NOP
NOP
.ENDM
;------------------------------------------------------------------------------
; Режимы для регистра управления памятью
; .___1___...00.00 Стр. Назначение
MMODE0 = ^B0001110000000000 ; 5:4 - системный
MMOD34 = ^B0011110000000000 ; 3:4 - для загрузки
MMODE1 = ^B0011100000000000 ; 3:1 - основной
MMODE5 = ^B0001100000000000 ; 5:1 - для рисования на экране
MMOD36 = ^B0011111100000000 ; 3:6 - для BCHRS+OCHRS
MMOD32 = ^B0011101000000000 ; 3:2 - для NCHRS
MMOD37 = ^B0011110100000000 ; 3:7 - для S2GCHR
; Значения регистра управления палитрами
; ST..____........
PMODEG = ^B0000111000000000 ; Экран стр.5, таймер отключен, палитра 14
;------------------------------------------------------------------------------
.=001600
; Coming here from S2BOOT code
K01000: BR K01100
;
.IIF NE <.-001602>, ERRORA
K01602: .WORD 0 ; IX
K01604: .WORD 0 ; temp variable
K01606: .WORD 0
K01607 = K01606+1
K01610: .WORD 0 ; offset value in room marker processing
K01611 = K01610+1
K01552: .BLKW 7
K01570: .BLKW 5
;
; Initialization
; Уже включен основной режим памяти MMODE1
K01100: MTPS #000340 ; Disable interrupts
MOV SP, OSTACK ; Сохраняем начальное значение SP
MOV #000004, R0
MOV #STOP, (R0)+ ; Вектор обработки клавиши СТОП
MOV #340, (R0)
CALL PREPAR ; Prepare convertion tables
; Show "PRESS ANY KEY" sign
MOV #K07336, R3 ; "PRESS ANY KEY"
MOV #13., R1
CALL PRINSP
.WORD 050351
NOP2 ;CALL L13100 ; PAWS0
; Сюда переходим по нажатию клавиши СТОП
STOP: MOV #1000, SP
MOV #1330, @#177664 ; Устанавливаем стандартное значение скролла
MOV #MMODE1, @#177716 ; Включаем основной режим памяти
;K01206: MOV #004000, <K01224+2> ; set filler
CALL K01224 ; Clear the screen
; Initialization finished, go to Menu
JMP K07326 ; OUTBF Go to Menu
;
OSTACK: .WORD 01000 ; Сохраняем начальное значение SP
;
; Procedure: Get random number
;NOTE: Пока убрал для БК
;TODO
K01314: RETURN
.BLKW 19.
;
; Procedure ?? fill screen attrs?? (the only use on TPORT)
;NOTE: Эту процедуру убрал на БК
;K01612:
;
; Procedure: EXX
K01434: PUSH R4
MOV #K01552, R4
TST (R4)
BNE K01470
MOV SP, (R4)+
MOV R1, (R4)+
MOV R2, (R4)+
MOV R3, (R4)+
MOV (R4)+, R1
MOV (R4)+, R2
MOV (R4), R3
K01464: POP R4
RETURN
K01470: ADD #000014, R4 ; + 12.
MOV R3, (R4)
MOV R2, -(R4)
MOV R1, -(R4)
MOV -(R4), R3
MOV -(R4), R2
MOV -(R4), R1
CLR -(R4)
BR K01464
;
; Процедура PRINSP - то же что и PRINT, но R2 пишем сразу после инструкции CALL
PRINSP: MOV (SP), R2 ; Адрес возврата со стека
MOV (R2), R2 ; слово после инструкции CALL
ADD #2, (SP) ; Подвинули адрес возврата дальше
;
; PRINT procedure: Print string R3, R1 = length, R2 = screen coords
K01704: PUSH R2
PUSH R4
PUSH R5
CALL K02056 ; screen coords R2 to screen address
K01716: CLR R0
BISB (R3)+, R0 ; < get symbol
ASL R0
ASL R0
ASL R0 ; *8.
ADD #<L06234-256.>, R0 ; + font base addr minus 256. for 32. symbols
PUSH R2
MOV #MMODE5, @#177716 ; Включаем режим памяти 5
PUSH R1
MOV #052525, (R2) ; Очищаем верхнюю строку
ADD #000100, R2 ; next line
MOVB #000010, R5 ; 8. lines
K01760: MOVB (R0)+, R1 ; <
ASL R1
MOV PXCONH(R1), (R2) ; | copy to screen
ADD #000100, R2 ; | next line
SOB R5, K01760 ; repeat
MOV #052525, (R2) ; Очищаем нижнюю строку
POP R1
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
POP R2
K02006: ADD #000001, R4 ;!!MUT-ARG!! shift 1. or 32.
CMPB #000040, <K02006+2> ; vertical text?
BNE K02030 ; no =>
ADD #001200, R2
BR K02032
K02030: TST (R2)+
K02032: BIT #000037, R4
BNE K02044
ADD #001100, R2
K02044: SOB R1, K01716 ; repeat
POP R5
POP R4
POP R2
RETURN
;
; Procedure: Screen coords R2 to screen address
; Screen coords word: [0 1 0 Y7 Y6 Y2 Y1 Y0 | Y5 Y4 Y3 X4 X3 X2 X1 X0]
K02056: MOV R2, R4
BIC #177740, R4 ; X = 0..31.
BIC #160037, R2 ; 1110000000011111
K02070: MOV R2, #000000 ;!!MUT-ARG!!
SWAB R2
BIC #177770, R2 ; Y2 Y1 Y0
ASL R2
ASL R2 ; R2 = [0 0 0 Y2 Y1 Y0 0 0]
K02106: BISB R2, <K02070+2> ; (K02070+2) = [Y5 Y4 Y3 Y2 Y1 Y0 0 0]
BICB #177747, <K02070+3> ; 1111111111100111 keep Y7 Y6
ASRB <K02070+3>
ASRB <K02070+3>
ASRB <K02070+3> ; (K02070+3) = [0 0 0 0 0 0 0 Y7 Y6]
MOV <K02070+2>, R2 ; R2 = [0 0 0 0 0 0 0 Y7 Y6 | Y5 Y4 Y3 Y2 Y1 Y0 0 0]
ASL R2
ASL R2 ; R2 = [0 0 0 0 0 Y7 Y6 Y5 Y4 | Y3 Y2 Y1 Y0 0 0 0 0] = Y * 16.
MOV R2, <K02070+2>
ASL R2
ASL R2 ; R2 = [0 0 0 Y7 Y6 Y5 Y4 Y3 Y2 | Y1 Y0 0 0 0 0 0 0]
ADD <K02070+2>, R2 ; (K02070+2) = Y * 16. * 5. = Y * 80.
ASL R4
ADD R4, R2
ADD #040000, R2 ; R2 = screen address
ASR R4
RETURN
.BLKW 32. ;NOTE: Free space
;
; DOPIC procedure: Show the room on the screen
K02202: MOV #K41173, R3 ; FFCOL
MOVB (R3), R5 ; get FFCOL
MOV #000004, R0
XOR R0, R5 ; XOR 4
MOVB R5, (R3)+ ; set FFCOL; R3 = FFCOL+1
CLRB (R3) ; clear (FFCOL+1)
CLR R2 ; R2 = index in all the buffers
MOV #040000, R5 ; screen start address
MOV #L24324, R4 ; BUFFD
K02272:
; LOOP1: loop by rows
K02300:
; LOOP2: loop by columns along the row
K02304: TSTB (R4)+ ; check byte in BUFFD
BNE K02322 ; drawing this tile =>
; NDRAW: proceed to the next tile
K04440: TST (R5)+ ; next column
INC R2 ; next index
BIT #31., R2 ; end of row?
BNE K02304 ; not end of row => LOOP2
ADD #001100, R5 ; next row
CMP R2, #576. ; end of buffers?
BNE K02300 ; => LOOP1
RETURN ; DOPIC finished
; Drawing the tile, start with the background
K02322: PUSH R2 ; save index
CLR R0
BISB L25424(R2), R0 ; get tile from BUFFB: Back tile screen
MOVB R0, <K04673> ; set BAKCR
ASL R0 ; *2.
MOV TMUL20(R0), R3 ; set R3 = R0 * 20.
ADD #100000, R3 ; BK ; + BCHRS addr in memory window
MOV #K04662, R2 ; PIX addr
MOV #MMOD36, @#177716 ; Подключаем страницу 6
.REPT 10.
MOV (R3)+, (R2)+
.ENDR
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
CLRB K41174 ; clear FFCOL+1
MOV (SP), R2 ; restore index
CLR R0
BISB L30724(R2), R0 ; get tile from Enemy 0 tile screen
MOV R0, R3
INCB R0
BEQ K03014 ; => GRD2
; Draw guard tile
CLRB R1
CMPB R0, #000244
K02426: BLO K02450 ; => FFCL2 (not Flamethrower)
CMPB R0, #000247 ; == 167. ?
BHIS K02450 ; => FFCL2 (not Flamethrower)
MOVB K41173, R0 ; get FFCOL: Flamethrower fire color
MOVB R0, K41174 ; set (FFCOL+1)
MOV R0, R1
; FFCL2:
K02450: BICB #177407, K04672 ; COL
BISB R1, K04672 ; COL
SWAB R3 ; *256.
ROR R3
ROR R3
ROR R3 ; *32.
ADD #100000, R3 ; BK ; + GCHRS address in memory window
TSTB 036037 ; BK ; check DIR
BEQ 10$ ; БК
ADD #6272., R3 ; BK ; + offset to mirrored tiles
10$: MOV #K04662, R2 ; PIX buffer address
MOV #MMOD37, @#177716 ; Подключаем страницу 7
.REPT 3.
TST (R3)+
BIC (R3)+, (R2)+
.ENDR
TST (R3)+
BIC (R3), (R2)+
BIC (R3)+, (R2)+ ; Duplicate previous line
.REPT 3.
TST (R3)+
BIC (R3)+, (R2)+
.ENDR
TST (R3)+
BIC (R3), (R2)+
BIC (R3)+, (R2)+ ; Duplicate previous line
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
; GRD2:
K03014: MOV (SP), R2 ; restore index
CLR R3
BISB L32024(R2), R3 ; get tile from Enemy 1 tile screen
CMP R3, #377 ; tile 255. ?
BEQ K03364 ; yes => NINJA
BICB #177407, K04672 ; COL := COL AND 248.
SWAB R3 ; *256.
ROR R3
ROR R3
ROR R3 ; *32.
ADD #100000, R3 ; BK ; + GCHRS address in memory window
TSTB K36040 ; BK ; check DIR
BEQ 10$ ; БК
ADD #6272., R3 ; BK ; + offset to mirrored tiles
10$: MOV #K04662, R2 ; PIX addr
MOV #MMOD37, @#177716 ; Подключаем страницу 7
.REPT 3.
TST (R3)+
BIC (R3)+, (R2)+
.ENDR
TST (R3)+
BIC (R3), (R2)+
BIC (R3)+, (R2)+ ; Duplicate previous line
.REPT 3.
TST (R3)+
BIC (R3)+, (R2)+
.ENDR
TST (R3)+
BIC (R3), (R2)+
BIC (R3)+, (R2)+ ; Duplicate previous line
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
; NINJA:
K03364: MOVB K03542, K41175 ; save (NJCOL+1) to TMPNC
MOV (SP), R2 ; restore index
CLR R0
BISB L27624(R2), R0 ; get tile from BUFFN: Ninja tile screen
MOV R0, R3
INCB R0
BEQ K04104 ; 0 => OBJDA
K03412: CMPB R0, #000341 ; 225.
BHIS K03462 ; => WILSN
CMPB R0, #000323 ; 221.
BLO K03462 ; => WILSN
CMPB R0, #000327 ; 215.
BLO K03442 ; => WLSN2
CMPB R0, #000333 ; 219.
BLO K03462 ; => WILSN
; WLSN2:
K03442: MOVB K04673, R0 ; get BAKCR
DECB R0
BNE K03462 ; => WILSN
MOVB #007, K03542 ; set (NJCOL+1) to 7 white
BR K03544 ; => HYPN2
; WILSN:
K03462: MOVB K04673, R0 ; get BAKCR
CMPB R0, #000117 ; == 79. ?
BLO K03516 ; => OBJD
CMPB R0, #000126 ; == 86. ?
BHIS K03516 ; => OBJD
MOVB <L14472+2>, R0 ; get (DECEN+1)
BEQ K03516 ; => OBJD
MOVB #001, K36216 ; set ELECU = 1: electroshocked
; OBJD:
K03516: MOVB K41174, R0 ; get (FFCOL+1)
BEQ K03544 ; => HYPN2
PUSH R3
MOVB #003, R1
CALL L14472 ; DECEN
POP R3
BR K03560 ; => HYPNO
; HYPN2:
K03544: BICB #177407, K04672 ; COL keep PAPER color
BISB K03542, K04672 ; set COL from (NJCOL+1)
; HYPNO:
K03560: MOVB K41175, K03542 ; restore TMPNC -> NJCOL+1
ASL R3
ASL R3
ASL R3
ASL R3 ; *16.
ADD #100000, R3 ; BK ; + NCHRS addr in memory window
TSTB K36264 ; BK ; check DIR
BEQ 10$ ; БК
ADD #3936., R3 ; BK ; + offset to mirrored tiles
10$: MOV #K04662, R2 ; PIX addr
MOV #MMOD32, @#177716 ; Подключаем страницу 2
.REPT 3.
BIC (R3)+, (R2)+
.ENDR
BIC (R3), (R2)+
BIC (R3)+, (R2)+ ; Duplicate previous line
.REPT 3.
BIC (R3)+, (R2)+
.ENDR
BIC (R3), (R2)+
BIC (R3)+, (R2) ; Duplicate previous line
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
; OBJDA:
K04104: MOV #K04672, R3 ; get COL
MOV #000020, R0 ; 16.
; COLRD:
K04114: NOP ;!!MUT-CMD!! "NOP" command or "MOVB R0,(R3)" command
MOV (SP), R2 ; restore index
MOVB L26524(R2), R0 ; get tile from Front tile screen
CLR R3
BISB R0, R3 ; get byte
INCB R0 ; == 255. ?
BEQ K04274 ; yes => DRAW
CMPB R0, #345 ; compare to 229.
BHIS K04526 ; > 229. => BUFWR: use computerized font
; Draw OCHRS tile
ASL R3 ; *2.
MOV TMUL20(R3), R3 ; *20.
ASL R3 ; *40.
ADD #112000, R3 ; + OCHRS
MOV #K04662, R2 ; PIX addr
MOV #MMOD36, @#177716 ; Подключаем страницу 6
.REPT 10.
BIC (R3)+, (R2)
BIS (R3)+, (R2)+
.ENDR
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
CMPB (R3), #377 ; == 255. ?
BEQ K04274 ; => DRAW
MOVB (R3), (R2)
; DRAW: Copy pixels from PIX to screen; R5 = address on screen
K04274: MOV #K04662, R3 ; PIX addr
MOV #MMODE5, @#177716 ; Включаем режим памяти 5
MOV (R3)+, (R5) ; #0
MOV (R3)+, 000100(R5) ; #1
MOV (R3)+, 000200(R5) ; #2
MOV (R3)+, 000300(R5) ; #3
MOV (R3)+, 000400(R5) ; #4
MOV (R3)+, 000500(R5) ; #5
MOV (R3)+, 000600(R5) ; #6
MOV (R3)+, 000700(R5) ; #7
MOV (R3)+, 001000(R5) ; #8
MOV (R3)+, 001100(R5) ; #9
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
POP R2 ; restore index
JMP K04440 ; => NDRAW
;
; BUFWR:
K04526: ASL R3
ASL R3
ASL R3 ; *8.
ADD #<L16014-1568.>, R3 ; + computerized font base address
CMPB R0, #000345 ; == 229. ?
BNE K04544 ; no => NOEL6
MOV #L16014, R3 ; CHARSET - computerized font base address
K04544: MOV #K04662, R2 ; PIX addr
CLR (R2)+
.REPT 8.
MOVB (R3)+, R0
ASL R0
MOV PXCONH(R0), R0
BIC #052525, R0 ; remove blue background
MOV R0, (R2)+
.ENDR
CLR (R2)+
BR K04274 ; => DRAW
;
K03542: .BYTE 0 ; NJCOL+1 - Ninja color 0..7
.EVEN
;
; BUFOM procedure: Draw string as tiles; R2 = string, R1 = length
K04604: MOV R1, R5
K04606: MOVB (R2)+, R0 ; <
ADD #000244, R0 ; | 228.-64.
MOVB R0, (R3)+ ; |
SOB R1, K04606 ; repeat
SUB #002200, R3 ; BUFFO-BUFFD
K04624: MOVB #001, -(R3) ; <
SOB R5, K04624 ; repeat
K04632: RETURN
;
K04662: .BLKB 24 ; PIX
;
K04672: .BYTE 2 ; COL
K04673: .BYTE 0 ; BAKCR
;
.BLKW 4. ;NOTE: Free space
;
; NERDR procedure: Update NEAR indicator
K04674: PUSH R3
TSTB R0
BNE K05032
MOV #K24762, R3
TSTB (R3)
BEQ K05032
DECB (R3)
MOV K23746, R3 ; get NERST
MOV #000005, R1 ; 5.
K04724: BICB #177600, (R3)+ ; <
SOB R1, K04724 ; repeat
CALL XRNEAR ; Invert NEAR sign
CALL L10300 ; MONYP - Print MONEY
CLR R0
K05032: MOV #000032, R3
BR K05050
;
; Invert 4-char NEAR sign
XRNEAR:
MOV #073467, R3 ; screen address
MOV #000012, R1 ; char height
MOV #125252, R0 ; XOR mask
MOV #MMODE5, @#177716 ; Включаем режим памяти 5
K04762: XOR R0, (R3)+ ; <
XOR R0, (R3)+
XOR R0, (R3)+
XOR R0, (R3)+
ADD #000070, R3
SOB R1, K04762 ; repeat
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
RETURN
;
; HLDOD procedure
K05040: MOVB K33464, R0 ; get HELD value
PUSH R3
CLR R3
; TEACH: draw HELD or NEAR item; R0 = item number; R3 = 000 for HELD, 032 for NEAR
K05050: ASL R3
BIC #177600, R0 ; 0..177
PUSH R1
PUSH R2
ASL R0
MOV K05254(R0), R2 ; get item address
ADD #067602, R3 ; HELD item screen address + offset
PUSH R3
MOV #000030, R1 ; 24. lines
MOV #MMODE5, @#177716 ; Включаем режим памяти 5
K05126: MOV (R2)+, (R3)+ ; <
MOV (R2)+, (R3)+ ; | copy pixels
MOV (R2)+, (R3)+ ; | copy pixels
MOV (R2)+, (R3)+ ; | copy pixels
ADD #000070, R3 ; | next line
SOB R1, K05126 ; repeat
POP R3
INC R3
MOV #000003, R5
K05164:
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
POP R2
POP R1
POP R3
RETURN
;
; Table of addrs: Nothing, Shuriken, Knife, Empty Box, Question, Pipe, Question, Wrench
K05254: .WORD K05274, K05450, K05624, K06000, K06154, K06504, K06154, K06330
; Item pictograms 32x24 in color, 192. bytes each * 7 = 1344. bytes total
.INCLUDE /S2ITEM.MAC/
;
K07336: .ASCII /PRESS ANY KEY TO CONTINUE/
; Missions info
K07367: .ASCII /RIN 999/
.ASCII / STRENGTH OF MIND AND BODY 00/
.BYTE 000, 000, 377, 377
K07443: .ASCII /KYO 901/
.ASCII / DIRECTION OF ENERGY 00/
.BYTE 000, 000, 377, 376
K07517: .ASCII /TOH 801/
.ASCII / HARMONY WITH THE UNIVERSE 02/
.BYTE 002, 000, 377, 377
K07573: .ASCII /SHA 751/
.ASCII / HEALING OF SELF AND OTHERS 05/
.BYTE 005, 000, 356, 377
K07647: .ASCII /KAI 701/
.ASCII / PREMONITION OF DANGER 07/
.BYTE 007, 000, 356, 377
K07723: .ASCII /JIN 651/
.ASCII /KNOWING THE THOUGHTS OF OTHERS09/
.BYTE 011, 001, 356, 377
K07777: .ASCII /RETSU601/
.ASCII / MASTERY OF TIME AND SPACE 11/
.BYTE 013, 001, 377, 376
K10053: .ASCII /ZAI 551/
.ASCII / CONTROL OF NATURES ELEMENTS 14/
.BYTE 016, 001, 377, 377
K10127: .ASCII /ZEN 999/
.ASCII / ENLIGHTENMENT 14/
.BYTE 016, 001, 356, 377
.EVEN
; Missions table
K10204: .WORD K07367, K07367, K07443, K07517, K07573, K07647, K07723, K07777
.WORD K10053, K10127
K10230: .ASCII /MISSION BRIEFING/
K10252: .ASCII /LEVEL 0/
K10261: .ASCII /KILL ENEMY GUARDS/
K10302: .ASCII /ESCAPE FROM BUILDING VIA TUNNELS/
.ASCII /"#/
.ASCII /GOOD LUCK ON YOUR MISSION/
.ASCII /PREPARE TO BEGIN/
K10415: .ASCII /MISSION NAME ' /
K10434: .ASCII /COLLECT XX PIECES OF PAPER TAPE/
K10473: .ASCII /INSERT TAPE IN MISSILE CONSOLE/
K10531: .ASCII /DISABLE ELECTRIFIED FENCE/
K10562: .ASCII /SMASH THROUGH FENCE ON MOTORBIKE/
;
K10622: .WORD 0 ; LVPTR
; Start Game selected in Menu - show level briefing
K10624: MOV #052525, <K01224+2> ; set filler: blue background
;MOVB #000062, <K01224+3>
CALL K01224 ; Clear the screen
MOV #K10230, R3 ; "MISSION BRIEFING" etc.
MOV #000022, R1 ; 18.
CALL PRINSP ; PRINT string
.WORD 040007 ; screen coords
MOV L11666, R0 ; get MSLEV Mission Level
ADD #000060, R0 ; +'0'
MOVB R0, <K10252+6> ; put in the "LEVEL 1" string
MOV #000007, R1
CALL PRINSP ; PRINT string
.WORD 040114 ; screen coords
MOV #K10415, R3 ; "MISSION NAME ' "
MOV #000017, R1
CALL PRINSP ; PRINT string
.WORD 040207 ; screen coords
MOV L11666, R0 ; get MSLEV Mission Level
ASL R0
MOV K10204(R0), R3 ; get mission info, starts with mission name
MOV #000005, R1
ADD #000017, R2 ; screen coords (0,15)
CALL K01704 ; PRINT string - mission name
MOV #K36204, R2
MOV #000003, R1 ; Copy 3-char TIMER initial value
K10770: MOVB (R3)+, (R2)+ ; <
SOB R1, K10770 ; repeat
MOV #000036, R1 ; 30.
CALL PRINSP ; PRINT string
.WORD 040241 ; screen coords
MOVB (R3)+, <K10434+10> ; higher digit in "COLLECT XX"
MOVB (R3), <K10434+11> ; lower digit
MOV R3, K10622 ; set LVPTR
MOV R3, R4
MOVB 000001(R4), 052626 ; set NTPND
BEQ K11056
MOV #K10434, R3 ; "COLLECT 00 PIECES OF PAPER TAPE"
MOV #000037, R1 ; 31.
CALL PRINSP ; PRINT string
.WORD 044000 ; screen coords
K11056: MOVB 000004(R4), K17200 ; set BIKER
MOV #000377, R0
CMPB #177777, K17200 ; BIKER == 255. ?
BNE K11124
MOV #K10562, R3 ; "SMASH THROUGH FENCE ON MOTORBIKE"
MOV #000040, R1 ; 32.
CALL PRINSP ; PRINT string
.WORD 044200 ; screen coords
MOV #000001, R0
K11124: MOVB R0, <K13224+2>
MOVB 000002(R4), K11770 ; -> CONQU
BEQ K11160
MOV #K10473, R3 ; "INSERT TAPE IN MISSILE CONSOLE"
MOV #000036, R1
CALL PRINSP ; PRINT string
.WORD 044041 ; screen coords
K11160: MOVB 000003(R4), <K31220+2>
CMPB #177777, <K31220+2>
BEQ K11216
MOV #K10531, R3 ; "DISABLE ELECTRIFIED FENCE"
MOV #000031, R1
CALL PRINSP ; PRINT string
.WORD 044103 ; screen coords
K11216:
MOV #K10261, R3 ; "KILL ENEMY GUARDS"
MOV #000021, R1 ; 17.
CALL PRINSP ; PRINT string "KILL ENEMY GUARDS"
.WORD 040347 ; screen coords
MOV #K10302, R3 ; "ESCAPE FROM BUILDING VIA TUNNELS"
MOV #000040, R1 ; 32.
CALL PRINSP ; PRINT string "ESCAPE FROM BUILDING VIA TUNNELS"
.WORD 044140 ; screen coords
MOV #000001, R1 ; 1.
CALL PRINSP ; PRINT string
.WORD 040240 ; screen coords
MOV #000001, R1 ; 1.
CALL PRINSP ; PRINT string
.WORD 040277
MOV #000031, R1 ; 25.
CALL PRINSP ; PRINT string "GOOD LUCK ON YOUR MISSION"
.WORD 050003 ; screen coords
MOV #000020, R1 ; 16.
CALL PRINSP ; PRINT string "PREPARE TO BEGIN"
.WORD 050110 ; screen coords
MOV #K07336, R3 ; "PRESS ANY KEY TO CONTINUE"
MOV #000031, R1 ; 25.
CALL PRINSP ; PRINT string
.WORD 050343 ; screen coords
CALL L13024 ; Empty keyboard buffer
CALL L13100 ; PAWS0 Get a key
; After the briefing - clear the screen, show the indicator panel
MOV #052525, <K01224+2> ; set filler
;MOVB #000011, <K01224+3>
CALL K01224 ; Clear the screen
MOVB K41304, R0 ; get input method
MOV #L15756, R2
DECB R0 ; input method == 1 ? keyboard
BEQ K11436 ; yes =>
;DECB R0 ; input method == 2 ?
;BEQ K11422
MOV #L15775, R2 ; Redefined keys address
K11422: MOV #K41305, R3 ; key mappings table
MOV #000017, R1 ; 15. bytes
K11432: MOVB (R2)+, (R3)+ ; < copy byte
SOB R1, K11432 ; repeat
; Prepare Stashes
K11436: MOV #000041, R5 ; 33. records
MOV #<K23030+4>, R2
MOV #<K23030+11>, R3
K11452: ; <
MOV #000005, R1 ; | 5 bytes
K11460: MOVB (R3)+, (R2)+ ; | < copy byte
SOB R1, K11460 ; | repeat
MOV #000011, R1 ; | 9.
ADD R1, R3
ADD R1, R2
SOB R5, K11452 ; repeat
;
PUSH R4
MOV #050100, R2 ; screen coords
CALL K02056 ; screen coords R2 to screen address
MOV #K11772, R5 ; Indicator panel tile sequence address
K11516: MOVB (R5), R3 ; < get byte
CMPB #177777, R3 ; | end of sequence?
BNE K11534
POP R4
JMP K12454 ; Indicator panel frame is shown - exit the loop
K11534: BIC #177400, R3 ; keep low byte
ASL R3 ; | *2
ASL R3 ; | *4
ASL R3 ; | *8.
ASL R3 ; | *16.
ADD #K12121, R3 ; | +PANCR tile base address
MOVB 000010(R3), R0
MOV #000001, R1
CMPB (R5)+, #000021 ; | less than 17. ? check for repeat char
BLO K11600
CLR R1
BISB (R5)+, R1 ; | get counter byte
K11600: PUSH R3 ; <
CALL K11632 ; | show one tile of the indicator panel
POP R3
TST (R2)+ ; | next column
INC R4
BIT #000037, R4
BNE K11626
ADD #001100, R2
K11626: SOB R1, K11600 ; repeat
BR K11516 ; repeat
; Procedure: Show one tile of the indicator panel
K11632:
;PUSH R5
MOV #MMODE5, @#177716 ; Включаем режим памяти 5
MOV (R3), (R2) ; #0
MOV (R3)+, 000100(R2) ; #1 Дублируем первую строку тайла
MOV (R3)+, 000200(R2) ; #2
MOV (R3)+, 000300(R2) ; #3
MOV (R3)+, 000400(R2) ; #4
MOV (R3)+, 000500(R2) ; #5
MOV (R3)+, 000600(R2) ; #6
MOV (R3)+, 000700(R2) ; #7
MOV (R3), 001000(R2) ; #8
MOV (R3)+, 001100(R2) ; #9 Дублируем последнюю строку тайла
MOV #MMODE1, @#177716 ; Включаем режим памяти 1
;POP R5
K11766: RETURN
;
; PANDA - Indicator panel tile sequence
K11772: .BYTE 010,021,004,016,021,016,016,021,005,016,021,004,011,014,022,004
.BYTE 014,022,016,014,000,001,001,001,002,014,022,004,014,014,022,004
.BYTE 014,022,016,014,003,022,003,004,014,022,004,014,014,022,004,014
.BYTE 023,016,014,005,006,006,006,007,014,022,004,014,014,022,004,014
.BYTE 023,016,014,022,005,014,022,004,014,012,021,004,017,021,016,017
.BYTE 021,005,017,021,004,013,377
.EVEN
; PANCR - Indicator panel tiles
K12121: .WORD 052525, 125125, 052625, 124545, 053131, 052631, 052631, 052631
.WORD 052525, 125252, 052525, 125252, 052525, 052525, 052525, 052525
.WORD 052525, 052652, 053125, 054552, 062625, 063125, 063125, 063125
.WORD 052631, 052631, 052631, 052631, 052631, 052631, 052631, 052631
.WORD 063125, 063125, 063125, 063125, 063125, 063125, 063125, 063125
.WORD 052631, 052631, 052631, 053131, 124545, 052625, 125125, 052525
.WORD 052525, 052525, 052525, 052525, 125252, 052525, 125252, 052525
.WORD 063125, 063125, 063125, 062625, 054552, 053125, 052652, 052525
.WORD 000000, 030300, 147400, 171717, 030360, 141460, 006060, 000060
.WORD 000000, 000360, 000014, 036014, 001417, 000363, 037703, 001460
.WORD 000300, 141700, 140377, 170360, 177460, 030014, 030014, 006000
.WORD 037700, 001460, 001703, 001717, 006074, 006014, 030060, 000060
.WORD 000300, 037760, 001414, 001400, 000300, 007774, 030300, 000360
.WORD 001400, 031460, 007700, 000363, 000077, 030303, 007414, 001700
.WORD 000000, 030060, 006060, 176014, 007417, 031474, 030303, 000300
.WORD 000300, 146314, 147714, 171460, 030077, 030060, 006014, 000000
.WORD 000300, 037700, 001760, 177403, 030300, 006000, 001774, 007400
.WORD 000000, 140060, 030060, 031777, 176300, 030300, 030060, 000000
.WORD 052525, 052525, 052525, 052525, 052525, 052525, 052525, 052525
.WORD 177777, 177777, 177777, 177777, 177777, 177777, 177777, 177777
;
; PANMS - Indicator signs
K12405: .ASCII /HELD/
.ASCII /TIMER/
.ASCII /NEAR/
K12422: .ASCII / /
K12423: .ASCII /PAY $0000000 / ; MONEY
K12440: .ASCIZ /XXXXXXXXXXX/ ; NAME
.EVEN
.BLKW 9. ;NOTE: Free space
;
; OUTBF: Prepare for Menu and start the Menu
K07326: CALL L07634 ; INITHI Draw Ninja for Menu
JMP L11224 ; CLAW1 Entering Menu
;
; Starting the game, indicator panel frame is already shown
; NDPAN:
K12454: MOV K10622, R3 ; get LVPTR
CLR R2
BISB 000001(R3), R2 ; get NTPND byte - tapes needed
BEQ K12504 ; jump if no tape needed
ADD #055205, R2 ; calculate attr pos of green tape piece
MOV #000014, R0 ; attr
CALL L13224 ; calc screen attr address and set attrs for 8x8 block
; NLPTM:
K12504: MOV #<K12422+6>, R3 ; MONEY+5
MOV #000006, R1 ; 6 bytes
K12514: MOVB #060, (R3)+ ; <
SOB R1, K12514 ; repeat
MOV #K12405, R3 ; "HELD" etc.
MOV #000004, R1 ; 4.
CALL PRINSP ; PRINT string "HELD"
.WORD 050301 ; screen coords
MOV #000005, R1 ; 5.
CALL PRINSP ; PRINT string "TIMER"
.WORD 050325 ; screen coords
MOV #000004, R1 ; 4.
CALL PRINSP ; PRINT string "NEAR"
.WORD 050333 ; screen coords
MOV #000016, R1 ; 14.
CALL PRINSP ; PRINT string " PAY $0000000 "
.WORD 050146 ; screen coords
MOVB #016, <L14506+2> ; set (NRGCR+1) = 14.
MOVB #007, K36211 ; set MAND = 7.
MOVB #046, K36210 ; set MANA = 38.
MOV #000406, K36212 ; set MANPS
;MOVB #001, K36213
MOVB #021, K36215 ; set RMAC room position = 17.
MOV #050205, K51142 ; set PTSPS
CLR R0
CLRB K24762
CLRB K51145 ; clear TAPCT - tapes carried total
CLRB K51146 ; clear TAPTT
CLRB K17716 ; clear BIKMR
CLRB K36216 ; clear ELECU - electroshock
CLRB K03542 ; set (NJCOL+1) = 0 black
CLRB K33540 ; clear DEAD
CLRB K36214 ; RMDN = 0 top level
MOV #<K23030+4>, K23746 ; INITSTA address -> NERST
MOV #K46310, <K36276+2> ; GLINC address -> CHARN+1
MOV #K40520, <K25272+2> ; GLIDERP address -> VECTN+1
CLRB K37662 ; set SPEED = 0
CLRB K36264 ; set DIR = 0
MOV #000240, K04114 ; set NOP command
MOV #<K70632-15.>, <K13332+2> ; MAP-15 address -> RM+1
INCB R0 ; R0 = 1
MOVB R0, <L14534+2> ; set (NRGPX+1) = 1
MOVB R0, <L14472+2> ; set (DECEN+1) = 1
MOVB R0, K33464 ; set HELD value = 1 = Shuriken
MOVB R0, K33465 ; set NEAR value = 1
MOVB R0, K33542 ; set JUMP = 1
MOVB R0, K36207 ; set TIME2 = 1
MOV #033556, R3 ; TRACK1+11.
MOV #000014, R2 ; 12.
MOV #000145, R1 ; 101.
; GRDIN:
K13036: MOVB (R3), R0 ; <
CMPB R0, #005 ; == 5 ?
BNE K13050 ; => NDGIT
CLRB (R3)
K13050: CMPB R0, #006 ; == 6 ?
BNE K13062
MOVB #001, (R3)
K13062: ADD R2, R3
SOB R1, K13036 ; repeat
CALL K05040 ; HLDOD
; INISC: Init screen, room changed
K13072: MOVB #005, K26666 ; set GDNRG = 5
MOVB #003, L15646 ; set RMTIME = 3
CLRB K14640 ; clear TVSWT
MOVB K17200, R0 ; get BIKER
INCB R0
BNE K13166
CMPB K36214, #023 ; check if RMDN == 19.
BNE K13166
MOV #K17716, R3 ; BIKMR
TSTB (R3)
BNE K13166
MOVB #001, (R3) ; set BIKMR = 1
MOV #K17720, R3 ; " BIKE ARRIVED "
MOV #000016, R1 ; 14.
CALL PRINSP ; PRINT string
.WORD 050146 ; screen coords
K13166: MOV #000006, R1 ; 6 = number of records
MOV #K33466, R3 ; MISL1 - Ninja object
MOV #000007, R2 ; 7 = object record size
K13202: CLRB (R3) ; <
ADD R2, R3 ; | next record
SOB R1, K13202 ; repeat
MOVB K36215, R1 ; get RMAC room position
MOVB #001, R0
DECB R1
BNE K13230 ; RMAC == 1 ? no => JIRRT
; DRFNT:
K13224: MOVB #001, R0 ;!!MUT-ARG!!
; JIRRT:
K13230: MOVB R0, 070340 ; set DRFNQ
CLRB K17635 ; clear LETNO
CALL K46120 ; BUFCL Fill Ninja tile screen
CALL K46150 ; BUFC2 Fill Enemy 0/1 tile screens
MOV #L25424, R3 ; BUFFB Back tile screen address
MOV #000440, R1 ; 288. words
K13260: CLR (R3)+ ; <
SOB R1, K13260 ; repeat
MOV #000440, R1 ; 288. words
MOV #177777, R5 ; filler
K13274: MOV R5, (R3)+ ; <
SOB R1, K13274 ; repeat
MOV #L24324, R3 ; BUFFD
MOV #000440, R1 ; 288. words
MOV #000401, R5 ; filler
K13314: MOV R5, (R3)+ ; <
SOB R1, K13314 ; repeat
;
;CLR <K01400+2>
;MTPS #000000 ; Enable interrupts
; RM:
K13332: MOV #000000, R3 ;!!MUT-ARG!!
MOVB K36214, R0 ; get RMDN room level
BEQ K13346 ; top level =>
; RMDN != 0
MOVB (R3), R0 ; get room number
; NTPRW: RMDN == 0
K13346: BIC #177400, R0
ASL R0
MOV K72572(R0), R3 ; Get room sequence addr from the table
; NXRUT: Build the room using the room sequence
K13360: MOVB (R3), R0 ; get marker
INCB R0 ; end of sequence?
BNE K13372
JMP K24272 ; => RMDUN End of room sequence
K13372: INC R3
PUSH R3
ASL R0 ; *2
BIC #177400, R0
ADD #<K13426-2>, R0 ; + <ROUTS-2>
JMP @000000(R0) ; Process this marker
; BAKWD:
K13414: POP R3
INC R3
BR K13360 ; => NXRUT
; RETRT:
K13422: JMP @#K13414 ;!!MUT-ARG!!
; ROUTS:
K13426: .WORD K20120 ; $00 000 - HORLN - Fill horizontally W with tile
.WORD K20152 ; $01 001 - VERLN - Fill vertically H with tile
.WORD K24104 ; $02 002 - BLOCK - Fill rectangle WxH with tile
.WORD K17762 ; $03 003 - FILLB - Fill the whole room with tile
.WORD K20022 ; $04 004 - ONECR - Fill one tile
.WORD K16024 ; $05 005 - RKTTP - Rocket upper part
.WORD K20136 ; $06 006 - DIAGR - Fill diagonally right-down
.WORD K20144 ; $07 007 - DIAGL - Fill diagonally left-down
.WORD K20260 ; $08 010 - LADSK - Ladder
.WORD K20346 ; $09 011 - ROCKS - Supertile
.WORD K24004 ; $0A 012 - DIBL1 - Fill triangle down-right
.WORD K23752 ; $0B 013 - DIBL2 - Fill triangle up-right
.WORD K23760 ; $0C 014 - DIBL3 - Fill triangle right-up
.WORD K23776 ; $0D 015 - DIBL4 - Fill triangle right-down
.WORD K20240 ; $0E 016 - LADTN - Wide white ladder
.WORD K20056 ; $0F 017 - TLDTN - Joint between the ladder and the mast
.WORD K15226 ; $10 020 - CUPB2 - Cupboard
.WORD K16220 ; $11 021 - LFTPF - Lift platform bottom, 6x1 tiles
.WORD K15562 ; $12 022 - TREEF - Tree leaves small
.WORD K16400 ; $13 023 - MOON - Moon
.WORD K16134 ; $14 024 - LFFN1 - Rocket wing left top, 2x6 tiles
.WORD K16152 ; $15 025 - RTFN1 - Rocket wing right top, 2x6 tiles
.WORD K15634 ; $16 026 - LFFN2 - Rocket wing element left bottom
.WORD K15670 ; $17 027 - RTFN2 - Rocket wing element right bottom
.WORD K15724 ; $18 030 - LEFEX - Rocket left bottom
.WORD K15764 ; $19 031 - RITEX - Rocket right bottom
.WORD K17736 ; $1A 032 - REDOF - Normal foreground
.WORD K17754 ; $1B 033 - REDON - Red foreground
.WORD K16116 ; $1C 034 - LFTRE - Tree ?? 5x3 tiles
.WORD K16350 ; $1D 035 - RADIA - Radiation room
.WORD K20250 ; $1E 036 - RADLD - Radiation room ladder
.WORD K16324 ; $1F 037 - HIDLD - ?? 2x2 tiles
.WORD K16100 ; $20 040 - RTTRE - Tree ?? 3x2 tiles
.WORD K20230 ; $21 041 - GRLAD - Ladder ??
.WORD K17640 ; $22 042 - LETR1 - Text ??
.WORD K17646 ; $23 043 - LETR2 - Text ??
.WORD K17654 ; $24 044 - LETR3 - Text ??
.WORD K16656 ; $25 045 - BOX1P
.WORD K16742 ; $26 046 - FDESK - Front desk ??
.WORD K16500 ; $27 047 - DOORP - Door
.WORD K15376 ; $28 050 - SHELP
.WORD K15464 ; $29 051 - SHE2P
.WORD K15352 ; $2A 052 - BARBK - Barrel
.WORD K15332 ; $2B 053 - CANIS - Canisters
.WORD K15324 ; $2C 054 - BARB2 - Barrel
.WORD K15316 ; $2D 055 - BARB3 - Barrel
.WORD K15500 ; $2E 056 - LEVEL - " LEVEL X " sign
.WORD K15264 ; $2F 057 - CUPBP - Cupboard
.WORD K15206 ; $30 060 - BARFR - Barrel
.WORD K15200 ; $31 061 - BARF2 - Barrel
.WORD K15154 ; $32 062 - WNDOP
.WORD K15130 ; $33 063 - DESKP - Desk ?? 6x5 tiles
.WORD K15122 ; $34 064 - DESK2 - Desk
.WORD K15234 ; $35 065 - CUPB3 - Cupboard
.WORD K15242 ; $36 066 - CUPB4 - Cupboard
.WORD K15250 ; $37 067 - CUPB5 - Cupboard
.WORD K16624 ; $38 070 - BOX2P