MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 1
 
Copyright (C) 1983-90 MetaWare Incorporated.  Serial 1-999999.
Target: Intel 80386/486
Scanner C_lexicon(18-Jan-90 18:27:04)
Parser  C_phrase_structure(07-Nov-90 09:25:08)
=====>  Profile j:\c\inc/hc.pro included in this compilation.
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 2
 
Addr  Object                    Source Program and Assembly Listing
                                	extrn	_egbwork,scrmode,debugmsg,EGB_getPalette
                                	extrn	EGB_palette,sprintf,msgout,calloc
                                plt16	segment 'CODE'
0000                            	mod4   0
                                ;/*
                                ;	ARTemis (Graphic Editor for FM-TOWNS)
                                ;	(c) MATSUUCHI Ryosuke 1992
                                ;	plt16.c
                                ;    このモジュールは、16色モードにおいてパレットどうしの混色や
                                ;    近似パレット検索を行うときの処理のためのものです。
                                ;*/
                                ;#include <stdio.h>
                                ;#include <malloc.h>
                                ;#include <egb.h>
                                ;#include "ge.h"
                                ;#include "plt.h"
                                ;//     (local) 指定したパレット番号のパレットを得る
                                ;//-----------------------------------------------------------------------
                                ;static _GRB _getplt(int plt)
0000                            .L0000:
                                _getplt	proc   near
0000  55                        	push   ebp
0001  8b ec                     	mov    ebp,esp
0003  81 ec 00000084            	sub    esp,132
0009  57                        	push   edi
                                ;{
000a  8b 7d 08                  	mov    edi,8[ebp]
                                ;	unsigned char pal_[4+8*16];
                                ;	EGB_getPalette(1,(char *)pal_);
000d  8d 85 ffffff7c            	lea    eax,-132[ebp]
0013  50                        	push   eax
0014  6a 01                     	push   1
0016  e8 --------e              	call   EGB_getPalette
                                ;	return	(int)((pal_[4+8*plt+4+2]>>4)&15)*256 +
001b  0f b6 44 fd 86            	movzbl eax,-122[ebp+edi*8]
0020  c1 f8 04                  	sar    eax,4
0023  25 0000000f               	and    eax,15
0028  c1 e0 08                  	shl    eax,8
002b  0f b6 54 fd 85            	movzbl edx,-123[ebp+edi*8]
0030  c1 fa 04                  	sar    edx,4
0033  81 e2 0000000f            	and    edx,15
0039  c1 e2 04                  	shl    edx,4
003c  03 d0                     	add    edx,eax
003e  0f b6 44 fd 84            	movzbl eax,-124[ebp+edi*8]
0043  c1 f8 04                  	sar    eax,4
0046  25 0000000f               	and    eax,15
004b  03 c2                     	add    eax,edx
004d  83 c4 08                  	add    esp,8
                                ;			(int)((pal_[4+8*plt+4+1]>>4)&15)* 16 +
                                ;			(int)((pal_[4+8*plt+4  ]>>4)&15);
                                ;}
0050  5f                        	pop    edi
0051  c9                        	leave
0052  c3                        	rets
                                _getplt	endp
0053  90                        	mod4   0
                                ;//     (local) 指定したパレット番号のパレットを設定する
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 3
 
Addr  Object                    Source Program and Assembly Listing
                                ;//-----------------------------------------------------------------------
                                ;static void _setplt(int plt, _GRB grb)
0054                            .L0054:
                                _setplt	proc   near
0054  55                        	push   ebp
0055  8b ec                     	mov    ebp,esp
0057  81 ec 00000084            	sub    esp,132
005d  57                        	push   edi
                                ;{
005e  8b 7d 0c                  	mov    edi,12[ebp]
                                ;	char pal_[4+8*16];
                                ;	DWORD(pal_ + 0) = 1;
0061  c7 85 ffffff7c 00000001   	mov    dword ptr -132[ebp],1
                                ;	DWORD(pal_ + 4) = plt;
006b  8b 45 08                  	mov    eax,8[ebp]
006e  89 45 80                  	mov    -128[ebp],eax
                                ;	BYTE (pal_ + 8) = (grb&15) << 4;
0071  8b c7                     	mov    eax,edi
0073  25 0000000f               	and    eax,15
0078  c0 e0 04                  	shl    al,4
007b  88 45 84                  	mov    -124[ebp],al
                                ;	BYTE (pal_ + 9) = ((grb>>4)&15)<<4;
007e  8b c7                     	mov    eax,edi
0080  c1 f8 04                  	sar    eax,4
0083  25 0000000f               	and    eax,15
0088  c0 e0 04                  	shl    al,4
008b  88 45 85                  	mov    -123[ebp],al
                                ;	BYTE (pal_ +10) = ((grb>>8)&15)<<4;
008e  8b c7                     	mov    eax,edi
0090  c1 f8 08                  	sar    eax,8
0093  25 0000000f               	and    eax,15
0098  c0 e0 04                  	shl    al,4
009b  88 45 86                  	mov    -122[ebp],al
                                ;	BYTE (pal_ +11) = 0;
009e  2b c0                     	sub    eax,eax
00a0  88 45 87                  	mov    -121[ebp],al
                                ;	EGB_palette(_egbwork,0,pal_);
00a3  8d 95 ffffff7c            	lea    edx,-132[ebp]
00a9  52                        	push   edx
00aa  50                        	push   eax
00ab  68 00000000e              	push   offset _egbwork
00b0  e8 --------e              	call   EGB_palette
00b5  83 c4 0c                  	add    esp,12
                                ;}
