📄 dicchess.asm
字号:
STA <Locate_X
?1: DEC <Locate_Y
BMI ?2
INC <Locate_X
BBS4 <Locate_X,?2
JSR Get_Locate_Value
LDA <Locate_Value
AND #00000011B
CMP <Judge_Flag
BNE ?2
INC <ContinueNum
BRA ?1
?2: LDA <Cursor_Y
STA <Locate_Y
LDA <Cursor_X
STA <Locate_X
?3: INC <Locate_Y
BBS4 <Locate_Y,?4
DEC <Locate_X
BMI ?4
JSR Get_Locate_Value
LDA <Locate_Value
AND #00000011B
CMP <Judge_Flag
BNE ?4
INC <ContinueNum
BRA ?3
?4: LDA <ContinueNum
CMP #4
BCC ?5
?41: SMB3 <WinFlagSD
?5: LDA <WinFlag
CMP #0
BEQ ?6
SMB7 <WinFlag
BBS0 <Judge_flag,?7
rmb6 <WinFlag
bra ?6
?7: smb6 <WinFlag
lda <Cursor_X
sta <BestPositionX
lda <Cursor_Y
sta <BestPositionY
?6: RTS
CheckEmpty:
RMB0 <EmptyFlag
STZ <Locate_Y
?1: STZ <Locate_X
?2: JSR Get_Locate_Value
BBS1 <Locate_Value,?5
INC <Locate_X
LDA <Locate_X
CMP #16
BCC ?2
?3: INC <Locate_Y
LDA <Locate_Y
CMP #16
BCC ?1
?4: RTS
?5: SMB0 <EmptyFlag
RTS
ChoiceBestPosition:
BBS5 <StartFlag,?4
SMB5 <StartFlag
BBS0 <Seed,?6
INC <Cursor_X
BBR4 <Cursor_X,?7
DEC <Cursor_X
?6: DEC <Cursor_X
BPL ?7
INC <Cursor_X
INC <Cursor_X
?7: LDA <Cursor_X
STA <BestPositionX
BBS1 <Seed,?8
INC <Cursor_Y
BBR4 <Cursor_Y,?9
DEC <Cursor_Y
?8: DEC <Cursor_Y
BPL ?9
INC <Cursor_Y
INC <Cursor_Y
?9: LDA <Cursor_Y
STA <BestPositionY
RTS
?4:
STZ <BestValue
STZ <Cursor_Y
?1:
STZ <Cursor_X
?2: LDA <Cursor_X
STA <Locate_X
LDA <Cursor_Y
STA <Locate_Y
JSR Get_Locate_Value
BBR1 <Locate_Value,?3
JSR Get_Chess_Value
JSR GetBestPosition
?3: INC <Cursor_X
BBR4 <Cursor_X,?2
INC <Cursor_Y
BBR4 <Cursor_Y,?1
RTS
Get_Chess_Value:
STZ <CmpValueEnemy ;;clr compare value
STZ <CmpValueCpu
JSR Get_Horizontal_Value
JSR Get_Vertical_Value
JSR Get_SliceDown_Value
JSR Get_SliceUp_Value
RTS
;;-----------------------------------------------------
;; Get Value Horizontal to 5 chess
;;-----------------------------------------------------
Get_Horizontal_Value:
JSR Clear_Chess_Number
LDA <Cursor_Y
STA <Locate_Y
SEC
LDA <Cursor_X
?00: SBC #5
?01: BCS ?1
LDA #0
STA <Locate_X
BRA ?2
?1: STA <Locate_X
JSR Get_Locate_Value
BBR1 <Locate_Value,?11
BBR0 <Locate_Value,?12
LDA #00000010B
TRB <Judge_Flag
BRA ?11
?12: LDA #00000100B
TRB <Judge_Flag
?11: INC <Locate_X
?2: JSR Get_Chess_Number
INC <Locate_X
BBS4 <Locate_X,?3 ;;if Locate_X >> 16 then exit
?20: LDA <Locate_X
SEC
SBC <Cursor_X
BCC ?2
CMP #5 ;;if Locate_X-Cursor_X<=4
BCC ?2
?211:
BBS0 <Judge_Flag,?31 ;;jmp if pre-chess is space
JSR Get_Locate_Value
BBS1 <Locate_Value,?31 ;;jmp if value=space
BBS0 <Locate_Value,?21 ;;jmp if value=enemy
BBS5 <Judge_Flag,?3 ;;jmp if enemy finish
SMB1 <Judge_Flag ;;set enemy border
BRA ?3
?21: BBS6 <Judge_Flag,?3 ;;jmp if cpu finish
SMB2 <Judge_Flag
?3: JSR Get_Arrange_Value
RTS
?31: BBR0 <Judge_Flag,?3
BBS5 <Judge_Flag,?32
DEC <Enemy_Number
DEC <Enemy_Space_Num
?32: BBS6 <Judge_Flag,?3
DEC <Cpu_Number
DEC <Cpu_Space_Num
BRA ?3
;;-----------------------------------------------------
;; Get Value Vertical to 5 chess
;;-----------------------------------------------------
Get_Vertical_Value:
JSR Clear_Chess_Number
LDA <Cursor_X
STA <Locate_X
SEC
LDA <Cursor_Y
?00: SBC #5
?01: BCS ?1
LDA #0
STA <Locate_Y
BRA ?2
?1: STA <Locate_Y
JSR Get_Locate_Value
BBR1 <Locate_Value,?11
BBR0 <Locate_Value,?12
LDA #00000010B
TRB <Judge_Flag
BRA ?11
?12: LDA #00000100B
TRB <Judge_Flag
?11: INC <Locate_Y
?2: JSR Get_Chess_Number
INC <Locate_Y
BBS4 <Locate_Y,?3 ;;if Locate_Y >> 16 then exit
?20: LDA <Locate_Y
SEC
SBC <Cursor_Y
BCC ?2
CMP #5 ;;if Locate_X-Cursor_X<=4
BCC ?2
?201: BBS0 <Judge_Flag,?31
JSR Get_Locate_Value
BBS1 <Locate_Value,?31 ;;jmp if value=space
BBS0 <Locate_Value,?21 ;;jmp if value=enemy
BBS5 <Judge_Flag,?3 ;;jmp if enemy finish
SMB1 <Judge_Flag ;;set enemy border
BRA ?3
?21: BBS6 <Judge_Flag,?3 ;;jmp if cpu finish
SMB2 <Judge_Flag
?3: JSR Get_Arrange_Value
RTS
?31: BBR0 <Judge_Flag,?3
BBS5 <Judge_Flag,?32
DEC <Enemy_Number
DEC <Enemy_Space_Num
?32: BBS6 <Judge_Flag,?3
DEC <Cpu_Number
DEC <Cpu_Space_Num
BRA ?3
;;-----------------------------------------------------
;; Get Value Slice Down to 5 chess
;;-----------------------------------------------------
Get_SliceDown_Value:
JSR Clear_Chess_Number
LDX <Cursor_X
LDY <Cursor_Y
?1: DEX
BMI ?3 ;;IF
DEY
BMI ?2
TXA
CLC
?111: ADC #5
?112: CMP <Cursor_X
BEQ ?11
BRA ?1
?11: STX <Locate_X
STY <Locate_Y
JSR Get_Locate_Value
BBR1 <Locate_Value,?12
BBR0 <Locate_Value,?13
LDA #00000010B
TRB <Judge_Flag
BRA ?12
?13: LDA #00000100B
TRB <Judge_Flag
?12: INC <Locate_X
INC <Locate_Y
BRA ?5
?2: INY
?3: INX
STX <Locate_X
STY <Locate_Y
?5: JSR Get_Chess_Number
INC <Locate_X
BBS4 <Locate_X,?6
?500: INC <Locate_Y
BBS4 <Locate_Y,?6
?501: LDA <Locate_X
SEC
SBC <Cursor_X
BCC ?5
CMP #5
BCC ?5
?502:
BBS0 <Judge_Flag,?31
JSR Get_Locate_Value
BBS1 <Locate_Value,?31 ;;jmp if value=space
BBS0 <Locate_Value,?51 ;;jmp if value=enemy
BBS5 <Judge_Flag,?6 ;;jmp if enemy finish
SMB1 <Judge_Flag ;;set enemy border
BRA ?6
?51: BBS6 <Judge_Flag,?6 ;;jmp if cpu finish
SMB2 <Judge_Flag
?6: JSR Get_Arrange_Value
RTS
?31: BBR0 <Judge_Flag,?6
BBS5 <Judge_Flag,?32
DEC <Enemy_Number
DEC <Enemy_Space_Num
?32: BBS6 <Judge_Flag,?6
DEC <Cpu_Number
DEC <Cpu_Space_Num
BRA ?6
;;-----------------------------------------------------
;; Get Value Slice Up to 5 chess
;;-----------------------------------------------------
Get_SliceUp_Value:
JSR Clear_Chess_Number
LDX <Cursor_X
LDY <Cursor_Y
?1: DEX
BMI ?3
INY
?111: CPY #15
BCS ?2
?112: TXA
CLC
?113: ADC #5
?114: CMP <Cursor_X
BEQ ?11
BRA ?1
?11: STX <Locate_X
STY <Locate_Y
JSR Get_Locate_Value
BBR1 <Locate_Value,?12
BBR0 <Locate_Value,?13
LDA #00000010B
TRB <Judge_Flag
BRA ?12
?13: LDA #00000100B
TRB <Judge_Flag
?12: INC <Locate_X
DEC <Locate_Y
BRA ?5
?2: DEY
?3: INX
?4: STX <Locate_X
STY <Locate_Y
?5: JSR Get_Chess_Number
INC <Locate_X
BBS4 <Locate_X,?6
?500: DEC <Locate_Y
BMI ?31
LDA <Locate_X
SEC
SBC <Cursor_X
BCC ?5
CMP #5
BCC ?5
?501:
BBS0 <Judge_Flag,?31
JSR Get_Locate_Value
BBS1 <Locate_Value,?31 ;;jmp if value=space
BBS0 <Locate_Value,?51 ;;jmp if value=enemy
BBS5 <Judge_Flag,?6 ;;jmp if enemy finish
SMB1 <Judge_Flag ;;set enemy border
BRA ?6
?51: BBS6 <Judge_Flag,?6 ;;jmp if cpu finish
SMB2 <Judge_Flag
?6: JSR Get_Arrange_Value
RTS
?31: BBR0 <Judge_Flag,?6
BBS5 <Judge_Flag,?32
DEC <Enemy_Number
DEC <Enemy_Space_Num
?32: BBS6 <Judge_Flag,?6
DEC <Cpu_Number
DEC <Cpu_Space_Num
BRA ?6
;;----------------------------------------------------
;; Clear Chess Number
;;----------------------------------------------------
Clear_Chess_Number:
LDX #0
?1: STZ <Enemy_Space_Num,X
INX
CPX #9
BNE ?1
LDA #00000111B
TSB <Judge_Flag
RTS
;;-------------------------------------------------------
;; Get Chess Number
;;-------------------------------------------------------
Get_Chess_Number:
LDX <Cursor_X
CPX <Locate_X
BNE ?2
LDX <Cursor_Y
CPX <Locate_Y
BNE ?2
LDX #0
?1: INC <Enemy_Keep_Num,X ;;INC enemy_keep_num cpu_keep_num
INX ;; enemy_width_num cpu_width_num
CPX #6 ;; enemy_number cpu_number
BNE ?1 ;;
LDA <Enemy_Keep_Num
CMP #5
BCC ?1_1
SMB5 <Judge_Flag
BRA ?1_2
?1_1: LDA <Cpu_Keep_Num
CMP #5
BCC ?1_2
SMB6 <Judge_Flag
?1_2:
SMB7 <Judge_Flag ;; set to rightside
RMB0 <Judge_Flag ;;clr space_flag
RTS
?1_3: JMP ?12
?2: JSR Get_Locate_Value ;; GET LOCATE VALUE
BBR1 <Locate_Value,?1_3 ;; JMP IF NOT SPACE
BBR0 <Judge_Flag,?5 ;; JMP IF SPACE FLAG IS FALSE
BBS7 <Judge_Flag,?4 ;; JMP IF RIGHTSIDE
STZ Enemy_Space_Num ;;clear enemy_space_num
STZ Cpu_Space_Num ;; cpu_space_num
STZ Enemy_Number ;; enemy_number
STZ Cpu_Number ;; cpu_number
INC <Enemy_Width_Num ;;inc enemy_width_num
INC <Cpu_Width_Num ;;inc cpu_width_num
CLC
LDA #00000110B
TRB <Judge_Flag ;;clear border flag
RTS
?4: BBS3 <Judge_Flag,?41 ;;jmp if enemy_length=true
INC <Enemy_Width_Num
?41: BBS4 <Judge_Flag,?42 ;;jmp if cpu_length=true
INC <Cpu_Width_Num
?42: BBS5 <Judge_Flag,?43 ;;jmp if Enemy finish
DEC <Enemy_Space_Num ;;dec enemy_space_num
BPL ?421
INC <Enemy_Space_Num
?421: DEC <Enemy_Number ;;dec enemy_number
BPL ?43
INC <Enemy_Number
?43: BBS6 <Judge_Flag,?44 ;;jmp if cpu finish
DEC <Cpu_Space_Num ;;dec cpu_space_num
BPL ?431
INC <Cpu_Space_Num
?431: DEC <Cpu_Number ;;dec cpu_number
BPL ?44
INC <Cpu_Number
?44:
LDA #01100000B
TSB <Judge_Flag
RTS
?5: BBS5 <Judge_Flag,?8 ;;jmp if enemy_finish
BBS7 <Judge_Flag,?51
BBS1 <Judge_Flag,?6 ;;jmp if enemy_border
?51: INC <Enemy_Space_Num ;;inc enemy_space_num
INC <Enemy_Number ;;inc enemy_number
BRA ?7
?6:
LDA <Enemy_Number
CMP #2
BCS ?51
STZ <Enemy_Space_Num ;;clear enemy_space_num
STZ <Enemy_Number ;;clear enemy_number
RMB1 <Judge_Flag ;;clear enemy_border
?7:
LDA <Enemy_Keep_Num
CMP #5
BCS ?7_1
STZ <Enemy_Keep_Num ;;enemyu_keep_num
?7_1: SMB0 <Judge_Flag ;;set space_flag
?8: BBS6 <Judge_Flag,?11_1 ;;jmp if cpu_finish
BBS7 <Judge_Flag,?81
?8_1:
BBS2 <Judge_Flag,?9 ;;jmp if cpu_border
?81:
INC <Cpu_Space_Num ;;inc cpu_space
INC <Cpu_Number ;;inc cpu_space
BRA ?10
?9:
LDA <Cpu_Number
CMP #3
BCS ?81
STZ <Cpu_Space_Num ;;clr cpu_space_num
STZ <Cpu_Number ;;clr cpu_number
RMB2 <Judge_Flag ;;clear cpu_border
?10:
LDA <Cpu_Keep_Num
CMP #5
BCS ?11
STZ <Cpu_Keep_Num ;;clr cpu_keep_num
?11: SMB0 <Judge_Flag
?11_1: BBS3 <Judge_Flag,?11_2 ;;jmp if enemy_length is true
INC <Enemy_Width_Num
?11_2: BBS4 <Judge_Flag,?11_3 ;;jmp if cpu_length is true
INC <Cpu_Width_Num
?11_3: RTS
?12: BBS7 <Judge_Flag,?14 ;;IF ENEMY_LEFT_FLAG
RMB0 <Judge_Flag
BBS0 <Locate_Value,?13 ;;jmp if locate_value is enemy
INC <Cpu_Number ;;inc cpu_number
INC <Cpu_Width_Num ;;inc cpu_width_num
INC <Cpu_Keep_Num ;;inc cpu_keep_num
LDA <Cpu_Keep_Num
CMP #5
BCC ?12_1
SMB6 <Judge_Flag
RTS
?12_1: STZ <Enemy_Number ;;clr enemy_number
STZ <Enemy_Width_Num ;;clr enemy_width_num
STZ <Enemy_Keep_Num ;;clr enemy_keep_num
SMB1 <Judge_Flag ;;set enemy_border
RTS
?13:
INC <Enemy_Number ;;inc enemy_number
INC <Enemy_Width_Num ;;inc enemy_width_num
INC <Enemy_Keep_Num ;;inc ememy_keep_num
LDA <Enemy_Keep_Num
CMP #5
BCC ?13_1
SMB5 <Judge_Flag
RTS
?13_1: STZ <Cpu_Number ;;clr cpu_number
STZ <Cpu_Width_Num ;;clr cpu_width_num
STZ <Cpu_Keep_Num ;;clr cpu_keep_num
SMB2 <Judge_Flag ;;set cpu_border
RTS
?14: BBS0 <Locate_Value,?16 ;;jmp if value=enemy
BBS5 <Judge_Flag,?15 ;;jmp if Enemy finish
SMB5 <Judge_Flag ;;set enemy_finish
BBS0 <Judge_Flag,?15 ;;jmp if space flag =false
SMB1 <Judge_Flag ;;set enemy_border=true
?15: SMB3 <Judge_Flag ;;set enemy_length=true
RMB0 <Judge_Flag ;;clr space flag
BBS6 <Judge_Flag,?15_1 ;;jmp if cpu_finish is true
INC <Cpu_Number ;;inc cpu_number
INC <Cpu_Keep_Num ;;inc cpu_keep_num
LDA <Cpu_Keep_Num ;;inc cpu_keep_num
CMP #5
BCC ?15_1 ;;jmp if cpu_keep_num<5
SMB6 <Judge_Flag ;;else set cpu_finish
RTS
?15_1: BBS4 <Judge_Flag,?15_2 ;;jmp if cpu_length
INC <Cpu_Width_Num
?15_2: RTS
?16:
BBS6 <Judge_Flag,?17 ;;jmp if cpu finish
SMB6 <Judge_Flag ;; set cpu finish
BBS0 <Judge_Flag,?17 ;;jmp if space flag =true
SMB2 <Judge_Flag ;; set cpu_border
?17: SMB4 <Judge_Flag ;;set cpu_length
RMB0 <Judge_Flag ;;clr space_flag
BBS5 <Judge_Flag,?18 ;;jmp if enemy_finish
INC <Enemy_Number ;;inc Enemy_number
INC <Enemy_Keep_Num ;;inc Enemy_Keep_num
LDA <Enemy_Keep_Num ;;
CMP #5 ;;
BCC ?18 ;; jmp if Enemy_Keep_Num<5
SMB5 <Judge_Flag ;; set Enemy_finish
RTS
?18: BBS3 <Judge_Flag,?19 ;;jmp if Enemy_length
INC <Enemy_Width_Num
?19: RTS
;;========================================
;; Get Arrange Value
;;========================================
Get_Arrange_Value:
LDA <Cpu_Keep_Num
CMP #5
BCC ?1 ;;jmp if Cpu_keep_num<5
?0: LDA #FFH ;; else set cmpvaluecpu to 255
STA <CmpValueCpu
RTS
?1: LDA <Enemy_Keep_Num
CMP #5
BCC ?2 ;;jmp if enemy_keep_num<5
?11: LDA #FFH ;; else set CmpValueEnemy to 255
STA <CmpValueEnemy
RTS
?2: LDA <Cpu_Width_Num ;;
CMP #5
BCC ?4_1
?2_1:
LDA <Cpu_Number
BBR2 <Judge_Flag,?3 ;;jmp if cpu_border is false
CMP #6
BCS ?3 ;;jmp if Cpu_Number<6
SMB2 <Cpu_Space_Num ;; OR #00000100B TO Cpu_Space_Num
?3: ASL ;;ASL Cpu_Number 4 times
ASL
ASL
ASL
ORA <Cpu_Space_Num ;; Or Cpu_Number to Cpu_Space_Num
STA <Cpu_Space_Num
JSR GetMatchValue ;; call GetMatchValue
CLC
LDA <Cpu_Number
ADC <CmpValueCpu ;;ADDING Cpu_Number to CmpValueCpu
BCC ?4 ;;If carry then set to 255
LDA #255
?4: STA <CmpValueCpu
?4_1: LDA <Enemy_Width_Num
CMP #5
BCC ?7
?4_2:
LDA <Enemy_Number
BBR1 <Judge_Flag,?5 ;;jmp if Enemy_Border is false
CMP #6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -