Here is something for you (Vic's site and email are dead, just so you know):
Vic's QBasic Programming Tutorial
Basic Tutorial IV
MOUSE CONTROL!!!!
-----------------------------------------------------------------------------
Have you ever seen a QBasic program that uses the mouse? Have you
also wondered how you could do this easily and quickley? Well, here you
go...
First, let me explain how it is posible to access mouse control in Programm-
ing. Most likeley you have no Idea about ASM (Assembly) Programming...
I will admit that learning that can be extremely hard, but there is one
easy thing to get from it... It is something that is used in many many
DOS programming languages. It is called INTERUPTS... When you use an
interupt you are telling the computer itself to do something. A qbasic
program calls interupts all the time, only you don't know it and can't realy
controll it.
In order to use an Interupt you have to put some information into
memory and call an interupt number. If you look in a book of interupts you
would find that the mouse interupt is number 33. Before you can use this
you need to tell the computer what you want it to do with the mouse by
putting a number into memory. Here is a list of some of the numbers and
what they do. (you can find this in any INTERUPT book...)
0 RESET DRIVER AND READ STATUS
1 SHOW THE MOUSE
2 HIDE THE MOUSE
3 GIVES THE MOUSE X,Y AND BUTTON STATUS
4 SETS THE MOUSE POSITION
5 BUTTON PRESSED DATA
6 BUTTON RELEASED DATA
7 DEFINE HORIZONTAL RANGE (MAX X)
8 DEFINE VERTICLE RANGE (MAX Y)
That is all of the important ones that we will use.
In ASM turning on the mouse it would look like this...
MOV AX,1
INT 33
Thats it... Very simple, you move(MOV) 1 into the memory(AX) and call the
interupt(INT) 33 and BANG! The mouse is showed on the screen.
In Assembely this is very simple, but in QBASIC it gets a bit more involved.
You can't just use MOV and INT to call things... I will get into ASM in
QBasic in a later tutorial. For right now I just want you to copy the
code... (Very simple)...
------------------------------------------------------
Every time I use the mouse I use this program...
To copy this,
1. open up a text editor (NotePad.exe)
2. highlight the bottom code (Start where it says to...).
3. Goto Edit then Copy
4. Goto the new page in the text editor...
5. Goto Edit and then Paste.
6. Goto File and then Save_As...
7. Goto the Save As type box and change it to "All Files (*.*)"
8. Find the C:\ directory (or whatever directory you want, this example will
use the C:\ directory...)
9. Goto the File Name: box and type Mouse.Bas...
10. Click Save...
11. Get into QBasic
12. Load the c:\Mouse.bas...
13. Run the program...
14. Move and click the mouse, notice what changes...
In most cases this works. If you are using Qbasic 4.0 or higher you must
start QBasic in a DOS prompt by typing
DIRECTORY:\qb /l
But, I would REALY RECOMEND using The original QBASIC... It should be in
the same directory as QBasic but it would be called OLDQB.exe, I think...
Heres the code...
'-------------| START MOUSE PROGRAM (START COPYING HERE)--------------------
DEFINT A-Z
DECLARE SUB mouse (cx, dx, bx)
DECLARE SUB MousePointer (SW)
DIM SHARED a(9) 'Set up array for code
DEF SEG = VARSEG(a(0)) 'Get array segment (nnnn: )
' (two 8 bit)
FOR i = 0 TO 17 'length of DATA to
READ r 'read
POKE VARPTR(a(0)) + i, r 'into array/2 (nnnn:iiii) (one 8 bit)
NEXT i 'until 17
'**************************** Machine Code *********************************
DATA &HB8,&H00,&H00 : ' mov AX,[n] [Swap code-(L),(H)] in AX
DATA &H55 : ' push BP Save BP
DATA &H8B,&HEC : ' mov BP,SP Get BP to c Seg
DATA &HCD,&H33 : ' int 33 Interrupt 33
DATA &H92 : ' xchg AX,[reg] [Swap code-reg] in AX
DATA &H8B,&H5E,&H06 : ' mov BX,[BP+6] Point to (variable)
DATA &H89,&H07 : ' mov [BX],AX Put AX in (variable)
DATA &H5D : ' pop BP Restore BP
DATA &HCA,&H02,&H00 : ' ret 2 Far return
SCREEN 13
'****************************** Mouse set up ******************************
CALL MousePointer(0) 'Reset mouse and
CALL MousePointer(1) 'turn pointer on
CALL MousePointer(3) 'Get coordinates
'****************************** P R O G R A M ******************************
DO 'Put your code here
CALL mouse(cx, dx, bx)
LOCATE 1, 1: PRINT dx; cx; bx
LOOP UNTIL INKEY$ = CHR$(27) 'Stop your code here
END
SUB mouse (cx, dx, bx)
POKE VARPTR(a(4)), &H92 'Swap code,Get CX setup
CALL absolute(cx, VARPTR(a(0))) 'Run Code
' cx = cx / 8 'Adjust 25x80
POKE VARPTR(a(4)), &H91 'Swap code,Get DX setup
CALL absolute(dx, VARPTR(a(0))) 'Run Code
dx = dx / 2 'Adjust 25x80
POKE VARPTR(a(4)), &H93 'Swap code,Get BX setup
CALL absolute(bx, VARPTR(a(0))) 'Run Code
'Note :
'Remove the /8
'for graphics modes.
END SUB
SUB MousePointer (SW)
POKE VARPTR(a(0)) + 1, SW 'Swap code,Set AX = (SW)
CALL absolute(c, VARPTR(a(0))) 'Run Code
'Note:
'SW = 0-reset
'SW = 1-on
'SW = 2-off
'SW = 3-coordinates
END SUB
'-------------------| THE END (Cut here)|----------------------------------
Wow huh?!
I realy hope this works for you, I tested it out on my computer and it
works... Just remember to use the original QBASIC...
You can ignore everything except for the DO LOOP Part
This is where you will put your program...
'---------------------------------------------------------------------------
You should know what you need to do from here to work on your own mouse
project. You just use basic colide detection tecniques...
here is an example for you
In the above program bellow the
LOCATE 1, 1: PRINT dx; cx; bx
and above the
LOOP UNTIL INKEY$ = CHR$(27) 'Stop your code here
Type this in
'...
LINE (50, 50)-(80, 70), 15, B
IF bx = 1 THEN
IF dx > 50 AND dx < 80 THEN
IF cx > 50 AND cx < 70 THEN
LOCATE 2, 1: PRINT "You clicked in the box"
END IF
END IF
END IF
'...
What this does is draw a box that you can click in...
when you click in the box it will tell you...
----------------------------------------------------------------------------
I know this was a very short tutorial, but that is all you should really
need to start your own mouse programs. There are many QLB files out there
that do the same thing with much less code, but I prefer to use the old
fashioned way to use the mouse...
Before I leave you I should discuss a few more things...
1. If you want to turn the visible mouse off so you can draw your own
cursor at the point the mouse is at use the command
CALL MousePointer(2)
CALL MousePointer(3)
With this you are still able to tell the mouse coordinates but you do
not see the mouse. this is good if you want to make your own mouse
cursor without having to screw around with ASM and bitmaps (if you
know what I mean)...
2. If you draw something over the mouse and then move the mouse you might
notice that the mouse breaks through the background and destroys what
was drawn. To fix this you do this
CALL MousePointer(2) 'This turns the pointer off
'Draw your picture
CALL MousePointer(1) 'This turns the pointer back
CALL MousePointer(3) 'This grabs the coordinates
That should solve that problem... If it doesn't mess around with it...
3. The CALL MousePointer(x) commands
0 - Resets the mouse
1 - Turns mouse on
2 - turns mouse off
3 - gets the mouses coords...
With this in mind you shouldn't have any problems working the mouse...
Thanks for reading my tutorial, and I really hope I didn't insult your
intellegence...
---------------------------------------------------------------------------
My current E-Mail address is RADIOHANDS@AOL.com
If you are using this tutorial on your page, please leave the tutorial
exactly as it is... please don't change anything, unless its spelling
errors... Theres alot of them! I don't like using the backspace key...
The original website that these were on is
Thank you
Vic Luce
Finished
November 1
1999
If you want to be notified when a new tutorial is out..
Send An E-mail to RADIOHANDS@AOL.com
with the subject saying VQBLIST and then your E-mail address(check website)