BBS: Inland Empire Archive Date: 12-25-92 (11:20) Number: 295 From: GLENN DELAHOY Refer#: NONE To: DICK DENNISON Recvd: NO Subj: Bbs Design Conf: (2) Quik_Bas
> We always need good code.
Ok you asked for it....
If your are writing a door for a bbs that uses the fossil
then you don't need to set the baud or handshaking as the
fossil, when restarted, will use the current settings.
Remember the fossil expects port 0 = COM1, port 1 = COM2
etc. port 255 = local.
FUNCTION SetBaud (PortNum, Baud)
DIM inreg AS RegType, outreg AS RegType
'best to use open CONS for local output
IF PortNum = 255 THEN EXIT FUNCTION
' high 3 bits of AL
IF Baud = 38400 THEN inreg.ax = 35 ' 001 = 38400 ''
(Replaces old 150 baud mask)
IF Baud = 19200 THEN inreg.ax = 3 ' 000 = 19200 ''
(Replaces old 110 baud mask)
IF Baud = 9600 THEN inreg.ax = 227 ' 111 = 9600 ''
IF Baud = 4800 THEN inreg.ax = 195 ' 110 = 4800 ''
IF Baud = 2400 THEN inreg.ax = 163 ' 101 = 2400 ''
IF Baud = 1200 THEN inreg.ax = 131 ' 100 = 1200 ''
IF Baud = 600 THEN inreg.ax = 99 ' 011 = 600 ''
IF Baud = 300 THEN inreg.ax = 67 ' 010 = 300 baud
inreg.dx = PortNum
CALL Interrupt(&H14, inreg, outreg)
SetBaud = outreg.ax
' outreg.ax
' bit 7 carrier detect
' 6 output buffer empty
' 5 output buffer not full
' 4
' 3 always 1
' 2
' 1 input buffer overrun
' 0 characters in input buffer
END FUNCTION
FUNCTION StartFossil (PortNum)
DIM inreg AS RegType, outreg AS RegType
inreg.ax = &H400 'FOSSIL function 04h
inreg.dx = PortNum 'Port number (0=COM1)
inreg.flags = 512 'Keeps interrupts enabled
CALL Interrupt(&H14, inreg, outreg) 'Call X00
'If installed X00 returns &H1954
IF outreg.ax = &H1954 THEN
StartFossil = outreg.bx \ 256
ELSE
StartFossil = 0
END IF
END FUNCTION
SUB WritePort (PortNum, Tx$)
DIM InRegX AS RegTypeX, OutRegX AS RegTypeX
IF PortNum = 255 THEN EXIT SUB
Buffer$ = Tx$
DO WHILE LEN(Buffer$) > 0
'if not local then check for carrier before xmit
IF CarrierDetect = 1 THEN
IF (StatusRequest(PortNum) AND 128) <> 128 THEN ERROR 255
END IF
InRegX.ax = &H1900
InRegX.cx = LEN(Buffer$)
InRegX.dx = PortNum
InRegX.es = SSEG(Buffer$) 'qb 7.1
'InRegX.es = VARSEG(Buffer$) 'qb 4.5
InRegX.di = SADD(Buffer$)
CALL InterruptX(&H14, InRegX, OutRegX)
'number of chars actually sent
numberchars = OutRegX.ax
Buffer$ = RIGHT$(Buffer$, LEN(Buffer$) - numberchars)
LOOP
' will attempt to move the whole string
' returns actual number of characters moved
' if not all characters are moved then
' keep looping until done
' AH = 19h Write block (transfer from user buffer to FOSSIL)
'
' Parameters:
' Entry: CX = Maximum number of characters to transfer
' DX = Port number
' ES = Segment of user buffer
' DI = Offset into ES of user buffer
' Exit: AX = Number of characters actually transferred
END SUB
FUNCTION StatusRequest (PortNum)
DIM inreg AS RegType, outreg AS RegType
IF PortNum = 255 THEN
'dummy carrier for local
StatusRequest = 128
EXIT FUNCTION
END IF
inreg.ax = &H300
inreg.dx = PortNum
CALL Interrupt(&H14, inreg, outreg)
StatusRequest = outreg.ax
' AL = Modem status, where:
' Bit 0 = Delta clear to send (not reliable)
' Bit 1 = Delta data set ready (not reliable)
' Bit 2 = Delta data carrier detect (not reliable)
' Bit 3 = Always set to 1 upon return (DUMMY DCD)
' Bit 4 = Clear to send (CTS)
' Bit 5 = Data set ready (DSR)
' Bit 6 = Ring indicator (RI)
' Bit 7 = Data carrier detect (DCD)
'use bit 6 to detect the modem ringing
END FUNCTION
Regards,
Glenn
--- FMail 0.92
* Origin: Rough Productions -V32- (059) 983 639 (3:635/572)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET