RANDOMIZE USR

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

Moderator: Shaos

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:Просматривая help QB45 наткнулся на пример подобного вызова, с тем лишь отличием, что используется не текстовая строка, а числовой массив, загружаемый из строк DATA через POKE. Вызывается код через CALL ABSOLUTE, по адресу и смещению на начало массива.
Вот я и хотел попробовать работу этого метода для текстовой строки без загрузки из строк DATA через POKE.
Собственно, и в этом случае должен сработать RANDOMIZE USR на адрес текстовой переменой.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RANDOMIZE USR

Post by Lavr »

Пришлось тоже вспомнить про эти все трюки с подпрограммами в машинных кодах в связи с RND в Бейсик «МИКРОША».

Подпрограммы в машинных кодах можно спрятать в теле BASIC-программамы в символьных переменных,
а потом обращаться к ним по адресу переменной (есть такой оператор).

И встретил я по пути, что в Спектрумах можно упрятать подпрограммы в машинных кодах после оператора REM.
Вот только как обратиться потом к этой "сабрутине"... разве что подсмотреть абсолютный адрес посадки... 8)
iLavr
User avatar
Shaos
Admin
Posts: 24055
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: RANDOMIZE USR

Post by Shaos »

Ну на свежеребутнутом спектруме басиковская программа начинается всегда по одному и тому же адресу - соответственно можно предугадать смещение до подпрограммы после REM (я это всё делал сам в первой половине 90х)
Я тут за главного - если что шлите мыло на me собака shaos точка net
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Re: RANDOMIZE USR

Post by jdigreze »

Можно и относительно, если подсмотреть адрес начала бейсик-программы в системных переменных, но вот смещение от начала таки придётся искать вручную ...хотя, зная номер строки, вроде бы можно найти адрес совсем динамически, но это чего-то писать надо, а вот функции определения адреса я не припоминаю.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RANDOMIZE USR

Post by Lavr »

jdigreze wrote:а вот функции определения адреса я не припоминаю.
ADDR(X) - АДРЕС ПЕРВОГО БАЙТА ЗНАЧЕНИЯ ПЕРЕМЕННОЙ X.
это в 8-битных ВАСЮКАХ...

VARPTR(X) и VARSEG(X) - это в КуВАСЮКЕ

VarPtr(MyVar) - это в Visual ВАСЮКЕ...

В VB.NET ВАСЮКЕ тебе тоже надо?... там всё чуть сложнее... :mrgreen:

Code: Select all

    Public Function VarPtr(ByVal o As Object) As Integer
        Dim gc As System.Runtime.InteropServices.GCHandle = GCHandle.Alloc(o, GCHandleType.Pinned)
        Dim pointer As Integer = gc.AddrOfPinnedObject.ToInt32
        gc.Free()
        Return pointer
    End Function
iLavr
User avatar
Shaos
Admin
Posts: 24055
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: RANDOMIZE USR

Post by Shaos »

в ZX небыло такого вроде бы
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RANDOMIZE USR

Post by Lavr »

Shaos wrote:в ZX небыло такого вроде бы
Должен быть. Я честно говоря, сам про ADDR(X) узнал, читая ваши здесь ранние "тёрки" на старте топика.
А куда делать USR(....)? А на ADDR(X)! Вот трюк с VARPTR(X) и VARSEG(X) в КуВАСЮКЕ я сам активно юзал.
Но в Спектрумах я не спец. Не пользовался ими.... Посмотрите, если не лень...
iLavr
User avatar
Shaos
Admin
Posts: 24055
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: RANDOMIZE USR

Post by Shaos »

Ну на спектруме код не в переменной прятали, а в комментарии - соответственно адрес надо было вычислять самому...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RANDOMIZE USR

Post by Lavr »

Shaos wrote:Ну на спектруме код не в переменной прятали, а в комментарии...
Ну тогда понятно, почему jdigreze тут так долго "удивлялся" этому трюку...
iLavr
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Re: RANDOMIZE USR

Post by jdigreze »

Lavr wrote:
jdigreze wrote:а вот функции определения адреса я не припоминаю.
ADDR(X) - АДРЕС ПЕРВОГО БАЙТА ЗНАЧЕНИЯ ПЕРЕМЕННОЙ X.
это в 8-битных ВАСЮКАХ...

VARPTR(X) и VARSEG(X) - это в КуВАСЮКЕ

VarPtr(MyVar) - это в Visual ВАСЮКЕ...

В VB.NET ВАСЮКЕ тебе тоже надо?... там всё чуть сложнее... :mrgreen:

Code: Select all

    Public Function VarPtr(ByVal o As Object) As Integer
        Dim gc As System.Runtime.InteropServices.GCHandle = GCHandle.Alloc(o, GCHandleType.Pinned)
        Dim pointer As Integer = gc.AddrOfPinnedObject.ToInt32
        gc.Free()
        Return pointer
    End Function
Про типовые васюки я уже в курсе, что есть функция, а вот в спектрумовском васюке такой функции я не припоминаю, хотя например работа с портами и памятью там имеется.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RANDOMIZE USR

Post by Lavr »

jdigreze wrote:в спектрумовском васюке такой функции я не припоминаю...
Ну должно быть что-то похожее. Может быть, через системные переменные можно добыть адрес,
тогда эта функция и не нужна... Вот, к примеру:
5C4Dh (23629) 2 DEST Адрес переменной во время присваивания.
Это, случаем, не оно? (http://www.wikiznanie.ru/wikipedia/inde ... lair_BASIC)

Я посто помню из опыта ломания игр у Sinclair BASIC было больше мест спрятать код, нежели один
этот REM. Там и "закрасить" можно было машинный код, чтоб он был невидим при листинге...
iLavr
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Re: RANDOMIZE USR

Post by jdigreze »

Lavr wrote:
jdigreze wrote:в спектрумовском васюке такой функции я не припоминаю...
Ну должно быть что-то похожее. Может быть, через системные переменные можно добыть адрес,
тогда эта функция и не нужна... Вот, к примеру:
5C4Dh (23629) 2 DEST Адрес переменной во время присваивания.
Это, случаем, не оно? (http://www.wikiznanie.ru/wikipedia/inde ... lair_BASIC)
Сейчас сложно сказать, столько лет этим не занимался...
Lavr wrote:Я посто помню из опыта ломания игр у Sinclair BASIC было больше мест спрятать код, нежели один
этот REM. Там и "закрасить" можно было машинный код, чтоб он был невидим при листинге...
А это как раз совместно использовалось из-за возможности расцвечивать любой символ прямо при вводе с клавиатуры - спецсимволы 0x10-0x17.
User avatar
Shaos
Admin
Posts: 24055
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: RANDOMIZE USR

Post by Shaos »

так тож во время присваивания, т.е. в процессе выполнения программы

а средств взять адрес произвольной переменной ПО ИМЕНИ - небыло...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: RANDOMIZE USR

Post by Lavr »

Shaos wrote:так тож во время присваивания, т.е. в процессе выполнения программы...
Ну так если тебе нужен этот адрес - вот и ухватывай его во время присваивания, т.е. в процессе выполнения программы,
наверное это удобней, нежели искать адрес ручками?

Всё же Sinclair BASIC - это в некотором роде ОС, и под него писали больше программ, нежели под другие ВАСЮКИ.
И всякие хитрости под него были получше изучены, раз уж и ошибки его были вознесены в ранг фич для совместимости.

Мне просто копаться сейчас в этом древнем гамне неохота, есть поинтереснее вещи... :wink:


P.S. Не, ну если ты настаиваешь, могу выразить свое формальное согласие:"Да, вот такой он херовый
этот Sinclair BASIC, - нет в нём ф-ции ADDR(X), как в других 8-битных ВАСЮКАХ...
"
Но, как я и сказал, не из-за него я влез в этот топик, а ф-цию ADDR(X) неожиданно обнаружил, когда
здесь только началось обсуждение от топикстартера, он то как раз на Sinclair BASIC внимание не акцентировал.
iLavr
User avatar
Shaos
Admin
Posts: 24055
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: RANDOMIZE USR

Post by Shaos »

И зачем мне его ухватывать в момент присвоения (т.е. в момент выполнения LET для этой конкретной перменной), если можно вычислить заранее от системной перемнной начала переменных бейсика VARS?...
Я тут за главного - если что шлите мыло на me собака shaos точка net