Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;--------------------------------------
- ;Save/Load game, branch title/stage select
- .byte "SAVE-LOAD"
- .Save_YIndex = $04
- .Save_FileClear = $11
- .Save_CursorSpr = $204 ;base Spr RAM
- .File1_CursorPos = $59 ;Y position
- .WeaponCount = $0C ;includes lives
- .ItemsXIndex = $0F ;180-18F RAM
- .MilliXIndex = $01 ;no millisecond
- .ClockXStop = $05 ;75-79 RAM
- .NumTileBase = $40 ;numbers tile 40-49
- .PlayTime_Min = $3C ;0 min/sec default
- .PlayTime_Hours = $09 ;0 hour default
- .Cleared_Sublvl = $F7 ;all except pyro
- .store_FileSprite
- sta .Save_CursorSpr,y
- iny
- iny
- iny
- iny
- cpy #$24
- rts
- .init_SaveSprites
- ldx #$33 ;main save text/gfx
- ldy #$64
- .loop_SaveSprites
- lda .SaveSpritesTbl-1,y
- sta $203,y
- dey
- bne .loop_SaveSprites
- rts
- .SoundText ;save complete, file error
- jsr initsound
- jsr LoadScreenText
- ldx #$78 ;wait 2.00 second
- jmp waitvblank_x
- .SaveSpritesTbl
- DB4 $5969010F
- DB4 $596C0118
- DB4 $546D0120
- DB4 $5C7D0120
- DB4 $597C0128
- DB4 $546E0130
- DB4 $5C7E0130
- DB4 $59670138
- DB4 $59690140
- DB4 $AC600160
- DB4 $AC700168
- DB4 $AE6602A8
- DB4 $AE6B01A4
- DB4 $B67B01A4
- DB4 $AE6801AC
- DB4 $B67801AC
- DB4 $F869030F
- DB4 $F8730318
- DB4 $F8640320
- DB4 $F8740320
- DB4 $F8760328
- DB4 $F8650330
- DB4 $F8750330
- DB4 $F8770338
- DB4 $F8690340
- ;--------------------------------------
- .GameMenu_Save: ;only used to Save Game
- jsr palfade_restore
- jsr .init_SaveSprites
- jsr LoadScreenText
- jsr forcevblank
- dec laghandle
- ldx #$01 ;select file text
- jsr LoadScreenText
- .GameMenu_SaveGameProc
- jsr waitvblank
- lda $14
- and #$40 ;B button
- bne .end_savegame
- jsr .SaveGame_Proc
- lda $14
- and #$10 ;start button
- beq .GameMenu_SaveGameProc
- ;--------------------------------------
- ;save game, return to main menu.asm
- ldy .Save_YIndex
- sta File1_Enable,y ;6000-6001 enable
- lda .FileYIndex,y
- tay
- ldx #$03
- .loop_levelclear_store
- lda cleared_wily,x ;levels/hearts
- sta File1_SRAM,y ;6010-6013: 60-63
- iny
- dex
- bpl .loop_levelclear_store
- lda cur_level ;last level played
- sta File1_SRAM,y ;6014: 22
- ldx #.WeaponCount
- .loop_WpnStore
- lda megamanHP,x ;weapons/lives
- sta File1_SRAM+1,y ;6015-6020: A3-AE
- iny
- dex
- bne .loop_WpnStore
- ldx #.ItemsXIndex
- .loop_ItemsStore
- lda $180,x ;items/bolts/events
- sta File1_SRAM+1,y ;6021-6030: 180-18F
- iny
- dex
- bpl .loop_ItemsStore
- lda itemstats ;events 1
- sta File1_SRAM+1,y ;6031: AF
- ldx #$00
- .loop_clock_store
- cpx #.MilliXIndex ;NO milli
- beq .skip_playtime_store
- lda PlayTime,x ;clock timer
- sta File1_SRAM+2,y ;6032-6035: 75-79
- iny
- .skip_playtime_store
- inx
- cpx #.ClockXStop ;stop clock read
- bne .loop_clock_store
- lda WeaponTanks
- sta File1_SRAM+2,y ;6036: 6D
- lda eventstats ;events 2
- sta File1_SRAM+3,y ;6037: 6C
- ;end save game process
- ;--------------------------------------
- ldx #$13 ;"please wait" text
- jsr LoadScreenText
- ldx #$3C ;wait 1.00 second
- jsr waitvblank_x
- jsr .SaveGame_FilePos
- jsr waitvblank
- lda #.SFX_SaveGame
- ldx #$11 ;"save complete" text
- jsr .SoundText
- .end_savegame
- lda #$02
- sta Menus_Action
- jmp .reset_sprRAM ;main menu.asm
- ;--------------------------------------
- ;load file->main menu.asm->stage select
- .filefound
- lda .FileYIndex,y
- tay
- ldx #$03
- .loop_levelclear
- lda File1_SRAM,y ;6010-6013: 60-63
- sta cleared_wily,x ;levels/hearts
- iny
- dex
- bpl .loop_levelclear
- lda File1_SRAM,y ;6014: 22
- sta cur_level ;last level played
- ldx #$01
- tya
- clc
- adc #.WeaponCount
- tay
- .loop_WpnLoad
- lda File1_SRAM,y ;6015-6020: A3-AE
- sta megamanHP,x ;weapons/lives
- dey
- inx
- cpx #.WeaponCount+1 ;stop wpn read
- bne .loop_WpnLoad
- tya
- adc #.WeaponCount
- tay
- ldx #.ItemsXIndex
- .loop_ItemsLoad
- lda File1_SRAM,y ;6021-6030: 180-18F
- sta $180,x ;items/bolts/events
- iny
- dex
- bpl .loop_ItemsLoad
- lda File1_SRAM,y ;6031: AF
- sta itemstats ;events 1
- ldx #$00
- .loop_clock
- cpx #.MilliXIndex ;NO milli
- beq .skip_playtime
- lda File1_SRAM+1,y ;6032-6035: 75-79
- sta PlayTime,x ;clock timer
- iny
- .skip_playtime
- inx
- cpx #.ClockXStop ;stop clock read
- bne .loop_clock
- lda #.PlayTime_Min ;write milli
- sta PlayTime+1
- lda File1_SRAM+1,y ;6036: 6D
- sta WeaponTanks
- lda File1_SRAM+2,y ;6037: 6C
- sta eventstats ;events 2
- jmp .Branch_StageSelect
- ;--------------------------------------
- .CheckFilePos
- lda File1_Enable,y ;get enable stat
- bne .filefound
- lda #.SFX_Error
- ldx #$0F ;file NOT found
- jsr .SoundText
- .text_selectfile
- ldx #$01 ;reset "select file"
- bne .SaveGame_Textbox
- ;--------------------------------------
- .FileYIndex
- .db $00, $30
- ;only used to load/delete file
- .SaveGame_EntryPoint:
- jsr .init_SaveSprites
- .SaveGame_Textbox
- jsr LoadScreenText
- .SaveGame_Wait
- jsr forcevblank
- dec laghandle
- jsr .SaveGame_Proc
- lda $14
- and #$10 ;start button
- beq .SaveGame_B
- lda .Save_CursorSpr
- bmi .PrepClear
- ldy .Save_YIndex ;get 6000-6001 Y index
- lda .Save_FileClear
- beq .CheckFilePos
- ;clear all save file stats
- lda #$00
- sta File1_Enable,y
- ldx (.FileYIndex),y
- ldy #$30
- .loop_clearSRAM
- sta File1_SRAM,x
- inx
- dey
- bne .loop_clearSRAM
- sta .Save_FileClear
- ldy #$24
- lda #$F8 ;delete pink "clear" spr
- .loop_ClearSpr
- sta $240,y
- dey
- dey
- dey
- dey
- bne .loop_ClearSpr
- ldx #$18 ;set "file deleted" text
- bne .SaveGame_Textbox
- ;--------------------------------------
- .PrepClear
- iny
- sty .Save_FileClear
- ldy #$40
- jsr .loop_SaveSprites
- ldx #$17 ;set "clear file?" text
- bne .SaveGame_Textbox
- ;--------------------------------------
- ;return to title menu.asm
- .SaveGame_B
- lda $14
- and #$40 ;B button
- beq .SaveGame_Wait
- lda .Save_FileClear ;current start index
- BEQ_L .TitleMenu_EntryPoint
- ;--------------------------------------
- ;cancel file clear
- dec .Save_FileClear ;reset start index
- jsr .loop_AdjustSprDown
- ldy #$00
- jsr .loop_AdjustSprDown
- jmp .text_selectfile
- ;--------------------------------------
- ;main save game proccessing loop
- .SaveGame_Proc
- jsr .SaveGame_FilePos
- lda $14
- and #$0C ;UD
- beq .SaveGameRTS
- and #$08 ;up only
- bne .set_File1Pos
- lda #$7F ;file 2 pos
- sta $221
- .loop_AdjustSprDown
- lda .Save_CursorSpr,y
- clc
- adc #$20
- bcs .SaveGameRTS
- bpl .adjust_FileSprDown
- ldx .Save_FileClear
- bne .SaveGameRTS
- sta $244,y
- clc
- adc #$60
- .adjust_FileSprDown
- jsr .store_FileSprite
- bne .loop_AdjustSprDown
- .SaveGameRTS
- rts
- ;--------------------------------------
- .set_File1Pos
- lda #$67 ;gfx tile id "1"
- sta $221
- .prev_filepos
- ldy #$00
- .loop_AdjustSprUp
- lda .Save_CursorSpr,y
- sec
- sbc #$20
- bpl .adjust_FileSprUp
- sbc #$60
- pha
- lda #$F8 ;clear prev sprites
- sta $244,y
- pla
- .adjust_FileSprUp
- jsr .store_FileSprite
- bne .loop_AdjustSprUp
- ldy #$00
- cmp #.File1_CursorPos+$20 ;file 2
- bne .skip_adjustUp
- lda #$7F ;gfx tile id "2"
- sta $221
- .skip_adjustUp
- lda .Save_CursorSpr
- cmp #.File1_CursorPos-1
- bcc .loop_AdjustSprDown
- rts
- ;--------------------------------------
- .SaveGame_WpnSprTbl
- DB4 $676301A0
- DB4 $671001A8
- DB4 $6F0601A0
- DB4 $6F0701A8
- .db $FF
- .db $FF
- DB4 $706A02D1
- DB4 $677902D1
- DB4 $6A7A02D9
- .db $FF
- .db $FF
- DB4 $00000000
- DB4 $00000000
- .db $FF
- .db $FF
- DB4 $6A3102C4
- DB4 $FFFF6C28
- DB2 $0273
- .db $FF
- .db $FF
- .SaveGame_FilePos
- ldx #$14 ;weapon/item graphics
- jsr LoadScreenText
- ldy #$00
- ldx #$14 ;file 1
- lda .Save_CursorSpr ;file cursor pos
- cmp #.File1_CursorPos
- beq .adjust_filepos
- ldx #$44 ;file 2
- iny
- .adjust_filepos
- sty .Save_YIndex ;save 6000-6001 Y index
- lda File1_SRAM-$14,x
- ora #.NumTileBase ;6010/40: heart tank
- sta $7C3 ;write # to heart tank
- lda #.NumTileBase ;00 tile
- sta $01
- ldy #$03 ;1st 4 bits: sub tanks
- .loop_readitem
- lda File1_SRAM+$0D,x ;6031: sub tank
- and AND_table,y
- beq .nextitem
- inc $01
- .nextitem
- dey
- bpl .loop_readitem
- lda $01
- sta $7CC ;write # to sub tank
- lda #$AF ;5E000 hex: pause menu
- sta $5115
- ldy .Save_YIndex ;restore Y reg
- lda File1_Enable,y
- bne .NoTimeReset
- lda #.PlayTime_Min ;default time 0:00:00
- sta File1_SRAM+$10,x ;6034: minutes
- sta File1_SRAM+$0F,x ;6033: seconds
- lda #.PlayTime_Hours
- sta File1_SRAM+$11,x ;6035: hours
- .NoTimeReset
- stx $00
- stx $02 ;save extra copy of X
- jsr $A4C9 ;pause menu clock routine
- ldx $02 ;restore X
- lda File1_SRAM+$11,x ;6035: hours
- jsr $A4EF ;pause menu clock routine
- ldy #$06
- .loop_DrawTimer
- lda $783,y
- clc
- adc #.NumTileBase ;+40 for # tiles
- sta $783,y
- dey
- bpl .loop_DrawTimer
- sta draw_horizontal
- ;clear all sprites EXCEPT file cursors
- ldy #$97
- lda #$F8 ;clear sprites
- .loop_clearspr
- sta $267,y
- dey
- bne .loop_clearspr
- ldy #$00
- sty $00
- ;--------------------------------------
- ;begin drawing sprites of weapons
- .loop_ReadWpn_Spr
- lda File1_SRAM-$0D,x ;6017-6020 weps
- php
- ldx $00
- .loop_WpnSpr
- lda .SaveGame_WpnSprTbl,x
- inx
- cmp #$FF ;end spr data/next wep
- beq .next_wpnspr
- plp
- php
- bpl .next_wpnsprY ;skip if no wpn
- sta $268,y
- .next_wpnsprY
- iny
- bpl .loop_WpnSpr
- .next_wpnspr
- plp
- stx $00
- inc $02 ;next wpn X index
- ldx $02 ; get wpn X index
- cpx #$4E ;end wpn file 2
- beq .end_WpnSpr
- cpx #$1E ;end wpn file 1
- bne .loop_ReadWpn_Spr
- ;--------------------------------------
- ;begin drawing BG tiles of weapons
- .end_WpnSpr
- ldy #$0A
- .loop_ReadWpn_BG
- lda File1_SRAM-$17,x ;6017-6020 weps
- bpl .RushCheck
- .next_WpnBG_Index
- inx
- dey
- bne .loop_ReadWpn_BG
- rts
- ;--------------------------------------
- ;write Wpn BG tiles
- .RushCheck
- cpy #$09 ;skip rush marine
- beq .next_WpnBG_Index
- cpy #$07 ;skip rush coil
- beq .next_WpnBG_Index
- tya
- pha
- lda .WpnBG_YIndex-1,y
- tay
- lda #$39 ;empty tile: no weapon
- sta $6EF,y
- sta $6F0,y
- sta $702,y
- sta $703,y
- pla
- tay
- jmp .next_WpnBG_Index
- .WpnBG_YIndex
- .db $A2, $A0, $9E, $AA, $A8
- .db $A4, $00, $AC, $00, $A6
- ;--------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement