'===========================================================================
' Subject: MOUSE POINTER FOR SCREEN 13        Date: 03-17-98 (13:44)       
'  Author: Warren Seyle                       Code: QBasic                 
'  Origin: wseyle@awod.com                  Packet: MOUSE.ABC
'===========================================================================
DECLARE SUB PutMouse (mx%, my%)
DECLARE SUB About ()
DECLARE SUB AboutPal ()
DECLARE SUB Background ()
DECLARE SUB DrawButton (Text$, Col%, Row%, DrawFlag%)
DECLARE SUB DrawPanel (W.X%, W.Y%, W.W%, W.H%, Border%)
DECLARE SUB GetMouseCord (Btn%, M3%, M4%)
DECLARE SUB GPRINT (Text$, x%, Y%, StepX%, StepY%, Colr%, BckGround%, Shadow%)
DECLARE SUB HideMouse ()
DECLARE SUB Interrupt (IntNum AS INTEGER, Regs AS ANY)
DECLARE SUB LoadImages ()
DECLARE SUB MainPal ()
DECLARE SUB Qbasic (x AS INTEGER, Y AS INTEGER)
DECLARE SUB ShowMouse ()

DECLARE FUNCTION MouseInstalled% ()

CONST False = 0, True = NOT False
CONST Down = 0, Up = 1
CONST LightGray = 26, DarkGray = 39, White = 255
CONST Red = 254, Blue = 253, Yellow = 252, Green = 211
CONST NoBorder = 0, Border = 1
CONST NoShadow = 0, Shadow = 1


DIM SHARED AboutClick AS INTEGER, QuitClick AS INTEGER
DIM SHARED EndCol AS INTEGER, EndRow AS INTEGER
DIM SHARED Pointer(163) AS INTEGER
DIM SHARED PointerMask(163) AS INTEGER
DIM SHARED PointerBack(201) AS INTEGER
DIM SHARED GrayBall(910) AS INTEGER
DIM SHARED MouseOk AS INTEGER
DEFINT A-Z

TYPE RegType
     Ax    AS INTEGER
     bx    AS INTEGER
     Cx    AS INTEGER
     Dx    AS INTEGER
     BP    AS INTEGER
     SI    AS INTEGER
     DI    AS INTEGER
     FLAGS AS INTEGER
     DS    AS INTEGER
     ES    AS INTEGER
END TYPE
DIM SHARED Regs AS RegType

REDIM SHARED Intrpt(1 TO 50) AS INTEGER
RESTORE InterruptData
DEF SEG = VARSEG(Intrpt(1))
Address = VARPTR(Intrpt(1))
FOR I = 0 TO 99
    READ OpCode
    POKE Address + I, OpCode
NEXT

MouseOk = MouseInstalled%
   IF MouseOk THEN
      PRINT "Mouse installed ok"
   ELSE
      PRINT "No mouse.": END
   END IF

AbotuClick = False: QuitClick = False


SCREEN 13
CLS
HideMouse
MainPal
LoadImages

InputLoop:
Background
'Draw panel with border
DrawPanel 60, 50, 140, 100, Border
'draw two buttons
DrawButton "Quit", 30, 51, Up
DrawButton "About", 30, 80, Up

GPRINT "LONG LIVE", 73, 63, 13, 0, Red, Black, Shadow

Qbasic 83, 75
GPRINT "Freeware mouse", 73, 95, 8, 0, Blue, Black, Shadow
GPRINT "routines for", 80, 105, 8, 0, Blue, Black, Shadow
GPRINT "SCREEN 13!", 90, 120, 8, 0, Yellow, Black, Shadow



'Mouse input loop
Mouse.X% = 320 / 2: Mouse.Y% = 100
PutMouse Mouse.X%, Mouse.Y%
ShowMouse
DO
    'set mouse boundaries so the pointer
    'won't wander off screen
   IF Mouse.Y% > 181 THEN Mouse.Y% = 181
   IF Mouse.X% > 302 THEN Mouse.X% = 302
   IF Mouse.Y% < 3 THEN Mouse.Y% = 3
   IF Mouse.X% < 3 THEN Mouse.X% = 3

 
    'Get temp background
   GET ((Mouse.X% - 1), Mouse.Y%)-((Mouse.X% - 1) + 18, Mouse.Y% + 18), PointerBack
    'Lay down the mask
   PUT ((Mouse.X% - 1), Mouse.Y%), PointerMask, AND
    'Overlap with pointer
   PUT ((Mouse.X% - 1), Mouse.Y%), Pointer, OR
   'wait for Vertical retrace
   WAIT &H3DA, 8
   'Restore BackGround
    PUT ((Mouse.X% - 1), Mouse.Y%), PointerBack, PSET
'get mouse location and status
'if Btn% = 1 then left button is pushed
'if Btn% = 2 then right button is pushed
'if Btn% = 3 then both buttons have been pushed

GetMouseCord Btn%, Mouse.X%, Mouse.Y%
'convert x to screen 13 coordinates
Mouse.X% = Mouse.X% \ 2
'Left mouse button pressed...
IF Btn% = 1 THEN
    'check to see if Quit is clicked
   IF Mouse.X% > 233 AND Mouse.Y% > 52 THEN
      IF Mouse.X% < 278 AND Mouse.Y% < 68 THEN
         DrawButton "Quit", 30, 51, Down
         QuitClick = True
      END IF
   END IF
   'check to if About was clicked
   IF Mouse.X% > 233 AND Mouse.Y% > 81 THEN
      IF Mouse.X% < 288 AND Mouse.Y% < 98 THEN
         DrawButton "About", 30, 80, Down
         AboutClick = True
      END IF
   END IF
END IF

LOOP UNTIL QuitClick OR AboutClick
IF QuitClick THEN
   HideMouse
   SCREEN 0
   CLS
   END
ELSEIF AboutClick THEN
   HideMouse
   About
END IF



InterruptData:
DATA 85,139,236,86,87,30,139,118,6,139,4,139,92,2
DATA 139,76,4,139,84,6,139,108,8,139,124,12,142,68,18
DATA 255,116,10,131,124,18,255,117,2,30,7,131,124,16,255
DATA 116,3,142,92,16,94,205,33,85,139,236,30,86,142,94,2,139,118,14
DATA 137,4,137,92,2,137,76,4,137,84,6,143,68,10,143,68,16
DATA 143,68,8,137,124,12,140,68,18,156,143,68,14
DATA 95,95,94,93,202,2,0

PointerImage:
DATA 184,184,184,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
DATA 184,168,134,184,184,000,000,000,000,000,000,000,000,000,000,000,000,000
DATA 184,255,051,157,143,184,184,184,000,000,000,000,000,000,000,000,000,000
DATA 184,060,051,051,157,157,143,060,184,184,000,000,000,000,000,000,000,000
DATA 000,184,051,051,051,157,051,168,157,047,184,184,000,000,000,000,000,000
DATA 000,184,077,051,051,051,051,051,034,051,146,174,184,184,000,000,000,000
DATA 000,000,184,051,051,051,051,051,027,034,143,145,174,174,184,184,000,000
DATA 000,000,184,051,051,051,051,051,146,113,151,132,132,132,132,132,184,000
DATA 000,000,184,040,051,124,124,123,174,134,132,132,132,132,132,132,047,184
DATA 000,000,000,184,124,034,062,174,174,132,132,132,132,132,132,132,132,184
DATA 000,000,000,184,142,143,174,134,174,132,047,047,022,132,132,132,132,184
DATA 000,000,000,000,184,054,112,174,132,132,047,060,113,113,132,132,075,184
DATA 000,000,000,000,184,113,113,132,132,132,132,022,157,157,113,047,184,000
DATA 000,000,000,000,184,132,132,132,132,132,132,132,174,157,157,002,184,000
DATA 000,000,000,000,000,184,047,132,132,132,132,132,060,174,051,076,075,184
DATA 000,000,000,000,000,000,184,074,132,132,075,184,184,184,047,132,132,184
DATA 000,000,000,000,000,000,000,184,184,184,184,000,000,000,184,184,184,000
DATA 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000


BackgroundImage:
DATA 233,231,231,231,233,216,232,230,230,231,231,233,233,231,232,232,231,232,231,233,232,231,230,232,231,231,233,231,232,230,231,231,233,232,230,231,232,231,231,215,215,232,230,231,232,232,233,232,232,232,231,233,215,233,231,232,233,233,233,215,232,231,207,207
DATA 233,232,221,221,223,224,223,216,218,216,219,218,219,221,223,223,221,218,218,239,219,216,216,218,220,224,223,223,216,233,216,218,220,219,218,223,218,215,219,223,218,215,219,215,220,219,216,221,233,216,216,216,221,223,221,239,221,221,239,239,221,219,207,205
DATA 232,233,240,221,240,239,218,218,216,219,218,218,218,219,221,239,218,221,221,239,218,216,218,223,221,223,223,233,218,207,231,231,231,207,218,221,221,221,218,224,218,219,216,219,218,215,218,221,215,233,233,215,218,219,219,223,216,223,218,221,221,223,205,205
DATA 232,215,239,223,221,220,224,240,239,215,218,223,221,239,218,239,224,221,218,239,221,239,223,239,239,221,218,218,215,221,220,224,223,232,210,207,216,218,221,221,219,219,216,223,218,218,218,239,233,233,215,233,218,219,219,223,224,219,233,215,221,216,207,205
DATA 233,218,239,223,223,220,223,221,219,218,221,225,239,223,221,240,218,218,218,224,219,239,219,218,221,218,218,215,218,239,239,224,218,233,231,231,205,203,239,219,221,218,218,219,219,219,218,218,216,233,233,233,221,218,218,218,218,215,233,215,218,216,207,203
DATA 233,215,221,216,218,221,221,223,219,218,223,240,239,239,221,224,218,219,218,220,223,221,218,232,215,215,233,218,221,225,223,221,239,221,218,232,230,207,230,203,215,215,219,219,215,215,218,223,218,218,233,215,224,218,215,215,218,215,215,218,221,224,205,207
DATA 233,231,218,215,219,233,221,224,221,218,218,221,219,221,218,240,215,218,220,218,218,218,231,232,233,216,220,239,239,225,239,221,221,218,219,233,233,230,207,205,203,215,218,223,215,218,224,239,216,233,232,218,218,219,218,218,218,218,221,223,223,218,203,205
DATA 232,230,221,218,218,219,218,219,216,221,221,216,219,218,218,240,221,218,216,221,219,218,231,221,232,221,223,219,225,226,225,239,218,219,221,216,231,232,207,207,205,218,221,216,239,223,219,223,215,218,218,221,221,218,221,219,219,223,223,218,218,218,205,205
DATA 232,230,221,221,223,240,239,223,220,223,239,216,218,219,224,221,218,223,218,215,223,233,233,233,216,224,216,218,241,225,221,224,219,219,226,218,215,232,207,207,205,230,218,220,221,216,216,219,216,218,219,223,218,219,220,218,219,216,215,215,233,233,203,207
DATA 231,231,218,223,239,221,219,224,239,223,221,218,218,223,239,216,219,223,216,215,231,218,215,232,218,221,216,215,218,240,224,216,233,215,216,232,232,232,230,207,205,205,205,216,216,216,233,218,218,218,218,221,216,223,216,239,218,218,215,232,218,221,205,205
DATA 231,231,221,224,219,218,218,239,239,216,239,218,221,218,219,218,220,218,232,215,231,216,233,232,221,215,233,233,223,219,221,218,218,218,233,232,231,230,207,207,205,203,207,218,218,233,219,219,221,220,219,219,221,218,216,218,215,215,216,219,219,240,207,207
DATA 233,233,219,219,218,216,215,218,218,218,239,218,215,219,215,221,239,218,216,216,233,233,232,215,218,232,233,218,216,233,215,219,215,216,232,232,230,207,205,205,205,205,207,216,215,223,221,223,219,218,220,223,219,221,223,218,218,218,221,221,239,221,205,230
DATA 215,232,224,239,239,216,218,220,224,220,215,233,216,215,218,221,219,216,221,223,232,230,232,218,232,231,231,231,232,231,215,216,215,215,232,230,203,205,202,207,205,207,207,215,233,221,218,239,218,216,233,215,221,216,218,221,221,223,221,239,223,216,207,207
DATA 232,231,223,223,221,215,221,223,221,224,216,215,215,216,221,240,239,239,219,221,232,231,215,233,205,230,230,230,230,230,232,232,231,231,207,203,202,203,203,205,205,207,205,218,218,216,218,218,219,215,215,221,220,218,223,239,239,221,221,218,215,216,205,205
DATA 215,233,219,215,221,218,221,219,218,221,218,219,218,218,216,223,224,221,221,218,221,231,233,232,232,205,230,207,207,207,230,230,207,205,229,202,229,202,205,205,205,205,216,216,218,215,220,221,215,223,215,218,220,218,221,224,223,223,221,215,215,215,207,205
DATA 215,215,215,218,239,218,215,219,218,215,218,221,223,239,221,220,223,219,216,224,224,221,232,231,233,232,232,203,203,203,205,205,202,229,229,201,207,207,207,205,207,218,215,215,215,218,218,221,220,219,221,219,218,216,218,223,221,223,221,233,232,218,205,203
DATA 233,218,216,223,224,233,233,219,220,221,223,223,223,221,223,216,215,233,215,216,224,223,221,221,233,232,232,233,233,201,201,228,201,228,205,205,205,205,205,219,218,216,216,216,215,216,221,219,221,219,239,220,216,215,218,219,221,221,221,215,216,233,205,203
DATA 215,216,215,223,219,215,216,223,219,223,221,219,221,223,233,219,215,215,219,221,223,221,223,223,223,239,216,216,218,224,223,218,233,218,223,224,223,218,223,221,218,218,218,218,218,216,219,223,223,221,224,223,218,223,223,223,240,220,218,216,216,216,205,203
DATA 233,232,228,201,201,228,228,228,229,201,228,228,228,228,228,228,228,228,228,201,228,228,228,228,228,228,228,228,201,228,228,228,228,228,201,201,201,228,201,228,201,201,228,228,228,228,228,228,228,229,229,228,228,228,228,201,201,201,201,228,201,201,207,203
DATA 233,201,228,228,201,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,201,201,201,228,228,228,228,201,201,201,201,228,228,228,228,201,228,228,228,201,228,228,201,201,228,228,228,228,228,201,228,201,228,228,228,228,228,201,201,203

SUB About
DIM OkClick AS INTEGER
OkClick = False

HideMouse
CLS
AboutPal
Background
DrawPanel 60, 30, 195, 130, Border
GPRINT "I wanted to create a", 73, 43, 8, 0, Yellow, Black, Shadow
GPRINT "mouse pointer that", 73, 53, 8, 0, Yellow, Black, Shadow
GPRINT "would not corrupt the", 73, 63, 8, 0, Yellow, Black, Shadow
GPRINT "background in", 100, 73, 8, 0, Yellow, Black, Shadow

GPRINT "SCREEN 13", 100, 83, 13, 0, Green, Black, Shadow

GPRINT "This is the result.", 73, 93, 8, 0, Blue, Black, Shadow
GPRINT "Please use and modify", 73, 103, 8, 0, Blue, Black, Shadow
GPRINT "any way you wish", 93, 113, 8, 0, Blue, Black, Shadow
GPRINT "and use in your", 93, 123, 8, 0, Blue, Black, Shadow
GPRINT "own QBASIC programs.", 73, 133, 8, 0, Blue, Black, Shadow
DrawButton "OK", 19, 160, Up


Mouse.X% = 160: Mouse.Y% = 100
PutMouse Mouse.X%, Mouse.Y%
ShowMouse
DO
    'set mouse boundaries so the pointer
    'won't wander off screen
   IF Mouse.Y% > 181 THEN Mouse.Y% = 181
   IF Mouse.X% > 302 THEN Mouse.X% = 302
   IF Mouse.Y% < 3 THEN Mouse.Y% = 3
   IF Mouse.X% < 3 THEN Mouse.X% = 3


    'Get temp background
   GET ((Mouse.X% - 1), Mouse.Y%)-((Mouse.X% - 1) + 18, Mouse.Y% + 18), PointerBack
    'Lay down the mask
   PUT ((Mouse.X% - 1), Mouse.Y%), PointerMask, AND
    'Overlap with pointer
   PUT ((Mouse.X% - 1), Mouse.Y%), Pointer, OR
   'wait for Vertical retrace
   WAIT &H3DA, 8
   'Restore BackGround
    PUT ((Mouse.X% - 1), Mouse.Y%), PointerBack, PSET
'get mouse location and status
'if Btn% = 1 then left button is pushed
'if Btn% = 2 then right button is pushed
'if Btn% = 3 then both buttons have been pushed

GetMouseCord Btn%, Mouse.X%, Mouse.Y%
'convert x to screen 13 coordinates
Mouse.X% = Mouse.X% \ 2
'Left mouse button pressed...
IF Btn% = 1 THEN
    'check to see if Ok is clicked
   IF Mouse.X% > 145 AND Mouse.Y% > 151 THEN
      IF Mouse.X% < 170 AND Mouse.Y% < 176 THEN
         DrawButton "OK", 19, 160, Down
         OkClick = True
      END IF
   END IF
END IF
LOOP UNTIL OkClick
END SUB

SUB AboutPal
PALETTE 201, 16128

'colors used
PALETTE 228, 15
PALETTE 201, 16
PALETTE 229, 17
PALETTE 243, 18
PALETTE 202, 19
PALETTE 203, 20
PALETTE 205, 22
PALETTE 207, 24
PALETTE 234, 25
PALETTE 210, 26
PALETTE 230, 27
PALETTE 231, 29
PALETTE 232, 31
PALETTE 233, 33
PALETTE 215, 35
PALETTE 216, 37
PALETTE 218, 38
PALETTE 219, 39
PALETTE 220, 40
PALETTE 221, 42
PALETTE 223, 43
PALETTE 224, 45
PALETTE 239, 47
PALETTE 240, 49
PALETTE 225, 51
PALETTE 226, 58
PALETTE 241, 63

END SUB

DEFSNG A-Z
SUB Background
FOR Col% = 0 TO 319 STEP 64
FOR Row% = 0 TO 199 STEP 20

PUT (Col%, Row%), GrayBall, PSET
NEXT
NEXT

END SUB

DEFINT A-Z
SUB DrawButton (Text$, Col%, Row%, DrawFlag%)
HideMouse
StartCol% = (Col% - 1) * 8
EndCol% = StartCol% + (LEN(Text$) * 10) + 5
StartRow% = Row%
EndRow% = Row% + 19
LINE (StartCol%, StartRow% + 2)-(EndCol%, EndRow% - 2), LightGray, BF
    IF DrawFlag% THEN
       Color1% = White: Color2% = DarkGray
    ELSE
       Color1% = DarkGray: Color2% = White
    END IF
yb = (EndCol% - StartCol%) + 1
DRAW "C" + STR$(Color1%) + "BM" + STR$(StartCol%) + "," + STR$(StartRow% + 1) + "d15u15R" + STR$(yb)
DRAW "C" + STR$(Color2%) + "BM" + STR$(StartCol%) + "," + STR$(EndRow% - 2) + "R" + STR$(yb) + "U15"
GPRINT Text$, StartCol% + 3, StartRow% + 5, 10, 0, White, LightGray, 1
ShowMouse

END SUB

SUB DrawPanel (W.X%, W.Y%, W.W%, W.H%, Border%) STATIC

COLOR White
LINE (W.X% + W.W%, W.Y%)-(W.X%, W.Y%): LINE -(W.X%, W.Y% + W.H%)
LINE (W.X% + W.W% - 1, W.Y% + 1)-(W.X% + 1, W.Y% + 1)
LINE -(W.X% + 1, W.Y% + W.H% - 1)
COLOR DarkGray
LINE (W.X% + 1, W.Y% + W.H%)-(W.X% + W.W%, W.Y% + W.H%)
LINE -(W.X% + W.W%, W.Y%)
LINE (W.X% + 2, W.Y% + W.H% - 1)-(W.X% + W.W% - 1, W.Y% + W.H% - 1)
LINE -(W.X% + W.W% - 1, W.Y% + 1)
LINE (W.X% + 2, W.Y% + 2)-(W.X% + W.W% - 2, W.Y% + W.H% - 2), LightGray, BF

IF Border% THEN
 COLOR DarkGray
  LINE (W.X% + W.W% - 10, W.Y% + 10)-(W.X% + 10, W.Y% + 10)
  LINE -(W.X% + 10, W.Y% + W.H% - 10)
  COLOR White
  LINE -(W.X% + W.W% - 10, W.Y% + W.H% - 10)
  LINE -(W.X% + W.W% - 10, W.Y% + 10)

END IF

END SUB

SUB GetMouseCord (Btn%, M3%, M4%)
Regs.Ax% = 3
CALL Interrupt(&H33, Regs)
M3% = Regs.Cx%
M4% = Regs.Dx%
Btn% = Regs.bx%

END SUB

SUB GPRINT (Text$, x%, Y%, StepX%, StepY%, Colr%, BckGround%, Shadow%)
'Don't destroy StepX and StepY.
    ExtX% = StepX%: ExtY% = StepY%
            DEF SEG = &HFFA6        'ROM segment for character shape tables
             FOR I% = 1 TO LEN(Text$)
              Addr% = 8 * ASC(MID$(Text$, I%)) + 14     'Address character shape table

        IF BckGround% THEN                    'Color background
            '---- Backgrounds equal to 256 are really color zero.
            IF BckGround% = 256 THEN
               Bg% = False
            ELSE
               Bg% = BckGround%
            END IF

            '---- Prevent coloring background beyond range of string.
            IF I% = LEN(Text$) THEN
               ExtX% = False: ExtY% = False
            END IF

            'Box and paint a background for the character.
            LINE (x%, Y%)-(x% + 7 + ExtX%, Y% + 7 + ExtY%), Bg%, BF
        END IF
    
        FOR J% = 0 TO 7
            'Peek 1 scan line from the table at a time,
            'then shift bits left 8 places
            Mask% = PEEK(Addr% + J%) * 128

        'If shadow then displace line by 2 pixels and draw with black style mask
            IF Shadow% THEN
                LINE (x% + 9, Y% + J% + 2)-(x% + 2, Y% + J% + 2), 0, , Mask%
            END IF

       'Draw the masked line with the assigned color attribute
            LINE (x% + 7, Y% + J%)-(x%, Y% + J%), Colr%, , Mask%
        NEXT

        'INC x% and y% by values ExtX% and ExtY%
        x% = x% + ExtX%
        Y% = Y% + ExtY%
    NEXT
    DEF SEG

END SUB

SUB HideMouse
Regs.Ax% = 2
CALL Interrupt(&H33, Regs)

END SUB

SUB Interrupt (IntNum AS INTEGER, Regs AS RegType)

  DEF SEG = VARSEG(Intrpt(1))
  Address = VARPTR(Intrpt(1))
  POKE Address + 51, IntNum
                              
  CALL ABSOLUTE(Regs, Address)

END SUB

DEFSNG A-Z
SUB LoadImages
RESTORE PointerImage
FOR R% = 0 TO 17
FOR C% = 0 TO 17
READ p%
PSET (C%, R%), p%
NEXT: NEXT
GET (0, 0)-(17, 17), Pointer

LINE (0, 0)-(17, 17), 255, BF
RESTORE PointerImage
FOR R% = 0 TO 17
FOR C% = 0 TO 17
READ p%
IF p% <> 210 AND p% <> 0 THEN
PSET (C%, R%), 0
END IF
NEXT: NEXT
GET (0, 0)-(17, 17), PointerMask
CLS

RESTORE BackgroundImage
FOR R% = 0 TO 19
FOR C% = 0 TO 63
READ p%
PSET (C%, R%), p%
NEXT: NEXT
GET (0, 0)-(63, 19), GrayBall
CLS


END SUB

