#if not(ZX_SPECTRUM)
#warn zxspectrum module should be only used on ZX Spectrum-compatible targets
#endif

#pragma zilog_syntax

inline asm void putchar(byte register(a) char) !preserves_bc !preserves_de !preserves_hl {
    rst $10
    ? ret
}

inline void new_line() !preserves_bc !preserves_de !preserves_hl {
    putchar(13)
}

inline asm void set_border(byte register(a) colour) !preserves_bc !preserves_de !preserves_hl {
    out (254),a
    ? ret
}

inline asm void bell() {
    ? ld hl,$6A
    ? ld de,$105
    ? call $3B5
    ? ret
}

array __readline_out[45]
const pointer readline_out = __readline_out.addr

pointer readline() {
    asm {
        ld a, 1
        call $1601
        ld hl, $5c71
        set 7, (hl)
        set 5, (hl)
        call $16b0
        ld bc, 1
        rst $30
        ld (hl), 13
        ld ($5c5b), hl
        ld hl, __readline_exit
        push hl
        ld ($5c2d), sp
        call $0f2c
        pop hl
        ld hl, ($5c61)
        ld de, __readline_out.addr
        ld b, __readline_out.length - 1
__readline_copy:
        ld a, (hl)
        cp 13
        jr z, __readline_exit
        ld (de), a
        inc hl
        inc de
        djnz __readline_copy
__readline_exit:
        ld a, 0
        ld (de), a
        ld a,2
        call $1601
        call $16b0
    }
    putstrz(__readline_out)
    new_line()
    return __readline_out.addr
}

const byte black = 0
const byte blue = 1
const byte red = 2
const byte purple = 3
const byte green  = 4
const byte cyan = 5
const byte yellow = 6
const byte white = 7