IM2, вектор прерывания

ZXNet эхоконференция «code.zx»

От Гаврилов Виталий Кому All 12.09.2006

Hello, Robus Rob> я видел 3+5=7 фирменных моделей 5! да, это 5! %)))) ЗЫ. Юзаш табличку в те же 257 байт и забываешь о нестабильной шине.

От Константин Жуков Кому All 12.09.2006

Hello, All Я тут вот с какой проблемой столкнулся. В литературе говорится, что на фирменном Спектруме48 вектор прерывания I должен находится в районе адресов ПЗУ, иначе произойдёт аппаратный сбой. Hо у некоторых отечественных Спектрумов нестабильная шина данных, поэтому в ОЗУ создается таблица длиной 257 байт. Конечно, можно было бы использовать таблицу в свободном месте ПЗУ (где #FF), но на многих компах оно занято всякой фигнёй. Как же обеспечить нормальную работу IM2 на любом компьютере?

От Марк Антонов Кому All 12.09.2006

Hello, Jukov сгенерировать таблицу 257 одинаковых байт в районе адресов #8000-#BFFF (до #FFFF если используется 48к и страница 0). причем значения таблицы - векторы могут находиться хоть где.

От Robus Кому All 12.09.2006

Hello, Jukov Juk> Я тут вот с какой проблемой столкнулся. В литературе говорится, что Juk> на фирменном Спектруме48 вектор прерывания I должен находится в Juk> районе адресов ПЗУ, иначе произойдёт аппаратный сбой. Hо у некоторых Juk> отечественных Спектрумов нестабильная шина данных, поэтому в ОЗУ Juk> создается таблица длиной 257 байт. Конечно, можно было бы Juk> использовать таблицу в свободном месте ПЗУ (где #FF), но на многих Juk> компах оно занято всякой фигнёй. Как же обеспечить нормальную работу Juk> IM2 на любом компьютере? У меня фирменный Speccy 128+Beta, в котором нет проблем с плаванием вектора I. Вообще-то за всю жизнь я видел 3+5=7 фирменных моделей. Первые три, один из них мой, были произведены в Польше, остальные пять были в компьютерном клубе и где их собрали мне не известно. Все модели я тестировал на этот глюк и его небыло. Однако, речь шла о нахождении регистра I в диапазоне от 0 до 63, но IM при этом не 2 а 1 ! Сколько я не капался в буржуйских работах, я не видел, что бы вектором I при IM2 пользовались ПЗУшкой, за исключением польской демы "Song In Lines". Рекомендуется в 48к модели держать вектор в любом диапазоне, кроме от 64 до 127. Иначе в момент выборки байт для генерации видео любая команда будет исполняться с торможением, и это ощутимо. А если ещё при этом всём и исполнять программу в диапазоне от 16384 до 32767, то торможения могут быть в 5-6 раз. А это строгое правило, затирать 257 байт одним числом, я встречал только у Durrel Software, но так же они при чтении регистра порта клавиатуры они их любили инвертировать, это то же считать стандартом ? Мне кажется, что эти недаработки с глюком вектора пошли от клонов Speccy !

От Robus Кому All 12.09.2006

Hello, Vitamin Vit> 5! да, это 5! %)))) Ссори ... Просчитался ... Vit> ЗЫ. Юзаш табличку в те же 257 байт и забываешь о нестабильной шине. Терять 254 байта ? Hе отдам !!! Я лучше туда депакер положу !

От Константин Жуков Кому All 12.09.2006

Hello, Robus Я разработал новый способ чтения порта DOS #1F через прерывания. Если бы не наши клоны с нестабильной шиной данных, то это была бы самая короткая процедура чтения порта #1F; IN1F; LD BC,(#5BFF) LD HL,INT LD (#5BFF),HL LD A,#5B LD I,A IM 2 LD (COPYSP+1),SP LD A,#FF AGAIN LD D,1 LD IY,#2D87 EI CALL DOS INT DI COPYSP LD SP,0 BIT 7,A JR NZ,AGAIN LD (#5BFF),BC *** DOS PUSH IY JP #3D2F *** #2d87 IN A,(#1F) AND #7F RET Z DEC D PUSH HL PUSH DE JR NZ,#2D7B HALT

От Андрей Лысенко Кому All 12.09.2006

Hello, Jukov Умня был пентагон, который работал следующим образом: Если 257 байт заполенены - то все ок Если им2 есть, но таблица какаянибудь другая - программа обычно работала, но в любой момент она могла сброситься - сопственно несколько лет до этого не мог понять почему некоторые проги робили стабильно, а некоторые сбрасывались рано или позно ! =) Таким образом всегда после этого сам заполнял 257 байт! Причом могу отметить, что у многих фирменных игр видел заполененые 257 байт ! (а не у одной, как ктото сказал!!!)

От Гаврилов Виталий Кому All 12.09.2006

Hello, Robus Rob> Терять 254 байта ? Hе отдам !!! Я лучше туда депакер положу ! Если шина стабильная, то можно выловить значение вектора прерывания и делать перехватчик по вполне определенному адресу. А вот если ее значение скачет как сайгак по степи, то тут без таблички ну никак... разве что юзать пзу128 и подменять свой обработчик im1...

От Чунин Роман Кому All 12.09.2006

Hello, Jukov Juk> Я разработал новый способ чтения порта DOS #1F через прерывания. Если Juk> бы не наши клоны с нестабильной шиной данных, то это была бы самая Juk> короткая процедура чтения порта #1F; У; наших "клоунов" подтянуть шину через регистерную сборку - фиксит трабл. Hо лучше не зарекаться и сделать таблицу.

От Alex Astafiev Кому All 14.09.2006

Hello, fyrex Hестабильна шина именно на родном фирменном спектруме. Точно не знаю на каких именно моделях (легко установить по схематике, скорее всего, Sinclair ZX Spectrum 16, 48, 128 и +) - но все (99%) игрушек знают про это. По всей вероятности, на фирменном спеке неиспользование 257-байтной таблицы сразу же ведет к совершенно определенно четкому сбою. Поэтому пропустить данную фичу при написании игры было невозможно. Если кому интересно - то на шину выдается байт аттрибутов. Происходит это потому что ULA и процессор развязаны в фирменной схематике просто резисторами, и процессор "подхватывает" байт аттрибутов выдаваемый ULA. Совдеповские компы как раз были полностью свободны от этого недостатка (за исключением может быть "Москвы"). И это являлось в очень редких случаях причиной несовместимости. Лечится на совдеповском компе такое подтяжкой шины данных с помощью резисторов к +5V. Резисторы нужны в пределах 10...15 килоом. Если есть сомнения насчет связки TRDOS + 2-х байтный вектор прерывания, то советую не сомневаться и делать. Только чтение регистров TRDOS через IM2-прерывания это не "изобретение". Это уже использовалось. И именно таким методом, если ничего не путаю. Hасколько я припоминаю, суть была в том, чтобы разрешить IM2 и обеспечить по прерыванию "вылет" из процедуры в которой процессор в обычных случаях зацикливался. Hа не-совковые компы рассчитывать незачем. TRDOS у буржуев крайне непопулярна. А у совковых компов шина стабильна. Если у кого и нестабильна, то это очень редкое исключение (Совковый спек + TRDOS + нестабильная шина). Такие люди встречаются очень редко и ими можно пренебречь.

От Константин Жуков Кому All 14.09.2006

Hello, The Exploited The> ага, это было описано в древнючем zx review ;) The> Между тем способом, что написал я и ревюшным есть большая разница (взгляните хотя бы на длину процедуры). В Ревю необходимо было подобрать задержку между прерываниями так, чтобы при вызове TRDOS сразу после считывания 1F происходило прерывание. Это ведь потеря оборота диска. А как быть если время у разных компов между прерываниями разное? Мой способ лишен этих недостатов. Во-вторых, если регистр 1F равен нулю, считывание регистра происходит мгновенно.

От Марк Антонов Кому All 14.09.2006

Hello, Raider Rai> Если кому интересно - то на шину выдается байт аттрибутов. Происходит Rai> это потому что ULA и процессор развязаны в фирменной схематике просто Rai> резисторами, и процессор "подхватывает" байт аттрибутов выдаваемый Rai> ULA. это так, только вот висят там эти атрибуты исключительно, когда луч идет по экрану, и соответственно во время ИHТа там #FF Rai> И именно таким методом, если ничего не путаю. Hасколько я припоминаю, Rai> суть была в том, чтобы разрешить IM2 и обеспечить по прерыванию Rai> "вылет" из процедуры в которой процессор в обычных случаях Rai> зацикливался. ага, это было описано в древнючем zx review ;) Rai> Hа не-совковые компы рассчитывать незачем. TRDOS у буржуев крайне Rai> непопулярна. А у совковых компов шина стабильна. Если у кого и Rai> нестабильна, то это очень редкое исключение а вот это заблуждение, в оригинальном пентагоне128 нестабильна шина данных, когда подключено пзу трдос. во время инта вектор берется с трдосного порта #FF Rai> Такие люди встречаются очень редко и ими можно пренебречь. нельзя =( преценденты были и довольно жестокие

От Марк Антонов Кому All 14.09.2006

Hello, Jukov так я не про твой способ, а тот, что Raider написал - цитата-то на что указана...

От Dmitry Malychev Кому All 19.09.2006

Hello, The Exploited Hасчет того, почему фирменные игрушки используют 257 байт таблицу - я как-то читал буржуйскую доку по программированию (увы, сейчас не нашел), и там было сказано что-то вроде "во время инта по идее таки должно быть FF, но всякие внешние устройства у конкретного юзверя могут гадить на шину, так что лучше подстраховаться". В качестве примера таких "устройств" (кажется) назывался интерфейс-1, а также "в некоторых случаях" даже AY!

От TomCaT Кому All 19.09.2006

Hello, Lethargeek Let> "во время инта по идее таки должно быть FF, но всякие внешние Let> устройства у конкретного юзверя могут гадить на шину, так что лучше Let> подстраховаться" Книга "Как написать игру..." тоже так прямо и указывает. Там, правда, забыли про быструю память и шуруют в последних адресах -- явно все под 48к.

От moroz1999 Кому All 19.09.2006

Hello, TomCaT а кто-нибудь может более-менее доступным языком объяснить термины "маскируемые" и "немаскируемые" прерывания? А еще почти во всех статьях умалчивают про im0 и im1. где они используются и как работают?

От Alexandr Sinyakov Кому All 19.09.2006

Hello, Jukov "Маскируемые" - это те, обработку которых можно запретить или разрешить программно (di, ei). Это все INT (im0, im1, im2). С немаскируемыми такого сделать нельзя. Пример - NMI, по аппаратному сигналу насильно вызывается прога по адресу 102 в DOS сигнал INT с частотой 50Гц подаётся на процессор и тот решает, что в таком случае делать обработка запрещена - ничего разрешена - согласно текущему режиму (im0, im1, im2): im0 - с шины данных снимается и выполняется команда. Только всегда получается так, что это #FF (rst 56), поэтому работает оно так же как и im1 (если никакая железяка на шине в это время не мусорит) im1 - вот тут у меня точно провал в памяти (вроде, просто делается call 56) im2 - с адреса снимаются 2 байта, это адрес процедуры обработки прерываний. Туда и делается переход

От moroz1999 Кому All 20.09.2006

Hello, SAM style спасибо! но про im1 всё же интересно.

От Камиль Каримов Кому All 20.09.2006

Hello, moroz1999 mor> спасибо! но про im1 всё же интересно. Режим IM 1 используется в маленьких вычислительных системах, где достаточно одного-единственного вектора маскируемого прерывания. При поступлении запроса прерывания микропроцессор сохраняет адрес возврата в прерванную программу в стеке и осуществляет переход на адрес 0038h. Таким образом, в этом режиме маскируемые прерывания обрабатываются точно тем же способом, что и немаскируемые. Разница заключается в возможности их маскирования и в адресе обработчика прерываний.