diff --git a/programs/build_all.bat b/programs/build_all.bat index cc2254b362..e1e0b22c7d 100644 --- a/programs/build_all.bat +++ b/programs/build_all.bat @@ -81,6 +81,7 @@ fasm system\skinsel\skinsel.asm %BIN%\skinsel fasm system\ss\trunk\@ss.asm %BIN%\@ss fasm system\vrr\trunk\vrr.asm %BIN%\vrr fasm system\vrr_m\trunk\vrr_m.asm %BIN%\vrr_m +fasm system\zkey\trunk\zkey.asm %BIN%\zkey echo * echo Building develop @@ -211,6 +212,7 @@ fasm demos\cslide\trunk\cslide.asm %BIN%\demos\cslide fasm demos\eyes\trunk\eyes.asm %BIN%\demos\eyes fasm demos\fire\trunk\fire.asm %BIN%\demos\fire fasm demos\fire2\trunk\fire2.asm %BIN%\demos\fire2 +fasm demos\firework\trunk\firework.asm %BIN%\demos\firework fasm demos\free3d04\trunk\free3d04.asm %BIN%\3d\free3d04 fasm demos\magnify\trunk\magnify.asm %BIN%\magnify fasm demos\movback\trunk\movback.asm %BIN%\demos\movback @@ -220,6 +222,7 @@ fasm demos\tinyfrac\trunk\tinyfrac.asm %BIN%\demos\tinyfrac fasm demos\transp\trunk\transp.asm %BIN%\demos\transp fasm demos\trantest\trunk\trantest.asm %BIN%\demos\trantest fasm demos\tube\trunk\tube.asm %BIN%\demos\tube +fasm demos\unvwater\trunk\unvwater.asm %BIN%\demos\unvwater erase lang.inc @@ -270,6 +273,7 @@ kpack %BIN%\skinsel kpack %BIN%\@ss kpack %BIN%\vrr kpack %BIN%\vrr_m +kpack %BIN%\zkey echo * echo Compressing develop @@ -395,6 +399,7 @@ kpack %BIN%\demos\cslide kpack %BIN%\demos\eyes kpack %BIN%\demos\fire kpack %BIN%\demos\fire2 +kpack %BIN%\demos\firework kpack %BIN%\3d\free3d04 kpack %BIN%\magnify kpack %BIN%\demos\movback @@ -404,6 +409,7 @@ kpack %BIN%\demos\tinyfrac kpack %BIN%\demos\transp kpack %BIN%\demos\trantest kpack %BIN%\demos\tube +kpack %BIN%\demos\unvwater echo * echo Compressing complete diff --git a/programs/demos/firework/trunk/aspapi.inc b/programs/demos/firework/trunk/aspapi.inc new file mode 100644 index 0000000000..f6f7de0dd4 --- /dev/null +++ b/programs/demos/firework/trunk/aspapi.inc @@ -0,0 +1,139 @@ +include 'proc32.inc' + +macro start_draw_window x,y,xsize,ysize,areacolor,caption;,capsize +{ + ;pusha + mov eax, 12 ; function 12:tell os about windowdraw + mov ebx, 1 ; 1, start of draw + int 0x40 + ; DRAW WINDOW + mov eax, 0 ; function 0 : define and draw window + mov ebx, x*65536+xsize ; [x start] *65536 + [x size] + mov ecx, y*65536+ysize ; [y start] *65536 + [y size] + mov edx, areacolor ; color of work area RRGGBB + mov esi, 0x00334455 ; color of grab bar RRGGBB + mov edi, 0x00ddeeff ; color of frames RRGGBB + int 0x40 + ; WINDOW LABEL + ;mov eax, 4 ; function 4 : write text to window + ;mov ebx, 8*65536+8 ; [x start] *65536 + [y start] + ;mov ecx, 0x00ffffff ; color of text RRGGBB + ;mov edx, caption ; pointer to text beginning + ;mov esi, capsize ; text length + mov eax, 71 ; function 71.1 + mov ebx, 1 ; set window caption + mov ecx, caption ; pointer to text + int 0x40 + ;popa +} + +macro end_draw_window +{ + mov eax, 12 ; end of redraw + mov ebx, 2 + int 0x40 +} + +proc draw_button stdcall, x:dword, y:dword, xsize:dword, ysize:dword, \ + id:dword, butcolor:dword, text:dword, textlen:byte, textcolor:dword + + ;pusha + mov ebx, dword [x] + shl ebx, 16 + add ebx, dword [xsize] ; [x start] *65536 + [x size] + + mov ecx, dword [y] + shl ecx, 16 + add ecx, dword [ysize] ; [y start] *65536 + [y size] + + mov edx, dword [id] ; button id + mov esi, dword [butcolor] ; button color RRGGBB + mov eax, 8 ; function 8 : define and draw button + int 0x40 + + mov ebx, dword [x] + add ebx, 5 + shl ebx, 16 + mov eax, dword [ysize] + sub eax, 5 + shr eax, 1 + add ebx, eax + add ebx, dword [y] ;mov ebx, (x+5)*65536+y+(ysize-5)/2 ; Draw button text + + mov ecx, dword [textcolor] + mov edx, dword [text] + xor eax, eax + mov al, byte [textlen] + mov esi, eax + mov eax, 4 + int 0x40 + ;popa +ret +endp + +macro outtextxy x,y,prompt,prompt_len,color +{ + pusha + mov ebx, x*65536+y ; draw info text with function 4 + mov ecx, color + mov edx, prompt + xor eax, eax + mov al, prompt_len + mov esi, eax + mov eax, 4 + int 0x40 + popa +} + +;proc bar x:dword, y:dword, xsize:dword, ysize:dword, color:dword +macro bar x, y, xsize, ysize, color +{ + pusha + mov eax, 13 + ;mov ebx, [x] + ;shl ebx, 16 + ;add ebx, [xsize] + ;mov ecx, [y] + ;shl ecx, 16 + ;add ecx, [ysize] + ;mov edx, [color] + mov ebx, x*65536+xsize + mov ecx, y*65536+ysize + mov edx, color + + int 0x40 + popa +;ret +;endp +} + +macro line x1,y1,x2,y2,color +{ + pusha + mov eax, 38 + mov ebx, x1*65536+x2 + mov ecx, y1*65536+y2 + mov edx, color + int 0x40 + popa +} + +macro rectangle x,y,xsize,ysize,color +{ + x2=x+xsize + y2=y+ysize + line x,y,x2,y,color + line x,y,x,y2,color + line x,y2,x2,y2,color + line x2,y,x2,y2,color +} + +macro putpixel x,y,color +{ + mov eax, 1 + mov ebx, x + mov ecx, y + mov edx, color + int 0x40 +} + diff --git a/programs/demos/firework/trunk/firework.asm b/programs/demos/firework/trunk/firework.asm new file mode 100644 index 0000000000..e278ca5e07 --- /dev/null +++ b/programs/demos/firework/trunk/firework.asm @@ -0,0 +1,370 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; A firework demo +; Programmed by Yaniv LEVIATHAN +; http://yaniv.leviathanonline.com +; Converted to DexOS, By Dex +; Converted to KolibriOS, By Asper +; Optimized for KolibriOS, By Diamond +; Assemble with +; c:fasm firework.asm firework.kex +; NOTE: Needs MMX & SSE +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use32 + org 0x0 + + db 'MENUET00' ; 8 byte id + dd 38 ; required os + dd STARTAPP ; program start + dd I_END ; program image size + dd 0x100000 ; required amount of memory + dd 0x00000000 ; reserved=no extended header + +include "aspAPI.inc" +SCREEN_WIDTH equ 320 +SCREEN_HEIGHT equ 200 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Global defines +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + NUM_PARTS = 150 + X_OFFSET = 0 + Y_OFFSET = 4 + X_SPEED_OFFSET = 8 + Y_SPEED_OFFSET = 12 + COLOR_OFFSET = 16 + PART_SIZE = 20 + +macro draw_window +{ +local x, xsize, y, ysize, areacolor, caption +x = 100 +y = 70 +xsize = SCREEN_WIDTH+9 +ysize = SCREEN_HEIGHT+4 +areacolor = 0x14224466 +caption = labelt + mov eax, 12 ; function 12:tell os about windowdraw + mov ebx, 1 ; 1, start of draw + int 0x40 + ; DRAW WINDOW + mov eax, 48 + mov ebx, 4 + int 0x40 + lea ecx, [y*65536+ysize+eax] + xor eax, eax ; function 0 : define and draw window + mov ebx, x*65536+xsize ; [x start] *65536 + [x size] + mov edx, areacolor ; color of work area RRGGBB + mov edi, caption + int 0x40 +; start_draw_window 100,70,SCREEN_WIDTH+9,SCREEN_HEIGHT+29,0x04224466,labelt;, 14;labellen-labelt + end_draw_window +} + +macro mmx_shade +{ + mov ecx, SCREEN_WIDTH*SCREEN_HEIGHT/8 + mov edi,buffer + movq mm1, [sub_mask] +.lop: + movq mm0, [edi] + psubusb mm0, mm1 + movq [edi], mm0 + add edi, 8 + loop .lop +} + +macro mmx_blur_prepare +{ + mov ecx, (SCREEN_WIDTH*SCREEN_HEIGHT-330*2)/8 + mov edi,buffer + 328 +} + +macro mmx_blur +{ +local .lop +.lop: + movq mm0, [edi] + movq mm1, [edi+1] + movq mm2, [edi-1] + movq mm3, mm0 + movq mm4, [edi-SCREEN_WIDTH] + movq mm5, [edi+SCREEN_WIDTH] + + pavgb mm0, mm1 ; mm0 = avg(cur,cur+1) + pavgb mm3, mm2 ; mm3 = avg(cur,cur-1) + pavgb mm4, mm5 ; mm4 = avg(cur+320,cur-320) + pavgb mm3, mm4 ; mm3 = avg(avg(cur,cur-1),avg(cur+320,cur-320)) + pavgb mm0, mm3 ; mm0 = avg(avg(cur,cur+1), + + movq [edi], mm0 + add edi, 8 + loop .lop +} + + +macro mmx_blur_right +{ +local .lop +.lop: + movq mm0, [edi] + movq mm1, [edi+1] + movq mm2, [edi+SCREEN_WIDTH] + movq mm3, [edi+SCREEN_WIDTH+1] + pavgb mm0, mm1 + pavgb mm3, mm2 + pavgb mm0, mm3 + movq [edi], mm0 + add edi, 8 + loop .lop +} + +STARTAPP: + +init_palette: + mov edi, pal + xor eax, eax +red_loop: + stosd + stosd + add eax, 0x040000 + and eax, 0xFFFFFF + jnz red_loop + + mov eax, 63*4*65536 +@@: + stosd + stosd + add ax, 0x0404 + jnc @b + +;zero_buffer: + mov ecx, SCREEN_WIDTH*SCREEN_HEIGHT/4 +; mov edi,buffer + xor eax, eax + rep stosd +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Main Functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +virtual at esp +global_x dd ? +global_y dd ? +seed dd ? +end virtual + + db 0x0f, 0x31 + push eax ; seed + push 100*64 ; global_y + push 160*64 ; global_x + + jmp MAIN + + +red: + draw_window +MAIN: + mov ecx, NUM_PARTS + mov ebp, particles + .advance_particles: + mov eax, [ebp+X_OFFSET] + mov ebx, [ebp+Y_OFFSET] + + sar eax, 6 + sar ebx, 6 + + cmp eax, 5 + jb .new_particle + cmp eax, SCREEN_WIDTH-5;315 + jge .new_particle + cmp ebx, 5 + jb .new_particle + cmp ebx, SCREEN_HEIGHT-5;195 + jl .part_ok + + .new_particle: + call init_particle + jmp .advance_particles + + .part_ok: +; mov edi, eax + ; add edi,buffer +; mov eax, SCREEN_WIDTH +; mul ebx + imul edi, ebx, SCREEN_WIDTH + mov dl, [ebp+COLOR_OFFSET] + mov [buffer+eax+edi], dl + +; mov eax, [ebp+X_OFFSET] +; mov ebx, [ebp+Y_OFFSET] +; add eax, [ebp+X_SPEED_OFFSET] +; add ebx, [ebp+Y_SPEED_OFFSET] +; mov [ebp+X_OFFSET], eax +; mov [ebp+Y_OFFSET], ebx + mov eax, [ebp+X_SPEED_OFFSET] + add [ebp+X_OFFSET], eax + mov eax, [ebp+Y_SPEED_OFFSET] + add [ebp+Y_OFFSET], eax + + db 0x0f, 0x31 + and al, 0x7F + jnz .dont_inc_y_speed + inc dword [ebp+Y_SPEED_OFFSET] + .dont_inc_y_speed: + + add ebp, PART_SIZE + loop .advance_particles + + mmx_shade +; jmp .copy_buffer_to_video + mmx_blur_prepare + test dword [blur_right_flag] , 0x800000 + jnz .do_blur_right + mmx_blur + db 0x0f, 0x31 + and al, 1 + jz .blur_ok + jmp .dont_blur + .do_blur_right: + mmx_blur_right + .blur_ok: + add dword [blur_right_flag], 0x1000 + .dont_blur: + + .copy_buffer_to_video: + ; mov eax, 18 ;@WAITVSYNC(); + ; mov ebx, 14 + ; int 0x40 + + mov eax, 48 + mov ebx, 4 + int 0x40 + lea edx, [5*65536+eax] + + mov eax, 65 ;copyfard(0xA000,0,screen,0,16000); + mov ebx, buffer;dword [screen] + mov ecx, SCREEN_WIDTH*65536+SCREEN_HEIGHT ;ecx = w*65536+h +; mov edx, 5*65536+25 ;edx = x*65536+y + push 8 + pop esi + ;mov esi, 8 + mov edi, pal + xor ebp, ebp + int 0x40 + + +still: + mov eax, 11 ; Test if there is an event in the queue. + int 0x40 + + dec eax ; redraw request ? + jz red + dec eax ; key in buffer ? + jz key + dec eax ; button in buffer ? + jz button + + jmp MAIN + + +key: + mov eax, 2 + int 0x40 +; cmp ah, 1 ; Test Esc in Scan +; je close_app + cmp ah, 27 ; Test Esc in ASCII + je close_app + jmp MAIN + +button: +; we have only one button, close +; mov eax, 17 ; Get pressed button code +; int 0x40 +; cmp ah, 1 ; Test x button +; je close_app +; jmp MAIN +; fall through to close_app + +fail: + ; Type something here. +close_app: + mov eax,-1 ; close this program + int 0x40 + +init_particle: + db 0x0f, 0x31 + and al, 0x1F +jnz .dont_re_init_globals + ; init x + call rand + cdq + ;xor dx, dx + mov ebx, SCREEN_WIDTH + div ebx + shl edx, 6 + mov [4+global_x], edx + ; init y + call rand + cdq + ;xor dx, dx + mov ebx, SCREEN_HEIGHT + div ebx + shl edx, 6 + mov [4+global_y], edx +.dont_re_init_globals: + ; init x + mov eax, [4+global_x] + mov [ebp+X_OFFSET], eax + ; init y + mov eax, [4+global_y] + mov [ebp+Y_OFFSET], eax + ; init x speed + call rand + and eax, 31 + sub eax, 15 + ;shl ax, 6 + mov [ebp+X_SPEED_OFFSET], eax + ; init y speed + call rand + and eax, 31 + sub eax, 15 + ;shl ax, 6 + mov [ebp+Y_SPEED_OFFSET], eax + ; init color +; mov ax, 255 + ;call rand + ;and ax, 0xFF + mov [ebp+COLOR_OFFSET], dword 255;ax + ret + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Misc. Functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +rand: + mov eax, [8+seed] + imul eax, 214013 + add eax, 2531011 + mov [8+seed], eax + shr eax, 16 + ret + +; DATA AREA + +; Application Title +labelt db 'Firework demo',0 +;labelt db 'Matrix demo',0 + +;seed: dd 0 +;global_x: dd 160*64 +;global_y: dd 100*64 +sub_mask: dd 0x01010101, 0x01010101 +; x, y, x_speed, y_speed, color +particles: times NUM_PARTS dd 0, 0, 0, 0, 0 +blur_right_flag: dd 0 +;include 'Dex.inc' +I_END: +pal rb 256*4 ;dup(0) +;pal dd 256 dup(0) +;buffer rb 1024*64 +buffer rb SCREEN_WIDTH*SCREEN_HEIGHT + diff --git a/programs/demos/firework/trunk/proc32.inc b/programs/demos/firework/trunk/proc32.inc new file mode 100644 index 0000000000..da6c04cda3 --- /dev/null +++ b/programs/demos/firework/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, \{ 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: + \\\{ 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 } diff --git a/programs/demos/unvwater/trunk/aspapi.inc b/programs/demos/unvwater/trunk/aspapi.inc new file mode 100644 index 0000000000..38a6b50e9b --- /dev/null +++ b/programs/demos/unvwater/trunk/aspapi.inc @@ -0,0 +1,142 @@ +include 'proc32.inc' + +macro start_draw_window x,y,xsize,ysize,areacolor,caption;,capsize +{ + mov eax, 12 ; function 12:tell os about windowdraw + mov ebx, 1 ; 1, start of draw + int 0x40 + ; DRAW WINDOW + mov eax, 48 ; function 48.4 : get skin height + mov ebx, 4 + int 0x40 + push eax + lea ecx, [y*65536+ysize+eax]; [y start] *65536 + [y size] + [skin_height] + xor eax, eax ; function 0 : define and draw window + mov ebx, x*65536+xsize ; [x start] *65536 + [x size] + mov edx, areacolor ; color of work area RRGGBB + ;mov esi, 0x00334455 ; color of grab bar RRGGBB + mov edi, caption;0x00ddeeff ; color of frames RRGGBB + int 0x40 + ; WINDOW LABEL + ;mov eax, 4 ; function 4 : write text to window + ;mov ebx, 8*65536+8 ; [x start] *65536 + [y start] + ;mov ecx, 0x00ffffff ; color of text RRGGBB + ;mov edx, caption ; pointer to text beginning + ;mov esi, capsize ; text length + ;mov eax, 71 ; function 71.1 + ;mov ebx, 1 ; set window caption + ;mov ecx, caption ; pointer to text + ;int 0x40 + pop eax +} + +macro end_draw_window +{ + mov eax, 12 ; end of redraw + mov ebx, 2 + int 0x40 +} + +proc draw_button stdcall, x:dword, y:dword, xsize:dword, ysize:dword, \ + id:dword, butcolor:dword, text:dword, textlen:byte, textcolor:dword + + ;pusha + mov ebx, dword [x] + shl ebx, 16 + add ebx, dword [xsize] ; [x start] *65536 + [x size] + + mov ecx, dword [y] + shl ecx, 16 + add ecx, dword [ysize] ; [y start] *65536 + [y size] + + mov edx, dword [id] ; button id + mov esi, dword [butcolor] ; button color RRGGBB + mov eax, 8 ; function 8 : define and draw button + int 0x40 + + mov ebx, dword [x] + add ebx, 5 + shl ebx, 16 + mov eax, dword [ysize] + sub eax, 5 + shr eax, 1 + add ebx, eax + add ebx, dword [y] ;mov ebx, (x+5)*65536+y+(ysize-5)/2 ; Draw button text + + mov ecx, dword [textcolor] + mov edx, dword [text] + xor eax, eax + mov al, byte [textlen] + mov esi, eax + mov eax, 4 + int 0x40 + ;popa +ret +endp + +macro outtextxy x,y,prompt,prompt_len,color +{ + pusha + mov ebx, x*65536+y ; draw info text with function 4 + mov ecx, color + mov edx, prompt + xor eax, eax + mov al, prompt_len + mov esi, eax + mov eax, 4 + int 0x40 + popa +} + +;proc bar x:dword, y:dword, xsize:dword, ysize:dword, color:dword +macro bar x, y, xsize, ysize, color +{ + pusha + mov eax, 13 + ;mov ebx, [x] + ;shl ebx, 16 + ;add ebx, [xsize] + ;mov ecx, [y] + ;shl ecx, 16 + ;add ecx, [ysize] + ;mov edx, [color] + mov ebx, x*65536+xsize + mov ecx, y*65536+ysize + mov edx, color + + int 0x40 + popa +;ret +;endp +} + +macro line x1,y1,x2,y2,color +{ + pusha + mov eax, 38 + mov ebx, x1*65536+x2 + mov ecx, y1*65536+y2 + mov edx, color + int 0x40 + popa +} + +macro rectangle x,y,xsize,ysize,color +{ + x2=x+xsize + y2=y+ysize + line x,y,x2,y,color + line x,y,x,y2,color + line x,y2,x2,y2,color + line x2,y,x2,y2,color +} + +macro putpixel x,y,color +{ + mov eax, 1 + mov ebx, x + mov ecx, y + mov edx, color + int 0x40 +} + diff --git a/programs/demos/unvwater/trunk/proc32.inc b/programs/demos/unvwater/trunk/proc32.inc new file mode 100644 index 0000000000..da6c04cda3 --- /dev/null +++ b/programs/demos/unvwater/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, \{ 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: + \\\{ 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 } diff --git a/programs/demos/unvwater/trunk/unvwater.asm b/programs/demos/unvwater/trunk/unvwater.asm new file mode 100644 index 0000000000..b20737f363 --- /dev/null +++ b/programs/demos/unvwater/trunk/unvwater.asm @@ -0,0 +1,159 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; A unvwater demo +; Programmed by Octavio Vega Fernandez +; http://octavio.vega.fernandez.googlepages.com/CV4.HTM +; Converted to KolibriOS, By Asper +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +use32 + org 0x0 + + db 'MENUET00' ; 8 byte id + dd 38 ; required os + dd STARTAPP ; program start + dd I_END ; program image size + dd 0x100000 ; required amount of memory + dd 0x00000000 ; reserved=no extended header + +include "aspAPI.inc" +SCREEN_WIDTH equ 100h +SCREEN_HEIGHT equ 100h + + +STARTAPP: + + mov eax, 18 ;Get CPU speed + mov ebx, 5 + int 0x40 + shr eax, 28 + mov dword [delay], eax + +init_palette: + mov edi, Paleta + ;xor eax, eax + mov eax, 0x40 +@@: + stosd + inc al + jnz @b + +MAIN: +l1: + xor esi, esi +l11: + xor ebx, ebx + mov edx, 303h + sub esi, 101h +l2: + and esi, 0xFFFF ;esi=si + add bl, [esi+img] + adc bh, ah + inc esi + dec dh + jnz l2 + + mov dh, 3 + add esi, 100h-3 + dec dl + jnz l2 + sub esi, 1ffh + and esi, 0xFFFF ;esi=si + + mov al, [img+esi] + sub bx, ax + shl ax, 2 + sub bx, ax + shr bx, 2 + + mov ax, bx + shr ax, 7 + sub bx, ax + mov [img+esi], bl + inc si + jnz l11 + + call copy_buffer_to_video + + +still: + mov eax, 11 ; Test if there is an event in the queue. + int 0x40 + + cmp al,1 ; redraw request ? + jz red + cmp al,2 ; key in buffer ? + jz key + cmp al,3 ; button in buffer ? + jz button + + jmp MAIN + +red: + call draw_window + jmp MAIN + + +key: + mov eax, 2 + int 0x40 + cmp ah, 27 ; Test Esc in ASCII + je close_app + jmp MAIN + +button: + mov eax, 17 ; Get pressed button code + int 0x40 + cmp ah, 1 ; Test x button + je close_app + jmp MAIN + +draw_window: + start_draw_window 100,70,SCREEN_WIDTH+10,SCREEN_HEIGHT+5,0x14224466,labelt;, 14;labellen-labelt + mov dword [skin_h], eax + end_draw_window +ret + + +fail: + ; Type something here. +close_app: + mov eax, -1 ; close this program + int 0x40 + + + +copy_buffer_to_video: + pusha + ; mov eax, 18 ;@WAITVSYNC(); + ; mov ebx, 14 + ; int 0x40 + mov eax, 5 ;delay + mov ebx, dword [delay] + int 0x40 + + mov eax, dword [skin_h] + lea edx, [5*65536+eax] + + mov eax, 65 + mov ebx, img + mov ecx, SCREEN_WIDTH*65536+SCREEN_HEIGHT ;ecx = w*65536+h + ; mov edx, 5*65536+25 ;edx = x*65536+y + mov esi, 8 + mov edi, Paleta + xor ebp, ebp + int 0x40 + popa +ret + +; DATA AREA + +; Application Title +labelt db 'UnvWater demo',0 +delay dd 0 +skin_h dd 25 ; Skin height. + +I_END: +Paleta rb 1024 +img db 1 + rb 10000h + diff --git a/programs/system/zkey/trunk/ASPAPI.INC b/programs/system/zkey/trunk/ASPAPI.INC new file mode 100644 index 0000000000..99c818f354 --- /dev/null +++ b/programs/system/zkey/trunk/ASPAPI.INC @@ -0,0 +1,136 @@ +include 'proc32.inc' + +macro start_draw_window x,y,xsize,ysize,areacolor,caption,capsize +{ + ;pusha + mov eax, 12 ; function 12:tell os about windowdraw + mov ebx, 1 ; 1, start of draw + int 0x40 + ; DRAW WINDOW + mov eax, 0 ; function 0 : define and draw window + mov ebx, x*65536+xsize ; [x start] *65536 + [x size] + mov ecx, y*65536+ysize ; [y start] *65536 + [y size] + mov edx, areacolor ; color of work area RRGGBB + mov esi, 0x00334455 ; color of grab bar RRGGBB + mov edi, 0x00ddeeff ; color of frames RRGGBB + int 0x40 + ; WINDOW LABEL + mov eax, 4 ; function 4 : write text to window + mov ebx, 8*65536+8 ; [x start] *65536 + [y start] + mov ecx, 0x00ffffff ; color of text RRGGBB + mov edx, caption ; pointer to text beginning + mov esi, capsize ; text length + int 0x40 + ;popa +} + +macro end_draw_window +{ + mov eax, 12 ; end of redraw + mov ebx, 2 + int 0x40 +} + +proc draw_button stdcall, x:dword, y:dword, xsize:dword, ysize:dword, \ + id:dword, butcolor:dword, text:dword, textlen:byte, textcolor:dword + + ;pusha + mov ebx, dword [x] + shl ebx, 16 + add ebx, dword [xsize] ; [x start] *65536 + [x size] + + mov ecx, dword [y] + shl ecx, 16 + add ecx, dword [ysize] ; [y start] *65536 + [y size] + + mov edx, dword [id] ; button id + mov esi, dword [butcolor] ; button color RRGGBB + mov eax, 8 ; function 8 : define and draw button + int 0x40 + + mov ebx, dword [x] + add ebx, 5 + shl ebx, 16 + mov eax, dword [ysize] + sub eax, 5 + shr eax, 1 + add ebx, eax + add ebx, dword [y] ;mov ebx, (x+5)*65536+y+(ysize-5)/2 ; Draw button text + + mov ecx, dword [textcolor] + mov edx, dword [text] + xor eax, eax + mov al, byte [textlen] + mov esi, eax + mov eax, 4 + int 0x40 + ;popa +ret +endp + +macro outtextxy x,y,prompt,prompt_len,color +{ + pusha + mov ebx, x*65536+y ; draw info text with function 4 + mov ecx, color + mov edx, prompt + xor eax, eax + mov al, prompt_len + mov esi, eax + mov eax, 4 + int 0x40 + popa +} + +;proc bar x:dword, y:dword, xsize:dword, ysize:dword, color:dword +macro bar x, y, xsize, ysize, color +{ + pusha + mov eax, 13 + ;mov ebx, [x] + ;shl ebx, 16 + ;add ebx, [xsize] + ;mov ecx, [y] + ;shl ecx, 16 + ;add ecx, [ysize] + ;mov edx, [color] + mov ebx, x*65536+xsize + mov ecx, y*65536+ysize + mov edx, color + + int 0x40 + popa +;ret +;endp +} + +macro line x1,y1,x2,y2,color +{ + pusha + mov eax, 38 + mov ebx, x1*65536+x2 + mov ecx, y1*65536+y2 + mov edx, color + int 0x40 + popa +} + +macro rectangle x,y,xsize,ysize,color +{ + x2=x+xsize + y2=y+ysize + line x,y,x2,y,color + line x,y,x,y2,color + line x,y2,x2,y2,color + line x2,y,x2,y2,color +} + +macro putpixel x,y,color +{ + mov eax, 1 + mov ebx, x + mov ecx, y + mov edx, color + int 0x40 +} + diff --git a/programs/system/zkey/trunk/ZKEY.ASM b/programs/system/zkey/trunk/ZKEY.ASM new file mode 100644 index 0000000000..ce2c51f8dd --- /dev/null +++ b/programs/system/zkey/trunk/ZKEY.ASM @@ -0,0 +1,456 @@ +; +; ZKEY. Version 0.5. +; Virtual keyboard for KolibriOS. +; +; Author: Asper +; Date of issue: 26.08.2009 +; Compiler: FASM +; Target: KolibriOS +; + +use32 + org 0x0 + + db 'MENUET00' ; 8 byte id + dd 38 ; required os + dd STARTAPP ; program start + dd I_END ; program image size + dd 0x100000 ; required amount of memory + dd 0x00000000 ; reserved=no extended header + +include "aspAPI.inc" + +N_KEYCOLOR equ 0x00677889 ; Normal button color +C_KEYCOLOR equ 0x00344556 ; Control button color +L_KEYCOLOR equ 0x00258778 ; Lock button color +TEXTCOLOR equ 0x00FFFFFF ; Button caption color + + +STARTAPP: + mov ecx, 1 ; to send scancodes. + call set_keyboard_mode + + call reload_ascii_keymap + call draw_window + jmp get_zkey_window_slot_number + +draw_window: + test byte [red_type], 1 + jnz @f + test byte [red_type], 2 + jnz .draw_switch_button + start_draw_window 100,370,600,210,0x04224466,labelt, 35;labellen-labelt + + stdcall draw_button, 15,50,23,20,2,N_KEYCOLOR,keyText,3,TEXTCOLOR ; Esc + + stdcall draw_button, 70,50,23,20,3,N_KEYCOLOR,keyText+3,2,TEXTCOLOR ; F1 + stdcall draw_button, 95,50,23,20,4,N_KEYCOLOR,keyText+5,2,TEXTCOLOR ; F2 + stdcall draw_button, 120,50,23,20,5,N_KEYCOLOR,keyText+7,2,TEXTCOLOR ; F3 + stdcall draw_button, 145,50,23,20,6,N_KEYCOLOR,keyText+9,2,TEXTCOLOR ; F4 + + stdcall draw_button, 183,50,23,20,7,N_KEYCOLOR,keyText+11,2,TEXTCOLOR ; F5 + stdcall draw_button, 208,50,23,20,8,N_KEYCOLOR,keyText+13,2,TEXTCOLOR ; F6 + stdcall draw_button, 233,50,23,20,9,N_KEYCOLOR,keyText+15,2,TEXTCOLOR ; F7 + stdcall draw_button, 258,50,23,20,10,N_KEYCOLOR,keyText+17,2,TEXTCOLOR ; F8 + + stdcall draw_button, 296,50,23,20,11,N_KEYCOLOR,keyText+19,2,TEXTCOLOR ; F9 + stdcall draw_button, 321,50,23,20,12,N_KEYCOLOR,keyText+21,3,TEXTCOLOR ; F10 + stdcall draw_button, 346,50,23,20,13,N_KEYCOLOR,keyText+24,3,TEXTCOLOR ; F11 + stdcall draw_button, 371,50,23,20,14,N_KEYCOLOR,keyText+27,3,TEXTCOLOR ; F12 +@@: + stdcall draw_button, 15,80,23,20,15,N_KEYCOLOR,ascii_keymap+41,1,TEXTCOLOR ;keyText+30,2,TEXTCOLOR ; ~ + stdcall draw_button, 40,80,23,20,16,N_KEYCOLOR,ascii_keymap+2,1,TEXTCOLOR ;keyText+32,2,TEXTCOLOR ; 1! + stdcall draw_button, 65,80,23,20,17,N_KEYCOLOR,ascii_keymap+3,1,TEXTCOLOR ;keyText+34,2,TEXTCOLOR ; 2@ + stdcall draw_button, 90,80,23,20,18,N_KEYCOLOR,ascii_keymap+4,1,TEXTCOLOR ;keyText+36,2,TEXTCOLOR ; 3# + stdcall draw_button, 115,80,23,20,19,N_KEYCOLOR,ascii_keymap+5,1,TEXTCOLOR ;keyText+38,2,TEXTCOLOR ; 4$ + stdcall draw_button, 140,80,23,20,20,N_KEYCOLOR,ascii_keymap+6,1,TEXTCOLOR ;keyText+40,2,TEXTCOLOR ; 5% + stdcall draw_button, 165,80,23,20,21,N_KEYCOLOR,ascii_keymap+7,1,TEXTCOLOR ;keyText+42,2,TEXTCOLOR ; 6^ + stdcall draw_button, 190,80,23,20,22,N_KEYCOLOR,ascii_keymap+8,1,TEXTCOLOR ;keyText+44,2,TEXTCOLOR ; 7& + stdcall draw_button, 215,80,23,20,23,N_KEYCOLOR,ascii_keymap+9,1,TEXTCOLOR ;keyText+46,2,TEXTCOLOR ; 8* + stdcall draw_button, 240,80,23,20,24,N_KEYCOLOR,ascii_keymap+10,1,TEXTCOLOR ;keyText+48,2,TEXTCOLOR ; 9( + stdcall draw_button, 265,80,23,20,25,N_KEYCOLOR,ascii_keymap+11,1,TEXTCOLOR ;keyText+50,2,TEXTCOLOR ; 0) + stdcall draw_button, 290,80,23,20,26,N_KEYCOLOR,ascii_keymap+12,1,TEXTCOLOR ;keyText+52,2,TEXTCOLOR ; -_ + stdcall draw_button, 315,80,23,20,27,N_KEYCOLOR,ascii_keymap+13,1,TEXTCOLOR ;keyText+54,2,TEXTCOLOR ; =+ + stdcall draw_button, 340,80,23,20,28,N_KEYCOLOR,ascii_keymap+43,1,TEXTCOLOR ;keyText+56,2,TEXTCOLOR ; \| + stdcall draw_button, 365,80,30,20,29,N_KEYCOLOR,keyText+58,4,TEXTCOLOR ; bksp + + stdcall draw_button, 15 ,103,33,20,30,N_KEYCOLOR,keyText+62,3,TEXTCOLOR ; Tab + stdcall draw_button, 50 ,103,23,20,31,N_KEYCOLOR,ascii_keymap+16,1,TEXTCOLOR ;keyText+65,2,TEXTCOLOR ; Q + stdcall draw_button, 75 ,103,23,20,32,N_KEYCOLOR,ascii_keymap+17,1,TEXTCOLOR ;keyText+67,2,TEXTCOLOR ; W + stdcall draw_button, 100,103,23,20,33,N_KEYCOLOR,ascii_keymap+18,1,TEXTCOLOR ;keyText+69,2,TEXTCOLOR ; E + stdcall draw_button, 125,103,23,20,34,N_KEYCOLOR,ascii_keymap+19,1,TEXTCOLOR ;keyText+71,2,TEXTCOLOR ; R + stdcall draw_button, 150,103,23,20,35,N_KEYCOLOR,ascii_keymap+20,1,TEXTCOLOR ;keyText+73,2,TEXTCOLOR ; T + stdcall draw_button, 175,103,23,20,36,N_KEYCOLOR,ascii_keymap+21,1,TEXTCOLOR ;keyText+75,2,TEXTCOLOR ; Y + stdcall draw_button, 200,103,23,20,37,N_KEYCOLOR,ascii_keymap+22,1,TEXTCOLOR ;keyText+77,2,TEXTCOLOR ; U + stdcall draw_button, 225,103,23,20,38,N_KEYCOLOR,ascii_keymap+23,1,TEXTCOLOR ;keyText+79,2,TEXTCOLOR ; I + stdcall draw_button, 250,103,23,20,39,N_KEYCOLOR,ascii_keymap+24,1,TEXTCOLOR ;keyText+81,2,TEXTCOLOR ; O + stdcall draw_button, 275,103,23,20,40,N_KEYCOLOR,ascii_keymap+25,1,TEXTCOLOR ;keyText+83,2,TEXTCOLOR ; P + stdcall draw_button, 300,103,23,20,41,N_KEYCOLOR,ascii_keymap+26,1,TEXTCOLOR ;keyText+85,3,TEXTCOLOR ; [{ + stdcall draw_button, 325,103,23,20,42,N_KEYCOLOR,ascii_keymap+27,1,TEXTCOLOR ;keyText+88,3,TEXTCOLOR ; ]} + stdcall draw_button, 350,103,45,43,43,N_KEYCOLOR,keyText+91,5,TEXTCOLOR ; Enter + + stdcall draw_button, 15 ,126,43,20,44,L_KEYCOLOR,keyText+96 ,4,TEXTCOLOR ; lock + stdcall draw_button, 60 ,126,23,20,45,N_KEYCOLOR,ascii_keymap+30,1,TEXTCOLOR ;keyText+100,2,TEXTCOLOR ; A + stdcall draw_button, 85 ,126,23,20,46,N_KEYCOLOR,ascii_keymap+31,1,TEXTCOLOR ;keyText+102,2,TEXTCOLOR ; S + stdcall draw_button, 110,126,23,20,47,N_KEYCOLOR,ascii_keymap+32,1,TEXTCOLOR ;keyText+104,2,TEXTCOLOR ; D + stdcall draw_button, 135,126,23,20,48,N_KEYCOLOR,ascii_keymap+33,1,TEXTCOLOR ;keyText+106,2,TEXTCOLOR ; F + stdcall draw_button, 160,126,23,20,49,N_KEYCOLOR,ascii_keymap+34,1,TEXTCOLOR ;keyText+108,2,TEXTCOLOR ; G + stdcall draw_button, 185,126,23,20,50,N_KEYCOLOR,ascii_keymap+35,1,TEXTCOLOR ;keyText+110,2,TEXTCOLOR ; H + stdcall draw_button, 210,126,23,20,51,N_KEYCOLOR,ascii_keymap+36,1,TEXTCOLOR ;keyText+112,2,TEXTCOLOR ; J + stdcall draw_button, 235,126,23,20,52,N_KEYCOLOR,ascii_keymap+37,1,TEXTCOLOR ;keyText+114,2,TEXTCOLOR ; K + stdcall draw_button, 260,126,23,20,53,N_KEYCOLOR,ascii_keymap+38,1,TEXTCOLOR ;keyText+116,2,TEXTCOLOR ; L + stdcall draw_button, 285,126,23,20,54,N_KEYCOLOR,ascii_keymap+39,1,TEXTCOLOR ;keyText+118,3,TEXTCOLOR ; ;: + stdcall draw_button, 310,126,23,20,55,N_KEYCOLOR,ascii_keymap+40,1,TEXTCOLOR ;keyText+121,3,TEXTCOLOR ; '" + + stdcall draw_button, 15 ,149,53,20,56,C_KEYCOLOR,keyText+124,5,TEXTCOLOR ; Shift + stdcall draw_button, 70 ,149,23,20,57,N_KEYCOLOR,ascii_keymap+44,1,TEXTCOLOR ;keyText+129,2,TEXTCOLOR ; Z + stdcall draw_button, 95 ,149,23,20,58,N_KEYCOLOR,ascii_keymap+45,1,TEXTCOLOR ;keyText+131,2,TEXTCOLOR ; X + stdcall draw_button, 120,149,23,20,59,N_KEYCOLOR,ascii_keymap+46,1,TEXTCOLOR ;keyText+133,2,TEXTCOLOR ; C + stdcall draw_button, 145,149,23,20,60,N_KEYCOLOR,ascii_keymap+47,1,TEXTCOLOR ;keyText+135,2,TEXTCOLOR ; V + stdcall draw_button, 170,149,23,20,61,N_KEYCOLOR,ascii_keymap+48,1,TEXTCOLOR ;keyText+137,2,TEXTCOLOR ; B + stdcall draw_button, 195,149,23,20,62,N_KEYCOLOR,ascii_keymap+49,1,TEXTCOLOR ;keyText+139,2,TEXTCOLOR ; N + stdcall draw_button, 220,149,23,20,63,N_KEYCOLOR,ascii_keymap+50,1,TEXTCOLOR ;keyText+141,2,TEXTCOLOR ; M + stdcall draw_button, 245,149,23,20,64,N_KEYCOLOR,ascii_keymap+51,1,TEXTCOLOR ;keyText+143,3,TEXTCOLOR ; ,< + stdcall draw_button, 270,149,23,20,65,N_KEYCOLOR,ascii_keymap+52,1,TEXTCOLOR ;keyText+146,3,TEXTCOLOR ; .> + stdcall draw_button, 295,149,23,20,66,N_KEYCOLOR,ascii_keymap+53,1,TEXTCOLOR ;keyText+149,2,TEXTCOLOR ; /? + + test byte [red_type], 1 + jnz @f + stdcall draw_button, 320,149,75,20,67,C_KEYCOLOR,keyText+151,5,TEXTCOLOR ; Shift + + stdcall draw_button, 15 ,172,30,20,68,C_KEYCOLOR,keyText+156,4,TEXTCOLOR ; Ctrl + stdcall draw_button, 47 ,172,30,20,69,C_KEYCOLOR,keyText+160,3,TEXTCOLOR ; Win + stdcall draw_button, 79 ,172,30,20,70,C_KEYCOLOR,keyText+163,3,TEXTCOLOR ; Alt + stdcall draw_button, 111,172,156,20,71,N_KEYCOLOR,keyText+166,1,TEXTCOLOR ; Space + stdcall draw_button, 269,172,30,20,72,C_KEYCOLOR,keyText+167,3,TEXTCOLOR ; Alt + stdcall draw_button, 301,172,30,20,73,C_KEYCOLOR,keyText+170,3,TEXTCOLOR ; Win + stdcall draw_button, 333,172,30,20,74,C_KEYCOLOR,keyText+173,3,TEXTCOLOR ; [=] + stdcall draw_button, 365,172,30,20,75,C_KEYCOLOR,keyText+176,4,TEXTCOLOR ; Ctrl + + stdcall draw_button, 405,50 ,23,20,76,N_KEYCOLOR,keyText+180,3,TEXTCOLOR ; psc + stdcall draw_button, 430,50 ,23,20,77,L_KEYCOLOR,keyText+183,3,TEXTCOLOR ; slk + stdcall draw_button, 455,50 ,23,20,78,N_KEYCOLOR,keyText+186,3,TEXTCOLOR ; brk + stdcall draw_button, 405,80 ,23,20,79,N_KEYCOLOR,keyText+189,3,TEXTCOLOR ; Ins + stdcall draw_button, 430,80 ,23,20,80,N_KEYCOLOR,keyText+192,2,TEXTCOLOR ; Hm + stdcall draw_button, 455,80 ,23,20,81,N_KEYCOLOR,keyText+194,3,TEXTCOLOR ; Pup + stdcall draw_button, 405,103 ,23,20,82,N_KEYCOLOR,keyText+197,3,TEXTCOLOR ; Del + stdcall draw_button, 430,103 ,23,20,83,N_KEYCOLOR,keyText+200,3,TEXTCOLOR ; End + stdcall draw_button, 455,103 ,23,20,84,N_KEYCOLOR,keyText+203,3,TEXTCOLOR ; Pdn + stdcall draw_button, 430,149,23,20,85,C_KEYCOLOR,keyText+206,1,TEXTCOLOR ; ^ + stdcall draw_button, 405,172,23,20,86,C_KEYCOLOR,keyText+207,1,TEXTCOLOR ; v + stdcall draw_button, 430,172,23,20,87,C_KEYCOLOR,keyText+208,1,TEXTCOLOR ; < + stdcall draw_button, 455,172,23,20,88,C_KEYCOLOR,keyText+209,2,TEXTCOLOR ; > + + stdcall draw_button, 488,80 ,23,20,89,L_KEYCOLOR,keyText+211,3,TEXTCOLOR ; nlk + stdcall draw_button, 513,80 ,23,20,90,N_KEYCOLOR,keyText+214,1,TEXTCOLOR ; / + stdcall draw_button, 538,80 ,23,20,91,N_KEYCOLOR,keyText+215,1,TEXTCOLOR ; * + stdcall draw_button, 563,80 ,23,20,92,N_KEYCOLOR,keyText+216,1,TEXTCOLOR ; - + stdcall draw_button, 488,103 ,23,20,93,N_KEYCOLOR,keyText+217,1,TEXTCOLOR ; 7 + stdcall draw_button, 513,103 ,23,20,94,N_KEYCOLOR,keyText+218,1,TEXTCOLOR ; 8 + stdcall draw_button, 538,103 ,23,20,95,N_KEYCOLOR,keyText+219,1,TEXTCOLOR ; 9 + stdcall draw_button, 488,126,23,20,96,N_KEYCOLOR,keyText+220,1,TEXTCOLOR ; 4 + stdcall draw_button, 513,126,23,20,97,N_KEYCOLOR,keyText+221,1,TEXTCOLOR ; 5 + stdcall draw_button, 538,126,23,20,98,N_KEYCOLOR,keyText+222,1,TEXTCOLOR ; 6 + stdcall draw_button, 488,149,23,20,99,N_KEYCOLOR,keyText+223,1,TEXTCOLOR ; 1 + stdcall draw_button, 513,149,23,20,100,N_KEYCOLOR,keyText+224,1,TEXTCOLOR ; 2 + stdcall draw_button, 538,149,23,20,101,N_KEYCOLOR,keyText+225,1,TEXTCOLOR ; 3 + stdcall draw_button, 488,172,48,20,102,N_KEYCOLOR,keyText+226,1,TEXTCOLOR ; 0 + stdcall draw_button, 538,172,23,20,103,N_KEYCOLOR,keyText+227,1,TEXTCOLOR ; . + stdcall draw_button, 563,103 ,23,43,104,N_KEYCOLOR,keyText+228,1,TEXTCOLOR ; + + stdcall draw_button, 563,149,23,43,105,N_KEYCOLOR,keyText+229,3,TEXTCOLOR ; Ent + + .draw_switch_button: + mov eax, 6 + mul byte [keyboard_mode] + add eax, SwitchText + stdcall draw_button, 513,28,46,20,106,0x00700000,eax,6,TEXTCOLOR ; Scan/ASCII switch +@@: + .draw_indicators_area: + call lights_on + + mov byte [red_type], 0 + end_draw_window +ret + +get_zkey_window_slot_number: + mov eax, 18 + mov ebx, 7 + int 0x40 + mov [zkey_window], eax +set_event_mask: + mov eax, 40 + mov ebx, 39 + int 0x40 + +still: + call get_receiver_window_slot_number + + + mov eax, 10 ; Wait for an event in the queue. + int 0x40 + + cmp al,1 ; redraw request ? + jz red + cmp al,2 ; key in buffer ? + jz key + cmp al,3 ; button in buffer ? + jz button + + jmp still + +red: + call draw_window + jmp still + +key: + mov eax, 2 + int 0x40 + +; push ax + call get_control_keys_state + cmp [locks], ax + je @f + + .reload: + call reload_ascii_keymap + mov byte [red_type], 1 + call draw_window + @@: +; pop dx +; jmp button.select_key_code + jmp still + +button: + mov eax, 17 ; Get pressed button code + int 0x40 + cmp ah, 1 ; Test x button + je close_app + + cmp ah, 106 ; Test Scan/ASCII switch button + jne .keyboard_keys + mov cl, 1 + sub cl, byte [keyboard_mode] + call set_keyboard_mode + mov byte [red_type], 2 + jmp red + + .keyboard_keys: + cmp ah, 2 ; Test if pressed buttons + jb still ; is a ZKEY keyboard key... + cmp ah, 106 + jnb still ; ...so, if not then still, + mov [butt], ah ; if yes then save pressed button ID + .test_slot: + mov eax, [zkey_window] ; Test is receiver ZKEY window + mov ecx, [receiver_window] + cmp eax, ecx + je still ; if yes still. + .activate_receiver_window: + mov eax, 18 + mov ebx, 3 + int 0x40 + + call reload_ascii_keymap + + .read_key_scancode: + xor edx, edx + movzx si, byte [butt] ; Read scan code of the key from the table. + sub si, 2 + mov dl, [keyCodes+si] ; Set dl = scancode of the key corresponding to the pressed button. + cmp dl, 0xA0 + jb .select_key_code ; If not extended key then select ascii or scan to send and then send it to the receiver. + + cmp dl, 0xA6 ; Test if it's extended2 key + jne .read_ext_key ; if not go to prepare to send simply extended key. + mov dl, 0xE1 ; Send extended2 scancode... + call send_key + mov dl, 0x1D ; ...and extended scancode, + call send_key ; + mov dl, [keyCodes.ext2] ; (There is only one ext2 key - 'Break') + jmp .send_key_code ; so... send it's normal scan code. + .read_ext_key: + sub dl, 0xA0 ; Read extended key scan code from the table. + movzx si, dl + mov dl, [keyCodes.ext+si] + .send_ext: + push dx ; Send extended scancode to the receiver's window. + mov dl, 0xE0 + call send_key + pop dx +; jmp .send_key_code + .select_key_code: ; Select what to send ASCII or scan. + cmp [keyboard_mode], 0 ; Test if ZKEY must send ASCII. + jne .send_key_code + +; mov esi, ext0 ; Set esi to the beginning of the ext0 table. + and edx, 0x7F +; @@: +; cmp dl, byte [esi] +; je .send_key_code +; inc esi +; cmp esi, ext0end +; jng @b + .read_ascii: + mov dl, byte [ascii_keymap+edx] ; Read ASCII from the keymap table. + .send_key_code: + call send_key ; Finally send the key to the receiver's window. + .wait: + mov eax, 5 + mov ebx, 1 ; Wait 0.01 second. + int 0x40 + .activate_zkey_window: + mov eax, 18 + mov ebx, 3 + mov ecx, [zkey_window] + int 0x40 + + jmp still + + +close_app: + mov eax,-1 ; close this program + int 0x40 + + +;********************************** +;* input: ecx = type of mode * +;********************************** + +set_keyboard_mode: + mov eax, 66 + mov ebx, 1 ; Set keyboard mode + int 0x40 + mov [keyboard_mode], cl +ret + +get_control_keys_state: ; This routine works only in Scan keyboard mode. + mov eax, 66 + mov ebx, 3 + int 0x40 +ret + + +;********************************** +;* input: ecx = type of map * +;********************************** + +get_keyboard_map: + mov eax, 26 + mov ebx, 2 + mov edx, ascii_keymap + int 0x40 +ret + + +reload_ascii_keymap: + call get_control_keys_state + mov ecx, 1 + + test ax, 3 ; Shift pressed ? + jnz @f + test ax, 0x40 ; Caps Lock on ? + jz .load_ascii_keymap + @@: + mov ecx, 2 + .load_ascii_keymap: + call get_keyboard_map + ret + + + +get_receiver_window_slot_number: + mov eax, 18 + mov ebx, 7 + int 0x40 + mov ebx, [zkey_window] + cmp eax, ebx + je @f + mov [receiver_window], eax + @@: + ret + +;************************************ +;* input: edx = code of the key * +;************************************ + +send_key: + mov eax, 72 + mov ebx, 1 + mov ecx, 2 + int 0x40 + ret + +lights_on: + bar 491,51,95,15,0 ; indicators area + rectangle 490,50,96,16,TEXTCOLOR + + call get_control_keys_state + mov [locks], ax + test ax, 0x40 + jz @f + ;stdcall bar, 532, 53, 10, 11, 0x0000FF00 + bar 532, 53, 10, 11, 0x0000FF00 + @@: + test ax, 0x80 + jz @f + ;stdcall bar, 500, 53, 10, 11, 0x0000FF00 + bar 500, 53, 10, 11, 0x0000FF00 + @@: + test ax, 0x100 + jz @f + ;stdcall bar, 565, 53, 10, 11, 0x0000FF00 + bar 565, 53, 10, 11, 0x0000FF00 + @@: +ret + +; DATA AREA + +; Application Title +labelt db 'ZKEY v.0.5 - keyboard for KolibriOS' +labellen: + +SwitchText db ' ASCII SCAN ' + +;Button names +keyText db 'EscF1F2F3F4F5F6F7F8F9F10F11F12' + db '~1!2@3#4$5%6^7&8*9(0)-_=+\|bksp' + db 'TabQWERTYUIOP{[}]Enter' + db 'lockASDFGHJKL;:''"' + db 'ShiftZXCVBNM,<.>/?Shift' + db 'CtrlWinAlt AltWin[=]Ctrl' + db 'pscslkbrkInsHmPupDelEndPdn^' + db 'nlk/*-7894561230.+Ent' + +;Key scan codes +keyCodes: + db 0x01, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x57, 0x58 + db 0x29, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x2B, 0x0E + db 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C + db 0x3A, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28 + db 0x2A, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36 + db 0x1D, 0xA0, 0x38, 0x39, 0xA1, 0xA2, 0xA3, 0xA4 + db 0xA5, 0x46, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0 + db 0x45, 0xB1, 0x37, 0x4A, 0x47, 0x48, 0x49, 0x4B, 0x4C, 0x4D, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x4E, 0xB2 + .ext: + db 0x5B, 0x38, 0x5C, 0x5D, 0x1D + db 0x37, 0x00, 0x52, 0x47, 0x49, 0x53, 0x4F, 0x51, 0x48, 0x4B, 0x50, 0x4D + db 0x35, 0x1C + .ext2 db 0x45 ; Just Break :) + +;ext0: +; db 0x1D, 0x29, 0x2A, 0x36, 0x37, 0x38, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40 +; db 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D +; db 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x57, 0x58 +;ext0end: + +receiver_window dd 0 ; Slot number of the receiver +zkey_window dd 0 ; Slot number of ZKEY +butt db 0 ; Pressed button ID +locks dw 0 ; NumLock, CapsLock, ScrollLock lights mask + +keyboard_mode db 0 ; Scan or ASCII keys to send ? 0 - ASCII , 1 - Scan +red_type db 0 ; Type of window redraw. 0 - default , 1 - on ASCII_keymap change , 2 - Switch button pressed. + +I_END: ; End of application code and data marker + +ascii_keymap: diff --git a/programs/system/zkey/trunk/proc32.inc b/programs/system/zkey/trunk/proc32.inc new file mode 100644 index 0000000000..da6c04cda3 --- /dev/null +++ b/programs/system/zkey/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, \{ 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: + \\\{ 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 }