On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение



Пост N: 1
Зарегистрирован: 18.12.06
ссылка на сообщение  Отправлено: 18.12.06 17:19. Заголовок: Чем работать с модемом? Нид хелп!


Самое элементарное: как снять трубу, набрать номер, и т.д. Какая есть подходящая библиотека для работы с КОМ-портами, Заработает ли с Вин-модемом? Специалисты, отзовитесь!

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 5 [только новые]


администратор




Пост N: 543
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.12.06 14:37. Заголовок: Re:


C:\CLIPPER\CT3B\CTSOURCE\

Копай Clipper Tools

 цитата:

Введение

------------------------------------------------------------------------------

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

Функции, описываемые в этой главе, предназначены для обеспечения
передачи данных и воздействия на разряды управляющих регистров
последовательных портов. Они не поддерживают конкретные протоколы или
специфические системы. Однако для некоторых применений, подобных
протоколу XMODEM, можно многое почерпнуть в примерах программ,
входящих в комплект поставки Clipper Tools II/5.0 (CT II).

Параметры порта

Такие параметры порта, как скорость передачи, четность, длина символа
и количество стоповых битов, могут корректироваться, причем, без
закрытия порта. Таким образом, скорость передачи можно изменять без
потери содержимого буфера или прерывания установленного соединения
(DTR-сигнал).

Передача данных

Функции CT II позволяют одновременно использовать до четырех
последовательных портов, для которых могут быть выделены буферы приема
и передачи размером до 64 Кбайтов каждый. В режиме фоновой передачи
символы помещаются программой в буфер передачи, а принимаемые через
порт символы с помощью обработчика прерываний записываются в буфер
приема. Из Clipper-программы можно определять количество поступивших
в буфер приема символов, а также управлять количеством символов,
считываемых из него. Буфер передачи может осуществлять управление
программой с помощью функций специального управления. Кроме того, в
фоновом режиме возможна реализация как программной, так и аппаратной
приостановки передачи.

Приостановка передачи

CT II-функции поддерживают как аппаратную, так и программную
приостановку передачи. При угрозе переполнения буфера приема
передающей стороне посылается сигнал о том, что дальнейшая передача
данных должна быть приостановлена. Выбор метода приостановки зависит
от используемого режима передачи данных.

Аппаратная приостановка передачи обычно использует сигналы RTS
(Request To Send - запрос на передачу или, иначе, запрос приемника
внешнего устройства на передачу ему данных) и CTS (Clear To Send -
готовность к передаче или, иначе, готовность к приему данных внешним
устройством). Поэтому эти сигналы не могут одновременно использоваться
CT II-функциями при работе с модемом. Обычно модемы не могут
обеспечивать передачу этих сигналов управления непосредственно по
установленному телефонному соединению. В таких случаях должна
применяться программная приостановка передачи.

Программный вариант приостановки передачи для управления потоком
данных использует символы из ASCII-кода. Существует стандарт,
определяющий код символа XOFF (приостановка передачи данных) как
CHR(19) и код символа XON (сброс приостановки) как CHR(17). Эти
символы можно ввести с клавиатуры: CHR(19) соответствует комбинации
клавиш <Ctrl><S>, а CHR(17) - комбинации <Ctrl><Q>.

Для управления потоком данных путем приостановки передачи обе стороны
должны программно проверять заполнение буфера приема, чтобы либо
деактивизировать CTS-сигнал, либо послать XOFF-символ. В свою
очередь, на передающем конце должна постоянно осуществляться проверка
деактивизации CTS-сигнала от удаленной (принимающей) станции или
получения XOFF-символа. В любом из этих случаев передача должна быть
немедленно приостановлена.

Поскольку обычно нет уверенности, что передающая станция при получении
XOFF-символа приостановит передачу немедленно, то сигнал неготовности
к приему выдается при заполнении буфера на 75%. Если передающая
станция игнорирует это предупреждение, то устанавливаемого по
умолчанию размера буфера в 100 байтов (резерв в 25 байтов) может быть
недостаточно.

Описанные методы приостановки передачи полностью управляются
средствами CT II и не касаются интерфейсных адаптеров или
Универсальных Асинхронных Приемопередатчиков (УАПП - Universal
Asinchronous Reseiver Transmitters - UARTs). Достаточно
активизировать желаемый метод, чтобы позволить прикладной программе
регулировать состояние буферов приема и передачи.

Протоколы

Как упоминалось выше, удаленная передача данных (с использованием
модема), обычно осуществляется с реализацией программной приостановки.
Существенным недостатком этого метода является то, что символы
управления потоком, CHR(19) и CHR(17), не должны встречаться в
исходных данных. Поскольку это делает невозможным передачу двоичных
файлов, то для последних, должны использоваться специальные протоколы
передачи. В поставляемые с CT II примеры программ включены
XMODEM-процедуры, написанные на Clipper. Используя CT II-функции
последовательного интерфейса и эти примеры в качестве основы, можно
легко создать и другие протоколы.

Поскольку реализация на Clipper стандартизованных протоколов не
предоставляет реальных преимуществ, то они не включены в CT II.

Управляющие сигналы

Все важные управляющие сигналы последовательного порта, такие как CD
(Carrier Detect - определение несущей), DTR (Data Terminal Ready -
готовность терминала или, иначе, готовность передатчика внешнего
устройства к передаче данных) и т.д., можно установить и опросить.

С целью упрощения программирования для этих сигналов CT II
обеспечивает отдельные функции, а для управляющих и контрольных
сигналов, используемых реже, предоставляется возможность
непосредственной записи в соответствующие регистры УАПП и считывания
из них.

Прямой доступ к аппаратным средствам

Все CT II-функции последовательного интерфейса адресуются
непосредственно к аппаратным средствам. Работа через вызовы BIOS или
DOS не практикуется. Поэтому для нормального функционирования
необходимо полное соответствие технических средств стандартам для
IBM PC.

Для правильного функционирования последовательных портов необходимо
использование в них УАПП типа 8250 или совместимого с ним типа 16450.
При использовании УАПП 8250, передача, управляемая прерываниями,
возможна со скоростью до 2400 бод. Технические детали, относящиеся к
портам и регистрам УАПП, можно найти в соответствующих инструкциях,
таких как техническое руководство IBM.

Адреса ввода/вывода и запросы прерываний

Исходно в CT II установлены следующие значения для четырех
обслуживаемых портов:

Установочные значения для последовательных портов
--------------------------------------------------------------------
Порт Адрес ввода/вывода IRQ (линия запроса прерывания)
--------------------------------------------------------------------
COM1: 3F8H 4 (в соответствии с соглашениями)
COM2: 2F8H 3 (в соответствии с соглашениями)
COM3: 3E8H 4 (нет принятых соглашений)
COM4: 2E8H 3 (нет принятых соглашений)
--------------------------------------------------------------------

В отличие от COM1 и СОМ2 адреса ввода/вывода и линии запроса
прерываний для других портов часто не совпадают с приведенными выше.
При использовании неполностью совместимых аппаратных средств
необходимо применять дополнительные функции COM_SETIO() и
COM_SETIRQ(), позволяющие установить желаемые значения адресов
ввода/вывода и линий запроса прерываний для программ обслуживания
портов. Однако неправильные установки, если они входят в конфликт с
установками для других аппаратных средств, могут привести к потере
данных или повреждению аппаратуры.

Правильные установочные значения для аппаратных средств можно найти в
их документации.

Возможные конфликты установок аппаратных средств

CT II-функция COM_NUM() по четырем упомянутым выше адресам распознает
наличие установленных портов от СОМ1 до СОМ4. Если, например,
компьютер имеет встроенный ArcNet-адаптер, то это может привести к
конфликту адресов ввода/вывода. Обращение внутренней функции CT II по
адресу 02EAh как к последовательному порту, который по управлению
отличается от ArcNet-адаптера, может нарушить существующие сетевые
связи. В таких случаях может помочь вызов функции COM_SETIO() с
заданием 0 в качестве адреса ввода/вывода:

COM_SETIO(<nComPort>,0)

