PC-01 Lviv

It is currently 19 Mar 2024, 11:15

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00




Post new topic  Reply to topic  [ 78 posts ]  Go to page Previous 1 2 3 4 5 6 Next
Author Message
PostPosted: 14 Nov 2016, 12:52 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Quote:
.... ждем спецификацию нового формата .
Формат прост, как двери. Но хочу сначала переговорить с Целиковым, может он согласится добавить его в "Башкирию" и будет иметь замечания.


Top
   
PostPosted: 20 Dec 2017, 18:52 
Offline

Joined: 18 May 2016, 19:55
Posts: 425
Quote:
Формат прост, как двери. Но хочу сначала переговорить с Целиковым, может он согласится добавить его в "Башкирию" и будет иметь замечания.
А что за формат такой ?
Если есть ЧЁТКОЕ описание я бы тоже добавил в свой эмуль. Описание можно посмотреть ?


Top
   
PostPosted: 20 Dec 2017, 19:56 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Формат очень прост. Начало - это понлноценный образ SAV. Эмуялтор грузит его, как обычно, но при этом нужно установить некий внутренний счетчик тиков эмуляции в ноль. После SAV'а дописывается массив всех изменений управляющих устройств.
Каждый элемент состоит из 16 байт. Первые 8 - это long значение тиков процессора, от начала записи. Эмулятор должен сверять это занчение со своим счетсиком.
Следующий байт - тип устройства ввода.
Пока, используется только: 1 - клавиатура и 255 - конец записи.
Остальные 7 байт кодируют, что, собственно изменилось. Для клаваитуры используется только два байта. Первый - номер полуряда клавиатуры (0-7 - основная клава, 8-11 - расширенная). Второй - его состояние (8 бит, на каждую клавишу). Соответсвтенно, отслеживаются все изменения, как нажатие клавиши, так и ее отпускание.

Вот и все. Эмуль, как только счетчик дойдет но нужной метки, изменяет состояние порта клваиатуры. Когда доходит до 255, то либо остановка, либо перезагрузка (как вариант, можно предложить игроку продолжить игру).


Top
   
PostPosted: 20 Dec 2017, 20:49 
Offline

Joined: 18 May 2016, 19:55
Posts: 425
Я по моему думал когда-то о таком (или о подобном), но это всё слишком сложно и заморочливо! Ты представляешь как это всё реализовать то ?!... начиная с того, что надо записывать "скрипт" (назовём его "скрипт"), потом останавливать и сохранять, далее при загрузке твоего формата в какой-то эмуль блокировать клавиатуру, блокировать еще что-то например "крутилку скорости", если она есть (изменение частоты) и т.д. далее счётчики тактов как-то чтобы были согласованы у всех эмулятором (ведь они плюсуют не +1, а +4, +7 и т.д. согласно тактам команды КР580) ну пусть даже и обнуляются с начала... но всё равно.... не нравится мне это всё... и скорее всего хрен это будет реализовано в реале!
И ради чего это всё?! Чтобы демонстрация была ?

Я вот, что хочу предложить, тем более что когда-то делал пробы. Пойти по принципу, создать и утвердить формат "Видео-ПК-01", т.е каждый кадр состоит из 16483 байтов и значение порта "видео" (порт с2 насколько я помню) частота и т.д., каждый следующий кадр ксорится с предыдущим, как правило будет "много нулей" которые легко кодируються в "флаг нулей и колво нулей" (2-4 байта) и так далее. Формат видео будет получатся достаточно экономный, во всяком случае по сравнению с АВИ, МП4 и т.д. и вот этот формат можно дописывать в игрушку как видео демонстрацию. Далее при открытии формата и обнаружении видео, активируется кнопка "демо" или предлагает пользователю "смотреть демо или играть" как-то так. Но для начала надо утвердить форматы "кадр-пк-01" и "видео-пк-01" и т.д. да и вообще будут ли желающие этим заниматься ? т.е реализовавать свои эмули чтобы была такая возможность и единый "видео-пк-01" стандарт, вот в чём вопрос.


Top
   
PostPosted: 20 Dec 2017, 21:16 
Offline

Joined: 18 May 2016, 19:55
Posts: 425
Знаешь, если ты всё таки убеждён в правильности своего решения. То почему бы не реализовывать его проще без всяких там счётчиков тактов и сравнения их...
Когда пишешь "скрипт" (демо):
1.точка отсчёта какая-то чёткая по адресу и состояним портов и регистров
2. сохраняешь начальное значение портов
ПРИ ОБРАЩЕНИИ К КАКОМУ-ТО ПОРТУ, ТОТ ПОРТ (его значение) И СОХРАНЯЕШЬ в "базу измениний портов"!

в режиме "воспроизведения" -
ПРИ ОБРАЩЕНИИ К КАКОМУ-ТО ПОРТУ, ТОТ ПОРТ (его значение) "ПОДСОВЫВАЕШЬ "ТО ЧТО НУЖНО из "базы измениний портов"!

Естественно всё что изменяет порты (клавиатура) должно быть "блокировано"! Они должны быть полностью подконтрольны ТОЛЬКО "скрипту".
Проще выражаясь это всё тупо перехват нужного порта в момент обращения к нему и подсовывание его в момент обращения при воспроизведении! Ну должно как часики работать!Пробовать надо это всё.


Top
   
PostPosted: 20 Dec 2017, 21:24 
Offline

Joined: 18 May 2016, 19:55
Posts: 425
вот еще раз перечитал...
Quote:
Соответсвтенно, отслеживаются все изменения, как нажатие клавиши, так и ее отпускание.
ну это лишнее. Не факт что когда работает программа она "запрашивает" нажатия и отжатия т.е. что в это время в программе будут IN и OUT. А вот когда она "лезет" к "IN" и "OUT" - вот это и нужно перехватывать и подсовывать! Больше ведь ничего кроме "IN" и "OUT" не влияет на ход выполнения программы ?! "Ветки" (переходы) выполнения программ (игрушек) меняет ведь только "IN" и "OUT" от которых зависит всё ? так ведь ?


Top
   
PostPosted: 21 Dec 2017, 13:53 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Quote:
ПРИ ОБРАЩЕНИИ К КАКОМУ-ТО ПОРТУ, ТОТ ПОРТ (его значение) И СОХРАНЯЕШЬ в "базу измениний портов"!
Игры обращаются к порту сотни и тысячи раз в секунду. Это не вариант.
Quote:
ну это лишнее. Не факт что когда работает программа она "запрашивает" нажатия и отжатия т.е. что в это время в программе будут IN и OUT.
Программа запрашивает состяние, а дальше уже определяет что нажато и что делать. Без отжатия кнопка будет "залипшей".


Top
   
PostPosted: 21 Dec 2017, 14:14 
Offline

Joined: 18 May 2016, 19:55
Posts: 425
Quote:
Игры обращаются к порту сотни и тысячи раз в секунду. Это не вариант.
номер порта/ значение/ кол-во обращений к порту до изменения его значения
$C0/ 34/ 4`200`000`000 // занимает 1+1+4 байта!
Ну если мало 4`200`000`000 обращений
далее еще такую же строку пишешь
$C0/ 34/ 4`200`000`000 //
после 4`200`000`000 обращений читает строку с изменённым значением
$C0/ 44/ 2`233`764`432 // и опять "держит" на порте значение 44 аж 2`233`764`432 раз обращения к порту!
Вдумайся внимательно! Просто это всё надо очень хорошенько продумать - как вести базу изменений портов !
а если еще дополнить "лёгкое сжатие" подобное в моём формате SasLVE2 - то всё вообще будет супер!


Top
   
 Post subject: Re:
PostPosted: 04 May 2020, 18:49 
Offline

Joined: 24 Feb 2016, 11:03
Posts: 14
Всем привет!
Я тут пытаюсь состряпать простенькую читалку формата LVT на C#, но так как программист я совсем ещё зелёный (не считая годов проведённых за "Львовым" гыы)), то я не совсем понял, что имелось в виду в приведённой ниже расшифровке. То есть, хедер, тип программы, её название я побайтно считываю и получаю в текстовом формате, - то есть всё ок. А вот что значит токенизированный текст программы я не понял ещё. Сработает ли тут подход побайтного сопоставления байтов из LVT файла и имеющегося текста этой же программы? Или уже имеется простой словарь сопоставления байтов и символов (окромя того, что ниже уже приведено)?

Quote:
формат я выбирал не мудрствуя лукаво - просто взял стандартный с ленты и выкинул пилот-сигналы, а повтор типа файла (D0, D3 и т.д. (кстати, есть ещё SLOAD и LOAD файлы, там эти коды будут другие)) оставил в одном экземпляре, ибо незачем (файл и так надёжен в отличие от ленты).
с дампом получилось хуже, исходный замысел был, чтобы сигнатура составляла 16 байтов, тогда в hex-редакторе легко по зонам памяти "гулять", но промазал, один байт там лишний получился.
Code:
Смещение                Размер          Значение        Описание

BASIC .LVT/.LVR

+0x00   9               "LVOV/2.0/"     Первичная сигнатура .LVT-ленты
+0x09   1               0xD3            Вторичная .LVT сигнатура (Basic)
+0x0A   6               "......"        Имя ленты в КОИ7 (выравнено пробелами)
+0x10   upto EOF        0x??, ...       Текст бейсик-программы во внутреннем формате:
                                        DW:0?, DW, DB(...), DB:0 - признак конца программы,
                                        номер строки, токенизированная строка, конец строки

CODE .LVT

+0x00   9               "LVOV/2.0/"     Первичная сигнатура .LVT-ленты
+0x09   1               0xD0            Вторичная .LVT сигнатура (Binary)
+0x0A   6               "......"        Имя ленты в КОИ7 (выравнено пробелами)
+0x10   2               0x????          Адрес начала размещения программы
+0x12   2               0x????          Адрес конца размещения программы
+0x14   2               0x????          Адрес точки запуска программы
+0x16   upto EOF        0x??, ...       Тело программы


Top
   
 Post subject: Re:
PostPosted: 05 May 2020, 03:27 
Offline
User avatar

Joined: 13 Feb 2012, 15:32
Posts: 341
Location: Россия
Quote:
Всем привет!
Я тут пытаюсь состряпать простенькую читалку формата LVT на C#, но так как программист я совсем ещё зелёный (не считая годов проведённых за "Львовым" гыы)), то я не совсем понял, что имелось в виду в приведённой ниже расшифровке. То есть, хедер, тип программы, её название я побайтно считываю и получаю в текстовом формате, - то есть всё ок. А вот что значит токенизированный текст программы я не понял ещё. Сработает ли тут подход побайтного сопоставления байтов из LVT файла и имеющегося текста этой же программы? Или уже имеется простой словарь сопоставления байтов и символов (окромя того, что ниже уже приведено)?
Добрый день !Вот тут почти полное описание
Quote:
Первые 16 символов - хедер.
Сначала оперделям тип програмы:
Если хедер начинается с "LVOV/DUMP/2.0/" - то это *.sav файл (дамп эмуля Калашникова).
Иначе, хедер должен начинаться с "LVOV/2.0/" (LVT, LV0, ...). Тогда проверяем 9-й символ (начало нумерации с 0). Если он 0xD3, то это бейсик-программа, если 0xD0 - бинарная.
Теперь лоадим прогу:
Для бинарной, все просто: 16, 17 символы - адресс начала памяти для программы; 18, 19 - конец; 20, 21 - точка старта, все остальные байты просто пишутся в память с начального адресса. Потом, соответственно запуск со старта.
Для бейсика схоже, только адресс начала программы берется не из файла, а используются системные переменные для бейсика (их ищем тут). В самом файле идет просто код. Не забываем установить адресс окончания бейсик-программы. После загрузки такого файла надо натайпать run.
Для дампа так:
После хедера 0x1000 символов - память.
Следующие 0x4000 - видео
Следующие 0x100 - порты
Потом регистры в следующем порядке:
b, c, d, e, h, l, a, f, sp (2 байта), pc (2 байта)

Вот, вроде, и все....

UPD. Забыл сказать! LV0, LV1 и т.п. это те же самые *.LVT. Просто некоторые программы разбиты на файлы. Для них первым грузится LVT, а потом, на всякие LOADы догружаются следующие по номеру LV


Top
   
 Post subject: Re: Re:
PostPosted: 05 May 2020, 08:20 
Offline

