Вверх ↑
Этот топик читают: Гость
Ответов: 3889
Рейтинг: 362
#91: 2012-03-26 09:43:10 ЛС | профиль | цитата
login, Оптимизирующие компиляторы вместо вызовов с передачей параметров часть процедур напрямую вклеивают в код. Основная расплата - растущий размер программы. Именно этот трюк позволяет фанатично расхваляемым кое-кем виртуальным машинам с компиляцией реального времени "обгонять" на некоторых участках предварительно скомпилированный код - они тупо заваливают оперативную память "линейными", как Вы говорите, блоками. Например, вместо цикла могут размножить десять раз подряд один кусок кода, вклеить функции и процедуры прямо в него, избегая вызовов и операций со стеком. Вот большой вопрос, насколько Pure и Free бейсики оптимизируют код, первый, если не ошибаюсь (в живую ни разу не видел), вообще как компилятор использует FASM, то есть заранее составлены блоки на ассемблере под каждый оператор, как элементы в HiAsm, и потом вклеиваются в код с подстановкой переменных параметров. (Опять же, нужно проверить на практике)
------------ Дoбавленo в 09.43:
Сами себе ответили, пока я писал
карма: 1

0
Ответов: 1429
Рейтинг: 50
#92: 2012-03-26 09:43:59 ЛС | профиль | цитата
1nd1g0, заочно пришли к консенсусу

http://ru.wikipedia.org/wiki/Процедурное_программирование
Еще, как я понял, у процедурных языков код может находится только внутри тела процедуры и никак иначе. С обязательным синтаксисом для этого.
В PureBasic можно написать на листе только a=1+1 И это уже исполняется.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#93: 2012-03-26 09:54:08 ЛС | профиль | цитата
login писал(а):
В PureBasic можно написать на листе только a=1+1 И это уже исполняется.

А там часом нельзя посмотреть FASM-листинг результата? Может там всё на функциях в ассемблере
карма: 1

0
Ответов: 1429
Рейтинг: 50
#94: 2012-03-26 11:10:37 ЛС | профиль | цитата
1nd1g0, можно, просто я еще не посмотрел. Там нужно указать опцию, сохранять FASM код. Пока ищу ее.
------------ Дoбавленo в 10.11:
Нашел
Вот код для a=1+1 на чистом листе :


; 
; PureBasic 4.51 (Windows - x86) generated code
;
; (c) 2010 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; Window
; Event
; Gadget
; Date
; 2DDrawing
; Image
; AlphaImage
; ImagePlugin
; Object
; SimpleList
; :System
; KERNEL32
; :Import
;
format MS COFF
;
extrn _ExitProcess@4
extrn _GetModuleHandleA@4
extrn _HeapCreate@12
extrn _HeapDestroy@4
;
extrn _PB_EndAlphaImage@0
extrn _PB_Event_Init@0
extrn _PB_FreeGadgets@0
extrn _PB_FreeImages@0
extrn _PB_FreeWindows@0
extrn _PB_Init2DDrawing@0
extrn _PB_InitAlphaImage@0
extrn _PB_InitGadget@0
extrn _PB_InitImage@0
extrn _PB_InitImageDecoder@0
extrn _PB_InitWindow@0
extrn _PB_OpenWindow2@28
extrn _PB_WaitWindowEvent@0
extrn _memset
extrn _PB_StringBase
extrn PB_StringBase
extrn _SYS_InitString@0
;
extrn _PB_StringBasePosition
public _PB_Instance
public _PB_ExecutableType
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public _PB_EndFunctions

macro pb_public symbol
{
public _#symbol
public symbol
_#symbol:
symbol:
}

macro pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection + value-1) mod value }
extrn SYS_CpuID
public PureBasicStart
;
section '.code' code readable executable align 8
;
;
PureBasicStart:
;
PUSH dword I_BSSEnd-I_BSSStart
PUSH dword 0
PUSH dword I_BSSStart
CALL _memset
ADD esp,12
PUSH dword 0
CALL _GetModuleHandleA@4
MOV [_PB_Instance],eax
PUSH dword 0
PUSH dword 4096
PUSH dword 0
CALL _HeapCreate@12
MOV [PB_MemoryBase],eax
CALL SYS_CpuID
;
CALL _SYS_InitString@0
CALL _PB_InitImageDecoder@0
CALL _PB_InitAlphaImage@0
CALL _PB_InitImage@0
CALL _PB_Init2DDrawing@0
CALL _PB_InitGadget@0
CALL _PB_Event_Init@0
CALL _PB_InitWindow@0
;
; OpenWindow(0,0,0,332,219,"Form",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
MOV dword [CLN],1
PUSH dword 13303809
PUSH dword _S1
PUSH dword 219
PUSH dword 332
PUSH dword 0
PUSH dword 0
PUSH dword 0
CALL _PB_OpenWindow2@28
;
;
; Repeat
_Repeat1:
MOV dword [CLN],4
; a1.i
MOV dword [CLN],5
; a=1+1
MOV dword [CLN],6
MOV dword [v_a],2
;
; Until WaitWindowEvent() = #PB_Event_CloseWindow : End
MOV dword [CLN],8
CALL _PB_WaitWindowEvent@0
MOV ebx,eax
CMP ebx,16
JNE _Repeat1
_Until1:
MOV dword [CLN],8
JMP _PB_EOP_NoValue
;
;
;
_PB_EOP_NoValue:
PUSH dword 0
_PB_EOP:
CALL _PB_EndFunctions
PUSH dword [PB_MemoryBase]
CALL _HeapDestroy@4
CALL _ExitProcess@4
_PB_EndFunctions:
CALL _PB_FreeWindows@0
CALL _PB_FreeGadgets@0
CALL _PB_FreeImages@0
CALL _PB_EndAlphaImage@0
RET
;
;
section '.data' data readable writeable
;
_PB_DataSection:
CLN:
pb_public PB_DEBUGGER_LineNumber
dd 0
pb_public PB_DEBUGGER_FileName
db "C:\Program Files\HiAsm\Elements\PureBasic\code\Pure.pb",0
pb_public PB_DEBUGGER_NbIncludedFiles
dd 0
pb_public PB_DEBUGGER_IncludedFiles
_PB_ExecutableType: dd 0
;
; Dynamic functions jump table
;
public _SYS_StaticStringStart
_SYS_StaticStringStart:
_S1: db "Form",0
pb_public PB_NullString
db 0
public _SYS_StaticStringEnd
_SYS_StaticStringEnd:
align 4
align 4
s_s:
dd 0
dd -1
align 4
;
section '.bss' readable writeable
_PB_BSSSection:
align 4
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rd 1
_PB_Instance:
PB_Instance: rd 1
;
align 4
PB_DataPointer rd 1
v_a1 rd 1
v_a rd 1
align 4
align 4
align 4
align 4
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:



ТОлько я не понимаю его
(нет это с 1 формой, на чистом листе пока не получается сделать, это надо в родной среде прописать ключ, а я не знаю где там его прописать)

да, тут не на что смотреть, это с дебагером, инлайном, формой и всяким бредом. Приложение без формы занимает 3 кб.
Надо будет как-то разобраться как его посмотреть.

Сделал:
Вот код:

#hws
x=1+1
x=2+2
x=3+3
x=4+4

Размер exe 2кб.


; 
; PureBasic 4.40 (Windows - x86) generated code
;
; (c) 2009 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; :System
; KERNEL32
; :Import
;
format MS COFF
;
extrn _ExitProcess@4
extrn _GetModuleHandleA@4
extrn _HeapCreate@12
extrn _HeapDestroy@4
;
extrn _memset
public _PB_Instance
public _PB_ExecutableType
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public _PB_EndFunctions

macro pb_public symbol
{
public _#symbol
public symbol
_#symbol:
symbol:
}

macro pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection + value-1) mod value }
public PureBasicStart
;
section '.code' code readable executable align 8
;
;
PureBasicStart:
;
PUSH dword I_BSSEnd-I_BSSStart
PUSH dword 0
PUSH dword I_BSSStart
CALL _memset
ADD esp,12
PUSH dword 0
CALL _GetModuleHandleA@4
MOV [_PB_Instance],eax
PUSH dword 0
PUSH dword 4096
PUSH dword 0
CALL _HeapCreate@12
MOV [PB_MemoryBase],eax
;
; x=1+1
MOV dword [v_x],2
; x=2+2
MOV dword [v_x],4
; x=3+3
MOV dword [v_x],6
; x=4+4
MOV dword [v_x],8
_PB_EOP_NoValue:
PUSH dword 0
_PB_EOP:
CALL _PB_EndFunctions
PUSH dword [PB_MemoryBase]
CALL _HeapDestroy@4
CALL _ExitProcess@4
_PB_EndFunctions:
RET
;
;
section '.data' data readable writeable
;
_PB_DataSection:
pb_public PB_DEBUGGER_LineNumber
dd -1
pb_public PB_DEBUGGER_IncludedFiles
dd 0
pb_public PB_DEBUGGER_FileName
db 0
_PB_ExecutableType: dd 0
align 4
align 4
s_s:
dd 0
dd -1
align 4
;
section '.bss' readable writeable
_PB_BSSSection:
align 4
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rd 1
_PB_Instance:
PB_Instance: rd 1
;
align 4
PB_DataPointer rd 1
v_x rd 1
align 4
align 4
align 4
align 4
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:

------------ Дoбавленo в 11.10:
А вот код теста скорости темы топика, тот самый, который за 1 мс выполняется.


; 
; PureBasic 4.40 (Windows - x86) generated code
;
; (c) 2009 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; Gadget
; Window
; 2DDrawing
; Image
; ImagePlugin
; Object
; SimpleList
; Date
; AlphaImage
; :System
; KERNEL32
; :Import
;
format MS COFF
;
extrn _ExitProcess@4
extrn _GetModuleHandleA@4
extrn _HeapCreate@12
extrn _HeapDestroy@4
extrn _QueryPerformanceCounter@4
;
extrn _PB_ButtonGadget@24
extrn _PB_EndAlphaImage@0
extrn _PB_EventGadget@0
extrn _PB_FreeGadgets@0
extrn _PB_FreeImages@0
extrn _PB_FreeWindows@0
extrn _PB_Init2DDrawing@0
extrn _PB_InitAlphaImage@0
extrn _PB_InitGadget@0
extrn _PB_InitImage@0
extrn _PB_InitImageDecoder@0
extrn _PB_InitWindow@0
extrn _PB_OpenWindow@24
extrn _PB_WaitWindowEvent@0
extrn _memset
extrn _PB_StringBase
extrn PB_StringBase
extrn _SYS_InitString@0
;
extrn _PB_StringBasePosition
public _PB_Instance
public _PB_ExecutableType
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public _PB_EndFunctions

macro pb_public symbol
{
public _#symbol
public symbol
_#symbol:
symbol:
}

macro pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection + value-1) mod value }
public PureBasicStart
;
section '.code' code readable executable align 8
;
;
PureBasicStart:
;
PUSH dword I_BSSEnd-I_BSSStart
PUSH dword 0
PUSH dword I_BSSStart
CALL _memset
ADD esp,12
PUSH dword 0
CALL _GetModuleHandleA@4
MOV [_PB_Instance],eax
PUSH dword 0
PUSH dword 4096
PUSH dword 0
CALL _HeapCreate@12
MOV [PB_MemoryBase],eax
CALL _SYS_InitString@0
CALL _PB_InitAlphaImage@0
CALL _PB_InitImageDecoder@0
CALL _PB_InitImage@0
CALL _PB_Init2DDrawing@0
CALL _PB_InitWindow@0
CALL _PB_InitGadget@0
;
; QueryCount1.q
; QueryCount2.q
; HPB_For4i_pos.i
; HPB_For5i_pos.i
;
; OpenWindow(1, 0, 0, 390, 261, "pbtest")
PUSH dword _S1
PUSH dword 261
PUSH dword 390
PUSH dword 0
PUSH dword 0
PUSH dword 1
CALL _PB_OpenWindow@24
; ButtonGadget(2, 175, 110, 55, 20, "Push")
PUSH dword _S2
PUSH dword 20
PUSH dword 55
PUSH dword 110
PUSH dword 175
PUSH dword 2
CALL _PB_ButtonGadget@24
;
; Repeat
_Repeat1:
; EventID.l = WaitWindowEvent()
CALL _PB_WaitWindowEvent@0
MOV dword [v_EventID],eax
;
; If EventGadget() = 2
CALL _PB_EventGadget@0
MOV ebx,eax
CMP ebx,2
JNE _EndIf3
; QueryPerformanceCounter_(@QueryCount1)
PUSH dword v_QueryCount1
CALL _QueryPerformanceCounter@4
; For HPB_For4i_pos = 1 To 100000
MOV dword [v_HPB_For4i_pos],1
_For4:
MOV eax,100000
CMP eax,dword [v_HPB_For4i_pos]
JL _Next5
; For HPB_For5i_pos = 1 To 18
MOV dword [v_HPB_For5i_pos],1
_For6:
MOV eax,18
CMP eax,dword [v_HPB_For5i_pos]
JL _Next7
; If HPB_For5i_pos >= 11 And HPB_For5i_pos <= 16
MOV ebx,dword [v_HPB_For5i_pos]
CMP ebx,11
JL No0
MOV ebx,dword [v_HPB_For5i_pos]
CMP ebx,16
JG No0
Ok0:
MOV eax,1
JMP End0
No0:
XOR eax,eax
End0:
AND eax,eax
JE _EndIf9
; EmuleMem.b = 0
MOV byte [v_EmuleMem],0
; EndIf
_EndIf9:
; If HPB_For5i_pos = 17
MOV ebx,dword [v_HPB_For5i_pos]
CMP ebx,17
JNE _EndIf11
; EmuleMem.b = 1
MOV byte [v_EmuleMem],1
; EndIf
_EndIf11:
; Next
_NextContinue7:
INC dword [v_HPB_For5i_pos]
JNO _For6
_Next7:
; Next
_NextContinue5:
INC dword [v_HPB_For4i_pos]
JNO _For4
_Next5:
; QueryPerformanceCounter_(@QueryCount2)
PUSH dword v_QueryCount2
CALL _QueryPerformanceCounter@4
; Debug "Hardware Timer: "+Str((QueryCount2 - QueryCount1) / 1000000)
; EndIf
_EndIf3:
;
; If EventID = #PB_Event_CloseWindow : End : EndIf
MOV ebx,dword [v_EventID]
CMP ebx,16
JNE _EndIf13
JMP _PB_EOP_NoValue
_EndIf13:
; ForEver
JMP _Repeat1
_Until1:
;
;
_PB_EOP_NoValue:
PUSH dword 0
_PB_EOP:
CALL _PB_EndFunctions
PUSH dword [PB_MemoryBase]
CALL _HeapDestroy@4
CALL _ExitProcess@4
_PB_EndFunctions:
CALL _PB_FreeGadgets@0
CALL _PB_FreeWindows@0
CALL _PB_FreeImages@0
CALL _PB_EndAlphaImage@0
RET
;
;
section '.data' data readable writeable
;
_PB_DataSection:
pb_public PB_DEBUGGER_LineNumber
dd -1
pb_public PB_DEBUGGER_IncludedFiles
dd 0
pb_public PB_DEBUGGER_FileName
db 0
_PB_ExecutableType: dd 0
public _SYS_StaticStringStart
_SYS_StaticStringStart:
_S2: db "Push",0
_S1: db "pbtest",0
pb_public PB_NullString
db 0
public _SYS_StaticStringEnd
_SYS_StaticStringEnd:
align 4
align 4
s_s:
dd 0
dd -1
align 4
;
section '.bss' readable writeable
_PB_BSSSection:
align 4
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rd 1
_PB_Instance:
PB_Instance: rd 1
;
align 4
v_QueryCount1 rq 1
v_QueryCount2 rq 1
PB_DataPointer rd 1
v_HPB_For4i_pos rd 1
v_HPB_For5i_pos rd 1
v_EventID rd 1
v_EmuleMem rb 1
align 4
align 4
align 4
align 4
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:



карма: 0

0
Ответов: 3889
Рейтинг: 362
#95: 2012-03-26 11:52:54 ЛС | профиль | цитата
login, Так не интересно, он делает предрасчёт констант. Попробуйте нечто вроде

X=X+1
X=X+256
X=X+65536
X=X-123456789
X=X*X
Z=X-X
Y=X+Z
карма: 1

0
Ответов: 1429
Рейтинг: 50
#96: 2012-03-26 13:09:07 ЛС | профиль | цитата
1nd1g0,

code_27371.txt

Интересно глянуть тот-же код в Delphi и FPC.



------------ Дoбавленo в 13.09:
Язы конечно заманчивый, я бы уже сейчас сел в нем работать, но как всегда есть подводный камень - OpenGL

В рекламе написано, что он напрямую поддерживается, во всех 3х платформах. Но это полу-ложь, на самом деле у OpenGL есть только около трети функций. Нет GLOrtho2D, и нет тех функций из которых MAV собрал 2D текст. (то есть опять назад, в лес с голой ж..пой, к моему дурацкому методу рисования букв на текстурах 32x32 + артефакты и т. п.)

Для 2D они предлагают библиотеку Engine3D.dll которая работает через игровой движок OGRE.
Но и тут есть подводный камень, пользоваться подобным - не советую. Я протестил примитивы которые идут напрямую в OpenGL и через Engine3D, так вот, в OpenGL реакция - мгновенная! С Engine3D есть ощутимая, постоянная, задержка реакции от мышки. И не важно, даже если на поле всего один примитив, мышка работает с задержкой.

Еще, для 2D они предлагают DirectX, но я не знаю насколько он быстр, и что будет на других платформах, надо проверять, потому, что он вообще-то только под винду.
карма: 0

0
файлы: 1code_27371.txt [2.3KB] [257]
Ответов: 3889
Рейтинг: 362
#97: 2012-03-26 14:16:17 ЛС | профиль | цитата
login, судя по коду, компилятор-то туповат, то есть насчёт блочной сборки из кусочков я, похоже, угадал. Если x+1 он догадался инкрементом заменить, то вот постоянная работа с памятью вместо того, чтобы работать с одним единственным (!) регистром процессора - мозга уже не хватило на очевидную и простейшую оптимизацию. Даже паскалевский неназываемый компилятор, если в нём писать необъектный "линейный" код, даёт на порядок лучшую (оптимизацию), умеет кэшировать данные в регистрах и оптимально оперировать ими. А уж что умеют вытворять компиляторы от Intel ...
карма: 1

0
Ответов: 1429
Рейтинг: 50
#98: 2012-03-26 14:31:47 ЛС | профиль | цитата
1nd1g0, вроде логично рассуждаете.

Надо б сравнить этот код и код из топика:
code_27372.txt с "неназываемым" компилятором, и поглядеть глазами, почему он выполянется медленнее.

Я так-же видел в инете много критики паскаля, с примерами кусочков асма где он чудит, добавляя по 8 шагов там где можно делать 3 и т. д.

Ну или я могу сделать миллиард операций вашего приемра там и там И поглядеть.
карма: 0

0
файлы: 1code_27372.txt [244B] [196]
Разработчик
Ответов: 26158
Рейтинг: 2127
#99: 2012-03-26 14:37:37 ЛС | профиль | цитата
login, не забывай, что в "неназываемом" компиляторе ты весь код можешь сам на ассемблере написать, пример тому KOL
карма: 22

0
Ответов: 1429
Рейтинг: 50
#100: 2012-03-26 15:26:27 ЛС | профиль | цитата
nesco, но в PureBasic - тоже (асм-втавки)
------------ Дoбавленo в 14.50:
Итак, я сравнил: 10 000 000 последовательностей 1nd1g0, = 11 миллисек в PB и Delphi поровну
И 44 - FPC (хорошо, уже что он вообще смог скомпилить)

