-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEFT18Interrupt.asm
1245 lines (1190 loc) · 34.8 KB
/
EFT18Interrupt.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
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
;===================================================================
;===================================================================
;EFT VERSION 1.8I (INTERRUPT) 11/30/81 COPYRIGHT CHRIS CRAWFORD 1981
;===================================================================
START = $6E00
;======================================
;Page zero RAM
;======================================
RTCLKL = $14
ATRACT = $4D
DRKMSK = $4E
COLRSH = $4F
;--------------------------------------
;--------------------------------------
* = $B0
;--------------------------------------
;
;These locations are used by the interrupt service routine
;
DLSTPT .word ? ; Zero page pointer to display list
MAPLO .byte ?
MAPHI .byte ?
CORPS .byte ? ; number of unit under window
CURSXL .byte ?
CURSXH .byte ?
CURSYL .byte ? ; cursor coordinates on screen (map frame)
CURSYH .byte ?
OFFLO .byte ? ; How far to offset new LMS value
OFFHI .byte ?
TEMPI .byte ? ; An all-purpose temporary register
CNT1 .byte ? ; DLI counter
CNT2 .byte ? ; DLI counter for movable map DLI
CHUNKX .byte ? ; cursor coordinates (pixel frame)
CHUNKY .byte ?
;
;THIS VALUE IS USED BY MAINLINE ROUTINE AND INTERRUPT
;
TURN = $C9
;
;OS locations (see OS manual)
;
PCOLR0 = $02C0
STICK = $0278
CH = $2FC
;
;HARDWARE LOCATIONS
;
HPOSP0 = $D000
HPOSP1 = $D001
HPOSP2 = $D002
HPOSP3 = $D003
TRIG0 = $D010
TRIG1 = $D011
TRIG2 = $D012
COLPF0 = $D016
COLPF1 = $D017
COLPF2 = $D018
COLBAK = $D01A
CONSOL = $D01F
AUDF1 = $D200
AUDC1 = $D201
HSCROLL = $D404
VSCROLL = $D405
WSYNC = $D40A
CHBASE = $D409
SETVBV = $E45C
XITVBV = $E462
;
;Page 6 usage
;
;--------------------------------------
;--------------------------------------
* = $0600
;--------------------------------------
;first come locations used by the interrupt service routine
XPOSL .byte ? ; Horizontal position of
YPOSL .byte ? ; Vertical position of
YPOSH .byte ? ; upper-left corner of screen window
SCY .byte ? ; vert position of cursor (player frame)
SHPOS0 .byte ? ; shadows player 0 position
TRCOLR .byte ?
EARTH .byte ?
ICELAT .byte ?
SEASN1 .byte ?
SEASN2 .byte ?
SEASN3 .byte ?
DAY .byte ?
MONTH .byte ?
YEAR .byte ?
BUTFLG .byte ?
BUTMSK .byte ?
TYL .byte ?
TYH .byte ?
DELAY .byte ? ; acceleration delay on scrolling
TIMSCL .byte ? ; frame to scroll in
TEMPLO .byte ? ; temporary
TEMPHI .byte ?
BASEX .byte ? ; start position for arrow (player frame)
BASEY .byte ?
STEPX .byte ? ; intermediate position of arrow
STEPY .byte ?
STPCNT .byte ? ; which intermediate steps arrow is on
ORDCNT .byte ? ; which order arrow is showing
ORD1 .byte ? ; orders record
ORD2 .byte ?
ARRNDX .byte ? ; arrow index
HOWMNY .byte ? ; how many orders for unit under cursor
KRZX .byte ? ; maltakreuze coords (player frame)
KRZY .byte ?
DBTIMR .byte ? ; joystick debounce timer
STICKI .byte ? ; coded value of stick direction (0-3)
ERRFLG .byte ?
KRZFLG .byte ?
STKFLG .byte ?
HITFLG .byte ?
TXL .byte ? ; temporary values---slightly shifted
TXH .byte ?
HANDCP = $68F
;--------------------------------------
;--------------------------------------
* = $5200
;--------------------------------------
PLYR0 .fill 128
PLYR1 .fill 128
PLYR2 .fill 128
PLYR3 .fill 128
CorpsX .fill 159 ; x-coords of all units (pixel frame)
CorpsY .fill 159 ; y-coords of all units (pixel frame)
MusterStrength .fill 159 ; muster strengths
CombatStrength .fill 159 ; combat strengths
SWAP .fill 159 ; terrain code underneath unit
ArrivalTurn .fill 159 ; turn of arrival
WordsTbl .fill 272 ; various words for messages
CorpType .fill 159 ; codes for unit types
CorpNumber .fill 159 ; ID numbers of units
HundredDigit .fill 256 ; tables for displaying numbers (hundreds)
TensDigit .fill 256 ; tens tables
OnesDigit .fill 256 ; ones tables
TxtTbl .fill 96 ; more text
DaysInMonth .fill 13 ; table of month lengths
HowManyOrders .fill 159 ; how many orders each unit has in queue
WhatOrders .fill 159 ; what the orders are
WHORDH .fill 159
BEEPTB .fill 4 ; table of beep tones
ERRMSG .fill 128 ; table of error messages
XOFF .fill 4 ; offsets for moving maltakreuze
YOFF .fill 4
MASKO .fill 4 ; mask values for decoding orders
XADD .fill 4 ; offsets for moving arrow
YADD .fill 4
TreeColors .fill 13
MLTKRZ .fill 8 ; maltese cross shape
;
;RAM from $6000 to $6430 is taken up by
;character sets and the display list
;
;--------------------------------------
;--------------------------------------
* = $6431
;--------------------------------------
ArrowTbl .fill 32 ; arrow shapes
;--------------------------------------
;--------------------------------------
* = $6450
;--------------------------------------
;--------------------------------------
;--------------------------------------
TXTWDW * = $6CB1
;--------------------------------------
STKTAB .fill 16 ; a joystick decoding table
SSNCOD .fill 12
TRNTAB .fill 60
BHX1 .fill 22
BHY1 .fill 22
BHX2 .fill 22
BHY2 .fill 22
EXEC .fill 159
;
;everything in here is taken up by the map data
;
;
;This is the vertical blank interrupt routine
;It reads the joystick and scrolls the screen
;
;--------------------------------------
;--------------------------------------
* = $7400
;--------------------------------------
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; added for binary compatibility
;LDA TRIG1 ; check for break button
LDA #$FF
NOP
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
BNE Z30 ; no, check next
LDY #62 ; reset 60 Hertz vector
LDX #233
LDA #7
JSR SETVBV
PLA ; reset stack
PLA
PLA
JMP $7210 ; break routine
Z30 LDA HANDCP
BEQ A31
LDA TRIG0
BEQ A31
LDA #$08
STA CONSOL
LDA CONSOL
AND #$04
BNE A31
STA HANDCP
LDA #$30
STA $7B7A ; my trademark
LDX #$36
LOOPJ LDA MusterStrength,X
STA TEMPI
LSR A
ADC TEMPI
BCC A22
LDA #$FF
A22 STA MusterStrength,X
DEX
BNE LOOPJ
A31 LDA TRIG0 ; button status
ORA BUTMSK ; button allowed?
BEQ X17
LDA BUTFLG ; no button now; previous status
BNE X23
JMP NOBUT
X23 LDA #$58 ; button just released
STA PCOLR0
LDA #$00
STA BUTFLG
STA KRZFLG
STA AUDC1
LDX #$52
LOOP8 STA TXTWDW+8,X ; clear text window
DEX
BPL LOOP8
LDA #$08
STA DELAY
CLC
ADC RTCLKL
STA TIMSCL
JSR SWITCH
LDA #$00
STA CORPS
JSR CLRP1
JSR CLRP2
JMP ENDISR
X17 STA ATRACT ; button is pressed
LDA STICK
AND #$0F
EOR #$0F
BEQ X20 ; joystick active?
JMP ORDERS ; yes
X20 STA DBTIMR ; no, set debounce
STA AUDC1
STA STKFLG
LDA BUTFLG
BNE BUTHLD ; is this the first button pass
JMP FBUTPS ; yes
BUTHLD JSR ERRCLR ; no, clear errors
X61 LDA HITFLG
BEQ X63 ; anybody in the window?
JMP ENDISR ; no
X63 LDA CH
CMP #$21
BNE X80 ; space bar pressed?
LDX CORPS ; yes, check for Russian
CPX #$37
BCS X80
LDA #$00
STA CH
STA HowManyOrders,X ; clear out orders
STA HOWMNY
STA STPCNT
LDA #$01
STA ORDCNT
JSR CLRP1
JSR CLRP2
LDA BASEX
STA STEPX
LDA BASEY
STA STEPY
X80 LDA RTCLKL
AND #$03
BEQ X54 ; time to move arrow?
JMP ENDISR ; no
X54 LDY HOWMNY ; yes
BNE X65 ; any orders to show?
JMP PCURSE ; no, go ahead to maltakreuze
X65 JSR CLRP1 ; yes, clear old arrow
LDA ORDCNT
LDX #$00 ; assume first byte
CMP #$05
BCC X52 ; second byte or first?
INX ; second byte
X52 AND #$03 ; isolate bit pair index
TAY
LDA BITTAB,Y ; get mask
X50 AND ORD1,X ; get orders
;
;right justify orders
;
DEY
BPL X51
LDY #$03
X51 BEQ X53
LOOP21 LSR A
LSR A
DEY
BNE LOOP21
X53 STA ARRNDX
ASL A
ASL A
ASL A
;get arrow image and store it to player RAM
TAX
LDY STEPY
X55 LDA ArrowTbl,X
CPY #$80
BCS X43
STA PLYR1,Y
X43 INX
INY
TXA
AND #$07
BNE X55
LDA STEPX ; position arrow
STA HPOSP1
;
;now step arrow
;
LDX ARRNDX
LDA STEPX
CLC
ADC XADD,X
STA STEPX
LDA STEPY
CLC
ADC YADD,X
STA STEPY
INC STPCNT ; next step
LDA STPCNT
AND #$07
BNE X59 ; if not done end ISR
STA STPCNT ; end of steps
INC ORDCNT ; next order
LDA ORDCNT
CMP HOWMNY ; last order?
BCC X59 ; no, out
BEQ X59 ; no, out
LDA #$01
STA ORDCNT ;yes, reset to start of arrow's path
;
;display maltese cross ('maltakreuze' or KRZ)
;
PCURSE LDY STEPY
STY KRZY
LDA #$FF
STA KRZFLG
LDX #$00
LOOP24 LDA MLTKRZ,X
CPY #$80
BCS X44
STA PLYR2,Y
X44 INY
INX
CPX #$08
BNE LOOP24
LDA STEPX
SEC
SBC #$01
STA KRZX
STA HPOSP2
JSR CLRP1 ; clear arrow
LDA BASEX ;reset arrow's coords
STA STEPX
LDA BASEY
STA STEPY
X59 JMP ENDISR
;
;FIRST BUTTON PASS
;looks for a unit inside cursor
;if there is one, puts unit info into text window
;
FBUTPS LDA #$FF
STA BUTFLG
;
;first get coords of center of cursor (map frame)
;
X24 LDA CURSXL
CLC
ADC #$06
STA TXL
LDA CURSXH
ADC #$00
STA TXH
LDA CURSYL
CLC
ADC #$09
STA TYL
LDA CURSYH
ADC #$00
STA TYH
LDA TXH
LSR A
LDA TXL
ROR A
LSR A
LSR A
;
;coords of cursor (pixel frame)
;
STA CHUNKX
LDA TYH
LSR A
TAX
LDA TYL
ROR A
TAY
TXA
LSR A
TYA
ROR A
LSR A
LSR A
STA CHUNKY
;
;now look for a match with unit coordinates
;
LDX #$9E
LOOP6 CMP CorpsY,X
BEQ MAYBE
X16 DEX
BNE LOOP6
STX CORPS ; no match obtained
DEX
STX HITFLG
JMP ENDISR
MAYBE LDA CHUNKX
CMP CorpsX,X
BNE X35
LDA ArrivalTurn,X
BMI X35
CMP TURN
BCC MATCH
BEQ MATCH
X35 LDA CHUNKY
JMP X16
;
;match obtained
;
MATCH LDA #$00
STA HITFLG ; note match
STA CH
LDA #$5C
STA PCOLR0 ; light up cursor
;
;display unit specs
;
STX CORPS
LDY #$0D
LDA CorpNumber,X ; ID number
JSR DNUMBR
INY
LDX CORPS
LDA CorpType,X ; first name
STA TEMPI
AND #$F0
LSR A
JSR ENTRY2
LDA TEMPI
AND #$0F ; second name
CLC
ADC #$08
JSR DWORDS
LDA #$1E
LDX CORPS
CPX #$37
BCS X26
LDA #$1D
X26 JSR DWORDS ; display unit size (corps or army)
LDY #$38
LDA #$1F ; "MUSTER"
JSR DWORDS
DEY
LDA #$1A ; ":"
STA TXTWDW,Y
INY
INY
LDX CORPS
LDA MusterStrength,X ; muster strength
JSR DNUMBR
INY
INY
LDA #$20 ; "COMBAT"
JSR DWORDS
LDA #$21 ; "STRENGTH"
JSR DWORDS
DEY
LDA #$1A ; ":"
STA TXTWDW,Y
INY
INY
LDX CORPS
LDA CombatStrength,X ; combat strength
JSR DNUMBR
X27 JSR SWITCH ; flip unit with terrain
LDA CORPS
CMP #$37
BCC X79 ; Russian?
LDA #$FF ; yes, mask orders and exit
STA HITFLG
BMI X75
;
;German unit
;set up orders display
;first calculate starting coords (BASEX, BASEY)
;
X79 LDA #$01
STA ORDCNT
LDA #$00
STA STPCNT
LDA TXL
AND #$07
CLC
ADC #$01
CLC
ADC SHPOS0
STA BASEX
STA STEPX
LDA TYL
AND #$0F
LSR A
SEC
SBC #$01
CLC
ADC SCY
STA BASEY
STA STEPY
;
;now set up page 6 values
;
LDX CORPS
LDA HowManyOrders,X
STA HOWMNY
LDA WhatOrders,X
STA ORD1
LDA WHORDH,X
STA ORD2
X75 JMP ENDISR
;
;ORDERS INPUT ROUTINE
;
ORDERS LDA STKFLG
BNE X75
LDX CORPS
CPX #$37
BCC X64 ; Russian?
LDX #$00 ; yes, error
JMP SQUAWK
X64 LDA HowManyOrders,X
CMP #$08
BCC X66 ; only 8 orders allowed
LDX #$20
JMP SQUAWK
X66 LDA KRZFLG
BNE X67 ; must wait for maltakreuze
LDX #$40
JMP SQUAWK
X67 INC DBTIMR
LDA DBTIMR ; wait for debounce time
CMP #$10
BCS X68
BCC X75
X68 LDA #$00
STA DBTIMR ; reset debounce timer
LDX STICK
LDA STKTAB,X
BPL X69
LDX #$60 ; no diagonal orders allowed
JMP SQUAWK
;
;OK, this is a good order
;
X69 TAY
STA STICKI
LDA BEEPTB,Y
STA AUDF1 ; "BEEP!"
LDA #$A8
STA AUDC1
LDA #$FF
STA STKFLG
LDX CORPS
INC HowManyOrders,X
LDA HowManyOrders,X
STA HOWMNY
SEC
SBC #$01
AND #$03
TAY
STY TEMPI
LDA HowManyOrders,X
SEC
SBC #$01
LSR A
LSR A
TAX
LDA STICKI
;isolate order
X71 DEY
BMI X70
ASL A
ASL A
JMP X71
X70 LDY TEMPI
EOR ORD1,X ; fold in new order (sneaky code)
AND MASKO,Y
EOR ORD1,X
STA ORD1,X
LDA ORD1
LDX CORPS
STA WhatOrders,X
LDA ORD2
STA WHORDH,X
;
;move maltakreuze
;
JSR CLRP2
LDX STICKI
LDA KRZX
CLC
ADC XOFF,X
STA KRZX
LDA KRZY
CLC
ADC YOFF,X
STA KRZY
DSPKRZ LDA KRZX ; display it
STA HPOSP2
LDY KRZY
LDX #$00
LOOP26 LDA MLTKRZ,X
CPY #$80
BCS X45
STA PLYR2,Y
X45 INY
INX
CPX #$08
BNE LOOP26
BEQ EXITI
;
;ERROR on inputs routine
;squawks speaker and puts out error message
;
SQUAWK LDY #$69
LOOP28 LDA ERRMSG,X
SEC
SBC #$20
STA TXTWDW,Y
INY
INX
TXA
AND #$1F
BNE LOOP28
LDA #$68
STA AUDC1
LDA #$50
STA AUDF1 ; "HONK!"
LDA #$FF
STA ERRFLG
BMI EXITI
;
;NO BUTTON PRESSED ROUTINE
;
NOBUT STA DBTIMR
LDA STICK
AND #$0F
EOR #$0F
BNE SCROLL
STA AUDC1
STA STKFLG
LDA #$08
STA DELAY
CLC
ADC RTCLKL
STA TIMSCL
JSR ERRCLR
EXITI JMP ENDISR
SCROLL LDA #$00
STA ATRACT
;
;acceleration feature of cursor
;
LDA TIMSCL
CMP RTCLKL
BNE EXITI
LDA DELAY
CMP #$01
BEQ X21
SEC
SBC #$01
STA DELAY
X21 CLC
ADC RTCLKL
STA TIMSCL
LDA #$00
STA OFFLO
STA OFFHI ; zero the offset
LDA STICK ; get joystick reading
PHA ; save it on stack for other bit checks
AND #$08 ; joystick left?
BNE CHKRT ; no, move on
LDA CURSXL
BNE X13
LDX CURSXH
BEQ CHKUP
X13 SEC
SBC #$01
STA CURSXL
BCS X14
DEC CURSXH
X14 LDA SHPOS0
CMP #$BA
BEQ X1
CLC
ADC #$01
STA SHPOS0
STA HPOSP0
BNE CHKUP
X1 LDA XPOSL
SEC ; decrement x-coordinate
SBC #$01
STA XPOSL
AND #$07
STA HSCROLL ; fine scroll
CMP #$07 ; scroll overflow?
BNE CHKUP ; no, move on
INC OFFLO ; yes, mark it for offset
CLV
BVC CHKUP ; no point in checking for joystick right
CHKRT PLA ; get back joystick byte
PHA ; save it again
AND #$04 ; joystick right?
BNE CHKUP ; no, move on
LDA CURSXL
CMP #$64
BNE X12
LDX CURSXH
BNE CHKUP
X12 CLC
ADC #$01
STA CURSXL
BCC X15
INC CURSXH
X15 LDA SHPOS0
CMP #$36
BEQ X2
SEC
SBC #$01
STA SHPOS0
STA HPOSP0
BNE CHKUP
X2 LDA XPOSL
CLC ; no, increment x-coordinate
ADC #$01
STA XPOSL
X4 AND #$07
STA HSCROLL ; fine scroll
BNE CHKUP ; scroll overflow? if not, move on
DEC OFFLO ; yes, set up offset for character scroll
DEC OFFHI
CHKUP PLA ; joystick up?
LSR A
PHA
BCS CHKDN ; no, ramble on
LDA CURSYL
CMP #$5E
BNE X3
LDX CURSYH
CPX #$02
BEQ CHKDN
X3 INC CURSYL
BNE X11
INC CURSYH
X11 LDX SCY
CPX #$1B
BEQ X6
INC CURSYL
BNE X18
INC CURSYH
X18 DEX
STX SCY
TXA
CLC
ADC #$12
STA TEMPI
LOOP4 LDA PLYR0,X
STA PLYR0-1,X
INX
CPX TEMPI
BNE LOOP4
BEQ CHKDN
X6 LDA YPOSL
SEC
SBC #$01
BCS X7
DEC YPOSH
X7 STA YPOSL
AND #$0F
STA VSCROLL ; fine scroll
CMP #$0F
BNE CHKDN ; scroll overflow? If not, amble on
LDA OFFLO ; yes, set up offset for character scroll
SEC
SBC #$30
STA OFFLO
LDA OFFHI
SBC #$00
STA OFFHI
CHKDN PLA ; joystick down?
LSR A
BCS CHGDL ; no, trudge on
LDA CURSYL
CMP #$02
BNE X5
LDX CURSYH
BEQ CHGDL
X5 SEC
SBC #$01
STA CURSYL
BCS X10
DEC CURSYH
X10 LDX SCY
CPX #$4E
BEQ X8
SEC
SBC #$01
STA CURSYL
BCS X19
DEC CURSYH
X19 INX
STX SCY
TXA
CLC
ADC #$12
DEX
DEX
STX TEMPI
TAX
LOOP5 LDA PLYR0-1,X
STA PLYR0,X
DEX
CPX TEMPI
BNE LOOP5
BEQ CHGDL
X8 LDA YPOSL
CLC ; no, decrement y-coordinate
ADC #$01
STA YPOSL
BCC X9
INC YPOSH
X9 AND #$0F
STA VSCROLL ; fine scroll
BNE CHGDL ; no, move on
LDA OFFLO ; yes, mark offset
CLC
ADC #$30
STA OFFLO
LDA OFFHI
ADC #$00
STA OFFHI
;
;In this loop we add the offset values to the existing
;LMS addresses of all display lines.
;This scrolls the characters.
;
CHGDL LDY #$09
DLOOP LDA (DLSTPT),Y
CLC
ADC OFFLO
STA (DLSTPT),Y
INY
LDA (DLSTPT),Y
ADC OFFHI
STA (DLSTPT),Y
INY
INY
CPY #$27
BNE DLOOP
ENDISR LDA YPOSH
LSR A
LDA YPOSL
ROR A
LSR A
LSR A
LSR A
CMP #$11
BCS X39
LDA #$FF
BMI X40
X39 CMP #$1A
BCC X41
LDA #$02
BPL X40
X41 STA TEMPI
INX
LDA #$1D
SEC
SBC TEMPI
X40 STA CNT1
LDA #$00
STA CNT2
JMP XITVBV ; exit vertical blank routine
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; added for binary compatibility
.byte $E4
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;--------------------------------------
;--------------------------------------
* = $799C
;--------------------------------------
JSTP .byte 0,0,0,0,3,3,3,3
.byte 2,2,2,2,1,1,1,0
.byte 0,0,3,3,2,2,1,0
DEFNC .byte 2,3,3,2,2,2,1,1,2,0
;--------------------------------------
;--------------------------------------
* = $79C0
;--------------------------------------
;
;SUBROUTINE DWORDS
;displays a single word from a long table of words
;
DWORDS ASL A
ASL A
ASL A
BCC ENTRY2
TAX
BOOP20 LDA WordsTbl+256,X
SEC
SBC #$20
BEQ BNDW
STA TXTWDW,Y
INY
INX
TXA
AND #$07
BNE BOOP20
BNDW INY
RTS
ENTRY2 TAX ; this is another entry point
LOOP20 LDA WordsTbl,X
SEC