summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/h8/h8.cpp
diff options
context:
space:
mode:
author Devin Acker <d@revenant1.net>2021-10-13 03:35:00 -0400
committer GitHub <noreply@github.com>2021-10-13 09:35:00 +0200
commit8962638b779165a93817553a4d75cd15dcabecf6 (patch)
treebeba0ea20d2e6521ed4f27cb50160e170797ca9e /src/devices/cpu/h8/h8.cpp
parenta15538b4aeffee95a0821ca8de71ca94d6fe864d (diff)
Casio CTK-551 [Daivn Acker]
* New machine marked as NOT_WORKING ---------------------------------- Casio CTK-551 [Devin Acker]
Diffstat (limited to 'src/devices/cpu/h8/h8.cpp')
-rw-r--r--src/devices/cpu/h8/h8.cpp93
1 files changed, 68 insertions, 25 deletions
diff --git a/src/devices/cpu/h8/h8.cpp b/src/devices/cpu/h8/h8.cpp
index 0b4d35ebbd5..985f9f6715d 100644
--- a/src/devices/cpu/h8/h8.cpp
+++ b/src/devices/cpu/h8/h8.cpp
@@ -28,6 +28,7 @@ h8_device::h8_device(const machine_config &mconfig, device_type type, const char
has_exr = false;
mac_saturating = false;
has_trace = false;
+ has_hc = true;
}
void h8_device::device_config_complete()
@@ -318,7 +319,7 @@ void h8_device::state_string_export(const device_state_entry &entry, std::string
(CCR & F_Z) ? 'Z' : '-',
(CCR & F_V) ? 'V' : '-',
(CCR & F_C) ? 'C' : '-');
- else
+ else if(has_hc)
str = string_format("%c%c%c%c%c%c%c%c",
(CCR & F_I) ? 'I' : '-',
(CCR & F_UI) ? 'u' : '-',
@@ -328,6 +329,16 @@ void h8_device::state_string_export(const device_state_entry &entry, std::string
(CCR & F_Z) ? 'Z' : '-',
(CCR & F_V) ? 'V' : '-',
(CCR & F_C) ? 'C' : '-');
+ else
+ str = string_format("%c%c%c%c%c%c%c%c",
+ (CCR & F_I) ? '?' : '-',
+ (CCR & F_UI) ? 'u' : '-',
+ (CCR & F_H) ? 'I' : '-',
+ (CCR & F_U) ? 'U' : '-',
+ (CCR & F_N) ? 'N' : '-',
+ (CCR & F_Z) ? 'Z' : '-',
+ (CCR & F_V) ? 'V' : '-',
+ (CCR & F_C) ? 'C' : '-');
break;
case H8_R0:
case H8_R1:
@@ -449,9 +460,13 @@ int h8_device::trapa_setup()
uint8_t h8_device::do_addx8(uint8_t v1, uint8_t v2)
{
uint16_t res = v1 + v2 + (CCR & F_C ? 1 : 0);
- CCR &= ~(F_N|F_V|F_Z|F_C|F_H);
- if(((v1 & 0xf) + (v2 & 0xf) + (CCR & F_C ? 1 : 0)) & 0x10)
- CCR |= F_H;
+ CCR &= ~(F_N|F_V|F_Z|F_C);
+ if (has_hc)
+ {
+ CCR &= ~F_H;
+ if(((v1 & 0xf) + (v2 & 0xf) + (CCR & F_C ? 1 : 0)) & 0x10)
+ CCR |= F_H;
+ }
if(!uint8_t(res))
CCR |= F_Z;
else if(int8_t(res) < 0)
@@ -467,9 +482,13 @@ uint8_t h8_device::do_addx8(uint8_t v1, uint8_t v2)
uint8_t h8_device::do_subx8(uint8_t v1, uint8_t v2)
{
uint16_t res = v1 - v2 - (CCR & F_C ? 1 : 0);
- CCR &= ~(F_N|F_V|F_Z|F_C|F_H);
- if(((v1 & 0xf) - (v2 & 0xf) - (CCR & F_C ? 1 : 0)) & 0x10)
- CCR |= F_H;
+ CCR &= ~(F_N|F_V|F_Z|F_C);
+ if (has_hc)
+ {
+ CCR &= ~F_H;
+ if (((v1 & 0xf) - (v2 & 0xf) - (CCR & F_C ? 1 : 0)) & 0x10)
+ CCR |= F_H;
+ }
if(!uint8_t(res))
CCR |= F_Z;
else if(int8_t(res) < 0)
@@ -524,9 +543,13 @@ uint32_t h8_device::do_inc32(uint32_t v1, uint32_t v2)
uint8_t h8_device::do_add8(uint8_t v1, uint8_t v2)
{
uint16_t res = v1 + v2;
- CCR &= ~(F_N|F_V|F_Z|F_C|F_H);
- if(((v1 & 0xf) + (v2 & 0xf)) & 0x10)
- CCR |= F_H;
+ CCR &= ~(F_N|F_V|F_Z|F_C);
+ if (has_hc)
+ {
+ CCR &= ~F_H;
+ if (((v1 & 0xf) + (v2 & 0xf)) & 0x10)
+ CCR |= F_H;
+ }
if(!uint8_t(res))
CCR |= F_Z;
else if(int8_t(res) < 0)
@@ -542,9 +565,13 @@ uint8_t h8_device::do_add8(uint8_t v1, uint8_t v2)
uint16_t h8_device::do_add16(uint16_t v1, uint16_t v2)
{
uint32_t res = v1 + v2;
- CCR &= ~(F_N|F_V|F_Z|F_C|F_H);
- if(((v1 & 0xfff) + (v2 & 0xffff)) & 0x1000)
- CCR |= F_H;
+ CCR &= ~(F_N|F_V|F_Z|F_C);
+ if (has_hc)
+ {
+ CCR &= ~F_H;
+ if (((v1 & 0xfff) + (v2 & 0xffff)) & 0x1000)
+ CCR |= F_H;
+ }
if(!uint16_t(res))
CCR |= F_Z;
else if(int16_t(res) < 0)
@@ -560,9 +587,13 @@ uint16_t h8_device::do_add16(uint16_t v1, uint16_t v2)
uint32_t h8_device::do_add32(uint32_t v1, uint32_t v2)
{
uint64_t res = uint64_t(v1) + uint64_t(v2);
- CCR &= ~(F_N|F_V|F_Z|F_C|F_H);
- if(((v1 & 0xfffffff) + (v2 & 0xfffffff)) & 0x10000000)
- CCR |= F_H;
+ CCR &= ~(F_N|F_V|F_Z|F_C);
+ if (has_hc)
+ {
+ CCR &= ~F_H;
+ if (((v1 & 0xfffffff) + (v2 & 0xfffffff)) & 0x10000000)
+ CCR |= F_H;
+ }
if(!uint32_t(res))
CCR |= F_Z;
else if(int32_t(res) < 0)
@@ -616,9 +647,13 @@ uint32_t h8_device::do_dec32(uint32_t v1, uint32_t v2)
uint8_t h8_device::do_sub8(uint8_t v1, uint8_t v2)
{
uint16_t res = v1 - v2;
- CCR &= ~(F_N|F_V|F_Z|F_C|F_H);
- if(((v1 & 0xf) - (v2 & 0xf)) & 0x10)
- CCR |= F_H;
+ CCR &= ~(F_N|F_V|F_Z|F_C);
+ if (has_hc)
+ {
+ CCR &= ~F_H;
+ if (((v1 & 0xf) - (v2 & 0xf)) & 0x10)
+ CCR |= F_H;
+ }
if(!uint8_t(res))
CCR |= F_Z;
else if(int8_t(res) < 0)
@@ -634,9 +669,13 @@ uint8_t h8_device::do_sub8(uint8_t v1, uint8_t v2)
uint16_t h8_device::do_sub16(uint16_t v1, uint16_t v2)
{
uint32_t res = v1 - v2;
- CCR &= ~(F_N|F_V|F_Z|F_C|F_H);
- if(((v1 & 0xfff) - (v2 & 0xffff)) & 0x1000)
- CCR |= F_H;
+ CCR &= ~(F_N|F_V|F_Z|F_C);
+ if (has_hc)
+ {
+ CCR &= ~F_H;
+ if (((v1 & 0xfff) - (v2 & 0xffff)) & 0x1000)
+ CCR |= F_H;
+ }
if(!uint16_t(res))
CCR |= F_Z;
else if(int16_t(res) < 0)
@@ -652,9 +691,13 @@ uint16_t h8_device::do_sub16(uint16_t v1, uint16_t v2)
uint32_t h8_device::do_sub32(uint32_t v1, uint32_t v2)
{
uint64_t res = uint64_t(v1) - uint64_t(v2);
- CCR &= ~(F_N|F_V|F_Z|F_C|F_H);
- if(((v1 & 0xfffffff) - (v2 & 0xfffffff)) & 0x10000000)
- CCR |= F_H;
+ CCR &= ~(F_N|F_V|F_Z|F_C);
+ if (has_hc)
+ {
+ CCR &= ~F_H;
+ if (((v1 & 0xfffffff) - (v2 & 0xfffffff)) & 0x10000000)
+ CCR |= F_H;
+ }
if(!uint32_t(res))
CCR |= F_Z;
else if(int32_t(res) < 0)