Advertisement
SethBling

CWNoMT.asm

Jul 8th, 2022
3,457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Patch the Japanese ROM using asar 1.37
  2. ; Most of the code was written by SethBling
  3. ; Save states by IsoFrieze
  4.  
  5. lorom
  6.  
  7. Display0 = $F0
  8. Display1 = $F1
  9. Display2 = $F2
  10. Display3 = $F3
  11. Display4 = $F4
  12. Display5 = $F5
  13.  
  14. DrawTextMode = $F6
  15. TimerHigh = $F7
  16. TimerLow = $F8
  17. PrevScreen = $F9
  18. TongueCompletionPos = $FB
  19. WasJumping = $FD
  20. ItemSwapPos = $FF
  21.  
  22. MarioXLow = $D1
  23. MarioXHigh = $D2
  24. MarioYLow = $D3
  25. SpriteX = $E4
  26. MarioFacing = $76
  27. RidingYoshi = $187A
  28. SpriteStatusTable = $14C8
  29.  
  30. StatusBarTiles = $0EF9
  31.  
  32. Controller1Byte1 = $4218
  33. Controller1Byte2 = $4219
  34. Controller2Byte1 = $421A
  35. Controller2Byte2 = $421B
  36.  
  37. ; BRK Vector
  38. org $00FFE6
  39. DW BRKVector
  40.  
  41. ORG $00FF93
  42. BRKVector:
  43.     BRA BRKVector
  44.  
  45. ; Status bar hook
  46. org $008F8A
  47. JSL Start
  48.  
  49. org $00FFD8
  50.     db $08 ; SRAM Size?
  51.    
  52. org $00A206
  53.     db $00
  54.    
  55. org $00D078
  56.     NOP
  57.     NOP
  58.     NOP
  59.    
  60. org $00C512
  61.     LDA $17
  62.     AND #$30
  63.     BEQ $0D
  64.     BRA $15
  65.    
  66. ;org $01C6B2 ; Chargin Chuck Item Swap Hijack
  67. ;   dw $C6B4
  68.  
  69. org $00FF30
  70. StatusBar:
  71.             JSL MoreWork
  72.  
  73.             LDA DrawTextMode
  74.             BEQ DrawStatusBar
  75.             RTL
  76.  
  77. DrawStatusBar:
  78.             LDX #$22
  79.             LDY #$33
  80. StatusBarLoop:
  81.             LDA MemWatch-2,x
  82.             STA $00
  83.             LDA MemWatch-1,x
  84.             STA $01
  85.             LDA [$00]
  86.             AND #$0F
  87.             STA StatusBarTiles-1,y
  88.             LDA [$00]
  89.             LSR A
  90.             LSR A
  91.             LSR A
  92.             LSR A
  93.             STA StatusBarTiles-2,y
  94.             LDA #$FC
  95.             STA StatusBarTiles-3,y
  96.             DEX
  97.             DEX
  98.             DEY
  99.             DEY
  100.             DEY
  101.             BNE StatusBarLoop
  102.  
  103. SpitPos:  
  104.             ; Clear the spit pos display
  105.             LDA #$FC
  106.             STA StatusBarTiles+$33
  107.             STA StatusBarTiles+$34
  108.             STA StatusBarTiles+$35
  109.             STA StatusBarTiles+$36
  110.  
  111.             ; Prepare the loop to find Yoshi
  112.             LDY #$0A
  113.             LDX RidingYoshi
  114.             BNE SpriteLoop
  115.  
  116.             RTL
  117.            
  118. SpriteLoop:
  119.             DEY
  120.             BPL +
  121.             RTL
  122. +  
  123.             ; Check if Yoshi has shell in mouth
  124.             LDA SpriteStatusTable,Y
  125.             CMP #$07
  126.             BNE SpriteLoop
  127.            
  128.             ; Get Position and calculate spit pos
  129.             LDA MarioXLow
  130.             LDX MarioFacing
  131.             CLC
  132.             ADC.L FacingOffset,X
  133.            
  134.             ; Display spit pos
  135.             PHA
  136.             AND #$0F
  137.             STA StatusBarTiles+$35
  138.             PLA
  139.             LSR A
  140.             LSR A
  141.             LSR A
  142.             LSR A
  143.             STA StatusBarTiles+$34
  144.            
  145.             RTL
  146.  
  147. FacingOffset:
  148.             DB  $EE, $12
  149.  
  150. MemWatch:
  151.             DW SpriteX+0
  152.             DW SpriteX+1
  153.             DW SpriteX+2
  154.             DW SpriteX+3
  155.             DW SpriteX+4
  156.             DW SpriteX+5
  157.             DW Display0
  158.             DW Display1
  159.             DW Display2
  160.             DW $182A
  161.             DW $1829
  162.             DW $0300
  163.             DW $02F4
  164.             DW Controller1Byte1
  165.             DW Controller1Byte2
  166.             DW Controller2Byte1
  167.             DW Controller2Byte2
  168.             DW $00A7 ; Sprite #9 sprite number
  169.  
  170. org $01AB72 ; Shell Kick Hijack
  171.     JSR TestForBlockDupe
  172.    
  173. org $01F347 ; Yoshi Tongue Completion Hijack
  174.     JSR YoshiTongueCompletion
  175.  
  176. org $01FFD0
  177. YoshiTongueCompletion:
  178.     STZ $151C,x
  179.     LDY.b MarioXLow
  180.     STY.b TongueCompletionPos
  181.    
  182.     RTS
  183.    
  184. org $01FFDB
  185. TestForBlockDupe:
  186.     JSL TestForBlockDupeFull
  187.     RTS
  188.  
  189. org $0FF000
  190. TestForBlockDupeFull:
  191.     LDA MarioXHigh
  192.     CMP #$03
  193.     BNE .Wrong
  194.     LDA MarioXLow
  195.     CMP #$6F
  196.     BMI .Wrong
  197.     CMP #$73
  198.     BPL .Wrong
  199.     LDA MarioYLow
  200.     CMP #$4B
  201.     BMI .Wrong
  202.     CMP #$55
  203.     BPL .Wrong
  204.     LDA $7B ; Mario x-velocity
  205.     BNE .NonzeroVelocity
  206.    
  207.     ; Play "Correct" Sound
  208.     LDA #$29
  209.     STA $1DFC
  210.     BRA .Return
  211.    
  212. .NonzeroVelocity:
  213.     LDA #$2A
  214.     STA $1DFC
  215.     BRA .Return
  216.    
  217. .Wrong:
  218.     LDA #$03
  219.     STA $1DF9
  220.    
  221. .Return:
  222.     RTL
  223.  
  224. MoreWork:
  225.     JSR CheckFCJump
  226.     RTL
  227.  
  228. CheckFCJump:
  229.     LDA WasJumping
  230.     CMP $72
  231.     BMI Jumped
  232.     LDA $72
  233.     STA WasJumping
  234.     RTS
  235.    
  236. Jumped:
  237.     LDA $72
  238.     STA WasJumping
  239.    
  240.     LDA $95
  241.     CMP #$01
  242.     BNE NotJumpPos
  243.     LDA $96
  244.     CMP #$30
  245.     BNE NotJumpPos
  246.     LDA $94
  247.  
  248.     CMP #$5C
  249.     BMI NotJumpPos
  250.     CMP #$64
  251.     BPL NotJumpPos
  252.    
  253.    
  254.     ; Play "Correct" Sound
  255.     LDA #$29
  256.     STA $1DFC
  257.  
  258. NotJumpPos:
  259.     RTS
  260.    
  261. org $06C970
  262. Start:
  263. JSL StatusBar
  264.  
  265.  
  266. Code:
  267.         LDA $0DA2 ; byetudlr
  268.         AND #%00100000 ;Select
  269.         BEQ .done
  270.        
  271.         LDA $0DA4 ; axlr----
  272.         AND #%00010000 ; R
  273.         BEQ .test_load
  274.        
  275.         JSL activate_save_state
  276.         BRA .done
  277.        
  278.     .test_load:
  279.         LDA $0DA4 ; axlr----
  280.         AND #%00100000 ;L
  281.         BEQ .done
  282.         JSL activate_load_state
  283.    
  284.     .done:
  285.         RTL
  286.  
  287.     activate_save_state:
  288.         LDA #$0E ; swim sound
  289.         STA $1DF9 ; apu i/o
  290.         LDA #$80
  291.         STA $2100 ; force blank
  292.         STZ $4200 ; nmi disable
  293.        
  294.         JSL go_poverty_save_state
  295.  
  296.         LDA #$00
  297.         STA $7F9D8B
  298.        
  299.         BRA .done
  300.     .done:
  301.        
  302.         LDA #$81
  303.         STA $4200 ; nmi enable     
  304.         LDA #$0F
  305.         STA $2100 ; exit force blank
  306.     .cancel:
  307.         RTL
  308.        
  309. go_poverty_save_state:
  310.         PHP
  311.         REP #$10
  312.        
  313.         ; save wram $0000-$1FFF to wram $7F9C7B-$7FBC7A
  314.         LDX #$1FFF
  315.     .loop_mirror:
  316.         LDA $7E0000,X
  317.         STA $7F9C7B,X
  318.         DEX
  319.         BPL .loop_mirror
  320.        
  321.         ; save wram $C680-$C6DF to $707DA0-$707DFF
  322.         LDX #$005F
  323.     .loop_boss:
  324.         LDA $7EC680,X
  325.         STA $707DA0,X
  326.         DEX
  327.         BPL .loop_boss
  328.        
  329.         ; save wram $7F9A7B-$7F9C7A to $707BA0-$707D9F
  330.         LDX #$01FF
  331.     .loop_wiggler:
  332.         LDA $7F9A7B,X
  333.         STA $707BA0,X
  334.         DEX
  335.         BPL .loop_wiggler
  336.        
  337.         ; save wram $C800-$FFFF to $700BA0-$70439F
  338.         LDX #$37FF
  339.     .loop_tilemap_low:
  340.         LDA $7EC800,X
  341.         STA $700BA0,X
  342.         DEX
  343.         BPL .loop_tilemap_low
  344.        
  345.         ; save wram $7FC800-$7FFFFF to $7043A0-$704ADF
  346.         ; since only bit 0 is used for this data, crunch it into a 1:8 ratio
  347.         ; unrolled inner loop is used for the speed increase
  348.         PHB
  349.         LDA #$70
  350.         PHA
  351.         PLB
  352.        
  353.         LDX #$37F8
  354.         LDY #$06FF
  355.     .loop_tilemap_high:
  356.         LDA $7FC800,X
  357.         STA $00
  358.         LDA $7FC801,X
  359.         STA $01
  360.         LDA $7FC802,X
  361.         STA $02
  362.         LDA $7FC803,X
  363.         STA $03
  364.         LDA $7FC804,X
  365.         STA $04
  366.         LDA $7FC805,X
  367.         STA $05
  368.         LDA $7FC806,X
  369.         STA $06
  370.         LDA $7FC807,X
  371.         STA $07
  372.         LDA #$00
  373.         LSR $00
  374.         ROL A
  375.         LSR $01
  376.         ROL A
  377.         LSR $02
  378.         ROL A
  379.         LSR $03
  380.         ROL A
  381.         LSR $04
  382.         ROL A
  383.         LSR $05
  384.         ROL A
  385.         LSR $06
  386.         ROL A
  387.         LSR $07
  388.         ROL A
  389.         STA $43A0,Y ; $7043A0,Y
  390.         DEX #8
  391.         DEY
  392.         BPL .loop_tilemap_high
  393.        
  394.         ; do these separately because they actually use the upper 7 bits
  395.         LDX #$001F
  396.     .loop_mode7_bridge_a:
  397.         LDA $7FC8B0,X
  398.         STA $704AA0,X
  399.         DEX
  400.         BPL .loop_mode7_bridge_a
  401.        
  402.         LDX #$001F
  403.     .loop_mode7_bridge_b:
  404.         LDA $7FCA60,X
  405.         STA $704AC0,X
  406.         DEX
  407.         BPL .loop_mode7_bridge_b
  408.        
  409.         PLB
  410.        
  411.         ; save cgram w$00-w$FF to $707E00-$707FFF
  412.         LDA #$00
  413.         STA $2121 ; cgram address
  414.         LDX #$7E00
  415.         STX $4302 ; dma0 destination address
  416.         LDA #$70
  417.         STA $4304 ; dma0 destination bank
  418.         LDX #$0200
  419.         STX $4305 ; dma0 length
  420.         LDA #$80 ; 1-byte
  421.         STA $4300 ; dma0 parameters
  422.         LDA #$3B ; $213B cgram data read
  423.         STA $4301 ; dma0 source
  424.         LDA #$01 ; channel 0
  425.         STA $420B ; dma enable
  426.        
  427.         ; save vram w$0000-w$03FF to wram $7FBC7B-$7FC47A
  428.         LDA #$80
  429.         STA $2115 ; vram increment
  430.         LDX #$0000
  431.         STX $2116 ; vram address
  432.         LDX $2139 ; vram data read (dummy read)
  433.         LDX #$BC7B
  434.         STX $4302 ; dma0 destination address
  435.         LDA #$7F
  436.         STA $4304 ; dma0 destination bank
  437.         LDX #$0800
  438.         STX $4305 ; dma0 length
  439.         LDA #$81 ; 2-byte, low-high
  440.         STA $4300 ; dma0 parameters
  441.         LDA #$39 ; $2139 vram data read
  442.         STA $4301 ; dma0 source
  443.         LDA #$01 ; channel 0
  444.         STA $420B ; dma enable
  445.        
  446.         ; save vram w$0400-w$06BF to wram $7EC100-$7EC67F
  447.         LDA #$80
  448.         STA $2115 ; vram increment
  449.         LDX #$0400
  450.         STX $2116 ; vram address
  451.         LDX $2139 ; vram data read (dummy read)
  452.         LDX #$C100
  453.         STX $4302 ; dma0 destination address
  454.         LDA #$7E
  455.         STA $4304 ; dma0 destination bank
  456.         LDX #$0580
  457.         STX $4305 ; dma0 length
  458.         LDA #$81 ; 2-byte, low-high
  459.         STA $4300 ; dma0 parameters
  460.         LDA #$39 ; $2139 vram data read
  461.         STA $4301 ; dma0 source
  462.         LDA #$01 ; channel 0
  463.         STA $420B ; dma enable
  464.        
  465.         ; save vram w$06C0-w$07FF to wram $7FC47B-$7EC6FA
  466.         LDA #$80
  467.         STA $2115 ; vram increment
  468.         LDX #$06C0
  469.         STX $2116 ; vram address
  470.         LDX $2139 ; vram data read (dummy read)
  471.         LDX #$C47B
  472.         STX $4302 ; dma0 destination address
  473.         LDA #$7F
  474.         STA $4304 ; dma0 destination bank
  475.         LDX #$0280
  476.         STX $4305 ; dma0 length
  477.         LDA #$81 ; 2-byte, low-high
  478.         STA $4300 ; dma0 parameters
  479.         LDA #$39 ; $2139 vram data read
  480.         STA $4301 ; dma0 source
  481.         LDA #$01 ; channel 0
  482.         STA $420B ; dma enable
  483.        
  484.         ; save vram w$0800-w$0FFF to wram $7F877B-$7F977A
  485.         LDA #$80
  486.         STA $2115 ; vram increment
  487.         LDX #$0800
  488.         STX $2116 ; vram address
  489.         LDX $2139 ; vram data read (dummy read)
  490.         LDX #$877B
  491.         STX $4302 ; dma0 destination address
  492.         LDA #$7F
  493.         STA $4304 ; dma0 destination bank
  494.         LDX #$1000
  495.         STX $4305 ; dma0 length
  496.         LDA #$81 ; 2-byte, low-high
  497.         STA $4300 ; dma0 parameters
  498.         LDA #$39 ; $2139 vram data read
  499.         STA $4301 ; dma0 source
  500.         LDA #$01 ; channel 0
  501.         STA $420B ; dma enable
  502.        
  503.         ; save vram w$1000-w$3FFF to wram $7F0000-$7F5FFF
  504.         LDA #$80
  505.         STA $2115 ; vram increment
  506.         LDX #$1000
  507.         STX $2116 ; vram address
  508.         LDX $2139 ; vram data read (dummy read)
  509.         LDX #$0000
  510.         STX $4302 ; dma0 destination address
  511.         LDA #$7F
  512.         STA $4304 ; dma0 destination bank
  513.         LDX #$6000
  514.         STX $4305 ; dma0 length
  515.         LDA #$81 ; 2-byte, low-high
  516.         STA $4300 ; dma0 parameters
  517.         LDA #$39 ; $2139 vram data read
  518.         STA $4301 ; dma0 source
  519.         LDA #$01 ; channel 0
  520.         STA $420B ; dma enable
  521.        
  522.         ; save vram w$5000-w$5FFF to wram $704AE0-$706ADF
  523.         LDA #$80
  524.         STA $2115 ; vram increment
  525.         LDX #$5000
  526.         STX $2116 ; vram address
  527.         LDX $2139 ; vram data read (dummy read)
  528.         LDX #$4AE0
  529.         STX $4302 ; dma0 destination address
  530.         LDA #$70
  531.         STA $4304 ; dma0 destination bank
  532.         LDX #$2000
  533.         STX $4305 ; dma0 length
  534.         LDA #$81 ; 2-byte, low-high
  535.         STA $4300 ; dma0 parameters
  536.         LDA #$39 ; $2139 vram data read
  537.         STA $4301 ; dma0 source
  538.         LDA #$01 ; channel 0
  539.         STA $420B ; dma enable
  540.        
  541.         ; save vram w$7000-w$7FFF to wram $7F6000-$7F7FFF
  542.         LDA #$80
  543.         STA $2115 ; vram increment
  544.         LDX #$7000
  545.         STX $2116 ; vram address
  546.         LDX $2139 ; vram data read (dummy read)
  547.         LDX #$6000
  548.         STX $4302 ; dma0 destination address
  549.         LDA #$7F
  550.         STA $4304 ; dma0 destination bank
  551.         LDX #$2000
  552.         STX $4305 ; dma0 length
  553.         LDA #$81 ; 2-byte, low-high
  554.         STA $4300 ; dma0 parameters
  555.         LDA #$39 ; $2139 vram data read
  556.         STA $4301 ; dma0 source
  557.         LDA #$01 ; channel 0
  558.         STA $420B ; dma enable
  559.        
  560.         ; save the stack pointer to $7FC7F7 - $7FC7F8
  561.         REP #$30
  562.         TSX
  563.         TXA
  564.         STA $7FC7F7
  565.        
  566.         ; save the currently used music to $7FC7F9
  567.         SEP #$20
  568.         LDA $2142
  569.         STA $7FC7F9
  570.        
  571.     .done:
  572.         PLP
  573.         RTL
  574.        
  575.        
  576.     activate_load_state:
  577.         LDA #$80
  578.         STA $2100 ; force blank
  579.         STZ $4200 ; nmi disable
  580.         JSL go_poverty_load_state
  581.        
  582.         BRA .done
  583.  
  584.     .done:
  585.     redirect_load_state:
  586.         JSL restore_hardware_regs
  587.         LDA #$81
  588.         STA $4200 ; nmi enable
  589.  
  590.         LDA #$01
  591.         INC A
  592.         ASL #3
  593.         TAX
  594.     .loop:
  595.         DEX
  596.         BEQ .done_waiting
  597.         WAI ; wait for NMI
  598.         STZ $2100
  599.         WAI ; wait for IRQ
  600.         STZ $2100
  601.         BRA .loop
  602.    
  603.     .done_waiting:
  604.     cancel:
  605.         RTL
  606.        
  607. go_poverty_load_state:
  608.         PHP
  609.    
  610.     .increment_load_count
  611.         REP #$20
  612.         LDA $7F9D8B
  613.         INC A
  614.         STA $7F9D8B
  615.         SEP #$20
  616.    
  617.     .letsgo:
  618.        
  619.         REP #$10
  620.        
  621.         ; load wram $7F9C7B-$7FBC7A to wram $0000-$1FFF
  622.         LDX #$1FFF
  623.     .loop_mirror:
  624.         LDA $7F9C7B,X
  625.         STA $7E0000,X
  626.         DEX
  627.         BPL .loop_mirror
  628.        
  629.         ; load $707DA0-$707DFF to wram $C680-$C6DF
  630.         LDX #$005F
  631.     .loop_boss:
  632.         LDA $707DA0,X
  633.         STA $7EC680,X
  634.         DEX
  635.         BPL .loop_boss
  636.        
  637.         ; load $707BA0-$707D9F to wram $7F9A7B-$7F9C7A
  638.         LDX #$01FF
  639.     .loop_wiggler:
  640.         LDA $707BA0,X
  641.         STA $7F9A7B,X
  642.         DEX
  643.         BPL .loop_wiggler
  644.        
  645.         ; load $700BA0-$70439F to wram $C800-$FFFF
  646.         LDX #$37FF
  647.     .loop_tilemap_low:
  648.         LDA $700BA0,X
  649.         STA $7EC800,X
  650.         DEX
  651.         BPL .loop_tilemap_low
  652.        
  653.         ; load $7043A0-$704ABF to wram $7FC800-$7FFFFF
  654.         ; since only bit 0 is used for this data, expand it into a 8:1 ratio
  655.         ; unrolled inner loop is used for the speed increase
  656.         LDX #$0007
  657.     .loop_prepare_scratch:
  658.         STZ $00,X
  659.         DEX
  660.         BPL .loop_prepare_scratch
  661.        
  662.         PHB
  663.         LDA #$70
  664.         PHA
  665.         PLB
  666.        
  667.         LDX #$37F8
  668.         LDY #$06FF
  669.     .loop_tilemap_high:
  670.         LDA $43A0,Y ; $7043A0,Y
  671.         LSR $07
  672.         ROR A
  673.         ROL $07
  674.         LSR $06
  675.         ROR A
  676.         ROL $06
  677.         LSR $05
  678.         ROR A
  679.         ROL $05
  680.         LSR $04
  681.         ROR A
  682.         ROL $04
  683.         LSR $03
  684.         ROR A
  685.         ROL $03
  686.         LSR $02
  687.         ROR A
  688.         ROL $02
  689.         LSR $01
  690.         ROR A
  691.         ROL $01
  692.         LSR $00
  693.         ROR A
  694.         ROL $00
  695.         LDA $00
  696.         STA $7FC800,X
  697.         LDA $01
  698.         STA $7FC801,X
  699.         LDA $02
  700.         STA $7FC802,X
  701.         LDA $03
  702.         STA $7FC803,X
  703.         LDA $04
  704.         STA $7FC804,X
  705.         LDA $05
  706.         STA $7FC805,X
  707.         LDA $06
  708.         STA $7FC806,X
  709.         LDA $07
  710.         STA $7FC807,X
  711.         DEX #8
  712.         DEY
  713.         BPL .loop_tilemap_high
  714.        
  715.         ; do these separately because they actually use the upper 7 bits
  716.         LDX #$001F
  717.     .loop_mode7_bridge_a:
  718.         LDA $704AA0,X
  719.         STA $7FC8B0,X
  720.         DEX
  721.         BPL .loop_mode7_bridge_a
  722.        
  723.         LDX #$001F
  724.     .loop_mode7_bridge_b:
  725.         LDA $704AC0,X
  726.         STA $7FCA60,X
  727.         DEX
  728.         BPL .loop_mode7_bridge_b
  729.        
  730.         PLB
  731.        
  732.         ; load $707E00-$707FFF to cgram w$00-w$FF
  733.         LDA #$00
  734.         STA $2121 ; cgram address
  735.         LDX #$7E00
  736.         STX $4302 ; dma0 destination address
  737.         LDA #$70
  738.         STA $4304 ; dma0 destination bank
  739.         LDX #$0200
  740.         STX $4305 ; dma0 length
  741.         STZ $4300 ; dma0 parameters
  742.         LDA #$22 ; $2122 cgram data write
  743.         STA $4301 ; dma0 source
  744.         LDA #$01 ; channel 0
  745.         STA $420B ; dma enable
  746.        
  747.         ; load wram $7FBC7B-$7FC47A to vram w$0000-w$03FF
  748.         LDA #$80
  749.         STA $2115 ; vram increment
  750.         LDX #$0000
  751.         STX $2116 ; vram address
  752.         LDX #$BC7B
  753.         STX $4302 ; dma0 destination address
  754.         LDA #$7F
  755.         STA $4304 ; dma0 destination bank
  756.         LDX #$0800
  757.         STX $4305 ; dma0 length
  758.         LDA #$01 ; 2-byte, low-high
  759.         STA $4300 ; dma0 parameters
  760.         LDA #$18 ; $2118 vram data write
  761.         STA $4301 ; dma0 source
  762.         LDA #$01 ; channel 0
  763.         STA $420B ; dma enable
  764.        
  765.         ; load wram $7EC100-$7EC67F to vram w$0400-w$06BF
  766.         LDA #$80
  767.         STA $2115 ; vram increment
  768.         LDX #$0400
  769.         STX $2116 ; vram address
  770.         LDX #$C100
  771.         STX $4302 ; dma0 destination address
  772.         LDA #$7E
  773.         STA $4304 ; dma0 destination bank
  774.         LDX #$0580
  775.         STX $4305 ; dma0 length
  776.         LDA #$01 ; 2-byte, low-high
  777.         STA $4300 ; dma0 parameters
  778.         LDA #$18 ; $2118 vram data write
  779.         STA $4301 ; dma0 source
  780.         LDA #$01 ; channel 0
  781.         STA $420B ; dma enable
  782.        
  783.         ; load wram $7FC47B-$7EC6FA to vram w$06C0-w$07FF
  784.         LDA #$80
  785.         STA $2115 ; vram increment
  786.         LDX #$06C0
  787.         STX $2116 ; vram address
  788.         LDX #$C47B
  789.         STX $4302 ; dma0 destination address
  790.         LDA #$7F
  791.         STA $4304 ; dma0 destination bank
  792.         LDX #$0280
  793.         STX $4305 ; dma0 length
  794.         LDA #$01 ; 2-byte, low-high
  795.         STA $4300 ; dma0 parameters
  796.         LDA #$18 ; $2118 vram data write
  797.         STA $4301 ; dma0 source
  798.         LDA #$01 ; channel 0
  799.         STA $420B ; dma enable
  800.        
  801.         ; load wram $7F877B-$7F977A to vram w$0800-w$0FFF
  802.         LDA #$80
  803.         STA $2115 ; vram increment
  804.         LDX #$0800
  805.         STX $2116 ; vram address
  806.         LDX #$877B
  807.         STX $4302 ; dma0 destination address
  808.         LDA #$7F
  809.         STA $4304 ; dma0 destination bank
  810.         LDX #$1000
  811.         STX $4305 ; dma0 length
  812.         LDA #$01 ; 2-byte, low-high
  813.         STA $4300 ; dma0 parameters
  814.         LDA #$18 ; $2118 vram data write
  815.         STA $4301 ; dma0 source
  816.         LDA #$01 ; channel 0
  817.         STA $420B ; dma enable
  818.        
  819.         ; load wram $7F0000-$7F5FFF to vram w$1000-w$3FFF
  820.         LDA #$80
  821.         STA $2115 ; vram increment
  822.         LDX #$1000
  823.         STX $2116 ; vram address
  824.         LDX #$0000
  825.         STX $4302 ; dma0 destination address
  826.         LDA #$7F
  827.         STA $4304 ; dma0 destination bank
  828.         LDX #$6000
  829.         STX $4305 ; dma0 length
  830.         LDA #$01 ; 2-byte, low-high
  831.         STA $4300 ; dma0 parameters
  832.         LDA #$18 ; $2118 vram data write
  833.         STA $4301 ; dma0 source
  834.         LDA #$01 ; channel 0
  835.         STA $420B ; dma enable
  836.        
  837.         ; load wram $704AE0-$706ADF to vram w$5000-w$5FFF
  838.         LDA #$80
  839.         STA $2115 ; vram increment
  840.         LDX #$5000
  841.         STX $2116 ; vram address
  842.         LDX #$4AE0
  843.         STX $4302 ; dma0 destination address
  844.         LDA #$70
  845.         STA $4304 ; dma0 destination bank
  846.         LDX #$2000
  847.         STX $4305 ; dma0 length
  848.         LDA #$01 ; 2-byte, low-high
  849.         STA $4300 ; dma0 parameters
  850.         LDA #$18 ; $2118 vram data write
  851.         STA $4301 ; dma0 source
  852.         LDA #$01 ; channel 0
  853.         STA $420B ; dma enable
  854.        
  855.         ; load wram $7F6000-$7F7FFF to vram w$7000-w$7FFF
  856.         LDA #$80
  857.         STA $2115 ; vram increment
  858.         LDX #$7000
  859.         STX $2116 ; vram address
  860.         LDX #$6000
  861.         STX $4302 ; dma0 destination address
  862.         LDA #$7F
  863.         STA $4304 ; dma0 destination bank
  864.         LDX #$2000
  865.         STX $4305 ; dma0 length
  866.         LDA #$01 ; 2-byte, low-high
  867.         STA $4300 ; dma0 parameters
  868.         LDA #$18 ; $2118 vram data write
  869.         STA $4301 ; dma0 source
  870.         LDA #$01 ; channel 0
  871.         STA $420B ; dma enable
  872.        
  873.         ; load the stack pointer from $7FC7F7 - $7FC7F8
  874.         REP #$30
  875.         LDA $7FC7F7
  876.         TAX
  877.         TXS
  878.        
  879.         ; load the currently used music from $7FC7F9
  880.         SEP #$20
  881.         LDA $7FC7F9
  882.         CMP $2142
  883.         BEQ .same_music
  884.         STA $2142
  885.     .same_music:
  886.         REP #$20
  887.        
  888.         ; since we restored the stack, we need to update the return
  889.         ; address of this routine to what we want it to be. otherwise,
  890.         ; it would return to the save state routine.
  891.         LDX #redirect_load_state-1
  892.         TXA
  893.         STA $02,S
  894.        
  895.     .done:
  896.         PLP
  897.         RTL
  898.        
  899.     restore_hardware_regs:
  900.         LDA $0DB0 ; mosaic mirror
  901.         ORA #$03
  902.         STA $2106 ; mosaic
  903.        
  904.         LDA $0D9D ; tm mirror
  905.         STA $212C ; tm
  906.         STA $212E ; tmw
  907.         LDA $0D9E ; ts mirror
  908.         STA $212D ; ts
  909.         STA $212F ; tsw
  910.        
  911.         LDA #$23 ; sometimes #$59 ($008416)
  912.         STA $2107 ; gb1sc
  913.         LDA #$33
  914.         STA $2108 ; gb2sc
  915.         LDA #$53
  916.         STA $2109 ; gb3sc
  917.         LDA #$00 ; sometimes #$07 ($008416)
  918.         STA $210B ; bg12nba
  919.         LDA #$04
  920.         STA $210C ; bg34nba
  921.         RTL
  922.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement