Главная »
Асм » Трехмерный вращающийся куб в DosBox
§ DosBox
Красиво этот кубик работает только в DosBOX, где можно отрегулировать скорость вращения путем уменьшения или увеличения циклов.
§ Алгоритм
Фрейм
- Рисование треугольника
- Копирование фрейма в видеопамять
- Удаление треугольника
- Добавление вращений по осям
Куб
- Считывание и рисование 6 граней
Грань
- Получение номера 4 точек
- Получение (x,y,z) точек и выполнение вращения
- Проекция (x,y,z) -> (px,py)
- Проверка на фронтальную сторону грани
- Рисование 4 линии
§ Код на FASM
1
2
3
4
5 org 100h
6 call scr13
7 call clear
8cycle: mov [box.cl], byte 10
9 call drawcube
10 call copyscr
11 mov [box.cl], byte 0
12 call drawcube
13 add word [box.rx], 1
14 add word [box.ry], 2
15 add word [box.rz], 1
16 jmp cycle
17
18
19
20
21
22drawcube:
23
24
25 mov si, a_face
26
27
28.next: mov cx, 4
29 mov di, point
30@@: lodsb
31 call proj
32 mov [di+0], ax
33 mov [di+2], bx
34 add di, 4
35 loop @b
36
37
38 mov di, point.a
39 mov ax, [di+4+2]
40 sub ax, [di+0+2]
41 mov bx, [di+8+0]
42 sub bx, [di+0+0]
43 imul bx, ax
44 mov ax, [di+4+0]
45 sub ax, [di+0+0]
46 mov cx, [di+8+2]
47 sub cx, [di+0+2]
48 imul ax, cx
49 cmp bx, ax
50 jle .skip
51
52
53 push si
54 mov si, point.a
55 mov di, point.b
56.rpt: mov ax, [si+0]
57 mov bx, [si+2]
58 mov cx, [di+0]
59 mov dx, [di+2]
60 mov bp, [box.cl]
61 call line
62 add si, 4
63 add di, 4
64 cmp si, point.d + 4
65 je .end
66 cmp si, point.d
67 jne .rpt
68 mov di, point.a
69 jmp .rpt
70.end: pop si
71
72
73.skip: cmp si, a_face + (4*6)
74 jne .next
75 ret
76
77
78
79
80
81proj: push cx
82 movzx ebx, al
83 movsx ecx, byte [a_vtx + 3*ebx + 2]
84 movsx eax, byte [a_vtx + 3*ebx + 1]
85 movsx ebx, byte [a_vtx + 3*ebx + 0]
86
87
88 shl ax, 8
89 shl bx, 8
90 shl cx, 8
91
92
93 xchg eax, ecx
94 mov dx, [box.ry]
95 call rotate
96 xchg eax, ecx
97 mov dx, [box.rz]
98 call rotate
99 xchg ebx, ecx
100 mov dx, [box.rx]
101 call rotate
102 xchg ebx, ecx
103
104
105 add ebx, [cam.x]
106 add eax, [cam.y]
107 add ecx, [cam.z]
108 imul eax, 200
109 imul ebx, 200
110
111
112 cdq
113 idiv ecx
114 xchg eax, ebx
115 cdq
116 idiv ecx
117 add ax, 160
118 sub bx, 100
119 neg bx
120 pop cx
121 ret
122
123
124
125
126
127rotate: mov [.x], ax
128 mov [.y], bx
129 mov [.r], dx
130
131
132 fild word [.r]
133 fld dword [.f360]
134 fdivp st1,st0
135 fsincos
136
137
138 fild word [.y]
139 fild word [.x]
140 fmul st0,st2
141 fxch st1
142 fmul st0,st3
143 fsubp st1,st0
144 fistp dword [.t]
145 mov eax, [.t]
146
147
148 fild word [.x]
149 fild word [.y]
150 fmulp st2,st0
151 fmulp st2,st0
152 faddp st1,st0
153 fistp dword [.t]
154 mov ebx, [.t]
155
156 ret
157
158
159.f360: dd 100.0
160.x: dw 0
161.y: dw 0
162.t: dd 0
163.r: dw 0
164
165
166
167
168
169scr13: mov ax, 0013h
170 int 10h
171 ret
172
173
174loadvb: mov ax, cs
175 add ax, 1000h
176 mov es, ax
177 ret
178
179
180clear: call loadvb
181 xor di, di
182 xor eax, eax
183 mov cx, 16000
184 rep stosd
185 ret
186
187
188copyscr:
189
190 push ds es
191 xor si, si
192 xor di, di
193 call loadvb
194 push es
195 mov ax, $A000
196 mov es, ax
197 pop ds
198 mov cx, 16000
199 rep movsd
200 pop es ds
201 ret
202
203
204
205
206
207
208line: push si di
209 mov si, 1
210 mov di, 1
211 mov [.x2], cx
212 mov [.y2], dx
213 sub cx, ax
214 jge @f
215 neg cx
216 neg si
217@@: sub dx, bx
218 jge @f
219 neg dx
220 neg di
221@@: mov [.sx], si
222 mov [.sy], di
223 mov [.dx], cx
224 mov [.dy], dx
225 mov si, cx
226 sub si, dx
227 mov dx, bp
228.ps: cmp ax, 320
229 jnb @f
230 cmp bx, 200
231 jnb @f
232 imul di, bx, 320
233 add di, ax
234 mov [es: di], dl
235@@: cmp ax, [.x2]
236 jne @f
237 cmp bx, [.y2]
238 jne @f
239 pop di si
240 ret
241@@: mov cx, si
242 add cx, cx
243 cmp cx, [.dx]
244 jg @f
245 add si, [.dx]
246 add bx, [.sy]
247@@: add cx, [.dy]
248 jle .ps
249 sub si, [.dy]
250 add ax, [.sx]
251 jmp .ps
252.sx: dw 0
253.sy: dw 0
254.dx: dw 0
255.dy: dw 0
256.x2: dw 0
257.y2: dw 0
258
259
260
261
262
263
264
265
266
267
268box:
269.cl: db 14
270.rx: dw 0
271.ry: dw 0
272.rz: dw 0
273
274
275a_vtx: db -1, 1, 1
276 db 1, 1, 1
277 db 1,-1, 1
278 db -1,-1, 1
279 db -1, 1,-1
280 db 1, 1,-1
281 db 1,-1,-1
282 db -1,-1,-1
283
284
285a_face: db 0,1,2,3
286 db 1,5,6,2
287 db 5,4,7,6
288 db 4,0,3,7
289 db 6,7,3,2
290 db 4,5,1,0
291
292cam:
293.x: dd 0
294.y: dd 0
295.z: dd 1200
296
297point:
298.a: dw ?, ?
299.b: dw ?, ?
300.c: dw ?, ?
301.d: dw ?, ?