'===========================================================================
' Subject: MOUSE PAINT                        Date: Unknown Date           
'  Author: Chad Beck                          Code: QB, PDS                
'  Origin: FidoNet QUIK_BAS Echo            Packet: MOUSE.ABC
'===========================================================================
  DEFINT A-Z
  '$INCLUDE: 'qb.bi'
  DIM SHARED Registers AS RegType

  CONST GridSize = 8, BoxSize = GridSize - 2
  CONST GridColr = 8
  DrawingColr = 4                       'Selected drawing color #
  Colr = DrawingColr                    'Toggles black & DrawingColr

'Initialize the mouse
  Registers.AX = 0
  CALL Interrupt(&H33, Registers, Registers)

'Drawing grid
  SCREEN 12
  FOR X = 110 TO 500 STEP GridSize
    LINE (X, 2)-(X, 386), GridColr
    LINE (110, X - 108)-(494, X - 108), GridColr
  NEXT

'Set horizontal boundaries
  Registers.AX = 7
  Registers.CX = 0                      'Registers.CX = 112
  Registers.DX = 620                    'Registers.DX = 495
  CALL Interrupt(&H33, Registers, Registers)

'Set vertical boundaries
  Registers.AX = 8
  Registers.CX = 1
  Registers.DX = 452                    'Registers.DX = 382
  CALL Interrupt(&H33, Registers, Registers)

  DO
  'Show the mouse cursor
    Registers.AX = 1
    CALL Interrupt(&H33, Registers, Registers)
Top:
    DO
    'Get mouse location and status:
      'If Registers.BX=1 then left button is pushed
      'If Registers.BX=2 then right button is pushed
      'If Registers.BX=3 then both buttons have been pushed

      Registers.AX = 3
      CALL Interrupt(&H33, Registers, Registers)

      OldButtons = Buttons              'Save previous button state
      Buttons = Registers.BX
    LOOP UNTIL Buttons = 1              'Wait for left button

    OldX = Xo: OldY = Yo                'Save previous coordinates
    X = Registers.CX
    Y = Registers.DX

    Xo = (X \ GridSize) * GridSize - 1  'Adjust for odd grid placement
    Yo = (Y \ GridSize) * GridSize + 3

  'If the cursor or buttons haven't changed then do nothing
    IF (OldX - Xo) + (OldY - Yo) + (OldButtons - Buttons) = 0 THEN
      GOTO Top:
    END IF
    IF POINT(Xo, Yo) = Colr THEN Colr = Colr XOR DrawingColr

  'Painting routine
    Registers.AX = 2                    'Hide the mouse cursor
    CALL Interrupt(&H33, Registers, Registers)
    LINE (Xo, Yo)-STEP(BoxSize, BoxSize), Colr, BF
    PSET ((Xo \ GridSize), (Yo \ GridSize)), Colr

  LOOP
