(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 (если получится, конечно).