Из журнала Adventurer #4, Рыбинск, 18.08.1996 С исправлением из Adventurer #5 +---------------+ +-----+-+ Спрашиваете - +-+-----+ ----+ ----+---=============---+---- +---- +-----+-+ отвечаем +-+-----+ +---------------+ А теперь небольшие ответы на воз- никающие у народа вопросы на ту или иную тему по программированнию. Вопрос: "Почему когда запрещаешь прерыва- ния первого рода или переходишь на вто- рые прерывания, в ячейке LAST_KEY инфор- мация не меняется ?" Ответ: "Все очень просто! На первые пре- рывания повешена процедура опроса клавиа- туры, поэтому-то и не меняется информа- ция в LAST_KEY при отключении первых пре- рываний. Так что, если вам нравится поль- зоваться этой системной переменной, тогда оставьте в покое первые прерывания. Но если вам надо повесить что-то свое на прерывания второго рода, а та ячейка вам так симпатична, что нет никакого желания отказываться от нее, тогда в конце своей процедуры обработки прерываний ставьте не команду RET, а JP #0038. И еще, если вы пользуетесь первыми прерываниями, то ни за что не трогайте регистр IY ! В нем постоянно должно находиться число 23610, тогда, глядишь,и в LAST_KEY все будет OK. Но все равно, я бы посоветовал не извра- щаться, а пользоваться более лучшим ме- тодом. Тогда вам будет наплевать на то, что находится в IY и какие включены пре- рывания. Это выглядит так: CALL #028E CALL #031E После выполнения двух этих подпрограмм, в регистре A возвращается основной код нажатой клавиши, т.е. код заглавной бук- вы латинского алфавита или код цифры. Но если в аккумуляторе находится код #18, тогда нажата только клавиша SYMBOL SHIFT. Если там код #27, значит нажат CAPS SHIFT или, если в A код #0E, тогда нажаты и CAPS SHIFT, и SYMBOL SHIFT. Стоит обра- тить внимание и на регистр B. Если в нем находится #18, значит была нажата ка- кая-то клавиша с SYMBOL SHIFT. А если там (в регистре B ) есть число #28, тогда была нажата клавиша с CAPS SHIFT. Ну вот отсюда можно сделать соответствующие вы- воды." Вопрос: "В одном из прошлых номеров жур- нала ADVENTURER были опубликованы точки входа некоторых процедур ПЗУ. Вот, к примеру, подпрограмма CLEAR не работает из режима 128К. Следующая процедура вы- полняет те же действия, но работает прек- расно во всех режимах: LD BC,#1303 PUSH BC LD BC,STACK CALL #1EB7 Хотелось бы получить объяснение по этому поводу, т.е. почему некоторые процедуры ПЗУ отказываются работать в 128К." Ответ: "Такие глюки происходят из-за то- го, что прошивка ПЗУ 48-ого BASIC'а в SPECTRUM 128 была подправлена, т.к. эту часть ПЗУ активно использует BASIC 128. Поэтому-то, когда вы вызываете какую-ни- будь процедуру из ПЗУ BASIC 48 в режиме 128К, начинают выполняться дополнительные процедуры, которых изначально не было в 48-м BASIC'е. Но чтобы таких глюков из- бежать, нужно обнулить всего лишь значе- ние ячейки 23625. Теперь насчет выше- приведенной процедуры. То, что заносится на стек из BC - это адрес главного цикла обработки команд BASIC'а, и заносить его на стек не обязательно,т.к. на этот адрес все равно потом будет сделан переход ин- терпретатором BASIC'а. Ну а тот вызов процедуры по адресу #1EB7 практически ни- чем не отличается от того, что было напи- санно во втором номере нашего журнала. Отличие заключается в следующем: если в регистре BC находится число "нуль" и выз- вать процедуру по адресу #1EAF, тогда число из системной переменной RAMTOP бу- дет занесено в BC и очищены переменные BASIC'a. А если с нулем в BC сделать вы- зов программы с адреса #1EB7, тогда будет сделан переход по ошибке "RAMTOP no good" в BASIC ! Теперь, надеюсь, всем понятно почему в нашем журнале была дана точка входа в процедуру CLEAR по адресу #1EAF." -исправление из Adventurer #5------------ ВНИМАНИЕ: в ADVENTURER N4 в статье "Обмен опытом" была допущена ошибка! Пра- вильно должно быть так: чтобы подпрограммы ПЗУ нормально работали в 128-м режиме, надо сбросить 4-й бит пe- ременной FLAGS (23611/#5C3B). Редакция приносит извинения читате- лям за допущенную неточность. ----------------------------------------- Вопрос: "Расскажите, пожалуйста, о памяти SPECTRUM 128" Ответ: "Я-то думал с этим вопросом давно разобрались на страницах многих изданий, но, похоже, что сильно ошибался. Так уж и быть, вкратце коснусь этого вопроса. Са- мое главное это то, что дополнительная память компьютера переключается по порту #7FFD (32765). В 128-ой машине восемь страниц ОЗУ (с 0 по 7) по 16К каждая. Любую из страниц ОЗУ можно установить с адреса #C000 (49152), но стоит запомнить, что вторая и пятая страницы закреплены по адресам #8000 (32768) и #4000 (16384) соответствено. Поэтому-то их нельзя ис- пользовать как дополнительную память. Так же существуют две страницы ПЗУ, содержа- щие BASIC 48 и BASIC 128. Любая из этих страничек может быть установлена только с адреса #0000. В SPECTRUM 128 есть еще один экран. Он находится в седьмой стра- нице с самого ее начала. А теперь раскладка бит порта #7FFD (32765): 0-й, 1-й, 2-й биты ОЗУ, с их помощью переключается дополнительная память; 3-й бит отвечает за то, какой экран в данный момен активирован (если бит сброшен, тогда работает основ- ной экран, иначе включен второй эк- ран из седьмой странички); 4-й бит - это выбор ПЗУ(бит включен, выбран BASIC 48, иначе BASIC 128); 5-й бит - когда он включен значит, вы находитесь в SPECTRUM 48 и поль- зоваться дополнительной памятью не можете; 6-й и 7-й биты не используются." На этом я закончу разбор вопросов, хотя таких накопилось немало, т.к. что- то нет у меня сил продолжать эту писани- ну, я же не литературный деятель. А те, кто не получили ответа, не растраивай- тесь, я отвечу на ваши вопросы либо уст- но, либо в следующих номерах нашего жур- нала.