RANDOMIZE USR

Старый спектрумистский форум

Moderator: Shaos

User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

RANDOMIZE USR

Post by Stan »

Что такое RANDOMIZE USR в общем-то все, наверное, знают...

Варианты:

Code: Select all

RANDOMIZE USR addr
PRINT USR addr
LET a=USR addr
Ясно, что это вызов подпрограммы в машинных кодах по абсолютному addr.

Отсюда SR в аббревиатуре USR - скорее всего SubRoutine ,
но вот что тогда значит U в этой аббревиатуре?

Гуглил этот вопрос, но ответа не нашел...
Mixa64
Doomed
Posts: 481
Joined: 25 Aug 2009 07:02
Location: Москва

RANDOMIZE USR

Post by Mixa64 »

Пользовательская? (User)
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Re: RANDOMIZE USR

Post by jdigreze »

Mixa64 wrote:Пользовательская? (User)
Так точно.
А то, что оная функция возвращает регпару BC все помним? ;)
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: RANDOMIZE USR

Post by Stan »

jdigreze wrote:
Mixa64 wrote:Пользовательская? (User)
Так точно.
А я пытался подобрать на U слово типа "вызов", "обращение"...
jdigreze wrote:А то, что оная функция возвращает регпару BC все помним? ;)
Наверное, правильно будет сказать:"А то, что оная функция в ZX Spectrum возвращает регпару BC все помним?"
Там, где она заставила меня призадуматься о былом, она возвращает A, что весьма неудобно...
Но я подумал, что уж поклонники ZX Spectrum точно должны знать,
что такое USR. :wink:
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: RANDOMIZE USR

Post by Stan »

2_jdigreze

А Вы не помните, какова в старых бейсиках максимальная длина символьной переменной?

Скажем, если так:

A$="012345678... ...?"

У меня почему-то в памяти вертится 128 байт, но боюсь, что это размер для DOS BASIC-ов M$.



PS. Поискал сам, к примеру, для BASIC МИКРОН ситуация несколько противоречива:
Максимальная длина строки - 128 символов. При достижении этого значения ввод информации блокируется.
Значит напрямую в A$="012345678... ...?" символов 125 можно записать.
Но с другой стороны:
Хранение символьных переменных в BASIC "МИКРОН" отличается от хранения числовых. В первой ячейке памяти хранится длина символьной переменной, вторая не используется, а в третьей и четвертой размещены соответственно младший и старший байты адреса начала последовательности символов этой переменной в специально отведенном буфере символьных переменных.
То есть, получается, что максимальная длина может быть и 256 символов.
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Re: RANDOMIZE USR

Post by jdigreze »

По-разному было. И 127, и 255. В спектруме - 65535. ;)

А вообще тест простой:

Code: Select all

10 let a$=""
20 for i=1 to 65536
30 let a$=a$+"#"
40 next i
на какой итерации загнётся с переполнением - такова и максимальная длина.
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: RANDOMIZE USR

Post by Stan »

jdigreze wrote:По-разному было. И 127, и 255. В спектруме - 65535. ;)

А вообще тест простой:
...
Вы меня немного не так поняли. Мне интересно сколько байт можно записать впрямую в тексте программы.

A$="0123456789... ...?"

Просто хочу проверить на старых Бейсиках под "Специалистом" один древний трюк,
который неожиданно не почил в Бозе, а дожил даже до VB 6 - LocASM23 ! :o

Смысл там, что в переменную прячут ассемблерный код и вызывают его, к примеру:

RANDOMIZE USR ADDR(A$)

Поэтому мне и интересно - сколько байт можно записать в A$ напрямую без циклов.
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Re: RANDOMIZE USR

Post by jdigreze »

Не понял про трюк.
У спектрума буфер ввода, если не ошибаюсь, примерно на 768 байт, но чем больше набираешь, тем больше тормоза. На практике больше 200 байт (символов/токенов) набирать что-либо уже почти невозможно.
Вообще, даже на PC буфер ввода строки обычно не превышал 255 байт.
Единственно возможно увеличить строку только сращиванием с другой.
bigmax
Fanat
Posts: 79
Joined: 10 Feb 2014 03:37

Re: RANDOMIZE USR

Post by bigmax »

То, что USR - User SubRoutine это я сразу понял. Но зачем в спектруме нужен RANDOMIZE перед USR? ЕМНИП в бейсиках на Радио-86РК USR использовалось просто так, как отдельный токен. Никогда не понимал тонкий английский юмор.
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: RANDOMIZE USR

Post by Stan »

jdigreze wrote:Не понял про трюк.
Ну я пояснил, что суть трюка в том , что в переменную прячут ассемблерный код и вызывают его по адресу переменной прямо из текста "ВАS" программы.
Я думал Вы с этим могли сталкиваться, но подробнее здесь:
http://vb.wikia.com/wiki/AsmPatcher.bas
jdigreze wrote:У спектрума буфер ввода, если не ошибаюсь, примерно на 768 байт, но чем больше набираешь, тем больше тормоза.
Ну в наше время не обязательно же набирать код программы на самом спектруме.
Можно набрать в привычном редакторе, а потом "скормить" это эмулятору - весь вопрос корректно ли он это поймет. :wink:
jdigreze wrote:возможно увеличить строку только сращиванием с другой.
Тут тоже есть подводные камни в конкатенции строк, к примеру для Микрон:
При работе с символьными переменными (особенно при использовании оператора "+") следует иметь в виду, что размер буфера символьной переменных должен быть, как минимум, в два раза больше общего предполагаемого числа символов всех символьных переменных. Так, например, если предполагается, что в результате работы программы общее число символов всех символьных переменных будет равно 200, то необходимо установить размер этого буфера в 400 или более ячеек памяти, воспользовавшись директивой CLEAR400.
Но для исследуемого трюка всё же предпочтительно, чтобы строка была непрерывной.
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: RANDOMIZE USR

Post by Stan »

bigmax wrote:Но зачем в спектруме нужен RANDOMIZE перед USR? ЕМНИП в бейсиках на Радио-86РК USR использовалось просто так, как отдельный токен.
Ой ли прямо-таки отдельно? А разве не так:
10 A=USR(&F81B) IF A=255 THEN 10
USR возвращает значение и его надо в какую-то функцию принять.
Поэтому:
PRINT USR ADDR - значение принимает PRINT
A=USR ADDR - значение принимает переменная А
отсюда
RANDOMIZE USR ADDR - значение принимает ф-ция RANDOMIZE
хотя ей и глубоко наплевать... :rotate:
bigmax wrote:Никогда не понимал тонкий английский юмор.
Это заметно... но Вы не расстраивайтесь! :D
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Re: RANDOMIZE USR

Post by jdigreze »

bigmax wrote:То, что USR - User SubRoutine это я сразу понял. Но зачем в спектруме нужен RANDOMIZE перед USR? ЕМНИП в бейсиках на Радио-86РК USR использовалось просто так, как отдельный токен. Никогда не понимал тонкий английский юмор.
Само RANDOMIZE в данном случае - фейковый оператор, получающий в качестве аргумента результат функции USR.
Stan wrote:Ну в наше время не обязательно же набирать код программы на самом спектруме.Можно набрать в привычном редакторе, а потом "скормить" это эмулятору - весь вопрос корректно ли он это поймет.
Со спектрумом не всё так просто, текст токенизирован и содержит кучу скрытой информации, в том числе могут быть уже инициализированные переменные и прочее, которые в тексте не инициализируются (при этом при перезапуске программы вручную с помощью RUN, программа не будет работать как задумано при запуске её с ленты или диска).
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: RANDOMIZE USR

Post by Stan »

jdigreze wrote:Со спектрумом не всё так просто, текст токенизирован и содержит кучу скрытой информации, в том числе могут быть уже инициализированные переменные и прочее, которые в тексте не инициализируются...
Не буду упоминать про Капитана Очевидность, но не только у спектрума текст по вводу превращается в токены...
И за истекшее время, известно даже в какие "цифры"... :D

Но аргумент "0123456789... ...?" ни в какие токены не превращается, а так и лежит в тексте BAS-программы, как есть.
Поэтому он и является удобным и известным местом в памяти, куда можно упрятать подпрограмму в кодах.

Ладно... я понял, что по интересующему меня вопросу Вы знаете столько же, сколько и я сам.
Буду пробовать, просто ряд проб уже закончились неудачно, почему я и задумался о допустимой длине "0123456789... ...?" в тексте программы.
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: RANDOMIZE USR

Post by Stan »

jdigreze wrote:Само RANDOMIZE в данном случае - фейковый оператор, получающий в качестве аргумента результат функции USR.
Думаю, что RANDOMIZE еще и самая простая функция, которой можно подсунуть результат от USR ADDR.
A = USR ADDR - будет занимать память, а другие функции замедлять исполнение программы, если критична скорость.

Чисто из интересу попробовал на "Специалисте" такой вариант:

90 PRINT SIN(USR(&F81B)/1000)

так вполне себе нормально работает как PRINT SIN(0.255)! :idea:
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Re: RANDOMIZE USR

Post by jdigreze »

Stan wrote:
jdigreze wrote:Не понял про трюк.
Ну я пояснил, что суть трюка в том , что в переменную прячут ассемблерный код и вызывают его по адресу переменной прямо из текста "ВАS" программы.
Я думал Вы с этим могли сталкиваться, но подробнее здесь:
http://vb.wikia.com/wiki/AsmPatcher.bas
Просматривая help QB45 наткнулся на пример подобного вызова, с тем лишь отличием, что используется не текстовая строка, а числовой массив, загружаемый из строк DATA через POKE. Вызывается код через CALL ABSOLUTE, по адресу и смещению на начало массива.