|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Stanislav Safronov 2:5020/630 15 Jan 2003 23:36:38 To : All Subject : dosemu serial patch --------------------------------------------------------------------------------
Добрый /1642 грохнул это письмо, поэтому пересылаю его снова...
За праздники нашел проблему в DOS эмуляторе *dosemu* и починил работу с fifo и
fossil ! Удивительно, что народ как минимум с 1999 не исправил ошибки... А
жалобные стоны раздаются и по сей день в инете на работу dosemu с портами,
ошибками в zmodem и пр.
Теперь BBS/BW должна нормально работать на трансфер файлов пользователям. А вот
с приемом до конца не исправил, но кому нужно могу дать сырые патчи, которые
значительно улучшают работу или полные патчи для работы любой BBS из под
DOSEMU. Изменения коснулись и *fossil* драйвера.
Судя по архиву эхи уверен, что кому-то эти патчи пригодятся, поэтому кидаю в
эху. Они маленькие:
=== Cut ===
-+- fossil.c.old Wed Dec 18 04:36:38 2002
+++ fossil.c Tue Jan 7 00:10:51 2003
@@ -225,11 +225,18 @@ void fossil_int14(int num)
/* Write character (without wait) */
case 0x0b:
- write_char(num, LO(ax));
+ if (!com[num].tx_overflow){
+ write_char(num, LO(ax));
+ LWORD(eax)= 1;
+ #if SER_DEBUG_FOSSIL_RW
+ s_printf("SER%d: FOSSIL 0x0b: Write char 0x%02x, return AX=%d\n", num,
LO(ax), 1);
+ #endif
+ }else{
#if SER_DEBUG_FOSSIL_RW
s_printf("SER%d: FOSSIL 0x0b: Write char 0x%02x, return AX=%d\n", num,
LO(ax), !com[num].tx_overflow);
#endif
LWORD(eax) = !com[num].tx_overflow;
+ }
break;
/* Block read */
=== Cut ===
=== Cut ===
-+- ser_irq.c.old Wed Dec 18 04:36:38 2002
+++ ser_irq.c Tue Jan 7 00:22:02 2003
@@ -160,13 +160,20 @@ void transmit_engine(int num) /* Interna
if (!(control & TIOCM_CTS)) return; /* Return if CTS is low */
}
- if (com[num].tx_overflow) { /* Is it in overflow state? */
- rtrn = RPT_SYSCALL(write(com[num].fd, &com[num].TX, 1)); /* Write port */
- if (rtrn == 1) /* Did it succeed? */
- com[num].tx_overflow = 0; /* Exit overflow state */
- }
- else if (com[num].fifo_enable) { /* Is FIFO enabled? */
+ if (com[num].fifo_enable) { /* Is FIFO enabled? */
+ if (com[num].tx_overflow){
+ if(RPT_SYSCALL(write(com[num].fd,
&com[num].tx_buf[com[num].tx_buf_start], 1))!=1){
+ return; /* write error */
+ }else{
+ /* Squeeze char into FIFO */
+ com[num].tx_buf[com[num].tx_buf_end] = com[num].TX ;
+ /* Update FIFO queue pointers */
+ com[num].tx_buf_end = (com[num].tx_buf_end + 1) % TX_BUFFER_SIZE;
+ com[num].tx_buf_start = (com[num].tx_buf_start + 1) % TX_BUFFER_SIZE;
+ com[num].tx_overflow = 0; /* Exit overflow state */
+ }
+ }
/* Clear as much of the transmit FIFO as possible! */
while (com[num].tx_buf_bytes > 0) { /* Any data in fifo? */
rtrn = RPT_SYSCALL(write(com[num].fd,
&com[num].tx_buf[com[num].tx_buf_start], 1));
@@ -184,6 +191,11 @@ void transmit_engine(int num) /* Interna
}
}
else { /* Not in FIFO mode */
+ if (com[num].tx_overflow) { /* Is it in overflow state? */
+ rtrn = RPT_SYSCALL(write(com[num].fd, &com[num].TX, 1)); /* Write port
*/
+ if (rtrn == 1) /* Did it succeed? */
+ com[num].tx_overflow = 0; /* Exit overflow state */
+ }
if (com[num].tx_trigger) { /* Is it time to trigger int */
com[num].tx_trigger = 0;
com[num].LSRqueued |= UART_LSR_TEMT | UART_LSR_THRE;
=== Cut ===
Stanislav
--- GoldED+/LNX 1.1.4.7
* Origin: -= Crazy Students BBS 423-3328 Time 00:00-05:30 =- (2:5020/630)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/207423e25b88b.html, оценка из 5, голосов 10
|