Subversion Repositories Kolibri OS

Rev

Rev 7745 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7844 pavelyakov 1
/*
2
	STDCALL function
3
	Author: PaulCodeman
4
*/
7564 pavelyakov 5
 
7844 pavelyakov 6
void initFunctionLisp()
7
{
8
	set_procedure("TEST",  #lisp_test);
9
	set_procedure("SLEEP", #lisp_sleep);
10
	set_procedure("PRINT", #lisp_print);
11
	set_procedure("INPUT", #lisp_input);
12
	set_procedure("STDCALL", #lisp_stdcall);
13
	set_procedure("SETQ",   #lisp_setq);
14
	set_procedure("DEFVAR", #lisp_setq);
15
	set_procedure("+",     #lisp_add);
16
	set_procedure("-",     #lisp_sub);
17
	set_procedure("=",     #lisp_cmp);
18
}
7745 pavelyakov 19
 
7844 pavelyakov 20
dword lisp_test(dword args)
7567 pavelyakov 21
{
7844 pavelyakov 22
	malloc(sizeStruct);
23
	DSDWORD[EAX] = TString;
24
	DSDWORD[EAX+4] = "ZZZ";
25
	return EAX;
7567 pavelyakov 26
}
27
 
7844 pavelyakov 28
dword lisp_setq(dword args)
7564 pavelyakov 29
{
7844 pavelyakov 30
	dword i = 0;
7564 pavelyakov 31
	dword name = 0;
7844 pavelyakov 32
	dword data = 0;
33
	while(1)
7564 pavelyakov 34
	{
7844 pavelyakov 35
		i++;
36
		data = indexArray(args, i);
37
		data = DSDWORD[data];
38
		IF (!data) break;
39
 
40
		if (i&1)
7744 pavelyakov 41
		{
7844 pavelyakov 42
			name = DSDWORD[data+4];
7744 pavelyakov 43
		}
7844 pavelyakov 44
		else
45
		{
46
			set_variable(name, data);
47
		}
7564 pavelyakov 48
	}
7844 pavelyakov 49
	return 0;
7564 pavelyakov 50
}
51
 
7844 pavelyakov 52
dword lisp_print(dword args)
7564 pavelyakov 53
{
7844 pavelyakov 54
	dword i = 0;
55
	consoleInit();
56
	while(1)
7744 pavelyakov 57
	{
7844 pavelyakov 58
		i++;
59
		indexArray(args, i);
60
		IF (!DSDWORD[EAX]) break;
61
		con_printf stdcall (string(DSDWORD[EAX]));
7744 pavelyakov 62
	}
7844 pavelyakov 63
	con_printf stdcall ("\r\n");
64
	return 0;
7564 pavelyakov 65
}
66
 
7844 pavelyakov 67
dword lisp_stdcall(dword args)
7563 pavelyakov 68
{
7844 pavelyakov 69
	dword i = 0;
70
	dword buffer = 0;
71
	while(1)
7562 pavelyakov 72
	{
7844 pavelyakov 73
		i++;
74
		indexArray(args, i);
75
		buffer = DSDWORD[EAX];
76
		IF (!buffer) break;
77
		$push DSDWORD[buffer+4];
7562 pavelyakov 78
	}
7844 pavelyakov 79
	IF (i == 2) $pop eax
80
	IF (i == 3) $pop ebx
81
	IF (i == 4) $pop ecx
82
	$int 0x40
83
	return EAX;
7563 pavelyakov 84
}
85
 
7844 pavelyakov 86
dword lisp_input(dword args)
7745 pavelyakov 87
{
7844 pavelyakov 88
	dword buffer = 0;
89
	consoleInit();
90
	buffer = malloc(100);
91
	con_gets stdcall(buffer, 100);
92
	malloc(sizeStruct);
93
	DSDWORD[EAX] = TString;
94
	DSDWORD[EAX+4] = buffer;
95
	return EAX;
7745 pavelyakov 96
}
97
 
7844 pavelyakov 98
dword lisp_inc(dword args)
7563 pavelyakov 99
{
7844 pavelyakov 100
	dword i = 0;
101
	dword sum = 0;
102
	dword buffer = 0;
103
	while(1)
7562 pavelyakov 104
	{
7844 pavelyakov 105
		i++;
106
		buffer = indexArray(args, i);
107
		IF (!DSDWORD[buffer]) break;
108
		buffer = DSDWORD[buffer];
7565 pavelyakov 109
	}
7844 pavelyakov 110
	return 0;
7565 pavelyakov 111
}
112
 
7844 pavelyakov 113
dword lisp_add(dword args)
7745 pavelyakov 114
{
7844 pavelyakov 115
	dword i = 0;
116
	dword sum = 0;
117
	dword buffer = 0;
118
	while(1)
7745 pavelyakov 119
	{
7844 pavelyakov 120
		i++;
121
		buffer = indexArray(args, i);
122
		IF (!DSDWORD[buffer]) break;
123
		buffer = DSDWORD[buffer];
124
 
125
		sum += number(buffer);
7745 pavelyakov 126
	}
7844 pavelyakov 127
	malloc(sizeStruct);
128
	DSDWORD[EAX] = TNumber;
129
	DSDWORD[EAX+4] = sum;
130
	return EAX;
7745 pavelyakov 131
}
132
 
7844 pavelyakov 133
dword lisp_sub(dword args)
7565 pavelyakov 134
{
7844 pavelyakov 135
	dword i = 0;
136
	dword sum = 0;
137
	while(1)
7565 pavelyakov 138
	{
7844 pavelyakov 139
		i++;
140
		indexArray(args, i);
141
		IF (!DSDWORD[EAX]) break;
142
		sum -= number(DSDWORD[EAX]);
7562 pavelyakov 143
	}
7844 pavelyakov 144
	malloc(sizeStruct);
145
	DSDWORD[EAX] = TNumber;
146
	DSDWORD[EAX+4] = sum;
147
	return EAX;
7563 pavelyakov 148
}
149
 
7844 pavelyakov 150
dword lisp_cmp(dword args)
7565 pavelyakov 151
{
7844 pavelyakov 152
	dword i = 0;
153
	dword first = 0;
154
	dword buffer = 0;
155
 
156
	while(1)
7565 pavelyakov 157
	{
7844 pavelyakov 158
		i++;
159
		buffer = indexArray(args, i);
160
		buffer = DSDWORD[buffer];
161
		IF (!buffer) break;
162
		if (i == 1)
7744 pavelyakov 163
		{
7844 pavelyakov 164
			first = buffer;
7744 pavelyakov 165
		}
7844 pavelyakov 166
		else
7744 pavelyakov 167
		{
7844 pavelyakov 168
			if (DSDWORD[first+4] != DSDWORD[buffer+4])
169
			{
170
				malloc(sizeStruct);
171
				DSDWORD[EAX] = TSymbol;
172
				DSDWORD[EAX+4] = NIL;
173
				return EAX;
174
			}
7744 pavelyakov 175
		}
176
	}
7844 pavelyakov 177
	if (i == 1) error_message("*** - EVAL: too few arguments given to =: (=)");
178
	malloc(sizeStruct);
179
	DSDWORD[EAX] = TSymbol;
180
	DSDWORD[EAX+4] = "T";
181
	return EAX;
7744 pavelyakov 182
}
183
 
7844 pavelyakov 184
dword lisp_sleep(dword args)
7744 pavelyakov 185
{
7844 pavelyakov 186
	dword time = 0;
187
	indexArray(args, 1);
188
	time = number(DSDWORD[EAX]);
189
	EAX = 5;
190
	EBX = time;
191
	$int 0x40
192
	return 0;
7565 pavelyakov 193
}