;============================================================================= ; ; MGB - Menuet Graphics Benchmark 0.3 ; Compile with FASM ; ;============================================================================= ; ; Original author and copyrights holder: ; Mikhail Lisovin a.k.a. Mihasik ; lisovin@26.ru ; ; Disassembled with IDA 5.0.0.879: ; http://www.datarescue.com/ ; With use of 'ida.int' and 'kloader.ldw': ; Eugene Grechnikov a.k.a. diamond ; diamondz@land.ru ; http://diamondz.land.ru/ ; ; Modified for version 0.3: ; Mike Semenako a.k.a mike.dld ; mike.dld@gmail.com ; http://www.mikedld.com/ ; ;============================================================================= org 0x0 use32 db 'MENUET01' dd 1 dd start dd APP_MEM_END dd 0x200000 dd 0x07FFF0 dd 0 dd 0 include 'proc32.inc' ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc start ; DATA XREF: seg000:off_Co ; FUNCTION CHUNK AT 000000CF SIZE 00000147 BYTES mov ecx, -1 call subGetThreadInfo mov edx, [dwMainPID] mov ecx, eax loc_36: ; CODE XREF: start+20j call subGetThreadInfo loc_3B: cmp edx, [dwMainPID] jz loc_46 dec ecx jnz loc_36 loc_46: ; CODE XREF: start+1Dj mov [dwMainWndSlot], ecx locRedrawEvent: ; CODE XREF: start+3Cj call subDrawMainWindow locWaitForEvent: ; CODE XREF: start+6Cj start:loc_B3j ... mov eax, 23 mov ebx, 20 int 0x40 ; Kolibri - WAIT FOR EVENT WITH TIMEOUT ; ebx = timeout ; Return: eax = event cmp eax, 1 jz locRedrawEvent loc_62: cmp eax, 2 jz locKeyEvent cmp eax, 3 loc_6A: jz locButtonEvent loc_70: ;btr word[wFlags], 2 ;jnb loc_87 ;mov eax, 58 ;mov ebx, stFileInfoBlock ;int 0x40 ; Kolibri - ACCESS TO FILE SYSTEM (obsolete) ; ebx -> fileinfo struc loc_87: ; CODE XREF: start+55j btr word[wFlags], 1 jnb locWaitForEvent call subDelay100ms mov eax, 12h mov ebx, 3 mov ecx, [dwMainWndSlot] int 0x40 ; Kolibri - ACTIVATE WINDOW ; ecx = slot call subDelay100ms loc_AE: call subDrawBars loc_B3: jmp locWaitForEvent endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subGetThreadInfo ; CODE XREF: start+5p start:loc_36p mov eax, 9 mov ebx, APP_MEM_END int 0x40 ; Kolibri - GET THREAD INFO ; ebx -> buffer, ecx = slot (-1 for self) ; Return: eax = maximum slot retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subDelay100ms ; CODE XREF: start+6Ep start+85p mov eax, 5 mov ebx, 0Ah int 0x40 ; Kolibri - DELAY ; ebx = time (in 1/100th of second) retn endp ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; START OF FUNCTION CHUNK FOR start locKeyEvent: ; CODE XREF: start+41j mov eax, 2 int 0x40 ; Kolibri - GET KEY CODE ; Return: ah = keycode cmp ah, 't' jz locActionTest cmp ah, 'c' jz locActionComment cmp ah, 'p' jz locActionPattern cmp ah, 'o' jz locActionOpen cmp ah, 's' jz locActionSave jmp locWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locButtonEvent: ; CODE XREF: start:loc_6Aj mov eax, 11h int 0x40 ; Kolibri - GET PRESSED BUTTON ; Return: ah = button ID cmp ah, 1 jnz locNotClose mov eax, -1 int 0x40 ; Kolibri - FINISH EXECUTION locNotClose: ; CODE XREF: start+E6j cmp ah, 2 jnz locNotTest locActionTest: ; CODE XREF: start+B5j bts [wFlags], 0 jb locWaitForEvent mov eax, 5 mov ebx, 50 int 0x40 ; Kolibri - DELAY ; ebx = time (in 1/100th of second) loc_132: mov eax, 51 mov ebx, 1 mov ecx, subTestWndProc mov edx, 0x17FFF0 int 0x40 ; Kolibri - CREATE THREAD ; ebx = 1 - unique subfunction ; ecx = starting eip ; edx = starting esp jmp locWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locNotTest: ; CODE XREF: start+F2j cmp ah, 3 jnz locNotComment locActionComment: ; CODE XREF: start+BAj bts [wFlags], 0 jb locWaitForEvent mov [dwBufferPtr], aComment1 ; "Current "... mov [dwEditLabel], aComment ; "Comment" mov [dwEditLabelLen], 7 call subCreateOpenSaveDlg jmp locWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locNotComment: ; CODE XREF: start+12Cj cmp ah, 4 jnz locNotPattern locActionPattern: ; CODE XREF: start+BFj call subSavePattern call subDrawBars jmp locWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locNotPattern: ; CODE XREF: start+167j cmp ah, 5 jnz locNotOpen locActionOpen: ; CODE XREF: start+C8j bts [wFlags], 0 jb locWaitForEvent mov [dwBufferPtr], aPatternPath ; "/rd/1/pattern.mgb "... mov [dwEditLabel], aOpenFile ; "Open file" mov [dwEditLabelLen], 9 call subCreateOpenSaveDlg jmp locWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locNotOpen: ; CODE XREF: start+17Bj cmp ah, 6 jnz locWaitForEvent locActionSave: ; CODE XREF: start+D1j bts [wFlags], 0 jb locWaitForEvent mov [dwBufferPtr], aPatternPath ; "/rd/1/pattern.mgb "... mov [dwEditLabel], aSaveAs ; "Save as..." mov [dwEditLabelLen], 0Ah call subCreateOpenSaveDlg jmp locWaitForEvent ; END OF FUNCTION CHUNK FOR start ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subCreateOpenSaveDlg ; CODE XREF: start+15Ap start+1A9p ... mov eax, 51 mov ebx, 1 mov ecx, subOpenSaveDlgProc mov edx, 0x19FFF0 int 0x40 ; Kolibri - CREATE THREAD ; ebx = 1 - unique subfunction ; ecx = starting eip ; edx = starting esp retn endp ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ subTestWndProc: ; DATA XREF: start+118o mov esi,results_table+8 .next_test: call subInitTestTimer align 4 @@: push esi call dword[esi] pop esi call subIfTimeElapsed jb @b mov [esi-8],edi add esi,TEST_REC_SIZE cmp dword[esi],0 jnz .next_test macro unused { call subInitTestTimer locDrawNextWindow: ; CODE XREF: seg000:00000241j mov ecx, 4F0190h call testDrawWindow call subIfTimeElapsed jb locDrawNextWindow mov [results_table+TEST_REC_SIZE*0], edi call subInitTestTimer locDrawNextBar: ; CODE XREF: seg000:00000269j mov eax, 0Dh mov ebx, 0A0064h mov ecx, 1E00FAh mov edx, 6A73D0h int 0x40 ; Kolibri - DRAW RECTANGLE ; ebx = [xstart]*65536+[xsize], ecx = [ystart]*65536+[ysize] ; edx = 0xRRGGBB or 0x80RRGGBB for gradient call subIfTimeElapsed jb locDrawNextBar mov [results_table+TEST_REC_SIZE*1], edi call subInitTestTimer locDrawNextLine: ; CODE XREF: seg000:00000291j mov eax, 38 mov ebx, 8C008Ch mov ecx, 1E017Ch mov edx, 1090207Fh int 0x40 ; Kolibri - DRAW LINE ; ebx = [xstart]*65536+[xend], ecx = [ystart]*65536+[yend] ; edx = 0x00RRGGBB - color or 0x01****** - inversed line call subIfTimeElapsed jb locDrawNextLine mov [results_table+TEST_REC_SIZE*2], edi call subInitTestTimer locDrawNextText1: ; CODE XREF: seg000:000002BEj mov eax, 4 mov ebx, 0A012Ch mov ecx, 0AA66h mov edx, aTestText ; "This is a 34-charachters test text" mov esi, 34 int 0x40 ; Kolibri - DRAW STRING ; ebx = [xstart]*65536+[ystart] ; ecx = 0xX0RRGGBB, edx -> string call subIfTimeElapsed jb locDrawNextText1 mov [results_table+TEST_REC_SIZE*3], edi call subInitTestTimer locDrawNextText2: ; CODE XREF: seg000:000002EBj mov eax, 4 mov ebx, 0A015Eh mov ecx, 10E7B850h mov edx, aTestText ; "This is a 34-charachters test text" mov esi, 34 int 0x40 ; Kolibri - DRAW STRING ; ebx = [xstart]*65536+[ystart] ; ecx = 0xX0RRGGBB, edx -> string call subIfTimeElapsed jb locDrawNextText2 mov [results_table+TEST_REC_SIZE*4], edi call subInitTestTimer locDrawNextNumber: ; CODE XREF: seg000:00000318j mov eax, 47 mov ebx, 80000h mov ecx, 12345678 mov edx, 140172h mov esi, 0E0B27Bh int 0x40 ; Kolibri - DRAW NUMBER ; bl = 0/1 - ecx is number/pointer ; bh = 0/1/2 - dec/hex/bin ; highword(ebx) = number of digits ; ecx = number/pointer ; edx = [x]*65536+[y] ; esi = 0xX0RRGGBB call subIfTimeElapsed jb locDrawNextNumber mov [results_table+TEST_REC_SIZE*5], edi call subInitTestTimer locDrawNextPixel: ; CODE XREF: seg000:00000340j mov eax, 1 mov ebx, 100 mov ecx, 100 mov edx, 0FFFFFFh int 0x40 ; Kolibri - PUT PIXEL ; ebx = x, ecx = y, edx = color call subIfTimeElapsed jb locDrawNextPixel mov [results_table+TEST_REC_SIZE*6], edi } bts word[wFlags], 1 btr word[wFlags], 0 mov eax, -1 int 0x40 ; Kolibri - FINISH EXECUTION ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subInitTestTimer ; CODE XREF: seg000:subTestWndProcp ; seg000:00000249p ... xor edi, edi mov eax, 26 mov ebx, 9 int 0x40 ; Kolibri - GET SYSTEM PARAMETERS - TIME COUNTER ; Return: eax = time counter inc eax mov ecx, eax add eax, 100 mov [dwTestEndTime], eax locWait10ms: ; CODE XREF: subInitTestTimer+22j mov eax, 26 int 0x40 ; Kolibri - GET SYSTEM PARAMETERS - TIME COUNTER ; Return: eax = time counter cmp eax, ecx jb locWait10ms retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subIfTimeElapsed ; CODE XREF: seg000:0000023Cp ; seg000:00000264p ... inc edi mov eax, 26 mov ebx, 9 int 0x40 ; Kolibri - GET SYSTEM PARAMETERS - TIME COUNTER ; Return: eax = time counter cmp eax, [dwTestEndTime] retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subSavePattern ; CODE XREF: start:locActionPatternp ; mov esi, dwDrawWindowTime ; mov edi, dwDrawWindowTime2 ; mov ecx, 18 ; cld ; rep movsd mov esi,results_table cld @@: lodsd mov [esi],eax add esi,TEST_REC_SIZE-4 cmp dword[esi+TEST_REC_SIZE-4],0 jne @b mov esi,aComment1 mov edi,aComment2 mov ecx,44/4 rep movsd retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subDrawMainWindow ; CODE XREF: start:locRedrawEventp mov eax, 12 mov ebx, 1 int 0x40 ; Kolibri - BEGIN WINDOW REDRAW mov eax,48 mov ebx,4 int 0x40 mov ebx, 100*65536+72*5+14;640145h mov ecx, 80*65536+TESTS_NUM*LINE_HEIGHT+15+20+35 add cx, ax mov edx, 33000000h mov edi, aCaption xor eax, eax int 0x40 mov eax, 8 mov ebx, 050036h+12 mov ecx, 5*65536+20 mov edx, 2 mov esi, 0x00007F7F;702050h locDrawButtonsLoop: ; CODE XREF: subDrawMainWindow+3Bj int 0x40 ; Kolibri - DEFINE/DELETE BUTTON ; ebx = [xstart]*65536+[xsize] ; ecx = [ystart]*65536+[ysize] ; edx = 0xXYnnnnnn, esi = color add ebx, 72*65536 inc edx cmp edx, 7 jb locDrawButtonsLoop mov ecx,31 mov edx,0x00007F7F mov esi,(72*5)/2 call drawSeparator mov eax, 4 mov ebx, 27*65536+12 mov ecx, 0x80DDEEFF mov edx, aButtonsText ; "Test Comment+ Pattern+ Open "... int 0x40 ; Kolibri - DRAW STRING ; ebx = [xstart]*65536+[ystart] ; ecx = 0xX0RRGGBB, edx -> string call subDrawBars mov ecx,TESTS_NUM*LINE_HEIGHT+15+21 mov edx,0x00007F7F mov esi,(72*5)/2 call drawSeparator mov eax, 12 mov ebx, 2 int 0x40 ; Kolibri - END WINDOW REDRAW retn endp proc drawSeparator mov eax,1 mov ebx,3 @@: int 0x40 add ebx,2 dec esi jnz @b retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc testDrawWindow xor eax, eax mov ebx, 640145h mov ecx, 4F0190h mov edx, 3000000h int 0x40 retn endp proc testDrawBar mov eax, 13 mov ebx, 0A0064h mov ecx, 1E00FAh mov edx, 6A73D0h int 0x40 retn endp proc testDrawPicture mov eax, 7 mov ebx, 0 mov ecx, 90*65536+123 mov edx, 15*65536+33 int 0x40 retn endp proc testDrawVertLine mov eax, 38 mov ebx, 300*65536+300 ;8C008Ch mov ecx, 30*65536+380 ;1E017Ch mov edx, 1090207Fh int 0x40 retn endp proc testDrawHorzLine mov eax, 38 mov ebx, 30*65536+300 ;20008Ch mov ecx, 380*65536+380 ;17C017Ch mov edx, 1090207Fh int 0x40 retn endp proc testDrawFreeLine mov eax, 38 mov ebx, 30*65536+300 ;20008Ch mov ecx, 380*65536+30 ;17C001Eh mov edx, 1090207Fh int 0x40 retn endp proc testDrawText1 mov eax, 4 mov ebx, 0C012Ch mov ecx, 0AA66h mov edx, aTestText mov esi, 34 int 0x40 retn endp proc testDrawText2 mov eax, 4 mov ebx, 1B013Bh mov ecx, 10E7B850h mov edx, aTestText mov esi, 34 int 0x40 retn endp proc testDrawNumber mov eax, 47 mov ebx, 80000h mov ecx, 12345678 mov edx, 2A014Ah mov esi, 0E0B27Bh int 0x40 retn endp proc testDrawPixel mov eax, 1 mov ebx, 100 mov ecx, 100 mov edx, 0FFFFFFh int 0x40 retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subDrawBars ; CODE XREF: start:loc_AEp start+16Ep ... mov edi,results_table mov ebx,30+7 .next_result: cmp dword[edi+TEST_REC_SIZE-4],0 je .exit push ebx mov eax,13 movzx ecx,bx add ecx,-2 shl ecx,16 mov cx,LINE_HEIGHT mov ebx,0*65536+72*5+5 xor edx,edx int 0x40 pop ebx and ebx,0x0000FFFF or ebx,5*65536 mov edx,[edi+TEST_REC_SIZE-4] mov ecx,0x8000CCCC ; 0x00E7E05A mov eax,4 int 0x40 push '=' 0x00FFFF00 0x00FFFF7F 0x00FFFF7F mov eax,[edi+0] cmp eax,[edi+4] je @f jb .lp1 mov dword[esp+0],0x007FFF7F mov dword[esp+4],0x00FF7F7F mov dword[esp+8],0x0000FF00 mov byte[esp+12],'>' .lp1: ja @f mov dword[esp+0],0x00FF7F7F mov dword[esp+4],0x007FFF7F mov dword[esp+8],0x00FF0000 mov byte[esp+12],'<' @@: pop ecx call int2str add ebx,(72*5-6*8*2-6-10-5)*65536 ; 196 mov edx,APP_MEM_END mov esi,8 mov eax,4 int 0x40 pop ecx mov eax,[edi+4] call int2str add ebx,(6*8+6+10)*65536 mov eax,4 int 0x40 pop ecx add ebx,(-6-5)*65536 mov edx,esp mov esi,1 int 0x40 add esp,4 add edi,TEST_REC_SIZE add bx,LINE_HEIGHT jmp .next_result .exit: mov eax, 13 mov ebx, 0*65536+72*5+5 mov ecx, (TESTS_NUM*LINE_HEIGHT+15+25)*65536+26 xor edx, edx int 0x40 mov eax, 4 mov ebx, 5*65536+(TESTS_NUM*LINE_HEIGHT+15+27) mov ecx, 0x8000CCCC mov edx, aLeft int 0x40 ; Kolibri - DRAW STRING add ebx, (6*10)*65536 mov ecx, 0x00FFFF00 mov edx, aComment1 mov esi, 42 int 0x40 ; Kolibri - DRAW STRING mov eax, 4 mov ebx, 5*65536+(TESTS_NUM*LINE_HEIGHT+15+27+12) mov ecx, 0x8000CCCC mov edx, aRight int 0x40 ; Kolibri - DRAW STRING add ebx, (6*10)*65536 mov ecx, 0x00FFFF00 mov edx, aComment2 mov esi, 42 int 0x40 ; Kolibri - DRAW STRING retn endp proc int2str push eax ecx edx edi mov edi,APP_MEM_END+7 mov dword[APP_MEM_END+0],' ' mov dword[APP_MEM_END+4],' ' mov ecx,10 @@: xor edx,edx div ecx add dl,'0' mov [edi],dl dec edi or eax,eax jnz @b pop edi edx ecx eax retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subDrawResultComments ; CODE XREF: subDrawBars+92p ; subDrawBars+AFp ... xor di, di mov eax, 4 locDrawCommentsLoop: ; CODE XREF: subDrawResultComments+1Cj int 0x40 ; Kolibri - DRAW STRING ; ebx = [xstart]*65536+[ystart] ; ecx = 0xX0RRGGBB, edx -> string add bx, 13;55 bt edi, 31 jnb loc_52F add edx, esi loc_52F: ; CODE XREF: subDrawResultComments+12j inc di cmp di, 7 jb locDrawCommentsLoop retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subDrawResultNumbers ; CODE XREF: subDrawBars+CDp ; subDrawBars+DCp xor edi, edi mov eax, 47 mov esi, 0DDEEFFh locDrawNumbersLoop: ; CODE XREF: subDrawResultNumbers+1Ej call subGetDigitsCount int 0x40 ; Kolibri - add dx, 13;55 add ecx, 4 inc edi cmp edi, 7 jb locDrawNumbersLoop retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subGetDigitsCount ; CODE XREF: subDrawResultNumbers:locDrawNumbersLoopp xor ebx, ebx mov bh, 6 cmp dword[ecx], 99999 ja loc_589 dec bh cmp dword[ecx], 9999 ja loc_589 dec bh cmp dword[ecx], 999 ja loc_589 dec bh cmp dword[ecx], 99 ja loc_589 dec bh cmp dword[ecx], 9 ja loc_589 dec bh loc_589: ; CODE XREF: subGetDigitsCount+Aj ; subGetDigitsCount+14j ... bswap ebx inc bl retn endp ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ subOpenSaveDlgProc: ; CODE XREF: seg000:0000059Dj ; DATA XREF: subCreateOpenSaveDlg+Ao call subDrawOpenSaveDlg locOSDWaitForEvent: ; CODE XREF: seg000:000005ADj ; seg000:000005C3j ... mov eax, 10 int 0x40 ; Kolibri - cmp eax, 1 jz subOpenSaveDlgProc cmp eax, 2 jz locOSDKeyEvent cmp eax, 3 jz locOSDButtonEvent jmp locOSDWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locOSDKeyEvent: ; CODE XREF: seg000:000005A2j mov eax, 2 int 0x40 ; Kolibri - GET KEY CODE ; Return: ah = keycode cmp ah, 0B3h jnz locOSDNotRightKey mov eax, [dwOSDCaretPos] cmp eax, 41 ja locOSDWaitForEvent inc eax mov [dwOSDCaretPos], eax call subDrawOpenSaveDlgControls jmp locOSDWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locOSDNotRightKey: ; CODE XREF: seg000:000005B9j cmp ah, 0B0h jnz locOSDNotLeftKey mov eax, [dwOSDCaretPos] test eax, eax jz locOSDWaitForEvent dec eax mov [dwOSDCaretPos], eax call subDrawOpenSaveDlgControls jmp locOSDWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locOSDNotLeftKey: ; CODE XREF: seg000:000005D5j cmp ah, 0B6h jnz locOSDNotDeleteKey call subOSDDeleteChar call subDrawOpenSaveDlgControls jmp locOSDWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locOSDNotDeleteKey: ; CODE XREF: seg000:000005F0j cmp ah, 8 jnz locOSDNotBackspaceKey mov eax, [dwOSDCaretPos] test eax, eax jz locOSDWaitForEvent dec eax mov [dwOSDCaretPos], eax call subOSDDeleteChar call subDrawOpenSaveDlgControls jmp locOSDWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locOSDNotBackspaceKey: ; CODE XREF: seg000:00000601j cmp ah, 0Dh jnz locOSDNotReturnKey locOSDReturnKey: ; CODE XREF: seg000:000006E1j mov al, ' ' mov edi, [dwBufferPtr] add edi,43 mov ecx,43 std repe scasb cld inc edi mov byte[edi+1], 0 cmp [dwBufferPtr], aPatternPath ; "/rd/1/pattern.mgb "... jnz locCloseOSD cmp [dwEditLabel], aOpenFile ; "Open file" jnz locSaveFile mov [stFileInfoBlock], 0 mov [dwDataSize], TESTS_NUM*4+44 bts word[wFlags], 2 mov eax,70 ; 58 mov ebx,stFileInfoBlock int 0x40 mov esi,APP_MEM_END+100 mov edi,results_table+4 cld @@: cmp dword[edi+TEST_REC_SIZE-8],0 je @f movsd add edi,TEST_REC_SIZE-4 jmp @b @@: mov edi,aComment2 mov ecx,44 rep movsb jmp locCloseOSD ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locSaveFile: ; CODE XREF: seg000:00000654j mov [stFileInfoBlock], 2 ; 1 mov [dwDataSize], TESTS_NUM*4+44 bts word[wFlags], 2 mov esi,results_table+4 mov edi,APP_MEM_END+100 cld @@: cmp dword[esi+TEST_REC_SIZE-8],0 je @f movsd add esi,TEST_REC_SIZE-4 jmp @b @@: mov esi,aComment2 mov ecx,44 rep movsb mov eax,70 ; 58 mov ebx,stFileInfoBlock int 0x40 jmp locCloseOSD ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locOSDNotReturnKey: ; CODE XREF: seg000:00000624j cmp [dwOSDCaretPos], 42 jnb locOSDWaitForEvent mov edi, [dwBufferPtr] add edi, 42 mov esi, edi dec esi mov ecx, 42 sub ecx, [dwOSDCaretPos] std rep movsb shr eax, 8 mov esi, [dwBufferPtr] add esi, [dwOSDCaretPos] mov [esi], al inc [dwOSDCaretPos] call subDrawOpenSaveDlgControls jmp locOSDWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locOSDButtonEvent: ; CODE XREF: seg000:000005A7j mov eax, 17 int 0x40 ; Kolibri - GET PRESSED BUTTON ; Return: ah = button ID cmp ah, 1 jnz locNotCloseOSD jmp locOSDReturnKey ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locCloseOSD: ; CODE XREF: seg000:00000644j ; seg000:0000066Cj ... bts [wFlags], 1 btr [wFlags], 0 mov eax, -1 int 0x40 ; Kolibri - FINISH EXECUTION locNotCloseOSD: ; CODE XREF: seg000:000006DFj cmp ah, 2 jnz locNotSetCaretOSD mov eax, 37 mov ebx, 1 int 0x40 ; Kolibri - GET MOUSE COORDINATES, WINDOW-RELATIVE ; Return: eax = [x]*65536 + [y] shr eax, 16 sub eax, 21 xor edx, edx mov ebx, 6 div ebx mov [dwOSDCaretPos], eax call subDrawOpenSaveDlgControls jmp locOSDWaitForEvent ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locNotSetCaretOSD: ; CODE XREF: seg000:00000700j jmp locOSDWaitForEvent ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subOSDDeleteChar ; CODE XREF: seg000:000005F2p ; seg000:00000612p mov edi, [dwBufferPtr] add edi, [dwOSDCaretPos] mov esi, edi inc esi mov ecx, 43 sub ecx, [dwOSDCaretPos] cld rep movsb retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subDrawOpenSaveDlg ; CODE XREF: seg000:subOpenSaveDlgProcp mov eax, 12 mov ebx, 1 int 0x40 ; Kolibri - BEGIN WINDOW REDRAW xor eax, eax mov ebx, 64012Ch mov ecx, 640050h mov edx, 3780078h int 0x40 ; Kolibri - DEFINE/DRAW WINDOW ; ebx = [xstart]*65536+[xsize] ; ecx = [ystart]*65536+[ysize] mov eax, 4 mov ebx, 80008h mov ecx, 10DDEEFFh mov edx, [dwEditLabel] mov esi, [dwEditLabelLen] int 0x40 ; Kolibri - DRAW STRING ; ebx = [xstart]*65536+[ystart] ; ecx = 0xX0RRGGBB, edx -> string call subDrawOpenSaveDlgControls mov eax, 12 mov ebx, 2 int 0x40 ; Kolibri - END WINDOW REDRAW retn endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ proc subDrawOpenSaveDlgControls ; CODE XREF: seg000:000005CBp ; seg000:000005E6p ... pusha mov eax, 8 mov ebx, 150102h mov ecx, 28000Fh mov edx, 40000002h int 0x40 ; Kolibri - DEFINE/DELETE BUTTON ; ebx = [xstart]*65536+[xsize] ; ecx = [ystart]*65536+[ysize] ; edx = 0xXYnnnnnn, esi = color mov eax, 13 mov edx, 0E0E0E0h int 0x40 ; Kolibri - DRAW RECTANGLE ; ebx = [xstart]*65536+[xsize], ecx = [ystart]*65536+[ysize] ; edx = 0xRRGGBB or 0x80RRGGBB for gradient push eax mov eax, 60000h mul [dwOSDCaretPos] add eax, 150006h mov ebx, eax pop eax mov edx, 6A73D0h int 0x40 ; Kolibri - mov eax, 4 mov ebx, 15002Ch xor ecx, ecx mov edx, [dwBufferPtr] mov esi, 43 int 0x40 ; Kolibri - DRAW STRING ; ebx = [xstart]*65536+[ystart] ; ecx = 0xX0RRGGBB, edx -> string popa retn endp ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ dwMainWndSlot dd 0 ; DATA XREF: start:loc_46w start+7Dr dwBufferPtr dd 0 ; DATA XREF: start+13Cw start+18Bw ... dwEditLabel dd 0 ; DATA XREF: start+146w start+195w ... dwEditLabelLen dd 0 ; DATA XREF: start+150w start+19Fw ... aComment db 'Comment' ; DATA XREF: start+146o aOpenFile db 'Open file' ; DATA XREF: start+195o ; seg000:0000064Ao aSaveAs db 'Save as...' ; DATA XREF: start+1D4o dwOSDCaretPos dd 0 ; DATA XREF: seg000:000005BBr ; seg000:000005C6w ... macro unused { stFileInfoBlock dd 0 ; DATA XREF: start+5Co ; seg000:00000658w ... dd 0 dwDataSize dd 1 ; DATA XREF: seg000:0000065Ew ; seg000:00000678w dd APP_MEM_END+100 dd APP_MEM_END aPatternPath db '/hd0/1/pattern.mgb ' ; DATA XREF: start+18Bo } align 4 stFileInfoBlock dd 0,0,0 dwDataSize dd 1 dd APP_MEM_END+100 aPatternPath db '/hd0/1/pattern.mgb ' ; DATA XREF: start+18Bo ; start+1CAo ... wFlags dd 0 ; DATA XREF: start:loc_70w ; start:loc_87w ... dwTestEndTime dd 0 ; DATA XREF: subInitTestTimer+14w ; subIfTimeElapsed+Dr results_table dd \ ?,?,testDrawWindow,aDrawingWindow,\ ?,?,testDrawBar,aDrawingBar,\ ?,?,testDrawPicture,aDrawingPicture,\ ?,?,testDrawVertLine,aDrawingVLine,\ ?,?,testDrawHorzLine,aDrawingHLine,\ ?,?,testDrawFreeLine,aDrawingFLine,\ ?,?,testDrawText1,aDrawingText1,\ ?,?,testDrawText2,aDrawingText2,\ ?,?,testDrawNumber,aDrawingNumber,\ ?,?,testDrawPixel,aDrawingPixel,\ 0,0,0,0 LINE_HEIGHT = 13 TEST_REC_SIZE = 16 TESTS_NUM = ($ - results_table) / TEST_REC_SIZE - 1 macro cstr name,str { local ..end name db ..end-name-1,str ..end: } aDrawingWindow db 'Window Of Type #3, 325x400 px',0 aDrawingBar db 'Filled Rectangle, 100x250 px',0 aDrawingPicture db 'Picture, 55x123, px',0 aDrawingVLine db 'Vertical Line, 350 px',0 aDrawingHLine db 'Horizontal Line, 270 px',0 aDrawingFLine db 'Free-angled Line, 350 px',0 aDrawingText1 db 'Fixed-width Text, 34 chars',0 aDrawingText2 db 'Proportional Text, 34 chars',0 aDrawingNumber db 'Decimal Number, 8 digits',0 aDrawingPixel db 'Single Pixel',0 aTestText db 'This is a 34-charachters test text' ; DATA XREF: seg000:000002ADo ; seg000:000002DAo aButtonsText db 'Test Comment+ Pattern+ Open Save',0 ; DATA XREF: subDrawMainWindow+5Do aCaption db 'Menuet Graphical Benchmark 0.3',0 ; DATA XREF: subDrawMainWindow+4Co aLeft db 'Left :',0 aRight db 'Right :',0 aComment1 db 'current ' ; DATA XREF: start+13Co ; subDrawBars+9Co ;dwDrawWindowTime2 dd 0 ; DATA XREF: subSubSavePattern+5o ; ; subDrawBars+18o ... ; dd 0 ; dd 0 ; dd 0 ; dd 0 ; dd 0 ; dd 0 aComment2 db 'no pattern ' ; DATA XREF: subDrawBars+72o ; subDrawBars+B9o APP_MEM_END: rb 30 ; ; DATA XREF: seg000:off_10o ; subGetThreadInfo+5o ... dwMainPID dd ? ; DATA XREF: start+Ar start:loc_3Br