1
2	%macro draw_pixel_norm 2
3		mov edx,eax
4		shr edx,%1
5		and edx,0x0000000F
6		jz %%end
7		mov dx,[edx*4+ebx]
8		mov word [edi],dx
9align 2
10%%end:
11		add edi,2
12	%endmacro
13
14	%macro draw_pixel_50 2
15		mov edx,eax
16		shr edx,%1
17		and edx,0x0000000F
18		jz %%end
19		mov dx,[edx*4+ebx]
20		and word [edi],0xf7de
21		and dx,0xf7de
22		shr word [edi],1
23		shr dx,1
24		add word [edi],dx
25align 2
26%%end:
27		add edi,2
28	%endmacro
29
30	%macro draw_pixel_xzoom_norm 2
31		;; x zoom processing
32		mov edx,%2
33		add edx,[dda_x_skip]
34		mov dl,byte [edx]
35		cmp dl,0
36		jz %%zoom_end
37
38		draw_pixel_norm %1,0
39align 2
40%%zoom_end:
41	%endmacro
42
43	%macro draw_pixel_xzoom_50 2
44		;; x zoom processing
45		mov edx,%2
46		add edx,[dda_x_skip]
47		mov dl,byte [edx]
48		cmp dl,0
49		jz %%zoom_end
50
51		draw_pixel_50 %1,0
52align 2
53%%zoom_end:
54	%endmacro
55
56	%macro inc_edi_std_norm 0
57		add edi,BUFX_2_MINUS_32
58	%endmacro
59	%macro inc_edi_std_xzoom_norm 0
60		add edi,BUFX_2
61		sub edi,[ebp + %$zx]
62		sub edi,[ebp + %$zx]
63	%endmacro
64
65	%macro inc_edi_yflip_norm 0
66		sub edi,BUFX_2_PLUS_32
67	%endmacro
68	%macro inc_edi_yflip_xzoom_norm 0
69		sub edi,BUFX_2
70		sub edi,[ebp + %$zx]
71		sub edi,[ebp + %$zx]
72	%endmacro
73
74	%macro inc_edi_std_50 0
75		inc_edi_std_norm
76	%endmacro
77	%macro inc_edi_std_xzoom_50 0
78		inc_edi_std_xzoom_norm
79	%endmacro
80
81	%macro inc_edi_yflip_50 0
82		inc_edi_yflip_norm
83	%endmacro
84	%macro inc_edi_yflip_xzoom_50 0
85		inc_edi_yflip_xzoom_norm
86	%endmacro
87
88	%macro draw_line_std 1
89		mov eax,[ebp + %$zy]
90		mov esi,full_y_skip
91		cmp eax,16
92		jz %%full_zoom
93		mov esi,dda_y_skip
94align 2
95%%full_zoom:
96
97		push edx
98		neg edx
99		add edx,eax
100		xor eax,eax
101		mov al, byte [esi + edx]	; 1 ou 0
102		shl eax,3
103		add ecx,eax
104
105		mov eax,[ecx]
106		draw_pixel_%1 28,0
107		draw_pixel_%1 24,1
108		draw_pixel_%1 20,2
109		draw_pixel_%1 16,3
110		draw_pixel_%1 12,4
111		draw_pixel_%1 8,5
112		draw_pixel_%1 4,6
113		draw_pixel_%1 0,7
114
115		mov eax,[ecx+4]
116		draw_pixel_%1 28,8
117		draw_pixel_%1 24,9
118		draw_pixel_%1 20,10
119		draw_pixel_%1 16,11
120		draw_pixel_%1 12,12
121		draw_pixel_%1 8,13
122		draw_pixel_%1 4,14
123		draw_pixel_%1 0,15
124	;;		add edi,BUFX_2_MINUS_32
125		inc_edi_std_%1
126		pop edx
127	%endmacro
128
129
130	%macro draw_line_yflip 1
131		mov eax,[ebp + %$zy]
132		mov esi,full_y_skip
133		cmp eax,16
134		jz %%full_zoom
135		mov esi,dda_y_skip
136align 2
137%%full_zoom:
138		push edx
139		neg edx
140		add edx,eax
141		xor eax,eax
142		mov al, byte [esi + edx]	; 1 ou 0
143		shl eax,3
144		add ecx,eax
145
146		mov eax,[ecx]
147		draw_pixel_%1 28,0
148		draw_pixel_%1 24,1
149		draw_pixel_%1 20,2
150		draw_pixel_%1 16,3
151		draw_pixel_%1 12,4
152		draw_pixel_%1 8,5
153		draw_pixel_%1 4,6
154		draw_pixel_%1 0,7
155
156		mov eax,[ecx+4]
157		draw_pixel_%1 28,8
158		draw_pixel_%1 24,9
159		draw_pixel_%1 20,10
160		draw_pixel_%1 16,11
161		draw_pixel_%1 12,12
162		draw_pixel_%1 8,13
163		draw_pixel_%1 4,14
164		draw_pixel_%1 0,15
165
166	;;		sub edi,BUFX_2_PLUS_32
167		inc_edi_yflip_%1
168		pop edx
169	%endmacro
170
171	%macro draw_line_xflip 1
172		mov eax,[ebp + %$zy]
173		mov esi,full_y_skip
174		cmp eax,16
175		jz %%full_zoom
176		mov esi,dda_y_skip
177align 2
178%%full_zoom:
179		push edx
180		neg edx
181		add edx,eax
182		xor eax,eax
183		mov al, byte [esi + edx]	; 1 ou 0
184		shl eax,3
185		add ecx,eax
186
187		mov eax,[ecx+4]
188		draw_pixel_%1 0,0
189		draw_pixel_%1 4,1
190		draw_pixel_%1 8,2
191		draw_pixel_%1 12,3
192		draw_pixel_%1 16,4
193		draw_pixel_%1 20,5
194		draw_pixel_%1 24,6
195		draw_pixel_%1 28,7
196
197		mov eax,[ecx]
198		draw_pixel_%1 0,8
199		draw_pixel_%1 4,9
200		draw_pixel_%1 8,10
201		draw_pixel_%1 12,11
202		draw_pixel_%1 16,12
203		draw_pixel_%1 20,13
204		draw_pixel_%1 24,14
205		draw_pixel_%1 28,15
206
207	;;	add edi,BUFX_2_MINUS_32
208		inc_edi_std_%1
209		pop edx
210	%endmacro
211
212	%macro draw_line_xflip_yflip 1
213		mov eax,[ebp + %$zy]
214		mov esi,full_y_skip
215		cmp eax,16
216		jz %%full_zoom
217		mov esi,dda_y_skip
218align 2
219%%full_zoom:
220		push edx
221		neg edx
222		add edx,eax
223		xor eax,eax
224		mov al, byte [esi + edx]	; 1 ou 0
225		shl eax,3
226		add ecx,eax
227
228		mov eax,[ecx+4]
229		draw_pixel_%1 0,0
230		draw_pixel_%1 4,1
231		draw_pixel_%1 8,2
232		draw_pixel_%1 12,3
233		draw_pixel_%1 16,4
234		draw_pixel_%1 20,5
235		draw_pixel_%1 24,6
236		draw_pixel_%1 28,7
237
238		mov eax,[ecx]
239		draw_pixel_%1 0,8
240		draw_pixel_%1 4,9
241		draw_pixel_%1 8,10
242		draw_pixel_%1 12,11
243		draw_pixel_%1 16,12
244		draw_pixel_%1 20,13
245		draw_pixel_%1 24,14
246		draw_pixel_%1 28,15
247		;;sub edi,BUFX_2_PLUS_32
248		inc_edi_yflip_%1
249		pop edx
250	%endmacro
251
252	%macro get_dest_buf 0
253		mov edx,BUFX_2
254		mov eax,[ebp + %$sy]
255		mov edi,[ebp + %$sx]
256		mul edx
257		shl edi,1
258		add edi,eax
259		add edi,[ebp + %$dest]	;  edi = poiteur sur la ligne a dessiner
260	%endmacro
261
262	%macro get_dest_buf_yflip 0
263		mov eax,[ebp + %$zy]
264		mov edx,BUFX_2
265		sub eax,1
266		mov edi,[ebp + %$sx]
267		add eax,[ebp + %$sy]
268		mul edx
269		shl edi,1
270		add edi,eax
271		add edi,[ebp + %$dest]	;  edi = poiteur sur la ligne a dessiner
272	%endmacro
273
274	%macro draw_tile_i386 1
275			;; start of the function
276	proc draw_tile_i386_%1
277	%$tileno arg
278	%$sx     arg
279	%$sy     arg
280	%$zx     arg
281	%$zy     arg
282	%$color  arg
283	%$xflip  arg
284	%$yflip  arg
285	%$dest   arg		; destination buffer (352x256x16)
286
287	pusha
288
289	;; pointeur sur la tile
290	mov eax,[ebp + %$tileno]
291	mov ecx,[mem_gfx]
292	shl eax,7
293	mov ecx,[ecx]
294	add ecx,eax	; ecx = pointeur sur la tile
295
296	;; pointeur sur la palette
297	mov eax,[ebp + %$color]
298	mov ebx,[current_pc_pal]
299	shl eax,6
300	add ebx,eax	; ebx = pointeur sur la palette
301
302	;;  xzoom?
303	cmp byte [ebp + %$zx],16
304	jnz NEAR %%.draw_xzoom
305
306	;; xflip?
307	cmp byte [ebp + %$xflip],0
308	jnz NEAR %%.draw_xflip
309
310	;; yflip?
311	cmp byte [ebp + %$yflip],0
312	jnz NEAR %%.draw_yflip
313
314
315;;; draw a tile with yzoom
316	get_dest_buf
317	mov edx,[ebp + %$zy]	; dx = conteur de zx a 0
318	cmp dx,0
319	jz NEAR %%.end
320align 2
321%%.loop_next_y:
322	draw_line_std %1
323
324	dec dx
325	jnz NEAR %%.loop_next_y
326	jmp %%.end
327
328;;; draw a tile with yzoom+yflip
329align 2
330%%.draw_yflip
331	get_dest_buf_yflip
332	mov edx,[ebp + %$zy]	; dx = conteur de zx a 0
333	cmp dx,0
334	jz NEAR %%.end
335align 2
336%%.yflip_loop_next_y:
337	draw_line_yflip %1
338
339	dec dx
340	jnz NEAR %%.yflip_loop_next_y
341	jmp %%.end
342
343align 2
344;;; draw a tile with yzoom+xflip
345%%.draw_xflip:
346
347	cmp byte [ebp + %$yflip],0
348	jnz NEAR %%.draw_xflip_yflip
349
350	get_dest_buf
351	mov edx,[ebp + %$zy]	; dx = conteur de zx a 0
352	cmp dx,0
353	jz NEAR %%.end
354align 2
355%%.xflip_loop_next_y:
356	draw_line_xflip %1
357
358	dec dx
359	jnz NEAR %%.xflip_loop_next_y
360	jmp %%.end
361
362align 2
363%%.draw_xflip_yflip
364	get_dest_buf_yflip
365	mov edx,[ebp + %$zy]	; dx = conteur de zx a 0
366	cmp dx,0
367	jz NEAR %%.end
368align 2
369%%.xflip_yflip_loop_next_y:
370	draw_line_xflip_yflip %1
371
372	dec dx
373	jnz NEAR %%.xflip_yflip_loop_next_y
374	jmp %%.end
375
376align 2
377%%.draw_xzoom
378	cmp byte [ebp + %$xflip],0
379	jnz NEAR %%.xzoom_draw_xflip
380
381	cmp byte [ebp + %$yflip],0
382	jnz NEAR %%.xzoom_draw_yflip
383
384
385;;; draw a tile with yzoom+xzoom
386	get_dest_buf
387	mov edx,[ebp + %$zy]	; dx = conteur de zx a 0
388	cmp dx,0
389	jz NEAR %%.end
390align 2
391%%.xzoom_loop_next_y:
392	draw_line_std xzoom_%1
393
394	dec dx
395	jnz NEAR %%.xzoom_loop_next_y
396	jmp %%.end
397
398align 2
399;;; draw a tile with xzoom+yzoom+yflip
400%%.xzoom_draw_yflip
401	get_dest_buf_yflip
402	mov edx,[ebp + %$zy]	; dx = conteur de zx a 0
403	cmp dx,0
404	jz NEAR %%.end
405align 2
406%%.xzoom_yflip_loop_next_y:
407	draw_line_yflip xzoom_%1
408
409	dec dx
410	jnz NEAR %%.xzoom_yflip_loop_next_y
411	jmp %%.end
412
413align 2
414;;; draw a tile with xzoom_yzoom+xflip
415%%.xzoom_draw_xflip:
416
417	cmp byte [ebp + %$yflip],0
418	jnz NEAR %%.xzoom_draw_xflip_yflip
419
420	get_dest_buf
421	mov edx,[ebp + %$zy]	; dx = conteur de zx a 0
422	cmp dx,0
423	jz NEAR %%.end
424
425align 2
426%%.xzoom_xflip_loop_next_y:
427	draw_line_xflip xzoom_%1
428	dec dx
429	jnz NEAR %%.xzoom_xflip_loop_next_y
430	jmp %%.end
431
432align 2
433%%.xzoom_draw_xflip_yflip
434	get_dest_buf_yflip
435	mov edx,[ebp + %$zy]	; dx = conteur de zx a 0
436	cmp dx,0
437	jz NEAR %%.end
438
439align 2
440%%.xzoom_xflip_yflip_loop_next_y:
441	draw_line_xflip_yflip xzoom_%1
442	dec dx
443	jnz NEAR %%.xzoom_xflip_yflip_loop_next_y
444	jmp %%.end
445
446align 2
447%%.end:
448	popa
449	endproc
450%endmacro
451
452
453
454;; scanline rendering
455	%macro scan_draw_line_std 1
456
457		mov eax,[ecx]
458		draw_pixel_%1 28,0
459		draw_pixel_%1 24,1
460		draw_pixel_%1 20,2
461		draw_pixel_%1 16,3
462		draw_pixel_%1 12,4
463		draw_pixel_%1 8,5
464		draw_pixel_%1 4,6
465		draw_pixel_%1 0,7
466
467		mov eax,[ecx+4]
468		draw_pixel_%1 28,8
469		draw_pixel_%1 24,9
470		draw_pixel_%1 20,10
471		draw_pixel_%1 16,11
472		draw_pixel_%1 12,12
473		draw_pixel_%1 8,13
474		draw_pixel_%1 4,14
475		draw_pixel_%1 0,15
476	%endmacro
477
478	%macro scan_draw_line_xflip 1
479
480		mov eax,[ecx+4]
481		draw_pixel_%1 0,0
482		draw_pixel_%1 4,1
483		draw_pixel_%1 8,2
484		draw_pixel_%1 12,3
485		draw_pixel_%1 16,4
486		draw_pixel_%1 20,5
487		draw_pixel_%1 24,6
488		draw_pixel_%1 28,7
489
490		mov eax,[ecx]
491		draw_pixel_%1 0,8
492		draw_pixel_%1 4,9
493		draw_pixel_%1 8,10
494		draw_pixel_%1 12,11
495		draw_pixel_%1 16,12
496		draw_pixel_%1 20,13
497		draw_pixel_%1 24,14
498		draw_pixel_%1 28,15
499	%endmacro
500
501
502	%macro draw_scanline_tile_i386 1
503			;; start of the function
504	proc draw_scanline_tile_i386_%1
505	%$tileno arg
506	%$yoffs  arg
507	%$sx     arg
508	%$sy     arg
509	%$zx     arg
510	%$color  arg
511	%$xflip  arg
512	%$dest   arg		; destination buffer (352x256x16)
513
514	pusha
515
516	;; pointeur sur la tile
517	mov eax,[ebp + %$tileno]
518	mov ecx,[mem_gfx]
519	mov edx,[ebp + %$yoffs]
520	shl eax,7
521	mov ecx,[ecx]
522	shl edx,3
523	add ecx,eax	; ecx = pointeur sur la tile
524	add ecx,edx
525
526	;; pointeur sur la palette
527	mov eax,[ebp + %$color]
528	mov ebx,[current_pc_pal]
529	shl eax,6
530	add ebx,eax	; ebx = pointeur sur la palette
531
532	get_dest_buf
533
534
535	;;  xzoom?
536	cmp byte [ebp + %$zx],16
537	jnz NEAR %%.draw_xzoom
538
539	;; xflip?
540	cmp byte [ebp + %$xflip],0
541	jnz NEAR %%.draw_xflip
542
543	;; draw a line wit zx==16
544	scan_draw_line_std %1
545	jmp %%.end
546
547%%.draw_xflip:
548	;; draw a line wit zx==16 and xflip
549	scan_draw_line_xflip %1
550	jmp %%.end
551
552%%.draw_xzoom:
553	cmp byte [ebp + %$xflip],0
554	jnz NEAR %%.xzoom_draw_xflip
555
556	;; draw a line with zx!=16
557	scan_draw_line_std xzoom_%1
558	jmp %%.end
559
560%%.xzoom_draw_xflip
561	;; draw a line with zx!=16 and xflip
562	scan_draw_line_xflip xzoom_%1
563
564align 2
565%%.end:
566	popa
567	endproc
568%endmacro
569