Вход

Просмотр полной версии : Работа с SD-картой на Специалисте



CityAceE
14.07.2025, 22:25
Есть два популряных варианта подключения SD-карты к Специалисту: SDOS и vinxru. Оба варианта доступны в Emu80, а SDOS доступен в FPGA реализации Специалиста.

До сего момента я с SD на Специалисте не работал. Использую SDOS на FPGA исключительно для запуска RKS-файлов с карты.

И вот мы сейчас прикрутили AY, и даже TS, к Специалисту. Хочется сделать хотя бы самый простенький проигрыватель файлов, которые будут в этот проигрыватель загружаться с SD-карты. А для этого нужно уметь читать каталог SD, перемещаться по директориям и загружать в память выбранный файл. Я этого не умею. Кто знает, как это делать, помогите, пожалуйста, информацией!

Serg6845
14.07.2025, 23:23
Хочется сделать хотя бы самый простенький проигрыватель файлов, которые будут в этот проигрыватель загружаться с SD-карты. А для этого нужно уметь читать каталог SD, перемещаться по директориям и загружать в память выбранный файл. Я этого не умею. Кто знает, как это делать, помогите, пожалуйста, информацией!

SDOS - штатно стандартных точек входа не имеет, нужно будет собрать бинарник с ними.
dos_rk.asm:

jmp ENTRY
; JMP FS_ENTRY ;todo: vinxru api
; JMP FS_FNDF ; [DE] - name of file for finding, out HL - string FAT record of file, C==1 if file not found
; JMP F_OPEN ; [DE] - name of file for opening, out C==1 if file not found, calls FS_FNDF
; JMP F_READ ; HL - addr for store read data, BC - size of read data

последние три строки раскоментировать и собрать.
есть правда один момент - надо дать знать плееру адреса этих точек входа. поскольку четкого стандарта в каких адресах лежит SDOS походу тоже нет.
проще всего наверно сделать как у Vinxru - при запуске программы передавать адрес точки входа в регистрах. но тогда плеер придется запускать с той же флешки.


Vinxru -

sdbios.txt:

SD BIOS может быть в любом месте памяти.

При запуске программы регистр A содержит версию набора команд (сейчас 1). BС содержит точку
входа в SD BIOS. HL командную строку. DE собственное имя.

Для вызова функции контроллера, надо поместить в регистр A код функции и вызвать подпрограмму по адресу переданному при старте программы в регистре BC.

ФУНКЦИИ

Reboot Теплая перезагрузка (A=0, HL="", DE="" / A=код ошибки)

Exec Запустить программу (A=0, HL=имя файла, DE=командная строка / A=код ошибки)
FindFirst Начать получение списка файлов (A=1, HL=путь, DE=максимум файлов для загрузки,
BC=адрес / HL=сколько загрузили, A=код ошибки)
FindNext Продолжить получение списка файлов (A=1, HL=":", DE=максимум файлов для загрузки,
BC=адрес / HL=сколько загрузили, A=код ошибки)
Open Открыть файл (A=2, D=0, HL=имя файла / A=код ошибки)
Create Создать файл (A=2, D=1, HL=имя файла / A=код ошибки)
MkDir Создать папку (A=2, D=2, HL=имя файла / A=код ошибки)
Delete Удалить файл/папку (A=2, D=100, HL=имя файла / A=код ошибки)
Seek Установить позицию чтения записи файла (A=3, B=режим, DE:HL=позиция / A=код ошибки, DE:HL=позиция)
(С начала B=0, с текущего положения B=1, с конца B=2)
GetFileSize Получить размер файла (A=3, B=100 / A=код ошибки, DE:HL= размер файла)
GetDiskSize Получить размер диска в Мб (A=3, B=101 / A=код ошибки, DE:HL= размер диска)
GetDiskFree Получить свободное место на диске в Мб (A=3, B=102 / A=код ошибки, DE:HL= размер файла)
SwapFiles Работа с двумя открытыми файлами (A=3, B=200 / A=код ошибки)
Read Прочитать из файла (A=4, HL=размер, DE=адрес / A=код ошибки, HL=сколько загрузили)
Write Записать в файл (A=5, HL=размер, DE=адрес / A=код ошибки)
WriteEOF Конец файла (A=5, HL=0 / A=код ошибки)
Move Переместить файл/папку (A=6, HL=из, DE=в / A=код ошибки)

