Adventurer #08
31 августа 1998

Обмен опытом - Доработка ZX-ASM v3.0 от Ивана Рощина.

<b>Обмен опытом</b> - Доработка ZX-ASM v3.0 от Ивана Рощина.
     (C) Иван Рощин, Москва, 1998

         Доработка ZX ASM 3. 0

     Этому очень хорошему ассемблеру   не
хватает некоторых возможностей, необходи-
мых  при отладке программ. Так, после за-
пуска  отлаживаемой программы и окончания
ее работы управление сразу же передается 
ассемблеру,  и  иногда  просто невозможно
разглядеть,  что же вывела на экран прог-
рамма. Тут не помешала бы задержка до на-
жатия  любой  клавиши. Естественно, такая
задержка должна быть отключаемой по жела-
нию пользователя.
     Неплохо  было  бы  иметь возможность
увидеть  экран  отлаживаемой  программы в
любой момент работы в ассемблере. При от-
ладке программ на  PC , например, с помо-
щью  Turbo  Debugger  ,  можно  поступить
наиболее  естественно:  подключаем к ком-
пьютеру два монитора и на одном видим от-
ладчик,  а на другом - экран отлаживаемой
программы.  Спектруму , конечно, до этого
далеко,  но  кое-что  можно  сделать и на
нем.  Например, переключать экран ассемб-
лера  и экран программы, просто нажав не-
которую комбинацию клавиш.
     Иногда  сразу после окончания работы
запущенной из ассемблера программы бывает
необходимо   запустить   отладчик.   Если
действовать обычным путем (т. е. вызывать
отладчик из ассемблера), от окончания ра-
боты программы до запуска отладчика прой-
дет  довольно заметный промежуток времени
(около  двух  секунд). Это связано с тем,
что  и при возврате в ассемблер и при вы-
зове  отладчика происходит обмен областей
памяти.  Поэтому полезной была бы возмож-
ность запуска отладчика сразу после окон-
чания работы программы, при нажатии опре-
деленной комбинации клавиш.
     Оказывается,   все  эти  возможности
можно   реализовать,  и  притом  довольно
просто.  Как  это сделать, будет показано
ниже,  а  сейчас  рассмотрим,  как  будет
выглядеть работа с таким ассемблером.
     Включать и отключать режим ожидания 
нажатия   клавиши  после окончания работы
запущенной  из ассемблера программы можно
с  помощью  изменения цвета бордюра (меню
Setup/Colors  ).  Если  установить цвет 0
режим  выключен, 1 - включен. Можно уста-
новить и другие цвета, роль играет только
младший бит задаваемого числа.
     Когда режим включен, после окончания
работы запущенной из ассемблера программы
или  подпрограммы  ( пункты  меню  Run  и
Call ) бордюр станет зеленым (это сигнал,
что  вам нужно  нажать  клавишу). При на-
жатии клавиши "D" сразу же запустится от-
ладчик, а при нажатии любой другой клави-
ши управление будет передано ассемблеру.
     Такой  же  эффект  (пауза до нажатия
клавиши)  возникнет и в том случае, когда
вы просто запускаете ассемблер (например,
вышли  из  него  в Бейсик , а потом снова
запустили командой  RUN ; или когда вышли
из  ASM 'а в отладчик, а оттуда - опять в
ассемблер).  В  этом случае просто дольше
удерживайте нажатой клавишу  ENTER .
     Теперь о том, как в любой момент ра-
боты с ассемблером посмотреть экран отла-
живаемой  программы. Когда программа, за-
пущенная  из ассемблера, заканчивает свою
работу  (или  когда  вы просто запускаете
ассемблер),  содержимое дисплейного файла
(#4000- #5AFF) перебрасывается в 7-й банк
ОЗУ , на альтернативный экран. Чтобы пос-
мотреть его содержимое, достаточно нажать
комбинацию  клавиш  SS+I  в  любое время,
когда  ассемблер ждет от вас нажатия кла-
виши. Эта возможность не зависит от того,
включен  ли режим ожидания нажатия клави-
ши.
     Ну  а теперь - действия по доработке
ассемблера.
     Запустите  ZX  ASM , потом с помощью
меню Run/Debugger запустите отладчик. Ус-
тановите  Bank=#1C  (в  этом банке памяти
находится  ассемблер).
     По  адресу  #C000  (точка входа для 
запуска ассемблера) поместите команду  JP
#D562.  Таким образом, при каждом запуске
ассемблера  (в том числе и после выполне-
ния пунктов меню  Run/Run и Run/Call ...)
управление  будет передаваться  по адресу
#D562.
     По  адресам  #D55F, #D560, #D561 по-
местите коды #FF. Это нужно, чтобы отклю-
чить   обработку   меню   Print/Format  ,
Print/fonT , Print/Driver . Они все равно
не нужны, т. к. соответствующие функции в
этой версии  ZX ASM  не поддерживаются. А
на  освободившемся месте разместим собст-
венную подпрограмму:

#D562:  LD      A,(#5C48) ;BORDCR -
                          ;переменная 
                          ;Бейсика
        BIT     3,A       ;Значение 3-го
                          ;бита определ.
                          ;необходимость
                          ;ожидания
                          ;нажатия  клав.
        JR      Z,#D589   ;Если 0 - сразу
                          ;на запуск ASM

;Задержка до нажатия клавиши:

        LD      A,#04     ;Зеленый BORDER
        OUT     (#FE),A

#D56D:  XOR     A         ;Ждем...
        IN      A,(#FE)
        CPL
        AND     #1F
        JR      Z,#D56D

        LD      A,#FD     ;Нажата "D"?
        IN      A,(#FE)
        BIT     2,A
        JR      NZ,#D589  ;Нет - запуск
                          ;ASM

;Если нажата клавиша "D", запускаем
;отладчик (т.е. передаем управление
;на адрес #DB00 в 7-м банке памяти):

        LD      HL,#DB00  ;Адрес
        PUSH    HL        ;В стек его...
        LD      BC,#7FFD  ;Порт
        LD      A,#1F     ;Туда выдаем
        JP      #1E7D     ;Там команды
                          ;OUT (C),A: RET


#D589:  LD      HL,#D5EF  ;Перебрасываем
        LD      DE,#5B58  ;подпрограмму
        LD      BC,#0019  ;сохранени 
        LDIR              ;экрана
        CALL    #5B58     ;и выполняем ее


        LD      HL,#D5CC  ;Перебрасываем
        LD      DE,#5B58  ;п/п обработки
        LD      BC,#0023  ;нажатия клавиш
        LDIR

;Теперь везде, где в ассемблере стоит
;команда LD A,(#5C08), т.е. проверка,
;нажата клавиша или нет, поместим
;команду вызова нашей п/п, которая
;будет отслеживать нажатие пользователем
;комбинации клавиш SS+I:

        LD      HL,#5B58   ;адрес п/п
        LD      A,#CD      ;код CALL
        LD      (#E2C3),A
        LD      (#E2C4),HL ;вместо
        LD      (#E868),A  ;LD A,(#5C08)
        LD      (#E869),HL ;помещаем
        LD      (#EAD0),A  ;CALL #5B58
        LD      (#EAD1),HL
        LD      (#EF9F),A
        LD      (#EFA0),HL
        LD      (#F22A),A
        LD      (#F22B),HL

;Запуск ASM'а: в исходном варианте по
;адресу #C000 были команды CALL #C006:
;JP #6000. Но их нельзя здесь писать,
;т.к. при работе подпрограммы #C006
;происходит обмен участков памяти, и
;при возврате из нее окажется, что
;вместо команды JP #6000 будет что-то
;постороннее. Поэтому приходится писать
;так:

        LD      HL,#6000
        PUSH    HL
        JP      #C006

;Подпрограмма обработки нажатия клавиш.
;При своей работе находится в буфере
;принтера с адреса #5B58.

#D5CC:  LD      A,(#5C08)  ;код клавиши
        CP      #AC        ;это SS+I ?
        JR      NZ,#D5EE   ;нет->выходим


        XOR     A
        LD      (#5C08),A
        PUSH    BC
        LD      BC,#7FFD   ;устанавливаем
        LD      A,#1C      ;альтернативн.
        OUT     (C),A      ;экран
#D5DF:  LD      A,(#5C08)  ;и ждем
        AND     A          ;нажатия
        JR      Z,#D5DF    ;клавиши
        LD      A,#14
        OUT     (C),A      ;осн. экран
        XOR     A
        LD      (#5C08),A
        POP     BC
#D5EE:  RET                ;выход из п/п


;Подпрограмма сохранения экрана.
;Вызывается при каждом запуске ассемблера
;в том числе и после окончания работы
;запущенной из него программы.

#D5EF:  LD      BC,#7FFD
        LD      A,#17     ;установили
        OUT     (C),A     ;7-й банк
        EXX
        LD      HL,#4000  ;сохраняем
        LD      DE,#C000  ;экран
        LD      BC,#1B00
        LDIR
        EXX
        LD      A,#14     ;восстановили
        OUT     (C),A     ;банк ASM'а
        RET

   После того,  как  вы набрали эту прог-
рамму, запишите ее в файл "STOPKEY" с па-
раметрами:  Start=#D55F,  Length=#A9. Для
контроля привожу дамп этой области  памя-
ти:
  #D55F: #FF,#FF,#FF,#3A,#48,#5C,#CB,#5F
  #D567: #28,#20,#3E,#04,#D3,#FE,#AF,#DB
  #D56F: #FE,#2F,#E6,#1F,#28,#F8,#3E,#FD
  #D577: #DB,#FE,#CB,#57,#20,#0C,#21,#00
  #D57F: #DB,#E5,#01,#FD,#7F,#3E,#1F,#C3
  #D587: #7D,#1E,#21,#EF,#D5,#11,#58,#5B
  #D58F: #01,#19,#00,#ED,#B0,#CD,#58,#5B
  #D597: #21,#CC,#D5,#11,#58,#5B,#01,#23
  #D59F: #00,#ED,#B0,#21,#58,#5B,#3E,#CD
  #D5A7: #32,#C3,#E2,#22,#C4,#E2,#32,#68
  #D5AF: #E8,#22,#69,#E8,#32,#D0,#EA,#22
  #D5B7: #D1,#EA,#32,#9F,#EF,#22,#A0,#EF
  #D5BF: #32,#2A,#F2,#22,#2B,#F2,#21,#00
  #D5C7: #60,#E5,#C3,#06,#C0,#3A,#08,#5C
  #D5CF: #FE,#AC,#20,#1B,#AF,#32,#08,#5C
  #D5D7: #C5,#01,#FD,#7F,#3E,#1C,#ED,#79
  #D5DF: #3A,#08,#5C,#A7,#28,#FA,#3E,#14
  #D5E7: #ED,#79,#AF,#32,#08,#5C,#C1,#C9
  #D5EF: #01,#FD,#7F,#3E,#17,#ED,#79,#D9
  #D5F7: #21,#00,#40,#11,#00,#C0,#01,#00
  #D5FF: #1B,#ED,#B0,#D9,#3E,#14,#ED,#79
  #D607: #C9

     Затем  выйдите  из  отладчика  в  ZX
ASM . Сразу  же  можно  опробовать работу
комбинации  клавиш  SS+I . Правда, ничего
интересного  вы  на альтернативном экране
пока не увидите - там будет всего-навсего
то, что  было на основном экране в момент
выхода в  ZX ASM .
     Установите Border = 1, , чтобы вклю-
чить  режим ожидания нажатия клавиши. При
этом  бордюр  станет  синим. Наберите ка-
кую-нибудь программу, ассемблируйте и за-
пустите  ее.  После  окончания  ее работы
бордюр  должен стать зеленым. Нажмите лю-
бую  клавишу. Теперь при работе в ассемб-
лере вы можете в любой момент увидеть ре-
зультаты  работы  вашей  программы, нажав
SS+I .
     Чтобы при каждой загрузке ассемблера
вам  не  приходилось загружать в 4-й банк
ОЗУ  файл  "STOPKEY"  и  ставить  команду
#C000: JP #D562, попробуйте сами написать
новый загрузчик для  ZX ASM , который вы-
полнял  бы  эти  действия  автоматически.
Простейший способ - воспользоваться кноп-
кой  MAGIC  (если получится, конечно).



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

От автора - помощь: Новые глюки в новой оболочке.

От автора - автора: об авторах журнала.

Презентация - Авторские программы: Installer to AUTORUN DISK v2. 0, адвентюрная игра Diamond.

Презентация - программа для защиты программ TRICK v1. 003b.

Презентация - HELP Z_80: Руководство пользователя.

Интерфейс - письма читателей: Черный ворон, Секрет игры NEW DIZZY, Об ошибках игры APOLLO, о новой веросии отладчика STS 6.2, Как пройти игру Святогор.

Интерфейс - PC vs Amiga: Так ли AMIGA RULEZ? Первые впечатления неофита.

Интерфейс - о поддержке производителями "железа" своих "творений" после того, как они (творения) попадают в руки пользователей.

Интерфейс - мысли вслух: "SPECCY компьютер для молодых. Если у нас так много крутых кодеров, то почему так мало крутого отечественного soft'а?"

Интерфейс - загоны от CAV inc: "SPECCY это не работа, это отдых, это, даже, больше, чем отдых, это стиль жизни, и, если за это вам еще удается получить деньги..."

Интерфейс - SPECCY за и против, Размышления Spy/Eternity Industry.

Система - Обзор системных программ: ZX-IBM Editor v1.5M , PPF v1.05, Multistudio v2.0p, Mods Player v2.0, Bitmap Viewer v2.0, Corrector v2.0, Storm v1.1, 866 v1.2, HRUM v3.5, TDU v1.0, HRUST v1.0, RLE-Compressor v1.21, Оверлеи Consul Commander.

Обзор игрушек - Обзор новых игровых программ: Rabbit Jazzy, Quadrax, Komplex, Math of the day, Cue Boy, Zly Sen, Prva Aakcia, Outlaw, The Dark Empire, Gary Linekers.

Обзор игрушек - демоверсии: Little Ghost, The Dark Empire, Worms, Смагли 3, Monster Land, Цивилизация, Тайны капитана Шелтона.

Гости - Презентация группы группы из Коврова - Eternity Industry.

Гости - Filix о создании игры ВИННИ ПУХ-2.

Гости - экстремальщики: новая рубрика, освещающая аспекты жизни и творчества экстремальных рыбинских музыкантов. Сегодня в гостях Марат и Демон - стоявшие у истоков такой известной (в узких кругах) команды "Disgust".

Раскрутка - Как играть в игру Encyclopedia of WAR.

Раскрутка - прохождение игры Where time Stood Still.

Раскрутка - описание игры Elopement: back to the Earth.

Раскрутка - прохождение текстовой адвентюры Остров тьмы (Island Darkness).

Раскрутка - прохождение текстовой адвентюры Knightmare.

Обмен опытом - Русские глюки: игра Остров тьмы (о том, как НЕ НАДО писать адвентюрные игры).

Обмен опытом - Доработка ZX-ASM v3.0 от Ивана Рощина.

Обмен опытом - Особенности видеоконтроллера ZX Spectrum (для программистов).

Обмен опытом - Графический эффект IRIS (плазма).

Обмен опытом - процедура вывода окна с рамкой.

Обмен опытом - о том как оперировать в ассемблере с длинными числами типа Long.

Обмен опытом - Art Studio и принцип открытой архитектуры (как написать свои модули к редактору).

Обмен опытом - процедура Движение атрибутной надписи по пикселям (плавающие атрубуты).

Оттяг - Повесть про Пентиума Пентиумовича Пентиумова. 20 вещей , которые можно сделать, если ваша любимая команда проиграла в гостях. Унитаз, как мерило человеческих ценностей.

Оттяг - Тест "Формацевт, проверка на подлинность".

Оттяг - Тест "Ты случайно не тупая задница".

Оттяг - Тест "Есть ли у тебя чувство юмора".

Оттяг - Тест "Какой из тебя студент".

Оттяг - Как ПРАВИЛЬНО убить Windows'95.

Оттяг - Винни-Пух и все-все-все - 2.

Новелла - Сказки Капрала Джилана (по игре Laser Squad).

Новелла - Побег из космоса (по игре Elite).

Новелла - Ежики мутанты.

Новости - новости от Рыбинских спектрумистов: Infosoft, Shrsoft, Surgeon, Chasm, Protecvision, Groboclone, Volume 4, Expеrience, Mr. Vano, Ant, Demon, Miguel, Veka, RDM, Auryn.

Новости - новости от Ярославских спектрмистов: Marchy, Kav Software, Nicolas Viper, Dr Shura, Harkonnen, MacKeymn, DJ Reason.

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


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

Похожие статьи:
Вступление - история создания журнала.
Ассемблер - мультиколор; Работа с расширенной памятью; удобный оконный интерфейс.
На заметку - Реальное положение дел в ассоциации Amazing Software Making (А.S.M.)
Энциклопедия - архитектура ZX Spectrum, языки программирования.
Оттяг - Список полезных вещей о сексе.

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