nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 19 Mar 2024 02:47



Reply to topic  [ 53 posts ]  Go to page 1, 2, 3, 4  Next
RANDOMIZE USR 
Author Message
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
Что такое RANDOMIZE USR в общем-то все, наверное, знают...

Варианты:
Code:
RANDOMIZE USR addr
PRINT USR addr
LET a=USR addr

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

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

Гуглил этот вопрос, но ответа не нашел...


08 Mar 2015 10:34
Profile
Doomed

Joined: 25 Aug 2009 07:02
Posts: 459
Location: Москва
Reply with quote
Пользовательская? (User)


08 Mar 2015 11:25
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Mixa64 wrote:
Пользовательская? (User)
Так точно.
А то, что оная функция возвращает регпару BC все помним? ;)


08 Mar 2015 12:11
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
jdigreze wrote:
Mixa64 wrote:
Пользовательская? (User)
Так точно.
А я пытался подобрать на U слово типа "вызов", "обращение"...

jdigreze wrote:
А то, что оная функция возвращает регпару BC все помним? ;)
Наверное, правильно будет сказать:"А то, что оная функция в ZX Spectrum возвращает регпару BC все помним?"
Там, где она заставила меня призадуматься о былом, она возвращает A, что весьма неудобно...
Но я подумал, что уж поклонники ZX Spectrum точно должны знать,
что такое USR. :wink:


08 Mar 2015 14:30
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
2_jdigreze

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

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

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

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



PS. Поискал сам, к примеру, для BASIC МИКРОН ситуация несколько противоречива:
Quote:
Максимальная длина строки - 128 символов. При достижении этого значения ввод информации блокируется.

Значит напрямую в A$="012345678... ...?" символов 125 можно записать.
Но с другой стороны:
Quote:
Хранение символьных переменных в BASIC "МИКРОН" отличается от хранения числовых. В первой ячейке памяти хранится длина символьной переменной, вторая не используется, а в третьей и четвертой размещены соответственно младший и старший байты адреса начала последовательности символов этой переменной в специально отведенном буфере символьных переменных.

То есть, получается, что максимальная длина может быть и 256 символов.


11 Mar 2015 15:44
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
По-разному было. И 127, и 255. В спектруме - 65535. ;)

А вообще тест простой:
Code:
10 let a$=""
20 for i=1 to 65536
30 let a$=a$+"#"
40 next i

на какой итерации загнётся с переполнением - такова и максимальная длина.


11 Mar 2015 21:23
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
jdigreze wrote:
По-разному было. И 127, и 255. В спектруме - 65535. ;)

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

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

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

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

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

RANDOMIZE USR ADDR(A$)

Поэтому мне и интересно - сколько байт можно записать в A$ напрямую без циклов.


12 Mar 2015 05:51
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Не понял про трюк.
У спектрума буфер ввода, если не ошибаюсь, примерно на 768 байт, но чем больше набираешь, тем больше тормоза. На практике больше 200 байт (символов/токенов) набирать что-либо уже почти невозможно.
Вообще, даже на PC буфер ввода строки обычно не превышал 255 байт.
Единственно возможно увеличить строку только сращиванием с другой.


12 Mar 2015 07:22
Profile
Fanat

Joined: 10 Feb 2014 03:37
Posts: 79
Reply with quote
То, что USR - User SubRoutine это я сразу понял. Но зачем в спектруме нужен RANDOMIZE перед USR? ЕМНИП в бейсиках на Радио-86РК USR использовалось просто так, как отдельный токен. Никогда не понимал тонкий английский юмор.


12 Mar 2015 07:33
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
jdigreze wrote:
Не понял про трюк.
Ну я пояснил, что суть трюка в том , что в переменную прячут ассемблерный код и вызывают его по адресу переменной прямо из текста "ВАS" программы.
Я думал Вы с этим могли сталкиваться, но подробнее здесь:
http://vb.wikia.com/wiki/AsmPatcher.bas
jdigreze wrote:
У спектрума буфер ввода, если не ошибаюсь, примерно на 768 байт, но чем больше набираешь, тем больше тормоза.

Ну в наше время не обязательно же набирать код программы на самом спектруме.
Можно набрать в привычном редакторе, а потом "скормить" это эмулятору - весь вопрос корректно ли он это поймет. :wink:
jdigreze wrote:
возможно увеличить строку только сращиванием с другой.

Тут тоже есть подводные камни в конкатенции строк, к примеру для Микрон:
Quote:
При работе с символьными переменными (особенно при использовании оператора "+") следует иметь в виду, что размер буфера символьной переменных должен быть, как минимум, в два раза больше общего предполагаемого числа символов всех символьных переменных. Так, например, если предполагается, что в результате работы программы общее число символов всех символьных переменных будет равно 200, то необходимо установить размер этого буфера в 400 или более ячеек памяти, воспользовавшись директивой CLEAR400.

Но для исследуемого трюка всё же предпочтительно, чтобы строка была непрерывной.


12 Mar 2015 07:39
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
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


12 Mar 2015 07:48
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
bigmax wrote:
То, что USR - User SubRoutine это я сразу понял. Но зачем в спектруме нужен RANDOMIZE перед USR? ЕМНИП в бейсиках на Радио-86РК USR использовалось просто так, как отдельный токен. Никогда не понимал тонкий английский юмор.
Само RANDOMIZE в данном случае - фейковый оператор, получающий в качестве аргумента результат функции USR.
Stan wrote:
Ну в наше время не обязательно же набирать код программы на самом спектруме.Можно набрать в привычном редакторе, а потом "скормить" это эмулятору - весь вопрос корректно ли он это поймет.
Со спектрумом не всё так просто, текст токенизирован и содержит кучу скрытой информации, в том числе могут быть уже инициализированные переменные и прочее, которые в тексте не инициализируются (при этом при перезапуске программы вручную с помощью RUN, программа не будет работать как задумано при запуске её с ленты или диска).


12 Mar 2015 08:02
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
jdigreze wrote:
Со спектрумом не всё так просто, текст токенизирован и содержит кучу скрытой информации, в том числе могут быть уже инициализированные переменные и прочее, которые в тексте не инициализируются...

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

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

Ладно... я понял, что по интересующему меня вопросу Вы знаете столько же, сколько и я сам.
Буду пробовать, просто ряд проб уже закончились неудачно, почему я и задумался о допустимой длине "0123456789... ...?" в тексте программы.


12 Mar 2015 08:21
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
jdigreze wrote:
Само RANDOMIZE в данном случае - фейковый оператор, получающий в качестве аргумента результат функции USR.

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

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

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

так вполне себе нормально работает как PRINT SIN(0.255)! :idea:


13 Mar 2015 18:15
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Stan wrote:
jdigreze wrote:
Не понял про трюк.
Ну я пояснил, что суть трюка в том , что в переменную прячут ассемблерный код и вызывают его по адресу переменной прямо из текста "ВАS" программы.
Я думал Вы с этим могли сталкиваться, но подробнее здесь:
http://vb.wikia.com/wiki/AsmPatcher.bas

Просматривая help QB45 наткнулся на пример подобного вызова, с тем лишь отличием, что используется не текстовая строка, а числовой массив, загружаемый из строк DATA через POKE. Вызывается код через CALL ABSOLUTE, по адресу и смещению на начало массива.


27 Mar 2015 21:18
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 53 posts ]  Go to page 1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.