Made bitblt work in 32bpp mode

This commit is contained in:
Michał Isalski
2026-09-11 01:16:53 +02:00
parent b30a627d0a
commit cdbbd9e20f
+24 -12
View File
@@ -17,8 +17,8 @@ include errno
; 101 - reserved
; 110 - reserved
; 111 - SRCALPHA (copies source over destination if: source != 0 (for 8bpp), source.alpha != 0 (for 32bpp))
; Stack argument 1: Width (in bytes)
; Stack argument 2: Height (in bytes)
; Stack argument 1: Width
; Stack argument 2: Height
; Result: None
; Clobbers: r1, r2, r3, r4, r5, r6, r7
; Errors: BUFFER_DEPTH_MISMATCH - if the buffers have different bit depths
@@ -40,22 +40,29 @@ pub bitblit:
jmp r13
bitblit_depth_good:
push r8
add sp, sp, 12
load_32 r8, [sp] ; r8 = height
add sp, sp, 4
load_32 r9, [sp] ; r9 = width
sub sp, sp, 16
push r10
push r11
push r12
push r13
push r7
mov r7, r8
lsr r7, r7, 4
add r10, r1, 4 ; r10 = pointer to destination stride
load_16 r10, [r10] ; r10 = destination stride
lsl r10, r10, r7
add r11, r2, 4 ; r11 = pointer to source stride
load_16 r11, [r11] ; r11 = source stride
lsl r11, r11, r7
add sp, sp, 32
load_32 r8, [sp] ; r8 = height
add sp, sp, 4
load_32 r9, [sp] ; r9 = width
lsl r9, r9, r7
sub sp, sp, 36
; Calculating destination index
push r10
@@ -74,6 +81,7 @@ pub bitblit:
add r4, r4, r12 ; Now r4 is dest_y * dest_stride
load_32 r1, [r1] ; r1 = destination data pointer
add r1, r1, r4 ; Now r1 is dest_pointer + dest_y * dest_stride
lsl r3, r3, r7
add r1, r1, r3 ; Now r1 is dest_pointer + dest_y * dest_stride + dest_x
pop r10
@@ -94,8 +102,11 @@ pub bitblit:
add r6, r6, r12 ; Now r6 is src_y * src_stride
load_32 r2, [r2] ; r2 = source data pointer
add r2, r2, r6 ; Now r2 is src_pointer + src_y * src_stride
lsl r5, r5, r7
add r2, r2, r5 ; Now r2 is src_pointer + src_y * src_stride + src_x
pop r11
pop r7
; r3, r4, r5, r6 are now free
@@ -133,8 +144,7 @@ pub bitblit:
push r2
bitblit_copy_line_loop: ; Main loop that copies 4 bytes at a time
add r3, r3, 4
cmp r9, r3
je bitblit_copy_line_finish
cmp r9, r3
jb bitblit_copy_line_end
load_32 r6, [r5] ; r6 = [src]
load_32 r13, [r4] ; r13 = [dest]
@@ -201,6 +211,8 @@ pub bitblit:
mov r6, r13 ; If it was zero, we take [dest], i.e. don't overwrite
bitblit_save_bits:
store_32 [r4], r6
cmp r9, r3
je bitblit_copy_line_finish
add r4, r4, 4
add r5, r5, 4
jmp bitblit_copy_line_loop
@@ -253,4 +265,4 @@ pub bitblit:
pop r8
add sp, sp, 8
mov flags, errno.OK
jmp r13
jmp r13