1; "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
2; Ken Silverman's official web site: "http://www.advsys.net/ken"
3; See the included license file "BUILDLIC.TXT" for license info.
4
5.586P
6.8087
7;include mmx.inc       ;Include this if using < WATCOM 11.0 WASM
8
9;Warning: IN THIS FILE, ALL SEGMENTS ARE REMOVED.  THIS MEANS THAT DS:[]
10;MUST BE ADDED FOR ALL SELF-MODIFIES FOR MASM TO WORK.
11;
12;WASM PROBLEMS:
13;   1. Requires all scaled registers (*1,*2,*4,*8) to be last thing on line
14;   2. Using 'DATA' is nice for self-mod. code, but WDIS only works with 'CODE'
15;
16;MASM PROBLEMS:
17;   1. Requires DS: to be written out for self-modifying code to work
18;   2. Doesn't encode short jumps automatically like WASM
19;   3. Stupidly adds wait prefix to ffree's
20
21EXTRN _asm1 : dword
22EXTRN _asm2 : dword
23EXTRN _asm3 : dword
24EXTRN _asm4 : dword
25EXTRN _reciptable : near
26EXTRN _fpuasm : dword
27EXTRN _globalx3 : dword
28EXTRN _globaly3 : dword
29EXTRN _ylookup : near
30
31EXTRN _vplce : near
32EXTRN _vince : near
33EXTRN _palookupoffse : near
34EXTRN _bufplce : near
35
36EXTRN _ebpbak : dword
37EXTRN _espbak : dword
38
39EXTRN _pow2char : near
40EXTRN _pow2long : near
41
42CODE SEGMENT PUBLIC USE32 'DATA'
43ASSUME cs:CODE,ds:CODE
44
45ALIGN 16
46PUBLIC sethlinesizes_
47sethlinesizes_:
48	mov byte ptr [machxbits1+2], al
49	mov byte ptr [machxbits2+2], al
50	mov byte ptr [machxbits3+2], al
51	neg al
52	mov byte ptr [hxsiz1+2], al
53	mov byte ptr [hxsiz2+2], al
54	mov byte ptr [hxsiz3+2], al
55	mov byte ptr [hxsiz4+2], al
56	mov byte ptr [machnegxbits1+2], al
57
58	mov byte ptr [hysiz1+3], bl
59	mov byte ptr [hysiz2+3], bl
60	mov byte ptr [hysiz3+3], bl
61	mov byte ptr [hysiz4+3], bl
62	mov byte ptr [hmach3a+2], bl
63	mov byte ptr [hmach3b+2], bl
64	mov byte ptr [hmach3c+2], bl
65	mov byte ptr [hmach3d+2], bl
66
67	mov dword ptr [hoffs1+2], ecx
68	mov dword ptr [hoffs2+2], ecx
69	mov dword ptr [hoffs3+2], ecx
70	mov dword ptr [hoffs4+2], ecx
71	mov dword ptr [hoffs5+2], ecx
72	mov dword ptr [hoffs6+2], ecx
73	mov dword ptr [hoffs7+2], ecx
74	mov dword ptr [hoffs8+2], ecx
75
76	mov edx, -1
77	mov cl, al
78	sub cl, bl
79	shr edx, cl
80	mov dword ptr [hmach2a+1], edx
81	mov dword ptr [hmach2b+1], edx
82	mov dword ptr [hmach2c+1], edx
83	mov dword ptr [hmach2d+1], edx
84
85	ret
86
87ALIGN 16
88PUBLIC prosethlinesizes_
89prosethlinesizes_:
90	mov dword ptr [prohbuf-4], ecx
91	neg eax
92	mov ecx, eax
93	sub eax, ebx
94	mov byte ptr [prohshru-1], al   ;bl = 32-al-bl
95	mov eax, -1
96	shr eax, cl
97	mov ecx, ebx
98	shl eax, cl
99	mov dword ptr [prohand-4], eax  ;((-1>>(-oal))<<obl)
100	neg ebx
101	mov byte ptr [prohshrv-1], bl   ;bl = 32-bl
102	ret
103
104ALIGN 16
105PUBLIC setvlinebpl_
106setvlinebpl_:
107	mov dword ptr [fixchain1a+2], eax
108	mov dword ptr [fixchain1b+2], eax
109	mov dword ptr [fixchain1m+2], eax
110	mov dword ptr [fixchain1t+2], eax
111	mov dword ptr [fixchain1s+2], eax
112	mov dword ptr [mfixchain1s+2], eax
113	mov dword ptr [tfixchain1s+2], eax
114	mov dword ptr [fixchain2a+2], eax
115	mov dword ptr [profixchain2a+2], eax
116	mov dword ptr [fixchain2ma+2], eax
117	mov dword ptr [fixchain2mb+2], eax
118	mov dword ptr [fixchaint2a+1], eax
119	mov dword ptr [fixchaint2b+2], eax
120	mov dword ptr [fixchaint2c+2], eax
121	mov dword ptr [fixchaint2d+2], eax
122	mov dword ptr [fixchaint2e+2], eax
123	ret
124
125ALIGN 16
126PUBLIC setpalookupaddress_
127setpalookupaddress_:
128	mov dword ptr [pal1+2], eax
129	mov dword ptr [pal2+2], eax
130	mov dword ptr [pal3+2], eax
131	mov dword ptr [pal4+2], eax
132	mov dword ptr [pal5+2], eax
133	mov dword ptr [pal6+2], eax
134	mov dword ptr [pal7+2], eax
135	mov dword ptr [pal8+2], eax
136	ret
137
138ALIGN 16
139PUBLIC prosetpalookupaddress_
140prosetpalookupaddress_:
141	mov dword ptr [prohpala-4], eax
142	ret
143
144ALIGN 16
145PUBLIC setuphlineasm4_
146setuphlineasm4_:
147machxbits3: rol eax, 6                     ;xbits
148	mov dword ptr [hmach4a+2], eax
149	mov dword ptr [hmach4b+2], eax
150	mov bl, al
151	mov dword ptr [hmach4c+2], eax
152	mov dword ptr [hmach4d+2], eax
153	mov dword ptr [hmach1a+2], ebx
154	mov dword ptr [hmach1b+2], ebx
155	mov dword ptr [hmach1c+2], ebx
156	mov dword ptr [hmach1d+2], ebx
157	ret
158
159	;Non-256-stuffed ceiling&floor method with NO SHLD!:
160	;yinc&0xffffff00   lea eax, [edx+88888800h]           1     1/2
161	;ybits...xbits     and edx, 88000088h                 1     1/2
162	;ybits             rol edx, 6                         2     1/2
163	;xinc<<xbits       add esi, 88888888h                 1     1/2
164	;xinc>>(32-xbits)  adc al, 88h                        1     1/2
165	;bufplc            mov cl, byte ptr [edx+88888888h]   1     1/2
166	;paloffs&255       mov bl, byte ptr [ecx+88888888h]   1     1/2
167ALIGN 16
168PUBLIC hlineasm4_
169hlineasm4_:
170	push ebp
171
172	lea ebp, [eax+1]
173
174	cmp ebp, 8
175	jle shorthline
176
177	test edi, 1
178	jnz short skipthe1byte
179
180	mov eax, esi
181hxsiz1: shr eax, 26
182hysiz1: shld eax, edx, 6
183hoffs1: mov cl, byte ptr [eax+88888888h]
184pal1: mov bl, byte ptr [ecx+88888888h]
185	sub esi, _asm1
186	sub edx, _asm2
187	mov byte ptr [edi], bl
188	dec edi
189	dec ebp
190
191skipthe1byte:
192	test edi, 2
193	jnz short skipthe2byte
194
195	mov eax, esi
196hxsiz2: shr eax, 26
197hysiz2: shld eax, edx, 6
198hoffs2: mov cl, byte ptr [eax+88888888h]
199pal2: mov bh, byte ptr [ecx+88888888h]
200	sub esi, _asm1
201	sub edx, _asm2
202
203	mov eax, esi
204hxsiz3: shr eax, 26
205hysiz3: shld eax, edx, 6
206hoffs3: mov cl, byte ptr [eax+88888888h]
207pal3: mov bl, byte ptr [ecx+88888888h]
208	sub esi, _asm1
209	sub edx, _asm2
210	mov word ptr [edi-1], bx
211	sub edi, 2
212	sub ebp, 2
213
214skipthe2byte:
215
216	mov eax, esi
217machxbits1: shl esi, 6                     ;xbits
218machnegxbits1: shr eax, 32-6               ;32-xbits
219	mov dl, al
220
221	inc edi
222
223	add ebx, ebx
224	mov eax, edx
225	jc beginhline64
226
227	mov eax, _asm1
228machxbits2: rol eax, 6                     ;xbits
229	mov dword ptr [hmach4a+2], eax
230	mov dword ptr [hmach4b+2], eax
231	mov dword ptr [hmach4c+2], eax
232	mov dword ptr [hmach4d+2], eax
233	mov ebx, eax
234	mov eax, _asm2
235	mov al, bl
236	mov dword ptr [hmach1a+2], eax
237	mov dword ptr [hmach1b+2], eax
238	mov dword ptr [hmach1c+2], eax
239	mov dword ptr [hmach1d+2], eax
240
241	mov eax, edx
242	jmp beginhline64
243ALIGN 16
244prebeginhline64:
245	mov dword ptr [edi], ebx
246beginhline64:
247
248hmach3a: rol eax, 6
249hmach2a: and eax, 00008888h
250hmach4a: sub esi, 88888888h
251hmach1a: sbb edx, 88888888h
252	sub edi, 4
253hoffs4: mov cl, byte ptr [eax+88888888h]
254	mov eax, edx
255
256hmach3b: rol eax, 6
257hmach2b: and eax, 00008888h
258hmach4b: sub esi, 88888888h
259hmach1b: sbb edx, 88888888h
260pal4: mov bh, byte ptr [ecx+88888888h]
261hoffs5: mov cl, byte ptr [eax+88888888h]
262	mov eax, edx
263
264hmach3c: rol eax, 6
265pal5: mov bl, byte ptr [ecx+88888888h]
266hmach2c: and eax, 00008888h
267	shl ebx, 16
268hmach4c: sub esi, 88888888h
269hmach1c: sbb edx, 88888888h
270hoffs6: mov cl, byte ptr [eax+88888888h]
271
272	mov eax, edx
273	;(
274
275hmach3d: rol eax, 6
276hmach2d: and eax, 00008888h
277hmach4d: sub esi, 88888888h
278hmach1d: sbb edx, 88888888h
279pal6: mov bh, byte ptr [ecx+88888888h]
280hoffs7: mov cl, byte ptr [eax+88888888h]
281	mov eax, edx
282	sub ebp, 4
283	nop
284pal7: mov bl, byte ptr [ecx+88888888h]
285	jnc prebeginhline64
286skipthe4byte:
287
288	test ebp, 2
289	jz skipdrawthe2
290	rol ebx, 16
291	mov word ptr [edi+2], bx
292	sub edi, 2
293skipdrawthe2:
294	test ebp, 1
295	jz skipdrawthe1
296	shr ebx, 24
297	mov byte ptr [edi+3], bl
298skipdrawthe1:
299
300	pop ebp
301	ret
302
303shorthline:
304	test ebp, ebp
305	jz endshorthline
306begshorthline:
307	mov eax, esi
308hxsiz4: shr eax, 26
309hysiz4: shld eax, edx, 6
310hoffs8: mov cl, byte ptr [eax+88888888h]
311pal8: mov bl, byte ptr [ecx+88888888h]
312	sub esi, _asm1
313	sub edx, _asm2
314	mov byte ptr [edi], bl
315	dec edi
316	dec ebp
317	jnz begshorthline
318endshorthline:
319	pop ebp
320	ret
321
322
323	;eax: 00000000 00000000 00000000 temp----
324	;ebx: 00000000 00000000 00000000 temp----
325	;ecx: UUUUUUuu uuuuuuuu uuuuuuuu uuuuuuuu
326	;edx: VVVVVVvv vvvvvvvv vvvvvvvv vvvvvvvv
327	;esi: cnt----- -------- -------- --------
328	;edi: vid----- -------- -------- --------
329	;ebp: paloffs- -------- -------- --------
330	;esp: ???????? ???????? ???????? ????????
331ALIGN 16
332PUBLIC prohlineasm4_
333prohlineasm4_:
334	push ebp
335
336	lea ebp, [ecx+88888888h]
337prohpala:
338	mov ecx, esi
339	lea esi, [eax+1]
340	sub edi, esi
341
342prohbeg:
343	mov eax, ecx
344	shr eax, 20
345prohshru:
346	mov ebx, edx
347	shr ebx, 26
348prohshrv:
349	and eax, 88888888h
350prohand:
351	movzx eax, byte ptr [eax+ebx+88888888h]
352prohbuf:
353	mov al, [eax+ebp]
354	sub ecx, _asm1
355	sub edx, _asm2
356	mov [edi+esi], al
357	dec esi
358	jnz prohbeg
359
360	pop ebp
361	ret
362
363
364
365ALIGN 16
366PUBLIC setupvlineasm_
367setupvlineasm_:
368		;First 2 lines for VLINEASM1, rest for VLINEASM4
369	mov byte ptr [premach3a+2], al
370	mov byte ptr [mach3a+2], al
371
372	push ecx
373	mov byte ptr [machvsh1+2], al      ;32-shy
374	mov byte ptr [machvsh3+2], al      ;32-shy
375	mov byte ptr [machvsh5+2], al      ;32-shy
376	mov byte ptr [machvsh6+2], al      ;32-shy
377	mov ah, al
378	sub ah, 16
379	mov byte ptr [machvsh8+2], ah      ;16-shy
380	neg al
381	mov byte ptr [machvsh7+2], al      ;shy
382	mov byte ptr [machvsh9+2], al      ;shy
383	mov byte ptr [machvsh10+2], al     ;shy
384	mov byte ptr [machvsh11+2], al     ;shy
385	mov byte ptr [machvsh12+2], al     ;shy
386	mov cl, al
387	mov eax, 1
388	shl eax, cl
389	dec eax
390	mov dword ptr [machvsh2+2], eax    ;(1<<shy)-1
391	mov dword ptr [machvsh4+2], eax    ;(1<<shy)-1
392	pop ecx
393	ret
394
395ALIGN 16
396PUBLIC prosetupvlineasm_
397prosetupvlineasm_:
398		;First 2 lines for VLINEASM1, rest for VLINEASM4
399	mov byte ptr [premach3a+2], al
400	mov byte ptr [mach3a+2], al
401
402	push ecx
403	mov byte ptr [promachvsh1+2], al      ;32-shy
404	mov byte ptr [promachvsh3+2], al      ;32-shy
405	mov byte ptr [promachvsh5+2], al      ;32-shy
406	mov byte ptr [promachvsh6+2], al      ;32-shy
407	mov ah, al
408	sub ah, 16
409	mov byte ptr [promachvsh8+2], ah      ;16-shy
410	neg al
411	mov byte ptr [promachvsh7+2], al      ;shy
412	mov byte ptr [promachvsh9+2], al      ;shy
413	mov byte ptr [promachvsh10+2], al     ;shy
414	mov byte ptr [promachvsh11+2], al     ;shy
415	mov byte ptr [promachvsh12+2], al     ;shy
416	mov cl, al
417	mov eax, 1
418	shl eax, cl
419	dec eax
420	mov dword ptr [promachvsh2+2], eax    ;(1<<shy)-1
421	mov dword ptr [promachvsh4+2], eax    ;(1<<shy)-1
422	pop ecx
423	ret
424
425ALIGN 16
426PUBLIC setupmvlineasm_
427setupmvlineasm_:
428	mov byte ptr [maskmach3a+2], al
429	mov byte ptr [machmv13+2], al
430	mov byte ptr [machmv14+2], al
431	mov byte ptr [machmv15+2], al
432	mov byte ptr [machmv16+2], al
433	ret
434
435ALIGN 16
436PUBLIC setuptvlineasm_
437setuptvlineasm_:
438	mov byte ptr [transmach3a+2], al
439	ret
440
441ALIGN 16
442PUBLIC prevlineasm1_
443prevlineasm1_:
444	test ecx, ecx
445	jnz vlineasm1_
446
447	add eax, edx
448premach3a: shr edx, 32
449	mov dl, byte ptr [esi+edx]
450	mov cl, byte ptr [ebx+edx]
451	mov byte ptr [edi], cl
452	ret
453
454ALIGN 16
455PUBLIC vlineasm1_
456vlineasm1_:
457	push ebp
458	mov ebp, ebx
459	inc ecx
460fixchain1a: sub edi, 320
461beginvline:
462	mov ebx, edx
463mach3a: shr ebx, 32
464fixchain1b: add edi, 320
465	mov bl, byte ptr [esi+ebx]
466	add edx, eax
467	dec ecx
468	mov bl, byte ptr [ebp+ebx]
469	mov byte ptr [edi], bl
470	jnz short beginvline
471	pop ebp
472	mov eax, edx
473	ret
474
475ALIGN 16
476PUBLIC mvlineasm1_      ;Masked vline
477mvlineasm1_:
478	push ebp
479	mov ebp, ebx
480beginmvline:
481	mov ebx, edx
482maskmach3a: shr ebx, 32
483	mov bl, byte ptr [esi+ebx]
484	cmp bl, 255
485	je short skipmask1
486maskmach3c: mov bl, [ebp+ebx]
487	mov byte ptr [edi], bl
488skipmask1:
489	add edx, eax
490fixchain1m: add edi, 320
491	sub ecx, 1
492	jnc short beginmvline
493
494	pop ebp
495	mov eax, edx
496	ret
497
498ALIGN 16
499PUBLIC fixtransluscence_
500fixtransluscence_:
501	mov dword ptr [transmach4+2], eax
502	mov dword ptr [tmach1+2], eax
503	mov dword ptr [tmach2+2], eax
504	mov dword ptr [tmach3+2], eax
505	mov dword ptr [tmach4+2], eax
506	mov dword ptr [tran2traa+2], eax
507	mov dword ptr [tran2trab+2], eax
508	mov dword ptr [tran2trac+2], eax
509	mov dword ptr [tran2trad+2], eax
510	ret
511
512ALIGN 16
513PUBLIC settransnormal_
514settransnormal_:
515	mov byte ptr [transrev0+1], 83h
516	mov byte ptr [transrev1+1], 27h
517	mov byte ptr [transrev2+1], 3fh
518	mov byte ptr [transrev3+1], 98h
519	mov byte ptr [transrev4+1], 90h
520	mov byte ptr [transrev5+1], 37h
521	mov byte ptr [transrev6+1], 90h
522	mov word ptr [transrev7+0], 0f38ah
523	mov byte ptr [transrev8+1], 90h
524	mov word ptr [transrev9+0], 0f78ah
525	mov byte ptr [transrev10+1], 0a7h
526	mov byte ptr [transrev11+1], 81h
527	mov byte ptr [transrev12+2], 9fh
528	mov word ptr [transrev13+0], 0dc88h
529	mov byte ptr [transrev14+1], 81h
530	mov byte ptr [transrev15+1], 9ah
531	mov byte ptr [transrev16+1], 0a7h
532	mov byte ptr [transrev17+1], 82h
533	ret
534
535ALIGN 16
536PUBLIC settransreverse_
537settransreverse_:
538	mov byte ptr [transrev0+1], 0a3h
539	mov byte ptr [transrev1+1], 7h
540	mov byte ptr [transrev2+1], 1fh
541	mov byte ptr [transrev3+1], 0b8h
542	mov byte ptr [transrev4+1], 0b0h
543	mov byte ptr [transrev5+1], 17h
544	mov byte ptr [transrev6+1], 0b0h
545	mov word ptr [transrev7+0], 0d38ah
546	mov byte ptr [transrev8+1], 0b0h
547	mov word ptr [transrev9+0], 0d78ah
548	mov byte ptr [transrev10+1], 87h
549	mov byte ptr [transrev11+1], 0a1h
550	mov byte ptr [transrev12+2], 87h
551	mov word ptr [transrev13+0], 0e388h
552	mov byte ptr [transrev14+1], 0a1h
553	mov byte ptr [transrev15+1], 0bah
554	mov byte ptr [transrev16+1], 87h
555	mov byte ptr [transrev17+1], 0a2h
556	ret
557
558ALIGN 16
559PUBLIC tvlineasm1_        ;Masked & transluscent vline
560tvlineasm1_:
561	push ebp
562	mov ebp, eax
563	xor eax, eax
564	inc ecx
565	mov dword ptr [transmach3c+2], ebx
566	jmp short begintvline
567ALIGN 16
568begintvline:
569	mov ebx, edx
570transmach3a: shr ebx, 32
571	mov bl, byte ptr [esi+ebx]
572	cmp bl, 255
573	je short skiptrans1
574transrev0:
575transmach3c: mov al, [ebx+88888888h]
576transrev1:
577	mov ah, byte ptr [edi]
578transmach4: mov al, byte ptr [eax+88888888h]   ;_transluc[eax]
579	mov byte ptr [edi], al
580skiptrans1:
581	add edx, ebp
582fixchain1t: add edi, 320
583	dec ecx
584	jnz short begintvline
585
586	pop ebp
587	mov eax, edx
588	ret
589
590	;eax: -------temp1-------
591	;ebx: -------temp2-------
592	;ecx:  dat  dat  dat  dat
593	;edx: ylo2           ylo4
594	;esi: yhi1           yhi2
595	;edi: ---videoplc/cnt----
596	;ebp: yhi3           yhi4
597	;esp:
598ALIGN 16
599PUBLIC vlineasm4_
600vlineasm4_:
601	push ebp
602
603	mov eax, dword ptr _ylookup[ecx*4]
604	add eax, edi
605	mov dword ptr [machvline4end+2], eax
606	sub edi, eax
607
608	mov eax, dword ptr _bufplce[0]
609	mov ebx, dword ptr _bufplce[4]
610	mov ecx, dword ptr _bufplce[8]
611	mov edx, dword ptr _bufplce[12]
612	mov dword ptr [machvbuf1+2], ecx
613	mov dword ptr [machvbuf2+2], edx
614	mov dword ptr [machvbuf3+2], eax
615	mov dword ptr [machvbuf4+2], ebx
616
617	mov eax, dword ptr _palookupoffse[0]
618	mov ebx, dword ptr _palookupoffse[4]
619	mov ecx, dword ptr _palookupoffse[8]
620	mov edx, dword ptr _palookupoffse[12]
621	mov dword ptr [machvpal1+2], ecx
622	mov dword ptr [machvpal2+2], edx
623	mov dword ptr [machvpal3+2], eax
624	mov dword ptr [machvpal4+2], ebx
625
626		;     �������������������������������Ŀ
627		;edx: �v3lo           �v1lo           �
628		;     �������������������������������Ĵ
629		;esi: �v2hi  v2lo             �   v3hi�
630		;     �������������������������������Ĵ
631		;ebp: �v0hi  v0lo             �   v1hi�
632		;     ���������������������������������
633
634	mov ebp, dword ptr _vince[0]
635	mov ebx, dword ptr _vince[4]
636	mov esi, dword ptr _vince[8]
637	mov eax, dword ptr _vince[12]
638	and esi, 0fffffe00h
639	and ebp, 0fffffe00h
640machvsh9: rol eax, 88h                 ;sh
641machvsh10: rol ebx, 88h                ;sh
642	mov edx, eax
643	mov ecx, ebx
644	shr ecx, 16
645	and edx, 0ffff0000h
646	add edx, ecx
647	and eax, 000001ffh
648	and ebx, 000001ffh
649	add esi, eax
650	add ebp, ebx
651	;
652	mov eax, edx
653	and eax, 0ffff0000h
654	mov dword ptr [machvinc1+2], eax
655	mov dword ptr [machvinc2+2], esi
656	mov byte ptr [machvinc3+2], dl
657	mov byte ptr [machvinc4+2], dh
658	mov dword ptr [machvinc5+2], ebp
659
660	mov ebp, dword ptr _vplce[0]
661	mov ebx, dword ptr _vplce[4]
662	mov esi, dword ptr _vplce[8]
663	mov eax, dword ptr _vplce[12]
664	and esi, 0fffffe00h
665	and ebp, 0fffffe00h
666machvsh11: rol eax, 88h                ;sh
667machvsh12: rol ebx, 88h                ;sh
668	mov edx, eax
669	mov ecx, ebx
670	shr ecx, 16
671	and edx, 0ffff0000h
672	add edx, ecx
673	and eax, 000001ffh
674	and ebx, 000001ffh
675	add esi, eax
676	add ebp, ebx
677
678	mov ecx, esi
679	jmp short beginvlineasm4
680ALIGN 16
681	nop
682	nop
683	nop
684beginvlineasm4:
685machvsh1: shr ecx, 88h          ;32-sh
686	mov ebx, esi
687machvsh2: and ebx, 00000088h    ;(1<<sh)-1
688machvinc1: add edx, 88880000h
689machvinc2: adc esi, 88888088h
690machvbuf1: mov cl, byte ptr [ecx+88888888h]
691machvbuf2: mov bl, byte ptr [ebx+88888888h]
692	mov eax, ebp
693machvsh3: shr eax, 88h          ;32-sh
694machvpal1: mov cl, byte ptr [ecx+88888888h]
695machvpal2: mov ch, byte ptr [ebx+88888888h]
696	mov ebx, ebp
697	shl ecx, 16
698machvsh4: and ebx, 00000088h    ;(1<<sh)-1
699machvinc3: add dl, 88h
700machvbuf3: mov al, byte ptr [eax+88888888h]
701machvinc4: adc dh, 88h
702machvbuf4: mov bl, byte ptr [ebx+88888888h]
703machvinc5: adc ebp, 88888088h
704machvpal3: mov cl, byte ptr [eax+88888888h]
705machvpal4: mov ch, byte ptr [ebx+88888888h]
706machvline4end: mov dword ptr [edi+88888888h], ecx
707fixchain2a: add edi, 88888888h
708	mov ecx, esi
709	jnc short beginvlineasm4
710
711		;     �������������������������������Ŀ
712		;edx: �v3lo           �v1lo           �
713		;     �������������������������������Ĵ
714		;esi: �v2hi  v2lo             �   v3hi�
715		;     �������������������������������Ĵ
716		;ebp: �v0hi  v0lo             �   v1hi�
717		;     ���������������������������������
718
719	mov dword ptr _vplce[8], esi
720	mov dword ptr _vplce[0], ebp
721		;vplc2 = (esi<<(32-sh))+(edx>>sh)
722		;vplc3 = (ebp<<(32-sh))+((edx&65535)<<(16-sh))
723machvsh5: shl esi, 88h     ;32-sh
724	mov eax, edx
725machvsh6: shl ebp, 88h     ;32-sh
726	and edx, 0000ffffh
727machvsh7: shr eax, 88h     ;sh
728	add esi, eax
729machvsh8: shl edx, 88h     ;16-sh
730	add ebp, edx
731	mov dword ptr _vplce[12], esi
732	mov dword ptr _vplce[4], ebp
733
734	pop ebp
735	ret
736
737	;eax: -------temp1-------
738	;ebx: -------temp2-------
739	;ecx: ylo4      ---------
740	;edx: ylo2      ---------
741	;esi: yhi1           yhi2
742	;edi: ---videoplc/cnt----
743	;ebp: yhi3           yhi4
744	;esp:
745ALIGN 16
746PUBLIC provlineasm4_
747provlineasm4_:
748	push ebp
749
750	mov eax, dword ptr _ylookup[ecx*4]
751	add eax, edi
752	mov dword ptr [promachvline4end1+2], eax
753	inc eax
754	mov dword ptr [promachvline4end2+2], eax
755	inc eax
756	mov dword ptr [promachvline4end3+2], eax
757	inc eax
758	mov dword ptr [promachvline4end4+2], eax
759	sub eax, 3
760	sub edi, eax
761
762	mov eax, dword ptr _bufplce[0]
763	mov ebx, dword ptr _bufplce[4]
764	mov ecx, dword ptr _bufplce[8]
765	mov edx, dword ptr _bufplce[12]
766	mov dword ptr [promachvbuf1+3], ecx
767	mov dword ptr [promachvbuf2+3], edx
768	mov dword ptr [promachvbuf3+3], eax
769	mov dword ptr [promachvbuf4+3], ebx
770
771	mov eax, dword ptr _palookupoffse[0]
772	mov ebx, dword ptr _palookupoffse[4]
773	mov ecx, dword ptr _palookupoffse[8]
774	mov edx, dword ptr _palookupoffse[12]
775	mov dword ptr [promachvpal1+2], ecx
776	mov dword ptr [promachvpal2+2], edx
777	mov dword ptr [promachvpal3+2], eax
778	mov dword ptr [promachvpal4+2], ebx
779
780		;     �������������������������������Ŀ
781		;edx: �v3lo           �v1lo           �
782		;     �������������������������������Ĵ
783		;esi: �v2hi  v2lo             �   v3hi�
784		;     �������������������������������Ĵ
785		;ebp: �v0hi  v0lo             �   v1hi�
786		;     ���������������������������������
787
788	mov ebp, dword ptr _vince[0]
789	mov ebx, dword ptr _vince[4]
790	mov esi, dword ptr _vince[8]
791	mov eax, dword ptr _vince[12]
792	and esi, 0fffffe00h
793	and ebp, 0fffffe00h
794promachvsh9: rol eax, 88h                 ;sh
795promachvsh10: rol ebx, 88h                ;sh
796	mov edx, eax
797	mov ecx, ebx
798	shr ecx, 16
799	and edx, 0ffff0000h
800	add edx, ecx
801	and eax, 000001ffh
802	and ebx, 000001ffh
803	add esi, eax
804	add ebp, ebx
805	;
806	mov eax, edx
807	and eax, 0ffff0000h
808	mov dword ptr [promachvinc1+2], eax
809	mov dword ptr [promachvinc2+2], esi
810	shl edx, 16
811	mov dword ptr [promachvinc3+2], edx
812	mov dword ptr [promachvinc5+2], ebp
813
814	mov ebp, dword ptr _vplce[0]
815	mov ebx, dword ptr _vplce[4]
816	mov esi, dword ptr _vplce[8]
817	mov eax, dword ptr _vplce[12]
818	and esi, 0fffffe00h
819	and ebp, 0fffffe00h
820promachvsh11: rol eax, 88h                ;sh
821promachvsh12: rol ebx, 88h                ;sh
822	mov edx, eax
823	mov ecx, ebx
824	shr ecx, 16
825	and edx, 0ffff0000h
826	add edx, ecx
827	and eax, 000001ffh
828	and ebx, 000001ffh
829	add esi, eax
830	add ebp, ebx
831
832	mov eax, esi
833	mov ecx, edx
834	shl ecx, 16
835	jmp short probeginvlineasm4
836ALIGN 16
837	nop
838	nop
839	nop
840probeginvlineasm4:
841promachvsh1: shr eax, 88h          ;32-sh
842	mov ebx, esi
843promachvsh2: and ebx, 00000088h    ;(1<<sh)-1
844promachvinc1: add edx, 88880000h
845promachvinc2: adc esi, 88888088h
846promachvbuf1: movzx eax, byte ptr [eax+88888888h]
847promachvbuf2: movzx ebx, byte ptr [ebx+88888888h]
848promachvpal1: mov al, byte ptr [eax+88888888h]
849promachvline4end3: mov byte ptr [edi+88888888h], al
850	mov eax, ebp
851promachvsh3: shr eax, 88h          ;32-sh
852promachvpal2: mov bl, byte ptr [ebx+88888888h]
853promachvline4end4: mov byte ptr [edi+88888888h], bl
854	mov ebx, ebp
855promachvsh4: and ebx, 00000088h    ;(1<<sh)-1
856promachvbuf3: movzx eax, byte ptr [eax+88888888h]
857promachvinc3: add ecx, 88888888h
858promachvbuf4: movzx ebx, byte ptr [ebx+88888888h]
859promachvinc5: adc ebp, 88888088h
860promachvpal3: mov al, byte ptr [eax+88888888h]
861promachvline4end1: mov byte ptr [edi+88888888h], al
862promachvpal4: mov bl, byte ptr [ebx+88888888h]
863promachvline4end2: mov byte ptr [edi+88888888h], bl
864profixchain2a: add edi, 88888888h
865	mov eax, esi
866	jnc short probeginvlineasm4
867
868		;     �������������������������������Ŀ
869		;edx: �v3lo           �v1lo           �
870		;     �������������������������������Ĵ
871		;esi: �v2hi  v2lo             �   v3hi�
872		;     �������������������������������Ĵ
873		;ebp: �v0hi  v0lo             �   v1hi�
874		;     ���������������������������������
875
876	mov dword ptr _vplce[8], esi
877	mov dword ptr _vplce[0], ebp
878		;vplc2 = (esi<<(32-sh))+(edx>>sh)
879		;vplc3 = (ebp<<(32-sh))+((edx&65535)<<(16-sh))
880promachvsh5: shl esi, 88h     ;32-sh
881	mov eax, edx
882promachvsh6: shl ebp, 88h     ;32-sh
883	and edx, 0000ffffh
884promachvsh7: shr eax, 88h     ;sh
885	add esi, eax
886promachvsh8: shl edx, 88h     ;16-sh
887	add ebp, edx
888	mov dword ptr _vplce[12], esi
889	mov dword ptr _vplce[4], ebp
890
891	pop ebp
892	ret
893
894
895ALIGN 16
896PUBLIC mvlineasm4_
897mvlineasm4_:
898	push ebp
899
900	mov eax, dword ptr _bufplce[0]
901	mov ebx, dword ptr _bufplce[4]
902	mov dword ptr [machmv1+2], eax
903	mov dword ptr [machmv4+2], ebx
904	mov eax, dword ptr _bufplce[8]
905	mov ebx, dword ptr _bufplce[12]
906	mov dword ptr [machmv7+2], eax
907	mov dword ptr [machmv10+2], ebx
908
909	mov eax, dword ptr _palookupoffse[0]
910	mov ebx, dword ptr _palookupoffse[4]
911	mov dword ptr [machmv2+2], eax
912	mov dword ptr [machmv5+2], ebx
913	mov eax, dword ptr _palookupoffse[8]
914	mov ebx, dword ptr _palookupoffse[12]
915	mov dword ptr [machmv8+2], eax
916	mov dword ptr [machmv11+2], ebx
917
918	mov eax, dword ptr _vince[0]        ;vince
919	mov ebx, dword ptr _vince[4]
920	xor al, al
921	xor bl, bl
922	mov dword ptr [machmv3+2], eax
923	mov dword ptr [machmv6+2], ebx
924	mov eax, dword ptr _vince[8]
925	mov ebx, dword ptr _vince[12]
926	mov dword ptr [machmv9+2], eax
927	mov dword ptr [machmv12+2], ebx
928
929	mov ebx, ecx
930	mov ecx, dword ptr _vplce[0]
931	mov edx, dword ptr _vplce[4]
932	mov esi, dword ptr _vplce[8]
933	mov ebp, dword ptr _vplce[12]
934	mov cl, bl
935	inc cl
936	inc bh
937	mov byte ptr _asm3[0], bh
938fixchain2ma: sub edi, 320
939
940	jmp short beginmvlineasm4
941ALIGN 16
942beginmvlineasm4:
943	dec cl
944	jz endmvlineasm4
945beginmvlineasm42:
946	mov eax, ebp
947	mov ebx, esi
948machmv16: shr eax, 32
949machmv15: shr ebx, 32
950machmv12: add ebp, 88888888h ;vince[3]
951machmv9: add esi, 88888888h ;vince[2]
952machmv10: mov al, byte ptr [eax+88888888h] ;bufplce[3]
953machmv7: mov bl, byte ptr [ebx+88888888h] ;bufplce[2]
954	cmp al, 255
955	adc dl, dl
956	cmp bl, 255
957	adc dl, dl
958machmv8: mov bl, byte ptr [ebx+88888888h] ;palookupoffs[2]
959machmv11: mov bh, byte ptr [eax+88888888h] ;palookupoffs[3]
960
961	mov eax, edx
962machmv14: shr eax, 32
963	shl ebx, 16
964machmv4: mov al, byte ptr [eax+88888888h] ;bufplce[1]
965	cmp al, 255
966	adc dl, dl
967machmv6: add edx, 88888888h ;vince[1]
968machmv5: mov bh, byte ptr [eax+88888888h] ;palookupoffs[1]
969
970	mov eax, ecx
971machmv13: shr eax, 32
972machmv3: add ecx, 88888888h ;vince[0]
973machmv1: mov al, byte ptr [eax+88888888h] ;bufplce[0]
974	cmp al, 255
975	adc dl, dl
976machmv2: mov bl, byte ptr [eax+88888888h] ;palookupoffs[0]
977
978	shl dl, 4
979	xor eax, eax
980fixchain2mb: add edi, 320
981	mov al, dl
982	add eax, offset mvcase0
983	jmp eax       ;16 byte cases
984
985ALIGN 16
986endmvlineasm4:
987	dec byte ptr _asm3[0]
988	jnz beginmvlineasm42
989
990	mov dword ptr _vplce[0], ecx
991	mov dword ptr _vplce[4], edx
992	mov dword ptr _vplce[8], esi
993	mov dword ptr _vplce[12], ebp
994	pop ebp
995	ret
996
997	;5,7,8,8,11,13,12,14,11,13,14,14,12,14,15,7
998ALIGN 16
999mvcase0:
1000	jmp beginmvlineasm4
1001ALIGN 16
1002mvcase1:
1003	mov byte ptr [edi], bl
1004	jmp beginmvlineasm4
1005ALIGN 16
1006mvcase2:
1007	mov byte ptr [edi+1], bh
1008	jmp beginmvlineasm4
1009ALIGN 16
1010mvcase3:
1011	mov word ptr [edi], bx
1012	jmp beginmvlineasm4
1013ALIGN 16
1014mvcase4:
1015	shr ebx, 16
1016	mov byte ptr [edi+2], bl
1017	jmp beginmvlineasm4
1018ALIGN 16
1019mvcase5:
1020	mov byte ptr [edi], bl
1021	shr ebx, 16
1022	mov byte ptr [edi+2], bl
1023	jmp beginmvlineasm4
1024ALIGN 16
1025	mvcase6:
1026	shr ebx, 8
1027	mov word ptr [edi+1], bx
1028	jmp beginmvlineasm4
1029ALIGN 16
1030mvcase7:
1031	mov word ptr [edi], bx
1032	shr ebx, 16
1033	mov byte ptr [edi+2], bl
1034	jmp beginmvlineasm4
1035ALIGN 16
1036mvcase8:
1037	shr ebx, 16
1038	mov byte ptr [edi+3], bh
1039	jmp beginmvlineasm4
1040ALIGN 16
1041mvcase9:
1042	mov byte ptr [edi], bl
1043	shr ebx, 16
1044	mov byte ptr [edi+3], bh
1045	jmp beginmvlineasm4
1046ALIGN 16
1047mvcase10:
1048	mov byte ptr [edi+1], bh
1049	shr ebx, 16
1050	mov byte ptr [edi+3], bh
1051	jmp beginmvlineasm4
1052ALIGN 16
1053mvcase11:
1054	mov word ptr [edi], bx
1055	shr ebx, 16
1056	mov byte ptr [edi+3], bh
1057	jmp beginmvlineasm4
1058ALIGN 16
1059mvcase12:
1060	shr ebx, 16
1061	mov word ptr [edi+2], bx
1062	jmp beginmvlineasm4
1063ALIGN 16
1064mvcase13:
1065	mov byte ptr [edi], bl
1066	shr ebx, 16
1067	mov word ptr [edi+2], bx
1068	jmp beginmvlineasm4
1069ALIGN 16
1070mvcase14:
1071	mov byte ptr [edi+1], bh
1072	shr ebx, 16
1073	mov word ptr [edi+2], bx
1074	jmp beginmvlineasm4
1075ALIGN 16
1076mvcase15:
1077	mov dword ptr [edi], ebx
1078	jmp beginmvlineasm4
1079
1080ALIGN 16
1081PUBLIC setupspritevline_
1082setupspritevline_:
1083	mov dword ptr [spal+2], eax
1084
1085	mov eax, esi                      ;xinc's
1086	shl eax, 16
1087	mov dword ptr [smach1+2], eax
1088	mov dword ptr [smach4+2], eax
1089	mov eax, esi
1090	sar eax, 16
1091	add eax, ebx                      ;watch out with ebx - it's passed
1092	mov dword ptr [smach2+2], eax
1093	add eax, edx
1094	mov dword ptr [smach5+2], eax
1095
1096	mov dword ptr [smach3+2], ecx  ;yinc's
1097	ret
1098
1099ALIGN 16
1100PUBLIC spritevline_
1101	;eax = 0, ebx = x, ecx = cnt, edx = y, esi = yplc, edi = p
1102prestartsvline:
1103smach1: add ebx, 88888888h              ;xincshl16
1104	mov al, byte ptr [esi]
1105smach2: adc esi, 88888888h              ;xincshr16+yalwaysinc
1106
1107startsvline:
1108spal: mov al, [eax+88888888h]           ;palookup
1109	mov byte ptr [edi], al
1110fixchain1s: add edi, 320
1111
1112spritevline_:
1113smach3: add edx, 88888888h              ;dayinc
1114	dec ecx
1115	ja short prestartsvline     ;jump if (no carry (add)) and (not zero (dec))!
1116	jz short endsvline
1117smach4: add ebx, 88888888h              ;xincshl16
1118	mov al, byte ptr [esi]
1119smach5: adc esi, 88888888h              ;xincshr16+yalwaysinc+daydime
1120	jmp short startsvline
1121endsvline:
1122	ret
1123
1124ALIGN 16
1125PUBLIC msetupspritevline_
1126msetupspritevline_:
1127	mov dword ptr [mspal+2], eax
1128
1129	mov eax, esi                      ;xinc's
1130	shl eax, 16
1131	mov dword ptr [msmach1+2], eax
1132	mov dword ptr [msmach4+2], eax
1133	mov eax, esi
1134	sar eax, 16
1135	add eax, ebx                      ;watch out with ebx - it's passed
1136	mov dword ptr [msmach2+2], eax
1137	add eax, edx
1138	mov dword ptr [msmach5+2], eax
1139
1140	mov dword ptr [msmach3+2], ecx  ;yinc's
1141	ret
1142
1143ALIGN 16
1144PUBLIC mspritevline_
1145	;eax = 0, ebx = x, ecx = cnt, edx = y, esi = yplc, edi = p
1146mprestartsvline:
1147msmach1: add ebx, 88888888h              ;xincshl16
1148	mov al, byte ptr [esi]
1149msmach2: adc esi, 88888888h              ;xincshr16+yalwaysinc
1150
1151mstartsvline:
1152	cmp al, 255
1153	je short mskipsvline
1154mspal: mov al, [eax+88888888h]           ;palookup
1155	mov byte ptr [edi], al
1156mskipsvline:
1157mfixchain1s: add edi, 320
1158
1159mspritevline_:
1160msmach3: add edx, 88888888h              ;dayinc
1161	dec ecx
1162	ja short mprestartsvline     ;jump if (no carry (add)) and (not zero (dec))!
1163	jz short mendsvline
1164msmach4: add ebx, 88888888h              ;xincshl16
1165	mov al, byte ptr [esi]
1166msmach5: adc esi, 88888888h              ;xincshr16+yalwaysinc+daydime
1167	jmp short mstartsvline
1168mendsvline:
1169	ret
1170
1171ALIGN 16
1172PUBLIC tsetupspritevline_
1173tsetupspritevline_:
1174	mov dword ptr [tspal+2], eax
1175
1176	mov eax, esi                      ;xinc's
1177	shl eax, 16
1178	mov dword ptr [tsmach1+2], eax
1179	mov dword ptr [tsmach4+2], eax
1180	mov eax, esi
1181	sar eax, 16
1182	add eax, ebx                      ;watch out with ebx - it's passed
1183	mov dword ptr [tsmach2+2], eax
1184	add eax, edx
1185	mov dword ptr [tsmach5+2], eax
1186
1187	mov dword ptr [tsmach3+2], ecx  ;yinc's
1188	ret
1189
1190ALIGN 16
1191PUBLIC tspritevline_
1192tspritevline_:
1193	;eax = 0, ebx = x, ecx = cnt, edx = y, esi = yplc, edi = p
1194	push ebp
1195	mov ebp, ebx
1196	xor ebx, ebx
1197	jmp tenterspritevline
1198ALIGN 16
1199tprestartsvline:
1200tsmach1: add ebp, 88888888h              ;xincshl16
1201	mov al, byte ptr [esi]
1202tsmach2: adc esi, 88888888h              ;xincshr16+yalwaysinc
1203
1204tstartsvline:
1205	cmp al, 255
1206	je short tskipsvline
1207transrev2:
1208	mov bh, byte ptr [edi]
1209transrev3:
1210tspal: mov bl, [eax+88888888h]               ;palookup
1211tmach4: mov al, byte ptr [ebx+88888888h]     ;_transluc
1212	mov byte ptr [edi], al
1213tskipsvline:
1214tfixchain1s: add edi, 320
1215
1216tenterspritevline:
1217tsmach3: add edx, 88888888h              ;dayinc
1218	dec ecx
1219	ja short tprestartsvline     ;jump if (no carry (add)) and (not zero (dec))!
1220	jz short tendsvline
1221tsmach4: add ebp, 88888888h              ;xincshl16
1222	mov al, byte ptr [esi]
1223tsmach5: adc esi, 88888888h              ;xincshr16+yalwaysinc+daydime
1224	jmp short tstartsvline
1225tendsvline:
1226	pop ebp
1227	ret
1228
1229ALIGN 16
1230PUBLIC msethlineshift_
1231msethlineshift_:
1232	neg al
1233	mov byte ptr [msh1d+2], al
1234	mov byte ptr [msh2d+3], bl
1235	mov byte ptr [msh3d+2], al
1236	mov byte ptr [msh4d+3], bl
1237	mov byte ptr [msh5d+2], al
1238	mov byte ptr [msh6d+3], bl
1239	ret
1240
1241ALIGN 16
1242PUBLIC mhline_
1243mhline_:
1244	;_asm1 = bxinc
1245	;_asm2 = byinc
1246	;_asm3 = shadeoffs
1247	;eax = picoffs
1248	;ebx = bx
1249	;ecx = cnt
1250	;edx = ?
1251	;esi = by
1252	;edi = p
1253
1254	mov dword ptr [mmach1d+2], eax
1255	mov dword ptr [mmach5d+2], eax
1256	mov dword ptr [mmach9d+2], eax
1257	mov eax, _asm3
1258	mov dword ptr [mmach2d+2], eax
1259	mov dword ptr [mmach2da+2], eax
1260	mov dword ptr [mmach2db+2], eax
1261	mov dword ptr [mmach6d+2], eax
1262	mov dword ptr [mmach10d+2], eax
1263	mov eax, _asm1
1264	mov dword ptr [mmach3d+2], eax
1265	mov dword ptr [mmach7d+2], eax
1266	mov eax, _asm2
1267	mov dword ptr [mmach4d+2], eax
1268	mov dword ptr [mmach8d+2], eax
1269	jmp short mhlineskipmodify_
1270
1271ALIGN 16
1272PUBLIC mhlineskipmodify_
1273mhlineskipmodify_:
1274
1275	push ebp
1276
1277	xor eax, eax
1278	mov ebp, ebx
1279
1280	test ecx, 00010000h
1281	jnz short mbeghline
1282
1283msh1d: shr ebx, 26
1284msh2d: shld ebx, esi, 6
1285	add ebp, _asm1
1286mmach9d: mov al, byte ptr [ebx+88888888h]    ;picoffs
1287	add esi, _asm2
1288	cmp al, 255
1289	je mskip5
1290
1291	mmach10d: mov cl, byte ptr [eax+88888888h]    ;shadeoffs
1292	mov byte ptr [edi], cl
1293mskip5:
1294	inc edi
1295	sub ecx, 65536
1296	jc mendhline
1297	jmp short mbeghline
1298
1299ALIGN 16
1300mpreprebeghline:                                            ;1st only
1301	mov al, cl
1302mmach2d: mov al, byte ptr [eax+88888888h]    ;shadeoffs
1303	mov byte ptr [edi], al
1304
1305mprebeghline:
1306	add edi, 2
1307	sub ecx, 131072
1308	jc short mendhline
1309mbeghline:
1310mmach3d: lea ebx, [ebp+88888888h]            ;bxinc
1311msh3d: shr ebp, 26
1312msh4d: shld ebp, esi, 6
1313mmach4d: add esi, 88888888h                  ;byinc
1314mmach1d: mov cl, byte ptr [ebp+88888888h]    ;picoffs
1315mmach7d: lea ebp, [ebx+88888888h]            ;bxinc
1316
1317msh5d: shr ebx, 26
1318msh6d: shld ebx, esi, 6
1319mmach8d: add esi, 88888888h                  ;byinc
1320mmach5d: mov ch, byte ptr [ebx+88888888h]    ;picoffs
1321
1322	cmp cl, 255
1323	je short mskip1
1324	cmp ch, 255
1325	je short mpreprebeghline
1326
1327	mov al, cl                                                  ;BOTH
1328mmach2da: mov bl, byte ptr [eax+88888888h]    ;shadeoffs
1329	mov al, ch
1330mmach2db: mov bh, byte ptr [eax+88888888h]    ;shadeoffs
1331	mov word ptr [edi], bx
1332	add edi, 2
1333	sub ecx, 131072
1334	jnc short mbeghline
1335	jmp mendhline
1336mskip1:                                                     ;2nd only
1337	cmp ch, 255
1338	je short mprebeghline
1339
1340	mov al, ch
1341mmach6d: mov al, byte ptr [eax+88888888h]    ;shadeoffs
1342	mov byte ptr [edi+1], al
1343	add edi, 2
1344	sub ecx, 131072
1345	jnc short mbeghline
1346mendhline:
1347
1348	pop ebp
1349	ret
1350
1351ALIGN 16
1352PUBLIC tsethlineshift_
1353tsethlineshift_:
1354	neg al
1355	mov byte ptr [tsh1d+2], al
1356	mov byte ptr [tsh2d+3], bl
1357	mov byte ptr [tsh3d+2], al
1358	mov byte ptr [tsh4d+3], bl
1359	mov byte ptr [tsh5d+2], al
1360	mov byte ptr [tsh6d+3], bl
1361	ret
1362
1363ALIGN 16
1364PUBLIC thline_
1365thline_:
1366	;_asm1 = bxinc
1367	;_asm2 = byinc
1368	;_asm3 = shadeoffs
1369	;eax = picoffs
1370	;ebx = bx
1371	;ecx = cnt
1372	;edx = ?
1373	;esi = by
1374	;edi = p
1375
1376	mov dword ptr [tmach1d+2], eax
1377	mov dword ptr [tmach5d+2], eax
1378	mov dword ptr [tmach9d+2], eax
1379	mov eax, _asm3
1380	mov dword ptr [tmach2d+2], eax
1381	mov dword ptr [tmach6d+2], eax
1382	mov dword ptr [tmach10d+2], eax
1383	mov eax, _asm1
1384	mov dword ptr [tmach3d+2], eax
1385	mov dword ptr [tmach7d+2], eax
1386	mov eax, _asm2
1387	mov dword ptr [tmach4d+2], eax
1388	mov dword ptr [tmach8d+2], eax
1389	jmp thlineskipmodify_
1390
1391ALIGN 16
1392PUBLIC thlineskipmodify_
1393thlineskipmodify_:
1394
1395	push ebp
1396
1397	xor eax, eax
1398	xor edx, edx
1399	mov ebp, ebx
1400
1401	test ecx, 00010000h
1402	jnz short tbeghline
1403
1404tsh1d: shr ebx, 26
1405tsh2d: shld ebx, esi, 6
1406	add ebp, _asm1
1407tmach9d: mov al, byte ptr [ebx+88888888h]    ;picoffs
1408	add esi, _asm2
1409	cmp al, 255
1410	je tskip5
1411
1412transrev4:
1413tmach10d: mov dl, byte ptr [eax+88888888h]   ;shadeoffs
1414transrev5:
1415	mov dh, byte ptr [edi]
1416tmach1: mov al, byte ptr [edx+88888888h]     ;_transluc
1417	mov byte ptr [edi], al
1418tskip5:
1419	inc edi
1420	sub ecx, 65536
1421	jc tendhline
1422	jmp short tbeghline
1423
1424ALIGN 16
1425tprebeghline:
1426	add edi, 2
1427	sub ecx, 131072
1428	jc short tendhline
1429tbeghline:
1430tmach3d: lea ebx, [ebp+88888888h]            ;bxinc
1431tsh3d: shr ebp, 26
1432tsh4d: shld ebp, esi, 6
1433tmach4d: add esi, 88888888h                  ;byinc
1434tmach1d: mov cl, byte ptr [ebp+88888888h]    ;picoffs
1435tmach7d: lea ebp, [ebx+88888888h]            ;bxinc
1436
1437tsh5d: shr ebx, 26
1438tsh6d: shld ebx, esi, 6
1439tmach8d: add esi, 88888888h                  ;byinc
1440tmach5d: mov ch, byte ptr [ebx+88888888h]    ;picoffs
1441
1442	cmp cx, 0ffffh
1443	je short tprebeghline
1444
1445	mov bx, word ptr [edi]
1446
1447	cmp cl, 255
1448	je short tskip1
1449	mov al, cl
1450transrev6:
1451tmach2d: mov dl, byte ptr [eax+88888888h]    ;shadeoffs
1452transrev7:
1453	mov dh, bl
1454tmach2: mov al, byte ptr [edx+88888888h]     ;_transluc
1455	mov byte ptr [edi], al
1456
1457	cmp ch, 255
1458	je short tskip2
1459tskip1:
1460	mov al, ch
1461transrev8:
1462tmach6d: mov dl, byte ptr [eax+88888888h]    ;shadeoffs
1463transrev9:
1464	mov dh, bh
1465tmach3: mov al, byte ptr [edx+88888888h]     ;_transluc
1466	mov byte ptr [edi+1], al
1467tskip2:
1468
1469	add edi, 2
1470	sub ecx, 131072
1471	jnc tbeghline
1472tendhline:
1473
1474	pop ebp
1475	ret
1476
1477
1478	;eax=shiftval, ebx=palookup1, ecx=palookup2
1479ALIGN 16
1480PUBLIC setuptvlineasm2_
1481setuptvlineasm2_:
1482	mov byte ptr [tran2shra+2], al
1483	mov byte ptr [tran2shrb+2], al
1484	mov dword ptr [tran2pala+2], ebx
1485	mov dword ptr [tran2palb+2], ecx
1486	mov dword ptr [tran2palc+2], ebx
1487	mov dword ptr [tran2pald+2], ecx
1488	ret
1489
1490	;Pass:   eax=vplc2, ebx=vinc1, ecx=bufplc1, edx=bufplc2, esi=vplc1, edi=p
1491	;        _asm1=vinc2, _asm2=pend
1492	;Return: _asm1=vplc1, _asm2=vplc2
1493ALIGN 16
1494PUBLIC tvlineasm2_
1495tvlineasm2_:
1496	push ebp
1497
1498	mov ebp, eax
1499
1500	mov dword ptr [tran2inca+2], ebx
1501	mov eax, _asm1
1502	mov dword ptr [tran2incb+2], eax
1503
1504	mov dword ptr [tran2bufa+2], ecx         ;bufplc1
1505	mov dword ptr [tran2bufb+2], edx         ;bufplc2
1506
1507	mov eax, _asm2
1508	sub edi, eax
1509	mov dword ptr [tran2edia+3], eax
1510	mov dword ptr [tran2edic+2], eax
1511	inc eax
1512	mov dword ptr [tran2edie+2], eax
1513fixchaint2a: sub eax, 320
1514	mov dword ptr [tran2edif+2], eax
1515	dec eax
1516	mov dword ptr [tran2edib+3], eax
1517	mov dword ptr [tran2edid+2], eax
1518
1519	xor ecx, ecx
1520	xor edx, edx
1521	jmp short begintvline2
1522
1523		;eax 0000000000  temp  temp
1524		;ebx 0000000000 odat2 odat1
1525		;ecx 0000000000000000 ndat1
1526		;edx 0000000000000000 ndat2
1527		;esi          vplc1
1528		;edi videoplc--------------
1529		;ebp          vplc2
1530
1531ALIGN 16
1532		;LEFT ONLY
1533skipdraw2:
1534transrev10:
1535tran2edic: mov ah, byte ptr [edi+88888888h]      ;getpixel
1536transrev11:
1537tran2palc: mov al, byte ptr [ecx+88888888h]      ;palookup1
1538fixchaint2d: add edi, 320
1539tran2trac: mov bl, byte ptr [eax+88888888h]      ;_transluc
1540tran2edid: mov byte ptr [edi+88888888h-320], bl  ;drawpixel
1541	jnc short begintvline2
1542	jmp endtvline2
1543
1544skipdraw1:
1545	cmp dl, 255
1546	jne short skipdraw3
1547fixchaint2b: add edi, 320
1548	jc short endtvline2
1549
1550begintvline2:
1551	mov eax, esi
1552tran2shra: shr eax, 88h                      ;globalshift
1553	mov ebx, ebp
1554tran2shrb: shr ebx, 88h                      ;globalshift
1555tran2inca: add esi, 88888888h                ;vinc1
1556tran2incb: add ebp, 88888888h                ;vinc2
1557tran2bufa: mov cl, byte ptr [eax+88888888h]  ;bufplc1
1558	cmp cl, 255
1559tran2bufb: mov dl, byte ptr [ebx+88888888h]  ;bufplc2
1560	je short skipdraw1
1561	cmp dl, 255
1562	je short skipdraw2
1563
1564	;mov ax        The transluscent reverse of both!
1565	;mov bl, ah
1566	;mov ah
1567	;mov bh
1568
1569		;BOTH
1570transrev12:
1571tran2edia: mov bx, word ptr [edi+88888888h]      ;getpixels
1572transrev13:
1573	mov ah, bl
1574transrev14:
1575tran2pala: mov al, byte ptr [ecx+88888888h]      ;palookup1
1576transrev15:
1577tran2palb: mov bl, byte ptr [edx+88888888h]      ;palookup2
1578fixchaint2c: add edi, 320
1579tran2traa: mov al, byte ptr [eax+88888888h]      ;_transluc
1580tran2trab: mov ah, byte ptr [ebx+88888888h]      ;_transluc
1581tran2edib: mov word ptr [edi+88888888h-320], ax  ;drawpixels
1582	jnc short begintvline2
1583	jmp short endtvline2
1584
1585	;RIGHT ONLY
1586skipdraw3:
1587transrev16:
1588tran2edie: mov ah, byte ptr [edi+88888889h]      ;getpixel
1589transrev17:
1590tran2pald: mov al, byte ptr [edx+88888888h]      ;palookup2
1591fixchaint2e: add edi, 320
1592tran2trad: mov bl, byte ptr [eax+88888888h]      ;_transluc
1593tran2edif: mov byte ptr [edi+88888889h-320], bl  ;drawpixel
1594	jnc short begintvline2
1595
1596endtvline2:
1597	mov _asm1, esi
1598	mov _asm2, ebp
1599
1600	pop ebp
1601	ret
1602
1603
1604BITSOFPRECISION equ 3
1605BITSOFPRECISIONPOW equ 8
1606
1607;Double-texture mapping with palette lookup
1608;eax:  ylo1------------|----dat|----dat
1609;ebx:  ylo2--------------------|----cnt
1610;ecx:  000000000000000000000000|---temp
1611;edx:  xhi1-xlo1---------------|---yhi1
1612;esi:  xhi2-xlo2---------------|---yhi2
1613;edi:  ------------------------videopos
1614;ebp:  ----------------------------temp
1615
1616ALIGN 16
1617PUBLIC setupslopevlin2_
1618setupslopevlin2_:
1619	mov dword ptr [slop3+2], edx ;ptr
1620	mov dword ptr [slop7+2], edx ;ptr
1621	mov dword ptr [slop4+2], esi ;tptr
1622	mov dword ptr [slop8+2], esi ;tptr
1623	mov byte ptr [slop2+2], ah   ;ybits
1624	mov byte ptr [slop6+2], ah   ;ybits
1625	mov dword ptr [slop9+2], edi ;pinc
1626
1627	mov edx, 1
1628	mov cl, al
1629	add cl, ah
1630	shl edx, cl
1631	dec edx
1632	mov cl, ah
1633	ror edx, cl
1634
1635	mov dword ptr [slop1+2], edx   ;ybits...xbits
1636	mov dword ptr [slop5+2], edx   ;ybits...xbits
1637
1638	ret
1639
1640ALIGN 16
1641PUBLIC slopevlin2_
1642slopevlin2_:
1643	push ebp
1644	xor ecx, ecx
1645
1646slopevlin2begin:
1647	mov ebp, edx
1648slop1: and ebp, 88000088h                ;ybits...xbits
1649slop2: rol ebp, 6                        ;ybits
1650	add eax, _asm1                        ;xinc1<<xbits
1651	adc edx, _asm2                        ;(yinc1&0xffffff00)+(xinc1>>(32-xbits))
1652slop3: mov cl, byte ptr [ebp+88888888h]  ;bufplc
1653
1654	mov ebp, esi
1655slop4: mov al, byte ptr [ecx+88888888h]  ;paloffs
1656slop5: and ebp, 88000088h                ;ybits...xbits
1657slop6: rol ebp, 6                        ;ybits
1658	add ebx, _asm3                        ;xinc2<<xbits
1659slop7: mov cl, byte ptr [ebp+88888888h]  ;bufplc
1660	adc esi, _asm4                        ;(yinc2&0xffffff00)+(xinc2>>(32-xbits))
1661slop8: mov ah, byte ptr [ecx+88888888h]  ;paloffs
1662
1663	dec bl
1664	mov word ptr [edi], ax
1665slop9: lea edi, [edi+88888888h]          ;pinc
1666	jnz short slopevlin2begin
1667
1668	pop ebp
1669	mov eax, edi
1670	ret
1671
1672
1673ALIGN 16
1674PUBLIC setupslopevlin_
1675setupslopevlin_:
1676	mov dword ptr [slopmach3+3], ebx    ;ptr
1677	mov dword ptr [slopmach5+2], ecx    ;pinc
1678	neg ecx
1679	mov dword ptr [slopmach6+2], ecx    ;-pinc
1680
1681	mov edx, 1
1682	mov cl, al
1683	shl edx, cl
1684	dec edx
1685	mov cl, ah
1686	shl edx, cl
1687	mov dword ptr [slopmach7+2], edx
1688
1689	neg ah
1690	mov byte ptr [slopmach2+2], ah
1691
1692	sub ah, al
1693	mov byte ptr [slopmach1+2], ah
1694
1695	fild dword ptr _asm1
1696	fstp dword ptr _asm2
1697	ret
1698
1699ALIGN 16
1700PUBLIC slopevlin_
1701slopevlin_:
1702	mov _ebpbak, ebp
1703	mov _espbak, esp
1704
1705	sub ecx, esp
1706	mov dword ptr [slopmach4+3], ecx
1707
1708	fild dword ptr _asm3
1709slopmach6: lea ebp, [eax+88888888h]
1710	fadd dword ptr _asm2
1711
1712	mov _asm1, ebx
1713	shl ebx, 3
1714
1715	mov eax, _globalx3
1716	mov ecx, _globaly3
1717	imul eax, ebx
1718	imul ecx, ebx
1719	add esi, eax
1720	add edi, ecx
1721
1722	mov ebx, edx
1723	jmp short bigslopeloop
1724ALIGN 16
1725bigslopeloop:
1726	fst dword ptr _fpuasm
1727
1728	mov eax, _fpuasm
1729	add eax, eax
1730	sbb edx, edx
1731	mov ecx, eax
1732	shr ecx, 24
1733	and eax, 00ffe000h
1734	shr eax, 11
1735	sub cl, 2
1736	mov eax, dword ptr _reciptable[eax]
1737	shr eax, cl
1738	xor eax, edx
1739	mov edx, _asm1
1740	mov ecx, _globalx3
1741	mov _asm1, eax
1742	sub eax, edx
1743	mov edx, _globaly3
1744	imul ecx, eax
1745	imul eax, edx
1746
1747	fadd dword ptr _asm2
1748
1749	cmp ebx, BITSOFPRECISIONPOW
1750	mov _asm4, ebx
1751	mov cl, bl
1752	jl short slopeskipmin
1753	mov cl, BITSOFPRECISIONPOW
1754slopeskipmin:
1755
1756;eax: yinc.............
1757;ebx:   0   0   0   ?
1758;ecx: xinc......... cnt
1759;edx:         ?
1760;esi: xplc.............
1761;edi: yplc.............
1762;ebp:     videopos
1763
1764	mov ebx, esi
1765	mov edx, edi
1766
1767beginnerslopeloop:
1768slopmach1: shr ebx, 20
1769	add esi, ecx
1770slopmach2: shr edx, 26
1771slopmach7: and ebx, 88888888h
1772	add edi, eax
1773slopmach5: add ebp, 88888888h                   ;pinc
1774slopmach3: mov dl, byte ptr [ebx+edx+88888888h] ;ptr
1775slopmach4: mov ebx, dword ptr [esp+88888888h]
1776	sub esp, 4
1777	dec cl
1778	mov al, byte ptr [ebx+edx] ;tptr
1779	mov ebx, esi
1780	mov [ebp], al
1781	mov edx, edi
1782	jnz short beginnerslopeloop
1783
1784	mov ebx, _asm4
1785	sub ebx, BITSOFPRECISIONPOW
1786	jg bigslopeloop
1787
1788	ffree st(0)
1789
1790	mov esp, _espbak
1791	mov ebp, _ebpbak
1792	ret
1793
1794
1795ALIGN 16
1796PUBLIC setuprhlineasm4_
1797setuprhlineasm4_:
1798	mov dword ptr [rmach1a+2], eax
1799	mov dword ptr [rmach1b+2], eax
1800	mov dword ptr [rmach1c+2], eax
1801	mov dword ptr [rmach1d+2], eax
1802	mov dword ptr [rmach1e+2], eax
1803
1804	mov dword ptr [rmach2a+2], ebx
1805	mov dword ptr [rmach2b+2], ebx
1806	mov dword ptr [rmach2c+2], ebx
1807	mov dword ptr [rmach2d+2], ebx
1808	mov dword ptr [rmach2e+2], ebx
1809
1810	mov dword ptr [rmach3a+2], ecx
1811	mov dword ptr [rmach3b+2], ecx
1812	mov dword ptr [rmach3c+2], ecx
1813	mov dword ptr [rmach3d+2], ecx
1814	mov dword ptr [rmach3e+2], ecx
1815
1816	mov dword ptr [rmach4a+2], edx
1817	mov dword ptr [rmach4b+2], edx
1818	mov dword ptr [rmach4c+2], edx
1819	mov dword ptr [rmach4d+2], edx
1820	mov dword ptr [rmach4e+2], edx
1821
1822	mov dword ptr [rmach5a+2], esi
1823	mov dword ptr [rmach5b+2], esi
1824	mov dword ptr [rmach5c+2], esi
1825	mov dword ptr [rmach5d+2], esi
1826	mov dword ptr [rmach5e+2], esi
1827	ret
1828
1829	;Non power of 2, non masking, with palookup method #1 (6 clock cycles)
1830	;eax: dat dat dat dat
1831	;ebx:          bufplc
1832	;ecx:  0          dat
1833	;edx:  xlo
1834	;esi:  ylo
1835	;edi:  videopos/cnt
1836	;ebp:  tempvar
1837	;esp:
1838ALIGN 16
1839PUBLIC rhlineasm4_
1840rhlineasm4_:
1841	push ebp
1842
1843	cmp eax, 0
1844	jle endrhline
1845
1846	lea ebp, [edi-4]
1847	sub ebp, eax
1848	mov dword ptr [rmach6a+2], ebp
1849	add ebp, 3
1850	mov dword ptr [rmach6b+2], ebp
1851	mov edi, eax
1852	test edi, 3
1853	jz short begrhline
1854	jmp short startrhline1
1855
1856ALIGN 16
1857startrhline1:
1858	mov cl, byte ptr [ebx]                      ;bufplc
1859rmach1e: sub edx, 88888888h                    ;xlo
1860	sbb ebp, ebp
1861rmach2e: sub esi, 88888888h                    ;ylo
1862rmach3e: sbb ebx, 88888888h                    ;xhi*tilesizy + yhi+ycarry
1863rmach4e: mov al, byte ptr [ecx+88888888h]      ;palookup
1864rmach5e: and ebp, 88888888h                    ;tilesizy
1865rmach6b: mov byte ptr [edi+88888888h], al      ;vidcntoffs
1866	sub ebx, ebp
1867	dec edi
1868	test edi, 3
1869	jnz short startrhline1
1870	test edi, edi
1871	jz endrhline
1872
1873begrhline:
1874	mov cl, byte ptr [ebx]                      ;bufplc
1875rmach1a: sub edx, 88888888h                    ;xlo
1876	sbb ebp, ebp
1877rmach2a: sub esi, 88888888h                    ;ylo
1878rmach3a: sbb ebx, 88888888h                    ;xhi*tilesizy + yhi+ycarry
1879rmach5a: and ebp, 88888888h                    ;tilesizy
1880	sub ebx, ebp
1881
1882rmach1b: sub edx, 88888888h                    ;xlo
1883	sbb ebp, ebp
1884rmach4a: mov ah, byte ptr [ecx+88888888h]      ;palookup
1885	mov cl, byte ptr [ebx]                      ;bufplc
1886rmach2b: sub esi, 88888888h                    ;ylo
1887rmach3b: sbb ebx, 88888888h                    ;xhi*tilesizy + yhi+ycarry
1888rmach5b: and ebp, 88888888h                    ;tilesizy
1889rmach4b: mov al, byte ptr [ecx+88888888h]      ;palookup
1890	sub ebx, ebp
1891
1892	shl eax, 16
1893
1894	mov cl, byte ptr [ebx]                      ;bufplc
1895rmach1c: sub edx, 88888888h                    ;xlo
1896	sbb ebp, ebp
1897rmach2c: sub esi, 88888888h                    ;ylo
1898rmach3c: sbb ebx, 88888888h                    ;xhi*tilesizy + yhi+ycarry
1899rmach5c: and ebp, 88888888h                    ;tilesizy
1900	sub ebx, ebp
1901
1902rmach1d: sub edx, 88888888h                    ;xlo
1903	sbb ebp, ebp
1904rmach4c: mov ah, byte ptr [ecx+88888888h]      ;palookup
1905	mov cl, byte ptr [ebx]                      ;bufplc
1906rmach2d: sub esi, 88888888h                    ;ylo
1907rmach3d: sbb ebx, 88888888h                    ;xhi*tilesizy + yhi+ycarry
1908rmach5d: and ebp, 88888888h                    ;tilesizy
1909rmach4d: mov al, byte ptr [ecx+88888888h]      ;palookup
1910	sub ebx, ebp
1911
1912rmach6a: mov dword ptr [edi+88888888h], eax    ;vidcntoffs
1913	sub edi, 4
1914	jnz begrhline
1915endrhline:
1916	pop ebp
1917	ret
1918
1919ALIGN 16
1920PUBLIC setuprmhlineasm4_
1921setuprmhlineasm4_:
1922	mov dword ptr [rmmach1+2], eax
1923	mov dword ptr [rmmach2+2], ebx
1924	mov dword ptr [rmmach3+2], ecx
1925	mov dword ptr [rmmach4+2], edx
1926	mov dword ptr [rmmach5+2], esi
1927	ret
1928
1929ALIGN 16
1930PUBLIC rmhlineasm4_
1931rmhlineasm4_:
1932	push ebp
1933
1934	cmp eax, 0
1935	jle short endrmhline
1936
1937	lea ebp, [edi-1]
1938	sub ebp, eax
1939	mov dword ptr [rmmach6+2], ebp
1940	mov edi, eax
1941	jmp short begrmhline
1942
1943ALIGN 16
1944begrmhline:
1945	mov cl, byte ptr [ebx]                      ;bufplc
1946rmmach1: sub edx, 88888888h                    ;xlo
1947	sbb ebp, ebp
1948rmmach2: sub esi, 88888888h                    ;ylo
1949rmmach3: sbb ebx, 88888888h                    ;xhi*tilesizy + yhi+ycarry
1950rmmach5: and ebp, 88888888h                    ;tilesizy
1951	cmp cl, 255
1952	je short rmskip
1953rmmach4: mov al, byte ptr [ecx+88888888h]      ;palookup
1954rmmach6: mov byte ptr [edi+88888888h], al      ;vidcntoffs
1955rmskip:
1956	sub ebx, ebp
1957	dec edi
1958	jnz short begrmhline
1959endrmhline:
1960	pop ebp
1961	ret
1962
1963ALIGN 16
1964PUBLIC setupqrhlineasm4_
1965setupqrhlineasm4_:
1966	mov dword ptr [qrmach2e+2], ebx
1967	mov dword ptr [qrmach3e+2], ecx
1968	xor edi, edi
1969	sub edi, ecx
1970	mov dword ptr [qrmach7a+2], edi
1971	mov dword ptr [qrmach7b+2], edi
1972
1973	add ebx, ebx
1974	adc ecx, ecx
1975	mov dword ptr [qrmach2a+2], ebx
1976	mov dword ptr [qrmach2b+2], ebx
1977	mov dword ptr [qrmach3a+2], ecx
1978	mov dword ptr [qrmach3b+2], ecx
1979
1980	mov dword ptr [qrmach4a+2], edx
1981	mov dword ptr [qrmach4b+2], edx
1982	mov dword ptr [qrmach4c+2], edx
1983	mov dword ptr [qrmach4d+2], edx
1984	mov dword ptr [qrmach4e+2], edx
1985	ret
1986
1987	;Non power of 2, non masking, with palookup method (FASTER BUT NO SBB'S)
1988	;eax: dat dat dat dat
1989	;ebx:          bufplc
1990	;ecx:  0          dat
1991	;edx:  0          dat
1992	;esi:  ylo
1993	;edi:  videopos/cnt
1994	;ebp:  ?
1995	;esp:
1996ALIGN 16
1997PUBLIC qrhlineasm4_          ;4 pixels in 9 cycles!  2.25 cycles/pixel
1998qrhlineasm4_:
1999	push ebp
2000
2001	cmp eax, 0
2002	jle endqrhline
2003
2004	mov ebp, eax
2005	test ebp, 3
2006	jz short skipqrhline1
2007	jmp short startqrhline1
2008
2009ALIGN 16
2010startqrhline1:
2011	mov cl, byte ptr [ebx]                      ;bufplc
2012	dec edi
2013qrmach2e: sub esi, 88888888h                   ;ylo
2014	dec ebp
2015qrmach3e: sbb ebx, 88888888h                   ;xhi*tilesizy + yhi+ycarry
2016qrmach4e: mov al, byte ptr [ecx+88888888h]     ;palookup
2017	mov byte ptr [edi], al                      ;vidcntoffs
2018	test ebp, 3
2019	jnz short startqrhline1
2020	test ebp, ebp
2021	jz short endqrhline
2022
2023skipqrhline1:
2024	mov cl, byte ptr [ebx]                      ;bufplc
2025	jmp short begqrhline
2026ALIGN 16
2027begqrhline:
2028qrmach7a: mov dl, byte ptr [ebx+88888888h]     ;bufplc
2029qrmach2a: sub esi, 88888888h                   ;ylo
2030qrmach3a: sbb ebx, 88888888h                   ;xhi*tilesizy + yhi+ycarry
2031qrmach4a: mov ah, byte ptr [ecx+88888888h]     ;palookup
2032qrmach4b: mov al, byte ptr [edx+88888888h]     ;palookup
2033	sub edi, 4
2034	shl eax, 16
2035	mov cl, byte ptr [ebx]                      ;bufplc
2036qrmach7b: mov dl, byte ptr [ebx+88888888h]     ;bufplc
2037qrmach2b: sub esi, 88888888h                   ;ylo
2038qrmach3b: sbb ebx, 88888888h                   ;xhi*tilesizy + yhi+ycarry
2039qrmach4c: mov ah, byte ptr [ecx+88888888h]     ;palookup
2040qrmach4d: mov al, byte ptr [edx+88888888h]     ;palookup
2041	mov cl, byte ptr [ebx]                      ;bufplc
2042	mov dword ptr [edi], eax
2043	sub ebp, 4
2044	jnz short begqrhline
2045
2046endqrhline:
2047	pop ebp
2048	ret
2049
2050
2051PUBLIC setupdrawslab_
2052setupdrawslab_:
2053	mov dword ptr [voxbpl1+2], eax
2054	mov dword ptr [voxbpl2+2], eax
2055	mov dword ptr [voxbpl3+2], eax
2056	mov dword ptr [voxbpl4+2], eax
2057	mov dword ptr [voxbpl5+2], eax
2058	mov dword ptr [voxbpl6+2], eax
2059	mov dword ptr [voxbpl7+2], eax
2060	mov dword ptr [voxbpl8+2], eax
2061
2062	mov dword ptr [voxpal1+2], ebx
2063	mov dword ptr [voxpal2+2], ebx
2064	mov dword ptr [voxpal3+2], ebx
2065	mov dword ptr [voxpal4+2], ebx
2066	mov dword ptr [voxpal5+2], ebx
2067	mov dword ptr [voxpal6+2], ebx
2068	mov dword ptr [voxpal7+2], ebx
2069	mov dword ptr [voxpal8+2], ebx
2070	ret
2071
2072ALIGN 16
2073PUBLIC drawslab_
2074drawslab_:
2075	push ebp
2076	cmp eax, 2
2077	je voxbegdraw2
2078	ja voxskip2
2079	xor eax, eax
2080voxbegdraw1:
2081	mov ebp, ebx
2082	shr ebp, 16
2083	add ebx, edx
2084	dec ecx
2085	mov al, byte ptr [esi+ebp]
2086voxpal1: mov al, byte ptr [eax+88888888h]
2087	mov byte ptr [edi], al
2088voxbpl1: lea edi, [edi+88888888h]
2089	jnz voxbegdraw1
2090	pop ebp
2091	ret
2092
2093voxbegdraw2:
2094	mov ebp, ebx
2095	shr ebp, 16
2096	add ebx, edx
2097	xor eax, eax
2098	dec ecx
2099	mov al, byte ptr [esi+ebp]
2100voxpal2: mov al, byte ptr [eax+88888888h]
2101	mov ah, al
2102	mov word ptr [edi], ax
2103voxbpl2: lea edi, [edi+88888888h]
2104	jnz voxbegdraw2
2105	pop ebp
2106	ret
2107
2108voxskip2:
2109	cmp eax, 4
2110	jne voxskip4
2111	xor eax, eax
2112voxbegdraw4:
2113	mov ebp, ebx
2114	add ebx, edx
2115	shr ebp, 16
2116	xor eax, eax
2117	mov al, byte ptr [esi+ebp]
2118voxpal3: mov al, byte ptr [eax+88888888h]
2119	mov ah, al
2120	shl eax, 8
2121	mov al, ah
2122	shl eax, 8
2123	mov al, ah
2124	mov dword ptr [edi], eax
2125voxbpl3: add edi, 88888888h
2126	dec ecx
2127	jnz voxbegdraw4
2128	pop ebp
2129	ret
2130
2131voxskip4:
2132	add eax, edi
2133
2134	test edi, 1
2135	jz voxskipslab1
2136	cmp edi, eax
2137	je voxskipslab1
2138
2139	push eax
2140	push ebx
2141	push ecx
2142	push edi
2143voxbegslab1:
2144	mov ebp, ebx
2145	add ebx, edx
2146	shr ebp, 16
2147	xor eax, eax
2148	mov al, byte ptr [esi+ebp]
2149voxpal4: mov al, byte ptr [eax+88888888h]
2150	mov byte ptr [edi], al
2151voxbpl4: add edi, 88888888h
2152	dec ecx
2153	jnz voxbegslab1
2154	pop edi
2155	pop ecx
2156	pop ebx
2157	pop eax
2158	inc edi
2159
2160voxskipslab1:
2161	push eax
2162	test edi, 2
2163	jz voxskipslab2
2164	dec eax
2165	cmp edi, eax
2166	jge voxskipslab2
2167
2168	push ebx
2169	push ecx
2170	push edi
2171voxbegslab2:
2172	mov ebp, ebx
2173	add ebx, edx
2174	shr ebp, 16
2175	xor eax, eax
2176	mov al, byte ptr [esi+ebp]
2177voxpal5: mov al, byte ptr [eax+88888888h]
2178	mov ah, al
2179	mov word ptr [edi], ax
2180voxbpl5: add edi, 88888888h
2181	dec ecx
2182	jnz voxbegslab2
2183	pop edi
2184	pop ecx
2185	pop ebx
2186	add edi, 2
2187
2188voxskipslab2:
2189	mov eax, [esp]
2190
2191	sub eax, 3
2192	cmp edi, eax
2193	jge voxskipslab3
2194
2195voxprebegslab3:
2196	push ebx
2197	push ecx
2198	push edi
2199voxbegslab3:
2200	mov ebp, ebx
2201	add ebx, edx
2202	shr ebp, 16
2203	xor eax, eax
2204	mov al, byte ptr [esi+ebp]
2205voxpal6: mov al, byte ptr [eax+88888888h]
2206	mov ah, al
2207	shl eax, 8
2208	mov al, ah
2209	shl eax, 8
2210	mov al, ah
2211	mov dword ptr [edi], eax
2212voxbpl6: add edi, 88888888h
2213	dec ecx
2214	jnz voxbegslab3
2215	pop edi
2216	pop ecx
2217	pop ebx
2218	add edi, 4
2219
2220	mov eax, [esp]
2221
2222	sub eax, 3
2223	cmp edi, eax
2224	jl voxprebegslab3
2225
2226voxskipslab3:
2227	mov eax, [esp]
2228
2229	dec eax
2230	cmp edi, eax
2231	jge voxskipslab4
2232
2233	push ebx
2234	push ecx
2235	push edi
2236voxbegslab4:
2237	mov ebp, ebx
2238	add ebx, edx
2239	shr ebp, 16
2240	xor eax, eax
2241	mov al, byte ptr [esi+ebp]
2242voxpal7: mov al, byte ptr [eax+88888888h]
2243	mov ah, al
2244	mov word ptr [edi], ax
2245voxbpl7: add edi, 88888888h
2246	dec ecx
2247	jnz voxbegslab4
2248	pop edi
2249	pop ecx
2250	pop ebx
2251	add edi, 2
2252
2253voxskipslab4:
2254	pop eax
2255
2256	cmp edi, eax
2257	je voxskipslab5
2258
2259voxbegslab5:
2260	mov ebp, ebx
2261	add ebx, edx
2262	shr ebp, 16
2263	xor eax, eax
2264	mov al, byte ptr [esi+ebp]
2265voxpal8: mov al, byte ptr [eax+88888888h]
2266	mov byte ptr [edi], al
2267voxbpl8: add edi, 88888888h
2268	dec ecx
2269	jnz voxbegslab5
2270
2271voxskipslab5:
2272	pop ebp
2273	ret
2274
2275;modify: loinc
2276;eax: |  dat   |  dat   |   dat  |   dat  |
2277;ebx: |      loplc1                       |
2278;ecx: |      loplc2     |  cnthi |  cntlo |
2279;edx: |--------|--------|--------| hiplc1 |
2280;esi: |--------|--------|--------| hiplc2 |
2281;edi: |--------|--------|--------| vidplc |
2282;ebp: |--------|--------|--------|  hiinc |
2283
2284PUBLIC stretchhline_
2285stretchhline_:
2286	push ebp
2287
2288	mov eax, ebx
2289	shl ebx, 16
2290	sar eax, 16
2291	and ecx, 0000ffffh
2292	or ecx, ebx
2293
2294	add esi, eax
2295	mov eax, edx
2296	mov edx, esi
2297
2298	mov ebp, eax
2299	shl eax, 16
2300	sar ebp, 16
2301
2302	add ecx, eax
2303	adc esi, ebp
2304
2305	add eax, eax
2306	adc ebp, ebp
2307	mov dword ptr [loinc1+2], eax
2308	mov dword ptr [loinc2+2], eax
2309	mov dword ptr [loinc3+2], eax
2310	mov dword ptr [loinc4+2], eax
2311
2312	inc ch
2313
2314	jmp begloop
2315
2316begloop:
2317	mov al, [edx]
2318loinc1: sub ebx, 88888888h
2319	sbb edx, ebp
2320	mov ah, [esi]
2321loinc2: sub ecx, 88888888h
2322	sbb esi, ebp
2323	sub edi, 4
2324	shl eax, 16
2325loinc3: sub ebx, 88888888h
2326	mov al, [edx]
2327	sbb edx, ebp
2328	mov ah, [esi]
2329loinc4: sub ecx, 88888888h
2330	sbb esi, ebp
2331	mov [edi], eax
2332	dec cl
2333	jnz begloop
2334	dec ch
2335	jnz begloop
2336
2337	pop ebp
2338	ret
2339
2340
2341PUBLIC mmxoverlay_
2342mmxoverlay_:
2343	pushfd                 ;Check if CPUID is available
2344	pop eax
2345	mov ebx, eax
2346	xor eax, 00200000h
2347	push eax
2348	popfd
2349	pushfd
2350	pop eax
2351	cmp eax, ebx
2352	je pentium
2353	xor eax, eax
2354	dw 0a20fh
2355	test eax, eax
2356	jz pentium
2357	mov eax, 1
2358	dw 0a20fh
2359	and eax, 00000f00h
2360	test edx, 00800000h    ;Check if MMX is available
2361	jz nommx
2362	cmp eax, 00000600h     ;Check if P6 Family or not
2363	jae pentiumii
2364	jmp pentiummmx
2365nommx:
2366	cmp eax, 00000600h     ;Check if P6 Family or not
2367	jae pentiumpro
2368pentium:
2369	ret
2370
2371;��������������������������������������������������������������Ŀ
2372;�                    PENTIUM II Overlays                       �
2373;����������������������������������������������������������������
2374pentiumii:
2375		;Hline overlay (MMX doens't help)
2376	mov byte ptr [sethlinesizes_], 0xe9
2377	mov dword ptr [sethlinesizes_+1], (offset prosethlinesizes_)-(offset sethlinesizes_)-5
2378	mov byte ptr [setpalookupaddress_], 0xe9
2379	mov dword ptr [setpalookupaddress_+1], (offset prosetpalookupaddress_)-(offset setpalookupaddress_)-5
2380	mov byte ptr [setuphlineasm4_], 0xc3  ;ret (no code required)
2381	mov byte ptr [hlineasm4_], 0xe9
2382	mov dword ptr [hlineasm4_+1], (offset prohlineasm4_)-(offset hlineasm4_)-5
2383
2384		;Vline overlay
2385	mov byte ptr [setupvlineasm_], 0xe9
2386	mov dword ptr [setupvlineasm_+1], (offset prosetupvlineasm_)-(offset setupvlineasm_)-5
2387	mov byte ptr [vlineasm4_], 0xe9
2388	mov dword ptr [vlineasm4_+1], (offset provlineasm4_)-(offset vlineasm4_)-5
2389
2390	ret
2391
2392;��������������������������������������������������������������Ŀ
2393;�                    PENTIUM MMX Overlays2394;����������������������������������������������������������������
2395pentiummmx:
2396	ret
2397
2398;��������������������������������������������������������������Ŀ
2399;�                    PENTIUM PRO Overlays2400;����������������������������������������������������������������
2401pentiumpro:
2402		;Hline overlay (MMX doens't help)
2403	mov byte ptr [sethlinesizes_], 0xe9
2404	mov dword ptr [sethlinesizes_+1], (offset prosethlinesizes_)-(offset sethlinesizes_)-5
2405	mov byte ptr [setpalookupaddress_], 0xe9
2406	mov dword ptr [setpalookupaddress_+1], (offset prosetpalookupaddress_)-(offset setpalookupaddress_)-5
2407	mov byte ptr [setuphlineasm4_], 0xc3  ;ret (no code required)
2408	mov byte ptr [hlineasm4_], 0xe9
2409	mov dword ptr [hlineasm4_+1], (offset prohlineasm4_)-(offset hlineasm4_)-5
2410
2411		;Vline overlay
2412	mov byte ptr [setupvlineasm_], 0xe9
2413	mov dword ptr [setupvlineasm_+1], (offset prosetupvlineasm_)-(offset setupvlineasm_)-5
2414	mov byte ptr [vlineasm4_], 0xe9
2415	mov dword ptr [vlineasm4_+1], (offset provlineasm4_)-(offset vlineasm4_)-5
2416
2417	ret
2418
2419CODE ENDS
2420END
2421