Fix signed integer parsing
This commit is contained in:
parent
eb98415994
commit
a2f5b2e08a
3
Makefile
3
Makefile
|
@ -4,6 +4,9 @@ all:
|
||||||
debug:
|
debug:
|
||||||
ocamlbuild -use-ocamlfind -I src oboy.d.byte
|
ocamlbuild -use-ocamlfind -I src oboy.d.byte
|
||||||
|
|
||||||
|
check:
|
||||||
|
ocamlbuild -use-ocamlfind -I src -lflag -g test/test_cpu.byte --
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf _build
|
rm -rf _build
|
||||||
rm -f *.byte
|
rm -f *.byte
|
||||||
|
|
1
_tags
1
_tags
|
@ -1 +1,2 @@
|
||||||
true: package(unix), package(graphics), warn(A-40-42)
|
true: package(unix), package(graphics), warn(A-40-42)
|
||||||
|
<test/*>: package(ounit)
|
||||||
|
|
13
src/cpu.ml
13
src/cpu.ml
|
@ -127,6 +127,13 @@ let pop_stack cpu mem =
|
||||||
cpu.reg.sp <- (cpu.reg.sp + 1) mod 0xFFFF;
|
cpu.reg.sp <- (cpu.reg.sp + 1) mod 0xFFFF;
|
||||||
merge_bytes low high
|
merge_bytes low high
|
||||||
|
|
||||||
|
let two_complement n =
|
||||||
|
(lnot n) + 1
|
||||||
|
|
||||||
|
let signed_byte n =
|
||||||
|
if n land 0x80 <> 0 then -((two_complement n) land 0xFF)
|
||||||
|
else n
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(**
|
(**
|
||||||
|
@ -165,10 +172,12 @@ let run cpu (mem: Memory.map) =
|
||||||
|
|
||||||
(* jump *)
|
(* jump *)
|
||||||
| '\x20' -> let n = read_pc_byte cpu mem in
|
| '\x20' -> let n = read_pc_byte cpu mem in
|
||||||
let inst = sprintf "JR \tNZ, 0x%02X" n in
|
let s = signed_byte n in
|
||||||
|
let inst = sprintf "JR \tNZ, 0x%02X (%d)" n s in
|
||||||
if cpu.flag.z = false then
|
if cpu.flag.z = false then
|
||||||
begin
|
begin
|
||||||
inc_pc cpu (n - 1); inc_cycles cpu 12;
|
inc_pc cpu (s - 2); (* we read 2 bytes from PC, opcode and n *)
|
||||||
|
inc_cycles cpu 12;
|
||||||
end else
|
end else
|
||||||
inc_cycles cpu 8;
|
inc_cycles cpu 8;
|
||||||
inst
|
inst
|
||||||
|
|
19
test/test_cpu.ml
Normal file
19
test/test_cpu.ml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
open OUnit2
|
||||||
|
|
||||||
|
|
||||||
|
let test_signed test_ctx =
|
||||||
|
let n = 0xFA in
|
||||||
|
let s = Cpu.signed_byte n in
|
||||||
|
assert_equal s (-6)
|
||||||
|
|
||||||
|
|
||||||
|
(* Name the test cases and group them together *)
|
||||||
|
let suite =
|
||||||
|
"suite">:::
|
||||||
|
[
|
||||||
|
"test signed">:: test_signed
|
||||||
|
]
|
||||||
|
|
||||||
|
let () =
|
||||||
|
run_test_tt_main suite
|
||||||
|
|
Loading…
Reference in a new issue