Advertisement
Guest User

Untitled

a guest
Aug 2nd, 2017
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;--------------------------------------
  2. ;Save/Load game, branch title/stage select
  3.     .byte "SAVE-LOAD"
  4. .Save_YIndex     = $04
  5. .Save_FileClear  = $11
  6. .Save_CursorSpr  = $204 ;base Spr RAM
  7.  
  8. .File1_CursorPos = $59 ;Y position
  9. .WeaponCount     = $0C ;includes lives
  10. .ItemsXIndex     = $0F ;180-18F RAM
  11. .MilliXIndex     = $01 ;no millisecond
  12. .ClockXStop      = $05 ;75-79 RAM
  13. .NumTileBase     = $40 ;numbers tile 40-49
  14. .PlayTime_Min    = $3C ;0 min/sec default
  15. .PlayTime_Hours  = $09 ;0 hour default
  16. .Cleared_Sublvl  = $F7 ;all except pyro
  17.  
  18. .store_FileSprite
  19.     sta .Save_CursorSpr,y
  20.     iny
  21.     iny
  22.     iny
  23.     iny
  24.     cpy #$24
  25.     rts
  26.  
  27. .init_SaveSprites
  28.     ldx #$33    ;main save text/gfx
  29.     ldy #$64
  30. .loop_SaveSprites
  31.     lda .SaveSpritesTbl-1,y
  32.     sta $203,y
  33.     dey
  34.     bne .loop_SaveSprites
  35.     rts
  36.  
  37. .SoundText ;save complete, file error
  38.     jsr initsound  
  39.     jsr LoadScreenText
  40.     ldx #$78    ;wait 2.00 second
  41.     jmp waitvblank_x
  42.  
  43. .SaveSpritesTbl
  44.     DB4 $5969010F
  45.     DB4 $596C0118
  46.     DB4 $546D0120
  47.     DB4 $5C7D0120
  48.     DB4 $597C0128
  49.     DB4 $546E0130
  50.     DB4 $5C7E0130
  51.     DB4 $59670138
  52.     DB4 $59690140
  53.     DB4 $AC600160
  54.     DB4 $AC700168
  55.     DB4 $AE6602A8
  56.     DB4 $AE6B01A4
  57.     DB4 $B67B01A4
  58.     DB4 $AE6801AC
  59.     DB4 $B67801AC
  60.     DB4 $F869030F
  61.     DB4 $F8730318
  62.     DB4 $F8640320
  63.     DB4 $F8740320
  64.     DB4 $F8760328
  65.     DB4 $F8650330
  66.     DB4 $F8750330
  67.     DB4 $F8770338
  68.     DB4 $F8690340
  69. ;--------------------------------------
  70. .GameMenu_Save: ;only used to Save Game
  71.     jsr palfade_restore
  72.     jsr .init_SaveSprites
  73.     jsr LoadScreenText
  74.     jsr forcevblank
  75.     dec laghandle
  76.     ldx #$01    ;select file text
  77.     jsr LoadScreenText
  78. .GameMenu_SaveGameProc
  79.     jsr waitvblank
  80.     lda $14
  81.     and #$40    ;B button
  82.     bne .end_savegame
  83.     jsr .SaveGame_Proc
  84.     lda $14
  85.     and #$10    ;start button
  86.     beq .GameMenu_SaveGameProc
  87. ;--------------------------------------
  88. ;save game, return to main menu.asm
  89.     ldy .Save_YIndex
  90.     sta File1_Enable,y ;6000-6001 enable
  91.     lda .FileYIndex,y
  92.     tay
  93.     ldx #$03
  94. .loop_levelclear_store
  95.     lda cleared_wily,x ;levels/hearts
  96.     sta File1_SRAM,y ;6010-6013: 60-63
  97.     iny
  98.     dex
  99.     bpl .loop_levelclear_store
  100.     lda cur_level      ;last level played
  101.     sta File1_SRAM,y   ;6014: 22
  102.     ldx #.WeaponCount
  103. .loop_WpnStore
  104.     lda megamanHP,x    ;weapons/lives
  105.     sta File1_SRAM+1,y ;6015-6020: A3-AE
  106.     iny
  107.     dex
  108.     bne .loop_WpnStore
  109.     ldx #.ItemsXIndex
  110. .loop_ItemsStore
  111.     lda $180,x         ;items/bolts/events
  112.     sta File1_SRAM+1,y ;6021-6030: 180-18F
  113.     iny
  114.     dex
  115.     bpl .loop_ItemsStore
  116.     lda itemstats      ;events 1
  117.     sta File1_SRAM+1,y ;6031: AF
  118.     ldx #$00
  119. .loop_clock_store
  120.     cpx #.MilliXIndex  ;NO milli
  121.     beq .skip_playtime_store
  122.     lda PlayTime,x     ;clock timer
  123.     sta File1_SRAM+2,y ;6032-6035: 75-79
  124.     iny
  125. .skip_playtime_store
  126.     inx
  127.     cpx #.ClockXStop   ;stop clock read
  128.     bne .loop_clock_store
  129.     lda WeaponTanks
  130.     sta File1_SRAM+2,y ;6036: 6D
  131.     lda eventstats     ;events 2
  132.     sta File1_SRAM+3,y ;6037: 6C
  133. ;end save game process
  134. ;--------------------------------------
  135.     ldx #$13    ;"please wait" text
  136.     jsr LoadScreenText
  137.     ldx #$3C    ;wait 1.00 second
  138.     jsr waitvblank_x
  139.     jsr .SaveGame_FilePos
  140.     jsr waitvblank
  141.     lda #.SFX_SaveGame
  142.     ldx #$11    ;"save complete" text
  143.     jsr .SoundText
  144. .end_savegame
  145.     lda #$02
  146.     sta Menus_Action
  147.     jmp .reset_sprRAM ;main menu.asm
  148. ;--------------------------------------
  149. ;load file->main menu.asm->stage select
  150. .filefound
  151.     lda .FileYIndex,y
  152.     tay
  153.     ldx #$03
  154. .loop_levelclear
  155.     lda File1_SRAM,y   ;6010-6013: 60-63
  156.     sta cleared_wily,x ;levels/hearts
  157.     iny
  158.     dex
  159.     bpl .loop_levelclear
  160.     lda File1_SRAM,y ;6014: 22
  161.     sta cur_level    ;last level played
  162.     ldx #$01
  163.     tya
  164.     clc
  165.     adc #.WeaponCount
  166.     tay
  167. .loop_WpnLoad
  168.     lda File1_SRAM,y ;6015-6020: A3-AE
  169.     sta megamanHP,x  ;weapons/lives
  170.     dey
  171.     inx
  172.     cpx #.WeaponCount+1 ;stop wpn read
  173.     bne .loop_WpnLoad
  174.     tya
  175.     adc #.WeaponCount
  176.     tay
  177.     ldx #.ItemsXIndex
  178. .loop_ItemsLoad
  179.     lda File1_SRAM,y   ;6021-6030: 180-18F
  180.     sta $180,x         ;items/bolts/events
  181.     iny
  182.     dex
  183.     bpl .loop_ItemsLoad
  184.     lda File1_SRAM,y   ;6031: AF
  185.     sta itemstats      ;events 1
  186.     ldx #$00
  187. .loop_clock
  188.     cpx #.MilliXIndex  ;NO milli
  189.     beq .skip_playtime
  190.     lda File1_SRAM+1,y ;6032-6035: 75-79
  191.     sta PlayTime,x     ;clock timer
  192.     iny
  193. .skip_playtime
  194.     inx
  195.     cpx #.ClockXStop   ;stop clock read
  196.     bne .loop_clock
  197.     lda #.PlayTime_Min ;write milli
  198.     sta PlayTime+1
  199.     lda File1_SRAM+1,y ;6036: 6D
  200.     sta WeaponTanks
  201.     lda File1_SRAM+2,y ;6037: 6C
  202.     sta eventstats     ;events 2
  203.     jmp .Branch_StageSelect
  204. ;--------------------------------------
  205. .CheckFilePos
  206.     lda File1_Enable,y ;get enable stat
  207.     bne .filefound
  208.     lda #.SFX_Error
  209.     ldx #$0F    ;file NOT found
  210.     jsr .SoundText
  211. .text_selectfile
  212.     ldx #$01    ;reset "select file"
  213.     bne .SaveGame_Textbox
  214. ;--------------------------------------
  215. .FileYIndex
  216.     .db $00, $30
  217. ;only used to load/delete file
  218. .SaveGame_EntryPoint:
  219.     jsr .init_SaveSprites
  220. .SaveGame_Textbox
  221.     jsr LoadScreenText
  222. .SaveGame_Wait
  223.     jsr forcevblank
  224.     dec laghandle
  225.     jsr .SaveGame_Proc
  226.     lda $14
  227.     and #$10    ;start button
  228.     beq .SaveGame_B
  229.     lda .Save_CursorSpr
  230.     bmi .PrepClear
  231.     ldy .Save_YIndex ;get 6000-6001 Y index
  232.     lda .Save_FileClear
  233.     beq .CheckFilePos
  234. ;clear all save file stats
  235.     lda #$00
  236.     sta File1_Enable,y
  237.     ldx (.FileYIndex),y
  238.     ldy #$30
  239. .loop_clearSRAM
  240.     sta File1_SRAM,x
  241.     inx
  242.     dey
  243.     bne .loop_clearSRAM
  244.     sta .Save_FileClear
  245.     ldy #$24
  246.     lda #$F8    ;delete pink "clear" spr
  247. .loop_ClearSpr
  248.     sta $240,y
  249.     dey
  250.     dey
  251.     dey
  252.     dey
  253.     bne .loop_ClearSpr
  254.     ldx #$18    ;set "file deleted" text
  255.     bne .SaveGame_Textbox
  256. ;--------------------------------------
  257. .PrepClear
  258.     iny
  259.     sty .Save_FileClear
  260.     ldy #$40
  261.     jsr .loop_SaveSprites
  262.     ldx #$17    ;set "clear file?" text
  263.     bne .SaveGame_Textbox
  264. ;--------------------------------------
  265. ;return to title menu.asm
  266. .SaveGame_B
  267.     lda $14
  268.     and #$40    ;B button
  269.     beq .SaveGame_Wait
  270.     lda .Save_FileClear ;current start index
  271.     BEQ_L .TitleMenu_EntryPoint
  272. ;--------------------------------------
  273. ;cancel file clear
  274.     dec .Save_FileClear ;reset start index
  275.     jsr .loop_AdjustSprDown
  276.     ldy #$00
  277.     jsr .loop_AdjustSprDown
  278.     jmp .text_selectfile
  279. ;--------------------------------------
  280. ;main save game proccessing loop
  281. .SaveGame_Proc
  282.     jsr .SaveGame_FilePos
  283.     lda $14
  284.     and #$0C    ;UD
  285.     beq .SaveGameRTS
  286.     and #$08    ;up only
  287.     bne .set_File1Pos
  288.     lda #$7F    ;file 2 pos
  289.     sta $221
  290. .loop_AdjustSprDown
  291.     lda .Save_CursorSpr,y
  292.     clc
  293.     adc #$20
  294.     bcs .SaveGameRTS
  295.     bpl .adjust_FileSprDown
  296.     ldx .Save_FileClear
  297.     bne .SaveGameRTS
  298.     sta $244,y
  299.     clc
  300.     adc #$60
  301. .adjust_FileSprDown
  302.     jsr .store_FileSprite
  303.     bne .loop_AdjustSprDown
  304. .SaveGameRTS
  305.     rts
  306. ;--------------------------------------
  307. .set_File1Pos
  308.     lda #$67    ;gfx tile id "1"
  309.     sta $221
  310. .prev_filepos
  311.     ldy #$00
  312. .loop_AdjustSprUp
  313.     lda .Save_CursorSpr,y
  314.     sec
  315.     sbc #$20
  316.     bpl .adjust_FileSprUp
  317.     sbc #$60
  318.     pha
  319.     lda #$F8    ;clear prev sprites
  320.     sta $244,y
  321.     pla
  322. .adjust_FileSprUp
  323.     jsr .store_FileSprite
  324.     bne .loop_AdjustSprUp
  325.     ldy #$00
  326.     cmp #.File1_CursorPos+$20 ;file 2
  327.     bne .skip_adjustUp
  328.     lda #$7F    ;gfx tile id "2"
  329.     sta $221
  330. .skip_adjustUp
  331.     lda .Save_CursorSpr
  332.     cmp #.File1_CursorPos-1
  333.     bcc .loop_AdjustSprDown
  334.     rts
  335. ;--------------------------------------
  336. .SaveGame_WpnSprTbl
  337.     DB4 $676301A0
  338.     DB4 $671001A8
  339.     DB4 $6F0601A0
  340.     DB4 $6F0701A8
  341.     .db $FF
  342.     .db $FF
  343.    
  344.     DB4 $706A02D1
  345.     DB4 $677902D1
  346.     DB4 $6A7A02D9
  347.     .db $FF
  348.     .db $FF
  349.    
  350.     DB4 $00000000
  351.     DB4 $00000000
  352.     .db $FF
  353.     .db $FF
  354.    
  355.     DB4 $6A3102C4
  356.     DB4 $FFFF6C28
  357.     DB2 $0273
  358.     .db $FF
  359.     .db $FF
  360.  
  361. .SaveGame_FilePos
  362.     ldx #$14    ;weapon/item graphics
  363.     jsr LoadScreenText
  364.     ldy #$00
  365.     ldx #$14    ;file 1
  366.     lda .Save_CursorSpr ;file cursor pos
  367.     cmp #.File1_CursorPos
  368.     beq .adjust_filepos
  369.     ldx #$44    ;file 2
  370.     iny
  371. .adjust_filepos
  372.     sty .Save_YIndex ;save 6000-6001 Y index
  373.     lda File1_SRAM-$14,x
  374.     ora #.NumTileBase ;6010/40: heart tank
  375.     sta $7C3    ;write # to heart tank
  376.     lda #.NumTileBase ;00 tile
  377.     sta $01
  378.     ldy #$03    ;1st 4 bits: sub tanks
  379. .loop_readitem
  380.     lda File1_SRAM+$0D,x ;6031: sub tank
  381.     and AND_table,y
  382.     beq .nextitem
  383.     inc $01
  384. .nextitem
  385.     dey
  386.     bpl .loop_readitem
  387.     lda $01
  388.     sta $7CC    ;write # to sub tank
  389.     lda #$AF    ;5E000 hex: pause menu
  390.     sta $5115
  391.     ldy .Save_YIndex ;restore Y reg
  392.     lda File1_Enable,y
  393.     bne .NoTimeReset
  394.     lda #.PlayTime_Min   ;default time 0:00:00
  395.     sta File1_SRAM+$10,x ;6034: minutes
  396.     sta File1_SRAM+$0F,x ;6033: seconds
  397.     lda #.PlayTime_Hours
  398.     sta File1_SRAM+$11,x ;6035: hours
  399. .NoTimeReset
  400.     stx $00
  401.     stx $02     ;save extra copy of X
  402.     jsr $A4C9   ;pause menu clock routine
  403.     ldx $02     ;restore X
  404.     lda File1_SRAM+$11,x ;6035: hours
  405.     jsr $A4EF   ;pause menu clock routine
  406.     ldy #$06
  407. .loop_DrawTimer
  408.     lda $783,y
  409.     clc
  410.     adc #.NumTileBase ;+40 for # tiles
  411.     sta $783,y
  412.     dey
  413.     bpl .loop_DrawTimer
  414.     sta draw_horizontal
  415. ;clear all sprites EXCEPT file cursors
  416.     ldy #$97
  417.     lda #$F8    ;clear sprites
  418. .loop_clearspr
  419.     sta $267,y
  420.     dey
  421.     bne .loop_clearspr
  422.     ldy #$00
  423.     sty $00
  424. ;--------------------------------------
  425. ;begin drawing sprites of weapons
  426. .loop_ReadWpn_Spr
  427.     lda File1_SRAM-$0D,x ;6017-6020 weps
  428.     php
  429.     ldx $00
  430. .loop_WpnSpr
  431.     lda .SaveGame_WpnSprTbl,x
  432.     inx
  433.     cmp #$FF    ;end spr data/next wep
  434.     beq .next_wpnspr
  435.     plp
  436.     php
  437.     bpl .next_wpnsprY ;skip if no wpn
  438.     sta $268,y
  439. .next_wpnsprY
  440.     iny
  441.     bpl .loop_WpnSpr
  442. .next_wpnspr
  443.     plp
  444.     stx $00
  445.     inc $02     ;next wpn X index
  446.     ldx $02     ; get wpn X index
  447.     cpx #$4E    ;end wpn file 2
  448.     beq .end_WpnSpr
  449.     cpx #$1E    ;end wpn file 1
  450.     bne .loop_ReadWpn_Spr
  451. ;--------------------------------------
  452. ;begin drawing BG tiles of weapons
  453. .end_WpnSpr
  454.     ldy #$0A
  455. .loop_ReadWpn_BG
  456.     lda File1_SRAM-$17,x ;6017-6020 weps
  457.     bpl .RushCheck
  458. .next_WpnBG_Index
  459.     inx
  460.     dey
  461.     bne .loop_ReadWpn_BG
  462.     rts
  463. ;--------------------------------------
  464. ;write Wpn BG tiles
  465. .RushCheck
  466.     cpy #$09    ;skip rush marine
  467.     beq .next_WpnBG_Index
  468.     cpy #$07    ;skip rush coil
  469.     beq .next_WpnBG_Index
  470.     tya
  471.     pha
  472.     lda .WpnBG_YIndex-1,y
  473.     tay
  474.     lda #$39    ;empty tile: no weapon
  475.     sta $6EF,y
  476.     sta $6F0,y
  477.     sta $702,y
  478.     sta $703,y
  479.     pla
  480.     tay
  481.     jmp .next_WpnBG_Index
  482.  
  483. .WpnBG_YIndex
  484.     .db $A2, $A0, $9E, $AA, $A8
  485.     .db $A4, $00, $AC, $00, $A6
  486. ;--------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement