Просмотр полной версии : SCL/TRD tools under Linux
SAM style
17.07.2009, 18:26
Наваял небольшую консольную тулзу под линь для работы с TRD/SCL.
Пока что умеет следующее:
- создавать новые образы
- выводить каталог образа
- добавлять файлы в образ
- вытаскивать файлы из образа
С хобетами покамест не работает. Для маленького хелпа надо вызвать её без параметров. Спрашивайте вопросы.
ЗЫ: дабы никто не обиделся... выполнено по хотению rasmera
http://github.com/samstyle/mctrd
дадада.... теперь нам нужен человек напишущий на баше плагин к миднайту... ну или просто фронтэнд двухпанельный...
Чтото у меня кроме просмотра файла ни фига с этой утилитой не выходит. Вылетает по сегфолту при попытке вынуть или пихнуть файл в TRD...
Однако, написал плагин для MC, чтобы листинги смотреть.
Инсталлируем его так:
1. Идём в каталог /usr/share/mc/extfs
2. Создаём там чем угодно файл trd следующего содержания:
---------------------------------------------------------------------------
#!/bin/sh
MCTRD=mctrd
umask 077
cmd="$1"
trd_list()
{
# Считываем построчно
$MCTRD list $1 | while read S; do
name="${S:0:7}"
#
A=( ${S:8} )
seclen=${A[3]}
sign=${A[1]}
type=${A[0]}
# Проверка на заголовок
if [[ "$sign" != "len" ]] ; then
echo "-rw-rw-rw- 1 speccy speccy "$seclen" Jan 01 1980 00:00 "$name"<"$type">"
fi
done
}
case "$cmd" in
list) trd_list "$2" ;;
*) exit 1 ;;
esac
exit 0
---------------------------------------------------------------------------
3. Заходим в меню MC, пункт "файл расширений".
4. Добавляем в любом удобном месте следующие строчки:
# trd
regex/\.[tT]([rR][dD])$
Open=%cd %p#trd
View=%view{ascii} mctrd list %f
5. Идём в каталог /etc/mc/extfs.
6. Добавляем в этом каталоге в файл extfs.ini строчки:
# TRD TRDOS image
trd
ВСЁ!!!!
Теперь по F3 - вывод информации о диске в "сыром" виде,
а по Enter - вход в TRD-образ, как в каталог или архив.
ЗЫ.
Писал всё полчаса, так что на автоматический инсталлятор времени нет.
-----------------
Если автор прояснит ситуацию с вылетанием по сегфолту - добавлю и перекидывание файлов туда-сюда в качестве плагина для MC.
Вот полуавтомат-инсталляха плагина для Полуночного Командира.
Самому надо только в пользовательском файле расширений указать тип trd.
Там образец в README имеется.
Косяки:
Неправильно работает с "защищёнными" TRD. Ну где сектор неправильно указан и т.п.
Копирует файлы туда-сюда. Не удаляет, не мувит..
Если SAM style доработает эти действия - нетрудно добавить.
SAM style
02.09.2009, 19:18
Я целиком переделываю утилиту, эта версия премного кривовата - начиная от решения "всё, что не SCL - то TRD" и заканчивая отрицательными числами в листинге.
Я целиком переделываю утилиту, эта версия премного кривовата - начиная от решения "всё, что не SCL - то TRD" и заканчивая отрицательными числами в листинге.
Отлично. Прикручивалка к mc тут уже есть.
Я сегодня по TRDшкам полпзал - так кажется уже, что у меня всю жизнь MC TRD понимал :) Быстро к хорошему привыкаешь :)
Да! Ещё хотел сказать - при извлечении файла надо ориентироваться на размер в секторах. Ну или интеллектуально - если размер в байтах меньше размера в секторах - то извлекать по секторам, иначе по байтам. Типа того.
А то файлы с нулёвой длиной не извлекаются.
SAM style
04.09.2009, 11:54
Переписаный. Пока умеет только то, что умел первый, но уже умнее.
- Более точное опознание форматов (SCL: "SINCLAIR" и 0<=(+8)<128; TRD длиной 640K и с кодом TRDOS на +0x8e7)
- Нормальные start и length в листингах
- Для TRD дополнительно указывается первый сектор и дорожка
- И да, просмотр SCL на длинных путях(?) сегфолтился.
- Извлечение файла учитывает расширение (1 символ). При этом надо точно указывать имя извлекаемого файла с расширением из 1 символа через точку (file.C или screen.s)
- Запаковка по умному обрезает/дополняет имя до 8 символов и берёт первый символ расширения (если его нет - пробел).
PS: извлечение смотрит соответствие длины в байтах и длины в секторах. если всё по честному, берётся длина в байтах, если нет - в секторах * 256
Ну а вот и исправленные для второй версии скрипты под MC.
TRD длиной 640K
Не всегда... мне встречались и короче и длиннее
PS: извлечение смотрит соответствие длины в байтах и длины в секторах. если всё по честному, берётся длина в байтах, если нет - в секторах * 256
Предлагаю - сделай доп. опцию, которая принуждает брать длину в секторах * 256. Это для того, чтобы извлекать файлы программ, которые в огрызке последнего сектора ещё что-то хранят. Помню, попадались такие.
Например так:
mctrd pop file.C image.trd - извлекает как ты писал.
mctrd pops file.C image.trd - извлекает считая всегда длину в секторах * 256.
SAM style
04.09.2009, 18:16
Я думаю, надо сделать опции вместо команд:
mctrd -a : добавить файл в архив как он есть
mctrd -ah : добавить, принимая что входящий - хобета.
mctrd -x : извлечь с автоматической длиной (как сейчас)
mctrd -xs : извлечь с длиной по секторам
mctrd -xh : извлечь в хобету
mctrd -c : создать SCL
mctrd -ct : создвть TRD
mctrd -l : листинг
итд
Я думаю, надо сделать опции вместо команд:
mctrd -a : добавить файл в архив как он есть
mctrd -ah : добавить, принимая что входящий - хобета.
mctrd -x : извлечь с автоматической длиной (как сейчас)
mctrd -xs : извлечь с длиной по секторам
mctrd -xh : извлечь в хобету
mctrd -c : создать SCL
mctrd -ct : создвть TRD
mctrd -l : листинг
итд
Можно и так. Собственно между "опцией" и "командой" - различий нет. Разве что "команды" пишутся словом, "опции" - начинаются с минуса :)
Кстати, мой скрипт для mc не опробовал ? А то мало ли чего он на иных версиях Linux вытворит.
SAM style
19.01.2011, 14:50
Подниму старую тему вверх. На днях rasmer снова вспомнил про эту прогу, и я тоже вспомнил - при засовывании файла в trd неправильно выставлялись пара параметров в системном секторе. Обещался исправить - исправил. Нового ничего не привнёс ;)
Под OSX собралось (единственное, поменял в Makefile g++ на clang++).
Ну и в связи с тем, что в midnight-commander теперь VFS обрабатываются по другому, в файл расширений mc.ext текст стал таким:
# trd
regex/\.[tT]([rR][dD])$
Open=%cd %p/trd://
View=%view{ascii} mctrd list %f
а для поддержки TRD как файловой системы скрипт "trd" by SfS достаточно скопировать в каталог <путь к mc>/libexec/mc/extfs.d/
сам mc под OSX проще всего установить с помощью homebrew (http://mxcl.github.io/homebrew/):
brew install mc
тогда путь к /extfs.d/ скорее всего будет: /usr/local/Cellar/midnight-commander/<номер версии>/libexec/mc/extfs.d/
SAM style
02.04.2014, 14:47
Возрождаю тему. На гихабе (https://github.com/samstyle/mctrd) выложил новую версию - она может правильно запихивать в образы скомпиленные бейсик-файлы с указанием строки автозапуска.
Пример : mctrd add boot image.trd -b -a 10
-b указывает работать с файлом, как с бейсиком - START = LENGTH, расширение ставится B, в конец файла дописывается #80 #AA и номер строки автозапуска. Последние байты не включаются в длину файла.
-a num устанавливает номер строки автозапуска
PS : Ну и на си его переделал.
Наконец-то стало можно бейсики батником заливать!
Наконец-то стало можно бейсики батником заливать!
а зачем это аласму? а ужасм умеет и так бейсики записывать, даже с автостартом. даже проблемы такой не было.
denpopov
02.04.2014, 17:28
А для винды ЭТО скомпилируется?
int testsig(char* buf, int len) {
if ((strncmp("SINCLAIR", buf, 8) == 0) && (buf[8] >= 0)) return TYPE_SCL; // SCL
if ((len > 0x900) && (buf[0x8e7] == 0x10)) return TYPE_TRD; // TRD
return TYPE_UNKNOWN;
это сразу сюда (http://govnokod.ru)
SAM style
02.04.2014, 17:32
а зачем это аласму? а ужасм умеет и так бейсики записывать, даже с автостартом. даже проблемы такой не было.
Фичу зареквестил забугорный товарищ, который юзает zmakebas, а он умеет только в тапки.
А для винды ЭТО скомпилируется?Предложи свой вариант определения типа файла (trd-scl) не по расширению. Да и зачем это для винды, когда там есть плагины для фара?
denpopov
02.04.2014, 17:54
Да и зачем это для винды, когда там есть плагины для фара?
для скорой сборки, например
Предложи свой вариант определения типа файла (trd-scl) не по расширению. Да и зачем это для винды, когда там есть плагины для фара?
Быстрый детект SCL по сигнатуре 'SINCLAIR' и последующему байту в диапазоне 1-255:
namespace SCL
{
using namespace Formats;
const std::string FORMAT(
"'S'I'N'C'L'A'I'R"
"01-ff"
);
Детальная проверка также включает в себя подсчет и сверку контрольной суммы.
С TRD ситуация гораздо хуже.
Быстрый детект по содержимому сервисного сектора и примерной структуре каталога (можно облегчить):
namespace TRD
{
using namespace Formats;
const std::string FORMAT(
"(00|01|20-7f??????? ??? ?? ? 0x 00-a0){128}"
//service sector
"00" //zero
"?{224}" //reserved
"?" //free sector
"?" //free track
"16" //type DS_DD
"01-7f" //files
"?00-09" //free sectors
"10" //ID
"0000?????????00"//reserved
"?" //deleted files
"20-7f{8}"//title
"000000" //reserved
);
Детальная проверка может включать анализ файлов на непересечения.
buf[8] >= 0
а в чем смысл этой проверки? число не может быть больше 128? почему?
len > 0x900
грубовато:) хотя бы >=, для красоты:)
SAM style
02.04.2014, 18:17
а в чем смысл этой проверки? число не может быть больше 128? почему?Число файлов. Да, в SCL можно запихнуть до 255, но в каталог диска это не влезет, использовать такие SCL зело проблематично.
namespace... std::string...А мне в голову вдарило, я просто си использую. Да и testsig делает почти те же проверки, только сильно упрощенные. buf подготовлен заранее, размер 640K и там лежит весь образ.
Я не отрицаю, что при определенных условиях оно завалится, но в общем случае будет работать.
А мне в голову вдарило, я просто си использую.
Да пофиг. Это просто описание чекера. У меня просто это строка компилируется в код, который умеет проверять и (самое главное) искать байты по шаблону. Более детальная проверка (типа контрольной суммы) делается кодом.
Alex Rider
02.04.2014, 18:33
батником заливать
Батник под Linux? Что это?
denpopov
02.04.2014, 18:47
а кстати аналог bas2tap для .trd не помешал бы, а то влом на асме писать бейсик.
SAM style
02.04.2014, 18:55
а кстати аналог bas2tap для .trd не помешал бы, а то влом на асме писать бейсик.bas2tap может скомпилять не в tap, а в простой файл, как zmakebas? Если да - вот тебе конвеер (bas2tap + mctrd), вполне юниксвей.
Батник под Linux? Что это?
Она под Windows вполне себе компилируется с незначительными изменениями (например, в MSVC с помощью pgetopt - я собрал, но не проверял). А есть ещё MinGW.
Она под Windows вполне себе компилируется с незначительными изменениями (например, в MSVC с помощью pgetopt - я собрал, но не проверял). А есть ещё MinGW.
а еще есть занимательное чтиво - история создания, так сказать:)
http://logz80.dimkam.ru/channel_%23mhm.forestnet_2014.04.02.log (z80::log) читать примерно с 19:51:13 :)))
"я собрал, но не проверял" - это очень мягко говоря. наверное, закладок туда навтыкал...
Как странно - выложил в 19:46, а "история создания" начинается с 19:51...
Как странно - выложил в 19:46, а "история создания" начинается с 19:51...
я и говорю, занимательное чтиво! :) во всех отношениях :)
denpopov
03.04.2014, 12:52
я и говорю, занимательное чтиво!
ну я вот не стыжусь заявить, что в Сях не шарю, но "собрал" немного нескромно..
ну я вот не стыжусь заявить, что в Сях не шарю
не шарить - не стыдно. но стыдно должно быть когда весь из себя типо молодец, а на деле не шаришь...
Q-Master
07.04.2014, 00:47
Народ, попробуйте вариант того-же самого только на Питоне. Требуется минимум 2.7 для нормальной работы с командной строкой.
В теории этот модуль можно использовать где угодно т.к. это не набор ф-ций, а полноценное ООП АПИ.
Теоретически оно работает как надо, но я особенно не проверял.
С коментариями - велкам.
Для SCL файлов не пишется контрольная сумма.
Подфикшенная версия + сборка под винду
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define TYPE_UNKNOWN 0
#define TYPE_SCL 1
#define TYPE_TRD 2
int readfile(char* fname, char* buf, int maxlen) {
FILE *infile = fopen(fname,"rb");
if (!infile) return -1; // failed to open file
fseek(infile, 0, SEEK_END);
int iflen = ftell(infile);
rewind(infile);
if (iflen <= maxlen) {
fread(buf, iflen, 1, infile);
} else {
iflen = 0;
}
fclose(infile);
return iflen;
}
int savefile(char* fname, char* buf, int len) {
FILE *file = fopen(fname, "wb");
if (!file) return 0;
fwrite(buf, len, 1, file);
fclose(file);
return 1;
}
int testsig(char* buf, int len) {
if ((strncmp("SINCLAIR", buf, 8) == 0) && (buf[8] >= 0)) return TYPE_SCL; // SCL
if ((len > 0x900) && (buf[0x8e7] == 0x10)) return TYPE_TRD; // TRD
return TYPE_UNKNOWN; // unknown
}
void extractfile(char* buf, unsigned char* ptr, int fpos, char* fname) {
int len = ptr[11] | (ptr[12] << 8);
unsigned char slen = ptr[13];
unsigned char rlen = ptr[12] + (ptr[11] ? 1 : 0);
if (slen != rlen) len = (slen << 8);
FILE *ofile = fopen(fname, "wb");
if (!ofile) {
printf("Can't write to file '%s'\n",fname);
} else {
fwrite(buf+fpos, len, 1, ofile);
fclose(ofile);
}
}
void makedsc(char* ptr, char* fname, char fext, int len, unsigned char slen, int isBasic) {
strncpy(ptr, fname, 8); // filename
ptr[8] = fext; // ext
ptr[11] = len & 0xff; // length
ptr[12] = ((len & 0xff00) >> 8);
ptr[13] = slen; // sectors lenght
if (isBasic) {
ptr[9] = ptr[11];
ptr[10] = ptr[12];
} else {
ptr[9] = ptr[10] = 0;
}
}
void addcrc(char* data, int len) {
unsigned int crc = 0;
for (int i = 0; i != len; ++i) {
crc += (unsigned char)data[i];
}
memcpy(data + len, &crc, 4);
}
void pack(char* fextra, char* aname, int isBasic, int autoStart) {
char fname[8];
char fext;
int fnsize = strlen(fextra);
char* dotpos = strrchr(fextra,'.'); // locate last dot
if (dotpos == NULL) {
fext = 'C';
} else if (dotpos[1] == 0x00) {
fext = 'C';
fnsize = dotpos - fextra;
} else {
fext = dotpos[1];
fnsize = dotpos - fextra;
}
if (isBasic) fext = 'B';
if (fnsize > 8) fnsize = 8;
memset(fname, 0x20, 8);
memcpy(fname, fextra, fnsize);
char *inbuf = (char *)malloc(0x10000 * sizeof(char));
int iflen = readfile(fextra, inbuf, 0xff00);
if (iflen == -1) {
printf("Can't read file '%s'\n",fextra);
free(inbuf);
return;
}
if (iflen == 0) {
printf("Input file '%s' is too long (0xff00 is a maximum)\n",fextra);
free(inbuf);
return;
}
if (isBasic) {
inbuf[iflen] = 0x80;
inbuf[iflen+1] = 0xaa;
inbuf[iflen+2] = autoStart & 0xff;
inbuf[iflen+3] = ((autoStart & 0xff00) >> 8);
}
char *obuf = (char *)malloc(0xa0000 * sizeof(char));
int olen = readfile(aname, obuf, 0xa0000);
if (olen < 1) {
printf("Can't read output file '%s'\n", aname);
free(inbuf);
free(obuf);
return;
}
int mode = testsig(obuf, olen);
int dataLen = iflen + (isBasic ? 4 : 0); // 80 aa <autostart>
unsigned char seclen = ((dataLen & 0xff00) >> 8) + ((dataLen & 0xff) ? 1 : 0); // sectors len
unsigned char lastsec, lasttrk, files;
unsigned int freesec, fpos, secnum;
char* ptr = obuf;
char dsc[16];
switch (mode) {
case TYPE_SCL:
files = obuf[8];
if (files > 127) {
printf("Too many files in image\n");
break;
}
obuf[8]++;
freesec = 9 + 14 * files; // old catalog len
memmove(obuf + freesec + 14, obuf + freesec, olen - freesec);
makedsc(obuf + freesec, fname, fext, iflen, seclen, isBasic);
memcpy(obuf + olen - 4 + 14, inbuf, seclen * 256);
addcrc(obuf, olen - 4 + seclen * 256 + 14);
savefile(aname, obuf, olen + seclen * 256 + 14);
break;
case TYPE_TRD:
files = obuf[0x8e4];
if (files > 127) {
printf("Too many files in image\n");
break;
}
freesec = (obuf[0x8e5] & 0xff) | ((obuf[0x8e6] & 0xff) << 8);
if (freesec < seclen) {
printf("No room for file\n");
break;
}
lastsec = obuf[0x8e1];
lasttrk = obuf[0x8e2];
files++;
obuf[0x8e4] = files;
freesec -= seclen;
obuf[0x8e5] = freesec & 0xff;
obuf[0x8e6] = ((freesec & 0xff00) >> 8);
while (*ptr) // find 1st free descriptor
ptr += 16;
makedsc(ptr, fname, fext, iflen, seclen, isBasic);
ptr[14] = lastsec;
ptr[15] = lasttrk;
secnum = ((lasttrk << 4) + lastsec); // free sector num
fpos = (secnum << 8); // (lasttrk<<12)+(lastsec<<8);
secnum += seclen;
lastsec = secnum & 15;
lasttrk = ((secnum & 0xfff0) >> 4);
obuf[0x8e1] = lastsec;
obuf[0x8e2] = lasttrk;
memcpy(obuf + fpos, inbuf, dataLen); // copy file data
savefile(aname, obuf, 0xa0000);
break;
default:
printf("Unknown image format\n");
break;
}
free(inbuf);
free(obuf);
}
void extract(char* fextra, char* aname) {
int felen = strlen(fextra);
if (felen > 10) {
printf("Filename is too long ('filename.C' is maximum)\n");
return;
}
if (felen < 2) {
printf("Filename is too short (must be '.C' at least)\n");
return;
}
if (fextra[felen - 2] != '.') {
printf("Filename must be in 'fileneme.e' format\n");
return;
}
char fname[9];
memset(fname,0x20,9);
memcpy(fname,fextra,felen-2);
fname[8] = fextra[felen-1];
char *buf = (char *)malloc(0xa0000 * sizeof(char));
int len=readfile(aname,buf,0xa0000);
if (len < 1) {
printf("Can't read file '%s'\n",aname);
free(buf);
return;
}
int mode = testsig(buf, len);
unsigned char* ptr = (unsigned char*)buf;
int i = 0;
int fpos;
switch (mode) {
case TYPE_SCL:
ptr += 9;
fpos = 9 + buf[8] * 14; // begin of data
while (i < buf[8]) {
if (strncmp(fname, (char*)ptr, 9) == 0) {
extractfile(buf, ptr, fpos, fextra);
}
fpos += (ptr[13] << 8);
ptr += 14;
i++;
}
break;
case TYPE_TRD:
while(*ptr && (i < 128)) {
if (strncmp(fname, (char*)ptr, 9) == 0) {
fpos=(ptr[15] << 12) + (ptr[14] << 8); // position of begin of file in buf
extractfile(buf, ptr, fpos, fextra);
}
ptr += 16;
i++;
}
break;
default:
printf("Unknown image format\n");
break;
}
free(buf);
}
void list(char* fname) {
char *buf = (char *)malloc(0xa0000 * sizeof(char));
int len = readfile(fname, buf,0xa0000);
if (len < 1) {
printf("Can't read file '%s'\n",fname);
free(buf);
return;
}
int mode = testsig(buf, len);
unsigned char* ptr = (unsigned char*)buf;
unsigned char i = 0;
int start;
switch (mode) {
case TYPE_SCL:
ptr += 9;
printf("Name\t\tExt\tStart\tSize\tSLen\n---------------------------\n");
while (i < buf[8]) {
start = ptr[9] | (ptr[10] << 8);
len = ptr[11] | (ptr[12] << 8);
printf("%.8s\t%c\t%i\t%i\t%i\n",ptr,ptr[8], start, len, ptr[13]);
ptr+=14;
i++;
}
break;
case TYPE_TRD:
printf("Name\t\tExt\tStart\tSize\tSLen\tTrk\tSec\n---------------------------\n");
while (*ptr && (i < 128)) {
if (*ptr != 1) {
start = ptr[9] | (ptr[10] << 8);
len = ptr[11] | (ptr[12] << 8);
printf("%.8s\t%c\t%i\t%i\t%i\t%i\t%i\n",ptr,ptr[8],start,len,ptr[13],ptr[14],ptr[15]);
}
ptr+=16; i++;
}
break;
default:
printf("Unknown image format\n");
break;
}
free(buf);
}
void createtrd(char* fname) {
char *buf = (char *)malloc(0xa0000 * sizeof(char));
memset(buf, 0x00, 0xa0000);
buf[0x8e2] = 0x01;
buf[0x8e3] = 0x16;
buf[0x8e5] = 0xf0;
buf[0x8e6] = 0x09;
buf[0x8e7] = 0x10;
FILE *ofile = fopen(fname,"wb");
if (!ofile) {
printf("Can't write to file '%s'\n",fname);
} else {
fwrite(buf,0xa0000,1,ofile);
fclose(ofile);
}
free(buf);
}
void createscl(char* fname) {
char data[] = {'S', 'I', 'N', 'C', 'L', 'A', 'I', 'R', 0, 0, 0, 0, 0};
addcrc(data, 9);
savefile(fname, data, sizeof(data));
}
void help() {
printf("Usage:\n");
printf(" list filename\t\t\t\tlist of files\n");
printf(" ctrd filename\t\t\t\tcreate new TRD\n");
printf(" cscl filename\t\t\t\tcreate new SCL\n");
printf(" add filename archname [parameters]\tadd file to archive\n");
printf(" parameters:\n");
printf(" --autostart <number>\n");
printf(" --basic\n");
printf(" pop filename archname\t\t\textract file from archive\n");
}
int main(int ac,char* av[]) {
char* com = NULL;
char* fname1 = NULL;
char* fname2 = NULL;
int isBasic = 0;
int autoStart = 0;
for (int i = 1; i != ac; ++i) {
char* poptarg = av[i];
if (strcmp(poptarg, "--autostart") == 0) {
if (i == ac - 1) {
printf("Invalid parameters count!\n");
return 1;
}
autoStart = atoi(av[++i]);
} else if (strcmp(poptarg, "--basic") == 0) {
isBasic = 1;
} else {
if (!com) com = poptarg;
else if (!fname1) fname1 = poptarg;
else if (!fname2) fname2 = poptarg;
}
}
if (!fname1) help();
else if (strcmp(com,"list") == 0) list(fname1);
else if (strcmp(com,"ctrd") == 0) createtrd(fname1);
else if (strcmp(com,"cscl") == 0) createscl(fname1);
else if (!fname2) help();
else if (strcmp(com,"pop") == 0) extract(fname1,fname2);
else if (strcmp(com,"add") == 0) pack(fname1,fname2,isBasic,autoStart);
else help();
return 0;
}
UPD: исправлена обработка параметров автостарта и бейсика
denpopov
18.06.2014, 12:12
Подфикшенная версия + сборка под винду
Не совсем понятно, как вызывать:
mctrd.exe команда имя образа
?
Что непонятно? Как CLI утилитами пользоваться?
denpopov
18.06.2014, 12:19
да.
Вызываешь в консоли, передавая параметры через командную строку. Формат параметров в хелпе (выдается при запуске без параметров).
Shadow Maker
18.06.2014, 13:02
Vitamin, что-то не так.
mctrd add XXX.bin test.scl
выдает ERR: File 'add' not found!
Хотя mctrd cscl test.scl создало
Это ошибка не программы, а интерпретатора. Где-то ты наглючил с вызовом.
---------- Post added at 13:13 ---------- Previous post was at 13:11 ----------
>mctrd cscl test.scl
>mctrd add mctrd.zip test.scl
>mctrd list test.scl
Name Ext Start Size SLen
---------------------------
mctrd z 0 48922 192
Shadow Maker
18.06.2014, 13:27
Ты прав, все работает. Единственный момент - можно сделать, чтобы при записи файла на диск, бралось полное расширение? Типа если я пишу Hscreen.bin у меня и записался бы Hscreen .bin, а не Hscreen.b, то есть чтобы эти два байта в виде стартовых были, ну как обычно в общем.
SAM style
18.06.2014, 14:00
if (strcmp(poptarg, "-a") == 0) {
autoStart = atoi(poptarg);Слегка не понял это место... autoStart так всегда будет 0?
Я правильно понял, что я тут что-то не понял? Должно быть atoi(av[++i]); или как-то так.
Точно! Поправил. Сделал более понятные имена опций и добавил их в хелп.
Q-Master
18.06.2014, 20:30
Поправил в соответствии с mctrd новым.
SAM style
18.06.2014, 21:36
https://github.com/samstyle/mctrd
Вкоммитил:
- crc для scl
- трехбуквенное расширение, если таковое есть. Более чем 3-буквенные отрезаются (torrent -> tor), бейсики на расширение кладут свой 'B'.
Вкоммитил:
Зависимость от getopt тоже надо бы убрать, а то под виндой несобираеццо.
SAM style
18.06.2014, 23:29
Зависимость от getopt тоже надо бы убрать, а то под виндой несобираеццо.Убрал инклюд. Забыл, второй раз уже за сегодня переделывал. Первый раз сделал, потестил и на автомате удалил main.c вместе с образом :(
Shadow Maker
28.06.2014, 18:05
Баг: Если пишешь файлы из папки - пишет не используя файла, а весь путь включая папки, в итоге файлы типа Files/blz.b.
И реквестирую бинарь для винды.
Поправил в соответствии с mctrd новым.прошу огромного прощения - но куда данный файл копировать, чтобы миднайт понимал образы дисков?
Специально для товарища rasmer написал инструкцию и приложил все файлы. Если кому щё надо - пользуйтесь на благо.
Да, скрипт для работы с extfs гдето немного крив. Пока не понял где.
Глючт при копировании НА образ иногда.
У меня для скрипта trd путь был /usr/lib/mc
но всё равно:
1. у тебя bash ?
2. mctrd из архива, что я выложил?
3. mc версии 4.8.12 или выше?
4. шелл и mc перезапустил?
я в скрипте гляжу - он на 15 строчку ругается вроде. может у тебя не баш ?
У меня так работает, как на картинке.
SAM style
12.11.2014, 22:24
1. у тебя bash ?
2. mctrd из архива, что я выложил?
3. mc версии 4.8.12 или выше?
4. шелл и mc перезапустил?
я в скрипте гляжу - он на 15 строчку ругается вроде. может у тебя не баш ?
У меня так работает, как на картинке.
У тебя в самом скрипте указано #!/bin/sh. У меня, например, это сцылка на dash.
запуск вот этой команды: ls -al /bin/*sh , подтвердил опасения, что у меня тоже sh перенаправляет на dash. Проблема решилась заменой sh на bash в скрипте. Но это не самое интересное... самое интересное, то что многоуважаемый SfS, которому выражается огромная благодарность за его скрипт, на самом деле извращенец!!! скрипт написан в кодировке koi8r :)
самое интересное, то что многоуважаемый SfS, которому выражается огромная благодарность за его скрипт, на самом деле извращенец!!! скрипт написан в кодировке koi8r :)
Ой, грешен-грешен! :)
Но немного оправдаюсь.
У меня по роду работы есть терминалы с KOI8-R. Вот комментарии в KOI8-R и получились. На вывод скрипта это не влияет.
Если надо - то воспользуйся утилитой enconv. Она автоматически определит кодировку файла и конвертирует файл в текущую кодировку.
Поправил комменты и нашёл причину ошибки. Оказывается mctrd непраильно компилится с оптимизацией.
Арзив перезалил http://zx-pk.ru/attachment.php?attachmentid=49889&d=1415891943
Там есть уже готовые статически собранные mctrd для 32 и 64 разрядных процов.
Q-Master
13.11.2014, 22:11
прошу огромного прощения - но куда данный файл копировать, чтобы миднайт понимал образы дисков?
У блин. Не заметил коментария.
Ну вообще я не делал для mc плаг. Надо попробовать сделать.
У блин. Не заметил коментария.
Ну вообще я не делал для mc плаг. Надо попробовать сделать.
всё уже сделано) инструкция в архиве. работает только с bash
всё уже сделано) инструкция в архиве. работает только с bashдобавь в мануал описание проблемы с которой я столкнулся и как её решать, также укажи, что путь может быть другой!
Q-Master
14.11.2014, 20:04
всё уже сделано) инструкция в архиве. работает только с bash
Ну у тебя юзается mctrd, а не мои тулзы. Надо для них нарисовать аналогичную штуку.
Ну у тебя юзается mctrd, а не мои тулзы. Надо для них нарисовать аналогичную штуку.
прошу прощения, а ссылоску на "твои тулзы" можно?) гляну - нарисую, если смогу
---------- Post added at 01:33 ---------- Previous post was at 01:31 ----------
добавь в мануал описание проблемы с которой я столкнулся и как её решать, также укажи, что путь может быть другой!
слушай, а нет какого-нибудь универсального способа узнать - куда mc эти все файлы свои помещает? тогда можно было бы скрипт-инсталлятор нарисовать.
Ну... если я правильно понимаю, то он говорит во про это: http://zx-pk.ru/showthread.php?t=23618
Q-Master
16.11.2014, 19:24
прошу прощения, а ссылоску на "твои тулзы" можно?) гляну - нарисую, если смогу
Ну ты уже видел...
Я и сам нарисую. Никакой разницы по вызовам и отображению относительно mctrd у меня нет. Специально делал копипасту. Единственное что, мои тулзы умеют еще хобету и тап.
Ну ты уже видел...
Я и сам нарисую. Никакой разницы по вызовам и отображению относительно mctrd у меня нет. Специально делал копипасту. Единственное что, мои тулзы умеют еще хобету и тап.
ну значит нужное дело. спасибо.
SAM style
01.02.2015, 04:52
Не прошло и года, я подпилил это поделие:
При внесении в образ из пути выкусываются имя файла и расширение. Теперь получаются нормальные имена
Зачатки работы с tap. Можно "создать" образ и добавить туда блок (бейсик/код, с заголовком/без). Потестил на Wanderers - собралось и даже загрузилось. Посмотреть содержимое tap или вытащить оттуда блок пока нельзя.
Новые команды:
mctrd ctap name.tap : создать пустой образ (просто делается файл нулевой длины)
mctrd atap file.ext name.tap : добавить в tap файл.
Если указан ключ -n, добавляется блок без заголовка. Ключи -b и -a работают так же, как с образами дисков - указывают, что это бейсик и задают строку автозапуска.
https://github.com/samstyle/mctrd
SAM style
06.02.2015, 01:25
Приспичило, я его снова переписал. Теперь хоть в исходнике не такая каша...
Добавилось новое:
Кроме содержимого, образы распознаются и по расширению (scl, trd, tap, регистр не важен).
list работает на *.tap. Выводит каждый блок (т.е файл с заголовком - это 2 блока).
add стал работать и для *.tap; atap остался, но он не проверяет образ, по умолчанию считает его *.tap.
pop заимел третий параметр, необязательный - это имя, под которым файл из образа будет сохранён. Если это имя отсутствует, оно будет взято из имени файла в образе. Пример: mctrd pop file.C image.trd out.bin.
pop на tap пока не действует, в разработке...
хелп дополнен новыми ключами и параметрами.
http://github.com/samstyle/mctrd
SAM style
23.02.2015, 13:59
Одн@ко. https://aur.archlinux.org/packages/mctrd-git/
Всякую фигню в этот арч пихают...
aGGreSSor
01.08.2015, 21:40
Работает отлично, спасибо. :v2_thumb:
В Debian путь для trd /usr/lib/mc/extfs.d/
Но mctrd не хобетизировал мне вставляемый в trd-образ файл. Он его просто вставил as is. А чем хобетизируете?
...
В общем, не работает статически линкованная версия с 32/64 (из mctrd-install-plugin.7z)
Вставляет/достаёт файлы отлично. Только толку с этого никакого.
Берём файл MUSIC.M с диска с протрекером, вытаскиваем, переименовываем в MUSIC2.M, запихиваем обратно в TRD.
Подсовываем TRD эмулятору, грузим протрекер, в него загружаем MUSIC2.M - эмулируемый спек виснет.
...
Версия из mctrd-20110119.zip лепит аварийный останов. Пошёл компилировать c гита.
...
Со скомпилённой версией с гита ещё интересней.
Захожу CC1_MUS.TRD, смотрю ARCTLAND.m 4352 байта. Копирую.
Получаю у себя ARCTLAND.m 4318 байт. Хм. 34 байта? Не 17?
4352-17 заголовка хобеты=4335 байт.
Что-то у нас как-то не так. Открываю EMPTY.TRD, копирую ARCTLAND.m 4318 байтовый туда.
Копируется. На TRD-диске 4352 байта. Да ну? Ok, открываю в эмуляторе. Открывается!
http://savepic.ru/7693534.jpg
:v2_dizzy_tired2:
aGGreSSor
02.08.2015, 19:35
В общем, вопрос закрыт TRD Folder beta v2.02 army edition. Работает под wine, просто драгаются нужные файлы из Dolphin в открытый в софтине TRD (неочевидно, кнопок добавления нет) и всё. Файлы добавляются на диск корректно, в отличии от ^^ проблем нет.
SAM style
02.08.2015, 20:36
В общем, вопрос закрыт TRD Folder beta v2.02 army edition. Работает под wine, просто драгаются нужные файлы из Dolphin в открытый в софтине TRD (неочевидно, кнопок добавления нет) и всё. Файлы добавляются на диск корректно, в отличии от ^^ проблем нет.Для mctrd первоочередная длина файла - это длина в байтах. Если длина в секторах и длина в байтах не совпадают, берётся длина в секторах*256. Из предыдущего поста 4352 = #1100, 4318 = #10DE. Подозреваю, то, чем ты смотрел длину в TRD показывало тебе сектора. А с хобетами он работать не умеет.
aGGreSSor
03.08.2015, 23:37
Для mctrd первоочередная длина файла - это длина в байтах. Если длина в секторах и длина в байтах не совпадают, берётся длина в секторах*256. Из предыдущего поста 4352 = #1100, 4318 = #10DE. Подозреваю, то, чем ты смотрел длину в TRD показывало тебе сектора. А с хобетами он работать не умеет.
Так в mc и mctrd смотрел же, соответственно. С датой файлов ещё ПЦ. Короче, это годная вещь в разборе TRD-дисков/SCL-файлов, но не в их препарации. Для препарации под Linux - вендозный TRD Folder (хотя он убог). Альтернативы пока так и не нашёл.
http://savepic.net/7051378.jpg
http://savepic.net/7033973.jpg
скопируй его из образа - получишь правильную длину...
SAM style
04.08.2015, 11:21
Так в mc и mctrd смотрел же, соответственно. С датой файлов ещё ПЦ. Короче, это годная вещь в разборе TRD-дисков/SCL-файлов, но не в их препарации. Для препарации под Linux - вендозный TRD Folder (хотя он убог). Альтернативы пока так и не нашёл.
http://savepic.net/7051378.jpg
http://savepic.net/7033973.jpg
Так погоди, плагин для mc не я писал. Возможно, он и врёт. Ты попробуй натравить на образ сам mctrd: mctrd list <путь-к-образу>. Если он покажет правильно - претензии не ко мне.
Ко мне - претензии, что pop из scl работает неправильно. Вот это уже засада...
PS:закоммитил build 20140804
Специально для товарища rasmer написал инструкцию и приложил все файлы. Если кому щё надо - пользуйтесь на благо.
Да, скрипт для работы с extfs гдето немного крив. Пока не понял где.
Глючт при копировании НА образ иногда.
Инструкция есть, туда бы ещё добавить для дебиана - что это /usr/lib/mc/extfs.d/
У меня по F3 всё отлично отрабатывает. А вот по ентеру пишет "uknown. image". Ого, сам нашёл, дело в русских буквах пути.
Требую фикс: 1) надо добавить папку в описалово, 2) в "trd" фиксить:
diff /usr/lib/mc/extfs.d/trd trd
12c12
< $MCTRD list "$1" | while read S; do
---
> $MCTRD list $1 | while read S; do
43c43
< cd "$_pwd"
---
> cd $_pwd
50c50
< cd "$_pwd"
---
> cd $_pwd
Исправленная версия пакета во вложении.
- - - Добавлено - - -
Ещё, уже к SamStyle - а можно добавить rename функцию? Тупая донельзя ситуация - хочется файл сделать boot.B и только переименованием, переносом, удалением и т.п.
- - - Добавлено - - -
И ещё, к SamStyle - у меня не работает pop.
Поэтому push боюсь трогать. Вот файл для примера.
Собирал с гита банальным make.
Debian 7, 64 бита.
SAM style
07.11.2015, 17:50
И ещё, к SamStyle - у меня не работает pop.
Ага, нашёл. Неверно работал pop из trd. С push всё нормально. Закоммитил исправления.
а можно добавить rename функцию?
Чуть позже. У меня ещё идея вделать какой-нибудь join для создания монолоадеров - напихал файлов в образ, потом натравил join - и каталог "спрессовался" в один/несколько больших файлов
так же с гита брать?
- - - Добавлено - - -
вижу... Тяну...
- - - Добавлено - - -
Спасибо, работает!
- - - Добавлено - - -
обновляю пак... Там сразу вложен пакет нового МЦ-ТРД от самстайла
- - - Добавлено - - -
И ещё раз обновляю: нашёл достаточно серьёзную ошибку с "корявыми" именами файлов внутри ТРД/СЦЛ, если содержать спецсимволы, то bash их может сам "дополнить", что не есть хорошо.
Сейчас если файл как есть не распаковался, то у его названия откусывается 2 первых символа (вместо "./-F1-.$" станет "-F1-.$") и успешно распакуется.
- - - Добавлено - - -
вложение тут
Ну вот, пишу сам себе? :-) Нашёл ещё одну ошибку - имена вида "0______*.C" обрезались до "0_*.C" (с пробелами) c последующим неоткрыванием через MCTRD, собственно исправленный файл обработки вложен.
Исправлено определение размера файлов: теперь если секторный размер больше чем размер файла указанный, то его размер показывается в секторной длине (то есть секторов * 256).
Ещё, в тырдосе допустимы имена вида "012?4567.С", как с ними быть? Ого... Оказывается Ext3 отрабатывает такие имена, ну что тогда пока поставлю жирную точку, собственно пак приложен.
2SamStyle> Надо три функции до полного набора: Delete, Rename, Move (уплотнение диска). Ну и последний реквест - возможность внедрять (add) и забирать (pop) в хобете: http://speccy.info/Hobeta
SAM style
09.11.2015, 14:29
Небольшое обновление при содействии GriV'а
Ключ -z или --hobeta заставляет pop вытаскивать файл в хобету. Работает для scl и trd Команды ctrd, cscl, ctap слились в одну - new. Тип создаваемого образа зависит от расширения файла.
http://github.com/samstyle/mctrd
SAM style
22.11.2015, 23:12
build 20151122 Ключ -z (--hobeta) действует и для add - втаскивает хобеты в образ. Никаких проверок на корректность хобеты пока что не делается. Полагается, юзер сам знает, что делает :v2_smoke:
http://github.com/samstyle/mctrd
shuran33
28.09.2017, 22:59
SAM style, огромное спасибо за программу.
Спасибо за прогу! Однако, что-то не хочет у меня работать плагин для mc. Просто ведет себя как будто его нет. trd взял отсюда: https://zx-pk.ru/threads/10559-scl-trd-tools-under-linux.html?p=840001&viewfull=1#post840001
Все по инструкции, права на исполнение скрипта trd выставил, mctrd последний - из гита.
Решено: в файл расширений mc надо вставлять в строки перед default(не в самый конец)
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot