STC32G12K128单片机实现高精度算法及常用初等函数值的计算

減法減法減法減法本文介绍本人精心设计的高精度汇编语言算法,包括以下各项算术运算及及常用初等函数值的计算方法,计算准确度可以去到小数点后 6570 位。为了缩短等候时间,本程式的精确度只有 1200位。

前言

在资源受限的嵌入式系统或微控制器(如高效能的STC32G12K128 单片机)中实现高精度数学运算,往往需要精细的记忆体管理与高效的数学模型。本文将带您深入探讨二进位高精度算法的核心架构,特别是如何透过 TERMA、TERMB、TERMC 和 TERMD 等暂存区来保存繁复的中间计算结果,并剖析平方根与圆周率等经典算法背后的数学原理。

高精度算法程式库内提供的子程序

|------------|---------------------------------------------|
| 子程序名称 | 说明 |
| ADD8 | a = a + b |
| SUB8 | a = a -- b |
| MULTIPLY | c = a * b (c < 256) |
| DIVIDE | c = a / b (b <> 0) |
| DIV16B | b = b / div (16位元除法) (div <> 0, 存入R6, R7) |
| DIV16C | c = c / div (16位元除法) (div <> 0, 存入R6, R7) |
| SQUARE | c = a * a (c < 256) |
| x_CONST | c = a * CONST (DPTR 指向ROM 内常数地址) |
| ATAN | a = Acc*atan(1/DIV_L) (DIV_L < 256) |
| ATAN2 | a = atan(a) |
| SIN | a = sin(a 度) |
| SIN_r | a = sin(a rad) |
| LN | a = ln(a) (1 <= a < 256) |
| LOG | a = log(a) (1 <= a < 256) |
| Ex | a = e^x (x > 0) |
| TENX | a = 10^x (x > 0) |
| SQRT | a = sqrt(a) |
| ROOT | a = a^(1/div) (div <> 0) |
| MOV_E | a = e |
| MOV_PI | a = pi |
| MOV_LN2 | a = ln(2) |
| MOV_LN10 | a = ln(10) |
| MOV_LOGe | a = log(e) |
| MOV_SQRT2 | a = sqrt(2) |
| COPYA2B | b = a |
| COPYA2D | d = a |
| COPYB2A | a = b |
| COPYC2A | a = c |
| COPYC2B | b = c |
| COPYD2A | a = d |
| COPYD2B | b = d |
| SWAPA_D | a <-> d |
| SHIFT_A_R | a = a / 2 |
| SHIFT_A_L | a = a * 2 |
| COMP8 | 若 a >= b 则设定 LARGEFLAG;若 a = b 则 C=1 |
| CHECK_ERR | 截断误差检查,若 a = b 则 C=1(忽略最后一个位元组) |
| CHECK_ZERO | 若 b = 0 则设定 ZEROFLAG |

核心架构:利用 TERMA TERMD 储存中间结果

在处理数千位甚至上万位的高精度小数时,单一硬体暂存器已无法容纳,因此必须在记忆体(如扩展 RAM)中划分出专门的缓冲区。在许多高精度运算架构中,这四个核心暂存区扮演了分工合作的角色:

  • TERMA、 TERMB、TERMC : 存放在 xdata 区域, 最大容量有 8K。当执高精度乘法时,积的位数是乘数和被乘数的2倍,虽然此程序已预留 xdata 2*SIZE 位元组给 TERMC,其实最少只需要 SIZE + 1 位元组便已足够,因为 SIZE+1之后的数据全部舍弃不用。
  • TERMD: 存放在 edata 区域, 最大容量有 4K。 除了 TERMD ,程式内的堆栈和变量也使用 edata 存贮,故此 TERMD 不可以无限量扩大。

TERMA, TERMB, TERMC 数据的存取

bash 复制代码
; 存入数据
MOV DPTR, #TERMA      ; TERMA 地址, 此是整数位
MOV A, #1             ; 存入的数据先放入 ACC
MOVX @DPTR, A

; 提取数据
MOV DPTR, #TERMA
MOVX A, @DPTR        ; 提取的数据在ACC

TERMD 数据的存取

bash 复制代码
; 存入数据
MOV WR0, #TERMD+SIZE-1      ; TERMD 地址, 此是最后一个位元组
MOV  A, #0FFH               ; 要存入的数据
MOV @R0, R11			    ; R11 即是 ACC, 只可以用 R11, 不能写 A

; 提取数据
MOV WR0,  #TERMD+SIZE-1
MOV R11, @R0
MOV R7, A                   ; 提取的数据存入R7

TERMA, TERMB, TERMC, TERMD 数据格式

  1. 无符号定点数
  2. 小数点在第一位元组之后
  3. 最高位是整数, 然后是分数, 最高位在前面, 最低位在后面。

|----|----|----|---|---|-----|---|--------|--------|
| 索引 | 0 | 1 | 2 | 3 | ... | | SIZE-2 | SIZE-1 |
| | 整数 | 分数 | | | | | | 分数 |

例如:

bash 复制代码
; 设a = 1
CALL    CLR_TERMA
MOV     DPTR, #TERMA
MOV     A, #1
MOVX    @DPTR, A

; 设 b = 1.5
CALL    CLR_TERMB
MOV     DPTR, #TERMB
MOV     A, #1
MOVX    @DPTR, B
INC     DPTR
MOV     A, #80H
MOVX    @DPTR, B

TERMA,TERMB,TERMC 之间的数据转移

STC32G 单片机支援双 DPTR 地址指针,进行 xdata 阵列数据的交换变得十分容易,以下是使用双DPTR 指针,把 TERMC 阵列数据抄录去 TERMA:

bash 复制代码
COPYC2A:
          MOV   DPS,#00111000B  ; 自动交换、自动递增、选择 DPTR0
          MOV   DPTR, #TERMC    ; 来源 (DPTR0)
          MOV   DPTR, #TERMA    ; 目标 (DPTR1)
MOV_X:
          MOV   WR4, #SIZE      ; 16 位元 SIZE,要复制的位元组数 
          MOV   A, R5           ; 低位元组
          JZ    MOV_X1
          INC   R4              ; 若低位元组 <> 0,高位元组 += 1
MOV_X1:   MOVX  A, @DPTR        ; 从来源取得一个位元组
          MOVX  @DPTR, A        ; 复制一个位元组至目标
          DJNZ  R5, MOV_X1
          DJNZ  R4, MOV_X1
          MOV   DPS, #00000000B ; 将 DPS 重设为预设值
          RET

TERMA,TERMD 之间的数据转移

TERMA 与 TERMD 位于不同的记忆段, TERMA 位于xdata 记忆段,地位在 01:0000H 至 01:0000H 之间,需要使用 MOVX @DPTR 存取数据。TERMD 位于 edata 记忆段,地位在 00:0000H 至 00:0000H 之间,使用R0-R7 间接存取数据。以下是使用DPTR 指针及R0,R1,把 TERMA 阵列数据抄录去 TERMD:

bash 复制代码
COPYA2D:
          MOV   WR0, #TERMD     ; 目标位于 edata 区域
          MOV   DPTR, #TERMA    ; 来源位于 xdata 区域
          MOV   WR4, #SIZE      ; 16 位元 SIZE,要复制的位元组数 
          MOV   A, R5           ; 低位元组
          JZ    MOV_X2
          INC   R4              ; 若低位元组 <> 0,高位元组 += 1
MOV_X2:   MOVX  A, @DPTR        ; 从来源取得一个位元组
          MOV   @WR0, R11       ; 放入 edata,R11 = ACC
          INC   DPTR            ; INC DPTR
          ADD   WR0, #1         ; INC WR0         
          DJNZ  R5, MOV_X2
          DJNZ  R4, MOV_X2
          RET

算法原理拆解:

加法

cpp 复制代码
#include <stdint.h>

uint8_t add8(uint8_t *dest, const uint8_t *src1, const uint8_t *src2, int size) {
    uint16_t carry = 0; // 使用 16-bit 来暂存当前相加的和以及产生的进位
    
    for (int i = 0; i < size; i++) {
        // 将对应位置的两个 8-bit 数值加上上一轮的进位
        uint16_t sum = (uint16_t)src1[i] + (uint16_t)src2[i] + carry;
        
        // 存入目标位元组
        dest[i] = (uint8_t)(sum & 0xFF);
        
        // 计算新进位(若和超过 255,则 carry 为 1,否则为 0)
        carry = sum >> 8;
    }
    
    return (uint8_t)carry; // 回传最终溢位/进位
}

減法

cpp 复制代码
#include <stdint.h>

uint8_t sub8(uint8_t *dest, const uint8_t *src1, const uint8_t *src2, int size) {
    int16_t borrow = 0; // 使用 16-bit 有号数来暂存减法结果与借位
    
    for (int i = 0; i < size; i++) {
        // 被减数减去减数,再减去上一轮的借位
        int16_t sub = (int16_t)src1[i] - (int16_t)src2[i] - borrow;
        
        if (sub < 0) {
            dest[i] = (uint8_t)(sub + 256); // 若小于 0 代表不够减,借位并加上 256
            borrow = 1;                     // 设定下一轮的借位为 1
        } else {
            dest[i] = (uint8_t)sub;         //足够减,直接写入结果
            borrow = 0;                     // 清除借位
        }
    }
    
    return (uint8_t)borrow; // 回传最终的借位状态
}

乘法

乘法比较繁杂,TERMA 是被乘数,TERMB 是乘数,他们的长度都是SIZE,当进行长乘法之后,积放在TERMC内,但长度变成 2*SIZE,整数有两个位元组,而分数只有 SIZE -- 2 个位元组,TERMC最后的地址是 #TERMC + 2*SIZE -- 2,因为本程式的限制,TERMC 只用一个整数位元组,即最大的数值是 255.9999999......,最小可以表示的非0数是2^-((SiZE-1)*8),所以#TERM+SIZE 之后的位元组会被舍弃,不会参与之后的计算。如果你想改变 SIZE 的数值,除了修改相应的DP 数值外,#TERMC+SIZE+1 至 #TERMC+2*SIZE-2 之间的RAM不可用 。注意 #TERMC -- 1 位元组需要保留作乘法溢出之用,因为 256*256 = 65536 (16位元),#TERMC -- 1 会储存16位元乘积的高8位,#TERMC 会储存16位元乘积的低8位,而分数部分由 #TERMC+1 至 #TERMC+SIZE -- 1,#TERM+SIZE 预留作截断差误之用,如大过 80H (0.5), 需要向前进一位 (四捨五入)。

長乘算法:

multiply(a0..size-1, b0...size-1) --> product 0..2\*size-1

for b_j = size-1 to 0 step -1

carry = 0

for a_i = size-1 to 0 step -1

sum = producta_i + b_j + 1 + carry + aa_i * bb_j

carry = sum / 256

producta_i + b_j + 1 = sum mod 256

productb_j = carry

return product

运用Excel 模拟高精度乘法算法

乘法

cpp 复制代码
#include <stdint.h>
#include <string.h>

void multiply(uint8_t *dest, const uint8_t *src1, int n, const uint8_t *src2, int m) {
    // 1. 初始化目标缓冲区,将所有位元组归零 (乘法结果需清空后再进行累积)
    memset(dest, 0, n + m);

    // 2. 双回圈实作直式乘法
    for (int i = 0; i < n; i++) {
        uint16_t carry = 0;
        
        for (int j = 0; j < m; j++) {
            // 两数相乘,加上原本目标位置的值,再加上低位传上来的进位
            // 使用 uint32_t 避免 16-bit 乘法溢位 (255 * 255 = 65025,加上累积数值可能超过 16-bit)
            uint32_t prod = (uint32_t)src1[i] * (uint32_t)src2[j] + dest[i + j] + carry;
            
            // 存入当前位元组
            dest[i + j] = (uint8_t)(prod & 0xFF);
            
            // 提取高位作为下一轮的进位
            carry = (uint16_t)(prod >> 8);
        }
        
        // 3. 将剩余的进位向更高位传递扩散
        int k = i + m;
        while (carry > 0 && k < (n + m)) {
            uint32_t sum = dest[k] + carry;
            dest[k] = (uint8_t)(sum & 0xFF);
            carry = (uint16_t)(sum >> 8);
            k++;
        }
    }
}

除法 (高精度除低精度)

cpp 复制代码
#include <stdint.h>

uint16_t div16b(uint8_t *buf, int size, uint16_t divisor) {
    if (divisor == 0) {
        return 0; // 错误防范:除数不能为零
    }

    uint32_t remainder = 0; // 使用 32-bit 暂存器来容纳跨位元组的余数与扩展计算

    // 因为是 Little-endian,最高位元组在阵列尾端 (size - 1),
    // 我们必须从高位向低位进行长除法运算。
    for (int i = size - 1; i >= 0; i--) {
        // 将上一轮的余数乘以 256 (左移 8 位),再加上当前位元组的数值
        remainder = (remainder << 8) + buf[i];
        
        // 计算当前位置的商
        uint32_t quotient = remainder / divisor;
        
        // 将商写回缓冲区覆盖原数
        buf[i] = (uint8_t)quotient;
        
        // 计算并更新剩余的余数,准备带入下一轮
        remainder = remainder % divisor;
    }

    return (uint16_t)remainder; // 回传最后的 16-bit 余数
}

除法 (高精度除高精度)

cpp 复制代码
#include <stdint.h>
#include <string.h>

/**
 * @brief 辅助函数:比较两个大数的大小
 * @return 1 代表 a > b, 0 代表 a == b, -1 代表 a < b
 */
int compare(const uint8_t *a, const uint8_t *b, int size) {
    for (int i = size - 1; i >= 0; i--) {
        if (a[i] > b[i]) return 1;
        if (a[i] < b[i]) return -1;
    }
    return 0;
}

/**
 * @brief 辅助函数:大数整体左移 1 位 (Little-endian)
 */
void shl1(uint8_t *buf, int size) {
    uint8_t carry = 0;
    for (int i = 0; i < size; i++) {
        uint8_t next_carry = (buf[i] >> 7) & 1;
        buf[i] = (buf[i] << 1) | carry;
        carry = next_carry;
    }
}

/**
 * @brief 辅助函数:大数就地减法 (buf = buf - subtrahend)
 */
uint8_t sub_in_place(uint8_t *buf, const uint8_t *subtrahend, int size) {
    int16_t borrow = 0;
    for (int i = 0; i < size; i++) {
        int16_t sub = (int16_t)buf[i] - (int16_t)subtrahend[i] - borrow;
        if (sub < 0) {
            buf[i] = (uint8_t)(sub + 256);
            borrow = 1;
        } else {
            buf[i] = (uint8_t)sub;
            borrow = 0;
        }
    }
    return (uint8_t)borrow;
}

void divide(uint8_t *quotient, uint8_t *remainder, 
                           const uint8_t *dividend, const uint8_t *divisor, int size) {
    // 1. 初始化商与余数为 0
    memset(quotient, 0, size);
    memset(remainder, 0, size);

    int total_bits = size * 8;

    // 2. 从被除数的最高位元开始,向低位元进行回圈
    for (int i = total_bits - 1; i >= 0; i--) {
        // 步骤 A:余数缓冲区整体左移 1 位,准备容纳新的一位元
        shl1(remainder, size);

        // 步骤 B:从被除数中取出当前回圈对应的 bit,填入余数的最低位 (Bit 0)
        int byte_idx = i / 8;
        int bit_idx = i % 8;
        uint8_t bit = (dividend[byte_idx] >> bit_idx) & 1;
        remainder[0] |= bit; // 假设采用 Little-endian(低位位元组在索引 0)

        // 步骤 C:试商 ------ 检查目前的余数是否大于等于除数
        if (compare(remainder, divisor, size) >= 0) {
            // 若够减,余数减去除数
            sub_in_place(remainder, divisor, size);
            
            // 同时将商的对应 bit 设为 1
            int q_byte_idx = i / 8;
            int q_bit_idx = i % 8;
            quotient[q_byte_idx] |= (1 << q_bit_idx);
        }
        // 若不够减,商的该 bit 维持 0,继续下一轮
    }
}

初等函数数值算法

高精度算法的效率不只取决于记忆体管理,更仰赖巧妙的数学公式设计以实现快速收敛:

  • 平方根 (SQRT) :牛顿截线法(牛顿迭代法)
    • 原理:透过切线逼近零点的思路,迭代公式为 x(n+1) = (x / x(n) + x(n)/2。
    • 特点:具有平方收敛的特性(每次迭代有效位数几乎翻倍),配合 TERMA 与 TERMB 储存分子与分母的中间除法结果,能迅速收敛到极高精度。
  • 圆周率 (pi) :马青公式( Machin Formula
    • 公式:pi = 16*atan(1/5) - 4*atan(1/239)。
    • 特点:利用 atan 的泰勒展开式,由于数值小且收敛极快,结合工作暂存区可以精确计算出数千甚至数万位的 pi 值。
  • 自然常数 (e) :阶乘级数展开
    • 公式:e = 1 + 1/1! + 1/2! + 1/3! + ...
    • 迭代逻辑:利用递推关系 TERMA(n) = TERMA(n-1) + TERMB(n) 且 TERMB(n) = TERMB(n-1) / n,只需进行数千次迭代即可获得精确到小数点后数千位的好成绩。

sin, atan, ln, e^x, 10^x, a^x 使用马克劳林级数展开式计算结果:

1<x<= 2

  • 迭代公式:

    = 1

测试

本程式已经内置 25 项测试,检测程式的准确度及运算速度。

ISP烧录时, 请选用 22.1184 MHz:

测试结果:

bash 复制代码
Test 1: 1 second
MULTIPLY Test: sqrt(2)*sqrt(2) = 2
2.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 2: 1 second
x_CONST test: 2*pi = 6.283185307179586476925286766559
6.283185307179586476925286766559005768394338798750211641949889184615632812572417997256069650684234135964296173026564613294187689219101164463450718816256962234900568205403877042211119289245897909860763928857621951331866892256951296467573566330542403818291297133846920697220908653296426787214520498282547449174013212631176349763041841925658508183430728735785180720022661061097640933042768293903883023218866114540731519183906184372234763865223586210237096148924759925499134703771505449782455876366023898259667346724881313286172042789892790449474381404359721887405541078434352586353504769349636935338810264001136254290527121655571542685515579218347274357442936881802449906860293099170742101584559378517847084039912224258043921728068836319627259549542619921037414422699999996745956099902119463465632192637190048918910693816605285044616506689370070523862376342020006275677505773175066416762841234355338294607196506980857510937462319125727764707575187503915563715561064342453613226003855753222391818432840397876190514402130971726557731872306763655936460603904070603705937991547245198827782499443550566958263031149714484908301391901659066233723455711778150196763509274929878638510120801855403342278019697648025

Test 3: 10 seconds
pi test: pi - const pi = 0
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 4: 3 seconds
e test: e - const e = 0
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 5: 1 second
Square Test: sqrt(2)^2 = 2
2.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 6: 3 seconds
Divison Test: 2/sqrt(2) - sqrt(2) = 0
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 7: 1 second
Divided by 0 error test
Divided by 0, denominator must > 0


Test 8: 32 seconds
Square root test: sqrt(2) - const sqrt(2) = 0
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 9: 2 minutes 16 seconds
SIN test: sin(20 deg) = 0.342020143325668733044099614682259
0.342020143325668733044099614682259580763083367514160628465048497684714763702077599564190182338525547540473533531177825503637598153952464215745455346891177149979388398818816073695563822157490166819659551390627959274195423688377658627062015009418795415104238052302584171479952757650809257850619853521120432271042907086484711854362711100112298602666522147837549004920742401703476618311248036533392613902730466411080167829215961715406686187566132904789904167725157680153267628031843230663109325525727546757297191266804256393548484487330916162044567136416079129996375428794614969413464337544677331610580242513101022026120691023629929279214615727521692899598039344139730834757581843858686907429680488441484255004449165076276932747104756629342913190448483441107043680931451927553977754483099146653053529933655581825276350310090747356689295092327247715352370721359949192517021462831065216428836744657419553999848791567436157859786707439602567296022257078336529143778700061758170127571220568051923242005353998139899487195824314420222081377399533662247274183110381603408175206661672072351379755021990678763373203179686430509123584466194175992933959514230374263663438952534766868792736482993226311901073902190823

Test 10: 8 seconds
ATAN(1/x) test: atan(1/4)= 0.2449786631268641541720824812112758
0.244978663126864154172082481211275810914144098381184067127375914667355119587642096574534157668701991363834804490037118374295485420995059976958986960614203735201277087387581655721586715982638550632052208787306750143415623363482639563697808521591073245835238135076299955568901125830266262330259915753281027606233560275361075202178574138468515160692640281335140849794410060237988463942611526552602061396037795444238072604741943917886119777288186990730107505901507422498584394142059686034142517953473222901085505491711086992836288804990169501187901302413223900986215604596838555245031846160294115555805517393415146087605909077608695391272836419928418547224248609165394407114752423629898088385199095655722081885509305931407269830477250580573532634040252936680881526648595216631239377666381701907041862228685371841224649496309332444582291854387641098359195532956476987579894850393201056049972285113673451862666076167578470901596911472621106871866784641519749360796987255462092881294676491323802367507696235607418642094568608295746622775080852621695563370364462815801617344501346062099459043084285960080331715396471234771578983205342452024990706161554477072864697745766204446023456885577421590346116021914756

Test 11: 9 minutes 55 seconds, please wait...
ATAN2(x) test: atan(0.25) = 0.2449786631268641541720824812112758
0.244978663126864154172082481211275810914144098381184067127375914667355119587642096574534157668701991363834804490037118374295485420995059976958986960614203735201277087387581655721586715982638550632052208787306750143415623363482639563697808521591073245835238135076299955568901125830266262330259915753281027606233560275361075202178574138468515160692640281335140849794410060237988463942611526552602061396037795444238072604741943917886119777288186990730107505901507422498584394142059686034142517953473222901085505491711086992836288804990169501187901302413223900986215604596838555245031846160294115555805517393415146087605909077608695391272836419928418547224248609165394407114752423629898088385199095655722081885509305931407269830477250580573532634040252936680881526648595216631239377666381701907041862228685371841224649496309332444582291854387641098359195532956476987579894850393201056049972285113673451862666076167578470901596911472621106871866784641519749360796987255462092881294676491323802367507696235607418642094568608295746622775080852621695563370364462815801617344501346062099459043084285960080331715396471234771578983205342452024990706161554477072864697745766204446023456885577421590346116021914756

Test 12: 1 second
eX_1 test: e^0 = 1
1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 13: 5 minutes 13 seconds, please wait...
eX_1 test: e^1 - const e = 0
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 14: 4 minutes 42 seconds, please wait...
eX test: e^0.5 = 1.648721270700128146848650787814163
1.648721270700128146848650787814163571653776100710148011575079311640661021194215608632776520056366643002866637756307797004671166975219609159840971452490059796929422659098403914719948464659489244896868905336418465720841066656859800088924981211712287375214972195511971609034091115619799869839960642655091754574626304483075194758258782625439931955712690076545322881476100957739788486181443265208203424170104718338591510630125661475533808252026061400972891959084050148915029440695633113776763800958480893295122472263556542654171757524108358697276592606615399767667602791615334471108288209526962579040493568545937895700765873284254090379105075427204373252220367024848354530232284647224626948615601399628457155493511823787995953393839630518930143663470973970745394992559999139325600238851775934264897003299660655233417317072150264163231538915542099197223531186607636417739109317180597584237434761501550460133383790072499112540204938297708362567407415066912334848459025310542186346129245516832438123233127623485031564566955289681541861332857851769003621451203805530287241840764741913476785908851595757628982177325764453491221265551091546786198209630592641865576143785960780695675154171944491929466741075306837

Test 15: 5 minutes 13 seconds, please wait...
eX test: e^4 = 54.5981500331442390781102612028608
54.598150033144239078110261202860878402790737038614068725826593958553662099935869481676980561944734142784115445771087427811757103941236835853906107979894150302205115283108333866620586298411962540126750188489755334308250840477874515456886427992418727851477656527785933007097606068409344747799929360428039509743222460286460125218118689333936714668821094753317230526323957636144681660862574233028959695451026671336817507109793810743369410442290704626768720963794957056227500714843872673598081888768584167109987934672455186442621035753630022701899662983779325968137362529609839556632774186444899724391662272116388047381945227627224541422950083584839367182183218742324051401224732591985727767388314976254545223875428253410499190569941582450004266542880815136541237549954667993300593549926091098107136649816873481445906989840752581023758471859698052603710393316176446965225236592565786649284055468960659189017502713247353373379352775078184197485922076667558443345855576854462340441119779411598742137946590246945533530254785386193671490223222793691782305199524480191166538594961386667784841351390301834823667745393724993265876312473228743306773047625371905954872589490342836598578562163738290052440076288889582

Test 16: 5 minutes 28 seconds, please wait...
eX test: e^250 = 3.7464546145026732603499548122029e+108
3.746454614502673260349954812202920145808830754281315919228921310748648754622741231829765091624032687183730723972999843568005881733262347252198623061102396885515462063886689862390054253730970515552812350323413757074633542293435555525636683850202111513022960766962377532151403658720825693120449575067874002250445749013085473125886281423421640603870803991479933476743648291996303181576345284990690781006234240524209456291901241087856549010204624289722902850655662506985484394693531113196472490807767611888313381848940467264220403895218813632496681733766156832496445867256340126247749891945539000591930235547352075163989852903158989769923524166101798944103273694436687470420692018673105077332324204665809231676618466323994043749890011251614742143507312294978019051152397469754157701806762379561745081372126288565037476997135449955899343531076097168240536791084851256883132120612490751598117478339000762756889617001171434245413151289097289334656515673888994864758668477379598474741182836425747872221249010850535616820375123812496633061911520542395504016964385484333551939741230692375132027116735924131868944495918572754152464304652732480861623118257582162118546470474918126652475894943906128947754620216386e+108

Test 17: 1 second
10^0 test: 10^0 = 1
1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 18: 5 minutes 28 seconds, please wait...
10^x test: 10^200.5 = 3.1622776601683793319988935444327e+200
3.162277660168379331998893544432718533719555139325216826857504852792594438639238221344248108379300295187347284152840055148548856030453880014690519596700153903344921657179259940659150153474113339484124085316929577090471576461044369257879062037808609941828371711548406328552999118596824564203326961604691314336128949791890266529543612676178781350061388186278580463683134952478031143769334671973819513185678403231241795402218308045872844614600253577579702828644029024407977896034543989163349222652612067792651676031048436697793756926155720500369894909469421850007358348844643882731109289109042348054235653403907274019786543725939641726001306990000955784463109626790694418336130181302894541703315807731626386395193793704654765220632063686587197822049312426053454111609356979828132452297000798883523759585328579251362964686511497675217123459559238039375625125369855194955325099947038843990336466165470647234999796132343403021857052187836676345789510732982875157945215771652139626324438399018484560935762602031676804240795894693424781414580651430453325889714467693111375924047050770185460439272128358941921437984326343229410069841773833560726911107125549274561841707758654442076025678341820374148294554615347e+200

Test 19: 18 minutes 12 seconds, please wait...
Cube root test: 255^(1/3) = 6.34132570538499732938067087536118
6.341325705384997329380670875361188033074693230799037894499616641465811036513699321249563821906410112557069126335833922949792477315670563597746429129965675316663866461265386762226311724790674469155245284133109802444901901638925482678587118071918271891230949182992706150548125935003625661081366933838263212402900113609319676606983392891291950399627801363051824699179755383145292409743985916459958519828447344197689309683276355831856464517841403296602649149704155595186645435668250757306009801583513746191914243098540227349416973113931645137927564612811702195979037705297020487826055992782105392690277375113210718103834401580325055518663985085563179367188276005907484607846190503967761700828341205567766643324024386225269409482839804300125001073616063533378415005259180453771990131160108804554562120433173404993496485145553806481648835199564007957370557645167904860548468060571551585050503618519897587137989635620582696253518911737807829631207768939713716716762431097595530619621156715454597538539096403494289013167038334836358966818435740325267856103569891076273748899328256072973978998499175696648774727251386301022103619451919898204634217177953754497957966411066243824744457950035398352061798890875258

Test 20: 1 second
LN(0.5) error test: LN(x) x must >= 1
ln(x) error,  x must >= 1


Test 21: 12 minutes 28 seconds, please wait...
LNx test: ln(2) - const ln(2) = 0
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Test 22: 4 minutes 53 seconds, please wait...
log test: log(2)=0.30102999566398119521373889472449
0.301029995663981195213738894724493026768189881462108541310427461127108189274424509486927252118186172040684477191430995379094767881133523505999692333704695575064502964254193402661819734311602943501183902898178582617154439531861929046353884699520239310849612462540400263312594621478845847318282672683982326196542793507631317548350927138964946917785768918050790007599548087815459714585031964877626122492290829118190951498997171619860477676500067820517912557328628668342000402920509837084572224895494297562149707244659708613689609221909482761214391496528235167826492314804027746243244163311538738259303883039380633216130239051880582131915685461692905301505131926985378488418718320065753569468392971742132010905896890850585624640987218396876648539856235161277302638927878260849836681030308431415560813943617674548856663424538123733932422469594349060212044504296827460688478546115684768410643797950046596991774565754086401846407945652954434107740829399974540073721701680194889055485691069400375411689963415759297218064430381028152033923880856331986854539873935485606578428968489826139442608466327829526028766212762304341922026289121120836126005583686254899999092794878431974744338886862911771315741314322282

Test 23: 4 minutes 53 seconds, please wait...
LNx test: ln(1.125) = 0.11778303565638345453879410947052
0.117783035656383454538794109470521705068480712564733141107348638794807720528133786929641528638208114949935615070203674283679447744586647971007591486629326935414142825881648428787826281817046899394115090287498329176573822409983297969313684866976958025828691654534773835401113115048973018802627778615375864408231577477072338621742105921687742744890856434417581558788556454210170708662020697523014519411106233014302353673820947289745530581535248035663288396924475364489787617406396401217552911453314718860744608977772935780276683351285309722550251814823491538249176245676465776580973848680449714714761740116217846417023480817524679195034265269095535932192565610528613809026941899349013569270736191617087478368136325928772826594005459843604113044324679338094572471376194937145576461093859123686254664237203262003137064724198790994215392014274402483948460904730203102015304385541740326069701359150749904746613796465182401094719837261993200188418153151256269548605117865143434292533027324033734749883434060385800266079523312666171529822819090507644776480486145044131778901741104351369407914970716644325540759518027055359371367545854269453201086080716789177260924921723049504354998074996012654263150717316418

Test 24: 4 minutes 53 seconds, please wait...
LN test pwd = 0: ln(1.125) = 0.11778303565638345453879410947052
0.117783035656383454538794109470521705068480712564733141107348638794807720528133786929641528638208114949935615070203674283679447744586647971007591486629326935414142825881648428787826281817046899394115090287498329176573822409983297969313684866976958025828691654534773835401113115048973018802627778615375864408231577477072338621742105921687742744890856434417581558788556454210170708662020697523014519411106233014302353673820947289745530581535248035663288396924475364489787617406396401217552911453314718860744608977772935780276683351285309722550251814823491538249176245676465776580973848680449714714761740116217846417023480817524679195034265269095535932192565610528613809026941899349013569270736191617087478368136325928772826594005459843604113044324679338094572471376194937145576461093859123686254664237203262003137064724198790994215392014274402483948460904730203102015304385541740326069701359150749904746613796465182401094719837261993200188418153151256269548605117865143434292533027324033734749883434060385800266079523312666171529822819090507644776480486145044131778901741104351369407914970716644325540759518027055359371367545854269453201086080716789177260924921723049504354998074996012654263150717316418

Test 25: 4 minutes 53 seconds, please wait...
LN test pwd = 2: ln(4.5)=1.50407739677627407337325835238687
1.504077396776274073373258352386874841219480981285243649348708657781594964467523218141368182631045490033938577111345045751050488216102909085072932989899478859275597967538391299168440359064830246336361790518227325087052063360328661119177815178026426304880457555440788026053846400357181497118257682702856725179233181365413621964779395347367679088459950348470124820917648754724585513625296244302291620801627569696576901421266805202732624633060552233382674800854592474019194230993705266312818401355815530999620903187152828792717018792134358781775627707915877868598539031021473984186066367994188003100504956703824191845759046127279812165205613424392438861072446533373820195220412704497905709886928361712060755414412689282275703928958755625366987328295667801134519568983698254371083519426059265793371163996032721021723292518510787405524177757674546845663681409467987366914732171949309113131476855670153335928755561201907919063237674332598072872705494375041005332452564158589868703213357175408284306352341129915423254452371048201659651214072238099662118005630128738812231930997862449030648576193609245799930539572899934659422986276243130277024098242614375312991242663524259911291857547383695233568263796688462

总结

高精度运算完美展现了「硬体记忆体规划」与「数学收敛美学」的结合。在单片机上进行高精度算法只是想证明一点,就是无论多么繁复的算法,STC32G12K128单片机一定可以胜任有余。各位可以选择程式库内合适的子程序, 汇入在自己的专案内,省去了不少编写代码的时间。

STC32G12K128单片机高精度算法完整代码:

bash 复制代码
; STC657032G12K128 - 4K edata,8K xdata
; 内部振荡器 22.1184 MHz,波特率(Baud)115200
; Memory Model:XSmall,变数储存在 edata 远端指标 -4
; xdata 01:0000H - 01:1FFFH (8K)

$NOMOD51                         ; 停用标准 8051 SFR 的内建预先定义
#include "STC32G.INC"            ; 载入 STC32G 的自订标头或定义档案
;****************************************
; 二进位高精度算法(高达 6570 位数)
; 使用具备 8K xdata 的 STC32G 单晶片
;****************************************
;
; 可用的子程序:
; ----------------------
; ADD8          a = a + b
; SUB8          a = a - b
; MULTIPLY      c = a * b             (c < 256)
; DIVIDE        c = a / b             (b <> 0)
; DIV16B        b = b / div (16-bit)  (div <> 0,储存于 R6, R7) 
; DIV16C        c = c / div (16-bit)  (div <> 0,储存于 R6, R7)
; SQUARE        c = a * a             (c < 256)
; x_CONST       c = a * CONST         (常数位于 DPTR 所指向的程式码区域)
; ATAN          a = Acc*atan(1/DIV_L) (DIV_L < 256) 
; ATAN2         a = atan(a)
; SIN           a = sin(a deg)
; SIN_r         a = sin(a rad)         
; LN            a = ln(a)             (1 <= a < 256)
; LOG           a = log(a)            (1 <= a < 256)
; eX            a = e^x               (x > 0)
; TENX          a = 10^x              (x > 0)
; SQRT          a = sqrt(a)
; ROOT          a = a^(1/div)         (div <> 0)
; MOV_E         a = e
; MOV_PI        a = pi
; MOV_LN2       a = ln(2)
; MOV_LN10      a = ln(10)
; MOV_LOGe      a = log(e)
; MOV_SQRT2     a = sqrt(2)
; COPYA2B       b = a
; COPYA2D       d = a           
; COPYB2A       a = b
; COPYC2A       a = c 
; COPYC2B       b = c
; COPYD2A       a = d
; COPYD2B       b = d
; SWAPA_D       a <-> d
; SHIFT_A_R     a = a / 2
; SHIFT_A_L     a = a * 2
; COMP8         若 a >= b 则设定 LARGEFLAG;若 a = b 则 C=1
; CHECK_ERR     截断误差检查,若 a = b 则 C=1(忽略最后一个位元组)
; CHECK_ZERO    若 b = 0 则设定 ZEROFLAG
;*************************************************************************
; 位数 = SIZE * 2.408 = 1208 位数

SIZE      EQU  502              ; TERM 的大小,必须为偶数,最大 2730(0AAAH),约 6570 位数
DP        EQU  600              ; DP=(SIZE-1)*1.204,要列印的位数 = DP*2 
                                ; 最大 DP 3284,列印 6568 小数位
; 最大 SIZE
;SIZE      EQU  2730
;DP        EQU  3284
    
data_seg1 segment edata
          rseg data_seg1
    
LARGEFLAG BIT  F0               ; 当 TERMA >= TERMB 时设定
ZEROFLAG  BIT  F0               ; 当 TERMB = 0 时设定

bit_x     EQU  25H              ; 用于 DIVIDE 的位元
RAM       EQU  26H              ; 来自 RAM 则为 1 (MULTIPLY/SQUARE),来自 ROM 则为 0 (x_CONST)
pwd       EQU  27H              ; 用于 ln, e^x 的 pwd
ten_pwd   EQU  28H              ; 10^x 指数部分
DIV_H     EQU  30H              ; 除数 (高位)
DIV_L     EQU  31H              ; 除数 (低位)
TERMP_H   EQU  32H              ; 项次幂 (高位)
TERMP_L   EQU  33H              ; 项次幂 (低位)
Dval      EQU  34H              ; 用于二进位转 ASCII(高位元组)
Dval_L    EQU  35H              ; Dval+1(低位元组)
    
S1BRT     BIT  AUXR.0           ; 1=选择 Timer2 作为波特率产生器
T2x12     BIT  AUXR.2           ; 1=1T 模式,即 CPU 时钟不分频(FOSC/1)
T2_CT     BIT  AUXR.3           ; 0=Timer2 是一个计时器(系统时钟计数器)
T2R       BIT  AUXR.4           ; 1=启用 Timer2 计数

STACK_POINTER:
          DS   200              ; 在 edata 中保留 200 个位元组供堆栈指标使用
TERMD:    DS   SIZE             ; TERMD 的起始地址(位于 edata 区域)

;=====================================================
; STC32G12K128 具备双 24 位元 DPTR 指标
; DPTR 24 位元指标地址 (DR56) = DPL(82H), DPH(83H), DPXL(84H) 
; DPS (E3H) DPTR 指标选择器
;    bit 0 - SEL 0=DPTR0, 1=DPTR1
;    bit 3,4 - AU0, AU1 1=启用 DPTR0/DPTR1 自动递增/递减
;    bit 5 - TSL 1=自动交换 SEL
;    bit 6 - ID0 1=DPTR0 自动递减, 0=自动递增
;    bit 7 - ID1 1=DPTR1 自动递减, 0=自动递增
;=====================================================
; 新增巨集以取代 DEC DPTR
DEC_DPTR MACRO                  ; DEC DPTR0 指令
          DEC   DPL             ; DPL - 1
          MOV   A, DPL
          XRL   A, #0xFF        ; 是 0xFF 吗?不能使用会影响 C 的 CJNE
          JNZ   $+4             ; 不是,跳过,$+4 (2 位元组程式码)
          DEC   DPH             ; 是,DPH - 1 (2 位元组程式码)
ENDM

data_seg2 segment xdata
          rseg data_seg2
TERMA:    DS   SIZE             ; TERMA 的起始地址(位于 xdata 区域)
TERMB:    DS   SIZE             ; TERMB 的起始地址
TERMC_OV: DS   1                ; TERMC 溢位位元组(当 a*b > 255 时设定)
TERMC:    DS   2*SIZE           ; TERMC 的起始地址(MULTIPLY 至少需要 1 个额外位元组)
                                ; 完整相乘最大 2*SIZE 位元组
                                
CSEG AT 0000H
    LJMP   MAIN                 ; FF:0000H
          ; int LJMP 表格置于此处
          
prog_seg segment code
          rseg prog_seg
;=======================================================
          ORG    0200H          ; FF:0200H
MAIN:     MOV    SP, #STACK_POINTER ; 新的堆栈指标
          CALL   INIT_UART      ; 初始化 115200 波特率
          JMP    TEST

;---------------------------------------------------
; 显示讯息
;---------------------------------------------------
T1_MSG:    DB   13,10,13,10,"Test 1: 1 second",13,10,"MULTIPLY Test: sqrt(2)*sqrt(2) = 2",13,10,0 
T2_MSG:    DB   13,10,13,10,"Test 2: 1 second",13,10,"x_CONST test: 2*pi = 6.283185307179586476925286766559",13,10,0
T3_MSG:    DB   13,10,13,10,"Test 3: 10 seconds",13,10,"pi test: pi - const pi = 0",13,10,0 
T4_MSG:    DB   13,10,13,10,"Test 4: 3 seconds",13,10,"e test: e - const e = 0",13,10,0
T5_MSG:    DB   13,10,13,10,"Test 5: 1 second",13,10,"Square Test: sqrt(2)^2 = 2",13,10,0
T6_MSG:    DB   13,10,13,10,"Test 6: 3 seconds",13,10,"Divison Test: 2/sqrt(2) - sqrt(2) = 0",13,10,0
T7_MSG:    DB   13,10,13,10,"Test 7: 1 second",13,10,"Divided by 0 error test",13,10,0
T8_MSG:    DB   13,10,13,10,"Test 8: 32 seconds",13,10,"Square root test: sqrt(2) - const sqrt(2) = 0",13,10,0
T9_MSG:    DB   13,10,13,10,"Test 9: 2 minutes 16 seconds",13,10,"SIN test: sin(20 deg) = 0.342020143325668733044099614682259",13,10,0
T10_MSG:   DB   13,10,13,10,"Test 10: 8 seconds",13,10,"ATAN(1/x) test: atan(1/4)= 0.2449786631268641541720824812112758",13,10,0
T11_MSG:   DB   13,10,13,10,"Test 11: 9 minutes 55 seconds, please wait...", 13,10,"ATAN2(x) test: atan(0.25) = 0.2449786631268641541720824812112758",13,10,0
T12_MSG:   DB   13,10,13,10,"Test 12: 1 second",13,10,"eX_1 test: e^0 = 1",13,10,0
T13_MSG:   DB   13,10,13,10,"Test 13: 5 minutes 13 seconds, please wait...",13,10,"eX_1 test: e^1 - const e = 0",13,10,0
T14_MSG:   DB   13,10,13,10,"Test 14: 4 minutes 42 seconds, please wait...",13,10,"eX test: e^0.5 = 1.648721270700128146848650787814163",13,10,0
T15_MSG:   DB   13,10,13,10,"Test 15: 5 minutes 13 seconds, please wait...",13,10,"eX test: e^4 = 54.5981500331442390781102612028608",13,10,0
T16_MSG:   DB   13,10,13,10,"Test 16: 5 minutes 28 seconds, please wait...",13,10,"eX test: e^250 = 3.7464546145026732603499548122029e+108",13,10,0
T17_MSG:   DB   13,10,13,10,"Test 17: 1 second",13,10, "10^0 test: 10^0 = 1",13,10,0
T18_MSG:   DB   13,10,13,10,"Test 18: 5 minutes 28 seconds, please wait...",13,10,"10^x test: 10^200.5 = 3.1622776601683793319988935444327e+200",13,10,0
T19_MSG:   DB   13,10,13,10,"Test 19: 18 minutes 12 seconds, please wait...",13,10,"Cube root test: 255^(1/3) = 6.34132570538499732938067087536118",13,10,0
T20_MSG:   DB   13,10,13,10,"Test 20: 1 second",13,10, "LN(0.5) error test: LN(x) x must >= 1",13,10,0
T21_MSG:   DB   13,10,13,10,"Test 21: 12 minutes 28 seconds, please wait...",13,10,"LNx test: ln(2) - const ln(2) = 0",13,10,0
T22_MSG:   DB   13,10,13,10,"Test 22: 4 minutes 53 seconds, please wait...",13,10,"log test: log(2)=0.30102999566398119521373889472449",13,10,0
T23_MSG:   DB   13,10,13,10,"Test 23: 4 minutes 53 seconds, please wait...",13,10,"LNx test: ln(1.125) = 0.11778303565638345453879410947052",13,10,0
T24_MSG:   DB   13,10,13,10,"Test 24: 4 minutes 53 seconds, please wait...",13,10,"LN test pwd = 0: ln(1.125) = 0.11778303565638345453879410947052",13,10,0
T25_MSG:   DB   13,10,13,10,"Test 25: 4 minutes 53 seconds, please wait...",13,10,"LN test pwd = 2: ln(4.5)=1.50407739677627407337325835238687",13,10,0
;---------------------------------------------------
; 25 个测试(总耗时:90 分钟)
;---------------------------------------------------
TEST:
          ; 测试 1:MULTIPLY
          ; sqrt(2)*sqrt(2) = 2
          MOV    DPTR, #T1_MSG
          CALL   PRTSTR
          CALL   MOV_SQRT2          ; a = sqrt(2)
          CALL   COPYA2B          ; b = sqrt(2)
          CALL   MULTIPLY         ; 1 秒
          CALL   COPYC2A          ; a = 2
          CALL   OUT_A
          
          ; 测试 2:x_CONST
          ; 2*pi
          MOV    DPTR, #T2_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #2
          MOVX   @DPTR, A
          MOV    DPTR, #pi
          CALL   x_CONST          ; 1 秒
          CALL   COPYC2A
          CALL   OUT_A            ; 2*pi = 6.283185307179586476925286766559
          
          ; 测试 3:FIND_PI
          MOV    DPTR, #T3_MSG
          CALL   PRTSTR
          CALL   FIND_PI          ; 10 秒
          CALL   COPYA2B
          CALL   MOV_PI
          CALL   SUB8
          CALL   OUT_A            ; a = 0
          
          ; 测试 4:FIND_E
          MOV    DPTR, #T4_MSG
          CALL   PRTSTR
          CALL   FIND_E           ; 3 秒
          CALL   COPYA2B          ; b = e
          CALL   MOV_E            ; a = e
          CALL   SUB8             ; a = 0
          CALL   OUT_A

          ; 测试 5:SQUARE
          ; sqrt(2)^2 = 2
          MOV    DPTR, #T5_MSG
          CALL   PRTSTR
          CALL   MOV_SQRT2
          CALL   SQUARE           ; 1 秒
          CALL   COPYC2A
          CALL   OUT_A            ; a = 2

          ; 测试 6:DIVIDE
          ; 2/sqrt(2) = sqrt(2)
          MOV    DPTR, #T6_MSG
          CALL   PRTSTR
          CALL   MOV_SQRT2        
          MOV    COPYA2B          ; b = sqrt(2)
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #2
          MOVX   @DPTR, A         ; a = 2
          CALL   DIVIDE           ; 3 秒 
          CALL   COPYC2A          ; c = a/b = sqrt(2)
          CALL   SUB8             ; a = 0
          CALL   OUT_A

          ; 测试 7:测试除以 0 错误
          MOV    DPTR, #T7_MSG
          CALL   PRTSTR
          CALL   CLR_TERMB
          CALL   DIVIDE
          
          ; 测试 8:平方根
          ; sqrt(2)
          MOV    DPTR, #T8_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #2
          MOVX   @DPTR, A         ; a = 2
          CALL   SQRT             ; 32 秒
          CALL   COPYA2B          ; b = sqrt(2)
          CALL   MOV_SQRT2        ; a = sqrt(2)
          CALL   SUB8             ; a = 0
          CALL   OUT_A

          ; 测试 9:SIN
          ; sin(20 deg)
          MOV    DPTR, #T9_MSG
          CALL   PRTSTR
          MOV    A, #20
          CALL   SIN_A            ; 2 分 16 秒
          CALL   OUT_A            ; sin(20 deg) = 0.342020143325668733044099614682259

          ; 测试 10:ATAN(1/x)
          ; 测试 1*atan(1/4)
          MOV    DPTR, #T10_MSG
          CALL   PRTSTR
          MOV    DIV_L, #4   
          MOV    A, #1    
          CALL   ATAN             ; 8 秒(ATAN 较快)
          CALL   OUT_A            ; atan(1/4)= 0.2449786631268641541720824812112758

          ; 测试 11:ATAN2
          ; 测试 atan(0.25)
          MOV    DPTR, #T11_MSG
          CALL   PRTSTR
          CALL   CLR_TERMB
          MOV    DPTR, #TERMB
          MOV    A, #1
          MOVX   @DPTR, A         ; b = 1
          MOV    R6, #0
          MOV    R7, #4
          CALL   DIV16B           ; b=1/4
          CALL   COPYB2A          ; a=1/4
          CALL   ATAN2            ; 9 分 55 秒(比 ATAN 慢得多) 
          CALL   OUT_A            ; ATAN(0.25) = 0.2449786631268641541720824812112758

          ; 测试 12:eX_1 测试
          ; e^0
          MOV    DPTR, #T12_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          CALL   eX_1         
          CALL   OUT_A            ; e^0 = 1

          ; 测试 13:eX_1 测试
          ; e^1
          MOV    DPTR, #T13_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #1
          MOVX   @DPTR, A         ; a = 1
          CALL   eX_1             ; 5 分 13 秒??
          CALL   COPYA2D          
          CALL   MOV_E           
          CALL   COPYA2B          ; b = e^1
          CALL   COPYD2A          ; a = e^1
          CALL   SUB8             ; a 应为 0
          CALL   OUT_A

          ; 测试 14:eX 测试
          ; e^0.5
          MOV    DPTR, #T14_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA+1
          MOV    A, #80H
          MOVX   @DPTR, A
          CALL   eX               ; 4 分 42 秒
          CALL   OUT_A            ; e^0.5 = 1.648721270700128146848650787814163

          ; 测试 15:eX 测试
          ; e^4
          MOV    DPTR, #T15_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #4
          MOVX   @DPTR, A         ; a = 4
          CALL   eX               ; 5 分 13 秒
          CALL   OUT_A            ; e^4 = 54.5981500331442390781102612028608

          ; 测试 16:eX 测试
          ; e^250
          MOV    DPTR, #T16_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #250
          MOVX   @DPTR, A
          CALL   eX               ; 5 分 28 秒
          CALL   OUT_A            ; e^250 = 3.7464546145026732603499548122029e+108
          MOV    A, #'e'                  
          CALL   SEND
          MOV    A, #'+'
          CALL   SEND
          MOV    A, ten_pwd       ; 输出 10^ten_pwd 指数部分
          CALL   BIN2ASC

          ; 测试 17:10^x 测试
          ; 10^0 
          MOV    DPTR, #T17_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          CALL   TENX
          CALL   OUT_A            ; 10^0 = 1
          
          ; 测试 18:10^x 测试
          ; 10^200.5
          MOV    DPTR, #T18_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #200
          MOVX   @DPTR, A
          MOV    A, #80H
          INC    DPTR
          MOVX   @DPTR, A
          CALL   TENX             ; 5 分 28 秒
          CALL   OUT_A            ; 10^200.5 = 3.1622776601683793319988935444327e+200
          MOV    A, #'e'
          CALL   SEND
          MOV    A, #'+'
          CALL   SEND
          MOV    A, ten_pwd       ; 输出 10^ten_pwd 指数部分
          CALL   BIN2ASC
          
          ; 测试 19:立方根测试
          ; 255^(1/3)
          MOV    DPTR, #T19_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #255
          MOVX   @DPTR, A         ; a = 255
          MOV    DIV_L, #3        ; DIV_L = 3,立方根
          CALL   ROOT             ; 18 分 12 秒
          CALL   OUT_A            ; 255^(1/3) = 6.34132570538499732938067087536118

          ; 测试 20:ln(0) 测试
          ; 测试 ln(0)
          MOV    DPTR, #T20_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #0
          MOVX   @DPTR, A         ; a = 0
          INC    DPTR
          MOV    A, #80H          ; 0.5
          MOVX   @DPTR, A 
          CALL   LN               ; ln(0.5) 错误

          ; 测试 21:LNx 测试
          ; ln(2)
          MOV    DPTR, #T21_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #2
          MOVX   @DPTR, A         ; a = 2
          CALL   LNx              ; 12 分 28 秒
          CALL   COPYA2B          ; b = ln(2)
          MOV    MOV_LN2          ; a = ln(2)
          CALL   SUB8             ; a 应为 0
          CALL   OUT_A

          ; 测试 22:LOG 测试
          ; log(2)
          MOV    DPTR, #T22_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #2
          MOVX   @DPTR, A
          CALL   LOG              ; 4 秒
          CALL   OUT_A            ; log(2)=0.30102999566398119521373889472449

          ; 测试 23:LNx 测试
          ; ln(1.125)
          MOV    DPTR, #T23_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #1
          MOVX   @DPTR, A
          INC    DPTR
          MOV    A, #00100000B
          MOVX   @DPTR, A
          CALL   LNx              ; 4 分 53 秒
          CALL   OUT_A            ; ln(1.125) = 0.11778303565638345453879410947052

          ; 测试 24:LN 测试,pwd = 0
          ; ln(1.125)
          MOV    DPTR, #T24_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #1
          MOVX   @DPTR, A
          INC    DPTR
          MOV    A, #00100000B
          MOVX   @DPTR, A
          CALL   LN               ; 4 分 53 秒
          CALL   OUT_A            ; ln(1.125) = 0.11778303565638345453879410947052

          ; 测试 25:LN 测试,pwd = 2
          ; ln(4.5)
          MOV    DPTR, #T25_MSG
          CALL   PRTSTR
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, #4
          MOVX   @DPTR, A         ; a = 4
          INC    DPTR
          MOV    A, #80H          ; 0.5
          MOVX   @DPTR, A 
          CALL   LN               ; 4 分 53 秒 
          CALL   OUT_A            ; ln(4.5)=1.50407739677627407337325835238687

DONE:     SJMP   $
                  
;------------------------------------------------------------------
;  透过串口 #1 传送字元至 PC
;  波特率:115200 (22.1184 MHz) 适用于 STC32G
;------------------------------------------------------------------
INIT_UART:
          MOV   WTST,#0         ; 设定程式指令延时参数,赋值为 0 时速度设为最快,程式码不等待
          MOV   CKCON, #0       ; 提高存取 XRAM 速度,xdata 存取不增加等待
          ORL   P_SW2,#080H     ; 扩充暂存器 (XFR) 存取致能
          MOV   P3M0,#0         ; 串口 1 输出/输入连接埠设为准双向口
          MOV   P3M1,#0
          CLR   T2R             ; 先停止计时器,再修改设定
          CLR   T2_CT           ; Timer2 设定为计时器模式
          MOV   SCON, #50H      ; 串口 1 模式 1,允许串口接收资料
          MOV   T2L, #0D0H      ; (65536 - (22118400UL / 115200+2) / 4)
          MOV   T2H, #0FFH      ; (65536 - (22118400UL / 115200+2) / 4) >> 8
          SETB  S1BRT           ; 选择 Timer2 作为波特率发射器
          SETB  T2x12           ; Timer2 设定为 1T 模式(不分频)
          CLR   IE2.2           ; 禁止 Timer2 中断 
          SETB  T2R             ; 启动 Timer2
          CLR   ES              ; 不允许串口 1 中断
          RET

;  将 Acc 中的字元传送至串口 #1
SEND:
          MOV   SBUF, A         ; 将 Acc 中的字元移至串口输出缓冲区
          JNB   TI, $           ; 等待直到传输完成(TI 变高准位)
          CLR   TI              ; 手动清除 TI 以供下一个位元组使用
          RET                   ; 返回

; 从串口 #1 接收一个字元到 Acc
RECV:                           ; 从串口接收一个位元组
          JNB   RI, $           ; 等待直到接收到资料
          CLR   RI              ; 先清除 RI
          MOV   A, SBUF         ; 从串口输入缓冲区取得资料
          RET

;-------------------------------------------------------
;  PRTSTR(以 \0 结尾)
;  
;  输入:DPTR = 字串地址
;  使用的暂存器:A, DPTR
;-------------------------------------------------------
PRTSTR:
          CLR   A               ; 偏移量 = 0
          MOVC  A, @A+DPTR      ; DPTR+A(偏移量) 
          JZ    PRTSTR_DONE     ; \0 字串结束符号
          CALL  SEND
          INC   DPTR
          SJMP  PRTSTR
PRTSTR_DONE:
          RET

;-----------------------------------------------------------
;  CLR_TERMC (xDATA)
;    c = 0
;
;  使用的暂存器:A, R4, R5, DPTR
;-----------------------------------------------------------
CLR_TERMC:
          MOV   DPTR, #TERMC
CLR_TERM:
          MOV   WR4, #SIZE      ; 要清除的项次数
          MOV   A, R5
          JZ    LOOP2
          INC   R4
          MOV   A, #0           ; 先清除 ACC
LOOP2:    MOVX  @DPTR, A        ; 清除 TERMC 位元组
          INC   DPTR
          DJNZ  R5, LOOP2       ; 递减低位元组计数器
          DJNZ  R4, LOOP2       ; 递减高位元组计数器
          RET

;-----------------------------------------------------------
;  CLR_TERMA (xDATA)
;    a = 0
;
;  使用的暂存器:A, R4, R5, DPTR
;-----------------------------------------------------------
CLR_TERMA:
          MOV   DPTR, #TERMA
          SJMP  CLR_TERM
          
;-----------------------------------------------------------
;  CLR_TERMB (xDATA)
;    b = 0
;
;  使用的暂存器:A, R4, R5, DPTR
;-----------------------------------------------------------
CLR_TERMB:
          MOV   DPTR, #TERMB
          SJMP  CLR_TERM

;-----------------------------------------------------------
; COPYC2A(使用双 DPTR)
;  
;     TERMA  <-- TERMC 
;
; 使用的暂存器:A, R4, R5, DPTR
;-----------------------------------------------------------
COPYC2A:
          MOV   DPS,#00111000B  ; 自动交换、自动递增、选择 DPTR0
          MOV   DPTR, #TERMC    ; 来源 (DPTR0)
          MOV   DPTR, #TERMA    ; 目标 (DPTR1)
MOV_X:
          MOV   WR4, #SIZE      ; 16 位元 SIZE,要复制的位元组数 
          MOV   A, R5           ; 低位元组
          JZ    MOV_X1
          INC   R4              ; 若低位元组 <> 0,高位元组 += 1
MOV_X1:   MOVX  A, @DPTR        ; 从来源取得一个位元组
          MOVX  @DPTR, A        ; 复制一个位元组至目标
          DJNZ  R5, MOV_X1
          DJNZ  R4, MOV_X1
          MOV   DPS, #00000000B ; 将 DPS 重设为预设值
          RET

;-----------------------------------------------------------
; COPYC2B(使用双 DPTR)
;  
;     TERMB  <-- TERMC
;
; 使用的暂存器:A, R4, R5, DPTR
;-----------------------------------------------------------
COPYC2B:
          MOV   DPS,#00111000B  ; 自动交换、自动递增、选择 DPTR0
          MOV   DPTR, #TERMC    ; 来源
          MOV   DPTR, #TERMB    ; 目标
          SJMP  MOV_X

;-----------------------------------------------------------
; COPYB2A(使用双 DPTR)
;  
;     TERMA  <-- TERMB
;
; 使用的暂存器:A, R4, R5, DPTR
;-----------------------------------------------------------
COPYB2A:
          MOV   DPS,#00111000B  ; 自动交换、自动递增、选择 DPTR0
          MOV   DPTR, #TERMB    ; 来源
          MOV   DPTR, #TERMA    ; 目标
          SJMP  MOV_X

;-----------------------------------------------------------
; COPYA2B
;  
;     TERMB  <-- TERMA
;
; 使用的暂存器:A, R4, R5, DPTR
;-----------------------------------------------------------
COPYA2B:
          MOV   DPS,#00111000B  ; 自动交换、自动递增、选择 DPTR0
          MOV   DPTR, #TERMA    ; 来源
          MOV   DPTR, #TERMB    ; 目标
          SJMP  MOV_X

;-----------------------------------------------------------
; COPYA2D
;  
;     TERMD  <-- TERMA 
;
; 使用的暂存器:A(R11), [R0, R1](TERMD), R4, R5, DPTR
;-----------------------------------------------------------
COPYA2D:
          MOV   WR0, #TERMD     ; 目标位于 edata 区域
          MOV   DPTR, #TERMA    ; 来源位于 xdata 区域
          MOV   WR4, #SIZE      ; 16 位元 SIZE,要复制的位元组数 
          MOV   A, R5           ; 低位元组
          JZ    MOV_X2
          INC   R4              ; 若低位元组 <> 0,高位元组 += 1
MOV_X2:   MOVX  A, @DPTR        ; 从来源取得一个位元组
          MOV   @WR0, R11       ; 放入 edata,R11 = ACC
          INC   DPTR            ; INC DPTR
          ADD   WR0, #1         ; INC WR0         
          DJNZ  R5, MOV_X2
          DJNZ  R4, MOV_X2
          RET

;-----------------------------------------------------------
; COPYD2A
;  
;     TERMA  <-- TERMD 
;
; 使用的暂存器:A(R11), [R0, R1](TERMD), R4, R5, DPTR
;-----------------------------------------------------------
COPYD2A:
          MOV   WR0, #TERMD     ; 来源位于 edata 区域
          MOV   DPTR, #TERMA    ; 目标位于 xdata 区域
MOV_X3:
          MOV   WR4, #SIZE      ; 16 位元 SIZE,要复制的位元组数 
          MOV   A, R5           ; 低位元组
          JZ    MOV_X4
          INC   R4              ; 若低位元组 <> 0,高位元组 += 1
MOV_X4:   MOV   R11, @WR0       ; 从 edata 取得一个位元组
          MOVX  @DPTR, A        ; 放入 xdata TERMA
          INC   DPTR            ; INC DPTR
          ADD   WR0, #1         ; INC WR0         
          DJNZ  R5, MOV_X4
          DJNZ  R4, MOV_X4
          RET

;-----------------------------------------------------------
; COPYD2B
;  
;     TERMB  <-- TERMD 
;
; 使用的暂存器:A(R11), [R0, R1](TERMD), R4, R5, DPTR
;-----------------------------------------------------------
COPYD2B:
          MOV   WR0, #TERMD     ; 来源位于 edata 区域
          MOV   DPTR, #TERMB    ; 目标位于 xdata 区域
          SJMP  MOV_X3

;-----------------------------------------------------------
; SWAPA_D
;  
;     TERMA  <--> TERMD
;
; 使用的暂存器:A(R11), R0, R1, R4, R5, R6, DPTR
;-----------------------------------------------------------
SWAPA_D:
          MOV   WR0, #TERMD     ; TERMD 地址位于 edata 区域
          MOV   DPTR, #TERMA    ; TERMA 地址位于 xdata 区域
          MOV   WR4, #SIZE      ; 要交换的位元组数
          MOV   A, R5
          JZ    SWAP_X2
          INC   R4
SWAP_X2:  MOVX  A, @DPTR        ; 从 TERMA 取得一个位元组到 A
          MOV   R6, A           ; R6 = TERMA 资料
          MOV   R11, @WR0       ; 从 TERMD 取得一个位元组到 A (Acc = TERMD 资料)
          MOVX  @DPTR, A        ; 将 TERMD 资料写入 TERMA
          MOV   A, R6           
          MOV   @WR0, R11       ; 将原本的 TERMA 资料写入 TERMD
          INC   DPTR            ; TERMA 中的下一个位元组
          ADD   WR0, #1         ; TERMD 中的下一个位元组
          DJNZ  R5, SWAP_X2     ; 重复直到完成
          DJNZ  R4, SWAP_X2
          RET
          
;-----------------------------------------------------------
;  MOV_PI
;
;     TERMA = PI
; 
;  使用的暂存器:Acc, R4, R5, DPTR
;-----------------------------------------------------------
MOV_PI:
          MOV   DPS, #00111000B ; 自动交换、自动递增
          MOV   DPTR, #pi       ; 将来源 pi 常数地址载入 DPTR0
                 
MOV_IT:
          MOV   DPTR, #TERMA    ; 将目标地址 TERMA 载入 DPTR1
          MOV   WR4, #SIZE
          MOV   A, R5           ; 低位元组
          JZ    MOV_T
          INC   R4              ; 若低位元组 <> 0,高位元组 + 1
MOV_T:
          CLR   A               ; 清除 Acc
          MOVC  A, @A+DPTR      ; 从程式码记忆体移动
          MOVX  @DPTR, A        ; 放入 xdata
          DJNZ  R5, MOV_T
          DJNZ  R4, MOV_T
          MOV   DPS,#00000000B  ; 还原 DPS 的预设值
          RET

;-----------------------------------------------------------
;  将其他常数移动到 TERMA
;  使用的暂存器:Acc, R4, R5, DPTR
;-----------------------------------------------------------
MOV_E:
          MOV   DPS, #00111000B ; 自动交换、自动递增
          MOV   DPTR, #e        ; 将来源 e 常数地址载入 DPTR0
          SJMP  MOV_IT

MOV_LN2:
          MOV   DPS, #00111000B ; 自动交换、自动递增
          MOV   DPTR, #ln_2     ; 将来源 ln(2) 常数地址载入 DPTR0
          SJMP  MOV_IT

MOV_LN10:
          MOV   DPS, #00111000B ; 自动交换、自动递增
          MOV   DPTR, #ln_10    ; 将来源 ln(10) 常数地址载入 DPTR0
          SJMP  MOV_IT

MOV_LOGe:
          MOV   DPS, #00111000B ; 自动交换、自动递增
          MOV   DPTR, #log_e    ; 将来源 log(e) 常数地址载入 DPTR0
          SJMP  MOV_IT
          
MOV_SQRT2:
          MOV   DPS, #00111000B ; 自动交换、自动递增
          MOV   DPTR, #sqrt_2   ; 将来源 sqrt(2) 常数地址载入 DPTR0
          SJMP  MOV_IT

;-----------------------------------------------------------
;  ADD8
;     TERMA = TERMA + TERMB(使用双 DPTR)
;   
;  使用的暂存器:A, B, R4, R5, DPTR
;  TERMB 保持不变
;-----------------------------------------------------------
ADD8:
          MOV   DPTR, #TERMA+SIZE-1     ; 从最低有效位元 (lsb) 开始
          XRL   DPS, #01H               ; DPTR1
          MOV   DPTR, #TERMB+SIZE-1
          MOV   WR4, #SIZE              ; 要相加的位元组数
          MOV   A, R5
          JZ    CLR_C1
          INC   R4
CLR_C1:   CLR   C                       ; 相加前清除进位
NXT_DIGIT: 
          MOVX  A, @DPTR                ; 从 TERMB 取得被加数
          MOV   B, A            
          XRL   DPS, #01H               ; DPTR0
          MOVX  A, @DPTR                ; 从 TERMA 取得加数
          ADDC  A, B                    ; 将两个加数与进位相加
          MOVX  @DPTR, A                ; 将和放回 TERMA
          DEC_DPTR                      ; DPTR0--
          XRL   DPS, #01H
          DEC_DPTR                      ; DPTR1--
          DJNZ  R5, NXT_DIGIT           ; 处理下一个位数
          DJNZ  R4, NXT_DIGIT
          MOV   DPS, #0                 ; 以 DPTR0 离开
          RET

;----------------------------------------------------------
;  SUB8
;     TERMA = TERMA - TERMB(使用双 DPTR)
;
;  使用的暂存器:A, B, R4, R5, DPTR
;  TERMB 保持不变
;-----------------------------------------------------------
SUB8:
          MOV   DPTR, #TERMA+SIZE-1     ; 从 LSB 开始
          XRL   DPS, #01H               ; DPTR1
          MOV   DPTR, #TERMB+SIZE-1
          MOV   WR4, #SIZE              ; 要相减的位元组数
          MOV   A, R5
          JZ    CLR_C2
          INC   R4
CLR_C2:   CLR   C                       ; 相减前清除进位
NXT_DIG2: MOVX  A, @DPTR                ; 从 TERMB 取得减数
          MOV   B, A
          XRL   DPS, #01H               ; DPTR0
          MOVX  A, @DPTR                ; 从 TERMA 取得被减数
          SUBB  A, B                    ; 减去减数与借位
          MOVX  @DPTR, A                ; 将差放回 TERMA
          DEC_DPTR                      ; DPTR0--
          XRL   DPS, #01H
          DEC_DPTR                      ; DPTR1--
          DJNZ  R5, NXT_DIG2            ; 处理下一个位数
          DJNZ  R4, NXT_DIG2
          MOV   DPS, #0                 ; 以 DPTR0 离开
          RET

;---------------------------------------------------------
;  COMP8
;  比较 TERMA 与 TERMB(使用双 DPTR)
;  若 TERMA >= TERMB,设定 LARGEFLAG (F0)
;  若相等则 C=1
;
;  使用的暂存器:A, B, R4, R5, DPTR
;  TERMA, TERMB 保持不变
;---------------------------------------------------------
;  
COMP8:     
          CLR   LARGEFLAG       ; 清除 LARGEFLAG
          MOV   DPS,#00111001B  ; 启用 TSL 自动交换、自动递增、选择 DPTR1  
          MOV   DPTR, #TERMB    ; TERMA 地址至 DPTR1
          MOV   DPTR, #TERMA    ; TERMB 地址至 DPTR0

          MOV   WR4, #SIZE      ; 要比较的位元组数
COMP8_0:
          MOV   A, R5
          JZ    CLR_C3
          INC   R4
CLR_C3:   CLR   C               ; 先清除 C
COMP8_1:  
          MOVX  A, @DPTR        ; 从 TERMB 取得一个位元组
          MOV   B, A            ; 移至 B
          MOVX  A, @DPTR        ; 从 TERMA 取得一个位元组
          SUBB  A, B            ; 比较
          JZ    CHECK_NEXT      ; 相等,C=0,检查下一个位元组
          JNC   GREATER         ; 大于,设定旗标并离开
          CLR   C               ; 若较小则 C=0          
          MOV   DPS,#00000000B  ; 还原预设 DPS 值
          RET                   ; 若较小则返回
CHECK_NEXT:
          DJNZ  R5, COMP8_1
          DJNZ  R4, COMP8_1
          SETB  C               ; 若相等则 C=1
GREATER:  SETB  LARGEFLAG       ; 若大于或等于则设定 LARGEFLAG
          MOV   DPS,#00000000B  ; 还原预设 DPS 值
          RET

;---------------------------------------------------------
;  CHECK_ERR
;  检查截断误差:比较 TERMA 与 TERMB
;  若 TERMA = TERMB,设定 C=1(忽略最后一个位元组)
;
;  使用的暂存器:A, B, R4, R5, DPTR
;  TERMA, TERMB 保持不变
;---------------------------------------------------------
CHECK_ERR:  
          CLR   LARGEFLAG       ; 清除 LARGEFLAG
          MOV   DPS,#00111001B  ; 启用 TSL 自动交换、自动递增、选择 DPTR1  
          MOV   DPTR, #TERMB    ; TERMA 地址至 DPTR1
          MOV   DPTR, #TERMA    ; TERMB 地址至 DPTR0

          MOV   WR4, #SIZE-1    ; 要比较的位元组数(-1 以忽略最后一个位元组)
          SJMP  COMP8_0

;----------------------------------------------------------
;  CHECK_ZERO
;     若 TERMB = 0 则设定 ZEROFLAG
;
;  使用的暂存器:A, R4, R5, DPTR
;  TERMB 保持不变
;-----------------------------------------------------------
CHECK_ZERO:
          CLR   ZEROFLAG        ; 先清除 ZEROFLAG
          MOV   DPTR, #TERMB
          MOV   WR4, #SIZE
          MOV   A, R5
          JZ    NXT_DIG3
          INC   R4
NXT_DIG3: MOVX  A, @DPTR        ; 从 TERMB 取得位数
          JNZ   NXT_DIG4        ; 若非零则离开
          INC   DPTR
          DJNZ  R5,NXT_DIG3
          DJNZ  R4,NXT_DIG3     ; 处理下一个位数
          SETB  ZEROFLAG        ; 若全部为零则离开并设定 ZEROFLAG
NXT_DIG4: RET

;----------------------------------------------------------
;  MULTIPLY 
;     TERMC = TERMA * TERMB
;
;  使用的暂存器:A, B, R1(b[b_j]), [R2, R3](b_j), [R4, R5](a_i), 
;                  R6(进位), R7, DPTR
;  
;  RAM=1 表示 TERMB 来自 RAM,RAM=0 表示 TERMB 来自 ROM
;
; multiply(a[0..size-1], b[0...size-1]) --> product [0..2*size-1]         
; 
;  for b_j = size-1 to 0 step -1           
;    carry = 0
;    for a_i = size-1 to 0 step -1  
;          sum = product[a_i + b_j + 1] + carry + a[a_i] * b[b_j]
;          carry = sum / 256
;          product[a_i + b_j + 1] = sum mod 256
;    product[b_j] = carry                               
;  return product
;
;  TERMA, TERMB 保持不变。
;
;  耗时:1 秒
;-----------------------------------------------------------
MULTIPLY:
         MOV     DPTR, #TERMB+SIZE-1  ; DPTR0 用于 TERMB 地址
SQUARE1:                              ; TERMC = TERMA * TERMA (进入点)
         MOV     RAM, #1              ; RAM=1 表示 RAM 来源
MULTIPLY1:
         MOV     WR2, #SIZE           ; b[b_i] 大小
         ;----------------------------------------
         ; 取得 b[b_j],RAM=1 则从 RAM,否则从 ROM 
         ; ----------------------------------------------------
FOR_B:   MOV     A, RAM               ; 来自 RAM 还是 ROM?
         JNZ     FROM_RAM
         ; 从 ROM 提取
         MOV     A, #0
         MOVC    A, @A+DPTR
         SJMP    STORE_b_j
FROM_RAM:
         MOVX    A, @DPTR             ; 取得 b[b_i] 到 A (TERMB 的 DPTR0)
         ;-----------------------------------------------------
STORE_b_j:
         MOV     R1, A                ; 储存至 R1         
         PUSH    DPL                  
         PUSH    DPH                  ; 将 DPTR0 (TERMB 地址) 压入堆栈
         XRL     DPS, #01H            ; 切换至 DPTR1 
         MOV     DPTR, #TERMA+SIZE-1  ; TERMA 的 DPTR1
         MOV     R6, #0               ; carry = 0
         MOV     WR4, #SIZE           ; a[a_i] 大小
         ; 计算积 product 的地址
         XRL     DPS, #01H            ; TERMC 的 DPTR0
         MOV     DPTR, #TERMC         ; TERMC 基础地址
         ; 积的地址 proudct = TERMC+[R2,R3]+[R4,R5]-2
         MOV     A, R3
         ADD     A, R5
         JNC     DEC_0
         INC     DPH
DEC_0:   ADD     A, DPL               ; + TERMC 基础地址
         MOV     DPL, A
         JNC     DEC_1
         INC     DPH
DEC_1:   MOV     DPL, A
         MOV     A, DPH
         ADD     A, R2
         ADD     A, R4                ;假设 DPH 中无进位 (xdata 地址 01:0000 - 01:1FFF)
         MOV     DPH, A
         DEC_DPTR                     ; -2,调整计数器与指标之间的差值
         DEC_DPTR                     ; 例如:第 1 次执行,SIZE+SIZE=2*SIZE,
                                      ; 但 TERMC 中的最后一个位元组是 2*SIZE-2
         ; --- 内回圈 ----
         XRL     DPS, #01H            ; 切换回 DPTR1 (TERMA 地址)
FOR_A:   MOV     B, R1                ; B = 来自 R1 的 b[b_j]
         MOVX    A, @DPTR             ; A = a[a_i]
         MUL     AB                   ; BA = A * B
         ADD     A, R6                ; carry + a[a_i] * b[b_j]
         JNC     MULT1
         INC     B                    ; 进位 carry + 1
MULT1:   MOV     R7, A                ; R7 = C + a[a_i] * b[b_j]
         XRL     DPS, #01H            ; TERMC 地址 DPTR0
         MOVX    A, @DPTR             ; 取得product
         ADD     A, R7                ; A = (product + carry + a[a_i] * b[b_j]) mod 256
         MOVX    @DPTR, A             ; 将积 product 放回 
         JNC     MULT2
         INC     B                    ; 进位 carry + 1
MULT2:   MOV     R6, B                ; 进位 carry = (product + carry + a[a_i] * b[b_i])/ 256      
MULT3:   DEC_DPTR                     ; TERMC 地址 - 1
         XRL     DPS, #01H            ; TERMA 地址 DPTR1
         DEC_DPTR                     ; TERMA 地址 - 1
         ; --- 内回圈 ----
         MOV     A, R5
         ADD     A, #0FFH             ; 等同于 DEC R5,但会更新进位旗标 (C)
         MOV     R5, A
         MOV     A, R4
         ADDC    A, #0FFH             ; 若低位元组发生借位则减 1
         MOV     R4, A
         ; 检查 R4 与 R5 是否皆为零
         ORL     A, R5        
         JNZ     FOR_A                ; 仍在 DPTR1 资料流中
         ; FOR_A 结束         
         XRL     DPS, #01H            ; DPTR0 (TERMC 地址)
         ; 将最终进位储存至 product[b_j]
         MOV     A, R6                ; 取得最后的进位 carry
         MOVX    @DPTR, A             ; product[b_j] = carry   
         ; --- 外回圈 ---
         POP     DPH
         POP     DPL                  ; 还原 TERMB 地址
         DEC_DPTR                     ; TERMB 地址 - 1 (DPTR0)
         ; TERMB
         MOV     A, R3
         ADD     A, #0FFH             ; 等同于 DEC R3,但会更新进位旗标 (C)
         MOV     R3, A
         MOV     A, R2
         ADDC    A, #0FFH             ; 若低位元组发生借位则减 1
         MOV     R2, A
         ; 检查 R2 与 R3 是否皆为零
         ORL     A, R3        
         JNZ     JMP_FOR_B            ; 保持在 DPTR0 资料流中

         ; --- 调整 product 最后一个位数 ---
         ;  RET                       ; 若不需要调整则 RET
adj0:
         MOV     DPTR, #TERMC + SIZE
         MOVX    A, @DPTR
         ANL     A, #80H              ; 截断误差检查 (bit 7 >= 0.5)
         JNZ     adj1                 ; 若非零则四舍五入进位
adj_done:
         RET
adj1:    
         DEC_DPTR                     ; TERMC 地址 - 1
         SETB    C                    ; C=1 (来自 TERMC+SIZE 位元组的进位)
adj2:    MOVX    A, @DPTR
         ADDC    A, #0
         MOVX    @DPTR, A
         JNC     adj_done
         DEC_DPTR                     ; 上至 #TERMC-1 (溢位错误) 
         SJMP    adj2

JMP_FOR_B:
         JMP     FOR_B
         
;----------------------------------------------------------
;  SQUARE 
;     TERMC = TERMA * TERMA
;
;  使用的暂存器:A, B, R1(a[a_j]), [R2, R3](a_j), [R4, R5](a_i), 
;                  R6(进位), R7, DPTR
;
;  TERMA 保持不变
;  耗时:1 秒
;-----------------------------------------------------------
SQUARE:
         MOV     DPTR, #TERMA+SIZE-1  ; TERMA 地址的 DPTR0
         JMP     SQUARE1

;----------------------------------------------------------
;  x_CONST 
;     TERMC = TERMA * CONSTANT
;
;  使用的暂存器:A, B, R1(b[b_j]), [R2, R3](b_j), [R4, R5](a_i), 
;                  R6(进位), R7, DPTR
;  
;  TERMA 保持不变
;  耗时:1 秒
;-----------------------------------------------------------
x_CONST:
         ; DPTR 指向 CONSTANT 地址
         ; DPTR = #CONSTANT + SIZE - 1
         MOV     A, DPL
         ADD     A, #LOW (SIZE - 1)
         MOV     DPL, A
         MOV     A, DPH
         ADDC    A, #HIGH (SIZE - 1)
         MOV     DPH, A
         MOV     RAM, #0              ; RAM = 0 表示 ROM 来源 
         JMP     MULTIPLY1
         
;------------------------------------------------------------
;  DIV16C
; 
;  TERMC = TERMC / DIV (16-BIT)
;
;  使用的暂存器:A, R0(商), [R1, R2](余数), R3(位元计数器), [R4, R5](位元组计数器), 
;                DPTR, [R6, R7](DIV)
;------------------------------------------------------------
DIV16C:   MOV   DPTR, #TERMC
          SJMP  DIV16

;------------------------------------------------------------
;  DIV16B
; 
;  TERMB = TERMB / DIV (16-BIT)
;
;  使用的暂存器:A, R0(商), [R1, R2](余数), R3(位元计数器), [R4, R5](位元组计数器), 
;                DPTR, [R6, R7](DIV)
;  耗时:秒
;------------------------------------------------------------
DIV16B:                    
         MOV   DPTR, #TERMB     ; TERMB 从此处开始
DIV16:
          MOV   WR4, #SIZE      ; 项次数
         MOV   A, R5
         JZ    SKIP_00
         INC   R4
SKIP_00: MOVX  A, @DPTR         ; 跳过前导 0
         JNZ   DIV16_1
         INC   DPTR
         DJNZ  R5, SKIP_00
         DJNZ  R4, SKIP_00
         SETB  ZEROFLAG         ; 若全为零则设定 ZEROFLAG
         RET                    ; 被除数全为零,返回
         
DIV16_1:  MOV   R2, #0          ; 余数低位初始化为 0
          MOV   R1, #0          ; 余数高位初始化为 0

NXT_BYTE:
          MOV   R3, #8          ; 每个 Byte 有 8 个 Bits
          MOVX  A, @DPTR        ; 从外部 SRAM 读取目前 Byte
          MOV   R0, A           ; 存入 R0,同时也是商=0

NXT_BIT:
          ; 余数 [R1, R2] 与目前位元进行联合左移
          MOV   A, R0
          ADD   A, R0           ; R0 左移一位,最高位进入 C
          MOV   R0, A
                
          MOV   A, R2
          RLC   A               ; 余数低位左移,带入 C
          MOV   R2, A
                
          MOV   A, R1
          RLC   A               ; 余数高位左移,带入 C
          MOV   R1, A
                
          JC    DO_SUB          ; C=1 代表溢位,一定够减,直接去减!

          ; C=0 时,进行试探性相减 [R1, R2] - [R6, R7]
          CLR   C
          MOV   A, R2
          SUBB  A, R7
          MOV   A, R1
          SUBB  A, R6
          JC    NO_SUB          ; 若 C=1,代表余数 < 除数,不能减

DO_SUB:   ; 够减:更新真实余数,并将商的该位设为 1
          CLR   C
          MOV   A, R2
          SUBB  A, R7
          MOV   R2, A           ; 更新低位余数
          MOV   A, R1
          SUBB  A, R6
          MOV   R1, A           ; 更新高位余数
                                
          MOV   A, R0           ; 商 --> A 
          ORL   A, #01H         ; 更新商,将刚刚左移空出的最低位补 1
          MOV   R0, A           ; 商暂存在 R0

NO_SUB:   ; 不够减:保持原余数,商的该位维持 0
          DJNZ  R3, NXT_BIT     ; 8 个位元尚未跑完则继续
             
          MOV   A, R0           ; 计算好的商
          MOVX  @DPTR, A        ; 写回外部 SRAM
                
          INC   DPTR            ; 指标移至下一个位元组
                
          DJNZ  R5, NXT_BYTE    ; 下一个位元组
          DJNZ  R4, NXT_BYTE
          RET

;-----------------------------------------------------------------------
; DIVIDE:
;
;    c = TERMA / TERMB
;
; 长除法演算法:
; if D = 0 then set overflow error, end
; Q := 0                  -- 初始化商与余数为零
; R := 0                     
; for i := n - 1 .. 0 do  -- 这里 n 是分子 (N) 中的位元数
;   R := R << 1           -- R 左移 1 位元
;   R(0) := N(i)          -- 设定 R 的 LSB 等于分子的第 i 位元
;   if R >= D then        -- 如果余数 (R) >= 分母 (D)
;     R := R - D
;     Q(i) := 1
;   end
; end
; 
; 要求:分子 <= 255
;       分母 <> 0
; 使用的暂存器:
;           A, B, R0(商), [R4, R5](计数器), DPTR
;           TERMB 保持不变
;
; TERMA 被覆盖,TERMB 保持不变
; 耗时:3 秒
;-----------------------------------------------------------------------
DIVIDE:
          CALL   CHECK_ZERO      ; b = 0?
          JNB    ZEROFLAG, CONTD ; 不是,继续
          ; b=0,溢位错误
DIVIDE_ERR:
         MOV    DPTR, #DIV0      ; 列印 "Divided by 0" 错误
         CALL   PRTSTR
         RET
         
CONTD:   CALL   CLR_TERMC        ; 清除 TERMC
         CALL   COMP8            ; 分子 = 分母?
         JNC    CONTD1           ; 先检查 C
         MOV    DPTR, #TERMC     ; 若分子 = 分母则 C = 1 
         MOV    A, #1
         MOVX   @DPTR, A         ; 返回且商 = 1
         RET
CONTD1:  JNB    LARGEFLAG, CONTD2; 分子 > 分母?不是,跳过
         ; 是,若分子 > 分母则重复相减
         ;- - - 分子 > 分母 
         MOV    R0, #0           ; 商 = 0
QPLUS1:  INC    R0               ; 商+1
         CALL   SUB8             ; n = n - d             
         CALL   COMP8
         JB     LARGEFLAG, QPLUS1
         MOV    DPTR, #TERMC     ; 商的整数部分
         MOV    A, R0
         MOVX   @DPTR, A         ; 更新商
         ;- - - 分子 < 分母 
CONTD2:  
         MOV    DPTR, #TERMC+1   ; 商的小数部分

;---------- 除法主回圈 ---------------------------------------
LOOP3:
         MOV    bit_x, #80H     ; 从第 7 位元开始
         MOV    R0, #0          ; 初始商 = 0
         ; 将 TERMC DPTR 压入堆栈
         PUSH   DPH
         PUSH   DPL
LOOP4:   CALL   SHIFT_A_L       ; R << 1,C=余数的 MSB
         JC     LARGER          ; C=1,余数 > 分母
         CALL   COMP8           ; C=0,检查余数 >= 分母?
         JNB    LARGEFLAG, NEXT_Q  ; 余数 < 分母,商=0
LARGER:  CALL   SUB8            ; 余数 = 余数 - 分母
         MOV    A, R0           
         ADD    A, bit_x        ; 商 = 1
         MOV    R0, A           ; 更新商
NEXT_Q:  MOV    A, bit_x        ; 移至商的下一个位元
         CLR    C
         RRC    A               ; 下一个位元
         MOV    bit_x, A
         JNC    LOOP4           ; 在同一个位元组内
         ; 位元组结束,还原 DPTR 并更新 TERMC 中的商
         POP    DPL
         POP    DPH
         MOV    A, R0
         MOVX   @DPTR, A        ; 更新 TERMC 中的商
         INC    DPTR            ; TERMC DPTR + 1
         MOV    A, DPL
         CJNE   A, #LOW (TERMC+SIZE), LOOP3    ; TERMC 结束? 
         MOV    A, DPH
         CJNE   A, #HIGH (TERMC+SIZE), LOOP3
         RET                    ; 是,返回

;--------------------------------------------------  -----------------
; SHIFT_A_R
; 
;   TERMA >>= 1
; 
;  使用的暂存器:A, R4, R5, DPTR
;-------------------------------------------------------------------
SHIFT_A_R:
          MOV   DPTR, #TERMA
          MOV   WR4, #SIZE
          MOV   A, R5
          JZ    SHIFT_R
          INC   R4
SHIFT_R:
          CLR   C               ; 第一次位移前 C=0
SHIFT_R1: MOVX  A, @DPTR
          RRC   A               ; An = An+1, A7=C, C=A0
          MOVX  @DPTR, A
          INC   DPTR
          DJNZ  R5, SHIFT_R1
          DJNZ  R4, SHIFT_R1
          RET   

;--------------------------------------------------------------------
;  SHIFT_A_L
;
;   TERMA <<= 1
;
;  使用的暂存器:A, R4, R5, DPTR
;--------------------------------------------------------------------
SHIFT_A_L:
          MOV   DPTR, #TERMA+SIZE-1
          MOV   WR4, #SIZE
          MOV   A, R5
          JZ    SHIFT_L
          INC   R4
SHIFT_L:          
          CLR   C               ; 第一次位移前 C=0
SHIFT_L1:  
          MOVX  A, @DPTR
          RLC   A               ; An+1 = An, A0 = C, C = A7
          MOVX  @DPTR, A
          DEC_DPTR
          DJNZ  R5, SHIFT_L1
          DJNZ  R4, SHIFT_L1
          RET

;--------------------------------------------------------------------
;  ATAN(使用欧拉于 1748 年提出的泰勒级数)
;
;     TERMA = Acc*ATAN(1/div)      2 <= div < 256 储存于 DIV_L
;     atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...
;     arcsin (x) = atan(x/sqrt(1-x^2))
;     
;  TERMC = TERMC / div^2
;  TERMB = TERMC / n         (n = 1, 3, 5, 7,...)
;  TERMA = TERMA +/- TERMB   (3, 7, 11 - ; 5, 9, 13 +)
;
;  TERMB, TERMC 被覆盖
;  耗时:9 秒 (div = 4)
;--------------------------------------------------------------------
ATAN:
          MOV   R0, A           ; 保留 Acc
          CALL  CLR_TERMC
          MOV   DPTR, #TERMC
          MOV   A, R0           ; c = Acc
          MOVX  @DPTR, A
          ; 第一个除数是 div
          MOV   R6, #0
          MOV   R7, DIV_L
          CALL  DIV16C          ; c = Acc/div
          CALL  COPYC2A         ; a = Acc/div
          ; 下一个除数是 div^2
          MOV   A, DIV_L        
          MOV   B, A
          MUL   AB
          MOV   DIV_L, A        ; div^2 的低位元组
          MOV   DIV_H, B        ; div^2 的高位元组
          ; 下一个 n 是 3 
          MOV   TERMP_H, #0     ; 下一个除数 div = 3
          MOV   TERMP_L, #3
ATAN_LOOP:
          MOV   R6, DIV_H
          MOV   R7, DIV_L
          CALL  DIV16C          ; TERMC / div^2
          CALL  COPYC2B
          MOV   R6, TERMP_H
          MOV   R7, TERMP_L
          CALL  DIV16B          ; TERMB = TERMC / div^2 / n
          CALL  CHECK_ZERO
          JB    ZEROFLAG, ATAN_DONE
          MOV   A, TERMP_L
          RRC   A              
          RRC   A
          JC    ATAN_SUB        ; 3, 7, 11 -
          ; 偶数 +
          CALL  ADD8            ; 5, 9, 13 +
          SJMP  ATAN_LOOP2
           ; 奇数 -
ATAN_SUB: CALL  SUB8
ATAN_LOOP2:
          MOV   A, TERMP_L
          ADD   A, #2           ; div += 2
          MOV   TERMP_L, A
          JNC   ATAN_LOOP
          INC   TERMP_H
          SJMP  ATAN_LOOP
ATAN_DONE:RET

;--------------------------------------------------------------------
;  ATAN2 (x 储存在 TERMA) 
;
;     atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...   (0<= x <= 0.5)
;     atan(x) = 2*atan(x/(1+sqrt(1+x*x))          (x > 0.5)
;     arcsin(x) = atan(x/sqrt(1-x^2))
;     
;  TERMC = TERMC / x^2
;  TERMB = TERMC / n         (n = 1, 3, 5, 7,...)
;  TERMA = TERMA +/- TERMB   (3, 7, 11 - ; 5, 9, 13 +)
;
;  TERMB, TERMC, TERMD 被覆盖,TERMD = x^2
;  耗时:9 分 55 秒 (x = 1/4)
;--------------------------------------------------------------------
ATAN2:    
          CALL   COPYA2D        ; d = x = sum
          CALL   COPYA2B        ; b = x (目前项)
          CALL   SQUARE         ; TERMC = x^2 (乘数)
          CALL   COPYC2A        ; TERMA = x^2 (TERMA 交替保存 x^2/sum)
          MOV    TERMP_H, #0
          MOV    TERMP_L, #3    ; 下一个除数 n = 3
ATAN2_LOOP:
          CALL  MULTIPLY        ; TERMC = x^n (下一个幂次)
          CALL  COPYC2B                
          MOV   R6, TERMP_H
          MOV   R7, TERMP_L
          CALL  DIV16B          ; TERMB = x^n / n
          CALL  SWAPA_D         ; a = sum, d=x^2
          CALL  CHECK_ZERO
          JB    ZEROFLAG, ATAN2_DONE
          MOV   A, TERMP_L
          RRC   A              
          RRC   A
          JC    ATAN2_SUB       ; 3, 7, 11 -
          ; 偶数 +
          CALL  ADD8            ; 5, 9, 13 +
          SJMP  ATAN2_SWAP
           ; 奇数 -
ATAN2_SUB:
          CALL  SUB8
ATAN2_SWAP:
          CALL  SWAPA_D         ; a = x^2, d=新 sum
          CALL  COPYC2B         ; TERMB = 新 term
          MOV   A, TERMP_L
          ADD   A, #2           ; n += 2
          MOV   TERMP_L, A
          JNC   ATAN2_LOOP
          INC   TERMP_H
          SJMP  ATAN2_LOOP
ATAN2_DONE:
          RET

;---------------------------------------------------------------
; 使用牛顿-拉夫森方法 (1690) 寻找 sqrt(x)
;  a(0) = 1 或 x/2 
;  a(n) = [a(n-1) + x/a(n-1)]/2     n=1, 2, 3,.... 
; 
;  TERMB, TERMC 被覆盖,TERMD = x
;  耗时:32 秒
;---------------------------------------------------------------
SQRT:    CALL   COPYA2D         ; d = x
         ; 设定 sqrt 的初始值
          MOV    DPTR, #TERMA   
         MOVX   A, @DPTR
         CLR    C
         SUBB   A, #2
         JC     SQRT_X          ; x < 2
         CALL   SHIFT_A_R       ; x/2 作为 sqrt 的初始值
SQRT_X:  CALL   SWAPA_D         ; x
         CALL   COPYD2B         ; b = 之前的 sqrt 值
          CALL   COPYA2D        ; 将 x 储存在 d
         CALL   DIVIDE          ; c = x/b
         CALL   COPYC2A         ; a = 新的 sqrt 值
         CALL   ADD8            ; a = a + b
         CALL   SHIFT_A_R       ; a = a / 2,平均值
         CALL   CHECK_ERR       ; 截断误差检查,a=b?
         JNC    SQRT_X          ; 不是,C=0,继续
         RET                    ; 是,C=1,完成

;---------------------------------------------------------------
; 使用马青公式 (1706) 寻找 pi
;  TERMA = pi = 16*atan(1/5) - 4*atan(1/239)
;
;  TERMB, TERMC, TERMD 被覆盖
;  耗时:10 秒
;---------------------------------------------------------------
FIND_PI:
          MOV    DIV_L, #239
          MOV    A, #4        
          CALL   ATAN           ; 4*atan(1/239)
          CALL   COPYA2D        ; 储存至 TERMD
          MOV    DIV_L, #5
          MOV    A, #16
          CALL   ATAN           ; 16*atan(1/5)
          CALL   COPYD2B
          CALL   SUB8           ; 16*atan(1/5) - 4*atan(1/239)
          RET

;---------------------------------------------------------------
; 使用泰勒级数 (1748) 寻找 e
;  TERMA = e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/2252!
;
;  TERMB 被覆盖
;  耗时:3 秒
;---------------------------------------------------------------
FIND_E:
          CALL  CLR_TERMA
          MOV   DPTR, #TERMA
          MOV   A, #1
          MOVX  @DPTR, A        ; a = 1  
          CALL  COPYA2B         ; b = 1
          MOV   DPTR, #TERMA
          MOV   A, #2
          MOVX  @DPTR, A        ; a = 2
          MOV   R7, #2
          MOV   R6, #0          ; n = 2
FIND_E1:  CALL  DIV16B          ; b = 1 / n!
          CALL  CHECK_ZERO      ; b = 0?
          JB    ZEROFLAG, E_DONE
          CALL  ADD8            ; a = a + 1 / n!
          INC   R7              ; n = n + 1
          MOV   A, R7
          JNZ   FIND_E1
          INC   R6
          SJMP  FIND_E1
E_DONE:
          RET  

;---------------------------------------------------
; 使用泰勒级数 (1748) 寻找 sin(a deg):
; 首先将 a deg 转换为 x rad
; x rad = a * pi / 180 弧度
; sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...
; cos(x) = sin(pi/2 - x)
;
; 假设标准任意精度记忆体区块:
;   TERMA / TERMD = x^2 或 sum
;   TERMB = TERMA * TERMB / n!
;   TERMA = TERMA +/- TERMB
; 
;  TERMB, TERMC, TERMD 被覆盖
;  耗时:2 分 16 秒
;---------------------------------------------------
SIN_A:    MOV    R0, A          ; 将 Acc 度数储存到 R0
          CALL   CLR_TERMA      ; 清除 a
          MOV    DPTR, #TERMA
          MOV    A, R0          ; Acc 度数
          MOVX   @DPTR, A       ; a = Acc 度数
SIN:      ; sin(TERMA deg) 
          ; 将度数转换为弧度:x = Acc * pi / 180
          CALL   SWAPA_D        ; d = x 度数
          MOV    MOV_PI         ; a = pi
          CALL   COPYA2B        ; b = pi
          CALL   SWAPA_D
          CALL   MULTIPLY       ; c = x * pi
          CALL   COPYC2B        ; b = x * pi
          MOV    R6, #0         
          MOV    R7, #180       ; 除数 180
          CALL   DIV16B         ; b = x (rad)
        
          ; 初始化级数变数
          CALL   COPYB2A        ; a = sum = x (第一项)
          ; 为后续更高幂次的项准备 x^2 (x * x)
SIN_r:    ; sin (TERMA rad)
          CALL   COPYA2B        ; b = x 补偿 SIN_r 进入点
          CALL   SQUARE         ; c = x^2
          CALL   SWAPA_D        ; 将 sum 储存在 d
          CALL   COPYC2A        ; a = x^2
          ; 初始化阶乘除数
          MOV    DIV_L, #1      ; 初始化 div (第一次执行时会变成 2)
          MOV    DIV_H, #0
LOOP_S:   ; 将目前项乘以 x^2 以取得下一个幂次 (例如:x -> x^3 -> x^5)
          CALL   MULTIPLY       ; c = a * b = x^3 --> x^5
          INC    DIV_L
          MOV    A, DIV_L
          JNZ    DIV_1
          INC    DIV_H
DIV_1:    MOV    R6, DIV_H
          MOV    R7, DIV_L
          CALL   DIV16C         ; /2, /4, /6, ...
          INC    DIV_L
          MOV    A, DIV_L
          JNZ    DIV_2
          INC    DIV_H
DIV_2:    MOV    R6, DIV_H
          MOV    R7, DIV_L
          CALL   DIV16C         ; /3, /5, /7 ... --> c = x^(2k+1) /(2k+1)!
          CALL   SWAPA_D        ; a = sum
          CALL   CHECK_ZERO     ; c = 0?
          JB     ZEROFLAG, SIN_DONE
          CALL   COPYC2B        ; b = 新 term
          MOV    A, DIV_L
          RRC   A              
          RRC   A
          JC    SIN_SUB         ; a = a +/- b
          ; 偶数 +
          CALL   ADD8           ; 5, 9, 13 +
          SJMP   SIN_SWAP
SIN_SUB:  CALL   SUB8           ; 3, 7, 11 -
SIN_SWAP: CALL   SWAPA_D        ; 将 sum 储存在 d
          SJMP   LOOP_S
SIN_DONE: RET


;---------------------------------------------------------------
; 寻找 log(x)  log(x) = ln(x) * log(e)    (1 <= x)
;
;  TERMB, TERMC, TERMD 被覆盖
;  耗时:12 分 28 秒
;---------------------------------------------------------------
LOG:
          CALL   LN
          MOV    DPTR, #log_e   ; log(e) 常数地址至 DPTR
          CALL   x_CONST        ; ln(x)*log(e)
          CALL   COPYC2A        ; a=log(x)
          RET

;---------------------------------------------------------------
; 使用麦克劳林展开式寻找 ln(x)   (1 <= x < 2)
;  透过使用转换 t = (x-1)/(x+1),
;   ln(x) = 2 ( t + t^3/3 + t^5/5 + t^7/7 + ...)
;  
;  对于 x >= 2,使用 ln(a*2^n) = ln(a)+n*ln(2)
;  log(x)  = ln(x) * log(e) 
;
;  TERMB, TERMC, TERMD 被覆盖
;  耗时:12 分 28 秒 (ln(2))
;---------------------------------------------------------------
LN:       ; 对于 x >= 2
          ; 寻找 n 使得 x = a*2^n
          ; ln(x) = ln(a)+n*ln(2)
          ; 重复将 x 除以 2 直到 1 <= x < 2        
          MOV    pwd, #0        ; 开始 n = 0
SHIFT_X:  MOV    DPTR, #TERMA   ; 从 TERMA 取得整数位元组
          MOVX   A, @DPTR
          JZ     LN_ERR
          CJNE   A, #1, SHIFT_IT
          ; A = 1,位移结束
          CALL   LNx            ; ln(a) 其中 1 <= a < 2
          MOV    A, pwd         ; 检查 pwd
          JNZ    PWD_MUL        ; n>0,执行相乘
          RET                   ; pwd=0, ln(x) = ln(a)

LN_ERR:
          MOV    DPTR, #LN0     ; 列印 "ln(x) error, x must >= 1" 错误
          CALL   PRTSTR
          RET

SHIFT_IT: CALL   SHIFT_A_R      ; x/2
          INC    pwd            ; n+1
          SJMP   SHIFT_X        ; 重复

PWD_MUL:  ; n>0, ln(x) = ln(a)+n*ln(2)
          CALL   COPYA2B        ; b = ln(a)
          ; n*ln(2)
          CALL   CLR_TERMA
          MOV    DPTR, #TERMA
          MOV    A, pwd
          MOVX   @DPTR, A       ; a = n
          MOV    DPTR, #ln_2    ; ln_2 常数地址至 DPTR
          CALL   x_CONST        ; n*ln(2)
          CALL   COPYC2A        ; a=n*ln(2)
          ; ln(a)+n*ln(2)
          CALL   ADD8           ; ln(a)+n*ln(2)
          RET
        
LNx:      ; 对于 1<= x < 2
          CALL   COPYA2B        ; b = x
          ; x - 1
          MOV    DPTR, #TERMA
          MOVX   A, @DPTR
          DEC    A
          MOVX   @DPTR, A       ; x - 1        
          MOV    DPTR, #TERMB
          MOVX   A, @DPTR
          INC    A
          MOVX   @DPTR, A       ; x + 1
          CALL   DIVIDE         ; TERMC = t = (x-1)/(x+1)
          ; t = (x - 1) / (x + 1)
          CALL   COPYC2A        ; a = t
          CALL   COPYA2D        ; d = t  (总和累加器从 t 开始)
          CALL   COPYA2B        ; b = t (目前项)
          CALL   SQUARE         ; TERMC = t^2 (乘数)
          CALL   COPYC2A        ; TERMA = t^2 (TERMA 交替保存 t^2/sum)
          MOV    TERMP_H, #0
          MOV    TERMP_L, #3    ; 下一个除数 n = 3
LNx_LOOP:
          CALL  MULTIPLY        ; TERMC = t^n (下一个幂次)
          CALL  COPYC2B                
          MOV   R6, TERMP_H
          MOV   R7, TERMP_L
          CALL  DIV16B          ; TERMB = t^n / n
          CALL  SWAPA_D         ; a = sum, d=t^2
          CALL  CHECK_ZERO
          JB    ZEROFLAG, LNx_DONE
          CALL  ADD8            ; sum = sum + term
          CALL  SWAPA_D         ; a = t^2, d=新 sum
          CALL  COPYC2B         ; TERMB = 新 term
          MOV   A, TERMP_L
          ADD   A, #2           ; n += 2
          MOV   TERMP_L, A
          JNC   LNx_LOOP
          INC   TERMP_H
          SJMP  LNx_LOOP
LNx_DONE:
          CALL  SHIFT_A_L       ; ln(x) = 2*sum
          RET

;---------------------------------------------------------------
; 寻找 a^(1/x)     
;   a^(1/x) = e^(ln(a)/x)
; 
; 输入: TERMA = a (底数),DIV_L = x
;
; 被覆盖的暂存器:TERMB, TERMC, TERMD
; 耗时:18 分 12 秒
;---------------------------------------------------------------
ROOT:
          ; 在 TERMA 中计算 ln(a)
          CALL   LN             ; TERMA = ln(a)
          CALL   COPYA2B
          MOV    R6, #0
          MOV    R7, DIV_L      ; x
          CALL   DIV16B         ; TERMB = ln(a)/x
          CALL   COPYB2A        ; TERMA = ln(a)/x
          CALL   eX             ; TERMA = e^(ln(a)/x)
          RET

;---------------------------------------------------------------
; 寻找 10^x
;  10^x = 10^(I+F) = 10^I * 10^F = 10^I * e^(F*ln(10))
; 
;  TERMB, TERMC, TERMD 被覆盖
;  耗时:5 分 28 秒
;
;  TERMB, TERMC, TERMD 被覆盖
;---------------------------------------------------------------
TENX:     ; 如果 x = 0,返回 1
          CALL   COPYA2B
          CALL   CHECK_ZERO
          JNB    ZEROFLAG, GET_I
          MOV    DPTR, #TERMA
          MOV    A, #1
          MOVX   @DPTR, A
          RET
          
          ; 将整数部分撷取到 ten_pwd
GET_I:    MOV     DPTR, #TERMA
          MOVX    A, @DPTR
          MOV     ten_pwd, A      
          MOV     A, #0
          MOVX    @DPTR, A       ; 清除整数部分,只留下小数部分 F (0 <= F < 1)
         
          ; --- 小数部分 * ln(10) --- 
          MOV     DPTR, #ln_10    
          CALL    x_CONST       
          CALL    COPYC2A        ; a = x
        
          CALL    eX             ; e^(F*ln(10)) 最大 e^2.302585
          ; 尾数部分储存在 a
          ; 指数部分储存在 ten_pwd,输出 10^ten_pwd
          ; 结果 = a*10^pwd
          RET

;---------------------------------------------------------------
; 使用泰勒级数寻找 e^x  (1 <= x < 2)
;  TERMA = e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ... 
; 对于 x > 2
;  e^x = e^(2^k*r) = (e^r)^(2^k)  (其中 r = x/(2^k) 且 1 <= r < 2)
;  a^x = e^(x*ln(a))
; 
;  TERMB, TERMC, TERMD 被覆盖,TERMD = x
;  耗时:5 分 13 秒 (e^1)
;---------------------------------------------------------------
eX:       MOV    DPTR, #TERMA   ; 检查 x
          MOVX   A, @DPTR
          CLR    C
          SUBB   A, #5          ; x < 5?
          JC     eX_s           ; 是,呼叫小 x 的 e^x
          ; e^x > 148, x >= 5,结果为 m*10^ten_pwd 格式
          ; e^x = 10^(x*log(e))
          MOV    DPTR, #log_e   ; log(e) 常数地址
          CALL   x_CONST
          CALL   COPYC2A
          CALL   TENX           ; 尾数部分在 a,指数部分在 ten_pwd
          RET
          
eX_s:     ; x < 5.545177
          MOV    pwd, #0        ; 清除缩放计数器
ex_Scale_Loop:  
          MOV    DPTR,#TERMA
          MOVX   A, @DPTR       ; 取得 x 的整数部分
          ; 如果 x < 2,跳过
          CLR    C
          SUBB   A, #2          
          JC     eX_0           ; 如果 x < 2,C=1
          ; 否则,将 x 除以 2
          CALL   SHIFT_A_R      ; 向右位移 1 位元
          INC    pwd
          SJMP   ex_Scale_Loop
eX_0:     ; 现在 0 <= x < 2
          CALL   eX_1           ; e^x
eX_Square_Loop:
          ; 如果 pwd = 0,离开
          MOV    A, pwd
          JZ     eX_DONE
          ; 将目前结果平方
          CALL   SQUARE         ; (e^x)^2
          CALL   COPYC2A
          DEC    pwd
          SJMP   eX_Square_Loop

eX_1:     ; 0 <= x < 2
          CALL   COPYA2B
          CALL   CHECK_ZERO
          JNB    ZEROFLAG, eX_2
          
          ; 如果 x = 0,返回 1
          MOV    DPTR, #TERMA
          MOV    A, #1
          MOVX   @DPTR, A
          RET
          
eX_2:     CALL   COPYA2D        ; d = x (乘数)
          CALL   COPYA2B        ; b = x (term)
          ; 初始化 sum = 1 + x
          MOV    DPTR, #TERMA
          MOVX   A, @DPTR
          INC    A
          MOVX   @DPTR, A       ; a = 1 + x = sum 
          CALL   SWAPA_D        ; a = x, d = sum 
          MOV    TERMP_H, #0
          MOV    TERMP_L, #2    ; n 从 2 开始
eX_LOOP:
          CALL   MULTIPLY       ; c = x * term (下一个幂次项)
          CALL   COPYC2B    
          MOV    R6, TERMP_H
          MOV    R7, TERMP_L
          CALL   DIV16B         ; b = x * term / n --> 新 term
          CALL   SWAPA_D        ; a = sum, d = x
          CALL   CHECK_ZERO
          JB     ZEROFLAG, eX_DONE
          CALL   ADD8           ; sum = sum + term
          CALL   SWAPA_D        ; a = x, d = sum

          MOV    A, TERMP_L
          ADD    A, #1          ; n++
          MOV    TERMP_L, A
          JNC    eX_LOOP
          INC    TERMP_H
          SJMP   eX_LOOP
eX_DONE:
          RET
          
;==========================================================
; 将二进位 TERMA 转换为十进位
; 并透过串口传送到 PC
;
; 使用的暂存器:A, B, R2(DP counter_H), R3(DP counter_L), R4 (Counter_H), R5 (Counter_L), 
;                 R6 (MSB 进位), DPTR
; TERMA 被覆盖
;==========================================================
OUT_A:    
          MOV   DPTR, #TERMA    ; TERMA 中的整数部分 (即 3)
          MOVX  A, @DPTR
          CALL  BIN2ASC         ; 二进位转 ASCII (8-bit)
          MOV   A, #'.'         ; 列印小数点
          CALL  SEND
          MOV   WR2, #DP        ; 要列印的位数 = DP*2
          MOV   A, R3
          JZ    CONV2
          INC   R2
CONV2:    CALL  MULT100         ; 小数 x 100,列印 2 个 BCD 位数
          DJNZ  R3, CONV2
          DJNZ  R2, CONV2
          RET
;----------------------------------------------------------
;  将 TERMA 中的二进位小数乘以 100 以取得接下来的 2 个十进位位数
;       2F,30,31 ...73   = 被乘数
;  x               100   = 乘数
; -------------------------
;   R4  2F,30,31 ...73   = 乘积
;
;  使用的暂存器:A, B, R4 (Counter_H), R5 (Counter_L), R6 (MSB 进位), DPTR
;  TERMA 被覆盖
;-----------------------------------------------------------
MULT100:
          MOV   DPTR, #TERMA+SIZE-1
          MOV   WR4, #SIZE-1    ; 要相乘的位元组数 
          MOV   A, R5
          JZ    MULT100_0
          INC   R4
MULT100_0:   
          MOV   R6, #0          ; 先清除进位
MULT100_1:
          MOV   B, #100
          MOVX  A, @DPTR
          MUL   AB              ; BA = A * 100
          ADD   A, R6           ; 加上先前的进位
          JNC   MULT100_2
          INC   B
MULT100_2:
          MOV   R6, B           ; 进位至 R4
          MOVX  @DPTR, A        ; 放回
          DEC_DPTR
          DJNZ  R5, MULT100_1
          DJNZ  R4, MULT100_1
          MOV   A, R6           ; MSB 至 A 以供输出
          CALL  BCD_PRINT       ; 2 个 BCD 位数传送到串口
          RET

;---------------------------------------------------------------
;  输入: ACC 8-bit 二进位
;  输出: 3 位数 BCD 至串口
;---------------------------------------------------------------
BIN2ASC:
          MOV   Dval,#0         ; 高位元组 = 0
          MOV   Dval+1,A        ; 低位元组 
          CLR   A               ; A=0,无前导零
          JMP   BINASC8         

;---------------------------------------------------------------
;  输入: Dval (高位元组), Dval+1 (低位元组)
;  输出: 5 位数 BCD 至串口
;
; 使用的暂存器:A, R1, R6, DPTR
;---------------------------------------------------------------
BINASC:
        ;Dval 包含要以十进位列印的值
        ;Acc, R1, R6, 与 DPTR 被覆盖
        ;
              ;MOV   Dval,@R1       ; 高位元组,放入 Dval
              ;INC   R1                
              ;MOV   Dval+1,@R1     ; 低位元组,放入 Dval+1
              CLR   A               ; A=0,无前导零
              MOV   DPTR,#10000     ; 减去 10000
              ACALL RSUB            ; 执行减法
              MOV   DPTR,#1000      ; 现在 1000
              ACALL RSUB
BINASC8:
              MOV   DPTR,#100       ; 现在 100
              ACALL RSUB
              MOV   DPTR,#10        ; 现在 10
              ACALL RSUB
              MOV   DPTR,#1         ; 现在 1
              ACALL RSUB
              JZ    RSUB2           ; 跳过 RET
                                
RSUB_R:   RET
                                
RSUB:     MOV   R6,#-1              ; 设定计数器
                                
RSUB1:    INC   R6                  ; 递增计数器
              XCH   A,Dval          ; 执行快速比较
              CJNE  A,DPH,$+3       ; 仅比较高位元组
              XCH   A,Dval
              JC    FAST_DONE       ; C=1, Dval < DPTR,完成
              XCH   A,Dval+1        ; 取得低位元组
              SUBB  A,DPL           ; 相减,清除借位
              XCH   A,Dval+1        ; 放回
              XCH   A,Dval          ; 取得高位元组
              SUBB  A,DPH           ; 从高位元组减去
              XCH   A,Dval          ; 放回
              JNC   RSUB1           ; 重复直到借位
                               
              XCH   A,Dval+1
              ADD   A,DPL           ; 还原 Dval
              XCH   A,Dval+1
              XCH   A,Dval
              ADDC  A,DPH
              XCH   A,Dval
                                
FAST_DONE:
                                
              ORL   A,R6            ; 对计数值进行 OR 运算
              JZ    RSUB_R          ; 如果为零则返回
                                
RSUB2:        MOV   A,#'0'          ; 取得 ASCII 偏移值
              ADD   A,R6            ; 加上计数
                                   
              JMP   SEND            ; 列印并离开

;===================================================
;  列印储存在 A 中的 BCD 位数
;  输入: A = 十六进位 (最大 99=0x63)
;  输出: 2 个 BCD 位数至串口
; ==================================================
BCD_PRINT:
         MOV  B,#10         
         DIV  AB                    ; A = A / 10; B = A % 10
         ANL  A,#0FH                ; 列印十位数
         ADD  A,#30H
         CALL  SEND
         MOV  A, B                  ; 个位数
         ANL  A,#0FH                ; 列印个位数
         ADD  A,#30H
         CALL  SEND
         RET

;---------------------------------------------------------------
;  输入: A = 十六进位(4-bit,仅低半位元组)
;  输出: B = ASC 
; 
;  使用的暂存器:A, B
;---------------------------------------------------------------
HEX2ASC:
          ANL   A,#0FH              ; 仅保留低半位元组
          CLR   C
          SUBB  A,#10               ; -10
          JC    DIGIT               ; 有借位,是个数字
          ADD   A,#'A'              ; 0xA - 10 + 'A'
          JMP   HEX2ASC2
DIGIT:    ADD   A,#10+'0'           ; 0x0-10+10+'0'
HEX2ASC2:
          MOV   B, A
          RET

;===================================================
;  列印储存在 A 中的 HEX 位数
;  输入: A = HEX (2 位数)
; ==================================================
HEX_PRINT:
          PUSH  ACC                 ; 保留低半位元组
          SWAP  A                   ; 列印高半位元组
          CALL  HEX2ASC             ; 将 A 中的 hex 转换为 B 中的 ASC
          MOV   A, B
          CALL  SEND
          POP   ACC                 ; 还原低半位元组
          CALL  HEX2ASC
          MOV   A, B
          JMP   SEND

;------------------------------------------------------
;  以 HEX 格式列印 TERMA(每行 10 个 HEX)
;------------------------------------------------------
OUT_HEXA:
         MOV   DPTR, #TERMA         ; 指向 TERMA

         MOV   WR4, #SIZE           ; 要列印的总位元组数
         MOV   A, R5
         JZ    OUT_HEXA1
         INC   R4
OUT_HEXA1:
         CALL  NEW_LINE
         MOV   R7, #1               ; 第一行是整数部分
PRT_LOOP2:
         MOV   A, #'0'              ; hex 前缀
         CALL  SEND
         MOV   A, #'x'
         CALL  SEND
         MOVX  A, @DPTR             ; 从表格取得目前位元组
         CALL  HEX_PRINT            ; 列印 hex 位数 (例如:B7)
         ; 列印前,检查 R7 是否为零
         DEC   R7
         MOV   A, R7
         JNZ   PRT_LOOP3
         CALL  NEW_LINE
         SJMP  PRT_LOOP4        
PRT_LOOP3:
         MOV   A, #','              ; 分隔符号 ,
         CALL  SEND
         MOV   A, #' '              ; 空格
         CALL  SEND
PRT_LOOP4:
         INC   DPTR                 ; 移动至下一个位元组
         DJNZ  R5, PRT_LOOP2
         DJNZ  R4, PRT_LOOP2
         CALL  CRLF
         RET

NEW_LINE:
         ; 新行与前缀产生 
         CALL  CRLF                 ; 跳行
         MOV   R7, #10              ; 重设下一行 10 个项目的行计数器
         MOV   A, #' '              ; 4 个空格
         CALL  SEND
         CALL  SEND
         CALL  SEND
         CALL  SEND
         MOV   A, #'D'              ; 列印 "DB" 关键字
         CALL  SEND
         MOV   A, #'B'
         CALL  SEND
         MOV   A, #' '              ; 空格
         CALL  SEND
         RET         
CRLF:   
         ; 列印 CRLF (新行)
         MOV   A, #13               ; CR
         CALL  SEND
         MOV   A, #10               ; LF
         CALL  SEND
         RET
         
;------------------------------------------------
;  字串讯息
;------------------------------------------------    
DIV0:    DB    "Divided by 0, denominator must > 0", 13, 10, 0
LN0:     DB    "ln(x) error,  x must >= 1", 13, 10, 0
;-----------------------------------------------------
;  常数 (6572 dp)
;  
;  可用的常数:
;  e, pi, ln_2, ln_10, log_e, sqrt_2
;----------------------------------------------------- 
e:  DB 2
    DB 0xB7, 0xE1, 0x51, 0x62, 0x8A, 0xED, 0x2A, 0x6A, 0xBF, 0x71
    DB 0x58, 0x80, 0x9C, 0xF4, 0xF3, 0xC7, 0x62, 0xE7, 0x16, 0x0F
    DB 0x38, 0xB4, 0xDA, 0x56, 0xA7, 0x84, 0xD9, 0x04, 0x51, 0x90
    DB 0xCF, 0xEF, 0x32, 0x4E, 0x77, 0x38, 0x92, 0x6C, 0xFB, 0xE5
    DB 0xF4, 0xBF, 0x8D, 0x8D, 0x8C, 0x31, 0xD7, 0x63, 0xDA, 0x06
    DB 0xC8, 0x0A, 0xBB, 0x11, 0x85, 0xEB, 0x4F, 0x7C, 0x7B, 0x57
    DB 0x57, 0xF5, 0x95, 0x84, 0x90, 0xCF, 0xD4, 0x7D, 0x7C, 0x19
    DB 0xBB, 0x42, 0x15, 0x8D, 0x95, 0x54, 0xF7, 0xB4, 0x6B, 0xCE
    DB 0xD5, 0x5C, 0x4D, 0x79, 0xFD, 0x5F, 0x24, 0xD6, 0x61, 0x3C
    DB 0x31, 0xC3, 0x83, 0x9A, 0x2D, 0xDF, 0x8A, 0x9A, 0x27, 0x6B
    DB 0xCF, 0xBF, 0xA1, 0xC8, 0x77, 0xC5, 0x62, 0x84, 0xDA, 0xB7
    DB 0x9C, 0xD4, 0xC2, 0xB3, 0x29, 0x3D, 0x20, 0xE9, 0xE5, 0xEA
    DB 0xF0, 0x2A, 0xC6, 0x0A, 0xCC, 0x93, 0xED, 0x87, 0x44, 0x22
    DB 0xA5, 0x2E, 0xCB, 0x23, 0x8F, 0xEE, 0xE5, 0xAB, 0x6A, 0xDD
    DB 0x83, 0x5F, 0xD1, 0xA0, 0x75, 0x3D, 0x0A, 0x8F, 0x78, 0xE5
    DB 0x37, 0xD2, 0xB9, 0x5B, 0xB7, 0x9D, 0x8D, 0xCA, 0xEC, 0x64
    DB 0x2C, 0x1E, 0x9F, 0x23, 0xB8, 0x29, 0xB5, 0xC2, 0x78, 0x0B
    DB 0xF3, 0x87, 0x37, 0xDF, 0x8B, 0xB3, 0x00, 0xD0, 0x13, 0x34
    DB 0xA0, 0xD0, 0xBD, 0x86, 0x45, 0xCB, 0xFA, 0x73, 0xA6, 0x16
    DB 0x0F, 0xFE, 0x39, 0x3C, 0x48, 0xCB, 0xBB, 0xCA, 0x06, 0x0F
    DB 0x0F, 0xF8, 0xEC, 0x6D, 0x31, 0xBE, 0xB5, 0xCC, 0xEE, 0xD7
    DB 0xF2, 0xF0, 0xBB, 0x08, 0x80, 0x17, 0x16, 0x3B, 0xC6, 0x0D
    DB 0xF4, 0x5A, 0x0E, 0xCB, 0x1B, 0xCD, 0x28, 0x9B, 0x06, 0xCB
    DB 0xBF, 0xEA, 0x21, 0xAD, 0x08, 0xE1, 0x84, 0x7F, 0x3F, 0x73
    DB 0x78, 0xD5, 0x6C, 0xED, 0x94, 0x64, 0x0D, 0x6E, 0xF0, 0xD3
    DB 0xD3, 0x7B, 0xE6, 0x70, 0x08, 0xE1, 0x86, 0xD1, 0xBF, 0x27
    DB 0x5B, 0x9B, 0x24, 0x1D, 0xEB, 0x64, 0x74, 0x9A, 0x47, 0xDF
    DB 0xDF, 0xB9, 0x66, 0x32, 0xC3, 0xEB, 0x06, 0x1B, 0x64, 0x72
    DB 0xBB, 0xF8, 0x4C, 0x26, 0x14, 0x4E, 0x49, 0xC2, 0xD0, 0x4C
    DB 0x32, 0x4E, 0xF1, 0x0D, 0xE5, 0x13, 0xD3, 0xF5, 0x11, 0x4B
    DB 0x8B, 0x5D, 0x37, 0x4D, 0x93, 0xCB, 0x88, 0x79, 0xC7, 0xD5
    DB 0x2F, 0xFD, 0x72, 0xBA, 0x0A, 0xAE, 0x72, 0x77, 0xDA, 0x7B
    DB 0xA1, 0xB4, 0xAF, 0x14, 0x88, 0xD8, 0xE8, 0x36, 0xAF, 0x14
    DB 0x86, 0x5E, 0x6C, 0x37, 0xAB, 0x68, 0x76, 0xFE, 0x69, 0x0B
    DB 0x57, 0x11, 0x21, 0x38, 0x2A, 0xF3, 0x41, 0xAF, 0xE9, 0x4F
    DB 0x77, 0xBC, 0xF0, 0x6C, 0x83, 0xB8, 0xFF, 0x56, 0x75, 0xF0
    DB 0x97, 0x90, 0x74, 0xAD, 0x9A, 0x78, 0x7B, 0xC5, 0xB9, 0xBD
    DB 0x4B, 0x0C, 0x59, 0x37, 0xD3, 0xED, 0xE4, 0xC3, 0xA7, 0x93
    DB 0x96, 0x21, 0x5E, 0xDA, 0xB1, 0xF5, 0x7D, 0x0B, 0x5A, 0x7D
    DB 0xB4, 0x61, 0xDD, 0x8F, 0x3C, 0x75, 0x54, 0x0D, 0x00, 0x12
    DB 0x1F, 0xD5, 0x6E, 0x95, 0xF8, 0xC7, 0x31, 0xE9, 0xC4, 0xD7
    DB 0x22, 0x1B, 0xBE, 0xD0, 0xC6, 0x2B, 0xB5, 0xA8, 0x78, 0x04
    DB 0xB6, 0x79, 0xA0, 0xCA, 0xA4, 0x1D, 0x80, 0x2A, 0x46, 0x04
    DB 0xC3, 0x11, 0xB7, 0x1D, 0xE3, 0xE5, 0xC6, 0xB4, 0x00, 0xE0
    DB 0x24, 0xA6, 0x66, 0x8C, 0xCF, 0x2E, 0x2D, 0xE8, 0x68, 0x76
    DB 0xE4, 0xF5, 0xC5, 0x00, 0x00, 0xF0, 0xA9, 0x3B, 0x3A, 0xA7
    DB 0xE6, 0x34, 0x2B, 0x30, 0x2A, 0x0A, 0x47, 0x37, 0x3B, 0x25
    DB 0xF7, 0x3E, 0x3B, 0x26, 0xD5, 0x69, 0xFE, 0x22, 0x91, 0xAD
    DB 0x36, 0xD6, 0xA1, 0x47, 0xD1, 0x06, 0x0B, 0x87, 0x1A, 0x28
    DB 0x01, 0xF9, 0x78, 0x37, 0x64, 0x08, 0x2F, 0xF5, 0x92, 0xD9
    DB 0x14, 0x0D, 0xB1, 0xE9, 0x39, 0x9D, 0xF4, 0xB0, 0xE1, 0x4C
    DB 0xA8, 0xE8, 0x8E, 0xE9, 0x11, 0x0B, 0x2B, 0xD4, 0xFA, 0x98
    DB 0xEE, 0xD1, 0x50, 0xCA, 0x6D, 0xD8, 0x93, 0x22, 0x45, 0xEF
    DB 0x75, 0x92, 0xC7, 0x03, 0xF5, 0x32, 0xCE, 0x3A, 0x30, 0xCD
    DB 0x31, 0xC0, 0x70, 0xEB, 0x36, 0xB4, 0x19, 0x5F, 0xF3, 0x3F
    DB 0xB1, 0xC6, 0x6C, 0x7D, 0x70, 0xF9, 0x39, 0x18, 0x10, 0x7C
    DB 0xE2, 0x05, 0x1F, 0xED, 0x33, 0xF6, 0xD1, 0xDE, 0x94, 0x91
    DB 0xC7, 0xDE, 0xA6, 0xA5, 0xA4, 0x42, 0xE1, 0x54, 0xC8, 0xBB
    DB 0x6D, 0x8D, 0x03, 0x62, 0x80, 0x3B, 0xC2, 0x48, 0xD4, 0x14
    DB 0x47, 0x8C, 0x2A, 0xFB, 0x07, 0xFF, 0xE7, 0x8E, 0x89, 0xB9
    DB 0xFE, 0xCA, 0x7E, 0x30, 0x60, 0xC0, 0x8F, 0x0D, 0x61, 0xF8
    DB 0xE3, 0x68, 0x01, 0xDF, 0x66, 0xD1, 0xD8, 0xF9, 0x39, 0x2E
    DB 0x52, 0xCA, 0xEF, 0x06, 0x53, 0x19, 0x94, 0x79, 0xDF, 0x2B
    DB 0xE6, 0x4B, 0xBA, 0xAB, 0x00, 0x8C, 0xA8, 0xA0, 0x6F, 0xDA
    DB 0xCE, 0x9C, 0xE7, 0x04, 0x89, 0x84, 0x5A, 0x08, 0x2B, 0xA3
    DB 0x6D, 0x61, 0x1E, 0x99, 0xF2, 0xFB, 0xE7, 0x24, 0x24, 0x6D
    DB 0x18, 0xB5, 0x4E, 0x33, 0x5C, 0xAC, 0x0D, 0xD1, 0xAB, 0x9D
    DB 0xFD, 0x79, 0x88, 0xA4, 0xB0, 0xC4, 0x55, 0x8A, 0xA1, 0x19
    DB 0x41, 0x77, 0x20, 0xB6, 0xE1, 0x50, 0xCE, 0x2B, 0x92, 0x7D
    DB 0x48, 0xD7, 0x25, 0x6E, 0x44, 0x5E, 0x33, 0x3C, 0xB7, 0x57
    DB 0x2B, 0x3B, 0xD0, 0x0F, 0xB2, 0x74, 0x60, 0x43, 0x18, 0x9C
    DB 0xAC, 0x11, 0x6C, 0xED, 0xC7, 0xE7, 0x71, 0xAE, 0x03, 0x58
    DB 0xFF, 0x75, 0x2A, 0x3A, 0x6B, 0x6C, 0x79, 0xA5, 0x8A, 0x9A
    DB 0x54, 0x9B, 0x50, 0xC5, 0x87, 0x06, 0x90, 0x75, 0x5C, 0x35
    DB 0xE4, 0xE3, 0x6B, 0x52, 0x90, 0x38, 0xCA, 0x73, 0x3F, 0xD1
    DB 0xAA, 0xA8, 0xDA, 0xB4, 0x01, 0x33, 0xD8, 0x03, 0x20, 0xE0
    DB 0x79, 0x09, 0x68, 0xC7, 0x65, 0x46, 0xB9, 0x93, 0xF6, 0xC8
    DB 0xFF, 0x3B, 0x25, 0x42, 0x75, 0x0D, 0xA1, 0xFF, 0xAD, 0xA7
    DB 0xB7, 0x47, 0x31, 0x78, 0x2E, 0x33, 0x0E, 0xF7, 0xD9, 0x2C
    DB 0x43, 0xBE, 0x1A, 0xD8, 0xC5, 0x0A, 0x8E, 0xAE, 0x20, 0xA5
    DB 0x55, 0x6C, 0xBD, 0xD1, 0xF2, 0x4C, 0x99, 0x97, 0x2C, 0xB0
    DB 0x3C, 0x73, 0x00, 0x6F, 0x5C, 0x08, 0xA4, 0xE2, 0x20, 0xE7
    DB 0x4A, 0xBC, 0x17, 0x91, 0x51, 0x41, 0x2B, 0x1E, 0x2D, 0xD6
    DB 0x0A, 0x08, 0xA1, 0x1B, 0x02, 0xE8, 0xD7, 0x0D, 0x7D, 0x71
    DB 0x64, 0x58, 0x33, 0x01, 0x1B, 0xF6, 0x09, 0x45, 0x50, 0x7F
    DB 0x1A, 0x32, 0x72, 0x1A, 0xC0, 0x8A, 0xED, 0xC2, 0x66, 0x1D
    DB 0xA9, 0x18, 0x39, 0xD1, 0x46, 0xA2, 0xA4, 0xC4, 0x25, 0xC0
    DB 0xFF, 0xB8, 0x70, 0x85, 0xF9, 0xB0, 0xE0, 0x9B, 0x94, 0xB1
    DB 0x46, 0xA9, 0xA4, 0x78, 0x39, 0x08, 0xF3, 0xF2, 0x67, 0xA7
    DB 0x8C, 0x59, 0x43, 0x04, 0x85, 0xED, 0x89, 0x20, 0x5B, 0x36
    DB 0xB6, 0x6A, 0x57, 0xE7, 0x56, 0xE0, 0x06, 0x52, 0x23, 0x67
    DB 0x02, 0x82, 0x87, 0xF8, 0xC1, 0xD6, 0x95, 0xDF, 0x88, 0xC6
    DB 0x0F, 0xE0, 0x75, 0x28, 0xFC, 0xBE, 0x91, 0x5C, 0x7B, 0xF2
    DB 0x33, 0x82, 0xEA, 0x29, 0x3F, 0xA2, 0xDA, 0x15, 0x77, 0xF9
    DB 0xCA, 0xC2, 0x99, 0xBB, 0x7B, 0x4B, 0xEE, 0xAF, 0xEF, 0x96
    DB 0x28, 0xC3, 0xEB, 0xEA, 0xF8, 0x71, 0x75, 0xC6, 0xA1, 0xF8
    DB 0xBD, 0xD0, 0x7B, 0xE3, 0x07, 0xFA, 0x1B, 0xFA, 0x9A, 0xEF
    DB 0xF7, 0x94, 0xC1, 0x9D, 0xFC, 0x36, 0x5F, 0x44, 0x75, 0x27
    DB 0xDE, 0xA1, 0x10, 0xF4, 0x20, 0x8B, 0x94, 0x1A, 0xA7, 0xD1
    DB 0x85, 0x38, 0x04, 0x78, 0xAA, 0x52, 0x0E, 0x3F, 0xE2, 0x33
    DB 0x5A, 0x32, 0x2E, 0xDF, 0x14, 0x7B, 0xBD, 0xB5, 0x27, 0xAA
    DB 0x2A, 0xD3, 0xCB, 0x0F, 0x7D, 0x6E, 0xD3, 0x81, 0xCD, 0x6A
    DB 0xC3, 0x5A, 0x1D, 0x24, 0xBF, 0x89, 0xB7, 0x50, 0x19, 0x60
    DB 0x5A, 0xEE, 0x9D, 0xFA, 0xBA, 0x5C, 0xFC, 0xED, 0x03, 0x3B
    DB 0xA2, 0x10, 0x2A, 0x0B, 0xDB, 0xE3, 0xB4, 0x9D, 0x72, 0x72
    DB 0xF8, 0x9E, 0x09, 0xD0, 0x08, 0xE5, 0xD5, 0xBD, 0x99, 0x23
    DB 0x93, 0x62, 0x86, 0x1E, 0xB4, 0x26, 0x29, 0x7C, 0x58, 0x41
    DB 0x39, 0x75, 0x15, 0x47, 0x3C, 0xF2, 0xA3, 0xD6, 0xDE, 0x58
    DB 0xC4, 0xBB, 0x1B, 0x91, 0xAD, 0x97, 0xAB, 0xF0, 0x28, 0xE9
    DB 0x66, 0x5D, 0xA4, 0xEC, 0xE8, 0x0D, 0xDC, 0x13, 0xE0, 0xDF
    DB 0x43, 0x22, 0xED, 0xA0, 0xFD, 0x38, 0x9B, 0x17, 0x5E, 0x8D
    DB 0x10, 0xD0, 0x8C, 0x52, 0x30, 0xA6, 0xB5, 0x76, 0xC9, 0x4F
    DB 0xC5, 0x2B, 0x4E, 0x74, 0xB2, 0xE3, 0x42, 0x0E, 0x90, 0x2C
    DB 0x82, 0xEE, 0x7A, 0xEB, 0x80, 0x5C, 0x2E, 0xB7, 0x65, 0x17
    DB 0xEA, 0xBF, 0xFB, 0x87, 0x77, 0x37, 0x8C, 0x38, 0x06, 0xC9
    DB 0x1D, 0x07, 0xF1, 0x09, 0xD6, 0x75, 0x27, 0xC1, 0x85, 0x68
    DB 0x34, 0x48, 0x15, 0x4D, 0x69, 0x21, 0x61, 0x07, 0x55, 0xBE
    DB 0xF3, 0x0B, 0x80, 0x27, 0xE5, 0xE8, 0xB0, 0x4E, 0x59, 0x2E
    DB 0x8B, 0x2E, 0xA3, 0x54, 0xA2, 0x61, 0xEA, 0xBB, 0x48, 0x51
    DB 0x64, 0x72, 0xD4, 0x69, 0xA6, 0x68, 0x24, 0xF2, 0x4D, 0x44
    DB 0xB1, 0x5C, 0xE1, 0x42, 0xFC, 0xB6, 0x53, 0x07, 0xF2, 0x1C
    DB 0xDA, 0xBB, 0xD6, 0x85, 0x8C, 0xC7, 0xAE, 0x3C, 0xEE, 0x06
    DB 0xAE, 0x64, 0xBE, 0xD9, 0x1A, 0x04, 0x12, 0xE6, 0xF3, 0x3B
    DB 0xA0, 0x4F, 0xAB, 0x57, 0xB8, 0xE5, 0x21, 0x65, 0xCA, 0x81
    DB 0xD0, 0xC7, 0xD1, 0x18, 0x38, 0x5D, 0x6D, 0x23, 0x0A, 0x47
    DB 0xE1, 0xE8, 0xB5, 0x3A, 0xF0, 0xD9, 0xA7, 0xAA, 0xC2, 0x52
    DB 0x7B, 0x46, 0xC4, 0x02, 0x78, 0x41, 0xAA, 0x38, 0x5A, 0x40
    DB 0xC6, 0xC5, 0x17, 0xAF, 0x8E, 0xD2, 0x68, 0xF4, 0x69, 0x99
    DB 0x0D, 0x6D, 0xAE, 0x2B, 0x68, 0xF6, 0x2F, 0xDD, 0xB6, 0xF3
    DB 0x03, 0xA7, 0x59, 0x8B, 0xE8, 0xD5, 0xB7, 0x1A, 0x3A, 0x80
    DB 0x37, 0x12, 0xC7, 0xE6, 0xBB, 0x1B, 0xCB, 0xC0, 0xC8, 0x7B
    DB 0xEA, 0x5A, 0x8E, 0xE3, 0xE8, 0xE1, 0xE8, 0xE6, 0xEB, 0xA9
    DB 0x9C, 0x04, 0x7D, 0xB5, 0xF6, 0xE1, 0x37, 0x27, 0x96, 0xDC
    DB 0x26, 0x34, 0xE5, 0x65, 0x52, 0xD8, 0x0C, 0x5F, 0xBA, 0xF8
    DB 0x26, 0xA9, 0xC3, 0xDC, 0x2C, 0x19, 0xE9, 0x96, 0x9E, 0x27
    DB 0x65, 0xBF, 0x88, 0x1E, 0xEA, 0x8B, 0xF6, 0x70, 0x50, 0x1F
    DB 0x6A, 0x39, 0xCC, 0x95, 0xE5, 0x35, 0x91, 0x17, 0xF9, 0xFE
    DB 0xC0, 0xAD, 0xFB, 0x7B, 0x95, 0x95, 0x29, 0xBD, 0x2C, 0x7B
    DB 0xE5, 0xDB, 0x65, 0x70, 0x7C, 0x4C, 0xA4, 0xDE, 0x86, 0x90
    DB 0x92, 0xF0, 0x02, 0x9D, 0x9E, 0x35, 0x24, 0x6F, 0x49, 0x53
    DB 0xA7, 0xE0, 0x75, 0xE5, 0x18, 0x08, 0x68, 0xFA, 0x5B, 0xD6
    DB 0x0A, 0x32, 0x8B, 0x3F, 0xEA, 0x53, 0x08, 0x4D, 0x17, 0x4C
    DB 0x9D, 0xE8, 0xC8, 0xF6, 0xA1, 0x97, 0xD6, 0x63, 0x59, 0xB6
    DB 0x9A, 0x22, 0x92, 0xD2, 0x5F, 0x12, 0xF1, 0xB3, 0x22, 0x39
    DB 0x2B, 0x10, 0x35, 0xA8, 0x15, 0x8A, 0x10, 0xF9, 0x56, 0x0F
    DB 0xF1, 0x92, 0x7E, 0x26, 0x9B, 0xF2, 0xA6, 0xE1, 0x64, 0x4A
    DB 0x56, 0x43, 0xCA, 0x70, 0xB2, 0xF6, 0x61, 0xE2, 0xA3, 0xCA
    DB 0x13, 0x4E, 0x51, 0x5E, 0x81, 0xC6, 0x2D, 0x12, 0x9B, 0xA3
    DB 0xB6, 0xD6, 0x6C, 0xE3, 0xBA, 0xD9, 0x54, 0x36, 0xC1, 0x5F
    DB 0xCE, 0x6E, 0xCC, 0xD5, 0x2A, 0xAD, 0x27, 0x10, 0x47, 0xDE
    DB 0xF5, 0x5B, 0x08, 0x43, 0x35, 0x49, 0x1F, 0x86, 0x59, 0x90
    DB 0xC4, 0x71, 0x66, 0x61, 0x1A, 0xED, 0xDC, 0xDC, 0x4B, 0x80
    DB 0x7A, 0x11, 0xBE, 0x08, 0x4D, 0x85, 0xB0, 0xEF, 0xA8, 0x0B
    DB 0xD3, 0x1F, 0x0A, 0x02, 0x1E, 0x45, 0x80, 0x25, 0x82, 0xD1
    DB 0xF6, 0x05, 0xB1, 0xAE, 0x3E, 0x32, 0x74, 0xAE, 0x42, 0x53
    DB 0x5D, 0xA2, 0x74, 0xF7, 0xFE, 0xD7, 0xC5, 0xA3, 0x86, 0x9C
    DB 0xCD, 0xBC, 0xA5, 0x8C, 0x54, 0xDD, 0x24, 0x98, 0x6A, 0x59
    DB 0x3F, 0x18, 0xBB, 0x8C, 0x42, 0x29, 0x1E, 0x79, 0x64, 0xC9
    DB 0x93, 0xD1, 0x4C, 0xBA, 0xC3, 0x63, 0xA8, 0x01, 0xA2, 0x04
    DB 0x8D, 0x4E, 0x3C, 0x6F, 0x8E, 0xCF, 0xA7, 0x5F, 0xCC, 0xD0
    DB 0x09, 0xA6, 0x49, 0xAF, 0x5E, 0xC2, 0x0C, 0x4D, 0x7E, 0xD7
    DB 0x84, 0x37, 0xB4, 0x6B, 0x6A, 0xAF, 0x5B, 0x9D, 0xB4, 0xAD
    DB 0xF4, 0x02, 0xCF, 0x64, 0x05, 0x30, 0x11, 0x8E, 0x98, 0x52
    DB 0xBE, 0x42, 0x03, 0xF2, 0x2C, 0xBB, 0x68, 0xDF, 0xF2, 0xBF
    DB 0x38, 0xA6, 0xEA, 0xE0, 0xB6, 0xD0, 0xE7, 0xBB, 0xFE, 0x4D
    DB 0xD3, 0x97, 0xD4, 0x24, 0x01, 0xF6, 0x14, 0x19, 0xB1, 0xF3
    DB 0x8C, 0x03, 0x8B, 0xD2, 0x4B, 0xAD, 0x2F, 0x30, 0x71, 0xC2
    DB 0xE1, 0x44, 0x72, 0x1F, 0xF7, 0x28, 0x66, 0x53, 0x0E, 0x1B
    DB 0xC7, 0xF6, 0xDC, 0x9F, 0x62, 0x17, 0xE2, 0x58, 0x5A, 0xC3
    DB 0xFF, 0x7C, 0x8F, 0xB1, 0xE8, 0x68, 0x23, 0x3D, 0x62, 0xDE
    DB 0x85, 0xE6, 0xDF, 0x73, 0xBF, 0xD1, 0xC8, 0x1E, 0x45, 0x66
    DB 0xCE, 0x96, 0x35, 0x95, 0x02, 0x2C, 0x3B, 0x91, 0x05, 0x64
    DB 0x2F, 0x07, 0x29, 0x43, 0x94, 0x41, 0xBC, 0xD9, 0x83, 0xEA
    DB 0x5F, 0x18, 0xE1, 0xBC, 0xCD, 0x4E, 0xCC, 0x56, 0xCA, 0xB4
    DB 0x39, 0x0D, 0xF6, 0x15, 0x5B, 0x21, 0xBD, 0x8A, 0xB7, 0xC7
    DB 0x2F, 0x00, 0x36, 0x21, 0xB4, 0xD1, 0x80, 0x37, 0xAC, 0xE4
    DB 0x46, 0xEC, 0x12, 0x0E, 0x52, 0x14, 0xD1, 0x86, 0x2E, 0xB0
    DB 0x5C, 0x6B, 0xB5, 0x7D, 0xED, 0x78, 0x9B, 0x1D, 0x98, 0x1A
    DB 0x31, 0xB9, 0x6A, 0x33, 0xB3, 0x52, 0x0E, 0x76, 0x64, 0x5D
    DB 0xCE, 0x6C, 0x54, 0x1E, 0x09, 0x95, 0xB7, 0xB1, 0x5A, 0xD8
    DB 0x00, 0x8C, 0x7D, 0x6B, 0x9C, 0x90, 0x95, 0xF0, 0x56, 0x3E
    DB 0xEF, 0xFB, 0x01, 0xDE, 0x6C, 0x4F, 0xFD, 0xA8, 0xDB, 0xD6
    DB 0x43, 0xFD, 0x03, 0xFF, 0x5C, 0x5C, 0x5D, 0x0A, 0xFB, 0x47
    DB 0xE3, 0x3B, 0x41, 0xCC, 0x9B, 0x01, 0x4D, 0xB5, 0x26, 0xCA
    DB 0xE4, 0xFD, 0x54, 0x15, 0xF5, 0x72, 0xC4, 0xE9, 0x18, 0x13
    DB 0x27, 0x4A, 0x4A, 0x85, 0x0E, 0x1F, 0x63, 0x34, 0x38, 0xC1
    DB 0x50, 0x65, 0xA3, 0x11, 0x4F, 0xED, 0xCD, 0xCF, 0x2B, 0x36
    DB 0x4E, 0x81, 0xC1, 0x58, 0xAD, 0x60, 0x18, 0xC2, 0x26, 0x16
    DB 0x52, 0x07, 0x7E, 0x20, 0xC4, 0xB1, 0x6A, 0x5E, 0x07, 0xAC
    DB 0x79, 0x12, 0x97, 0xDA, 0x1D, 0x7F, 0x22, 0xB9, 0x3B, 0x7B
    DB 0xBD, 0x5F, 0x04, 0xBC, 0x92, 0xA7, 0x58, 0x5D, 0xAD, 0x27
    DB 0x3C, 0x4C, 0xDE, 0x7B, 0xC7, 0xB6, 0x7B, 0x32, 0xA3, 0x82
    DB 0x0A, 0x79, 0xC7, 0x87, 0x5D, 0x14, 0x54, 0x5C, 0x6D, 0x11
    DB 0xF4, 0xB0, 0xB3, 0x46, 0xFA, 0xDE, 0x8E, 0xE9, 0xEC, 0xD0
    DB 0x9E, 0x8E, 0x0D, 0xE1, 0xBF, 0x70, 0x9E, 0x18, 0x4C, 0xA9
    DB 0x09, 0x37, 0x01, 0x88, 0x4F, 0x76, 0x7C, 0x72, 0x16, 0x7F
    DB 0xE9, 0x0F, 0xC7, 0x07, 0x84, 0x39, 0xC1, 0xBE, 0x57, 0x94
    DB 0xBB, 0xCC, 0x42, 0x4D, 0xBA, 0xAC, 0x1F, 0x4D, 0x03, 0xEC
    DB 0x1B, 0x37, 0xC7, 0xD1, 0x36, 0xC4, 0x9A, 0x76, 0xC0, 0x5A
    DB 0xEE, 0xED, 0x73, 0xBE, 0x47, 0xB0, 0x87, 0x0E, 0x5A, 0x51
    DB 0x11, 0x5D, 0x34, 0xC5, 0xDC, 0xB7, 0x4A, 0x81, 0x01, 0xDF
    DB 0x2B, 0x5A, 0xAF, 0xF9, 0x9E, 0x0F, 0x07, 0x3E, 0xBF, 0x63
    DB 0x1D, 0xA2, 0x9E, 0x5B, 0x1F, 0x74, 0x88, 0x57, 0xC1, 0xA7
    DB 0xC1, 0xFE, 0xAE, 0x62, 0x14, 0xF9, 0xEB, 0x79, 0x95, 0x20
    DB 0xE8, 0xF1, 0x40, 0xB6, 0xC4, 0x9C, 0x23, 0x10, 0x67, 0x41
    DB 0x27, 0xB6, 0x89, 0x1D, 0xE5, 0x4F, 0xD0, 0xE4, 0x5E, 0x69
    DB 0x41, 0x62, 0x58, 0x03, 0xD1, 0x26, 0xC3, 0x95, 0x0C, 0x0D
    DB 0xBF, 0x72, 0xB6, 0x29, 0xA9, 0xD2, 0xA6, 0xEE, 0xCF, 0x4C
    DB 0x04, 0xF4, 0xDE, 0xBA, 0xC8, 0x4F, 0xFB, 0x85, 0x3B, 0x81
    DB 0x80, 0x1B, 0x3D, 0x9D, 0xBD, 0x19, 0x1C, 0x00, 0x48, 0xF3
    DB 0xC1, 0x0C, 0x1B, 0x7C, 0x03, 0x5F, 0x79, 0xE4, 0xD6, 0x27
    DB 0x12, 0xA9, 0x99, 0xC5, 0xC6, 0xA6, 0xCF, 0x47, 0xD5, 0xC3
    DB 0x80, 0xBB, 0x1D, 0xF5, 0x24, 0xD9, 0xE7, 0x7F, 0xC7, 0xBB
    DB 0xDF, 0xEE, 0x3E, 0x3E, 0x77, 0xAB, 0x5E, 0x45, 0xF6, 0x32
    DB 0xC5, 0xFB, 0xA1, 0x3B, 0xD5, 0x7B, 0x3C, 0xC6, 0x70, 0xFD
    DB 0xFA, 0x0B, 0x0B, 0xF6, 0x4A, 0x96, 0x04, 0x92, 0xAE, 0xAA
    DB 0x14, 0xBB, 0x15, 0x7F, 0xD4, 0x89, 0x92, 0x36, 0x8C, 0x9F
    DB 0xD0, 0xA2, 0xEB, 0xF9, 0x44, 0xE0, 0xB3, 0x96, 0x14, 0xDC
    DB 0xBF, 0x45, 0x3A, 0xF9, 0x75, 0xCE, 0xB3, 0xDA, 0x50, 0x7C
    DB 0xBB, 0x40, 0x83, 0x08, 0x20, 0x75, 0xC9, 0x00, 0x67, 0x2E
    DB 0xF2, 0x14, 0xB0, 0x5C, 0x67, 0x47, 0x0E, 0x38, 0xFB, 0x31
    DB 0x76, 0xAE, 0x19, 0xA5, 0xC1, 0x5F, 0xBA, 0x6F, 0x38, 0x56
    DB 0x93, 0xAA, 0x04, 0x84, 0xD9, 0x73, 0x1E, 0x4D, 0x24, 0xB7
    DB 0x46, 0x06, 0x92, 0xC0, 0xE8, 0x41, 0x83, 0xA3, 0x47, 0x21
    DB 0xB1, 0x7C, 0x58, 0xF3, 0x81, 0x9C, 0xDF, 0xB1, 0xE0, 0x08
    DB 0xEA, 0xFC, 0xED, 0x5F, 0x9D, 0x53, 0xB7, 0x78, 0xDA, 0x71
    DB 0x61, 0x43, 0x8A, 0x5D, 0xD8, 0x4B, 0x36, 0x0F, 0x06, 0xF0
    DB 0xC1, 0x42, 0xA9, 0xD0, 0xAE, 0x7F, 0x15, 0x1A, 0x89, 0xDD
    DB 0x77, 0x06, 0x25, 0x18, 0x5F, 0x59, 0xC9, 0x37, 0x58, 0xD8
    DB 0x72, 0xA0, 0x3A, 0xD6, 0x96, 0xE0, 0x8D, 0x2F, 0xE3, 0x0D
    DB 0x01, 0x88, 0x61, 0xD1, 0xAC, 0x9C, 0xC8, 0xA6, 0x70, 0x99
    DB 0x73, 0x24, 0x90, 0x4B, 0xC8, 0x87, 0x32, 0x3B, 0xA9, 0x5C
    DB 0x8D, 0xD0, 0x4B, 0x9B, 0xE3, 0x12, 0x76, 0x9A, 0x31, 0xE7
    DB 0x1E, 0x98, 0x8A, 0x33, 0xBD, 0x1C, 0x8E, 0xF0, 0x24, 0xA3
    DB 0x98, 0x3E, 0x84, 0x5D, 0xEF, 0xCA, 0xF0, 0x03, 0xA6, 0x88
    DB 0x8D, 0xDE, 0x26, 0x23, 0x84, 0x5F, 0x58, 0x6B, 0xF4, 0xDC
    DB 0x88, 0xF4, 0x11, 0x75, 0x7E, 0x87, 0x28, 0x0C, 0x54, 0x1D
    DB 0x80, 0xD1, 0x00, 0xEB, 0x44, 0x6C, 0x36, 0xFB, 0xD4, 0xCA
    DB 0xA0, 0xDD, 0xEF, 0x68, 0xCA, 0xEE, 0xAB, 0xB3, 0x22, 0x86
    DB 0x58, 0x57, 0xD9, 0xDA, 0x5C, 0xD8, 0x80, 0xCC, 0xA4, 0x48
    DB 0x78, 0xA4, 0x2C, 0xB9, 0xE5, 0x1F, 0x19, 0xFD, 0x55, 0x0B
    DB 0xAA, 0x29, 0x66, 0x31, 0x01, 0xF2, 0x9D, 0x12, 0x44, 0xCB
    DB 0xFB, 0x6C, 0xC8, 0x01, 0xF3, 0xEF, 0x56, 0x6E, 0x43, 0xF8
    DB 0xC6, 0xB6, 0xFF, 0x5F, 0x64, 0xC3, 0xE9, 0x4C, 0x3B, 0x75
    DB 0x9F, 0x02, 0x51, 0x62, 0x5E, 0xF0, 0x6F, 0x8A, 0xFF, 0x00
    DB 0x48, 0x37, 0x7B, 0xCC, 0x63, 0x83, 0x2C, 0xF8, 0xCC, 0xEA
    DB 0x74, 0x15, 0x80, 0x90, 0x57, 0x3B, 0x88, 0x95, 0x49, 0x9C
    DB 0xB0, 0xA6, 0xD4, 0xCC, 0x68, 0x47, 0x5B, 0x71, 0x10, 0x74
    DB 0xA5, 0x5F, 0xD3, 0x62, 0x4A, 0x06, 0xB4, 0x3A, 0xAA, 0xDC
    DB 0xC4, 0xF3, 0x6A, 0xB4, 0x24, 0x2C, 0xCD, 0xEF, 0x36, 0xFE
    DB 0x47, 0xCC, 0x56, 0x82, 0x4E, 0x9C, 0xB2, 0x83, 0x1E, 0xE1
    DB 0xE3, 0xC9, 0x63, 0x8B, 0x8D, 0xFF, 0xB3, 0x7A, 0x0F, 0xD2
    DB 0x98, 0x4D, 0x2E, 0x2C, 0x33, 0xD3, 0x78, 0xA9, 0x9C, 0x0F
    DB 0xD0, 0xFB, 0xF3, 0xB6, 0x44, 0x31, 0xAD, 0xD5, 0x55, 0xBE
    DB 0x6E, 0x29, 0x1F, 0x9B, 0xF7, 0x53, 0xA1, 0x03, 0x55, 0x60
    DB 0x76, 0xF6, 0x6C, 0xBA, 0x1C, 0x3B, 0xCD, 0xC5, 0x66, 0x2F
    DB 0x63, 0x9C, 0x22, 0x7D, 0x4A, 0xD3, 0xE5, 0xD1, 0x1C, 0x55
    DB 0x61, 0xB0, 0xAB, 0x02, 0x64, 0x48, 0x19, 0x99, 0x08, 0xFC
    DB 0x66, 0x02, 0x82, 0x9D, 0x98, 0xB8, 0x25, 0x86, 0xB0, 0x47
    DB 0x90, 0x3F, 0x64, 0x95, 0x9B, 0x7E, 0xAD, 0x34, 0x99, 0x54
    DB 0x0B, 0x4B, 0x67, 0x1C, 0xC6, 0xDD, 0x4E, 0xFA, 0xEE, 0x48
    DB 0xEA, 0x5D, 0x62, 0xB6, 0xB0, 0xA1, 0xB5, 0x95, 0x51, 0x41
    DB 0xC7, 0x55, 0xF1, 0xA0, 0x46, 0x04, 0xD4, 0x32, 0xB2, 0x79
    DB 0x9B, 0x4E, 0xF4, 0x6E, 0x84, 0x52, 0xD8, 0x88, 0x46, 0x92
    DB 0x24, 0x44, 0x16, 0xFB, 0x6D, 0x31, 0xA8, 0x43, 0xAC, 0xDF
    DB 0x4C, 0xF7, 0xA1, 0xED, 0xC0, 0xF5, 0x2D, 0xCB, 0x8E, 0x19
    DB 0xFF, 0x2C, 0x8F, 0x92, 0xE4, 0x03, 0x97, 0x65, 0xE9, 0x29
    DB 0xF8, 0x55, 0x8F, 0xD5, 0x4E, 0xE8, 0xD1, 0x51, 0x3D, 0x5E
    DB 0xA7, 0xEC, 0x1F, 0x7E, 0x81, 0x2B, 0x7F, 0x73, 0x38, 0x7A
    DB 0x07, 0x74, 0xC5, 0x0B, 0xD3, 0xCE, 0xDD, 0xC5, 0x11, 0x37
    DB 0x0A, 0x18, 0x38, 0x1A, 0xE8, 0x67, 0xF8, 0x4B, 0x6F, 0x39
    DB 0x6E, 0xEA, 0x51, 0x64, 0x54, 0xAE, 0xBE, 0xE4, 0xBB, 0x00
    DB 0xD2, 0xFC, 0x11, 0x0C, 0x44, 0x9B, 0x89, 0x91, 0xD6, 0x3B    

pi: DB 3
    DB 0x24, 0x3F, 0x6A, 0x88, 0x85, 0xA3, 0x08, 0xD3, 0x13, 0x19
    DB 0x8A, 0x2E, 0x03, 0x70, 0x73, 0x44, 0xA4, 0x09, 0x38, 0x22
    DB 0x29, 0x9F, 0x31, 0xD0, 0x08, 0x2E, 0xFA, 0x98, 0xEC, 0x4E
    DB 0x6C, 0x89, 0x45, 0x28, 0x21, 0xE6, 0x38, 0xD0, 0x13, 0x77
    DB 0xBE, 0x54, 0x66, 0xCF, 0x34, 0xE9, 0x0C, 0x6C, 0xC0, 0xAC
    DB 0x29, 0xB7, 0xC9, 0x7C, 0x50, 0xDD, 0x3F, 0x84, 0xD5, 0xB5
    DB 0xB5, 0x47, 0x09, 0x17, 0x92, 0x16, 0xD5, 0xD9, 0x89, 0x79
    DB 0xFB, 0x1B, 0xD1, 0x31, 0x0B, 0xA6, 0x98, 0xDF, 0xB5, 0xAC
    DB 0x2F, 0xFD, 0x72, 0xDB, 0xD0, 0x1A, 0xDF, 0xB7, 0xB8, 0xE1
    DB 0xAF, 0xED, 0x6A, 0x26, 0x7E, 0x96, 0xBA, 0x7C, 0x90, 0x45
    DB 0xF1, 0x2C, 0x7F, 0x99, 0x24, 0xA1, 0x99, 0x47, 0xB3, 0x91
    DB 0x6C, 0xF7, 0x08, 0x01, 0xF2, 0xE2, 0x85, 0x8E, 0xFC, 0x16
    DB 0x63, 0x69, 0x20, 0xD8, 0x71, 0x57, 0x4E, 0x69, 0xA4, 0x58
    DB 0xFE, 0xA3, 0xF4, 0x93, 0x3D, 0x7E, 0x0D, 0x95, 0x74, 0x8F
    DB 0x72, 0x8E, 0xB6, 0x58, 0x71, 0x8B, 0xCD, 0x58, 0x82, 0x15
    DB 0x4A, 0xEE, 0x7B, 0x54, 0xA4, 0x1D, 0xC2, 0x5A, 0x59, 0xB5
    DB 0x9C, 0x30, 0xD5, 0x39, 0x2A, 0xF2, 0x60, 0x13, 0xC5, 0xD1
    DB 0xB0, 0x23, 0x28, 0x60, 0x85, 0xF0, 0xCA, 0x41, 0x79, 0x18
    DB 0xB8, 0xDB, 0x38, 0xEF, 0x8E, 0x79, 0xDC, 0xB0, 0x60, 0x3A
    DB 0x18, 0x0E, 0x6C, 0x9E, 0x0E, 0x8B, 0xB0, 0x1E, 0x8A, 0x3E
    DB 0xD7, 0x15, 0x77, 0xC1, 0xBD, 0x31, 0x4B, 0x27, 0x78, 0xAF
    DB 0x2F, 0xDA, 0x55, 0x60, 0x5C, 0x60, 0xE6, 0x55, 0x25, 0xF3
    DB 0xAA, 0x55, 0xAB, 0x94, 0x57, 0x48, 0x98, 0x62, 0x63, 0xE8
    DB 0x14, 0x40, 0x55, 0xCA, 0x39, 0x6A, 0x2A, 0xAB, 0x10, 0xB6
    DB 0xB4, 0xCC, 0x5C, 0x34, 0x11, 0x41, 0xE8, 0xCE, 0xA1, 0x54
    DB 0x86, 0xAF, 0x7C, 0x72, 0xE9, 0x93, 0xB3, 0xEE, 0x14, 0x11
    DB 0x63, 0x6F, 0xBC, 0x2A, 0x2B, 0xA9, 0xC5, 0x5D, 0x74, 0x18
    DB 0x31, 0xF6, 0xCE, 0x5C, 0x3E, 0x16, 0x9B, 0x87, 0x93, 0x1E
    DB 0xAF, 0xD6, 0xBA, 0x33, 0x6C, 0x24, 0xCF, 0x5C, 0x7A, 0x32
    DB 0x53, 0x81, 0x28, 0x95, 0x86, 0x77, 0x3B, 0x8F, 0x48, 0x98
    DB 0x6B, 0x4B, 0xB9, 0xAF, 0xC4, 0xBF, 0xE8, 0x1B, 0x66, 0x28
    DB 0x21, 0x93, 0x61, 0xD8, 0x09, 0xCC, 0xFB, 0x21, 0xA9, 0x91
    DB 0x48, 0x7C, 0xAC, 0x60, 0x5D, 0xEC, 0x80, 0x32, 0xEF, 0x84
    DB 0x5D, 0x5D, 0xE9, 0x85, 0x75, 0xB1, 0xDC, 0x26, 0x23, 0x02
    DB 0xEB, 0x65, 0x1B, 0x88, 0x23, 0x89, 0x3E, 0x81, 0xD3, 0x96
    DB 0xAC, 0xC5, 0x0F, 0x6D, 0x6F, 0xF3, 0x83, 0xF4, 0x42, 0x39
    DB 0x2E, 0x0B, 0x44, 0x82, 0xA4, 0x84, 0x20, 0x04, 0x69, 0xC8
    DB 0xF0, 0x4A, 0x9E, 0x1F, 0x9B, 0x5E, 0x21, 0xC6, 0x68, 0x42
    DB 0xF6, 0xE9, 0x6C, 0x9A, 0x67, 0x0C, 0x9C, 0x61, 0xAB, 0xD3
    DB 0x88, 0xF0, 0x6A, 0x51, 0xA0, 0xD2, 0xD8, 0x54, 0x2F, 0x68
    DB 0x96, 0x0F, 0xA7, 0x28, 0xAB, 0x51, 0x33, 0xA3, 0x6E, 0xEF
    DB 0x0B, 0x6C, 0x13, 0x7A, 0x3B, 0xE4, 0xBA, 0x3B, 0xF0, 0x50
    DB 0x7E, 0xFB, 0x2A, 0x98, 0xA1, 0xF1, 0x65, 0x1D, 0x39, 0xAF
    DB 0x01, 0x76, 0x66, 0xCA, 0x59, 0x3E, 0x82, 0x43, 0x0E, 0x88
    DB 0x8C, 0xEE, 0x86, 0x19, 0x45, 0x6F, 0x9F, 0xB4, 0x7D, 0x84
    DB 0xA5, 0xC3, 0x3B, 0x8B, 0x5E, 0xBE, 0xE0, 0x6F, 0x75, 0xD8
    DB 0x85, 0xC1, 0x20, 0x73, 0x40, 0x1A, 0x44, 0x9F, 0x56, 0xC1
    DB 0x6A, 0xA6, 0x4E, 0xD3, 0xAA, 0x62, 0x36, 0x3F, 0x77, 0x06
    DB 0x1B, 0xFE, 0xDF, 0x72, 0x42, 0x9B, 0x02, 0x3D, 0x37, 0xD0
    DB 0xD7, 0x24, 0xD0, 0x0A, 0x12, 0x48, 0xDB, 0x0F, 0xEA, 0xD3
    DB 0x49, 0xF1, 0xC0, 0x9B, 0x07, 0x53, 0x72, 0xC9, 0x80, 0x99
    DB 0x1B, 0x7B, 0x25, 0xD4, 0x79, 0xD8, 0xF6, 0xE8, 0xDE, 0xF7
    DB 0xE3, 0xFE, 0x50, 0x1A, 0xB6, 0x79, 0x4C, 0x3B, 0x97, 0x6C
    DB 0xE0, 0xBD, 0x04, 0xC0, 0x06, 0xBA, 0xC1, 0xA9, 0x4F, 0xB6
    DB 0x40, 0x9F, 0x60, 0xC4, 0x5E, 0x5C, 0x9E, 0xC2, 0x19, 0x6A
    DB 0x24, 0x63, 0x68, 0xFB, 0x6F, 0xAF, 0x3E, 0x6C, 0x53, 0xB5
    DB 0x13, 0x39, 0xB2, 0xEB, 0x3B, 0x52, 0xEC, 0x6F, 0x6D, 0xFC
    DB 0x51, 0x1F, 0x9B, 0x30, 0x95, 0x2C, 0xCC, 0x81, 0x45, 0x44
    DB 0xAF, 0x5E, 0xBD, 0x09, 0xBE, 0xE3, 0xD0, 0x04, 0xDE, 0x33
    DB 0x4A, 0xFD, 0x66, 0x0F, 0x28, 0x07, 0x19, 0x2E, 0x4B, 0xB3
    DB 0xC0, 0xCB, 0xA8, 0x57, 0x45, 0xC8, 0x74, 0x0F, 0xD2, 0x0B
    DB 0x5F, 0x39, 0xB9, 0xD3, 0xFB, 0xDB, 0x55, 0x79, 0xC0, 0xBD
    DB 0x1A, 0x60, 0x32, 0x0A, 0xD6, 0xA1, 0x00, 0xC6, 0x40, 0x2C
    DB 0x72, 0x79, 0x67, 0x9F, 0x25, 0xFE, 0xFB, 0x1F, 0xA3, 0xCC
    DB 0x8E, 0xA5, 0xE9, 0xF8, 0xDB, 0x32, 0x22, 0xF8, 0x3C, 0x75
    DB 0x16, 0xDF, 0xFD, 0x61, 0x6B, 0x15, 0x2F, 0x50, 0x1E, 0xC8
    DB 0xAD, 0x05, 0x52, 0xAB, 0x32, 0x3D, 0xB5, 0xFA, 0xFD, 0x23
    DB 0x87, 0x60, 0x53, 0x31, 0x7B, 0x48, 0x3E, 0x00, 0xDF, 0x82
    DB 0x9E, 0x5C, 0x57, 0xBB, 0xCA, 0x6F, 0x8C, 0xA0, 0x1A, 0x87
    DB 0x56, 0x2E, 0xDF, 0x17, 0x69, 0xDB, 0xD5, 0x42, 0xA8, 0xF6
    DB 0x28, 0x7E, 0xFF, 0xC3, 0xAC, 0x67, 0x32, 0xC6, 0x8C, 0x4F
    DB 0x55, 0x73, 0x69, 0x5B, 0x27, 0xB0, 0xBB, 0xCA, 0x58, 0xC8
    DB 0xE1, 0xFF, 0xA3, 0x5D, 0xB8, 0xF0, 0x11, 0xA0, 0x10, 0xFA
    DB 0x3D, 0x98, 0xFD, 0x21, 0x83, 0xB8, 0x4A, 0xFC, 0xB5, 0x6C
    DB 0x2D, 0xD1, 0xD3, 0x5B, 0x9A, 0x53, 0xE4, 0x79, 0xB6, 0xF8
    DB 0x45, 0x65, 0xD2, 0x8E, 0x49, 0xBC, 0x4B, 0xFB, 0x97, 0x90
    DB 0xE1, 0xDD, 0xF2, 0xDA, 0xA4, 0xCB, 0x7E, 0x33, 0x62, 0xFB
    DB 0x13, 0x41, 0xCE, 0xE4, 0xC6, 0xE8, 0xEF, 0x20, 0xCA, 0xDA
    DB 0x36, 0x77, 0x4C, 0x01, 0xD0, 0x7E, 0x9E, 0xFE, 0x2B, 0xF1
    DB 0x1F, 0xB4, 0x95, 0xDB, 0xDA, 0x4D, 0xAE, 0x90, 0x91, 0x98
    DB 0xEA, 0xAD, 0x8E, 0x71, 0x6B, 0x93, 0xD5, 0xA0, 0xD0, 0x8E
    DB 0xD1, 0xD0, 0xAF, 0xC7, 0x25, 0xE0, 0x8E, 0x3C, 0x5B, 0x2F
    DB 0x8E, 0x75, 0x94, 0xB7, 0x8F, 0xF6, 0xE2, 0xFB, 0xF2, 0x12
    DB 0x2B, 0x64, 0x88, 0x88, 0xB8, 0x12, 0x90, 0x0D, 0xF0, 0x1C
    DB 0x4F, 0xAD, 0x5E, 0xA0, 0x68, 0x8F, 0xC3, 0x1C, 0xD1, 0xCF
    DB 0xF1, 0x91, 0xB3, 0xA8, 0xC1, 0xAD, 0x2F, 0x2F, 0x22, 0x18
    DB 0xBE, 0x0E, 0x17, 0x77, 0xEA, 0x75, 0x2D, 0xFE, 0x8B, 0x02
    DB 0x1F, 0xA1, 0xE5, 0xA0, 0xCC, 0x0F, 0xB5, 0x6F, 0x74, 0xE8
    DB 0x18, 0xAC, 0xF3, 0xD6, 0xCE, 0x89, 0xE2, 0x99, 0xB4, 0xA8
    DB 0x4F, 0xE0, 0xFD, 0x13, 0xE0, 0xB7, 0x7C, 0xC4, 0x3B, 0x81
    DB 0xD2, 0xAD, 0xA8, 0xD9, 0x16, 0x5F, 0xA2, 0x66, 0x80, 0x95
    DB 0x77, 0x05, 0x93, 0xCC, 0x73, 0x14, 0x21, 0x1A, 0x14, 0x77
    DB 0xE6, 0xAD, 0x20, 0x65, 0x77, 0xB5, 0xFA, 0x86, 0xC7, 0x54
    DB 0x42, 0xF5, 0xFB, 0x9D, 0x35, 0xCF, 0xEB, 0xCD, 0xAF, 0x0C
    DB 0x7B, 0x3E, 0x89, 0xA0, 0xD6, 0x41, 0x1B, 0xD3, 0xAE, 0x1E
    DB 0x7E, 0x49, 0x00, 0x25, 0x0E, 0x2D, 0x20, 0x71, 0xB3, 0x5E
    DB 0x22, 0x68, 0x00, 0xBB, 0x57, 0xB8, 0xE0, 0xAF, 0x24, 0x64
    DB 0x36, 0x9B, 0xF0, 0x09, 0xB9, 0x1E, 0x55, 0x63, 0x91, 0x1D
    DB 0x59, 0xDF, 0xA6, 0xAA, 0x78, 0xC1, 0x43, 0x89, 0xD9, 0x5A
    DB 0x53, 0x7F, 0x20, 0x7D, 0x5B, 0xA2, 0x02, 0xE5, 0xB9, 0xC5
    DB 0x83, 0x26, 0x03, 0x76, 0x62, 0x95, 0xCF, 0xA9, 0x11, 0xC8
    DB 0x19, 0x68, 0x4E, 0x73, 0x4A, 0x41, 0xB3, 0x47, 0x2D, 0xCA
    DB 0x7B, 0x14, 0xA9, 0x4A, 0x1B, 0x51, 0x00, 0x52, 0x9A, 0x53
    DB 0x29, 0x15, 0xD6, 0x0F, 0x57, 0x3F, 0xBC, 0x9B, 0xC6, 0xE4
    DB 0x2B, 0x60, 0xA4, 0x76, 0x81, 0xE6, 0x74, 0x00, 0x08, 0xBA
    DB 0x6F, 0xB5, 0x57, 0x1B, 0xE9, 0x1F, 0xF2, 0x96, 0xEC, 0x6B
    DB 0x2A, 0x0D, 0xD9, 0x15, 0xB6, 0x63, 0x65, 0x21, 0xE7, 0xB9
    DB 0xF9, 0xB6, 0xFF, 0x34, 0x05, 0x2E, 0xC5, 0x85, 0x56, 0x64
    DB 0x53, 0xB0, 0x2D, 0x5D, 0xA9, 0x9F, 0x8F, 0xA1, 0x08, 0xBA
    DB 0x47, 0x99, 0x6E, 0x85, 0x07, 0x6A, 0x4B, 0x7A, 0x70, 0xE9
    DB 0xB5, 0xB3, 0x29, 0x44, 0xDB, 0x75, 0x09, 0x2E, 0xC4, 0x19
    DB 0x26, 0x23, 0xAD, 0x6E, 0xA6, 0xB0, 0x49, 0xA7, 0xDF, 0x7D
    DB 0x9C, 0xEE, 0x60, 0xB8, 0x8F, 0xED, 0xB2, 0x66, 0xEC, 0xAA
    DB 0x8C, 0x71, 0x69, 0x9A, 0x17, 0xFF, 0x56, 0x64, 0x52, 0x6C
    DB 0xC2, 0xB1, 0x9E, 0xE1, 0x19, 0x36, 0x02, 0xA5, 0x75, 0x09
    DB 0x4C, 0x29, 0xA0, 0x59, 0x13, 0x40, 0xE4, 0x18, 0x3A, 0x3E
    DB 0x3F, 0x54, 0x98, 0x9A, 0x5B, 0x42, 0x9D, 0x65, 0x6B, 0x8F
    DB 0xE4, 0xD6, 0x99, 0xF7, 0x3F, 0xD6, 0xA1, 0xD2, 0x9C, 0x07
    DB 0xEF, 0xE8, 0x30, 0xF5, 0x4D, 0x2D, 0x38, 0xE6, 0xF0, 0x25
    DB 0x5D, 0xC1, 0x4C, 0xDD, 0x20, 0x86, 0x84, 0x70, 0xEB, 0x26
    DB 0x63, 0x82, 0xE9, 0xC6, 0x02, 0x1E, 0xCC, 0x5E, 0x09, 0x68
    DB 0x6B, 0x3F, 0x3E, 0xBA, 0xEF, 0xC9, 0x3C, 0x97, 0x18, 0x14
    DB 0x6B, 0x6A, 0x70, 0xA1, 0x68, 0x7F, 0x35, 0x84, 0x52, 0xA0
    DB 0xE2, 0x86, 0xB7, 0x9C, 0x53, 0x05, 0xAA, 0x50, 0x07, 0x37
    DB 0x3E, 0x07, 0x84, 0x1C, 0x7F, 0xDE, 0xAE, 0x5C, 0x8E, 0x7D
    DB 0x44, 0xEC, 0x57, 0x16, 0xF2, 0xB8, 0xB0, 0x3A, 0xDA, 0x37
    DB 0xF0, 0x50, 0x0C, 0x0D, 0xF0, 0x1C, 0x1F, 0x04, 0x02, 0x00
    DB 0xB3, 0xFF, 0xAE, 0x0C, 0xF5, 0x1A, 0x3C, 0xB5, 0x74, 0xB2
    DB 0x25, 0x83, 0x7A, 0x58, 0xDC, 0x09, 0x21, 0xBD, 0xD1, 0x91
    DB 0x13, 0xF9, 0x7C, 0xA9, 0x2F, 0xF6, 0x94, 0x32, 0x47, 0x73
    DB 0x22, 0xF5, 0x47, 0x01, 0x3A, 0xE5, 0xE5, 0x81, 0x37, 0xC2
    DB 0xDA, 0xDC, 0xC8, 0xB5, 0x76, 0x34, 0x9A, 0xF3, 0xDD, 0xA7
    DB 0xA9, 0x44, 0x61, 0x46, 0x0F, 0xD0, 0x03, 0x0E, 0xEC, 0xC8
    DB 0xC7, 0x3E, 0xA4, 0x75, 0x1E, 0x41, 0xE2, 0x38, 0xCD, 0x99
    DB 0x3B, 0xEA, 0x0E, 0x2F, 0x32, 0x80, 0xBB, 0xA1, 0x18, 0x3E
    DB 0xB3, 0x31, 0x4E, 0x54, 0x8B, 0x38, 0x4F, 0x6D, 0xB9, 0x08
    DB 0x6F, 0x42, 0x0D, 0x03, 0xF6, 0x0A, 0x04, 0xBF, 0x2C, 0xB8
    DB 0x12, 0x90, 0x24, 0x97, 0x7C, 0x79, 0x56, 0x79, 0xB0, 0x72
    DB 0xBC, 0xAF, 0x89, 0xAF, 0xDE, 0x9A, 0x77, 0x1F, 0xD9, 0x93
    DB 0x08, 0x10, 0xB3, 0x8B, 0xAE, 0x12, 0xDC, 0xCF, 0x3F, 0x2E
    DB 0x55, 0x12, 0x72, 0x1F, 0x2E, 0x6B, 0x71, 0x24, 0x50, 0x1A
    DB 0xDD, 0xE6, 0x9F, 0x84, 0xCD, 0x87, 0x7A, 0x58, 0x47, 0x18
    DB 0x74, 0x08, 0xDA, 0x17, 0xBC, 0x9F, 0x9A, 0xBC, 0xE9, 0x4B
    DB 0x7D, 0x8C, 0xEC, 0x7A, 0xEC, 0x3A, 0xDB, 0x85, 0x1D, 0xFA
    DB 0x63, 0x09, 0x43, 0x66, 0xC4, 0x64, 0xC3, 0xD2, 0xEF, 0x1C
    DB 0x18, 0x47, 0x32, 0x15, 0xD9, 0x08, 0xDD, 0x43, 0x3B, 0x37
    DB 0x24, 0xC2, 0xBA, 0x16, 0x12, 0xA1, 0x4D, 0x43, 0x2A, 0x65
    DB 0xC4, 0x51, 0x50, 0x94, 0x00, 0x02, 0x13, 0x3A, 0xE4, 0xDD
    DB 0x71, 0xDF, 0xF8, 0x9E, 0x10, 0x31, 0x4E, 0x55, 0x81, 0xAC
    DB 0x77, 0xD6, 0x5F, 0x11, 0x19, 0x9B, 0x04, 0x35, 0x56, 0xF1
    DB 0xD7, 0xA3, 0xC7, 0x6B, 0x3C, 0x11, 0x18, 0x3B, 0x59, 0x24
    DB 0xA5, 0x09, 0xF2, 0x8F, 0xE6, 0xED, 0x97, 0xF1, 0xFB, 0xFA
    DB 0x9E, 0xBA, 0xBF, 0x2C, 0x1E, 0x15, 0x3C, 0x6E, 0x86, 0xE3
    DB 0x45, 0x70, 0xEA, 0xE9, 0x6F, 0xB1, 0x86, 0x0E, 0x5E, 0x0A
    DB 0x5A, 0x3E, 0x2A, 0xB3, 0x77, 0x1F, 0xE7, 0x1C, 0x4E, 0x3D
    DB 0x06, 0xFA, 0x29, 0x65, 0xDC, 0xB9, 0x99, 0xE7, 0x1D, 0x0F
    DB 0x80, 0x3E, 0x89, 0xD6, 0x52, 0x66, 0xC8, 0x25, 0x2E, 0x4C
    DB 0xC9, 0x78, 0x9C, 0x10, 0xB3, 0x6A, 0xC6, 0x15, 0x0E, 0xBA
    DB 0x94, 0xE2, 0xEA, 0x78, 0xA5, 0xFC, 0x3C, 0x53, 0x1E, 0x0A
    DB 0x2D, 0xF4, 0xF2, 0xF7, 0x4E, 0xA7, 0x36, 0x1D, 0x2B, 0x3D
    DB 0x19, 0x39, 0x26, 0x0F, 0x19, 0xC2, 0x79, 0x60, 0x52, 0x23
    DB 0xA7, 0x08, 0xF7, 0x13, 0x12, 0xB6, 0xEB, 0xAD, 0xFE, 0x6E
    DB 0xEA, 0xC3, 0x1F, 0x66, 0xE3, 0xBC, 0x45, 0x95, 0xA6, 0x7B
    DB 0xC8, 0x83, 0xB1, 0x7F, 0x37, 0xD1, 0x01, 0x8C, 0xFF, 0x28
    DB 0xC3, 0x32, 0xDD, 0xEF, 0xBE, 0x6C, 0x5A, 0xA5, 0x65, 0x58
    DB 0x21, 0x85, 0x68, 0xAB, 0x98, 0x02, 0xEE, 0xCE, 0xA5, 0x0F
    DB 0xDB, 0x2F, 0x95, 0x3B, 0x2A, 0xEF, 0x7D, 0xAD, 0x5B, 0x6E
    DB 0x2F, 0x84, 0x15, 0x21, 0xB6, 0x28, 0x29, 0x07, 0x61, 0x70
    DB 0xEC, 0xDD, 0x47, 0x75, 0x61, 0x9F, 0x15, 0x10, 0x13, 0xCC
    DB 0xA8, 0x30, 0xEB, 0x61, 0xBD, 0x96, 0x03, 0x34, 0xFE, 0x1E
    DB 0xAA, 0x03, 0x63, 0xCF, 0xB5, 0x73, 0x5C, 0x90, 0x4C, 0x70
    DB 0xA2, 0x39, 0xD5, 0x9E, 0x9E, 0x0B, 0xCB, 0xAA, 0xDE, 0x14
    DB 0xEE, 0xCC, 0x86, 0xBC, 0x60, 0x62, 0x2C, 0xA7, 0x9C, 0xAB
    DB 0x5C, 0xAB, 0xB2, 0xF3, 0x84, 0x6E, 0x64, 0x8B, 0x1E, 0xAF
    DB 0x19, 0xBD, 0xF0, 0xCA, 0xA0, 0x23, 0x69, 0xB9, 0x65, 0x5A
    DB 0xBB, 0x50, 0x40, 0x68, 0x5A, 0x32, 0x3C, 0x2A, 0xB4, 0xB3
    DB 0x31, 0x9E, 0xE9, 0xD5, 0xC0, 0x21, 0xB8, 0xF7, 0x9B, 0x54
    DB 0x0B, 0x19, 0x87, 0x5F, 0xA0, 0x99, 0x95, 0xF7, 0x99, 0x7E
    DB 0x62, 0x3D, 0x7D, 0xA8, 0xF8, 0x37, 0x88, 0x9A, 0x97, 0xE3
    DB 0x2D, 0x77, 0x11, 0xED, 0x93, 0x5F, 0x16, 0x68, 0x12, 0x81
    DB 0x0E, 0x35, 0x88, 0x29, 0xC7, 0xE6, 0x1F, 0xD6, 0x96, 0xDE
    DB 0xDF, 0xA1, 0x78, 0x58, 0xBA, 0x99, 0x57, 0xF5, 0x84, 0xA5
    DB 0x1B, 0x22, 0x72, 0x63, 0x9B, 0x83, 0xC3, 0xFF, 0x1A, 0xC2
    DB 0x46, 0x96, 0xCD, 0xB3, 0x0A, 0xEB, 0x53, 0x2E, 0x30, 0x54
    DB 0x8F, 0xD9, 0x48, 0xE4, 0x6D, 0xBC, 0x31, 0x28, 0x58, 0xEB
    DB 0xF2, 0xEF, 0x34, 0xC6, 0xFF, 0xEA, 0xFE, 0x28, 0xED, 0x61
    DB 0xEE, 0x7C, 0x3C, 0x73, 0x5D, 0x4A, 0x14, 0xD9, 0xE8, 0x64
    DB 0xB7, 0xE3, 0x42, 0x10, 0x5D, 0x14, 0x20, 0x3E, 0x13, 0xE0
    DB 0x45, 0xEE, 0xE2, 0xB6, 0xA3, 0xAA, 0xAB, 0xEA, 0xDB, 0x6C
    DB 0x4F, 0x15, 0xFA, 0xCB, 0x4F, 0xD0, 0xC7, 0x42, 0xF4, 0x42
    DB 0xEF, 0x6A, 0xBB, 0xB5, 0x65, 0x4F, 0x3B, 0x1D, 0x41, 0xCD
    DB 0x21, 0x05, 0xD8, 0x1E, 0x79, 0x9E, 0x86, 0x85, 0x4D, 0xC7
    DB 0xE4, 0x4B, 0x47, 0x6A, 0x3D, 0x81, 0x62, 0x50, 0xCF, 0x62
    DB 0xA1, 0xF2, 0x5B, 0x8D, 0x26, 0x46, 0xFC, 0x88, 0x83, 0xA0
    DB 0xC1, 0xC7, 0xB6, 0xA3, 0x7F, 0x15, 0x24, 0xC3, 0x69, 0xCB
    DB 0x74, 0x92, 0x47, 0x84, 0x8A, 0x0B, 0x56, 0x92, 0xB2, 0x85
    DB 0x09, 0x5B, 0xBF, 0x00, 0xAD, 0x19, 0x48, 0x9D, 0x14, 0x62
    DB 0xB1, 0x74, 0x23, 0x82, 0x0E, 0x00, 0x58, 0x42, 0x8D, 0x2A
    DB 0x0C, 0x55, 0xF5, 0xEA, 0x1D, 0xAD, 0xF4, 0x3E, 0x23, 0x3F
    DB 0x70, 0x61, 0x33, 0x72, 0xF0, 0x92, 0x8D, 0x93, 0x7E, 0x41
    DB 0xD6, 0x5F, 0xEC, 0xF1, 0x6C, 0x22, 0x3B, 0xDB, 0x7C, 0xDE
    DB 0x37, 0x59, 0xCB, 0xEE, 0x74, 0x60, 0x40, 0x85, 0xF2, 0xA7
    DB 0xCE, 0x77, 0x32, 0x6E, 0xA6, 0x07, 0x80, 0x84, 0x19, 0xF8
    DB 0x50, 0x9E, 0xE8, 0xEF, 0xD8, 0x55, 0x61, 0xD9, 0x97, 0x35
    DB 0xA9, 0x69, 0xA7, 0xAA, 0xC5, 0x0C, 0x06, 0xC2, 0x5A, 0x04
    DB 0xAB, 0xFC, 0x80, 0x0B, 0xCA, 0xDC, 0x9E, 0x44, 0x7A, 0x2E
    DB 0xC3, 0x45, 0x34, 0x84, 0xFD, 0xD5, 0x67, 0x05, 0x0E, 0x1E
    DB 0x9E, 0xC9, 0xDB, 0x73, 0xDB, 0xD3, 0x10, 0x55, 0x88, 0xCD
    DB 0x67, 0x5F, 0xDA, 0x79, 0xE3, 0x67, 0x43, 0x40, 0xC5, 0xC4
    DB 0x34, 0x65, 0x71, 0x3E, 0x38, 0xD8, 0x3D, 0x28, 0xF8, 0x9E
    DB 0xF1, 0x6D, 0xFF, 0x20, 0x15, 0x3E, 0x21, 0xE7, 0x8F, 0xB0
    DB 0x3D, 0x4A, 0xE6, 0xE3, 0x9F, 0x2B, 0xDB, 0x83, 0xAD, 0xF7
    DB 0xE9, 0x3D, 0x5A, 0x68, 0x94, 0x81, 0x40, 0xF7, 0xF6, 0x4C
    DB 0x26, 0x1C, 0x94, 0x69, 0x29, 0x34, 0x41, 0x15, 0x20, 0xF7
    DB 0x76, 0x02, 0xD4, 0xF7, 0xBC, 0xF4, 0x6B, 0x2E, 0xD4, 0xA2
    DB 0x00, 0x68, 0xD4, 0x08, 0x24, 0x71, 0x33, 0x20, 0xF4, 0x6A
    DB 0x43, 0xB7, 0xD4, 0xB7, 0x50, 0x00, 0x61, 0xAF, 0x1E, 0x39
    DB 0xF6, 0x2E, 0x97, 0x24, 0x45, 0x46, 0x14, 0x21, 0x4F, 0x74
    DB 0xBF, 0x8B, 0x88, 0x40, 0x4D, 0x95, 0xFC, 0x1D, 0x96, 0xB5
    DB 0x91, 0xAF, 0x70, 0xF4, 0xDD, 0xD3, 0x66, 0xA0, 0x2F, 0x45
    DB 0xBF, 0xBC, 0x09, 0xEC, 0x03, 0xBD, 0x97, 0x85, 0x7F, 0xAC
    DB 0x6D, 0xD0, 0x31, 0xCB, 0x85, 0x04, 0x96, 0xEB, 0x27, 0xB3
    DB 0x55, 0xFD, 0x39, 0x41, 0xDA, 0x25, 0x47, 0xE6, 0xAB, 0xCA
    DB 0x0A, 0x9A, 0x28, 0x50, 0x78, 0x25, 0x53, 0x04, 0x29, 0xF4
    DB 0x0A, 0x2C, 0x86, 0xDA, 0xE9, 0xB6, 0x6D, 0xFB, 0x68, 0xDC
    DB 0x14, 0x62, 0xD7, 0x48, 0x69, 0x00, 0x68, 0x0E, 0xC0, 0xA4
    DB 0x27, 0xA1, 0x8D, 0xEE, 0x4F, 0x3F, 0xFE, 0xA2, 0xE8, 0x87
    DB 0xAD, 0x8C, 0xB5, 0x8C, 0xE0, 0x06, 0x7A, 0xF4, 0xD6, 0xB6
    DB 0xAA, 0xCE, 0x1E, 0x7C, 0xD3, 0x37, 0x5F, 0xEC, 0xCE, 0x78
    DB 0xA3, 0x99, 0x40, 0x6B, 0x2A, 0x42, 0x20, 0xFE, 0x9E, 0x35
    DB 0xD9, 0xF3, 0x85, 0xB9, 0xEE, 0x39, 0xD7, 0xAB, 0x3B, 0x12
    DB 0x4E, 0x8B, 0x1D, 0xC9, 0xFA, 0xF7, 0x4B, 0x6D, 0x18, 0x56
    DB 0x26, 0xA3, 0x66, 0x31, 0xEA, 0xE3, 0x97, 0xB2, 0x3A, 0x6E
    DB 0xFA, 0x74, 0xDD, 0x5B, 0x43, 0x32, 0x68, 0x41, 0xE7, 0xF7
    DB 0xCA, 0x78, 0x20, 0xFB, 0xFB, 0x0A, 0xF5, 0x4E, 0xD8, 0xFE
    DB 0xB3, 0x97, 0x45, 0x40, 0x56, 0xAC, 0xBA, 0x48, 0x95, 0x27
    DB 0x55, 0x53, 0x3A, 0x3A, 0x20, 0x83, 0x8D, 0x87, 0xFE, 0x6B
    DB 0xA9, 0xB7, 0xD0, 0x96, 0x95, 0x4B, 0x55, 0xA8, 0x67, 0xBC
    DB 0xA1, 0x15, 0x9A, 0x58, 0xCC, 0xA9, 0x29, 0x63, 0x99, 0xE1
    DB 0xDB, 0x33, 0xA6, 0x2A, 0x4A, 0x56, 0x3F, 0x31, 0x25, 0xF9
    DB 0x5E, 0xF4, 0x7E, 0x1C, 0x90, 0x29, 0x31, 0x7C, 0xFD, 0xF8
    DB 0xE8, 0x02, 0x04, 0x27, 0x2F, 0x70, 0x80, 0xBB, 0x15, 0x5C
    DB 0x05, 0x28, 0x2C, 0xE3, 0x95, 0xC1, 0x15, 0x48, 0xE4, 0xC6
    DB 0x6D, 0x22, 0x48, 0xC1, 0x13, 0x3F, 0xC7, 0x0F, 0x86, 0xDC
    DB 0x07, 0xF9, 0xC9, 0xEE, 0x41, 0x04, 0x1F, 0x0F, 0x40, 0x47
    DB 0x79, 0xA4, 0x5D, 0x88, 0x6E, 0x17, 0x32, 0x5F, 0x51, 0xEB
    DB 0xD5, 0x9B, 0xC0, 0xD1, 0xF2, 0xBC, 0xC1, 0x8F, 0x41, 0x11
    DB 0x35, 0x64, 0x25, 0x7B, 0x78, 0x34, 0x60, 0x2A, 0x9C, 0x60
    DB 0xDF, 0xF8, 0xE8, 0xA3, 0x1F, 0x63, 0x6C, 0x1B, 0x0E, 0x12
    DB 0xB4, 0xC2, 0x02, 0xE1, 0x32, 0x9E, 0xAF, 0x66, 0x4F, 0xD1
    DB 0xCA, 0xD1, 0x81, 0x15, 0x6B, 0x23, 0x95, 0xE0, 0x33, 0x3E
    DB 0x92, 0xE1, 0x3B, 0x24, 0x0B, 0x62, 0xEE, 0xBE, 0xB9, 0x22
    DB 0x85, 0xB2, 0xA2, 0x0E, 0xE6, 0xBA, 0x0D, 0x99, 0xDE, 0x72
    DB 0x0C, 0x8C, 0x2D, 0xA2, 0xF7, 0x28, 0xD0, 0x12, 0x78, 0x45
    DB 0x95, 0xB7, 0x94, 0xFD, 0x64, 0x7D, 0x08, 0x62, 0xE7, 0xCC
    DB 0xF5, 0xF0, 0x54, 0x49, 0xA3, 0x6F, 0x87, 0x7D, 0x48, 0xFA
    DB 0xC3, 0x9D, 0xFD, 0x27, 0xF3, 0x3E, 0x8D, 0x1E, 0x0A, 0x47
    DB 0x63, 0x41, 0x99, 0x2E, 0xFF, 0x74, 0x3A, 0x6F, 0x6E, 0xAB
    DB 0xF4, 0xF8, 0xFD, 0x37, 0xA8, 0x12, 0xDC, 0x60, 0xA1, 0xEB
    DB 0xDD, 0xF8, 0x99, 0x1B, 0xE1, 0x4C, 0xDB, 0x6E, 0x6B, 0x0D
    DB 0xC6, 0x7B, 0x55, 0x10, 0x6D, 0x67, 0x2C, 0x37, 0x27, 0x65
    DB 0xD4, 0x3B, 0xDC, 0xD0, 0xE8, 0x04, 0xF1, 0x29, 0x0D, 0xC7
    DB 0xCC, 0x00, 0xFF, 0xA3, 0xB5, 0x39, 0x0F, 0x92, 0x69, 0x0F
    DB 0xED, 0x0B, 0x66, 0x7B, 0x9F, 0xFB, 0xCE, 0xDB, 0x7D, 0x9C
    DB 0xA0, 0x91, 0xCF, 0x0B, 0xD9, 0x15, 0x5E, 0xA3, 0xBB, 0x13
    DB 0x2F, 0x88, 0x51, 0x5B, 0xAD, 0x24, 0x7B, 0x94, 0x79, 0xBF
    DB 0x76, 0x3B, 0xD6, 0xEB, 0x37, 0x39, 0x2E, 0xB3, 0xCC, 0x11
    DB 0x59, 0x79, 0x80, 0x26, 0xE2, 0x97, 0xF4, 0x2E, 0x31, 0x2D
    DB 0x68, 0x42, 0xAD, 0xA7, 0xC6, 0x6A, 0x2B, 0x3B, 0x12, 0x75
    DB 0x4C, 0xCC, 0x78, 0x2E, 0xF1, 0x1C, 0x6A, 0x12, 0x42, 0x37
    DB 0xB7, 0x92, 0x51, 0xE7, 0x06, 0xA1, 0xBB, 0xE6, 0x4B, 0xFB
    DB 0x63, 0x50, 0x1A, 0x6B, 0x10, 0x18, 0x11, 0xCA, 0xED, 0xFA
    DB 0x3D, 0x25, 0xBD, 0xD8, 0xE2, 0xE1, 0xC3, 0xC9, 0x44, 0x42

ln_2:  DB 0
    DB 0xB1, 0x72, 0x17, 0xF7, 0xD1, 0xCF, 0x79, 0xAB, 0xC9, 0xE3
    DB 0xB3, 0x98, 0x03, 0xF2, 0xF6, 0xAF, 0x40, 0xF3, 0x43, 0x26
    DB 0x72, 0x98, 0xB6, 0x2D, 0x8A, 0x0D, 0x17, 0x5B, 0x8B, 0xAA
    DB 0xFA, 0x2B, 0xE7, 0xB8, 0x76, 0x20, 0x6D, 0xEB, 0xAC, 0x98
    DB 0x55, 0x95, 0x52, 0xFB, 0x4A, 0xFA, 0x1B, 0x10, 0xED, 0x2E
    DB 0xAE, 0x35, 0xC1, 0x38, 0x21, 0x44, 0x27, 0x57, 0x3B, 0x29
    DB 0x11, 0x69, 0xB8, 0x25, 0x3E, 0x96, 0xCA, 0x16, 0x22, 0x4A
    DB 0xE8, 0xC5, 0x1A, 0xCB, 0xDA, 0x11, 0x31, 0x7C, 0x38, 0x7E
    DB 0xB9, 0xEA, 0x9B, 0xC3, 0xB1, 0x36, 0x60, 0x3B, 0x25, 0x6F
    DB 0xA0, 0xEC, 0x76, 0x57, 0xF7, 0x4B, 0x72, 0xCE, 0x87, 0xB1
    DB 0x9D, 0x65, 0x48, 0xCA, 0xF5, 0xDF, 0xA6, 0xBD, 0x38, 0x30
    DB 0x32, 0x48, 0x65, 0x5F, 0xA1, 0x87, 0x2F, 0x20, 0xE3, 0xA2
    DB 0xDA, 0x2D, 0x97, 0xC5, 0x0F, 0x3F, 0xD5, 0xC6, 0x07, 0xF4
    DB 0xCA, 0x11, 0xFB, 0x5B, 0xFB, 0x90, 0x61, 0x0D, 0x30, 0xF8
    DB 0x8F, 0xE5, 0x51, 0xA2, 0xEE, 0x56, 0x9D, 0x6D, 0xFC, 0x1E
    DB 0xFA, 0x15, 0x7D, 0x2E, 0x23, 0xDE, 0x14, 0x00, 0xB3, 0x96
    DB 0x17, 0x46, 0x07, 0x75, 0xDB, 0x89, 0x90, 0xE5, 0xC9, 0x43
    DB 0xE7, 0x32, 0xB4, 0x79, 0xCD, 0x33, 0xCC, 0xCC, 0x4E, 0x65
    DB 0x93, 0x93, 0x51, 0x4C, 0x4C, 0x1A, 0x1E, 0x0B, 0xD1, 0xD6
    DB 0x09, 0x5D, 0x25, 0x66, 0x9B, 0x33, 0x35, 0x64, 0xA3, 0x37
    DB 0x6A, 0x9C, 0x7F, 0x8A, 0x5E, 0x14, 0x8E, 0x82, 0x07, 0x4D
    DB 0xB6, 0x01, 0x5C, 0xFE, 0x7A, 0xA3, 0x0C, 0x48, 0x0A, 0x54
    DB 0x17, 0x35, 0x0D, 0x2C, 0x95, 0x5D, 0x51, 0x79, 0xB1, 0xE1
    DB 0x7B, 0x9D, 0xAE, 0x31, 0x3C, 0xDB, 0x6C, 0x60, 0x6C, 0xB1
    DB 0x07, 0x8F, 0x73, 0x5D, 0x1B, 0x2D, 0xB3, 0x1B, 0x5F, 0x50
    DB 0xB5, 0x18, 0x50, 0x64, 0xC1, 0x8B, 0x4D, 0x16, 0x2D, 0xB3
    DB 0xB3, 0x65, 0x85, 0x3D, 0x75, 0x98, 0xA1, 0x95, 0x1A, 0xE2
    DB 0x73, 0xEE, 0x55, 0x70, 0xB6, 0xC6, 0x8F, 0x96, 0x98, 0x34
    DB 0x96, 0xD4, 0xE6, 0xD3, 0x30, 0xAF, 0x88, 0x9B, 0x44, 0xA0
    DB 0x25, 0x54, 0x73, 0x1C, 0xDC, 0x8E, 0xA1, 0x72, 0x93, 0xD1
    DB 0x22, 0x8A, 0x4E, 0xF9, 0x8D, 0x6F, 0x51, 0x77, 0xFB, 0xCF
    DB 0x07, 0x55, 0x26, 0x8A, 0x5C, 0x1F, 0x95, 0x38, 0xB9, 0x82
    DB 0x61, 0xAF, 0xFD, 0x44, 0x6B, 0x1C, 0xA3, 0xCF, 0x5E, 0x92
    DB 0x22, 0xB8, 0x8C, 0x66, 0xD3, 0xC5, 0x42, 0x21, 0x83, 0xED
    DB 0xC9, 0x94, 0x21, 0x09, 0x0B, 0xBB, 0x16, 0xFA, 0xF3, 0xD9
    DB 0x49, 0xF2, 0x36, 0xE0, 0x2B, 0x20, 0xCE, 0xE8, 0x86, 0xB9
    DB 0x05, 0xC1, 0x28, 0xD5, 0x3D, 0x0B, 0xD2, 0xF9, 0x62, 0x13
    DB 0x63, 0x19, 0x6A, 0xF5, 0x03, 0x02, 0x00, 0x60, 0xE4, 0x99
    DB 0x08, 0x39, 0x1A, 0x0C, 0x57, 0x33, 0x9B, 0xA2, 0xBE, 0xBA
    DB 0x7D, 0x05, 0x2A, 0xC5, 0xB6, 0x1C, 0xC4, 0xE9, 0x20, 0x7C
    DB 0xEF, 0x2F, 0x0C, 0xE2, 0xD7, 0x37, 0x39, 0x58, 0xD7, 0x62
    DB 0x26, 0x58, 0x90, 0x1E, 0x64, 0x6A, 0x95, 0x18, 0x44, 0x60
    DB 0xDC, 0x4E, 0x74, 0x87, 0x15, 0x6E, 0x0C, 0x29, 0x24, 0x13
    DB 0xD5, 0xE3, 0x61, 0xC1, 0x69, 0x6D, 0xD2, 0x4A, 0xAE, 0xBD
    DB 0x47, 0x38, 0x26, 0xFD, 0xA0, 0xC2, 0x38, 0xB9, 0x0A, 0xB1
    DB 0x11, 0xBB, 0xBD, 0x67, 0xC7, 0x24, 0x97, 0x2C, 0xD1, 0x8B
    DB 0xFB, 0xBD, 0x9D, 0x42, 0x6C, 0x47, 0x20, 0x96, 0xE7, 0x61
    DB 0x15, 0xC0, 0x5F, 0x6F, 0x7C, 0xEB, 0xAC, 0x9F, 0x45, 0xAE
    DB 0xCE, 0xCB, 0x72, 0xF1, 0x9C, 0x38, 0x33, 0x9D, 0x8F, 0x68
    DB 0x26, 0x25, 0x0D, 0xEA, 0x89, 0x1E, 0xF0, 0x7A, 0xFF, 0xF3
    DB 0xA8, 0x92, 0x37, 0x4E, 0x17, 0x5E, 0xB4, 0xAF, 0xC8, 0xDA
    DB 0xAD, 0xD8, 0x85, 0xDB, 0x6A, 0xB0, 0x3A, 0x49, 0xBD, 0x0D
    DB 0xC0, 0xB1, 0xB3, 0x1D, 0x8A, 0x0E, 0x23, 0xFA, 0xC5, 0xE5
    DB 0x76, 0x7D, 0xF9, 0x58, 0x84, 0xE0, 0x64, 0x25, 0xA4, 0x15
    DB 0x26, 0xFA, 0xC5, 0x1C, 0x3E, 0xA8, 0x44, 0x9F, 0xE8, 0xF7
    DB 0x0E, 0xDD, 0x06, 0x2B, 0x1A, 0x63, 0xA6, 0xC4, 0xC6, 0x0C
    DB 0x52, 0xAB, 0x33, 0x16, 0x1E, 0x23, 0x84, 0x38, 0x89, 0x7A
    DB 0x39, 0xCE, 0x78, 0xB6, 0x3C, 0x9F, 0x36, 0x4F, 0x5B, 0x8A
    DB 0xEF, 0x22, 0xEC, 0x2F, 0xEE, 0x6E, 0x08, 0x50, 0xEC, 0xA4
    DB 0x2D, 0x06, 0xFB, 0x0C, 0x75, 0xDF, 0x54, 0x97, 0xE0, 0x0C
    DB 0x55, 0x4B, 0x03, 0xD7, 0xD2, 0x87, 0x4A, 0x00, 0x0C, 0xA8
    DB 0xF5, 0x8D, 0x94, 0xF0, 0x34, 0x1C, 0xBE, 0x2E, 0xC9, 0x21
    DB 0x56, 0xC9, 0xF9, 0x49, 0xDB, 0x4A, 0x93, 0x16, 0xF2, 0x81
    DB 0x50, 0x1E, 0x53, 0xDA, 0xEC, 0x3F, 0x64, 0xF1, 0xB7, 0x83
    DB 0x15, 0x4C, 0x60, 0x32, 0x0E, 0x2F, 0xF7, 0x93, 0x33, 0xCE
    DB 0x35, 0x73, 0xFA, 0xCC, 0x5F, 0xDC, 0xF1, 0x17, 0x85, 0x90
    DB 0x31, 0x55, 0xBB, 0xD9, 0x0F, 0x02, 0x3B, 0x22, 0x02, 0x24
    DB 0xFC, 0xD8, 0x47, 0x1B, 0xF4, 0xF4, 0x45, 0xF0, 0xA8, 0x8A
    DB 0x14, 0xF0, 0xCD, 0x97, 0x6E, 0xA3, 0x54, 0xBB, 0x20, 0xCD
    DB 0xB5, 0xCC, 0xB3, 0xDB, 0x23, 0x92, 0x88, 0xD5, 0x86, 0x55
    DB 0x4E, 0x2A, 0x0E, 0x8A, 0x6F, 0xE5, 0x1A, 0x8C, 0xFA, 0xA7
    DB 0x2E, 0xF2, 0xAD, 0x8A, 0x43, 0xDC, 0x42, 0x12, 0xB2, 0x10
    DB 0xB7, 0x79, 0xDF, 0xE4, 0x9D, 0x73, 0x07, 0xCC, 0x84, 0x65
    DB 0x32, 0xE4, 0xB9, 0x69, 0x4E, 0xDA, 0xD1, 0x62, 0xAF, 0x05
    DB 0x3B, 0x17, 0x51, 0xF3, 0xA3, 0xD0, 0x91, 0xF6, 0x56, 0x65
    DB 0x81, 0x54, 0x12, 0xB5, 0xE8, 0xC2, 0x02, 0x46, 0x10, 0x69
    DB 0xAC, 0x14, 0xB9, 0x58, 0x78, 0x49, 0x34, 0xB8, 0xD6, 0xCC
    DB 0xE1, 0xDA, 0xA5, 0x05, 0x37, 0x01, 0x1A, 0xA4, 0xFB, 0x42
    DB 0xB9, 0xA3, 0xDE, 0xF4, 0x1B, 0xDA, 0x1F, 0x85, 0xEF, 0x6F
    DB 0xDB, 0xF2, 0xF2, 0xD8, 0x9D, 0x2A, 0x4B, 0x18, 0x35, 0x27
    DB 0x8F, 0xD9, 0x40, 0x57, 0x89, 0xF4, 0x56, 0x81, 0x2B, 0x55
    DB 0x28, 0x79, 0xA6, 0x16, 0x86, 0x95, 0xC1, 0x29, 0x63, 0xB0
    DB 0xFF, 0x01, 0xEA, 0xAB, 0x73, 0xE5, 0xB5, 0xC1, 0x58, 0x53
    DB 0x18, 0xE7, 0x62, 0x4F, 0x14, 0xA5, 0x1A, 0x4A, 0x02, 0x6B
    DB 0x68, 0x08, 0x29, 0x20, 0x57, 0xFD, 0x99, 0xB6, 0x6D, 0xC0
    DB 0x85, 0xA9, 0x8A, 0xC8, 0xD8, 0xCA, 0xF9, 0xEE, 0xEE, 0xA9
    DB 0x8A, 0x24, 0x00, 0xCA, 0xC9, 0x5F, 0x26, 0x0F, 0xD1, 0x00
    DB 0x36, 0xF9, 0xF9, 0x10, 0x96, 0xAC, 0x31, 0x95, 0x22, 0x0A
    DB 0x1A, 0x35, 0x6B, 0x2A, 0x73, 0xB7, 0xEA, 0xAD, 0xAF, 0x6D
    DB 0x60, 0x58, 0x71, 0xEF, 0x7A, 0xFB, 0x80, 0xBC, 0x42, 0x34
    DB 0x33, 0x56, 0x2E, 0x94, 0xB1, 0x2D, 0xFA, 0xB4, 0x14, 0x45
    DB 0x15, 0x79, 0xDF, 0x59, 0xEA, 0xE0, 0x51, 0x70, 0x70, 0x62
    DB 0x40, 0x12, 0xA8, 0x29, 0x62, 0xC5, 0x9C, 0xAB, 0x34, 0x7F
    DB 0x83, 0x04, 0xD8, 0x89, 0x65, 0x9E, 0x5A, 0x91, 0x39, 0xDB
    DB 0x14, 0xEF, 0xCC, 0x30, 0x85, 0x2B, 0xE3, 0xE8, 0xFC, 0x99
    DB 0xF1, 0x4D, 0x1D, 0x82, 0x2D, 0xD6, 0xE2, 0xF7, 0x67, 0x97
    DB 0xE3, 0x02, 0x19, 0xC8, 0xAA, 0x9C, 0xE8, 0x84, 0x8A, 0x88
    DB 0x6E, 0xB3, 0xC8, 0x7B, 0x72, 0x95, 0x98, 0x80, 0x12, 0xE8
    DB 0x31, 0x41, 0x86, 0xED, 0xBA, 0xF8, 0x68, 0x56, 0xCC, 0xD3
    DB 0xC3, 0xB6, 0xEE, 0x94, 0xE6, 0x2F, 0x11, 0x0A, 0x67, 0x83
    DB 0xD2, 0xAA, 0xE8, 0x9C, 0xCC, 0x3B, 0x76, 0xFC, 0x43, 0x5A
    DB 0x0C, 0xE1, 0x34, 0xC2, 0x83, 0x8F, 0xD5, 0x71, 0xEC, 0x6C
    DB 0x13, 0x66, 0xA9, 0x92, 0xCB, 0xB9, 0xAC, 0x40, 0x7D, 0xDB
    DB 0x6C, 0x13, 0xA4, 0xB8, 0xD1, 0xEC, 0xF7, 0x56, 0x7E, 0xB0
    DB 0x97, 0x1C, 0xC9, 0x0B, 0x55, 0x18, 0x56, 0x9F, 0x14, 0x4E
    DB 0x67, 0xEB, 0xE9, 0xB4, 0x26, 0x98, 0xFE, 0xA7, 0x9D, 0x89
    DB 0xD5, 0xC5, 0xED, 0x40, 0xAC, 0x5E, 0x37, 0x01, 0xD7, 0xD7
    DB 0x72, 0x53, 0x77, 0xCF, 0x06, 0x56, 0x90, 0x7F, 0xB9, 0xB1
    DB 0xB1, 0x6E, 0xA8, 0x91, 0x1A, 0xFB, 0xF1, 0xAE, 0x5A, 0x66
    DB 0x20, 0x3D, 0x62, 0xFD, 0x1E, 0x70, 0x93, 0x43, 0x5B, 0x9C
    DB 0x27, 0x77, 0x36, 0xA7, 0x0F, 0xA8, 0x60, 0x1C, 0xF6, 0x86
    DB 0x8A, 0x05, 0x5B, 0x22, 0x38, 0x67, 0x7A, 0x2B, 0xFB, 0xBD
    DB 0x84, 0x3B, 0xFA, 0x18, 0x73, 0xF0, 0xC4, 0x46, 0xB0, 0x1B
    DB 0x2A, 0xE0, 0xE9, 0x8E, 0x0E, 0x15, 0x27, 0xA9, 0x00, 0xB1
    DB 0xAF, 0x5E, 0x75, 0xF8, 0x7C, 0x7C, 0xD1, 0x7A, 0xF8, 0x04
    DB 0xD9, 0x33, 0xD6, 0xF7, 0xE1, 0xB9, 0xE1, 0x90, 0x3D, 0x71
    DB 0xC7, 0xBB, 0xA0, 0x28, 0x11, 0x37, 0x60, 0x90, 0xDD, 0x61
    DB 0x73, 0x35, 0xDF, 0xDD, 0x42, 0x4F, 0x2B, 0x66, 0x1C, 0xD8
    DB 0x50, 0x63, 0x03, 0x4E, 0x34, 0x1B, 0x06, 0xE2, 0x11, 0x97
    DB 0x7B, 0x07, 0x5A, 0x8B, 0x78, 0x08, 0xDF, 0x43, 0xBD, 0x8E
    DB 0xEF, 0x1F, 0xD9, 0x67, 0x8C, 0xC0, 0xB5, 0xE9, 0xF6, 0x0A
    DB 0x3E, 0xB8, 0x17, 0x47, 0xF8, 0x7E, 0x57, 0x09, 0x46, 0x8D
    DB 0x78, 0xEB, 0xD2, 0xDA, 0x01, 0x16, 0xE6, 0xB6, 0x5A, 0xEB
    DB 0x3B, 0xE7, 0x7E, 0xE2, 0x36, 0xFD, 0xC3, 0x3B, 0xC8, 0xE7
    DB 0xDF, 0x1F, 0xFC, 0x2E, 0x22, 0x88, 0xF8, 0xCA, 0x9A, 0xEE
    DB 0x5B, 0x60, 0x89, 0x9D, 0x52, 0x24, 0x7F, 0x4C, 0xE0, 0xB6
    DB 0xFF, 0xD8, 0xB9, 0x47, 0x81, 0x76, 0x42, 0xC6, 0xF2, 0x24
    DB 0xF7, 0x0F, 0x88, 0x25, 0x5E, 0x1C, 0x08, 0x39, 0xCB, 0xCB
    DB 0xDD, 0x82, 0x6C, 0x5D, 0x37, 0x70, 0x06, 0x7E, 0x3E, 0x08
    DB 0xEB, 0x67, 0x9C, 0x1D, 0xB7, 0xFF, 0xC1, 0x68, 0x42, 0x23
    DB 0xD7, 0xC6, 0xE6, 0x81, 0x15, 0xA2, 0x83, 0x22, 0x91, 0xFF
    DB 0x14, 0xFC, 0x9D, 0xB2, 0x5D, 0xA9, 0xBE, 0xCC, 0xB4, 0xC2
    DB 0x75, 0x33, 0xE7, 0x47, 0xD9, 0x04, 0x7F, 0x55, 0xC9, 0x01
    DB 0xAF, 0xF6, 0x4A, 0x09, 0xC4, 0x5B, 0xE2, 0xC7, 0x3E, 0x6F
    DB 0xDC, 0x29, 0x69, 0x6E, 0x22, 0x68, 0xA5, 0xE0, 0xC9, 0x2F
    DB 0x51, 0x81, 0x95, 0xDB, 0xBD, 0x18, 0xC4, 0xEF, 0x70, 0x2D
    DB 0x6C, 0x55, 0x01, 0x31, 0x6D, 0xED, 0x1F, 0x3E, 0x55, 0x85
    DB 0xF6, 0xDD, 0xD1, 0x3A, 0x05, 0x95, 0x46, 0x94, 0x87, 0x0E
    DB 0x71, 0xC1, 0x94, 0xCB, 0xC4, 0x39, 0x62, 0xE1, 0x12, 0xEE
    DB 0x67, 0x99, 0x0C, 0x36, 0x31, 0x21, 0x77, 0xD1, 0xB7, 0xB1
    DB 0xA7, 0x69, 0xF8, 0x87, 0x32, 0x4B, 0x53, 0xDE, 0x1A, 0x4C
    DB 0x99, 0xC9, 0xA0, 0x92, 0xC1, 0x06, 0xC3, 0xCE, 0x35, 0xB9
    DB 0x48, 0xCB, 0x52, 0x53, 0xD6, 0x6A, 0xE9, 0x9D, 0x7E, 0xFB
    DB 0xEA, 0x3D, 0x9E, 0x7F, 0x58, 0x62, 0x17, 0xAE, 0xB4, 0x06
    DB 0x8A, 0xEE, 0xDE, 0x38, 0x4F, 0xA8, 0x8B, 0x87, 0xFD, 0x03
    DB 0x63, 0x81, 0xA7, 0x43, 0x42, 0xDA, 0x7A, 0x6E, 0xD2, 0x65
    DB 0x8A, 0xDE, 0xA5, 0xEE, 0x41, 0x4C, 0xBC, 0x1B, 0xB5, 0xF5
    DB 0x05, 0xD2, 0x20, 0xA7, 0x04, 0x3A, 0x07, 0x42, 0x28, 0x1B
    DB 0x03, 0xF8, 0x1F, 0xC6, 0x47, 0x39, 0x30, 0xFF, 0x7C, 0x84
    DB 0x7E, 0x90, 0xA3, 0x73, 0xF5, 0xA9, 0xA5, 0x27, 0xBD, 0x44
    DB 0x47, 0xAD, 0xB7, 0xD1, 0x9C, 0x45, 0xE2, 0x71, 0x5D, 0x3D
    DB 0x15, 0xC2, 0x98, 0x57, 0x0B, 0x15, 0x2C, 0xEC, 0x2F, 0xBD
    DB 0x58, 0x2D, 0xC4, 0x6A, 0xE7, 0x26, 0xE4, 0x9E, 0x3C, 0x7C
    DB 0x33, 0x4B, 0x5E, 0xFD, 0xB4, 0xC6, 0xFA, 0x45, 0x07, 0xBA
    DB 0x00, 0x26, 0x76, 0x1A, 0x68, 0x0B, 0x77, 0xF6, 0xCA, 0xB5
    DB 0xED, 0x37, 0x6D, 0x10, 0x58, 0x39, 0xF0, 0x31, 0x92, 0x22
    DB 0xBE, 0x8F, 0xDB, 0x67, 0x92, 0x68, 0x9F, 0xF1, 0x58, 0xA5
    DB 0x99, 0x08, 0xF1, 0x67, 0x07, 0x76, 0x73, 0x8A, 0xF2, 0x0F
    DB 0x3C, 0xCF, 0x6D, 0x58, 0x2B, 0xA8, 0xC6, 0x12, 0x0D, 0xA6
    DB 0xA6, 0x49, 0xA5, 0x57, 0x83, 0xCE, 0x13, 0x4A, 0x42, 0xBB
    DB 0xAF, 0xAE, 0x7D, 0xAC, 0x1D, 0x53, 0x87, 0xBF, 0x01, 0x8D
    DB 0x2B, 0x31, 0x01, 0x22, 0x34, 0x78, 0x59, 0x28, 0xDC, 0xDB
    DB 0x04, 0x1E, 0x93, 0x25, 0xB4, 0xAF, 0x62, 0x1A, 0x8A, 0x55
    DB 0x5E, 0x27, 0x6A, 0x31, 0x41, 0xF6, 0x01, 0xE3, 0xBD, 0x2B
    DB 0xCB, 0x98, 0x56, 0xB2, 0x9F, 0xAD, 0xC8, 0xEC, 0x1B, 0x2F
    DB 0x45, 0xA1, 0x62, 0x99, 0xE5, 0xAC, 0xFA, 0x4D, 0x76, 0x8E
    DB 0xE2, 0xFE, 0x52, 0x71, 0x57, 0xFF, 0xCD, 0x4A, 0x70, 0xAA
    DB 0x1E, 0xDF, 0x64, 0x10, 0x11, 0x0B, 0xD6, 0x15, 0xE2, 0x57
    DB 0xA2, 0x03, 0xF7, 0x6E, 0xD0, 0xE7, 0x90, 0x70, 0xD2, 0x0A
    DB 0x75, 0x1F, 0xCC, 0x43, 0xA7, 0xC4, 0x11, 0x79, 0x05, 0x7F
    DB 0xC4, 0x50, 0xDC, 0xA7, 0xA9, 0x02, 0x47, 0x84, 0xBE, 0x09
    DB 0xF6, 0x09, 0xEE, 0xC9, 0x04, 0x43, 0x85, 0x0A, 0xCA, 0x3B
    DB 0xED, 0x5F, 0x3D, 0x14, 0xAF, 0x70, 0x7B, 0xB0, 0x95, 0xAF
    DB 0x93, 0x1C, 0xF8, 0x31, 0x7D, 0x02, 0xA3, 0x73, 0x4A, 0xD2
    DB 0xCC, 0x11, 0x4B, 0xFF, 0x03, 0xD0, 0x60, 0x4A, 0x99, 0x8E
    DB 0x01, 0x95, 0x0B, 0x82, 0xE6, 0x86, 0xCE, 0x94, 0xA8, 0x38
    DB 0xEE, 0x11, 0x68, 0x96, 0x88, 0xD0, 0xFD, 0x96, 0x7D, 0x06
    DB 0xBD, 0xA5, 0xB7, 0x2A, 0xA6, 0x13, 0xFA, 0x22, 0x0B, 0xBD
    DB 0xEC, 0x99, 0x5C, 0x53, 0xEF, 0xAD, 0xE3, 0x56, 0xED, 0x90
    DB 0xB7, 0xA9, 0x43, 0xFD, 0x28, 0x0F, 0xCE, 0x7D, 0xF5, 0x1D
    DB 0x60, 0x7B, 0x1B, 0x85, 0x53, 0x5B, 0x4C, 0xE9, 0x34, 0x3F
    DB 0x67, 0x1D, 0x48, 0x77, 0xFC, 0x71, 0x94, 0xCC, 0xC4, 0xCD
    DB 0xFE, 0xFC, 0x08, 0xEA, 0x6D, 0xA2, 0x46, 0x40, 0xBB, 0xE2
    DB 0xBA, 0x0F, 0x2B, 0x9F, 0x73, 0xAD, 0x3D, 0xDA, 0x75, 0x60
    DB 0x93, 0x22, 0x47, 0xFF, 0x56, 0x56, 0x34, 0x67, 0xF3, 0x20
    DB 0x18, 0xE1, 0x4F, 0xE4, 0x6C, 0x75, 0xA4, 0x4A, 0x4D, 0x5D
    DB 0x7E, 0x8D, 0xAB, 0x6B, 0xB6, 0xDB, 0xF8, 0xBC, 0x4E, 0x6D
    DB 0x07, 0xF9, 0xE7, 0xD9, 0x93, 0xD8, 0x99, 0x57, 0x23, 0x81
    DB 0x57, 0xFB, 0xEF, 0xFA, 0x03, 0x45, 0xB5, 0xAA, 0xB3, 0xD1
    DB 0xFE, 0xED, 0xCB, 0x09, 0xF1, 0x4C, 0x40, 0x25, 0x7B, 0x2B
    DB 0x7F, 0x30, 0x8E, 0xB7, 0x99, 0xAB, 0x4C, 0x95, 0xD1, 0xA1
    DB 0xED, 0x94, 0xBD, 0xDA, 0x0B, 0x62, 0x5F, 0x39, 0xC4, 0xC8
    DB 0x6F, 0xC5, 0xEE, 0x57, 0x48, 0x04, 0x1D, 0x64, 0x7A, 0xEF
    DB 0xCB, 0x7A, 0xF2, 0x26, 0xFE, 0x13, 0x82, 0x99, 0x7D, 0x87
    DB 0xB2, 0x21, 0x99, 0xE9, 0x12, 0xC3, 0xE3, 0xF5, 0x3D, 0xB5
    DB 0xA7, 0x20, 0x8E, 0x03, 0x52, 0xBB, 0x66, 0xB3, 0x79, 0x77
    DB 0x8C, 0xEE, 0x2E, 0xC9, 0xAF, 0x2D, 0x87, 0x31, 0x11, 0x9F
    DB 0x38, 0xBD, 0x9D, 0x90, 0xD4, 0x3E, 0x05, 0x4D, 0x8B, 0x71
    DB 0xFC, 0x0C, 0x0D, 0x10, 0x99, 0x0E, 0x84, 0xC3, 0x32, 0x02
    DB 0xEC, 0xC9, 0xFE, 0xD5, 0x1F, 0x62, 0x63, 0x93, 0xCC, 0xC5
    DB 0x66, 0x84, 0x03, 0x67, 0xAE, 0x0B, 0x74, 0xCB, 0x4D, 0xBF
    DB 0xE4, 0xCE, 0xBD, 0x7F, 0xE7, 0x4B, 0x8D, 0xE2, 0xAA, 0x91
    DB 0x76, 0xBD, 0xB5, 0x00, 0x61, 0x3E, 0xE2, 0xAC, 0x34, 0xE4
    DB 0xE9, 0xE7, 0x87, 0xB4, 0xC2, 0x9E, 0x7F, 0xB2, 0x08, 0xA9
    DB 0xDD, 0x9C, 0x92, 0xF0, 0x02, 0xCA, 0x30, 0xF8, 0x33, 0xF5
    DB 0x60, 0x93, 0xC1, 0x84, 0x8B, 0xDE, 0x22, 0xA0, 0xBD, 0xAD
    DB 0x10, 0x22, 0x21, 0x80, 0x95, 0xF2, 0xB8, 0x63, 0xB0, 0x6C
    DB 0xCA, 0x87, 0x9F, 0x0B, 0xC8, 0xD7, 0x73, 0xA5, 0x28, 0x1E
    DB 0xEF, 0xA8, 0x11, 0x77, 0x4A, 0x66, 0x64, 0xB9, 0xF1, 0xB1
    DB 0x2A, 0x25, 0xC5, 0x4E, 0xB9, 0xD9, 0x07, 0x73, 0x5D, 0x44
    DB 0x1C, 0x77, 0xE8, 0x42, 0x7C, 0xDA, 0x02, 0xB7, 0x50, 0x8D
    DB 0x45, 0x49, 0x5B, 0x4E, 0xC1, 0xB2, 0xE6, 0xB8, 0x5E, 0x8D
    DB 0x75, 0x1A, 0x8F, 0x7D, 0xD2, 0x71, 0xEE, 0x0E, 0xC8, 0xDC
    DB 0xE8, 0xB6, 0x35, 0x96, 0x53, 0x3F, 0xC2, 0x41, 0xFE, 0x15
    DB 0xA9, 0xCF, 0xA5, 0xAB, 0xD5, 0x73, 0x5A, 0xED, 0x99, 0x93
    DB 0x7F, 0x74, 0x09, 0x36, 0x9A, 0x1B, 0x26, 0x32, 0x1B, 0xD1
    DB 0x35, 0x0E, 0xCB, 0xF2, 0x1C, 0x45, 0x4C, 0x1D, 0xA1, 0x19
    DB 0xC7, 0x12, 0x16, 0xD7, 0x3E, 0x8E, 0xC5, 0xDD, 0x5C, 0x59
    DB 0x27, 0x9D, 0x16, 0xF2, 0xD3, 0xFF, 0x84, 0x47, 0xCD, 0x6A
    DB 0xCD, 0x1F, 0x8D, 0x6B, 0x54, 0x71, 0x95, 0x49, 0xA7, 0xC2
    DB 0xBB, 0x38, 0xAE, 0xF7, 0xE6, 0x7C, 0x20, 0x08, 0xBC, 0xD7
    DB 0x89, 0x24, 0xBA, 0x55, 0x75, 0xDB, 0xAE, 0x31, 0xF6, 0x54
    DB 0x9F, 0x33, 0x7C, 0x9C, 0x24, 0x49, 0x07, 0x04, 0xA3, 0x44
    DB 0x0C, 0x51, 0x3E, 0xF2, 0xB9, 0xC7, 0x30, 0xC6, 0xF6, 0x4C
    DB 0x03, 0x1C, 0x91, 0x3B, 0x81, 0x86, 0xC5, 0xEE, 0x43, 0xA2
    DB 0x62, 0x7E, 0xF4, 0x52, 0xA9, 0x43, 0x58, 0xB2, 0x69, 0x65
    DB 0xA8, 0x48, 0xD4, 0x12, 0x9A, 0xF7, 0x2E, 0xD3, 0xB4, 0xEC
    DB 0x0D, 0x1A, 0x20, 0x60, 0x62, 0x00, 0x67, 0x86, 0x2B, 0x47
    DB 0xDE, 0xF3, 0x6E, 0xA6, 0x6B, 0xC4, 0x81, 0xA4, 0x32, 0x68
    DB 0x77, 0x8C, 0x0E, 0x17, 0x6D, 0x3A, 0x2F, 0x7C, 0x12, 0xA6
    DB 0x9D, 0xD6, 0x54, 0x31, 0x4A, 0xFC, 0xA2, 0x07, 0xA0, 0xC1
    DB 0xF9, 0x00, 0xA2, 0xC7, 0xAC, 0xB9, 0xAA, 0x69, 0x58, 0x70
    DB 0x19, 0x31, 0x03, 0xD8, 0x87, 0xB8, 0xD0, 0xD1, 0x6B, 0xFF
    DB 0x66, 0x22, 0x9B, 0x1D, 0x5C, 0x71, 0xE4, 0x0B, 0xB1, 0x96
    DB 0xE5, 0xA5, 0xA8, 0x7A, 0xEA, 0x56, 0x00, 0x1F, 0x36, 0xAA
    DB 0x98, 0xB3, 0x4A, 0x93, 0x53, 0xF8, 0x87, 0x5C, 0xA6, 0x6F
    DB 0xCF, 0x6E, 0x80, 0xEB, 0xEB, 0x0C, 0x22, 0xFC, 0x51, 0x10
    DB 0x40, 0xD7, 0x66, 0xF3, 0x8A, 0x91, 0xD1, 0x8E, 0xB2, 0xC5
    DB 0xF0, 0x2E, 0x9A, 0xAA, 0xAE, 0xD8, 0xDA, 0xF4, 0x9B, 0xDC
    DB 0x90, 0xA7, 0xC8, 0x11, 0x7A, 0xA4, 0xAC, 0xC8, 0xA6, 0x02
    DB 0x89, 0xCA, 0x3C, 0xB5, 0xB5, 0x44, 0x57, 0xE1, 0x39, 0x1C
    DB 0x8F, 0x7D, 0x31, 0x05, 0x4E, 0x5B, 0x58, 0xF5, 0x0A, 0xC7
    DB 0x6E, 0xC5, 0x66, 0x20, 0xCC, 0xA6, 0x48, 0x97, 0x2F, 0x6D
    DB 0xC0, 0x8E, 0x00, 0xCE, 0x59, 0xD5, 0xDB, 0x3A, 0x89, 0x08
    DB 0x50, 0x24, 0xA9, 0xB4, 0xBF, 0x7F, 0xB0, 0x13, 0xEC, 0xA9
    DB 0x2E, 0x5C, 0x1C, 0x83, 0x68, 0xF1, 0xD8, 0xC1, 0x3D, 0x87
    DB 0xB3, 0x77, 0xE6, 0xF3, 0xCA, 0x18, 0x06, 0x0A, 0xFE, 0x25
    DB 0x42, 0xBE, 0x41, 0xC4, 0x83, 0xBE, 0x5D, 0xCA, 0x1A, 0x3F
    DB 0xC1, 0x0C, 0xC4, 0x65, 0xDA, 0x62, 0x74, 0x04, 0x38, 0x27
    DB 0x96, 0x76, 0x04, 0xF4, 0x09, 0xA1, 0xFB, 0xAE, 0xB8, 0xA5
    DB 0xE4, 0xF1, 0xFE, 0x54, 0x41, 0xD2, 0x86, 0x43, 0xFD, 0x2D
    DB 0x6D, 0x64, 0xDA, 0x55, 0xB7, 0x46, 0xA4, 0xF3, 0xD2, 0x18
    DB 0x7E, 0xFA, 0xDE, 0x66, 0xC0, 0xBF, 0x8E, 0xDB, 0x27, 0x1E
    DB 0x34, 0xD7, 0x1A, 0xD4, 0x3D, 0x43, 0xE5, 0xBA, 0xCA, 0x7F
    DB 0x76, 0x9E, 0x2B, 0xA1, 0xC2, 0x72, 0xA4, 0x9D, 0xE8, 0x19
    DB 0x10, 0xE8, 0xB6, 0x02, 0xE9, 0x67, 0x1B, 0xE8, 0x20, 0x31
    DB 0x49, 0x1D, 0x74, 0xFB, 0x17, 0x05, 0x1B, 0xDB, 0x41, 0x1A
    DB 0x86, 0xC5, 0x89, 0x7C, 0x13, 0x3A, 0x47, 0x48, 0x55, 0x97
    DB 0xEE, 0xA6, 0x9D, 0x95, 0xA1, 0x26, 0x8B, 0xFE, 0x49, 0x14
    DB 0x09, 0xE6, 0xE3, 0xF9, 0xD2, 0xAA, 0x2D, 0xFB, 0x55, 0x70
    DB 0x09, 0x7E, 0xE1, 0xD4, 0x2C, 0x07, 0xEE, 0x5A, 0x2D, 0x67
    DB 0x3D, 0xD9, 0xAC, 0xAD, 0x6B, 0x02, 0x69, 0x39, 0x40, 0x56
    DB 0xC8, 0x0D, 0xC2, 0xB5, 0xB6, 0xC2, 0x39, 0xB3, 0x55, 0xA0
    DB 0xBF, 0xAA, 0xA4, 0xD8, 0xB1, 0x2B, 0x86, 0xF4, 0x27, 0xB5
    DB 0xBF, 0xC1, 0x59, 0xF1, 0x2D, 0x27, 0x32, 0xFB, 0x9D, 0x53
    DB 0x6B, 0x06, 0x2E, 0x90, 0x4D, 0x70, 0xA7, 0x8A, 0xE8, 0x8F
    DB 0x14, 0x2D, 0x27, 0x57, 0xAD, 0xEF, 0x78, 0x3B, 0x74, 0xA7
    DB 0x6C, 0x7E, 0x2A, 0xD8, 0x45, 0x62, 0xA4, 0x78, 0xE0, 0x8A
    DB 0x97, 0x8D, 0xCC, 0x2C, 0x0E, 0xE3, 0xB6, 0x0D, 0x5A, 0xB4
    DB 0x3F, 0xED, 0x28, 0x6D, 0x8A, 0xC9, 0x92, 0xC9, 0x91, 0x8E
    DB 0x5F, 0x23, 0x22, 0xE2, 0x2E, 0xA4, 0x8D, 0x7D, 0xE9, 0x50
    DB 0x45, 0x46, 0xFE, 0x52, 0x3C, 0xF5, 0x9F, 0x15, 0xD5, 0x7E
    DB 0x0C, 0x6A, 0x27, 0xC0, 0x09, 0xCB, 0xA9, 0x2F, 0xDD, 0x34
	
ln_10:  DB 2
    DB 0x4D, 0x76, 0x37, 0x76, 0xAA, 0xA2, 0xB0, 0x5B, 0xA9, 0x5B
    DB 0x58, 0xAE, 0x0B, 0x4C, 0x28, 0xA3, 0x8A, 0x3F, 0xB3, 0xE7
    DB 0x69, 0x77, 0xE4, 0x3A, 0x0F, 0x18, 0x7A, 0x08, 0x07, 0xC0
    DB 0xB5, 0xCA, 0x58, 0xBC, 0x0B, 0x5E, 0xC6, 0xA0, 0x41, 0x73
    DB 0x31, 0xC3, 0x2F, 0x00, 0xB1, 0x7C, 0x35, 0xA0, 0xB1, 0x88
    DB 0x90, 0x61, 0x04, 0x2F, 0x8B, 0x6B, 0xEE, 0x3D, 0xE2, 0x10
    DB 0x0B, 0x94, 0x5B, 0x59, 0xE0, 0xB3, 0xE2, 0x8A, 0x2A, 0x32
    DB 0x44, 0x79, 0xD9, 0x6A, 0x9B, 0x0E, 0xC3, 0x60, 0xC7, 0xEF
    DB 0xBD, 0x9B, 0x3A, 0xC1, 0x2A, 0xCF, 0x1B, 0xE9, 0x45, 0x86
    DB 0xED, 0x27, 0x48, 0x67, 0x1E, 0xEF, 0x29, 0x9E, 0xCD, 0x6C
    DB 0x8D, 0x81, 0x42, 0x16, 0x3A, 0x4C, 0xDA, 0x35, 0x11, 0xE2
    DB 0x71, 0x3D, 0x6C, 0x22, 0xC1, 0x5F, 0x57, 0xB7, 0x88, 0x3D
    DB 0x1A, 0x7A, 0x96, 0x3A, 0x4C, 0x17, 0xA6, 0x07, 0x89, 0x1E
    DB 0x3F, 0x2A, 0xB4, 0xEB, 0xBA, 0x62, 0x73, 0x56, 0xD0, 0xB9
    DB 0xA8, 0x9C, 0x58, 0x66, 0x91, 0xFB, 0x2C, 0x9A, 0x5E, 0x31
    DB 0x75, 0x3F, 0x6C, 0x74, 0xA3, 0xA9, 0x5F, 0x53, 0xF7, 0x03
    DB 0x90, 0x2F, 0xCF, 0x30, 0x78, 0x50, 0x49, 0xA9, 0x15, 0xD9
    DB 0x73, 0x78, 0x9A, 0x0C, 0xE7, 0x6F, 0xD1, 0xFE, 0xA5, 0xB7
    DB 0xAC, 0x9C, 0x41, 0x82, 0xBE, 0x21, 0x21, 0xBA, 0xA6, 0xDD
    DB 0x00, 0x78, 0xF7, 0xF4, 0xF1, 0x45, 0xD2, 0x39, 0xB5, 0xB8
    DB 0xE1, 0x23, 0x23, 0x49, 0x7E, 0xBC, 0x6F, 0x2B, 0xA2, 0x01
    DB 0x1F, 0xC5, 0xEC, 0x36, 0x6D, 0x42, 0xA5, 0x27, 0xAA, 0xAB
    DB 0x7D, 0xA7, 0xA2, 0x97, 0xDD, 0xF8, 0xDD, 0x81, 0x3A, 0x50
    DB 0xE5, 0x83, 0x8E, 0x29, 0x5C, 0x03, 0xFF, 0x78, 0xB6, 0xC6
    DB 0xB5, 0xAF, 0xEF, 0xFF, 0x60, 0x86, 0xE8, 0x29, 0x32, 0xC1
    DB 0x19, 0xB5, 0x86, 0xE9, 0x92, 0x3B, 0xBE, 0x67, 0x23, 0x97
    DB 0xDA, 0x5D, 0x3C, 0xD8, 0xE6, 0x0A, 0x9E, 0x32, 0x91, 0x77
    DB 0x7F, 0x20, 0x25, 0x09, 0x85, 0xE0, 0x64, 0x49, 0xE9, 0xB8
    DB 0xED, 0xC3, 0xF3, 0x68, 0xB5, 0xCC, 0xB5, 0x1E, 0xD7, 0x92
    DB 0xC7, 0x23, 0x03, 0x96, 0x84, 0x2A, 0xA9, 0x98, 0x12, 0x94
    DB 0xC9, 0x3B, 0x0F, 0x72, 0xF1, 0x93, 0xAA, 0x01, 0xB8, 0x66
    DB 0x15, 0x98, 0x7C, 0x74, 0xD9, 0xB0, 0x81, 0x98, 0xE0, 0xD1
    DB 0x35, 0x7A, 0x10, 0xFC, 0x81, 0x90, 0xAE, 0x5C, 0x29, 0x8B
    DB 0x46, 0x39, 0x1E, 0x3D, 0xEF, 0x56, 0x3F, 0x34, 0x20, 0xC9
    DB 0x29, 0xEC, 0xCA, 0x9B, 0x7B, 0xE1, 0x68, 0x17, 0xAD, 0x58
    DB 0xC8, 0xE9, 0x08, 0x7B, 0xD7, 0x82, 0xC0, 0x10, 0x42, 0x82
    DB 0x83, 0x67, 0x09, 0x81, 0xE5, 0x2A, 0x5D, 0xBF, 0xDB, 0xFC
    DB 0xD8, 0xF6, 0xC0, 0x2D, 0xAC, 0xCF, 0xD0, 0xB1, 0x63, 0x7B
    DB 0xE2, 0x8F, 0x14, 0xB7, 0xB5, 0xA6, 0xC4, 0xF7, 0x06, 0x80
    DB 0xDC, 0xC2, 0xD9, 0x49, 0x37, 0x06, 0x30, 0x59, 0xFA, 0x1A
    DB 0x67, 0x5B, 0x48, 0x3A, 0x8B, 0x7B, 0xF4, 0xAF, 0x40, 0x1B
    DB 0xE2, 0xD2, 0xF8, 0x51, 0x68, 0xAB, 0x7C, 0xF3, 0x2E, 0xCC
    DB 0x62, 0x76, 0x92, 0x76, 0xF0, 0x49, 0x87, 0x22, 0xCF, 0x93
    DB 0x6A, 0xB5, 0xA8, 0xDB, 0x3B, 0x32, 0xCB, 0x56, 0xB9, 0x6E
    DB 0x26, 0xFD, 0xD4, 0xBE, 0xD7, 0x7E, 0xCD, 0x4F, 0xFC, 0xC1
    DB 0x97, 0x10, 0x33, 0xF3, 0xBB, 0x20, 0x6F, 0x96, 0xA6, 0xA5
    DB 0x9F, 0xF7, 0x71, 0x5F, 0x12, 0xE0, 0xCC, 0x04, 0x01, 0xAF
    DB 0xC1, 0x89, 0x2D, 0x03, 0xB5, 0xE9, 0x5B, 0x1B, 0x37, 0x36
    DB 0x8B, 0x5B, 0xFA, 0x44, 0xE2, 0x3A, 0x78, 0xF9, 0x22, 0xA4
    DB 0xFD, 0x7D, 0x78, 0xED, 0xBA, 0xD2, 0xE0, 0x71, 0x29, 0x6D
    DB 0x4F, 0x52, 0x7A, 0x9A, 0x39, 0x9A, 0x2B, 0xAA, 0xEA, 0x0F
    DB 0x1F, 0xE3, 0xED, 0x7C, 0x1B, 0x0D, 0x62, 0xB2, 0x3D, 0xC3
    DB 0xEA, 0x76, 0x31, 0x66, 0x31, 0x5D, 0x14, 0x0A, 0xEB, 0xD5
    DB 0x32, 0x5B, 0x21, 0x24, 0x47, 0xC0, 0x12, 0x0B, 0x42, 0x54
    DB 0x68, 0x2B, 0xC0, 0x8A, 0xAE, 0xEA, 0xC2, 0x03, 0xB2, 0x5F
    DB 0xBF, 0x4D, 0x9C, 0x79, 0x38, 0x39, 0x4B, 0xC5, 0x9A, 0xDB
    DB 0x35, 0x73, 0x48, 0x98, 0x37, 0x19, 0xDE, 0x54, 0xB8, 0x78
    DB 0xD2, 0x8F, 0xDE, 0x65, 0x9D, 0xFC, 0xB0, 0x75, 0x23, 0xC4
    DB 0xA5, 0x12, 0xDB, 0x14, 0xAE, 0x84, 0xC1, 0xF9, 0xC1, 0x35
    DB 0x9F, 0xE4, 0x70, 0x40, 0xD7, 0x91, 0x3A, 0x49, 0xF1, 0x8C
    DB 0x0F, 0x3C, 0x4A, 0xFF, 0x8B, 0x34, 0xB8, 0xC7, 0xE3, 0xB9
    DB 0x21, 0x0C, 0xD1, 0x35, 0x46, 0xC3, 0xCD, 0xF6, 0x90, 0xAE
    DB 0x7C, 0x2C, 0x3F, 0x64, 0x4D, 0x3E, 0xCB, 0x67, 0xE0, 0x57
    DB 0x92, 0x43, 0x65, 0x98, 0xA0, 0xFC, 0x8E, 0x58, 0x9D, 0x9B
    DB 0xB3, 0xAA, 0xC7, 0x93, 0xCE, 0xD7, 0xF2, 0x19, 0x1A, 0x04
    DB 0x9F, 0x8A, 0xD8, 0x1B, 0x44, 0x34, 0xE9, 0x17, 0xD2, 0xDA
    DB 0xDD, 0xD8, 0x40, 0xB4, 0xBF, 0x6E, 0xD0, 0x82, 0x03, 0x23
    DB 0xEA, 0x13, 0x43, 0xFE, 0x7D, 0x17, 0x16, 0x2B, 0xBC, 0xE3
    DB 0x6C, 0x90, 0x43, 0xF4, 0x7C, 0x73, 0xAE, 0xB5, 0xCC, 0xEC
    DB 0x8A, 0x05, 0x4B, 0x29, 0x7C, 0xDB, 0x77, 0xCA, 0x76, 0xA9
    DB 0x51, 0x0C, 0xD2, 0xE3, 0x7B, 0xAB, 0xD9, 0x65, 0x39, 0x18
    DB 0x9C, 0x4C, 0x7B, 0x52, 0x16, 0xD1, 0xA8, 0x20, 0x8B, 0x84
    DB 0xA3, 0x6D, 0x1C, 0x72, 0x94, 0xE4, 0xE2, 0xA1, 0x13, 0x0E
    DB 0xFB, 0xDF, 0xCD, 0x48, 0x57, 0x22, 0xCE, 0x0A, 0xF1, 0x38
    DB 0xF9, 0x31, 0xBC, 0x55, 0x8A, 0x17, 0xD5, 0x30, 0x5E, 0xAD
    DB 0x02, 0x3B, 0x32, 0xFD, 0xFD, 0x7B, 0x45, 0xAA, 0xCF, 0xDB
    DB 0x3B, 0x4A, 0x11, 0xB7, 0xD1, 0x5F, 0x85, 0x3E, 0xED, 0x17
    DB 0x67, 0x15, 0x91, 0xAB, 0x52, 0x5E, 0xB1, 0xA5, 0xD2, 0x50
    DB 0x51, 0x77, 0x8C, 0xBA, 0x4E, 0x41, 0xC4, 0xA3, 0x49, 0x8F
    DB 0x54, 0x85, 0xE7, 0xBE, 0xD0, 0x93, 0x59, 0x19, 0x47, 0x5B
    DB 0xAF, 0x03, 0x27, 0xC2, 0xED, 0x60, 0xE9, 0x13, 0x19, 0x04
    DB 0xB2, 0x12, 0x16, 0xEC, 0xA6, 0x99, 0x34, 0xC6, 0x8B, 0x36
    DB 0x4A, 0x55, 0x11, 0xA6, 0x8C, 0xAC, 0x6A, 0xF7, 0xDF, 0xD4
    DB 0x80, 0xB2, 0x92, 0xA9, 0xB2, 0x4C, 0xBA, 0x6D, 0x4F, 0x3C
    DB 0xE1, 0x6A, 0xC4, 0xD8, 0x9D, 0x07, 0xCD, 0x59, 0x77, 0xA7
    DB 0x01, 0x95, 0x80, 0x26, 0x40, 0x72, 0x22, 0xAE, 0xF7, 0x61
    DB 0xD3, 0xBF, 0x3D, 0xCC, 0xFD, 0xD8, 0x6B, 0x50, 0xD7, 0xCF
    DB 0x02, 0x0F, 0xF5, 0xAE, 0x3B, 0x80, 0x2F, 0xBC, 0x47, 0x1F
    DB 0x15, 0x4A, 0xA2, 0x75, 0x63, 0x39, 0x28, 0x87, 0x5C, 0x79
    DB 0x53, 0xC9, 0x05, 0x5F, 0xDB, 0x1F, 0x51, 0x88, 0x8C, 0x5B
    DB 0xA6, 0x25, 0x5B, 0x5D, 0x14, 0x00, 0x9F, 0x7B, 0x2F, 0x4E
    DB 0x63, 0x61, 0x2E, 0x62, 0xCD, 0xA8, 0x1C, 0x93, 0x09, 0x73
    DB 0x6C, 0x8D, 0xDD, 0x83, 0xA4, 0xC9, 0x2D, 0xA1, 0xD4, 0x8F
    DB 0x94, 0x1A, 0x3B, 0x6B, 0x64, 0xCE, 0x48, 0x65, 0xFC, 0x02
    DB 0xE1, 0x4E, 0x8C, 0x9A, 0xCC, 0xC3, 0x11, 0x11, 0x94, 0x4A
    DB 0x4A, 0x58, 0xD2, 0xF0, 0x19, 0xC3, 0x85, 0xDE, 0x01, 0xB7
    DB 0x8C, 0xE3, 0x6B, 0x11, 0x54, 0xDD, 0x24, 0xAB, 0x86, 0x6B
    DB 0x76, 0x0F, 0x3D, 0x14, 0x00, 0x3D, 0x6D, 0x08, 0xEF, 0x39
    DB 0x92, 0x5F, 0x48, 0x27, 0x8C, 0x38, 0x62, 0x84, 0xF2, 0xFC
    DB 0x1A, 0x1D, 0x9E, 0x5C, 0xC4, 0x0F, 0x65, 0x21, 0x4D, 0x9A
    DB 0x05, 0x41, 0xAE, 0xE8, 0xBA, 0x4E, 0xA6, 0x91, 0xF7, 0x56
    DB 0x74, 0xFF, 0xC5, 0xF3, 0x5D, 0x1A, 0x30, 0x81, 0xD6, 0xF9
    DB 0x54, 0xA9, 0x0D, 0x1E, 0xD2, 0x98, 0xE3, 0xBF, 0x52, 0x68
    DB 0xB9, 0x98, 0xFB, 0xC9, 0xF6, 0x66, 0x22, 0x48, 0xC1, 0x6F
    DB 0x06, 0x72, 0x6C, 0xAD, 0x06, 0x79, 0x22, 0xD8, 0xED, 0xD8
    DB 0xDD, 0x44, 0xDE, 0x9D, 0x5D, 0x97, 0x4D, 0x01, 0x77, 0x6C
    DB 0xF3, 0xF6, 0x91, 0xB6, 0x0B, 0x6B, 0xD1, 0xFD, 0xE7, 0x30
    DB 0x78, 0xD8, 0x42, 0xBD, 0xDE, 0xA9, 0x0B, 0x51, 0x1E, 0x37
    DB 0x7B, 0x98, 0x1D, 0x1C, 0xDC, 0x18, 0x94, 0xF6, 0xC3, 0x80
    DB 0xFE, 0xF3, 0xB5, 0xDB, 0x0F, 0x01, 0xA0, 0x1B, 0xED, 0xDA
    DB 0xFD, 0xDF, 0xA7, 0x16, 0x38, 0xF6, 0x94, 0x33, 0x73, 0x54
    DB 0x01, 0xB6, 0xA7, 0x52, 0x8F, 0x4F, 0x0D, 0xBE, 0xC0, 0xDE
    DB 0xAE, 0xAF, 0xD3, 0x4B, 0x39, 0x36, 0x87, 0xE2, 0x2A, 0x36
    DB 0x7D, 0x21, 0xF6, 0x23, 0x5F, 0x3A, 0x65, 0xBB, 0xAD, 0xF9
    DB 0x2A, 0xE5, 0x01, 0xA8, 0xBD, 0xCC, 0xAD, 0x6B, 0x74, 0x92
    DB 0x06, 0x35, 0x82, 0x4D, 0x87, 0xDE, 0xC9, 0xF7, 0xD5, 0xEE
    DB 0xB9, 0x74, 0x1E, 0xF2, 0x92, 0x7E, 0x78, 0x4F, 0x2D, 0x04
    DB 0x6A, 0x25, 0x90, 0x53, 0x4C, 0xE8, 0x9D, 0x40, 0xF0, 0x02
    DB 0xD2, 0x03, 0x26, 0xDB, 0x3F, 0xBE, 0xE3, 0xFD, 0x1A, 0x38
    DB 0xE7, 0x5F, 0x4E, 0x30, 0xB4, 0x6D, 0x9B, 0x5A, 0xD2, 0x6D
    DB 0x57, 0xEF, 0x69, 0xBB, 0x1A, 0x89, 0xB1, 0x96, 0x8A, 0x66
    DB 0x15, 0x82, 0x2C, 0x0D, 0xE1, 0x08, 0x60, 0xA1, 0x68, 0x43
    DB 0xC1, 0xD6, 0x21, 0xF3, 0x54, 0x37, 0xDF, 0x13, 0x3E, 0xE2
    DB 0xF2, 0x31, 0xEF, 0xB8, 0x32, 0xA4, 0x96, 0xEA, 0x0F, 0xF1
    DB 0xA1, 0x31, 0x4B, 0xAF, 0xCF, 0x66, 0xF8, 0x0D, 0xE0, 0x57
    DB 0xF0, 0x52, 0x6D, 0xDB, 0x7B, 0xBC, 0x28, 0xCA, 0x5D, 0x0A
    DB 0x7E, 0xF8, 0xFC, 0xA0, 0x53, 0x14, 0xEA, 0x9F, 0x3E, 0x23
    DB 0x6D, 0x23, 0x2C, 0x50, 0xFA, 0x08, 0x1F, 0x6A, 0xD9, 0x12
    DB 0xE0, 0xD8, 0x94, 0x15, 0x64, 0xFF, 0x9C, 0xFD, 0xE4, 0xEC
    DB 0xD7, 0x9D, 0x2C, 0x72, 0xDA, 0x52, 0xCA, 0x37, 0xDB, 0x4B
    DB 0xB5, 0xFA, 0x56, 0x40, 0x2C, 0x12, 0x9F, 0x8A, 0xBF, 0xDF
    DB 0xA6, 0xA1, 0x16, 0xCC, 0xAC, 0x6E, 0x89, 0xF2, 0x24, 0x18
    DB 0x7F, 0x4A, 0xF8, 0x9A, 0x5A, 0xD3, 0x28, 0x8C, 0x72, 0x51
    DB 0xFE, 0x36, 0xEC, 0x0A, 0x46, 0xC1, 0xE3, 0x28, 0xCF, 0x41
    DB 0xA4, 0x62, 0x0D, 0x98, 0xF7, 0x91, 0x87, 0x8A, 0x5E, 0x45
    DB 0xBB, 0x58, 0x35, 0x92, 0xE2, 0x20, 0x2C, 0xF8, 0x95, 0xEB
    DB 0xCD, 0xBB, 0x5E, 0xD3, 0xFE, 0xC2, 0xC7, 0x6E, 0xDF, 0xBE
    DB 0xF8, 0x55, 0x09, 0x0C, 0xD5, 0x6F, 0x08, 0x50, 0x32, 0x24
    DB 0xC2, 0x47, 0x19, 0x37, 0x37, 0x15, 0x3D, 0x18, 0x17, 0x66
    DB 0xF7, 0x81, 0x00, 0xCC, 0xA7, 0xB1, 0x36, 0x88, 0x3F, 0x71
    DB 0xD6, 0xE0, 0xBE, 0xAC, 0x25, 0xAD, 0xAA, 0xE2, 0x3C, 0x80
    DB 0xB3, 0x99, 0xA3, 0x63, 0x9F, 0xE2, 0x1E, 0xC7, 0xA8, 0xF9
    DB 0xCE, 0x3C, 0xC1, 0x20, 0x0F, 0xB8, 0x94, 0x3E, 0xD6, 0x20
    DB 0xD7, 0x1E, 0xB3, 0x1E, 0x8C, 0xF6, 0x24, 0x76, 0x93, 0x8F
    DB 0xD5, 0x9B, 0x0A, 0x88, 0x42, 0x57, 0x67, 0x32, 0xA5, 0x11
    DB 0x9E, 0x94, 0x93, 0x21, 0x7A, 0x55, 0x8E, 0x1D, 0x51, 0xF6
    DB 0x11, 0x4E, 0xB4, 0x4B, 0x09, 0xC6, 0x87, 0xCD, 0x67, 0xF9
    DB 0x05, 0xE3, 0x6B, 0x40, 0xE8, 0x83, 0xCA, 0x8B, 0x9F, 0x70
    DB 0xFC, 0x7F, 0x1B, 0x38, 0x9F, 0xFA, 0xD8, 0x66, 0x73, 0x55
    DB 0x98, 0xE4, 0x59, 0x3D, 0x37, 0x22, 0xCF, 0xB5, 0x6E, 0xE3
    DB 0x94, 0x40, 0xF9, 0x87, 0xBD, 0xD6, 0x5A, 0xE1, 0x0E, 0x52
    DB 0x54, 0x68, 0xB9, 0x1D, 0x87, 0x1E, 0xCB, 0x05, 0x78, 0xCF
    DB 0xC3, 0x88, 0xF8, 0x13, 0xB1, 0xF6, 0xE7, 0x6E, 0x6A, 0x3E
    DB 0x75, 0x17, 0xB1, 0xD0, 0xD9, 0x7F, 0x99, 0x58, 0x83, 0xDF
    DB 0x0D, 0xCA, 0xC5, 0x5F, 0xEC, 0x6A, 0xF5, 0xCA, 0x36, 0x0E
    DB 0x07, 0x6F, 0x4A, 0x77, 0x72, 0x62, 0xB9, 0x57, 0x3C, 0xF2
    DB 0x06, 0x7E, 0xD3, 0x24, 0x09, 0x73, 0xBB, 0x56, 0xAA, 0x6A
    DB 0x8D, 0x50, 0xD6, 0x99, 0x12, 0x09, 0x0C, 0x75, 0xAC, 0x49
    DB 0x36, 0x30, 0x38, 0xB5, 0x5B, 0x09, 0x53, 0x45, 0xBE, 0x89
    DB 0x9F, 0x1C, 0x8A, 0xD0, 0xC8, 0x9C, 0x6B, 0xFF, 0xC2, 0x75
    DB 0xB3, 0xC9, 0x54, 0x13, 0x05, 0xD5, 0xEB, 0x21, 0x42, 0xA0
    DB 0xD5, 0xF7, 0xB3, 0x65, 0x85, 0x57, 0xC0, 0xF3, 0x5D, 0x61
    DB 0xDB, 0x48, 0x5E, 0x48, 0x60, 0x9B, 0x6C, 0xED, 0x37, 0xEB
    DB 0x2F, 0xEF, 0x25, 0xD6, 0x17, 0x3A, 0x13, 0xC8, 0x1A, 0x7F
    DB 0x2F, 0x66, 0xAD, 0x3F, 0x36, 0xBB, 0xCE, 0x72, 0xE9, 0x1D
    DB 0x0F, 0xE2, 0xE3, 0x7B, 0x74, 0xEA, 0x2C, 0xE5, 0xD3, 0xB1
    DB 0x47, 0xE5, 0x0F, 0xF1, 0x4B, 0xBC, 0x88, 0x0A, 0x04, 0xBF
    DB 0xBC, 0xE6, 0x9B, 0xFA, 0x16, 0x73, 0x2D, 0x4D, 0xE5, 0xD8
    DB 0x72, 0xF7, 0x77, 0x8B, 0xC3, 0xE3, 0x6B, 0xE4, 0xC3, 0x96
    DB 0x81, 0x0A, 0x1A, 0x0B, 0x58, 0x6D, 0xDD, 0xF2, 0x07, 0x74
    DB 0x39, 0x86, 0x87, 0xCC, 0x63, 0x7A, 0x3B, 0xE1, 0x59, 0x6F
    DB 0xF8, 0x6D, 0xC6, 0x43, 0x69, 0xE7, 0xAE, 0x57, 0x74, 0x53
    DB 0x49, 0x38, 0x3E, 0x8A, 0x52, 0x29, 0x6B, 0xD0, 0x31, 0xD4
    DB 0xBA, 0xA3, 0xC3, 0x7E, 0x13, 0x64, 0x06, 0xAF, 0xD2, 0x40
    DB 0x59, 0xC1, 0x9F, 0x7F, 0x05, 0x9C, 0x65, 0xC0, 0xB7, 0xA6
    DB 0x8E, 0x53, 0xB9, 0xEC, 0xDE, 0xDB, 0x17, 0xA7, 0x2F, 0x51
    DB 0x09, 0x1A, 0x00, 0xC0, 0x47, 0x45, 0xF9, 0x73, 0xE9, 0x6A
    DB 0xAF, 0x2F, 0xB0, 0x79, 0xBD, 0x12, 0xE1, 0x6B, 0x2F, 0xC3
    DB 0x0F, 0xB2, 0x28, 0x29, 0xBA, 0x81, 0xC2, 0x40, 0xD3, 0x83
    DB 0xE9, 0x31, 0x3C, 0x9C, 0x3F, 0x29, 0x6B, 0xFF, 0xFF, 0x45
    DB 0x51, 0x68, 0x8B, 0xF5, 0x90, 0xBA, 0xA1, 0xD3, 0x75, 0x76
    DB 0xA5, 0x2B, 0x44, 0xBC, 0x2B, 0x25, 0xC9, 0xE0, 0x3A, 0x14
    DB 0xAF, 0x01, 0xF4, 0x85, 0xC8, 0x3D, 0xA9, 0x1B, 0x65, 0x2F
    DB 0xA0, 0x32, 0x9C, 0xA1, 0x5C, 0x2F, 0x22, 0x61, 0xCB, 0x7A
    DB 0x3D, 0x9F, 0xC5, 0xC2, 0x23, 0xA1, 0xDE, 0x2F, 0xE6, 0xCD
    DB 0xB5, 0xCA, 0x62, 0xB4, 0xF1, 0x8A, 0x20, 0xC4, 0xE2, 0xE3
    DB 0x1B, 0xE3, 0x95, 0x17, 0xEF, 0x2D, 0xE0, 0xC2, 0x6E, 0x6A
    DB 0xCC, 0x23, 0x4D, 0xC4, 0x65, 0xA8, 0x74, 0x9F, 0x4C, 0x0E
    DB 0xCE, 0xBC, 0x4B, 0x01, 0x9B, 0x6E, 0xF9, 0xA6, 0x49, 0x7F
    DB 0x91, 0xA0, 0x4F, 0x20, 0xB5, 0xBF, 0x1A, 0x6C, 0x7B, 0x8C
    DB 0x30, 0xBB, 0x43, 0xC0, 0x51, 0x5A, 0x6F, 0x35, 0xD3, 0x97
    DB 0xDC, 0x31, 0xB1, 0xC8, 0x1B, 0xC0, 0x26, 0xF9, 0x8F, 0x55
    DB 0x53, 0x96, 0x20, 0x1D, 0xF6, 0xB2, 0x72, 0xF7, 0xBD, 0x3B
    DB 0x5F, 0xE1, 0x5F, 0xB0, 0xAB, 0x4C, 0x1F, 0x79, 0xC5, 0x83
    DB 0xF5, 0x88, 0xD8, 0x5E, 0x03, 0xA2, 0x65, 0x4E, 0x6A, 0x1A
    DB 0xAF, 0x8C, 0x7B, 0x1D, 0xDD, 0x7F, 0x59, 0x41, 0x1A, 0x00
    DB 0xA1, 0xF8, 0x79, 0x01, 0x03, 0xBC, 0x82, 0x24, 0x8B, 0xCE
    DB 0x94, 0xD4, 0x97, 0xDA, 0xB1, 0x56, 0x7E, 0x0E, 0xBE, 0x94
    DB 0xA2, 0xBE, 0xE3, 0x16, 0xAA, 0x40, 0x17, 0xE9, 0xA3, 0x3E
    DB 0x77, 0xF3, 0x73, 0x78, 0x02, 0x09, 0xE7, 0xFD, 0xF2, 0x5E
    DB 0x4A, 0x4D, 0xEE, 0x3C, 0x3A, 0xAF, 0x4B, 0x9A, 0xAD, 0x14
    DB 0xD7, 0x56, 0x3E, 0xE8, 0xD4, 0xC6, 0xF2, 0x1D, 0xB6, 0xC2
    DB 0xFD, 0x15, 0x51, 0xA7, 0x99, 0x6C, 0x3D, 0x3C, 0x54, 0x1E
    DB 0xFD, 0x21, 0xBA, 0xC8, 0x59, 0xEA, 0x0B, 0x24, 0xB3, 0xF8
    DB 0x94, 0x73, 0x35, 0xEA, 0xE4, 0x99, 0xE9, 0xF2, 0x6E, 0x12
    DB 0x56, 0x6D, 0x5F, 0xAC, 0x91, 0x6E, 0xBE, 0x2D, 0x3E, 0x9D
    DB 0xD7, 0x9F, 0x26, 0x22, 0xEE, 0xBF, 0x8D, 0x88, 0x55, 0xA8
    DB 0xFB, 0xBE, 0xA8, 0x13, 0xAB, 0x54, 0x32, 0xDD, 0xD5, 0xCE
    DB 0xF7, 0xCA, 0xD8, 0xC9, 0x2A, 0x20, 0x55, 0xEA, 0x6E, 0xB5
    DB 0xB6, 0xFB, 0x9C, 0x90, 0x4B, 0xAF, 0x69, 0x3A, 0xB1, 0x4D
    DB 0xAB, 0xB7, 0x67, 0x22, 0x49, 0xB9, 0xBE, 0xB8, 0x62, 0x42
    DB 0xCE, 0x02, 0x33, 0x55, 0x79, 0x12, 0x7E, 0xA8, 0x1D, 0x53
    DB 0x77, 0x7C, 0x7D, 0xBB, 0x48, 0x7A, 0x81, 0x9F, 0x5B, 0x40
    DB 0x4F, 0xBA, 0xE6, 0x44, 0xC7, 0xC2, 0xF3, 0xD8, 0xBC, 0x58
    DB 0xC7, 0x7E, 0x09, 0xF0, 0x0C, 0x89, 0x34, 0x88, 0xD5, 0xE4
    DB 0x1D, 0xA3, 0x4A, 0xE2, 0x35, 0x6A, 0xE5, 0xED, 0x1A, 0xCE
    DB 0xC3, 0x53, 0xEC, 0xED, 0x35, 0x5D, 0x16, 0xF2, 0xF9, 0xAE
    DB 0x14, 0x82, 0x45, 0x5B, 0x2F, 0x69, 0x92, 0xEF, 0x7C, 0x0B
    DB 0xF0, 0x33, 0xE5, 0x93, 0xE0, 0xF8, 0x4C, 0x89, 0x9B, 0xD6
    DB 0xF7, 0x7E, 0x01, 0x96, 0x6B, 0x8F, 0x4E, 0x96, 0x04, 0x7E
    DB 0xE7, 0xD1, 0x91, 0x34, 0x45, 0xE6, 0x11, 0x47, 0x4A, 0x52
    DB 0xF5, 0x2D, 0x14, 0x6E, 0x50, 0xA0, 0xE0, 0xEB, 0xF9, 0xAA
    DB 0x5D, 0xD4, 0xBC, 0xF3, 0x5F, 0x00, 0x03, 0x47, 0x19, 0xA1
    DB 0x23, 0x34, 0x89, 0x0D, 0x2C, 0x83, 0xDA, 0xA4, 0xF5, 0x68
    DB 0x1C, 0xE0, 0xDC, 0x9D, 0x8B, 0xA6, 0xDE, 0xBB, 0x0F, 0x8D
    DB 0x03, 0xAA, 0xE0, 0xAE, 0x1F, 0x0B, 0x45, 0xED, 0x18, 0x76
    DB 0x18, 0xEB, 0x18, 0xF8, 0xC0, 0x1C, 0x33, 0x2F, 0xD6, 0x60
    DB 0x16, 0x92, 0x41, 0xF1, 0xDC, 0x9B, 0x95, 0x68, 0xE9, 0xA1
    DB 0x24, 0xF4, 0x28, 0xFC, 0x25, 0xDF, 0xB5, 0xDE, 0x42, 0xC7
    DB 0xF9, 0x6E, 0x60, 0xC0, 0x83, 0x0C, 0x83, 0xB7, 0x67, 0x87
    DB 0xF7, 0x5D, 0x75, 0x80, 0x50, 0x5D, 0x9F, 0x15, 0xC7, 0xB5
    DB 0xA1, 0x88, 0x83, 0x6F, 0x06, 0x04, 0x01, 0x4C, 0xE6, 0x8C
    DB 0x99, 0x89, 0x18, 0x19, 0x0A, 0xC1, 0x7A, 0x1E, 0xF1, 0x61
    DB 0x43, 0xB9, 0xD0, 0x89, 0x67, 0x0A, 0x7F, 0xEE, 0x0B, 0xD4
    DB 0xC4, 0x48, 0x10, 0xF2, 0x6D, 0x16, 0x27, 0x06, 0xD5, 0xEC
    DB 0xC4, 0xD0, 0xA4, 0xB7, 0x29, 0xEA, 0x80, 0x33, 0x14, 0x05
    DB 0x68, 0x95, 0x0C, 0x79, 0x54, 0x44, 0xC7, 0xA9, 0x54, 0xA5
    DB 0x60, 0x31, 0xA5, 0x37, 0xBE, 0xE5, 0x5C, 0x8C, 0xF5, 0xDB
    DB 0x10, 0x93, 0x68, 0x36, 0x5F, 0x2A, 0xCF, 0x13, 0x31, 0x2D
    DB 0x6D, 0x1F, 0xBB, 0x03, 0x71, 0x35, 0xCA, 0x3F, 0xCC, 0x42
    DB 0x31, 0x27, 0x88, 0x3E, 0xA8, 0x20, 0x0D, 0x7B, 0x4F, 0x3D
    DB 0x04, 0x8A, 0x8B, 0x07, 0x66, 0x54, 0xB5, 0x14, 0x2C, 0x99
    DB 0xF9, 0x92, 0x56, 0x71, 0x05, 0x29, 0xD1, 0x05, 0x3B, 0x10
    DB 0x06, 0x52, 0xAC, 0x71, 0xB8, 0xA9, 0xA0, 0x2D, 0x34, 0x68
    DB 0xDD, 0x4A, 0x44, 0x75, 0x66, 0xBE, 0x6A, 0x34, 0xEB, 0x55
    DB 0x01, 0x36, 0x8C, 0x36, 0x23, 0xFD, 0x37, 0x59, 0xE0, 0x83
    DB 0xD8, 0xE5, 0xF9, 0x7E, 0x80, 0xDB, 0x26, 0xA5, 0x04, 0x1E
    DB 0xEF, 0xF0, 0x07, 0x55, 0xDE, 0x95, 0x86, 0x6F, 0x55, 0x55
    DB 0x34, 0xA3, 0xDE, 0x95, 0xD1, 0x76, 0x62, 0x19, 0x51, 0x2C
    DB 0x1B, 0xB1, 0x70, 0x09, 0xD8, 0x3B, 0x72, 0x9C, 0xD4, 0x51
    DB 0xC4, 0x95, 0x9D, 0xED, 0xCF, 0x1A, 0xCA, 0x84, 0xFF, 0x5E
    DB 0x8D, 0x1A, 0xA1, 0x50, 0x52, 0x37, 0x62, 0xFC, 0xE0, 0x87
    DB 0xFE, 0x63, 0x70, 0x61, 0x49, 0xF6, 0xBE, 0x41, 0x8F, 0xA7
    DB 0x1E, 0x40, 0xA2, 0x35, 0x12, 0x10, 0xE8, 0x96, 0x23, 0x6F
    DB 0xBF, 0x25, 0x08, 0x30, 0x81, 0xD9, 0x8A, 0x41, 0x88, 0x9D
    DB 0x04, 0xC0, 0xF7, 0x20, 0x59, 0x99, 0xD2, 0xC1, 0x5F, 0x53
    DB 0xDC, 0x73, 0x3C, 0x08, 0x7E, 0x16, 0xD5, 0xF5, 0x38, 0x5B
    DB 0x2C, 0xE3, 0x53, 0x14, 0x92, 0x83, 0xC6, 0x69, 0x3B, 0xD2
    DB 0x17, 0xB3, 0x78, 0xE6, 0xC9, 0x65, 0x30, 0xB4, 0xEB, 0x1C
    DB 0xA2, 0xDA, 0xDB, 0x65, 0x4E, 0x51, 0x88, 0xD9, 0xA9, 0xC6
    DB 0xA0, 0x63, 0x14, 0xE9, 0xCB, 0xC7, 0xF6, 0x52, 0xF1, 0x96
    DB 0x40, 0xCF, 0xA8, 0x44, 0xC7, 0xE0, 0xDC, 0x75, 0xF7, 0xDA
    DB 0x6D, 0xE7, 0xE5, 0xCA, 0x6E, 0xEE, 0x52, 0x3A, 0x5F, 0xA4
    DB 0x03, 0x27, 0x9B, 0xCC, 0xCA, 0xD9, 0x86, 0x6C, 0xA9, 0xCF
    DB 0x42, 0xF4, 0x49, 0x82, 0x26, 0xC2, 0xB6, 0x4F, 0xC6, 0x5A
    DB 0x93, 0xD8, 0xEA, 0xE4, 0xFE, 0xAD, 0x31, 0x91, 0x84, 0x21
    DB 0x16, 0xC5, 0xB7, 0x2A, 0x20, 0x4D, 0x97, 0xD7, 0x04, 0xCB
    DB 0x61, 0xD5, 0xEE, 0xB5, 0x94, 0xE7, 0xB0, 0xA0, 0xC2, 0x9F
    DB 0xCC, 0x27, 0xA6, 0x44, 0x5D, 0x5C, 0xE7, 0x85, 0x3B, 0xEF
    DB 0x66, 0x35, 0xFA, 0x26, 0xF9, 0x40, 0xD6, 0x43, 0xC4, 0xCC
    DB 0x30, 0x39, 0x61, 0x71, 0x52, 0x61, 0xDA, 0x1D, 0x28, 0xE3
    DB 0xFD, 0x68, 0x0C, 0x3D, 0x6A, 0x25, 0x09, 0x5B, 0x63, 0x04
    DB 0x45, 0x42, 0x24, 0xF3, 0x7C, 0xF5, 0xF6, 0x86, 0x2A, 0x45

log_e:  DB 0
    DB 0x6F, 0x2D, 0xEC, 0x54, 0x9B, 0x94, 0x38, 0xCA, 0x9A, 0xAD
    DB 0xD5, 0x57, 0xD6, 0x99, 0xEE, 0x19, 0x1F, 0x71, 0xA3, 0x01
    DB 0x22, 0xE4, 0xD1, 0x01, 0x1D, 0x1F, 0x96, 0xA2, 0x7B, 0xC7
    DB 0x52, 0x9E, 0x3A, 0xA1, 0x27, 0x7D, 0x0A, 0x01, 0x79, 0xF9
    DB 0x49, 0x11, 0xAA, 0xC9, 0x63, 0x23, 0x25, 0x0A, 0x8C, 0x67
    DB 0x1D, 0xEC, 0xFE, 0x9C, 0x6E, 0x5E, 0x37, 0xD1, 0x5C, 0x69
    DB 0x64, 0x66, 0xD3, 0xD9, 0xA1, 0xAB, 0x5E, 0x8C, 0xA4, 0x68
    DB 0x37, 0xFC, 0xA0, 0x03, 0x90, 0x02, 0xC6, 0x0E, 0xE2, 0x6D
    DB 0x32, 0xC5, 0xB0, 0xF5, 0x21, 0x64, 0x26, 0xB5, 0x28, 0x59
    DB 0xB6, 0xF6, 0x97, 0x9B, 0x9C, 0xEA, 0xAA, 0x18, 0x10, 0x95
    DB 0x73, 0x46, 0x02, 0x6A, 0x32, 0x47, 0x66, 0x44, 0xE6, 0x28
    DB 0xFC, 0x9A, 0x6B, 0xCA, 0x6B, 0x27, 0x93, 0xE4, 0xB4, 0x75
    DB 0xD9, 0xFF, 0x20, 0x61, 0x76, 0x6D, 0x8F, 0xB6, 0x68, 0x90
    DB 0xD6, 0xE3, 0x28, 0x63, 0x2F, 0x4A, 0x3E, 0xEB, 0x60, 0x43
    DB 0x8F, 0x3F, 0xB1, 0x64, 0x15, 0x89, 0xC2, 0xA3, 0x37, 0xE6
    DB 0xE2, 0xCC, 0x6B, 0x89, 0x2E, 0xF8, 0x90, 0xA7, 0x2B, 0x2F
    DB 0x15, 0xD2, 0x85, 0xEC, 0x76, 0xDE, 0x05, 0x44, 0xDD, 0xC9
    DB 0x25, 0x4D, 0xD9, 0xBD, 0x46, 0x01, 0x63, 0x93, 0xAA, 0x8B
    DB 0x7E, 0x1D, 0x3E, 0x8E, 0x0B, 0xE6, 0x26, 0x71, 0x02, 0x64
    DB 0xFB, 0x04, 0x33, 0xB4, 0xA1, 0x46, 0xBC, 0x6A, 0xB4, 0x9B
    DB 0x13, 0x0A, 0x58, 0x86, 0xE5, 0xE2, 0x98, 0x69, 0x93, 0x33
    DB 0xBD, 0xFA, 0x95, 0xF0, 0xB3, 0x9B, 0x0F, 0xD7, 0x76, 0x8F
    DB 0x99, 0xB6, 0xB0, 0xA0, 0xC4, 0x24, 0xA9, 0xDD, 0x4F, 0x8B
    DB 0xEF, 0x2B, 0x1F, 0xE8, 0xD8, 0xE3, 0x67, 0x31, 0x7B, 0x4A
    DB 0xEE, 0x29, 0xFD, 0xAC, 0xDD, 0x14, 0x3B, 0x20, 0xD7, 0x69
    DB 0xE0, 0xA5, 0x7A, 0x3F, 0xDD, 0xA0, 0xAE, 0xF3, 0x04, 0x32
    DB 0x08, 0x70, 0x9C, 0x5F, 0x22, 0x84, 0x67, 0x9B, 0xF8, 0x73
    DB 0x2C, 0x84, 0x6A, 0x6C, 0x33, 0x0E, 0x02, 0x3E, 0x59, 0x6E
    DB 0x95, 0x58, 0x75, 0xC9, 0xCE, 0x40, 0xB5, 0xB5, 0xF7, 0x5F
    DB 0x37, 0x2C, 0xA5, 0xD3, 0x5B, 0xC8, 0xFC, 0x04, 0x9D, 0x3A
    DB 0x4E, 0xBA, 0x62, 0xAE, 0x30, 0x21, 0xC0, 0xD0, 0xFE, 0x93
    DB 0xDB, 0xBA, 0x31, 0x86, 0xB9, 0x22, 0x1C, 0x79, 0x3D, 0xBE
    DB 0x90, 0xAE, 0x7A, 0x91, 0x47, 0x3A, 0x51, 0x9E, 0xDA, 0x05
    DB 0x65, 0x76, 0x64, 0x9E, 0x29, 0x81, 0x0D, 0xCE, 0xF9, 0x26
    DB 0xCC, 0x72, 0xF3, 0xDD, 0xD2, 0x19, 0x03, 0xA7, 0x5B, 0x3E
    DB 0xF4, 0x1B, 0xA2, 0x80, 0xD5, 0x48, 0x16, 0x5F, 0x7A, 0x80
    DB 0xE8, 0x36, 0xC7, 0xC0, 0x2F, 0x05, 0xC2, 0x34, 0xA1, 0x2E
    DB 0x16, 0x1A, 0x00, 0x0E, 0x99, 0x9A, 0x42, 0x66, 0x89, 0xB4
    DB 0xA5, 0x66, 0xCF, 0x65, 0x27, 0x28, 0xDD, 0xE8, 0x3B, 0x14
    DB 0x19, 0x06, 0x91, 0x80, 0x25, 0x11, 0x2D, 0x76, 0x35, 0x48
    DB 0x44, 0x10, 0x55, 0xD1, 0x70, 0x23, 0xB6, 0x24, 0xD0, 0x03
    DB 0x2B, 0x98, 0x06, 0x11, 0x12, 0x5C, 0x42, 0x4A, 0xD5, 0x6A
    DB 0x1B, 0x0D, 0x67, 0x7E, 0x85, 0x49, 0x6B, 0xEB, 0xCA, 0xDC
    DB 0xDF, 0xE4, 0xB1, 0x66, 0x8C, 0x67, 0x9E, 0xD4, 0x0C, 0x74
    DB 0x97, 0x6B, 0xB2, 0xF8, 0xD1, 0x15, 0xA1, 0xDF, 0x98, 0x08
    DB 0x06, 0x68, 0x76, 0x03, 0x10, 0xB3, 0x8F, 0x8B, 0x54, 0x5B
    DB 0x84, 0x76, 0x44, 0xC5, 0xE7, 0xC2, 0xC0, 0x8E, 0x61, 0xCA
    DB 0x09, 0x83, 0xE2, 0x42, 0x92, 0x4D, 0x37, 0xE8, 0xAC, 0xEA
    DB 0x10, 0x93, 0x01, 0x24, 0x56, 0x98, 0x8A, 0x1A, 0x1B, 0xCD
    DB 0x63, 0x9F, 0x5D, 0xB6, 0x0F, 0xDC, 0xF6, 0x81, 0xBE, 0x0E
    DB 0x70, 0x29, 0x2D, 0x19, 0x32, 0x9A, 0x47, 0xB9, 0xEC, 0xCD
    DB 0x41, 0x1F, 0xD8, 0x47, 0x5C, 0xBC, 0x68, 0xCA, 0xE2, 0xD2
    DB 0xAC, 0xAD, 0xB2, 0xF1, 0x7C, 0x9E, 0x51, 0x7D, 0xF1, 0xD7
    DB 0xBF, 0x9D, 0x43, 0xDD, 0x2C, 0xFD, 0x93, 0x81, 0xB7, 0x46
    DB 0x93, 0xE7, 0xED, 0x8A, 0xC7, 0xC3, 0x0A, 0xF3, 0xDF, 0x28
    DB 0x3A, 0x5B, 0x58, 0xF5, 0x2B, 0x26, 0xD3, 0xDD, 0x50, 0x0F
    DB 0xF2, 0x06, 0xD7, 0xC6, 0x40, 0x54, 0x56, 0x8B, 0x18, 0xED
    DB 0xFD, 0x70, 0x52, 0xB9, 0xA7, 0x6A, 0x15, 0xCC, 0x70, 0x8F
    DB 0x90, 0x76, 0x66, 0x8F, 0xBB, 0x60, 0xE8, 0x19, 0x9C, 0xD8
    DB 0xFF, 0x32, 0x0F, 0x23, 0x00, 0xE8, 0xA6, 0x60, 0x8A, 0x5F
    DB 0x5B, 0x2E, 0xEE, 0x18, 0x20, 0xA5, 0x46, 0x5A, 0x51, 0xEF
    DB 0x86, 0x5B, 0x64, 0xA2, 0x9E, 0x42, 0x0A, 0x3A, 0xD1, 0x3F
    DB 0x9A, 0x29, 0x2F, 0xC7, 0x25, 0x18, 0x61, 0xFA, 0x95, 0x4E
    DB 0x37, 0xE0, 0x83, 0xF6, 0x8E, 0xD1, 0x15, 0xC3, 0xEC, 0x75
    DB 0xD8, 0x0C, 0xA2, 0x32, 0x8C, 0xA9, 0x14, 0x8E, 0x1B, 0x21
    DB 0xF2, 0xDF, 0x67, 0x7E, 0x91, 0x72, 0x79, 0x46, 0xA8, 0x68
    DB 0x88, 0x2E, 0x1E, 0xCF, 0x45, 0x2D, 0xC7, 0xF9, 0x03, 0x9D
    DB 0x30, 0x25, 0xD8, 0xF4, 0xBF, 0x17, 0x66, 0x5B, 0x3F, 0xFB
    DB 0x12, 0xCC, 0xFA, 0x79, 0xA4, 0xBB, 0x88, 0x23, 0x21, 0x4A
    DB 0x65, 0x02, 0x1F, 0xA5, 0x40, 0x5D, 0x51, 0xB4, 0xD4, 0x16
    DB 0xFE, 0x42, 0xC2, 0xCD, 0x36, 0x84, 0x3A, 0x3E, 0xE4, 0xF6
    DB 0x37, 0xD4, 0xF7, 0xF9, 0xD1, 0x09, 0x93, 0x36, 0x3E, 0xCD
    DB 0x39, 0xE3, 0xA8, 0x37, 0xC8, 0xA9, 0x5C, 0xD3, 0xA8, 0xA9
    DB 0x63, 0x2A, 0x62, 0x47, 0xD7, 0x75, 0x34, 0xF3, 0x07, 0xE1
    DB 0xF8, 0x3C, 0xBB, 0xA7, 0xC9, 0x23, 0x8D, 0x5B, 0xDD, 0xA3
    DB 0x76, 0x66, 0x88, 0x0B, 0x22, 0x1B, 0x2F, 0x8C, 0x74, 0xB3
    DB 0x74, 0x7C, 0xDD, 0x0D, 0x7D, 0x53, 0x9A, 0x0B, 0x4D, 0x36
    DB 0xF0, 0xB0, 0xCB, 0x3D, 0x64, 0x58, 0x8E, 0xCE, 0x95, 0x84
    DB 0xF0, 0x3E, 0x8D, 0x22, 0xE2, 0xA3, 0x5A, 0xAA, 0xAA, 0x1C
    DB 0x57, 0xBE, 0x3C, 0x02, 0xD3, 0x72, 0x15, 0x0E, 0xE5, 0x7F
    DB 0x5B, 0x83, 0x66, 0xF1, 0xAD, 0x83, 0xCA, 0x01, 0x39, 0x4A
    DB 0x23, 0xBB, 0xED, 0x5C, 0x03, 0xB3, 0x3F, 0x00, 0x6E, 0x74
    DB 0xD9, 0x1D, 0x8D, 0xA0, 0x79, 0xA9, 0xFA, 0xFB, 0x39, 0x90
    DB 0x8B, 0xF2, 0xDA, 0x8D, 0x02, 0x0E, 0x86, 0x21, 0x22, 0x4B
    DB 0x9A, 0x36, 0x8C, 0xDB, 0x60, 0x23, 0x96, 0x2C, 0x25, 0x4A
    DB 0x69, 0x0D, 0x76, 0xE4, 0x85, 0x31, 0x51, 0x0A, 0x45, 0x41
    DB 0x89, 0x62, 0x1B, 0x61, 0x94, 0x7C, 0x15, 0xED, 0xA1, 0x8F
    DB 0xF9, 0x48, 0xF0, 0xF0, 0x26, 0x5A, 0x61, 0x8E, 0x06, 0x31
    DB 0xB3, 0x44, 0x57, 0xE8, 0x01, 0x59, 0xCB, 0x44, 0x09, 0x81
    DB 0xAF, 0x4E, 0x75, 0x14, 0x4E, 0xBB, 0x42, 0x75, 0xBB, 0x4F
    DB 0xB1, 0x30, 0xE6, 0x12, 0xF8, 0xAA, 0x50, 0xBE, 0x62, 0xB7
    DB 0x8D, 0xEE, 0x6A, 0x56, 0xBA, 0x95, 0x73, 0xBE, 0xD3, 0xB2
    DB 0xF7, 0xBD, 0x6B, 0x85, 0xF2, 0xC6, 0x87, 0xD7, 0x2C, 0xDA
    DB 0x4D, 0x96, 0x12, 0x70, 0x38, 0x30, 0xBF, 0x92, 0xBB, 0x84
    DB 0x7C, 0x8A, 0xC6, 0xA8, 0x15, 0x7C, 0x1E, 0x5C, 0x28, 0x9C
    DB 0xB5, 0xCE, 0xB0, 0x01, 0xFE, 0x67, 0xF2, 0x5C, 0x8D, 0xDE
    DB 0xC9, 0xDF, 0x12, 0xB3, 0x77, 0xBC, 0x75, 0x3E, 0x25, 0x19
    DB 0xD6, 0xD2, 0x1E, 0xEB, 0x6F, 0x61, 0x53, 0xA9, 0x4B, 0x6C
    DB 0xD8, 0x36, 0xE4, 0xBE, 0x1E, 0x97, 0x05, 0xD0, 0x97, 0xDB
    DB 0xED, 0x94, 0x5C, 0xE0, 0x75, 0x83, 0x62, 0xAA, 0xB8, 0x4C
    DB 0x5D, 0xC5, 0xF4, 0xDF, 0xEB, 0x3B, 0x72, 0x15, 0xB7, 0x9E
    DB 0x46, 0x92, 0x87, 0x32, 0xC4, 0x13, 0xCF, 0x89, 0xE9, 0xF2
    DB 0xDE, 0xF7, 0xAB, 0x95, 0x27, 0xE0, 0x26, 0x6D, 0x80, 0x7D
    DB 0x20, 0x70, 0x15, 0xBA, 0x16, 0x35, 0x00, 0xB8, 0x4F, 0x9B
    DB 0xEC, 0x33, 0x26, 0x5E, 0x9F, 0x98, 0x03, 0xCA, 0x87, 0xA4
    DB 0x4F, 0xC2, 0xD8, 0x14, 0x43, 0x31, 0x09, 0xB8, 0x8B, 0x82
    DB 0xBF, 0x5A, 0x74, 0x83, 0x47, 0xD5, 0xEB, 0x59, 0xB3, 0x90
    DB 0x86, 0x63, 0x98, 0xDD, 0x87, 0x62, 0x4D, 0x36, 0x62, 0x34
    DB 0x30, 0x38, 0x48, 0xD9, 0xD8, 0x5B, 0x03, 0x9F, 0x39, 0xA1
    DB 0xB1, 0xB4, 0x1A, 0x40, 0xC1, 0x80, 0xCB, 0x26, 0xE8, 0xDF
    DB 0xB7, 0xB2, 0x2F, 0x91, 0xD7, 0xD7, 0x5D, 0xEE, 0xFD, 0x1C
    DB 0x37, 0xFB, 0x9B, 0x28, 0x81, 0xAA, 0x4C, 0xC0, 0x8D, 0xDD
    DB 0xB3, 0xA3, 0xB3, 0x79, 0x13, 0xD3, 0x5F, 0xCC, 0xFE, 0x35
    DB 0x41, 0xA5, 0x32, 0x2F, 0x0A, 0x18, 0x80, 0xFF, 0x62, 0x92
    DB 0x1F, 0xC4, 0x82, 0x22, 0x91, 0x2F, 0x12, 0xB4, 0x22, 0x4D
    DB 0xE6, 0x2C, 0x10, 0x4C, 0xBE, 0x2E, 0xF3, 0x79, 0xFC, 0x19
    DB 0x5F, 0xE8, 0x9A, 0x63, 0x2B, 0xE4, 0x63, 0x16, 0x74, 0x21
    DB 0xB7, 0xE5, 0x3A, 0xB0, 0x0A, 0x9F, 0xEC, 0xCC, 0xA0, 0xF8
    DB 0x08, 0x53, 0xA7, 0x0C, 0x31, 0x71, 0xA3, 0xAF, 0xE3, 0x52
    DB 0x79, 0xB9, 0x19, 0x29, 0x41, 0xEB, 0x24, 0x3C, 0xA1, 0xA9
    DB 0x07, 0x26, 0xF2, 0xA9, 0x79, 0x36, 0x4E, 0x84, 0x91, 0x42
    DB 0x6C, 0x23, 0x55, 0x31, 0x30, 0x00, 0xEF, 0xF3, 0x47, 0x94
    DB 0xE5, 0xC5, 0x44, 0x7B, 0x58, 0x7E, 0xAF, 0x3D, 0x32, 0xD6
    DB 0x4E, 0xAF, 0xD8, 0x74, 0x8D, 0xC3, 0xFF, 0x9E, 0x23, 0xE0
    DB 0x08, 0x5C, 0x98, 0xD7, 0xD2, 0x8B, 0x80, 0x9F, 0x94, 0x0C
    DB 0xD8, 0xAC, 0xD7, 0xE3, 0x54, 0xE6, 0xF4, 0x09, 0xD0, 0x06
    DB 0x61, 0xA9, 0x82, 0xAE, 0x93, 0x32, 0xC1, 0xE1, 0x5B, 0x90
    DB 0xDD, 0xB8, 0xA9, 0x8E, 0xFE, 0x6E, 0x84, 0xEB, 0x72, 0x21
    DB 0x31, 0xCA, 0xAD, 0xB0, 0x10, 0xF3, 0x78, 0xE9, 0x93, 0x22
    DB 0x9B, 0x02, 0xF5, 0x53, 0x61, 0xAC, 0xBD, 0xE0, 0xAD, 0xCC
    DB 0x69, 0x07, 0xB4, 0x7E, 0xA0, 0x7E, 0x98, 0xC3, 0x21, 0x59
    DB 0x31, 0x56, 0x7C, 0xAC, 0x7D, 0x42, 0x34, 0xCE, 0x46, 0xBF
    DB 0xE1, 0xF6, 0xEC, 0xA0, 0xF1, 0xE0, 0xD9, 0x20, 0x11, 0x68
    DB 0x9F, 0x98, 0xD2, 0xED, 0x46, 0xCF, 0xC9, 0xEF, 0x99, 0x18
    DB 0xA7, 0xA6, 0x53, 0xCC, 0x49, 0x73, 0x78, 0xC8, 0x87, 0xA7
    DB 0xD0, 0xA4, 0xD7, 0xD9, 0xDD, 0x13, 0xB4, 0xA6, 0xEC, 0x9F
    DB 0x2B, 0x6E, 0x24, 0x56, 0x65, 0x76, 0x4A, 0xC3, 0xF5, 0x4D
    DB 0x9D, 0x34, 0x4F, 0x8C, 0xBF, 0xFF, 0x6C, 0x0B, 0xD0, 0xE5
    DB 0x2C, 0xB4, 0x40, 0x76, 0x27, 0x3E, 0x6F, 0x15, 0x78, 0xE7
    DB 0x2C, 0x17, 0xB2, 0x16, 0x26, 0x56, 0xA8, 0x23, 0xE1, 0x94
    DB 0xF2, 0x83, 0xAA, 0x79, 0x62, 0xC2, 0xAF, 0xD3, 0x24, 0xDE
    DB 0xA0, 0x75, 0xAC, 0x42, 0x2B, 0x7B, 0xAC, 0xC5, 0x69, 0x91
    DB 0xB3, 0x8A, 0xAB, 0x8B, 0xFE, 0x2C, 0x80, 0x4E, 0xE7, 0x46
    DB 0x75, 0x33, 0x7E, 0x69, 0xEF, 0xE6, 0x9A, 0x1D, 0x84, 0xFD
    DB 0xD9, 0x41, 0xEF, 0xB8, 0xBB, 0x13, 0xEA, 0x1B, 0x1E, 0x21
    DB 0x1F, 0x74, 0xCD, 0xB1, 0x91, 0x63, 0x13, 0xBB, 0xB5, 0x23
    DB 0x39, 0x8E, 0xB7, 0xC5, 0x13, 0x5B, 0x11, 0xF0, 0x90, 0x79
    DB 0x07, 0x29, 0xDA, 0x4D, 0x46, 0x4B, 0x9D, 0xF6, 0x8A, 0xC4
    DB 0x72, 0x88, 0xA2, 0x5B, 0xA3, 0xFB, 0x95, 0x39, 0x6F, 0xFC
    DB 0x6C, 0x76, 0x98, 0x43, 0x9C, 0x3E, 0xC8, 0xAA, 0x99, 0xC7
    DB 0x1B, 0x8B, 0x8B, 0x33, 0x9A, 0x0A, 0x21, 0x96, 0x69, 0x5F
    DB 0xC4, 0x8E, 0x6E, 0x4B, 0x66, 0x8B, 0x01, 0x77, 0x3F, 0x8C
    DB 0x8F, 0x09, 0xF2, 0x9E, 0xCE, 0x9C, 0xC2, 0x94, 0x46, 0x4D
    DB 0xF0, 0x36, 0xCE, 0x3B, 0xC0, 0x4A, 0xDC, 0x8A, 0xF6, 0xBE
    DB 0xB5, 0x0E, 0xEE, 0x68, 0x8C, 0xDC, 0xF8, 0x04, 0xA1, 0x13
    DB 0x97, 0xBC, 0x3B, 0x06, 0x4A, 0x8F, 0x4C, 0x64, 0xBA, 0x0D
    DB 0xCC, 0x44, 0xEB, 0x3F, 0xF1, 0x86, 0x6D, 0x64, 0x63, 0xA9
    DB 0x35, 0x78, 0xE0, 0x8F, 0xB9, 0x7D, 0xC1, 0xB7, 0x1D, 0x23
    DB 0x90, 0xBC, 0x37, 0x36, 0x05, 0x99, 0x21, 0x37, 0x8D, 0xE6
    DB 0x29, 0x89, 0x50, 0x30, 0x57, 0xF8, 0xBE, 0xB3, 0x24, 0x98
    DB 0x0C, 0x21, 0xE1, 0x32, 0xD1, 0x7F, 0xE8, 0x58, 0xE7, 0x42
    DB 0x88, 0x70, 0x05, 0x66, 0x7C, 0xD2, 0x6B, 0x34, 0x46, 0xA9
    DB 0xF2, 0x68, 0x00, 0x25, 0x69, 0xF9, 0x68, 0xA6, 0xAE, 0xE4
    DB 0x07, 0x73, 0xC6, 0xCE, 0x45, 0xB3, 0x66, 0xA5, 0x50, 0x5E
    DB 0x13, 0x54, 0xAF, 0x29, 0xB4, 0x25, 0xC2, 0x25, 0x04, 0x3C
    DB 0x16, 0xBC, 0xA2, 0x22, 0x6A, 0xD9, 0x40, 0xA6, 0xE9, 0xE1
    DB 0x4C, 0x75, 0xF1, 0xC5, 0x8A, 0x3F, 0xDB, 0x99, 0x28, 0xA9
    DB 0x17, 0x85, 0xF1, 0xAC, 0xB1, 0x71, 0x69, 0x1A, 0x92, 0xFB
    DB 0x5B, 0xC6, 0x7C, 0x2E, 0x0C, 0x76, 0x7E, 0x1F, 0x27, 0x61
    DB 0xF7, 0xA1, 0xF4, 0x00, 0xEB, 0x0C, 0xF2, 0x87, 0x44, 0x19
    DB 0x34, 0x43, 0x23, 0xFF, 0x00, 0x2F, 0x0A, 0x25, 0xA9, 0xF4
    DB 0x10, 0x47, 0x9E, 0x51, 0x5C, 0xFC, 0x9A, 0x2D, 0x53, 0xA8
    DB 0xAD, 0x18, 0x5A, 0xFE, 0x05, 0x86, 0x7D, 0x2C, 0x9A, 0xEE
    DB 0x59, 0xCF, 0x23, 0x2F, 0xB5, 0xB2, 0x8D, 0x09, 0xFC, 0x64
    DB 0x6B, 0x91, 0xE8, 0x9F, 0xDC, 0x45, 0x80, 0xFF, 0xA7, 0xD7
    DB 0xB1, 0x18, 0xF4, 0x1D, 0x18, 0x26, 0xBE, 0x94, 0x1F, 0xE9
    DB 0xCF, 0x5B, 0xEC, 0xCD, 0x9C, 0x19, 0x50, 0x52, 0x9D, 0xED
    DB 0x5F, 0x88, 0x80, 0x10, 0xBE, 0xB8, 0x19, 0x3F, 0x0E, 0xE4
    DB 0x8D, 0x68, 0x6B, 0xC0, 0x36, 0x0F, 0x28, 0x3B, 0xFB, 0xCA
    DB 0xDB, 0x6F, 0x55, 0xBA, 0x06, 0xF1, 0x76, 0x4C, 0xE1, 0x29
    DB 0x2E, 0x81, 0x88, 0xF3, 0xDE, 0xCE, 0x91, 0xE1, 0x6E, 0xB4
    DB 0x59, 0xFE, 0x8D, 0x25, 0x55, 0x02, 0x7D, 0x3A, 0x7C, 0x23
    DB 0x6F, 0x1C, 0x16, 0xA6, 0x7B, 0x0E, 0x28, 0x96, 0xEA, 0xE8
    DB 0xB9, 0xE4, 0xCD, 0x13, 0x36, 0xF3, 0xF5, 0xA5, 0x67, 0xEF
    DB 0x2F, 0xFF, 0xFF, 0xE1, 0x5A, 0x48, 0xEC, 0xF0, 0xB0, 0xFC
    DB 0xCB, 0x82, 0x86, 0xFF, 0x49, 0x74, 0xE8, 0x5B, 0xB5, 0x9E
    DB 0x28, 0x8B, 0x32, 0x5E, 0xC9, 0x76, 0x32, 0x16, 0xB3, 0xCD
    DB 0x96, 0xA0, 0x19, 0xBC, 0xFF, 0xC1, 0xD0, 0x2C, 0x7E, 0x37
    DB 0x01, 0x60, 0x51, 0x0E, 0xF0, 0xC0, 0x91, 0x93, 0x5E, 0x22
    DB 0x03, 0xCD, 0x13, 0xEF, 0x18, 0x58, 0xA3, 0x8F, 0x07, 0xE6
    DB 0xAC, 0xFA, 0xAE, 0x53, 0x29, 0x54, 0x9F, 0x58, 0xB0, 0xDF
    DB 0x57, 0x44, 0xD3, 0xB5, 0x83, 0xBA, 0xBA, 0x3A, 0x7D, 0x47
    DB 0x00, 0x34, 0x58, 0x41, 0x93, 0x4D, 0xA9, 0x80, 0x77, 0x3E
    DB 0xF2, 0xDE, 0x40, 0xE5, 0x93, 0x21, 0x61, 0xF2, 0xD8, 0xCD
    DB 0xC6, 0x72, 0x56, 0x68, 0x37, 0x3C, 0xC2, 0x1E, 0xAD, 0x30
    DB 0x7E, 0x70, 0xA9, 0xBD, 0x50, 0x2F, 0xB4, 0xB2, 0xD4, 0xD8
    DB 0x29, 0x1D, 0x3F, 0x25, 0x0B, 0xD7, 0x7F, 0xE9, 0x5F, 0x2E
    DB 0x90, 0x2F, 0x97, 0xF3, 0x79, 0xB8, 0xD0, 0x9E, 0x6D, 0x72
    DB 0x10, 0xCA, 0xBE, 0x1E, 0x53, 0xB7, 0xE4, 0x49, 0x35, 0x21
    DB 0xC8, 0x10, 0x63, 0x18, 0x7C, 0x8B, 0x26, 0x12, 0x6F, 0xB1
    DB 0xB3, 0x2A, 0x6D, 0xFC, 0xA5, 0xF1, 0x66, 0x2F, 0x4C, 0xDB
    DB 0x32, 0x1C, 0xBB, 0x80, 0x6A, 0x69, 0x21, 0xF4, 0xB7, 0xAE
    DB 0x46, 0x81, 0x23, 0x06, 0xC2, 0x6F, 0xC6, 0xB9, 0x8C, 0x5C
    DB 0x87, 0xD6, 0xB8, 0x80, 0x69, 0x36, 0xF2, 0xEF, 0xF0, 0x71
    DB 0x2C, 0x44, 0x76, 0x0F, 0xF7, 0x81, 0xD7, 0x02, 0xC5, 0x40
    DB 0x84, 0x54, 0xFE, 0x72, 0xFC, 0xD7, 0x10, 0x5E, 0x42, 0xCD
    DB 0xE5, 0xD5, 0x03, 0x08, 0x7F, 0x75, 0x62, 0xC0, 0x76, 0xE7
    DB 0xD4, 0x59, 0x02, 0x5E, 0x7A, 0xF8, 0x49, 0xF1, 0xD6, 0xA9
    DB 0x0A, 0xBF, 0xB2, 0xD9, 0xCF, 0x96, 0x7E, 0x2B, 0xC1, 0xA6
    DB 0xD1, 0x11, 0xAE, 0xAF, 0xC2, 0x8C, 0x34, 0x47, 0x15, 0x46
    DB 0xCF, 0x4C, 0xB3, 0x31, 0x21, 0xA0, 0xE7, 0x74, 0x42, 0xB3
    DB 0x86, 0x9A, 0xED, 0x1E, 0xD4, 0xE1, 0x6B, 0xDE, 0xA6, 0x4F
    DB 0xEF, 0x57, 0x6F, 0x00, 0x49, 0x48, 0x1F, 0x09, 0x6D, 0x74
    DB 0x53, 0x07, 0x66, 0xC1, 0x83, 0x87, 0xC7, 0xE5, 0x85, 0x74
    DB 0x21, 0xF2, 0x79, 0x4E, 0x93, 0x65, 0xE0, 0xC6, 0xBD, 0x79
    DB 0x7D, 0xE3, 0xAC, 0xBC, 0x2A, 0xD7, 0x2D, 0xD7, 0xBD, 0x69
    DB 0x58, 0x65, 0x33, 0xAF, 0xA6, 0xFD, 0xD0, 0xD9, 0x89, 0xFE
    DB 0x07, 0xEE, 0xF8, 0x79, 0xCB, 0x7F, 0xD2, 0x57, 0xFA, 0x7D
    DB 0x6E, 0x57, 0x9C, 0x97, 0xD0, 0x21, 0xC5, 0x6C, 0xB6, 0x45
    DB 0x7D, 0xF5, 0x90, 0x6E, 0x76, 0x8F, 0x44, 0xC3, 0x91, 0xF5
    DB 0xCC, 0xC7, 0x64, 0x5E, 0x64, 0x2A, 0x40, 0xB1, 0x23, 0x2B
    DB 0x07, 0x66, 0x5E, 0x68, 0x6D, 0x56, 0x22, 0x6D, 0xB6, 0xAC
    DB 0x21, 0xA3, 0xED, 0xEA, 0x32, 0xE9, 0xDA, 0xCC, 0x8B, 0xC3
    DB 0xA8, 0x95, 0x75, 0x8A, 0x30, 0xBD, 0x39, 0xBD, 0x42, 0x58
    DB 0x46, 0xA1, 0x05, 0x0C, 0x79, 0x89, 0x11, 0x0E, 0x80, 0x4C
    DB 0x20, 0x1D, 0x0D, 0x8C, 0x87, 0x9E, 0x4E, 0xC6, 0x2C, 0xD9
    DB 0x73, 0xD8, 0x4C, 0xEC, 0x03, 0x10, 0xE5, 0x61, 0xF7, 0xE2
    DB 0xAB, 0x1A, 0x43, 0xCF, 0xC0, 0xDD, 0x60, 0xE6, 0xF2, 0xC2
    DB 0x70, 0x24, 0x8E, 0xDD, 0x77, 0xEF, 0x94, 0x75, 0x08, 0xB9
    DB 0x6F, 0x9C, 0x4A, 0x98, 0x4A, 0x1D, 0xC8, 0xF8, 0x40, 0x9A
    DB 0xC7, 0xFD, 0x5E, 0x97, 0x7E, 0x88, 0xBC, 0xF6, 0xDF, 0xCA
    DB 0xD4, 0x6B, 0xC0, 0xDB, 0x82, 0x35, 0x9E, 0x49, 0x50, 0x75
    DB 0xB1, 0xED, 0x80, 0xF0, 0x02, 0x52, 0x4E, 0xE0, 0x97, 0xB0
    DB 0xB4, 0x64, 0x82, 0x40, 0xB2, 0x0F, 0xD4, 0x66, 0x12, 0xB7
    DB 0x99, 0x98, 0x0B, 0xD6, 0x4B, 0xEE, 0xC5, 0x72, 0x19, 0xF4
    DB 0xCD, 0x79, 0xAE, 0xF4, 0xCD, 0xBA, 0xE9, 0x46, 0xF1, 0x84
    DB 0x43, 0xF3, 0xDA, 0xF6, 0xA9, 0x1E, 0xBB, 0xCD, 0xA0, 0xC1
    DB 0xAA, 0xFE, 0x11, 0xA4, 0x04, 0x0D, 0xB2, 0x2F, 0xA2, 0x29
    DB 0x7A, 0x8A, 0x8B, 0x63, 0xE6, 0x91, 0x19, 0x7D, 0x79, 0x63
    DB 0x44, 0xC9, 0x4B, 0xC9, 0x71, 0x69, 0x17, 0x08, 0x64, 0x1C
    DB 0x73, 0xFA, 0xD6, 0xC4, 0x0F, 0x0C, 0x5C, 0x4E, 0x29, 0x0F
    DB 0x27, 0x2D, 0x3C, 0xBF, 0xFE, 0xFC, 0x74, 0x7D, 0xE0, 0xB2
    DB 0x29, 0x79, 0x7D, 0xFB, 0x13, 0xFD, 0x2C, 0xD5, 0x76, 0x77
    DB 0xCC, 0x7B, 0x90, 0x39, 0x92, 0x0B, 0x9C, 0xC8, 0x1A, 0x0C
    DB 0x21, 0xE5, 0x5B, 0x8B, 0xCE, 0x94, 0x83, 0xB5, 0xCE, 0xC7
    DB 0x6C, 0x21, 0xFE, 0x3D, 0xC2, 0x75, 0x03, 0xEC, 0x25, 0xCD
    DB 0x1E, 0x02, 0xBA, 0x5D, 0xC7, 0x9F, 0xEB, 0x6C, 0xC0, 0x62
    DB 0x00, 0x38, 0x56, 0xAC, 0xD8, 0x8A, 0x44, 0xDB, 0xFE, 0xD7
    DB 0xD2, 0xED, 0x48, 0x79, 0xD5, 0x6D, 0x33, 0xCD, 0x70, 0x67
    DB 0x0B, 0x75, 0x11, 0x0C, 0x26, 0xAD, 0x75, 0x25, 0x31, 0x5F
    DB 0x4D, 0x2D, 0x4A, 0x48, 0xA8, 0x8F, 0x89, 0x99, 0x2E, 0xB4
    DB 0xA1, 0xC2, 0x78, 0x72, 0xBC, 0xC8, 0x95, 0x8F, 0x23, 0x7C
    DB 0xEF, 0x2C, 0xF7, 0xA9, 0xB0, 0xD3, 0x24, 0x4F, 0x83, 0x6E
    DB 0xD4, 0xEB, 0xCE, 0xC5, 0xBE, 0x4B, 0x9C, 0xCD, 0x21, 0x66
    DB 0x51, 0x8D, 0xFD, 0xCB, 0xBB, 0xDA, 0xEF, 0xF4, 0x7A, 0xFB
    DB 0x2E, 0xAB, 0x09, 0x8A, 0xE1, 0x5D, 0x98, 0x99, 0x8E, 0x8B
    DB 0xE1, 0x52, 0x82, 0xDF, 0x49, 0x78, 0xFA, 0xB1, 0xD3, 0x52
    DB 0x83, 0xEC, 0x58, 0x4D, 0x2E, 0x21, 0xF8, 0xDF, 0x90, 0xB6
    DB 0xED, 0x45, 0xDB, 0x8D, 0x7D, 0xBD, 0xBA, 0x31, 0x04, 0x6B
    DB 0xD2, 0x3C, 0xBF, 0x96, 0xCC, 0x65, 0xEB, 0x82, 0x58, 0x29
    DB 0x9E, 0x66, 0x51, 0x08, 0xDA, 0xED, 0x9E, 0xA0, 0xA5, 0xAF
    DB 0x72, 0xD7, 0x58, 0x11, 0xE2, 0xAE, 0x3A, 0xC2, 0x14, 0x42
    DB 0x70, 0x93, 0x86, 0x24, 0x06, 0x83, 0xF0, 0xE3, 0x1A, 0x4D
    DB 0x77, 0xB0, 0xDC, 0xC9, 0xD6, 0x62, 0xAA, 0xDD, 0x0F, 0x0D
    DB 0xC4, 0x34, 0x67, 0xBC, 0xEE, 0x10, 0xD8, 0x8A, 0x9E, 0xF4
    DB 0xD6, 0x74, 0x9F, 0x9F, 0x0F, 0xE9, 0xC6, 0x53, 0x2F, 0xCD
    DB 0xAF, 0x1B, 0xF1, 0x9C, 0x5F, 0x29, 0xAB, 0x62, 0x7E, 0xA9
    DB 0xF0, 0x76, 0xF4, 0x08, 0x03, 0xEB, 0x2F, 0xDB, 0xD5, 0x8C
    DB 0x3D, 0xD5, 0x48, 0x9D, 0x11, 0x6C, 0x98, 0xC4, 0x8A, 0x56
    DB 0x1D, 0x96, 0x78, 0x9C, 0xE7, 0xB9, 0xB7, 0x23, 0xD9, 0xE5
    DB 0xED, 0x7E, 0x68, 0x93, 0x6B, 0x31, 0x12, 0x51, 0xEF, 0x36
    DB 0x5E, 0xA5, 0x23, 0x1B, 0x1F, 0x12, 0x0A, 0xF5, 0x6F, 0x3F
    DB 0x54, 0x38, 0x70, 0x9B, 0xC2, 0xCF, 0x15, 0x66, 0x2C, 0xB3

sqrt_2: DB 1
    DB 0x6A, 0x09, 0xE6, 0x67, 0xF3, 0xBC, 0xC9, 0x08, 0xB2, 0xFB
    DB 0x13, 0x66, 0xEA, 0x95, 0x7D, 0x3E, 0x3A, 0xDE, 0xC1, 0x75
    DB 0x12, 0x77, 0x50, 0x99, 0xDA, 0x2F, 0x59, 0x0B, 0x06, 0x67
    DB 0x32, 0x2A, 0x95, 0xF9, 0x06, 0x08, 0x75, 0x71, 0x45, 0x87
    DB 0x51, 0x63, 0xFC, 0xDF, 0xB9, 0x07, 0xB6, 0x72, 0x1E, 0xE9
    DB 0x50, 0xBC, 0x87, 0x38, 0xF6, 0x94, 0xF0, 0x09, 0x0E, 0x6C
    DB 0x7B, 0xF4, 0x4E, 0xD1, 0xA4, 0x40, 0x5D, 0x0E, 0x85, 0x5E
    DB 0x3E, 0x9C, 0xA6, 0x0B, 0x38, 0xC0, 0x23, 0x78, 0x66, 0xF7
    DB 0x95, 0x63, 0x79, 0x22, 0x2D, 0x10, 0x8B, 0x14, 0x8C, 0x15
    DB 0x78, 0xE4, 0x5E, 0xF8, 0x9C, 0x67, 0x8D, 0xAB, 0x51, 0x47
    DB 0x17, 0x6F, 0xD3, 0xB9, 0x96, 0x54, 0xC6, 0x86, 0x63, 0xE7
    DB 0x90, 0x9B, 0xEA, 0x5E, 0x24, 0x1F, 0x06, 0xDC, 0xB0, 0x5D
    DB 0xD5, 0x49, 0x41, 0x13, 0x20, 0x81, 0x94, 0x95, 0x02, 0x72
    DB 0x95, 0x6D, 0xB1, 0xFA, 0x1D, 0xFB, 0xE9, 0xA7, 0x40, 0x59
    DB 0xD7, 0x92, 0x7C, 0x18, 0x84, 0xC9, 0xB5, 0x79, 0xAA, 0x51
    DB 0x6C, 0xA3, 0x71, 0x9E, 0x68, 0x36, 0xDF, 0x04, 0x6D, 0x8E
    DB 0x02, 0x09, 0xB8, 0x03, 0xFC, 0x64, 0x6A, 0x5E, 0x66, 0x54
    DB 0xBD, 0x3E, 0xF7, 0xB4, 0x3D, 0x7F, 0xED, 0x43, 0x7C, 0x7F
    DB 0x94, 0x44, 0x26, 0x0F, 0xBD, 0x40, 0xC4, 0x83, 0xEF, 0x55
    DB 0x03, 0x85, 0x83, 0xF9, 0x7B, 0xBD, 0x45, 0xEF, 0xB8, 0x66
    DB 0x31, 0x07, 0x14, 0x5D, 0x5F, 0xEB, 0xE7, 0x65, 0xA4, 0x9E
    DB 0x94, 0xEC, 0x7F, 0x59, 0x71, 0x05, 0xFB, 0xFC, 0x2E, 0x1F
    DB 0xA7, 0x63, 0xEF, 0x01, 0xF3, 0x59, 0x9C, 0x82, 0xF2, 0xFE
    DB 0x50, 0x0B, 0x84, 0x8C, 0xF0, 0xBD, 0x25, 0x2A, 0xE0, 0x46
    DB 0xBF, 0x9F, 0x1E, 0xF7, 0x94, 0x7D, 0x46, 0x76, 0x9A, 0xF8
    DB 0xC1, 0x4B, 0xCC, 0x67, 0xC7, 0xC2, 0x90, 0xBE, 0x76, 0x92
    DB 0x9B, 0x05, 0x78, 0xC1, 0x0B, 0x58, 0x4F, 0xB4, 0x87, 0xC9
    DB 0x24, 0xF5, 0xB7, 0x1F, 0x82, 0xDC, 0xD2, 0x90, 0x36, 0x09
    DB 0xDE, 0xE8, 0x91, 0x29, 0x83, 0xD4, 0xEA, 0xAD, 0x0E, 0xEA
    DB 0x32, 0x1F, 0x74, 0x89, 0xF4, 0x6A, 0x7E, 0x90, 0x30, 0xBE
    DB 0x20, 0xFB, 0x76, 0x94, 0xEF, 0xB5, 0x8C, 0x99, 0x84, 0xCD
    DB 0xD7, 0x0A, 0x1D, 0xA9, 0x04, 0x5C, 0x3D, 0x13, 0x3A, 0x06
    DB 0x84, 0x23, 0xD6, 0xE3, 0x83, 0x03, 0xD9, 0x01, 0xBA, 0x9D
    DB 0xA3, 0x47, 0x66, 0x84, 0x79, 0x6C, 0x5C, 0xD5, 0x97, 0x2D
    DB 0xC0, 0xFF, 0x35, 0x40, 0xC3, 0x41, 0x29, 0x42, 0xD6, 0x40
    DB 0x61, 0x01, 0xEF, 0x6F, 0xC6, 0xDE, 0x91, 0x14, 0xA2, 0xB4
    DB 0xF2, 0x48, 0xC6, 0x89, 0xC6, 0x00, 0xBB, 0x40, 0xA8, 0xB5
    DB 0x6B, 0x04, 0x1F, 0xD5, 0xDE, 0x6E, 0x0D, 0xD0, 0xC6, 0x6D
    DB 0x48, 0x31, 0xFE, 0x7F, 0xFF, 0x57, 0x57, 0xE4, 0x71, 0x09
    DB 0x80, 0xCD, 0xBD, 0x5C, 0x26, 0x84, 0x85, 0xDA, 0x5E, 0x91
    DB 0xB3, 0xE2, 0xF2, 0x05, 0xB7, 0x27, 0x25, 0xB9, 0x71, 0xD6
    DB 0x0A, 0x1F, 0x88, 0x8F, 0x08, 0xA0, 0xA6, 0xE1, 0x00, 0xCC
    DB 0xED, 0xC2, 0xCE, 0x5B, 0xD9, 0x8A, 0xEE, 0x71, 0xE4, 0x2E
    DB 0x26, 0x8D, 0x37, 0xA6, 0x07, 0x2F, 0x22, 0x02, 0x34, 0x61
    DB 0x3F, 0xFC, 0x22, 0x45, 0x34, 0x39, 0xEA, 0x97, 0xA9, 0x99
    DB 0xB6, 0xC9, 0xE3, 0xCE, 0x71, 0xF9, 0x4D, 0x60, 0x92, 0xAC
    DB 0xE1, 0x20, 0xAB, 0x8E, 0x55, 0x0E, 0x0D, 0x55, 0x11, 0x68
    DB 0x86, 0x31, 0x77, 0x8C, 0xF6, 0x03, 0x50, 0xD0, 0x2F, 0xE8
    DB 0x5F, 0x29, 0xEC, 0x8B, 0xE5, 0xC7, 0x2B, 0x80, 0x7A, 0xF5
    DB 0x77, 0x1B, 0x82, 0x5B, 0x30, 0xA0, 0xE7, 0x83, 0x76, 0xA9
    DB 0x1C, 0x08, 0xC6, 0xA7, 0xF0, 0xF8, 0xF3, 0x23, 0xB3, 0x62
    DB 0x81, 0xD2, 0x25, 0x68, 0x9C, 0x0B, 0x5A, 0x82, 0x04, 0x7D
    DB 0xB9, 0x89, 0xF6, 0x3A, 0x8A, 0x64, 0xE8, 0x51, 0x9B, 0xC0
    DB 0xD0, 0xC1, 0xE2, 0x22, 0x80, 0x48, 0x4D, 0x94, 0xF4, 0xF9
    DB 0xBB, 0x3D, 0x4B, 0x31, 0xD4, 0x89, 0xD7, 0x52, 0x31, 0xB5
    DB 0xC6, 0x33, 0xC4, 0x80, 0xC9, 0x6B, 0xE5, 0x49, 0xBF, 0x5D
    DB 0x96, 0x67, 0x8B, 0x4D, 0x2C, 0x4D, 0xDA, 0x86, 0x7B, 0xD8
    DB 0xE4, 0x80, 0x29, 0xFE, 0xA8, 0xC8, 0x17, 0x35, 0x67, 0xC2
    DB 0xBA, 0x3D, 0x3C, 0xE9, 0xDF, 0xE0, 0xBD, 0x1B, 0x4D, 0xD7
    DB 0x71, 0x17, 0x80, 0x57, 0xB6, 0x95, 0xB7, 0xEA, 0xF1, 0xB0
    DB 0x5C, 0x22, 0xC8, 0xD5, 0xFE, 0xEB, 0xD0, 0x77, 0xFE, 0xC9
    DB 0x6D, 0xB8, 0xF7, 0x78, 0xFC, 0x1C, 0x2B, 0xBB, 0xCE, 0x1B
    DB 0x49, 0xEB, 0xF5, 0xAF, 0x44, 0x60, 0x88, 0x29, 0x58, 0xAD
    DB 0xD0, 0x1C, 0xA7, 0xF1, 0xB6, 0xBC, 0x0B, 0x7E, 0xC1, 0xBC
    DB 0x6E, 0x0A, 0x6E, 0xDB, 0xC6, 0x7F, 0x85, 0xB2, 0x74, 0xE0
    DB 0x86, 0x1B, 0x3A, 0x13, 0x75, 0x71, 0xB1, 0x65, 0x49, 0x87
    DB 0x3D, 0x21, 0x1C, 0x6A, 0xAE, 0x69, 0xD8, 0x01, 0xE5, 0x79
    DB 0x44, 0x5B, 0xC6, 0x0A, 0x3E, 0x0A, 0x4F, 0xD8, 0x96, 0x8E
    DB 0xB7, 0x94, 0xBD, 0xC7, 0x02, 0xD6, 0x94, 0x5D, 0xA9, 0x4B
    DB 0x04, 0xA4, 0x40, 0xCA, 0xBC, 0x94, 0x38, 0x7C, 0x3D, 0x26
    DB 0xFD, 0x0F, 0x3B, 0xE8, 0xAF, 0x63, 0x05, 0xA5, 0x3A, 0x17
    DB 0x72, 0x88, 0xAC, 0xA1, 0x3F, 0xB4, 0x06, 0xC9, 0x82, 0x91
    DB 0x5D, 0x83, 0xBA, 0x0D, 0x35, 0x58, 0xD8, 0x1D, 0xD1, 0x15
    DB 0x9E, 0x96, 0x43, 0xEA, 0xA2, 0x7E, 0xB7, 0x75, 0x7A, 0x20
    DB 0x52, 0x97, 0x5B, 0x6F, 0x4A, 0x88, 0x9E, 0x3D, 0x09, 0x2B
    DB 0xB1, 0xC6, 0x85, 0x48, 0x0D, 0xC2, 0xE9, 0x99, 0x47, 0xB3
    DB 0x72, 0xDE, 0xDA, 0x05, 0xE2, 0x19, 0x2F, 0x95, 0xB1, 0xB9
    DB 0x26, 0x51, 0x2B, 0x40, 0x4C, 0x33, 0x18, 0x1D, 0x64, 0xA3
    DB 0x59, 0xA8, 0x9B, 0x6F, 0x88, 0x64, 0xF3, 0xD5, 0x75, 0x31
    DB 0x93, 0x59, 0xAA, 0x38, 0x62, 0x57, 0xA9, 0x3A, 0x57, 0xA5
    DB 0x97, 0x75, 0x47, 0xFA, 0x0F, 0x60, 0x6C, 0xC3, 0x2E, 0xEA
    DB 0x84, 0xEF, 0x71, 0x03, 0xD2, 0xD2, 0xD5, 0x7B, 0x6C, 0x15
    DB 0x3A, 0x5F, 0x37, 0xC2, 0xC7, 0x7F, 0xE2, 0x92, 0x8D, 0x32
    DB 0x1B, 0x29, 0x47, 0x0E, 0xAE, 0x41, 0x58, 0xB3, 0xCE, 0xDC
    DB 0x64, 0xAD, 0xE1, 0xE4, 0x31, 0xA1, 0x38, 0xBB, 0x7B, 0xE7
    DB 0x30, 0x5B, 0x46, 0xF7, 0xFE, 0x0B, 0xC7, 0x54, 0xFF, 0x3E
    DB 0xC0, 0x42, 0xBD, 0xC8, 0x5B, 0x32, 0x59, 0x96, 0x52, 0x2A
    DB 0x87, 0xB8, 0x64, 0x3E, 0x3D, 0x17, 0x87, 0x0F, 0x8C, 0x25
    DB 0xB5, 0x97, 0x80, 0x60, 0xD5, 0x5B, 0x82, 0xFD, 0x4E, 0xD3
    DB 0xF3, 0xE1, 0x58, 0x92, 0xB5, 0xB5, 0x23, 0x61, 0x82, 0xCB
    DB 0x28, 0x31, 0xF4, 0x4C, 0xA2, 0x7A, 0xD1, 0xA6, 0x6F, 0xD5
    DB 0x6F, 0xDC, 0x29, 0xA7, 0xC7, 0xA9, 0x3E, 0x42, 0x79, 0xAA
    DB 0x12, 0xD4, 0x60, 0xA0, 0xD4, 0x94, 0x95, 0xB6, 0xBE, 0x4D
    DB 0xC7, 0x3D, 0xDF, 0x96, 0xEE, 0x80, 0xA9, 0xDF, 0xC2, 0x2D
    DB 0x8D, 0x38, 0x5E, 0xA2, 0xEC, 0xC8, 0x01, 0xD7, 0x40, 0xC1
    DB 0x99, 0x0C, 0x7B, 0xF2, 0x84, 0x58, 0x48, 0x05, 0x27, 0xBB
    DB 0x8B, 0xA8, 0x10, 0x9D, 0x27, 0x70, 0xC3, 0xFF, 0xDE, 0x12
    DB 0x1A, 0x7B, 0xE4, 0x34, 0xF8, 0x3D, 0x0A, 0xAB, 0xFB, 0xDE
    DB 0x53, 0x1F, 0x74, 0xBA, 0xFD, 0xBC, 0x2D, 0xAF, 0xBE, 0xCE
    DB 0x02, 0xE6, 0x5B, 0xB7, 0x7B, 0x8F, 0xBB, 0x8C, 0xDB, 0x4A
    DB 0xD8, 0xE4, 0xB9, 0xEF, 0x01, 0xE2, 0xC9, 0x0F, 0x80, 0x69
    DB 0xD2, 0x3E, 0xCF, 0xB0, 0xC8, 0xE2, 0xE2, 0x7D, 0x64, 0x7D
    DB 0xAA, 0x43, 0x76, 0x2A, 0x64, 0xB9, 0xC7, 0xD7, 0x45, 0x34
    DB 0x4F, 0xDB, 0x51, 0x6F, 0xC5, 0x6F, 0xA1, 0xEA, 0xE6, 0xA9
    DB 0x58, 0x74, 0xFB, 0x50, 0x1F, 0x69, 0xB1, 0x7B, 0x66, 0xB8
    DB 0x1D, 0xFB, 0xA1, 0x1E, 0xD5, 0x24, 0x15, 0xD7, 0xEE, 0x3E
    DB 0x53, 0xF9, 0x58, 0x59, 0x46, 0xBB, 0x20, 0x81, 0x61, 0x78
    DB 0x05, 0x99, 0x68, 0x05, 0xBB, 0x4F, 0x9D, 0xA7, 0x96, 0xF6
    DB 0x33, 0xC9, 0xD1, 0x3F, 0x6C, 0x17, 0x2C, 0x3A, 0xFE, 0x34
    DB 0x01, 0xA3, 0x2E, 0x99, 0xDD, 0x6A, 0x24, 0x7E, 0x27, 0x96
    DB 0x00, 0xA3, 0xF5, 0xC0, 0x99, 0x91, 0xA6, 0x55, 0x4A, 0x35
    DB 0x00, 0x0F, 0xFE, 0x09, 0x0A, 0xBF, 0xBC, 0x2D, 0x8A, 0x4A
    DB 0x88, 0x14, 0x59, 0xED, 0x12, 0x7A, 0x54, 0xCC, 0xEC, 0xB6
    DB 0x3C, 0xF6, 0x37, 0x3A, 0x71, 0x1C, 0x9C, 0xF9, 0x15, 0x66
    DB 0xC3, 0x97, 0xB2, 0x82, 0x78, 0xA7, 0xF0, 0xBB, 0x8B, 0xBC
    DB 0x45, 0x16, 0xDD, 0xCA, 0xB0, 0xF6, 0xE9, 0x55, 0x74, 0x48
    DB 0xF9, 0x3E, 0xEB, 0x80, 0xF6, 0x9F, 0x34, 0xB5, 0x25, 0xC7
    DB 0x60, 0xF3, 0x38, 0x0E, 0xF9, 0xED, 0xB8, 0xAC, 0xEE, 0xFA
    DB 0x8D, 0xB3, 0xC7, 0xCE, 0x26, 0xE4, 0x2A, 0xA5, 0x98, 0x4D
    DB 0x4D, 0xB9, 0x56, 0x12, 0xEC, 0x52, 0x8A, 0x24, 0x5F, 0xCF
    DB 0x43, 0xDB, 0x37, 0x57, 0xF0, 0xA0, 0xA1, 0xFC, 0x24, 0xFE
    DB 0x21, 0x8F, 0x4B, 0x63, 0x07, 0x20, 0x90, 0x40, 0x44, 0xB2
    DB 0x32, 0xF3, 0x8C, 0x40, 0x32, 0xF1, 0xC3, 0xAB, 0x89, 0x71
    DB 0xDD, 0x4F, 0x79, 0x66, 0xDD, 0x97, 0x61, 0x4B, 0xAE, 0x8D
    DB 0x79, 0x7A, 0x08, 0x48, 0xB1, 0xD5, 0xCF, 0xDB, 0x13, 0x7D
    DB 0x0A, 0x18, 0x1B, 0x20, 0xCE, 0x77, 0x5D, 0x4D, 0xBA, 0xE5
    DB 0x13, 0x93, 0xBD, 0x57, 0x2A, 0x26, 0xCC, 0x5C, 0x5E, 0x0B
    DB 0xDE, 0x6E, 0x42, 0x33, 0xEF, 0xEA, 0xDA, 0xD3, 0xA0, 0x8D
    DB 0x0A, 0xE2, 0x11, 0x9A, 0xC0, 0xCA, 0x4E, 0x07, 0xD3, 0x41
    DB 0x50, 0x82, 0xE4, 0x4A, 0xCC, 0x3F, 0x0F, 0xB3, 0x4A, 0xCB
    DB 0x07, 0xC9, 0x6F, 0xCB, 0x5D, 0x0F, 0x4B, 0x7D, 0x89, 0x79
    DB 0xEA, 0x9C, 0x8E, 0x7F, 0x63, 0x7D, 0x66, 0x16, 0x18, 0xB9
    DB 0x78, 0xA7, 0x54, 0x4B, 0xB0, 0x2F, 0xE0, 0x85, 0x51, 0xA2
    DB 0x8D, 0x25, 0xDB, 0xCD, 0x92, 0xE4, 0xA3, 0x28, 0x50, 0x29
    DB 0xFD, 0xB6, 0x2C, 0xC7, 0xE5, 0xEE, 0x2C, 0x9B, 0x1A, 0x30
    DB 0x42, 0x8A, 0x57, 0x49, 0x17, 0x6E, 0x08, 0x5A, 0x29, 0xB5
    DB 0xDE, 0x32, 0xBD, 0x6A, 0xD8, 0x45, 0xBB, 0xE2, 0xFA, 0x16
    DB 0x52, 0x0C, 0xEA, 0xA8, 0x8B, 0x5B, 0x0B, 0x39, 0xC9, 0x61
    DB 0xCC, 0x2D, 0xA3, 0x68, 0x37, 0x43, 0x76, 0x7F, 0x97, 0x33
    DB 0x5C, 0x3F, 0xC5, 0x95, 0x71, 0x28, 0x2D, 0x33, 0x8C, 0x39
    DB 0xF3, 0x7E, 0x12, 0x96, 0x11, 0xE1, 0x17, 0x46, 0xFE, 0xB7
    DB 0x54, 0xCE, 0xB3, 0x76, 0x16, 0x3C, 0x52, 0xA1, 0x0A, 0x2D
    DB 0x23, 0xE6, 0x8A, 0x2B, 0xC7, 0xD3, 0x28, 0x7D, 0x1A, 0x72
    DB 0x71, 0xC5, 0xEF, 0x90, 0x55, 0x0B, 0x07, 0x05, 0x4A, 0x63
    DB 0x35, 0x4C, 0x86, 0xB6, 0xC9, 0x38, 0xF4, 0x5A, 0xE8, 0xD2
    DB 0xFD, 0x8C, 0x23, 0x56, 0xD7, 0xC5, 0xAA, 0x21, 0xB2, 0x45
    DB 0x76, 0x37, 0x2F, 0xE3, 0x1B, 0xD4, 0x1F, 0x98, 0x36, 0xAF
    DB 0x67, 0x44, 0x1F, 0xD0, 0x72, 0x46, 0xD8, 0x41, 0xDE, 0x5C
    DB 0xAE, 0x84, 0x61, 0x0C, 0x55, 0xA1, 0x2C, 0xED, 0x62, 0xF4
    DB 0xCB, 0x51, 0xFF, 0x3A, 0x3E, 0x1B, 0xD5, 0x18, 0x7E, 0x20
    DB 0x8E, 0x40, 0xE0, 0x1E, 0xCC, 0x30, 0xA2, 0x63, 0xC5, 0x4D
    DB 0x3B, 0x9B, 0x3C, 0x9A, 0x1D, 0x7B, 0x2A, 0xD9, 0xC3, 0x33
    DB 0x06, 0x2B, 0x1D, 0xCC, 0x09, 0x9D, 0x91, 0x8E, 0x32, 0xBB
    DB 0xFE, 0xA9, 0x0F, 0x20, 0x83, 0x44, 0x22, 0x20, 0x6E, 0x9F
    DB 0x02, 0xDF, 0xD7, 0x51, 0xA4, 0x73, 0xCA, 0x66, 0xD4, 0x74
    DB 0xB1, 0x0C, 0xB7, 0xC1, 0x76, 0x32, 0x40, 0xB5, 0x55, 0x15
    DB 0x97, 0x04, 0x00, 0xBF, 0x86, 0x0A, 0x98, 0x95, 0x14, 0xB1
    DB 0x44, 0x6E, 0x8C, 0xE4, 0x2C, 0xBB, 0x1A, 0x6F, 0x70, 0xDD
    DB 0x2F, 0xDF, 0x48, 0xD3, 0x02, 0xF6, 0x35, 0x5B, 0xB1, 0xD1
    DB 0xA5, 0x0A, 0x05, 0x14, 0x26, 0x9A, 0x7F, 0xA4, 0x08, 0xEA
    DB 0xED, 0xE6, 0xC2, 0x07, 0x15, 0x0A, 0x68, 0x40, 0xA8, 0xC6
    DB 0xD2, 0x77, 0x83, 0xEF, 0xA8, 0xF3, 0x13, 0xC9, 0xBC, 0x7C
    DB 0xAC, 0xFB, 0x1E, 0xBB, 0xC9, 0xD8, 0xF3, 0x86, 0x69, 0x35
    DB 0xE8, 0xFB, 0xE4, 0x91, 0x20, 0xA5, 0xFD, 0x11, 0xD4, 0x64
    DB 0x8D, 0xFA, 0xD3, 0xE8, 0x13, 0x92, 0xD7, 0x36, 0xDE, 0x1A
    DB 0x29, 0xA4, 0x2D, 0x8E, 0x65, 0xA7, 0x34, 0xAF, 0x48, 0x5D
    DB 0x29, 0x5F, 0xB0, 0xC1, 0x1C, 0x91, 0x3A, 0x06, 0xAF, 0x40
    DB 0x9B, 0x12, 0x78, 0x6E, 0xC8, 0xF4, 0xD8, 0xE7, 0x81, 0xF3
    DB 0xEB, 0xB8, 0x55, 0xE6, 0x87, 0x31, 0x8D, 0x3D, 0x71, 0x3D
    DB 0xAD, 0x46, 0xD3, 0xAB, 0xDA, 0x87, 0x79, 0xCB, 0xBE, 0x7A
    DB 0x01, 0x2A, 0x21, 0xBA, 0x9A, 0x49, 0xF9, 0x39, 0xD7, 0x8F
    DB 0xA6, 0xCE, 0xCD, 0xCC, 0x87, 0x09, 0xEB, 0x79, 0x59, 0xF5
    DB 0x24, 0xE2, 0xAC, 0x80, 0x89, 0x7A, 0xF7, 0xD9, 0xC0, 0x20
    DB 0x55, 0xBE, 0x67, 0x23, 0xE0, 0x24, 0x2F, 0x77, 0x94, 0x0A
    DB 0xAC, 0x6B, 0xE9, 0x1F, 0x0D, 0xC1, 0xB6, 0xDC, 0x01, 0x4D
    DB 0xE0, 0x67, 0x97, 0x58, 0x07, 0xA4, 0x46, 0x56, 0x16, 0x78
    DB 0xD7, 0x99, 0x27, 0xBF, 0x63, 0xB0, 0x69, 0x63, 0x48, 0x82
    DB 0x67, 0x5A, 0x3D, 0x49, 0x53, 0x05, 0x3F, 0x6D, 0x67, 0x50
    DB 0xA1, 0xCE, 0x0C, 0x19, 0x66, 0x70, 0x52, 0xD1, 0xEC, 0xEF
    DB 0xE2, 0x73, 0x91, 0x4B, 0xD4, 0x25, 0x78, 0xF2, 0x57, 0xBA
    DB 0xD3, 0xEB, 0xC1, 0x67, 0x36, 0x0E, 0x91, 0xF1, 0x14, 0x82
    DB 0x8E, 0xE1, 0x92, 0xAC, 0xBD, 0x48, 0xDA, 0x1B, 0xC5, 0x37
    DB 0x3B, 0x60, 0xB7, 0xF8, 0x10, 0x55, 0x19, 0x70, 0x1B, 0x01
    DB 0x4B, 0x68, 0xBE, 0x45, 0x11, 0x39, 0x83, 0x83, 0x8B, 0x6E
    DB 0xC6, 0x52, 0x24, 0xED, 0xAF, 0xFC, 0x7E, 0xC0, 0xA8, 0x7C
    DB 0xCC, 0xC8, 0xDB, 0xB1, 0x4A, 0xBE, 0xCC, 0x2F, 0x91, 0xA4
    DB 0x9A, 0x96, 0x79, 0x45, 0x07, 0x4D, 0xEE, 0x27, 0x56, 0x86
    DB 0x2F, 0x08, 0x55, 0xFF, 0xEF, 0x47, 0x7E, 0xD8, 0x46, 0xD2
    DB 0xF3, 0x43, 0xC6, 0x9A, 0xA2, 0xB3, 0xCE, 0xE3, 0xFB, 0xA9
    DB 0x20, 0xAB, 0xD1, 0x76, 0x0F, 0x54, 0x49, 0x36, 0xC7, 0xAB
    DB 0x39, 0x2B, 0x5E, 0xAD, 0x61, 0x98, 0xDF, 0x92, 0x82, 0x3A
    DB 0x89, 0x0E, 0xE7, 0x87, 0xBA, 0xDA, 0xBE, 0x2A, 0x72, 0xE9
    DB 0x95, 0x6F, 0x56, 0xBF, 0x4D, 0xED, 0xE9, 0x70, 0xA0, 0xC5
    DB 0x5A, 0x3F, 0x4E, 0x25, 0x0B, 0x8E, 0xD9, 0xE1, 0x69, 0xB1
    DB 0xD3, 0x5F, 0x98, 0x99, 0x8F, 0x4E, 0xD7, 0x8D, 0xD9, 0x9A
    DB 0xA7, 0xA2, 0x26, 0x47, 0x21, 0x3B, 0x9B, 0x1E, 0x92, 0xD4
    DB 0xF7, 0xAB, 0x0F, 0x16, 0x8D, 0x31, 0x7E, 0x05, 0x8D, 0xD4
    DB 0xD8, 0x61, 0x0E, 0x03, 0xAF, 0x7C, 0x63, 0xC2, 0x80, 0xD9
    DB 0x56, 0x14, 0x3D, 0x30, 0xA6, 0xA7, 0x0B, 0xE9, 0xAE, 0x91
    DB 0x7C, 0x17, 0xA1, 0x88, 0x1B, 0xD5, 0xA4, 0xA5, 0x1C, 0xBB
    DB 0xD4, 0x7D, 0xA2, 0xEE, 0xC9, 0x68, 0xD7, 0x9B, 0xE8, 0xDC
    DB 0xBA, 0x5E, 0xD0, 0x91, 0xA2, 0xB8, 0x44, 0xF9, 0xCC, 0xB1
    DB 0x60, 0x4E, 0x94, 0x1D, 0xB4, 0x5D, 0x47, 0xB8, 0xEC, 0xA6
    DB 0x30, 0x26, 0xFB, 0xB6, 0x43, 0xE1, 0x9B, 0x2F, 0x7D, 0x1D
    DB 0xF8, 0x87, 0x24, 0x31, 0xF7, 0x3B, 0x75, 0x17, 0xC7, 0x77
    DB 0x0F, 0x0C, 0x97, 0x34, 0x74, 0x40, 0xD4, 0xF9, 0x38, 0xA5
    DB 0x6F, 0xB5, 0xB1, 0x3E, 0x5A, 0x1C, 0x35, 0x57, 0x64, 0xBD
    DB 0xB3, 0x51, 0xBD, 0x69, 0xD0, 0xFB, 0x7E, 0xA3, 0x7F, 0x42
    DB 0xD6, 0x28, 0xA1, 0x23, 0x8E, 0x53, 0xCE, 0x7B, 0x89, 0xFB
    DB 0xAA, 0xBF, 0x02, 0xB6, 0x3D, 0xBD, 0x9D, 0x8B, 0x7E, 0x41
    DB 0x29, 0x18, 0x80, 0x54, 0x42, 0xBB, 0x96, 0x8C, 0x69, 0x55
    DB 0x68, 0x9D, 0xF1, 0xF9, 0xE4, 0x25, 0x2A, 0xC0, 0x42, 0x60
    DB 0x9E, 0x9A, 0xFD, 0x7A, 0xBB, 0xB2, 0xF4, 0xD7, 0x53, 0x90
    DB 0xEA, 0xD2, 0x35, 0xA6, 0xB1, 0x07, 0x55, 0x3A, 0xB8, 0xD7
    DB 0x1A, 0x5B, 0x45, 0x62, 0xDC, 0x92, 0x8F, 0xC3, 0xB6, 0xF7
    DB 0xC4, 0x3C, 0xA2, 0xB2, 0xF9, 0x3A, 0xE8, 0xB9, 0x1B, 0x7F
    DB 0x06, 0x63, 0x9F, 0xD5, 0x5E, 0xE2, 0x63, 0x72, 0x7A, 0x25
    DB 0x16, 0xE0, 0xE3, 0x82, 0x7A, 0x42, 0x61, 0xCA, 0x8C, 0xF0
    DB 0xED, 0x0A, 0xC8, 0x4B, 0x57, 0xBB, 0x03, 0x20, 0xAF, 0x8D
    DB 0x4A, 0x6F, 0x60, 0x91, 0x1E, 0xB3, 0x8A, 0xA4, 0xCE, 0x78
    DB 0x2B, 0xA4, 0xFE, 0x9F, 0xC4, 0x98, 0x92, 0xB9, 0x07, 0xE8
    DB 0x02, 0xA3, 0xAA, 0x0D, 0x68, 0xFB, 0x98, 0x25, 0x4F, 0x65
    DB 0x4A, 0xE8, 0x4A, 0x40, 0xEF, 0x07, 0x8A, 0xA2, 0x34, 0xC4
    DB 0xC5, 0x1C, 0xF5, 0xC5, 0xD2, 0x52, 0x5D, 0x1E, 0x39, 0x85
    DB 0xF7, 0x0E, 0x87, 0x0A, 0x4C, 0xE3, 0x69, 0x5B, 0xF0, 0xB0
    DB 0xAD, 0x80, 0x96, 0x06, 0xD0, 0x72, 0xF0, 0xD3, 0xD2, 0xBC
    DB 0x30, 0x12, 0xE8, 0x43, 0x7D, 0xA1, 0x2F, 0x15, 0x10, 0x87
    DB 0x6A, 0x48, 0xA1, 0x2D, 0x84, 0xDC, 0x10, 0xCC, 0xEA, 0x92
    DB 0x2A, 0x26, 0x7E, 0x93, 0x2B, 0x23, 0xEE, 0x26, 0xA1, 0x2B
    DB 0x05, 0x3E, 0xDB, 0x5A, 0xEA, 0xA8, 0x56, 0x24, 0xCF, 0xD3
    DB 0x54, 0x01, 0xF0, 0x1E, 0xCA, 0x15, 0xB0, 0xF1, 0x20, 0xF9
    DB 0x1A, 0xF1, 0xD3, 0xB4, 0x2A, 0x94, 0x0D, 0xB5, 0xDA, 0xEB
    DB 0x7F, 0x4C, 0xE1, 0x53, 0xBF, 0xE8, 0xDA, 0x57, 0x84, 0xDA
    DB 0x83, 0x86, 0xB5, 0x6E, 0xE3, 0x3E, 0x93, 0x25, 0xB7, 0x15
    DB 0xB9, 0xDC, 0xBF, 0x39, 0x2D, 0xF9, 0xCB, 0x2F, 0x84, 0xB5
    DB 0xD7, 0xBE, 0x6B, 0xA2, 0x41, 0xAB, 0x57, 0x98, 0x09, 0x9F
    DB 0xEA, 0x94, 0x37, 0x7A, 0x46, 0x22, 0xF5, 0x5F, 0x48, 0xDE
    DB 0x74, 0xED, 0x08, 0x2E, 0x15, 0x94, 0x8C, 0x2C, 0xC8, 0xED
    DB 0xDA, 0xF2, 0xE7, 0xDC, 0x99, 0xAA, 0xA9, 0xD2, 0x45, 0xD1
    DB 0xD7, 0x0D, 0x91, 0xEA, 0xED, 0x59, 0x14, 0xF7, 0x0E, 0x68
    DB 0xE3, 0xC7, 0x4E, 0x0C, 0xB1, 0x0C, 0x1A, 0xD0, 0x7C, 0xF2
    DB 0x85, 0x4B, 0x9B, 0x5E, 0x5A, 0x50, 0x69, 0x84, 0xAD, 0x61
    DB 0x78, 0x18, 0x90, 0x6C, 0x7C, 0x4D, 0xF3, 0xAF, 0x36, 0xAC
    DB 0x76, 0x3A, 0x94, 0x18, 0x9F, 0x3C, 0x67, 0xB4, 0x7E, 0xBF
    DB 0xDE, 0x2D, 0x68, 0x1F, 0x95, 0x1C, 0x3B, 0x56, 0x4C, 0xDD
    DB 0xA4, 0xD6, 0xEB, 0xE8, 0xB7, 0x3E, 0x2C, 0x8A, 0xB1, 0x35
    DB 0xB8, 0x29, 0x93, 0xC1, 0xA4, 0x0D, 0xAB, 0xAB, 0xCE, 0x83
    DB 0x36, 0xD4, 0x33, 0x06, 0xF3, 0x0F, 0x05, 0x6F, 0xF2, 0x7D
    DB 0x96, 0x08, 0xFA, 0x19, 0x49, 0x0A, 0xC2, 0xAC, 0xF9, 0xDF
    DB 0x3C, 0x24, 0x32, 0x8B, 0x8C, 0x0D, 0x2F, 0xC0, 0x87, 0xB0
    DB 0xC2, 0x11, 0xAE, 0xB4, 0x2C, 0xCD, 0x7C, 0x1F, 0xEF, 0xB3
    DB 0x4B, 0x81, 0x80, 0x2B, 0xFD, 0xD3, 0x48, 0x99, 0x1E, 0xC7
    DB 0x45, 0x72, 0xC2, 0xAE, 0x2E, 0x10, 0xCE, 0x78, 0xC9, 0x53
    DB 0xEB, 0x89, 0x41, 0xAB, 0xF7, 0x4B, 0x88, 0xC7, 0x38, 0xAF
    DB 0x78, 0x8A, 0x57, 0x1A, 0xE3, 0xDB, 0xE8, 0xAC, 0x35, 0x87
    DB 0xD5, 0xA3, 0xA5, 0x57, 0xAB, 0xDA, 0xEB, 0x9D, 0x87, 0x16
    DB 0x71, 0xD6, 0xD8, 0x69, 0x1D, 0xC1, 0x7F, 0xA5, 0x8F, 0x07
    DB 0x5A, 0xD4, 0x6C, 0x39, 0x86, 0x6D, 0x52, 0x0D, 0x96, 0x4B
    DB 0x4B, 0x6D, 0xB3, 0x62, 0xA2, 0x83, 0x1E, 0xEB, 0x93, 0x6D
    DB 0x08, 0xE1, 0x0A, 0x05, 0x11, 0xCE, 0x04, 0x70, 0xBE, 0x20
    DB 0x7D, 0xC6, 0x64, 0xB3, 0xD6, 0x88, 0x88, 0x51, 0x8F, 0xE1
    DB 0xC1, 0x8C, 0x90, 0x37, 0x98, 0x90, 0x15, 0xD3, 0xD5, 0x76
    DB 0x71, 0x4F, 0xCE, 0x03, 0x90, 0xEA, 0xBF, 0xB1, 0x17, 0xDC
    DB 0x13, 0x38, 0xAA, 0xB6, 0x9E, 0x8B, 0x87, 0xDA, 0x13, 0x51
    DB 0xBC, 0xA7, 0x75, 0xA4, 0x12, 0xBA, 0x71, 0x91, 0x17, 0x68
    DB 0x88, 0x39, 0x13, 0x0B, 0x8F, 0xAD, 0xF2, 0xA4, 0x09, 0x92
    DB 0xF5, 0x40, 0xDF, 0xC0, 0x26, 0xEE, 0x24, 0xBE, 0xF3, 0xF4
    DB 0xD0, 0x16, 0x99, 0xDD, 0x2E, 0xB8, 0x16, 0x86, 0x87, 0x30
    DB 0x61, 0x87, 0x49, 0x1B, 0x27, 0xDB, 0xA7, 0x26, 0xFA, 0xDE
    DB 0x50, 0x99, 0xEA, 0xAF, 0x33, 0x39, 0x8F, 0x81, 0x8A, 0xF8
    DB 0x69, 0x71, 0xC1, 0xE5, 0xFB, 0x19, 0x4A, 0x92, 0x7D, 0x46
    DB 0xEB, 0xE9, 0xF2, 0xC4, 0x56, 0x77, 0x1B, 0xD0, 0x7D, 0x89
    DB 0x22, 0xE4, 0x38, 0x28, 0xB5, 0xFF, 0x03, 0x3B, 0x74, 0x61
		
         END

各项常数预留了 6572 位,足够任何SIZE 之用。

如想增加 CONST常数的数量,先把TERMA的计算结果,汇出成专有的DB 格式,然后插入在程式的未端, 再在前面加一个独一无异的常数名称便可。汇出 TERMA的代码如下:

bash 复制代码
   ;  汇出 255 的立方根:
   MOV    DPTR, #T19_MSG
   CALL   PRTSTR
   CALL   CLR_TERMA
   MOV    DPTR, #TERMA
   MOV    A, #255
   MOVX   @DPTR, A          ; a = 255
   MOV    DIV_L, #3         ; DIV_L = 3, cube root
   CALL   ROOT              
   CALL   OUT_HEXA
   JMP    $
相关推荐
奶人五毛拉人一块1 小时前
动态规划--子数组类型
算法·动态规划·子数组问题
HugoStudio_SWAN1 小时前
洛谷 P1321 单词覆盖还原——从蜡板上的密信到数字水印
c++·学习·程序人生·算法
刘孬孬沉迷学习2 小时前
AI音频领域完整调研:任务、算法、大模型研究全梳理
人工智能·算法·音视频
退休倒计时2 小时前
【每日五题】leetcode TypeScript
算法·leetcode·职场和发展·typescript
机器学习之心2 小时前
基于BiGRU-Attention的轴承剩余寿命预测(MATLAB实现):从振动信号到RUL曲线的完整闭环
数据结构·算法·matlab·轴承剩余寿命预测·振动信号·bigru-attention
青梅橘子皮2 小时前
优选算法---专题2(滑动窗口)
数据结构·算法
程序猫.2 小时前
双指针问题
java·数据结构·算法
心抵鹊2 小时前
力扣每日一题:计算右侧小于当前元素的个数(hard)
算法·leetcode
鹿角片ljp2 小时前
LeetCode 142:环形链表 II |HashSet 保底解 + Floyd 快慢指针找环入口
算法·leetcode·链表