From 34093cd781384cb93f1f56cecd2dd7898b2a9d10 Mon Sep 17 00:00:00 2001 From: IgorA Date: Mon, 17 Mar 2025 00:43:15 +0200 Subject: [PATCH] Movback: Added support window resizing --- programs/demos/movback/Tupfile.lua | 7 +- programs/demos/movback/movback.asm | 293 +++++++++++++++++------------ 2 files changed, 174 insertions(+), 126 deletions(-) diff --git a/programs/demos/movback/Tupfile.lua b/programs/demos/movback/Tupfile.lua index dd4f17306..c38dbe81d 100644 --- a/programs/demos/movback/Tupfile.lua +++ b/programs/demos/movback/Tupfile.lua @@ -1,7 +1,2 @@ if tup.getconfig("NO_FASM") ~= "" then return end -HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR") -tup.include(HELPERDIR .. "/use_fasm.lua") -add_include(tup.getvariantdir()) - -tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "en_US" or tup.getconfig("LANG")) .. " > %o", {"lang.inc"}) -tup.rule({"movback.asm", extra_inputs = {"lang.inc"}}, FASM .. " %f %o " .. tup.getconfig("KPACK_CMD"), "movback") +tup.rule("movback.asm", FASM .. " %f %o " .. tup.getconfig("KPACK_CMD"), "movback") \ No newline at end of file diff --git a/programs/demos/movback/movback.asm b/programs/demos/movback/movback.asm index 040a9714b..17e1c6897 100644 --- a/programs/demos/movback/movback.asm +++ b/programs/demos/movback/movback.asm @@ -7,166 +7,219 @@ include "../../macros.inc" include "../../KOSfuncs.inc" -WND_SIZE_X = 320 -WND_SIZE_Y = 200 +KOS_APP_START + +Screen_W dd 600-10 ;10 px for borders +Screen_H dd 400 VC_DELTA = 1 HC_DELTA = 2 -MEOS_APP_START + CODE - fninit - call init_sinus_table - call init_background - call init_palette - mcall SF_SET_EVENTS_MASK, 101b - jmp .paint_window + mcall SF_SYS_MISC,SSF_HEAP_INIT + call OnResize + fninit + call init_sinus_table + call init_background + call init_palette + mcall SF_SET_EVENTS_MASK, 101b + jmp .paint_window +align 4 .event_loop: - mcall SF_WAIT_EVENT_TIMEOUT, 1 + mcall SF_WAIT_EVENT_TIMEOUT, 1 - test eax,eax - je .draw_screen - dec eax - je .paint_window + test eax,eax + je .draw_screen + dec eax + je .paint_window - mcall SF_TERMINATE_PROCESS + mcall SF_TERMINATE_PROCESS .draw_screen: - test [proc_info.wnd_state], 0x04 - jnz .event_loop - add word [ver_counter],VC_DELTA - add word [hor_counter],HC_DELTA - call handle_animation - xor ebp,ebp - mcall SF_PUT_IMAGE_EXT, virtual_screen_8,,<0,0>,8,_palette - jmp .event_loop + test [proc_info.wnd_state], 0x04 + jnz .event_loop + add word [ver_counter],VC_DELTA + add word [hor_counter],HC_DELTA + call handle_animation + xor ebp,ebp + mov ecx,[Screen_W] + shl ecx,16 + add ecx,[Screen_H] + mcall SF_PUT_IMAGE_EXT, [virtual_screen_8],,<0,0>,8,_palette + jmp .event_loop .paint_window: - mcall SF_THREAD_INFO, proc_info,-1 - mcall SF_REDRAW, SSF_BEGIN_DRAW + mcall SF_THREAD_INFO, proc_info,-1 + cmp dword[proc_info.box.height],0 + je .resize_end + mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT + add eax,4 + sub eax,[proc_info.box.height] + neg eax + cmp eax,[Screen_H] + je .end_h + cmp eax,32 ;min height + jge @f + mov eax,32 + @@: + mov [Screen_H],eax + xor eax,eax + mov [Screen_W],eax + .end_h: + + mov eax,[proc_info.box.width] + sub eax,9 + cmp eax,[Screen_W] + je .resize_end + cmp eax,64 ;min width + jge @f + mov eax,64 + @@: + mov [Screen_W],eax - mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT - lea ecx,[eax + (100 shl 16) + WND_SIZE_Y+4] - mov edi,title - mcall SF_CREATE_WINDOW, <100,WND_SIZE_X+9>,,0x74000000 + call OnResize + .resize_end: - test [proc_info.wnd_state], 0x04 - jnz @f + mcall SF_REDRAW, SSF_BEGIN_DRAW - xor ebp,ebp - mcall SF_PUT_IMAGE_EXT, virtual_screen_8,,<0,0>,8,_palette - @@: - mcall SF_REDRAW, SSF_END_DRAW + mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT + lea ecx,[eax + (100 shl 16) +4] + add ecx,[Screen_H] + mov edi,title + mov ebx,(100 shl 16)+9 + add ebx,[Screen_W] + mcall SF_CREATE_WINDOW,,,0x73000000 - jmp .event_loop + test [proc_info.wnd_state], 0x04 + jnz @f + + xor ebp,ebp + mov ecx,[Screen_W] + shl ecx,16 + add ecx,[Screen_H] + mcall SF_PUT_IMAGE_EXT, [virtual_screen_8],,<0,0>,8,_palette +@@: + mcall SF_REDRAW, SSF_END_DRAW + + jmp .event_loop init_palette: - mov ecx,256 - mov edi,_palette - xor eax,eax + mov ecx,256 + mov edi,_palette + xor eax,eax .next_pal: - mov al,ah - shr al,2 - stosb - stosb - stosb - stosb - inc ah - loop .next_pal - ret + mov al,ah + shr al,2 + stosb + stosb + stosb + stosb + inc ah + loop .next_pal + ret init_sinus_table: - sub esp,4 - mov ecx,256 - mov edi,sinetable + sub esp,4 + mov ecx,256 + mov edi,sinetable .sin_loop: - fld dword [esp] - fld st0 - fsin - fmul [scale_sin] - fistp word [edi] - fadd [delta_angle] - fstp dword [esp] - add edi,2 - loop .sin_loop - add esp,4 - ret + fld dword [esp] + fld st0 + fsin + fmul [scale_sin] + fistp word [edi] + fadd [delta_angle] + fstp dword [esp] + add edi,2 + loop .sin_loop + add esp,4 + ret init_background: - mov edi,background - xor edx,edx + mov edi,background + xor edx,edx .ib_vertical: - xor ecx,ecx + xor ecx,ecx .ib_horizontal: - mov eax,ecx - xor eax,edx - stosb - inc ecx - cmp ecx,256 - jne .ib_horizontal - inc edx - cmp edx,256 - jne .ib_vertical - ret + mov eax,ecx + xor eax,edx + stosb + inc ecx + cmp ecx,256 + jne .ib_horizontal + inc edx + cmp edx,256 + jne .ib_vertical + ret -s_OFFX = 0 -s_OFFY = 2 +align 4 +OnResize: + mov ecx,[Screen_W] + imul ecx,[Screen_H] + mcall SF_SYS_MISC,SSF_MEM_REALLOC,,[virtual_screen_8] + mov [virtual_screen_8],eax + ret + +s_OFFX = 0 +s_OFFY = 2 handle_animation: - sub esp,4 - mov ebx,[ver_counter] - and ebx,255 - add ebx,ebx - mov ax,[sinetable+ebx] - mov [esp+s_OFFY],ax - mov ebx,[hor_counter] - and ebx,255 - add ebx,ebx - mov ax,[sinetable+ebx] - mov [esp+s_OFFX],ax - mov edi,virtual_screen_8 - mov edx,WND_SIZE_Y-1 + sub esp,4 + mov ebx,[ver_counter] + and ebx,255 + add ebx,ebx + mov ax,[sinetable+ebx] + mov [esp+s_OFFY],ax + mov ebx,[hor_counter] + and ebx,255 + add ebx,ebx + mov ax,[sinetable+ebx] + mov [esp+s_OFFX],ax + mov edi,[virtual_screen_8] + mov edx,[Screen_H] + dec edx .a_ver: - mov ecx,WND_SIZE_X-1 - mov bx,[esp+s_OFFY] - add bx,dx - and ebx,255 - shl ebx,8 + mov ecx,[Screen_W] + dec ecx + mov bx,[esp+s_OFFY] + add bx,dx + and ebx,255 + shl ebx,8 .a_hor: - mov ax,[esp+s_OFFX] - add ax,cx - and eax,255 - mov al,[background+ebx+eax] - stosb - dec ecx - jge .a_hor - dec edx - jge .a_ver - add esp,4 - ret + mov ax,[esp+s_OFFX] + add ax,cx + and eax,255 + mov al,[background+ebx+eax] + stosb + dec ecx + jge .a_hor + dec edx + jge .a_ver + add esp,4 + ret DATA - delta_angle dd 0.0245436926066 ; pi/128 - scale_sin dd 128.0 + delta_angle dd 0.0245436926066 ; pi/128 + scale_sin dd 128.0 - title db 'MoveBack',0 + title db 'MoveBack',0 UDATA - ver_counter dd ? - hor_counter dd ? + ver_counter dd ? + hor_counter dd ? - _palette: rd 256 + _palette: rd 256 - virtual_screen_8: - rb WND_SIZE_X*WND_SIZE_Y + virtual_screen_8 dd ? - background: - rb 256*256 +background: + rb 256*256 - sinetable: - rw 256 +sinetable: + rw 256 - proc_info process_information + proc_info process_information -MEOS_APP_END +KOS_APP_END