KERNAL.S 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. * KERNAL THE KERNAL AND LOADER FOR MARIA MS PAC-MAN
  2. * THIS IS THE DLI FOR THE FRUIT - CHANGES COLORS FOR FRUIT
  3. DLIFRUIT LDA #RED ;ADJUST COLORS FOR FRUIT PALETTES
  4. STA Z3C1
  5. STA Z4C1
  6. LDA #WHITE
  7. STA Z3C2
  8. STA Z4C2
  9. STA Z6C2
  10. LDA #ORANGE
  11. STA Z5C1
  12. LDA #BROWN ;ADJUST COLORS FOR FRUIT PALETTES
  13. STA Z3C3
  14. STA Z5C2
  15. STA Z6C3
  16. LDA #GREEN ;ADJUST COLORS FOR FRUIT PALETTES
  17. STA Z4C3
  18. STA Z5C3
  19. STA Z6C1
  20. LDA #YELLOW ;MAKE SURE BANANA AND MS GET RIGHT CLR
  21. STA Z1C1
  22. STA Z7C1
  23. LDA #$00 ;SET 'VBLANK' TO HAPPEN NEXT
  24. STA KNLTEMP0
  25. JMP DLIOUT
  26. * MAINTAIN THE ON-SCREEN DISPLAY
  27. DLI PHA ;STACK REGISTERS
  28. TXA
  29. PHA
  30. LDA KNLTEMP0 ;SEE WHAT DLI HANDLER TO GO TO
  31. BEQ OTHERDLI
  32. BMI TOPDLIS
  33. LDX KNLTEMP1 ;'NORMAL' DLI, SEE WHICH ZONE
  34. CPX #LASTZONE
  35. BPL DLIFRUIT ;IF ZONES FINISHED, THEN SET FRUIT CLR
  36. TXA
  37. AND #$01
  38. BEQ DLI0
  39. JMP DLI1
  40. * THIS IS THE DLI FOR THE SCORE
  41. DLISCORE LDA #WHITE ;SET UP SCORE COLORS
  42. STA Z0C3
  43. LDA #ORANGE
  44. STA Z0C2
  45. LDA #BLACK
  46. STA BACKGRND
  47. * THIS ROUTINE TAKES CARE OF DLI HANDLERS WHERE THE OTHER DISPLAY LIST IS
  48. * MODIFIED WHILE THE CURRENT DISPLAY LIST IS BEING USED
  49. DLI0 LDA M0ADDR,X ;UPDATE MONSTER 0 STAMP
  50. STA DLIST0+$0D
  51. LDA M1ADDR,X ;UPDATE MONSTER 1 STAMP
  52. STA DLIST0+$11
  53. LDA M2ADDR,X ;UPDATE MONSTER 2 STAMP
  54. STA DLIST0+$15
  55. LDA M3ADDR,X ;UPDATE MONSTER 3 STAMP
  56. STA DLIST0+$19
  57. LDA SCRLOW,X ;UPDATE PLAY FIELD LOW ADDR
  58. STA DLIST0+$00
  59. LDA SCRHI,X ;UPDATE PLAY FIELD HI ADDR
  60. STA DLIST0+$02
  61. LDA MSADDR,X ;UPDATE MS STAMP
  62. STA DLIST0+$05
  63. LDA FRTADDR,X ;UPDATE FRUIT STAMP
  64. STA DLIST0+$09
  65. INC KNLTEMP1
  66. JMP DLIOUT
  67. * THIS HANDLES THE 'ODD-BALL' DLIS, VBLANK AND NULL
  68. OTHERDLI LDX KNLTEMP1 ;SEE WHAT TO DO
  69. BEQ DLIWAIT ;IF ZERO, THEN 'VERTICAL BLANK'
  70. BPL DLILAST ;IF NEGATIVE, WE ARE WAITING FOR SYNC
  71. DLIWAIT JMP DLIOUT ;WAITING FOR DLI'S TO SYNC
  72. * THIS TAKES CARE OF DLIS ON THE TOP OF THE SCREEN
  73. TOPDLIS LDX KNLTEMP1
  74. BEQ DLISCORE
  75. LDA #$01 ;SET UP FOR NORMAL DLIS
  76. STA KNLTEMP0
  77. LDA P0C3 ;RESTORE PLAYFIELD COLORS
  78. STA Z0C3
  79. LDA P0C2
  80. STA Z0C2
  81. * THIS IS THE NORMAL DLI TO SET UP FOR ODD ZONES
  82. DLI1 LDA M0ADDR,X ;UPDATE MONSTER 0 STAMP
  83. STA DLIST1+$0D
  84. LDA M1ADDR,X ;UPDATE MONSTER 1 STAMP
  85. STA DLIST1+$11
  86. LDA M2ADDR,X ;UPDATE MONSTER 2 STAMP
  87. STA DLIST1+$15
  88. LDA M3ADDR,X ;UPDATE MONSTER 3 STAMP
  89. STA DLIST1+$19
  90. LDA SCRLOW,X ;UPDATE PLAY FIELD LOW ADDR
  91. STA DLIST1+$00
  92. LDA SCRHI,X ;UPDATE PLAY FIELD HI ADDR
  93. STA DLIST1+$02
  94. LDA MSADDR,X ;UPDATE MS STAMP
  95. STA DLIST1+$05
  96. LDA FRTADDR,X ;UPDATE FRUIT STAMP
  97. STA DLIST1+$09
  98. INC KNLTEMP1
  99. JMP DLIOUT
  100. * THIS ROUTINE TAKES CARE OF THE LAST DLI ON THE SCREEN, THE 'VERTICAL BLANK
  101. * ROUTINE'.
  102. DLILAST LDA #$00
  103. STA KNLTEMP1 ;TURN DLI'S OFF TILL WE ARE DONE
  104. STA LDRTEMP7 ;NO NOTICES OF VBLANK YET
  105. TYA ;WE NEED TO STACK Y
  106. PHA
  107. JSR RAND ;UPDATE RANDOM NUMBER
  108. JSR LOADER ;LOAD UP NEXT FRAME
  109. INC RTLOCAL+1 ;INCREMENT CLOCK
  110. BNE DLITUNE
  111. INC RTLOCAL
  112. DLITUNE JSR TUNER ;DO TUNES
  113. LDA LDRTEMP7 ;IS VBLANK STARTED YET?
  114. BNE DLLCOLOR
  115. DLLWAIT BIT MSTAT ;IF NOT, BUSY WAIT
  116. BPL DLLWAIT
  117. DLLCOLOR JSR GETCOLOR ;UPDATE PALETTES
  118. DEC KNLTEMP0 ;SET SCORE DLI TO HAPPEN NEXT
  119. PLA ;UNSTACK AND LEAVE
  120. TAY
  121. DLIOUT PLA ;THIS IS WHERE MOST DLI'S LEAVE
  122. TAX
  123. PLA
  124. NULLRTI RTI
  125. * UPDATE BASE HEADER INFORMATION FOR NEXT RUN OF KERNAL
  126. LOADER LDX #$05
  127. LUPDATLP LDA DOLIST,X ;SEE IF ANYTHING TO DO
  128. BNE LULBODY
  129. JMP LULNEXT
  130. LULBODY TXA
  131. ASL A
  132. ASL A
  133. TAY ;Y = 4*X
  134. LDA HPLIST,X ;UPDATE HPOS
  135. STA DLIST0+8,Y
  136. STA DLIST1+8,Y
  137. LDA STDATALO,X ;GET RID OF OLD STAMP DATA
  138. STA LDRTEMP0
  139. LDA STDATAHI,X
  140. STA LDRTEMP1
  141. LDA #$00
  142. LDY OLDZONE,X
  143. STA (LDRTEMP0),Y
  144. INY
  145. STA (LDRTEMP0),Y
  146. INY
  147. STA (LDRTEMP0),Y
  148. LDA VZLIST,X ;PUT IN THE NEW STAMP DATA
  149. STA OLDZONE,X ;SAVE AWAY WHERE IT IS
  150. TAY
  151. LDA STAMPOFF,X
  152. STA (LDRTEMP0),Y
  153. INY
  154. CLC
  155. ADC #$02
  156. STA (LDRTEMP0),Y
  157. INY
  158. CLC
  159. ADC #$02
  160. STA (LDRTEMP0),Y
  161. LDA #L(STAMPS) ;AND NOW, UPDATE THE STAMPS
  162. CLC
  163. ADC STAMPOFF,X
  164. STA LDRTEMP0 ;(LDRTEMP0) IS THE OUTPUT
  165. LDA SLLIST,X ;(LDRTEMP2) IS THE INPUT
  166. STA LDRTEMP2
  167. LDA SHLIST,X
  168. STA LDRTEMP3
  169. LDA VOLIST,X ;FIND THE OFFSET - HOW MANY LEADING 0'S
  170. STA LDRTEMP5
  171. STA LDRTEMP6
  172. STX LDRTEMP4 ;STORE X
  173. LDA #H(STAMPS+$500) ;RESET OUTPUT POINTER TO BEGINNING
  174. STA LDRTEMP1
  175. LDX #$05
  176. LSLOOP0 LDY #$00
  177. DEC LDRTEMP5 ;SEE IF ANY STARTING BLANK PADDING
  178. BMI LSLJMP00
  179. TYA ;BLANK PADDING
  180. STA (LDRTEMP0),Y
  181. INY
  182. STA (LDRTEMP0),Y
  183. JMP LDLJMP01
  184. LSLJMP00 LDA (LDRTEMP2),Y ;GET DATA
  185. STA (LDRTEMP0),Y
  186. INY
  187. LDA (LDRTEMP2),Y ;GET DATA
  188. STA (LDRTEMP0),Y
  189. INC LDRTEMP2 ;INCREASE LDRTEMP2 BY 2
  190. INC LDRTEMP2
  191. BNE LDLJMP01 ;SEE IF PAGE BOUNDARY
  192. INC LDRTEMP3
  193. LDLJMP01 DEC LDRTEMP1 ;INCREASE LDRTEMP0 BY 1 PAGE
  194. DEX
  195. BPL LSLOOP0
  196. INC LDRTEMP0 ;MOVE TO NEXT STAMP
  197. INC LDRTEMP0
  198. LDA #H(STAMPS+$500) ;RESET OUTPUT POINTER TO BEGINNING
  199. STA LDRTEMP1
  200. LDX #$05
  201. LSLOOP1 LDY #$00
  202. LDA (LDRTEMP2),Y ;GET DATA
  203. STA (LDRTEMP0),Y
  204. INY
  205. LDA (LDRTEMP2),Y ;GET DATA
  206. STA (LDRTEMP0),Y
  207. INC LDRTEMP2 ;INCREASE LDRTEMP2 BY 2
  208. INC LDRTEMP2
  209. BNE LDLPAGE1 ;SEE IF PAGE BOUNDARY
  210. INC LDRTEMP3
  211. LDLPAGE1 DEC LDRTEMP1 ;INCREASE LDRTEMP0 BY 1 PAGE
  212. DEX
  213. BPL LSLOOP1
  214. INC LDRTEMP0 ;MOVE TO NEXT STAMP
  215. INC LDRTEMP0
  216. LDA #H(STAMPS+$500) ;RESET OUTPUT POINTER TO BEGINNING
  217. STA LDRTEMP1
  218. LDX #$05
  219. LSLOOP2 LDY #$00
  220. DEC LDRTEMP6 ;SEE IF TIME FOR ANY ENDING BLANKS
  221. BPL LSLJMP20
  222. TYA ;BLANK PADDING
  223. STA (LDRTEMP0),Y
  224. INY
  225. STA (LDRTEMP0),Y
  226. JMP LSLJMP21
  227. LSLJMP20 LDA (LDRTEMP2),Y ;GET DATA
  228. STA (LDRTEMP0),Y
  229. INY
  230. LDA (LDRTEMP2),Y ;GET DATA
  231. STA (LDRTEMP0),Y
  232. INC LDRTEMP2 ;INCREASE LDRTEMP2 BY 2
  233. INC LDRTEMP2
  234. BNE LSLJMP21 ;SEE IF PAGE BOUNDARY
  235. INC LDRTEMP3
  236. LSLJMP21 DEC LDRTEMP1 ;INCREASE LDRTEMP0 BY 1 PAGE
  237. DEX
  238. BPL LSLOOP2
  239. LDX LDRTEMP4
  240. LDA #$00
  241. STA DOLIST,X ;DON'T DO SAME AGAIN - Y IS STILL 0
  242. LULNEXT BIT MSTAT ;SEE IF VBLANK STARTED YET
  243. BPL LULNJMP
  244. INC LDRTEMP7 ;STARTED
  245. LULNJMP DEX
  246. BMI LULOUT
  247. JMP LUPDATLP
  248. LULOUT RTS
  249. * RANDOM NUMBER GENERATOR - BOTH MAKES A NEW ONE AND LEAVES IT IN A
  250. RAND ADC RTLOCAL+1 ;MAKE A PRETTY RANDOM VALUE
  251. ADC NEWRAND
  252. ADC OLDRAND
  253. PHA
  254. LDA NEWRAND ;BACK UP NEWRAND
  255. STA OLDRAND
  256. PLA
  257. STA NEWRAND ;NEW VALUE - LEFT IN A
  258. RTS
  259. * THIS ROUTINE HITS THE PALETTES EVERY FRAME
  260. GETCOLOR LDX #$02
  261. LDY #$07
  262. GCLOOP LDA P0C1-2,X
  263. STA Z0C1-2,X
  264. INX
  265. LDA P0C1-2,X
  266. STA Z0C1-2,X
  267. INX
  268. LDA P0C1-2,X
  269. STA Z0C1-2,X
  270. INX
  271. INX
  272. DEY
  273. BPL GCLOOP
  274. RTS
  275. * TABLE OF LOW AND HI BYTES OF PLAYFIELD ADDRESSES FOR ZONES
  276. SCRLOW DB $00,$1C,$38,$54,$70,$8C,$A8,$C4
  277. DB $E0,$FC,$18,$34,$50,$6C,$88,$A4
  278. DB $C0,$DC,$F8,$14,$30,$4C,$68,$84
  279. DB $A0,$BC,$D8,$F4,$10,$2C,$48
  280. SCRHI DB H(SCREEN+$000),H(SCREEN+$000),H(SCREEN+$000),H(SCREEN+$000)
  281. DB H(SCREEN+$000),H(SCREEN+$000),H(SCREEN+$000),H(SCREEN+$000)
  282. DB H(SCREEN+$000),H(SCREEN+$000),H(SCREEN+$100),H(SCREEN+$100)
  283. DB H(SCREEN+$100),H(SCREEN+$100),H(SCREEN+$100),H(SCREEN+$100)
  284. DB H(SCREEN+$100),H(SCREEN+$100),H(SCREEN+$100),H(SCREEN+$200)
  285. DB H(SCREEN+$200),H(SCREEN+$200),H(SCREEN+$200),H(SCREEN+$200)
  286. DB H(SCREEN+$200),H(SCREEN+$200),H(SCREEN+$200),H(SCREEN+$200)
  287. DB H(SCREEN+$300),H(SCREEN+$300),H(SCREEN+$300)
  288. * TABLE FROM STAMP INDEX TO WHERE THE STAMP STARTS IN STAMP PAGE
  289. STAMPOFF DB 4,10,16,22,28,34
  290. * TABLE FROM STAMP INDEX TO WHAT TABLE THE STAMP OFFSET GOES IN
  291. STDATALO DB L(MSADDR),L(FRTADDR),L(M0ADDR),L(M1ADDR)
  292. DB L(M2ADDR),L(M3ADDR)
  293. STDATAHI DB H(MSADDR),H(FRTADDR),H(M0ADDR),H(M1ADDR)
  294. DB H(M2ADDR),H(M3ADDR)
  295. * THE LAST ZONE OF THE MAZE
  296. LASTZONE EQU 30