Files
Sprinter-SDCC/libc/io/abswrite.c
T
snark13 60373930fb libc: Solid-C совместимость (П3) + rename/isatty (П4); scanf-семейство
- <dos.h>: getdate/gettime/setdate/settime (структуры Turbo-C, обёртки
  над getdatetime), getdisk/setdisk (ESTEX $02/$01), absread/abswrite
  (BIOS $55/$56, rst 8 — номера найдены в solid-c DOS.ASM; сектор 0 =
  boot логического диска)
- scanf/fscanf/sscanf: своё C-ядро _scanf_core (%d %u %x %o %c %s,
  модификатор l, ширина, подавление '*', %%); в SDCC z80 scanf нет,
  asm solid-c не портируем из-за чужого ABI; 22 хост-теста ядра
- хвост П2: fdopen/freopen/fclosall/fgetpos/fsetpos поверх таблицы
  FILE; парсер режима и выдача слота вынесены в _file_mode/_file_slot
- rename() — ESTEX RENAME $10; isatty(fd) = fd <= 0 (tty только
  псевдо-fd 0/-1/-2: из CLI DSS манипуляторы идут с 1 — verified,
  fd 1 не резерв, под Flex Navigator его держит навигатор)
- errno.h: Solid-C имена ошибок (EZERO/EINVFNC/ENOFILE/...) как алиасы
- <sprinter_solid.h> — зонтичный заголовок для портирования;
  ltell/_setargv в sprinter_compat.h; div/ldiv — из SDCC (проверено)
- tests/solidt — smoke всех П3/П4 API, зелёный в MAME (вкл. absread
  boot-сектора с сигнатурой 55AA)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:35:58 +03:00

46 lines
1.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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;
}