Simple door 1/4

 BBS: Inland Empire Archive
Date: 02-06-93 (09:42)             Number: 341
From: DAVID COLSTON                Refer#: NONE
  To: ALL                           Recvd: NO  
Subj: Simple door           1/4      Conf: (2) Quik_Bas
A local sysop wanted a door to roll dice for a dungeons and dragons
game. I thought you might like to see it. Some of the code might look
familar<g>. Not all of the fossil routines are used, but are offered
for completeness.
   --------------------Cut here------------------------------------
DECLARE SUB CheckPortStatus (Port%, Info%, Reg AS ANY)
DECLARE SUB FossInit (Port%, Present%, Reg AS ANY)
DECLARE SUB GetChar (Port%, Good%, InBound$, Present%, Reg AS ANY)
DECLARE SUB PrintCon (A$, Reg AS ANY)
DECLARE SUB SendChar (Port%, Sent%, Present%, Outbound$, Reg AS ANY)
'$INCLUDE: 'C:\bc7\src\QBX.BI'
' Include Data Types for IN
DEFINT A-Z
'$STATIC
DIM Reg AS RegType                ' Used for INTERRUPT calls
A# = TIMER + 120 'Allow only two minute in this door
                          'This saves us from constantly monitoring
                          'carrier detect.
ON TIMER(A#) GOSUB Quit
ON KEY(10) GOSUB Quit'Allow local bail out by sysop
TIMER ON
KEY(10) ON
Port = VAL(LTRIM$(RTRIM$(COMMAND$)))' Port =0 is port 1, etc.
Start:
DIM Rolls(1000)
FossInit Port, Present, Reg 'Find out if fossil is present or
                                                'if we're
just looking on a PC.
Bits = 8   'Defaults for almost all boards!
Stops = 1
Parity$ = "N"
SendChar Port, Sent, Present, CHR$(12), Reg 'Just in case they

              'have
X$ = CHR$(27) + "[2J   Dice Door 1.0 By David Colston (c) 1993"
X$ = X$+ CHR$(13) + CHR$(10)
'Send ansii clear screen and return; line feed

X$ = X$ + "   Enter your character name:"
FOR I = 1 TO LEN(X$)
     SendChar Port, Sent, Present, MID$(X$, I, 1), Reg
     PrintCon MID$(X$, I, 1), Reg'Echo to board consol.
NEXT
DO
     GetChar Port, Good, InBound$, Present, Reg
     IF Good THEN
         IF InBound$ <> CHR$(13) THEN User$ = User$ + InBound$
         SendChar Port, Sent, Present, InBound$, Reg
         PrintCon InBound$, Reg
     END IF
LOOP UNTIL InBound$ = CHR$(13)
DiceSides:
X$ = CHR$(13) + CHR$(10) + "   Enter Number of Dice Sides:"
FOR I = 1 TO LEN(X$)
     SendChar Port, Sent, Present, MID$(X$, I, 1), Reg
     PrintCon MID$(X$, I, 1), Reg
NEXT
Sides$ = ""
DO
     GetChar Port, Good, InBound$, Present, Reg
     IF Good THEN
          IF INSTR(1, "1234567890", InBound$) > 0 THEN
                Sides$ = Sides$ + InBound$
                SendChar Port, Sent, Present, InBound$, Reg
           END IF
           PrintCon InBound$, Reg
      END IF
LOOP UNTIL InBound$ = CHR$(13)
IF VAL(Sides$) < 2 OR VAL(Sides$) > 100 THEN GOTO DiceSides
Dice:
X$ = CHR$(13) + CHR$(10) + "   Enter Number of Dice      :"
FOR I = 1 TO LEN(X$)
     SendChar Port, Sent, Present, MID$(X$, I, 1), Reg
     PrintCon MID$(X$, I, 1), Reg
NEXT
Dice$ = ""
DO
      GetChar Port, Good, InBound$, Present, Reg
      IF Good THEN
           IF INSTR(1, "1234567890", InBound$) > 0 THEN
                Dice$ = Dice$ + InBound$
                SendChar Port, Sent, Present, InBound$, Reg
           END IF
           PrintCon InBound$, Reg
       END IF
LOOP UNTIL InBound$ = CHR$(13)
IF VAL(Dice$) < 2 OR VAL(Dice$) > 100 THEN GOTO Dice
Grey = FREEFILE
OPEN "Greyhawk.rol" FOR APPEND AS Grey' Output for game bulletin
PRINT #Grey, "On "; DATE$; " "; User$; " had the following roll."
PRINT #Grey, "# Dice = "; Dice$; " # Sides = "; Sides$
RANDOMIZE TIMER
TotalRoll = 0
FOR I = 1 TO VAL(Dice$)
    Roll = INT(RND(1) * VAL(Sides$)) + 1
    X$ = CHR$(13) + CHR$(10) + "   Die" + STR$(I) + " Showed" + STR$(Roll)
    TotalRoll = TotalRoll + Roll
    FOR J = 1 TO LEN(X$)
        SendChar Port, Sent, Present, MID$(X$, J, 1), Reg
        PrintCon MID$(X$, J, 1), Reg
    NEXT
    PRINT #Grey, RIGHT$(X$, LEN(X$) - 2)
NEXT
X$ = CHR$(13) + CHR$(10) + "   Total Rolled Was" + STR$(TotalRoll)
PRINT #Grey, RIGHT$(X$, LEN(X$) - 2)
PRINT #Grey, SPACE$(10)
FOR J = 1 TO LEN(X$)
      SendChar Port, Sent, Present, MID$(X$, J, 1), Reg
      PrintCon MID$(X$, J, 1), Reg
NEXT
SendChar Port, Sent, Present, CHR$(13), Reg
X$ = CHR$(13) + CHR$(10) + "  Press any key."
FOR J = 1 TO LEN(X$)
      SendChar Port, Sent, Present, MID$(X$, J, 1), Reg
      PrintCon MID$(X$, J, 1), Reg
NEXT
DO
      GetChar Port, Good, InBound$, Present, Reg
      IF Good THEN PrintCon InBound$, Reg
LOOP UNTIL Good Quit:
END

'This door in not error trapped one of you Guys might do better!

SUB CheckPortStatus (Port, Info, Reg AS RegType)

' ah = &H03     Fossil Function Number - Status
' al = &H00     Place Holder
' dx = Communications port number       (0-3)
Reg.dx = Port
Reg.ax = &H300
Interrupt &H14, Reg, Reg

IF (Reg.ax AND &H80) <> 0 THEN Info = (Info OR &H1)
' carrier detect present ?
IF (Reg.ax AND &H100) <> 0 THEN Info = (Info OR &H2)
' buffer has data?
IF (Reg.ax AND &H200) <> 0 THEN Info = (Info OR &H4)
' Was buffer overun?
IF (Reg.ax AND &H4000) = 0 THEN Info = (Info OR &H8)
' output buffer data ?
IF (Reg.ax AND &H2000) = 0 THEN Info = (Info OR &H10)
' Is output buffer overrun?
END SUB
>>> Continued to next message

 * OLX 2.1 TD * Colston & Associates, Inc. 501-452-2928 or 501-785-2208
Outer Court
Echo Basic Postings

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