Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 385 → Rev 386

/programs/system/mgb/trunk/build.bat
0,0 → 1,2
@fasm mgb.asm mgb
@pause
/programs/system/mgb/trunk/mgb.asm
0,0 → 1,1155
;=============================================================================
;
; 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
/programs/system/mgb/trunk/proc32.inc
0,0 → 1,268
 
; Macroinstructions for defining and calling procedures
 
macro stdcall proc,[arg] ; directly call STDCALL procedure
{ common
if ~ arg eq
reverse
pushd arg
common
end if
call proc }
 
macro invoke proc,[arg] ; indirectly call STDCALL procedure
{ common
if ~ arg eq
reverse
pushd arg
common
end if
call [proc] }
 
macro ccall proc,[arg] ; directly call CDECL procedure
{ common
size@ccall = 0
if ~ arg eq
reverse
pushd arg
size@ccall = size@ccall+4
common
end if
call proc
if size@ccall
add esp,size@ccall
end if }
 
macro cinvoke proc,[arg] ; indirectly call CDECL procedure
{ common
size@ccall = 0
if ~ arg eq
reverse
pushd arg
size@ccall = size@ccall+4
common
end if
call [proc]
if size@ccall
add esp,size@ccall
end if }
 
macro proc [args] ; define procedure
{ common
match name params, args>
\{ define@proc name,<params \} }
 
prologue@proc equ prologuedef
 
macro prologuedef procname,flag,parmbytes,localbytes,reglist
{ if parmbytes | localbytes
push ebp
mov ebp,esp
if localbytes
sub esp,localbytes
end if
end if
irps reg, reglist \{ push reg \} }
 
epilogue@proc equ epiloguedef
 
macro epiloguedef procname,flag,parmbytes,localbytes,reglist
{ irps reg, reglist \{ reverse pop reg \}
if parmbytes | localbytes
leave
end if
if (flag and 10000b) | (parmbytes=0)
retn
else
retn parmbytes
end if }
 
macro define@proc name,statement
{ local params,flag,regs,parmbytes,localbytes,current
if used name
name:
match =stdcall args, statement \{ params equ args
flag = 11b \}
match =stdcall, statement \{ params equ
flag = 11b \}
match =c args, statement \{ params equ args
flag = 10001b \}
match =c, statement \{ params equ
flag = 10001b \}
match =params, params \{ params equ statement
flag = 0 \}
virtual at ebp+8
match =uses reglist=,args, params \{ regs equ reglist
params equ args \}
match =regs =uses reglist, regs params \{ regs equ reglist
params equ \}
match =regs, regs \{ regs equ \}
match =,args, params \{ defargs@proc args \}
match =args@proc args, args@proc params \{ defargs@proc args \}
parmbytes = $ - (ebp+8)
end virtual
name # % = parmbytes/4
all@vars equ
current = 0
match prologue:reglist, prologue@proc:<regs> \{ prologue name,flag,parmbytes,localbytes,reglist \}
macro locals
\{ virtual at ebp-localbytes+current
macro label . \\{ deflocal@proc .,:, \\}
struc db [val] \\{ \common deflocal@proc .,db,val \\}
struc dw [val] \\{ \common deflocal@proc .,dw,val \\}
struc dp [val] \\{ \common deflocal@proc .,dp,val \\}
struc dd [val] \\{ \common deflocal@proc .,dd,val \\}
struc dt [val] \\{ \common deflocal@proc .,dt,val \\}
struc dq [val] \\{ \common deflocal@proc .,dq,val \\}
struc rb cnt \\{ deflocal@proc .,rb cnt, \\}
struc rw cnt \\{ deflocal@proc .,rw cnt, \\}
struc rp cnt \\{ deflocal@proc .,rp cnt, \\}
struc rd cnt \\{ deflocal@proc .,rd cnt, \\}
struc rt cnt \\{ deflocal@proc .,rt cnt, \\}
struc rq cnt \\{ deflocal@proc .,rq cnt, \\} \}
macro endl
\{ purge label
restruc db,dw,dp,dd,dt,dq
restruc rb,rw,rp,rd,rt,rq
restruc byte,word,dword,pword,tword,qword
current = $-(ebp-localbytes)
end virtual \}
macro ret operand
\{ match any, operand \\{ retn operand \\}
match , operand \\{ match epilogue:reglist, epilogue@proc:<regs>
\\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}
macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2
end if \} }
 
macro defargs@proc [arg]
{ common
if ~ arg eq
forward
local ..arg,current@arg
match argname:type, arg
\{ current@arg equ argname
label ..arg type
argname equ ..arg
if dqword eq type
dd ?,?,?,?
else if tbyte eq type
dd ?,?,?
else if qword eq type | pword eq type
dd ?,?
else
dd ?
end if \}
match =current@arg,current@arg
\{ current@arg equ arg
arg equ ..arg
..arg dd ? \}
common
args@proc equ current@arg
forward
restore current@arg
common
end if }
 
macro deflocal@proc name,def,[val]
{ common
match vars, all@vars \{ all@vars equ all@vars, \}
all@vars equ all@vars name
forward
local ..var,..tmp
..var def val
match =?, val \{ ..tmp equ \}
match any =dup (=?), val \{ ..tmp equ \}
match tmp : value, ..tmp : val
\{ tmp: end virtual
initlocal@proc ..var,def value
virtual at tmp\}
common
match first rest, ..var, \{ name equ first \} }
 
macro initlocal@proc name,def
{ virtual at name
def
size@initlocal = $ - name
end virtual
position@initlocal = 0
while size@initlocal > position@initlocal
virtual at name
def
if size@initlocal - position@initlocal < 2
current@initlocal = 1
load byte@initlocal byte from name+position@initlocal
else if size@initlocal - position@initlocal < 4
current@initlocal = 2
load word@initlocal word from name+position@initlocal
else
current@initlocal = 4
load dword@initlocal dword from name+position@initlocal
end if
end virtual
if current@initlocal = 1
mov byte [name+position@initlocal],byte@initlocal
else if current@initlocal = 2
mov word [name+position@initlocal],word@initlocal
else
mov dword [name+position@initlocal],dword@initlocal
end if
position@initlocal = position@initlocal + current@initlocal
end while }
 
macro endp
{ purge ret,locals,endl
finish@proc
purge finish@proc
restore regs@proc
match all,args@proc \{ restore all \}
restore args@proc
match all,all@vars \{ restore all \} }
 
macro local [var]
{ common
locals
forward done@local equ
match varname[count]:vartype, var
\{ match =BYTE, vartype \\{ varname rb count
restore done@local \\}
match =WORD, vartype \\{ varname rw count
restore done@local \\}
match =DWORD, vartype \\{ varname rd count
restore done@local \\}
match =PWORD, vartype \\{ varname rp count
restore done@local \\}
match =QWORD, vartype \\{ varname rq count
restore done@local \\}
match =TBYTE, vartype \\{ varname rt count
restore done@local \\}
match =DQWORD, vartype \\{ label varname dqword
rq count+count
restore done@local \\}
match , done@local \\{ virtual
varname vartype
end virtual
rb count*sizeof.\#vartype
restore done@local \\} \}
match :varname:vartype, done@local:var
\{ match =BYTE, vartype \\{ varname db ?
restore done@local \\}
match =WORD, vartype \\{ varname dw ?
restore done@local \\}
match =DWORD, vartype \\{ varname dd ?
restore done@local \\}
match =PWORD, vartype \\{ varname dp ?
restore done@local \\}
match =QWORD, vartype \\{ varname dq ?
restore done@local \\}
match =TBYTE, vartype \\{ varname dt ?
restore done@local \\}
match =DQWORD, vartype \\{ label varname dqword
dq ?,?
restore done@local \\}
match , done@local \\{ varname vartype
restore done@local \\} \}
match ,done@local
\{ var
restore done@local \}
common
endl }