Это значит, что "Неназываемый" тоже не оптимизирует, а работает с памятью
Завтра, в линуксе, в FPC Lazarus попробую эту последовательность.


------------ Дoбавленo в 15.26:
Нашел причину задержки мыши у Engine3D.dll, она работает через DirectX, который был настроен на большую степень сглаживания в дровах карты. Так что зря я на нее наехал, нормальная библиотека. С виндой проблема решена. Теперь только надо протестить в Linux.
карма: 0

0
Ответов: 1731
Рейтинг: 68
#101: 2012-03-26 15:33:47 ЛС | профиль | цитата
[offtop]Хе-Хе
Уже блин слюнки потекли.
Я блин на кодах помешан [/offtop]
карма: 1

0
Ответов: 1841
Рейтинг: 369
#102: 2012-03-26 17:42:13 ЛС | профиль | цитата
login писал(а):
CriDos, в вашем старом пакете PB сразу нашел странную ошибку, в элементе "main" главное событие event(onStart)

Я тогда только начал изучать FTCG и сам PB, с блоками у меня вообще была проблема, я с трудом понимал как они работают и что они могут наследоваться...
А прекомпилятор я создавал на время изучения, он во всех строках заменял:

 -> Chr(13),  -> Chr(10), " -> Chr(34)
. Т.е. из строки:
Str("Test
 пример
"""x)
мы получим:
Chr(34) + "Test" + Chr(13) + " пример" + Chr(13) + Chr(10) + Chr(34) + Chr(34) + Chr(34) + "x"
Сейчас это всё можно реализовать в RTCG hiSys.hws как пользовательскую функцию, что очень удобно.
Но на FTCG это мне в то время вынесло мозг
login писал(а):
Точное определение времени выглядит так:

Учти, если ты планируешь кросс-компиляцию, забудь про API - только внутренние функции (ElapsedMilliseconds()), или делай в элементе переключалку между пуриковской либой и API
карма: 1
0
Ответов: 1429
Рейтинг: 50
#103: 2012-03-27 09:23:03 ЛС | профиль | цитата
CriDos, спасибо, учту. Просто прочитал, что ElapsedMilliseconds() менее точный.

Мда, я конечно, был в шоке когда, почитал, что такое 3Д движек, OGRE и другие. Там выполняется куча ненужного следящего кода, (три следящих класса), и только потом, отправляется дирек-иксу или в OpenGL. Прийдется, наверное, пробовать текст на текстурах 32x32 выводить тем скудным набором OpenGL, что там есть..

CriDos писал(а):
Сейчас это всё можно реализовать в RTCG hiSys.hws
- ага, но только без мультиков
а как же матпарсер и строковые элементы в FTCG работают? Всё собирают. Находится позиция вхождения и заменяется.
[offtop](правда я и сам грешу, такого накручиваю с FTCG, что мама не горюй)[/offtop]
[offtop](да и бейсику не нужны никакие блоки, он и так работает )[/offtop]
------------ Дoбавленo в 09.23:
Тест в Lazarus на Линуксе не сделал, по многим причинам, но в сумме их можно выразить одной простой фразой Linux(любой, я поставил 5 разных дистрибутивов) - Это чушь.. На ближайшие 10 лет я могу, спокойно, о нем забыть, им никто не будет пользоваться. Поскольку его интерфойс делали идиоты.

По поводу IDE Lazarus хотелось бы тоже высказать много мата, но я сдержусь, для меня тоже больше не существует такого компилятора. Люди сделавшие такое IDE понятия не имеют ни о чем, и находятся на уровне развития обезьян.

Даже если моя прога будет востребована, то люди пользующиеся Linux мне не нужны. Мне интересны только такие как я. С такой-же адекватностью и логикой мышления.


карма: 0

0
Ответов: 8926
Рейтинг: 823
#104: 2012-03-27 09:31:02 ЛС | профиль | цитата
login,
карма: 19

0
Ответов: 3889
Рейтинг: 362
#105: 2012-03-27 09:40:53 ЛС | профиль | цитата
[offtop]login, хорошо Автор форум редко читает [/offtop]
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)