Advertisement
Guest User

Untitled

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