Files
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

47 lines
1.6 KiB
C
Raw Permalink 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.
/*
* absread — абсолютное чтение секторов логического диска через
* BIOS $55 (rst 8): A=диск, HL:IX=32-битный номер сектора (HL=старшие,
* у нас всегда 0), DE=буфер, B=число секторов. Нумерация с 0 от
* начала ЛОГИЧЕСКОГО диска (0 = boot-сектор, с 1 — первая FAT).
* При ошибке errno=EREAD (как у Solid-C), возврат -1.
* Буфер — в #4000-#BFFF (требование BIOS).
*/
#include <dos.h>
#include <errno.h>
static uint8_t abs_disk;
static uint8_t abs_cnt;
static uint16_t abs_sect;
static uint16_t abs_buf;
static int8_t abs_rc;
int absread(uint8_t disk, uint16_t nsect, uint8_t count, void *buffer)
{
abs_disk = disk;
abs_sect = nsect;
abs_cnt = count;
abs_buf = (uint16_t)buffer;
__asm
push ix
ld ix, (_abs_sect) ; IX = младшие 16 бит номера сектора
ld hl, #0 ; HL = старшие 16 бит (всегда 0)
ld de, (_abs_buf) ; DE = буфер
ld a, (_abs_cnt)
ld b, a ; B = число секторов
ld a, (_abs_disk) ; A = диск
ld c, #0x55 ; BIOS READ (сектора)
rst #0x08
pop ix
ld a, #0
jr nc, _absr_done
ld a, #25 ; EREAD (код Solid-C)
call __errno_set
ld a, #0xFF
_absr_done:
ld (_abs_rc), a
__endasm;
return abs_rc;
}