/************************************************************************/ /* */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* *************** *************** */ /* ***************** ***************** */ /* *************** *************** */ /* ***** ***** TheNetNode */ /* ***** ***** Portable */ /* ***** ***** Network */ /* ***** ***** Software */ /* */ /* File os/go32/api.c (maintained by: ???) */ /* */ /* This file is part of "TheNetNode" - Software Package */ /* */ /* Copyright (C) 1998 - 2008 NORD> #include #include "api.h" #include "api32.h" char manifest[20]; unsigned dev_irq = 0; __dpmi_raddr tx_rframe; L1FRAME tx_pframe; /* Anzahl der Kanaele holen */ int l1_enum_ports(void) { __dpmi_regs r; if (dev_irq == 0) return(0); r.x.ax = API32_ENUM_PORTS; __dpmi_int(dev_irq+1, &r); return(r.x.ax); } /* einen Kanal initialisieren */ int l1_init_port(unsigned port, unsigned baud, unsigned mode) { __dpmi_regs r; if (dev_irq == 0) return(0); r.x.ax = API32_INIT_PORT; r.x.bx = port & 0xFFFF; r.x.cx = baud & 0xFFFF; r.x.dx = mode & 0xFFFF; __dpmi_int(dev_irq+1, &r); return(r.x.ax); } /* das naechste Frame empfangen */ void *l1_rx_frame(void) { static L1FRAME frame_buf; __dpmi_regs r; if (dev_irq == 0) return(NULL); r.x.ax = API32_RX_FRAME; __dpmi_int(dev_irq+1, &r); if (r.x.ax) { dosmemget((((int)r.x.es)<<4)+r.x.bx,sizeof(L1FRAME),&frame_buf); return(&frame_buf); } return(NULL); } /* einen Sende-Buffer holen */ L1FRAME far *l1_get_txbuf(unsigned port) { __dpmi_regs r; if (dev_irq == 0) return(NULL); r.x.ax = API32_GET_TXBUF; r.x.bx = port & 0xFFFF; __dpmi_int(dev_irq+1, &r); if (r.x.ax) { /* Buffer bekommen */ tx_rframe.segment = r.x.es; tx_rframe.offset16 = r.x.bx; return(&tx_pframe); } return(NULL); } /* den Sender anstossen */ void l1_kick(void) { __dpmi_regs r; if (dev_irq == 0) return; dosmemput(&tx_pframe,sizeof(L1FRAME), ((int)tx_rframe.segment<<4)+tx_rframe.offset16); r.x.ax = API32_KICK; __dpmi_int(dev_irq+1, &r); } /* Calibrierung durchfuehren */ void l1_calibrate(unsigned port, unsigned minutes) { __dpmi_regs r; if (dev_irq == 0) return; r.x.ax = API32_CALIBRATE; r.x.bx = port & 0xFFFF; r.x.cx = minutes & 0xFFFF; __dpmi_int(dev_irq+1, &r); } /* den Kanal-Status abfragen */ unsigned l1_state(unsigned port) { __dpmi_regs r; if (dev_irq == 0) return(0); r.x.ax = API32_STATE; r.x.bx = port & 0xFFFF; __dpmi_int(dev_irq+1, &r); return(r.x.ax); } /* den Hardwarenamen eines Kanals holen */ char far *l1_ident(unsigned port) { static char ident[20]; __dpmi_regs r; if (dev_irq == 0) return(NULL); r.x.ax = API32_IDENT; r.x.bx = port & 0xFFFF; __dpmi_int(dev_irq+1, &r); dosmemget((((int)r.x.es)<<4)+r.x.bx, 20, ident); return(ident); } /* ist dieser Kanal aktiv? */ int l1_active(unsigned port) { __dpmi_regs r; if (dev_irq == 0) return(0); r.x.ax = API32_ACTIVE; r.x.bx = port & 0xFFFF; __dpmi_int(dev_irq+1, &r); return(r.x.ax); } /* die L1-Statistik lesen bzw loeschen */ L1STATISTICS far *l1_stat(unsigned port, int del) { static L1STATISTICS pstat; __dpmi_regs r; if (dev_irq == 0) return(NULL); r.x.ax = API32_STAT; r.x.bx = port & 0xFFFF; r.x.cx = del & 0xFFFF; __dpmi_int(dev_irq+1, &r); dosmemget(((int)r.x.es<<4)+r.x.bx, sizeof(L1STATISTICS), &pstat); return(&pstat); } int find_devirq(void) { unsigned irq; __dpmi_raddr p; for (irq = 0x60; irq <= 0xF0; irq++) { /* freien IRQ suchen */ __dpmi_get_real_mode_interrupt_vector(irq, &p); if (p.segment) { dosmemget((((int)p.segment)<<4)+p.offset16, 20, manifest); if (strncmp(manifest,"FlexNet",7)==0) { /* schon installiert */ dev_irq = irq; return(1); } } } return(0); } #endif /* End of os/go32/api.c */