Adventurer
#08
31 августа 1998 |
|
Обмен опытом - Доработка 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 (если получится, конечно).
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября