欢迎光临散文网 会员登陆 & 注册

[FC][分页菜单重置]

2020-05-04 21:11 作者:FlameCyclone  | 我要投稿


;[FC][分页菜单重置]
;FlameCyclone
;20200326

 .ORG $B600

ROM_CHAR_MAP       = 1     ;字符映射
ROM_RESET          = $FA8E
ROM_NMI            = $FB2B
;==================================================
User_Addr = $80
;==================================================
Button_Keep        = User_Addr      + $01
Button_Once        = Button_Keep    + $01
Button_Temp        = Button_Once    + $01
Button_Buf         = Button_Temp    + $01
Button_Status      = Button_Buf     + $01
Button_Delay       = Button_Status  + $01
;==================================================
BUTTON_DELAY_MAX   = 30
BUTTON_DELAY_SPEED = 5
;==================================================
Page_Cur_L         = Button_Delay  + $01
Page_Cur_H         = Page_Cur_L  + $01
Page_Old_L         = Page_Cur_H + $01
Page_Old_H         = Page_Old_L + $01
Sel_Cur_L          = Page_Old_H  + $01
Sel_Cur_H          = Sel_Cur_L  + $01
Sel_Old_L          = Sel_Cur_H + $01
Sel_Old_H          = Sel_Old_L + $01
Sel_Data_L         = Sel_Old_H + $01
Sel_Data_H         = Sel_Data_L + $01
;==================================================
ITEM_BUF_MAX       = 4
;==================================================
Item_Update        = Sel_Data_H + $01
Item_Update_Index   = Item_Update + $01
Item_Show_Cnt        = Item_Update_Index + $01
Item_Show_L        = Item_Show_Cnt + $01
Item_Show_H        = Item_Show_L + $01
Item_Clean_L        = Item_Show_H + $01
Item_Clean_H        = Item_Clean_L + $01

;============================================================
FC_MENU_MASK   = $FF
FC_Menu_Flag   = $FE
FC_Data_L   = $40                               ;数据地址低位
FC_Data_H   = FC_Data_L+$01                     ;数据地址高位
FC_Data_Cnt = FC_Data_H+$01                         ;数据计数
FC_Data_Tmp = FC_Data_Cnt+$01                       ;数据缓存
;============================================================
FC_PPU_Buffer = $0200                            ;PPU缓冲地址
FC_PPU_Status = FC_PPU_Buffer+$C0                ;PPU显示状态
FC_PPU_Cursor = FC_PPU_Status + $01          ;当前PPU缓冲位置
FC_PPU_Addr_L = FC_PPU_Cursor + $01              ;PPU地址低位
FC_PPU_Addr_H = FC_PPU_Addr_L + $01              ;PPU地址高位
;==================================================
ITEM_MAX     =  72 - 1
PAGE_SIZE     =  24
PAGE_MAX      =  ITEM_MAX/PAGE_SIZE * PAGE_SIZE
;==================================================
Char_Arrow = $D8
ARROW_X_OFFSET         = $36 ;箭头横坐标
ARROW_Y_OFFSET         = $1F ;箭头纵坐标
SPRITES_ADDR           = $0400
SPRITES_PAGE           = SPRITES_ADDR / 256
;==================================================
;==================================================
Sound_Init             = $FFA0
Sound_Play             = $FFB0
SOUND_OPEN             = 1
;==================================================
SOUNG_BGM              = 48
SOUNG_ITEM             = 12
SOUNG_PAGE             = 14
;==================================================
;Reset中断
ResetProgram:
 CLD
 SEI
 LDX #$FF
 TXS
 LDA #$00
 STA $2000
 STA $2001
 STA $E000
 LDA #$80
 STA $A001
 LDX #$02
ResetDelayA:
 BIT $2002
 BPL ResetDelayA
ResetDelayB:
 BIT $2002
 BMI ResetDelayB
 DEX
 BNE ResetDelayA
 
 JSR PaletteClear
 JSR VramClear
 
 LDA #$0F
 STA $4015
 LDA #$C0
 STA $4017
 
 LDA #$00
 STA $8000
 LDA #$40
 STA $8001
 LDA #$01
 STA $8000
 LDA #$06
 STA $8001

RamClear:
 LDA #$00
 STA $00
 STA $01
 LDX #$08
 LDY #$00
RamClearWrite:
 STA ($00),Y
 INY
 BNE RamClearWrite
 INC $01
 DEX
 BNE RamClearWrite

 LDA #FC_MENU_MASK
 STA FC_Menu_Flag
 
 JSR PaletteSet
 
 JSR SpriteClear
 
 JSR UpdatePageEnable
 
 .IF SOUND_OPEN
 LDA #SOUNG_BGM - 1
 JSR Sound_Init
 .ENDIF
 
 
 LDA #$1E
 STA FC_PPU_Status
 LDA #$80
 STA $2000
MainLoop:
 JMP MainLoop
 
;==================================================
;清空PPU内存
VramClear:
 LDA #$20
 STA $2006
 LDA #$00
 STA $2006
 LDY #$10
 LDA #$00
 TAX
NameTableClearBeg:
 STA $2007
 INX
 BNE NameTableClearBeg
 DEY
 BNE NameTableClearBeg
 RTS

 
SelectItemSound:
 .IF SOUND_OPEN
 LDA #SOUNG_ITEM - 1
 JSR Sound_Init
 .ENDIF
 RTS
 
 
SelectPageSound:
 .IF SOUND_OPEN
 LDA #SOUNG_PAGE - 1
 JSR Sound_Init
 .ENDIF
 RTS
 
;==================================================
;清空调色板
PaletteClear:
 JSR PaletteAddrSet
 LDA #$0F
 LDX #$00
PaletteClearWrite:
 STA $2007
 INX
 CPX #$20
 BCC PaletteClearWrite
 RTS
 
;==================================================
;设置调色板
PaletteSet:
 JSR PaletteAddrSet
 LDX #$00
PaletteSetWrite:
 LDA PaletteData,X
 STA $2007
 INX
 CPX #$20
 BCC PaletteSetWrite
 RTS

;==================================================
;调色板地址设置
PaletteAddrSet:
 LDA #$3F
 STA $2006
 LDA #$00
 STA $2006
 RTS
 

;==================================================
;保存旧选择索引
SaveOldSelect:
 LDA Page_Cur_L
 STA Page_Old_L
 LDA Page_Cur_H
 STA Page_Old_H
 LDA Sel_Cur_L
 STA Sel_Old_L
 LDA Sel_Cur_H
 STA Sel_Old_H
 RTS

;==============================
;是否递减索引时页面索引改变
IsPageChangeByDecItem:
 LDA Sel_Cur_L
 CMP Page_Cur_L
 BNE IsPageChangeByDecItemEnd
 SEC
 RTS
IsPageChangeByDecItemEnd:
 CLC
 RTS

;==============================
;是否递增索引时页面索引改变
IsPageChangeByIncItem:
 LDA Page_Cur_L
 CLC
 ADC #PAGE_SIZE
 SEC
 SBC #$01
 CMP Sel_Cur_L
 BNE IsPageChangeByIncItemEnd
 SEC
 RTS
IsPageChangeByIncItemEnd:
 CLC
 RTS

;==============================
;是否最小索引
IsMinItem:
 LDA Sel_Cur_L
 ORA Sel_Cur_H
 BEQ IsMinItemEnd
 CLC
 RTS
IsMinItemEnd:
 SEC
 RTS

;==============================
;是否最小索引页
IsMinPage:
 LDA Page_Cur_L
 ORA Page_Cur_H
 BEQ IsMinPageEnd
 CLC
 RTS
IsMinPageEnd:
 SEC
 RTS

;==============================
;是否最大索引
IsMaxItem:
 LDA Sel_Cur_H
 CMP #>ITEM_MAX
 BNE IsMaxItemEnd
 LDA Sel_Cur_L
 CMP #<ITEM_MAX
 BNE IsMaxItemEnd
 SEC
 RTS
IsMaxItemEnd:
 CLC
 RTS

;==============================
;是否最大索引页
IsMaxPage:
 LDA Page_Cur_H
 CMP #>PAGE_MAX
 BNE IsMaxItemEnd
 LDA Page_Cur_L
 CMP #<PAGE_MAX
 BNE IsMaxPageEnd
 SEC
 RTS
IsMaxPageEnd:
 CLC
 RTS

;==============================
;递减选择索引
DecSelItem:
 LDA Sel_Cur_L
 SEC
 SBC #$01
 STA Sel_Cur_L
 BCS DecSelItemEnd
 DEC Sel_Cur_H
DecSelItemEnd:
 RTS
 
;==============================
;递减选择索引页
DecSelPage:
 LDA Page_Cur_L
 SEC
 SBC #PAGE_SIZE
 STA Page_Cur_L
 BCS DecSelPageEnd
 DEC Page_Cur_H
DecSelPageEnd:
 RTS
 
;==============================
;递增选择索引
IncSelItem:
 LDA Sel_Cur_L
 CLC
 ADC #$01
 STA Sel_Cur_L
 BCC IncSelItemEnd
 INC Sel_Cur_H
IncSelItemEnd:
 RTS

;==============================
;递增选择索引页
IncSelPage:
 LDA Page_Cur_L
 CLC
 ADC #PAGE_SIZE
 STA Page_Cur_L
 BCC IncSelPageEnd
 INC Page_Cur_H
IncSelPageEnd:
 RTS

;==============================
;递增页索引
DecPageIndex
 LDA Page_Cur_L
 SEC
 SBC #PAGE_SIZE
 STA Page_Cur_L
 BCS DecPageIndexEnd
 DEC Page_Cur_H
DecPageIndexEnd:
 JSR UpdatePageEnable
 RTS
 
;==============================
;递增页索引
IncPageIndex:
 LDA Page_Cur_L
 CLC
 ADC #PAGE_SIZE
 STA Page_Cur_L
 BCC IncPageIndexEnd
 INC Page_Cur_H
IncPageIndexEnd:
 JSR UpdatePageEnable
 RTS

;==============================
;设置最小页
SetMinPage:
 LDA #$00
 STA Page_Cur_L
 STA Page_Cur_H
 JSR UpdatePageEnable
 RTS
 
;==============================
;设置最大页
SetMaxPage:
 LDA #<PAGE_MAX
 STA Page_Cur_L
 LDA #>PAGE_MAX
 STA Page_Cur_H
 JSR UpdatePageEnable
 RTS
 
;==============================
;设置最小索引
SetMinItem:
 LDA #$00
 STA Sel_Cur_L
 STA Sel_Cur_H
 RTS

;==============================
;设置最大索引
SetMaxItem:
 LDA #<ITEM_MAX
 STA Sel_Cur_L
 LDA #>ITEM_MAX
 STA Sel_Cur_H
 RTS

;==============================
;换页时递减选择索引
DecSelItemByPage:
 JSR GetItemOffset
 JSR DecSelPage
 JSR SetItemOffset
DecSelItemByPageEnd:
 JSR UpdatePageEnable
 RTS
 
;==============================
;换页时递增选择索引
IncSelItemByPage:
 JSR GetItemOffset
 JSR IncSelPage
 JSR SetItemOffset
IncSelItemByPageEnd:
 JSR UpdatePageEnable
 RTS

;=============================
;索引偏移获取
GetItemOffset
 LDA Sel_Cur_L
 SEC
 SBC Page_Cur_L
 STA Sel_Data_L
 LDA Sel_Cur_H
 SBC Page_Cur_H
 STA Sel_Data_H
 RTS
 
;=============================
;索引偏移设置
SetItemOffset:
 LDA Sel_Data_L
 CLC
 ADC Page_Cur_L
 STA Sel_Cur_L
 LDA Sel_Data_H
 ADC Page_Cur_H
 STA Sel_Cur_H
SetItemOffsetCheck:
 LDA Sel_Cur_H
 CMP #>ITEM_MAX
 BCC SetItemOffsetEnd
 BNE SetItemOffsetMax
 LDA Sel_Cur_L
 CMP #<ITEM_MAX
 BCC SetItemOffsetEnd
 BEQ SetItemOffsetEnd
SetItemOffsetMax:
 JSR SetMaxItem
SetItemOffsetEnd:
 RTS
 
;==============================
;选择上一个索引
SelectPreItem:
 JSR SaveOldSelect
 JSR IsMinItem
 BCS SelectPreItemSetMaxPage
 JSR IsPageChangeByDecItem
 BCC SelectPreItemNoSavePage
 JSR DecPageIndex
SelectPreItemNoSavePage:
 JSR DecSelItem
 RTS
SelectPreItemSetMaxPage:
 JSR SetMaxPage
 JSR SetMaxItem
 RTS
 
;==============================
;选择下一个索引
SelectNextItem:
 JSR SaveOldSelect
 JSR IsMaxItem
 BCS SelectNextItemSetMinPage
 JSR IsPageChangeByIncItem
 BCC SelectNextItemNoSavePage
 JSR IncPageIndex
SelectNextItemNoSavePage
 JSR IncSelItem
 RTS
SelectNextItemSetMinPage
 JSR SetMinPage
 JSR SetMinItem
 RTS

;==============================
;选择上一个页索引
SelectPrePage:
 JSR SaveOldSelect
 JSR IsMinPage
 BCS SelectPrePageSetMaxPage
 JSR DecSelItemByPage
 RTS
SelectPrePageSetMaxPage:
 JSR GetItemOffset
 JSR SetMaxPage
 JSR SetItemOffset
 RTS
 
;==============================
;选择下一个页索引
SelectNextPage:
 JSR SaveOldSelect
 JSR IsMaxPage
 BCS SelectNextPageSetMinPage
 JSR IncSelItemByPage
 RTS
SelectNextPageSetMinPage:
 JSR GetItemOffset
 JSR SetMinPage
 JSR SetItemOffset
 RTS

;==================================================
;选择索引
SelectItemIndex:
 LDA Item_Update
 BEQ SelectPreItemIndex
 JSR UpdatePage
 RTS
SelectPreItemIndex:
 LDA Button_Once
 CMP #$08
 BNE SelectNextItemIndex
 JSR SelectItemSound
 JSR SelectPreItem
SelectNextItemIndex:
 LDA Button_Once
 CMP #$04
 BNE SelectPrePageIndex
 JSR SelectItemSound
 JSR SelectNextItem
SelectPrePageIndex:
 LDA Button_Once
 CMP #$02
 BNE SelectNextPageIndex
 JSR SelectPageSound
 JSR SelectPrePage
SelectNextPageIndex:
 LDA Button_Once
 CMP #$01
 BNE SelectItemIndexCheck
 JSR SelectPageSound
 JSR SelectNextPage
SelectItemIndexCheck:
 LDA Button_Once
 CMP #$10
 BNE SelectItemIndexEnd
 LDA Sel_Cur_L
 STA $01C0
 JMP ROM_RESET
SelectItemIndexEnd:
 RTS

IsPageChange:
 LDA Page_Cur_H
 CMP Page_Old_H
 BNE IsPageChangeEnd
 LDA Page_Cur_L
 CMP Page_Old_L
 BNE IsPageChangeEnd
 CLC
 RTS
IsPageChangeEnd:
 SEC
 RTS
;==================================================
;按键处理
ButtonProcess:
 JSR ButtonScan
 LDA Button_Keep
 STA Button_Temp
 JSR ButtonScan
 LDA Button_Keep
 CMP Button_Temp
 BEQ ButtonGetOnce
 LDA Button_Buf
 STA Button_Keep
ButtonGetOnce:
 TAY
 EOR Button_Buf
 AND Button_Keep
 STA Button_Once
 STY Button_Buf
 JSR ButtonDelay
 RTS
;==================================================
;按键扫描
ButtonScan:
 LDX #$01
 STX $4016
 DEX
 STX $4016
 LDY #$08
ButtonValue:
 LDA $4016
 STA Button_Status
 LSR
 ORA Button_Status
 LSR
 ROL Button_Keep
 DEY
 BNE ButtonValue
 RTS
ButtonDelay:
 LDA Button_Keep
 BNE ButtonDelayBeg
 STA Button_Delay
 RTS
ButtonDelayBeg:
 INC Button_Delay
 LDA Button_Delay
 CMP # BUTTON_DELAY_MAX + BUTTON_DELAY_SPEED
 BCC ButtonDelayEnd
 LDA # BUTTON_DELAY_MAX
 STA Button_Delay
 LDA Button_Keep
 STA Button_Once
ButtonDelayEnd:
 RTS


;========================================
MODE_CNTL = $FB               ;行写入模式
MODE_CNTC = $FC               ;行清除模式
MODE_OVER = $FF                 ;结束标志
;----------------------------------------
FC_PPU_Process:                  ;PPU处理
 LDA FC_PPU_Buffer
 BEQ FC_PPU_Process_End
 JSR FC_PPU_Process_Beg
FC_PPU_Process_End:
 LDA #$00
 STA FC_PPU_Buffer
 STA $2006
 STA $2006
 STA $2005
 STA $2005
 LDA FC_PPU_Status
 STA $2001
 RTS

;----------------------------------------
FC_PPU_Process_Beg:             ;处理开始
 LDX FC_PPU_Cursor
 LDA #$00
 STA $2001
 STA FC_PPU_Buffer,X
 STA FC_PPU_Cursor
 LDX #$FF
;----------------------------------------
FC_PPU_Mode_Select:             ;模式选择
 INX
 LDA FC_PPU_Buffer,X
 CMP #MODE_CNTL
 BEQ FC_PPU_Mode_CountLine
 CMP #MODE_CNTC
 BEQ FC_PPU_Mode_CountClear
 RTS

;----------------------------------------
FC_PPU_Mode_CountLine:        ;行写入模式
 JSR FC_PPU_Set_Addr
 LDY FC_PPU_Buffer,X
FC_PPU_CountLine_Write:
 INX
 LDA FC_PPU_Buffer,X
 STA $2007
 DEY
 BNE FC_PPU_CountLine_Write
 JMP FC_PPU_Mode_Select
 
;----------------------------------------
FC_PPU_Mode_CountClear:       ;行清除模式
 JSR FC_PPU_Write_Addr
 LDY FC_PPU_Buffer,X
 LDA #$00
FC_PPU_CountClear_Write:
 STA $2007
 DEY
 BNE FC_PPU_CountClear_Write
 JMP FC_PPU_Mode_Select
 
;----------------------------------------
FC_PPU_Set_Addr:                ;写入地址
 INX
 LDA FC_PPU_Buffer,X
 STA FC_PPU_Addr_H
 STA $2006
 INX
 LDA FC_PPU_Buffer,X
 STA FC_PPU_Addr_L
 STA $2006
 INX
 RTS

;----------------------------------------
FC_PPU_Write_Addr:              ;写入地址
 INX
 LDA FC_PPU_Buffer,X
 STA $2006
 INX
 LDA FC_PPU_Buffer,X
 STA $2006
 INX
 RTS

;========================================
UpdatePageEnable:
 LDA #$01
 STA Item_Update
 LDA Page_Cur_L
 STA Item_Show_L
 LDA Page_Cur_H
 STA Item_Show_H
 LDA Page_Old_L
 STA Item_Clean_L
 LDA Page_Old_H
 STA Item_Clean_H
 LDA #$00
 STA Item_Update_Index
 RTS

;========================================
UpdatePageDisable:
 LDA #$00
 STA Item_Update
 RTS

;==============================
;是否最大索引页
IsOverMaxShowItem:
 LDA Item_Show_H
 CMP #>ITEM_MAX
 BCC IsOverMaxUpdateItemEnd
 BNE IsOverMaxShowItemSet
 LDA Item_Show_L
 CMP #<ITEM_MAX
 BCC IsOverMaxUpdateItemEnd
 BEQ IsOverMaxUpdateItemEnd
IsOverMaxShowItemSet:
 SEC
 RTS
IsOverMaxUpdateItemEnd:
 CLC
 RTS

;==============================
;是否最大索引页
IsOverMaxCleanItem:
 LDA Item_Clean_H
 CMP #>ITEM_MAX
 BCC IsOverMaxCleanItemEnd
 BNE IsOverMaxCleanItemSet
 LDA Item_Clean_L
 CMP #<ITEM_MAX
 BCC IsOverMaxCleanItemEnd
 BEQ IsOverMaxCleanItemEnd
IsOverMaxCleanItemSet:
 SEC
 RTS
IsOverMaxCleanItemEnd:
 CLC
 RTS

;========================================
UpdatePage:
 LDA Item_Update_Index
 CMP #PAGE_SIZE
 BCC UpdatePageInitBeg
 JSR UpdatePageDisable
 RTS
UpdatePageInitBeg:
 LDA #$00
 STA Item_Show_Cnt
UpdatePageBeg:
 JSR CleanOnceItem
 JSR WriteOnceItem
UpdatePageCheckClean:
 INC Item_Clean_L
 BNE UpdatePageCheckShow
 INC Item_Clean_H
UpdatePageCheckShow:
 INC Item_Show_L
 BNE UpdatePageItem
 INC Item_Show_H
UpdatePageItem:
 INC Item_Update_Index
 LDA Item_Update_Index
 CMP #PAGE_SIZE
 BCS UpdatePageEnd
 INC Item_Show_Cnt
 LDA Item_Show_Cnt
 CMP #ITEM_BUF_MAX
 BCC UpdatePageBeg
UpdatePageEnd:
 RTS

;==================================================
WriteOnceItem:
 JSR IsOverMaxShowItem
 BCC WriteOnceItemBeg
 RTS
WriteOnceItemBeg:
 LDA Item_Show_L
 CLC
 ADC #<ItemAddr_L
 STA FC_Data_L
 
 LDA Item_Show_H
 ADC #>ItemAddr_L
 STA FC_Data_H
 LDY #$00
 LDA (FC_Data_L),Y
 PHA
 
 LDA Item_Show_L
 CLC
 ADC #<ItemAddr_H
 STA FC_Data_L
 
 LDA Item_Show_H
 ADC #>ItemAddr_H
 STA FC_Data_H
 LDY #$00
 LDA (FC_Data_L),Y
 STA FC_Data_H
 PLA
 STA FC_Data_L

 LDX FC_PPU_Cursor
 LDA #MODE_CNTL
 STA FC_PPU_Buffer,X
 INX
 
 LDY Item_Update_Index
 LDA ItemShowPos_H,Y
 STA FC_PPU_Buffer,X
 INX
 LDA ItemShowPos_L,Y
 STA FC_PPU_Buffer,X
 INX
 
 LDY #$00
 LDA(FC_Data_L),Y
 STA FC_Data_Cnt
 STA FC_PPU_Buffer,X
 INX
 INY
WriteText:

 .IF ROM_CHAR_MAP
 STY FC_Data_Tmp
 LDA(FC_Data_L),Y
 TAY
 LDA Char_Rom,Y
 LDY FC_Data_Tmp
 
 .ELSE
 LDA(FC_Data_L),Y
 .ENDIF
 
 STA FC_PPU_Buffer,X
 INX
 INY
 DEC FC_Data_Cnt
 BNE WriteText
 STX FC_PPU_Cursor
 RTS

;==================================================
CleanOnceItem:
 JSR IsOverMaxCleanItem
 BCC CleanOnceItemBeg
 RTS
CleanOnceItemBeg:
 LDA Item_Clean_L
 CLC
 ADC #<ItemAddr_L
 STA FC_Data_L
 
 LDA Item_Clean_H
 ADC #>ItemAddr_L
 STA FC_Data_H
 LDY #$00
 LDA (FC_Data_L),Y
 PHA
 
 LDA Item_Clean_L
 CLC
 ADC #<ItemAddr_H
 STA FC_Data_L
 
 LDA Item_Clean_H
 ADC #>ItemAddr_H
 STA FC_Data_H
 LDY #$00
 LDA (FC_Data_L),Y
 STA FC_Data_H
 PLA
 STA FC_Data_L

 LDX FC_PPU_Cursor
 LDA #MODE_CNTC
 STA FC_PPU_Buffer,X
 INX
 
 LDY Item_Update_Index
 LDA ItemShowPos_H,Y
 STA FC_PPU_Buffer,X
 INX
 LDA ItemShowPos_L,Y
 STA FC_PPU_Buffer,X
 INX
 
 LDY #$00
 LDA(FC_Data_L),Y
 STA FC_PPU_Buffer,X
 INX
 STX FC_PPU_Cursor
CleanOnceItemEnd:
 RTS
 
 
;==================================================
;精灵清除
SpriteClear:
 LDX #$00
 LDA #$F8
SpriteClearWrite:
 STA SPRITES_ADDR,X
 INX
 BNE SpriteClearWrite
 RTS

;==================================================
;精灵设置
SpriteSet:
 LDA Sel_Cur_L
 SEC
 SBC Page_Cur_L
 ASL
 ASL
 ;ASL
 ASL
 CLC
 ADC #ARROW_Y_OFFSET
 STA SPRITES_ADDR
 LDA #Char_Arrow
 STA SPRITES_ADDR + 1
 LDA #$00
 STA SPRITES_ADDR + 2
 LDA #ARROW_X_OFFSET
 STA SPRITES_ADDR + 3
 RTS

;==================================================
;调色板数据
PaletteData:
 .DB $0F,$24,$2A,$2A,$0F,$20,$25,$25,$0F,$22,$21,$21,$0F,$27,$20,$20
 .DB $0F,$20,$16,$17,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F

;==================================================
ItemShowPos_L:
 .db $88,$A8,$C8,$E8,$08,$28,$48,$68,$88,$A8,$C8,$E8,$08,$28,$48,$68,$88,$A8,$C8,$E8,$08,$28,$48,$68,$88
ItemShowPos_H:
 .db $20,$20,$20,$20,$21,$21,$21,$21,$21,$21,$21,$21,$22,$22,$22,$22,$22,$22,$22,$22,$23,$23,$23,$23,$23

;==================================================
ItemAddr:
ItemAddr_L:
 .db <Item_001,<Item_002,<Item_003,<Item_004,<Item_005,<Item_006,<Item_007,<Item_008,<Item_009,<Item_010
 .db <Item_011,<Item_012,<Item_013,<Item_014,<Item_015,<Item_016,<Item_017,<Item_018,<Item_019,<Item_020
 .db <Item_021,<Item_022,<Item_023,<Item_024,<Item_025,<Item_026,<Item_027,<Item_028,<Item_029,<Item_030
 .db <Item_031,<Item_032,<Item_033,<Item_034,<Item_035,<Item_036,<Item_037,<Item_038,<Item_039,<Item_040
 .db <Item_041,<Item_042,<Item_043,<Item_044,<Item_045,<Item_046,<Item_047,<Item_048,<Item_049,<Item_050
 .db <Item_051,<Item_052,<Item_053,<Item_054,<Item_055,<Item_056,<Item_057,<Item_058,<Item_059,<Item_060
 .db <Item_061,<Item_062,<Item_063,<Item_064,<Item_065,<Item_066,<Item_067,<Item_068,<Item_069,<Item_070
 .db <Item_071,<Item_072
ItemAddr_H:
 .db >Item_001,>Item_002,>Item_003,>Item_004,>Item_005,>Item_006,>Item_007,>Item_008,>Item_009,>Item_010
 .db >Item_011,>Item_012,>Item_013,>Item_014,>Item_015,>Item_016,>Item_017,>Item_018,>Item_019,>Item_020
 .db >Item_021,>Item_022,>Item_023,>Item_024,>Item_025,>Item_026,>Item_027,>Item_028,>Item_029,>Item_030
 .db >Item_031,>Item_032,>Item_033,>Item_034,>Item_035,>Item_036,>Item_037,>Item_038,>Item_039,>Item_040
 .db >Item_041,>Item_042,>Item_043,>Item_044,>Item_045,>Item_046,>Item_047,>Item_048,>Item_049,>Item_050
 .db >Item_051,>Item_052,>Item_053,>Item_054,>Item_055,>Item_056,>Item_057,>Item_058,>Item_059,>Item_060
 .db >Item_061,>Item_062,>Item_063,>Item_064,>Item_065,>Item_066,>Item_067,>Item_068,>Item_069,>Item_070
 .db >Item_071,>Item_072

;==================================================
ItemText:
Item_001 .STR "01.REST 01"
Item_002 .STR "02.REST 02"
Item_003 .STR "03.REST 03"
Item_004 .STR "04.REST 04"
Item_005 .STR "05.REST 05"
Item_006 .STR "06.REST 06"
Item_007 .STR "07.REST 07"
Item_008 .STR "08.REST 08"
Item_009 .STR "09.REST 09"
Item_010 .STR "10.REST 10"
Item_011 .STR "11.REST 11"
Item_012 .STR "12.REST 12"
Item_013 .STR "13.REST 13"
Item_014 .STR "14.REST 14"
Item_015 .STR "15.REST 15"
Item_016 .STR "16.REST 16"
Item_017 .STR "17.REST 17"
Item_018 .STR "18.REST 18"
Item_019 .STR "19.REST 19"
Item_020 .STR "20.REST 20"
Item_021 .STR "21.REST 21"
Item_022 .STR "22.REST 22"
Item_023 .STR "23.REST 23"
Item_024 .STR "24.REST 24"
Item_025 .STR "25.REST 25"
Item_026 .STR "26.REST 26"
Item_027 .STR "27.REST 27"
Item_028 .STR "28.REST 28"
Item_029 .STR "29.REST 29"
Item_030 .STR "30.REST 30"
Item_031 .STR "31.REST 31"
Item_032 .STR "32.REST 32"
Item_033 .STR "33.REST 33"
Item_034 .STR "34.REST 34"
Item_035 .STR "35.REST 35"
Item_036 .STR "36.REST 36"
Item_037 .STR "37.REST 37"
Item_038 .STR "38.REST 38"
Item_039 .STR "39.REST 39"
Item_040 .STR "40.REST 40"
Item_041 .STR "41.REST 41"
Item_042 .STR "42.REST 42"
Item_043 .STR "43.REST 43"
Item_044 .STR "44.REST 44"
Item_045 .STR "45.REST 45"
Item_046 .STR "46.REST 46"
Item_047 .STR "47.REST 47"
Item_048 .STR "48.REST 48"
Item_049 .STR "49.REST 49"
Item_050 .STR "50.REST 50"
Item_051 .STR "51.REST 51"
Item_052 .STR "52.REST 52"
Item_053 .STR "53.REST 53"
Item_054 .STR "54.REST 54"
Item_055 .STR "55.REST 55"
Item_056 .STR "56.REST 56"
Item_057 .STR "57.REST 57"
Item_058 .STR "58.REST 58"
Item_059 .STR "59.REST 59"
Item_060 .STR "60.REST 60"
Item_061 .STR "61.REST 61"
Item_062 .STR "62.REST 62"
Item_063 .STR "63.REST 63"
Item_064 .STR "64.REST 64"
Item_065 .STR "65.REST 65"
Item_066 .STR "66.REST 66"
Item_067 .STR "67.REST 67"
Item_068 .STR "68.REST 68"
Item_069 .STR "69.REST 69"
Item_070 .STR "70.REST 70"
Item_071 .STR "71.REST 71"
Item_072 .STR "72.REST 72"
;==================================================


 .IF ROM_CHAR_MAP
;==================================================
Char_Rom:
 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$26,$00
 .DB $01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F,$10
 .DB $40,$0B,$0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19
 .DB $1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29
 .ENDIF


 .ORG $FF16


;Nmi中断
NmiProgram:
 PHA
 TXA
 PHA
 TYA
 PHA
 LDA FC_Menu_Flag
 CMP #FC_MENU_MASK
 BEQ NmiProgramSet
 JMP ROM_NMI + 5
NmiProgramSet:
 LDA $2002
 JSR FC_PPU_Process
 LDA #SPRITES_PAGE
 STA $4014
 LDA #$80
 STA $2000
 JSR ButtonProcess
 JSR SelectItemIndex
 JSR SpriteSet
 
 .IF SOUND_OPEN
 JSR Sound_Play
 .ENDIF
 
 PLA
 TAY
 PLA
 TAX
 PLA

;==================================================
;Irq中断
IrqProgram:
 RTI

 .ORG $FFFA
 .WORD NmiProgram
 .WORD ResetProgram
 .WORD IrqProgram


[FC][分页菜单重置]的评论 (共 条)

分享到微博请遵守国家法律