После выполнения этого вызова во внутренней таблице будут уничтожены
соответствующие стандартные адреса и конфликтующие аппаратные средства
будут защищены от доступа со стороны CT II-функций. Однако это
возможно лишь при условии, что функция COM_NUM() еще не вызывалась,
поскольку иначе порт будет уже помечен как используемый ("in use").

Дополнительные замечания

Как видно из приведенной выше таблицы установочных значений, CT II
поддерживает совместно используемые прерывания, т.е. использование
одной и той же линии запроса прерывания для нескольких портов. Однако
стандартные аппаратные средства последовательного интерфейса обычно не
поддерживают совместно используемые прерывания. Для этой цели
производителями аппаратуры выпускаются специальные многопортовые
адаптеры.

Внимание! Работа с совместно используемыми прерываниями не
гарантируется. CT II поддерживает до 4 портов, каждый из которых
имеет свои буфера приема и передачи объемом до 64 Кбайтов и может
передавать информацию со скоростью до 19200 бод. Однако это не
означает, что все ресурсы могут использоваться одновременно на верхнем
пределе возможностей. Выделение 8 буферов по 64 Кбайта невозможно, так
как они обслуживаются по прерываниям и поэтому должны располагаться в
основной (реальной) памяти. Кроме того, количество портов и
максимально реализуемая ими скорость зависят от типа используемого
компьютера.

Отличия от других систем программирования

CT II-функции COM_OPEN() и COM_INIT() не влияют на управляющие сигналы
в отличие от аналогичных функций других языков, например BASIC. Для
управления модемом через последовательный порт с использованием
Clipper необходимо устанавливать DTR и другие сигналы, применяя
соответствующие CT II-функции.




Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 461
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.12.06 15:01. Заголовок: Re:


На оазисе есть какая-то либа zmodem

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 388
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 20.12.06 15:41. Заголовок: Re:


dr_yanson пишет:

 цитата:
Какая есть подходящая библиотека для работы с КОМ-портами


Поищи библиотеку IOLib.lib version 1.2r1

Functions For IOLib
Values for INIT_PORT can be seen in IOLib.ch
Version 1.2r1
*******************************************************************************

INIT_PORT(Nx_port,Nbaud,Ndata,Nparity,Nstop,Nirq,@cIn_buffer) => log
Initializes the communication port and sets up the input bufferd stream
Pass:
Nx_port= base port value see IOLib.ch
Nbaud= The baud rate divisor see IOLib.ch for standard bauds
Ndata=data bits 5 to 8
Nparity= Parity value see IOLib.ch
Nstop=number of stop bits
Nirq=Interrupt number
cIn_buffer= a public String variable 512 bytes or larger, no more
than 32k, ie <Public cIn_buffer:=SPACE(4000) > This option may change
in the future to a numeric value for buffer size.
******************************************************************

OUTC(nVar,[nPort])
Sends a value out the communication port, default port is
the one used by INIT_PORT(), optional any port.
This function will wait a short time for the port to become
available.

nVar= a numeric value 0 to 255
nPort=hardware Port number to send the value
NOTE: nPort not available in BETA version.

******************************************************************

OUTCHR(@cString) =log
Spools a string out the Initialized port cString must not be larger
than 32k, and no smaller than 1 byte, it may contain imbeded null
bytes. The cString must remain public and can not be cleared until
the buffer is clear see OUTBUFSIZE()

Returns False if another stream is still spooling.

*******************************************************************

INCHR(nVar) => cVar
Returns one or more bytes communication port input buffer.
Maximum is INITSIZE-1
Note: Returns NIL if no byte available do not mistake with chr(0)

Example:
cVar:=INCHR(1)
do case
case cVAR=NIL
* do nothing
case cVar=chr(0)
* received break
otherwise
?? cVar
endcase

***************************************************************

UNINT_PORT()
returns NIL
Uninitializes the communication port, this MUST be done before
exiting program. Best use the following function.

EXIT PROCEDURE cleanup()
CLS
UNINT_PORT()
? "Port Uninitialized, program terminating............."
RETURN

*********************************************************

ISWORKING() =>Log
Returns TRUE if IRQ is working, the byte is set by the input/ouput
spooler.
********************************************************

ISONLINE() => log
Returns True if modem online
*********************************************************

IOLIB_VER() =>cString
Returns character string of IO version
**********************************************************

SETDTR([lVar]) =>log
returns .t. if DTR has been set, otherwise false optional lVar
will set the DTR .
EXAMPLE:
LOCAL l_DTR
l_DTR:=SETDTR(.T.)
*************************************************************************

SETRTS([lvar]) => log
returns .t. if RTS has been set, otherwise false optional lVar
will set the RTS .
EXAMPLE:
LOCAL l_RTS
l_DTR:=SETRTS(.T.)
**************************************************************************

DSR() => log Returns .T. if DSR set better than Xon/Xoff
**************************************************************************

CTS() => log Returns .T. if CTS set better than Xon/Xoff
**************************************************************************
Note: You may use DTR/DSR as a Hardware version of Xon/Xoff
or you may use RTS/CTS. Or none.


If changing the IRQ, you must use UNINT_PORT() before
using INIT_PORT()
**************************************************************************
INBUFSIZE() => Num
Returns a numeric value of how many characters remain in the inbuffer.
Input buffer can hold up to one less than the init size.

**************************************************************************
OUTBUFSIZE() => Num
Returns a numeric value of how many characters remain in the ouput stream.

**************************************************************************
INBUFCLR()
clears the input buffer, all waiting characters are lost.

**************************************************************************
OUTBUFCLR()
clears the output buffer, all waiting characters are lost.

**************************************************************************
CHKCRC(cString)=> cCrc

Returns a 3 byte string pertaining to passed string.
First byte is the checksum
Second and third are a 16 bit CRC


Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 389
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 20.12.06 15:43. Заголовок: Пример использования IOLib


/*
MODEM.PRG is a sample use of the IOLib.LIB

Standard ports list and their IRQs
Com port HEX DECIMAL IRQ
COM1: 3F8h 1016 4
COM2: 2F8h 760 3
COM3: 3E8h 1000 4 or 7
COM4: 2E8h 744 3 or 5 or 7
COM 3 and 4 may use another IRQ. Any IRQ from 2 to 7 may be used.
IRQ 8 to 15 is also available but requiers an AT286 or higher
IRQ15 may not be available to many 286 systems. SOME IRQs have
other uses like your FLOPPY AND HARD drives see your ROMBIOS hand book.
*/
#include "IOLib.ch"

PUBLIC nkey,cChr,IRQ3
PUBLIC inbuf,fgcl:=10,bgcl:=0
*EXIT PROCEDURE cleanup
SETCANCEL(.f.)
SET CONFIRM ON
CLS

EscSpool:=""
GotEsc:=.f.
IRQ3:=3
SET CURSOR ON
*4K BUFFER
*inbuf:=space(4000)

IF !INIT_PORT(COM2,BPS57600,EIGHT_DATA_BITS,NO_PARITY,;
ONE_STOP_BIT,IRQ3,8192)

? "No init! Wrong data"
QUIT
ENDIF

IF ISWORKING()
setcolor("10/")
? "Interrupt is working!"
ELSE
? "Nothing yet..."
ENDIF
? ""
minit="ATX3E1&C1M1W1"+CHR(13)
OUTCHR(@minit)

*inkey(2)
*minit:=REPLICATE("test ",30)
*OUTCHR(@minit)

FOR tmp = 1 to 20
*@ ROW(),0 say OUTBUFSIZE()
IF OUTBUFSIZE()=0
EXIT
ENDIF
INKEY(.1)
NEXT



nkey:=0
setcolor(TRIM(STR(fgcl))+"/"+TRIM(STR(bgcl)))
mr=ROW()
mc=COL()
SET CURSOR OFF
mline:=ISONLINE()
@ MAXROW(),0 SAY " "+IF(ISONLINE()=.t.,"OnLine ","OffLine")+" ¦ "+IOLIB_VER()+" ¦ DTR "+IF(SETDTR()=.t.,"on ","off")+"Alt-H=Help " COLOR "W+/R"
@ mr,mc SAY ""
SET CURSOR ON


