include 'D:/kos.git/kolibrios/programs/macros.inc' ; ÀÄÐÅÑÀÖÈß ÎÁÚÅÊÒÀ ; 2 byte 6+ byte ; \ - | - TYPE_DEFAULT_ADDR - | - page_index(0) - | - (index_h shl 24) + index_w - table_object or ext version ; | | | - (index_h shl 24) + index_w - table_object or ext version ; | | | - (index_h shl 24) + index_w - table_object or ext version ; | | | - (index_h shl 24) + index_w - table_object or ext version ; | | ; | | - page_index(1) - | - (index_h shl 24) + index_w - table_object or ext version ; | | - (index_h shl 24) + index_w - table_object or ext version ; | | - (index_h shl 24) + index_w - table_object or ext version ; | | - (index_h shl 24) + index_w - table_object or ext version ; | ; | - TYPE_EXT_ADDR - | - page_index(0) - | - (index_h shl 24) + index_w, length, name - table_object or ext version ; | | - (index_h shl 24) + index_w, length, name - table_object or ext version ; | | - (index_h shl 24) + index_w, length, name - table_object or ext version ; | | - (index_h shl 24) + index_w, length, name - table_object or ext version ; | ; | - TYPE_DEFAULT_VALUE - | - page_index(0) ; ; 4 bits 2 bits 10 bit ; type = (dir_index shl 12) + (Type_value shl 10) + page_index ; MAX_PAGE_INDEX = not -(1 shl 10) ; 1023 DIR_INDEX_TDATA = 1 DIR_INDEX_TFORMAT = 2 DIR_INDEX_RESULT = 3 ; Èñïîëüçóåòñÿ äëÿ õðàíåíèÿ ðåçóäüòàòîâ ôîðìóë ; ÑÒÐÓÊÒÓÐÀ ÎÁÚÅÊÒÀ TYPE_OBJECT_NULL = 0 TYPE_OBJECT_STR = 1 ; utf-8 TYPE_OBJECT_NUMBER = 2 ; double TYPE_OBJECT_TIME = 3 TYPE_OBJECT_MONEY = 4 TYPE_OBJECT_IMAGE = 5 struct table_object type db ? size dw ? ext_size db ? ; real_size = (ext_size shl 16) + size ends struct table_object_str type db ? ; TYPE_OBJECT_STR size dw ? __zero db ? ; real_size = (ext_size shl 16) + size str_length dw ? ; in bytes max = 2^16 - 4 - 2 str rb 0 ; utf-8 ends struct table_object_number type db ? ; TYPE_OBJECT_NUMBER size dw ? ; = 4 + 8 __zero db ? ; real_size = (ext_size shl 16) + size number dq ? ; 64 bits double ends ; CODE struct table_value_addr ; size = 8 octet type rb 2 index_w rb 3 index_h rb 3 ends TABLE_DIR_TYPE_DATA = 0x1 TABLE_DIR_TYPE_FORMAT = 0x2 struct table_DOM ; 8*16 + 4 table_1 dd 64*64 table_2 dd 64*64 ends format MS COFF public @EXPORT as "EXPORTS" section 'Doczom' code readable align 16 ; IN: dword[esp + 4] - ptr buffer for ptr table_dom ; OUT: eax - error code(0 - good, other - error) create: push edi ebx mov eax, 68 mov ebx, 12 ; alloc mov ecx, sizeof.table_DOM int 0x40 test eax, eax jz .err mov ecx, [esp + 4*2 + 4] mov edi, eax mov [ecx], eax mov ecx, sizeof.table_DOM /4 xor eax, eax rep stosd xor eax, eax pop ebx edi ret 4 .err: mov eax, -1 pop ebx edi ret 4 ; IN: dword[esp + 4] - ptr table_dom destruct: push ebx esi mov esi, [esp + 4*2 + 4] mov ecx, sizeof.table_DOM/4 @@: movsd test eax, eax jz .skip push ecx mov ecx, eax mov eax, 68 mov ebx, 13 int 0x40 pop ecx .skip: loop @b ; free table_DOM mov eax, 68 mov ebx, 13 mov ecx, [esp + 4*2 + 4] int 0x40 pop esi ebx ret 4 ; IN: dword[esp + 4] - table_dom ; dword[esp + 8] - table_addr ; OUT: eax - ptr to table_object get_table_value: mov eax, [esp + 8] mov ecx, [esp + 4] lea ecx, [ecx + eax*4] ; ecx = addr table_object test ecx, ecx jz .err push esi mov esi, ecx pop esi ret 8 .err: xor eax, eax ret 8 ; IN: dword[esp + 4] - table_addr ; dword[esp + 8] - table_object ; OUT: eax - error code(0 - good, other - error) set_table_value: ret 12 ;----------------------------------------------------------------------------- ; Table Object function ; IN: dword[esp + 4] = size table_object ; OUT: eax - ptr to table_object create_table_object: ; alloc memory push ebx mov edx, [esp + 4 + 4] shl edx, 8 mov eax, 68 mov ecx, edx mov ebx, 12 int 0x40 pop ebx test eax, eax jz .err ; set table object size mov [eax], edx ;mov dword[eax + table_object.size], ecx ; WARNING!!! mov byte[eax + table_object.type], TYPE_OBJECT_NULL ret 4 .err: xor eax, eax ret 4 ; IN: dword[esp + 4] - ptr to table_object ; OUT: --- destruct_table_object: push ebx mov eax, 68 mov ecx, [esp + 4 + 4] mov ebx, 13 int 0x40 pop ebx ret 4 section '.data' data readable writable align 16 @EXPORT: export \ create, 'create_table_dom',\ ; test ? destruct, 'destruct_table_dom',\ ; test ? \ get_table_value, 'get_table_value',\ ; test ? set_table_value, 'set_table_value',\ ; test ? \ create_table_object, 'create_table_object',\ destruct_table_object, 'destruct_table_object'