Vectrex Programming TOC
Joystick/Button input
This is going to be the last chapter, and as the chapters befor, no
in depth view and programming information will be given. I'll only tell
you about the BIOS routines. And I don't think any sane person will need
any more information, as I allready mentioned in my babblings about sound,
the joypads are (indirectly) connected to the PSG soundchip, which in turn
can only be accessed using some werid pokes to the VIA chip. So I dearly
recommed any programmer to only use the available functions. These functions
are:
Joy_Analog ($F1F5)
Joy_Digital ($F1F8)
Read_Btns_Mask ($F1B4)
Read_Btns ($F1BA)
All of these routines require the DP register set to $D0! Furthermore there
are some very interesting BIOS RAM locations, here is a list of them, but
read on for some more information about them:
Vec_Btn_State ($C80F) Current state of all joystick buttons
Vec_Prev_Btns ($C810) Previous state of all joystick buttons
Vec_Buttons ($C811) Current toggle state of all buttons
Vec_Button_1_1 ($C812) Current toggle state of stick 1 button 1
Vec_Button_1_2 ($C813) Current toggle state of stick 1 button 2
Vec_Button_1_3 ($C814) Current toggle state of stick 1 button 3
Vec_Button_1_4 ($C815) Current toggle state of stick 1 button 4
Vec_Button_2_1 ($C816) Current toggle state of stick 2 button 1
Vec_Button_2_2 ($C817) Current toggle state of stick 2 button 2
Vec_Button_2_3 ($C818) Current toggle state of stick 2 button 3
Vec_Button_2_4 ($C819) Current toggle state of stick 2 button 4
Vec_Joy_Resltn ($C81A) Joystick A/D resolution ($80=min $00=max)
Vec_Joy_1_X ($C81B) Joystick 1 left/right
Vec_Joy_1_Y ($C81C) Joystick 1 up/down
Vec_Joy_2_X ($C81D) Joystick 2 left/right
Vec_Joy_2_Y ($C81E) Joystick 2 up/down
Vec_Joy_Mux ($C81F) Joystick enable/mux flags (4 bytes)
Vec_Joy_Mux_1_X ($C81F) Joystick 1 X enable/mux flag (=1)
Vec_Joy_Mux_1_Y ($C820) Joystick 1 Y enable/mux flag (=3)
Vec_Joy_Mux_2_X ($C821) Joystick 2 X enable/mux flag (=5)
Vec_Joy_Mux_2_Y ($C822) Joystick 2 Y enable/mux flag (=7)
Vec_Misc_Count ($C823) misc counter/flag byte, zero when not in use
One small note in advance, in order for the joypad routines to work correctly,
you must again asure that the Vec_Misc_Count ($C823) BIOS RAM location
is zero, since it is used for analog testing. As said befor, if you don't
change that variable somewhere, than everything is ok, since BIOS functions
allways return leaving that location zero.
Again I will not describe all functions and all variables, only two
actually, probably the two you'll need most. The other functions can again
be easily worked out by looking at the appropriate BIOS dissassembly (where
you can actually find everything (nearly) I say in this document), or Appendix
A.
Let us first do the most easy things, as usual. Let us have a look at
the buttons. Here is a small example:
button1.asm
The above function calls the Read_Btns ($F1BA) function. This function
does a couple of things. But the only thing we use in the above example
is the information given to us in register A. In that register a button
transition information is given. That means a bit is set at a button specific
position, if it's state has changed. But only half the transition is registered,
the transition from unpressed to pressed. If such a transition occured
than for the next call of Read_Btns the appropriate bit will be set. Most
of the time that little information is enough. Especially if you don't
want continues fire or the like. I guess I don't have to go through the
program line by line, as I did befor, since (pardon me) it IS fairly obvious.
The Read_Btns function has some other uses (for an exact describtion look
at the disassembled ROM listing or Appendix A), further down you will find
a program that makes use of the RAM locations mentioned above, that are
set to the current button state by the Read_Btns function. The function
does following other things:
Vec_Buttons ($C811) Current toggle state of all buttons
Contains the same information as register A.
Vec_Btn_State ($C80F) Current state of all joystick buttons
Contains a bitmap whether a button is pressed (1) or not (0).
Vec_Prev_Btns ($C810) Previous state of all joystick buttons
Contains a bitmap whether a button was pressed (1) or not (0) befor
the function call.
Vec_Button_1_1 ($C812) Current toggle state of stick 1 button 1
Vec_Button_1_2 ($C813) Current toggle state of stick 1 button 2
Vec_Button_1_3 ($C814) Current toggle state of stick 1 button 3
Vec_Button_1_4 ($C815) Current toggle state of stick 1 button 4
Vec_Button_2_1 ($C816) Current toggle state of stick 2 button 1
Vec_Button_2_2 ($C817) Current toggle state of stick 2 button 2
Vec_Button_2_3 ($C818) Current toggle state of stick 2 button 3
Vec_Button_2_4 ($C819) Current toggle state of stick 2 button 4
The bitmap used in all above BIOS RAM locations is as in the above program:
joystick 1:
button 1: $01
button 2: $02
button 3: $04
button 4: $08
joystick 2:
button 1: $10
button 2: $20
button 3: $40
button 4: $80
With the that information we can easily change our above program to print
a steady message whether a button is currently pressed or not. From the
at least two different approaches we take the (IMHO) easier one:
button2.asm
I think we pretty much exhausted the possibilities of the buttons with
the above two examples (leave alone the masked button requests, but they
are not really that different) let us go on to the joystick(s).
As you have seen above there are two functions for joystick information
gathering. I will only explain a bit of Joy_Digital ($F1F8), since analog
is (again IMHO) not all that usefull, and takes considerable time to calculate
and is even a bit unstable.
Some preliminaries first. When you program a game you'll probably at
one stage know what kind of joystick routine you need (one or two joysticks,
digital or analog), once you know that, you should set up the BIOS joystick
routines for your needs, because (and I really mean it) these routines
are cycle wasters, and every bit they have to calculate to much is really
a waste. There are the following BIOS RAM locations:
Vec_Joy_Mux_1_X ($C81F) Joystick 1 X enable/mux flag (=1)
Vec_Joy_Mux_1_Y ($C820) Joystick 1 Y enable/mux flag (=3)
Vec_Joy_Mux_2_X ($C821) Joystick 2 X enable/mux flag (=5)
Vec_Joy_Mux_2_Y ($C822) Joystick 2 Y enable/mux flag (=7)
Into these you should pass the information what you want to know. 0 means
not interested and the 'flag' numbers mean that you are interested. In
the example program below we are only interested in joystick one, but both
X and Y position.
joystick1.asm
The above example is (hopefully understandable) again straight forward.
A simple example for a joypad inquiry. The above tested BIOS RAM locations
contain allways the current position of the joypad (current means last
set by the Joy_Digital function). Negative values stand for left/down,
positive for right/up and zero for no movement detected. Following are
again the BIOS RAM locations, where these will be set, both for joypad
1 and joypad 2.
Vec_Joy_1_X ($C81B) Joystick 1 left/right
Vec_Joy_1_Y ($C81C) Joystick 1 up/down
Vec_Joy_2_X ($C81D) Joystick 2 left/right
Vec_Joy_2_Y ($C81E) Joystick 2 up/down
Next page Last
Page
Vectrex Programming TOC
|