-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathA33721.2A
2706 lines (2607 loc) · 57.5 KB
/
A33721.2A
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 FOOTV2
;MODIFIED FUTBAL 21-NOV-78
;CHANGES @ 5-19, 5-515 TO 5-593
; 7-305, 7-349, 8-17
; 10-159 TO 10-267
;
.RADIX 16
.IIF NDF,NTB,NTB=1
.ASECT
.SBTTL ******************************
.SBTTL * PROGRAMER: MIKE ALBAUGH *
.SBTTL * *
.SBTTL * CHECKER: *
.SBTTL * *
.SBTTL ******************************
.REPT 0
DATE INITIATED: 22-MAR-78
PROJECT CHARGE #: 5P221
DISK #: 73
HARDWARE REQUIREMENTS: MONSTER-MAN PCB, CONSISTING OF BASIC MOC16
WITH ADDITIONS 1) HORIZONTAL SCROLLING FOR PLAYFIELD
2) 4 ANODE MULTIPLEXED LED DISPLAYS
3) ALPHANUMERICS ON EDGES OF PLAYFIELD,
3 USABLE ROWS PER EDGE.
MEMORY REQUIREMENTS: 768 BYTES WORKING RAM
256 BYTES ALPHANUMERICS RAM
960 BYTES SCROLL-FIELD RAM
64 BYTES MOTION-OBJECT PARAMETERS
8K BYTES PROGRAM ROM
INTERRUPT REQUIREMENTS: FOUR IRQ'S PER FRAME. THESE ARE IN GENERAL ON THE
FALLING EDGE OF 32V, WITH THE EXCEPTION OF THE LAST,
WHICH OCCURS AT LINE 240, RATHER THAN LINE 256, TO ALLOW
MAXIMUM USE OF VERTICAL RETRACE TIME.TIMING OF THESE
IRQ'S IS IMPORTANT, BECAUSE THE ANODE DRIVERS OF THE
MULTIPLEXED LED DISPLAY ARE DRIVEN DIRECTLY BY
V-FUNCTIONS, AND THE CATHODES ARE HELD OFF BY THE IRQ
SIGNAL. IN PARTICULAR: A) THE IRQ MUST BE ACKNOWLEDGED
(BY A STORE TO INTACK, LOCATION 3000 HEX) BEFORE NEW
INFORMATION FOR THE CATHODES IS WRITTEN. B) THE IRQ MUST
NOT (!) BE ACKNOWLEDGED BETWEEN LINES 240 AND 256, AS IT
WILL BE RE-ASSERTED AT LINE 256 IN THAT CASE. FOR THIS
REASON THE INPUT "VBLANK" (D7, LOCATION 4001) IS REALLY
THE SIGNAL "ENDSCREEN" WHICH IS ASSERTED ONLY IN LINES
240 THRU 256.
ASSEMBLY COMMAND STRING:*FUTBAL,FUTBAL=FUTBAL/C
LINK COMMAND STRING:*PP:/L,RK1:FBMAP.LST=FUTBAL,FBCHOR,FBCOIN,FBINT
PROGRAM DESCRIPTION: MAIN PROGRAM FOR "MONSTER-MAN FOOTBALL". USES TABLES
IN FBCHOR TO DIRECT PLAYS. USES STANDARD COIN ROUTINE,
(CUSTOMIZED BY FBCONF) ON FILE FBCOIN.OBJ FOR HANDLING
COINS. FBINT IS INTERRUPT, TEST, AND VECTORS. FBCOMN (INCLUDED)
DEFINES STORAGE. GAME IS ON "EACH COIN ADDS TIME" BASIS
.ENDR
NPLAYS=4
.GLOBL $CNCT
.INCLUDE FBCOMN
.IIF NDF,AIM,AIM=1 ;DEFAULT TO AIM
.IF NE,AIM
.SBTTL AIM,DEBUG STUFF
.=PROG-200 ;HANG THIS UNDERNEATH
AIMENT: SEI
LDA I,0
.=.-1
.WORD IRQ ;FORM "LDA I,IRQ&0FF"
.=.-1 ;BACKSPACE OVER HIGH BYTE
STA A,0F7C8 ;STORE IN AIM'S "VECTOR"
LDA I,0
.=.-1
.ENABL M68 ;SWAB FOLLOWING WORD
.WORD IRQ ;FORM "LDA I,IRQ/100"
.DSABL M68 ;BACK TO L,H
.=.-1 ;BACKSPACE OVER LOW BYTE
STA A,0F7C9
LDA I,0
STA A,100
STA A,101 ;CORK TRACE LIST
STA A,APAT1 ;BREAK @ APAT1
LDA I,TRACE&0FF ;PATCH "JSR FANS"
STA A,APAT0+1 ;TO BE "JSR TRACE"
LDA I,TRACE/100
STA A,APAT0+2
JMP RESET
.SBTTL TRACE UTILITY
;BEGIN INTEGER J, WORD ARRAY TSRC, BYTE ARRAY TDST
;J:=0
;WHILE (TSRC(J).NE.0) DO
;SCREEN (TDST(J))=MEMORY (TSRC(J))
;J:=J+1
;END
TRACE: LDY I,0
STY J
1$: LDY J
LDA AY,TSRC
STA ADL
LDA AY,TSRC+1
STA ADH ;BUILD PTR TO BYTE
ORA ADL
BEQ 2$ ;TRCING 0000=END
LDX I,0
LDA NX,ADL ;GET BYTE
JSR ASCAX ;CONVERT TO ASCII IN A,X
PHA
LDA AY,TDST
INY
INY
INY
STY J ;SAVE LIST PTR
TAY ;POINT TO SCREEN
PLA ;GET HIGH NYBBLE
JSR WRTAN ;WRITE ALPHANUMERICS
TXA ;LOW NYBBLE
JSR WRTAN
JMP 1$
2$: JMP FANS ;DO WHAT HE WANTED
.ENDC
.PAGE
.SBTTL INITIALIZE
.=PROG
START: CLI
LDA INTCNT ;"RANDOM " #
AND I,2
STA OFFENS
JSR STRTGM ;"START GAME"
.SBTTL "MAIN-LOOP"
WAIT:
1$: LSR SYNC
BCC 1$ ;WAIT FOR V-BLANK
STA A,WTCHDG
JSR GAME
APAT0: JSR FANS ;AIM PATCHES HERE
BIT A,TEST
BVS WAIT ;BRANCH IF TEST OFF
APAT1: JMP RESET ;FAKE RESET
CKS0: .BYTE 031
.SBTTL GAME MASTER CONTROL
GAME: JSR TRACK
LDA $CNCT ;ANY MONEY?
BEQ DSPTCH ;NO, JUST DO WHATEVER
DEC $CNCT ;ELSE TAKE THEIR MONEY
JSR UPTIME ;AND GIVE THEM SOME (MORE) TIME
JSR DTIME ;SHOW IT
LDA I,0
STA W30TIM ;ENABLE 30 SEC. WARNING TIMER
LDA ATRACT ;ARE WE IN ATTRACT?
BMI DSPTCH ;NO, PROCEED
LDA I,-1 ;PUT IN GAME
STA ATRACT
STRTGM: LDA I,EC.SG ;END PLAY, START GAME
STA WHYEND
LDA I,30.
STA STPCLK ;KEEP CLOCK OFF FOR 30 SECONDS
JSR WECASE
LDA I,0
STA WHISTL ;KILL LEFT-OVER SOUNDS
STA THUD
LDX I,3
21$: STA ZX,SCORE ;CLEAR SCORES
DEX
BPL 21$
JSR CAN
JSR RSF
LDA I,M.BAN1
JSR WRITEB
LDA I,M.BAN2
JSR WRITEB
JSR DTIME
JSR DSTAT
DSPTCH: BIT STATE ;WHAT STATE ARE WE IN
BMI PAUSE ;S.PAUS=80
BVC SELECT ;S.SEL=0
JMP PLAY ;MUST BE PLAY (S.PLAY=40)
PAUSE: LDY PAUST ;CHECK PAUSE TIMER
BEQ 20$ ;TIMED OUT
DEC PAUST ;RUN IT
BNE 45$ ;STILL RUNNING, RETURN
;WE ONLY COME HERE ON A 1->0 TRANSITION OF PAUST
LDA MINUTE
BNE 15$ ;PLENTY OF TIME
LDA SECOND
BEQ 5$ ;NONE AT ALL, GO TO ATTRACT
CMP I,31 ;CHECK FOR 30 SEC MARK
BCS 15$ ;NOT YET
LDA W30TIM ;CHECK WARNING TIMER
BNE 15$ ;NOT TO BOTHER
LDA I,60. ;ELSE START IT
STA W30TIM
LDA I,M.GAO ;"GAME ALMOST OVER"
BNE 10$ ;ALWAYS
5$: STA ATRACT ;TIME'S UP, INTO ATTRACT
LDA I,M.GO ;"GAME OVER"
10$: JSR WRITEB ;TELL BOTH PLAYERS
15$: JSR HUDDLE ;IN ANY CASE, PUT PLAYERS IN HUDDLE
;BELOW IS DONE WHENEVER PAUST = 0
20$: LDA OLDOFF ;SEE IF OFFENSE HAS CHANGED
CMP OFFENS
BEQ 30$ ;THEY'RE OK, SKIP IT
JSR CHANGE ;ELSE CHANGE TEAMS
LDA I,30.
STA STPCLK ;STOP CLOCK WHILE THEY GET IN PLACE
RTS
;BELOW IS DONE WHEN PAUST = 0 AND TEAMS ARE OK
30$: LDA W30TIM ;CHECK 30 SEC WARNING TIMER
LSR ;0 OR 1?
BNE 32$ ;NO, RUN IT
STA BEEP ;ELSE KEEP IRRITATING SOUND OFF
BEQ 40$ ;GO TO SELECT STATE
32$: DEC W30TIM ;ELSE RUN TIMER
AND I,2 ;USE MIDDLE BIT
BEQ 35$ ;TO TURN OFF
LDA I,1 ;AND ON
35$: STA BEEP ;BEEPER
LDA W30TIM ;GET TIMER AGAIN
CMP I,30. ;1/2 WAY?
BNE 45$ ;NO, RETURN
LDA I,M.ICTP ;"INSERT COINS TO KEEP PLAYING"
JMP WRITEB ;WRITE AND RTS
;IF ALL THIS STUFF HAS BEEN TAKEN CARE OF, ENTER SELECT STATE
40$: LDA I,S.SEL
STA STATE ;STATE=SELECT
45$: RTS
SELECT: JSR PSEL ;CHECK BUTTONS
LDA I,0
10$: STA INPLCE ;CLR INPLCE
LDX I,28.
11$: JSR EXEC
LDA AX,FLAGS ;HAS BEEN(!) IN PLACE!
BPL 12$ ;NO, SKIP
AND I,7F ;CLEAR FOR NEXT TIME
STA AX,FLAGS
INC INPLCE ;ELSE COUNT
12$: DEX
DEX
BPL 11$
LDA PSTIM
ORA PSTIM+2 ;"OR" OF INDIV TIMERS
BNE 20$ ;BRANCH IF STILL WAITING
JSR SETPOS
LDA A,HVPOS+28. ;IS BALL BLANKED?
BNE 14$ ;NO SKIP
JSR TRACK ;ELSE DOUBLE TRACKING
DEC INPLCE
14$: LDA INPLCE
CMP I,15. ;ALL IN PLACE?
BEQ 15$
JMP 30$ ;NO, SKIP
15$: LDA I,S.PLAY ;ELSE ENTER PLAY
STA STATE
LDX OFFENS ;POINT TO OFFENSE
LDA ZX,PLAYNO ;GET PLAY #
CMP I,2 ;RUNNING?
LDA I,6
BCS 17$ ;NO
LDA I,15. ;3/4 SECOND
17$: STA OFSPDT ;OF FAST OFFENSE
LDA I,1 ;SET GLOBAL FLAGS
STA WFLAG ;TO "ONE" TO SNAP
LSR ;MAKE A ZERO
STA MPSTIM ;RESET MPSTIM
STA STPCLK ;AND CLOCK-STOPPER
LDA I,0CC ;SOMEWHAT OF A THUMP
STA THUD ;FOR "HIKE" SOUND
RTS
20$: ;IF PSTIM IS NON-ZERO THEN EITHER WE ARE WAITING
;FOR A PLAYER TO MAKE AN INITIAL SELECTION, OR
;TO CHANGE SELECTION.
;
LDY MPSTIM ;MASTER-PLAY-SELECT: COUNTS DOWN FROM 11.5 SECS.
;AFTER ONE PLAYER MAKES A SELECTION.
BEQ 22$ ;0 MEANS NEITHER PLAYER HAS SELECTED YET.
DEY ;DECREMENT IT
BEQ 21$ ;BUT NOT PAST ONE
STY MPSTIM
BNE 22$ ;GO DO MESSAGES
21$: LDX I,2 ;11.5 SEC. TIMER IS ZERO: SEE IF ANYONE
LDY PSTIM+2 ;GETS A PENALTY
BMI 27$ ;GO HANDLE PENALTY
LDX I,0
LDY PSTIM
BMI 27$ ;GO HANDLE PENALTY
22$: LDA I,M.IC ;OUTPUT VARIOUS MESSAGES IN ATTRACT: "INSERT COINS"
LDY ATRACT
BPL 26$ ;BRANCH IF ATTRACT
24$:
;NOW OUTPUT "SELECT PLAY" OR "READY" MOST OF
;THE TIME SAY "SELECT PLAY", BUT IF BOTH PLAYERS
;HAVE SELECTED AND LOCKED IN (PSTIM=0), OR IF
;MPSTIM IS LESS THAN 30, I.E. LESS THAN 1.5
;SECONDS, THEN OUTPUT "READY".
LDY MPSTIM
BEQ 29$
CPY I,30.
BCC 25$
LDA PSTIM
ORA PSTIM+2
BNE 29$ ;GO OUTPUT "SELECT PLAY"
25$: LDA I,M.RDY
26$: JSR WRITEB
JMP 30$
27$: ;PENALTY!!
28$: STX TARDY
LDA I,EC.DOG
STA WHYEND
LDA I,30.
STA STPCLK ;HOLD CLOCK FOR 30 SECONDS
JMP WECASE ;LEAVE AND NEVER RETURN (ON THIS PASS)
29$:
JSR TELLEM ;FLASH "SELECT PLAY" AND "YOU ARE DEF./OFF."
30$: JSR TIMER ;RUN GAME TIMER IF RUNTIM=1
BCC 40$ ;NO CHANGE
JSR DTIME ;DISPLAY IT
LDA MINUTE
ORA SECOND
BNE 40$
LDA ATRACT ;IN ATTRACT?
BPL 40$ ;YES, SKIP FLOGGING OF DEAD HORSE
35$: JMP EP.ABT ;SET ATTRACT
40$: RTS
PLAY: LDA ATRACT ;ATTRACT?
BMI 2$ ;NO, GAME
LDA I,M.ECAT ;EACH COIN ADDS TIME
JSR WRITEB ;ALTERNATE MESSAGES
2$: LDX I,28.
3$: JSR EXEC ;EXECUTE "PROGRAM" FOR THIS OBJECT
LDA AX,FLAGS ;RESET COLLISION FLAGS
AND I,0FA ;TO PREPARE FOR COLCHK
STA AX,FLAGS
DEX
DEX ;DOWN TO NEXT OBJECT
BPL 3$
LDX I,28.
37$: JSR COLCHK ;COLLISION CHECK
LDA WHYEND ;ABORT?
BNE 38$ ;YES
DEX
DEX
BNE 37$
38$: LDA OFSPDT
BEQ 35$
DEC OFSPDT
35$: LDA OFFENS
EOR I,2
TAX
LDY ZX,CTLPTR ;POINT TO MONSTER-MAN
BMI 39$
JSR PSCRIM ;PAST SCRIMMAGE?
BNE 39$ ;NO,SKIP
LDA WFLAG
AND I,2
BNE 39$
LDA I,EC.OS ;OFF SIDES
STA WHYEND
BNE WECASE ;ALWAYS
39$: JSR PASSQ ;CHECK FOR PASS SWITCH
LDY HASBAL ;WHO HAS THE BALL?
BMI WECASE ;NOBODY, BRANCH TO CASE STMT.
SEI
LDA AY,HPOSL
STA A,HPOSL+28. ;BALL IS OBJECT 14. (PLAYERS ARE 0-13)
LDA AY,HPOSH
STA A,HPOSH+28.
LDA AY,VPOS
STA A,VPOS+28. ;SET BALL POSN FOR BEING "CARRIED"
CLI
JSR CKGOAL ;CHECK BALL CARRIER AGAINST GOAL'S
;IMPLEMENT CASE (WHYEND) OF WETAB
WECASE: LDA WHYEND
CMP I,NCASES
BCC 1$
BRK
1$: ASL
TAX
LDA AX,WETAB+1
PHA
LDA AX,WETAB
PHA
CASRET: RTS
WETAB: .WORD EP.NUL-1,EP.SG-1,EP.TKL-1,EP.INC-1,EP.INT-1,EP.OOB-1
.WORD EP.TDD-1,EP.TDO-1,EP.SAF-1,EP.TB-1,EP.OS-1,EP.DOG-1
NCASES =.-WETAB/2
EP.NUL: JSR TIMER ;PLAY NOT OVER, JUST DO TIMER
BCC CASRET ;SKIP IF NO CHANGE
JMP DTIME ;ELSE DISPLAY IT AND RETURN
.SBTTL END OF PLAY
EP.DOG: LDX TARDY
BPL EP.PEN ;ALWAYS
EP.OS: LDA OFFENS
EOR I,2
TAX ;PT TO DEFENSE
EP.PEN: DEC DOWN ;COMPENSATE FOR AUTO-INC
JSR PENAL5 ;5 YD PENALTY
EP.INC: LDA I,30.
STA STPCLK ;STOP CLOCK
BNE EP.C1
EP.SG: LDA FRAME ;"RANDOM" #
AND I,2 ;PICK A PLAYER
STA OFFENS ;MAKE HIM OFFENSE
LDA I,-1 ;CAN'T MATCH
STA OLDOFF ;SO FORCES RE-WRITE
;GAME START IS PHONY TO
EP.TDD: JSR FLIP ;TD BY DEFENSE, FLIP SIDES, THEN DO TD STUFF
EP.TB: ;AS IS TOUCHBACK
EP.SAF: ;SAFETY TREATED LIKE TD
EP.TDO: JSR KIKOFF ;RESET ON 20
JMP EP.COM ;RE-ENTER COMMON CODE
EP.INT: JSR SETBAL ;INTERCEPTION, SET SCRIMMAGE LINE
JSR FLIP ;FLIP OFFENSE/DEFENSE
JMP EP.COM ;ENTER COMMON CODE
EP.OOB: LDA I,30. ;OUT-OF-BOUNDS, STOP CLOCK
STA STPCLK
EP.TKL: JSR SETBAL ;SET LINE OF SCRIMMAGE
EP.C1: LDA SCRIMH
CMP A,FDHPOS ;FIRST DOWN LINE
LDA SCRIMH+1 ;GET WHOLE YDS OF SCRIMMAGE LINE
SBC A,FDHPOS+1 ;"COMPARE" DISTANCE FROM SCRIM. TO FIRST DOWN
LDX OFFENS ;CHECK PLAYER #
LDA AX,FDDIR
ADC I,0 ;BC(C/S)
BNE 6$ ;DIDN'T MAKE IT
3$: JSR CFD ;COMPUTE FIRST DOWN
JMP EP.COM ;& RE-ENTER COMMON CODE
6$: INC DOWN ;BUMP DOWN.
LDA DOWN ;AND CHECK IT
CMP I,5
BCC EP.COM ;BRANCH IF DOWN<5
JSR FLIP ;ELSE FLIP SIDES
EP.COM: LDX WHYEND ;FIND OUT WHY PLAY ENDED
LDA AX,CHTAB-1
CMP CHEER
BCC 10$
STA CHEER
10$: LDA AX,ENDMES-1 ;PICK AN APROPRIATE MESSAGE
JSR WRITEB ;TELL THE PLAYERS
JSR STATS ;UPDATE STATS
EP.ABT: LDA I,-1 ;ABORT ENTRY POINT, FOR TIME-OUT IN SELECT
STA PSTIM ;RESET PLAY-SELECT TIMERS
STA PSTIM+2
STA HASBAL ;RESET BALL POSSESSION
STA REC1 ;RESET
STA CTLPTR ;RESET CONTROLLED MEN
STA CTLPTR+2
STA PSFLAG ;SET "ALLOW PASS"
LDA I,0
STA WFLAG ;RESET GLOBAL FLAGS
STA WHYEND
STA MPSTIM ;RESET MASTER P.S. TIMER
STA LEDWD ;DOUSE LEDS
STA LEDWD+2
LDX I,28.
1$: STA ZX,OP
DEX
DEX
BPL 1$
LDX I,2
2$: TXA
EOR FRAME
ADC ZX,PLAYNO
AND I,3
STA ZX,PLAYNO
DEX
DEX
BPL 2$
LDA I,60
STA WHISTL ;BLOW REF'S WHISTLE
LDY I,20. ;1 SEC. PAUSE
8$: STY PAUST ;SET PAUSE TIMER
LDA I,S.PAUS
STA STATE ;STATE= PAUSE
RTS
ENDMES: .BYTE M.BAN1,M.TKL,M.INC,M.INT,M.OOB,M.TD,M.TD,M.SAF,M.TB,M.OS,M.DOG
CHTAB: .BYTE 0,20,20,40,10,240.,240.,120.,40,0,0
FDDIR: .BYTE -1 ;-1+ CARRY= 0 (BCS FOR #0)
FDINC: .BYTE 10.,0,-10. ;MOVE 0 RIGHT; BCC FOR #2; MOVE 2 LEFT
KIKOFF: LDA I,30. ;20 YD LINE IS 30 FROM END
LDY I,20
LDX OFFENS ;CHECK WHO WILL BE DEFENSE
BNE 1$ ;#2 WILL BE, LEAVE ON HIS 80
LDY I,0E0
LDA I,FL-30. ;ELSE MOVE TO END OF FIELD
1$: STA SCRIMH+1
STY SCRIMH ;LOW BYTE
LDA I,132. ;CENTER OF FIELD, VERTICALLY
STA SCRIMV
;NOW FALL THROUGH TO FLIP OFFENSE/DEFENSE
FLIP: LDA OFFENS ;GET POINTER TO OFFENSE
EOR I,2 ;FLIP IT
STA OFFENS
;FALL THROUGH TO COMPUTE FIRST DOWN & RTS
CFD: LDA I,1
STA DOWN ;RESET DOWN
LDX OFFENS ;POINT TO OFFENSE
LDA SCRIMH
STA A,FDHPOS
LDA SCRIMH+1
CLC
ADC AX,FDINC ;OFFSET TOWARDS CORRECT GOAL
STA A,FDHPOS+1
LDA A,FDHPOS ;CHECK FOR
CMP AX,GOALIN ;PAST GOAL
LDA A,FDHPOS+1
SBC AX,GOALIN+1
LDA AX,FDDIR
ADC I,0
BNE 1$ ;NOT, PAST, OK
LDA AX,GOALIN ;ELSE SET
STA A,FDHPOS
LDA AX,GOALIN+1
STA A,FDHPOS+1
1$: LDA AX,FDINC
AND I,40
EOR I,11 ;MAKE 11 FOR #0,51 (FLIPPED) FOR PLAYER #2
STA A,BHPICT+2 ;FIRST DOWN MARKER
LDA I,30 ;SMALL CHEER
STA CHEER ;FOR FIRST, IF NOTHING ELSE
RTS
.SBTTL CHECK GOAL
;Y=BALL CARRIER, BLITZ A,X SET WHYEND=2 IF GOAL 5 IF SAFETY
CKGOAL: LDX I,2 ;CHECK BOTH GOALS
1$: LDA AY,HPICT
STA K ;SAVE FOR OFFENSE/DEFENSE CHECK
LDA AY,HPOSL
CMP AX,GOALIN ;COMPARE POSN TO CORRECT GOAL
LDA AY,HPOSH
SBC AX,GOALIN+1
LDA AX,FDDIR
ADC I,0
BNE 20$ ;OUTSIDE GOAL
TXA
EOR HASBAL
AND I,2 ;IS BALL CARRIER ON TEAM(X)
BEQ 11$ ;IF SO SAY TOUCHDOWN
LSR K ;C SET IF OFFENSE
BCS 5$
LDA WHYEND
CMP I,EC.INT ;INTERCEPTION?
BNE 20$ ;NO, SKIP
LDA I,EC.TB ;TOUCHBACK
BNE 15$ ;ALWAYS
5$: LDA WHYEND
CMP I,EC.TKL ;TACKLE?
BEQ 6$
CMP I,EC.OOB ;OUT-OF-BOUNDS
BNE 20$ ;NO, SKIP
6$: LDA I,2
STA POINTS
LDA I,EC.SAF ;SAFETY
BNE 15$ ;ALWAYS***
11$: LDA I,EC.TDD ;END-OF-PLAY, TOUCHDOWN
LSR K
ADC I,0 ;MAKE EC.TDO IF OFFENSE
STA WHYEND
LSR ;C=0 IF DEF
TYA
AND I,1C
EOR I,14 ;QB?
BEQ 12$ ;YES 7 POINTS
CLC ;ELSE 6 POINTS
12$: LDA I,43
ROL ;6 OR 7 (WITH D7 SET FOR "OFFENSE")
STA POINTS
RTS
15$: STA WHYEND
20$: DEX
DEX
BPL 1$
RTS
GOALIN: .WORD 110.*256.+20,10.*256.+0E0 ;GOALS FOR 0,2
;Y=PLAYER TO CHECK, RETURNS Z=1 IF PAST SCRIMMAGE LINE
PSCRIM: TYA
AND I,2
TAX
LDA AY,HPOSL
CMP SCRIMH
LDA AY,HPOSH
SBC SCRIMH+1
LDA AX,FDDIR
ADC I,0
RTS
.SBTTL PASS?
;
;DECIDES WHETHER OR NOT TO PASS, BY LOOKING AT PLAY-SELECT BUTTON IN GAME
;PLAY, OR FAKING IT IN ATTRACT. TO PASS, IT SETS GLOBAL FLAG 10 (D4 IN
;WFLAG) WHICH IS CHECKED BY EXEC WHILE BALL-OPCODE=PASS. NOTE THAT SINCE
;PLAY-SELECT IS USED TO START PASS, THERE MAY BE A CONFLICT
;WITH USE OF OSSTAT. THIS SHOULD BE CAREFULLY CHECKED IF
;CHANGES ARE MADE
;
PASSQ: LDA WFLAG ;GET GLOBAL FLAGS
AND I,2 ;BALL SNAPPED YET?
BEQ 10$ ;NO, RETURN
LDA ATRACT ;IN ATTRACT
BPL 10$ ;YES, LET EXEC FAKE IT
LDX OFFENS ;POINT TO OFFENSE
LDY ZX,CTLPTR
BMI 10$ ;NO JOYSTICK PLAYER, SKIP
JSR PSCRIM
BNE 4$
STA PSFLAG ;KILL PASS OPTION
4$: LDA PSFLAG ;IS PASS STILL ALLOWED?
BEQ 10$ ;NO, RETURN
LDY ZX,SWSTAT
TYA
EOR ZX,OSSTAT
AND ZX,OSSTAT
STY ZX,OSSTAT ;CATCH EDGES ON PLAYER CTLS
AND I,10 ;PLAY SELECT BUTTON
BEQ 10$ ;NOT YET
ORA WFLAG ;ELSE SET GLOBAL FLAG 10
STA WFLAG
10$: RTS
.SBTTL SET POSITION
SETPOS: TXA
PHA
LDX I,28.
10$: LDA ZX,OP ;CHECK OP-CODE
BEQ 20$ ;THIS MAN STILL ON END
CMP I,16. ;MOVE?
BCS 15$ ;YES, DO IT
CMP I,2 ;WAIT?
BNE 20$ ;NO, SKIP IT
15$: LDA AX,HGOAL ;SET POSITION=GOAL
STA AX,HPOSL
LDA AX,HGOAL+1
STA AX,HPOSH
LDA AX,VGOAL
STA AX,VPOS
LDA I,0
STA AX,VPOSL
20$: DEX
DEX
BPL 10$
30$: PLA
TAX
RTS
STATS: LDA SCRIMH
CMP A,FDHPOS
LDA SCRIMH+1
SEC
SBC A,FDHPOS+1 ;GET DIST TO GO FOR FIRST
BPL 1$ ;CAN NOT BE TRUELY NEGATIVE HERE
EOR I,-1 ;SO INVERSION IS DUE TO THIS BEING
CLC ;PLAYER ZERO, AND CAN BE CORRECTED
ADC I,1 ;WITHOUT LOSING INFORMATION
1$: BNE 15$
LDA I,1 ;1 YD IS MINIMUM
15$: LDY I,0
CMP I,100.
BCC 2$
INY ;HUNDREDS DIG. IN Y
SBC I,100. ;OUT OF ACC
2$: STY DTG+1 ;SAVE HUNDREDS
LDY I,-1 ;PRE-CLEAR "TENS"
SEC
3$: INY ;INC 10'S
SBC I,10. ;RESTORATIVE, ITERATIVE DIVIDE (YECCH!!)
BCS 3$ ;LOOP TILL WE GET A BORROW
4$: ADC I,10. ;PUT BACK THAT LAST 10
STA J
TYA
ASL
ASL
ASL
ASL ;SHIFT UP TENS
ORA J ;PUT UNITS IN
STA DTG ;SAVE AS DECIMAL TO GO
LDX OFFENS ;POINT TO PRESENT OFFENSE
LDA I,0
LDY POINTS ;GET POINTS FOR THIS ENDING
STA POINTS ;CLEAR IT
BPL 5$ ;IF D7=1, GIVE TO THIS PLAYER
TXA
EOR I,2 ;ELSE FLIP PLAYER
TAX
5$: TYA
AND I,7F ;CLEAR FLAG
BEQ 6$ ;NO POINTS
LDY I,30 ;ELSE STOP
STY STPCLK ;CLOCK
BIT ATRACT ;ATTRACT?
BPL 6$ ;YES, DON'T UPDATE SCORE
SED
CLC
ADC ZX,SCORE ;ADD INTO APPROPRIATE SCORE
STA ZX,SCORE
LDA I,0
ADC ZX,SCORE+1
STA ZX,SCORE+1
CLD
6$: JMP DSTAT ;DISPLAY STATISTICS & RTS
.SBTTL PENALTY
;USES ALL REGS, J; SETS SCRIMH (2 BYTES)
PENAL5: TXA ;PTR TO PLAYER TO PENALIZE
EOR I,2
TAX ;PTR TO HIS OPPONENT
LDA AX,GOALIN
SEC
SBC SCRIMH
STA J
LDA AX,GOALIN+1
SBC SCRIMH+1
TAY
BPL 10$
LDA J ;ELSE TAKE ABS.
EOR I,-1
CLC
ADC I,20
TYA
EOR I,-1
ADC I,0
10$: CMP I,10. ;!DIST FROM GOAL!<10?
BCC 12$ ;YES, USE HALF OF IT
LDA I,0
STA J ;SET LSB'S=0
CPY I,80 ;C<-SIGN OF MSBS
LDY I,10. ;ASSUME POSITIVE
BCC 12$ ;BRANCH IF SO
LDY I,-10. ;ELSE SET NEG
12$: TYA
CMP I,80 ;ASR (Y,J)
ROR
TAY
LDA J
ROR
CLC
ADC SCRIMH
STA SCRIMH
TYA
ADC SCRIMH+1
STA SCRIMH+1
JSR INITL ;MOVE ALREADY SET-UP PLAYERS
TXA
EOR I,2 ;BACK TO CULPRIT
TAX
LDA ZX,PSTIM ;DID HE SELECT AT ALL YET
BMI 2$ ;NOPE, SKIP IT
JSR INITL ;ELSE SET HIM UP IN LAST FORMATION
2$: JSR HUDDLE ;SET HUDDLE ANYWAY (CAN'T HURT)
JSR SETPOS
RTS
FANS:
10$: LDA CHEER+1 ;GET PRESENT CHEER
CMP CHEER ;COMPARE TO DESIRED
BCS 12$ ;IF PRESENT GREATER, DEC
ADC I,20 ;ELSE RUN QUICKLY UP
BCC 18$ ;BRANCH NO WRAP
LDA I,0FF ;ELSE SET MAX AND FALL THROUGH TO RESET
12$: LDY I,0
STY CHEER ;RESET DESIRED
SBC I,3 ;DECREASE SLOWLY
BCS 18$ ;BRANCH NO WRAP
LDA I,0 ;ELSE SET MIN
18$: STA CHEER+1 ;SAVE PRESENT
LSR
LSR
LSR
LSR
BNE 21$
LDA I,1 ;KEEP SOME SOUND
21$: STA CROWD
RTS
.SBTTL PLAYER-CONTROLS
;*************************
;*
;*PLAY SELECTION
;*
;***************************
;
;DESCRIPTION:
; IN GAME:
; -ONCE PER PUSH OF "PLAY-SELECT" BUTTON, ROUTINE
; 1) SETS PSTIM=10.
; 2) SETS CHGFLG & MPSTIM, IF NOT ALREADY RUNNING
; 3) INCREMENTS PLAYNO(X)
; 4) REDUCES PLAYNO(X),MODULO NPLAYS
; 5) SETS LED WD(X) TO LIGHT LAMPS
; 6) CALLS INITL TO SET-UP MEN
; -REGARDLESS OF BUTTON; DECREMENT PSTIM(X) IF >0
; IN ATTRACT:
; -FAKES BUTTON-PRESSING WITH PAUST AS "RANDOM" #,
; THEN DOES ALL ABOVE STUFF.
;REGISTERS:
; IN: DON'T CARE
; OUT: X=-2, A&Y-BLITZED
;
;
;STACK USE: 2 BYTES FOR RTN ADDR. OF CALLER
; +6 BYTES USED BY INITL IF CALLED
; =8 TOTAL
;
;
;BASE PAGE USE: READ: SWSTAT
; MODIFY: OSSTAT, PLAYNO,CHGFLG,MPSTIM,PSTIM
; WRITE: LEDWD
; TEMP: -NONE-
PSEL: LDX I,2
LDA I,0
STA LEDTMP
1$: LDA ATRACT ;IN ATTRACT?
BMI 5$ ;NO, GAME
LDA ZX,PSTIM ;TIMER STARTED?
BPL 14$ ;YES, RUN IT
BMI 15$ ;ELSE, SELECT IMMEDIATELY
;IN GAME BLINK LICONS, LOOK AT BUTTONS
5$: LDA Z,FRAME ;FLASH LICON LEDS
LSR
LSR
7$: LDY ZX,PSTIM
BNE 11$
CLC
11$: ROL LEDTMP
LDY ZX,SWSTAT ;GET NEW
TYA ;SWITCH STATUS
EOR ZX,OSSTAT ;CMP TO OLD
AND ZX,OSSTAT ;CHG TO 0?
STY ZX,OSSTAT
AND I,10 ;SELECT SWITCH
BNE 15$ ;PRESSED, SELECT PLAY
12$: LDA ZX,PSTIM ;CHECK TIMER
BMI 50$ ;NOT STARTED, SKIP IT
14$: BEQ 50$ ;TIMED OUT, SKIP
DEC ZX,PSTIM ;RUN IT
BPL 50$ ;ALWAYS
15$: LDA MPSTIM ;MASTER TIMER RUNNING?
BNE 17$ ;YES, SKIP IT
LDA I,230. ;ELSE SET TO 230
STA MPSTIM ;FOR 11.5 SECOND INTERVAL
17$: CMP I,30. ;NEAR END?
BCS 19$ ;NO, ALLOW SELECTION
LDA ZX,PSTIM ;HAS HE SELECTED?
BEQ 50$ ;YES, LOCK IT IN
19$: LDA I,30.
STA ZX,PSTIM ;PSTIM:=30. (FOR 1.5 SECOND)
;PLAYNO(X):=MOD(PLAYNO+1,NPLAYS)
20$: INC ZX,PLAYNO ;BUMP PLAYNO
LDA ZX,PLAYNO
AND I,3 ;MODULO 4
30$: STA ZX,PLAYNO
TAY
SEC
LDA I,0
31$: ROL
DEY
BPL 31$
33$: STA ZX,LEDWD ;LEDWD(X)-2**(PLAYNO(X)-1)
LDA ZX,PSTIM
BMI 50$
JSR INITL ;INIT. MEN
JSR SETPOS
50$: DEX
DEX
BPL 1$
LDA LEDTMP
STA LEDWD+1
RTS
.SBTTL UTILITIES
.SBTTL CLEAR ALPHANUMERICS
CAN: LDX I,128.
LDA I,0
1$: STA AX,ALPHR
STA AX,ALPHL
DEX
BPL 1$
RTS
;DISPLAY TIME ON BOTH ENDS
DTIME: LDY I,53 ;POSITION FOR TIME
1$: LDA MINUTE
JSR ASCAX
CMP I,'0
BNE 2$
LDA I,0
2$: JSR WRTAN
TXA
JSR WRTAN
LDA I,':
JSR WRTAN
LDA SECOND
JSR ASCAX
JSR WRTAN
TXA
JSR WRTAN
CPY I,58
BNE 3$
LDY I,0CA
BNE 1$
3$: RTS
ASCAX: PHA
AND I,0F ;ISOLATE LOW NYBBLE
CMP I,10. ;A-F?
BCC 1$ ;NO, SKIP
ADC I,6. ;ELSE ADD 7 (6+CARRY)
1$: ADC I,'0 ;MAKE ASCII
TAX ;X:=LOW NYBBLE
PLA
LSR
LSR
LSR
LSR
CMP I,10.
BCC 2$
ADC I,6
2$: ADC I,'0
RTS
.SBTTL IDENTIFY OFFENSE
TELLEM: LDX I,2 ;FOR PLAYER=2,0
10$: LDA I,M.OFF ;ASSUME OFFENSE
CPX OFFENS ;IS THAT SO?
BEQ 20$ ;YES, SAY SO
LDA I,M.DEF ;ELSE SAY DEFENSE
20$: LDY ZX,PSTIM ;HAS HE SELECTED ONCE(AT LEAST)
BPL 30$ ;YES LEAVE IT AT THAT
BIT INTCNT ;ELSE FLASH
BMI 30$ ;AT ABOUT 1 HZ
LDA I,M.SP ;"SELECT PLAY"
30$: JSR REPLAC ;REPLACE CURRENT WITH NEW
DEX
DEX ;NEXT PLAYER
BPL 10$ ;IF HE EXISTS
RTS
.SBTTL DISPLAY STATISTICS
DSTAT: LDX I,3 ;START ON RIGHT
1$: STX K
LDY AX,SCRPTR ;GET PTR TO DST
TXA
LSR ;SET C IF DOING "TO GO"
LDA ZX,SCORE+1 ;HIGH BYTE OF SCORE
BCC 15$
LDA DTG+1
15$: BEQ 3$ ;0, SKIP IT
JSR ASCAX ;CONVERT TO ASCII
CMP I,'0 ;HIGH NYBBLE "0"
BEQ 2$ ;YES, DON'T WRITE IT
JSR WRTAN
2$: TXA ;LOW NYBBLE
JSR WRTAN ;WRITE LOW
3$: LDX K ;GET BACK PTR
4$: TXA
LSR
TYA
EOR AX,SCRPTR ;HAS POINTER MOVED
BEQ 5$ ;NO, SUPPRESS 0'S
LDA ZX,SCORE
BCC 45$
LDA DTG
45$: JSR ASCAX
JSR WRTAN ;ELSE PRINT BOTH
JMP 6$
5$: LDA ZX,SCORE
BCC 55$
LDA DTG
55$: JSR ASCAX
CMP I,'0 ;HIGH NYBBLE=0, SKIP IT