Author |
Message |
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Что такое RANDOMIZE USR в общем-то все, наверное, знают... Варианты: Ясно, что это вызов подпрограммы в машинных кодах по абсолютному addr. Отсюда SR в аббревиатуре USR - скорее всего Sub Routine , но вот что тогда значит U в этой аббревиатуре? Гуглил этот вопрос, но ответа не нашел...
|
08 Mar 2015 10:34 |
|
|
Mixa64
Doomed
Joined: 25 Aug 2009 07:02 Posts: 459 Location: Москва
|
Пользовательская? (User)
|
08 Mar 2015 11:25 |
|
|
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1390 Location: Abakan
|
Так точно. А то, что оная функция возвращает регпару BC все помним?
|
08 Mar 2015 12:11 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
А я пытался подобрать на U слово типа " вызов", " обращение"... Наверное, правильно будет сказать:" А то, что оная функция в ZX Spectrum возвращает регпару BC все помним?" Там, где она заставила меня призадуматься о былом, она возвращает A, что весьма неудобно... Но я подумал, что уж поклонники ZX Spectrum точно должны знать, что такое USR.
|
08 Mar 2015 14:30 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
2_jdigrezeА Вы не помните, какова в старых бейсиках максимальная длина символьной переменной? Скажем, если так: A$="012345678... ...?"У меня почему-то в памяти вертится 128 байт, но боюсь, что это размер для DOS BASIC-ов M$. PS. Поискал сам, к примеру, для BASIC МИКРОН ситуация несколько противоречива:Значит напрямую в A$="012345678... ...?" символов 125 можно записать. Но с другой стороны: То есть, получается, что максимальная длина может быть и 256 символов.
|
11 Mar 2015 15:44 |
|
|
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1390 Location: Abakan
|
По-разному было. И 127, и 255. В спектруме - 65535. А вообще тест простой: на какой итерации загнётся с переполнением - такова и максимальная длина.
|
11 Mar 2015 21:23 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Вы меня немного не так поняли. Мне интересно сколько байт можно записать впрямую в тексте программы. A$="0123456789... ...?"Просто хочу проверить на старых Бейсиках под "Специалистом" один древний трюк, который неожиданно не почил в Бозе, а дожил даже до VB 6 - LocASM23 ! Смысл там, что в переменную прячут ассемблерный код и вызывают его, к примеру: RANDOMIZE USR ADDR(A$)Поэтому мне и интересно - сколько байт можно записать в A$ напрямую без циклов.
|
12 Mar 2015 05:51 |
|
|
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1390 Location: Abakan
|
Не понял про трюк. У спектрума буфер ввода, если не ошибаюсь, примерно на 768 байт, но чем больше набираешь, тем больше тормоза. На практике больше 200 байт (символов/токенов) набирать что-либо уже почти невозможно. Вообще, даже на PC буфер ввода строки обычно не превышал 255 байт. Единственно возможно увеличить строку только сращиванием с другой.
|
12 Mar 2015 07:22 |
|
|
bigmax
Fanat
Joined: 10 Feb 2014 03:37 Posts: 79
|
То, что USR - User SubRoutine это я сразу понял. Но зачем в спектруме нужен RANDOMIZE перед USR? ЕМНИП в бейсиках на Радио-86РК USR использовалось просто так, как отдельный токен. Никогда не понимал тонкий английский юмор.
|
12 Mar 2015 07:33 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Ну я пояснил, что суть трюка в том , что в переменную прячут ассемблерный код и вызывают его по адресу переменной прямо из текста "ВАS" программы. Я думал Вы с этим могли сталкиваться, но подробнее здесь: http://vb.wikia.com/wiki/AsmPatcher.basНу в наше время не обязательно же набирать код программы на самом спектруме. Можно набрать в привычном редакторе, а потом "скормить" это эмулятору - весь вопрос корректно ли он это поймет. Тут тоже есть подводные камни в конкатенции строк, к примеру для Микрон: Но для исследуемого трюка всё же предпочтительно, чтобы строка была непрерывной.
|
12 Mar 2015 07:39 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Ой ли прямо-таки отдельно? А разве не так: 10 A=USR(&F81B) IF A=255 THEN 10USR возвращает значение и его надо в какую-то функцию принять. Поэтому: PRINT USR ADDR - значение принимает PRINT A=USR ADDR - значение принимает переменная Аотсюда RANDOMIZE USR ADDR - значение принимает ф-ция RANDOMIZE хотя ей и глубоко наплевать... Это заметно... но Вы не расстраивайтесь!
|
12 Mar 2015 07:48 |
|
|
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1390 Location: Abakan
|
Само RANDOMIZE в данном случае - фейковый оператор, получающий в качестве аргумента результат функции USR. Со спектрумом не всё так просто, текст токенизирован и содержит кучу скрытой информации, в том числе могут быть уже инициализированные переменные и прочее, которые в тексте не инициализируются (при этом при перезапуске программы вручную с помощью RUN, программа не будет работать как задумано при запуске её с ленты или диска).
|
12 Mar 2015 08:02 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Не буду упоминать про Капитана Очевидность, но не только у спектрума текст по вводу превращается в токены... И за истекшее время, известно даже в какие "цифры"... Но аргумент "0123456789... ...?" ни в какие токены не превращается, а так и лежит в тексте BAS-программы, как есть. Поэтому он и является удобным и известным местом в памяти, куда можно упрятать подпрограмму в кодах. Ладно... я понял, что по интересующему меня вопросу Вы знаете столько же, сколько и я сам. Буду пробовать, просто ряд проб уже закончились неудачно, почему я и задумался о допустимой длине "0123456789... ...?" в тексте программы.
|
12 Mar 2015 08:21 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Думаю, что RANDOMIZE еще и самая простая функция, которой можно подсунуть результат от USR ADDR. A = USR ADDR - будет занимать память, а другие функции замедлять исполнение программы, если критична скорость. Чисто из интересу попробовал на "Специалисте" такой вариант: 90 PRINT SIN(USR(&F81B)/1000)так вполне себе нормально работает как PRINT SIN(0.255)!
|
13 Mar 2015 18:15 |
|
|
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1390 Location: Abakan
|
Просматривая help QB45 наткнулся на пример подобного вызова, с тем лишь отличием, что используется не текстовая строка, а числовой массив, загружаемый из строк DATA через POKE. Вызывается код через CALL ABSOLUTE, по адресу и смещению на начало массива.
|
27 Mar 2015 21:18 |
|
|