PDA

Просмотр полной версии : Basic Loader Creator



Faster
28.04.2013, 19:42
Basic Loader Creator - это исходник, который позволяет скомпилировать в Alasm 5.x кодовый загрузчик в формате бейсик-файла и сохранить его на диск.
Предусмотрено 2 варианта создания бейсик-строки:
1. RUN USR 28.04.2013 <CODE> - вариант только для TR-DOS;
2. RUN USR (PEEK 0*0+PEEK 0+0) <CODE> - универсальный вариант для TR-DOS/TAPE. Универсальный - означает, что вы можете готовый бейсик-файл записать так же в .tap и он без проблем запустится. В приложении,в качестве примера, находятся 2 файла: для TR-DOS и TAPE. В зависимости от того, в какой среде запущен файл бордер окрашивается либо в синий, либо в красный цвет.
Кроме этого, путем установки флажков условной компиляции, предусмотрена возможность:
- встраивать в бейсик-строку текст сообщения с использованием команд: AT, INK, PAPER, BRIGHT и т.д.;
- размещать текст сообщения в так называемой области unused space - место, свободное до конца сектора. В частности BEST VIEW позволяет просматривать такие бейсик-файлы;
- указывать фальшивую (нулевую) длину бейсик-программы;
- задавать любой номер бейсик-строки в диапазоне: 0-65535. Если номер строки находится в диапазоне от 16384-65535, то это будет защита от команды MERGE "".

Свой код следует размещать в макросе CodeLoader. После компиляции Alasm покажет сколько байтов и секторов занимает скомпилированный бейсик-файл, а также сколько байтов осталось до конца сектора. Последнее число позволит вам сориентироваться возможно использование unused space или нет. По умолчанию у меня зарезервировано 64 байта, т.е. одна строка в BEST VIEW. В прилагаемом исходнике в текстовом формате даны очень подробные комментарии - думаю разобраться не составит труда. :)

Обновленная версия 4.0 (http://zx.pk.ru/showpost.php?p=613748&postcount=27)

introspec
28.04.2013, 20:41
Эх, добрый человек, где же ты вчера был, когда я целый день угробил вспоминая, как делать монолоадеры :) За кадром остался только один важный вопрос: как объединить файлы, сложенные на trd образ, не запуская эмулятор. Понятно, что это пишется за день, но непонятно, почему это вообще приходится писать каждому.

А никто не думал над тем, как "портабельно" запускать программы не используя PEEK? Не могу сказать, что у меня есть хорошие идеи по этому поводу, но звучит как интересная техническая задача. С ходу в голову приходят только трюки с экраном или ROM, т.е. вещи неуклюжие и грязные.

Faster
28.04.2013, 21:36
Эх, добрый человек, где же ты вчера был, когда я целый день угробил вспоминая, как делать монолоадеры :) За кадром остался только один важный вопрос: как объединить файлы, сложенные на trd образ, не запуская эмулятор. Понятно, что это пишется за день, но непонятно, почему это вообще приходится писать каждому.
Я правильно понял вопрос, что объединить надо бейсик файл и кодовые файлы в один бейсик файл? Если да, то я использую Global Commander - выделяешь нужные файлы и нажимаешь клавишу Z.

update: Не совсем правильно прочитал вопрос первый раз. Не через эмулятор не знаю :)

А никто не думал над тем, как "портабельно" запускать программы не используя PEEK? Не могу сказать, что у меня есть хорошие идеи по этому поводу, но звучит как интересная техническая задача. С ходу в голову приходят только трюки с экраном или ROM, т.е. вещи неуклюжие и грязные.
А чем тебе PEEK не нравится? ;) Возможно, что другим способом никак. Адрес расположения бейсик-программы в памяти зависит от того в какой среде он запущен. И системная переменная PROG это самый надежный вариант, имхо.

introspec
28.04.2013, 21:43
Я правильно понял вопрос, что объединить надо бейсик файл и кодовые файлы в один бейсик файл? Если да, то я использую Global Commander - выделяешь нужные файлы и нажимаешь клавишу Z.
У меня всё полностью собирается bat-файлом. От исходника до файла на продажу. Полный цикл для ленты делается без проблем, а вот для TR-DOS полноценной обвязки нет. Каждый раз лезть в эмулятор, чтобы что-то там доделать - реально раздражает. Если бы ещё Spin поддерживал TR-DOS - куда не шло, но приходится лезть в Unreal (неразборчиво). Ладно, будет настроение, сделаю утилитку, похоже что и правда никто до сих по не подумал.


