HISCORE.S 5.9 KB

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