esxDOS для самых маленьких. Практикум чтения из файла и смещения по файлу
Всем привет!
Сегодня мы продолжим говорить про esxDOS иоткроем портал в ад и напишем свой маленький запилятор попрактикуемся с чтением с SD-карты.
Это вторая статья, предполагается, что первая уже прочитана
Я использую эмулятор ZEsarUX. Он работает под GNU/Linux, эмулирует просто очень много железа в т.ч. divMMC и есть ESXDOS Handler, который умеет перехватывать вызовы esxDOS и прокидывать их на обычную файловую систему.
Он не идеальный, но многие вещи больше заэмулировать негде.
Вроде Spin тоже умеет, но я с ним не работал.
Все операции с файлами работают побайтово! Если вам нужен ровно один байт — читайте ровно один байт. Нужно 32к — читайте 32к.
Сейчас сказать не могу — мой divMMC не у меня(привет уходит Саше), поэкспериментировать сложно с реальной железкой.
Я задал вопрос на форуме — как узнаю — обновлю инфу.
А вот об этом мы как раз и поговорим ниже :-)
Представим, что у нас есть видеоролик нарезанный на картинки, которые мы наконвертили в экраны спектрума и склеили их в файл output.zxv.
Для того, чтобы считать первую картинку нам нужно открыть файл и вычитать фрейм в видеопамять.
Вуаля и первый кадр из видео у нас на экране.
Что ж, а как дочитать его до конца? А легко — проверять, что мы вычитали больше нуля байт и повторять операцию.
и наш readFrame принимает следующий вид:
И тааак. У нас уже на экране буйство красок и играет видео. Легким движением руки добавляем на im2 музыку и мы создали очередной клон Bad Apple.
Ну а если мы хотим, чтобы музыка длилась вечно(видео крутилось по кругу).
Для этого в esxDOS есть функция аналогичная POSIX-вызову fseek(#9F).
Она умеет применять смещение в файле с точностью до байта в трех режимах:
Так как esxDOS умеет работать с большими файлами — то смещение указывается 32х битным параметром в виде четверки регистров BCDE.
И теперь наша библиотека esxdos.asm получает еще следующий блок кода:
Очередную поделку на тему Bad Apple и весь ее исходный код можно скачать по этой ссылке
А в следующий раз мы поговорим о получении списка файлов.
Сегодня мы продолжим говорить про esxDOS и
Это вторая статья, предполагается, что первая уже прочитана
Раскрытие вопросов по прошлой статье
Есть ли эмуляторы с поддержкой esxDOS?
Я использую эмулятор ZEsarUX. Он работает под GNU/Linux, эмулирует просто очень много железа в т.ч. divMMC и есть ESXDOS Handler, который умеет перехватывать вызовы esxDOS и прокидывать их на обычную файловую систему.
Он не идеальный, но многие вещи больше заэмулировать негде.
Вроде Spin тоже умеет, но я с ним не работал.
Как читается файл? Посекторно или как?
Все операции с файлами работают побайтово! Если вам нужен ровно один байт — читайте ровно один байт. Нужно 32к — читайте 32к.
Можно ли безопасно определить наличие esxDOS?
Сейчас сказать не могу — мой divMMC не у меня(привет уходит Саше), поэкспериментировать сложно с реальной железкой.
Я задал вопрос на форуме — как узнаю — обновлю инфу.
Можно ли читать поточно в экран/куда-нибудь еще?
А вот об этом мы как раз и поговорим ниже :-)
Запилим запилятор
Представим, что у нас есть видеоролик нарезанный на картинки, которые мы наконвертили в экраны спектрума и склеили их в файл output.zxv.
Для того, чтобы считать первую картинку нам нужно открыть файл и вычитать фрейм в видеопамять.
ld hl, filename : ld b, FMODE_READ : call fopen : ld (fp), a : jr c, error
readFrame:
ld a, (fp) : ld bc, 6912 : ld hl, #4000 : call fread
; ... Тут что то происходит
ld a, (fp)
call fclose
fp db 0
filename db "output.zxv",0
include "esxdos.asm"
error: ; Тут у нас какая-то обработка ошибок
rst #0
Вуаля и первый кадр из видео у нас на экране.
Что ж, а как дочитать его до конца? А легко — проверять, что мы вычитали больше нуля байт и повторять операцию.
и наш readFrame принимает следующий вид:
readFrame:
ld a, (fp) : ld bc, 6912 : ld hl, #4000 : call fread
ld a, b : or c : jr z, fileEnded
jp readFrame
fileEnded:
ld a, (fp)
call fclose
ret
И тааак. У нас уже на экране буйство красок и играет видео. Легким движением руки добавляем на im2 музыку и мы создали очередной клон Bad Apple.
Ну а если мы хотим, чтобы музыка длилась вечно(видео крутилось по кругу).
Для этого в esxDOS есть функция аналогичная POSIX-вызову fseek(#9F).
Она умеет применять смещение в файле с точностью до байта в трех режимах:
- Смещение в байтах с начала файла(режим 0)
- Смещение в байтах с текущего места, движение вперед(режим 1)
- Смещение в байтах с текущего места, движение назад(режим 2)
Так как esxDOS умеет работать с большими файлами — то смещение указывается 32х битным параметром в виде четверки регистров BCDE.
И теперь наша библиотека esxdos.asm получает еще следующий блок кода:
; API methods
ESX_FSEEK = #9F
; Offset modes
OFFSET_MODE_FROM_START = 0 ; Offset calculated from file begin
OFFSET_MODE_FORWARD = 1 ; Offset calculated from current point(forward seeking)
OFFSET_MODE_BACKWARD = 2 ; Offset calculated from current point(backward seeking)
; A - file pointer
; ixl - file mode
; bcde - offset
fseek:
rst #8
defb ESX_FSEEK
ret
Очередную поделку на тему Bad Apple и весь ее исходный код можно скачать по этой ссылке
А в следующий раз мы поговорим о получении списка файлов.
2 комментария
И ещё раз извини за корпус!)