From 3f7dfe460bee941f6488ce357c8fdaf2018d34e2 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Tue, 8 Sep 2020 16:56:50 +0200 Subject: [PATCH 01/21] declaration exists already in decn.h --- src/decn/decn_test.c | 3 --- src/decn/decn_tests.cpp | 4 ---- 2 files changed, 7 deletions(-) diff --git a/src/decn/decn_test.c b/src/decn/decn_test.c index 41de63a..5b424ce 100644 --- a/src/decn/decn_test.c +++ b/src/decn/decn_test.c @@ -20,9 +20,6 @@ #include #include "decn.h" -extern char Buf[DECN_BUF_SIZE]; - - static dec80 diff; //diff = (acc - diff) / diff diff --git a/src/decn/decn_tests.cpp b/src/decn/decn_tests.cpp index 353af31..11b9240 100644 --- a/src/decn/decn_tests.cpp +++ b/src/decn/decn_tests.cpp @@ -31,10 +31,6 @@ namespace bmp = boost::multiprecision; using Catch::Matchers::Equals; - -extern char Buf[DECN_BUF_SIZE]; - - TEST_CASE("build decn"){ build_dec80("0.0009234567890123456", 7); decn_to_str_complete(&AccDecn); From 7593260487c5ccd55858df305ac110059778e21d Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Tue, 8 Sep 2020 16:57:25 +0200 Subject: [PATCH 02/21] freed some space for the stack --- src/decn/decn.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/decn/decn.c b/src/decn/decn.c index 8c09786..909edb2 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -68,7 +68,7 @@ dec80 AccDecn; __idata dec80 BDecn; __idata dec80 TmpDecn; //used by add_decn() and mult_decn() __idata dec80 Tmp2Decn; //used by recip_decn() and ln_decn() -__idata dec80 Tmp3Decn; //used by recip_decn() and ln_decn() +__xdata dec80 Tmp3Decn; //used by recip_decn() and ln_decn() __xdata dec80 Tmp4Decn; //used by div_decn() and pow_decn() __xdata char Buf[DECN_BUF_SIZE]; @@ -874,7 +874,7 @@ void recip_decn(void){ #undef X_COPY } -inline void div_decn(void){ +void div_decn(void){ #define ACC_COPY Tmp4Decn //holds copy of original acc //store copy of acc for final multiply by 1/x copy_decn(&ACC_COPY, &AccDecn); @@ -1056,7 +1056,7 @@ void ln_decn(void){ #undef NUM_TIMES } -inline void log10_decn(void){ +void log10_decn(void){ ln_decn(); copy_decn(&BDecn, &DECN_LN_10); div_decn(); @@ -1226,14 +1226,14 @@ void exp_decn(void){ #undef NUM_TIMES } -inline void exp10_decn(void){ +void exp10_decn(void){ //exp10_decn() = exp_decn(AccDecn * ln(10)) copy_decn(&BDecn, &DECN_LN_10); mult_decn(); exp_decn(); } -inline void pow_decn(void) { +void pow_decn(void) { if (decn_is_zero(&BDecn)) { copy_decn(&AccDecn, &DECN_1); return; From 4316f928f8944dd278ccb05a35dd5ba7ca91ae7a Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Tue, 8 Sep 2020 23:46:41 +0200 Subject: [PATCH 03/21] added facility to debug the stack pointer on P3_4 (LCD LED cathode) roughly 139 bytes functions were chosen by manually traversing pow_decn to the bottom --- Makefile | 7 ++-- src/calc.c | 1 + src/decn/CMakeLists.txt | 2 +- src/decn/decn.c | 4 ++ src/lcd.c | 6 +++ src/main.c | 7 +++- src/stack_debug.c | 92 +++++++++++++++++++++++++++++++++++++++++ src/stack_debug.h | 54 ++++++++++++++++++++++++ src/utils.c | 5 --- src/utils.h | 5 --- 10 files changed, 167 insertions(+), 16 deletions(-) create mode 100644 src/stack_debug.c create mode 100644 src/stack_debug.h diff --git a/Makefile b/Makefile index ef9bb46..ff4d184 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,9 @@ SDCCOPTS ?= --code-size $(STCCODESIZE) --xram-size 256 --idata-loc 0x80 #SDCCOPTS ?= --code-size $(STCCODESIZE) --xram-size 256 --stack-auto --model-large FLASHFILE ?= main.hex LARGE_LDFLAGS += -L/usr/share/sdcc/lib/large/ +# CFLAGS += -DSTACK_DEBUG # write the stack pointer to P3_4 -SRC = src/lcd.c src/key.c src/utils.c src/decn/decn.c src/calc.c +SRC = src/lcd.c src/key.c src/utils.c src/decn/decn.c src/calc.c src/stack_debug.c OBJ=$(patsubst src%.c,build%.rel, $(SRC)) @@ -13,7 +14,7 @@ all: main build/%.rel: src/%.c src/%.h mkdir -p $(dir $@) - $(SDCC) $(SDCCOPTS) -o $@ -c $< + $(SDCC) $(SDCCOPTS) $(CFLAGS) -o $@ -c $< main: $(OBJ) $(SDCC) -o build/ src/$@.c $(SDCCOPTS) $(CFLAGS) $^ @@ -21,7 +22,7 @@ main: $(OBJ) @ tail -n 5 build/main.mem | head -n 2 @ tail -n 1 build/main.mem cp build/$@.ihx $@.hex - + eeprom: sed -ne '/:..1/ { s/1/0/2; p }' main.hex > eeprom.hex diff --git a/src/calc.c b/src/calc.c index a89e446..9270262 100644 --- a/src/calc.c +++ b/src/calc.c @@ -21,6 +21,7 @@ #include "utils.h" #include "calc.h" +#include "stack_debug.h" __xdata dec80 StoredDecn; __xdata dec80 LastX; diff --git a/src/decn/CMakeLists.txt b/src/decn/CMakeLists.txt index 246c619..7abc9a6 100644 --- a/src/decn/CMakeLists.txt +++ b/src/decn/CMakeLists.txt @@ -12,7 +12,7 @@ target_compile_options(coverage_config INTERFACE -O0 -g --coverage) target_link_libraries(coverage_config INTERFACE --coverage) # decn library -add_library(decn decn.c) +add_library(decn decn.c ../utils.c) # decn library with coverage add_library(decn_cover decn.c) diff --git a/src/decn/decn.c b/src/decn/decn.c index 909edb2..b669d05 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -19,6 +19,7 @@ */ #include "../utils.h" +#include "../stack_debug.h" #include "decn.h" @@ -86,6 +87,8 @@ const dec80 DECN_LN_10 = { void copy_decn(dec80* const dest, const dec80* const src){ uint8_t i; + + stack_debug(0x01); dest->exponent = src->exponent; //copy nibbles @@ -163,6 +166,7 @@ static void remove_leading_zeros(dec80* x){ uint8_t is_negative = (x->exponent < 0); exp_t exponent = get_exponent(x); + stack_debug(0x02); //find first non-zero digit100 for (digit100 = 0; digit100 < DEC80_NUM_LSU; digit100++){ if (x->lsu[digit100] != 0){ diff --git a/src/lcd.c b/src/lcd.c index e2253c9..b5eac5c 100644 --- a/src/lcd.c +++ b/src/lcd.c @@ -155,9 +155,15 @@ void LCD_Open(void) { //P2 entire port P2M1 = 0; P2M0 = 0xff; +#ifdef STACK_DEBUG + // P3_4 is special + P3M1 &= ~(0xe0); + P3M0 |= (0xe0); +#else //P3 pins 7:4 P3M1 &= ~(0xf0); P3M0 |= (0xf0); +#endif _delay_ms(30); // to allow LCD powerup outCsrBlindNibble(0x03); // (DL=1 8-bit mode) diff --git a/src/main.c b/src/main.c index 961fc1c..613c600 100644 --- a/src/main.c +++ b/src/main.c @@ -28,6 +28,7 @@ #else #include "stc15.h" #endif +#include "stack_debug.h" #define FOSC 11583000 @@ -225,7 +226,9 @@ int main() LCD_Open(); KeyInit(); Timer0Init(); //for reading keyboard - BACKLIGHT_ON(); //turn on led backlight + backlight_on(); //turn on led backlight + stack_debug_init(); + stack_debug(0xfe); ExpBuf[0] = 0; ExpBuf[1] = 0; @@ -529,7 +532,7 @@ int main() LcdAvailable.release(); #endif //turn backlight back on - BACKLIGHT_ON(); + backlight_on(); } //while (1) } /* ------------------------------------------------------------------------- */ diff --git a/src/stack_debug.c b/src/stack_debug.c new file mode 100644 index 0000000..859d990 --- /dev/null +++ b/src/stack_debug.c @@ -0,0 +1,92 @@ +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include +#include "stack_debug.h" + +#if defined(STACK_DEBUG) +extern uint16_t _SP; + +inline static void HIGH() { + P3_4 = 1; +} + +inline static void LOW() { + P3_4 = 1; +} + +void stack_debug_init() { + P3M1 &= ~(0x10); + P3M0 |= 0x10; + LOW(); + stack_debug_write(0x55); + stack_debug_write(0xAA); + stack_debug_write(0x55); + stack_debug_write(0xAA); + stack_debug_write(0x80); + stack_debug_write(0x10); + stack_debug_write(0x08); + stack_debug_write(0x01); +} + +/* + for frequency of 12.000 MHz (12.005 adjusted) this gives a rate of 1'190'000 Baud + negative polarity, MSB + */ + +void stack_debug_write(uint8_t value) __naked { + value; +__asm + .macro HIGH + setb _P3_4 + .endm + + .macro LOW + clr _P3_4 + .endm + + mov dph,r0 + mov a,dpl + mov r0,#8 + ; START + HIGH ; 1 + nop ; 1 + nop ; 1 + nop ; 1 +stack_debug_1$: + rlc a ; 1 + jc stack_debug_2$ ; 3 + HIGH ; 1 + djnz r0,stack_debug_1$ ; 4 + sjmp stack_debug_3$ ; 3 +stack_debug_2$: + LOW ; 1 + djnz r0,stack_debug_1$ ; 4 + sjmp stack_debug_3$ ; 3 +stack_debug_3$: + nop ; 1 + ; STOP + LOW ; 1 + nop ; 1 + nop ; 1 + + mov r0,dph ; 3 + ret ; 4 +__endasm; +} + +void stack_debug(uint8_t marker) { + stack_debug_write(marker); + stack_debug_write(SP); +} +#endif // !defined(DESKTOP) diff --git a/src/stack_debug.h b/src/stack_debug.h new file mode 100644 index 0000000..a22567e --- /dev/null +++ b/src/stack_debug.h @@ -0,0 +1,54 @@ +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +#ifndef SRC_STACK_DEBUG_H_ +#define SRC_STACK_DEBUG_H_ + +#include + +#if !defined(DESKTOP) +#include "stc15.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// P3_4 is connected to the cathode and the only pin that is not toggled normally +// unfortunately, the hardware uart cannot be mapped to TX = P3_4 + +#if defined(STACK_DEBUG) +void stack_debug_init(void); +void stack_debug(uint8_t marker); +void stack_debug_write(uint8_t value) __naked; +#else +#define stack_debug_init() +#define stack_debug(marker) +#endif + +#if defined(DESKTOP) || defined(STACK_DEBUG) +#define backlight_on() +#define backlight_off() +#else +inline void backlight_on(void) { + P3_4 = 0; +} +inline void backlight_off(void) { + P3_4 = 1; +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/utils.c b/src/utils.c index 38680ed..f92f994 100644 --- a/src/utils.c +++ b/src/utils.c @@ -29,7 +29,6 @@ void _delay_us(uint8_t us) (void) us; } #endif -void backlight_off(void){ } #else //!DESKTOP void _delay_ms(uint8_t ms) { @@ -69,10 +68,6 @@ void _delay_us(uint8_t us) } #endif -void backlight_off(void){ - P3_4 = 1; -} - #endif //ifdef desktop #ifdef DESKTOP diff --git a/src/utils.h b/src/utils.h index 192dc5e..c4373bf 100644 --- a/src/utils.h +++ b/src/utils.h @@ -35,9 +35,6 @@ void _delay_us(uint8_t us); #define _delay_us(x) _delay_ms(1) #endif -void backlight_off(void); - - #ifdef __linux__ #define DESKTOP @@ -58,11 +55,9 @@ char* u32str(uint32_t x, char* buf, uint8_t base); #define __at uint8_t* #define SDCC_ISR(isr, reg) #define __using(x) -#define BACKLIGHT_ON() #define TURN_OFF() #else #define SDCC_ISR(isr, reg) __interrupt (isr) __using (reg) -#define BACKLIGHT_ON() P3_4 = 0 #define TURN_OFF() P3_2 = 0 #endif From 2a9801e6761c4afab4db71368a8eec114374d4a7 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Wed, 9 Sep 2020 08:47:51 +0200 Subject: [PATCH 04/21] superfluous --- src/stack_debug.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/stack_debug.c b/src/stack_debug.c index 859d990..eb7da94 100644 --- a/src/stack_debug.c +++ b/src/stack_debug.c @@ -15,7 +15,6 @@ #include "stack_debug.h" #if defined(STACK_DEBUG) -extern uint16_t _SP; inline static void HIGH() { P3_4 = 1; From a491ab04615d9bcd45d82ac82634f6246285e4a9 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Wed, 9 Sep 2020 09:40:26 +0200 Subject: [PATCH 05/21] print the maximal stack pointer value when pressing shift --- Makefile | 2 +- src/lcd.c | 12 ++++++++++++ src/lcd.h | 1 + src/main.c | 4 ++++ src/stack_debug.c | 9 ++++++++- src/stack_debug.h | 4 ++++ 6 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index ff4d184..c06986a 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ SDCCOPTS ?= --code-size $(STCCODESIZE) --xram-size 256 --idata-loc 0x80 #SDCCOPTS ?= --code-size $(STCCODESIZE) --xram-size 256 --stack-auto --model-large FLASHFILE ?= main.hex LARGE_LDFLAGS += -L/usr/share/sdcc/lib/large/ -# CFLAGS += -DSTACK_DEBUG # write the stack pointer to P3_4 +# CFLAGS += -DSTACK_DEBUG -DSHOW_STACK # write the stack pointer to P3_4 SRC = src/lcd.c src/key.c src/utils.c src/decn/decn.c src/calc.c src/stack_debug.c diff --git a/src/lcd.c b/src/lcd.c index b5eac5c..c6319b6 100644 --- a/src/lcd.c +++ b/src/lcd.c @@ -285,3 +285,15 @@ void LCD_Clear() { col = 0; } +void TERMIO_PrintU8(uint8_t x) { + uint8_t i; + for (i = 2; i; i--) { + const uint8_t upper_nibble = (x & 0xf0) >> 4; + if (upper_nibble <= 9) { + TERMIO_PutChar(upper_nibble + '0'); + } else { + TERMIO_PutChar((upper_nibble - 0x0a) + 'A'); + } + x <<= 4; + } +} diff --git a/src/lcd.h b/src/lcd.h index 8002d1f..57d7254 100644 --- a/src/lcd.h +++ b/src/lcd.h @@ -31,6 +31,7 @@ void LCD_GoTo(uint8_t row, uint8_t col); void LCD_OutString(__xdata const char* string, uint8_t max_chars); void LCD_OutString_Initial(__code const char* string); short TERMIO_PutChar(unsigned char letter); +void TERMIO_PrintU8(uint8_t x); void LCD_OutNibble(uint8_t x); void LCD_ClearToEnd(uint8_t curr_row); diff --git a/src/main.c b/src/main.c index 613c600..9a2d39f 100644 --- a/src/main.c +++ b/src/main.c @@ -523,6 +523,10 @@ int main() //print shifted status if (IsShifted){ TERMIO_PutChar('^'); +#if defined(STACK_DEBUG) && defined(SHOW_STACK) + TERMIO_PutChar(' '); + TERMIO_PrintU8(stack_max); +#endif } #ifdef DESKTOP diff --git a/src/stack_debug.c b/src/stack_debug.c index eb7da94..ff6139e 100644 --- a/src/stack_debug.c +++ b/src/stack_debug.c @@ -84,8 +84,15 @@ stack_debug_3$: __endasm; } +#if defined(STACK_DEBUG) && defined(SHOW_STACK) +__xdata uint8_t stack_max = 0x00; +#endif + void stack_debug(uint8_t marker) { +#ifdef SHOW_STACK + if (SP > stack_max) stack_max = SP; +#endif stack_debug_write(marker); stack_debug_write(SP); } -#endif // !defined(DESKTOP) +#endif // defined(STACK_DEBUG) diff --git a/src/stack_debug.h b/src/stack_debug.h index a22567e..ef4adcb 100644 --- a/src/stack_debug.h +++ b/src/stack_debug.h @@ -35,6 +35,10 @@ void stack_debug_write(uint8_t value) __naked; #define stack_debug(marker) #endif +#if defined(STACK_DEBUG) && defined(SHOW_STACK) +extern __xdata uint8_t stack_max; +#endif + #if defined(DESKTOP) || defined(STACK_DEBUG) #define backlight_on() #define backlight_off() From 28243c267d3bd4caf5bd1075f4b79bc6b693d542 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Wed, 9 Sep 2020 19:06:49 +0200 Subject: [PATCH 06/21] enable address sanitizer for g++ --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index a9ba436..1b77b3c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,12 @@ project(stc_rpncalc C CXX) # 3rd party tools find_package(Qt5 COMPONENTS Widgets Qml Quick REQUIRED) +if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") +message(STATUS "using address sanitizer") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") +link_libraries(asan) +endif() + set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (for tests debug make sense)") # Compiler warnings From 13d26e7b756543006e8e92b046d5db6e7d099343 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Wed, 9 Sep 2020 23:37:46 +0200 Subject: [PATCH 07/21] simple trigonometric functions as in Sinclair scientific --- src/decn/CMakeLists.txt | 2 +- src/decn/decn.c | 85 +++++++++++++++++++++ src/decn/decn.h | 4 + src/decn/decn_tests_trig.cpp | 138 +++++++++++++++++++++++++++++++++++ 4 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 src/decn/decn_tests_trig.cpp diff --git a/src/decn/CMakeLists.txt b/src/decn/CMakeLists.txt index 7abc9a6..77ef315 100644 --- a/src/decn/CMakeLists.txt +++ b/src/decn/CMakeLists.txt @@ -21,7 +21,7 @@ target_link_libraries(decn_cover PUBLIC coverage_config) add_executable(decn_test decn_test.c ../utils.c) target_link_libraries(decn_test decn_cover coverage_config Catch) -add_executable(decn_tests catch_main.cpp decn_tests.cpp ../utils.c) +add_executable(decn_tests catch_main.cpp decn_tests.cpp decn_tests_trig.cpp ../utils.c) target_link_libraries(decn_tests decn_cover coverage_config mpfr Catch) # decn prototyping diff --git a/src/decn/decn.c b/src/decn/decn.c index b669d05..a41cc08 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -84,6 +84,15 @@ const dec80 DECN_LN_10 = { 0, {23, 2, 58, 50, 92, 99, 40, 45, 68} }; +const dec80 DECN_2PI = { + 0, {62, 83, 18, 53, 7, 17, 95, 86, 48} +}; + +// 180/pi = 1rad in degree +const dec80 DECN_1RAD = { + 1, {57, 29, 57, 79, 51, 30, 82, 32, 9} +}; + void copy_decn(dec80* const dest, const dec80* const src){ uint8_t i; @@ -1254,6 +1263,82 @@ void pow_decn(void) { exp_decn(); } +void sincos_decn(void) { + #define SIN Tmp2Decn + #define COS Tmp3Decn + #define STP Tmp4Decn + + remove_leading_zeros(&AccDecn); + + // TODO: implement scaling to 0..2pi + copy_decn(&BDecn, &DECN_2PI); + if (compare_magn() == 1) { + set_dec80_NaN(&AccDecn); + set_dec80_NaN(&BDecn); + return; + } + set_dec80_zero(&BDecn); + if (compare_magn() == -1) { + set_dec80_NaN(&AccDecn); + set_dec80_NaN(&BDecn); + return; + } + + copy_decn(&STP, &AccDecn); + copy_decn(&COS, &DECN_1); + set_dec80_zero(&SIN); + // 0.0 00 05 + SIN.lsu[2] = 5; + negate_decn(&SIN); + while (STP.exponent >= 0) { + // COS = COS - SIN / 10000 + copy_decn(&AccDecn, &COS); + copy_decn(&BDecn, &SIN); + shift_right(&BDecn); + shift_right(&BDecn); + shift_right(&BDecn); + shift_right(&BDecn); + negate_decn(&BDecn); + add_decn(); + copy_decn(&COS, &AccDecn); + // SIN = SIN + COS / 10000 + copy_decn(&AccDecn, &SIN); + copy_decn(&BDecn, &COS); + shift_right(&BDecn); + shift_right(&BDecn); + shift_right(&BDecn); + shift_right(&BDecn); + add_decn(); + copy_decn(&SIN, &AccDecn); + // STP = STP - 0.0 00 1 + copy_decn(&AccDecn, &STP); + set_dec80_zero(&BDecn); + BDecn.lsu[2] = 10; + negate_decn(&BDecn); + add_decn(); + copy_decn(&STP, &AccDecn); + } +} + +void sin_decn(void) { + sincos_decn(); + copy_decn(&AccDecn, &SIN); +} + +void cos_decn(void) { + sincos_decn(); + copy_decn(&AccDecn, &COS); +} + +void tan_decn(void) { + sincos_decn(); + copy_decn(&AccDecn, &SIN); + copy_decn(&BDecn, &COS); + div_decn(); +} +#undef SIN +#undef COS + static void set_str_error(void){ Buf[0] = 'E'; diff --git a/src/decn/decn.h b/src/decn/decn.h index d551477..526fbad 100644 --- a/src/decn/decn.h +++ b/src/decn/decn.h @@ -86,6 +86,10 @@ void exp_decn(void); void exp10_decn(void); void pow_decn(void); +void sin_decn(void); +void cos_decn(void); +void tan_decn(void); + //Buf should hold at least 18 + 4 + 5 + 1 = 28 #define DECN_BUF_SIZE 28 extern __xdata char Buf[DECN_BUF_SIZE]; diff --git a/src/decn/decn_tests_trig.cpp b/src/decn/decn_tests_trig.cpp new file mode 100644 index 0000000..c6f4cde --- /dev/null +++ b/src/decn/decn_tests_trig.cpp @@ -0,0 +1,138 @@ + +#include +#include +#include +#include "decn.h" +namespace bmp = boost::multiprecision; +using Catch::Matchers::Equals; + +static void sin_test( + const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) +{ + CAPTURE(a_str); CAPTURE(a_exp); + build_dec80(a_str, a_exp); + sin_decn(); + decn_to_str_complete(&AccDecn); + CAPTURE(Buf); // acc / b + + bmp::mpfr_float::default_precision(50); + std::string a_full_str(a_str); + a_full_str += "e" + std::to_string(a_exp); + + bmp::mpfr_float a_actual(a_full_str); + a_actual = sin(a_actual); + CAPTURE(a_actual); // acc / b + + bmp::mpfr_float calculated(Buf); + if (rtol >= 0) { + bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); + CHECK(rel_diff < rtol); + } else { + bmp::mpfr_float diff = abs(a_actual - calculated); + CHECK(diff < atol); + } +} + +static void cos_test( + const char* a_str, int a_exp, double rtol=1e-2) +{ + CAPTURE(a_str); CAPTURE(a_exp); + build_dec80(a_str, a_exp); + cos_decn(); + decn_to_str_complete(&AccDecn); + CAPTURE(Buf); // acc / b + + bmp::mpfr_float::default_precision(50); + std::string a_full_str(a_str); + a_full_str += "e" + std::to_string(a_exp); + + bmp::mpfr_float a_actual(a_full_str); + a_actual = cos(a_actual); + CAPTURE(a_actual); // acc / b + + bmp::mpfr_float calculated(Buf); + bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); + + CHECK(rel_diff < rtol); +} + +static void tan_test( + const char* a_str, int a_exp, double rtol=1e-2) +{ + CAPTURE(a_str); CAPTURE(a_exp); + build_dec80(a_str, a_exp); + tan_decn(); + decn_to_str_complete(&AccDecn); + CAPTURE(Buf); // acc / b + + bmp::mpfr_float::default_precision(50); + std::string a_full_str(a_str); + a_full_str += "e" + std::to_string(a_exp); + + bmp::mpfr_float a_actual(a_full_str); + a_actual = tan(a_actual); + CAPTURE(a_actual); // acc / b + + bmp::mpfr_float calculated(Buf); + bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); + + CHECK(rel_diff < rtol); +} + +TEST_CASE("sin") { + sin_test("0.1", 0); + sin_test("0.05", 0); + sin_test("0.01", 0, -1); + sin_test("0.001", 0, -1); + sin_test("0.0001", 0, -1); + sin_test("0.00001", 0, -1); + sin_test("0.000001", 0, -1); + sin_test("0.0", 0, -1); + sin_test("0.2", 0); + sin_test("0.3", 0); + sin_test("0.4", 0); + sin_test("0.9", 0); + sin_test("1.5", 0); + sin_test("2.0", 0); + sin_test("2.5", 0); + sin_test("3.0", 0); +} + +TEST_CASE("cos") { + cos_test("0.1", 0); + cos_test("0.05", 0); + cos_test("0.01", 0); + cos_test("0.001", 0); + cos_test("0.0001", 0); + cos_test("0.00001", 0); + cos_test("0.000001", 0); + cos_test("0.0", 0); + cos_test("0.2", 0); + cos_test("0.3", 0); + cos_test("0.4", 0); + cos_test("0.9", 0); + cos_test("1.5", 0); + cos_test("2.0", 0); + cos_test("2.5", 0); + cos_test("3.0", 0); +} + + +TEST_CASE("tan") { + tan_test("0.1", 0); + tan_test("0.05", 0); + tan_test("0.01", 0); + tan_test("0.001", 0); + tan_test("0.0001", 0); + tan_test("0.00001", 0); + tan_test("0.000001", 0, -1); + tan_test("0.0", 0, -1); + tan_test("0.2", 0); + tan_test("0.3", 0); + tan_test("0.4", 0); + tan_test("0.9", 0); + tan_test("1.5", 0); + tan_test("2.0", 0); + tan_test("2.5", 0); + tan_test("3.0", 0); +} From f95aa9ab82cdfcd8a7d2588a03e450bad19b688c Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Wed, 9 Sep 2020 23:52:30 +0200 Subject: [PATCH 08/21] fixed tests --- src/decn/decn_tests_trig.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/decn/decn_tests_trig.cpp b/src/decn/decn_tests_trig.cpp index c6f4cde..ddac974 100644 --- a/src/decn/decn_tests_trig.cpp +++ b/src/decn/decn_tests_trig.cpp @@ -13,7 +13,7 @@ static void sin_test( build_dec80(a_str, a_exp); sin_decn(); decn_to_str_complete(&AccDecn); - CAPTURE(Buf); // acc / b + CAPTURE(Buf); bmp::mpfr_float::default_precision(50); std::string a_full_str(a_str); @@ -21,7 +21,7 @@ static void sin_test( bmp::mpfr_float a_actual(a_full_str); a_actual = sin(a_actual); - CAPTURE(a_actual); // acc / b + CAPTURE(a_actual); bmp::mpfr_float calculated(Buf); if (rtol >= 0) { @@ -40,7 +40,7 @@ static void cos_test( build_dec80(a_str, a_exp); cos_decn(); decn_to_str_complete(&AccDecn); - CAPTURE(Buf); // acc / b + CAPTURE(Buf); bmp::mpfr_float::default_precision(50); std::string a_full_str(a_str); @@ -48,7 +48,7 @@ static void cos_test( bmp::mpfr_float a_actual(a_full_str); a_actual = cos(a_actual); - CAPTURE(a_actual); // acc / b + CAPTURE(a_actual); bmp::mpfr_float calculated(Buf); bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); @@ -57,13 +57,13 @@ static void cos_test( } static void tan_test( - const char* a_str, int a_exp, double rtol=1e-2) + const char* a_str, int a_exp, double rtol=1e-2, double atol=1e-3) { CAPTURE(a_str); CAPTURE(a_exp); build_dec80(a_str, a_exp); tan_decn(); decn_to_str_complete(&AccDecn); - CAPTURE(Buf); // acc / b + CAPTURE(Buf); bmp::mpfr_float::default_precision(50); std::string a_full_str(a_str); @@ -71,12 +71,16 @@ static void tan_test( bmp::mpfr_float a_actual(a_full_str); a_actual = tan(a_actual); - CAPTURE(a_actual); // acc / b + CAPTURE(a_actual); bmp::mpfr_float calculated(Buf); - bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); - - CHECK(rel_diff < rtol); + if (rtol >= 0) { + bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); + CHECK(rel_diff < rtol); + } else { + bmp::mpfr_float diff = abs(a_actual - calculated); + CHECK(diff < atol); + } } TEST_CASE("sin") { From 2caedc9a45f43152732f7d8483e306b1b14629d5 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 11:40:26 +0200 Subject: [PATCH 09/21] re-structured tests --- src/decn/decn_tests_trig.cpp | 119 +++++++++++++++-------------------- 1 file changed, 52 insertions(+), 67 deletions(-) diff --git a/src/decn/decn_tests_trig.cpp b/src/decn/decn_tests_trig.cpp index ddac974..f3b618a 100644 --- a/src/decn/decn_tests_trig.cpp +++ b/src/decn/decn_tests_trig.cpp @@ -6,83 +6,60 @@ namespace bmp = boost::multiprecision; using Catch::Matchers::Equals; + +static void trig_test(void (*operation)(void), bmp::mpfr_float (*mpfr_operation)(bmp::mpfr_float x), + const char* a_str, int a_exp, double rtol, double atol) +{ + CAPTURE(a_str); CAPTURE(a_exp); + build_dec80(a_str, a_exp); + operation(); + decn_to_str_complete(&AccDecn); + CAPTURE(Buf); + + bmp::mpfr_float::default_precision(50); + std::string a_full_str(a_str); + a_full_str += "e" + std::to_string(a_exp); + + bmp::mpfr_float a_actual(a_full_str); + a_actual = mpfr_operation(a_actual); + CAPTURE(a_actual); + + bmp::mpfr_float calculated(Buf); + if (rtol >= 0) { + bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); + CHECK(rel_diff < rtol); + } else { + bmp::mpfr_float diff = abs(a_actual - calculated); + CHECK(diff < atol); + } + +} + static void sin_test( const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) { - CAPTURE(a_str); CAPTURE(a_exp); - build_dec80(a_str, a_exp); - sin_decn(); - decn_to_str_complete(&AccDecn); - CAPTURE(Buf); - - bmp::mpfr_float::default_precision(50); - std::string a_full_str(a_str); - a_full_str += "e" + std::to_string(a_exp); - - bmp::mpfr_float a_actual(a_full_str); - a_actual = sin(a_actual); - CAPTURE(a_actual); - - bmp::mpfr_float calculated(Buf); - if (rtol >= 0) { - bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); - CHECK(rel_diff < rtol); - } else { - bmp::mpfr_float diff = abs(a_actual - calculated); - CHECK(diff < atol); - } + trig_test(sin_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return sin(x);}, a_str, a_exp, rtol, atol); } static void cos_test( - const char* a_str, int a_exp, double rtol=1e-2) + const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) { - CAPTURE(a_str); CAPTURE(a_exp); - build_dec80(a_str, a_exp); - cos_decn(); - decn_to_str_complete(&AccDecn); - CAPTURE(Buf); - - bmp::mpfr_float::default_precision(50); - std::string a_full_str(a_str); - a_full_str += "e" + std::to_string(a_exp); - - bmp::mpfr_float a_actual(a_full_str); - a_actual = cos(a_actual); - CAPTURE(a_actual); - - bmp::mpfr_float calculated(Buf); - bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); - - CHECK(rel_diff < rtol); + trig_test(cos_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return cos(x);}, a_str, a_exp, rtol, atol); } static void tan_test( - const char* a_str, int a_exp, double rtol=1e-2, double atol=1e-3) + const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) { - CAPTURE(a_str); CAPTURE(a_exp); - build_dec80(a_str, a_exp); - tan_decn(); - decn_to_str_complete(&AccDecn); - CAPTURE(Buf); - - bmp::mpfr_float::default_precision(50); - std::string a_full_str(a_str); - a_full_str += "e" + std::to_string(a_exp); - - bmp::mpfr_float a_actual(a_full_str); - a_actual = tan(a_actual); - CAPTURE(a_actual); - - bmp::mpfr_float calculated(Buf); - if (rtol >= 0) { - bmp::mpfr_float rel_diff = abs((a_actual - calculated) / a_actual); - CHECK(rel_diff < rtol); - } else { - bmp::mpfr_float diff = abs(a_actual - calculated); - CHECK(diff < atol); - } + trig_test(tan_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return tan(x);}, a_str, a_exp, rtol, atol); } + +const char * const pi = "3.141592653589793239"; +const char * const pi_threequarters = "2.356194490192344929"; +const char * const pi_halfed = "1.570796326794896619"; +const char * const pi_quarted = ".7853981633974483096"; + + TEST_CASE("sin") { sin_test("0.1", 0); sin_test("0.05", 0); @@ -100,6 +77,10 @@ TEST_CASE("sin") { sin_test("2.0", 0); sin_test("2.5", 0); sin_test("3.0", 0); + sin_test(pi, 0, -1); + sin_test(pi_quarted, 0); + sin_test(pi_halfed, 0); + sin_test(pi_threequarters, 0); } TEST_CASE("cos") { @@ -119,6 +100,10 @@ TEST_CASE("cos") { cos_test("2.0", 0); cos_test("2.5", 0); cos_test("3.0", 0); + cos_test(pi, 0); + cos_test(pi_quarted, 0); + cos_test(pi_halfed, 0, -1); + cos_test(pi_threequarters, 0); } @@ -126,9 +111,9 @@ TEST_CASE("tan") { tan_test("0.1", 0); tan_test("0.05", 0); tan_test("0.01", 0); - tan_test("0.001", 0); - tan_test("0.0001", 0); - tan_test("0.00001", 0); + tan_test("0.001", 0, -1); + tan_test("0.0001", 0, -1); + tan_test("0.00001", 0, -1); tan_test("0.000001", 0, -1); tan_test("0.0", 0, -1); tan_test("0.2", 0); From 3e5648de87e9cb71e72c7fa042ecb44a7d0c03ea Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 14:30:53 +0200 Subject: [PATCH 10/21] implemented sin, cos, theta for all real numbers --- src/decn/decn.c | 80 +++++++++++++++++++++++++----------- src/decn/decn.h | 3 ++ src/decn/decn_tests_trig.cpp | 20 +++++++++ 3 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/decn/decn.c b/src/decn/decn.c index a41cc08..1c1faf0 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -68,9 +68,9 @@ static const uint8_t num_digits_display = 16; dec80 AccDecn; __idata dec80 BDecn; __idata dec80 TmpDecn; //used by add_decn() and mult_decn() -__idata dec80 Tmp2Decn; //used by recip_decn() and ln_decn() -__xdata dec80 Tmp3Decn; //used by recip_decn() and ln_decn() -__xdata dec80 Tmp4Decn; //used by div_decn() and pow_decn() +__idata dec80 Tmp2Decn; //used by recip_decn() and ln_decn() and sincos_decn() +__xdata dec80 Tmp3Decn; //used by recip_decn() and ln_decn() and sincos_decn() +__xdata dec80 Tmp4Decn; //used by div_decn() and pow_decn() and sincos_decn() __xdata char Buf[DECN_BUF_SIZE]; @@ -84,6 +84,7 @@ const dec80 DECN_LN_10 = { 0, {23, 2, 58, 50, 92, 99, 40, 45, 68} }; +// 2 pi const dec80 DECN_2PI = { 0, {62, 83, 18, 53, 7, 17, 95, 86, 48} }; @@ -93,7 +94,6 @@ const dec80 DECN_1RAD = { 1, {57, 29, 57, 79, 51, 30, 82, 32, 9} }; - void copy_decn(dec80* const dest, const dec80* const src){ uint8_t i; @@ -1263,34 +1263,53 @@ void pow_decn(void) { exp_decn(); } -void sincos_decn(void) { - #define SIN Tmp2Decn - #define COS Tmp3Decn - #define STP Tmp4Decn +// see W.E. Egbert, "Personal Calculator Algorithms II: Trigonometric functions" +void project_decn_into_0_2pi(void) { + const uint8_t is_negative = (AccDecn.exponent < 0); + exp_t exponent; remove_leading_zeros(&AccDecn); - - // TODO: implement scaling to 0..2pi + if (is_negative) { + negate_decn(&AccDecn); + } + exponent = get_exponent(&AccDecn); copy_decn(&BDecn, &DECN_2PI); - if (compare_magn() == 1) { - set_dec80_NaN(&AccDecn); - set_dec80_NaN(&BDecn); - return; - } - set_dec80_zero(&BDecn); - if (compare_magn() == -1) { - set_dec80_NaN(&AccDecn); - set_dec80_NaN(&BDecn); - return; + if (compare_magn() > 0) { + do { + do { + copy_decn(&BDecn, &DECN_2PI); + BDecn.exponent = exponent; + if (compare_magn() >= 0) { + negate_decn(&BDecn); + add_decn(); + } else { + break; + } + } while (1); + exponent--; + } while (exponent >= 0); } - copy_decn(&STP, &AccDecn); + if (is_negative) { + negate_decn(&AccDecn); + copy_decn(&BDecn, &DECN_2PI); + add_decn(); + } +} + +#define SIN Tmp2Decn +#define COS Tmp3Decn +#define THETA Tmp4Decn +void sincos_decn(void) { + project_decn_into_0_2pi(); + + copy_decn(&THETA, &AccDecn); copy_decn(&COS, &DECN_1); set_dec80_zero(&SIN); // 0.0 00 05 SIN.lsu[2] = 5; negate_decn(&SIN); - while (STP.exponent >= 0) { + while (THETA.exponent >= 0) { // COS = COS - SIN / 10000 copy_decn(&AccDecn, &COS); copy_decn(&BDecn, &SIN); @@ -1310,13 +1329,13 @@ void sincos_decn(void) { shift_right(&BDecn); add_decn(); copy_decn(&SIN, &AccDecn); - // STP = STP - 0.0 00 1 - copy_decn(&AccDecn, &STP); + // THETA = THETA - 0.0 00 1 + copy_decn(&AccDecn, &THETA); set_dec80_zero(&BDecn); BDecn.lsu[2] = 10; negate_decn(&BDecn); add_decn(); - copy_decn(&STP, &AccDecn); + copy_decn(&THETA, &AccDecn); } } @@ -1338,6 +1357,17 @@ void tan_decn(void) { } #undef SIN #undef COS +#undef THETA + +void to_degree_decn(void) { + copy_decn(&BDecn, &DECN_1RAD); + mult_decn(); +} + +void to_radian_decn(void) { + copy_decn(&BDecn, &DECN_1RAD); + div_decn(); +} static void set_str_error(void){ diff --git a/src/decn/decn.h b/src/decn/decn.h index 526fbad..9f45e86 100644 --- a/src/decn/decn.h +++ b/src/decn/decn.h @@ -86,9 +86,12 @@ void exp_decn(void); void exp10_decn(void); void pow_decn(void); +void project_decn_into_0_2pi(void); void sin_decn(void); void cos_decn(void); void tan_decn(void); +void to_degree_decn(void); +void to_radian_decn(void); //Buf should hold at least 18 + 4 + 5 + 1 = 28 #define DECN_BUF_SIZE 28 diff --git a/src/decn/decn_tests_trig.cpp b/src/decn/decn_tests_trig.cpp index f3b618a..91b11fa 100644 --- a/src/decn/decn_tests_trig.cpp +++ b/src/decn/decn_tests_trig.cpp @@ -81,6 +81,16 @@ TEST_CASE("sin") { sin_test(pi_quarted, 0); sin_test(pi_halfed, 0); sin_test(pi_threequarters, 0); + sin_test("1000.0", 0); + sin_test("-0.5", 0); + sin_test("-1.5", 0); + sin_test("-2.0", 0); + sin_test("-2.5", 0); + sin_test("-3.0", 0); + sin_test("-9.0", 0); + sin_test("-18.0", 0); + sin_test("-27.0", 0); + sin_test("-1000.0", 0); } TEST_CASE("cos") { @@ -104,6 +114,16 @@ TEST_CASE("cos") { cos_test(pi_quarted, 0); cos_test(pi_halfed, 0, -1); cos_test(pi_threequarters, 0); + cos_test("1000.0", 0); + cos_test("-0.5", 0); + cos_test("-1.5", 0); + cos_test("-2.0", 0); + cos_test("-2.5", 0); + cos_test("-3.0", 0); + cos_test("-9.0", 0); + cos_test("-18.0", 0); + cos_test("-27.0", 0); + cos_test("-1000.0", 0); } From e4ad37623b2e5fdfccd76c15d892a498c6dc37da Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 15:38:26 +0200 Subject: [PATCH 11/21] implemented arctan --- src/decn/decn.c | 56 +++++++++++++++++++++++++----------- src/decn/decn.h | 9 +++++- src/decn/decn_tests_trig.cpp | 22 ++++++++++++++ 3 files changed, 70 insertions(+), 17 deletions(-) diff --git a/src/decn/decn.c b/src/decn/decn.c index 1c1faf0..5322ea5 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -1297,19 +1297,39 @@ void project_decn_into_0_2pi(void) { } } +// K. Shirriff, "Reversing Sinclair's amazing 1974 calculator hack - half the ROM of the HP-35" +// http://files.righto.com/calculator/sinclair_scientific_simulator.html #define SIN Tmp2Decn #define COS Tmp3Decn #define THETA Tmp4Decn -void sincos_decn(void) { - project_decn_into_0_2pi(); - - copy_decn(&THETA, &AccDecn); - copy_decn(&COS, &DECN_1); - set_dec80_zero(&SIN); - // 0.0 00 05 - SIN.lsu[2] = 5; - negate_decn(&SIN); - while (THETA.exponent >= 0) { +void sincos_decn(const uint8_t sincos_arctan) { + const uint8_t is_negative = AccDecn.exponent < 0; + if (sincos_arctan) { + set_dec80_zero(&THETA); + if (is_negative) negate_decn(&AccDecn); + copy_decn(&COS, &AccDecn); + copy_decn(&SIN, &DECN_1); + } else { + project_decn_into_0_2pi(); + copy_decn(&THETA, &AccDecn); + copy_decn(&COS, &DECN_1); + set_dec80_zero(&SIN); + // 0.0 00 05 + SIN.lsu[2] = 5; + negate_decn(&SIN); + } + do { + if (sincos_arctan) { + // THETA is in AccDecn from previous iteration + if (COS.exponent < 0) { + if (is_negative) negate_decn(&AccDecn); + break; + } + } else { + if (THETA.exponent < 0) { + break; + } + } // COS = COS - SIN / 10000 copy_decn(&AccDecn, &COS); copy_decn(&BDecn, &SIN); @@ -1329,32 +1349,36 @@ void sincos_decn(void) { shift_right(&BDecn); add_decn(); copy_decn(&SIN, &AccDecn); - // THETA = THETA - 0.0 00 1 + // THETA = THETA -/+ 0.0 00 1 copy_decn(&AccDecn, &THETA); set_dec80_zero(&BDecn); BDecn.lsu[2] = 10; - negate_decn(&BDecn); + if (!sincos_arctan) negate_decn(&BDecn); add_decn(); copy_decn(&THETA, &AccDecn); - } + } while (1); } void sin_decn(void) { - sincos_decn(); + sincos_decn(0); copy_decn(&AccDecn, &SIN); } void cos_decn(void) { - sincos_decn(); + sincos_decn(0); copy_decn(&AccDecn, &COS); } void tan_decn(void) { - sincos_decn(); + sincos_decn(0); copy_decn(&AccDecn, &SIN); copy_decn(&BDecn, &COS); div_decn(); } + +void arctan_decn(void) { + sincos_decn(1); +} #undef SIN #undef COS #undef THETA diff --git a/src/decn/decn.h b/src/decn/decn.h index 9f45e86..af9803f 100644 --- a/src/decn/decn.h +++ b/src/decn/decn.h @@ -86,10 +86,10 @@ void exp_decn(void); void exp10_decn(void); void pow_decn(void); -void project_decn_into_0_2pi(void); void sin_decn(void); void cos_decn(void); void tan_decn(void); +void arctan_decn(void); void to_degree_decn(void); void to_radian_decn(void); @@ -110,6 +110,13 @@ void decn_to_str_complete(const dec80* x); void build_decn_at(dec80* dest, const char* signif_str, exp_t exponent); #endif +#define PRINT_DEC80(n, v) \ + printf(n " %d %5d: ", v.exponent < 0, get_exponent(&v)); \ + for (int i = 0; i < DEC80_NUM_LSU; i++) { \ + printf("%02d ", v.lsu[i]); \ + } \ + fputc('\n', stdout); + #ifdef __cplusplus } #endif diff --git a/src/decn/decn_tests_trig.cpp b/src/decn/decn_tests_trig.cpp index 91b11fa..ceba7a7 100644 --- a/src/decn/decn_tests_trig.cpp +++ b/src/decn/decn_tests_trig.cpp @@ -53,6 +53,12 @@ static void tan_test( trig_test(tan_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return tan(x);}, a_str, a_exp, rtol, atol); } +static void atan_test( + const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) +{ + trig_test(arctan_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return atan(x);}, a_str, a_exp, rtol, atol); +} + const char * const pi = "3.141592653589793239"; const char * const pi_threequarters = "2.356194490192344929"; @@ -145,3 +151,19 @@ TEST_CASE("tan") { tan_test("2.5", 0); tan_test("3.0", 0); } + +TEST_CASE("arctan") { + atan_test("0.001", 0); + atan_test("-0.001", 0); + atan_test("0.7", 0); + atan_test("-0.7", 0); + atan_test("0.1", 0); + atan_test("-0.1", 0); + atan_test("1.0", 0); + atan_test("-1.0", 0); + atan_test("2.0", 0); + atan_test("-2.0", 0); + atan_test("3.0", 0); + atan_test("-3.0", 0); + atan_test("0", 0, -1); +} From 0b5e011017c7db0dbc2805b3a96271f4b77058dd Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 16:37:23 +0200 Subject: [PATCH 12/21] made new functions accessible to the calculator --- src/calc.c | 101 +++++++++++++++++++++++++++++++++--------------- src/calc.h | 3 +- src/decn/decn.c | 7 ++++ src/decn/decn.h | 1 + src/main.c | 18 +++++---- 5 files changed, 91 insertions(+), 39 deletions(-) diff --git a/src/calc.c b/src/calc.c index 9270262..336504e 100644 --- a/src/calc.c +++ b/src/calc.c @@ -34,7 +34,8 @@ __xdata dec80 LastX; #define STACK_T 3 uint8_t NoLift = 0; -__bit IsShifted = 0; +__bit IsShiftedUp = 0; +__bit IsShiftedDown = 0; //stack "grows" towards 0 __xdata dec80 Stack[STACK_SIZE]; //0->x, 1->y, 2->z, 3->t initially @@ -88,10 +89,6 @@ static void do_unary_op(void (*f_ptr)(void)){ } } -static void toggle_shifted(void){ - IsShifted ^= 1; -} - void process_cmd(char cmd){ //turn off backlight before start of processing backlight_off(); @@ -99,12 +96,12 @@ void process_cmd(char cmd){ switch(cmd){ ////////// case '+':{ - if (IsShifted){ // LastX + if (IsShiftedUp){ // LastX if (NoLift != 1){ StackPtr--; } copy_decn(&stack(STACK_X), &LastX); - IsShifted = 0; + IsShiftedUp = 0; } else { // + do_binary_op(add_decn); } @@ -115,22 +112,36 @@ void process_cmd(char cmd){ } break; ////////// case '-':{ - negate_decn(&stack(STACK_X)); - do_binary_op(add_decn); - negate_decn(&LastX); //stored LastX was after negation of X + if (IsShiftedUp) { + do_unary_op(to_radian_decn); + IsShiftedUp = 0; + } else if (IsShiftedDown) { + do_unary_op(to_degree_decn); + IsShiftedDown = 0; + } else { + negate_decn(&stack(STACK_X)); + do_binary_op(add_decn); + negate_decn(&LastX); //stored LastX was after negation of X + } } break; ////////// case '/':{ - do_binary_op(div_decn); + if (IsShiftedUp){ + StackPtr--; + pi_decn(); + copy_decn(&stack(STACK_X), &AccDecn); + } else if (IsShiftedDown) { + } else { + do_binary_op(div_decn); + } } break; ////////// case '=':{ - if (IsShifted){ //RCL + if (IsShiftedUp){ //RCL if (NoLift != 1){ StackPtr--; } copy_decn(&stack(STACK_X), &StoredDecn); - IsShifted = 0; } else { //Enter if (!decn_is_nan(&stack(STACK_X))){ StackPtr--; @@ -140,9 +151,8 @@ void process_cmd(char cmd){ } break; ////////// case '.':{ - if (IsShifted){ //STO + if (IsShiftedUp){ //STO copy_decn(&StoredDecn, &stack(STACK_X)); - IsShifted = 0; } } break; ////////// @@ -151,8 +161,8 @@ void process_cmd(char cmd){ } break; ////////// case '<':{ //use as +/- and sqrt - if (IsShifted){ //take sqrt - IsShifted = 0; + if (IsShiftedUp){ //take sqrt + IsShiftedUp = 0; if (decn_is_zero(&stack(STACK_X))){ //sqrt(0) = 0 } else if (!decn_is_nan(&stack(STACK_X))){ @@ -176,8 +186,7 @@ void process_cmd(char cmd){ } break; ////////// case 'r':{ //use as swap and 1/x - if (IsShifted){ //take 1/x - IsShifted = 0; + if (IsShiftedUp){ //take 1/x do_unary_op(recip_decn); } else { // swap if (!decn_is_nan(&stack(STACK_X))){ @@ -190,41 +199,70 @@ void process_cmd(char cmd){ } break; ////////// case 'm':{ //use as shift - toggle_shifted(); + if (IsShiftedUp) { + IsShiftedUp = 0; + IsShiftedDown = 1; + } else if (IsShiftedDown) { + IsShiftedUp = 0; + IsShiftedDown = 0; + } else { + IsShiftedUp = 1; + IsShiftedDown = 0; + } + return; + } break; + ////////// + case '1':{ + if (IsShiftedUp){ + do_unary_op(sin_decn); + } else if (IsShiftedDown){ + // do_unary_op(arcsin_decn); + } + } break; + ////////// + case '2':{ + if (IsShiftedUp){ + do_unary_op(cos_decn); + } else if (IsShiftedDown){ + // do_unary_op(arccos_decn); + } + } break; + ////////// + case '3':{ + if (IsShiftedUp){ + do_unary_op(tan_decn); + } else if (IsShiftedDown){ + do_unary_op(arctan_decn); + } } break; ////////// case '4':{ - if (IsShifted){ //roll down + if (IsShiftedUp){ //roll down StackPtr++; - IsShifted = 0; } } break; ////////// case '5':{ - if (IsShifted){ //e^x + if (IsShiftedUp){ //e^x do_unary_op(exp_decn); - IsShifted = 0; } } break; ////////// case '6':{ - if (IsShifted){ //10^x + if (IsShiftedUp){ //10^x do_unary_op(exp10_decn); - IsShifted = 0; } } break; ////////// case '9':{ - if (IsShifted){ //log10(x) + if (IsShiftedUp){ //log10(x) do_unary_op(log10_decn); - IsShifted = 0; } } break; ////////// case '8':{ - if (IsShifted){ //ln(x) + if (IsShiftedUp){ //ln(x) do_unary_op(ln_decn); - IsShifted = 0; } } break; ////////// @@ -239,10 +277,11 @@ void process_cmd(char cmd){ copy_decn(&stack(STACK_Y), &AccDecn); } pop(); - IsShifted = 0; } break; ////////// } //switch(cmd) + IsShiftedUp = 0; + IsShiftedDown = 0; } diff --git a/src/calc.h b/src/calc.h index 2c0c987..ca25d63 100644 --- a/src/calc.h +++ b/src/calc.h @@ -32,7 +32,8 @@ void process_cmd(char cmd); //push_decn is equivalent to "set_x()" if no_lift is true void push_decn(__xdata const char* signif_str, __xdata exp_t exponent); extern uint8_t NoLift; -extern __bit IsShifted; +extern __bit IsShiftedUp; +extern __bit IsShiftedDown; void clear_x(void); __xdata dec80* get_x(void); diff --git a/src/decn/decn.c b/src/decn/decn.c index 5322ea5..6419b84 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -1393,6 +1393,13 @@ void to_radian_decn(void) { div_decn(); } +void pi_decn(void) { + set_dec80_zero(&BDecn); + BDecn.lsu[0] = 5; // 0.5 00 .. + copy_decn(&AccDecn, &DECN_2PI); + mult_decn(); +} + static void set_str_error(void){ Buf[0] = 'E'; diff --git a/src/decn/decn.h b/src/decn/decn.h index af9803f..cdffaa0 100644 --- a/src/decn/decn.h +++ b/src/decn/decn.h @@ -92,6 +92,7 @@ void tan_decn(void); void arctan_decn(void); void to_degree_decn(void); void to_radian_decn(void); +void pi_decn(void); //Buf should hold at least 18 + 4 + 5 + 1 = 28 #define DECN_BUF_SIZE 28 diff --git a/src/main.c b/src/main.c index 9a2d39f..0fdcf70 100644 --- a/src/main.c +++ b/src/main.c @@ -307,7 +307,7 @@ int main() switch(KEY_MAP[I_Key]){ ////////// case '0': { - if (IsShifted){ + if (IsShiftedUp){ //off TURN_OFF(); } else { @@ -343,7 +343,7 @@ int main() case '7': //fallthrough case '8': //fallthrough case '9': { - if (IsShifted){ + if (IsShiftedUp || IsShiftedDown){ finish_process_entry(); } else if ( EnteringExp >= ENTERING_EXP){ if ( Exp_i == 0){ @@ -368,7 +368,7 @@ int main() } break; ////////// case '.': { - if (IsShifted){ + if (IsShiftedUp || IsShiftedDown){ //STO finish_process_entry(); } else { @@ -391,7 +391,7 @@ int main() } break; ////////// case '=': { - if (IsShifted){ //RCL + if (IsShiftedUp || IsShiftedDown){ //RCL finish_process_entry(); } else { //Enter //track stack lift @@ -401,9 +401,10 @@ int main() } break; ////////// case 'c': { - if (IsShifted || is_entering_done()){ + if (IsShiftedUp || IsShiftedDown || is_entering_done()){ //clear - IsShifted = 0; + IsShiftedUp = 0; + IsShiftedDown = 0; NoLift = 1; entering_done(); EnteringExp = ENTERING_DONE_CLEARED; @@ -521,12 +522,15 @@ int main() LCD_ClearToEnd(1); //print shifted status - if (IsShifted){ + if (IsShiftedUp){ TERMIO_PutChar('^'); #if defined(STACK_DEBUG) && defined(SHOW_STACK) TERMIO_PutChar(' '); TERMIO_PrintU8(stack_max); + TERMIO_PutChar(' '); #endif + } else if (IsShiftedDown){ + TERMIO_PutChar('v'); } #ifdef DESKTOP From 9deae8128d03c704f965453f11e1ba56093659cd Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 16:40:40 +0200 Subject: [PATCH 13/21] freed unused internal ram --- src/calc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/calc.c b/src/calc.c index 336504e..6d50bf0 100644 --- a/src/calc.c +++ b/src/calc.c @@ -190,10 +190,9 @@ void process_cmd(char cmd){ do_unary_op(recip_decn); } else { // swap if (!decn_is_nan(&stack(STACK_X))){ - dec80 tmp; - copy_decn(&tmp, &stack(STACK_X)); + copy_decn(&AccDecn, &stack(STACK_X)); copy_decn(&stack(STACK_X), &stack(STACK_Y)); - copy_decn(&stack(STACK_Y), &tmp); + copy_decn(&stack(STACK_Y), &AccDecn); } } } break; From 370df33a6c6167ad8e0fcf2be91fd66b6f6e19f8 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 16:42:32 +0200 Subject: [PATCH 14/21] implemented roll up --- src/calc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calc.c b/src/calc.c index 6d50bf0..69387be 100644 --- a/src/calc.c +++ b/src/calc.c @@ -238,6 +238,8 @@ void process_cmd(char cmd){ case '4':{ if (IsShiftedUp){ //roll down StackPtr++; + } else if (IsShiftedDown){ //roll up + StackPtr--; } } break; ////////// From b56523fadf2851ba65064918d31d924dd7867925 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 16:56:58 +0200 Subject: [PATCH 15/21] updated keyboard of Qt GUI --- qt_gui/main.qml | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/qt_gui/main.qml b/qt_gui/main.qml index fe0a913..e3bb33c 100644 --- a/qt_gui/main.qml +++ b/qt_gui/main.qml @@ -121,7 +121,7 @@ ApplicationWindow horizontalAlignment: Text.AlignHCenter font.pointSize: 16 color: "gray" - text: {getShiftedText(parent.parent.objectName, index) + "

"} + text: {getShiftedUpText(parent.parent.objectName, index) + "

"} textFormat: Text.RichText anchors.centerIn: parent } @@ -132,6 +132,14 @@ ApplicationWindow textFormat: Text.RichText anchors.centerIn: parent } + Text { + horizontalAlignment: Text.AlignHCenter + font.pointSize: 16 + color: "gray" + text: {"


" + getShiftedDownText(parent.parent.objectName, index)} + textFormat: Text.RichText + anchors.centerIn: parent + } MouseArea { //get row/column onClicked: _calculator.buttonClicked(parent.parent.objectName + "," + index) @@ -155,18 +163,30 @@ ApplicationWindow return "" + keys[row][col] + "" } - function getShiftedText(row, col) { + function getShiftedUpText(row, col) { var shifted_keys = [ ["Shift", "1/x", " √x ", "CLx"], - ["yx ", "ln(x)", "log(x)", ""], - ["🔃", "ex", "10x", ""], - ["", "", "", ""], + ["yx ", "ln(x)", "log(x)", "π"], + ["R▼", "ex", "10x", ""], + ["sin", "cos", "tan", "►rad"], ["off", "STO", "RCL", "LASTx"] ] return "" + shifted_keys[row][col] + "" } + function getShiftedDownText(row, col) { + var shifted_keys = [ + ["", "", "", ""], + ["", "", "", ""], + ["R▲", "", "", ""], + ["", "", "tan−1", "►deg"], + ["", "", "", ""] + ] + + return "" + shifted_keys[row][col] + "" + } + function getBackgroundColor(row, col) { var background_color = [ ["white", "white", "white", "#ff9494"], From 2903579efd17a59d950ea04af5b3639ddf646c2d Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 18:49:47 +0200 Subject: [PATCH 16/21] added arcsin and arccos added a stack for temporaries, otherwise it became to tedious to keep track which function uses which temporary for later --- qt_gui/main.qml | 2 +- src/calc.c | 27 ++++------ src/decn/decn.c | 98 ++++++++++++++++++++++++++++++------ src/decn/decn.h | 9 +++- src/decn/decn_tests_trig.cpp | 34 +++++++++++++ 5 files changed, 135 insertions(+), 35 deletions(-) diff --git a/qt_gui/main.qml b/qt_gui/main.qml index e3bb33c..98374b3 100644 --- a/qt_gui/main.qml +++ b/qt_gui/main.qml @@ -180,7 +180,7 @@ ApplicationWindow ["", "", "", ""], ["", "", "", ""], ["R▲", "", "", ""], - ["", "", "tan−1", "►deg"], + ["sin−1", "cos−1", "tan−1", "►deg"], ["", "", "", ""] ] diff --git a/src/calc.c b/src/calc.c index 69387be..bb45688 100644 --- a/src/calc.c +++ b/src/calc.c @@ -23,6 +23,10 @@ #include "calc.h" #include "stack_debug.h" +#ifdef DESKTOP +#include +#endif + __xdata dec80 StoredDecn; __xdata dec80 LastX; @@ -163,21 +167,7 @@ void process_cmd(char cmd){ case '<':{ //use as +/- and sqrt if (IsShiftedUp){ //take sqrt IsShiftedUp = 0; - if (decn_is_zero(&stack(STACK_X))){ - //sqrt(0) = 0 - } else if (!decn_is_nan(&stack(STACK_X))){ - copy_decn(&LastX, &stack(STACK_X)); //save LastX - copy_decn(&AccDecn, &stack(STACK_X)); - if (AccDecn.exponent < 0){ //negative - set_dec80_NaN(&stack(STACK_X)); - break; - } - //b = 0.5 - set_dec80_zero(&BDecn); - BDecn.lsu[0] = 5; - pow_decn(); - copy_decn(&stack(STACK_X), &AccDecn); - } + do_unary_op(sqrt_decn); } else { // +/- if (!decn_is_nan(&stack(STACK_X))){ negate_decn(&stack(STACK_X)); @@ -215,7 +205,7 @@ void process_cmd(char cmd){ if (IsShiftedUp){ do_unary_op(sin_decn); } else if (IsShiftedDown){ - // do_unary_op(arcsin_decn); + do_unary_op(arcsin_decn); } } break; ////////// @@ -223,7 +213,7 @@ void process_cmd(char cmd){ if (IsShiftedUp){ do_unary_op(cos_decn); } else if (IsShiftedDown){ - // do_unary_op(arccos_decn); + do_unary_op(arccos_decn); } } break; ////////// @@ -283,6 +273,9 @@ void process_cmd(char cmd){ } //switch(cmd) IsShiftedUp = 0; IsShiftedDown = 0; +#ifdef DESKTOP + assert(TmpStackPtr == 0); // there should be no items on the temporaries stack after one global operation +#endif } diff --git a/src/decn/decn.c b/src/decn/decn.c index 6419b84..68360b3 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -67,10 +67,14 @@ static const uint8_t num_digits_display = 16; dec80 AccDecn; __idata dec80 BDecn; -__idata dec80 TmpDecn; //used by add_decn() and mult_decn() -__idata dec80 Tmp2Decn; //used by recip_decn() and ln_decn() and sincos_decn() -__xdata dec80 Tmp3Decn; //used by recip_decn() and ln_decn() and sincos_decn() -__xdata dec80 Tmp4Decn; //used by div_decn() and pow_decn() and sincos_decn() +__idata dec80 TmpDecn; //used by add_decn() and mult_decn() and sqrt_decn() +__idata dec80 Tmp2Decn; //used by recip_decn() and ln_decn() and sincos_decn() and sqrt_decn() +__xdata dec80 Tmp3Decn; //used by recip_decn() and ln_decn() and sincos_decn() and sqrt_decn() +__xdata dec80 Tmp4Decn; //used by sincos_decn() + +__xdata dec80 TmpStackDecn[4]; +#define TMP_STACK_SIZE (sizeof TmpStackDecn / sizeof TmpStackDecn[0]) +__idata uint8_t TmpStackPtr; __xdata char Buf[DECN_BUF_SIZE]; @@ -89,11 +93,36 @@ const dec80 DECN_2PI = { 0, {62, 83, 18, 53, 7, 17, 95, 86, 48} }; +// pi/2 +const dec80 DECN_PI2 = { + 0, {15, 70, 79, 63, 26, 79, 48, 96, 62} +}; + // 180/pi = 1rad in degree const dec80 DECN_1RAD = { 1, {57, 29, 57, 79, 51, 30, 82, 32, 9} }; +void st_push_decn(const dec80 * const src) +{ + copy_decn(&TmpStackDecn[TmpStackPtr], src); + TmpStackPtr++; + assert(TmpStackPtr < TMP_STACK_SIZE); +} + +void st_pop_decn(dec80 * const dst) +{ + assert(TmpStackPtr >= 1); + TmpStackPtr--; + if (dst) copy_decn(dst, &TmpStackDecn[TmpStackPtr]); +} + +void st_load_decn(dec80 * const dst) +{ + assert(TmpStackPtr >= 1); + copy_decn(dst, &TmpStackDecn[TmpStackPtr - 1]); +} + void copy_decn(dec80* const dest, const dec80* const src){ uint8_t i; @@ -599,6 +628,7 @@ void add_decn(void){ return; } //save b for restoring later + //n.b. don't use TmpStackDecn here, it is called quite often. So you'd need to increase TMP_STACK_SIZE copy_decn(&TmpDecn, &BDecn); //handle cases where signs differ if (AccDecn.exponent < 0 && BDecn.exponent >= 0){ @@ -805,7 +835,6 @@ void mult_decn(void){ void recip_decn(void){ #define CURR_RECIP Tmp2Decn //copy of x, holds current 1/x estimate -#define X_COPY Tmp3Decn //holds copy of original x uint8_t i; exp_t initial_exp; //check divide by zero @@ -821,7 +850,7 @@ void recip_decn(void){ //normalize remove_leading_zeros(&AccDecn); //store copy of x - copy_decn(&X_COPY, &AccDecn); + st_push_decn(&AccDecn); //get initial exponent of estimate for 1/x initial_exp = get_exponent(&AccDecn); #ifdef DEBUG_DIV @@ -854,7 +883,7 @@ void recip_decn(void){ printf("%2d: %s\n", i, Buf); #endif //Accum *= x_copy - copy_decn(&BDecn, &X_COPY); + st_load_decn(&BDecn); mult_decn(); #ifdef DEBUG_DIV decn_to_str_complete(&AccDecn); @@ -881,24 +910,20 @@ void recip_decn(void){ //new_est(Accum) = recip + (1 - recip*x)*recip, where recip is current recip estimate copy_decn(&CURR_RECIP, &AccDecn); } + st_pop_decn(0); //try not to pollute namespace #undef CURR_RECIP -#undef X_COPY } void div_decn(void){ -#define ACC_COPY Tmp4Decn //holds copy of original acc //store copy of acc for final multiply by 1/x - copy_decn(&ACC_COPY, &AccDecn); + st_push_decn(&AccDecn); copy_decn(&AccDecn, &BDecn); recip_decn(); //Accum now holds 1/x, multiply by original acc to complete division - copy_decn(&BDecn, &ACC_COPY); + st_pop_decn(&BDecn); mult_decn(); - -//try not to pollute namespace -#undef ACC_COPY } @@ -1256,9 +1281,9 @@ void pow_decn(void) { return; } //calculate AccDecn = AccDecn ^ BDecn - copy_decn(&Tmp4Decn, &BDecn); //save b + st_push_decn(&BDecn); ln_decn(); - copy_decn(&BDecn, &Tmp4Decn); //restore b + st_pop_decn(&BDecn); mult_decn(); //accum = b*ln(accum) exp_decn(); } @@ -1379,6 +1404,29 @@ void tan_decn(void) { void arctan_decn(void) { sincos_decn(1); } + +// see W.E. Egbert, "Personal Calculator Algorithms III: Inverse Trigonometric Functions" +void arcsin_decn(void) { + st_push_decn(&AccDecn); + copy_decn(&BDecn, &AccDecn); + mult_decn(); + negate_decn(&AccDecn); + copy_decn(&BDecn, &DECN_1); + add_decn(); + sqrt_decn(); + recip_decn(); + st_pop_decn(&BDecn); + mult_decn(); + + sincos_decn(1); +} + +void arccos_decn(void) { + arcsin_decn(); + negate_decn(&AccDecn); + copy_decn(&BDecn, &DECN_PI2); + add_decn(); +} #undef SIN #undef COS #undef THETA @@ -1400,6 +1448,24 @@ void pi_decn(void) { mult_decn(); } +void sqrt_decn(void) { + if (decn_is_zero(&AccDecn)) { + return; + } + if (decn_is_nan(&AccDecn)) { + return; + } + if (AccDecn.exponent < 0){ //negative + set_dec80_NaN(&AccDecn); + return; + } + st_push_decn(&BDecn); // sqrt should behave like an unary operation + //b = 0.5 + set_dec80_zero(&BDecn); + BDecn.lsu[0] = 5; + pow_decn(); + st_pop_decn(&BDecn); +} static void set_str_error(void){ Buf[0] = 'E'; diff --git a/src/decn/decn.h b/src/decn/decn.h index cdffaa0..ae04654 100644 --- a/src/decn/decn.h +++ b/src/decn/decn.h @@ -64,7 +64,7 @@ void copy_decn(dec80* const dest, const dec80* const src); extern dec80 AccDecn; extern __idata dec80 BDecn; -extern __xdata dec80 Tmp4Decn; +extern __idata uint8_t TmpStackPtr; void build_dec80(__xdata const char* signif_str, __xdata exp_t exponent); @@ -85,11 +85,14 @@ void log10_decn(void); void exp_decn(void); void exp10_decn(void); void pow_decn(void); +void sqrt_decn(void); void sin_decn(void); void cos_decn(void); void tan_decn(void); void arctan_decn(void); +void arcsin_decn(void); +void arccos_decn(void); void to_degree_decn(void); void to_radian_decn(void); void pi_decn(void); @@ -111,12 +114,16 @@ void decn_to_str_complete(const dec80* x); void build_decn_at(dec80* dest, const char* signif_str, exp_t exponent); #endif +#ifdef DESKTOP #define PRINT_DEC80(n, v) \ printf(n " %d %5d: ", v.exponent < 0, get_exponent(&v)); \ for (int i = 0; i < DEC80_NUM_LSU; i++) { \ printf("%02d ", v.lsu[i]); \ } \ fputc('\n', stdout); +#else +#define PRINT_DEC80(n, v) +#endif #ifdef __cplusplus } diff --git a/src/decn/decn_tests_trig.cpp b/src/decn/decn_tests_trig.cpp index ceba7a7..28236ae 100644 --- a/src/decn/decn_tests_trig.cpp +++ b/src/decn/decn_tests_trig.cpp @@ -59,6 +59,18 @@ static void atan_test( trig_test(arctan_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return atan(x);}, a_str, a_exp, rtol, atol); } +static void asin_test( + const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) +{ + trig_test(arcsin_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return asin(x);}, a_str, a_exp, rtol, atol); +} + +static void acos_test( + const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) +{ + trig_test(arccos_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return acos(x);}, a_str, a_exp, rtol, atol); +} + const char * const pi = "3.141592653589793239"; const char * const pi_threequarters = "2.356194490192344929"; @@ -167,3 +179,25 @@ TEST_CASE("arctan") { atan_test("-3.0", 0); atan_test("0", 0, -1); } + +TEST_CASE("arcsin") { + asin_test("0.001", 0, -1); + asin_test("-0.001", 0, -1); + asin_test("0.7", 0); + asin_test("-0.7", 0); + asin_test("0.1", 0); + asin_test("-0.1", 0); + asin_test("0.9", 0); + asin_test("-0.9", 0); +} + +TEST_CASE("arccos") { + acos_test("0.001", 0); + acos_test("-0.001", 0); + acos_test("0.7", 0); + acos_test("-0.7", 0); + acos_test("0.1", 0); + acos_test("-0.1", 0); + acos_test("0.9", 0); + acos_test("-0.9", 0); +} From 5f0bd3886ae6f717c17a474effb7d735c013ca50 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 19:23:58 +0200 Subject: [PATCH 17/21] cleanup --- src/calc.c | 1 - src/decn/decn.c | 1 - 2 files changed, 2 deletions(-) diff --git a/src/calc.c b/src/calc.c index bb45688..23f924b 100644 --- a/src/calc.c +++ b/src/calc.c @@ -134,7 +134,6 @@ void process_cmd(char cmd){ StackPtr--; pi_decn(); copy_decn(&stack(STACK_X), &AccDecn); - } else if (IsShiftedDown) { } else { do_binary_op(div_decn); } diff --git a/src/decn/decn.c b/src/decn/decn.c index 68360b3..23c783f 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -1660,4 +1660,3 @@ void build_decn_at(dec80* dest, const char* signif_str, exp_t exponent){ #endif //DESKTOP - From 2b915a3e595c46f809971f611115a549ba2f11d6 Mon Sep 17 00:00:00 2001 From: Mirko Scholz Date: Thu, 10 Sep 2020 19:59:57 +0200 Subject: [PATCH 18/21] decreased accuracy so that the real hardware is useful at 33 MHz --- Makefile | 4 ++-- src/decn/decn.c | 14 ++++++-------- src/decn/decn_tests_trig.cpp | 14 +++++++------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index c06986a..ad56bce 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ SDCC ?= sdcc STCCODESIZE ?= 13312 -SDCCOPTS ?= --code-size $(STCCODESIZE) --xram-size 256 --idata-loc 0x80 +SDCCOPTS ?= --code-size $(STCCODESIZE) --xram-size 256 --idata-loc 0x70 #SDCCOPTS ?= --code-size $(STCCODESIZE) --xram-size 256 --stack-auto --model-large FLASHFILE ?= main.hex LARGE_LDFLAGS += -L/usr/share/sdcc/lib/large/ -# CFLAGS += -DSTACK_DEBUG -DSHOW_STACK # write the stack pointer to P3_4 +# CFLAGS += -DSTACK_DEBUG # write the stack pointer to P3_4 SRC = src/lcd.c src/key.c src/utils.c src/decn/decn.c src/calc.c src/stack_debug.c diff --git a/src/decn/decn.c b/src/decn/decn.c index 23c783f..dbbada1 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -1339,8 +1339,8 @@ void sincos_decn(const uint8_t sincos_arctan) { copy_decn(&THETA, &AccDecn); copy_decn(&COS, &DECN_1); set_dec80_zero(&SIN); - // 0.0 00 05 - SIN.lsu[2] = 5; + // 0.0 00 5 + SIN.lsu[2] = 50; negate_decn(&SIN); } do { @@ -1355,29 +1355,27 @@ void sincos_decn(const uint8_t sincos_arctan) { break; } } - // COS = COS - SIN / 10000 + // COS = COS - SIN / 1000 copy_decn(&AccDecn, &COS); copy_decn(&BDecn, &SIN); shift_right(&BDecn); shift_right(&BDecn); shift_right(&BDecn); - shift_right(&BDecn); negate_decn(&BDecn); add_decn(); copy_decn(&COS, &AccDecn); - // SIN = SIN + COS / 10000 + // SIN = SIN + COS / 1000 copy_decn(&AccDecn, &SIN); copy_decn(&BDecn, &COS); shift_right(&BDecn); shift_right(&BDecn); shift_right(&BDecn); - shift_right(&BDecn); add_decn(); copy_decn(&SIN, &AccDecn); - // THETA = THETA -/+ 0.0 00 1 + // THETA = THETA -/+ 0.0 01 copy_decn(&AccDecn, &THETA); set_dec80_zero(&BDecn); - BDecn.lsu[2] = 10; + BDecn.lsu[1] = 1; if (!sincos_arctan) negate_decn(&BDecn); add_decn(); copy_decn(&THETA, &AccDecn); diff --git a/src/decn/decn_tests_trig.cpp b/src/decn/decn_tests_trig.cpp index 28236ae..534e7bf 100644 --- a/src/decn/decn_tests_trig.cpp +++ b/src/decn/decn_tests_trig.cpp @@ -80,7 +80,7 @@ const char * const pi_quarted = ".7853981633974483096"; TEST_CASE("sin") { sin_test("0.1", 0); - sin_test("0.05", 0); + sin_test("0.05", 0, 1e-2); sin_test("0.01", 0, -1); sin_test("0.001", 0, -1); sin_test("0.0001", 0, -1); @@ -147,8 +147,8 @@ TEST_CASE("cos") { TEST_CASE("tan") { tan_test("0.1", 0); - tan_test("0.05", 0); - tan_test("0.01", 0); + tan_test("0.05", 0, 1e-2); + tan_test("0.01", 0, 5e-2); tan_test("0.001", 0, -1); tan_test("0.0001", 0, -1); tan_test("0.00001", 0, -1); @@ -165,8 +165,8 @@ TEST_CASE("tan") { } TEST_CASE("arctan") { - atan_test("0.001", 0); - atan_test("-0.001", 0); + atan_test("0.001", 0, -1, 2e-3); + atan_test("-0.001", 0, -1, 2e-3); atan_test("0.7", 0); atan_test("-0.7", 0); atan_test("0.1", 0); @@ -185,8 +185,8 @@ TEST_CASE("arcsin") { asin_test("-0.001", 0, -1); asin_test("0.7", 0); asin_test("-0.7", 0); - asin_test("0.1", 0); - asin_test("-0.1", 0); + asin_test("0.1", 0, 1e-2); + asin_test("-0.1", 0, 1e-2); asin_test("0.9", 0); asin_test("-0.9", 0); } From d8d7f98663691d4eaea14bc0c48aa60342608798 Mon Sep 17 00:00:00 2001 From: Jeff Wang Date: Sun, 13 Sep 2020 01:19:22 -0400 Subject: [PATCH 19/21] clear IsShiftedUp/Down at end of switch case, allow turning off with either shift --- src/calc.c | 4 ---- src/main.c | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/calc.c b/src/calc.c index 23f924b..fe82a0b 100644 --- a/src/calc.c +++ b/src/calc.c @@ -105,7 +105,6 @@ void process_cmd(char cmd){ StackPtr--; } copy_decn(&stack(STACK_X), &LastX); - IsShiftedUp = 0; } else { // + do_binary_op(add_decn); } @@ -118,10 +117,8 @@ void process_cmd(char cmd){ case '-':{ if (IsShiftedUp) { do_unary_op(to_radian_decn); - IsShiftedUp = 0; } else if (IsShiftedDown) { do_unary_op(to_degree_decn); - IsShiftedDown = 0; } else { negate_decn(&stack(STACK_X)); do_binary_op(add_decn); @@ -165,7 +162,6 @@ void process_cmd(char cmd){ ////////// case '<':{ //use as +/- and sqrt if (IsShiftedUp){ //take sqrt - IsShiftedUp = 0; do_unary_op(sqrt_decn); } else { // +/- if (!decn_is_nan(&stack(STACK_X))){ diff --git a/src/main.c b/src/main.c index 0fdcf70..e85502c 100644 --- a/src/main.c +++ b/src/main.c @@ -307,7 +307,7 @@ int main() switch(KEY_MAP[I_Key]){ ////////// case '0': { - if (IsShiftedUp){ + if (IsShiftedUp || IsShiftedDown){ //off TURN_OFF(); } else { From 64754395be6c7dbe350bcade4045e1af1c7b40c8 Mon Sep 17 00:00:00 2001 From: Jeff Wang Date: Sun, 13 Sep 2020 01:19:47 -0400 Subject: [PATCH 20/21] add shift down sign, change GUI keys, bump version --- qt_gui/main.qml | 6 +++--- src/lcd.c | 7 +++++++ src/lcd.h | 1 + src/lcd_emulator.c | 2 ++ src/main.c | 4 ++-- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/qt_gui/main.qml b/qt_gui/main.qml index 98374b3..3e5936c 100644 --- a/qt_gui/main.qml +++ b/qt_gui/main.qml @@ -136,7 +136,7 @@ ApplicationWindow horizontalAlignment: Text.AlignHCenter font.pointSize: 16 color: "gray" - text: {"


" + getShiftedDownText(parent.parent.objectName, index)} + text: {"

" + getShiftedDownText(parent.parent.objectName, index)} textFormat: Text.RichText anchors.centerIn: parent } @@ -168,7 +168,7 @@ ApplicationWindow ["Shift", "1/x", " √x ", "CLx"], ["yx ", "ln(x)", "log(x)", "π"], ["R▼", "ex", "10x", ""], - ["sin", "cos", "tan", "►rad"], + ["sin(x)", "cos(x)", "tan(x)", "►rad"], ["off", "STO", "RCL", "LASTx"] ] @@ -180,7 +180,7 @@ ApplicationWindow ["", "", "", ""], ["", "", "", ""], ["R▲", "", "", ""], - ["sin−1", "cos−1", "tan−1", "►deg"], + ["asin(x)", "acos(x)", "atan(x)", "►deg"], ["", "", "", ""] ] diff --git a/src/lcd.c b/src/lcd.c index c6319b6..278df08 100644 --- a/src/lcd.c +++ b/src/lcd.c @@ -201,6 +201,13 @@ void LCD_Open(void) { LCD_OutChar(0x10); LCD_OutChar(0x1c); } + //program shift down sign + for (i = 0; i < 5; i++){ + LCD_OutChar(0x0); + } + LCD_OutChar(0x1F); + LCD_OutChar(0x0E); + LCD_OutChar(0x04); //clear display LCD_Clear(); diff --git a/src/lcd.h b/src/lcd.h index 57d7254..6eb8965 100644 --- a/src/lcd.h +++ b/src/lcd.h @@ -38,6 +38,7 @@ void LCD_ClearToEnd(uint8_t curr_row); //CGRAM character address #define CGRAM_EXP 0 #define CGRAM_EXP_NEG 1 +#define CGRAM_DOWN 2 #include "utils.h" #ifdef DESKTOP diff --git a/src/lcd_emulator.c b/src/lcd_emulator.c index 1b05520..a9bf642 100644 --- a/src/lcd_emulator.c +++ b/src/lcd_emulator.c @@ -131,6 +131,8 @@ short TERMIO_PutChar(unsigned char letter) { lcd_buf[lcd_row][lcd_col] = 'E'; } else if (letter == CGRAM_EXP_NEG) { lcd_buf[lcd_row][lcd_col] = '-'; + } else if (letter == CGRAM_DOWN) { + lcd_buf[lcd_row][lcd_col] = 'V'; } else { lcd_buf[lcd_row][lcd_col] = letter; } diff --git a/src/main.c b/src/main.c index e85502c..2840d6f 100644 --- a/src/main.c +++ b/src/main.c @@ -140,7 +140,7 @@ static void latch_on(void) __xdata char EntryBuf[MAX_CHARS_PER_LINE + 1]; __xdata uint8_t ExpBuf[2]; -__code const char VER_STR[32+1] = "STC RPN Calculator v1.10"; +__code const char VER_STR[32+1] = "STC RPN Calculator v1.11"; enum { @@ -530,7 +530,7 @@ int main() TERMIO_PutChar(' '); #endif } else if (IsShiftedDown){ - TERMIO_PutChar('v'); + TERMIO_PutChar(CGRAM_DOWN); } #ifdef DESKTOP From b43f0b9480484236311989b3138070722812f328 Mon Sep 17 00:00:00 2001 From: Jeff Wang Date: Sun, 13 Sep 2020 01:54:00 -0400 Subject: [PATCH 21/21] update readme --- README.md | 26 ++++++++++++++++++++------ qt_gui.png | Bin 60852 -> 68571 bytes 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index cf75017..c762dbf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # STC DIY Calculator Firmware -This is a replacement firmware for the [diyleyuan calculator kit](http://www.diyleyuan.com/jc/L8Q.html). The calculator kit is available for purchase for less than $13 shipped from eBay by searching for "diy calculator kit". You will have to solder the kit yourself (see "hardware connections" below). The calculator uses an STC IAP15W413AS microcontroller (an 8051 instruction set-compatible microcontroller) with a built-in serial-port bootloader. See the series [summary](http://www.stcmicro.com/datasheet/STC15W408AS_Features.pdf) and full english [datasheet](https://www.stcmicro.com/datasheet/STC15F2K60S2-en.pdf). This project uses [SDCC](http://sdcc.sourceforge.net/) to compile the C code and [stcgal](https://github.com/grigorig/stcgal) to load the new firmware. +This is a replacement firmware for the [diyleyuan calculator kit](http://www.diyleyuan.com/jc/L8Q.html). The calculator kit is available for purchase for less than $13 shipped from eBay by searching for "diy calculator kit" (price has increased recently, currently closer to $18 shipped). You will have to solder the kit yourself (see "hardware connections" below). The calculator uses an STC IAP15W413AS microcontroller (an 8051 instruction set-compatible microcontroller) with a built-in serial-port bootloader. See the series [summary](http://www.stcmicro.com/datasheet/STC15W408AS_Features.pdf) and full english [datasheet](https://www.stcmicro.com/datasheet/STC15F2K60S2-en.pdf). This project uses [SDCC](http://sdcc.sourceforge.net/) to compile the C code and [stcgal](https://github.com/grigorig/stcgal) to load the new firmware. The replacement firmware supports floating-point calculations (using 18 decimal digits plus exponent for arithmetic) with a 4-level RPN stack. Functions include basic arithmetic as well as log(), exp(), y^x, 1/x and sqrt(), all in floating point. (The original firmware supported only fixed-point calculations in chain mode.) I have not added in the resistor value calculator or the decimal/hexadecimal converter features from the original firmware. @@ -74,15 +74,26 @@ The keys on the *original* calculator map as follows: - The 2nd press begins exponent entry. - The 3rd and subsequent presses negates the current exponent being entered. - Acts as STO when shifted (there is only 1 memory register) -- `mode `: acts as a shift key +- `mode `: acts as a shift key (press multiple times to toggle between shift up, shift down, and no shift) - `ON/AC`: acts as a backspace key during digit entry, acts as `Clear X` when digit entry is finished (e.g. after an operator key is pressed) - acts as `Clear X` when shifted - `7 `: acts as y^x when shifted - `8 `: acts as ln(x) when shifted - `9 `: acts as log(x) when shifted +- `÷ `: acts as pi when shifted +- `4 `: acts as roll down when shifted + - acts as roll up when shifted down - `5 `: acts as e^x when shifted - `6 `: acts as 10^x when shifted -- `4 `: acts as roll down when shifted +- `1 `: acts as sin(x) when shifted + - acts as asin(x) when shifted down +- `2 `: acts as cos(x) when shifted + - acts as acos(x) when shifted down +- `3 `: acts as tan(x) when shifted + - acts as atan(x) when shifted down +- all trig functions are currently calculated in degrees +- `- `: acts as to radians when shifted + - acts as to degrees when shifted down - `+ `: acts as LastX when shifted - `0 `: acts as off button when shifted @@ -240,6 +251,8 @@ Disconnected! # Bugs 1. After division by 0, ln(-), over/underflow, or other operations which give an `Error`, it's possible to still do certain operations on `Error`. Many functions do check, and will not operate on `Error`, but not all of them yet. This is somewhat similar to old soviet Elektronika calculators where `Error` is just a number, and there wasn't enough ROM space to check for errors. (There are people who explore the inner-workings of these calculators by manipulating the `Error` "number".) +1. When shifted down, keys which do not have a shifted-down function will instead be interpreted as if there were no shift. +1. Trigonometric functions are extremely slow and inaccurate. 1. There are probably more bugs waiting to be discovered. # Internals @@ -288,10 +301,11 @@ The number `0.135` would be stored the same way, except now the exponent is `0x7 - see `src/decn/proto/exp.cpp` for initial prototyping development work - Powers are calculated using the identity y^x = e^(x*ln(y)) - Square roots are calculated using the identity sqrt(x) = e^(0.5*ln(x)) +- Trigonometric functions are calculated using algorithms similar to the [sinclair scientific](http://files.righto.com/calculator/sinclair_scientific_simulator.html), and are fairly slow and inaccurate. ## TODO -- Trigonometric functions could be implemented with algorithms similar to those described in the HP Journal articles "Personal Calculator Algorithms II: Trigonometric Functions" and "Personal Calculator Algorithms III: Inverse Trigonometric Functions", both by William Egbert. - - will probably assign to the shifted `1`, `2`, and `3` keys, and `-` for calculating inverse trig functions. +- Trigonometric functions could be implemented with algorithms similar to those used in Valentin Albillo's [implementation](http://www.hpcc.org/datafile/hp12/12c_TrigonometryFunctions.pdf) for the HP 12C, but would take more flash + - These could also use the implementation described in the HP Journal articles "Personal Calculator Algorithms II: Trigonometric Functions" and "Personal Calculator Algorithms III: Inverse Trigonometric Functions", both by William Egbert. This would likely take even more flash though. - Special cases, such as taking the logarithms of numbers near 1, negative number raised to integer powers, etc. could be implemented separately, similar to what is described in the HP Journal note "The New Accuracy: Making 2^3 = 8" by Dennis Harms. - The display blanking for trailing 0s assumes that 16 digits will actually be displayed, but this might not be the case if the negative sign, decimal point, or exponents are displayed - Would be nice to have the `hex <=> dec` converter from the original firmware if there is more flash space @@ -313,7 +327,7 @@ In practice, the keyboard debouncing works much better than the original firmwar # Implementation on an STC 8051 Microcontroller This was my 1st time using an 8051 microcontroller. The architecture is a bit limiting for programming in "high-level" languages such as C compared to more modern architectures -- even compared to other 8-bit architectures such as the AVR (used in the arduino). Most significantly, there is no stack-pointer-relative addressing, which makes C functions takes up a lot of code space, since they have to emulate stack-pointer-relative addressing. Unfortunately, the microcontroller used only has 13K of code space. The compiler used (SDCC) also does not support using a 2nd data pointer, even though STC's implementation of the 8051 has one. -I've avoided relying on the functions being able to be re-entrant, so that they do not depend on having a stack. SDCC is *not* set to use `--stack-auto` to reduce code size (this means functions are not re-entrant). Some "large" local variables are declared as static in functions to save on the code space needed to emulate a stack. I used a lot more globals than I what I would typically like to have used, and a lot less pointers passed to functions, since these are extremely expensive (to account for the 3 different memory types). +I've avoided relying on the functions being able to be re-entrant, so that they do not depend on having a stack. SDCC is *not* set to use `--stack-auto` to reduce code size (this means functions are not re-entrant). Some "large" local variables are declared as static in functions to save on the code space needed to emulate a stack. I used a lot more globals than what I would typically like to have used, and a lot less pointers passed to functions, since these are extremely expensive (to account for the 3 different memory types). Another weird thing about the 8051 is that not all of the memory is addressed the same way. On this microcontroller, there are 512 bytes of ram total, of which: diff --git a/qt_gui.png b/qt_gui.png index 4e829c0869d898bfd4f1d2d19a68660fcf95d9e0..cf2879fb05e6e546b8aba561ee12240b57399823 100644 GIT binary patch literal 68571 zcmbTdbx>Tv^Dl}732uP^L4yQ$3mSZJm%!rgF2UX1-EGm}PJ+9;ySpvU+kEf)zN+`T zb^p0lv$f}(I@8lK{pmhEGhqsH5~xT7NKjBvr~pY(B`7H9Stux2K16uPlk;jt5ajQp zousBC6ck$TzaMlG9U37N6e$!y^oNRD=INTN6V4pWz}3a5mFxvs6xOdpA}hUxkVUc6 zr`~%j`Mz+e8bez?WEZhhppXz8axS70*7uJX!oSuiv`qJ3f47ktW5?IvYf+LfsPeC;+0)$#9J_XEd*-1j-RP65)XG)Sk&$N{9UN{iFYP)2rQHG_EEQlH%u^v^4?+kyv}h~! z#NHy5t(@Whr9t#3J>?QFPz>S!d#tXeRvZ!%VtI9S^%FVo*B@98y&-lovL96y6^T7P zJ;o^`lr3vELpxWJTU%RLz5_evx30<{PMQ(iAkdYDy1i~qwqxIk;2B@miP*8~a^ZPB`UL-@5fm!p< z)ckF0>lTxbu#NhYwBh*+b8|=G`G@cUKbls~(&sGZAc{y&PY1!57cQ^=L0U}b5)jZ? zZ?H@;;LP~+XVdAsaorMqn>OQ;MS~Ow^sl8C15D~Pr`aoIb5`aTK0=0&fY(f3!Evgk zKY{2Z#aL4vM-0*+^jn9FrXloAI5Rl@)TJl{xqPq;foUj;FB{oog@G4S#0lxi`y3^{ zv~x8`l>mT{oFa+nQzA(v=Y~wyK(8(IpYI!JA+P~|bBAgxMrtb{d;pV;*Yudp(u>P{ z2i~bQDCZjCH8Z4&eSfH`7F3;x{~;Zz%?E+3*a;|ARgDAwk{-3{kmSGlJil`iL{(M= zzB@zs?T!mRDuh|5g7L|f%Pg)rtMdsd1wnDyzPai-1#~HX;8*oZN zpkqHBYJgG!sj8|f+h-I|)d}t96#G~i2vkRu*E-?1ToqqN0l*bg6y_t2(Nx4qfUpmU z$5B=Nq?v3iJ7XlKNC8}+gk1Ot5umJNVr0MKn(B}GavhlsCm)#}u+Ng%HB;ADFDqLzWHNIT*4yGkazQajQX~_#vZs9I?1hVsWafckm!X-k7di zQeaNjSY#JxjoI48>fN!Slh-wNXPL!G>(bDAb97F`sTtHc5#RgO#LJe=N%2276D~)2 zdtv>IQVS7XL|FKEAP3>1QZ8eRDk(8h(u1z3@q`$p>*m&6c+$F?!7o1T3{+B8O*Ynq z=N0t4LyJ*C+rBx%V-{FVSvp^9zkQOH$<7)k;rb%R1&~lxWgqgLA~|UdmY!3@ffEbg zI<_ov;DI;#^V@^N*5;a7TiqUnMJ0x|Y*h6h2O8K2N+2CWUEfDq41Nh%e-6RCMW4?# zPnTK4UDq-^*qxEvz%GXBH>$!HOmAlBVr>(Gbw&X5b0*!Wt1WbiG6B1`m`i?exyTU+$7xBt210CCbrQpdL z7Y8eXi$y4Bspu$%YERKsmz3iMzDvNUJ6U^g%*3aT+np%AF_s31PC642M6Zz^MOl

|4qND0QxQ0po89tK|TbW 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 L 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 z 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