-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsinexpl.asm
373 lines (313 loc) · 6.25 KB
/
sinexpl.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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
; (C) June 27, 2001 M. Feliks
include sys.inc
MAX_POINTS equ 180
POINT struc
x dd ?
y dd ?
vx dd ?
vy dd ?
ends
.model tiny
.code
.386
org 100h
entrypoint:
call do_startup
call init_sincos
call init_palette
mov counter, 0
main_loop:
cmp counter, 0
jne c_next
mov counter, 400
call start_points
c_next:
dec counter
call move_points
call draw_points
call timer_wait
call blur
call copy_buffer
mov ah, 6h
mov dl, 0ffh
int 21h
jz main_loop
call do_shutdown
blur proc
push ds
mov ds, buffer_seg
xor si, si
xor eax, eax
mov cx, 320/4
@@clear1:
mov dword ptr [si], eax
add si, 4
dec cx
jnz @@clear1
xor bx, bx
mov cx, 64000-2*320
@@blur_loop:
mov al, byte ptr [si-1]
mov bl, byte ptr [si+1]
add ax, bx
mov bl, byte ptr [si-320]
add ax, bx
mov bl, byte ptr [si+320]
add ax, bx
shr ax, 2
jz @@next
dec al
mov byte ptr [si], al
@@next:
inc si
dec cx
jnz @@blur_loop
xor eax, eax
mov cx, 320/4
@@clear2:
mov dword ptr [si], eax
add si, 4
dec cx
jnz @@clear2
pop ds
ret
endp
init_palette proc
mov dx, 03c8h
xor ax, ax
out dx, al
inc dx
mov cx, 64
g_color1:
xor al, al
out dx, al
mov al, ah
out dx, al
xor al, al
out dx, al
inc ah
loop g_color1
xor ax, ax
mov cx, 64
g_color2:
xor al, al
out dx, al
mov al, 63
out dx, al
mov al, ah
out dx, al
inc ah
loop g_color2
xor ax, ax
mov cx, 64
g_color3:
mov al, ah
out dx, al
mov al, 63
out dx, al
out dx, al
inc ah
loop g_color3
mov al, 63
mov cx, 64
g_color4:
out dx, al
out dx, al
out dx, al
loop g_color4
ret
endp
move_points proc
mov di, offset points
mov cx, MAX_POINTS
@@move:
fld dword ptr [di].x
fcom min_x
fstsw ax
sahf
jae @@ok1 ; x >= min_x
ffree st
mov eax, min_x
mov dword ptr [di].x, eax
fld dword ptr [di].x
fld dword ptr [di].vx
fchs
fstp dword ptr [di].vx ; vx = vx*(-1)
@@ok1:
fcom max_x
fstsw ax
sahf
jbe @@ok2 ; x <= max_x
ffree st
mov eax, max_x
mov dword ptr [di].x, eax
fld dword ptr [di].x
fld dword ptr [di].vx
fchs
fstp dword ptr [di].vx ; vx = vx*(-1)
@@ok2:
fadd dword ptr [di].vx
fstp dword ptr [di].x ; x+=vx
fld dword ptr [di].y
fcom min_y
fstsw ax
sahf
jae @@ok3 ; y >= min_y
ffree st
mov eax, min_y
mov dword ptr [di].y, eax
fld dword ptr [di].y
fld dword ptr [di].vy
fchs
fstp dword ptr [di].vy ; vy = vy*(-1)
@@ok3:
fcom max_y
fstsw ax
sahf
jbe @@ok4 ; y <= max_y
ffree st
mov eax, max_y
mov dword ptr [di].y, eax
fld dword ptr [di].y
fld dword ptr [di].vy
fmul gravity
fstp dword ptr [di].vy ; vy = vy*(-1)*0.5
@@ok4:
fadd dword ptr [di].vy
fstp dword ptr [di].y ; y+=vy
fld dword ptr [di].vy
fadd delta_vy
fstp dword ptr [di].vy ; vy+=delta_vy
add di, type POINT
dec cx
jnz @@move
ret
endp
draw_points proc
@@temp equ word ptr [bp-2]
push bp
mov bp, sp
sub sp, 2
push es
mov es, buffer_seg
mov di, offset points
mov cx, MAX_POINTS
mov dx, 0ffffh
@@draw:
fld dword ptr [di].y
fistp @@temp
mov bx, @@temp
mov ax, bx
shl bx, 6
shl ax, 8
add bx, ax
fld dword ptr [di].x
fistp @@temp
add bx, @@temp
mov word ptr es:[bx], dx
mov word ptr es:[bx+320], dx
add di, type POINT
dec cx
jnz @@draw
pop es
mov sp, bp
pop bp
ret
endp
init_sincos proc
@@angle equ dword ptr [bp-4]
@@delta_a equ dword ptr [bp-8]
push bp
mov bp, sp
sub sp, 8
mov @@temp, MAX_POINTS/2
fldpi
fidiv @@temp
fstp @@delta_a
mov dword ptr @@angle, 0
xor di, di
mov cx, MAX_POINTS
isc_loop:
fld @@angle
fld st(0)
fld st(0)
fsin
fstp dword ptr sintab[di]
fcos
fstp dword ptr costab[di]
fadd @@delta_a
fstp @@angle
add di, 4
dec cx
jnz isc_loop
mov sp, bp
pop bp
ret
endp
start_points proc
@@temp equ word ptr [bp-2]
push bp
mov bp, sp
sub sp, 2
push word ptr 310
push word ptr 10
call random
push ax
push word ptr 190
push word ptr 10
call random
pop bx ; ax - y, bx - x
mov di, offset points
xor cx, cx
@@init:
mov @@temp, bx
fild @@temp
fstp dword ptr [di].x
mov @@temp, ax
fild @@temp
fstp dword ptr [di].y
mov si, cx
shl si, 2
mov edx, dword ptr sintab[si]
mov dword ptr [di].vx, edx
mov edx, dword ptr costab[si]
mov dword ptr [di].vy, edx
add di, type POINT
inc cx
cmp cx, MAX_POINTS
jne @@init
mov sp, bp
pop bp
ret
endp
random proc
@@min equ word ptr [bp+4]
@@max equ word ptr [bp+6]
push bp
mov bp, sp
mov bx, random_seed
add bx, 9248h
ror bx, 3
mov random_seed, bx
mov ax, @@max
sub ax, @@min
mul bx
mov ax, dx
add ax, @@min ; ax - random number
pop bp
ret 4
endp
.data
min_x dd 5.0
max_x dd 314.0
min_y dd 5.0
max_y dd 194.0
gravity dd -0.5
delta_vy dd 0.01
random_seed dw 1111h
.data?
counter dw ?
sintab dd MAX_POINTS dup(?)
costab dd MAX_POINTS dup(?)
points POINT MAX_POINTS dup(?, ?)
end entrypoint