Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;================;
- ; Pause Menu MODDED ;
- ;================;
- !Freespace = $1596F8 ; x1000 bytes (minimum).
- !Scr = $0F ; How dark the screen is when pausing.
- ; (00-0F, where 00 = complete blackness, 0F = normal brightness).
- !Palette = $39 ;Palette of Menu.
- ;Palette 8 = $31 ; Sandy-ish Yellow.
- ;Palette 9 = $33 ; Grey
- ;Palette A = $35 ; Bright Yellow.
- ;Palette B = $37 ; Blue.
- ;Palette C = $39 ; Red.
- ;Palette D = $3B ; Green.
- ;Palette E = $3D ; Dark grey.
- ;Palette F = $3F ;
- ; DON'T USE ANYTHING ELSE.
- ;================;
- ; Pause Code ;
- ;================;
- header
- lorom
- org $818F ; SNES ($00/818F), PC [x00038F]
- JSL ShowPauseMenu ; Hijack APU I/O Port, run every frame.
- NOP #2 ; Terminate last 2 bytes.
- org $8463 ; SNES ($00/8463], PC [x000663]
- JSL ChangeOAM ; Hijack Sprite DMA.
- NOP ; Terminate last byte.
- org $A233 ; (LDA $13D4 : EOR #$01 : STA $13D4)
- INC $13D4 ; Don't flip $13D4 - $13D4 == 02.
- NOP #5 ; Terminate 5 unneeded bytes.
- org $806B ; Hijack Interrupt routine.
- JSL UpdateOAM ; OAM is updated here.
- org $800A ;\ Clear OAM RIGHT at the beginning of the game.
- JSL ClearOAM ; | STZ $2140
- NOP #2 ;/ STZ $2141
- org $FFD7
- db $0C, $03,$01,$33
- ;===========================;
- org !Freespace ;
- !CodeSize = Ending-Routine ;
- db "STAR" ;
- dw !CodeSize-$01 ;
- dw !CodeSize-$01^$FFFF ;
- Routine: ;
- ;===========================;
- ;FORMAT:
- ;Y = Size of table - 1.
- ;X = Position tiles get draw to on menu.
- ;A = Table.
- ;Store A to $00 in 16-bit mode.
- ;Jump to "Draw"
- ;LDY #$02 ; Table size (-1).
- ;LDX #$20 ; Position.
- ;REP #$20 ; 16-bit mode.
- ;LDA #Tbl ; Table.
- ;STA $00 ; Store to $00.
- ;SEP #$20 ; Return to 8-bit mode.
- ;JSR Draw ; Draw tile data to pause menu.
- ;==================;
- ; Main Menu Code ;
- ;==================;
- MenuPtr:
- dw Main ; 00
- dw Main ; 01
- dw Main ; 02
- dw Main ; 03
- ;==========;
- ;Main Menu ;
- ;==========;
- Main:
- RTS
- ;=======================;
- ; Option Pointer Code ;
- ;=======================;
- OptionPtr:
- dw Option1 ; 00
- Option1:
- RTS
- MenuBGTilemap:
- db $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06 ;\
- db $06, $06, $06, $06, $06, $06, $06, $00, $01, $02, $03, $04, $05 ; |
- db $06, $06, $06, $06, $06, $2B, $06, $10, $11, $12, $13, $14, $15 ; |
- db $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06 ; | Tilemap for Menu.
- db $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06 ; | Customisable.
- db $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06 ; | (75 tiles).
- db $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06 ; |
- db $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06 ; |
- db $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06, $06 ;/
- ;==================;
- ; DisplayPause ;
- ;==================;
- NotPaused:
- RTL
- ShowPauseMenu:
- LDA $13D4 ;\
- BEQ NotPaused ;/ If not pausing, terminate.
- CMP #$01 ;\
- BNE NoBackUpGFX ;/ If $13D4 == 02, execute pausing.
- LDA #!Scr ;\
- STA $0DAE ;/ Darken the screen.
- LDA #$70 ;\
- STA $4304 ; |
- LDA #$81 ; | DMA -> VRAM.
- STA $4300 ; |
- LDA #$39 ; |
- STA $4301 ; |
- REP #$20 ; |
- LDA #$7000 ; | Destination = Sprite VRAM.
- STA $2116 ; |
- LDA #$1000 ; |
- STA $4302 ; |
- LDA #$800 ; |
- STA $4305 ; |
- SEP #$20 ; | Accum = 8 bit.
- LDA #$01 ; |
- STA $420B ; |
- PHK ; | Pull program bank.
- PLA ; | As current bank.
- STA $4304 ; |
- LDA #$01 ; |
- STA $4300 ; |
- LDA #$18 ; |
- STA $4301 ; |
- REP #$20 ; | Accum = 16 bit.
- LDA #$7000 ; | Destination = Sprite VRAM.
- STA $2116 ; |
- LDA #Tilemap ; | Get .bin file ..
- STA $4302 ; | As tilemap in DMA.
- LDA #$800 ; |
- STA $4305 ; |
- SEP #$20 ; | Accum = 8 bit.
- LDA #$01 ; |
- STA $420B ; |
- LDA #$00 ; | Initiate:
- STA $7006FF ; | Main Menu Pointer,
- STA $7006FE ; | Option Pointer,
- INC $13D4 ;/ $13D4 == 03.
- NoBackUpGFX:
- LDA $13D4 ;\
- CMP #$3 ; | If $13D4 != 03 (i.e. unpausing initially)..
- BEQ RestoreGFX ; |
- RTL ;/ Return.
- RestoreGFX: LDA #$70 ;\
- STA $4304 ; |
- LDA #$01 ; |
- STA $4300 ; |
- LDA #$18 ; |
- STA $4301 ; |
- REP #$20 ; | Accum = 16 bit.
- LDA #$6FFE ; | Destination = Sprite VRAM.
- STA $2116 ; |
- LDA $2139 ; |
- LDA #$1000 ; |
- STA $4302 ; | Restore all DMA register stuff back.
- LDA #$800 ; |
- STA $4305 ; |
- SEP #$20 ; | Accum = 8 bit.
- LDA #$01 ; |
- STA $420B ; |
- STZ $13D4 ; | After restoring index, $13D4 == 0, unpaused.
- LDA #$0F ; |
- STA $0DAE ; | Restore screen brightness.
- RTL ;/
- ;==================;
- ; Clear Next OAM ;
- ;==================;
- Clear2ndOAM:
- PHX ;\ Preserve X.
- PHP ;/ And the nvmxdizc register.
- REP #$30 ;\ Accum = 16 bit.
- LDX #$0000 ; |
- LDA #$FFFF ; |
- - STA $700700,x ; |
- INX ; |
- INX ; |
- CPX #$1FF ; | Loop if X < 512.
- BCC - ; |
- LDA #$0000 ; |
- - STA $700700,x ; |
- INX ; |
- INX ; |
- CPX #$220 ; | Loop if X < 544.
- BCC - ; |
- SEP #$30 ; | Accum = 8 bit.
- LDX #$75 ; | Maximum tile size for background.
- - LDA MenuBGTilemap,x ; | Load current tile.
- STA $700600,x ; | Draw to menu RAM..
- DEX ; |
- BPL - ; | Until all tiles are drawn.
- PLP ; | Pull the envmxdizc register.
- PLX ; | Pull X.
- RTS ;/ End.
- DrawMenu:
- PHB ;\ Push data bank.
- PHP ; | Pull the nvmxdizc register.
- SEP #$30 ; | Accumulator = 8 bit.
- LDA #$70 ; |
- PHA ; |
- PLB ; | Data bank = $70.
- LDA #$37 ; |!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- STA $00 ; | X Position.
- LDA #$48 ; |!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- STA $01 ; | Y Position.
- REP #$10 ; | Accumulator = 16 bit.
- LDX #$0000 ; |
- LDY #$0000 ; |
- loop2: LDA $00 ; |
- STA $0700,x ; |
- INX ; |
- CLC ; |
- ADC #$08 ; |
- STA $00 ; |
- LDA $01 ; |
- STA $0700,x ; |
- INX ; |
- LDA $00 ; | If Y Position ..
- CMP #$A8 ; | < A8..
- BCC + ; | Branch.
- LDA $01 ; |
- CLC ; |
- ADC #$08 ; | X Pos + 8.
- STA $01 ; |
- LDA #$40 ; |
- STA $00 ; |
- + ; |
- LDA $0600,y ; |
- INY ; |
- STA $0700,x ; |
- INX ; |
- LDA #!Palette ; | YXPPCCCT byte.
- STA $0700,x ; | Priority should be maximum.
- INX ; |
- CPY #$0075 ; | Add YXPPCCCT byte for all tiles.
- BCC loop2 ; | Repeat loop.
- PLP ; | Pull nvmxdizc register ..
- PLB ; | And data bank..
- RTS ;/ And terminate.
- ;=============;
- ; Draw Data ;
- ;=============;
- Draw:
- LDA ($00),y ;\ Get Tilemaps indexed by tile size.
- STA $700600,x ; | Store into Pause RAM.
- DEX ; | Decrease current position by 1.
- DEY ; | Decrease tile to draw.
- BPL Draw ; | If != 0, loop.
- RTS ;/ TODO: Make a better code.
- ;=============;
- ; Change OAM ;
- ;=============;
- ChangeOAM:
- LDY $13D4 ;\
- BEQ + ; | If $13D4 == 0, branch.
- LDY #$70 ; |
- STY $4304 ; |
- LDA #$0700 ; |
- STA $4302 ; |
- + LDY #$01 ; | Restore hacked code.
- STY $420B ; |
- RTL ;/
- ;=============;
- ; Update OAM ;
- ;=============;
- UpdateOAM:
- LDA $13D4 ;\
- BEQ + ; | If $13D4 == 0, branch.
- LDA $10 ; |
- BEQ $FC ; | Chocolate Island 2 Infinite Loop.
- JSR Clear2ndOAM ; |
- PHB ; |
- PHK ; | Make this our data bank.
- PLB ; |
- LDA $7006FF ; | Use $7006FF ..
- ASL A ; | *2
- TAX ; | -> X.
- JSR (MenuPtr,x) ; | As a pointer.
- PLB ; | Restore data bank.
- JSR DrawMenu ; | Draw menu tilemap.
- RTL ;/ Terminate.
- + LDA $10 ;\
- BEQ $FC ;/ Chocolate Island 2 Infinite Loop.
- PHB ;\
- PHK ; | Make this our program bank.
- PLB ; |
- PLB ; | Useless code.
- RTL ;/
- ;===========;
- ; ClearOAM ;
- ;===========;
- ClearOAM:
- CLC ;\ Carry flag = set.
- XCE ; | Exchange with emulation bit.
- JSR Clear2ndOAM ; |
- SEC ; |
- XCE ; |
- STZ $2140 ; | Restore previously hacked code.
- STZ $2141 ; |
- LDA #$00 ; | Clear out:
- STA $7006FF ; | Menu Pointer.
- STA $7006FE ; | Option Pointer.
- RTL ;/
- Tilemap:
- incbin Tilemaps.bin ; Get tilemap file.
- ;========;
- ; EOF ;
- Ending: ;
- ;========;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement