ZX Spectrum
Game

Multisearch

Your Spectrum (Великобритания),

Автор:

Жанр: Программирование: BASIC


Доступные версии

 Неофициальное издание
Играть!

Язык

  • Русский
  • English

Управление

  • Клавиатура(?)

Игроков

  • Один
  • Описание (авт.пер.)
  • Информация

Multisearch (С Вашего Spectrum 12, Mar.1985)

После краткого пребывания писать коммерческое программное обеспечение, мы приветствуем

гуру программирования Саймон Гудвин назад на страницах YS с его первым Основным утилита так ZIP! Multisearch может быть несколько меньше, чем его предшественник, но, как полностью перемещаемого ‘поиска и замены “полезности в всего 225 байт, это тоже посвящена искусству ускорения вашего Basic программы. Не ограничивайте себя в какой-либо другой утилиты – сделать больше Multisearch!

Сколько раз вы с трудом пережила программы ZX Basic, замена одного элемента на другой? Ну, отчаяние не более, Multisearch будет быстро и автоматически найти и заменить почти любой выбранный элемент. Эта процедура является простой в использовании и имеет длину всего 225 байт. Он будет работать где-нибудь в памяти (так что это не мешает другим утилит) и, более того, оказывается, есть много полезной и неожиданной приложения.

МОЩНЫЙ ВОЗМОЖНОСТИ

Возможности Multisearch не ограничиваются изменением одно сообщение для другого. Вы можете использовать его для редактирования длинных линий программы, чтобы заменить ключевые слова или программам документов (замена номерных линия ссылки с Имена). Multisearch также будет работать в другую сторону, заменяя имена с номера – что очень полезно, если вы намерены составить основную программу в машинный код.

Самые красивые из всех является возможность написания программ, которые

редактировать себя; Multisearch можно смело назвать в то время как программа работает. В этой статье мы будем исследовать внутренний формат ZX Basic и показать, как можно использовать Multisearch сделать программы быстрее, более кратким, или чтобы защитить их от людей, которые хотят возиться с ними (Неиспр ‘Пит, пожалуйста, обратите внимание).

ВДОХНОВЕНИЕ

Идея Multisearch пришел, когда YS рассмотрели работу много “программисты” наборы инструментов »количество месяцев назад. Они предназначены, чтобы сделать жизнь проще по основным программистов, но все они оказываются имеют общую недостаток – они не дадут вам заменить цифры в программе автоматически.

Некоторые из инструментариев был “поиска и замены” механизм, но они все

были досадные ограничения – например, Super Toolkit бы только заменить одиночные ключевые слова. Предлагаемое использование было изменить LPRINT в печать или наоборот, но на самом деле это довольно бессмысленно, потому что вы можете получить Тот же эффект на любой Spectrum со стандартным (но без документов) командой:

ОТКРЫТОЕ # 2, “р”

Это не посылает выход операторы печати на принтер, пока вас

отменить его с:

ОТКРЫТОЕ # 2, “S”

Если вы хотите работать в другую сторону, вы можете использовать:

ОТКРЫТОЕ # 3, “S”

отправить результаты каждого LPRINT заявлении на экран. Когда вас

хочу снова использовать принтер, команда:

ОТКРЫТОЕ # 3, “р”

будет установлен вещи в нормальное состояние.

Это немного более полезным, чтобы иметь возможность заменить текст в программе – возможно,

Вы, возможно, захотите Americanise слово «цвет», заменив его ‘Цвет’, или применять несколько подобных унижений. Но, безусловно, самым полезным Применение перегородок каждый инструментарий – проблему изменения числовые значения в программе.

ВНУТРИ BASIC

Сопровождающий рисунке показана довольно сложный путь Spectrum сохраняет простое Основная программа:

10 PRINT 2 + VAL “2”

20 GO TO 10

Большинство данных является код ASCII – например, 34 является код

кавычках и 236 это код ключевого слова GO TO. Полный список значения ключевых слов в Приложении А к руководству Spectrum – посмотрите на странным образом спектра хранит номера.

Большинство номеров в программе также хранятся в скрытом “виде двоичного кода”

который занимает шесть дополнительных байтов. Это сделано с целью заставить программу работать больше быстро, за счет устранения необходимости в компьютере для преобразования чисел из Текст в двоичный, когда они найдены. На практике, VAL “2323” может быть обрабатываются почти так же быстро, как число 2323, и первые использует версию три меньше байт, так как значение строки не имеют скрытый ‘двоичный форма “.

На рисунке вы можете увидеть, что VAL “2” нуждается в трех меньше байт, чем “2”

сама по себе. ‘2’ номер сопровождается “маркера” байт (код 14) который говорит программе LIST, чтобы пропустить следующие пять байт – двоичный форма числа. При выполнении программы, текст игнорируется, и бинарная форма используется.

Двоичный находится в довольно странной форме – тот, который объясняется в доктора Иэна

Отличная книга Логана, Понимание Вашего Spectrum (опубликован Melbourne House). К счастью, с помощью Multisearch, вам не нужно чтобы понять формат манипулировать его.

Получается, что числа в ZX основных программ необходимо бережное отношение,

как они могут сожрать память с угрожающей скоростью. Некоторые выражения для цифры еще более кратким, чем версии “Вал”, потому что они используют Ключевое слово ПИ вместо числа. PI только занимает один байт в Программа. Приведенная ниже таблица перечисляет несколько общих ценностей и выражения, чтобы заменить их, вместе с количеством байтов спас (н- представляет любое число).

Вы можете использовать переменные с заданными значениями вместо чисел, чтобы получить

похоже экономия пространства, но будьте осторожны – ZX Basic довольно медленно при нахождении значение переменных; выражения типа SGN PI может быть разработана более быстро, особенно если ваш код все равно использует много переменных.

Интересно, что значения выражены с помощью функции BIN также сохраняются

в двух формах, так что БИН 1 впитывает восемь байт – один для ключевого слова, один для цифры, и дополнительный шесть для подлинного двоичной форме.

Номера строк в начале каждой строки хранятся в более разумным

Формат «упакованы» – каждый номер занимая всего два байта. Они превращается в десятичной подпрограммой LIST в ПЗУ. Эти два байта после каждого номера строки держать длину линии, так что Basic может быстро пропустить от одной линии к другой. Символ ‘ENTER’ находится в конец каждой строки. Этот формат кратко объяснил в Spectrum Руководство, на странице 166.

Первая программа дается простой загрузчик, который будет хранить машину

Код для Multisearch по адресу 30000. Чтобы его использовать, просто запустите программу и если вы не сделали ошибки при наборе, правильный код будет храниться. Если есть ошибка в данных, должны появиться соответствующее сообщение. Желательно, чтобы сохранить программу, как только он, по-видимому запустить Правильно, на всякий случай ошибки проскользнул. Если вы сохраните Код можно затем загрузить его снова – без Basic – по любому адресу.

Multisearch на бегу

Процедура очень проста в использовании, и все, что вам нужно сделать, это загрузить код

в любом свободном месте памяти. Это долго 225 байт, так что если вы уже получил еще один машинный код рутину из адресной 53246 года, вы могли бы CLEAR, 53020 и загрузить код на 53021. Multisearch будет работать с удовольствием на Компьютер 16K. Если вы действительно настаивали на пространстве вы можете загрузить его в буфер принтера на 23296, при условии, что вы не используете принтер, пока Вы закончили с Multisearch.

Везде, где это заканчивается, вы вызываете подпрограмму, прыгнув с его начала – с

RANDOMIZE USR 53021, например. Но прежде чем сделать это, вы должны сказать Multisearch текст, который вы хотите изменить. Вы можете сделать это, установив Basic Переменные S $ и R $.

Вполне логично, что S $ должна содержать текст, который вы хотите найти, и

R $ должна содержать замену. Это и есть суть власти Multisearch – текст можно програмно создается, так что вы не просто ограничено тем, что вы можете набрать в. Вы можете ввести ключевые слова в строках по набрав ТОГДА (Символ Сдвиг “G”), за которым следует ключевое слово, а затем отступая, чтобы вычистить из ТОГДА, прежде чем нажать Enter.

При загрузке Multisearch в буфер принтера вы можете попробовать его с этой простой программе:

10 LET S $ = “СТАРЫЙ ТЕКСТ”

20 LET R $ = “новый текст” 30 RANDOMIZE USR 23296

Когда вы запустите код и список его вы увидите, что S $ и R $ сейчас относятся

для того же текста. Конечно, S $ и R $ не должны быть одинаковой длины.

Единственные ограничения, которые обе строки должны быть меньше, чем 256 символов и S $ не должно быть пустым (!). В любом случае, Multisearch обнаруживает проблему, прежде чем пытаться что-либо изменить, и сообщает “Ошибка параметра”. Если S $ или R $ не установлен, вы будете получать “Переменная не найдена” сообщение, и программа будет неизменным.

Multisearch очень быстро, но это может занять несколько секунд, чтобы сделать главным изменения в течение длительного программы. Вы можете проникнуть в него в то время, что он работает по нажимая клавишу пробела. Процедура останавливается, как только это сделано тока изменить и выплевывает “перерыв в программе ‘сообщение. Если рутинных трасс из комнаты, чтобы внести изменения он будет делать столько, сколько он может и затем сообщить “Недостаточно памяти”.

Важно понимать, что Multisearch не проверяет синтаксис линии, как это изменяет их – это было бы сделать это медленно и гораздо меньше универсальный. Однако это означает, что вы можете полностью испортить программу по, скажем, изменения все пусть ключевые слова в тычет.

Если вы коррумпированы программа, таким образом, вы получите ‘Ерунда в Basic’ ошибка при попытке запустить его. Будьте осторожны, если вы измените ключевые слова обратно автоматически – вы могли бы в конечном итоге изменить подлинные тычет в “глупости” Позволяет. Мораль этой истории такова, чтобы быть осторожным, прежде чем использовать Multisearch … Если есть сомнения, сэкономьте свое Basic, прежде чем калечить его.

Хитрый ЦИФРЫ

Это дело с помощью строки Все это очень хорошо, но это не поможет нам

заменить цифры в программных строк. Мы не можем сохранить номер в строку без сдачи его в кавычки (или с помощью STR $). ПУСТЬ $ = “1” в порядке, но LET $ = 1 дает ошибку, и мы уже обнаружили, что номера вне котировки имеют специальный формат. Чтобы проиллюстрировать это, попробуйте следующее Программа:

10 LET S $ = “40”

20 LET R $ = “60” 30 RANDOMIZE USR 23296 40 PRINT “Hello”; 50 GO TO 40 60 СТОП

При запуске этой программы она будет заменить текст “40” в строке 50 с

текст “60”. Тем не менее, он не заменит скрытый двоичной форме; Программа по-прежнему печатает ‘привет’ снова и снова, потому что ZX Basic использует бинарный вид номера строки (еще 40), и игнорирует текст полностью. Вы в конечном итоге с этой строке GO TO 60 и выполняет GO К 40!

Это очень полезный трюк, чтобы препятствовать людям редактирования вашего

программы – вы можете смешивать текст номера строк, но Программа будет работать правильно, потому что бинарные формы без изменений. Скрытый двоичный удаляется, когда линия редактируется (остановить это мешает при перемещении вдоль линии) и двоичный пересчитывается из текста при нажатии Enter. Это означает, что перемешалось значения берутся буквально после строки редактируется, меняется способ работает программа и, следовательно, препятствуя скрипачей.

Вы можете сэкономить немного памяти, заменив текст каждого номера по

одна цифра. Однако вы не можете обойтись без текста вообще – должен быть некоторый числовой текст между пойти и КПЧ $ 14, или Основные будет заметить уловки и дать игру подальше с «Ерунда в Basic “ошибки.

Бинарного выбора

Мы до сих пор не может изменить цифры правильно. Процедура сих пор будет только

изменить текст в программе … она не может заменить бинарную форму числа. Решение различать числа и строки, и использовать небольшую базовую программу выработать двоичный вид числа. необходимости рутинной дается, которые должны быть объединены с вашим Basic Программа сразу кода Multisearch загружается.

Вместо того, чтобы использовать сложную процедуру для создания бинарных форм, это

Программа «обманывает», сохраняя необходимое количество в переменной, а затем Выглядывал содержимое переменной области (которая всегда содержит двоичный Значения в той же форме, что используется в программах).

Чтобы использовать тип программы GO TO 9990 и нажмите “T” или “N”, чтобы указать,

