/*
 * max — больший из двух int16_t.
 * __sdcccall(1): a в HL, b в DE; возврат в DE.
 *
 * FIXME: сравнение через `cp` беззнаковое — для отрицательных
 * аргументов результат неверный.  Унаследовано из minmax.c до сплита;
 * см. docs/libc-roadmap.md.
 */

#include <stdlib.h>

int16_t max(int16_t a, int16_t b) __naked
{
    (void)a; (void)b;
    __asm
        ld    a, h
        cp    d
        jr    c, max_less
        jr    nz, max_greater
        ld    a, l
        cp    e
        jr    c, max_less
        ret   /* здесь h==d, l>=e — вернуть DE (при равенстве b==a) */
    max_less:
        /* a < b, вернуть b в DE */
        ret   /* DE уже содержит b */
    max_greater:
        /* a > b, вернуть a */
        ex    de, hl
        ret
    __endasm;
}
