'Biblioteca para uso do Mouse
'Claudio Eduardo Storti Lago
DECLARE SUB GraphButton (x1!, y1!, x2!, Y2!, Altura!, Texto$)
DECLARE SUB FontPrint (Xpos%, Ypos%, Scale%, Col%, Text$)
DECLARE SUB FontChr (Xpos%, Ypos%, Scale%, Col%, CharCode%)
DECLARE SUB MaxPosition (x1!, y1!, x2!, Y2 AS INTEGER)
DECLARE SUB Velocidade (Vel AS INTEGER)
DECLARE SUB MaxPositionAsc (Coluna1!, Linha1!, Coluna2!, Linha2 AS INTEGER)
DECLARE SUB PositionAsc (Coluna!, Linha AS INTEGER)
DECLARE SUB Position (Coluna!, Linha AS INTEGER)
DECLARE FUNCTION AreaAsc! (Coluna1!, Linha1!, Coluna2!, Linha2 AS INTEGER)
DECLARE SUB HideMou ()
DECLARE SUB DBotao (Texto AS STRING, x1!, y1!, x2!, Y2!, Altura AS INTEGER)
DECLARE SUB Botao (Texto AS STRING, x1!, y1!, x2!, Y2!, Altura AS INTEGER)
DECLARE FUNCTION BothButton! ()
DECLARE FUNCTION RButton! ()
DECLARE FUNCTION LButton! ()
DECLARE SUB ShowMou ()
DECLARE FUNCTION MouY% ()
DECLARE FUNCTION Area (x1, y1, x2, Y2 AS INTEGER)
DECLARE FUNCTION Button! (N AS INTEGER)
DECLARE FUNCTION MouX% ()
DECLARE SUB MouseOn ()
	
'$INCLUDE: 'qb.bi'
			
	DIM SHARED Entrada AS RegTypeX
	DIM SHARED Saida AS RegTypeX
			 
	CONST False = 0
	CONST True = NOT False

FUNCTION Area (x1, y1, x2, Y2 AS INTEGER)
					 
	IF (MouX% < x1) OR (MouX% > x2) OR (MouY% < y1) OR (MouY% > Y2) THEN
		Area = False
	ELSE
		Area = True
	END IF

END FUNCTION

FUNCTION AreaAsc (Coluna1, Linha1, Coluna2, Linha2 AS INTEGER)

	IF ((MouX / 8) + 1 < Coluna1) OR ((MouX / 8) + 1 > Coluna2) OR ((MouY / 8) + 1 < Linha1) OR ((MouY / 8) + 1 > Linha2) THEN
	AreaAsc = False
	ELSE
	AreaAsc = True
	END IF

END FUNCTION

SUB Botao (Texto AS STRING, x1, y1, x2, Y2, Altura AS INTEGER)
			
	FOR i = 1 TO Altura + 1
	LINE (x1 + i - 1, y1 + i - 1)-(x2 - i + 1, y1 + i - 1), 15
	LINE (x1 + i - 1, y1 + i - 1)-(x1 + i - 1, Y2 - i + 1), 15
	LINE (x1 + i - 1, Y2 - i + 1)-(x2 - i + 1, Y2 - i + 1), 8
	LINE (x2 - i + 1, y1 + i - 1)-(x2 - i + 1, Y2 - i + 1), 8
	PSET (x1 + i - 1, y1 + i - 1), 7
	PSET (x2 - i + 1, Y2 - i + 1), 0
	LINE (x1 + Altura, y1 + Altura)-(x2 - Altura, Y2 - Altura), 7, BF
	NEXT i
			 
	TamanhoAteX = x1 / 8
	TamanhoX1ateX2 = (x2 - x1) / 8

	TamanhoAteY = y1 / 16
	TamanhoY1ateY2 = (Y2 - y1) / 16

	LOCATE TamanhoAteY + (TamanhoY1ateY2 / 2), TamanhoAteX + (TamanhoX1ateX2 / 2)
	PRINT Texto

END SUB

FUNCTION BothButton

	BothButton = Button(3)

END FUNCTION

FUNCTION Button (N AS INTEGER)
						
	Entrada.ax = 5
	CALL InterruptX(&H33, Entrada, Saida)
	IF (Saida.ax AND N) = N THEN
		Button = True
	ELSE
		Button = False
	END IF

END FUNCTION

