Advertisement
Guest User

spritefield

a guest
Mar 13th, 2015
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.54 KB | None | 0 0
  1. .ORG $7ff0
  2. Header: ; 16 byte .NES header (iNES format)
  3. .DB "NES", $1a
  4. .DB $02 ; size of PRG ROM in 16kb units
  5. .DB $01 ; size of CHR ROM in 8kb units
  6. .DB #%00000000 ; mapper 0
  7. .DB #%00000000 ; mapper 0
  8. .DB $00
  9. .DB $00
  10. .DB $00
  11. .DB $00
  12. .DB $00
  13. .DB $00
  14. .DB $00
  15. .DB $00
  16.  
  17. .ORG $8000
  18.  
  19. ;declare variables
  20.  
  21. .enum $0000 ;;start variables at ram location 0
  22. spritedir .dsb 1 ; .rs 1 means reserve one byte of space
  23. spritenumber .dsb 1
  24. .ende
  25.  
  26.  
  27. spriteram = $0200
  28.  
  29.  
  30.  
  31. ;;;;;;;;;;;;;;;
  32.  
  33. .org $C000
  34. RESET:
  35. SEI ; disable IRQs
  36. CLD ; disable decimal mode
  37. LDX #$40
  38. STX $4017 ; disable APU frame IRQ
  39. LDX #$FF
  40. TXS ; Set up stack
  41. INX ; now X = 0
  42. STX $2000 ; disable NMI
  43. STX $2001 ; disable rendering
  44. STX $4010 ; disable DMC IRQs
  45.  
  46. vblankwait1: ; First wait for vblank to make sure PPU is ready
  47. BIT $2002
  48. BPL vblankwait1
  49.  
  50. clrmem:
  51. LDA #$00
  52. STA $0000, x
  53. STA $0100, x
  54. STA $0200, x
  55. STA $0400, x
  56. STA $0500, x
  57. STA $0600, x
  58. STA $0700, x
  59. LDA #$FE
  60. STA $0300, x
  61. INX
  62. BNE clrmem
  63.  
  64. ;------------VARIABLES----------------
  65.  
  66. lda #0
  67. sta spritedir
  68. sta spritenumber
  69.  
  70. vblankwait2: ; Second wait for vblank, PPU is ready after this
  71. BIT $2002
  72. BPL vblankwait2
  73.  
  74.  
  75. LoadPalettes:
  76. LDA $2002 ; read PPU status to reset the high/low latch
  77. LDA #$3F
  78. STA $2006 ; write the high byte of $3F00 address
  79. LDA #$00
  80. STA $2006 ; write the low byte of $3F00 address
  81. LDX #$00 ; start out at 0
  82. LoadPalettesLoop:
  83. LDA palette, x ; load data from address (palette + the value in x)
  84. ; 1st time through loop it will load palette+0
  85. ; 2nd time through loop it will load palette+1
  86. ; 3rd time through loop it will load palette+2
  87. ; etc
  88. STA $2007 ; write to PPU
  89. INX ; X = X + 1
  90. CPX #$20 ; Compare X to hex $10, decimal 16 - copying 16 bytes = 4 sprites
  91. BNE LoadPalettesLoop ; Branch to LoadPalettesLoop if compare was Not Equal to zero
  92. ; if compare was equal to 32, keep going down
  93.  
  94.  
  95.  
  96. LoadSprites:
  97. LDX #$00 ; start at 0
  98. -
  99. LDA sprites, x ; load data from address (sprites + x)
  100. STA spriteram, x ; store into RAM address ($0200 + x)
  101. INX ; X = X + 1
  102. CPX #$00 ; Compare X to hex $10, decimal 16
  103. BNE - ; Branch to LoadSpritesLoop if compare was Not Equal to zero
  104. ; if compare was equal to 32, keep going down
  105.  
  106.  
  107.  
  108. LDA #%10000000 ; enable NMI, sprites from Pattern Table 1
  109. STA $2000
  110.  
  111. LDA #%00010000 ; enable sprites
  112. STA $2001
  113.  
  114. Forever:
  115. JMP Forever ;jump back to Forever, infinite loop
  116.  
  117.  
  118.  
  119. NMI:
  120.  
  121. JSR readcontroller
  122. JSR updatesprites
  123. JSR spritemovecheck
  124. JSR spritechangecheck
  125.  
  126. RTI ; return from interrupt
  127.  
  128. ;;;;;;;;;;;;;;
  129.  
  130. .org $E000
  131.  
  132. palette:
  133. .db $0f,$01,$11,$21,$0f,$04,$14,$24,$0f,$06,$16,$26,$0f,$09,$19,$29
  134. .db $0f,$01,$11,$21,$0f,$04,$14,$24,$0f,$06,$16,$26,$0f,$09,$19,$29
  135.  
  136. speed:
  137. .db $01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04
  138. .db $01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04
  139. .db $01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04
  140. .db $01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04
  141.  
  142. spritetiles0:
  143. .db $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f
  144. .db $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f
  145. .db $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f
  146. .db $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f
  147.  
  148. spritetiles1:
  149. .db $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
  150. .db $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
  151. .db $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
  152. .db $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
  153.  
  154. spritetiles2:
  155. .db $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
  156. .db $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
  157. .db $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
  158. .db $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
  159.  
  160. spritetiles3:
  161. .db $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
  162. .db $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
  163. .db $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
  164. .db $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
  165.  
  166. spritetiles4:
  167. .db $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
  168. .db $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
  169. .db $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
  170. .db $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
  171.  
  172.  
  173.  
  174. sprites:
  175. ;vert tile attr horiz
  176. .db $08, $00, $00, $a4
  177. .db $08, $01, $00, $c9
  178. .db $08, $02, $00, $84
  179. .db $10, $03, $00, $88
  180. .db $10, $04, $01, $e5
  181. .db $18, $05, $01, $20
  182. .db $18, $06, $01, $31
  183. .db $20, $07, $01, $17
  184. .db $28, $08, $02, $6e
  185. .db $28, $09, $02, $89
  186. .db $30, $0a, $02, $6b
  187. .db $38, $0b, $02, $e1
  188. .db $38, $00, $03, $5a
  189. .db $38, $01, $03, $bd
  190. .db $40, $02, $03, $90
  191. .db $40, $03, $03, $bf
  192. .db $48, $04, $00, $53
  193. .db $48, $05, $00, $63
  194. .db $48, $06, $00, $9d
  195. .db $50, $07, $00, $e9
  196. .db $50, $08, $01, $f3
  197. .db $58, $09, $01, $13
  198. .db $60, $0a, $01, $53
  199. .db $60, $0b, $01, $88
  200. .db $68, $00, $02, $76
  201. .db $68, $01, $02, $bb
  202. .db $68, $02, $02, $f6
  203. .db $70, $03, $02, $dd
  204. .db $70, $04, $03, $df
  205. .db $78, $05, $03, $86
  206. .db $78, $06, $03, $1d
  207. .db $80, $07, $03, $e1
  208. .db $80, $08, $00, $ca
  209. .db $80, $09, $00, $99
  210. .db $88, $0a, $00, $c3
  211. .db $88, $0b, $00, $5e
  212. .db $90, $00, $01, $1f
  213. .db $98, $01, $01, $1e
  214. .db $98, $02, $01, $99
  215. .db $98, $03, $01, $e2
  216. .db $a0, $04, $02, $3d
  217. .db $a0, $05, $02, $a2
  218. .db $a8, $06, $02, $24
  219. .db $b0, $07, $02, $ec
  220. .db $b0, $08, $03, $09
  221. .db $b0, $09, $03, $16
  222. .db $b8, $0a, $03, $aa
  223. .db $b8, $0b, $03, $5b
  224. .db $c0, $00, $00, $54
  225. .db $c0, $01, $00, $fa
  226. .db $c0, $02, $00, $74
  227. .db $c8, $03, $00, $c9
  228. .db $c8, $04, $01, $0b
  229. .db $d0, $05, $01, $a9
  230. .db $d0, $06, $01, $37
  231. .db $d0, $07, $01, $e2
  232. .db $d8, $08, $02, $74
  233. .db $d8, $09, $02, $1d
  234. .db $d8, $0a, $02, $85
  235. .db $e0, $0b, $02, $d1
  236. .db $e0, $00, $03, $f4
  237. .db $e8, $01, $03, $da
  238. .db $e8, $02, $03, $31
  239. .db $e8, $03, $03, $12
  240.  
  241. ;-------------------------------
  242. ; sprite update subroutine start
  243.  
  244. updatesprites:
  245.  
  246. LDA #$00
  247. STA $2003 ; set the low byte (00) of the RAM address
  248. LDA #$02
  249. STA $4014 ; set the high byte (02) of the RAM address, start the transfer
  250. RTS
  251. ; Sprite update subroutine end
  252. ;-----------------------------
  253.  
  254.  
  255.  
  256. ;-------------------------------------
  257. ; controller reading subroutines start
  258. readcontroller:
  259.  
  260. LatchController:
  261. LDA #$01
  262. STA $4016
  263. LDA #$00
  264. STA $4016 ; tell both the controllers to latch buttons
  265.  
  266. ReadA:
  267. LDA $4016 ; player 1 - A
  268. AND #%00000001 ; only look at bit 0
  269. beq readb
  270.  
  271. INC spritenumber
  272. LDA spritenumber
  273. CMP #5 ;equal to total # of screens +1, from zero
  274. BNE NoResetSpr
  275. lda #0
  276. sta spritenumber
  277. jsr spritechangecheck
  278. JMP ReadADone
  279. NoResetSpr:
  280. jsr spritechangecheck
  281.  
  282. ReadADone: ; handling this button is done
  283.  
  284.  
  285. readb:
  286. LDA $4016 ; player 1 - B
  287. AND #%00000001 ; only look at bit 0
  288. BEQ ReadBDone ; branch to ReadBDone if button is NOT pressed (0)
  289. ReadBDone: ; handling this button is done
  290.  
  291. Readselect:
  292. LDA $4016 ; player 1 - select
  293. AND #%00000001 ; only look at bit 0
  294. BEQ ReadselectDone ; branch to Readselect Done if button is NOT pressed (0)
  295. ReadselectDone: ; handling this button is done
  296.  
  297. Readstart:
  298. LDA $4016 ; player 1 - select
  299. AND #%00000001 ; only look at bit 0
  300. BEQ ReadstartDone ; branch to Readstart Done if button is NOT pressed (0)
  301. ReadstartDone: ; handling this button is donespriteRAM = $0200
  302.  
  303. Readup:
  304. LDA $4016 ; player 1 - up
  305. AND #%00000001 ; only look at bit 0
  306. BEQ ReadupDone ; branch to Readup Done if button is NOT pressed (0)
  307. LDA #1
  308. STA spritedir
  309. ReadupDone: ; handling this button is done
  310.  
  311. Readdown:
  312. LDA $4016 ; player 1 + down
  313. AND #%00000001 ; only look at bit 0
  314. BEQ ReaddownDone ; branch to Readdown Done if button is NOT pressed (0)
  315. LDA #2
  316. STA spritedir
  317. ReaddownDone: ; handling this button is done
  318.  
  319. Readleft:
  320. LDA $4016 ; player 1 - select
  321. AND #%00000001 ; only look at bit 0
  322. BEQ ReadleftDone ; branch to Readleft Done if button is NOT pressed (0)
  323. LDA #3
  324. STA spritedir
  325. ReadleftDone: ; handling this button is done
  326.  
  327. Readright:
  328. LDA $4016 ; player 1 - select
  329. AND #%00000001 ; only look at bit 0
  330. BEQ ReadrightDone ; branch to Readright Done if button is NOT pressed (0)
  331. LDA #4
  332. STA spritedir
  333. ReadrightDone: ; handling this button is done
  334.  
  335. RTS
  336.  
  337. ; controller read subroutine ends
  338. ;--------------------------------
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345. ;-----------------------------------------
  346. ; Sprite direction check subroutines start
  347. spritemovecheck
  348.  
  349. LDA spritedir
  350.  
  351. test0
  352. CMP #0
  353. BNE test1
  354. JMP done
  355. test1
  356. CMP #1
  357. BNE test2
  358. JSR up
  359. JMP done
  360. test2
  361. CMP #2
  362. BNE test3
  363. JSR down
  364. JMP done
  365. test3
  366. CMP #3
  367. BNE test4
  368. JSR left
  369. JMP done
  370. test4
  371. CMP #4
  372. JSR right
  373. JMP done
  374.  
  375. done
  376. RTS
  377.  
  378.  
  379. ;------------------------------
  380. ; Sprite move subroutines start
  381. up
  382. LDX #0
  383. LDY #0
  384. -
  385. CLC
  386. LDA spriteram,x
  387. SBC speed,y
  388. STA spriteram,x
  389. STA $0200,x
  390. INY
  391. INX
  392. INX
  393. INX
  394. INX
  395. CPX #0
  396. BNE -
  397. RTS
  398.  
  399. down
  400. LDX #0
  401. LDY #0
  402. -
  403. CLC
  404. LDA spriteram,x
  405. ADC speed,y
  406. STA spriteram,x
  407. STA $0200,x
  408. INY
  409. INX
  410. INX
  411. INX
  412. INX
  413. CPX #0
  414. BNE -
  415. RTS
  416.  
  417. right:
  418. LDX #0
  419. LDY #0
  420. -
  421. CLC
  422. LDA spriteram+3,x
  423. ADC speed,y
  424. STA spriteram+3,x
  425. STA $0203,x
  426. INY
  427. INX
  428. INX
  429. INX
  430. INX
  431. CPX #0
  432. BNE -
  433. RTS
  434.  
  435. left
  436. LDX #0
  437. LDY #0
  438. -
  439. CLC
  440. LDA spriteram+3,x
  441. SBC speed,y
  442. STA spriteram+3,x
  443. STA $0203,x
  444. INY
  445. INX
  446. INX
  447. INX
  448. INX
  449. CPX #0
  450. BNE -
  451. RTS
  452.  
  453. ; Sprite direction subroutines end
  454. ;---------------------------------
  455.  
  456.  
  457.  
  458. ;-----------------------------------------
  459. ; Sprite direction check subroutines start
  460. spritechangecheck
  461.  
  462. LDA spritenumber
  463.  
  464. testa
  465. CMP #0
  466. BNE testb
  467. JSR SprNum0
  468. JMP end
  469. testb
  470. CMP #1
  471. BNE testc
  472. JSR SprNum1
  473. JMP end
  474. testc
  475. CMP #2
  476. BNE testd
  477. JSR SprNum2
  478. JMP end
  479. testd
  480. CMP #3
  481. BNE teste
  482. JSR SprNum3
  483. JMP end
  484. teste
  485. CMP #4
  486. JSR SprNum4
  487. JMP end
  488.  
  489. end
  490. RTS
  491. ;-------------------------------
  492.  
  493.  
  494. ;------------------
  495. SprNum0:
  496. CMP #0
  497. BNE SprNum1
  498.  
  499. ldx #0
  500. ldy #0
  501. -
  502. lda spritetiles0,y
  503. sta $201,x
  504. iny
  505. inx
  506. inx
  507. inx
  508. inx
  509. bne -
  510. JMP SprChangeOver
  511. ;------------------
  512. SprNum1:
  513. CMP #1
  514. BNE SprNum2
  515.  
  516. ldx #0
  517. ldy #0
  518. -
  519. lda spritetiles1,y
  520. sta $201,x
  521. iny
  522. inx
  523. inx
  524. inx
  525. inx
  526. bne -
  527. JMP SprChangeOver
  528. ;------------------
  529. SprNum2:
  530. CMP #2
  531. BNE SprNum3
  532.  
  533. ldx #0
  534. ldy #0
  535. -
  536. lda spritetiles2,y
  537. sta $201,x
  538. iny
  539. inx
  540. inx
  541. inx
  542. inx
  543. bne -
  544. JMP SprChangeOver
  545. ;------------------
  546. SprNum3:
  547. CMP #3
  548. BNE SprNum4
  549.  
  550. ldx #0
  551. ldy #0
  552. -
  553. lda spritetiles3,y
  554. sta $201,x
  555. iny
  556. inx
  557. inx
  558. inx
  559. inx
  560. bne -
  561. JMP SprChangeOver
  562. ;------------------
  563. SprNum4:
  564. CMP #4
  565. ;BNE
  566.  
  567. ldx #0
  568. ldy #0
  569. -
  570. lda spritetiles4,y
  571. sta $201,x
  572. iny
  573. inx
  574. inx
  575. inx
  576. inx
  577. bne -
  578.  
  579. SprChangeOver:
  580. RTS
  581.  
  582. ;-------------------------------
  583.  
  584.  
  585.  
  586. .org $FFFA ;first of the three vectors starts here
  587. .dw NMI ;when an NMI happens (once per frame if enabled) the
  588. ;processor will jump to the label NMI:
  589. .dw RESET ;when the processor first turns on or is reset, it will jump
  590. ;to the label RESET:
  591. .dw 0 ;external interrupt IRQ is not used in this tutorial
  592.  
  593.  
  594. ;;;;;;;;;;;;;;
  595.  
  596. .incbin "sprites.chr" ;includes 8KB graphics file from SMB1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement