Варианты:
Code: Select all
RANDOMIZE USR addr
PRINT USR addr
LET a=USR addr
Отсюда SR в аббревиатуре USR - скорее всего SubRoutine ,
но вот что тогда значит U в этой аббревиатуре?
Гуглил этот вопрос, но ответа не нашел...
Moderator: Shaos
Code: Select all
RANDOMIZE USR addr
PRINT USR addr
LET a=USR addr
Так точно.Mixa64 wrote:Пользовательская? (User)
А я пытался подобрать на U слово типа "вызов", "обращение"...jdigreze wrote:Так точно.Mixa64 wrote:Пользовательская? (User)
Наверное, правильно будет сказать:"А то, что оная функция в ZX Spectrum возвращает регпару BC все помним?"jdigreze wrote:А то, что оная функция возвращает регпару BC все помним?
Значит напрямую в A$="012345678... ...?" символов 125 можно записать.Максимальная длина строки - 128 символов. При достижении этого значения ввод информации блокируется.
То есть, получается, что максимальная длина может быть и 256 символов.Хранение символьных переменных в BASIC "МИКРОН" отличается от хранения числовых. В первой ячейке памяти хранится длина символьной переменной, вторая не используется, а в третьей и четвертой размещены соответственно младший и старший байты адреса начала последовательности символов этой переменной в специально отведенном буфере символьных переменных.
Code: Select all
10 let a$=""
20 for i=1 to 65536
30 let a$=a$+"#"
40 next i
Вы меня немного не так поняли. Мне интересно сколько байт можно записать впрямую в тексте программы.jdigreze wrote:По-разному было. И 127, и 255. В спектруме - 65535.
А вообще тест простой:
...
Ну я пояснил, что суть трюка в том , что в переменную прячут ассемблерный код и вызывают его по адресу переменной прямо из текста "ВАS" программы.jdigreze wrote:Не понял про трюк.
Ну в наше время не обязательно же набирать код программы на самом спектруме.jdigreze wrote:У спектрума буфер ввода, если не ошибаюсь, примерно на 768 байт, но чем больше набираешь, тем больше тормоза.
Тут тоже есть подводные камни в конкатенции строк, к примеру для Микрон:jdigreze wrote:возможно увеличить строку только сращиванием с другой.
Но для исследуемого трюка всё же предпочтительно, чтобы строка была непрерывной.При работе с символьными переменными (особенно при использовании оператора "+") следует иметь в виду, что размер буфера символьной переменных должен быть, как минимум, в два раза больше общего предполагаемого числа символов всех символьных переменных. Так, например, если предполагается, что в результате работы программы общее число символов всех символьных переменных будет равно 200, то необходимо установить размер этого буфера в 400 или более ячеек памяти, воспользовавшись директивой CLEAR400.
Ой ли прямо-таки отдельно? А разве не так:bigmax wrote:Но зачем в спектруме нужен RANDOMIZE перед USR? ЕМНИП в бейсиках на Радио-86РК USR использовалось просто так, как отдельный токен.
Это заметно... но Вы не расстраивайтесь!bigmax wrote:Никогда не понимал тонкий английский юмор.
Само RANDOMIZE в данном случае - фейковый оператор, получающий в качестве аргумента результат функции USR.bigmax wrote:То, что USR - User SubRoutine это я сразу понял. Но зачем в спектруме нужен RANDOMIZE перед USR? ЕМНИП в бейсиках на Радио-86РК USR использовалось просто так, как отдельный токен. Никогда не понимал тонкий английский юмор.
Со спектрумом не всё так просто, текст токенизирован и содержит кучу скрытой информации, в том числе могут быть уже инициализированные переменные и прочее, которые в тексте не инициализируются (при этом при перезапуске программы вручную с помощью RUN, программа не будет работать как задумано при запуске её с ленты или диска).Stan wrote:Ну в наше время не обязательно же набирать код программы на самом спектруме.Можно набрать в привычном редакторе, а потом "скормить" это эмулятору - весь вопрос корректно ли он это поймет.
Не буду упоминать про Капитана Очевидность, но не только у спектрума текст по вводу превращается в токены...jdigreze wrote:Со спектрумом не всё так просто, текст токенизирован и содержит кучу скрытой информации, в том числе могут быть уже инициализированные переменные и прочее, которые в тексте не инициализируются...
Думаю, что RANDOMIZE еще и самая простая функция, которой можно подсунуть результат от USR ADDR.jdigreze wrote:Само RANDOMIZE в данном случае - фейковый оператор, получающий в качестве аргумента результат функции USR.
Просматривая help QB45 наткнулся на пример подобного вызова, с тем лишь отличием, что используется не текстовая строка, а числовой массив, загружаемый из строк DATA через POKE. Вызывается код через CALL ABSOLUTE, по адресу и смещению на начало массива.Stan wrote:Ну я пояснил, что суть трюка в том , что в переменную прячут ассемблерный код и вызывают его по адресу переменной прямо из текста "ВАS" программы.jdigreze wrote:Не понял про трюк.
Я думал Вы с этим могли сталкиваться, но подробнее здесь:
http://vb.wikia.com/wiki/AsmPatcher.bas