00b8  5f                        	pop    edi
00b9  c9                        	leave
00ba  c3                        	rets
                                _setplt	endp
00bb  90                        	mod4   0
                                ;//     (local) _GRB カラーどうしの「相違度(difference)」を計算する
                                ;//-----------------------------------------------------------------------
                                ;static int _coldiff(_GRB grb1, _GRB grb2)
00bc                            .L00bc:
                                _coldiff	proc   near
00bc  55                        	push   ebp
00bd  8b ec                     	mov    ebp,esp
00bf  56                        	push   esi
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 4
 
Addr  Object                    Source Program and Assembly Listing
00c0  57                        	push   edi
                                ;{
00c1  8b 7d 08                  	mov    edi,8[ebp]
                                ;	int t,r;
                                ;	r = 0;
00c4  2b c9                     	sub    ecx,ecx
                                ;	t = (int)((grb1>>8)&15)-(int)((grb2>>8)&15);
00c6  8b 45 0c                  	mov    eax,12[ebp]
00c9  c1 f8 08                  	sar    eax,8
00cc  25 0000000f               	and    eax,15
00d1  8b f7                     	mov    esi,edi
00d3  c1 fe 08                  	sar    esi,8
00d6  81 e6 0000000f            	and    esi,15
00dc  2b f0                     	sub    esi,eax
                                ;	r += t*t;
00de  8b c6                     	mov    eax,esi
00e0  f7 e0                     	mul    eax
00e2  03 c8                     	add    ecx,eax
                                ;	t = (int)((grb1>>4)&15)-(int)((grb2>>4)&15);
00e4  8b 45 0c                  	mov    eax,12[ebp]
00e7  c1 f8 04                  	sar    eax,4
00ea  25 0000000f               	and    eax,15
00ef  8b f7                     	mov    esi,edi
00f1  c1 fe 04                  	sar    esi,4
00f4  81 e6 0000000f            	and    esi,15
00fa  2b f0                     	sub    esi,eax
                                ;	r += t*t;
00fc  8b c6                     	mov    eax,esi
00fe  f7 e0                     	mul    eax
0100  03 c8                     	add    ecx,eax
                                ;	t = (int)(grb1&15)-(int)(grb2&15);
0102  8b 45 0c                  	mov    eax,12[ebp]
0105  25 0000000f               	and    eax,15
010a  8b f7                     	mov    esi,edi
010c  81 e6 0000000f            	and    esi,15
0112  2b f0                     	sub    esi,eax
                                ;	r += t*t;
0114  8b c6                     	mov    eax,esi
0116  f7 e0                     	mul    eax
0118  03 c8                     	add    ecx,eax
                                ;	return r;
011a  8b c1                     	mov    eax,ecx
                                ;}
011c  5f                        	pop    edi
011d  5e                        	pop    esi
011e  c9                        	leave
011f  c3                        	rets
                                _coldiff	endp
0120                            	mod4   0
                                ;//     (local) 近似パレットリストのための型定義・変数定義
                                ;//-----------------------------------------------------------------------
                                ;typedef struct _nearplt_e {		// 近似パレットリストの１要素(NEARPLTの補助)
                                ;	struct _nearplt_e *next;
                                ;	bool	used;
                                ;	char	plt;
                                ;	int		dist;
                                ;} NEARPLTe;
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 5
 
Addr  Object                    Source Program and Assembly Listing
                                ;typedef	struct {				// ある _GRB カラーに対する近似パレットリスト
                                ;	NEARPLTe	*neartop;
                                ;	NEARPLTe	near[16];
                                ;} NEARPLT;
                                ;static	NEARPLT	*nearplt;	// 全 _GRB カラーに対する近似パレットリスト
                                ;static	_GRB	pltgrb[16];	// 各パレットの現在の設定状態
                                ;//     (local) 近似パレットリストへの要素の挿入
                                ;//-----------------------------------------------------------------------
                                ;static void NEARPLT_ins(_GRB grb, int plt)
0120                            .L0120:
                                NEARPLT_ins	proc   near
0120  55                        	push   ebp
0121  8b ec                     	mov    ebp,esp
0123  83 ec 10                  	sub    esp,16
0126  53                        	push   ebx
0127  56                        	push   esi
0128  57                        	push   edi
                                ;// ［_GRBカラー grb に対する近似パレットリストに、plt 番のパレットを挿入する］
                                ;//		この関数は、_GRBカラー grb に対する近似パレットリストに plt 番の
                                ;//		パレットがまだ登録されていない状態で呼ばなくてはいけない。
                                ;{
                                ;	NEARPLT *nplt;
                                ;	int dist;
                                ;	nplt = nearplt + grb;
0129  8b 45 08                  	mov    eax,8[ebp]
012c  8d 04 85 00000000         	lea    eax,[eax*4]
0133  8d 14 80                  	lea    edx,[eax+eax*4]
0136  8d 14 d0                  	lea    edx,[eax+edx*8]
0139  03 15 00000000r           	add    edx,@plt16
013f  89 55 fc                  	mov    -4[ebp],edx
                                ;	dist = _coldiff(grb, pltgrb[plt]);
0142  8b 45 0c                  	mov    eax,12[ebp]
0145  ff 34 85 00000004r        	push   dword ptr @plt16+4[eax*4]
014c  ff 75 08                  	push   dword ptr 8[ebp]
014f  8b da                     	mov    ebx,edx
0151  e8 ffffff66               	call   00bc
0156  89 45 f8                  	mov    -8[ebp],eax
0159  83 c4 08                  	add    esp,8
                                ;	if (nplt->neartop == NULL) {
015c  83 3b 00                  	cmp    dword ptr [ebx],0
015f  75 1d                     	jne    017e
                                ;		NEARPLTe *p;
                                ;		p = &(nplt->near[0]);
0161  8d 7b 04                  	lea    edi,4[ebx]
                                ;		p->next = NULL;
0164  c7 07 00000000            	mov    dword ptr [edi],0
                                ;		p->used = YES;
016a  c6 47 04 01               	mov    byte ptr 4[edi],1
                                ;		p->plt = plt;
016e  8a 55 0c                  	mov    dl,12[ebp]
0171  88 57 05                  	mov    5[edi],dl
                                ;		p->dist = dist;
0174  89 47 06                  	mov    6[edi],eax
                                ;		nplt->neartop = p;
0177  89 3b                     	mov    [ebx],edi
0179  e9 000000c7               	jmp    0245
                                ;	} else {
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 6
 
Addr  Object                    Source Program and Assembly Listing
                                ;		NEARPLTe *p1,*p2,*p;
                                ;		bool done;
                                ;		int i;
                                ;		done = NO;
017e                            .L017e:
017e  2b c0                     	sub    eax,eax
0180  88 45 f3                  	mov    -13[ebp],al
                                ;		for (p1=nplt->neartop,p2=NULL;  p1!=NULL;  p2=p1,p1=p1->next) {
0183  8b 55 fc                  	mov    edx,-4[ebp]
0186  8b 3a                     	mov    edi,[edx]
0188  89 45 f4                  	mov    -12[ebp],eax
018b                            .L018b:
018b  23 ff                     	and    edi,edi
018d  74 64                     	je     01f3
                                ;			if (dist < p1->dist) {
018f  8b 45 f8                  	mov    eax,-8[ebp]
0192  3b 47 06                  	cmp    eax,6[edi]
0195  7d 55                     	jnl    01ec
                                ;				done = YES;
0197  c6 45 f3 01               	mov    byte ptr -13[ebp],1
                                ;				for (i=0; i<16; i++)
019b  2b db                     	sub    ebx,ebx
019d                            .L019d:
019d  83 fb 10                  	cmp    ebx,16
01a0  7d 12                     	jnl    01b4
                                ;					if (! nplt->near[i].used)	break;
01a2  8d 04 9b                  	lea    eax,[ebx+ebx*4]
01a5  03 c0                     	add    eax,eax
01a7  8b 55 fc                  	mov    edx,-4[ebp]
01aa  80 7c 02 08 00            	cmp    byte ptr 8[edx+eax],0
01af  74 03                     	je     01b4
01b1  43                        	inc    ebx
01b2  eb e9                     	jmp    019d
                                ;				if (i==16)
01b4                            .L01b4:
01b4  83 fb 10                  	cmp    ebx,16
01b7  0f 84 00000088            	je     0245
                                ;					return;
                                ;				p = &(nplt->near[i]);
01bd  8d 04 9b                  	lea    eax,[ebx+ebx*4]
01c0  03 c0                     	add    eax,eax
01c2  8b 55 fc                  	mov    edx,-4[ebp]
01c5  8d 74 02 04               	lea    esi,4[edx+eax]
                                ;				p->used = YES;
01c9  c6 46 04 01               	mov    byte ptr 4[esi],1
                                ;				p->next = p1;
01cd  89 3e                     	mov    [esi],edi
                                ;				p->plt = plt;
01cf  8a 45 0c                  	mov    al,12[ebp]
01d2  88 46 05                  	mov    5[esi],al
                                ;				p->dist = dist;
01d5  8b 45 f8                  	mov    eax,-8[ebp]
01d8  89 46 06                  	mov    6[esi],eax
                                ;				if (p2 == NULL)
01db  83 7d f4 00               	cmp    dword ptr -12[ebp],0
01df  75 04                     	jne    01e5
                                ;					nplt->neartop = p;
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 7
 
Addr  Object                    Source Program and Assembly Listing
01e1  89 32                     	mov    [edx],esi
01e3  eb 0e                     	jmp    01f3
                                ;				else
                                ;					p2->next = p;
01e5                            .L01e5:
01e5  8b 45 f4                  	mov    eax,-12[ebp]
01e8  89 30                     	mov    [eax],esi
                                ;				break;
01ea  eb 07                     	jmp    01f3
01ec                            .L01ec:
01ec  89 7d f4                  	mov    -12[ebp],edi
01ef  8b 3f                     	mov    edi,[edi]
01f1  eb 98                     	jmp    018b
                                ;			}
                                ;		}
                                ;		if (!done) {
01f3                            .L01f3:
01f3  80 7d f3 00               	cmp    byte ptr -13[ebp],0
01f7  75 4c                     	jne    0245
                                ;			for (i=0; i<16; i++)
01f9  2b db                     	sub    ebx,ebx
01fb                            .L01fb:
01fb  83 fb 10                  	cmp    ebx,16
01fe  7d 12                     	jnl    0212
                                ;				if (! nplt->near[i].used)	break;
0200  8d 04 9b                  	lea    eax,[ebx+ebx*4]
0203  03 c0                     	add    eax,eax
0205  8b 55 fc                  	mov    edx,-4[ebp]
0208  80 7c 02 08 00            	cmp    byte ptr 8[edx+eax],0
020d  74 03                     	je     0212
020f  43                        	inc    ebx
0210  eb e9                     	jmp    01fb
                                ;			if (i==16)
0212                            .L0212:
0212  83 fb 10                  	cmp    ebx,16
0215  74 2e                     	je     0245
                                ;				return;
                                ;			p = &(nplt->near[i]);
0217  8d 04 9b                  	lea    eax,[ebx+ebx*4]
021a  03 c0                     	add    eax,eax
021c  8b 55 fc                  	mov    edx,-4[ebp]
021f  8d 74 02 04               	lea    esi,4[edx+eax]
                                ;			p->used = YES;
0223  c6 46 04 01               	mov    byte ptr 4[esi],1
                                ;			p->next = NULL;
0227  2b c0                     	sub    eax,eax
0229  89 06                     	mov    [esi],eax
                                ;			p->plt = plt;
022b  8a 4d 0c                  	mov    cl,12[ebp]
022e  88 4e 05                  	mov    5[esi],cl
                                ;			p->dist = dist;
0231  8b 4d f8                  	mov    ecx,-8[ebp]
0234  89 4e 06                  	mov    6[esi],ecx
                                ;			if (p2 == NULL)
0237  3b 45 f4                  	cmp    eax,-12[ebp]
023a  75 04                     	jne    0240
                                ;				nplt->neartop = p;
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 8
 
Addr  Object                    Source Program and Assembly Listing
023c  89 32                     	mov    [edx],esi
023e  eb 05                     	jmp    0245
                                ;			else
                                ;				p2->next = p;
0240                            .L0240:
0240  8b 45 f4                  	mov    eax,-12[ebp]
0243  89 30                     	mov    [eax],esi
                                ;		}
                                ;	}
                                ;}
