ZXNet эхоконференция «code.zx»
тема: Tape in/out
от: Kirill Frolov
кому: Sergei Chikalev
дата: 26 Nov 2001
Hемедленно нажми на RESET, Sergei!
25 Nov 01 00:54, Sergei Chikalev wrote to Kirill Frolov:
KF>> Реально работала программная эмуляция последовательного
KF>> порта (rs232) на 38400. Режим передачи -- полудуплексный.
SC> ... и сдесь подробнее пожалуйста?? И с приерами...
Здесь есть ошибка позволяющая при определённых
обстоятельствах (не проявляющихся при нормальной работе)
переполниться приёмному буферу. Заключается ошибка в
том, что я забыл проверку на максимальное количество
принятых символов. А отключение сигнала RTS по заполнению
буфера есть -- потому если используется аппаратный контроль
потока ничего и не сглючивает, но опасность есть.
Использование аппаратного контроля потока ОБЯЗАТЕЛЬHО.
Или будут байты теряться (полудуплекс!), или нужен специальный
программный протокол. Hапример X-modem работать будет.
Eсли аппаратный контроль потока используется, то лучше соединять
2 таких компутера, чтобы один из них имел АППАРАТHЫЙ ПОРТ.
Hапример спек и пц. Если же через такой "эмулятор" соединить два спека,
то будет конкуренция наблюдаться (полудуплекс!) -- передача данных
будет возможна только если один хочет передавать, а другой слушает,
иначе всё тормозит. При передаче большого количества маленьких блоков
сильно упадёт скорость.
Таким образом для соединения 2-х компутеров типа спека нужно
5 проводов, лучше даже 7 (GND, RTS, CTS, TXD, RXD, DTE, DTR).
Вообще можно и по 3-м проводам сделать чтобы буквы не терялись,
но это уже будет не rs232. Лучше аппаратный порт ставить.
ps: кто не понял -- в викомм-модеме тоже полудуплекс и тоже байты теряются.
Т.е. для использования с MMD достаточно и 3-х проводов.
;--------------------------------------
; RS232 EMULATOR ZX-LINK
;
TXPORT EQU #CFF7
RXMAX EQU 270
ZXL_INI LD A,1
JR ZXL_CTL
ZXL_OFF XOR A
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
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
RXNEXT LD D,#9F ; TIME
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)
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
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
LD A,E
CPL
LD (IX),A
INC IX
JP RXNEXT
RXERR LD A,(TXMASK)
OUT (C),A
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
|