/*
 * abswrite — абсолютная запись секторов логического диска через
 * BIOS $56 (rst 8); регистры и нумерация — как у absread ($55).
 * При ошибке errno=EWRITE (как у Solid-C), возврат -1.
 * ОСТОРОЖНО: пишет мимо файловой системы — можно разрушить FAT.
 */

#include <dos.h>
#include <errno.h>

static uint8_t  absw_disk;
static uint8_t  absw_cnt;
static uint16_t absw_sect;
static uint16_t absw_buf;
static int8_t   absw_rc;

int abswrite(uint8_t disk, uint16_t nsect, uint8_t count,
             const void *buffer)
{
    absw_disk = disk;
    absw_sect = nsect;
    absw_cnt  = count;
    absw_buf  = (uint16_t)buffer;

    __asm
        push  ix
        ld    ix, (_absw_sect)      ; IX = младшие 16 бит номера сектора
        ld    hl, #0                ; HL = старшие 16 бит (всегда 0)
        ld    de, (_absw_buf)       ; DE = буфер
        ld    a, (_absw_cnt)
        ld    b, a                  ; B = число секторов
        ld    a, (_absw_disk)       ; A = диск
        ld    c, #0x56              ; BIOS WRITE (сектора)
        rst   #0x08
        pop   ix
        ld    a, #0
        jr    nc, _absw_done
        ld    a, #26                ; EWRITE (код Solid-C)
        call  __errno_set
        ld    a, #0xFF
    _absw_done:
        ld    (_absw_rc), a
    __endasm;
    return absw_rc;
}