0245                            .L0245:
0245  5f                        	pop    edi
0246  5e                        	pop    esi
0247  5b                        	pop    ebx
0248  c9                        	leave
0249  c3                        	rets
                                NEARPLT_ins	endp
024a  8bc0                      	mod4   0
                                ;//     (local) 近似パレットリストの要素の削除
                                ;//-----------------------------------------------------------------------
                                ;static void NEARPLT_del(int grb, int plt)
024c                            .L024c:
                                NEARPLT_del	proc   near
024c  55                        	push   ebp
024d  8b ec                     	mov    ebp,esp
024f  56                        	push   esi
0250  57                        	push   edi
                                ;// ［_GRBカラー grb に対する近似パレットリストの中から、
                                ;//   plt番のパレットの要素を削除する］
                                ;//          この関数は、リスト中に見つかった plt 番のパレット要素をすべて
                                ;//			削除する。また、リスト中に plt 番のパレット要素が存在しなくても
                                ;//			問題はない。
                                ;{
                                ;	NEARPLT *nplt;
                                ;	nplt = nearplt + grb;
0251  8b 45 08                  	mov    eax,8[ebp]
0254  8d 04 85 00000000         	lea    eax,[eax*4]
025b  8d 14 80                  	lea    edx,[eax+eax*4]
025e  8d 14 d0                  	lea    edx,[eax+edx*8]
0261  8b fa                     	mov    edi,edx
0263  03 3d 00000000r           	add    edi,@plt16
                                ;	NEARPLTe *p1,*p2;
                                ;	for (p1=nplt->neartop,p2=NULL;  p1!=NULL;  p2=p1,p1=p1->next) {
0269  8b 37                     	mov    esi,[edi]
026b  2b c9                     	sub    ecx,ecx
026d                            .L026d:
026d  23 f6                     	and    esi,esi
026f  74 21                     	je     0292
                                ;		if (p1->plt == plt) {
0271  0f b6 46 05               	movzbl eax,5[esi]
0275  3b 45 0c                  	cmp    eax,12[ebp]
0278  75 12                     	jne    028c
                                ;			if (p2==NULL)
027a  23 c9                     	and    ecx,ecx
027c  75 06                     	jne    0284
                                ;				nplt->neartop = p1->next;
027e  8b 06                     	mov    eax,[esi]
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 9
 
Addr  Object                    Source Program and Assembly Listing
0280  89 07                     	mov    [edi],eax
0282  eb 04                     	jmp    0288
                                ;			else
                                ;				p2->next = p1->next;
0284                            .L0284:
0284  8b 06                     	mov    eax,[esi]
0286  89 01                     	mov    [ecx],eax
                                ;			p1->used = NO;
0288                            .L0288:
0288  c6 46 04 00               	mov    byte ptr 4[esi],0
028c                            .L028c:
028c  8b ce                     	mov    ecx,esi
028e  8b 36                     	mov    esi,[esi]
0290  eb db                     	jmp    026d
                                ;		}
                                ;	}
                                ;}
