-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathwkcn.asm
193 lines (156 loc) · 2.24 KB
/
wkcn.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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
;Running Ball
;Jackie Wu (Wu Kan)
;14348134
;totalDelay = outDelay * inDelay
outDelay equ 50000
inDelay equ 1800
MAX_X equ 80
MAX_Y equ 25
;set data segment
mov ax,07c0h
mov ds,ax
;text window
;25 * 80
mov ax,0B800h
mov es,ax
%macro SINGLE 4
;pos dw 0000h ;from 0,0
;vel dw 0101h ;v = (1,1)
;char db '*'
;color db 07H
mov ax, [%1]
mov [pos], ax
mov ax, [%2]
mov [vel], ax
mov al, [%3]
mov [char], al
mov al, [%4]
mov [color], al
call PLAY
mov ax, [pos]
mov [%1], ax
mov ax, [vel]
mov [%2], ax
%endmacro
START:
call DELAY
call PLAY
SINGLE pos1,vel1,char1,color1
SINGLE pos2,vel2,char2,color2
SINGLE pos3,vel3,char3,color3
call SHOWNAME
jmp START
PLAY:
call SETPOINTER
call ELIMINATE
call UPDATEPOS
call SETPOINTER
call SHOW
ret
SHOWNAME:
mov cx,[msgLen]
mov si,message
mov di, 10*80 + 30
printChar:
mov al,[si]
inc si
mov ah,07H
mov [es:di],ax
add di,2
loop printChar
ret
DELAY:
mov cx, outDelay
LOOP1:
mov ax, inDelay
LOOP2:
dec ax
jg LOOP2
loop LOOP1
ret
UPDATEPOS:
;parameter: pos, vel
mov ax,[pos]
mov bx,[vel]
;update x
add ah,bh
jne XNZ
;if x == 0
mov bh,1
XNZ:
CMP ah,MAX_X-1
jl XNF
;if x >= MAX_X-1
mov bh,-1
XNF:
;update y
add al,bl
jne YNZ
;if y == 0
mov bl,1
YNZ:
CMP al,MAX_Y-1
jl YNF
;if y >= MAX_Y-1
mov bl,-1
YNF:
mov [pos],ax
mov [vel],bx
ret
SETPOINTER:
;parameter pos, char
mov ax, 0
mov bx, [pos] ; bx = (x,y)
mov al, bl
mov cx, MAX_X
mul cx ; ax *= MAX_X namely ax = y * MAX_X
mov cx, 0
mov cl, bh
add ax, cx ; ax += x
mov cx, 2
mul cx
mov bx, ax
ret
SHOW:
;old
mov cx,[es:bx]
mov si,[oldpt]
;mov [es:si],cx
;new
mov al, [char]
mov ah, [color]
mov [es:bx],ax
ret
ELIMINATE:
;save bx
mov [oldpt],bx
;clean
mov ax, 0
mov [es:bx],ax
ret
DATA:
message db 'WuKan 14348134'
msgLen dw $-message
outCount dw outDelay
inCount dw inDelay
pos dw 0000h ;from 0,0
vel dw 0101h ;v = (1,1)
char db '*'
color db 07H
oldpt dw 0000h;
;elements
pos1 dw 0000h
vel1 dw 0101h
char1 db '*'
color1 db 03H ;green
pos2 dw 1010h
vel2 dw 01FFh
char2 db 'A'
color2 db 0CFH ;twinkle red and light white
pos3 dw 2019h
vel3 dw 0FFFFh
char3 db '@'
color3 db 0EH ;yello
times 510-($-$$) db 0
dw 0xaa55