РАСПЕРЕДЕЛНИЕ ПАМЯТИ

После запуска SD BIOS карта памяти выглядит так:

8AE7h SELF_NAME Собственное имя файла 256 байт (этот адрес содержится в DE после запуска)
8BE7h CMD_LINE Командная строка 256 байт (этот адрес содержится в HL после запуска)
8CE7h SD_BIOS_CODE Код SD BIOS 537 байт (возможно будет расти в начало сдвигая SELF_NAME и CMD_LINE)
8F00h - Не используется ~233 байта (возможно тут есть переменные монитора)
8FDFh MONITOR_VARS Переменные монитора
9000h VIDEO_MEM Видеопамять

С самого начала памяти свободно 35 559 байт памяти (до 8AE7h). Дальше находятся переменные
SELF_NAME, CMD_LINE. Если они не нужны программисту, то объем непрерывной свободной памяти
составляет ~36 071 байт (до 8CE7h).

Свободное место по адресу 8F00h оставлено на всякий случай. Во первых, что бы не конфликтовать
с Монитором. Возможно, что будущие версии SD BIOS будут использовать эту память.

fifan
15.07.2025, 10:43
У Vinxru интерфейса сделано по подобию некоторой операционки на Атмеги8. Если интересно могу привести точки входа и назначение процедур.

CityAceE
15.07.2025, 11:38
Если интересно могу привести точки входа и назначение процедур.
Спасибо, но думаю, что у меня есть эта информация. Ею со мной любезно поделился Pyk.

https://pic.maxiol.com/thumbs2/1752568618.780858384.sdbios.png (https://pic.maxiol.com/?v=1752568618.780858384.sdbios.png&dp=2)

fifan
15.07.2025, 13:26
Могу привести коды примеров построения общения, предоставленные мне лично автором Алексеем Морозовым.

CityAceE
15.07.2025, 15:02
Могу привести коды примеров построения общения, предоставленные мне лично автором Алексеем Морозовым.
А вот за такую информацию буду очень благодарен!

fifan
15.07.2025, 19:19
А вот за такую информацию буду очень благодарен!

Вот (https://xn----7sbombne2agmgm0c.xn--p1ai/for_out/1.docx) не большая моя переписка с ответами.

CityAceE
15.07.2025, 20:32
Спасибо! То, что нужно, чтобы стартануть с нуля.

fifan
16.07.2025, 06:27
Вот для начала фрагмент кода. Нужно выяснить работает интерфейс или нет.
По метке ErrorPrint нужно расположить обработку ошибки. Для начала нужно организовать вывод номер ошибки в аккумуляторе, если 0 - ошибок нет.

; чтение каталога с SD карты
ld a, #01 ; код команды
ld bc, SDDir ; буфер под каталог
ld de, #0032 ; максимум файлов = 50
ld hl, Path ; путь
call SD_BIOS ; получение списка файлов
or a
jp z, NoError2 ; переход, если не было ошибки
cp #0a ; ошибка 10 - найдено более 50 файлов
jp nz, ErrorPrint ; переход, если не ошибка 10
NoError2 ld a, l
ld (SDFiles), a ; количество загруженных файлов

SD_BIOS equ #8d15 ; запуск SD_BIOS_Code
SDDir equ #de00 ; буфер для каталога SD карты
Path defm ""
defb #00

- - - Добавлено - - -

Файл sdbios.bin содержит SDBIOS и я его располагаю с адреса 8d15 (как советовал автор). Эта область расположена перед экранной областью и занимает 485 байт.