А чем тебе PEEK не нравится? ;) Возможно, что другим способом никак. Адрес расположения бейсик-программы в памяти зависит от того в какой среде он запущен. И системная переменная PROG это самый надежный вариант, имхо.
Я согласен, я вчера прошёл к такому же выводу. Мне чисто эстетически не нравится. Хочется какого-то финта ушами, чтобы и на ёлку влезь, и жопу не ободрать.

Faster
28.04.2013, 21:55
Я согласен, я вчера прошёл к такому же выводу. Мне чисто эстетически не нравится. Хочется какого-то финта ушами, чтобы и на ёлку влезь, и жопу не ободрать.
Эстетически? Ахах... :D Хотел бы я посмотреть на этот финт... :)

Blade
28.04.2013, 22:01
Ладно, будет настроение, сделаю утилитку, похоже что и правда никто до сих по не подумал.

В EVO SDK есть monoscl.exe. Правда работает c scl, а не trd.

scl^mc
28.04.2013, 22:04
Правда работает c scl, а не trd.
с точки зрения банальной эрудиции для эмулятора нет абсолютно никакой разницы между scl и trd

introspec
28.04.2013, 22:20
Эстетически? Ахах... :D Хотел бы я посмотреть на этот финт... :)
Ну, например, самый последний плюс ноль не нужен. Можно просто писать RUN USR (PEEK 0*0+PEEK 0) <CODE>, только придётся сделать номер строки "JR куданадо". Но вот как бы от хотя бы одного пика избавиться не понимаю!

---------- Post added at 19:20 ---------- Previous post was at 19:19 ----------


В EVO SDK есть monoscl.exe. Правда работает c scl, а не trd.
О, а вот это уже разговор. Приспособим в дело. Тем более с исходными текстами.

PERESTROiKA
28.04.2013, 22:20
http://zx-pk.ru/showthread.php?t=10396&highlight=APS
Других готовых инструментов очень много.

goodboy
28.04.2013, 22:26
Ну, например, самый последний плюс ноль не нужен.
можно расположить исполняемый код после бейсик программы, тогда на его начало укажет переменная vars и +смещение будет действительно не нужно

introspec
28.04.2013, 22:47
http://zx-pk.ru/showthread.php?t=10396&highlight=APS
Других готовых инструментов очень много.
Спасибо, вспомнил детство в обнимку с Биллом Гилбертом :)))

---------- Post added at 19:47 ---------- Previous post was at 19:46 ----------


можно расположить исполняемый код после бейсик программы, тогда на его начало укажет переменная vars и +смещение будет действительно не нужно
Кстати, вчера думал об этом и побоялся - бейсик при таком раскладе ничего не затрёт случайно?

Faster
29.04.2013, 00:42
можно расположить исполняемый код после бейсик программы, тогда на его начало укажет переменная vars и +смещение будет действительно не нужно
Не укажет. Переменная VARS укажет на адрес сразу за кодом.

goodboy
29.04.2013, 01:15
Не укажет. Переменная VARS укажет на адрес сразу за кодом.
так у меня код будет не после REM, а сразу после программы на бейсике.

introspec
29.04.2013, 02:10
OK, устал об этом думать, по-настоящему хороших мыслей нет. Есть только предложение сберечь один байт заменив *0 на *VAL "2^8".

Была ещё идея напустить тумана таким манером:
LET USR=CODE"[145]"*CODE"[163]":PRINT USR (PEEK USR+VAL"2^8"*PEEK (USR+SGN PI)):
но по этому коду хорошо видно, что писали его поздно вечером и без идей :)

Faster
29.04.2013, 08:47
Была ещё идея напустить тумана таким манером:
LET USR=CODE"[145]"*CODE"[163]":PRINT USR (PEEK USR+VAL"2^8"*PEEK (USR+SGN PI)):
но по этому коду хорошо видно, что писали его поздно вечером и без идей :)
А есть смысл пускать туман? :) При наличии эмуляторов подобные вещи теряют всякий смысл, впрочем эту фразу я отношу и к прочей защите. Да и есть ли смысл защищать? Кому надо те и так разберутся что и как, а кто новичок, так пусть учится, не жалко.

goodboy
29.04.2013, 08:52
если размер кода не критичен то можно после rem в начале программы впихнуть достаточно большой кусок который при загрузке с ленты (prog=23755) точно дойдёт до адреса 23872 (и дальше).

10 rem start1; qwertyuiop; start2
20 goto usr 23872

при загрузке с ленты начнёт выполняться start2
при загрузке с дискеты start1

как я понял introspec хочет только максимально оптимизировать бейсик программу, а не запутать взломщика

