Advertisement
Guest User

NES ASM program

a guest
Mar 17th, 2014
451
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.21 KB | None | 0 0
  1. .inesprg 1 ; 1x 16KB PRG code
  2. .ineschr 1 ; 1x 8KB CHR data
  3. .inesmap 0 ; mapper 3 = CNROM, 8KB CHR swapping
  4. .inesmir 0 ; background mirroring
  5.  
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;---Variables---
  7.  
  8. character_number .rs 1 ;For all the characters
  9. enemy_number .rs 1 ;Just for enemies
  10. enemy_direction .rs 4
  11. enemy_animation .rs 4
  12. RandomLow .rs 1
  13. RandomHigh .rs 1
  14. RandomTemp .rs 1
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;---Constants---
  16.  
  17. HERO_Y = $0200
  18. HERO_X = $0203
  19. ENEMY_Y = $0220
  20. ENEMY_X = $0223
  21.  
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23.  
  24. .bank 0
  25. .org $8000
  26.  
  27. RESET:
  28. SEI ;Fuck IRQs
  29. CLD ;Decimals too! Fuck 'em
  30. LDX #$40
  31. STX $4017 ;APU frame IRQ! I said FUCK IRQs!!!
  32. LDX #$FF
  33. TXS ;Set up stack
  34. INX ;X register overflow, X=0
  35. STX $2000 ;no NMI for now
  36. STX $2001 ;No rendering for now
  37. STX $4010 ;Dang! DMC IRQs! y so many of 'em?
  38.  
  39. vblankwait1: ; First wait for vblank to make sure PPU is ready
  40. BIT $2002
  41. BPL vblankwait1
  42.  
  43. clrmem:
  44. LDA #$00
  45. STA $0000, x
  46. STA $0100, x
  47. STA $0300, x
  48. STA $0400, x
  49. STA $0500, x
  50. STA $0600, x
  51. STA $0700, x
  52. LDA #$FE
  53. STA $0200, x ;move all sprites off screen
  54. INX
  55. BNE clrmem
  56.  
  57. vblankwait2: ; Second wait for vblank, PPU is ready after this
  58. BIT $2002
  59. BPL vblankwait2
  60.  
  61. ;NES is ready now! LET'S DO THIS! (LEEEEEEEEEEEEEROOOOOOOOOOOY JJJJJJJJJJJENKINS!)
  62.  
  63. PalLoad:
  64. LDA $2002 ;PPU? r u there? We need to reset the HiLo latch!
  65. LDA #$3F ;Hi part of $3F00
  66. STA $2006
  67. LDA #$00 ;Lo part of it
  68. STA $2006
  69. LDX #$00
  70. PalLoop:
  71. LDA pal, x
  72. STA $2007 ;Load 'em palettes to PPU
  73. INX
  74. CPX #$20
  75. BNE PalLoop ;Advance only when all 32 palettes are copied!
  76.  
  77. LoadSprites:
  78. LDX #$00
  79. LoadSpritesLoop:
  80. LDA sprite, x ;load palette byte
  81. STA $0200, x ;write to PPU
  82. INX ;set index to next byte
  83. CPX #$A0
  84. BNE LoadSpritesLoop ;if x = $20, 32 bytes copied, all done
  85.  
  86. LoadBackground:
  87. LDA $2002 ; read PPU status to reset the high/low latch
  88. LDA #$20
  89. STA $2006 ; write the high byte of $2000 address
  90. LDA #$00
  91. STA $2006 ; write the low byte of $2000 address
  92. LDX #$00 ; start out at 0
  93. LoadBackgroundLoop:
  94. LDA #$56 ; load data from address (background + the value in x)
  95. STA $2007 ; write to PPU
  96. INX ; X = X + 1
  97. CPX #$00 ; Compare X to hex $80, decimal 128 - copying 128 bytes
  98. BNE LoadBackgroundLoop ; Branch to LoadBackgroundLoop if compare was Not Equal to zero
  99. ; if compare was equal to 128, keep going down
  100.  
  101. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  102. ; ________________ _____________________ _________________ ;
  103. ; | | | | | | ;
  104. ; | | | | | | ;
  105. ; | | | | ________|________ ;
  106. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  107.  
  108. NMI:
  109. LDA #$00
  110. STA $2003 ; set the low byte (00) of the RAM address
  111. LDA #$02
  112. STA $4014 ; set the high byte (02) of the RAM address, start the transfer
  113.  
  114. PPUCleanUp:
  115. LDA #%10010000 ; enable NMI, sprites from Pattern Table 0, background from Pattern Table 1
  116. STA $2000
  117. LDA #%00011110 ; Enable sprites, enable background, no clipping on left side
  118. STA $2001
  119. LDA #$00 ; no scrolling
  120. STA $2005
  121. STA $2005
  122.  
  123. EnginePlaying:
  124. INC RandomLow
  125. BNE .SeedComplete
  126. INC RandomHigh
  127. .SeedComplete
  128. LatchController: ;I know there are better controller reads, but for now I'm lazy
  129. LDA #$01
  130. STA $4016
  131. LDA #$00
  132. STA $4016 ; tell both the controllers to latch buttons
  133. LDA $4016
  134. LDA $4016
  135. LDA $4016
  136. LDA $4016
  137. LDA $4016
  138. AND #%00000001
  139. BEQ MoveUpDone
  140. LDA HERO_Y
  141. SEC
  142. SBC #$01
  143. STA HERO_Y
  144. MoveUpDone:
  145. LDA $4016
  146. AND #%00000001
  147. BEQ MoveDownDone
  148. LDA HERO_Y
  149. CLC
  150. ADC #$01
  151. STA HERO_Y
  152. MoveDownDone:
  153. LDA $4016
  154. AND #%00000001
  155. BEQ MoveLeftDone
  156. LDA HERO_X
  157. SEC
  158. SBC #$01
  159. STA HERO_X
  160. MoveLeftDone:
  161. LDA $4016
  162. AND #%00000001
  163. BEQ MoveRightDone
  164. LDA HERO_X
  165. CLC
  166. ADC #$01
  167. STA HERO_X
  168. MoveRightDone:
  169.  
  170. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  171. LDA #$00
  172. STA enemy_number
  173. MoveSprites:
  174. LDX enemy_number
  175. INC enemy_animation,x
  176. JSR Random
  177. CMP #$03
  178. BCS NoChange
  179. STA enemy_direction,x
  180. NoChange:
  181. LDA enemy_direction,x
  182. BNE .skip1
  183. JSR enemy_up
  184. JMP endskip
  185. .skip1
  186. CMP #$01
  187. BNE .skip2
  188. JSR enemy_down
  189. JMP endskip
  190. .skip2
  191. CMP #$02
  192. BNE .skip3
  193. JSR enemy_left
  194. JMP endskip
  195. .skip3
  196. JSR enemy_right
  197. endskip:
  198. INC enemy_number
  199. LDA enemy_number
  200. CMP #$04
  201. BNE MoveSprites
  202. LDA #$00
  203. STA enemy_number
  204. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  205.  
  206. UpdatePlayerPos:
  207.  
  208. LDA $0200 ;Update 16x32 metsprite vertically
  209. STA $0204
  210. CLC
  211. ADC #$08
  212. STA $0208
  213. STA $020C
  214. CLC
  215. ADC #$08
  216. STA $0210
  217. STA $0214
  218. CLC
  219. ADC #$08
  220. STA $0218
  221. STA $021C
  222.  
  223. LDA $0203 ;Update 16x32 metasprite horizontally
  224. STA $020B
  225. STA $0213
  226. STA $021B
  227. CLC
  228. ADC #$08
  229. STA $0207
  230. STA $020F
  231. STA $0217
  232. STA $021F
  233.  
  234. UpdatePos:
  235.  
  236. LDX enemy_number
  237. LDA updateconstants,x
  238. TAX
  239.  
  240. LDA $0220,x ;Update 16x32 metsprite vertically
  241. STA $0224,x
  242. CLC
  243. ADC #$08
  244. STA $0228,x
  245. STA $022C,x
  246. CLC
  247. ADC #$08
  248. STA $0230,x
  249. STA $0234,x
  250. CLC
  251. ADC #$08
  252. STA $0238,x
  253. STA $023C,x
  254.  
  255. LDA $0223,x ;Update 16x32 metasprite horizontally
  256. STA $022B,x
  257. STA $0233,x
  258. STA $023B,x
  259. CLC
  260. ADC #$08
  261. STA $0227,x
  262. STA $022F,x
  263. STA $0237,x
  264. STA $023F,x
  265.  
  266. INC enemy_number
  267. LDA enemy_number
  268. CMP #$04
  269. BEQ CharMovementDone ;We got only 5 characters to move
  270. JMP UpdatePos
  271. CharMovementDone:
  272. LDA #$00
  273. STA enemy_number
  274. RTI
  275.  
  276. Random:
  277. ; See "linear-congruential random number generator" for more.
  278. ; rand = (rand * 5 + 0x3611) & 0xffff;
  279. ; return (rand >> 8) & 0xff;
  280.  
  281. LDA RandomHigh ; multiply by 5
  282. STA RandomTemp
  283. LDA RandomLow
  284. ASL a ; rand = rand * 4 + rand
  285. ROL RandomTemp
  286. ASL a
  287. ROL RandomTemp
  288. CLC
  289. ADC RandomLow
  290. PHA
  291. LDA RandomTemp
  292. ADC RandomHigh
  293. STA RandomHigh
  294. PLA ; rand = rand + 0x3611
  295. CLC
  296. ADC #$11
  297. STA RandomLow
  298. LDA RandomHigh
  299. ADC #$36
  300. STA RandomHigh
  301. RTS
  302.  
  303.  
  304. ;------------------------------
  305.  
  306. enemy_up:
  307.  
  308. LDX enemy_number ;move the sprite up
  309. LDY updateconstants,x
  310. LDA ENEMY_Y,y
  311. SEC
  312. SBC #$01
  313. STA ENEMY_Y,y
  314.  
  315. RTS
  316.  
  317. ;------------------------------
  318.  
  319. enemy_down:
  320.  
  321. LDX enemy_number ;move the sprite down
  322. LDY updateconstants,x
  323. LDA ENEMY_Y,y
  324. CLC
  325. ADC #$01
  326. stA ENEMY_Y,y
  327.  
  328. RTS
  329.  
  330. ;------------------------------
  331.  
  332. enemy_right:
  333.  
  334. LDX enemy_number ;move the sprite right
  335. LDY updateconstants,x
  336. LDA ENEMY_X,y
  337. CLC
  338. ADC #$01
  339. STA ENEMY_X,y
  340.  
  341. RTS
  342.  
  343. ;------------------------------
  344.  
  345. enemy_left:
  346.  
  347. LDX enemy_number ;move the sprite left
  348. LDY updateconstants,x
  349. LDA ENEMY_X,y
  350. SEC
  351. SBC #$01
  352. STA ENEMY_X,y
  353.  
  354. RTS
  355.  
  356. ;------------------------------
  357.  
  358. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  359.  
  360. .bank 1
  361. .org $E000
  362.  
  363. pal:
  364. .db $30,$00,$10,$16,$1A,$38,$30,$31,$1A,$06,$36,$20,$1A,$28,$38,$16
  365. .db $30,$0F,$17,$36,$1A,$0F,$21,$36,$1A,$1F,$11,$37,$1A,$0F,$38,$30
  366.  
  367. sprite:
  368. .db $80,$00,$00,$80,$80,$01,$00,$88,$88,$10,$00,$80,$88,$11,$00,$88 ;; $0200
  369. .db $90,$20,$00,$80,$90,$21,$00,$88,$98,$30,$00,$80,$98,$31,$00,$88 ;; $0210
  370. .db $A0,$02,$01,$80,$A0,$03,$01,$88,$A8,$12,$01,$80,$A8,$13,$01,$88 ;; $0220
  371. .db $B0,$22,$01,$80,$B0,$23,$01,$88,$B8,$32,$01,$80,$B8,$33,$01,$88 ;; $0230
  372. .db $60,$02,$01,$80,$60,$03,$01,$88,$68,$12,$01,$80,$68,$13,$01,$88 ;; $0240
  373. .db $70,$22,$01,$80,$70,$23,$01,$88,$78,$32,$01,$80,$78,$33,$01,$88 ;; $0250
  374. .db $40,$02,$01,$80,$40,$03,$01,$88,$48,$12,$01,$80,$48,$13,$01,$88 ;; $0260
  375. .db $50,$22,$01,$80,$50,$23,$01,$88,$58,$32,$01,$80,$58,$33,$01,$88 ;; $0270
  376. .db $20,$04,$01,$80,$20,$05,$01,$88,$28,$14,$01,$80,$28,$15,$01,$88 ;; $0280
  377. .db $30,$22,$01,$80,$30,$23,$01,$88,$38,$32,$01,$80,$38,$33,$01,$88 ;; $0290
  378.  
  379. updateconstants:
  380. .db $00,$20,$40,$60
  381.  
  382. randomenemydirection: ;these are random numbers used with the random_direction2 to make enemies switch direction
  383. .db $57,$CD,$AF,$05,$BC
  384.  
  385.  
  386. .org $FFFA ;first of the three vectors starts here
  387. .dw NMI ;when an NMI happens (once per frame if enabled) the
  388. ;processor will jump to the label NMI:
  389. .dw RESET ;when the processor first turns on or is reset, it will jump
  390. ;to the label RESET:
  391. .dw 0 ;external interrupt IRQ is not used in this tutorial
  392.  
  393. ;;;;;;;;;;;;;;
  394.  
  395.  
  396. .bank 2
  397. .org $0000
  398. .incbin "blaster.chr" ;includes 8KB graphics file
  399.  
  400.  
  401. ; .bank 3
  402. ; .org $0000
  403. ; .incbin "blaster1.chr" ;includes another 8KB graphics file 'cuz I got teh B4NK5WITCHUZ!!!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement