1 assume cs:code,ss:stack,ds:data
2 stack segment
3 db 64 dup (0)
4 stack ends
5 data segment
6
7 data ends
8 code segment
9 show_arr:cli
10 mov ax,0b800h
11 mov es,ax
12
13 mov bx,0
14 mov cx,4000
15 mov ax,0000001000000000b
16 s: mov es:[bx],ax
17 inc bx
18 inc bx
19 loop s
20
21 mov bx,0
22 mov cx,80
23 mov dl,'-'
24 mov ax,0
25 line:mov bx,ax
26 add bx,ax
27 mov es:[bx],dl
28 mov es:[bx+24*160],dl
29 inc ax
30 loop line
31
32 mov bx,0
33 mov cx,25
34 mov dl,'|'
35 mov di,0
36 col: mov bx,di
37 mov al,160
38 mul bl
39 mov bx,ax
40 mov es:[bx],dl
41 mov es:[bx+158],dl
42 inc di
43 loop col
44
45 snak_body:jmp snak
46
47 trend dw +2,+2,-160,-2,+160
48
49 snak:mov dl,'*'
50 mov si,16*160+24*2
51 mov bx,si
52 mov cx,4
53 mov ax,0
54 mov ax,trend[0]
55 snak_0: add bx,ax
56 mov es:[bx],dl
57 loop snak_0
58
59 push bx
60 mov bx,160*8+2*56
61 mov byte ptr es:[bx],'$'
62 pop bx
63
64 mov ax,trend[2]
65
66 sti
67
68 move: add bx,trend[0]
69 cmp byte ptr es:[bx],'|'
70 je over
71 cmp byte ptr es:[bx],'-'
72 je over
73 cmp byte ptr es:[bx],'*'
74 je over
75 cmp byte ptr es:[bx],'$'
76 je set_money
77 jmp mov_snak
78
79 mov_snak:call timelag
80
81 mov es:[bx],dl
82
83 add si,ax
84 cmp byte ptr es:[si],'*'
85 jne cls_snak_chg
86
87 cls_snak:mov byte ptr es:[si],0
88 jmp move
89
90 cls_snak_chg:sub si,ax
91 mov ax,2
92 add si,ax
93 cmp byte ptr es:[si],'*'
94 je cls_snak
95 sub si,ax
96 mov ax,-2
97 add si,ax
98 cmp byte ptr es:[si],'*'
99 je cls_snak
100 sub si,ax
101 mov ax,-160
102 add si,ax
103 cmp byte ptr es:[si],'*'
104 je cls_snak
105 sub si,ax
106 mov ax,160
107 add si,ax
108 cmp byte ptr es:[si],'*'
109 je cls_snak
110
111 timelag:push bx
112 push ax
113 mov bx,09FFH
114 fr_1: dec bx
115 mov ax,0FFFFH
116 fr_2: dec ax
117 cmp ax,0
118 jne fr_2
119 cmp bx,0
120 jne fr_1
121
122 pop ax
123 pop bx
124 ret
125
126 over:jmp show_over
127 over_show db 'Game Over!',0
128
129 set_money:mov es:[bx],dl
130 add bx,trend[0]
131 push ax
132 push bx
133 push cx
134 push dx
135 mov ah,02
136 int 1ah
137 mov al,dh
138 mov ah,0
139 mov dh,79
140 div dh
141 inc ah
142 mov al,ah
143 mov dh,2
144 mul dh
145 mov bx,ax
146 call timelag
147 mov ah,02h
148 int 1ah
149 mov al,dh
150 mov ah,0
151 mov dh,23
152 div dh
153 inc ah
154 mov al,ah
155 mov dh,160
156 mul dh
157 add bx,ax
158 mov byte ptr es:[bx],'$'
159 pop dx
160 pop cx
161 pop bx
162 pop ax
163 jmp mov_snak
164
165 show_over: mov bx,12*160+30*2
166 mov ax,0
167 mov di,0
168
169 f_show: mov al,over_show[di]
170 cmp al,0
171 je over_show_end
172 mov es:[bx],al
173 inc di
174 add bx,2
175 jmp f_show
176
177 over_show_end: mov ax,0
178 mov ds,ax
179 mov ax,ds:[200h]
180 mov ds:[4*9],ax
181 mov ax,ds:[202h]
182 mov ds:[4*9+2],ax
183
184 mov ax,4c00h
185 int 21h
186
187 int_9:push ax
188 push bx
189 push ds
190
191 in al,60h
192
193 pushf
194
195 mov bx,0
196 mov ds,bx
197 call dword ptr ds:[200h]
198
199 cmp al,4dh
200 je life
201 cmp al,48h
202 je up
203 cmp al,4bh
204 je right
205 cmp al,50h
206 je down
207 jmp int_9end
208
209 life: mov ax,trend[2]
210 mov trend[0],ax
211 jmp int_9end
212 up: mov ax,trend[4]
213 mov trend[0],ax
214 jmp int_9end
215 right: mov ax,trend[6]
216 mov trend[0],ax
217 jmp int_9end
218 down: mov ax,trend[8]
219 mov trend,ax
220 jmp int_9end
221 int_9end:pop ds
222 pop bx
223 pop ax
224
225 iret
226
227 start:cli
228 mov ax,0
229 mov ds,ax
230 mov ax,ds:[4*9]
231 mov ds:[200h],ax
232 mov ax,ds:[4*9+2]
233 mov ds:[202h],ax
234 mov ax,cs
235 mov word ptr ds:[4*9],offset int_9
236 mov word ptr ds:[4*9+2],ax
237 call show_arr
238 code ends
239 end start