diff --git a/src/graphics.asm b/src/graphics.asm index 9c70571..005e887 100644 --- a/src/graphics.asm +++ b/src/graphics.asm @@ -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 \ No newline at end of file + jmp r13