Difference between revisions of "EnterMice"

From Enterprise Wiki
Jump to: navigation, search
(Values for EXOS variable 183 to change mouse pointer colour)
(Reading the joystick interface)
Line 358: Line 358:
 
required is to read the extra fire buttons. An example of the code
 
required is to read the extra fire buttons. An example of the code
 
is listed below.
 
is listed below.
100 PROGRAM "JOYFIRE2.BAS"
+
 
110 ALLOCATE 40
+
 
120 CODE FIRE=HEX$("7C,F3,D3,B5,DB,B6,FB,A5,28,04,21,00,00,C9,
+
100 PROGRAM "JOYFIRE2.BAS"
21,01,00,C9")
+
110 ALLOCATE 40
130 DO
+
120 CODE FIRE=HEX$("7C,F3,D3,B5,DB,B6,FB,A5,28,04,21,00,00,C9,
140 LET FIRE2=USR(FIRE,4)
+
21,01,00,C9")
150 IF FIRE2 THEN PRINT "FIRE I PRESSED"
+
130 DO
160 LOOP
+
140 LET FIRE2=USR(FIRE,4)
 +
150 IF FIRE2 THEN PRINT "FIRE I PRESSED"
 +
160 LOOP
  
  
Line 371: Line 373:
  
  
org:                     7c           ld a,h      ;h is the row
+
org:                     7c           ld a,h      ;h is the row
 
                           f3              di
 
                           f3              di
 
                           d3b5            out (b5h),a       
 
                           d3b5            out (b5h),a       

Revision as of 16:25, 26 November 2015

EnterMice

Joysticks & PS/2 Mouse Interface
for Enterprise 64 & 128 computer

Introduction

This complex interface has been designed for the Enterprise 64/128 series computer. The achievement is the culmination of six months of work of a multidisciplinary Polish developer known on relevant forums as Pear.

The main goal of the adapter is to allow the use of cheap and widely available PS/2 mice on the Enterprise computer. In addition, it enables direct connection of two joysticks in Atari standard without additional adapters.

EnterMice is based on solutions used in the BoxSoft mouse interface, which supports the Neos mouse(MSX protocol).

One of the EnterMice operating modes is fully compatible with the old BoxSoft mouse interface. An other operating mode converts the mouse movement to joystick pulsations.


A little story about Enterprise and mice

Enhancing the Enterprise 128 with mouse control is not a new and eccentric idea of a geekish retro-computing group, it was already planned by the original EP designers. The problem was that the task was relegated to Aztec Software Ltd, a modest English company that came up with a disappointing job; for two main reasons: first, the product was ugly, nothing near the rounded shape of the Enterprise. Secondly, it was not an adequate mouse as it relied on emulated joystick movement. Also at that time Enterprise Computing Ltd. was disappearing.

But the user base in the United Kingdom remained very active in the years following. Little companies were founded by Enterprise enthusiasts. New products were offered: memory expansions, customized cables, games, utilities, Spectrum emulators, an IDE controller, Eprom, motherboard expansions, serial modems and so on.

The most prolific company was Boxsoft, founded by developer Tim Box. Boxsoft offered most of the products listed above. Bundled with a paint program called Paintbox, they marketed an adapter plus a Neos mouse with a driver included. The Neos, internally a MSX mouse, had already been successfully adapted to other 8-bit computers like the Commodore 64.

At that time only a few 8-bit computers had a working mouse with some form of GUI. It was very difficult to sell something new of unknown use and not completely integrated on the computer. Seen from today's perspective, the advantage of navigating operating systems and applications with a mouse is obvious, its convenience being realized instantly when the mouse stops working...


After all, only about a hundred of the Paintbox bundles were sold.

The Paintbox program arrived to Hungary separately. Hungarians bought Enterprise computers knowing that they came from the UK., but not much more. When all the Enterprise 128s were sold, the user base was abandoned as in the country of origin. Once again, new companies surfaced offering new products. Then a company named "A studio" began to manufacture and sell the Boxsoft items, camouflaging them as their own products. One of the programs was a Paintbox version without the mouse option. It still needed the driver, but a crippled version. At the east side of the Iron Curtain nobody ever heard of the Neos mouse.

Later, in Hungary, a serial card expansion for the Enterprise was realized, thanks to the genius of a team of Hungarian developers: Gyula Mészáros for the hardware, and László Haluska (HSOFT) for the software part. HSOFT took the crippled "A studio" mouse driver and modified it to suit the serial interface with a Mouse Systems mouse and later they supplied a built-in driver for the EPDOS 2.x operating system.

This is ancient history, but in recent years with WWW, Internet and globalization, some of the old artefacts Boxsoft+Neos emerged and all pieces of the puzzle began to fit. At last, the old promises (seen on Enterprise Computers Ltd. advertisments) of a real proprietary Enterprise mouse interface turned a reality.


The new Entermice interface presented here is based on the work of the Boxsoft team, but adapted to recent times, supporting new options. (It is a miracle what Tim Box achieved with only a few logical gates and diodes back then). As for the hardware, the driver was very well written by D. Rabson, Andrew Fitter and Andrew Richards. With minor modifications, the same driver will be used with the Entermice adapter.)

The principal problem interfacing the Enterprise is that connectors and signals are far from being a joystick-mouse standard. Little edge connectors that can be accidentally plugged upside down, commons pulled to +5v for the buttons when normally zero volt is used, lack of protection of the return of the signal when two or more buttons are pressed, no way to send information or state to the controller, and probably some more issues.

Now what Boxsoft pulled off with common, cheap components, has been redesigned and improved with two programmable chips and other modern components. One of the chips (a Xilinx) is in charge of the pinout and signal conversion to the Atari standard game port connectors. The original Boxsoft interface defined/standardized the first controller port only that was used to connect the Neos mouse or a standard joystick (but not both at the same time). In the present project two joystick ports have been provided and they don't interfere with the mouse port.

The Neos/MSX mouse is not widely found today so, a PS/2 to MSX conversion adapter has been implemented. It is driven by a powerful 12 MHz Atmel AT89C4051, able to adapt itself to the frequency of the Z80 processor installed on the Enterprise. With this chip and the proper coding it has inside, the Entermice can work on a 4 MHz EP or a supercharged 10 MHz one the same way.

Also, the mouse reading protocol has been expanded following Prodatron and NYYRIKKI's new extended MSX protocol so it can send information about five buttons on a wheel mouse, if present. It will soon be completely compatible with SymbOS (actually only in Boxsoft mode, see the features section about how to set this mode).


General description

EnterMice front
EnterMice back

Important

Do not connect the interface to the computer when the power is on !
If when you connect the interface your computer does not start up properly or behaves abnormally, it must be switched off immediately !

Check whether the interface is connected correctly and try again.

Mouse and joysticks can be connected and disconnected while the computer is power on, but this is not recommended. It is safer to perform any connection with the power disconnected.

Connecting to a computer

The interface board should be connected at the same time to 3 edge connectors on the back of your Enterprise: Control 1, Control 2 and Serial.

It can be inserted only one way, but the contact pins might not seat centered on the fingers of the edge connectors. If so, the contact might be unstable and the computer and/or the interface may not work properly.

Properly connected, the interface works right after turning on the power.

After turning on, a self-test is performed, during which both red and green LEDs will flash 3 times (regardless of the state of dip-switch 3).

Features

The interface can operate in several modes. To configure it, a five sectional dip-switch is provided.

The configuration settings can be changed during operation of the interface. You do not have to restart your computer.

Below is the description of all possible settings.

DS1 DS2 Work mode
ON ON EnterMice native mouse mode
OFF ON BoxSoft compatible mouse mode
OFF OFF EnterMice joystick mode (Movement made to the mouse is redirected to the input of Joystick 1, and that port is disabled)
ON OFF not used (in fact EnterMice as joystick on KB K column)

Joystick 2 always works the same way, regardless of the interface operating mode being selected.


DS3 LED status
OFF LED status disabled
ON LED status enabled


Joystick emulation mode configuration

DS4 Sensitivity
OFF Normal
ON High
DS5 Diagonal correction
OFF Disable
ON Enable

Diagonal correction improves the precision of joystick simulation on diagonal movements, at the expense of a slight decrease in speed.

Use of the driver

The following instructions have been took from the original Paintbox manual, corrected and then added the Entermice new abilities.


THE MOUSE AND HOW TO USE IT IN YOUR PROGRAMS

Using the mouse is not just restricted to machine-code programs, it can be very easily incorporated within almost any Basic program. For this is necessary the use of an EXOS Extension named "MOUSE DRIVER".

This device driver will place a pointer on any graphic screen and by monitoring the movements of the mouse it will move the pointer around the screen in sync with it.

The Mouse Driver can be instructed to do various commands and functions, for example turning the pointer on and off. There are two ways to communicate with the Mouse Driver, the first is by reading and writing to it and the second is by system variables.

LOADING

The Mouse Driver can be loaded by all methods ie; "START" from Basic (if from tape) or load "MOUSE.XR". It can also be loaded from the "WP", from EXDOS or from any other language (check appropriate language for details).

COMMUNICATING WITH THE MOUSE

As stated above there are two ways in which you can communicate with the Mouse Driver. To demonstrate the two methods and their actions, we shall first look at all the commands, functions and variables then demonstrate their use within a program.

PRINTED COMMANDS AND FUNCTIONS

The first and most important action is to open the Mouse channel, ie OPEN £?:"MOUSE:" (? being a channel number).

Commands issued by printing characters to Mouse channel:

"O" Turn pointer on. "o" Turn pointer off. "P" request X & Y position.

Results or status obtained by reading a character from Mouse channel:


Only read after sending "P":

X low byte. X High byte. Y low—byte. Y High byte.

Always readable:

Fire = "1" if main button depressed, "0" if not.

SYSTEM VARIABLES

180 Video channel, pointer required on. (default = 101)
181 Position of X,Y co-ordinate on status line. (default =30)
182 Status co-ordinate display: 1 on, 0 off. (default = 0)
183 Colour of pointer {check tech section}. (default = 255)
184 Low byte of X co-ordinate.
185 High byte of X co-ordinate. Check demo prog. for co-ordinate conversion.
186 Low byte of Y co-ordinate.
187 High byte of Y co-ordinate.
188 Status of fire button 0 off, 1 on.
189 Input device:
  "0" Internal Joystick
  "1" Control 1
  "2" Control 2
  "3" Boxsoft
  "4" Entermice (default)
  "5" Serial Mouse Sytems
  "6" Serial Microsoft
190 Status of secondary button and spare buttons if present, counter of wheel if present.
  Bits 0 to 3 signed nibble of the wheel counter(7 -> -8) 
  Bit 4 wheel button
  Bit 6 and 5 spare buttons
  Bit 7 secondary button

EXAMPLES

100 PROGRAM "ms_test.bas"
110 NUMERIC X,V,MAX_Y",X_COUNT
120 GRAPHICS
130 CALL MOUSE_SETUP
130 OPEN £1:"mouse:" ! Open a channel to the Mouse
140 DO
15D CALL MOUSE_POS
160 LOOK 1:FIRE ! Check the fire button
170 IF FIRE THEN
130 PRINT £1:"o"; ! Turn the pointer off
190 PLOT LASTX,LASTY,X,Y
200 PRINT 1:"O"; ! Turn the pointer on
210 ELSE
I10 PLOT X,Y,
230 END IF
240 LET LASTX=X:LET LASTY=Y
250 LOOP
250 END
270 DEF MOUSE_SETUP
280 LET CHAR_Y=20 ! No. of characters screen high
290 LET X_COUNT=2 I Pixel calc no
300 SET 180,101 ! Video channel to put mouse pointer on
310 SET 181,30 ! Position of co-ordinates on status line
320 SET 182,1 ! Show co-ordinates
330 SET 183,255" ! Colour of pointer
310 LET MAX_Y=CHAR_Y*36-2 ! Convert char_y to co-ordinates
350 END DEF

Note X_COUNT is = to "2" in 2 colour mode "4" in 4 colour mode "8" in 16 colour mode and "16" in 255 colour mode. All these values double when in lores.

Reading the pointer co-ordinates by reading from Mouse channel.

DEF MOUSE_POS
 PRINT £1:"P"
 LOOK £1:XL
 LOOK £1:XH
 LOOK £1:YL
 LOOK £1:YH
 LET X=XL+256*XH
 LET Y=YL+256*YH
END DEF

Reading the pointer co-ordinates from the system variables.

DEF MOUSE_POS
 ASK 184 XL
 ASK 185 XH
 ASK 186 YL
 ASK 187 YH
 LET X1=XL+256*XH
 LET X=X1*X_COUNT
 LET Y=YL+256*YH
 LET Y=Y*2
 LET Y=MAX_Y—Y
END DEF

Setting the Mouse co-ordinates by the system variables.

DEF POS_MOUSE
 LET X=INT(X/X_COUNT)
 LET XL=X-256*INT(X/256)
 LET XH=INT(X/256)
 LET Y=MAX_Y-Y:LET Y=INT(Y/2)
 LET YL=Y-256*INT(Y/256)
 LET LET YH=INT(Y/256)
 SET 184,XL
 SET 185,XH
 SET 186,YL
 SET 187,YH
END DEF


This program is a very simple art program; simply drawing a line to follow the movement of the mouse when the "Mouse Button" is pressed. A call is made to MOUSE_POS on line 150, depending on how you want to read it you should add into the program the appropriate procedure from the two listed. There is another procedure listed, that routine enables you to set the position of the pointer. Simply call it with the desired position in variables X. and Y, experiment with the different routines, and try and add them into your own programs, it won't take long to get the feel of them and after a very short while you will discover just how easy it is to incorporate the mouse into existing programs and to write mouse specific programs.

HOW TO PROGRAM THE WHEEL

Low nibble of System variable 190 holds the count of impulses received from the wheel since the last time it was reseted. The impulses are positive or negative, and are added to the counter, that can hold a value from 7 to -8. The program has to provide a timer routine to check the counter every given period. Once checked, the conter is reseted to 0, an the value found is used for a task, for example to scroll the screen.

DRIVER TECHNICAL INFORMATION

Values for EXOS variable 183 to change mouse pointer colour

    SETTING 	RESULTANT INK COLOUR
2  COLOUR MODE.

0 0 255 1

4  COLOUR MODE.

0 0 240 1 15 2 255 3

16 COLOUR MODE.

0 0 192 1 12 2 204 3 48 4 240 5 48 6 240 7 3 8 195 9 15 10 207 11 51 12 243 13 63 14 255 15

255 COLOUR MODE.

0-255 0-255

JOYSTICK MODE OF THE ENTERMICE MOUSE PORT

A mouse plugged on the ENTERMICE PS/2 port is not just restricted to acting as a mouse, it can be made to simulate a joystick. To activate this mode you must put to off both DS1 and DS2. The interface then will convert the mouse movement on the PS/2 connector to joystick movement on Joy port 1. You don't have to unplug your real joystick from that port as it will be disabled. The mouse will then send movement like that of a joystick, useful to manage old programs or games. NOTE: The fire button is the left hand button on the mouse. To make use of the right hand button use the routines shown in the section on the mouse interface.

The Entermice Mouse interface will not only work as a mouse Interface but as an Intelligent joystick interface. Any ATARI-Kempston-Amiga style Joystick can then be inserted into one of the two 9 pin connectors at the back of the interface board. If the Joystick has an autofire option it will work. Mouse and Joysticks can stay connected at the same time as they don't interfere one to the others.


Reading the joystick interface

All normal methods of reading the port work. The only extra code required is to read the extra fire buttons. An example of the code is listed below.


100 PROGRAM "JOYFIRE2.BAS"
110 ALLOCATE 40
120 CODE FIRE=HEX$("7C,F3,D3,B5,DB,B6,FB,A5,28,04,21,00,00,C9,
21,01,00,C9")
130 DO
140 LET FIRE2=USR(FIRE,4)
150 IF FIRE2 THEN PRINT "FIRE I PRESSED"
160 LOOP


This is the disassembly of that little code:


org:                     7c 	           ld a,h       ;h is the row
                         f3               di
                         d3b5             out (b5h),a      
                         dbb6             in a,(b6h)      
                         fb                ei      
                         a5               and l      ;   bit 0 is J column, bit 1 is K column, and bit 2 is L column.
                         2804             jr z,pressed    
                         210000           ld hl, 00h    
                         c9                ret

pressed: 210100 ld hl,01h

                         c9                ret

You can read the three Fire buttons of the Entermice changing in the Basic line "140 LET FIRE2=USR(FIRE,4)", the "4" by a "2" or a "1".

This method also can be utilised to read the two main mouse buttons.

Troubleshooting

Keyboard issue

Figure 1
Figure 2
Figure 3
Keyboard fixer (visualisation)

During the creation of the EnterMice, a fairly serious error in the design of the Enterprise was casually discovered.

It stays totally unnoticed if nothing is connected to the ports Control 1 and Control 2. However, the EnterMice uses them...

The issue is about interferences on KB0..KB9 ports from keyboard, that are also utilised by the control ports.

If only one key is pressed at the keyboard, then nothing wrong happens (see figure 1).

However, if you press two keys in the same column simultaneously, the signal from the selected line will be transferred to the line of the second key as well(figure 2).

The Enterprise lacks blocking return diodes to separate the rows of the keyboard!

Electrically nothing will happen (the LS145 decoder inside the computer has open collector outputs), but reading from the external ports Control 1 and Control 2 causes errors.

In order to eliminate the cause, diodes should be added to each row of keys on the Enterprise, to avoid that pressing more than one key does causes "collisions" (figure 3).

Pear has prepared a draft of a PCB to fix it , but it has not been tested yet. In the meanwhile, in order to avoid errors, the keyboard should not be operated while joysticks or mouse are in use.

Microsoft Optical Mouse

The PS/2 Microsoft Optical Mouse is a special case. It should be only connected inserted on its original Microsoft USB to PS/2 converter. It will work with EnterMice if connected before power on, but in its case, you can not use the hot-plug feature.

Entermice can be forced to recognise the Microsoft mouse during operation, you only need to momentarily short the RESET pin-header on the interface (it resets only the interface, not the computer).


Technical specification

Joystick port pinout

pin signal
1 Up
2 Down
3 Left
4 Right
5 Fire 3
6 Fire 1
7 +5 V
8 GND
9 Fire 2

Control Map

J column (bit 0) K column (bit 1) L column (bit 2)
JM=0* JM=1* JM=0 JM=1 JM=0 JM=1
Control 1 Row 0 Fire Joy 1 Fire 1 Mice Left Btn Mice Left Btn or Joy 1 Fire 2* Joy 1 Fire 2 Mice Right Btn or Joy 1 Fire 3*
Row 1 Up Joy 1 Up Mice D0 Mice D0 spare spare spare
Row 2 Down Joy 1 Down Mice D1 Mice D1 spare spare spare
Row 3 Left Joy 1 Left Mice D2 Mice D2 spare spare spare
Row 4 Right Joy 1 Right Mice D3 Mice D3 spare spare spare
Control 2 Row 5 Fire Joy 2 Fire 1 Joy 2 Fire 2 Joy 2 Fire 3
Row 6 Up Joy 2 Up spare spare spare spare
Row 7 Down Joy 2 Down spare spare spare spare
Row 8 Left Joy 2 Left spare spare spare spare
Row 9 Right Joy 2 Right spare spare spare spare
* Mouse buttons have higher priority
* JM=0 (DS1 ON)  native EnterMice mouse mode
  JM=1 (DS1 OFF) joystick emulation & BoxSoft compatible mode

Sega twister

Diagram
Prototype
EnterMice with adapter

to connect the Sega six-button pad

Sega Six Button Controller Hardware Info

Interface Protocol of SEGA MegaDrive's 6-Button-Controller

Sega pad pinout
pin Select = Low Select = High Select = pulse-3
1 Up Up Button Z
2 Down Down Button Y
3 GND Left Button X
4 GND Right not used
5 +5V
6 Button A Button B not used
7 Select
8 GND
9 Start Button C not used

Information for developers

EnterMice timings

The firmware of EnterMice is optimized for the cyclic reading with 50 Hz frequency (video IRQ).

Default reading cycle 20 ms
Waiting time to perform self-test the PS/2 mouse (timeout) ca. 2000 ms
Time of collecting the PS/2 mouse data max. 12 ms
Time from change state of RTS signal to issue data (nibble) for reading 25 μs
Standby time for the next reading (counting from data issue) 14 μs
Time from read the last nibble of data to reset the nibble counter (timeout)* 1500 μs
Default mouse polling time in joystick emulation mode 30 ms
Mouse polling time in joystick emulation mode when mouse doesn't move (minimize polling delay) 12,5 ms
* After this time is performed another mouse data polling.

Data buffer

Data buffer in EnterMice has a size of 16 bytes.

Currently is used only a half. The remainder may be used in the future.

Byte High nibble Low nibble Content
Bit 7 6 5 4 3 2 1 0
0 X value signed int (positive is moved left) BoxSoft protocol
1 Y value signed int (positive is moved up)
2 0 0 0 1 0 Btn5 Btn4 Btn3 Protocol identification & buttons 3,4,5 state Extended MSX protocol
3 Horizontal wheel* Z value signed int (positive is wheel moved up)
4 ExCnt Mouse ID Extra bytes available to read (include this) & PS/2 mouse ID EnterMice extension protocol
5 Hw ver. mj. Hw ver. mn. Hardware version (major.minor)
6 Fw ver. mj. Fw ver. mn. Firmware version (major.minor)
7 Device ID EnterMice ID is 5Dh
* not implemented yet, now all 8 bits is a Z value

You do not need to read all the data from the buffer.

Reading can be interrupted at any time. There will be the timeout and interface performs another read data from mice, then once again be ready to send data.

Last state of RTS signal also not matter. EnterMice reacts to the change state, not on the signal level.

Mouse reading

; Here begin the Neos mouse reading
ld hl,X_REL ; first byte
ld a,2 ; RTS low
out (0B7h),a
ld b,8 ; long delay
call WAIT
call READ_4BIT ; read four higher bits
rld ; push them in (HL)
xor a ; RTS high
out (0B7h),a
ld b,5 ; short delay
call WAIT
call READ_4BIT ; read four lower bits
rld ; push them in (HL)
ld hl,Y_REL ; second byte
ld a,2 ; RTS low
out (0B7h),a
ld b,5 ; short delay
call WAIT
call READ_4BIT ; read four higher bits
rld ; push them in (HL)
xor a ; RTS high
out (0B7h),a
ld b,5 ; short delay
call WAIT
call READ_4BIT ; read four lower bits
rld ; push them in (HL)
;<======Here will be added the future Wheel and three spare buttons reading. SECOND TENTATIVE
ld hl,SW_Z_STATUS
ld a,2 ; RTS low
out (0B7h),a
ld b,5 ; short delay
call WAIT
call READ_4BIT ; read four higher bits
and 15
cp 1 ; IF THIS NIBBLE=0001 THEN THE MOUSE IS IN EXTENDED PROTOCOL
jr z,CONTINUE_READ
xor a ; RTS high
out (0B7h),a ;IGNORE THAT NIBBLE
ld (hl),0 ; we don't need old values
jr STOP_READ
CONTINUE_READ:
xor a ; RTS high
out (0B7h),a
ld b,5 ; short delay
call WAIT
call READ_4BIT ; read four higher bits, the three lower bits are the buttons. They come ready to store
push af ; push them in stack. they are in the lower nibble.
ld a,(hl) ;
push af ;save the Z counter for later.
ld a,2 ; RTS low
out (0B7h),a
ld b,5 ; short delay
call WAIT
call READ_4BIT ; read four bits
rld ;we need z displacement in 8 bit
xor a ; RTS high
out (0B7h),a
ld b,5 ; short delay
call WAIT
call READ_4BIT ; read four lower bits. Z displacement
rld ; push them in (HL) ;NOW WE HAVE Z displacement in (hl)
pop af ; restored Z counter to "a", but we have garbage on high nibble
and 00Fh
bit 3,a
jr z,SIGN_DONE
or 0F0h
SIGN_DONE: ; now we have the sign extended to 8 bits on "a"
add a,(hl)
cp 128 ; positive or negative?
jr c,POSITIVE
cp 248 ; lower than -8?
jr nc,FINISHED ;
ld a,248 ; -8 is the bottom
jr FINISHED
POSITIVE:
cp 8 ; higher than 7?
jr c,FINISHED
ld a,7 ; 7 is the top
FINISHED: ; the excess of 7 or -8 has been wiped
ld c,a ; save Z addition on c
pop af ; retrieve the buttons status. They are now on first nibble of a
rld ; buttons stored
ld a,c ; we only need the first nibble of Z counter addition
rld ; the spare buttons status and the Z counter are now in SW_Z_STATUS
STOP_READ:
xor a ; recall buttons on row 0
out (0B5h),a
in a,(0B6h) ; read Mouse buttons
and 7 ; mask
xor 7 ; flip them all as on Enterprise a pressed key is 1 and released 0
rl (hl) ; Get ready the bit 7 of "hl" register pair. Inside is SW_Z_STATUS, variable number 190
srl a ; This is the very FIRST "srl a". The button status is now in the carry flag
; secondary button of Boxsoft is read on J column. Primary button of Entermice is read on K column
push af
ld a,(INPUT_DEVICE)
cp 3 ; Boxsoft interface mode buttons
jr nz,L_BUTTON
pop af ; We need the value of "a" and "f" registers. Carry flag still stores the value of secondary button
rr (hl) ; secondary button goes to bit 7 of SW_Z_STATUS, variable number 190
srl a ; Primary button of Boxsoft is on J column. This is the second "srl a"
JR MAIN_BUTTON
L_BUTTON: ; Entermice interface mode buttons
pop af ; retrieve the value of register "a". "f" is disposable, soon we will load the button on carry flag
push af ; I still will need later the register "a" value
srl a ; two "srl a" because the secondary button of Entermice is read on L column
srl a ; the proper button status is now in the carry flag
rr (hl) ; secondary button goes to bit 7 of SW_Z_STATUS, variable number 190
pop af ; retrieve the value of register "a" just after the FIRST "srl a"
MAIN_BUTTON:
and 1
ld (FIRE_STATUS),a ; EXOS Variable 188. K column if Boxsoft or L column if Entermice
call sub_C3A6 ; this is the "corrections and drawing" routine where the "velocity" 1.1 modification was made
ld a,(X_REL)
ld c,a
ld a,(Y_REL)
or c
ret
WAIT:
nop
nop
nop
dec b
jr nz,WAIT
ret
READ_4BIT: ; I split the routine in two to not put more processor time
ld b,4
ld d,0
ld a,(INPUT_DEVICE)
cp 3
jr z,L_COLUMN
K_COLUMN:
ld a,b
;inc c ; this is not necessary
out (0B5h),a
in a,(0B6h)
;ld c,a ; this is not necessary
rra ; data read from K column
rra
rl d
djnz K_COLUMN
jr CONTINUE
L_COLUMN:
ld a,b
;inc c ; this is not necessary
out (0B5h),a
in a,(0B6h)
;ld c,a ; this is not necessary
rra ; data read from L column
rl d
djnz L_COLUMN
CONTINUE:
ld a,d
ret