home *** CD-ROM | disk | FTP | other *** search
- buffer and */
- /* maintaining the interrupt buffer pointers. A timeout is established. */
- /* */
- /****************************************************************************/
- unsigned short read_chan (bytes, buffer)
- unsigned short bytes; /* Bytes requested */
- register unsigned char *buffer; /* Pointer to the user's buffer */
- {
- unsigned short count; /* Byte count */
- unsigned short avail; /* Bytes available */
- timer = TIMOUT; /* Set initial timeout value */
- count = bytes; /* Set byte-count */
-
- while (count && timer) /* If byte request or no timeout */
- {
- avail = write_ptr - read_ptr; /* Bytes available */
- if (avail) /* If bytes available */
- {
- if (avail > count) /* If more bytes than we need */
- avail = count; /* Take only what we need */
- memcpy (buffer , /* User's buffer */
- read_ptr , /* Interrupt buffer pointer */
- avail) ; /* Copy to user's buffer */
- count -= avail; /* Update count */
- read_ptr +=avail; /* Update read pointer */
- buffer +=avail; /* Update write pointer */
- timer = TIMOUT; /* Set new timer value */
- }
- _disable(); /* Clear interrupts */
- if (read_ptr == write_ptr) /* If no bytes available */
- {
- read_ptr = int_buffer; /* Initialize the interrupt buffer */
- write_ptr = int_buffer; /* Initialize the interrupt buffer */
- }
- _enable(); /* Enable interrupts */
- }
- return(bytes - count); /* Actual characters received */
- }
- /****************************************************************************/
- /* Flush the interrupt buffer */
- /****************************************************************************/
- void flush()
- {
- _disable();
- read_ptr = int_buffer; /* Initialize the interrupt buffer */
- write_ptr = int_buffer; /* Initialize the interrupt buffer */
- _enable();
- }
- /****************************************************************************/
- /* Communications transmit routine */
- /* Write 'bytes' bytes from buffer to the UART. Don't return until done */
- /* unless the carrier failed or the hardware broke. */
- /****************************************************************************/
- unsigned short write_chan (bytes, buffer)
- unsigned short bytes; /* Bytes to send */
- register unsigned char *buffer; /* Pointer to the buffer */
- {
- unsigned short status;
-
- timer = TIMOUT;
- while ((bytes && timer) && !user_abort ) /* Bytes, no abort, no timout */
- {
- while (
- ( status = /* Get modem status */
- ( inp (hardware_port+MSR) /* ...from modem status register */
- & MSR_CHK ) /* ... check CTS and DSR only */
- ) != old_stat) /* ... if not the same as before */
- { /* Flow control loop */
- if ( (status & MSR_RLSD ) /* ...check modem carrier */
- != carrier) /* ... if not same as before */
- {
- user_abort = 0x0FFFF; /* Set the abort flag */
- return JM_ABT; /* ... and get out */
- }
- }
- status = inp(hardware_port+LSR); /* Get line-status */
- if (status & LSR_THRE) /* If TX holding register empty */
- {
- outp(hardware_port,*buffer++); /* Send the byte */
- bytes--; /* Bump the byte-count */
- timer = TIMOUT; /* Set new timer-value */
- }
- }
- return JM_NRM;
- }
- /****************************************************************************/
- /* Communications adapter hardware interrupt */
- /* This is very simple because we interrupt on receive only. Since we */
- /* must wait until the entire block has been received and checked be- */
- /* for doing anything else, the transmitter is polled. */
- /* */
- /****************************************************************************/
- void interrupt far com_int()
- {
- *write_ptr = (unsigned char)
- inp(hardware_port); /* Put byte in buffer */
- outp(0x20,0x20); /* Reset hardware controller */
- if (write_ptr < int_buffer + DAT_LEN ) /* Check buffer for overflow */
- write_ptr++; /* Bump pointer if room */
- }
- /****************************************************************************/
- /* Timer interrupt */
- /* A WORD (timer) gets decremented every timer-tick if it is not already */
- /* zero. This is used to set time-out values in the communication pro- */
- /* cedures so that a "wait-forever" can't occur. */
- /* */
- /****************************************************************************/
- void interrupt far tim_int()
- {
- if (timer) /* If NZ */
- timer--; /* Bump the timer */
- outp(0x20,0x20); /* Reset the hardware controller */
- _enable(); /* Allow network interrupts */
- _chain_intr(old_tim); /* Go to old timer-tickase; /* Set hardware port */
- old_ier = inp(hardware_port +IER); /* Get interrupt enable regis */
- old_brk = _dos_getvect(0x1B); /* Get old break key vector */
- old_mask = inp(0x21); /* Save old interrupt mask */
- old_tim = _dos_getvect(0x1C); /* Get old DOS timer-tick vector */
- old_com = _dos_getvect(
- port_pars[user_port].int_num); /* Get old communications vector */
- _dos_setvect(0x1C,tim_int); /* Set new timer interrupt */
- _dos_setvect(
- port_pars[user_port].int_num, /* Set new communications vector */
- com_int);
- outp(0x21,old_mask &
- port_pars[user_port].mask); /* Set interrupt enable mask */
- outp(hardware_port+MCR, 0x0F); /* Turn everything on. */
- outp(hardware_port+IER, IER_ERBFI); /* Enable received data available */
- for (i=0; i<8; i++) /* Edge-triggering, read the ports */
- inp(hardware_port + i); /* Port to clear */
- outp(0x20,0x20); /* Reset the hardware controller */
- timer=9; /* 1/2 second wait */
- while (timer); /* Wait 1/2 second */
- flush(); /* Clear interrupt buffer again */
- i = inp(hardware_port+MSR); /* Get current modem status */
- old_stat = i & MSR_CHK; /* Get current modem control */
- carrier = i & MSR_RLSD; /* Get any modem carrier */
- return JM_NRM;
- }
- /****************************************************************************/
- /* Close the communications channel */
- /* */
- /* Under MS-DOS this involves restoring the interrupt vectors and */
- /* controller mask that was saved during the OPEN routine. */
- /* */
- /****************************************************************************/
- unsigned short close_chan (user_port)
- unsigned short user_port;
- {
- outp(hardware_port+IER,old_ier); /* Set old interrupt enable */
- outp(0x21,old_mask); /* Restore old interrupt mask */
- _dos_setvect(
- port_pars[user_port].int_num, /* Set old communications vector */
- old_com);
- _dos_setvect(0x1C,old_tim); /* Set old timer interrupt */
- _dos_setvect(0x1B,old_brk); /* Set old break interrupt */
- return JM_NRM;
- }
- /****************************************************************************/
- /* Read from the communications channel */
- /* */
- /* This involves transferring data from the interrupt" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ routine */
- }
- /****************************************************************************/
- /* A B O R T trap */
- /* Control-C and control-break vectors are set to point here so that */
- /* a user-break harmlessly sets a flag so that interrupt vectors may */
- /* properly restored upon program exit. */
- /* */
- /************** case the BBS program has turned them off (WILDCAT does).
- Some modems "hiccup" when this occurs, and the RTS line will
- bounce. This caused JMODEM to "wait forever" for a RTS that
- never occurs. Therefore I added a 1/2 second delay between
- the time that I first set these bits and the time I start
- checking for RTS and RLSD for flow-control and a possible
- abort. This fixed this problem. The flow-control problem is
- complex because us**************************************************************/
- void interrupt far fatal_abort()
- {
- user_abort = 0xFFFF; /* Set abort flag */
- }
- /****************************************************************************/
- /******************** E N D O F M O D U L E *****************************/