Faster
29.04.2013, 09:08
так у меня код будет не после REM, а сразу после программы на бейсике.
Ты имеешь ввиду сразу после кода #D? У меня так тоже не получилось. VARS по-прежнему указывает на адрес после кода. Может я что-то не так делал?:v2_dizzy_botan:

introspec
29.04.2013, 10:22
А есть смысл пускать туман?
Никакого, это просто просто спорт такой :)

---------- Post added at 07:22 ---------- Previous post was at 07:19 ----------


если размер кода не критичен то можно после rem в начале программы впихнуть достаточно большой кусок который при загрузке с ленты (prog=23755) точно дойдёт до адреса 23872
ВОТ, вот это уже мысль! :)

Лас
29.04.2013, 10:27
Есть только предложение сберечь один байт заменив *0 на *VAL "2^8".
*NOT PI

introspec
29.04.2013, 11:23
*NOT PI
Не, там ноль не настоящий, там 256 подразумевается.

---------- Post added at 08:23 ---------- Previous post was at 07:40 ----------


Ты имеешь ввиду сразу после кода #D? У меня так тоже не получилось. VARS по-прежнему указывает на адрес после кода. Может я что-то не так делал?:v2_dizzy_botan:
У меня всё получилось. Проверь у себя заявленную длину первой строки бейсик программы, по идее, если она неверная, работать не должно.

Faster
29.04.2013, 12:33
У меня всё получилось. Проверь у себя заявленную длину первой строки бейсик программы, по идее, если она неверная, работать не должно.
Спасибо, про длину забыл, теперь и у меня заработало.

goodboy
29.04.2013, 15:15
только не применяйте в программе RUN и CLEAR, они очищают область переменных.

Alex Rider
29.04.2013, 16:23
Ты имеешь ввиду сразу после кода #D? У меня так тоже не получилось.
После #D должно быть дополнительно #80 для отделения программы от переменных. На следующий байт должна указывать VARS.

char
01.05.2013, 02:32
RUN USR (PEEK 0*0+PEEK 0+0) <CODE>

PEEK 0*0+PEEK 0+0
1+1+6+1+1+6+1+1+1+6+1+1+6=33 байта

VAL "256*PEEK 23636+PEEK 23635+xx"
1+1+3+1+1+5+1+1+5+1+2+1=23 байта

;)

---------- Post added at 03:32 ---------- Previous post was at 03:22 ----------

p.s. и скобки соответственно не нужны, еще -2 байта

introspec
01.05.2013, 02:36
PEEK 0*0+PEEK 0+0
1+1+6+1+1+6+1+1+1+6+1+1+6=33 байта
VAL "256*PEEK 23636+PEEK 23635+xx"
1+1+3+1+1+5+1+1+5+1+2+1=23 байта
;)
Правильно! только "+хх" не нужно, тут уже 2 способа обхода родилось. Так что достаточно и VAL "256*PEEK 23636+PEEK 23635" ~ 20 байт.
VAL начинает и как всегда выигрывает :)

char
01.05.2013, 02:43
вот и нечего 0-лями воротить, да на отдельные числа VAL'ы натравливать... ;)

Faster
08.07.2013, 12:44
Обновил исходник Basic Loader Creator до версии 4.0!

Предусмотрено 2 варианта создания бейсик-строки:
1. RUN USR X <CODE> - вариант только для TR-DOS
2. RUN USR VAL "PEEK 23628*256+PEEK 23627" <CODE> - универсальный вариант для TR-DOS/TAPE

Что нового:
+ Произведен рефакторинг кода;
! Теперь ключевым пунктом является переменная VARS, а не PROG, как в предыдущей версии, что позволило уменьшить длину получаемого бейсик-файла до минимума:
Строка RUN USR X, LET X=23881 занимает в памяти 10 байтов против 11 байтов RUN USR VAL "23882" и 14 байтов RUN USR 23885;
+ Добавлена возможность скрывать листинг бейсик-программы;
+ Расширен перечень информации, выдаваемый директивой DISPLAY;
- Убрана возможность задания фальшивой (нулевой) длины бейсик-программы в дескрипторе файла.

introspec: при вышеозвученном способе хранения кода в области VARS стало возможным обходиться всего лишь одним PEEK, как ты и хотел :), главное что бы адрес расположения начинался с #5d, но это уже частный случай.

п.с. выражаю благодарность за некоторые идеи: Goodboy, Char, ZS.

Внимание, вопрос:

Отображение бейсик-строки на экране:
1 RUN USR VAL "PEEK 23628*256 <- первая часть строки
+PEEK 23627" <- вторая часть строки

Кто мне подскажет: почему если бейсик-строка занимает на экране больше одной строки, скажем две, то кодами BACKSPACE, SPACE можно скрыть только вторую часть строки, а первую часть нет?