do while !nkey=301 && Alt-X
nkey:=INKEY()
IF nKey=18 &&PgUp
XMODEM_TX()
ELSEIF nKey=3 &&PgDn
XMODEM_RX()
ELSEIF nkey>0 .and. nkey<256
OUTC(nkey)
ELSEIF nKey=291 && Alt-H

mscr:=SAVESCREEN(5,5,20,65)
@ 5,5,20,65 box "г=¬¦-=L¦ " color "w+/b"
@ 5,25 say "[ ClipModem Help ]" color "w+/b"
@ 6,7 say "KEY | Command Snytax" color "w+/b"
@ 7,7 say "Alt-X | Exit program" color "w+/b"
@ 8,7 say "Alt-D | Dial directory?" color "w+/b"
@ 9,7 say "PgDn | Receive file" color "w+/b"
@ 10,7 say "PgUp | Send file" color "w+/b"
@ 12,7 say "IN-Buffer MAX size= "+LTRIM(STR(SIZEO()-1)) color "w+/b"
@ 14,8 say "This is a sample only, don't do much.... " color "w+/b"
@ 19,7 SAY "Press Any Key to return to terminal......" color "15*/9"
set cursor off
do while INKEY()=0
@ 6,35 say "Current status is "+IF(ISONLINE()," ONLINE","OFFLINE") color "w+/b"
@ 7,35 say " DTR = "+IF(SETDTR(),"ON","OFF") color "w+/b"
@ 8,35 say " RTS = "+IF(SETRTS(),"ON","OFF") color "w+/b"
@ 9,35 say " DSR = "+IF(DSR(),"ON","OFF") color "w+/b"
@ 10,35 say " CTS = "+IF(CTS(),"ON","OFF") color "w+/b"
@ 11,35 say "BUFFER = "+LTRIM(STR(INBUFSIZE()))+" " color "w+/b"
ENDDO
set cursor on
RESTSCREEN(5,5,20,65,mscr)
ENDIF

cChr:=INCHR(1)

IF !cChr=NIL
IF ASC(cChr)=10 .and. ROW()>MAXROW()-2
SCROLL(0,0,MAXROW()-1,79,1)
ELSEIF ASC(cChr)=27
EscSpool:=chr(27)
gotEsc:=.T.
ELSEIF gotEsc
EscSpool:=EscSpool+cChr
IF ISALPHA(cChr)
ANSI(EscSpool,cChr)
gotEsc:=.F.
ELSEIF LEN(EscSpool)>15 .or. !SUBSTR(EscSpool,2,1)=="["
gotEsc:=.f.
?? EscSpool
ENDIF
ELSE
* IF COL()=MAXCOL() .AND. ROW()=MAXROW()-1
* SCROLL(0,0,MAXROW()-1,79,1)
* @ ROW(),0 SAY ""
* ENDIF
?? cChr

ENDIF
ENDIF
IF ROW()=MAXROW() .OR. !mline=ISONLINE()
mr=ROW()
mc=COL()
SET CURSOR OFF
@ MAXROW(),0 SAY " "+IF(ISONLINE()=.t.,"OnLine ","OffLine")+" ¦ "+IOLIB_VER()+" ¦ DTR "+IF(SETDTR()=.t.,"on ","off")+"Alt-H=Help " COLOR "W+/R"
IF mr=MAXROW()
mr=MAXROW()-1
ENDIF
@ mr,mc SAY ""

SET CURSOR ON
mline:=ISONLINE()
ENDIF

enddo

QUIT

*******************************************
* ANSI() may have bugs
*
*
*

FUNCTION ANSI(cString,cterm)
LOCAL x,cSpec,nRow:=ROW(),nCol:=COL(),cfg:=NIL,cbg:=NIL
LOCAL nfg:=NIL,nbg:=NIL,cbuf:=""
LOCAL cClrs:={},lBright:=.f.
*@ 24,70 SAY cString COLOR "w+/r"
cString:=SUBSTR(cString,3)

