1/***************************************************************************
2                          gfx.S  -  description
3                             -------------------
4    begin                : Mon Mar 13 2000
5    copyright            : (C) 2000 by Michael Speck
6    email                :
7 ***************************************************************************/
8
9/***************************************************************************
10 *                                                                         *
11 *   This program is free software; you can redistribute it and/or modify  *
12 *   it under the terms of the GNU General Public License as published by  *
13 *   the Free Software Foundation; either version 2 of the License, or     *
14 *   (at your option) any later version.                                   *
15 *                                                                         *
16 ***************************************************************************/
17
18.macro	CrtStack
19	pushl	%ebp
20	movl	%esp, %ebp
21	pushl	%ebx
22.endm
23
24
25
26.macro DelStack
27	popl	%ebx
28	popl	%ebp
29.endm
30
31	.data
32	.balign	16
33
34.globl rrShft
35rrShft:		.byte	0
36.globl grShft
37grShft:		.byte	0
38.globl brShft
39brShft:		.byte	0
40.globl rlShft
41rlShft:		.byte	0
42.globl glShft
43glShft:		.byte	0
44.globl blShft
45blShft:		.byte	0
46.globl rMask
47rMask:		.long	0
48.globl gMask
49gMask:		.long	0
50.globl bMask
51bMask:		.long	0
52.globl bpp
53bpp:		.byte	0
54.globl pixelsize
55pixelsize:	.byte	0
56.globl clp_lx
57clp_lx:		.long	0
58.globl clp_ty
59clp_ty:		.long	0
60.globl clp_rx
61clp_rx:		.long	0
62.globl clp_by
63clp_by:		.long	0
64
65	.text
66	.balign	16
67
68.globl	SD_Pnt
69SD_Pnt:
70	CrtStack
71
72	//x < lx
73	movl	clp_lx, %eax
74	cmp		%eax, 16(%ebp)
75	jl		9f
76	//y < ty
77	movl	clp_ty, %eax
78	cmp		%eax, 20(%ebp)
79	jl		9f
80	//x > rx
81	movl	clp_rx, %eax
82	cmp		%eax, 16(%ebp)
83	jg		9f
84	//y > ry
85	subl	clp_by, %eax
86	cmp		%eax, 20(%ebp)
87	jg		9f
88
89	xorw	%bx, %bx
90	movb	26(%ebp), %bl	//get red part
91	movb	rrShft, %cl
92	shrb	%cl, %bl
93	movb	rlShft, %cl
94	shlw	%cl, %bx
95
96	xorw	%ax, %ax
97	movb	25(%ebp), %al	//get green part
98	movb	grShft, %cl
99	shrb	%cl, %al
100	movb	glShft, %cl
101	shlw	%cl, %ax
102	orw		%ax, %bx
103
104	xorw	%ax, %ax
105	movb	24(%ebp), %al	//get blue part
106	movb	brShft, %cl
107	shrb	%cl, %al
108	movb	blShft, %cl
109 	shlw	%cl, %ax
110	orw		%ax, %bx	//wordvalue in bx
111
112	movl	20(%ebp), %eax //y
113	movl	12(%ebp), %ecx //w
114	mull	%ecx
115	addl	16(%ebp), %eax //offset in eax
116
117	movl	8(%ebp), %ecx
118	movw	%bx, (%ecx,%eax,2)
119
1209:
121	DelStack
122	ret
123
124
125.globl	SD_Box
126SD_Box:
127	CrtStack
128	pushl	%edi
129
130	//x < lx ?
131	movl	clp_lx, %eax
132	cmpl	%eax, 16(%ebp)
133	jge     0f
134	movl	16(%ebp), %ebx
135	subl	%ebx, %eax
136	subl	%eax, 24(%ebp)
137	movl	clp_lx, %eax
138	movl	%eax, 16(%ebp)
1390:
140	//y < ty ?
141	movl	clp_ty, %eax
142	cmp		%eax, 20(%ebp)
143	jge     1f
144	movl    20(%ebp), %ebx
145	subl	%ebx, %eax
146	subl	%eax, 28(%ebp)
147	movl	clp_ty, %eax
148	movl	%eax, 20(%ebp)
1491:
150	//x > rx
151    movl	clp_rx, %eax
152    movl	16(%ebp), %ebx
153    addl	24(%ebp), %ebx
154    subl	$1, %ebx
155    cmp		%eax, %ebx
156    jle		2f
157    movl	clp_rx, %ebx
158    movl	16(%ebp), %eax
159    subl	%eax, %ebx
160    addl	$1, %ebx
161    movl	%ebx, 24(%ebp)
1622:
163	//y > ty
164    movl	clp_by, %eax
165    movl	20(%ebp), %ebx
166    subl	$1, %ebx
167    addl	28(%ebp), %ebx
168    cmp		%eax, %ebx
169    jle		3f
170    movl	clp_by, %ebx
171    movl	20(%ebp), %eax
172    subl	%eax, %ebx
173    addl	$1, %ebx
174    movl	%ebx, 28(%ebp)
1753:
176
177	//valid w?
178	movl	24(%ebp), %eax
179	cmpl	$0, %eax
180	jle		4f
181    //valid h?
182	movl	28(%ebp), %eax
183	cmpl	$0, %eax
184	jle		4f
185
186	xorw	%bx, %bx
187	movb	34(%ebp), %bl	//get red part
188	movb	rrShft, %cl
189	shrb	%cl, %bl
190	movb	rlShft, %cl
191	shlw	%cl, %bx
192
193	xorw	%ax, %ax
194	movb	33(%ebp), %al	//get green part
195	movb	grShft, %cl
196	shrb	%cl, %al
197	movb	glShft, %cl
198	shlw	%cl, %ax
199	orw		%ax, %bx
200
201	xorw	%ax, %ax
202	movb	32(%ebp), %al	//get blue part
203	movb	brShft, %cl
204	shrb	%cl, %al
205	movb	blShft, %cl
206	shlw	%cl, %ax
207	orw		%bx, %ax	//wordvalue in ax
208	pushw	%ax;
209
210	movl	20(%ebp), %eax	//load y_pos
211	mull	12(%ebp)
212	addl	16(%ebp), %eax
213	movl	%eax, %edi
214	shll	$1, %edi	//offset in lpdest
215	addl	8(%ebp), %edi	//add lpdest_EA
216
217	pushl	%ds
218	popl	%es
219
220	movl	28(%ebp), %edx	//get height
221
222	movl	12(%ebp), %ebx
223	subl	24(%ebp), %ebx
224	shll	$1, %ebx //edi add-on
225
226	popw	%ax
227lp:
228	movl	24(%ebp), %ecx
229	rep; 	stosw
230	addl	%ebx, %edi
231	decl	%edx
232	jnz		lp
233
2344:
235	popl	%edi
236	DelStack
237	ret
238
239
240.globl	SD_Rct
241SD_Rct:
242	CrtStack
243	pushl	%edi
244
245	//x < lx ?
246	movl	clp_lx, %eax
247	cmpl	%eax, 16(%ebp)
248	jge     0f
249	movl	16(%ebp), %ebx
250	subl	%ebx, %eax
251	subl	%eax, 24(%ebp)
252	movl	clp_lx, %eax
253	movl	%eax, 16(%ebp)
2540:
255	//y < ty ?
256	movl	clp_ty, %eax
257	cmp		%eax, 20(%ebp)
258	jge     1f
259	movl    20(%ebp), %ebx
260	subl	%ebx, %eax
261	subl	%eax, 28(%ebp)
262	movl	clp_ty, %eax
263	movl	%eax, 20(%ebp)
2641:
265	//x > rx
266    movl	clp_rx, %eax
267    movl	16(%ebp), %ebx
268    addl	24(%ebp), %ebx
269    subl	$1, %ebx
270    cmp		%eax, %ebx
271    jle		2f
272    movl	clp_rx, %ebx
273    movl	16(%ebp), %eax
274    subl	%eax, %ebx
275    addl	$1, %ebx
276    movl	%ebx, 24(%ebp)
2772:
278	//y > ty
279    movl	clp_by, %eax
280    movl	20(%ebp), %ebx
281    subl	$1, %ebx
282    addl	28(%ebp), %ebx
283    cmp		%eax, %ebx
284    jle		3f
285    movl	clp_by, %ebx
286    movl	20(%ebp), %eax
287    subl	%eax, %ebx
288    addl	$1, %ebx
289    movl	%ebx, 28(%ebp)
2903:
291
292	//valid w?
293	movl	24(%ebp), %eax
294	cmpl	$0, %eax
295	jle		4f
296    //valid h?
297	movl	28(%ebp), %eax
298	cmpl	$0, %eax
299	jle		4f
300
301	xorw	%bx, %bx
302	movb	34(%ebp), %bl	//get red part
303	movb	rrShft, %cl
304	shrb	%cl, %bl
305	movb	rlShft, %cl
306	shlw	%cl, %bx
307
308	xorw	%ax, %ax
309	movb	33(%ebp), %al	//get green part
310	movb	grShft, %cl
311	shrb	%cl, %al
312	movb	glShft, %cl
313	shlw	%cl, %ax
314	orw		%ax, %bx
315
316	xorw	%ax, %ax
317	movb	32(%ebp), %al	//get blue part
318	movb	brShft, %cl
319	shrb	%cl, %al
320	movb	blShft, %cl
321	shlw	%cl, %ax
322	orw		%bx, %ax	//wordvalue in ax
323	pushw	%ax;
324
325	movl	20(%ebp), %eax	//load y_pos
326	mull	12(%ebp)
327	addl	16(%ebp), %eax
328	movl	%eax, %edi
329	shll	$1, %edi	//offset in lpdest
330	addl	8(%ebp), %edi	//add lpdest_EA
331
332	pushl	%ds
333	popl	%es
334
335	movl	28(%ebp), %edx	//get height
336	subl	$2, %edx
337
338	movl	12(%ebp), %ebx
339	subl	24(%ebp), %ebx
340	shll	$1, %ebx //edi add-on
341
342	popw	%ax
343	movl	24(%ebp), %ecx
344	rep; 	stosw
345	addl	%ebx, %edi
346
347	cmp		$0, %edx
348	jle		9f
349lp2:
350	movw	%ax, (%edi)
351	movl	24(%ebp), %ecx
352	subl	$1, %ecx
353	shll	$1, %ecx
354	addl	%ecx, %edi;
355	movw	%ax, (%edi)
356	addl	$2, %edi;
357	addl	%ebx, %edi
358	decl	%edx
359	jnz		lp2
360
3619:
362	movl	24(%ebp), %ecx
363	rep; 	stosw
364
3654:
366	popl	%edi
367	DelStack
368	ret
369
370.globl	SD_CBx
371SD_CBx:
372	CrtStack
373	pushl	%edi
374
375	//x < lx ?
376	movl	clp_lx, %eax
377	cmpl	%eax, 16(%ebp)
378	jge     0f
379	movl	16(%ebp), %ebx
380	subl	%ebx, %eax
381	subl	%eax, 24(%ebp)
382	movl	clp_lx, %eax
383	movl	%eax, 16(%ebp)
3840:
385	//y < ty ?
386	movl	clp_ty, %eax
387	cmp		%eax, 20(%ebp)
388	jge     1f
389	movl    20(%ebp), %ebx
390	subl	%ebx, %eax
391	subl	%eax, 28(%ebp)
392	movl	clp_ty, %eax
393	movl	%eax, 20(%ebp)
3941:
395	//x > rx
396    movl	clp_rx, %eax
397    movl	16(%ebp), %ebx
398    addl	24(%ebp), %ebx
399    subl	$1, %ebx
400    cmp		%eax, %ebx
401    jle		2f
402    movl	clp_rx, %ebx
403    movl	16(%ebp), %eax
404    subl	%eax, %ebx
405    addl	$1, %ebx
406    movl	%ebx, 24(%ebp)
4072:
408	//y > ty
409    movl	clp_by, %eax
410    movl	20(%ebp), %ebx
411    subl	$1, %ebx
412    addl	28(%ebp), %ebx
413    cmp		%eax, %ebx
414    jle		3f
415    movl	clp_by, %ebx
416    movl	20(%ebp), %eax
417    subl	%eax, %ebx
418    addl	$1, %ebx
419    movl	%ebx, 28(%ebp)
4203:
421
422	//valid w?
423	movl	24(%ebp), %eax
424	cmpl	$0, %eax
425	jle		4f
426    //valid h?
427	movl	28(%ebp), %eax
428	cmpl	$0, %eax
429	jle		4f
430
431	xorl	%edi, %edi
432	xorl	%eax, %eax
433
434	//edi destination
435	pushl	%ds
436	popl	%es
437	movl	20(%ebp), %eax
438	mull	12(%ebp)
439	addl	16(%ebp), %eax
440	shll	$1, %eax
441	addl	8(%ebp), %eax
442	movl	%eax, %edi //dest offset in edi
443
444	movl	28(%ebp), %edx //height
445outerl5:
446	movl	24(%ebp), %ecx //width
447	pushl	%edx
448innerl5:
449	pushl	%ecx
450
451	xor		%eax, %eax
452	movb	34(%ebp), %al
453	movb	rrShft, %cl
454	shrb	%cl, %al
455	mull	36(%ebp)
456	movb	rlShft, %cl
457	shll	%cl, %eax
458	pushl	%eax //relative red source part
459	movl	(%edi), %eax
460	andl	rMask, %eax
461	shrl	%cl, %eax
462	movl	$100, %ebx
463	subl	36(%ebp), %ebx
464	mull	%ebx
465	shll	%cl, %eax //relative red dest part
466	popl	%ebx
467	addl	%ebx, %eax
468	movl	$100, %ebx
469	divl	%ebx
470	andl	rMask, %eax
471	pushl	%eax
472
473	xor		%eax, %eax
474	movb	33(%ebp), %al
475	movb	grShft, %cl
476	shrb	%cl, %al
477	mull	36(%ebp)
478	movb	glShft, %cl
479	shll	%cl, %eax
480	pushl	%eax //relative green source part
481	movl	(%edi), %eax
482	andl	gMask, %eax
483	shrl	%cl, %eax
484	movl	$100, %ebx
485	subl	36(%ebp), %ebx
486	mull	%ebx
487	shll	%cl, %eax //relative green dest part
488	popl	%ebx
489	addl	%ebx, %eax
490	movl	$100, %ebx
491	divl	%ebx
492	andl	gMask, %eax
493	pushl	%eax
494
495	xor		%eax, %eax
496	movb	32(%ebp), %al
497	movb	brShft, %cl
498	shrb	%cl, %al
499	mull	36(%ebp)
500	movb	blShft, %cl
501	shll	%cl, %eax
502	pushl	%eax //relative blue source part
503	movl	(%edi), %eax
504	andl	bMask, %eax
505	shrl	%cl, %eax
506	movl	$100, %ebx
507	subl	36(%ebp), %ebx
508	mull	%ebx
509	shll	%cl, %eax //relative blue dest part
510	popl	%ebx
511	addl	%ebx, %eax
512	movl	$100, %ebx
513	divl	%ebx
514	andl	bMask, %eax
515
516	popl	%ebx
517	orl		%ebx, %eax
518	popl	%ebx
519	orl		%ebx, %eax
520
521	movw	%ax, (%edi)
522
523	addl	$2, %edi
524	popl	%ecx
525	decl	%ecx
526	jnz		innerl5
527
528	popl	%edx
529
530	movl	12(%ebp), %ebx
531	subl	24(%ebp), %ebx
532	shll	$1, %ebx
533	addl	%ebx, %edi
534
535	decl	%edx
536	jnz		outerl5
537
5384:
539	popl	%edi
540	DelStack
541	ret
542
543.globl	SC_Opq
544SC_Opq:
545	CrtStack
546	pushl	%edi
547	pushl	%esi
548
549	//x < lx ?
550	movl	clp_lx, %eax
551	cmpl	%eax, 16(%ebp)
552	jge     0f
553	movl	16(%ebp), %ebx
554	subl	%ebx, %eax
555	subl	%eax, 40(%ebp)
556	addl	%eax, 32(%ebp)
557	movl	clp_lx, %eax
558	movl	%eax, 16(%ebp)
5590:
560	//y < ty ?
561	movl	clp_ty, %eax
562	cmp		%eax, 20(%ebp)
563	jge     1f
564	movl	20(%ebp), %ebx
565	subl	%ebx, %eax
566	subl	%eax, 44(%ebp)
567	addl	%eax, 36(%ebp)
568	movl	clp_ty, %eax
569	movl	%eax, 20(%ebp)
5701:
571	//x > rx
572    movl	clp_rx, %eax
573    movl	16(%ebp), %ebx
574    addl	40(%ebp), %ebx
575    subl	$1, %ebx
576    cmp		%eax, %ebx
577    jle		2f
578    movl	clp_rx, %ebx
579    movl	16(%ebp), %eax
580    subl	%eax, %ebx
581    addl	$1, %ebx
582    movl	%ebx, 40(%ebp)
5832:
584	//y > ty
585    movl	clp_by, %eax
586    movl	20(%ebp), %ebx
587    addl	44(%ebp), %ebx
588    subl	$1, %ebx
589    cmp		%eax, %ebx
590    jle		3f
591    movl	clp_by, %ebx
592    movl	20(%ebp), %eax
593    subl	%eax, %ebx
594    addl	$1, %ebx
595    movl	%ebx, 44(%ebp)
5963:
597
598	//valid w?
599	movl	40(%ebp), %eax
600	cmpl	$0, %eax
601	jle		4f
602    //valid h?
603	movl	44(%ebp), %eax
604	cmpl	$0, %eax
605	jle		4f
606
607	xorl	%edi, %edi
608	xorl	%esi, %esi
609	xorl	%eax, %eax
610
611	//esi source
612	movl	36(%ebp), %eax //sy
613	mull	28(%ebp) //dw
614	addl	32(%ebp), %eax //sx
615	shll	$1, %eax
616	addl 	24(%ebp), %eax
617	movl	%eax, %esi //source offset in esi
618
619	//edi destination
620	pushl	%ds
621	popl	%es
622	movl	20(%ebp), %eax
623	mull	12(%ebp)
624	addl	16(%ebp), %eax
625	shll	$1, %eax
626	addl	8(%ebp), %eax
627	movl	%eax, %edi //dest offset in edi
628
629	movl	12(%ebp), %eax
630	subl	40(%ebp), %eax
631	shll	$1, %eax //edi add-on after completed line
632
633	movl	28(%ebp), %ebx
634	subl	40(%ebp), %ebx
635	shll	$1, %ebx //esi add-on after completed line
636
637	movl	44(%ebp), %edx //height
638outerl3:
639	movl	40(%ebp), %ecx //line width
640	rep;	movsw
641	addl	%eax, %edi
642	addl	%ebx, %esi
643	dec	%edx
644	jnz	outerl3
645
6464:
647	popl	%esi
648	popl	%edi
649	DelStack
650	ret
651
652.globl	SC_Clp
653SC_Clp:
654	CrtStack
655	pushl	%edi
656	pushl	%esi
657
658	//x < lx ?
659	movl	clp_lx, %eax
660	cmpl	%eax, 16(%ebp)
661	jge     0f
662	movl	16(%ebp), %ebx
663	subl	%ebx, %eax
664	subl	%eax, 40(%ebp)
665	addl	%eax, 32(%ebp)
666	movl	clp_lx, %eax
667	movl	%eax, 16(%ebp)
6680:
669	//y < ty ?
670	movl	clp_ty, %eax
671	cmp		%eax, 20(%ebp)
672	jge     1f
673	movl	20(%ebp), %ebx
674	subl	%ebx, %eax
675	subl	%eax, 44(%ebp)
676	addl	%eax, 36(%ebp)
677	movl	clp_ty, %eax
678	movl	%eax, 20(%ebp)
6791:
680	//x > rx
681    movl	clp_rx, %eax
682    movl	16(%ebp), %ebx
683    addl	40(%ebp), %ebx
684    subl	$1, %ebx
685    cmp		%eax, %ebx
686    jle		2f
687    movl	clp_rx, %ebx
688    movl	16(%ebp), %eax
689    subl	%eax, %ebx
690    addl	$1, %ebx
691    movl	%ebx, 40(%ebp)
6922:
693	//y > ty
694    movl	clp_by, %eax
695    movl	20(%ebp), %ebx
696    addl	44(%ebp), %ebx
697    subl	$1, %ebx
698    cmp		%eax, %ebx
699    jle		3f
700    movl	clp_by, %ebx
701    movl	20(%ebp), %eax
702    subl	%eax, %ebx
703    addl	$1, %ebx
704    movl	%ebx, 44(%ebp)
7053:
706
707	//valid w?
708	movl	40(%ebp), %eax
709	cmpl	$0, %eax
710	jle		4f
711    //valid h?
712	movl	44(%ebp), %eax
713	cmpl	$0, %eax
714	jle		4f
715
716	xorl	%edi, %edi
717	xorl	%esi, %esi
718	xorl	%eax, %eax
719
720	//esi source
721	movl	36(%ebp), %eax //sy
722	mull	28(%ebp) //dw
723	addl	32(%ebp), %eax //sx
724	shll	$1, %eax
725	addl 	24(%ebp), %eax
726	movl	%eax, %esi //source offset in esi
727
728	//edi destination
729	pushl	%ds
730	popl	%es
731	movl	20(%ebp), %eax
732	mull	12(%ebp)
733	addl	16(%ebp), %eax
734	shll	$1, %eax
735	addl	8(%ebp), %eax
736	movl	%eax, %edi //dest offset in edi
737
738	movl	12(%ebp), %eax
739	subl	40(%ebp), %eax
740	shll	$1, %eax //edi add-on after completed line
741
742	movl	28(%ebp), %ebx
743	subl	40(%ebp), %ebx
744	shll	$1, %ebx //esi add-on after completed line
745
746	movl	44(%ebp), %edx
747outerl2:
748	movl	40(%ebp), %ecx
749innerl2:
750	pushl	%ecx
751	movw	(%esi), %cx
752	cmp		$0, %cx
753	jz		nopixel
754	movw	(%esi), %cx
755	movw	%cx, (%edi)
756nopixel:
757	addl	$2, %esi
758	addl	$2, %edi
759	popl	%ecx
760	decl	%ecx
761	jnz		innerl2
762
763	addl	%eax, %edi
764	addl	%ebx, %esi
765
766	decl	%edx
767	jnz		outerl2
768
7694:
770	popl	%esi
771	popl	%edi
772	DelStack
773	ret
774
775.globl	SC_Trp_11
776SC_Trp_11:
777	CrtStack
778	pushl	%edi
779	pushl	%esi
780
781	//x < lx ?
782	movl	clp_lx, %eax
783	cmpl	%eax, 16(%ebp)
784	jge     0f
785	movl	16(%ebp), %ebx
786	subl	%ebx, %eax
787	subl	%eax, 40(%ebp)
788	addl	%eax, 32(%ebp)
789	movl	clp_lx, %eax
790	movl	%eax, 16(%ebp)
7910:
792	//y < ty ?
793	movl	clp_ty, %eax
794	cmp		%eax, 20(%ebp)
795	jge     1f
796	movl	20(%ebp), %ebx
797	subl	%ebx, %eax
798	subl	%eax, 44(%ebp)
799	addl	%eax, 36(%ebp)
800	movl	clp_ty, %eax
801	movl	%eax, 20(%ebp)
8021:
803	//x > rx
804    movl	clp_rx, %eax
805    movl	16(%ebp), %ebx
806    addl	40(%ebp), %ebx
807    subl	$1, %ebx
808    cmp		%eax, %ebx
809    jle		2f
810    movl	clp_rx, %ebx
811    movl	16(%ebp), %eax
812    subl	%eax, %ebx
813    addl	$1, %ebx
814    movl	%ebx, 40(%ebp)
8152:
816	//y > ty
817    movl	clp_by, %eax
818    movl	20(%ebp), %ebx
819    addl	44(%ebp), %ebx
820    subl	$1, %ebx
821    cmp		%eax, %ebx
822    jle		3f
823    movl	clp_by, %ebx
824    movl	20(%ebp), %eax
825    subl	%eax, %ebx
826    addl	$1, %ebx
827    movl	%ebx, 44(%ebp)
8283:
829
830	//valid w?
831	movl	40(%ebp), %eax
832	cmpl	$0, %eax
833	jle		4f
834    //valid h?
835	movl	44(%ebp), %eax
836	cmpl	$0, %eax
837	jle		4f
838
839	xorl	%edi, %edi
840	xorl	%esi, %esi
841	xorl	%eax, %eax
842
843	//esi source
844	movl	36(%ebp), %eax //sy
845	mull	28(%ebp) //dw
846	addl	32(%ebp), %eax //sx
847	shll	$1, %eax
848	addl 	24(%ebp), %eax
849	movl	%eax, %esi //source offset in esi
850
851	//edi destination
852	pushl	%ds
853	popl	%es
854	movl	20(%ebp), %eax
855	mull	12(%ebp)
856	addl	16(%ebp), %eax
857	shll	$1, %eax
858	addl	8(%ebp), %eax
859	movl	%eax, %edi //dest offset in edi
860
861	movl	44(%ebp), %edx
862outerl:
863	movl	40(%ebp), %ecx
864innerl:
865	movw	(%esi), %bx
866	cmpw	$0, %bx
867	jz		7f
868
869	movl	(%esi), %eax
870	andl	rMask, %eax
871	movl	(%edi), %ebx
872	andl	rMask, %ebx
873	addl	%ebx, %eax
874	shrl	$1, %eax
875	andl	rMask, %eax
876	pushl	%eax
877
878	movl	(%esi), %eax
879	andl	gMask, %eax
880	movl	(%edi), %ebx
881	andl	gMask, %ebx
882	addl	%ebx, %eax
883	shrl	$1, %eax
884	andl	gMask, %eax
885	pushl	%eax
886
887	movl	(%esi), %eax
888	andl	bMask, %eax
889	movl	(%edi), %ebx
890	andl	bMask, %ebx
891	addl	%ebx, %eax
892	shrl	$1, %eax
893	andl	bMask, %eax
894
895	popl	%ebx
896	orl		%ebx, %eax
897	popl	%ebx
898	orl		%ebx, %eax
899
900	movw	%ax, (%edi)
901
9027:
903	addl	$2, %esi
904	addl	$2, %edi
905	decl	%ecx
906	jnz		innerl
907
908	movl	12(%ebp), %ebx
909	subl	40(%ebp), %ebx
910	shll	$1, %ebx
911	addl	%ebx, %edi
912
913	movl	28(%ebp), %ebx
914	subl	40(%ebp), %ebx
915	shll	$1, %ebx
916	addl	%ebx, %esi
917
918	decl	%edx
919	jnz		outerl
920
9214:
922	popl	%esi
923	popl	%edi
924	DelStack
925	ret
926
927.globl	SC_Trp_X
928SC_Trp_X:
929	CrtStack
930	pushl	%edi
931	pushl	%esi
932
933	//x < lx ?
934	movl	clp_lx, %eax
935	cmpl	%eax, 16(%ebp)
936	jge     0f
937	movl	16(%ebp), %ebx
938	subl	%ebx, %eax
939	subl	%eax, 40(%ebp)
940	addl	%eax, 32(%ebp)
941	movl	clp_lx, %eax
942	movl	%eax, 16(%ebp)
9430:
944	//y < ty ?
945	movl	clp_ty, %eax
946	cmp		%eax, 20(%ebp)
947	jge     1f
948	movl	20(%ebp), %ebx
949	subl	%ebx, %eax
950	subl	%eax, 44(%ebp)
951	addl	%eax, 36(%ebp)
952	movl	clp_ty, %eax
953	movl	%eax, 20(%ebp)
9541:
955	//x > rx
956    movl	clp_rx, %eax
957    movl	16(%ebp), %ebx
958    addl	40(%ebp), %ebx
959    subl	$1, %ebx
960    cmp		%eax, %ebx
961    jle		2f
962    movl	clp_rx, %ebx
963    movl	16(%ebp), %eax
964    subl	%eax, %ebx
965    addl	$1, %ebx
966    movl	%ebx, 40(%ebp)
9672:
968	//y > ty
969    movl	clp_by, %eax
970    movl	20(%ebp), %ebx
971    addl	44(%ebp), %ebx
972    subl	$1, %ebx
973    cmp		%eax, %ebx
974    jle		3f
975    movl	clp_by, %ebx
976    movl	20(%ebp), %eax
977    subl	%eax, %ebx
978    addl	$1, %ebx
979    movl	%ebx, 44(%ebp)
9803:
981
982	//valid w?
983	movl	40(%ebp), %eax
984	cmpl	$0, %eax
985	jle		4f
986    //valid h?
987	movl	44(%ebp), %eax
988	cmpl	$0, %eax
989	jle		4f
990
991	xorl	%edi, %edi
992	xorl	%esi, %esi
993	xorl	%eax, %eax
994
995	//esi source
996	movl	36(%ebp), %eax //sy
997	mull	28(%ebp) //dw
998	addl	32(%ebp), %eax //sx
999	shll	$1, %eax
1000	addl 	24(%ebp), %eax
1001	movl	%eax, %esi //source offset in esi
1002
1003	//edi destination
1004	pushl	%ds
1005	popl	%es
1006	movl	20(%ebp), %eax
1007	mull	12(%ebp)
1008	addl	16(%ebp), %eax
1009	shll	$1, %eax
1010	addl	8(%ebp), %eax
1011	movl	%eax, %edi //dest offset in edi
1012
1013	movl	44(%ebp), %edx
1014outerl4:
1015	movl	40(%ebp), %ecx
1016	pushl	%edx
1017innerl4:
1018	pushl	%ecx
1019
1020	movw	(%esi), %bx
1021	cmpw	$0, %bx
1022	jz		7f
1023
1024	movl	(%esi), %eax
1025	andl	rMask, %eax
1026	movb	rlShft, %cl
1027	shrl	%cl, %eax
1028	mull	48(%ebp)
1029	shll	%cl, %eax
1030	pushl	%eax //relative red source part
1031	movl	(%edi), %eax
1032	andl	rMask, %eax
1033	shrl	%cl, %eax
1034	movl	$100, %ebx
1035	subl	48(%ebp), %ebx
1036	mull	%ebx
1037	shll	%cl, %eax //relative green dest part
1038	popl	%ebx
1039	addl	%ebx, %eax
1040	movl	$100, %ebx
1041	divl	%ebx
1042	andl	rMask, %eax
1043	pushl	%eax
1044
1045	movl	(%esi), %eax
1046	andl	gMask, %eax
1047	movb	glShft, %cl
1048	shrl	%cl, %eax
1049	mull	48(%ebp)
1050	shll	%cl, %eax
1051	pushl	%eax //relative red source part
1052	movl	(%edi), %eax
1053	andl	gMask, %eax
1054	shrl	%cl, %eax
1055	movl	$100, %ebx
1056	subl	48(%ebp), %ebx
1057	mull	%ebx
1058	shll	%cl, %eax //relative green dest part
1059	popl	%ebx
1060	addl	%ebx, %eax
1061	movl	$100, %ebx
1062	divl	%ebx
1063	andl	gMask, %eax
1064	pushl	%eax
1065
1066	movl	(%esi), %eax
1067	andl	bMask, %eax
1068	movb	blShft, %cl
1069	shrl	%cl, %eax
1070	mull	48(%ebp)
1071	shll	%cl, %eax
1072	pushl	%eax //relative blue source part
1073	movl	(%edi), %eax
1074	andl	bMask, %eax
1075	shrl	%cl, %eax
1076	movl	$100, %ebx
1077	subl	48(%ebp), %ebx
1078	mull	%ebx
1079	shll	%cl, %eax //relative blue dest part
1080	popl	%ebx
1081	addl	%ebx, %eax
1082	movl	$100, %ebx
1083	divl	%ebx
1084	andl	bMask, %eax
1085
1086	popl	%ebx
1087	orl		%ebx, %eax
1088	popl	%ebx
1089	orl		%ebx, %eax
1090
1091	movw	%ax, (%edi)
1092
10937:
1094	addl	$2, %esi
1095	addl	$2, %edi
1096	popl	%ecx
1097	decl	%ecx
1098	jnz		innerl4
1099
1100	popl	%edx
1101
1102	movl	12(%ebp), %ebx
1103	subl	40(%ebp), %ebx
1104	shll	$1, %ebx
1105	addl	%ebx, %edi
1106
1107	movl	28(%ebp), %ebx
1108	subl	40(%ebp), %ebx
1109	shll	$1, %ebx
1110	addl	%ebx, %esi
1111
1112	decl	%edx
1113	jnz		outerl4
1114
11154:
1116	popl	%esi
1117	popl	%edi
1118	DelStack
1119	ret
1120
1121.globl	SC_Clr_11
1122SC_Clr_11:
1123	CrtStack
1124	pushl	%edi
1125	pushl	%esi
1126
1127	//x < lx ?
1128	movl	clp_lx, %eax
1129	cmpl	%eax, 16(%ebp)
1130	jge     0f
1131	movl	16(%ebp), %ebx
1132	subl	%ebx, %eax
1133	subl	%eax, 40(%ebp)
1134	addl	%eax, 32(%ebp)
1135	movl	clp_lx, %eax
1136	movl	%eax, 16(%ebp)
11370:
1138	//y < ty ?
1139	movl	clp_ty, %eax
1140 	cmp		%eax, 20(%ebp)
1141	jge     1f
1142	movl	20(%ebp), %ebx
1143	subl	%ebx, %eax
1144	subl	%eax, 44(%ebp)
1145	addl	%eax, 36(%ebp)
1146	movl	clp_ty, %eax
1147	movl	%eax, 20(%ebp)
11481:
1149	//x > rx
1150    movl	clp_rx, %eax
1151    movl	16(%ebp), %ebx
1152    addl	40(%ebp), %ebx
1153    subl	$1, %ebx
1154    cmp		%eax, %ebx
1155    jle		2f
1156    movl	clp_rx, %ebx
1157    movl	16(%ebp), %eax
1158    subl	%eax, %ebx
1159    addl	$1, %ebx
1160    movl	%ebx, 40(%ebp)
11612:
1162	//y > ty
1163    movl	clp_by, %eax
1164    movl	20(%ebp), %ebx
1165    addl	44(%ebp), %ebx
1166    subl	$1, %ebx
1167    cmp		%eax, %ebx
1168    jle		3f
1169    movl	clp_by, %ebx
1170    movl	20(%ebp), %eax
1171    subl	%eax, %ebx
1172    addl	$1, %ebx
1173    movl	%ebx, 44(%ebp)
11743:
1175
1176	//valid w?
1177	movl	40(%ebp), %eax
1178	cmpl	$0, %eax
1179	jle		4f
1180    //valid h?
1181	movl	44(%ebp), %eax
1182	cmpl	$0, %eax
1183	jle		4f
1184
1185	xorl	%edi, %edi
1186	xorl	%esi, %esi
1187	xorl	%eax, %eax
1188
1189	//esi source
1190	movl	36(%ebp), %eax //sy
1191	mull	28(%ebp) //dw
1192	addl	32(%ebp), %eax //sx
1193	shll	$1, %eax
1194	addl 	24(%ebp), %eax
1195	movl	%eax, %esi //source offset in esi
1196
1197	//edi destination
1198	pushl	%ds
1199	popl	%es
1200	movl	20(%ebp), %eax
1201	mull	12(%ebp)
1202	addl	16(%ebp), %eax
1203	shll	$1, %eax
1204	addl	8(%ebp), %eax
1205	movl	%eax, %edi //dest offset in edi
1206
1207	movl	44(%ebp), %edx //height
1208outerl7:
1209	movl	40(%ebp), %ecx //width
1210	pushl	%edx
1211innerl7:
1212	pushl	%ecx
1213
1214	movw	(%esi), %bx
1215	cmpw	$0, %bx
1216	jz		7f
1217
1218	xor		%ebx, %ebx
1219	movb	46(%ebp), %bl
1220	movb	rrShft, %cl
1221	shrb	%cl, %bl
1222	movb	rlShft, %cl
1223	shll	%cl, %ebx //relative red sourve value
1224	movl	(%edi), %eax
1225	andl	rMask, %eax
1226	addl	%ebx, %eax
1227	shrl	$1, %eax
1228	andl	rMask, %eax
1229	pushl	%eax
1230
1231	xor		%ebx, %ebx
1232	movb	45(%ebp), %bl
1233	movb	grShft, %cl
1234	shrb	%cl, %bl
1235	movb	glShft, %cl
1236	shll	%cl, %ebx //relative green sourve value
1237	movl	(%edi), %eax
1238	andl	gMask, %eax
1239	addl	%ebx, %eax
1240	shrl	$1, %eax
1241	andl	gMask, %eax
1242	pushl	%eax
1243
1244	xor		%ebx, %ebx
1245	movb	44(%ebp), %bl
1246	movb	brShft, %cl
1247	shrb	%cl, %bl
1248	movb	blShft, %cl
1249	shll	%cl, %ebx //relative blue sourve value
1250	movl	(%edi), %eax
1251	andl	bMask, %eax
1252	addl	%ebx, %eax
1253	shrl	$1, %eax
1254	andl	bMask, %eax
1255
1256	popl	%ebx
1257	orl		%ebx, %eax
1258	popl	%ebx
1259	orl		%ebx, %eax
1260
1261	movw	%ax, (%edi)
1262
12637:
1264	addl	$2, %edi
1265	addl	$2, %esi
1266	popl	%ecx
1267	decl	%ecx
1268	jnz		innerl7
1269
1270	movl	28(%ebp), %eax
1271	subl	40(%ebp), %eax
1272	shll	$1, %eax
1273	addl	%eax, %esi
1274
1275	movl	12(%ebp), %ebx
1276	subl	40(%ebp), %ebx
1277	shll	$1, %ebx
1278	addl	%ebx, %edi
1279
1280	popl	%edx
1281	decl	%edx
1282	jnz		outerl7
1283
12844:
1285	popl	%esi
1286	popl	%edi
1287	DelStack
1288	ret
1289
1290.globl	SC_Clr_X
1291SC_Clr_X:
1292	CrtStack
1293	pushl	%edi
1294	pushl	%esi
1295
1296	//x < lx ?
1297	movl	clp_lx, %eax
1298	cmpl	%eax, 16(%ebp)
1299	jge     0f
1300	movl	16(%ebp), %ebx
1301	subl	%ebx, %eax
1302	subl	%eax, 40(%ebp)
1303	addl	%eax, 32(%ebp)
1304	movl	clp_lx, %eax
1305	movl	%eax, 16(%ebp)
13060:
1307	//y < ty ?
1308	movl	clp_ty, %eax
1309	cmp		%eax, 20(%ebp)
1310	jge     1f
1311	movl	20(%ebp), %ebx
1312	subl	%ebx, %eax
1313	subl	%eax, 44(%ebp)
1314	addl	%eax, 36(%ebp)
1315	movl	clp_ty, %eax
1316	movl	%eax, 20(%ebp)
13171:
1318	//x > rx
1319    movl	clp_rx, %eax
1320    movl	16(%ebp), %ebx
1321    addl	40(%ebp), %ebx
1322    subl	$1, %ebx
1323    cmp		%eax, %ebx
1324    jle		2f
1325    movl	clp_rx, %ebx
1326    movl	16(%ebp), %eax
1327    subl	%eax, %ebx
1328    addl	$1, %ebx
1329    movl	%ebx, 40(%ebp)
13302:
1331	//y > ty
1332    movl	clp_by, %eax
1333    movl	20(%ebp), %ebx
1334    addl	44(%ebp), %ebx
1335    subl	$1, %ebx
1336    cmp		%eax, %ebx
1337    jle		3f
1338    movl	clp_by, %ebx
1339    movl	20(%ebp), %eax
1340    subl	%eax, %ebx
1341    addl	$1, %ebx
1342    movl	%ebx, 44(%ebp)
13433:
1344
1345	//valid w?
1346	movl	40(%ebp), %eax
1347	cmpl	$0, %eax
1348	jle		4f
1349    //valid h?
1350	movl	44(%ebp), %eax
1351	cmpl	$0, %eax
1352	jle		4f
1353
1354	xorl	%edi, %edi
1355	xorl	%esi, %esi
1356	xorl	%eax, %eax
1357
1358	//esi source
1359	movl	36(%ebp), %eax //sy
1360	mull	28(%ebp) //dw
1361	addl	32(%ebp), %eax //sx
1362	shll	$1, %eax
1363	addl 	24(%ebp), %eax
1364	movl	%eax, %esi //source offset in esi
1365
1366	//edi destination
1367	pushl	%ds
1368	popl	%es
1369	movl	20(%ebp), %eax
1370	mull	12(%ebp)
1371	addl	16(%ebp), %eax
1372	shll	$1, %eax
1373	addl	8(%ebp), %eax
1374	movl	%eax, %edi //dest offset in edi
1375
1376	movl	44(%ebp), %edx //height
1377outerl6:
1378	movl	40(%ebp), %ecx //width
1379	pushl	%edx
1380innerl6:
1381	pushl	%ecx
1382
1383	movw	(%esi), %bx
1384	cmpw	$0, %bx
1385	jz		7f
1386
1387	xor		%eax, %eax
1388	movb	50(%ebp), %al
1389	movb	rrShft, %cl
1390	shrb	%cl, %al
1391	mull	52(%ebp)
1392	movb	rlShft, %cl
1393	shll	%cl, %eax
1394	pushl	%eax //relative red source part
1395	movl	(%edi), %eax
1396	andl	rMask, %eax
1397	shrl	%cl, %eax
1398	movl	$100, %ebx
1399	subl	52(%ebp), %ebx
1400	mull	%ebx
1401	shll	%cl, %eax //relative red dest part
1402	popl	%ebx
1403	addl	%ebx, %eax
1404	movl	$100, %ebx
1405	divl	%ebx
1406	andl	rMask, %eax
1407	pushl	%eax
1408
1409	xor		%eax, %eax
1410	movb	49(%ebp), %al
1411	movb	grShft, %cl
1412	shrb	%cl, %al
1413	mull	52(%ebp)
1414	movb	glShft, %cl
1415	shll	%cl, %eax
1416	pushl	%eax //relative green source part
1417	movl	(%edi), %eax
1418	andl	gMask, %eax
1419	shrl	%cl, %eax
1420	movl	$100, %ebx
1421	subl	52(%ebp), %ebx
1422	mull	%ebx
1423	shll	%cl, %eax //relative green dest part
1424	popl	%ebx
1425	addl	%ebx, %eax
1426	movl	$100, %ebx
1427	divl	%ebx
1428	andl	gMask, %eax
1429	pushl	%eax
1430
1431	xor		%eax, %eax
1432	movb	48(%ebp), %al
1433	movb	brShft, %cl
1434	shrb	%cl, %al
1435	mull	52(%ebp)
1436	movb	blShft, %cl
1437	shll	%cl, %eax
1438	pushl	%eax //relative blue source part
1439	movl	(%edi), %eax
1440	andl	bMask, %eax
1441	shrl	%cl, %eax
1442	movl	$100, %ebx
1443	subl	52(%ebp), %ebx
1444	mull	%ebx
1445	shll	%cl, %eax //relative blue dest part
1446	popl	%ebx
1447	addl	%ebx, %eax
1448	movl	$100, %ebx
1449	divl	%ebx
1450	andl	bMask, %eax
1451
1452	popl	%ebx
1453	orl		%ebx, %eax
1454	popl	%ebx
1455	orl		%ebx, %eax
1456
1457	movw	%ax, (%edi)
1458
14597:
1460	addl	$2, %edi
1461	addl	$2, %esi
1462	popl	%ecx
1463	decl	%ecx
1464	jnz		innerl6
1465
1466	movl	28(%ebp), %eax
1467	subl	40(%ebp), %eax
1468	shll	$1, %eax
1469	addl	%eax, %esi
1470
1471	movl	12(%ebp), %ebx
1472	subl	40(%ebp), %ebx
1473	shll	$1, %ebx
1474	addl	%ebx, %edi
1475
1476	popl	%edx
1477	decl	%edx
1478	jnz		outerl6
1479
14804:
1481	popl	%esi
1482	popl	%edi
1483	DelStack
1484	ret
1485
1486.globl Gfx_SetClipRgn
1487Gfx_SetClipRgn:
1488	CrtStack
1489
1490	movl	8(%ebp), %eax
1491	movl	%eax, clp_lx 		//left x
1492	movl	12(%ebp), %eax
1493	movl	%eax, clp_ty 		//top y
1494	movl	8(%ebp), %eax
1495	addl	16(%ebp), %eax
1496	subl	$1, %eax
1497	movl	%eax, clp_rx		//right x
1498	movl	12(%ebp), %eax
1499	addl	20(%ebp), %eax
1500	subl	$1, %eax
1501	movl	%eax, clp_by		//bottom y
1502
1503	DelStack
1504	ret
1505