esxDOS для самых маленьких. Практикум чтения из файла и смещения по файлу

Всем привет!

Сегодня мы продолжим говорить про esxDOS и откроем портал в ад и напишем свой маленький запилятор попрактикуемся с чтением с SD-карты.

Это вторая статья, предполагается, что первая уже прочитана



Раскрытие вопросов по прошлой статье


Есть ли эмуляторы с поддержкой 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 и весь ее исходный код можно скачать по этой ссылке

А в следующий раз мы поговорим о получении списка файлов.

1 комментарий

avatar
Я тебе верну дивммц!) Вместе с кассетой-переходником из ниоткуда в никуда ©)) Если она тебе нужна будет, конечно. При живом-то дивммц)
И ещё раз извини за корпус!)
  • sq
  • +1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.