alone
08.07.2013, 13:18
Строка RUN USR X, LET X=23881 занимает в памяти 10 байтов против 11 байтов RUN USR VAL "23882" и 14 байтов RUN USR 23885;
RUN USR 0 занимает 8 байт (первый байт кода = последний байт 5-байтового числа). Используется, например, в mRIP.

Alex Rider
08.07.2013, 13:31
Кто мне подскажет: почему если бейсик-строка занимает на экране больше одной строки, скажем две, то кодами BACKSPACE, SPACE можно скрыть только вторую часть строки, а первую часть нет?
Кажется мне, что причина описана тут (http://www.zxpress.ru/book_articles.php?id=765) в пункте 10.

Slider
09.07.2013, 01:24
Не, там ноль не настоящий, там 256 подразумевается.[COLOR="Silver"]
Очень вряд ли. let s=not pi присваивает s именно 0 а не 256. sgn pi - это 1

introspec
09.07.2013, 02:26
Обновил исходник Basic Loader Creator [...] стало возможным обходиться всего лишь одним PEEK
Я знал, что должен быть способ! отлично, буду теперь иметь в виду :)

---------- Post added at 23:26 ---------- Previous post was at 23:20 ----------


Очень вряд ли. let s=not pi присваивает s именно 0 а не 256. sgn pi - это 1
Тут уже всё перепуталось! Умножение на ноль никогда и никого не интересовало. В ранних версиях было написано *0, хотя во внутреннем представлении нуля сидело число 256 (стандартный трюк для путаницы, или в нашем случае - как бы для экономии памяти). А потом мы коллективно сообразили, что *VAL"2^8" занимает меньше байтов.

alone
09.07.2013, 15:44
А через ERRSP никто не пробовал запускать?
Типа POKE 0,PEEK 0:POKE 0,PEEK 0. Конец программы.
Чисто как дикая идея.

introspec
09.07.2013, 16:02
А через ERRSP никто не пробовал запускать?
Типа POKE 0,PEEK 0:POKE 0,PEEK 0. Конец программы.
Чисто как дикая идея.
Популярная система защиты Speedlock именно так в своё время и запускалась:
ftp://ftp.nvg.unit.no/pub/sinclair/docs/instructions/games-misc/hacking-spectrum-games.txt

Faster
09.07.2013, 16:18
Популярная система защиты Speedlock именно так в своё время и запускалась:
ftp://ftp.nvg.unit.no/pub/sinclair/docs/instructions/games-misc/hacking-spectrum-games.txt

Однако :)

psb
09.07.2013, 17:14
А через ERRSP никто не пробовал запускать?
я пробовал, ОЧЕНЬ давно, работа вроде не сохранилась...

Alex Rider
10.07.2013, 01:37
Среди безумных способов запуска есть и загрузка сектора по PEEK в область системных переменных BASIC, в стек и подмена информации о процедуре вывода в канал K. Полет фантазии большой, сколько можно выжать байтов из этого... Покажет лишь опыт.

Vadim
10.07.2013, 07:43
А через ERRSP никто не пробовал запускать?
В том же Batman the Movie так сделано, задается переменная, а потом Print с неправильным кодом цвета (или over или Bright) и идёт запуск кода. Вообще ошибку любую сделать.

Alex Rider
10.07.2013, 10:49
Вообще ошибку любую сделать.
0 OK тоже пойдет, мне кажется. 9 STOP statement уж точно прокатит.

Faster
10.07.2013, 14:45
0 OK тоже пойдет, мне кажется. 9 STOP statement уж точно прокатит.
Сейчас проверил - 0 OK вполне достаточно, ошибку делать вовсе не обязательно! Подобный способ запуска кода интересен, хотя и не самый короткий в плане длины бейсик-строки. :)

Update: хотя, подумал сейчас, что ошибка наверное все же будет от отображаемых символов кода в области бейсик-переменных.

Alex Rider
10.07.2013, 16:09
Update: хотя, подумал сейчас, что ошибка наверное все же будет от отображаемых символов кода в области бейсик-переменных.
Не должно. Бэйсик не парсит переменные пока нет прямого обращения к ним. Проверить можно, измерив 23610 - для 0 OK там будет FF.

---------- Post added at 16:09 ---------- Previous post was at 16:06 ----------

Кстати, для запуска кода с использованием каналов достаточно одного poke по финсированному адресу и 2 байт в первой строке программы. Вот тока значение этого POKE зависит от того, с ленты или диска происходит запуск (если я правильно помню, что переменные TR-DOS лежат между информацией о каналах и программой).