PDA

Просмотр полной версии : im2 и call 3d13



moroz1999
29.12.2006, 14:22
по выходу из call 3d13 прерывания разрешаются автоматом?

Sonic
29.12.2006, 15:15
Прерывания разрешают функции чтения и записи сектора на диск в конце своего выполнения. Там на входе стоит DI, на выходе EI.
Функции обслуживания Magic прерываний не разрешают, но у них есть недостаток: при возникновении любой ошибки на диске они тупо делают 20 попыток затем зависают (HALT). Никаких запросов, ничего.
Возможно забыл еще какие-то места, но вроде нет.
Проблема решается просто: регистром I указываем на ПЗУ. Получаем два различных обработчика прерывания. Один из них вызывается из ПЗУ бейсика-48, второй из TR-DOS. Второй должен возвращаться по EI: JP #3D2F.
На старых машинах с нестабильной шиной данных (на которой в пассивном состоянии не #FF) к сожалению это работать не будет.

moroz1999
29.12.2006, 15:49
стоп, я не совсем понял - а если у меня уже оформлен IM2, с таблицей адресов для нестабильной шины, то мне его нужно запретить или разрешить при чтении с диска (c=#5)? На прерываниях при этом ничего не висит, там стоят только EI и RETI.

я тут просто пытаюсь понять, почему у меня при выставленном IM1 всё работает, а при выставленном, но запрещенном IM2 при обращении к 3D13 всё периодически падает.


кстати, еще вопрос, немного оффтоповый - нужно ли делать EI перед RETI, вроде как читал что RETI сама по себе разрешает прерывания?

Sonic
29.12.2006, 15:59
Если ты используешь таблицу адресов из ОЗУ, то при обращении к TR-DOS ты совершенно закономерно получишь падение. Все дело в том, что после разрешения прерываний в ПЗУ TR-DOS выполняется еще куча действий (восстановление системной среды). В процессе этого работает код из ПЗУ TR-DOS. Первое же прерывание отключит его (ибо произойдет переход в ОЗУ на твой обработчик). Вернешься из прерывания ты уже не в то ПЗУ в которое нужно.
Проблема решения не имеет ибо внутри обработчика прерываний нельзя определить, из какого ПЗУ он был вызван.
Если хочешь работоспособности на старых машинах - включай IM 1 перед обращением к TR-DOS.
По поводу RETI точно не знаю.

moroz1999
29.12.2006, 16:16
Если ты используешь таблицу адресов из ОЗУ, то при обращении к TR-DOS ты совершенно закономерно получишь падение. Все дело в том, что после разрешения прерываний в ПЗУ TR-DOS выполняется еще куча действий (восстановление системной среды). В процессе этого работает код из ПЗУ TR-DOS. Первое же прерывание отключит его (ибо произойдет переход в ОЗУ на твой обработчик). Вернешься из прерывания ты уже не в то ПЗУ в которое нужно.
Огромное спасибо! Это отвечает на все мои вопросы. Жаль, что ни в одном из множества документов, которые я ранее читал, этой инфы не встретилось - это сэкономило бы массу времени на investigation.

jtn
29.12.2006, 17:57
а я лишь добавлю, что есть компы, в которых не будут читаться дискеты даже при IM1 если вектор I находится в медленной памяти (например #40-#7F)

Southern Bear
30.12.2006, 13:19
The RETI instruction also facilitates the nesting of interrupts, allowing higher priority devices to temporarily suspend service of lower priority service routines. However, this instruction does not enable interrupts that were disabled when the interrupt routine was entered. Before doing the RETI instruction, the enable interrupt instruction (EI) should be executed to allow recognition of interrupts after completion of the current service routine.
http://www.zilog.com/docs/z80/um0080.pdf

moroz1999
30.12.2006, 17:30
о! спасибо! :)

deathsoft
30.12.2006, 19:03
Жаль, что ни в одном из множества документов, которые я ранее читал, этой инфы не встретилось - это сэкономило бы массу времени на investigation.
Это написано в книге А.Ларченко и Н. Родионова "TR-DOS Для пользователей и программистов"

moroz1999
30.12.2006, 23:00
так может стоит её выложить хотя бы на VT? :)

TomCaT
31.12.2006, 11:16
Да, сколько уже тем на эту тему создавал -- хороший автор, хорошо написаны книги "Как написать игру..." -- длинно, без самых современных приемов, но хорошо! А все счастливые владельцы настаивают на ненужности скана. Хоть бы djVu -- образ сделали!.. :( :( ;) :( :( ;) :( :( ;) :( :(

deathsoft
31.12.2006, 14:04
"Как написать игру..."
Смотрим сюда (первые 2 строки) http://trd.speccy.cz/book.htm

deathsoft
31.12.2006, 14:16
так может стоит её выложить хотя бы на VT?
Так ее для этого нужно хотя бы отсканировать, а кто этим будет заниматься...

klondike
09.01.2007, 23:11
Проблема решения не имеет ибо внутри обработчика прерываний нельзя определить, из какого ПЗУ он был вызван.
Если хочешь работоспособности на старых машинах - включай IM 1 перед обращением к TR-DOS.
По поводу RETI точно не знаю.

Как это не имеет?
Кто то использует процедуры ПЗУ?? :)

Проверяешь стек, если адрес возврата - ПЗУ, возвращаешь в TR-DOS.

Evgeny Muchkin
10.01.2007, 09:36
Проверяешь стек, если адрес возврата - ПЗУ, возвращаешь в TR-DOS.
Браво! Простенько и со вкусом! :)

acidrain
10.01.2007, 12:26
По поводу RETI точно не знаю.
Об этом написано в книге Ларченко и Радионова опять же - "ZX для пользователей и программистов". Цитата:

------
Возврат из маскируемых прерываний производится командой RETI. Она распознается специальными переферийными микросхемами*, что позволяет организовать многоуровневую систему прерываний. Но, поскольку в ZX Spectrum эта система не используется, то вернуться из прерываний можно и по команде RET.

*- Фирмой Zilog были разработаны микросхемы, входящие совместно с Z80 CPU в комплект под общим названием Z80.
----

Вот бы еще они указали что за микруха такая ;).

caro
10.01.2007, 13:33
Вот бы еще они указали что за микруха такая ;).Все микросхемы входящие в комплект семейства Z80:
Z8410 (Z80DMA) - контроллер прямого доступа к памяти;
Z8420 (Z80PIO) - контроллер парралельного интерфейса;
Z8430 (Z80CTC) - программируемый таймер;
Z8440 (Z80SIO) - контроллер последовательного интерфейса;
Z8470 (Z80DART) - сдвоенный асинхронный приемо-передатчик.

NovaStorm
10.01.2007, 13:35
Z80DART/Z80DMA/Z80GPIO или как их там...
Один хрен, их уже не выпускают. А почитать есть в серии "Микропроцессорный комплект Z80"

caro
10.01.2007, 13:42
Один хрен, их уже не выпускают.Выпускают и продают :)
В Промэлектронике:
Z84C2006PEG (Z80B(A)-PIO) - 144 р.
Z0844006PSC (Z80B-SIO/O) - 282 р.

NovaStorm
10.01.2007, 14:32
Дык это небось из старых запасов? Я на Зилог.ком их не нашёл что-то...

caro
10.01.2007, 14:35
Я на Зилог.ком их не нашёл что-то...Ты лучше на www.efind.ru поищи.
Ими торгуют все кому не лень.

TomCaT
10.01.2007, 14:54
Смотрим сюда (первые 2 строки) http://trd.speccy.cz/book.htm

Это я уже видел. И отлично, что комп. вар-т есть, но они у меня и в книжном есть. А "ZX S и TR-DOS для п. и п." -- нет. Нигде и никакого, вот это и печалит.

psb
10.01.2007, 16:12
Проверяешь стек, если адрес возврата - ПЗУ, возвращаешь в TR-DOS.
кажись, не факт, что так будет работать. делали проще, в прерывании ставили ei:jp #3d2f. тогда если был вызов из пзу тр-дос, он туда и возвращается и все работает. если вызов из озу, то он просто по RET(#3d30) вернется в озу. НО(!), если был вызов из пзу бейсика, то облом. для турболоадеров это прокатывало, потому что они пзу бейсика не юзали, а вот для #3d13 точно не прокатит.

как вариант - ставить перехватчик на #5cc2 что ли, или где там находится RET, чтоб он щучил переключения между пзу и менял jp #3d2f на RET в обработчике прерывания.

вот:)

demon_zx
11.01.2007, 08:40
Как то делал я раньше такое im2 + #3d13, но уже забыл 8-)

klondike
14.01.2007, 14:02
кажись, не факт, что так будет работать. делали проще, в прерывании ставили ei:jp #3d2f


И то верно!
Кстати, вспомнилось еще кое-что интересное из im2 и стека.
А именно - стек мог оказаться в области данных (переброска через стек) + im2 + EI
На возврате из прерывания была проверка текущего адреса стека и если в диапазоне данных - восстановление подпорченного стеком дампа данных плюс возврат по jp

psb
15.01.2007, 15:42
кажись, не факт, что так будет работать.
я тут подумал.. а вообще реально ли Im2 и #3d13? имхо нет:) почему, потому что по #3d13 при ошибке тр-дос елозит башкой до 0 дорожки и обратно. а при im2 такие ошибки будут постоянно.. вот потому и юзали турболоадеры:)

хотя, с винтом на #3d13, может быть и прокатит. но с дисководом всяко нет:)


стек мог оказаться в области данных
это, конечно, фишка, но.. к тр-дос отношения не имеет:)))

klondike
15.01.2007, 22:07
это, конечно, фишка, но.. к тр-дос отношения не имеет:)))

к im2+trdos имеет :)

psb
16.01.2007, 16:47
к im2+trdos имеет
хм..
а поподробнее? ;) где тр-дос юзает пересылку данных через стек?

klondike
16.01.2007, 23:35
хм..
а поподробнее? ;) где тр-дос юзает пересылку данных через стек?

:)
чего там подробнее?
im2+ei+обращение к tr-dos+SP в данных.

короче, проехали :)

psb
17.01.2007, 17:06
короче, проехали
а че проехали-то? я не догнал, зачем ставить стек в данные, если юзаешь тр-дос? фигня какая-то..

если ты через стек что-то перекидываешь (картинку или что там), то как тогда тр-дос? если ты юзаешь тр-дос, то зачем стек в данные?

не-по-нят-но!

klondike
17.01.2007, 23:11
а че проехали-то? я не догнал, зачем ставить стек в данные, если юзаешь тр-дос? фигня какая-то..
если ты через стек что-то перекидываешь (картинку или что там), то как тогда тр-дос? если ты юзаешь тр-дос, то зачем стек в данные?
не-по-нят-но!


а чего не понятного? :)

boot с проверкой смены диска.
на im2 - музыка
в основном цикле - опрос tr-dos+переброс данных через стек.

psb
18.01.2007, 16:18
в основном цикле - опрос tr-dos+переброс данных через стек.
нууу... я-то думал... тр-дос и переброс данных стеком не пересекаются:) эт частный случай:) да и какой-то неправильный;) (в том смысле, что если это перебрасывалась графика, она должна была это делать синхронно с прерываниями;) чтобы не дергаться;)

klondike
18.01.2007, 22:35
нууу... я-то думал... тр-дос и переброс данных стеком не пересекаются:) эт частный случай:)


Ну, прерываню то все равно не известно, из трдоса оно отхватило управление или нет?
Вот поэтому и была проверка и SP и адреса возврата.


да и какой-то неправильный;) (в том смысле, что если это перебрасывалась графика, она должна была это делать синхронно с прерываниями;) чтобы не дергаться;)

А там по другом не получалось. Почему - не помню :)
Было еще смешнее. С im2 и досом вообще не связано, зато связано с
'неправильностью':
цикл: "переброс + halt + очистка" давал рваное изображение, а
"переброс + очистка + halt" - стабильное :)
Это в во вращающихся "шахматных" полях в OVERDEMO.

psb
19.01.2007, 16:22
Ну, прерываню то все равно не известно, из трдоса оно отхватило управление или нет?
это зависит от подхода;) я бы сделал не так:) но это не важно..


Было еще смешнее.
так и тут ничего смешного:) все дело в луче, _абсолютно_ нормальное явление:)

только понятнее, если начинать с halt:
halt, очистка, переброс - луч наезжает на очистку, видим глюк
halt, переброс, очистка - перебрасываться успевает, а очистку УЖЕ не видно:)

хотя фиг знает, если в инт не влазило..
все равно это уже оффтоп:)

jtn
19.01.2007, 19:29
тема переросла в бредовую стадию - никто никогда не рисовал спрайты с включенными im2 через trdos


"переброс + очистка + halt" - стабильное
именно по такому методу работает бОльшая часть 48к игр

klondike
20.01.2007, 12:47
тема переросла в бредовую стадию - никто никогда не рисовал спрайты с включенными im2 через trdos


Спрайты через трдос? Это оригинально.
А вот дос + стек на данных + im2 - это boot с проверкой смены диска, выше же написал.
Т.е. очевидно, что одновременно выполняется два пункта:
либо im2+dos, либо im2+стек на данных, а не все три.

Речь шла про изначальное мое предложение проверять адрес возврата.
Проверка для того и нужна было, чтобы понять - возвращаться ли в дос и восстанавливать ли таблицу данных?. Хотя можно было ограничиться только проверкой SP а возрат по ret в дос, но это я сам себя перемудрил тогда.



Про луч - вот жеж оказывается как все просто...
Знать бы раньше :)

Несколько лет для меня было тайной, почему переписанная 1 в 1 пзу'шная процедура tape load не работает по адресу ниже 49152 на моем zx.
Чего уж; а работа с border с мультиколором так и осталась тайной.

klondike
20.01.2007, 13:00
нууу... я-то думал... тр-дос и переброс данных стеком не пересекаются:) эт частный случай:) да и какой-то неправильный;) (в том смысле, что если это перебрасывалась графика, она должна была это делать синхронно с прерываниями;) чтобы не дергаться;)

Ну, видишь, проблемы были с пониманием того, почему синхронизации не происходит.
Получилось, кстати, весьма плавно.
См. например вот эти интро:
deflector/sabotage (http://zxaaa.untergrund.net/intrip.html)