StartupSnes.asm 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. ; SNES ROM startup code
  2. ;******************************************************************************
  3. ;*** Define a special section in case most of the code is not in bank 0. ***
  4. ;******************************************************************************
  5. ;STACK EQU $01ff ;CHANGE THIS FOR YOUR SYSTEM
  6. ;STARTUP SECTION OFFSET $008000
  7. CODE
  8. XDEF START
  9. START:
  10. XREF _~main
  11. sei ; Disabled interrupts
  12. clc ; clear carry to switch to native mode
  13. xce ; Xchange carry & emulation bit. native mode
  14. rep #$18 ; Binary mode (decimal mode off), X/Y 16 bit
  15. LONGI ON
  16. ldx #$1FFF ; set stack to $1FFF
  17. txs
  18. rep #$30
  19. longa on
  20. longi on
  21. ; Init data used for heap
  22. ; see heap definition below
  23. XREF _~_heap_top
  24. XREF _~_mem_start
  25. stz _~_heap_top
  26. stz _~_mem_start
  27. XREF _~preInit
  28. jsr >_~preInit
  29. sep #$30 ; X,Y,A are 8 bit numbers
  30. LONGA OFF
  31. LONGI OFF
  32. lda #$8F ; screen off, full brightness
  33. sta $2100 ; brightness + screen enable register
  34. stz $2101 ; Sprite register (size + address in VRAM)
  35. stz $2102 ; Sprite registers (address of sprite memory [OAM])
  36. stz $2103 ; "" ""
  37. stz $2105 ; Mode 0, = Graphic mode register
  38. stz $2106 ; noplanes, no mosaic, = Mosaic register
  39. stz $2107 ; Plane 0 map VRAM location
  40. stz $2108 ; Plane 1 map VRAM location
  41. stz $2109 ; Plane 2 map VRAM location
  42. stz $210A ; Plane 3 map VRAM location
  43. stz $210B ; Plane 0+1 Tile data location
  44. stz $210C ; Plane 2+3 Tile data location
  45. stz $210D ; Plane 0 scroll x (first 8 bits)
  46. stz $210D ; Plane 0 scroll x (last 3 bits) #$0 - #$07ff
  47. stz $210E ; Plane 0 scroll y (first 8 bits)
  48. stz $210E ; Plane 0 scroll y (last 3 bits) #$0 - #$07ff
  49. stz $210F ; Plane 1 scroll x (first 8 bits)
  50. stz $210F ; Plane 1 scroll x (last 3 bits) #$0 - #$07ff
  51. stz $2110 ; Plane 1 scroll y (first 8 bits)
  52. stz $2110 ; Plane 1 scroll y (last 3 bits) #$0 - #$07ff
  53. stz $2111 ; Plane 2 scroll x (first 8 bits)
  54. stz $2111 ; Plane 2 scroll x (last 3 bits) #$0 - #$07ff
  55. stz $2112 ; Plane 2 scroll y (first 8 bits)
  56. stz $2112 ; Plane 2 scroll y (last 3 bits) #$0 - #$07ff
  57. stz $2113 ; Plane 3 scroll x (first 8 bits)
  58. stz $2113 ; Plane 3 scroll x (last 3 bits) #$0 - #$07ff
  59. stz $2114 ; Plane 3 scroll y (first 8 bits)
  60. stz $2114 ; Plane 3 scroll y (last 3 bits) #$0 - #$07ff
  61. lda #$80 ; increase VRAM address after writing to $2119
  62. sta $2115 ; VRAM address increment register
  63. stz $2116 ; VRAM address low
  64. stz $2117 ; VRAM address high
  65. stz $211A ; Initial Mode 7 setting register
  66. stz $211B ; Mode 7 matrix parameter A register (low)
  67. lda #$01
  68. sta $211B ; Mode 7 matrix parameter A register (high)
  69. stz $211C ; Mode 7 matrix parameter B register (low)
  70. stz $211C ; Mode 7 matrix parameter B register (high)
  71. stz $211D ; Mode 7 matrix parameter C register (low)
  72. stz $211D ; Mode 7 matrix parameter C register (high)
  73. stz $211E ; Mode 7 matrix parameter D register (low)
  74. sta $211E ; Mode 7 matrix parameter D register (high)
  75. stz $211F ; Mode 7 center position X register (low)
  76. stz $211F ; Mode 7 center position X register (high)
  77. stz $2120 ; Mode 7 center position Y register (low)
  78. stz $2120 ; Mode 7 center position Y register (high)
  79. stz $2121 ; Color number register ($0-ff)
  80. stz $2123 ; BG1 & BG2 Window mask setting register
  81. stz $2124 ; BG3 & BG4 Window mask setting register
  82. stz $2125 ; OBJ & Color Window mask setting register
  83. stz $2126 ; Window 1 left position register
  84. stz $2127 ; Window 2 left position register
  85. stz $2128 ; Window 3 left position register
  86. stz $2129 ; Window 4 left position register
  87. stz $212A ; BG1, BG2, BG3, BG4 Window Logic register
  88. stz $212B ; OBJ, Color Window Logic Register (or,and,xor,xnor)
  89. sta $212C ; Main Screen designation (planes, sprites enable)
  90. stz $212D ; Sub Screen designation
  91. stz $212E ; Window mask for Main Screen
  92. stz $212F ; Window mask for Sub Screen
  93. lda #$30
  94. sta $2130 ; Color addition & screen addition init setting
  95. stz $2131 ; Add/Sub sub designation for screen, sprite, color
  96. lda #$E0
  97. sta $2132 ; color data for addition/subtraction
  98. stz $2133 ; Screen setting (interlace x,y/enable SFX data)
  99. stz $4200 ; Enable V-blank, interrupt, Joypad register
  100. lda #$FF
  101. sta $4201 ; Programmable I/O port
  102. stz $4202 ; Multiplicand A
  103. stz $4203 ; Multiplier B
  104. stz $4204 ; Multiplier C
  105. stz $4205 ; Multiplicand C
  106. stz $4206 ; Divisor B
  107. stz $4207 ; Horizontal Count Timer
  108. stz $4208 ; Horizontal Count Timer MSB (most significant bit)
  109. stz $4209 ; Vertical Count Timer
  110. stz $420A ; Vertical Count Timer MSB
  111. stz $420B ; General DMA enable (bits 0-7)
  112. stz $420C ; Horizontal DMA (HDMA) enable (bits 0-7)
  113. stz $420D ; Access cycle designation (slow/fast rom)
  114. cli ; Enable interrupts
  115. rep #$30
  116. longa on
  117. longi on
  118. jsr >_~main
  119. brk
  120. XDEF IRQ
  121. IRQ:
  122. XREF _~IRQHandler
  123. LONGA ON
  124. LONGI ON
  125. rep #$30
  126. pha
  127. phx
  128. phy
  129. jsr _~IRQHandler
  130. ply
  131. plx
  132. pla
  133. rti
  134. XDEF NMI
  135. NMI:
  136. XREF _~NMIHandler
  137. LONGA ON
  138. LONGI ON
  139. rep #$30
  140. pha
  141. phx
  142. phy
  143. phd
  144. phb
  145. lda #$0000
  146. sep #$30 ; X,Y,A are 8 bit numbers
  147. LONGA OFF
  148. LONGI OFF
  149. lda $4210 ; Read NMI
  150. LONGA ON
  151. LONGI ON
  152. rep #$30
  153. jsr _~NMIHandler
  154. plb
  155. pld
  156. ply
  157. plx
  158. pla
  159. rti
  160. DIRQ:
  161. rti
  162. ENDS
  163. ;******************************************************************************
  164. ;*** Heap definition ***
  165. ;******************************************************************************
  166. DATA
  167. XDEF _~heap_start
  168. XDEF _~heap_end
  169. _~heap_start:
  170. WORD $1000
  171. _~heap_end:
  172. WORD $1200
  173. ;******************************************************************************
  174. ;*** SNES ROM Registartion Data ***
  175. ;******************************************************************************
  176. REGISTRATION_DATA SECTION
  177. MAKER_CODE FCC /FF/
  178. GAME_CODE FCC /SMWJ/
  179. FIXED_VALUE0 BYTE $00, $00, $00, $00, $00, $00, $00
  180. EXPANSION_RAM_SIZE BYTE $00
  181. SPECIAL_VERSION BYTE $00
  182. CARTRIDGE_TYPE_SUB BYTE $00
  183. GAME_TITLE FCC /GAME TITLE !/
  184. ;012345678901234567890;
  185. MAP_MODE BYTE $20
  186. CARTRIDGE_SIZE BYTE $00
  187. ROM_SIZE BYTE $08
  188. RAM_SIZE BYTE $00
  189. DESTINATION_CODE BYTE $00
  190. FIXED_VALUE1 BYTE $33
  191. MASK_ROM_VERSION BYTE $00
  192. COMPLEMENT_CHECK BYTE $00, $00
  193. CHEKSUM BYTE $00, $00
  194. ;******************************************************************************
  195. ;*** SNES Interrupts and Reset vector ***
  196. ;******************************************************************************
  197. VECTORS SECTION
  198. ; Native vector
  199. N_COP DW DIRQ
  200. N_BRK DW DIRQ
  201. N_ABORT DW DIRQ
  202. N_NMI DW NMI
  203. N_RSRVD DW DIRQ
  204. N_IRQ DW IRQ
  205. DS 4
  206. ; Emulation vector
  207. E_COP DW DIRQ
  208. E_RSRVD DW DIRQ
  209. E_ABORT DW DIRQ
  210. E_NMI DW DIRQ
  211. E_RESET DW START
  212. E_IRQ DW DIRQ
  213. END