Tape in/out — ZXNet «code.zx»

Tape in/out

ZXNet echo conference «code.zx»



from: Kirill Frolov
to: Sergei Chikalev
date: 26 November 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