0292                            .L0292:
0292  5f                        	pop    edi
0293  5e                        	pop    esi
0294  c9                        	leave
0295  c3                        	rets
                                NEARPLT_del	endp
0296  8bc0                      	mod4   0
                                ;//     (global) _GRB カラー 000 に対する近似パレットリストのダンプ出力
                                ;//				（デバッグ用関数）
                                ;//-----------------------------------------------------------------------
                                ;void __dumpNEARPLT0()
0298                            .L0298:
                                	public	__dumpNEARPLT0
                                __dumpNEARPLT0	proc   near
0298  56                        	push   esi
0299  57                        	push   edi
                                ;{
                                ;	if (scrmode == 10)
029a  83 3d 00000000e 0a        	cmp    dword ptr scrmode,10
02a1  74 6e                     	je     0311
                                ;		return;
                                ;	int tc = 0*256+0*16+0;
02a3  2b ff                     	sub    edi,edi
                                ;	sprintf(debugmsg,"nearplt[%03x] dump:",tc);
02a5  57                        	push   edi
02a6  68 00000000r              	push   offset _mwLITERALS
02ab  68 00000000e              	push   offset debugmsg
02b0  e8 --------e              	call   sprintf
                                ;	msgout(debugmsg);
02b5  68 00000000e              	push   offset debugmsg
02ba  e8 --------e              	call   msgout
                                ;	NEARPLTe *p;
                                ;	p = (nearplt+tc)->neartop;
02bf  8d 04 bd 00000000         	lea    eax,[edi*4]
02c6  8d 14 80                  	lea    edx,[eax+eax*4]
02c9  8d 14 d0                  	lea    edx,[eax+edx*8]
02cc  a1 00000000r              	mov    eax,@plt16
02d1  8b 34 10                  	mov    esi,[eax+edx]
02d4  83 c4 10                  	add    esp,16
                                ;	for ( ; p!=NULL; p=p->next) {
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 10
 
Addr  Object                    Source Program and Assembly Listing
02d7                            .L02d7:
02d7  23 f6                     	and    esi,esi
02d9  74 36                     	je     0311
                                ;		sprintf(debugmsg, " %1x[%03x] d%4d", p->plt, plt16_get(p->plt), p->dist);
02db  ff 76 06                  	push   dword ptr 6[esi]
02de  0f b6 46 05               	movzbl eax,5[esi]
02e2  50                        	push   eax
02e3  e8 000000e8               	call   03d0
02e8  83 c4 04                  	add    esp,4
02eb  50                        	push   eax
02ec  0f b6 46 05               	movzbl eax,5[esi]
02f0  50                        	push   eax
02f1  68 00000014r              	push   offset _mwLITERALS+20
02f6  68 00000000e              	push   offset debugmsg
02fb  e8 --------e              	call   sprintf
                                ;		msgout(debugmsg);
0300  68 00000000e              	push   offset debugmsg
0305  e8 --------e              	call   msgout
030a  8b 36                     	mov    esi,[esi]
030c  83 c4 18                  	add    esp,24
030f  eb c6                     	jmp    02d7
                                ;	}
                                ;}
0311                            .L0311:
0311  5f                        	pop    edi
0312  5e                        	pop    esi
0313  c3                        	rets
                                __dumpNEARPLT0	endp
0314                            	mod4   0
                                ;//     (global) 近似パレットリストおよびこのモジュールの初期化
                                ;//-----------------------------------------------------------------------
                                ;int plt16_init()
0314                            .L0314:
                                	public	plt16_init
                                plt16_init	proc   near
