Crc

em.bench.coremark/Crc.em
import em from '@$$emscript'
export const $U = em.$declare('MODULE')

import * as Utils from '@em.bench.coremark/Utils.em'

export type sum_t = Utils.sum_t

export function add16(val: i16, crc: sum_t): sum_t {
    const v = val
    crc = update(v, crc)
    crc = update((v >> 8), crc)
    return crc
}

export function addU32(val: u32, crc: sum_t): sum_t {
    crc = add16(<i16>val, crc)
    crc = add16(<i16>(val >> 16), crc)
    return crc
}

function update(data: u8, crc: sum_t): sum_t {
    let x16 = <u8>0
    let carry = <u8>0
    for (let i = 0; i < 8; i++) {
        x16 = <u8>((data & 1) ^ (<u8>crc & 1))
        data >>= 1
        if (x16 == 1) {
            crc ^= 0x4002
            carry = 1
        }
        else {
            carry = 0
        }
        crc >>= 1
        if (carry) {
            crc |= 0x8000
        }
        else {
            crc &= 0x7fff
        }
    }
    return crc
}

export function em$run() {
    let sum = 0
    for (let i = 0; i < 5; i++) {
        sum = add16(i, sum)
    }
    printf`sum = %04x\n`(sum)
}