Echo #03
31 марта 1997

Ассемблер - одна интересная штучка с ассемблером.

<b>Ассемблер</b> - одна интересная штучка с ассемблером.
┌════════════════════════════════════════┐
│░░░░░░░░░░ Маленькие хитрости ░░░░░░░░░░│
└════════════════════════════════════════┘

(C) VfNG/NEW

   А  хотите  упасть?  Те кто не знает тот
фокус,  какой  я сейчас собираюсь описать,
точно упадут. Прикупите матов (нет,  спор-
тивных),  побольше ваты, йода  и медсестру
помоложе (пригодится).

   Набейте  или  выгрузите следующую прог-
рамку:

;-----------------------------------------
        ORG     #6200
;-----------------------------------------
        CALL    #C000 ;инициализация
                      ;музыкального
                      ;модуля
;-----------------------------------------
        DI               ;инициализируем
        LD      HL,#6000 ;IM 2
        LD      B,L      ;Вектор #6000
        LD      A,H      ;Процедура
        LD      I,A      ;обработки-
        INC     A        ;#C006, т.е.
L1      LD      (HL),A   ;проигрыватель
        INC     HL       ;мелодии
        DJNZ    L1
        LD      (HL),A
        LD      L,H
        LD      (HL),#C3
        INC     HL
        LD      DE,#C006 ;адрес процедуры
        LD      (HL),E   ;проигрывания
        INC     HL
        LD      (HL),D
        IM      2
;-----------------------------------------
        LD      HL,BEGIN         ;с
        LD      BC,#C000-BEGIN-3 ;адреса
L2      LD      (HL),#FB ;BEGIN создаем
        INC     HL       ;сколько влазит
        DEC     BC       ;команд EI
        LD      A,B
        OR      C
        JR      NZ,L2
        LD      (HL),#C3 ;после всей кучи
        INC     HL       ;EI переход на
        LD      DE,BEGIN ;BEGIN
        LD      (HL),E
        INC     HL
        LD      (HL),D
;-----------------------------------------
BEGIN           ;EI: EI: EI... JP BEGIN
;-----------------------------------------
        ORG     #C000
;-----------------------------------------
        INSERT  "MUSIC" ;какой-нибудь
                        ;музыкальный
                ;модуль, скомпилированый в
                ;#C000. Например, от PT2
                ;или Sound Tracker'а.

   Прикинем логику работы программки. Сна-
чала  она синициализирует IM 2, затем соз-
даст  в  памяти  процедуру,  состоящую  из
сплошных  EI-шек  и  одного  JP  чисто для
зацикливания.  Затем  эта  самая процедура
запустится.  Так как она состоит только из
EI,  то  на  какой-то  команде придет пре-
рывание,  значит  вызовется  проигрыватель
музыки  и из динамика польется сладкая ме-
лодия. Все верно? Запустите программу...

                   * * *

   Вас уже выписали из больницы? Как голо-
ва?  Все  еще  побаливает  после  падения?
Жаль,  что  так  получилось. Но я надеюсь,
вас  еще  интересует, почему эта программа
сработала  несколько  не  так,  как от нее
ожидалось?

   А ларчик открывается просто. Все дело в
команде  EI.  На  самом деле она не только
разрешает  прерывания,  а еще и ... запре-
щает  их! На время выполнения следующей за
собой  команды.  Этот  фокус встроен в Z80
чтобы  в  конце процедуры обработки INT'a,
заканчивающейся  EI: RET,  этот  самый RET
успевал  выполнится до прихода нового пре-
рывания. Кто-нибудь спросит: а как же тог-
да  EI: HALT, ведь по этой теории они дол-
жны  вызывать повисание? Все и тут просто:
на  самом деле команда HALT не просто ждет
INT,  а еще и вяжет носки, вaрит кашу, ме-
няет  ребенку  подгузники и генерирует ко-
манды  NOP.  Вот  на первый из HALT'овских
NOP'ов прерывания действительно запрещены,
а на все остальные-нет.

   Остается  вопрос:  где эту штучку можно
применить? Сам пока не знаю...



Другие статьи номера:

Введение - Об управлении интерфейсом газеты.

Ассемблер - одна интересная штучка с ассемблером.

Крышу снесло - DI:HALT не всегда вызывает зависание...Santa Claus.

Начнем развлекаться - Основные события 1996 года. Словарь программиста.

Собственное мнение - IMP рассказывает о развитие российской ZX-демосцены.

Чего слышно за бугром - Что сейчас делают всем известные Западные производители ПО на Спекки?..

Час оттяга - Записки Терминатора Т-1000.

Мелкие новости - Что происходит со Спекки в Белоруссии?..

Анкета - Анкетирование продолжается...

Фантастика - Фантастическая повесть "Лед и пламя" (продолжение).

Прикольчик - Прикольчик'с Новополоцка?. Какие же письма поступают к нам в лабораторию.

Описание - Описание-проходилка игры BLINKY'S SCARRY SCHOOL.

Презентация - REALSOFT представляет стратегическую игру Technodrom.

Оттяг - Оттягиваться можно по разному. Задачник - "задачки" математические.

Программистам - О дополнительных функциях TR-DOS 5.04.

Программистам - О формате музыкальных модулей Sound Tracker Pro и исходник проигрывателя.

HARDWARE - Переключатель режимов работы Profi/Pentagon.

Маленькие хитрости-2 - Как перекинуть целый экран в один INT.

Маленькие хитрости-2 - О корректной обработке Retry/Abort/Ignore в TR-DOS.

Интересное письмо - Письма читателей, содержащие разные вещи: - Если вы записали дискеты на глючном дисководе;

Презентация-2 - Описание программы TEXT PRINT v1.2.

Юмор - Рассказ про Штирлица.

Юмор - Штирлиц: Слоны идут на север.

Книга - Тайники ZX-Spectrum: оглавление.

Книга - Тайники ZX-Spectrum: Клавиатура.

Книга - Тайники ZX-Spectrum: Редактор.

Книга - Тайники ZX-Spectrum: ZX-Бейсик.

Книга - Тайники ZX-Spectrum: Компьютерная арифметика.

Книга - Тайники ZX-Spectrum: Использование Памяти.

Книга - Тайники ZX-Spectrum: Системные переменные Бейсика.

Книга - Тайники ZX-Spectrum: Каналы и Потоки.

Книга - Тайники ZX-Spectrum: Системные Процедуры.

Книга - Тайники ZX-Spectrum: Ошибки в Системе.

Реклама - Реклама и объявления ...

Послесловие - О том, что не вошло в этот номер.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От автора - Новшества во вьювере.
Реклама - Реклама NedoPC.
Local News - новости из Глазова и Перми.
Черная бездна - новелла "Рыцари новой земли" (по игре "Черная бездна").
Тема - Беседа с одним из организаторов FunTop'98 и редактором газеты Nicron - Wlodek Black'ом из Москвы.

В этот день...   21 ноября