diff runtime.S @ 194:811163790e6c

Implement ABCD an SBCD. Fix BTEST with register source.
author Mike Pavone <pavone@retrodev.com>
date Wed, 16 Jan 2013 22:40:56 -0800
parents c66e4636f991
children 209a37eed3e7
line wrap: on
line diff
--- a/runtime.S	Tue Jan 15 00:14:36 2013 -0800
+++ b/runtime.S	Wed Jan 16 22:40:56 2013 -0800
@@ -100,6 +100,64 @@
 	call printf
 	mov $1, %rdi
 	call exit
+
+	.global bcd_add
+bcd_add:
+	xchg %rax, %rdi
+	
+	mov %cl, %ch
+	mov %al, %ah
+	and $0xF, %ch
+	and $0xF, %ah
+	and $0xF0, %cl
+	and $0xF0, %al
+	add %ah, %ch
+	cmp $10, %ch
+	jb no_adjust
+	add $6, %ch
+no_adjust:
+	add %ch, %al
+	add %al, %cl
+	mov $0, %ch
+	jc def_adjust
+	cmp $0xA0, %cl
+	jb no_adjust_h
+def_adjust:
+	add $0x60, %cl
+	mov $1, %ch
+no_adjust_h:
+	
+	mov %rdi, %rax
+	ret
+
+	.global bcd_sub
+bcd_sub:
+	xchg %rax, %rdi
+	
+	mov %cl, %ch
+	mov %al, %ah
+	and $0xF, %ch
+	and $0xF, %ah
+	and $0xF0, %cl
+	and $0xF0, %al
+	sub %ah, %ch
+	cmp $10, %ch
+	jb no_adjusts
+	sub $6, %ch
+no_adjusts:
+	add %ch, %cl
+	sub %al, %cl
+	mov $0, %ch
+	jc def_adjusts
+	cmp $0xA0, %cl
+	jb no_adjust_hs
+def_adjusts:
+	sub $0x60, %cl
+	mov $1, %ch
+no_adjust_hs:
+	
+	mov %rdi, %rax
+	ret
 	
 int_dbg_msg:
 	.asciz "Executing Interrupt!"