хотите ли вы, чтобы искать текст или номер. Затем введите данные требуется, точно так, как он появляется в программе. Если вы выберите ‘N’, Программа добавляет цифровую форму в S $. Далее вы указываете замены, которые могут (еще раз) быть текст или номер. Программа останавливается, как только Запрашиваемая были внесены изменения.

Эта техника не является идеальным, но он позволяет номера, которые будут изменены

правильно, не отрицая вам возможность изменить числовой текст и оставить бинарные формы неизменной. Если вам нужно обработать шаблон, который содержит число, вы должны будете добавлять другие символы вокруг поиска или Замена строки, при помощи обычных команд обработки строк Спектр.

Вы можете использовать программу ‘двоичной форме’ в качестве подпрограммы, если вы замените

СТОП в соответствии 9902 с возвращением и избавиться от четкое заявление в Линия 9900. Однако вы должны убедиться, что V является первым переменная столкнулись, когда ваша программа выполняется. Процедура находит бинарный вид из ряда, сохраняя его в переменной V, а затем Peeking первым запись в таблице переменных. Если V не первая запись, вы получите неверные результаты.

Ассемблерный листинг

Multisearch использует ряд интересных процедур и может образовывать Основой полного базового инструментария. Сборка код рутины, производится по Whizzo нового Microdrive версии живописном редактора Монтажник, является немного более скучным, чем должно быть, так как это написано в перемещаемого кода. Это означает, что он будет работать в любом месте в памяти без изменений, но также, что он не может использовать любую внутреннюю подпрограмму вызовы, так как расположение каждого подпрограммы не является фиксированным.

Вообще говоря, программа может быть разделена на две части.

Первая часть (до этикеток ЛИНИИ) используется, чтобы найти переменные S $ и R $ и проверить, что они содержат правильные значения. Код найти S $ является дублированная, чтобы найти R $ – разница лишь в том буква названия и дополнительная проверка, чтобы убедиться, что S $ содержит по крайней мере один характер.

В НАХОДКИ, точки программа HL в переменной области, а затем смотрит

для капитала “S”. Это указывает на начало хранения выделенной S $, как описано на странице 168 руководства Spectrum. Процедура ROM F_VAR используется для перехода от одной записи к другой, пока не требуется буква найдена, или конец таблицы будет достигнута – в этом случае “Переменная не найдена” ошибка.

Строки хранятся в переменной области предшествует их длины,

записан в двух байтов в нормальном Z80 моды – младший байт первый.

Multisearch не может справиться со строками из более чем 255 байт (код простыми! ) Так что порождает “Ошибка параметра” если большинство старший байт или длина строки не равна нулю. Если все пойдет хорошо IX осталось указывая на текст S $.

От Next2 года процедура выглядит для R $. Адрес строки (Указатель на длину, в этом случае) хранится в R_LEN, в конце из базовой рабочей области под названием MEMBOT. DE заострен как раз перед началом Основного программы (как будто Enter в конце предыдущей линии было просто было достигнуто) и основной цикл по программе начинается в строке.

В ЛИНИИ процедура ожидает конец строки и начало нового

один. Это пропускает более трех байт – Введите и номер строки – и магазины указатель на длину линии в l_len. Мы должны знать, где линия Длина записывается так как мы, возможно, потребуется изменить его, если добавить или удалить символы в строке.

НАХОДКА является точка, в которой MegaSearch [так в оригинале] пытается найти поиском Строка. DE сохраняется, так что мы знаем, где матч сделал (или не сделал) происходят, а затем цикл по MATCH используется, чтобы убедиться, персонажи из DE года совпадают с IX года. Регистрация В содержит длину из S $. Если сравнение не удается до B достигает нуля, программа скачки прочь GO_ON, но если все пойдет хорошо, длина R $ извлекается и сравнению с S $. Если две такие же, выполнение продолжается в NO_OK (произносится “номер OK ‘!) – в противном случае некоторые символы должны быть вставлен или удален, так что текст замены вписывается в линию.

Работа добавления или удаления символов не является тривиальной, так как любой

Изменение размера программы также изменяет местоположение переменных, и другие полезные фрагменты информации. К счастью, ROM процедуры существуют, чтобы настроить размер программы и убедиться, что ничего не теряется. SHRNK и XPAND удалить или добавить символы BC в месте, на который указывает HL.

XPAND производит “Недостаточно памяти” ошибку, если нет места для дополнительных персонажи. Если S $ и R $ имеют разную длину, то Multisearch обязательным отрегулировать длину строки (как описано ранее) и изменить указатели на S $ и R $. Любое движение программе также отправляет переменные заноса вокруг памяти, так как они хранятся в конце программы. Это произошло некоторое время, чтобы разобраться, когда мы тестировали машинный код!

Пару дополнительных прыжков расположены между Delete и Insert Инструкция – основной цикл слишком длинный, чтобы быть пройден в один относительный переход (он может только пересечь 126 байт в одном могучий связанного), так FINDX и LINEX используются в качестве «перевалочных пунктов» на пути, чтобы найти и ЛИНИИ соответственно.

Различные пути встречаются на NO_OK. В этот момент правильно матч был

нашел и адрес на стеке указывает на место, где R $ должен быть сохраняются. LDIR используется для копирования новый текст в программу. Это оставляет DE указывая на характер после новых данных, откуда Поиск может вновь начать. Если S $ не совпадать программу мы должны продвинуться DE и начать снова один байт далее через программы. Этот шаг осуществляется на GO_ON.

Будь или не совпадение было найдено, мы в конечном итоге на NEXT, где ключевой брейк

является опрошенных в случае, если пользователь решил отказаться. В обычных остановок с ошибкой перерыв, если нулевой бит адрес порта 32766 (клавиша Space) является сбросить. В CONT содержимое системной переменной VARS сравниваются с адресом в DE. Если DE указывает в переменной области мы закончил, и программа возвращается. В противном случае мы должны смотреть дальше в рамках программы, хотя до этого мы проверяем на пару «особые случаи». Если DE указывает на характер “ENTER” мы достигли конце строки, так что мы должны забрать новую длину строки с помощью цикла назад чтобы LINE.

Если DE указывает на количество маркера – CHR $ 14 – мы должны пропустить через двоичный

Данные, поскольку она может содержать значения, которые похожи на текст или ключевые слова, но на самом деле нет. Это не мешает нам находить цифры, так как те, всегда будет начинаться с ASCII символа (вероятно, цифра). Если мы в достиг ЧР $ 14 мы зашли слишком далеко.

Возможные улучшения

Есть много способов, в которых Multisearch могли быть улучшены, но существующий код работает, и это не займет много времени, чтобы набрать в! Это может быть полезно, чтобы сделать его вернуться подсчет количества замен найденного, и, возможно, список строк, в которых были сделаны изменения. Это было бы удобно (но, возможно, довольно трудно), чтобы повторно код “бинарной форме” Программа в машинном коде.

Как можно заметить, Multisearch является простым, но очень эффективным рутина с кратность использования. Там не может быть много коротких подпрограмм, которые могут быть используется для ZX Основные редактировать доказательство, быстрее, более кратким, более понятным, и более универсальным. Дайте мне знать, что вы делаете из Multisearch.

?

Игра Multisearch запускается прямо на сайте. Программа для разработки на BASIC, опубликованная в Великобритании в 1985 году командой Your Spectrum, которую разработал Simon N. Goodwin.

Не запускается или глючит игра, или не можете пройти? Спросите в комментариях.

Subscribe
Уведомлять об
guest
0 Comments
Inline Feedbacks
View all comments
 

Сохранённые игры[X]

  

Справка[X]

Помощь уже в пути!

Не забывайте периодически сохранять игровой прогресс на сервере (клавишей F8), чтобы уверенно продвигаться вперёд!

Если вы гость на сайте, то прогресс будет сохранён только в памяти браузера и потеряется при закрытии. Чтобы этого не произошло - просто войдите в свой профиль.

Для загрузки сохранённой игры жмите F3 или откройте меню "Диск" кнопкой на правой панели.

Если игра не запускается, или у вас есть вопросы по игре - задайте их ниже.

Помощь

Размер

  • x1 [256x192]
  • x2 [512x384]
  • x3 [768x576]
  • Полный

Диск

Кликни в окно эмулятора, чтобы управлять!
<<<<
Close
0
Would love your thoughts, please comment.x
()
x