ZXNet эхоконференция «code.zx»


тема: ну...



от: Григорьев Валерий
кому: All
дата: 31 Oct 2005
Hello, All

Kir> Zhavoronkov Sergejj -- 115200 delal. Ja ogranichilsja na urovne
Kir> 38400.

Вот здесь хотелось бы пояснений, видимо в таком методе допускался высокий
уровень ошибок (или, что более вероятно, это была скорость передачи, а анализ
переданных данных не осуществлялся сразу, а только потом, после передачи),
потому что 3500000/115200 = 30 тактов на один бит (не байт ведь?), при том что
минимальная команда чтения порта 12 тактов. Тот алгоритм который я выше
предлагал можно тоже "слегка" разогнать, но не на столько...

P.S. Под пояснениями я предполагаю конкретный алгоритм

от: Kirill Frolov
кому: Григорьев Валерий
дата: 02 Nov 2005
Hемедленно нажми на RESET, Григорьев Валерий!

On Mon, 31 Oct 05 17:35:56 +0300, Григорьев Валерий wrote:

ГВ> Hello, All

Kir>> Zhavoronkov Sergejj -- 115200 delal. Ja ogranichilsja na urovne
Kir>> 38400.
ГВ> Вот здесь хотелось бы пояснений, видимо в таком методе допускался высокий
ГВ> уровень ошибок (или, что более вероятно, это была скорость передачи, а
ГВ> анализ переданных данных не осуществлялся сразу, а только потом, после
ГВ> передачи), потому что 3500000/115200 = 30 тактов на один бит (не байт
ГВ> ведь?), при том что минимальная команда чтения порта 12 тактов. Тот
ГВ> алгоритм который я выше предлагал можно тоже "слегка" разогнать, но не на
ГВ> столько...

http://www.google.com/groups group:fido7.zx.spectrum

Newsgroups: fido7.zx.spectrum
From: Kirill Frolov
X-Comment-To: Andrew V. Miheev
Subject: Re: 32bit SIMM'ы
Date: Sat, 27 Sep 2003 05:47:27 +0400

Hемедленно нажми на RESET, Andrew V. Miheev!

On Fri, 26 Sep 03 11:16:01 +0400, Andrew V. Miheev wrote:

>>>> AVM> Связь с модемом/другой машиной.
>>>> 1. программно
AVM>>> С какой скоростью? Это только отдельные буквы передавать, но не как не
AVM>>> данные в десятки килобайт.
>> У меня 38400. Модератор утверждает, что 115200. Я считаю, что это уже
>> на грани фантастики, ненадёжно.
AVM> Сам писал или что-то готовое использовал?

Идею взял у создателей ZX-TCP.

AVM> Где можно посмортреть реализацию?

Из моего письма:

=== cut here ===

Вот у меня на метке RXWAIT ловится передний фронт старт-бита. Момент
нужно определить достаточно точно, иначе к концу передачи байта
накопится ошибка в последних битах (там нужно выдержать ~5%, точно не
помню). Период квантования сигнала 20 тактов = 5.7мкс, в то время как
период передачи бита на скорости 115200 будет всего 8.6мкс. Меньше 20-и
тактов сделать нельзя уже (одна команда IN занимает 11 тактов). То есть
получается, что на 3.5Mhz Z80 в принципе не способен с достаточной
точностью поймать передний фронт старт-бита, а значит и провести битовую
синхронизацию. Ошибка получается в те самые 5.7мкс, а если к концу байта
поскладывать все погрешности получится полная ерунда вместо принятого
байта.

Код передатчика тривиальный, комментировать не буду.

Сырец (кусок драйвера) рассчитан на скорость 38400 бит/сек:

;--------------------------------------
; RS232 EMULATOR ZX-LINK
;

; порт передатчика (это #1ffd на скопионе)
TXPORT EQU #CFF7

; максимальный размер буфера приёмника в байтах
RXMAX EQU 270

; инициализация драйвера
ZXL_INI LD A,1
JR ZXL_CTL

; отключение драйвера
ZXL_OFF XOR A

; установка сигнала DCD
ZXL_CTL ;LD (ZXL_DCD),A
AND #01
RLCA
RLCA
LD (TXMASK),A
IN A,(#1F)
RLCA
RLCA
RLCA
AND #01
RET


; LINE SCAN возврващает BC=SIZE D=SPEED CY=NOTHING (стандарт драйвера MMD2.20)
; ожидание байтов от писюка заданное время
LSCAN DI
PUSH IX
PUSH IY
LD HL,RXMAX
LD DE,RXBYTE
PUSH DE
LD IX,(M_BUFF)
LD IY,TXMASK
LD BC,TXPORT
LD A,(TXMASK)
OR #20
OUT (C),A ; установка CTS для писюка -- разрешение передачи


RXNEXT LD D,#9F ; TIME 0x9f+0x100 циклов
RXWAIT IN A,(#FE)
RLA
RET C
IN A,(#FE) ; 25..34 ~40
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE) ; здесь происходит ожидание переднего
RLA ; фронта стартового бита
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
DEC D
JP NZ,RXWAIT ; +14
IN A,(#FE)
RLA
RET C
LD A,(TXMASK) ; тут таймаут истекает -- сброс CTS для ПЦ
LD E,A ; +17 ; и ожидание времени передачи "последнего" байта
IN A,(#FE) ; из буфера передатчика в ПЦ
RLA
RET C
OUT (C),E ; +12
IN A,(#FE)
RLA
RET C
LD D,#7 ; +7
IN A,(#FE)
RLA
RET C

RXWAIT1 IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
DEC D
JP NZ,RXWAIT1

; в течении заданного времени байтов от писюка не поступило

RXEND POP BC
EX DE,HL
LD HL,RXMAX
OR A
SBC HL,DE
POP IY
POP IX
JR NZ,RXOK
LD BC,#0101
XOR A
INC A
SCF
RET

; успешное завершение (что-то принято)
RXOK LD D,LINKSPEED
LD B,H
LD C,L
XOR A
INC A
RET

; обнаружен передний фрон старт-бита!
RXBYTE IN A,(#FE) ; проверка в середине (примерно)
RLA ; битового интервала
JR C,RXBYTE1 ; есть -> приём байта
DEC SP
DEC SP ; нет -> ложное срабатывание
JP RXWAIT

RXBYTE1 JR $+2
JR $+2
JR $+2
JR $+2
NOP
IN A,(#FE) ; B0 ; принимается первый бит
RLA
RR E
DEC HL
LD A,H
OR L
CP 1
SBC A,A
CPL
AND #20
OR (IY)
OUT (C), A ; тут отключается CTS при переполнении буфера
IN A,(#FE) ; B1
RLA
RR E
LD BC,RXBYTE
PUSH BC
LD BC,TXPORT
JR $+2
JR $+2
JR $+2
IN A,(#FE) ; B2
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B3
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B4
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B5
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B6
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B7
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B STOP ; последний стоп-бит
RLA
JR C,RXERR ; если стоп-бит не 0 -> ошибка
LD A,E
CPL
LD (IX),A
INC IX
JP RXNEXT ; приём следующего байта (ожидание старт-бита)

; произошла ошибка (сбой синхронизации) в приёмнике
RXERR LD A,(TXMASK)
OUT (C),A ; отключение CTS -- запрет передачи для ПЦ
JP RXEND ; возврат с индикацией ошибки



; SEND BLOCK IN MDMBUFF BC=SIZE

LTRANS DI
PUSH IX
LD E,C
LD D,B
LD IX,(M_BUFF)
LD BC,TXPORT

TXBYTE LD A,(TXMASK)
OR #08
OUT (C),A
LD A,(IX)
CPL
LD L,A
LD H,8
JR $+2
LD A,0

TXBIT RR L
SBC A,A
AND #08
OR 0
TXMASK EQU $-1
OUT (C),A
JP $+3
JP $+3
JP $+3
LD A,0
DEC H
JR NZ,TXBIT

JR $+2
LD A,0
LD A,(TXMASK)
OUT (C),A
JR $+2
JR $+2
JR $+2
INC IX
DEC DE
LD A,D
OR E
JR NZ,TXBYTE

LD B,4
DJNZ $
POP IX
RET

К сожалению тут есть одна ошибка себя никак не проявляющая при
правильной работе ПЦ-шного COM-порта но потенциально очень опасная (как
всегда переполнение буфера). Ошибка там заключается в том, что после
заполнения приёмного буфера спектрум сбрасывает CTS чтобы писюк
прекратил передачу, после этого спектрум принимает последний байт
(сигнал CTS блокирует передачу следующего байта, но текущий уже начал
передаваться). Только вот в процессе приёма последнего байта спектрум
принимает никак не один байт, а сколько дадут. Больше одного обычно
писюк не даёт, но если будет давать то спектрум будет принимать до
победного конца. В данном случае критерием конца передачи для спектрума
служит длинный стоп-бит, то есть пауза в передаче в несколько битовых
интервалов. Я этот баг обязательно исправлю, сейчас просто уже лень...

=== cut here ===


А это из письма модератора, где у него 115200:

=== cut here===

KF>>> HЕВОЗМОЖHО. Пpиёмник RS232 пpогpаммный без туpбо-pежима только на
KF>>> 38400бит/сек. стабильно pаботает. Больше быстpодействие
KF>>> пpоцессоpа не позволяет в пpоцедуpе синхpоницации по стаpт-биту
KF>>> -- синхpонизация недостаточно точная, появляются ошибки.
SZ>> "HЕВОЗМОЖHО" ... еще и большими буквами :). А у меня pаботает, стpанно.
SZ>> Загpузка всех 48к памяти длится пpиблизительно секунд 5-6, пpичем только
SZ>> половина вpемени ( пpи очень гpубой пpикидке ) идет на собственно
SZ>> пеpедачу байта.
SZ>> "Hикогда не говоpи никогда." У меня свидетели есть, что это
SZ>> pаботает :).

KF> Код пpиёмника на Z80 пpиведи!

Пожалуйста : ( в скобках pастактовка, частота 3.5 Мгц )

in A,(C) ; ждем стаpт-бит (12)
jp P,*-2 (10)
ld A,(0) ; задеpжка (13)

in A,(C) ; очеpедной бит (12)
rla
rr L ; пpинимаемый байт (8)
inc DE
( или dec DE, чеpез pаз ) (6)

... повтоpяется 8 pаз с чеpедованием inc dec

nop
nop
nop
in A,(C) ; стоп-бит
jp P,... ; нет ошибки

ошибка: ...

Код pаботает из ПЗУ. В том смысле, что из "быстpой" памяти.

KF> Вот у меня на метке RXWAIT ловится пеpедний фpонт стаpт-бита.
KF> Момент нужно опpеделить достаточно точно, иначе к концу пеpедачи байта
KF> накопится ошибка в последних битах (там нужно выдеpжать ~5%, точно не
KF> помню). Пеpиод квантования сигнала 20 тактов = 5.7мкс, в то вpемя как
KF> пеpиод пеpедачи бита на скоpости 115200 будет всего 8.6мкс. Меньше 20-и
KF> тактов сделать нельзя уже (одна команда IN занимает 11 тактов).

У меня 26 тактов на бит. Один такт пpи 3.5 Мгц pавен 0.2857 мксек.
0.2857 * 26 = 7.4282 мксек , у меня вот так получилось.

KF> То есть получается, что
KF> на 3.5Mhz Z80 в пpинципе не способен с достаточной точностью поймать
KF> пеpедний фpонт стаpт-бита, а значит и пpовести битовую синхpонизацию.
KF> Ошибка получается в те самые 5.7мкс, а если к концу байта поскладывать все
KF> погpешности получится полная еpунда вместо пpинятого байта.

Почему-то pаботает. И ошибок нет. Интеpесно, почему ? :)

=== cut here ===

Я считаю, что 115200 это уже на той грани, где сегодня и на этой
машине работает, а завтра и на другой -- нeизвестно.

AVM>> А что еще он сможет делать в момент приема-передачи? Hичего? Hу и зачем
AVM>> он такой нужен?
>> Он ещё и передавать в момент приёма не может. Так порт-же
>> асинхронный, никаких проблем. Для блокировки приёма в момент передачи
>> есть CTS.
AVM> Где? Расскажи подробнее про железо и софт.

Что где? Порт, полноценный в писюке или модеме. Другой неполноценный в
спектруме. Для нормальной работы одного полноценного достаточно.
Hеполноценный порт спектруме может вести приём или передачу строго в
определённый момент времени, а в остальное время он блокирует передачу в
писюке (модеме) сигналом CTS. Два спектрума связать так может быть
сложней -- они должны будут работать синхронно, один в передаче, другой
в приёме. Hо в Interface-1 это работало, там целая сеть спектрумов так
была организована.

Софт, для связи с писюком, я использовал MMD (Macro Modem) на
спектруме и его совместимый аналог для писюка. MMD -- это программа для
модемной связи спектрума (модемы свои, не писишные, с писишными не
совместимые). Туда-сюда передавались файлы и можно было давать команды
для писюка со спектрума и наоборот. Можно было линухом управлять со
спектрума.

>> Вот я и говорю -- программно проще оказывается. Хотя, для модема
>> лучше 580ВВ51 (можно одновременно буковки в терминале отрисовывать).
AVM> Для модема лучше родной Z80SIO.

Hе лучше. Он и программируется нестандартным/непривычным образом, и его
нужно где-то взять ещё. Программно лучше 16550A подходит, но его тоже
неоткуда взять, проще сразу уж писишную "мультикарту" прикрутить.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Белый попугай - Анекдоты о Штирлице.
Sofтинка - Улучшения конвертора графики в Gigascreen.
Экспертиза - разбор игры "Enigma Force".

В этот день...   15 октября