0314  56                        	push   esi
0315  57                        	push   edi
                                ;{
                                ;	int i,j;
                                ;	nearplt = calloc(sizeof(NEARPLT), 4096);
0316  68 00001000               	push   4096
031b  68 000000a4               	push   164
0320  e8 --------e              	call   calloc
0325  a3 00000000r              	mov    @plt16,eax
032a  83 c4 08                  	add    esp,8
                                ;	if (nearplt == NULL)
032d  23 c0                     	and    eax,eax
032f  75 07                     	jne    0338
                                ;		return -1;
0331  b8 ffffffff               	mov    eax,-1
0336  eb 42                     	jmp    037a
                                ;	for (i=0; i<16; i++)
0338                            .L0338:
0338  2b ff                     	sub    edi,edi
033a                            .L033a:
033a  83 ff 10                  	cmp    edi,16
033d  7d 13                     	jnl    0352
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 11
 
Addr  Object                    Source Program and Assembly Listing
                                ;		pltgrb[i] = _getplt(i);
033f  57                        	push   edi
0340  e8 fffffcbb               	call   0000
0345  89 04 bd 00000004r        	mov    @plt16+4[edi*4],eax
034c  47                        	inc    edi
034d  83 c4 04                  	add    esp,4
0350  eb e8                     	jmp    033a
                                ;	for (i=0; i<4096; i++)
0352                            .L0352:
0352  2b ff                     	sub    edi,edi
0354                            .L0354:
0354  81 ff 00001000            	cmp    edi,4096
035a  7d 17                     	jnl    0373
                                ;		for (j=0; j<16; j++)
035c  2b f6                     	sub    esi,esi
035e                            .L035e:
035e  83 fe 10                  	cmp    esi,16
0361  7d 0d                     	jnl    0370
                                ;			NEARPLT_ins(i,j);
0363  56                        	push   esi
0364  57                        	push   edi
0365  e8 fffffdb6               	call   0120
036a  46                        	inc    esi
036b  83 c4 08                  	add    esp,8
036e  eb ee                     	jmp    035e
0370                            .L0370:
0370  47                        	inc    edi
0371  eb e1                     	jmp    0354
                                ;	__dumpNEARPLT0();
0373                            .L0373:
0373  e8 ffffff20               	call   0298
                                ;	return 0;
0378  2b c0                     	sub    eax,eax
                                ;}
037a                            .L037a:
037a  5f                        	pop    edi
037b  5e                        	pop    esi
037c  c3                        	rets
                                plt16_init	endp
037d  668bc0                    	mod4   0
                                ;//     (global) 指定したパレット番号に対するパレットの設定
                                ;//-----------------------------------------------------------------------
                                ;void	plt16_set(int plt, _GRB grb)
0380                            .L0380:
                                	public	plt16_set
                                plt16_set	proc   near
0380  55                        	push   ebp
0381  8b ec                     	mov    ebp,esp
0383  53                        	push   ebx
0384  56                        	push   esi
0385  57                        	push   edi
                                ;{
0386  8b 7d 08                  	mov    edi,8[ebp]
0389  8b 75 0c                  	mov    esi,12[ebp]
                                ;	int i;
                                ;	for (i=0; i<4096; i++)
038c  2b db                     	sub    ebx,ebx
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 12
 
Addr  Object                    Source Program and Assembly Listing
038e                            .L038e:
038e  81 fb 00001000            	cmp    ebx,4096
0394  7d 0d                     	jnl    03a3
                                ;		NEARPLT_del(i,plt);
0396  57                        	push   edi
0397  53                        	push   ebx
0398  e8 fffffeaf               	call   024c
039d  43                        	inc    ebx
039e  83 c4 08                  	add    esp,8
03a1  eb eb                     	jmp    038e
                                ;	_setplt(plt, grb);
03a3                            .L03a3:
03a3  56                        	push   esi
03a4  57                        	push   edi
03a5  e8 fffffcaa               	call   0054
                                ;	pltgrb[plt] = grb;
03aa  89 34 bd 00000004r        	mov    @plt16+4[edi*4],esi
                                ;	for (i=0; i<4096; i++)
03b1  2b db                     	sub    ebx,ebx
03b3                            .L03b3:
03b3  83 c4 08                  	add    esp,8
03b6  81 fb 00001000            	cmp    ebx,4096
03bc  7d 0a                     	jnl    03c8
                                ;		NEARPLT_ins(i,plt);
03be  57                        	push   edi
03bf  53                        	push   ebx
03c0  e8 fffffd5b               	call   0120
03c5  43                        	inc    ebx
03c6  eb eb                     	jmp    03b3
                                ;}
03c8                            .L03c8:
03c8  5f                        	pop    edi
03c9  5e                        	pop    esi
03ca  5b                        	pop    ebx
03cb  c9                        	leave
03cc  c3                        	rets
                                plt16_set	endp
03cd  668bc0                    	mod4   0
                                ;//     (global) 指定したパレット番号に対するパレット内容を得る
                                ;//-----------------------------------------------------------------------
                                ;_GRB	plt16_get(int plt)
03d0                            .L03d0:
                                	public	plt16_get
                                plt16_get	proc   near
                                ;{
                                ;	return pltgrb[plt];
03d0  8b 44 24 04               	mov    eax,4[esp]
03d4  8b 04 85 00000004r        	mov    eax,@plt16+4[eax*4]
                                ;}
03db  c3                        	rets
                                plt16_get	endp
03dc                            	mod4   0
                                ;//     (global) 指定した _GRB カラーの近似パレットを得る
                                ;//-----------------------------------------------------------------------
                                ;int		plt16_getnear(_GRB grb, int source_plt, int object_plt)
03dc                            .L03dc:
                                	public	plt16_getnear
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 13
 
Addr  Object                    Source Program and Assembly Listing
                                plt16_getnear	proc   near
03dc  55                        	push   ebp
03dd  8b ec                     	mov    ebp,esp
03df  50                        	push   eax
03e0  53                        	push   ebx
03e1  56                        	push   esi
03e2  57                        	push   edi
                                ;// 指定されたRGBカラーに最も近いパレットを返す
                                ;{
03e3  8b 7d 10                  	mov    edi,16[ebp]
                                ;	NEARPLT *nplt;
                                ;	nplt = nearplt + grb;
03e6  8b 45 08                  	mov    eax,8[ebp]
03e9  8d 04 85 00000000         	lea    eax,[eax*4]
03f0  8d 14 80                  	lea    edx,[eax+eax*4]
03f3  8d 14 d0                  	lea    edx,[eax+edx*8]
03f6  03 15 00000000r           	add    edx,@plt16
03fc  89 55 fc                  	mov    -4[ebp],edx
                                ;	NEARPLTe *p;
                                ;	p = nplt->neartop;
03ff  8b 32                     	mov    esi,[edx]
                                ;	if (p->plt != source_plt)
0401  0f b6 46 05               	movzbl eax,5[esi]
0405  3b 45 0c                  	cmp    eax,12[ebp]
0408  75 5e                     	jne    0468
                                ;		return p->plt;
                                ;	else {	// 「一番近い色」がもとの色と同じ色の場合
                                ;		int distmax = (nearplt+pltgrb[p->plt])->near[object_plt].dist;
040a  0f b6 46 05               	movzbl eax,5[esi]
040e  8b 04 85 00000004r        	mov    eax,@plt16+4[eax*4]
0415  8d 04 85 00000000         	lea    eax,[eax*4]
041c  8d 14 80                  	lea    edx,[eax+eax*4]
041f  8d 14 d0                  	lea    edx,[eax+edx*8]
0422  8d 04 bf                  	lea    eax,[edi+edi*4]
0425  03 c0                     	add    eax,eax
0427  03 c2                     	add    eax,edx
0429  8b 15 00000000r           	mov    edx,@plt16
042f  8b 5c 02 0a               	mov    ebx,10[edx+eax]
                                ;		// distmax = _min(distmax, _coldiff(pltgrb[source_plt], pltgrb[object_plt]));
                                ;		for (p=p->next;  p!=NULL;  p=p->next) {
0433                            .L0433:
0433  8b 36                     	mov    esi,[esi]
0435  23 f6                     	and    esi,esi
0437  74 2d                     	je     0466
                                ;			if ((nearplt+pltgrb[p->plt])->near[object_plt].dist <= distmax)
0439  0f b6 46 05               	movzbl eax,5[esi]
043d  8b 14 85 00000004r        	mov    edx,@plt16+4[eax*4]
0444  8d 14 95 00000000         	lea    edx,[edx*4]
044b  8d 0c 92                  	lea    ecx,[edx+edx*4]
044e  8d 0c ca                  	lea    ecx,[edx+ecx*8]
0451  8d 14 bf                  	lea    edx,[edi+edi*4]
0454  03 d2                     	add    edx,edx
0456  03 d1                     	add    edx,ecx
0458  8b 0d 00000000r           	mov    ecx,@plt16
045e  3b 5c 11 0a               	cmp    ebx,10[ecx+edx]
0462  7d 04                     	jnl    0468
                                ;				return p->plt;
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 14
 
Addr  Object                    Source Program and Assembly Listing
0464  eb cd                     	jmp    0433
                                ;		}
                                ;		return object_plt;
0466                            .L0466:
0466  8b c7                     	mov    eax,edi
                                ;	}
                                ;}
0468                            .L0468:
0468  5f                        	pop    edi
0469  5e                        	pop    esi
046a  5b                        	pop    ebx
046b  c9                        	leave
046c  c3                        	rets
                                plt16_getnear	endp
046d  668bc0                    	mod4   0
                                ;//     (global) 指定した２つの _GRB カラーを混ぜ合わせる
                                ;//-----------------------------------------------------------------------
                                ;_GRB	plt16_gray(_GRB grb1, _GRB grb2, int gray)
0470                            .L0470:
                                	public	plt16_gray
                                plt16_gray	proc   near