DO CASE
CASE cString=="2J"
@ 0,0 CLEAR TO MAXROW()-1,MAXCOL()
nRow:=0
nCol:=0
CASE cString=="0m"
fgcl:=7
bgcl:=0
setcolor("7/0")

CASE cterm=="p"
*^&*$(^ trying to remap your keyboard!
CASE cString=="A"
nRow:=nRow-1
CASE cString=="B"
nRow:=nRow+1
CASE cString=="C"
nCol:=nCol+1
CASE cString=="D"
nCol:=nCol-1
CASE cString=="H" .or. cString=="f"
nRow:=0
nCol:=0
CASE cString=="K"
@ nRow,nCol CLEAR TO nRow,MAXCOL()
CASE cterm=="A"
nRow:=nRow-VAL(cString)
CASE cterm=="B"
nRow:=nRow+VAL(cString)
CASE cterm=="C"
nCol:=nCol+VAL(cString)
CASE cterm=="D"
nCol:=nCol-VAL(cString)
CASE cterm=="H" .OR. cterm=="f"
nRow:=VAL(cString)
cString:=SUBSTR(cString,AT(";",cString)+1 )
nCol:=VAL(cString)
CASE cterm=="m" && change color
cbuf:=SUBSTR(cString,1,LEN(cString)-1)
x=1
DO WHILE LEN(cbuf)>0
AADD(cClrs,VAL(cBuf))
IF AT(";",cbuf)=0
EXIT
ENDIF
cBuf:=SUBSTR(cBuf,AT(";",cbuf)+1)
ENDDO
bright:=IF(fgcl>7,.T.,.F.)
blink:=IF(bgcl>7,.T.,.F.)
FOR x=1 to LEN(cClrs)
DO CASE
CASE cClrs[x]==NIL
CASE cClrs[x]==0
bright:=.f.
blink:=.f.
bgcl:=0
CASE cClrs[x]==1
bright:=.t.
CASE cClrs[x]==5
blink:=.t.
CASE cClrs[x]==7
nFg:=NIL
nbg:=NIL
fgcl:=0
bgcl:=7
bright:=.f.
blink:=.f.
EXIT
CASE cClrs[x]>39
nBg:=ASCAN({40,44,42,46,41,45,43,47}, (cClrs[x]))-1
CASE cClrs[x]>29
nFg:=ASCAN({30,34,32,36,31,35,33,37} ,cClrs[x])-1
ENDCASE
NEXT
fgcl:=IF(nfg=NIL,fgcl,nfg)
fgcl:=IF(bright .and. fgcl<8 ,fgcl+8,fgcl)
bgcl:=IF(nbg=NIL,bgcl,nbg)
bgcl:=IF(blink .and. bgcl<8 ,bgcl+8,bgcl)

setcolor(TRIM(STR(fgcl))+IF(blink,"*/","/")+TRIM(STR(bgcl)))
OTHERWISE
* @ 24,10 say " "+ cString+" "
ENDCASE


nRow:=IF(nRow=MAXROW(),MAXROW()-1,nRow)
nRow:=IF(nRow<0,0,nRow)
nCol:=IF(nCol>MAXCOL(),MAXCOL(),nCol)
nCol:=IF(nCol<0,0,nCol)
@ nRow,nCol SAY ""

RETURN NIL



EXIT PROCEDURE cleanup()
@ MAXROW(),0 say ""
IF ISWORKING()
? "Interrupt is working!"
ELSE
? "It did not work!"
ENDIF
UNINT_PORT()
? "Port Uninitialized............."
RETURN



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 4
Зарегистрирован: 18.05.05
ссылка на сообщение  Отправлено: 25.01.07 08:29. Заголовок: Re:


В свое время тоже долго перебирал разные библиотеки для работы с COM портами для клиент-банка...
Правда мне обязательно был нужен протокол zmodem. В конце концов све сделал с помощью TELEPATHY VERSION 2.1 от Extrasensory Software. Там есть все, однако про Winmodem под DOS можно забыть (забить). Определенные проблемы могут возникнуть и с USB модемами. Все зависит от поставляемых драйверов. Если будет надо, откликнись. Библа в RARе 640К, PRG из клиент-банка вообще копейки..

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 169
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет