PDA

Просмотр полной версии : Можно ли отследить, с помощью какого оператора был запущен файл boot в TR-DOS?



ZX_NOVOSIB
30.04.2014, 15:07
Как известно в TR-DOS boot можно стартануть используя 3 оператора : RUN, POKE, LOAD. Возможно ли сделать такой файл boot, который бы проверял каким именно оператором он запущен и, в зависимости от этого выполнялась бы дальнейшая загрука либо file1 либо file2?

Gutten
30.04.2014, 15:39
POKE? Может PEEK?
А это что даст?

denpopov
30.04.2014, 15:40
кажется, в Insult MD загрузчик хитро сделан, достаточно набрать
run"Insult".I love Codebusters, где концовка строки ловится.

ZX_NOVOSIB
30.04.2014, 16:03
Gutten, POKE, только POKE )) А вообще хочу сделать, чтобы например по RUN грузился один файл, а по LOAD (POKE) второй. Первым фалом может быть ZYX-boot, вторым какой-нибудь продвинутый командер.

Можно сначала грузить один, а потом из него другой. Но хотелось бы минимум телодвижений )) Лень - двигатель прогресса ))

psb
30.04.2014, 16:08
а как же merge?

а вообще, ну куда проще? делаешь бут пустой, запускаешь в эмуле, выходишь в отладчик и сохраняешь всю память (или снапшотом). запускаешь другим способом и еще сохраняешь. потом сравниваешь и сразу всё видишь.

SoftLight
30.04.2014, 16:51
а не проще сделать так: берем boot #1 и boot #2, записываем их с именами boot1.B boot2.B. Далее на бейсике пишем программу с опросом клавы - по нажатию 1 запускаем бут1, по нажатию 2 второй и т.п. Записываем прогу с именем boot.B. Даже программирование знать не надо.

creator
30.04.2014, 17:10
По адресу 23840 находится трёхбайтовая системная переменная TR-DOS, в которой хрянятся первые три символа введенной строки. Набираем простую программу:

10 PRINT PEEK 23840
20 PRINT PEEK 23841
30 PRINT PEEK 23842

Входим в TR-DOS, сохряняем программу на диск:
SAVE "a" LINE 10

Запускаем программу из TR-DOS:
RUN "a"

Видим на экране:
247
34
97
где 247 код команды RUN, 34 — кавычка, 97 — a (RUN "a).

Снова заходим в TR-DOS, запускаем программу:
LOAD "a"

Видим на экране:
239
34
97
где 239 код команды LOAD, 34 — кавычка, 97 — a (LOAD "a).

Эврика!

Снова заходим в TR-DOS, переименовываем программу "a" в "boot":
NEW "boot", "a"

Запускаем:
RUN

Видим на экране:
247
34
98
где 247 код команды RUN, 34 — кавычка, 98 — b (RUN "b)

Снова заходим в TR-DOS, запускаем:
LOAD

Видим на экране:
247
34
98
где 247 код команды RUN, 34 — кавычка, 98 — b (RUN "b)

Ой! А почему 247, а не 239, мы же LOAD набирали? И вообще что за "b, мы вообще не набирали этого? А потому что команды запуска бута "без параметров" (просто LOAD, RUN, POKE, PEEK) трансформирутся интерпретатором TR-DOS в RUN "boot". Вот такой вот облом.

Но если не лень набирать полное имя (мне точно лень) хотя бы из одной буквы, то всё будет ровно, по RUN "a" запустится ZYX, по LOAD "a" запустится CONVER:

10 IF PEEK 23840=247 THEN RANDOMIZE USR 15619: REM : RUN "ZYX"
20 IF PEEK 23840=239 THEN RANDOMIZE USR 15619: REM : RUN "CONVER"

ZX_NOVOSIB
30.04.2014, 18:36
а как же merge?
Да, мерге тоже работает. Но чтобы её напечатать нужно несколько телодвижений, я имел ввиду одной кнопкой чтобы.

---------- Post added at 21:34 ---------- Previous post was at 21:33 ----------


а не проще сделать так: берем boot #1 и boot #2, записываем их с именами boot1.B boot2.B. Далее на бейсике пишем программу с опросом клавы - по нажатию 1 запускаем бут1, по нажатию 2 второй и т.п. Записываем прогу с именем boot.B. Даже программирование знать не надо.
Да, так проще, но лишнее телодвижение, лишнее нажатие кнопки )) Я хотел свести к минимуму количество нажатий, но видимо так нельзя..

---------- Post added at 21:36 ---------- Previous post was at 21:34 ----------



А потому что команды запуска бута "без параметров" (просто LOAD, RUN, POKE, PEEK) трансформирутся интерпретатором TR-DOS в RUN "boot". Вот такой вот облом.

Но если не лень набирать полное имя (мне точно лень) хотя бы из одной буквы, то всё будет ровно, по RUN "a" запустится ZYX, по LOAD "a" запустится CONVER:

10 IF PEEK 23840=247 THEN RANDOMIZE USR 15619: REM : RUN "ZYX"
20 IF PEEK 23840=239 THEN RANDOMIZE USR 15619: REM : RUN "CONVER"
Да, похоже облом! Набирать имя - это лишнее телодвижение. Но я всё равно что-нибудь придумаю, как минимизировать количество телодвижение, уже придумал, надо только проверить..

ZX_NOVOSIB
30.04.2014, 21:42
Пожалуй наилучшее решение такое:

10 BORDER 0: PAPER 0: CLS
20 IF CODE INKEY$=13 THEN BORDER 2: RANDOMIZE USR 15619: REM: RUN "CONVER"
30 RANDOMIZE USR 15619: REM: RUN "ZYX"

Вводим RUN и.. если сразу отпускаем палец - грузится ZYX-boot, если чуть задерживаем палец на ентере, то грузится Конвер.. ;)

Бордер 2 добавлен для того, чтобы просигнализировать "Всё, палец можно отпускать".

Faster
05.05.2014, 11:12
Можно оптимизировать boot разместив весь код после REM ассемблерным вариантом (http://zx.pk.ru/showpost.php?p=288288&postcount=5) запуска файлов.

Alex Rider
05.05.2014, 11:39
По идее, если взять CH_ADD и отмотать назад до первого токена, то вот он должен быть честным оператором запуска boot'а.

ZX_NOVOSIB
05.05.2014, 15:16
Можно оптимизировать boot разместив весь код после REM ассемблерным вариантом (http://zx.pk.ru/showpost.php?p=288288&postcount=5) запуска файлов.
Ты имеешь ввиду взять за основу ту бейсик-програмку которую я приводил выше и просто скомпилировать её в ассемблер? А это даст какую-то пользу? В ассемблере я ничего не понимаю и даже не знаю как и что размещать после REM.

---------- Post added at 18:16 ---------- Previous post was at 18:13 ----------


По идее, если взять CH_ADD и отмотать назад до первого токена, то вот он должен быть честным оператором запуска boot'а.
Честно признаться не понял ни одного слова :)
Я сначала хотел сделать так чтобы RUN запускал файл boot, а LOAD (или POKE) - например boot1. Вернее чтобы файл boot определял каким именно оператором он запущен и далее запускал либо boot1 либо boot2.

Но видимо так нельзя, и даже ассемблер не в силах помочь. (Видимо поможет только если менять что-то в прошивке BDI.)

Тогда я сделал вариант с "удержанием ентера", это немного не то, чего бы хотелось, но лучшее из того я смог придумать.

Alex Rider
05.05.2014, 15:48
А я перечитал и понял, что написал бред. Мой способ не работает никак :)