diff options
author | 2021-10-13 03:35:00 -0400 | |
---|---|---|
committer | 2021-10-13 09:35:00 +0200 | |
commit | 8962638b779165a93817553a4d75cd15dcabecf6 (patch) | |
tree | beba0ea20d2e6521ed4f27cb50160e170797ca9e /src/devices/cpu/h8/h8.cpp | |
parent | a15538b4aeffee95a0821ca8de71ca94d6fe864d (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.cpp | 93 |
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) |