PDA

Просмотр полной версии : esxdos - Загрузка с ленты в dot command



Chwe
12.12.2023, 18:36
Будет небесполезна помощь знатоков esxdos. У кого-нибудь получилось из dot command вызывать $0562 (https://skoolkid.github.io/rom/asm/0556.html), процедуру загрузки с ленты (https://github.com/z88dk/z88dk/blob/master/libsrc/_DEVELOPMENT/arch/zx/tape/z80/asm_zx_tape_load_block.asm) из штатного ПЗУ? Это, вообще, теоретически возможно? И, если получилось, поделитесь примером кода.

Детали: есть существующий код (C, z88dk) который хочется иметь в виде dot command для esxdos. Сделали вызов как положено через RST $18 + DW $0562, но всё падает при попытке чтения с ленты. Как отлаживать на железе я пока не в курсе, а вот при трассировке в FUSE получается так, что сразу после корректного перехода в 48k ПЗУ DivMMC подставляется обратно и, по сути, начинается выполнение случайного кода. Последствия предсказуемые, всё падает. Несколько смущает то, что в $3DFD вместо ожидаемого $C9 (RET) оказывается какой-то мусор и оттуда случайный код и начинается. Но причина это или следствие, моих знаний недостаточно пока для понимания.

Попробовал «заходить» в ПЗУ 48 не по адресу $0562, который перехватывается esxdos’ом, а позже (скопировав код от $0562 до точки входа себе в проект), но там почему-то быстро происходит такой-же переход обратно в DivMMC ПЗУ. Поздно было, не отследил, откуда выбрасывает обратно в DivMMC, следующий заход уже на выходных.

И, нет, TAP файл не подключён, все эксперименты для чистоты делаются на свежезагруженном компьютере/эмуляторе. Интересно, что если использовать RST $18, то падает сразу, а если наплевать на esxdos и дёргать $0562 напрямую (который, получается, где-то в ПЗУ DivMMC), то там почему-то попытка что-то загрузить есть, но после пилотного тона падает. Судя по коду в ПЗУ DivMMC, оно и без RST $18 должно выкидывать на $0564 в 48k ПЗУ, если там TAP файл не подключён. Или я ошибаюсь?

P.S. кто по-англицки читает, тот мог видеть такой же вопрос на SC (https://www.spectrumcomputing.co.uk/forums/viewtopic.php?t=10637). Это вопрос примерно про один и тот же кусок кода, просто он спрашивает в англоязычном месте, а я тут.

Chwe
13.12.2023, 18:17
«Доверяй, но проверяй». «У семи нянек дитя без глаза». В смысле, поздний вечер воскресенья не самое лучшее время для могзового штурма :)

В общем, если использовать 0x564 как точку входа (вторая инструкция, первая там IN A,($FE)), а эту точку esxdos не перехватывает, то всё работает как надо. Там остались вопросы по правильному оформлению кода, но, это уже в другой раз.

goodboy
13.12.2023, 23:52
Несколько смущает то, что в $3DFD вместо ожидаемого $C9 (RET) оказывается какой-то мусор и оттуда случайный код и начинается. Но причина это или следствие, моих знаний недостаточно пока для понимания.
контроллер при вызове кода в диапазоне #3D00-#3DFF подключает свою страницу памяти и код выполняется на ней.
базовый расклад получается
#0000-#1FFF ; ROM
#2000-#3FFF ; RAM ; кол-во страниц зависит от устройства (в базовом DivIDE их всего 4ре)


LD A,#03
LOOP OUT (#E3),A
LD HL,#2000
LD DE,#2001
LD BC,#1FFF
LD (HL),L
LDIR
LD (#3DF9),A
LD HL,#3DFD
LD (HL),#C9
LD HL,#3D30
LD (HL),#C9
DEC A
CP #FF
JR NZ,LOOP


.команда загружается в страницу 2 #2000-#3BFF (максимальный размер кода получается #1C00) и запускается с #2000

Chwe
16.12.2023, 01:27
Да, спасибо. Жалко всего этого в одном месте нет. Ну, проблему таки решили, всё работает. Говорят, даже на Next. Скоро поделюсь результатами.

Про $C9, я посмотрел ещё раз, там страниц-то хоть и минимум 4, но всё не больше одной. Вот и при вызове $0562 почему-то подключается не та страница, где $C9 явно записано, а какая-то другая (где esx.sys?). Разбираться не стал, будет время, спрошу на форуме esxdos (он живой, вообще?).

Chwe
21.12.2023, 19:43
Результаты усилий можно посмотреть тут: tape2esxdos repo (https://codeberg.org/TIsland/tape2esxdos) (конкретно реализация esxdos_zx_tape_load_block (https://codeberg.org/TIsland/tape2esxdos/src/commit/80a53c6cb01d276e071cf39df04a840dd52677c3/tape2esxdos.asm#L75)).

Кстати, мне тут показали замечательные публикации на форуме specnext, которые я, почему-то, сам через goondex найти не смог в своё время. Оставлю тут для поиска.

Dot Commands - the final word (https://www.specnext.com/forum/viewtopic.php?t=1257) (копия (https://telegra.ph/Dot-Commands---the-final-word-01-19), если оригинал пропадёт)
Generating Huge Dot Commands with Z88DK (https://www.specnext.com/forum/viewtopic.php?t=1227) (копия (https://telegra.ph/Generating-Huge-Dot-Commands-with-Z88DK-01-19), если оригинал пропадёт)