Joined: 18 May 2016, 19:55
Posts: 425
Quote:
Всем привет!
Я тут пытаюсь состряпать простенькую читалку формата LVT на C#, но так как программист я совсем ещё зелёный (не считая годов проведённых за "Львовым" гыы)), то я не совсем понял, что имелось в виду в приведённой ниже расшифровке. То есть, хедер, тип программы, её название я побайтно считываю и получаю в текстовом формате, - то есть всё ок. А вот что значит токенизированный текст программы я не понял ещё. Сработает ли тут подход побайтного сопоставления байтов из LVT файла и имеющегося текста этой же программы? Или уже имеется простой словарь сопоставления байтов и символов (окромя того, что ниже уже приведено)?
В SASemulator есть такая штука как перехват Bload/Bsave. Читает и записывает в LVT-формат (см. Readme в В SASemulator). В том моменте я поленился делать через буфер (масив), а сделал через длинную строку string;
Ну раз ты спец в СИ то думаю в коде Дельфи разберёшся. :-)
Надеюсь данные вырезки з кода тебе чем-то помогут!
Выглядит это так
Quote:
//( BSAVE )

procedure intPC56625;// перехват при r_PC=56625 - 2.4.8 Передача кодового файла ( BSAVE ).// Точка входа DD31H ( 56625 ). - dd85-ret

var strBsave:string;// строка для храния
FileName:string; // имя файла куда сохранять
var c:Cardinal;
Byte2_:array[1..2] of Byte; Word_:Word absolute Byte2_;
CODFL_ORG:Word;//¦ BEA4/BEA5 ¦ 48804/48805 ¦ CODFL_ORG ¦ начало CODE-файла ¦
CODFL_END:Word; //¦ BEA6/BEA7 ¦ 48806/48807 ¦ CODFL_END ¦ конец CODE-файла ¦
//CODFL_RUN:Word; //¦ BEA9/BEAA ¦ 48809/48810 ¦ CODFL_RUN ¦ старт CODE-файла ¦

begin

strBsave:='LVOV/2.0/'+#$D0;

//¦ BE8C-BE91 ¦ 48780-48785 ¦ SAVE_NAME ¦ имя файла запись/эталон¦
For c:=48780 to 48785 do begin strBsave:=strBsave+chr(RAM[c])end;

//¦ BEA4/BEA5 ¦ 48804/48805 ¦ CODFL_ORG ¦ начало CODE-файла ¦
For c:=48804 to 48805 do begin strBsave:=strBsave+chr(RAM[c])end;
Byte2_[1]:=RAM[48804];Byte2_[2]:=RAM[48805];CODFL_ORG:=Word_;

//¦ BEA6/BEA7 ¦ 48806/48807 ¦ CODFL_END ¦ конец CODE-файла ¦
For c:=48806 to 48807 do begin strBsave:=strBsave+chr(RAM[c])end;
Byte2_[1]:=RAM[48806];Byte2_[2]:=RAM[48807];CODFL_END:=Word_;

//¦ BEA9/BEAA ¦ 48809/48810 ¦ CODFL_RUN ¦ старт CODE-файла ¦
For c:=48809 to 48810 do begin strBsave:=strBsave+chr(RAM[c])end;
//Byte2_[1]:=RAM[48809];Byte2_[2]:=RAM[48810];CODFL_RUN:=Word_;

//запись самого кода
For c:=CODFL_ORG to CODFL_END do begin strBsave:=strBsave+Chr(RAM[((c) mod 65536)]); end;

// имя файла куда сохранять
FileName:='';
For c:=48780 to 48785 do begin FileName:=FileName+chr(RAM[c])end;
FileName:=FileNameToHEX(FileName);
WriteS(FileName,strBsave);// запись динной строки в файл
strBsave:=''; // очистка длинной строки (для успокоения души :-) )

......

