reset.a65 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. ; This file is part of the snescom-asm demo - a demo of how to build a SNES program.
  2. ; See http://bisqwit.iki.fi/source/snescom.html for details.
  3. #include "memmap.i65"
  4. #define TILE_ADDR_REG_VAL(addr, scsize) \
  5. (((addr & $FC00) >> 8) + scsize)
  6. #define BMAP_ADDR_REG_VAL(addr, addr2) \
  7. (((addr & $F000) >> 12) | (((addr2 & $F000) >> 12) << 4))
  8. ; NMI - called once per screen refresh (or something like that)
  9. NMI_ROUTINE:
  10. sep #$20 : .as
  11. lda $4210
  12. rtl
  13. ; IRQ - called when triggered (which is..?)
  14. IRQ_ROUTINE:
  15. sep #$20 : .as
  16. lda $4211 ;Acknowledge irq
  17. rtl
  18. ; To be called regularly - updated screen contents
  19. ; Sends the palette structure to PPU
  20. PaletteDMA:
  21. .xl : .as
  22. lda #$00 : sta $4300 ;dma type
  23. lda #$22 : sta $4301 ;address $2122
  24. lda #^(PALETTE_ADDRESS) : sta $4304
  25. ldx #!(PALETTE_ADDRESS) : stx $4302
  26. ldx #512 : stx $4305 ; size: 16*2*16 bytes.
  27. lda #$00 : sta $2121 ;Write CGRAM address (0)
  28. lda #$01 : sta $420B ;Activate dma 0
  29. rts
  30. ; Sends the video buffer contents to PPU
  31. VRAMdma:
  32. sty $2116 ;Write VRAM address
  33. sty $4302 : sta $4304 ;Write DMA address
  34. stx $4305 ;Write size
  35. lda #$80 : sta $2115 ;PPU programming
  36. lda #$01 : sta $4300 ;dma type
  37. lda #$18 : sta $4301 ;address $2118
  38. lda #$01 : sta $420B ;Activate DMA 0
  39. rts
  40. ; Jumped to from snesheader.a65 - when the game is reseted.
  41. RESET_GAME:
  42. rep #$30 : .al : .xl
  43. lda #$0400 : tcd
  44. ldx #$03FE : txs
  45. sep #$20 : .as
  46. pha
  47. plb
  48. lda #$01
  49. sta $420D ; set "fast" mode
  50. ; Next initialize screen
  51. jsr InitializeScreen
  52. jsr InitializeIRQ
  53. sep #$20 : .as
  54. ;lda #$17
  55. lda #$03
  56. sta $212C ; put screens on
  57. sta $212D ; put screens on
  58. lda #$00: sta $2121
  59. lda #$E0: sta $2122
  60. lda #$7C: sta $2122
  61. jmp @GAME_MAIN
  62. InitializeIRQ:
  63. sep #$20 : .as
  64. lda #$B1 : sta $4200
  65. ldx #0 : stx $4207
  66. ldx #211 : stx $4209
  67. sei
  68. lda $4211
  69. - lda $4210 ;: bpl -
  70. rts
  71. InitializeScreen:
  72. rep #$10 : .xl
  73. sep #$20 : .as
  74. lda #$00 : sta $2101
  75. ldx #$0000 : stx $2102
  76. lda #$09 : sta $2105 ; select screen mode 1.
  77. lda #$00 : sta $2106
  78. lda #TILE_ADDR_REG_VAL(BG1_TILE_ADDR, 0) : sta $2107
  79. lda #TILE_ADDR_REG_VAL(BG2_TILE_ADDR, 0) : sta $2108
  80. lda #TILE_ADDR_REG_VAL(BG3_TILE_ADDR, 0) : sta $2109
  81. lda #TILE_ADDR_REG_VAL(BG4_TILE_ADDR, 0) : sta $210A
  82. lda #BMAP_ADDR_REG_VAL(BG1_BMAP_ADDR, BG2_BMAP_ADDR) : sta $210B
  83. lda #BMAP_ADDR_REG_VAL(BG3_BMAP_ADDR, BG4_BMAP_ADDR) : sta $210C
  84. ; Set scrolling to 0,0 to all bgs
  85. lda #$00 : sta $210D : sta $210D
  86. lda #$00 : sta $210E : sta $210E
  87. lda #$00 : sta $210F : sta $210F
  88. lda #$00 : sta $2110 : sta $2110
  89. lda #$00 : sta $2111 : sta $2111
  90. lda #$00 : sta $2112 : sta $2112
  91. lda #$00 : sta $2113 : sta $2113
  92. lda #$00 : sta $2114 : sta $2114
  93. rts