Advertisement
Guest User

Untitled

a guest
May 17th, 2015
345
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.96 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 up
  413. JSR right
  414. JMP done
  415. test3
  416. CMP #3
  417. BNE test4
  418. JSR left
  419. JSR down
  420. JMP done
  421. test4
  422. CMP #4
  423. JSR right
  424. JSR down
  425.  
  426. JMP done
  427.  
  428. done
  429. RTS
  430.  
  431.  
  432. ;------------------------------
  433. ; Sprite move subroutines start
  434. up
  435. LDX #0
  436. LDY #0
  437. -
  438. SEC
  439. LDA spriteram,x
  440. SBC speed,y
  441. STA spriteram,x
  442. STA $0200,x
  443. INY
  444. INX
  445. INX
  446. INX
  447. INX
  448. CPX #0
  449. BNE -
  450.  
  451. RTS
  452.  
  453. down
  454. LDX #0
  455. LDY #0
  456. -
  457. CLC
  458. LDA spriteram,x
  459. ADC speed,y
  460. STA spriteram,x
  461. STA $0200,x
  462. INY
  463. INX
  464. INX
  465. INX
  466. INX
  467. CPX #0
  468. BNE -
  469. RTS
  470.  
  471. right:
  472. LDX #0
  473. LDY #0
  474. -
  475. CLC
  476. LDA spriteram+3,x
  477. ADC speed,y
  478. STA spriteram+3,x
  479. STA $0203,x
  480. INY
  481. INX
  482. INX
  483. INX
  484. INX
  485. CPX #0
  486. BNE -
  487. RTS
  488.  
  489. left
  490. LDX #0
  491. LDY #0
  492. -
  493. SEC
  494. LDA spriteram+3,x
  495. SBC speed,y
  496. STA spriteram+3,x
  497. STA $0203,x
  498. INY
  499. INX
  500. INX
  501. INX
  502. INX
  503. CPX #0
  504. BNE -
  505. RTS
  506.  
  507. ; Sprite direction subroutines end
  508. ;---------------------------------
  509.  
  510.  
  511.  
  512. ;-----------------------------------------
  513. ; Sprite tile check subroutines start
  514. spritechangecheck
  515.  
  516. LDA spritenumber
  517.  
  518. testa
  519. CMP #0
  520. BNE testb
  521. JSR SprNum0
  522. JMP end
  523. testb
  524. CMP #1
  525. BNE testc
  526. JSR SprNum1
  527. JMP end
  528. testc
  529. CMP #2
  530. BNE testd
  531. JSR SprNum2
  532. JMP end
  533. testd
  534. CMP #3
  535. BNE teste
  536. JSR SprNum3
  537. JMP end
  538. teste
  539. CMP #4
  540. JSR SprNum4
  541. JMP end
  542.  
  543. end
  544. RTS
  545. ;-------------------------------
  546.  
  547.  
  548. ;------------------
  549. SprNum0:
  550. CMP #0
  551. BNE SprNum1
  552.  
  553. ldx #0
  554. ldy #0
  555. -
  556. lda spritetiles0,y
  557. sta $201,x
  558. iny
  559. inx
  560. inx
  561. inx
  562. inx
  563. bne -
  564. JMP SprChangeOver
  565. ;------------------
  566. SprNum1:
  567. CMP #1
  568. BNE SprNum2
  569.  
  570. ldx #0
  571. ldy #0
  572. -
  573. lda spritetiles1,y
  574. sta $201,x
  575. iny
  576. inx
  577. inx
  578. inx
  579. inx
  580. bne -
  581. JMP SprChangeOver
  582. ;------------------
  583. SprNum2:
  584. CMP #2
  585. BNE SprNum3
  586.  
  587. ldx #0
  588. ldy #0
  589. -
  590. lda spritetiles2,y
  591. sta $201,x
  592. iny
  593. inx
  594. inx
  595. inx
  596. inx
  597. bne -
  598. JMP SprChangeOver
  599. ;------------------
  600. SprNum3:
  601. CMP #3
  602. BNE SprNum4
  603.  
  604. ldx #0
  605. ldy #0
  606. -
  607. lda spritetiles3,y
  608. sta $201,x
  609. iny
  610. inx
  611. inx
  612. inx
  613. inx
  614. bne -
  615. JMP SprChangeOver
  616. ;------------------
  617. SprNum4:
  618. CMP #4
  619. ;BNE
  620.  
  621. ldx #0
  622. ldy #0
  623. -
  624. lda spritetiles4,y
  625. sta $201,x
  626. iny
  627. inx
  628. inx
  629. inx
  630. inx
  631. bne -
  632.  
  633. SprChangeOver:
  634. RTS
  635.  
  636. ;-------------------------------
  637.  
  638.  
  639.  
  640. .org $FFFA ;first of the three vectors starts here
  641. .dw NMI ;when an NMI happens (once per frame if enabled) the
  642. ;processor will jump to the label NMI:
  643. .dw RESET ;when the processor first turns on or is reset, it will jump
  644. ;to the label RESET:
  645. .dw 0 ;external interrupt IRQ is not used in this tutorial
  646.  
  647.  
  648. ;;;;;;;;;;;;;;
  649.  
  650. .incbin "sprites.chr" ;includes 8KB graphics file from SMB1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement