'===========================================================================
' Subject: Design House Rafters               Date: 09-15-02 (  :  )       
'  Author: Roger Oxford                       Code: QB, Qbasic, PDS, PB    
'  Origin: r.oxfordjr@worldnet.att.net      Packet: ALGOR.ABC
'===========================================================================
''' qb45 program WITH DOS 5.0 FOR THE SAKE OF GRAPHICS.COM IN C:\DOS
'''    (PLEASE READ DOCUMENTATION A THE TOP OF MOUSE PROGRAM, LINE 17000)
REM ** THE 8.20A MOUSE ROUTINE AT THE END OF THIS PROGRAM IS SPLINDID AND
REM ** RETURNS A WEALTH OF INFORMATION. IT CAN EASILY BE COPIED TO
REM ** ANOTHER QB45 PROGRAM IN NEED OF A MOUSE ROUTINE (GOSUB 17000).
REM ** YOU NEED GRAPHICS.COM IN DOS DIR. ; RUN IN DOS MODE OR < = W95;
REM ** YOU CAN USE HP PRINTER IF YOU HAVE 600 TO 800 SERIES, MAYBE AND
REM ** IF THE DOS PRINTER DRIVER DISK 3 VER 9.03 (FOR W95 AND 3.1).
REM ** ONLY THE VARIABLES IN UPPER LEFT FOLLOWED BY ! SHOULD BE MOUSED!!!
REM ** ATN(0F A TANGENT)=RADIANS BUT RADS*57.2958 DEGREES/RAD=DEGREES....!!
REM ** START PGM WITH BAT FILE...QB/RUN ROOF/AH/L QBMOUSE..to invoke mouse

SCREEN 12: COLUMNS = 80: ROWS = 60
WIDTH COLUMNS, ROWS
VIEW (5, 5)-(635, 475)
COL = 15: COLOR 15
PALETTE 0, 65536 * 60
PRINT TAB(10); "LET'S COMPUTE THE RAFTERS FOR A ROOF - COMMON AND HIP AND JACKS."
PRINT : PRINT
PRINT "  THESE CHOICES ARE TO PREPARE FOR SHIFT+PRINT SCREEN AT THE END OF THE PGM. "
PRINT
M1% = 0: GOSUB 15000: IF M1% = 0 THEN BEEP: PRINT "MOUSE NOT LOADED": PRINT
INPUT "S=PRINT ON 8 1/2 X 11 PAPER  B=PRINT ON LEDGER PAPER  HP=HEWLETT PACKARD"; C$
REM ** IF GRAPHICS.COM GIVES PROBLEMS THEN SKIP IT, BUT DO IT IN AUTOEXEC.BAT
REM ** THIS DOS 5 COMMAND WILL NOT LOAD IN W98, BUT WILL LOAD IN W95 OR LOWER.
REM ** TO ENJOY SHIFT+PRTSCRN, RUN IN DOS OR W95 OR LOWER.
IF UCASE$(C$) = "B" THEN SHELL "C:\DOS\GRAPHICS GRAPHICSWIDE"
IF UCASE$(C$) = "S" THEN SHELL "C:\DOS\GRAPHICS GRAPHICS"
IF UCASE$(C$) = "HP" THEN SHELL "C:\DOS\GRAPHICS DESKJET"
FOR K = 1 TO 6
LOCATE K, 1: PRINT SPACE$(80)
NEXT K
LOCATE 1, 15: INPUT "PROJECT NAME "; PN$: LOCATE 1, 45: BEEP: PRINT ; "MAKE ALL ENTRIES IN INCHES "
LOCATE 2, 2: INPUT "ROOF PITCH          "; P!
LOCATE 3, 2: INPUT "BUILDING WIDTH      "; BS!
LOCATE 4, 2: INPUT "BUILDING LENGTH     "; BL!
LOCATE 5, 2: INPUT "WIDTH RAFTER STOCK  "; RW!
LOCATE 6, 2: INPUT "WIDTH OF R.B.       "; RBW!
LOCATE 7, 2: INPUT "RIDGEBEAM THICKNESS "; RBT!
LOCATE 8, 2: INPUT "EVE OVERHANG        "; EOH!
LOCATE 9, 2: INPUT "GABEL EVE           "; GOH!
LOCATE 10, 2: INPUT "SEAT ON BIRDSMOUTH "; SEAT!
LOCATE 11, 2: INPUT "SUBFACIA+FACIA     "; SFF!
LOCATE 12, 2: INPUT "CENTER SPACING     "; CS!
LOCATE 13, 2: INPUT "HIP RAFTER THICK   "; HRT!
LOCATE 14, 2: INPUT "WIDTH OF HIP RAFTER  "; WHIP!
COL = 15

25 CLS

RISE! = (BS! / 2) * (P! / 12)
X = BS! + (2 * EOH!) + .2 * (BS!)
Y = 3 * RISE!
CX = X / 2
CY = Y / 2
WINDOW (0, 0)-(X, Y)

REM ** WINDOW WASH
FOR K = 1 TO 60: LOCATE K, 2: PRINT SPACE$(80): NEXT K

50
REM** TOP PLATE
LINE (CX - (BS! / 2), CY)-(CX + (BS! / 2), CY - 4), COL, B
LINE (CX - (BS! / 2), CY - 2)-(CX + (BS! / 2), CY - 2), COL
LINE (CX - (BS! / 2), CY)-(CX - (BS! / 2), CY - 10), COL
LINE (CX + (BS! / 2), CY)-(CX + (BS! / 2), CY - 10), COL
LINE (CX - (BS! / 2) + 4, CY)-(CX - (BS! / 2) + 4, CY - 10): REM LEFT STUD WALL
LINE (CX + (BS! / 2) - 4, CY)-(CX + (BS! / 2) - 4, CY - 10): REM RIGHT STUD WALL
REM ** RB SUPPORT POST + length side cut
LSC! = ((BS! / 2) / RISE!): REM TAN OF HIGH ANGLE B
UNK! = RW! / LSC!
LSC! = SQR(RW! ^ 2 + UNK! ^ 2)
HEAL! = (RISE! / (BS! / 2)): REM TAN OF LOW ANGLE A
HEAL! = SEAT! * HEAL!
VABM! = LSC! - HEAL!
POST! = ((((BS! / 2) - (RBT! / 2)) / 12) * P!) + VABM! - RBW!
TRB! = POST! + RBW!

LINE (CX - 1, CY)-(CX + 1, CY + POST!), COL, B: REM **POST
LINE (CX + 1, CY + POST!)-(CX - 1, CY + POST! + RBW!), COL, B: REM **R.B.

REM ** RAFTERS
OHR! = (EOH! / 12) * P!
REM **LEFT RAFTER
LINE (CX - 1, CY + POST! + RBW!)-(CX - (BS! / 2) - EOH!, CY - OHR! + VABM!), COL
LINE (CX - (BS! / 2) - EOH!, CY - OHR! + VABM!)-(CX - (BS! / 2) - EOH!, CY - OHR! + VABM! - LSC!), COL
LINE (CX - (BS! / 2) - EOH!, CY - OHR! + VABM! - LSC!)-(CX - 1, CY + POST! + RBW! - LSC!), COL
REM ** RIGHT RAFTER
LINE (CX + 1, CY + POST! + RBW!)-(CX + (BS! / 2) + EOH!, CY - OHR! + VABM!), COL
LINE (CX + (BS! / 2) + EOH!, CY - OHR! + VABM!)-(CX + (BS! / 2) + EOH!, CY - OHR! + VABM! - LSC!), COL
LINE (CX + (BS! / 2) + EOH!, CY - OHR! + VABM! - LSC!)-(CX + 1, CY + POST! + RBW! - LSC!), COL
HRB! = (BL! - BS!) + RBT!
ARB! = BL! + (2 * GOH!) - (2 * SFF!)
TCR! = SQR(((BS! / 2 + EOH!) ^ 2) + (RISE! + OHR!) ^ 2)
HRUN! = (BS! / 2 + EOH!) * (16.97 / 12)
THR! = SQR(HRUN! ^ 2 + (RISE! + OHR!) ^ 2)
HMUL! = THR! / TCR!

REM ** COMMON RAFTER
UNK! = (P! * (RBT! / 2)) / 12
CRLC! = SQR(UNK! ^ 2 + (RBT! / 2) ^ 2)
CRL! = (SQR((BS! / 2) ^ 2 + RISE! ^ 2)): REM - CRLC!

REM ** COMMON RAFTER OVERHANG
UNK! = (P! * SFF!) / 12
CROLC! = SQR(UNK! ^ 2 + SFF! ^ 2)
CROL! = (SQR(EOH! ^ 2 + OHR! ^ 2)): REM - CROLC!

REM ** ROOF DRIP AREA
RDA! = ((ARB! + (2 * SFF!)) * (BS! + (2 * EOH!))) / 144

REM ** ROOF SURFACE AREA
RA! = (SQR(1 + (P! / 12) ^ 2)) * RDA!

REM ** HIP RAFTER LENGTH
RHIP! = ((BS! / 2) * 16.97) / 12: LET HIPRUN! = RHIP!
HALF! = (SQR(RBT! ^ 2 + RBT! ^ 2)) / 2
UNK! = (P! * HALF!) / 16.97
HRLC! = SQR(UNK! ^ 2 + HALF! ^ 2)
HRL! = (SQR(RHIP! ^ 2 + RISE! ^ 2)): REM ** - HRLC!

REM ** HIP RAFTER OVERHANG LENGTH
RHIP! = (EOH! * 16.97) / 12
SFFT! = SQR(SFF! ^ 2 + SFF! ^ 2)
UNK! = (P! * SFFT!) / 16.97
HROLC! = SQR(UNK! ^ 2 + SFFT! ^ 2)
HROL! = (SQR(RHIP! ^ 2 + OHR! ^ 2)): REM **- HROLC!

REM ** FIRST SIDE MARK AND OTHER SIDE MARKS DOWN THE TOP OF HIP
OSM! = HRL! / ((BS! / 2) / CS!)
FSM! = OSM! - HRLC

REM ** PLUMB CUT DEGREE OF HIP RAFTER
LET PCDEGHIP! = ATN(HIPRUN! / RISE!)
LET PCDEGHIP! = PCDEGHIP! * 57.2958

REM ** PLUMB CUT DEGREE OF COMMON RAFTER
LET PCDEGCR! = ATN((BS! / 2) / RISE!)
LET PCDEGCR! = PCDEGCR! * 57.2958

REM ** SIDE CUT ANGLE FOR JACKS
LET LONGSIDE! = ((HRL! / ((BS! / 2) / 1.5))) ^ 2
LET JACKS! = LONGSIDE! - (1.5) ^ 2
LET JACKS! = (JACKS!) ^ .5
LET SCDEGJACKS! = ATN(1.5 / JACKS!): REM SAW SET= 90-SCDEGJACKS
LET SCDEGJACKS! = 57.2958 * SCDEGJACKS!

REM** COMMON DIFERENCE OF JACKS
CD! = SQR(OSM! ^ 2 - CS! ^ 2)

REM ** DROP ON SEAT OF HIP RAFTER
DROP! = (P! * (HRT! / 2)) / 16.97

REM ** HALF 45 DEG HIP RAFTER THICKNESS
HHALF! = SQR(2 * HRT! ^ 2) / 2

REM ** SLAB AREA +1 INCH
SLAB! = (BS! + 2) * (BL! + 2) / 144

LOCATE 1, 22: PRINT "PROJECT NAME "; PN$
LOCATE 2, 4: PRINT "GIVEN :"
LOCATE 3, 2: PRINT "ROOF PITCH          = "; USING "###.##"; P!; : PRINT " P!"
LOCATE 4, 4: PRINT "BUILDING WIDTH    = "; USING "###.##"; BS!; : PRINT " BS!"
LOCATE 5, 4: PRINT "BUILDING LENGTH   = "; USING "###.##"; BL!; : PRINT " BL!"
LOCATE 6, 4: PRINT "WIDTH RAFTER STOCK= "; USING "###.##"; RW!; : PRINT " RW!"
LOCATE 7, 4: PRINT "O.C. SPACING      = "; USING "###.##"; CS!; : PRINT " CS!"
LOCATE 8, 4: PRINT "B.M. SEAT         = "; USING "###.##"; SEAT!; : PRINT " SEAT!"
LOCATE 9, 4: PRINT "R.B. WIDTH        = "; USING "###.##"; RBW!; : PRINT " RBW!"
LOCATE 10, 4: PRINT "R.B. THICKNESS   = "; USING "###.##"; RBT!; : PRINT " RBT!"
LOCATE 11, 4: PRINT "HIP RAFTER THICK = "; USING "###.##"; HRT!; : PRINT " HRT!"
LOCATE 12, 4: PRINT "EVE OVERHANG     = "; USING "###.##"; EOH!; : PRINT " EOH!"
LOCATE 13, 4: PRINT "GABEL EVE        = "; USING "###.##"; GOH!; : PRINT " GOH!"
LOCATE 14, 4: PRINT "SUBFACIA + FACIA = "; USING "###.##"; SFF!; : PRINT " SFF!"
LOCATE 15, 4: PRINT "WIDTH HIP RAFTER = "; USING "###.##"; WHIP!; : PRINT " WHIP!"

LOCATE 5, 45: PRINT "45D H. T.(SUBF+F) = "; USING "###.##"; SFFT!
LOCATE 6, 45: PRINT "R.B. POST         = "; USING "###.##"; POST!
LOCATE 7, 45: PRINT "TOP OF R.B.       = "; USING "###.##"; TRB!
LOCATE 8, 45: PRINT "SCHOOL HOUSE RISE = "; USING "###.##"; RISE!
LOCATE 9, 45: PRINT "A-FRAME R.B.-SF-F = "; USING "###.##"; ARB!
LOCATE 10, 45: PRINT "B.M. HEAL         = "; USING "###.##"; HEAL!

LOCATE 43, 2: PRINT "DEGREES :";
LOCATE 44, 2: PRINT "PLUM DEG COMM RAFT 90 -"; INT(PCDEGCR! * 100) / 100; "="; USING "##.##"; (90 - PCDEGCR!); : PRINT CHR$(248)

LOCATE 47, 2: PRINT "THEORETICAL COM RAFTER     = "; USING "###.##"; TCR!
LOCATE 48, 4: PRINT "UP + 1/2 H. R.B.T.      = "; USING "###.##"; CRL!
LOCATE 49, 4: PRINT "TAIL + H. T.(SF + F)    = "; USING "###.##"; CROL!
LOCATE 50, 4: PRINT "FINISHED LENGTH         = "; USING "###.##"; CRL! + CROL! - CRLC! - CROLC!
LOCATE 51, 4: PRINT "ROOF DRIP AREA SQ FT    = "; USING "####.##"; RDA!
LOCATE 52, 4: PRINT "ROOF AREA      SQ FT    = "; USING "####.##"; RA!
LOCATE 53, 4: PRINT "SLAB AREA+INCH SQ FT    = "; USING "####.##"; SLAB!
LOCATE 54, 4: PRINT "V.A.B.M                 = "; USING "###.##"; VABM!
LOCATE 55, 4: PRINT "LENGTH PLUMB CUT C. RAF = "; USING "##.##"; LSC!

LOCATE 44, 42: PRINT "SAW SET JACKS 90 -"; INT(SCDEGJACKS! * 100) / 100; " ="; USING "##.##"; (90 - SCDEGJACKS!); : PRINT CHR$(248)
LOCATE 45, 42: PRINT "PLUM CUT OF HIP 90 -"; INT(PCDEGHIP! * 100) / 100; " ="; USING "##.##"; (90 - PCDEGHIP!); : PRINT CHR$(248)

LOCATE 47, 42: PRINT "THEORETICAL HIP RAFTER = "; USING "###.##"; THR!
LOCATE 48, 45: PRINT "UP + 1/2 H. 45D RBT = "; USING "###.##"; HRL!
LOCATE 49, 45: PRINT "TAIL + H.45D(SF+F)T.= "; USING "###.##"; HROL!
LOCATE 50, 45: PRINT "FINISHED LENGTH HIP = "; USING "###.##"; HRL! + HROL! - HRLC! - HROLC!
LOCATE 51, 45: PRINT "V.A.B.M. - DROP     = "; USING "###.##"; VABM! - DROP!
LOCATE 52, 45: PRINT "1/2 45D R.B.T.      = "; USING "###.##"; HALF!
LOCATE 53, 45: PRINT "1/2 45D HIP R.THICK = "; USING "###.##"; HHALF!
LOCATE 54, 45: PRINT "HIP ROOF R.B. LENTH = "; USING "###.##"; HRB!
LOCATE 55, 45: PRINT "1ST,NEXT H.R. LAYOFF= "; USING "##.## "; FSM!; OSM!
LOCATE 56, 45: PRINT "COMMON DIFF OF JACKS= "; USING "###.##"; CD!
LOCATE 57, 45: PRINT "LEN HIP PLUMB CUT = "; : LET PLACES = 2: LET RUNN = 17: LET WIDE = WHIP!: LET PITCH = P!: GOSUB 500

LOCATE 37, 2: PRINT "FOR WHAT ITS WORTH:";
LOCATE 38, 2: PRINT "PITCH = "; P!; "             ON 11.25 RAFTER"; "   ON 9.25 RAFTER"; "   ON 7.25 RAFTER";
LOCATE 39, 2: PRINT "LENGTH OF COMMON PLUMB  = "; : LET PLACES = 10: LET PITCH = P!: LET RUNN = 12: LET WIDE = 11.25: GOSUB 500: LET WIDE = 9.25: GOSUB 500: LET WIDE = 7.25: GOSUB 500
LOCATE 40, 2: PRINT "LENGTH OF HIP    PLUMB  = "; : LET PITCH = P!: LET RUNN = 17: LET WIDE = 11.25: GOSUB 500: LET WIDE = 9.25: GOSUB 500: LET WIDE = 7.25: GOSUB 500

400 GOSUB 17000: REM **** CALL THE MOUSE
IF LEN(WORD$) = 0 THEN GOTO 400
LOCATE 20, 2: PRINT WORD$;
LOCATE 21, 2: INPUT "NEW  VALUE"; NEWVALUE

IF WORD$ = "P!" THEN LET P! = NEWVALUE
IF WORD$ = "BS!" THEN LET BS! = NEWVALUE
IF WORD$ = "BL!" THEN LET BL! = NEWVALUE
IF WORD$ = "RW!" THEN LET RW = NEWVALUE
IF WORD$ = "CS!" THEN LET CS! = NEWVALUE
IF WORD$ = "SEAT!" THEN LET SEAT! = NEWVALUE
IF WORD$ = "RBW!" THEN LET RBW! = NEWVALUE
IF WORD$ = "RBT!" THEN LET RBT! = NEWVALUE
IF WORD$ = "HRT!" THEN LET HRT! = NEWVALUE
IF WORD$ = "EOH!" THEN LET EOH! = NEWVALUE
IF WORD$ = "GOH!" THEN LET GOH! = NEWVALUE
IF WORD$ = "SFF!" THEN LET SFF! = NEWVALUE
IF WORD$ = "WHIP!" THEN LET WHIP! = NEWVALUE
GOTO 25

END
500 LET A = (PITCH * WIDE) / RUNN
    LET A = A ^ 2 + WIDE ^ 2
    LET A = A ^ .5
    PRINT SPACE$(PLACES); USING "##.##"; A;
    RETURN
'mouse routine (DEVELOPED ON MICROSOFT MOUSE 8.20a, SHOULD RUN ON 6.26 OR LATER
'this part from here down will run by itself if copied to a seperate screen
REM ** ON SCREEN 0, LINE & WINDOW & VIEW STATEMENTS NOT ALLOWED!!
16995 CLS
SCREEN 11: REM ** MAKE CHANGES ON THESE FOUR LINES TO DETERMINE USABLE SCREENS
WIDTH 80, 60
LINE (0, 0)-(200, 200)
WINDOW (50, 50)-(689, 529)
LOCATE 4, 20: PRINT "HeL10 Ladies aND NERDS ?!@#$%^&*"
GOSUB 17000

LOCATE 6, 2: PRINT "RSS                 "; RSS
LOCATE 7, 2: PRINT "COLS                "; COLS
LOCATE 8, 2: PRINT "WORD$               "; WORD$
LOCATE 9, 2: PRINT "FIRSTLETTER (ASCII) "; FIRSTLETTER; ""
LOCATE 10, 2: PRINT "CHR$(FIRSTLETTER)  "; CHR$(FIRSTLETTER)
LOCATE 11, 2: PRINT "LEN(WORD$)          "; LEN(WORD$)
LOCATE 12, 2: PRINT "MAXX                    "; MAXX
LOCATE 13, 2: PRINT "MAXY                    "; MAXY
LOCATE 14, 2: PRINT "TROW OR YLINE%     "; TROW
LOCATE 15, 2: PRINT "TCOL OR XLINE%     "; TCOL
LOCATE 16, 2: PRINT "PHY COORD...LASTX             "; LASTX
LOCATE 17, 2: PRINT "PHY  COORD...LASTY            "; LASTY
LOCATE 18, 2: PRINT "# XPIXILS/CHAR..XPIX  "; XPIX
LOCATE 19, 2: PRINT "# YPIXILS/CHAR..YPIX  "; YPIX
ON ERROR GOTO 16996
LOCATE 20, 2: PRINT "X VIEW COORD...PMAP(LASTX,2)  "; : PRINT USING "###.##"; PMAP(LASTX, 2)
LOCATE 21, 2: PRINT "Y VIEW COORD...PMAP(LASTY,2)  "; : PRINT USING "###.##"; PMAP(LASTY, 2)
GOTO 16998

16996   BEEP: PRINT "ERROR": RESUME NEXT: PRINT

16998   M1% = 0: GOSUB 15000
LET JFG$ = "": REM BLOCK STUCK KEY!!
INPUT "HIT ENTER TO MOVE ON", JFG$
M1% = 4: M3% = LASTX: M4% = LASTY: GOSUB 15000: REM SET LAST POSITION
M1% = 1: GOSUB 15000
GOTO 16995

REM ** MOUSE 6.26 OR BETTER IS REQUIRED TO RUN AS SUPPLIED because of funct 38"
REM ** LINE DRAWN LAST AND OVER A WORD ERASES THE WORD TO CHR$(32)=EMPTY!!
REM ** SETTING A PIXEL TO "ON" ERASES THE LETTER POINTED TO!!
REM ** PGM NAME IS ALITERAT.BAS (A LITERATE MOUSE)
REM ** WIDTH COLUMNS, ROWS ::: LOCATE ROWS,COLUMNS
REM ** A RIGHT CLICK IS IMBEDDED IN THE DO LOOP TO QUIT..JUST REMOVE REM STATEMENT.
REM ** START PGM WITH BAT FILE...QB/RUN ????/AH/L QBMOUSE..to invoke mouse.
REM ** RUNS ON SCREEN 0-2 & 7-13 WITH PROPER WIDTH STATEMENTS OR NO WIDTH STATEMENT.

'when sub 17000 is complete these variables are returned to user:::
'physical coordinates of the last left mouse click.....lastx , lasty
'screen resolution (scale of physical coordinates)...0 to maxx
'     ex.. screen 12 = 639 X 479                  ...0 to maxy
'view coordinates for graphics    x = PMAP(lastx,2)
' (do it yourself!                y = PMAP(lasty,3)
'firstletter is the ascII value of the letter pointed to..
'                print chr$(firstletter)=the character..
'word$ is the string containing no spaces that was pointed to..
'len(word$)= # characters in the string..
'if len(word$)=0 then you missed what you clicked at!
'text   row    pointed to = TROW = YLINE%
'text   column pointed to = TCOL = XLINE%

15000 CALL MOUSE(M1%, M2%, M3%, M4%)

      RETURN

17000 REM ** figure # OF TEXT RSS,COLS
      COLS = 80
      ON ERROR GOTO 17020
      LOCATE 1, COLS: GOTO 17030
17020 LET COLS = 40: RESUME
17030 LET RSS = 60
17031 ON ERROR GOTO 17080
17036 LOCATE RSS, COLS
      GOTO 17200: REM ** IF MOUSE 6.26 OR LATER NOT AVAILABLE THEN GOTO 17250
                  REM ** VS LABLE 17200
17080 IF RSS = 60 THEN LET RSS = 50: RESUME
      IF RSS = 50 THEN LET RSS = 43: RESUME
      IF RSS = 43 THEN LET RSS = 30: RESUME
      IF RSS = 30 THEN LET RSS = 25: RESUME

17200  M1% = 38        'this function is available in mouse 6.26 and
      GOSUB 15000      'later. It works correctly on screen 0 and 1,2,7-13.
      LET MAXX = M3%   '17250 is a way to find screen resolution manually.
      LET MAXY = M4%   'Screen 0 is not correctly determined by 17250.
      GOTO 17400       'Screen 1,2,7-13 do work correctly in 17250.
  
17250 REM ** FIND SCREEN RESOLUTION the hard way if mouse 8.20a is not available
      LET MAXX = 719: LET MAXY = 347
      ON ERROR GOTO 17300
      VIEW (0, 0)-(MAXX, MAXY)
      GOTO 17400
17300 IF MAXX = 719 AND MAXY = 347 THEN LET MAXX = 639: MAXY = 479: RESUME
      IF MAXX = 639 AND MAXY = 479 THEN LET MAXY = 399: RESUME
      IF MAXX = 639 AND MAXY = 399 THEN LET MAXY = 349: RESUME
      IF MAXX = 639 AND MAXY = 349 THEN LET MAXY = 199: RESUME
      IF MAXX = 639 AND MAXY = 199 THEN LET MAXX = 319: MAXY = 199: RESUME

17400 LET XPIX = (MAXX + 1) / COLS: REM ** # X PIXLES / CHARACTER
      LET YPIX = (MAXY + 1) / RSS: REM ** # Y PIXLES / CHARACTER


17500 M1% = 1: GOSUB 15000: REM - MAKING MOUSE CURSOR VISIBLE

17600 DO
   LET JFG$ = INKEY$: REM BLOCK STUCK KEY
   M1% = 5: M2% = 0: GOSUB 15000
   IF M1% = 1 THEN LET LASTX = M3%: LET LASTY = M4%: M1% = 0: GOSUB 15000: GOTO 17800
   REM M1% = 5: M2% = 1: GOSUB 15000:REM ** CHECK ON RT BUTTON
   REM IF M2% = 1 THEN END: REM  **  RT. BUTTON QUIT
17700 LOOP

   REM THE M3&M4% USED BELOW ARE FROM THE MOST RECENT CALL OF M1%=5!!

17800 REM ** ACCURATE COLUMN AND ROW AIMING ***
    LET XLINE% = INT((LASTX + 1) / XPIX)
    IF (LASTX + 1) / XPIX > XLINE% THEN LET XLINE% = XLINE% + 1
    LET YLINE% = INT((LASTY + 1) / YPIX)
    IF (LASTY + 1) / YPIX > YLINE% THEN LET YLINE% = YLINE% + 1

17850 LET TROW = YLINE%: LET TCOL = XLINE%: LET HIT = 0
17860 LET MOA = SCREEN(YLINE%, XLINE%): LET FIRSTLETTER = MOA
    IF CHR$(MOA) <> CHR$(32) AND HIT = 0 THEN LET HIT = 1
17870 LET MOA = SCREEN(YLINE%, XLINE%)
    IF CHR$(MOA) = CHR$(32) THEN GOTO 17880
    LET XLINE% = XLINE% - 1: IF XLINE% >= 1 THEN GOTO 17870
17880 LET WORD$ = ""
17890 LET XLINE% = XLINE% + 1: IF XLINE% >= COLS + 1 THEN GOTO 17900
    LET MOA = SCREEN(YLINE%, XLINE%)
    IF CHR$(MOA) <> CHR$(32) AND HIT = 1 THEN LET WORD$ = WORD$ + CHR$(MOA): GOTO 17890
17900
   M1% = 4: M3% = LASTX: M4% = LASTY: GOSUB 15000: REM SET LAST POSITION
   M1% = 1: GOSUB 15000: REM TURN ON THE MOUSE
   RETURN

