diff --git a/programs/develop/libraries/box_lib/trunk/progressbar.mac b/programs/develop/libraries/box_lib/trunk/progressbar.mac index 995af697a3..1bdad5511e 100644 --- a/programs/develop/libraries/box_lib/trunk/progressbar.mac +++ b/programs/develop/libraries/box_lib/trunk/progressbar.mac @@ -1,96 +1,84 @@ macro use_progressbar { -pb equ [ebp + 4 + 8*4] +pb equ [esp + 4 + 8*4] align 16 progressbar_draw: pushad - mov ebp, esp ; draw frame - push ebp - mov [.last_esp], esp mov eax, pb - mov esi, [eax + PB_LEFT] + mov edx, [eax + PB_FRAME_COLOR] + mov ebx, [eax + PB_LEFT] mov edi, [eax + PB_TOP] mov ebp, [eax + PB_WIDTH] - add ebp, esi - dec ebp - mov esp, [eax + PB_HEIGHT] - add esp, edi - dec esp - mov edx, [eax + PB_FRAME_COLOR] + mov esi, [eax + PB_HEIGHT] + add ebp, ebx + add esi, edi + dec ebp + dec esi mov eax, 38 - mov ebx, esi shl ebx, 16 - add ebx, ebp - mov ecx, edi - shl ecx, 16 - add ecx, edi + mov bx, bp + shrd ecx, edi, 16 + mov cx, di int 64 - mov ecx, esp - shl ecx, 16 - add ecx, esp - int 64 + shrd ecx, esi, 16 + mov cx, si + int 64 + shld esi, ebx, 16 mov bx, si - mov ecx, edi - shl ecx, 16 - add ecx, esp - int 64 - mov ebx, ebp - shl ebx, 16 - add ebx, ebp - int 64 - mov esp, [.last_esp] - pop ebp + shrd ecx, edi, 16 + int 64 + shrd ebx, ebp, 16 + mov bx, bp + int 64 ; if min > max then .skip mov eax, pb - mov edx, [eax + PB_MAX] - mov ecx, [eax + PB_MIN] - cmp ecx, edx - ; jg .skip - jne .min_no_eq_max - dec edx -.min_no_eq_max: + mov edx, [eax + PB_MAX] + mov ecx, [eax + PB_MIN] + cmp ecx, edx + ; jg .skip + jne .min_no_eq_max + dec edx +.min_no_eq_max: ; draw all progress rectangle - call get_progress_width - mov edi, eax - mov eax, pb + call get_progress_width + mov edi, eax + mov eax, pb mov ebx, [eax + PB_LEFT] - inc ebx - shl ebx, 16 - add ebx, edi mov ecx, [eax + PB_TOP] - inc ecx - shl ecx, 16 - add ecx, [eax + PB_HEIGHT] - dec ecx - dec ecx mov edx, [eax + PB_PROGRESS_COLOR] - mov eax, 13 + inc ebx + inc ecx + shl ebx, 16 + shl ecx, 16 + add ebx, edi + add ecx, [eax + PB_HEIGHT] + dec ecx + mov eax, 13 + dec ecx int 64 ; draw last part of non-progress rectangle -; edi = pW, esi = W - 2 +; edi = pW, esi = W - 2 sub esi, edi ; width - shr ebx, 16 + shr ebx, 16 add ebx, edi shl ebx, 16 add ebx, esi - mov esi, pb + mov esi, pb mov edx, [esi + PB_BACK_COLOR] - int 64 + int 64 ; .skip: - popad + popad ret 4 -.last_esp dd 0 - align 16 get_progress_width: ; pW = (W-2)(value - min) / (max - min) mov esi, [eax + PB_WIDTH] - dec esi - dec esi mov eax, [eax + PB_VALUE] + dec esi sub eax, ecx + dec esi imul eax, esi neg ecx add ecx, edx @@ -98,61 +86,59 @@ get_progress_width: div ecx ret - align 16 progressbar_progress: pushad - mov ebp, esp ; if min > max then .skip mov eax, pb - mov edx, [eax + PB_MAX] - mov ecx, [eax + PB_MIN] - cmp ecx, edx - ; jg .skip - jne .min_no_eq_max1 - dec edx -.min_no_eq_max1: - call get_progress_width - mov edi, eax + mov edx, [eax + PB_MAX] + mov ecx, [eax + PB_MIN] + cmp ecx, edx + ; jg .skip + jne .min_no_eq_max1 + dec edx +.min_no_eq_max1: + call get_progress_width + mov edi, eax ; increase value mov eax, pb - mov edx, [eax + PB_MAX] - mov ecx, [eax + PB_VALUE] - inc ecx + mov ecx, [eax + PB_VALUE] + mov edx, [eax + PB_MAX] + inc ecx ; if value > max then value = max cmp ecx, edx - jng .next - mov ecx, edx -.next: - mov [eax + PB_VALUE], ecx + jng .next + mov ecx, edx +.next: + mov [eax + PB_VALUE], ecx ; draw new part of progress rectangle mov eax, pb - mov ecx, [eax + PB_MIN] - cmp ecx, edx - jne .min_no_eq_max2 - dec edx -.min_no_eq_max2: + mov ecx, [eax + PB_MIN] + cmp ecx, edx + jne .min_no_eq_max2 + dec edx +.min_no_eq_max2: call get_progress_width - mov esi, eax -; edi = last pW, esi = new pW - mov eax, pb + mov esi, eax +; edi = last pW, esi = new pW + mov eax, pb mov ebx, [eax + PB_LEFT] - inc ebx - add ebx, edi - shl ebx, 16 - add ebx, esi - sub ebx, edi mov ecx, [eax + PB_TOP] - inc ecx - shl ecx, 16 - add ecx, [eax + PB_HEIGHT] - dec ecx - dec ecx mov edx, [eax + PB_PROGRESS_COLOR] - mov eax, 13 - int 64 + inc ebx + inc ecx + add ebx, edi + shl ecx, 16 + shl ebx, 16 + add ecx, [eax + PB_HEIGHT] + add ebx, esi + dec ecx + sub ebx, edi + mov eax, 13 + dec ecx + int 64 ; .skip: - popad + popad ret 4 -restore pb +restore pb } \ No newline at end of file