aboutsummaryrefslogtreecommitdiff
path: root/src/vga.c
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-07-09 21:55:17 +0100
committerJuan J. Martinez <jjm@usebox.net>2023-07-09 21:55:17 +0100
commitf7c861e94eb95579c725dcd5d403acd7b4b318e3 (patch)
treee92db4f270a475de61b79c2f859314992dcd01ac /src/vga.c
parent9ff574061910f9562ccf4b2f6a21dda66e2a3f08 (diff)
downloadgold-mine-run-f7c861e94eb95579c725dcd5d403acd7b4b318e3.tar.gz
gold-mine-run-f7c861e94eb95579c725dcd5d403acd7b4b318e3.zip
Assembler optimised blit copy hardcoded to 16x16
Diffstat (limited to 'src/vga.c')
-rw-r--r--src/vga.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/vga.c b/src/vga.c
index 70a9a67..c78fcec 100644
--- a/src/vga.c
+++ b/src/vga.c
@@ -196,3 +196,28 @@ void blit_copy(const Rect *dst)
dtarget += 320;
}
}
+
+void blit_copy16x16(const Rect *dst)
+{
+ uint8_t *src = buffer + dst->x + dst->y * 320;
+ uint8_t *dtarget = screen + dst->x + dst->y * 320;
+
+ asm volatile (
+ "movl $16, %%eax\n\t"
+ "movl $0x130, %%ebx\n\t"
+ "cld\n\t"
+ "blit_copy16x16_loop:\n\t"
+ "movsl\n\t"
+ "movsl\n\t"
+ "movsl\n\t"
+ "movsl\n\t"
+ "addl %%ebx, %%esi\n\t"
+ "addl %%ebx, %%edi\n\t"
+ "decl %%eax\n\t"
+ "orl %%eax, %%eax\n\t"
+ "jne blit_copy16x16_loop\n\t"
+ : /* no output */
+ : "S" (src), "D" (dtarget)
+ : "ecx", "ebx", "eax"
+ );
+}