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