1 /******************************************************************************
2 *
3 * Copyright (C) 2006, The Gentee Group. All rights reserved.
4 * This file is part of the Gentee open source project - http://www.gentee.com.
5 *
6 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE GENTEE LICENSE ("AGREEMENT").
7 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE CONSTITUTES RECIPIENTS
8 * ACCEPTANCE OF THE AGREEMENT.
9 *
10 * ID: vrun 18.10.06 0.0.A.
11 *
12 * Author: Alexey Krivonogov ( gentee )
13 *
14 * Summary: Execute the function.
15 *
16 ******************************************************************************/
17
18 #ifndef _VMRUN_
19 #define _VMRUN_
20
21 #ifdef __cplusplus
22 extern "C" {
23 #endif // __cplusplus
24
25 #include "vm.h"
26
27 #pragma pack(push, 1)
28 // Структура для хранения состояния вызовов функций (команд)
29 typedef struct
30 {
31 puint start; // Смещение начала стэка функции. стэк функции начинается
32 // с параметров и после окончания работы там должен быть
33 // возвращаемый элемент
34 puint cmd; // указатель на текущую команду в теле функции
35 puint top; // указатель на вершину стэка - первый свободный элемент
36 uint uiret; // Сколько возвращает dword
37 pvmfunc func; // Текущая функция виртуальной машины
38 puint clmark; // Метка до которой очищается стэк. Обычно равна start + predesc
39 // Отличается от этого значения у локальных функций.
40 uint nline; // The latest line in debug mode
41 } stackpos, * pstackpos;
42 #pragma pack(pop)
43
44 // Тип стэковой функции
45 typedef void ( STDCALL* stackfunc )( pstackpos );
46
47
48 #define BCODE(x) (( povmbcode )x->func)
49
50 //--------------------------------------------------------------------------
51
52 void STDCALL pseudo_i( pstackpos curpos );
53 void STDCALL pseudo_ul( pstackpos curpos );
54 void STDCALL pseudo_pul( pstackpos curpos );
55 void STDCALL pseudo_l( pstackpos curpos );
56 void STDCALL pseudo_pl( pstackpos curpos );
57 void STDCALL pseudo_f( pstackpos curpos );
58 void STDCALL pseudo_pf( pstackpos curpos );
59 void STDCALL pseudo_d( pstackpos curpos );
60 void STDCALL pseudo_pd( pstackpos curpos );
61 void STDCALL pseudo_ui( pstackpos curpos );
62 void STDCALL pseudo_collectadd( pstackpos curpos );
63 uint STDCALL vm_run( uint id, puint params, puint result, uint stacksize );
64 uint STDCALL vm_runone( uint id, uint first );
65 uint STDCALL vm_runtwo( uint id, uint first, uint second );
66 uint STDCALL vm_calladdr( void );
67
68 #ifdef __cplusplus
69 }
70 #endif // __cplusplus
71
72 #endif // _VMRUN_
73
74
Редактировать