0470  55                        	push   ebp
0471  8b ec                     	mov    ebp,esp
0473  83 ec 24                  	sub    esp,36
0476  53                        	push   ebx
0477  56                        	push   esi
0478  57                        	push   edi
                                ;// gray : 0..256（grb2の「強さ」）
                                ;{
0479  8b 7d 08                  	mov    edi,8[ebp]
047c  8b 75 10                  	mov    esi,16[ebp]
                                ;	if (gray == 0)
047f  23 f6                     	and    esi,esi
0481  75 07                     	jne    048a
                                ;		return grb1;
0483  8b c7                     	mov    eax,edi
0485  e9 000000e2               	jmp    056c
                                ;	else if (gray == 256)
048a                            .L048a:
048a  81 fe 00000100            	cmp    esi,256
0490  75 08                     	jne    049a
                                ;		return grb2;
0492  8b 45 0c                  	mov    eax,12[ebp]
0495  e9 000000d2               	jmp    056c
                                ;	else {
                                ;		gray = _min(256,_max(gray,0));
049a                            .L049a:
049a  2b c0                     	sub    eax,eax
049c  3b c6                     	cmp    eax,esi
049e  7c 01                     	jl     04a1
04a0  96                        	xchg   eax,esi
04a1                            .L04a1:
04a1  b8 00000100               	mov    eax,256
04a6  3b f0                     	cmp    esi,eax
04a8  7c 02                     	jl     04ac
04aa  8b f0                     	mov    esi,eax
                                ;		int gg,r1,r2,g1,g2,b1,b2,r,g,b;
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 15
 
Addr  Object                    Source Program and Assembly Listing
                                ;		gg = 256-gray;
04ac                            .L04ac:
04ac  8b d8                     	mov    ebx,eax
04ae  2b de                     	sub    ebx,esi
                                ;		g1 = (grb1>>8)&15;
04b0  8b d7                     	mov    edx,edi
04b2  c1 fa 08                  	sar    edx,8
04b5  81 e2 0000000f            	and    edx,15
04bb  89 55 f4                  	mov    -12[ebp],edx
                                ;		r1 = (grb1>>4)&15;
04be  8b c7                     	mov    eax,edi
04c0  c1 f8 04                  	sar    eax,4
04c3  25 0000000f               	and    eax,15
04c8  89 45 fc                  	mov    -4[ebp],eax
                                ;		b1 =  grb1 & 15;
04cb  8b cf                     	mov    ecx,edi
04cd  81 e1 0000000f            	and    ecx,15
04d3  89 4d ec                  	mov    -20[ebp],ecx
                                ;		g2 = (grb2>>8)&15;
04d6  8b 45 0c                  	mov    eax,12[ebp]
04d9  c1 f8 08                  	sar    eax,8
04dc  25 0000000f               	and    eax,15
04e1  89 45 f0                  	mov    -16[ebp],eax
                                ;		r2 = (grb2>>4)&15;
04e4  8b 45 0c                  	mov    eax,12[ebp]
04e7  c1 f8 04                  	sar    eax,4
04ea  25 0000000f               	and    eax,15
04ef  89 45 f8                  	mov    -8[ebp],eax
                                ;		b2 =  grb2 & 15;
04f2  8b 45 0c                  	mov    eax,12[ebp]
04f5  25 0000000f               	and    eax,15
04fa  89 45 e8                  	mov    -24[ebp],eax
                                ;		g = (gg*g1 + gray*g2 + 128) / 256;
04fd  0f af d3                  	imul   edx,ebx
0500  8b c6                     	mov    eax,esi
0502  0f af 45 f0               	imul   eax,-16[ebp]
0506  03 c2                     	add    eax,edx
0508  05 00000080               	add    eax,128
050d  99                        	cwd
050e  b9 00000100               	mov    ecx,256
0513  f7 f9                     	idiv   ecx
0515  89 45 e0                  	mov    -32[ebp],eax
                                ;		r = (gg*r1 + gray*r2 + 128) / 256;
0518  8b d3                     	mov    edx,ebx
051a  0f af 55 fc               	imul   edx,-4[ebp]
051e  8b ce                     	mov    ecx,esi
0520  0f af 4d f8               	imul   ecx,-8[ebp]
0524  03 ca                     	add    ecx,edx
0526  81 c1 00000080            	add    ecx,128
052c  91                        	xchg   eax,ecx
052d  99                        	cwd
052e  b9 00000100               	mov    ecx,256
0533  f7 f9                     	idiv   ecx
0535  89 45 e4                  	mov    -28[ebp],eax
                                ;		b = (gg*b1 + gray*b2 + 128) / 256;
0538  8b d3                     	mov    edx,ebx
053a  0f af 55 ec               	imul   edx,-20[ebp]
MetaWare High C Compiler 1.7  22-Dec-92 09:16:10   plt16.c            Page 16
 
Addr  Object                    Source Program and Assembly Listing
053e  8b ce                     	mov    ecx,esi
0540  0f af 4d e8               	imul   ecx,-24[ebp]
0544  03 ca                     	add    ecx,edx
0546  81 c1 00000080            	add    ecx,128
054c  91                        	xchg   eax,ecx
054d  99                        	cwd
054e  b9 00000100               	mov    ecx,256
0553  f7 f9                     	idiv   ecx
0555  89 45 dc                  	mov    -36[ebp],eax
                                ;		return (g<<8)|(r<<4)|b;
0558  8b 55 e0                  	mov    edx,-32[ebp]
055b  c1 e2 08                  	shl    edx,8
055e  8b 45 e4                  	mov    eax,-28[ebp]
0561  c1 e0 04                  	shl    eax,4
0564  0b c2                     	or     eax,edx
0566  8b 55 dc                  	mov    edx,-36[ebp]
0569  0b d0                     	or     edx,eax
056b  92                        	xchg   eax,edx
                                ;	}
                                ;}
056c                            .L056c:
056c  5f                        	pop    edi
056d  5e                        	pop    esi
056e  5b                        	pop    ebx
056f  c9                        	leave
0570  c3                        	rets
                                plt16_gray	endp
                                plt16	ends
                                _mwLITERALS	segment public 'DATA'
0000  6e656172706c745b25303378  	db      'nearplt[%03x'
000c  5d2064756d703a            	db      '] dump:'
0013  00                        	db	0
0014  202531785b253033785d2064  	db      ' %1x[%03x] d'
0020  253464                    	db      '%4d'
0023  00                        	db	0
0024                            _mwLITERALS	ends
                                ;/* end of plt16.c */
No user errors   No warnings
End of processing, 22-Dec-92 09:16:23              plt16.c
