diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index 2966c3d2bd..c7bea7beac 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -193,6 +193,7 @@ iglobal dd file_system_lfn ; 70-Common file system interface, version 2 dd syscall_window_settings ; 71-Window settings dd sys_sendwindowmsg ; 72-Send window message + dd blit_32 ; blitter; times 255 - ( ($-servetable2) /4 ) dd undefined_syscall dd sys_end ; -1-end application diff --git a/kernel/trunk/kernel32.inc b/kernel/trunk/kernel32.inc index 9434b8a003..2360d97a2e 100644 --- a/kernel/trunk/kernel32.inc +++ b/kernel/trunk/kernel32.inc @@ -249,6 +249,7 @@ include "sound/playnote.inc" ; player Note for Speaker PC include "video/vesa12.inc" ; Vesa 1.2 functions include "video/vesa20.inc" ; Vesa 2.0 functions +include "video/blitter.inc" ; include "video/vga.inc" ; VGA 16 color functions include "video/cursors.inc" ; cursors functions diff --git a/kernel/trunk/video/blitter.inc b/kernel/trunk/video/blitter.inc new file mode 100644 index 0000000000..388bcd5b3d --- /dev/null +++ b/kernel/trunk/video/blitter.inc @@ -0,0 +1,445 @@ + + + +struc BLITTER +{ + .dc.xmin rd 1 ; 0 + .dc.ymin rd 1 ; 4 + .dc.xmax rd 1 ; 8 + .dc.ymax rd 1 ; 12 + + .sc: + .sc.xmin rd 1 ; 16 + .sc.ymin rd 1 ; 20 + .sc.xmax rd 1 ; 24 + .sc.ymax rd 1 ; 28 + + .dst_x rd 1 ; 32 + .dst_y rd 1 ; 36 + .src_x rd 1 ; 40 + .src_y rd 1 ; 44 + .w rd 1 ; 48 + .h rd 1 ; 52 + + .bitmap rd 1 ; 56 + .stride rd 1 ; 60 + +} + +virtual at 0 + BLITTER BLITTER +end virtual + + +align 4 + +__L1OutCode: + push ebx + mov ebx, 8 + cmp edx, [eax] + jl .L2 + xor ebx, ebx + cmp edx, [eax+8] + setg bl + sal ebx, 2 +.L2: + cmp ecx, [eax+4] + jge .L3 + or ebx, 1 + jmp .L4 + +.L3: + cmp ecx, [eax+12] + jle .L4 + or ebx, 2 +.L4: + mov eax, ebx + pop ebx + ret + +align 4 +block_clip: + push ebp + push edi + push esi + push ebx + sub esp, 4 + + mov ebx, eax + mov [esp], edx + mov ebp, ecx + mov ecx, [ecx] + mov edx, [edx] + mov eax, ebx + call __L1OutCode + + mov esi, eax + mov edx, [esp+28] + mov ecx, [edx] +.L21: + mov eax, [esp+24] + mov edx, [eax] + mov eax, ebx + call __L1OutCode + + mov edi, eax +.L20: + mov eax, edi + and eax, esi + jne .L9 + cmp esi, edi + je .L9 + test esi, esi + jne .L10 + test edi, 1 + je .L11 + mov eax, [ebx+4] + jmp .L25 +.L11: + test edi, 2 + je .L13 + mov eax, [ebx+12] +.L25: + mov edx, [esp+28] + jmp .L22 +.L13: + test edi, 4 + je .L14 + mov eax, [ebx+8] + jmp .L26 +.L14: + and edi, 8 + je .L12 + mov eax, [ebx] +.L26: + mov edx, [esp+24] +.L22: + mov [edx], eax +.L12: + mov eax, [esp+28] + mov ecx, [eax] + jmp .L21 +.L10: + test esi, 1 + je .L16 + mov eax, [ebx+4] + jmp .L23 +.L16: + test esi, 2 + je .L18 + mov eax, [ebx+12] +.L23: + mov [ebp+0], eax + jmp .L17 +.L18: + test esi, 4 + je .L19 + mov eax, [ebx+8] + jmp .L24 +.L19: + and esi, 8 + je .L17 + mov eax, [ebx] +.L24: + mov edx, [esp] + mov [edx], eax +.L17: + mov ecx, [ebp+0] + mov eax, [esp] + mov edx, [eax] + mov eax, ebx + call __L1OutCode + mov esi, eax + jmp .L20 +.L9: + add esp, 4 + pop ebx + pop esi + pop edi + pop ebp + ret + +align 4 +blit_clip: + +.sx0 equ 36 +.sy0 equ 32 +.sx1 equ 28 +.sy1 equ 24 + +.dx0 equ 20 +.dy0 equ 16 +.dx1 equ 12 +.dy1 equ 8 + + + push edi + push esi + push ebx + sub esp, 40 + + mov ebx, ecx + mov edx, [ecx+BLITTER.src_x] + mov [esp+.sx0], edx + mov eax, [ecx+BLITTER.src_y] + mov [esp+.sy0], eax + add edx, [ecx+BLITTER.w] + dec edx + mov [esp+.sx1], edx + add eax, [ecx+BLITTER.h] + dec eax + mov [esp+.sy1], eax + + lea ecx, [esp+.sy0] + lea edx, [esp+.sx0] + lea eax, [ebx+BLITTER.sc] + lea esi, [esp+.sy1] + + mov [esp+4], esi + lea esi, [esp+.sx1] + mov [esp], esi + call block_clip + + mov esi, 1 + test eax, eax + jne .L28 + + mov edi, [esp+.sx0] + mov edx, [ebx+BLITTER.dst_x] + add edx, edi + sub edx, [ebx+BLITTER.src_x] + mov [esp+.dx0], edx + + mov ecx, [esp+.sy0] + mov eax, [ebx+BLITTER.dst_y] + add eax, ecx + sub eax, [ebx+BLITTER.src_y] + mov [esp+.dy0], eax + sub edx, edi + add edx, [esp+.sx1] + mov [esp+.dx1], edx + + sub eax, ecx + add eax, [esp+.sy1] + mov [esp+.dy1], eax + + lea ecx, [esp+.dy0] + lea edx, [esp+.dx0] + lea eax, [esp+.dy1] + mov [esp+4], eax + lea eax, [esp+.dx1] + mov [esp], eax + mov eax, ebx + call block_clip + test eax, eax + jne .L28 + + mov edx, [esp+.dx0] + mov eax, [esp+.dx1] + inc eax + sub eax, edx + mov [ebx+BLITTER.w], eax + + mov eax, [esp+.dy0] + mov ecx, [esp+.dy1] + inc ecx + sub ecx, eax + mov [ebx+BLITTER.h], ecx + + mov ecx, [ebx+BLITTER.src_x] + add ecx, edx + sub ecx, [ebx+BLITTER.dst_x] + mov [ebx+BLITTER.src_x], ecx + + mov ecx, [ebx+BLITTER.src_y] + add ecx, eax + sub ecx, [ebx+BLITTER.dst_y] + mov [ebx+BLITTER.src_y], ecx + mov [ebx+BLITTER.dst_x], edx + mov [ebx+BLITTER.dst_y], eax + xor esi, esi +.L28: + mov eax, esi + add esp, 40 + pop ebx + pop esi + pop edi + + +purge .sx0 +purge .sy0 +purge .sx1 +purge .sy1 + +purge .dx0 +purge .dy0 +purge .dx1 +purge .dy1 + + ret + + + +align 4 + +blit_32: + push ebp + push edi + push esi + push ebx + sub esp, 72 + + mov eax, [TASK_BASE] + mov ebx, [eax-twdw + WDATA.box.width] + mov edx, [eax-twdw + WDATA.box.height] + + xor eax, eax + + mov [esp+BLITTER.dc.xmin], eax + mov [esp+BLITTER.dc.ymin], eax + mov [esp+BLITTER.dc.xmax], ebx + mov [esp+BLITTER.dc.ymax], edx + + mov [esp+BLITTER.sc.xmin], eax + mov [esp+BLITTER.sc.ymin], eax + mov eax, [ecx+24] + dec eax + mov [esp+BLITTER.sc.xmax], eax + mov eax, [ecx+28] + dec eax + mov [esp+BLITTER.sc.ymax], eax + + mov eax, [ecx] + mov [esp+BLITTER.dst_x], eax + mov eax, [ecx+4] + mov [esp+BLITTER.dst_y], eax + + mov eax, [ecx+16] + mov [esp+BLITTER.src_x], eax + mov eax, [ecx+20] + mov [esp+BLITTER.src_y], eax + mov eax, [ecx+8] + mov [esp+BLITTER.w], eax + mov eax, [ecx+12] + mov [esp+BLITTER.h], eax + + + mov eax, [ecx+32] + mov [esp+56], eax + mov eax, [ecx+36] + mov [esp+60], eax + + mov ecx, esp + call blit_clip + test eax, eax + jne .L57 + + inc [mouse_pause] + call [_display.disable_mouse] + + mov eax, [TASK_BASE] + + mov ebx, [esp+BLITTER.dst_x] + mov ebp, [esp+BLITTER.dst_y] + add ebx, [eax-twdw + WDATA.box.left] + add ebp, [eax-twdw + WDATA.box.top] + mov edi, ebp + + imul edi, [_display.pitch] + imul ebp, [_display.width] + add ebp, ebx + add ebp, [_WinMapAddress] + + mov eax, [esp+BLITTER.src_y] + imul eax, [esp+BLITTER.stride] + mov esi, [esp+BLITTER.src_x] + lea esi, [eax+esi*4] + add esi, [esp+BLITTER.bitmap] + + mov ecx, [esp+BLITTER.h] + mov edx, [esp+BLITTER.w] + + test ecx, ecx ;FIXME check clipping + jz .L57 + + test edx, edx + jz .L57 + + cmp [_display.bpp], 32 + jne .core_24 + + lea edi, [edi+ebx*4] + + mov ebx, [CURRENT_TASK] + +align 4 +.outer32: + xor ecx, ecx + +align 4 +.inner32: + cmp [ebp+ecx], bl + jne @F + + mov eax, [esi+ecx*4] + mov [LFB_BASE+edi+ecx*4], eax +@@: + inc ecx + dec edx + jnz .inner32 + + add esi, [esp+BLITTER.stride] + add edi, [_display.pitch] + add ebp, [_display.width] + + mov edx, [esp+BLITTER.w] + dec [esp+BLITTER.h] + jnz .outer32 + +.done: + dec [mouse_pause] + call [draw_pointer] +.L57: + add esp, 72 + pop ebx + pop esi + pop edi + pop ebp + ret + +.core_24: + lea ebx, [ebx+ebx*2] + lea edi, [LFB_BASE+edi+ebx] + mov ebx, [CURRENT_TASK] + +align 4 +.outer24: + mov [esp+64], edi + xor ecx, ecx + +align 4 +.inner24: + cmp [ebp+ecx], bl + jne @F + + mov eax, [esi+ecx*4] + + lea edi, [edi+ecx*2] + mov [edi+ecx], ax + shr eax, 16 + mov [edi+ecx+2], al +@@: + mov edi, [esp+64] + inc ecx + dec edx + jnz .inner24 + + add esi, [esp+BLITTER.stride] + add edi, [_display.pitch] + add ebp, [_display.width] + + mov edx, [esp+BLITTER.w] + dec [esp+BLITTER.h] + jnz .outer24 + + jmp .done