Маленькие Хитрости
Признаться по совести, нам очень понравилась идея создания универсального программного "дебюта", предложенная автором предыдущей статьи. Конечно, "универсального" не в том смысле, что он должен быть один на всех и всех устраивать, а в том смысле, что каждый, кто программирует на "Спектруме", сможет сделать для себя собственную домашнюю заготовку и "подшивать" ее всякий раз, когда ему придет в голову написать какую-нибудь программу.
Идея "дебюта" - это не только программистская идея, ее ценность идет гораздо дальше. Из мемуаров известно, с каким трудом многие творческие личности берут себя по утрам за шиворот и тянут к письменному столу работать, а ноги упирается. Куда приятнее: подошел к столу, нажал пару кнопок и готово дело, дебют уже сделан, можно с чистой совестью отправляться обедать, а потом и вовсе отдыхать.
Многие писатели практикуют даже такой прием: отходя ко сну, они бросают своих героев на самом интересном месте, обрывая фразу на полуслове. А на следующий день спокойно с утра добьют своих героев, похоронят, если получится, и таким жизнерадостным дебютом начинают новый день в самой работоспособном настроении.
Вот и мы прочитали статью уважаемого автора и захотелось "плодотворную дебютную идею" (как говаривал высокочтимый нами Остап Ибрагимович) как-то развить и упрочить. Захотелось и свой вклад в большое дело внести. Попробовали и так и этак, ничего в голову не идет - надо все-таки программировать, а без этого ну просто никуда.
И тут нас осенило: ну зачем нам программировать!? Ведь в компьютере уже есть куча программ в ПЗУ. Может быть ими и воспользуемся? Зачем велосипед изобретать?
Взялись за дело. Все ПЗУ прошарили, все обыскали, пачку бумаги испачкали - но нет там ничего такого, чтоб компьютер сам за нас программу написал. Эх, лучше было бы это время на "ЭЛИТУ" потратить. И вдруг...
Самое интересное всегда происходит неожиданно. Вдруг по адресу 196ЕН (6510 -десятиричное) мы нашли процедуру, которая выдает адрес начала любой БЕЙСИК-строки в оперативной памяти, особенно если вы предварительно зашлете номер этой строки в регистровую пару HL процессора. После того, как процедура отработает, она оставит искомый адрес в той же регистровой nape HL.
НУ вот, решили мы, половина дела сделана. Адрес начала любой строки компьютер найдет сам, осталось только, чтобы он сам и строку туда записал. Но не тут то было - ничего для этого в ПЗУ нет. Тут что-то Клайв Синклер недодумал, за что только его лордом сделали?
Но мы не отчаялись и нашли еще одну интересную процедуру, которая начинается с адреса 19Е5Н (6629 DEC). Эта процедура способна уничтожить все, что находится в БЕЙСИК-программе между адресом, который установлен в регистровой паре DE, и адресом, который установлен в регистровой паре HL. В общем, шикарный метод для стирания программ. Не совсем то, что мы искали, но хоть что-то. Уж если не попрограммируем, зато хоть постираем от души, благо все делается автоматически.
А ведь если честно, то какое же программирование без хорошего стирания? Вы когда-нибудь хоть строчку написали, чтобы ее потом не стирать? Вот то то же! Всякое правильное программирование всегда начинается со стирания того, что ранее было запрограммировано неправильно.
А уж объединить эти две процедуры в одну программу в машинных кодах - дело нехитрое. Вот и получилась такая миленькая программа, размером всего в 19 байтов, которая хотите верьте, хотите нет, а сэкономит массу времени любому, кто хоть когда-нибудь написал что-то длиннее, чем тридцать строк.
Можете теперь ее встроить в свой собственный "дебют", если хотите, можете держать ее отдельно. Делайте с ней, что хотите, храните в любых адресах, можете встроить в БЕЙСИК-строку, воспользовавшись приемом, которым поделился автор предыдущей статьи.
Мы же, не зная заранее, куда Вы предпочтете ее препроводить, разместили код в буфере принтера, начиная с адреса 23300, а БЕЙСИК-загрузчику выделили строки выше 9990, чтобы под ногами не путался.
Итак, распечатка того, что у нас вышло, помещена в Листинге 1. А распечатка БЕЙСИК-загрузчика приведена в Листинге 2. Самое интересное - то, что самой этой же программой можно стереть и этот БЕЙСИК-загрузчик. Правда, при стирании строки 9996 будет выдано сообщение C: Nonsense in BASIC, но оно уже никакого значения для нас не имеет.
Так что стирайте в собственное удовольствие все, что хотите. Обратите только внимание на нашу статью, посвященную ошибкам в ПЗУ - там в разделе, посвященном функциям пользователя FN () кое-что сказано о том, почему нельзя код для стирания строк оформлять в виде пользовательских функций.
Успешного Вам DELETa!
Листинг 1
210000 |
LD HL,00 |
Номер начальной строки помещается в HL. |
|
|
Сейчас там нули, но когда Вы введете |
|
|
свое число, оно поступит туда. |
CD6E19 |
CALL 196EH |
Вызов процедуры ПЗУ для определения |
|
|
адреса начала строки. |
Е5 |
PUSH HL |
Запомнили полученный адрес на стеке. |
210000 |
LD HL,00 |
Номер конечной строки помещается в HL. |
|
|
Сюда мы тоже введем свое число. |
33 |
INC HL |
Указание на следующую строку, которая не |
|
|
будет удалена. |
CD6E19 |
CALL 196EH |
Определили адрес конца последней строки. |
D1 |
POP DE |
Адрес начальной строки сняли со стека в DE |
CDE519 |
CALL 19E5 |
Удаление строк из заказанного интервала. |
C9 |
RET |
Возврат в БЕЙСИК. |
Листинг 2
9991 DATA 33,0,0,205,110,25,229,33,0,0,35,205,110,25,209,205,229,25,201
9992 RESTORE 9991: FOR n=0 TO 18: READ а: POKE 23300+^а: NEXT n
9993 INPUT "Введите номер начальной СТРОКИ"; а
9994 POKE 23301,a-256*INT(a/256): POKE 23302, INT(a/256)
9995 INPUT "Введите номер конечной строки"; b
9996 IF b
9997 POKE 23308,b-256*INT (b/256): POKE 23309, INT (b/256)
9998 RANDOMIZE USR 23300