end;
Quote:
//( BLOAD )
procedure intPC56724;// перехват 2.5.6 Прием кодового файла ( BLOAD ). Точка входа DD94H ( 56724 ).
var strBload:string;// строка для храния
FileName:string; // имя файла куда сохранять
var c,c1,c2,c3:Cardinal;
Byte2_:array[1..2] of Byte; Word_:Word absolute Byte2_;
CODFL_ORG:Word;//¦ BEA4/BEA5 ¦ 48804/48805 ¦ CODFL_ORG ¦ начало CODE-файла ¦
CODFL_END:Word; //¦ BEA6/BEA7 ¦ 48806/48807 ¦ CODFL_END ¦ конец CODE-файла ¦
CODFL_RUN:Word; //¦ BEA9/BEAA ¦ 48809/48810 ¦ CODFL_RUN ¦ старт CODE-файла ¦
OFFSET:Word; //¦ BEAB/BEAC ¦ 48811/48812 ¦ OFFSET ¦ смещение CODE-файла ¦
fError:Byte;// флаг ошибки чтения или некоректного файла
LengthStrBload:Cardinal;
begin
FileName:='';

//¦ BE8C-BE91 ¦ 48780-48785 ¦ SAVE_NAME ¦ имя файла запись/эталон¦
For c2:=48780 to 48785 do begin c1:=c1+1; FileName:=FileName+chr(RAM[c2]);end;

FileName:=FileNameToHEX(FileName);
strBload:=ReadS(FileName);// чтение файла в длинную строку

fError:=0;// флаг ошибки чтения или некоректного файла 0 - считывание нармально и размер нормальный

// Проверка на ошибки
If strBload='' then fError:=1;// 1-файл отсутствует или пустой
LengthStrBload:=Length(StrBload);
If LengthStrBload <23 then fError:=2;// 2-слишком маленький размер файла (неверный формат файла)
if Pos('LVOV/2.0/'+#$D0,strBload)<>1 then fError:=3;// неверный формат (начало файла не 'LVOV/2.0/'+#$D0)

if fError=0 then begin
c1:=10;
// ¦ BE92-BE97 ¦ 48786-48791 ¦ LOAD_NAME ¦ считанное имя файла ¦
For c2:=48786 to 48791 do begin c1:=c1+1; RAM[c2]:=ord(strBload[c1]) end;

//¦ BEA4/BEA5 ¦ 48804/48805 ¦ CODFL_ORG ¦ начало CODE-файла ¦
c1:=c1+1;RAM[48804]:=ord(strBload[c1]);c1:=c1+1;RAM[48805]:=ord(strBload[c1]);
Byte2_[1]:=RAM[48804];Byte2_[2]:=RAM[48805];CODFL_ORG:=Word_;

//¦ BEA6/BEA7 ¦ 48806/48807 ¦ CODFL_END ¦ конец CODE-файла ¦
c1:=c1+1;RAM[48806]:=ord(strBload[c1]);c1:=c1+1;RAM[48807]:=ord(strBload[c1]);
Byte2_[1]:=RAM[48806];Byte2_[2]:=RAM[48807];CODFL_END:=Word_;

//¦ BEA9/BEAA ¦ 48809/48810 ¦ CODFL_RUN ¦ старт CODE-файла ¦
c1:=c1+1;RAM[48809]:=ord(strBload[c1]);c1:=c1+1;RAM[48810]:=ord(strBload[c1]);
Byte2_[1]:=RAM[48809];Byte2_[2]:=RAM[48810];CODFL_RUN:=Word_;

//OFFSET:Word; //¦ BEAB/BEAC ¦ 48811/48812 ¦ OFFSET ¦ смещение CODE-файла ¦
Byte2_[1]:=RAM[48811];Byte2_[2]:=RAM[48812];OFFSET:=Word_;

// переброска самого кода из strBload в RAM
For c:=CODFL_ORG to CODFL_END do begin c1:=c1+1;
if c1 > LengthStrBload then fError:=4// 4- несоответствиве размера данных
else RAM[((c+OFFSET) mod 65536)]:=ord(strBload[c1]); end;


If fError=0 then begin
.............
end;

strBload:='';FileName:='';
...............
end;


Top
   
PostPosted: 05 May 2020, 10:52 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Quote:
А вот что значит токенизированный текст программы я не понял ещё
Это относится только к Бейсик программам. Для экономии памяти, ПК-01 не запоминает весь текст программы, а "кодирует" ее небольшими токенами. Фактически, они относятся к бейсик операторам один-в-один, и очень легко восстановить текст из этих токенов. Но это только, если вы хотите просто вычитать текст в отдельный файл. Для правильной работы бекйсик-программы в ПК-01 нужно грузить токены в память, как они есть.

ПС С этим связано и занятное ограничение для имен переменных. Вроде, бейсик берет во внимение первые три (или около того символов), далее они могут отличаться, но для бейсика это будут одинаковые переменные. Все опять-же из-за токенов.


Top
   
PostPosted: 05 May 2020, 13:27 
Offline

Joined: 18 May 2016, 19:55
Posts: 425
Quote:
Это относится только к Бейсик программам. Для экономии памяти, ПК-01 не запоминает весь текст программы, а "кодирует" ее небольшими токенами. Фактически, они относятся к бейсик операторам один-в-один, и очень легко восстановить текст из этих токенов. Но это только, если вы хотите просто вычитать текст в отдельный файл. Для правильной работы бекйсик-программы в ПК-01 нужно грузить токены в память, как они есть.
А вот такой момент меня интересовал...
Я считал что после нажатия "вк" отдельная строка типа компилируется, ну ли как-то полу-компилируется, во всяком случае такое могли бы сделать так как "внутри" строки всё равно переходы невозможны (т.е. переход возможен только на самое начало конкретной строки).

Бейсик (ПК-01 Львов) действительно устроен найтупейшим образом где выполнение абсолютно каждой команды определяется во время выполнения программы типа по принципу Case <текущая команда> of и далее "перебор" команд бейсика сравнение с текущей ?
ну типа в МаратЕмуляторе и САСемуляторе реализованы команды процессора ?
или же некоторое команды идущие одна за одной в строке при нажатии "вк" "компилируються"? или же правильнее "сливаються" в единый код ?

З.Ы. Извиняюсь если не понятно написал, но по другому не знаю как. Во всяком случае пока не знаю как выразится.

Могу выразится еще так:
В своем емуляторе, я когда-то хотел реализовать чтобы в некоторых случаях выполнялись не по каждой отельной команде соответвующая процедура, а несколько команд одновременно 2,3,4 комнады как говорится "одним махом" т.е. одной процедурой для этого "набора" идущих команд. И вот почему то думал, что возможно Васик все таки компилирует отдельную строку правда таким образом, что можна "вернуть" её в текст.


Top
   
PostPosted: 05 May 2020, 14:01 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Нет, в бинари Бейсик не компилирует. Поэтому он многократно медленнее асма. Такие интерпретаторы (не компиляторы) почти во всех старый бейсик-компах.
Для экономии памяти он только сокращает длину текста, заменяя длинные слова, короткими, плохочитаемыми, токенами.


Top
   
 Post subject: Re: Re:
PostPosted: 05 May 2020, 16:49 
Offline

Joined: 24 Feb 2016, 11:03
Posts: 14
Ага, только это описание по большей части для бинарников, а меня на данный момент интересуют basic программы.
Ключевая фраза - их ищем тут !!! - ГДЕ ТУТ??? АУ!
В самом файле идет просто код. - Просто код? Вчера я прикинул и понял, что там скорее всего один байт может означать целую команду или оператор, что и есть скорее всего токенизация.
Quote:
Добрый день !Вот тут почти полное описание
Quote:
Первые 16 символов - хедер.
Сначала оперделям тип програмы:
Если хедер начинается с "LVOV/DUMP/2.0/" - то это *.sav файл (дамп эмуля Калашникова).
Иначе, хедер должен начинаться с "LVOV/2.0/" (LVT, LV0, ...). Тогда проверяем 9-й символ (начало нумерации с 0). Если он 0xD3, то это бейсик-программа, если 0xD0 - бинарная.
Теперь лоадим прогу:
Для бинарной, все просто: 16, 17 символы - адресс начала памяти для программы; 18, 19 - конец; 20, 21 - точка старта, все остальные байты просто пишутся в память с начального адресса. Потом, соответственно запуск со старта.
Для бейсика схоже, только адресс начала программы берется не из файла, а используются системные переменные для бейсика (их ищем тут). В самом файле идет просто код.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 78 posts ]  Go to page Previous 1 2 3 4 5 6 Next

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
cron
Powered by phpBB® Forum Software © phpBB Limited