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