SUB MainPal
PALETTE 0, 0
PALETTE 1, 197380
PALETTE 2, 1049092
PALETTE 3, 1114886
PALETTE 4, 1180680
PALETTE 5, 1246474
PALETTE 6, 1312268
PALETTE 7, 1378062
PALETTE 8, 1443856
PALETTE 9, 1509650
PALETTE 10, 2582
PALETTE 11, 2839
PALETTE 12, 3096
PALETTE 13, 3353
PALETTE 14, 3610
PALETTE 15, 3867
PALETTE 16, 4124
PALETTE 17, 4381
PALETTE 18, 4638
PALETTE 19, 4895

PALETTE 20, 855587
PALETTE 21, 1315864
PALETTE 22, 2691603
PALETTE 23, 3546909
PALETTE 24, 921106
PALETTE 25, 657956
PALETTE 26, 2368553
PALETTE 27, 4143668
PALETTE 28, 3151390
PALETTE 29, 2822686
PALETTE 30, 3613477
PALETTE 31, 3217442
PALETTE 32, 1969687
PALETTE 33, 3616815
PALETTE 34, 4142642
PALETTE 35, 2691613
PALETTE 36, 1579550
PALETTE 37, 263173
PALETTE 38, 4006931
PALETTE 39, 1184278
PALETTE 40, 2495006
PALETTE 41, 4011313
PALETTE 42, 723478
PALETTE 43, 1908021
PALETTE 44, 3283730
PALETTE 45, 4143650
PALETTE 46, 4007451
PALETTE 47, 2560016
PALETTE 48, 921104
PALETTE 49, 2888738
PALETTE 50, 657961
PALETTE 51, 3941156
PALETTE 52, 3152422
PALETTE 53, 1973553
PALETTE 54, 3616045
PALETTE 55, 1513500
PALETTE 56, 2236982
PALETTE 57, 657932
PALETTE 58, 3216932
PALETTE 59, 3546918
PALETTE 60, 2757911
PALETTE 61, 789551
PALETTE 62, 3415070
PALETTE 63, 1315622
PALETTE 64, 1775400
PALETTE 65, 3813938
PALETTE 66, 2428944
PALETTE 67, 2560790
PALETTE 68, 1710878
PALETTE 69, 921620
PALETTE 70, 1578789
PALETTE 71, 3810066
PALETTE 72, 4075051
PALETTE 73, 3546145
PALETTE 74, 1050630
PALETTE 75, 1445129
PALETTE 76, 1973798
PALETTE 77, 3151898
PALETTE 78, 1970193
PALETTE 79, 2828075

PALETTE 80, 10812   '237
PALETTE 81, 10300   '238
PALETTE 82, 9788    '239
PALETTE 83, 9276    '240
PALETTE 84, 8764    '241
PALETTE 85, 8252    '242
PALETTE 86, 7740    '243
PALETTE 87, 7228    '244
PALETTE 88, 6716    '245
PALETTE 89, 6204    '246
PALETTE 90, 5692    '247
PALETTE 91, 5180    '248
PALETTE 92, 4668    '249
PALETTE 93, 4156    '250
PALETTE 94, 3644    '251
PALETTE 95, 3132    '252
PALETTE 96, 2620    '253
PALETTE 116, 4883
PALETTE 117, 6168
PALETTE 118, 9252
PALETTE 119, 12336
PALETTE 120, 15420



PALETTE 101, 3486776
PALETTE 102, 2560028
PALETTE 103, 3881788
PALETTE 104, 460572
PALETTE 105, 2823952
PALETTE 106, 4076066
PALETTE 107, 2102282
PALETTE 108, 2560530
PALETTE 109, 4076335
PALETTE 110, 1905941
PALETTE 111, 4141357
PALETTE 112, 3284006
PALETTE 113, 3151640
PALETTE 114, 3677973
PALETTE 115, 3546923
PALETTE 121, 657959
PALETTE 122, 1053206
PALETTE 123, 2954775
PALETTE 124, 4073509
PALETTE 125, 1579058
PALETTE 126, 2499634
PALETTE 127, 2954272
PALETTE 128, 66050
PALETTE 129, 3480359
PALETTE 130, 1447967
PALETTE 131, 2428955
PALETTE 132, 2757652
PALETTE 133, 2563082
PALETTE 134, 2889755
PALETTE 135, 1050891
PALETTE 136, 3879727
PALETTE 137, 3745324
PALETTE 138, 1184790
PALETTE 139, 2627113
PALETTE 140, 2236202
PALETTE 141, 2888741
PALETTE 142, 4139290
PALETTE 143, 3743778
PALETTE 144, 3151399
PALETTE 145, 3349270
PALETTE 146, 3611678
PALETTE 147, 1379599
PALETTE 148, 3419698
PALETTE 149, 1316376
PALETTE 150, 657963
PALETTE 151, 3152412
PALETTE 152, 657947
PALETTE 153, 394778
PALETTE 154, 4144184
PALETTE 155, 4138260
PALETTE 156, 3349028
PALETTE 157, 3743773
PALETTE 158, 2697527
PALETTE 159, 526859
PALETTE 160, 4141351
PALETTE 161, 4144956
PALETTE 162, 2232091
PALETTE 163, 2894640
PALETTE 164, 1052456
PALETTE 165, 4139802
PALETTE 166, 2233109
PALETTE 167, 3679529
PALETTE 168, 4009261
PALETTE 169, 2231822
PALETTE 170, 1444631
PALETTE 171, 3875613
PALETTE 172, 2232593
PALETTE 173, 3282982
PALETTE 174, 3085846
PALETTE 175, 1184302
PALETTE 176, 2297903
PALETTE 177, 2429744
PALETTE 178, 2496050
PALETTE 179, 2627891
PALETTE 180, 3156013
PALETTE 181, 3287599
PALETTE 182, 3353905
PALETTE 183, 3485491
PALETTE 184, 0
PALETTE 185, 24
PALETTE 186, 32
PALETTE 187, 2088
PALETTE 188, 4136
PALETTE 189, 6192
PALETTE 190, 7220
PALETTE 191, 7992
PALETTE 192, 1321771
PALETTE 193, 995376
PALETTE 194, 603702
PALETTE 195, 277307
PALETTE 196, 3544876
PALETTE 197, 3743281
PALETTE 198, 3941685
PALETTE 199, 4140090
PALETTE 200, 0
PALETTE 211, 16128
'colors used
PALETTE 228, 15 * 256 + 15
PALETTE 201, 16 * 256 + 16
PALETTE 229, 17 * 256 + 17
PALETTE 243, 18 * 256 + 18
PALETTE 202, 19 * 256 + 19
PALETTE 203, 20 * 256 + 20
PALETTE 205, 22 * 256 + 22
PALETTE 207, 24 * 256 + 24
PALETTE 234, 25 * 256 + 25
PALETTE 210, 26 * 256 + 25
PALETTE 230, 27 * 256 + 27
PALETTE 231, 29 * 256 + 29
PALETTE 232, 31 * 256 + 31
PALETTE 233, 33 * 256 + 33
PALETTE 215, 35 * 256 + 35
PALETTE 216, 37 * 256 + 37
PALETTE 218, 38 * 256 + 38
PALETTE 219, 39 * 256 + 39
PALETTE 220, 40 * 256 + 40
PALETTE 221, 42 * 256 + 42
PALETTE 223, 43 * 256 + 43
PALETTE 224, 45 * 256 + 45
PALETTE 239, 47 * 256 + 47
PALETTE 240, 49 * 256 + 49
PALETTE 225, 51 * 256 + 51
PALETTE 226, 58 * 256 + 58
PALETTE 241, 63 * 256 + 63
PALETTE 252, 16191
PALETTE 253, 4128768
PALETTE 254, 63
PALETTE 255, 4144959
END SUB

DEFINT A-Z
FUNCTION MouseInstalled%
'returns -1 if mouse installed, 0 if not
    Regs.Ax = 0
    CALL Interrupt(51, Regs)
    MouseInstalled% = Regs.Ax

END FUNCTION

SUB PutMouse (mx%, my%)
        Regs.Ax% = 4
        Regs.Cx% = mx%
        Regs.Dx% = my%
        CALL Interrupt(&H33, Regs)
END SUB

SUB Qbasic (x AS INTEGER, Y AS INTEGER)
'Q
PSET (x + 2, Y), 120: PSET (x + 3, Y), 119
LINE (x + 4, Y)-(x + 14, Y), 118
LINE (x + 3, Y + 1)-(x + 13, Y + 1), 95
PSET (x + 2, Y + 1), 119: PSET (x, Y + 2), 120: PSET (x + 1, Y + 2), 119
PSET (x + 2, Y + 2), 118: LINE (x + 3, Y + 2)-(x + 13, Y + 2), 94
PSET (x, Y + 3), 119: LINE (x + 1, Y + 3)-(x + 15, Y + 3), 93
LINE (x, Y + 4)-(x, Y + 12), 118
LINE (x + 1, Y + 4)-(x + 5, Y + 4), 92: LINE (x + 11, Y + 4)-(x + 15, Y + 4), 92
LINE (x + 1, Y + 5)-(x + 5, Y + 5), 91: LINE (x + 11, Y + 5)-(x + 15, Y + 5), 91
LINE (x + 1, Y + 6)-(x + 5, Y + 6), 90: LINE (x + 11, Y + 6)-(x + 15, Y + 6), 90
LINE (x + 1, Y + 7)-(x + 5, Y + 7), 89: LINE (x + 11, Y + 7)-(x + 15, Y + 7), 89
LINE (x + 1, Y + 8)-(x + 5, Y + 8), 88: LINE (x + 11, Y + 8)-(x + 15, Y + 8), 88
LINE (x + 1, Y + 9)-(x + 15, Y + 9), 87
LINE (x + 1, Y + 10)-(x + 15, Y + 10), 86
LINE (x + 1, Y + 11)-(x + 15, Y + 11), 85
LINE (x + 3, Y + 12)-(x + 13, Y + 12), 84
LINE (x + 3, Y + 13)-(x + 15, Y + 13), 83
LINE (x + 9, Y + 14)-(x + 15, Y + 14), 82
LINE (x + 9, Y + 15)-(x + 15, Y + 15), 81
PSET (x + 1, Y + 12), 117: PSET (x + 2, Y + 12), 116
LINE (x + 2, Y + 13)-(x + 2, Y + 14), 118: PSET (x + 3, Y + 14), 117
LINE (x + 4, Y + 14)-(x + 8, Y + 14), 116
LINE (x + 8, Y + 15)-(x + 8, Y + 16), 118
PSET (x + 9, Y + 16), 117: LINE (x + 10, Y + 16)-(x + 16, Y + 16), 116
LINE -(x + 16, Y + 4), 116: PSET (x + 16, Y + 13), 117
LINE (x + 14, Y + 12)-(x + 15, Y + 12), 116
PSET (x + 16, Y + 3), 117: LINE (x + 15, Y + 2)-(x + 16, Y + 2), 118
PSET (x + 14, Y + 2), 116: PSET (x + 14, Y + 1), 117
LINE (x + 6, Y + 10)-(x + 6, Y + 4), 116: LINE -(x + 10, Y + 4), 116
LINE (x + 10, Y + 5)-(x + 10, Y + 8), 118: LINE -(x + 8, Y + 8), 118
PSET (x + 7, Y + 8), 119: PSET (x + 10, Y + 9), 117
PSET (x + 10, Y + 10), 116
'B
x = x + 18
LINE (x + 1, Y + 1)-(x + 13, Y + 1), 95
LINE (x + 1, Y + 2)-(x + 13, Y + 2), 94
LINE (x + 1, Y + 3)-(x + 15, Y + 3), 93
LINE (x + 3, Y + 4)-(x + 15, Y + 4), 92
LINE (x + 3, Y + 5)-(x + 15, Y + 5), 91
LINE (x + 3, Y + 6)-(x + 15, Y + 6), 90
LINE (x + 3, Y + 7)-(x + 15, Y + 7), 89
LINE (x + 3, Y + 8)-(x + 15, Y + 8), 88
LINE (x + 3, Y + 9)-(x + 15, Y + 9), 87
LINE (x + 3, Y + 10)-(x + 15, Y + 10), 86
LINE (x + 3, Y + 11)-(x + 15, Y + 11), 85
LINE (x + 3, Y + 12)-(x + 15, Y + 12), 84
LINE (x + 1, Y + 13)-(x + 15, Y + 13), 83
LINE (x + 1, Y + 14)-(x + 13, Y + 14), 82
LINE (x + 1, Y + 15)-(x + 13, Y + 15), 81
PSET (x, Y), 120: PSET (x + 1, Y), 119: LINE (x + 2, Y)-(x + 14, Y), 118
PSET (x, Y + 1), 119: LINE (x, Y + 2)-(x, Y + 4), 118
PSET (x + 1, Y + 4), 117: PSET (x + 2, Y + 4), 116
LINE (x + 2, Y + 5)-(x + 2, Y + 12), 118: PSET (x + 1, Y + 12), 119
PSET (x, Y + 12), 120: PSET (x, Y + 13), 119
LINE (x, Y + 14)-(x, Y + 16), 118: PSET (x + 1, Y + 16), 117
LINE (x + 2, Y + 16)-(x + 14, Y + 16), 116: LINE -(x + 14, Y + 14), 116
LINE -(x + 16, Y + 14), 116: LINE -(x + 16, Y + 4), 116
LINE (x + 14, Y + 8)-(x + 15, Y + 8), 116: PSET (x + 16, Y + 9), 117
PSET (x + 16, Y + 3), 117: LINE (x + 16, Y + 2)-(x + 15, Y + 2), 118
PSET (x + 14, Y + 2), 116: PSET (x + 14, Y + 1), 117
LINE (x + 8, Y + 6)-(x + 8, Y + 4), 116: LINE -(x + 10, Y + 4), 116
LINE (x + 8, Y + 12)-(x + 8, Y + 10), 116: LINE -(x + 10, Y + 10), 116
LINE (x + 10, Y + 5)-(x + 10, Y + 6), 118: LINE -(x + 9, Y + 6), 118
LINE (x + 10, Y + 11)-(x + 10, Y + 12), 118: LINE -(x + 9, Y + 12), 118
PSET (x + 9, Y + 5), 0: PSET (x + 9, Y + 11), 0
'a
x = x + 18: Y = Y + 4
PSET (x + 2, Y), 120: PSET (x + 3, Y), 119
LINE (x + 4, Y)-(x + 12, Y), 118: PSET (x + 2, Y + 1), 119
LINE (x + 3, Y + 1)-(x + 11, Y + 1), 91: PSET (x + 12, Y + 1), 117
LINE (x + 2, Y + 2)-(x + 2, Y + 6), 118: PSET (x + 2, Y + 5), 119
LINE (x + 3, Y + 2)-(x + 11, Y + 2), 90: PSET (x + 3, Y + 4), 117
LINE (x + 3, Y + 3)-(x + 13, Y + 3), 89
LINE (x + 9, Y + 4)-(x + 13, Y + 4), 88
LINE (x + 3, Y + 5)-(x + 13, Y + 5), 87
LINE (x + 3, Y + 6)-(x + 13, Y + 6), 86
LINE (x + 1, Y + 7)-(x + 13, Y + 7), 85
LINE (x + 1, Y + 8)-(x + 13, Y + 8), 84
LINE (x + 1, Y + 9)-(x + 15, Y + 9), 83
LINE (x + 3, Y + 10)-(x + 15, Y + 10), 82
LINE (x + 3, Y + 11)-(x + 15, Y + 11), 81
LINE (x + 4, Y + 4)-(x + 8, Y + 4), 116
PSET (x + 2, Y + 5), 119: PSET (x + 1, Y + 6), 119
PSET (x, Y + 6), 120: PSET (x, Y + 7), 119
LINE (x, Y + 8)-(x, Y + 10), 118: PSET (x + 1, Y + 10), 117
PSET (x + 2, Y + 10), 116: LINE (x + 2, Y + 11)-(x + 2, Y + 12), 118
PSET (x + 3, Y + 12), 117: LINE (x + 4, Y + 12)-(x + 16, Y + 12), 116
LINE -(x + 16, Y + 10), 116: PSET (x + 11, Y + 12), 117
PSET (x + 16, Y + 9), 117: LINE (x + 16, Y + 8)-(x + 15, Y + 8), 118
LINE (x + 14, Y + 8)-(x + 14, Y + 4), 116: PSET (x + 14, Y + 3), 117
LINE (x + 14, Y + 2)-(x + 13, Y + 2), 118
PSET (x + 12, Y + 2), 116: LINE (x + 6, Y + 8)-(x + 8, Y + 8), 116
LINE (x + 10, Y + 11)-(x + 10, Y + 10), 116
's
x = x + 18
LINE (x + 3, Y + 1)-(x + 13, Y + 1), 91
LINE (x + 3, Y + 2)-(x + 13, Y + 2), 90
LINE (x + 1, Y + 3)-(x + 13, Y + 3), 89
LINE (x + 1, Y + 4)-(x + 5, Y + 4), 88
LINE (x + 1, Y + 5)-(x + 9, Y + 5), 87
LINE (x + 3, Y + 6)-(x + 9, Y + 6), 86
LINE (x + 3, Y + 7)-(x + 13, Y + 7), 85
LINE (x + 7, Y + 8)-(x + 13, Y + 8), 84
LINE (x + 1, Y + 9)-(x + 13, Y + 9), 83
LINE (x + 1, Y + 10)-(x + 11, Y + 10), 82
LINE (x + 1, Y + 11)-(x + 11, Y + 11), 81
PSET (x + 2, Y), 120: PSET (x + 3, Y), 119
LINE (x + 4, Y)-(x + 14, Y), 118: PSET (x + 2, Y + 1), 119
PSET (x + 2, Y + 2), 118: PSET (x + 1, Y + 2), 119: PSET (x, Y + 2), 120
LINE (x, Y + 4)-(x, Y + 6), 118: PSET (x, Y + 3), 119
PSET (x + 1, Y + 6), 117: PSET (x + 2, Y + 6), 116
LINE (x + 2, Y + 7)-(x + 2, Y + 8), 118
LINE (x + 4, Y + 8)-(x + 6, Y + 8), 116
PSET (x + 3, Y + 8), 117: PSET (x + 1, Y + 8), 119
PSET (x, Y + 8), 120: PSET (x, Y + 9), 119
LINE (x, Y + 10)-(x, Y + 12), 118: PSET (x + 1, Y + 12), 117
LINE (x + 2, Y + 12)-(x + 12, Y + 12), 116: LINE -(x + 12, Y + 10), 116
LINE -(x + 14, Y + 10), 116: LINE -(x + 14, Y + 8), 116
PSET (x + 14, Y + 7), 117: LINE (x + 14, Y + 6)-(x + 11, Y + 6), 118
PSET (x + 10, Y + 6), 116: PSET (x + 10, Y + 5), 117
LINE (x + 6, Y + 4)-(x + 14, Y + 4), 116
LINE -(x + 14, Y + 2), 116: PSET (x + 14, Y + 1), 117
   x = x + 14: Y = Y - 4
    LINE (x + 5, Y + 1)-(x + 9, Y + 1), 95
    LINE (x + 5, Y + 2)-(x + 9, Y + 2), 94
    LINE (x + 5, Y + 3)-(x + 9, Y + 3), 93
    LINE (x + 3, Y + 5)-(x + 9, Y + 5), 91
    LINE (x + 3, Y + 6)-(x + 9, Y + 6), 90
    LINE (x + 3, Y + 7)-(x + 9, Y + 7), 89
LINE (x + 5, Y + 8)-(x + 9, Y + 8), 88
LINE (x + 5, Y + 9)-(x + 9, Y + 9), 87
LINE (x + 5, Y + 10)-(x + 9, Y + 10), 86
LINE (x + 5, Y + 11)-(x + 9, Y + 11), 85
LINE (x + 5, Y + 12)-(x + 9, Y + 12), 84
LINE (x + 3, Y + 13)-(x + 11, Y + 13), 83
LINE (x + 3, Y + 14)-(x + 11, Y + 14), 82
LINE (x + 3, Y + 15)-(x + 11, Y + 15), 81
PSET (x + 4, Y), 120: PSET (x + 5, Y), 119
LINE (x + 6, Y)-(x + 10, Y), 118: PSET (x + 4, Y + 1), 119
LINE (x + 4, Y + 2)-(x + 4, Y + 4), 118: PSET (x + 5, Y + 4), 117
LINE (x + 6, Y + 4)-(x + 10, Y + 4), 116
PSET (x + 2, Y + 4), 120: PSET (x + 3, Y + 4), 119: PSET (x + 2, Y + 5), 119
LINE (x + 2, Y + 6)-(x + 2, Y + 8), 118: PSET (x + 3, Y + 8), 117
PSET (x + 4, Y + 8), 116: LINE (x + 4, Y + 9)-(x + 4, Y + 12), 118
PSET (x + 2, Y + 12), 120: PSET (x + 3, Y + 12), 119
PSET (x + 2, Y + 13), 119: LINE (x + 2, Y + 14)-(x + 2, Y + 16), 118
PSET (x + 3, Y + 16), 117: LINE (x + 4, Y + 16)-(x + 12, Y + 16), 116
LINE -(x + 12, Y + 14), 116: PSET (x + 12, Y + 13), 117
LINE (x + 12, Y + 12)-(x + 11, Y + 12), 118
LINE (x + 10, Y + 12)-(x + 10, Y + 6), 116
PSET (x + 10, Y + 5), 117
'c
x = x + 14: Y = Y + 4
LINE (x + 3, Y + 1)-(x + 11, Y + 1), 91
LINE (x + 3, Y + 2)-(x + 11, Y + 2), 90
LINE (x + 1, Y + 3)-(x + 13, Y + 3), 89
LINE (x + 1, Y + 4)-(x + 13, Y + 4), 88
LINE (x + 1, Y + 5)-(x + 13, Y + 5), 87
LINE (x + 1, Y + 6)-(x + 5, Y + 6), 86
LINE (x + 1, Y + 7)-(x + 13, Y + 7), 85
LINE (x + 1, Y + 8)-(x + 13, Y + 8), 84
LINE (x + 1, Y + 9)-(x + 13, Y + 9), 83
LINE (x + 3, Y + 10)-(x + 11, Y + 10), 82
LINE (x + 3, Y + 11)-(x + 11, Y + 11), 81
PSET (x + 2, Y), 120: PSET (x + 3, Y), 119
LINE (x + 4, Y)-(x + 12, Y), 118: PSET (x + 2, Y + 1), 119
PSET (x + 2, Y + 2), 118: PSET (x + 1, Y + 2), 119
PSET (x, Y + 2), 120: PSET (x, Y + 3), 119
LINE (x, Y + 4)-(x, Y + 10), 118
PSET (x + 1, Y + 10), 117: PSET (x + 2, Y + 10), 116
LINE (x + 2, Y + 11)-(x + 2, Y + 12), 118: PSET (x + 3, Y + 12), 117
LINE (x + 4, Y + 12)-(x + 12, Y + 12), 116: LINE -(x + 12, Y + 10), 116
LINE -(x + 14, Y + 10), 116: LINE -(x + 14, Y + 4), 116
PSET (x + 14, Y + 7), 117: LINE (x + 13, Y + 6)-(x + 10, Y + 6), 116
PSET (x + 9, Y + 6), 117: LINE (x + 6, Y + 8)-(x + 6, Y + 4), 116
LINE -(x + 8, Y + 4), 116: LINE (x + 8, Y + 5)-(x + 8, Y + 8), 118
LINE -(x + 7, Y + 8), 118: PSET (x + 8, Y + 7), 119
LINE (x + 7, Y + 7)-(x + 7, Y + 5), 0: PSET (x + 14, Y + 3), 117
LINE (x + 14, Y + 2)-(x + 13, Y + 2), 118: PSET (x + 12, Y + 2), 116
PSET (x + 12, Y + 1), 117
END SUB

SUB ShowMouse
Regs.Ax% = 1
CALL Interrupt(&H33, Regs)

END SUB
