Программистам - Перехват Reset'a на 128к машинах (на примере игры Doble Xinox).

ZX-News #17
            ┌───────────────┐
            │ Программистам │▒
            └───────────────┘▒
             ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

       (c) Михаил Блюм (Zx-Masters)
        ──────────────────────────

   "Перехват" reset'а на 128к машинах.

  Многие, поиграв в игру  "DOUBLE XINOX" и
нажав в ней на reset, пришли в полное  не-
доумение, увидев   надпись, подтверждающую
ваше решение сбросить программу, причём не
на Scorpion'е, а на обыкновенном 128!

  К моему глубокому  удивлению, среди этих
многих  оказались некоторые программисты и
хакеры...  Секрет этого  "глюка" настолько
прост, что мне просто  неудобно говорить о
нём, но по  просьбе  редакции газеты я это
сделаю.

  Как  известно, в 128К компьютере имеются
две  области памяти, отведённые под экран:
стандартная - с адреса _#4000_ в  основном
поле  памяти, и  дополнительная - с адреса
_#C000_ в банке  RAM7. Выбирать нужный эк-
ран надо через порт _#7FFD_, сбрасывая или
устанавливая  третий бит. Если бит устано-
вить, то  будет  отображаться второй экран
(RAM7), если его  сбросить, то стандартный
(RAM5).

  Теперь  о  Reset'е.  При приходе сигнала
reset  аппаратно устанавливается стандарт-
ный  экран, который  очищается  программой
инициализации, расположенной  в  свою оче-
редь с адреса _#0000_ в ПЗУ в момент отжа-
тия кнопки "RESET".

  Таким образом, если использовать в прог-
рамме только дополнительный экран, а в ос-
новной  поместить  какое угодно сообщение,
то  при Reset'е оно появится! В DOUBLE XI-
NOX'е, например, сообщение находится в об-
ласти атрибутов в целях экономии памяти.

               === cut ===

        ORG 30000
START   DI
        LD A,23
        CALL MEMORY
        LD HL,49152
        CALL CLS
        LD HL,16384
        CALL CLS
        LD A,23+8
        CALL MEMORY
        LD HL,TEXT
        LD DE,22528+256
        LD BC,32*7
        LDIR
LOOP    JR LOOP
MEMORY  LD BC,32765
        OUT (C),A
        RET
CLS     LD E,L
        LD D,H
        INC E
        LD BC,6911
        LD (HL),L
        LDIR
        RET

        ;12345678901234567890123456789012
TEXT DM "                                "
     DM " @@@@@  @@@@@  @@@@ @@@@@ @@@@@ "
     DM " @   @  @     @     @       @   "
     DM " @@@@@  @@@@@  @@@  @@@@@   @   "
     DM " @  @   @         @ @       @   "
     DM " @   @  @@@@@ @@@@  @@@@@   @   "
     DM "                                "

               === cut ===

        __________________________
           ────────────────────