PDA

Просмотр полной версии : Как загрузить файлы из ассемблера?



STD
14.05.2016, 22:40
Всех с прошедшими праздниками!

Подскажите, кто знает.

Имею три файла 1) шрифт "MYFONT01" 2) блок сцен игры "TEXT-000" 3) сама программа "cod03".
Когда гружу их из бейсика (см. скрин №1) - все грузится и попадает куда надо: шрифт в 26.000, блок сцен в #С000, код в 28050 - все видно дебагером.

Но такой загрузчик сделал я сделал на время первоначальной отладки пока блок сцен только один. Потом хочу чтобы в окончательном варианте бейск-загрузчик был из 1 строки - загружал только "cod", потом стартовал кодовый файл, а шрифт и все блоки сцен грузились уже из него - проще будет по страницам блоки сцен раскидывать.

Попробовал сделать (см.скрин №2), но что-то ничего не грузит. Вроде все как в примере из книги "ТР-ДОС для пользователей и программистов".
Причем первый вызов #3d13 с кодом в регистре с = #13 работает, имена файлов "MYFONT01" и "TEXT-000" с меток FILE00 и FILE01 в область системных переменных из DEFB "MYFONT01C" и DEFB "TEXT-000C" перемещаются. Спектрулятор типа дисковом мигает, а в памяти нули...

Где туплю?

krt17
14.05.2016, 23:36
Ну по той книге на которую вы ссылаетесь в DE должна быть длинна. А что у вас?

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

Вам вроде нужен режим a=3

STD
15.05.2016, 00:05
Там написано: если A=#FF то "коды загружаются с адреса HL, но длина загружаемого файла равна длине записанного на диск." Поэтому я только HL и устанавливаю. Честно говоря это уже второй вариант, сначала пробовал режим "A=#00 - адрес загрузки и длина берется из каталога" - тоже не работало. Может правда а =3 попробовать....

krt17
15.05.2016, 00:21
Страница 193/194, и там того что вы говорите не написано. Возможно и 0 должен работать но на скринах нет вывода команды LIST

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

А и CLEAR надо на еденицу ниже ставить, не помню почему но так принято:)

STD
15.05.2016, 09:33
Извиняюсь, ввел в заблуждение относительно первоисточника смотрел в "TR-DOS для профессионалов и любителей" вот здесь http://zxpress.ru/book_articles.php?id=1352.
Точно! Есть же еще "ZX-Spectrum & TR-DOS для пользователей и программистов" http://zxpress.ru/book.php?id=132, и выглядит посолиднее, сейчас там почитаю.
А за подсказку про CLEAR - спасибо, не заметил. Думаю это вызвано тем, что на адрес clear, как я понял, переставляется стек процессора. Получается, что при загрузке в 26000 файла в моем случае первая ячейка стека затрется первый байтом загруженного файла, так что, действительно, надо его в 25999 поставить. 8)

Почитал и вторую книжку, вроде там все также написано... 8(. Ладно, попробуем еще DE задать...

STD
19.05.2016, 22:29
Вах, если кому интересно сообщаю итоги моих экспериментов.

Загрузить файлы из ассемблера именно в виде файла просто по его имени наиболее простой и логичной командой с = #0E у меня не получилось ни в каком виде. 2 вечера бесплотных попыток. Причем и сам файл находился с помощью c = #0A и дискриптор его считывался по c = #08, а грузить по с = #0E - никак. Так и не понял в чем дело.

В итоге выход нашелся благодаря Яндексу, этому форуму и сообщению jerri от 2011г. (спасибо ему заочно). Теперь гружу файлы по-секторно, предварительно всеми вышеуказанными функциями узнав его физическое местоположение на диске. Выглядит так (вдруг еще кому пригодится):

LD HL,FILENAME ; по этому адресу имя загружаемого файла 8 байт и расширение (у меня "FNT00000C")
LD C,#13 ; переносим имя и тип файла в область системных переменных ТР-ДОС
CALL #3D13 ;

LD C,#0A ; По перенесенному имени и типу файла ищем его в каталоге
CALL #3D13 ; номер файла получаем в регистре С

LD A,C ; Копируем полученный номер файла в каталоге в А
LD C,#08 ; и по его номеру считываем из каталога в область системных переменных
CALL #3D13 ; полные данные о файле

LD HL,26000 ; в HL - адрес куда будем считывать файл
LD DE,(#5CEB) ; в DE - из сист.переменных берем начальную дорожку и сектор файла
LD A,(#5CEA) ; в B через А заносим длину файла в секторах
LD B,A ;
LD C,5 ; читаем!!!
CALL #3D13

Надеюсь никого не оскорбил сим опусом...

goodboy
20.05.2016, 20:53
Загрузить файлы из ассемблера именно в виде файла просто по его имени наиболее простой и логичной командой с = #0E у меня не получилось ни в каком виде. 2 вечера бесплотных попыток. Причем и сам файл находился с помощью c = #0A и дискриптор его считывался по c = #08, а грузить по с = #0E - никак. Так и не понял в чем дело.
0 устанавливал не в ту переменную

http://savepic.ru/9784295.png

вполне возможно что твой вариант справедлив для версии 5.01 , в более новых всё несколько запутанней

krt17
20.05.2016, 21:48
Решил и я проверить раз такие страсти и как и следовало ожидать все работает как и написано в книге. TR-DOS 5.04TM была в анриле по дефолту. Код:


device zxspectrum128

org #5d3b
start dw #100 ; line number = 1
dw lend-lbegin ; line length
lbegin db #fd,#30 ; 'clear' 0
db #0e,#00,#00,#ff,#5f,#00 ; value=#5fff
db #3a,#f9,#c0,#30 ; ':' 'rand' 'usr' 0
db #0e,#00,#00:dw code:db #00 ; start address
db #3a,#ea ; ':' 'rem'

code ; insert your code here
; res 4,(iy+1) ; fix usr0 issue
; ld hl,#c9f1,(#5cc2),hl ; don't break while loading
display code
ld hl,name
ld c,#13
call #3d13
xor a
ld (#5cf9),a
ld a,3
ld hl,#4000
ld c,#0e
call #3d13
di
halt
name
db "scr C"
db #0d ; enter (end of basic line)
lend

emptytrd "mydisk.trd"
savetrd "mydisk.trd","boot.B",start,lend-start
org #6000
scr
ds #1800,#55
ds #300,#07
scrl equ $-scr
savetrd "mydisk.trd","scr.C",scr,scrl

Видим ожидаемую картинку с полосками. Проверил на 5.03, абсолютно также ( да и как могло быть по другому???).

goodboy
20.05.2016, 22:51
Проверил на 5.03, абсолютно также ( да и как могло быть по другому???)
частенько возникает ситуация когда значение в (23824)/(#5d10) не-равно нулю,
вот тогда функция #0E и перестаёт работать как загрузчик файла.
..............
похоже туда пишется #FF после загрузки файла (например основного загрузчика) стандартными средствами trdos из бейсика.
ага PC==#181E

krt17
20.05.2016, 23:44
частенько возникает ситуация когда значение в (23824)/(#5d10) не-равно нулю
Ну ок, возможно. Проверил при работе запись в данную ячейку, словил кучу записей туда 0 и ничего более. Все равно мне не совсем понятно что было не так. Сброс, трдос, ран при таком подходе все должно было работать.

goodboy
21.05.2016, 00:39
словил кучу записей туда 0 и ничего более.
после загрузки файла из бейсика там будет 255