extern void abort(void);

typedef signed short int16_t;
typedef unsigned short uint16_t;

int16_t logadd(int16_t *a, int16_t *b);
void ba_compute_psd(int16_t start);

int16_t masktab[6] = {1, 2, 3, 4, 5};
int16_t psd[6] = {50, 40, 30, 20, 10};
int16_t bndpsd[6] = {1, 2, 3, 4, 5};

void ba_compute_psd(int16_t start) {
    int i, j, k;
    int16_t lastbin = 4;

    j = start;
    k = masktab[start];

    bndpsd[k] = psd[j];
    j++;

    for (i = j; i < lastbin; i++) {
        bndpsd[k] = logadd(&bndpsd[k], &psd[j]);
        j++;
    }
}

int16_t logadd(int16_t *a, int16_t *b) {
    return *a + *b;
}

int main(void) {
    int i;

    ba_compute_psd(0);

    if (bndpsd[1] != 140) abort();
    return 0;
}
