?? snake_code.asm
字號(hào):
;;==================================================
chip W65C02S ; Define chip : ST2024C base on 65c02.
pw 128 ; .LST's page width = 128 characters.
case on ; Don't care Upper-case or lower-case.
externs on ; Make all labels public.
;;==================================================
.include ST2203U.DEF
.include CONSTANT.inc
.include RAM_ext.inc
.include macro.inc
;;==================================================
.include Main.inc
.include ST7636R.inc
;;==================================================
.Global G_SNAKE
C_UP EQU 9
C_DOWN EQU 8
C_LEFT EQU 12
C_RIGHT EQU 4
C_LEVEL1 EQU 255
C_LEVEL2 EQU 60
C_LEVEL3 EQU 10
C_PIC_BANK EQU 4
C_MAX_X EQU 15
C_MAX_Y EQU 15
PS1_6000 .SECTION
G_SNAKE:
JSR G_SNAKE_INI
JSR G_DISPLAY_DATA
JSR G_DISPLAY_TARGET
G_SNAKE_LOOP:
INC G_RANDOM
INC G_TIME
LDA G_TIME
CMP #150
BNE G_SNAKE_LOOP
G_SNAKE_LOOP1:
; INC G_TIME
; LDA G_TIME
; BCC G_SNAKE_LOOP1
JSR G_SCAN_MATRIX
JSR G_KEY_FUNCTION
JSR G_AUTO_GO
JSR G_DETECT_USB
LDA #C_SNAKE_FG
BIT G_FLAG
BEQ G_SNAKE_RTN
JMP G_SNAKE_LOOP
G_SNAKE_RTN:
RTS
;---------------------------------------
G_SNAKE_INI:
JSR G_CLEAR_SNAKE_DATA
STZ G_INTERVAL
STZ G_TIME
LDA #1
STA G_ORIENTAION
LDA #1
STA G_SNAKE_DATA+3
LDA #2
STA G_SNAKE_DATA+2
LDA #3
STA G_SNAKE_DATA+1
LDA #4
STA G_SNAKE_DATA+0
LDA #4
STA G_TARGET_X
LDA #0
STA G_TARGET_Y
LDA #3
STA G_HEAD_X
LDA #0
STA G_HEAD_Y
STZ G_TAIL_X
STZ G_TAIL_Y
LDA #4
STA G_LENGTH
STZ G_SCORE
STZ G_LEVEL
STZ G_CURSOR_X+1
STZ G_CURSOR_Y+1
RTS
G_CLEAR_SNAKE_DATA:
PHX
LDX #0
G_CLEAR_DATA_LOOP:
STZ G_SNAKE_DATA,X
INX
CPX #225
BCC G_CLEAR_DATA_LOOP
PLX
RTS
;--------------------------------------------
G_SCAN_MATRIX:
PHA
PHX
PHY
LDA G_STATE
BEQ G_START_SCAN
JMP G_SCAN_KEY_RTN
G_START_SCAN:
LDX G_LINE_COUNT
INC G_LINE_COUNT
CPX #5H
BCC G_READ_INPUT
STZ G_LINE_COUNT
G_READ_INPUT:
JSR 820H
DW 00H ;#Bank No
DW G_READ_PORT-1
LDA #11111001B
TSB <PB ;set all output
LDA G_SET_OUTPUT,X
TRB <PB ;clear next output pin
LDA G_SCAN_NEW
EOR G_SCAN_OLD,X
BNE G_KEY_CHANGE ;key status change
STZ G_SCAN_TIME,X
JMP G_SCAN_KEY_RTN
G_KEY_CHANGE:
INC G_SCAN_TIME,X
LDY G_SCAN_TIME,X
CPY #g_deb_time
BCC G_SCAN_KEY_RTN ;scan_time,x<deb_time
STZ G_SCAN_TIME,X
TAY
EOR G_SCAN_OLD,X ;just nor the bit changed,
STA G_SCAN_OLD,X
TYA
BIT G_SCAN_OLD,X ;1: means 0->1(release key);0: means 1->0(press key)
BNE G_SCAN_KEY_RTN ;reture if release key
LDY #FCH
G_GET_ROW:
INY
LSR A
BCC G_GET_ROW
JSR G_METHOD1
LDA <R_KeyNameUser
CMP #C_MAX_VALUE
BCS G_SCAN_KEY_RTN
;JSR G_GET_INPUT_STATE
;BCS G_SCAN_KEY_RTN
SMB7 <R_Key_Flag
G_SCAN_KEY_RTN:
PLY
PLX
PLA
RTS
G_SET_OUTPUT:
DB 08H,10H,20H,40H,80H,01H
G_METHOD1:
CLC
TYA
ADC G_METHOD_ADJUST1,X
STA <R_KeyNameUser
RTS
G_METHOD_ADJUST1:
DB 0*g_col,1*g_col,2*g_col,3*g_col
DB 4*g_col,5*g_col,6*g_col,7*g_col
;--------------------------------------------------
G_GET_INPUT_STATE:
STZ G_IN_PARA
LDX #0H
LDY #0H
G_DETECT_NEXT_ROW:
LDA #00001000B
G_DETECT_NEXT_COL:
BIT G_SCAN_OLD,X
BNE G_TEST_NEXT_BIT
INY
G_TEST_NEXT_BIT:
ASL A
PHA
INC G_IN_PARA
LDA G_IN_PARA
CMP #4H
BCC G_COULD_NEXT_BIT
PLA
BRA G_RESET_PARA
G_COULD_NEXT_BIT:
PLA
BRA G_DETECT_NEXT_COL
G_RESET_PARA:
STZ G_IN_PARA
INX
CPX #6H
BCC G_DETECT_NEXT_ROW
CPY #2H
RTS
;----------------------------------------------
G_KEY_FUNCTION:
PHA
LDA #80H
BIT R_Key_Flag
BEQ G_KEY_FUNCTION_RTN
LDA #80H
TRB R_Key_Flag
STZ G_INTERVAL
INC G_RANDOM
LDA R_KeyNameUser
CMP #C_UP
BEQ G_PRESS_UP
CMP #C_DOWN
BEQ G_PRESS_DOWN
CMP #C_LEFT
BEQ G_PRESS_LEFT
CMP #C_RIGHT
BEQ G_PRESS_RIGHT
; LDA #C_SNAKE_FG
; TRB G_FLAG
G_KEY_FUNCTION_RTN:
PLA
RTS
G_PRESS_UP:
LDA G_ORIENTAION
CMP #4
BEQ G_KEY_FUNCTION_RTN
LDA #3
STA G_ORIENTAION
DEC G_HEAD_Y
JMP G_DEAL_SNAKE_DATA
G_PRESS_DOWN:
LDA G_ORIENTAION
CMP #3
BEQ G_KEY_FUNCTION_RTN
LDA #4
STA G_ORIENTAION
INC G_HEAD_Y
JMP G_DEAL_SNAKE_DATA
G_PRESS_LEFT:
LDA G_ORIENTAION
CMP #1
BEQ G_KEY_FUNCTION_RTN
LDA #2
STA G_ORIENTAION
DEC G_HEAD_X
JMP G_DEAL_SNAKE_DATA
G_PRESS_RIGHT:
LDA G_ORIENTAION
CMP #2
BEQ G_KEY_FUNCTION_RTN
LDA #1
STA G_ORIENTAION
INC G_HEAD_X
JMP G_DEAL_SNAKE_DATA
G_DEAL_SNAKE_DATA:
JSR G_CHECK_SNAKE
JMP G_KEY_FUNCTION_RTN
;-----------------------------------------
;IN : G_RE_VALUE
;OUT :G_RE_VALUE
;0:NORMAL
;1:EAT
;2:DEAD
G_CHECK_SNAKE:
PHA
PHX
PHY
STZ G_RE_VALUE
LDA G_HEAD_X
CMP #C_MAX_X
BCS G_SNAKE_DEAD
LDA G_HEAD_Y
CMP #C_MAX_Y
BCS G_SNAKE_DEAD
LDA G_HEAD_X
STA G_CURSOR_X
LDA G_HEAD_Y
STA G_CURSOR_Y
JSR G_XY_TO_DATA
JSR G_CHECK_PSELF
LDA G_RE_VALUE
CMP #2
BEQ G_SNAKE_DEAD
JSR G_CHECK_EAT
LDA G_RE_VALUE
CMP #1
BEQ G_SNAKE_EAT
BRA G_SNAKE_NORMAL
G_CHECK_SNAKE_RTN:
PLY
PLX
PLA
RTS
G_SNAKE_DEAD:
LDA #2
STA G_RE_VALUE
LDA #C_SNAKE_FG
;TRB G_FLAG
JMP G_CHECK_SNAKE_RTN
G_SNAKE_EAT:
LDA #1
STA G_RE_VALUE
INC G_SCORE
INC G_LENGTH
JSR G_CYCLE_DATA
LDA G_HEAD_X
STA G_CURSOR_X
LDA G_HEAD_Y
STA G_CURSOR_Y
JSR G_XY_TO_DATA
LDA G_IN_PARA
STA G_SNAKE_DATA+0
JSR G_DISPLAY_DATA0
JSR G_RANDOM_TARGET
JMP G_CHECK_SNAKE_RTN
G_SNAKE_NORMAL:
LDA #0
STA G_RE_VALUE
JSR G_CYCLE_DATA
JSR G_CLEAR_TAIL
LDA G_HEAD_X
STA G_CURSOR_X
LDA G_HEAD_Y
STA G_CURSOR_Y
JSR G_XY_TO_DATA
LDA G_IN_PARA
STA G_SNAKE_DATA+0
JSR G_DISPLAY_DATA0
JMP G_CHECK_SNAKE_RTN
;-----------------------------------------
G_DISPLAY_DATA:
PHA
PHX
PHY
LDX #0
G_DISPLAY_DATA_LOOP:
LDA G_SNAKE_DATA,X
STA G_IN_PARA
JSR G_DATA_XY
JSR G_XY_MUL_16
JSR G_SET_BANK
JSR G_DATA_TEMPHL
JSR G_DMA_BLOCK
INX
CPX G_LENGTH
BCC G_DISPLAY_DATA_LOOP
PLY
PLX
PLA
RTS
;-----------------------------------------
G_DISPLAY_DATA0:
PHA
PHX
PHY
LDX #0
LDA G_SNAKE_DATA,X
STA G_IN_PARA
JSR G_DATA_XY
JSR G_XY_MUL_16
JSR G_SET_BANK
JSR G_DATA_TEMPHL
JSR G_DMA_BLOCK
PLY
PLX
PLA
RTS
;-----------------------------------------
G_CYCLE_DATA:
PHA
PHX
PHY
LDX G_LENGTH
LDY G_LENGTH
DEY
G_CYCLE_LOOP:
LDA G_SNAKE_DATA,Y
STA G_SNAKE_DATA,X
DEY
DEX
CPX #0
BNE G_CYCLE_LOOP
PLY
PLX
PLA
RTS
;-----------------------------------------
G_AUTO_GO:
PHA
PHX
PHY
INC G_INTERVAL
LDA G_INTERVAL
CMP #C_LEVEL1
BCC G_AUTO_GO_RTN
STZ G_INTERVAL
LDA G_ORIENTAION
CMP #1
BEQ G_AUTO_RIGHT
CMP #2
BEQ G_AUTO_LEFT
CMP #3
BEQ G_AUTO_UP
CMP #4
BEQ G_AUTO_DOWN
G_AUTO_GO_RTN:
PLY
PLX
PLA
RTS
G_AUTO_RIGHT:
INC G_HEAD_X
BRA G_AUTO_CHECK_SNAKE
G_AUTO_LEFT:
DEC G_HEAD_X
BRA G_AUTO_CHECK_SNAKE
G_AUTO_UP:
DEC G_HEAD_Y
BRA G_AUTO_CHECK_SNAKE
G_AUTO_DOWN:
INC G_HEAD_Y
BRA G_AUTO_CHECK_SNAKE
G_AUTO_CHECK_SNAKE:
JSR G_CHECK_SNAKE
JMP G_AUTO_GO_RTN
;-----------------------------------------
;IN: G_CURSOR_X,G_CURSOR_Y
;OUT; G_IN_PARA
G_XY_TO_DATA:
PHA
PHX
PHY
LDA G_CURSOR_Y
ASL A
ASL A
ASL A
ASL A
SEC
SBC G_CURSOR_Y
CLC
ADC G_CURSOR_X
INC A
STA G_IN_PARA
PLY
PLX
PLA
RTS
;-----------------------------------------
;IN: G_IN_PARA
;OUT:G_CURSOR_X,G_CURSOR_Y
G_Y_0:
LDA #0
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_1:
LDA #1
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_2:
LDA #2
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_3:
LDA #3
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_4:
LDA #4
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_5:
LDA #5
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_6:
LDA #6
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_DATA_XY:
PHA
LDA G_IN_PARA
CMP #16
BCC G_Y_0
CMP #31
BCC G_Y_1
CMP #46
BCC G_Y_2
CMP #61
BCC G_Y_3
CMP #76
BCC G_Y_4
CMP #91
BCC G_Y_5
CMP #106
BCC G_Y_6
CMP #121
BCC G_Y_7
CMP #136
BCC G_Y_8
CMP #151
BCC G_Y_9
CMP #166
BCC G_Y_10
CMP #181
BCC G_Y_11
CMP #196
BCC G_Y_12
CMP #211
BCC G_Y_13
CMP #226
BCC G_Y_14
G_DATA_XY_RTN:
PLA
RTS
G_Y_7:
LDA #7
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_8:
LDA #8
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_9:
LDA #9
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_10:
LDA #10
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_11:
LDA #11
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_12:
LDA #12
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_13:
LDA #13
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
G_Y_14:
LDA #14
STA G_CURSOR_Y
STA G_IN_PARA+1
JSR G_MUL_15_ADD_1
JMP G_DATA_XY_RTN
;IN: G_IN_PARA+1
G_MUL_15_ADD_1:
LDA G_IN_PARA+1
ASL A
ASL A
ASL A
ASL A
SEC
SBC G_IN_PARA+1
STA G_IN_PARA+1
INC G_IN_PARA+1
SEC
LDA G_IN_PARA
SBC G_IN_PARA+1
STA G_CURSOR_X
RTS
;-----------------------------------------
G_DMA_BLOCK:
PHA
PHX
PHY
M_Keep_Drr
M_Change_ST7636R_CS_Drr
M_Write_I 036h
.IF INVERT=1
M_Write_D 060h
.ELSE
M_Write_D 000h
.ENDIF
M_Input #2AH ;COM SET
M_Para G_CURSOR_X+1
M_Para G_CURSOR_X
JSR G_CURSORX_ADD_15
M_Para G_CURSOR_X+1
M_Para G_CURSOR_X
M_Input #2BH ;SEG SET
M_Para G_CURSOR_Y+1
M_Para G_CURSOR_Y
JSR G_CURSORY_ADD_15
M_Para G_CURSOR_Y+1
M_Para G_CURSOR_Y
M_Input #2CH
SEI
LDA <R_TempL
STA DMSL
LDA <R_TempH
STA DMSH
LDA <R_Pic_DrrL
STA DMRL
LDA <R_Pic_DrrH
STA DMRH
LDA #<C_ST7636_Data_Addr
STA DMDL
LDA #>C_ST7636_Data_Addr
STA DMDH
LDA #<C_ST7636_CS_Drr
STA DRRL
LDA #>C_ST7636_CS_Drr
STA DRRH
LDA #03H
STA DCNTH
LDA #00H
STA DCNTL
CLI
M_Write_I 036h
M_Write_D 000h
M_Relase_Drr
PLY
PLX
PLA
RTS
;-----------------------------------------
G_CURSORX_ADD_15:
PHA
CLC
LDA G_CURSOR_X
ADC #15
STA G_CURSOR_X
STZ G_CURSOR_X+1
PLA
RTS
;-----------------------------------------
G_CURSORY_ADD_15:
PHA
CLC
LDA G_CURSOR_Y
ADC #15
STA G_CURSOR_Y
STZ G_CURSOR_Y+1
PLA
RTS
;-----------------------------------------
G_DATA_TEMPHL:
PHA
LDA #80H
STA R_TempH
STZ R_TempL
PLA
RTS
;-----------------------------------------
G_TARGET_TEMPHL:
PHA
LDA #83H
STA R_TempH
STZ R_TempL
PLA
RTS
;-----------------------------------------
G_BLANK_TEMPHL:
PHA
LDA #86H
STA R_TempH
STZ R_TempL
PLA
RTS
;-----------------------------------------
G_CHECK_PSELF:
PHA
PHX
STZ G_RE_VALUE
LDX #1
LDA G_LENGTH
DEC A
DEC A
STA G_IN_PARA+1
G_CHECK_PSELF_LOOP:
LDA G_SNAKE_DATA,X
CMP G_IN_PARA
BEQ G_P_ITSELF
INX
CPX G_IN_PARA+1
BCC G_CHECK_PSELF_LOOP
BRA G_CHECK_PSELF_RTN
G_P_ITSELF:
LDA #2
STA G_RE_VALUE
G_CHECK_PSELF_RTN:
PLX
PLA
RTS
;-----------------------------------------
G_SET_BANK:
PHA
LDA #C_PIC_BANK
STA R_Pic_DrrL
STZ R_Pic_DrrH
PLA
RTS
;-----------------------------------------
G_XY_MUL_16:
PHA
LDA G_CURSOR_X
ASL A
ASL A
ASL A
ASL A
STA G_CURSOR_X
LDA G_CURSOR_Y
ASL A
ASL A
ASL A
ASL A
STA G_CURSOR_Y
PLA
RTS
;-----------------------------------------
G_DISPLAY_TARGET:
PHA
LDA G_TARGET_X
STA G_CURSOR_X
LDA G_TARGET_Y
STA G_CURSOR_Y
JSR G_XY_MUL_16
JSR G_SET_BANK
JSR G_TARGET_TEMPHL
JSR G_DMA_BLOCK
PLA
RTS
;-----------------------------------------
G_RANDOM_TABLE:
DB 116,159,192,02,01,18,210,186,163,110,139,08,84,76,124,172
DB 181,51,153,199,145,168,156,03,217,154,171,197,183,58,135,178
DB 195,130,175,93,121,29,71,142,67,22,177,48,14,23,10,185
DB 105,138,108,20,00,52,09,128,34,60,102,107,78,219,152,83
DB 46,57,166,64,73,12,85,63,45,35,99,202,55,65,68,125
DB 13,129,16,176,21,134,208,05,44,94,54,90,07,56,80,91
DB 167,47,115,95,17,88,04,218,144,174,148,30,211,98,189,53
DB 39,75,69,200,11,100,114,191,96,146,205,32,222,101,74,109
DB 140,70,06,179,72,106,89,170,126,161,66,198,165,82,31,182
DB 92,79,81,103,212,203,220,112,25,157,61,162,184,196,26,28
DB 41,215,15,87,136,150,209,118,104,40,37,86,213,36,141,42
DB 169,77,19,49,113,133,187,137,190,201,164,59,50,43,221,149
DB 147,194,180,204,33,122,119,120,62,207,132,143,223,206,224,97
DB 173,123,158,216,160,155,188,38,127,151,214,111,193,27,24,131
DB 117,68,180,195,89,67,124,00,90,72,165,145,99,159,119,126
DB 169,100,194,39,81,120,153,202,11,53,109,198,184,205,105,08
;-----------------------------------------
G_CHECK_EAT:
PHA
STZ G_RE_VALUE
LDA G_HEAD_X
CMP G_TARGET_X
BNE G_CHECK_EAT_RTN
LDA G_HEAD_Y
CMP G_TARGET_Y
BNE G_CHECK_EAT_RTN
LDA #1
STA G_RE_VALUE
G_CHECK_EAT_RTN:
PLA
RTS
;-----------------------------------------
G_DETECT_USB:
LDA <USBCON
BIT #02H
BEQ G_DETECT_USB_RTN
LDA #C_SNAKE_FG
TRB G_FLAG
G_DETECT_USB_RTN:
RTS
;-----------------------------------------
G_CLEAR_TAIL:
PHA
PHX
PHY
LDA G_LENGTH
TAX
LDA G_SNAKE_DATA,X
STA G_IN_PARA
STZ G_SNAKE_DATA,X
JSR G_DATA_XY
JSR G_XY_MUL_16
JSR G_SET_BANK
JSR G_BLANK_TEMPHL
JSR G_DMA_BLOCK
PLY
PLX
PLA
RTS
;-----------------------------------------
G_RANDOM_TARGET:
PHA
PHX
G_RANDOM_AGAIN:
INC G_RANDOM
LDX G_RANDOM
LDA G_RANDOM_TABLE,X
STA G_IN_PARA
JSR G_CHECK_PSELF
LDA G_RE_VALUE
CMP #2
BEQ G_RANDOM_AGAIN
LDA G_IN_PARA
JSR G_DATA_XY
LDA G_CURSOR_X
STA G_TARGET_X
LDA G_CURSOR_Y
STA G_TARGET_Y
JSR G_DISPLAY_TARGET
PLX
PLA
RTS
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -