]> github.com/historicalsource and other repositories - asteroids-7800.git/blob - HISCORE.S
Initial import.
[asteroids-7800.git] / HISCORE.S
1 *         1415    280384\r
2 *\r
3 ** HISCORE.S\r
4 ** ASTEROIDS FOR THAT DAMN ATARI 3600, OR IS IT 7000, I FORGET. *\r
5 ** WRONG!! IT'S THE ATARI 7800 PRO SYSTEM.  TA DA! *\r
6 ** THIS FILE CONTAINS THE HANDLERS FOR THE INTERFACE TO THE HISCORE CART *\r
7 **  UPDATED TO HSC REV 7.X *\r
8 \r
9 * HSCINIT -- INITIALIZE HIGH SCORE CART DATA.  DOES HSCSTAT.\r
10 * RETURNS > 0 IF NO HSC EXISTS, < 0 IF ENTRY NOT FOUND, ZERO IF OK\r
11 HSCINIT:\r
12         JSR     HSCSETDM        ;SET UP DIFF/MODE LEVEL ARGUMENT\r
13 HSCINIT2:\r
14         LDA     #$C6            ;CHECK EXISTANCE.\r
15         CMP     $3900\r
16         BNE     NOHSC\r
17         LDA     #$FE\r
18         CMP     $3904\r
19         BNE     NOHSC\r
20 \r
21         LDX     #$0E            ;COPY HSC ROM INTO RAM ARGUMENT BLOCK\r
22 HSCCOPY:\r
23         LDA     HSCROM,X\r
24         STA     HSCRAM,X\r
25         DEX\r
26         BPL     HSCCOPY\r
27 \r
28         LDA     TEMP            ;INSTALL LEVEL ARGUMENT\r
29         ASL\r
30         ASL\r
31         STA     HSCRAM+2\r
32 \r
33 ;       LDX     #L(HSCRAM)      ;WHY BOTHER; HSC TRASHES X ANYWAY\r
34         LDY     #HSCRAM >> 8\r
35         JMP     HSCSTAT\r
36 \r
37 NOHSC:\r
38         LDA     #1              ;POSITIVE NUMBER = NO HIGH SCORE\r
39         RTS\r
40 \r
41 * HSSUCK -- SUCK IN HIGH SCORE, IF AVAILABLE.  IF NOT ZAP IT OUT.\r
42 HSCSUCK:\r
43         JSR     ZEROHS          ;FIRST ZAP IT OUT\r
44         JSR     HSCINIT         ;SUCK IN HIGH SCORE, IF AVAILABLE\r
45         BNE     NOHSC\r
46         LDX     #3\r
47 SUCKHSIN:\r
48         LDA     HSCRAM+$F,X\r
49         STA     HISCORE,X\r
50         DEX\r
51         BPL     SUCKHSIN\r
52         RTS\r
53 \r
54 * HSCSHOW -- DISPLAY ONE DIFF/MODE LEVEL\r
55 HSCSHOW:\r
56         JSR     HSCINIT2        ;USE INIT2 SO NOT TO DISTURB TEMP VAL\r
57         BNE     NOHSC\r
58 \r
59         LDX     HSCRAM+4        ;COMPUTE DISPLAY TIMES FOR EACH LEVEL\r
60         CPX     #5              ;USE MINIMUM TIME IF >= 5 ENTRIES\r
61         BCC     ZNHSOK\r
62         LDX     #5\r
63 ZNHSOK:\r
64         LDA     HSTIME,X        ;TABLE LOOKUP FOR DISPLAY TIME\r
65         STA     HSCRAM+$E\r
66 \r
67         LDA     TEMP            ;TEMP CONTAINS THE DIFF/MODE LEVEL\r
68         ASL                     ; SHIFT UP FOR ARG FORMAT\r
69         ASL\r
70         STA     HSCRAM+2\r
71 \r
72         JSR     HSCDM           ;PUT UP OUR OWN DIFFICULTY/MODE NAMES\r
73         JSR     ONTITLE         ;PUT UP THE LOGO\r
74 \r
75         JSR     WAITLOAD        ;WAIT FOR LOADER TO UPDATE\r
76         LDA     #$60            ;TURN OFF DMA NOW, SO WE DON'T GET\r
77         STA     CTRL            ; A GLITCHY SCREEN IN BETWEEN\r
78         LDA     #$40            ;TELL NMI HANDLER TO DO FANCY\r
79         STA     NMICTRL         ; ALTERNATING READ MODES ON CTRL\r
80 \r
81 ;       JSR     OLDBUTON        ;GO BACK TO ONE BUTTON MODE\r
82 ;       LDX     #L(HSCRAM)\r
83         LDY     #HSCRAM>>8\r
84         JSR     HSCATRCT\r
85 ;       JSR     NEWBUTON        ;REVERT TO WHATEVER MODE WAS BEFORE\r
86 \r
87         RTS\r
88 \r
89 * HSCDOENT -- DO CALLS TO HSCENTER FOR ALL PLAYERS WHAT NEEDS IT\r
90 HSCDOENT:\r
91         JSR     HSCINIT         ;SET UP HSC\r
92         BEQ     ZHSENTOK        ;DOES THE HSC EXIST?\r
93         BPL     NOHSC           ;NO.  DO NOTHING.\r
94 ZHSENTOK:\r
95         LDA     HSCRAM+2        ;SET UP TEMP TO DM VALUE\r
96         LSR\r
97         LSR\r
98         STA     TEMP\r
99 \r
100         JSR     HSCDM           ;PUT UP DIFF/MODE INDICATORS\r
101         JSR     ONTITLE         ;PUT UP THE LOGO\r
102 \r
103         LDA     MODE            ;SET UP ENTER DELAY FOR THIS MODE\r
104         LSR\r
105         BCC     ZNOWAIT         ;ON EVEN MODES, DON'T WAIT HERE.\r
106         LDA     #10             ;ON ODD MODES, WAIT 10 SECONDS.  THERE\r
107         STA     HSCRAM+$E       ; IS ONLY ONE SCORE BEING ENTERED.\r
108 ZNOWAIT:\r
109         LDA     MODE            ;IF IN ONE PLAYER MODE JUST\r
110         BMI     ZHSCENT         ;  DO THIS ONE.\r
111 \r
112         LDX     #0              ;PICK HIGHER OF THE TWO FIRST!\r
113 ZCOMPLOP:\r
114         LDA     SCORE,X         ; COMPARE EACH DIGIT OF P1 SCORE\r
115         CMP     SCORE+4,X       ;  AGAINST EACH DIGIT OF P2 SCORE\r
116         BEQ     ZP2EQU          ; P1 EQUALS P2, MOVE ON TO NEXT DIGIT\r
117         BCS     ZPNGO           ; P1 > P2, LET P1 ENTER\r
118 ZP2GO:                          ; P2 > P1, LET P2 ENTER\r
119         INC     HSCRAM+2        ; TOGGLE PLAYER BIT TO P2\r
120         LDA     #SCORE2 & 255   ; CHANGE TO P2 SCORE\r
121         STA     HSCRAM+8\r
122 ZPNGO:\r
123 \r
124         LDA     MODE            ;IN TEAMPLAY MODE, USE COMBINED SCORE\r
125         CMP     #1\r
126         BNE     ZHSCENT\r
127         LDA     #COMBSCOR & 255\r
128         STA     HSCRAM+8        ;LOW ADDR OF SCORE PTR.  HI ADDR = 0 ZP\r
129 \r
130 ZHSCENT:\r
131         JSR     WAITLOAD        ;WAIT FOR LOADER TO UPDATE\r
132         LDA     #$60            ;TURN OFF DMA NOW, SO WE DON'T GET\r
133         STA     CTRL            ; A GLITCHY SCREEN IN BETWEEN\r
134         LDA     #$40            ;TELL NMI HANDLER TO DO FANCY\r
135         STA     NMICTRL         ; ALTERNATING READ MODES ON CTRL\r
136 \r
137 ;       JSR     OLDBUTON        ;GO BACK TO ONE BUTTON MODE\r
138 ;       LDX     #L(HSCRAM)\r
139         LDY     #HSCRAM >> 8\r
140         JSR     HSCENTER\r
141 ;       JSR     NEWBUTON        ;REVERT TO WHATEVER MODE WAS BEFORE\r
142 \r
143         LDA     HSCRAM+$E       ;CHECK DELAY TIME:\r
144         BNE     ZHSCRTS         ; IF NOT ZERO, WE'RE DONE.\r
145 \r
146         LDA     #10             ;SET DELAY TIME TO FINAL DELAY.\r
147         STA     HSCRAM+$E\r
148 \r
149         LDA     HSCRAM+2        ;CHECK PLAYER BIT TO SEE WHICH PLAYER\r
150         LSR\r
151         BCC     ZP2GO           ;IF WE JUST DID P1, THEN DO P2\r
152 ZP1GO:\r
153         LDA     #SCORE & 255    ;GO BACK TO P1 SCORE\r
154         STA     HSCRAM+8\r
155         DEC     HSCRAM+2        ;GO BACK TO P1 JOYSTICK\r
156         JMP     ZHSCENT\r
157 \r
158 ZP2EQU:\r
159         INX                     ; MOVE ON TO NEXT DIGIT\r
160         CPX     #4              ; 4 DIGITS OF SCORE TO COMPARE\r
161         BEQ     ZPNGO           ; IF WE HAVE DONE ALL COMPARES, DFLT P1\r
162         BNE     ZCOMPLOP        ; IF NOT, DO NEXT COMPARE\r
163 \r
164 * HSCDM -- PUT UP DIFF/MODE ICONS ACCORDING TO VALUE OF TEMP\r
165 HSCDM:\r
166         LDA     TEMP\r
167         AND     #$03            ;GET DIFF BITS\r
168         CLC\r
169         ADC     #10\r
170         TAY\r
171         LDX     #10\r
172         JSR     DOICON\r
173         LDA     TEMP\r
174         LSR                     ;GET MODE BITS\r
175         LSR\r
176         BEQ     HSCZAPM         ;ONLY DISPLAY TEAM AND COMPETITVE PLAY\r
177         CLC\r
178         ADC     #15\r
179         TAY\r
180         INX                     ;10+1=11\r
181         JSR     DOICON\r
182 ZHSCRTS:\r
183         RTS\r
184 \r
185 HSCZAPM:\r
186         LDA     #$FF            ;ZAP OUT STATUS OF MODE ICON\r
187         STA     STATUS+11\r
188         RTS\r
189 \r
190 * HSCSETDM -- SET DIFF/MODE LEVEL ARGUMENT BASED ON DIFF AND MODE\r
191 HSCSETDM:\r
192         LDA     MODE            ;COMPUTE DIFF/MODE LEVEL VALUE BYTE\r
193         BPL     ZHSCMOK\r
194         LDA     #0\r
195 ZHSCMOK:\r
196         ASL\r
197         ASL\r
198         CLC\r
199         ADC     DIFF\r
200         STA     TEMP            ;SAVE IT WHERE WE CAN INSERT LATER\r
201         RTS\r
202 \r
203 * GO TO OLD ONE-BUTTON MODE FOR WAT'S HISCORE CART\r
204 ;OLDBUTON  LDA  #$FF\r
205 ;ZOLDSTOR  STA  SWCHB\r
206 ;           RTS\r
207 * GO BACK TO PREVIOUS STATE\r
208 ;NEWBUTON  LDA  ONEBUT\r
209 ;           BPL ZOLDSTOR\r
210 \r
211 ; THIS TABLE IS COPIED INTO RAM WHEN HSC IS CALLED.  IT'S THE ARGUMENT BLOCK\r
212 ;           NEEDED BY THE HSC.\r
213 \r
214 HSCROM:\r
215         .DC.B   $49,$6C         ; CARTRIDGE ID NUMBER\r
216 \r
217         .DC.B   $00             ; DIFFICULTY LEVEL\r
218                                 ;  + PLAYER NUMBER (BOTTOM 2 BITS)\r
219 \r
220         .DC.B   $01             ; CONTROLLER TYPE\r
221 \r
222         .DC.B   $00,$00         ; GAME NAME; WE USE OUR OWN LOGO.\r
223 \r
224         .DC.B   $00,$00         ; DIFFICULTY NAME; WE USE OUR OWN.\r
225 \r
226         .DC.W   SCORE           ; POINTER TO THE SCORE\r
227 \r
228         .DC.W   HSCDLL          ; POINTER TO DLL\r
229 \r
230         .DC.W   LOGOBARS        ;SOUND ROUTINE. WE USE THIS TO TWINKLE\r
231                                 ;  OUR LOGO BARS WHILE OFF SCREEN.\r
232 \r
233         .DC.B   $00             ; SECONDS TO WAIT BEFORE RETURNING\r
234                                 ;  (FOR EACH DIFFICULTY LEVEL)\r
235 \r
236 * HSCDLL -- DLL FOR HSC DISPLAY.  MERELY A RE-ARRANGED VERSION OF DLLTAB W/DLIS\r
237 HSCDLL:\r
238         .DC.B   $8F\r
239         .DC.B   BLANKDL>>8,BLANKDL&255                  ;DLI + 16 BLANK LINES\r
240 \r
241         .DC.B   $4F\r
242         .DC.B   (GAMEDL07+4)>>8,(GAMEDL07+4)&255        ;NO DLI + MODE\r
243 \r
244         .DC.B   $4F\r
245         .DC.B   (GAMEDL04+4)>>8,(GAMEDL04+4)&255        ;NO DLI + TOP OF LOGO\r
246 \r
247         .DC.B   $4F\r
248         .DC.B   (GAMEDL05+4)>>8,(GAMEDL05+4)&255        ;NO DLI + BOTTOM OF LOGO\r
249 \r
250         .DC.B   $4F\r
251         .DC.B   (GAMEDL11+4)>>8,(GAMEDL11+4)&255        ;NO DLI + DIFF LEVEL\r
252 \r
253 * HSTIME -- TIME TO DISPLAY EACH ENTRY FOR A GIVEN TOTAL NUMBER OF ENTRIES.\r
254 HSTIME:\r
255         .DC.B   0,10,6,5,4,3\r