This repository has been archived by the owner on Jan 19, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
move.asm
152 lines (141 loc) · 2.41 KB
/
move.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; move 根据d中的值实现蛇的移动
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.scope
.data zp
.space _stail 2 ; 蛇尾指针
.space _tmp 1
.text
move:
;lda #0 ;演示用
;sta eat
lda eat ;eat判断
bne _head_move ;吃到食物直接进入模式一:head move,否则先执行tail move
lda #csps
ldy #0
sta (_stail),y ;tail move
ldy #40
lda (_stail),y
cmp #csnk ;down search
bne +
lda #40
jsr _propergate_tail
jsr _head_move
rts
* ldy #1
lda (_stail),y
cmp #csnk ;right search
bne +
lda #1
jsr _propergate_tail
jsr _head_move
rts
* jsr _copy_to_ptr
lda #40
sta _tmp
jsr _borrow_ptr
ldy #0
lda (_ptr),y
cmp #csnk ;up search
bne +
jsr _copy_to_tail
jsr _head_move
rts
* jsr _copy_to_ptr
lda #1
sta _tmp
jsr _borrow_ptr
lda (_ptr),y
cmp #csnk ;left search
bne _head_move
jsr _copy_to_tail
jsr _head_move
rts
;;;;;;;;;;;;;;;;;;;;;;;;;
; head move
;;;;;;;;;;;;;;;;;;;;;;;;;
_head_move:
;lda #go_l ;测试用
ldy #0
`_m_judge_dir_head go_d, 40, _propergate_head
`_m_judge_dir_head go_r, 1, _propergate_head
`_m_judge_dir_head go_l, 1, _borrow_head
`_m_judge_dir_head go_u, 40, _borrow_head
rts
move_init:
lda #csnk
sta field + 10*40 + 19 ; 初始化蛇位置
sta field + 11*40 + 19 ; 初始化蛇位置
lda #<[field + 11*40 + 19] ;初始化蛇头
ldx #>[field + 11*40 + 19]
sta shead
stx shead+1
lda #<[field + 10*40 + 19] ;初始化蛇尾
ldx #>[field + 10*40 + 19]
sta _stail
stx _stail+1
rts
_propergate_tail:
`_m_propergate _stail
_propergate_head:
`_m_propergate shead
;;;;;;;;;;;;;;;;;;;;;;;;
; 减法借位,入参为_tmp
;;;;;;;;;;;;;;;;;;;;;;;;
_borrow_ptr:
`_m_borrow _ptr
_borrow_head:
`_m_borrow shead
_copy_to_ptr:
lda _stail
sta _ptr
lda _stail+1
sta _ptr+1
rts
_copy_to_tail:
lda _ptr
sta _stail
lda _ptr+1
sta _stail+1
rts
.scend
;;;;;;;;;;;;;;;;;;;;;;;;
; 加法进位,入参为a
;;;;;;;;;;;;;;;;;;;;;;;;
.macro _m_propergate
clc
adc _1
sta _1
bcc _end
inc _1+1
_end:
rts
.macend
;;;;;;;;;;;;;;;;;;;;;;;;
; _tmp:减数 _1:被减数
;;;;;;;;;;;;;;;;;;;;;;;;
.macro _m_borrow
lda _1
sec
sbc _tmp
sta _1
bcs _end
dec _1+1
_end:
rts
.macend
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; _1:方向 _2:进位/借位数 _3:进位/借位函数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.macro _m_judge_dir_head
lda d
cmp #_1
bne _next
lda #_2
sta _tmp
jsr _3
lda #csnk
sta (shead),y
rts
_next:
.macend