SUB DBotao (Texto AS STRING, x1, y1, x2, Y2, Altura AS INTEGER)
			 
	FOR i = 1 TO Altura + 1
	LINE (x1 + i - 1, y1 + i - 1)-(x2 - i + 1, y1 + i - 1), 8
	LINE (x1 + i - 1, y1 + i - 1)-(x1 + i - 1, Y2 - i + 1), 8
	LINE (x1 + i - 1, Y2 - i + 1)-(x2 - i + 1, Y2 - i + 1), 15
	LINE (x2 - i + 1, y1 + i - 1)-(x2 - i + 1, Y2 - i + 1), 15
	PSET (x1 + i - 1, y1 + i - 1), 7
	PSET (x2 - i + 1, Y2 - i + 1), 0
	LINE (x1 + Altura, y1 + Altura)-(x2 - Altura, Y2 - Altura), 7, BF
	NEXT i

	TamanhoAteX = x1 / 8
	TamanhoX1ateX2 = (x2 - x1) / 8

	TamanhoAteY = y1 / 16
	TamanhoY1ateY2 = (Y2 - y1) / 16

	LOCATE TamanhoAteY + (TamanhoY1ateY2 / 2), TamanhoAteX + (TamanhoX1ateX2 / 2)
	PRINT Texto

END SUB

SUB FontChr (Xpos%, Ypos%, Scale%, Col%, CharCode%)
'  This will draw standard 8x8 Font character.
'  Any scale size. Any color. Any position.
'  Position is determined by LOWER-LEFT corner of char.

	 DEF SEG = &HF000

	 Y% = Ypos%
	 FOR ScanLine% = 0 TO 7
			Y% = Ypos% - (Scale% * 8) + (ScanLine% * Scale%) + 1
			BitCode% = PEEK(&HFA6E + ScanLine% + CharCode% * 8)

			FOR Bits% = 0 TO 7
	 IF BitCode% > 127 THEN
			BitCode% = BitCode% - 128
			X% = Xpos% + (Bits% * Scale%)
			LINE (X%, Y%)-(X% + Scale% - 1, Y% + Scale% - 1), Col%, BF
	 END IF
	 BitCode% = BitCode% * 2
			NEXT Bits%
	 NEXT ScanLine%

	 DEF SEG

END SUB

SUB FontPrint (Xpos%, Ypos%, Scale%, Col%, Text$)
'  This will draw standard 8x8 Font Text.
'  Any scale size. Any color. Any position.
'  Position is determined by LOWER-LEFT corner of 1st char.

IF Scale% < 1 THEN Scale% = 1

FOR A% = 1 TO LEN(Text$)

	 CharCode% = ASC(MID$(Text$, A%, 1))
	 IF CharCode% < 0 OR CharCode% > 255 THEN CharCode% = 0
	 Xp% = Xpos% + ((A% - 1) * 8 * Scale%)
	 Yp% = Ypos% + (Scale% * 8)

	 CALL FontChr(Xp%, Yp%, Scale%, Col%, CharCode%)

NEXT A%

END SUB

SUB GraphButton (x1, y1, x2, Y2, Altura, Texto$)

	LINE (x1, y1)-(x2, Y2), 7, BF
	FOR i = 1 TO Altura
	LINE (x1 + i - 1, y1 + i - 1)-(x2 - i + 1, y1 + i - 1), 15
	LINE (x1 + i - 1, y1 + i - 1)-(x1 + i - 1, Y2 - i + 1), 15
	LINE (x1, y1)-(x1 + Altura, y1 + Altura), 7
	LINE (x1 + i - 1, Y2 - i + 1)-(x2 - i + 1, Y2 - i + 1), 8
	LINE (x2 - i + 1, y1 + i - 1)-(x2 - i + 1, Y2 - i + 1), 8
	LINE (x2, Y2)-(x2 - Altura + 1, Y2 - Altura + 1), 0
	NEXT

	InicioX% = (((x2 - x1) / 2 + x1)) - (INT(LEN(Texto$) * 8) / 2)
	MedioY% = (Y2 - y1) / 2 + y1 - 5
	CALL FontPrint(InicioX% + 2, MedioY% + 2, 1, 0, Texto$)
	CALL FontPrint(InicioX%, MedioY%, 1, 15, Texto$)
END SUB

SUB GraphButton2 (x1, y1, x2, Y2, Altura, Texto$)

	LINE (x1, y1)-(x2, Y2), 7, BF
	FOR i = 1 TO Altura
	LINE (x1 + i - 1, y1 + i - 1)-(x2 - i + 1, y1 + i - 1), 8
	LINE (x1 + i - 1, y1 + i - 1)-(x1 + i - 1, Y2 - i + 1), 8
	LINE (x1, y1)-(x1 + Altura, y1 + Altura), 0
	LINE (x1 + i - 1, Y2 - i + 1)-(x2 - i + 1, Y2 - i + 1), 15
	LINE (x2 - i + 1, y1 + i - 1)-(x2 - i + 1, Y2 - i + 1), 15
	LINE (x2, Y2)-(x2 - Altura + 1, Y2 - Altura + 1), 7
	NEXT

	InicioX% = (((x2 - x1) / 2 + x1)) - (INT(LEN(Texto$) * 8) / 2)
	MedioY% = (Y2 - y1) / 2 + y1 - 5
	CALL FontPrint(InicioX%, MedioY%, 1, 0, Texto$)
	CALL FontPrint(InicioX% + 2, MedioY% + 2, 1, 15, Texto$)
END SUB

SUB HideMou
			 
	Entrada.ax = 2
	CALL InterruptX(&H33, Entrada, Saida)

END SUB

FUNCTION LButton
						
	LButton = Button(1)
			
END FUNCTION

SUB MaxPosition (x1, y1, x2, Y2 AS INTEGER)

	Entrada.ax = 7
	Entrada.cx = x1
	Entrada.DX = x2
	CALL InterruptX(&H33, Entrada, Saida)
			 
	Entrada.ax = 8
	Entrada.cx = y1
	Entrada.DX = Y2
	CALL InterruptX(&H33, Entrada, Saida)

END SUB

SUB MaxPositionAsc (Coluna1, Linha1, Coluna2, Linha2 AS INTEGER)
			 
	Entrada.ax = 7
	Entrada.cx = (Coluna1 - 1) * 8
	Entrada.DX = (Coluna2 - 1) * 8
	CALL InterruptX(&H33, Entrada, Saida)
			
	Entrada.ax = 8
	Entrada.cx = (Linha1 - 1) * 8
	Entrada.DX = (Linha2 - 1) * 8
	CALL InterruptX(&H33, Entrada, Saida)

END SUB

SUB MouseOn
				
	Entrada.ax = 0
	CALL InterruptX(&H33, Entrada, Saida)
	IF Saida.ax = 0 THEN
	BEEP
	LOCATE 1, 1
	PRINT "No mouse detected"
	END IF

END SUB

FUNCTION MouX%
			 
	Entrada.ax = 3
	CALL InterruptX(&H33, Entrada, Saida)
	MouX% = Saida.cx

END FUNCTION

FUNCTION MouY%
	
	Entrada.ax = 3
	CALL InterruptX(&H33, Entrada, Saida)
	MouY% = Saida.DX

END FUNCTION

SUB MudaCor (x1, y1, x2, Y2, Cor1, Cor2 AS INTEGER)
			 
	FOR Linha = 1 TO Y2 - y1
		FOR Pixel = 1 TO x2 - x1
		IF POINT(x1 - 1 + Pixel, Linha) = Cor1 THEN PSET (x1 - 1 + Pixel, Linha), Cor2
		NEXT Pixel
	NEXT Linha

END SUB

SUB Position (Coluna, Linha AS INTEGER)

	LOCATE Linha, Coluna
	PRINT "X:"; MouX; " "
	LOCATE Linha, Coluna + 8
	PRINT "Y:"; MouY; " "

END SUB

SUB PositionAsc (Coluna, Linha AS INTEGER)
			 
	LOCATE Linha, Coluna
	PRINT "X:"; (MouX / 8) + 1; " "
	LOCATE Linha, Coluna + 7
	PRINT "Y:"; (MouY / 8) + 1; " "

END SUB

FUNCTION RButton

	RButton = Button(2)

END FUNCTION

SUB ShowMou

	Entrada.ax = 1
	CALL InterruptX(&H33, Entrada, Saida)
			 
END SUB

SUB Velocidade (Vel AS INTEGER)

	IF Vel > 100 THEN
	BEEP
	CLS
	PRINT "Velocidade nĈo suportada"
	END
	END IF
	Entrada.ax = 15
	Entrada.DX = 100 - Vel
	Entrada.cx = 100 - Vel
	CALL InterruptX(&H33, Entrada, Saida)

END SUB

