Difference between revisions of "MultiPlay"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
(Created page with "The MultiPlay allows to add two controllers on the expansion port. It is easy to use them from BASIC, with the INP() command. Each controller port can be set with two inputs...")
 
(Downloads)
 
(18 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
The MultiPlay allows to add two controllers on the expansion port.
 
The MultiPlay allows to add two controllers on the expansion port.
It is easy to use them from BASIC, with the INP() command.
+
It is easy to use them from BASIC, with the [[Locomotive_BASIC#INP_.28.E2.80.B9port_number.E2.80.BA.29|INP()]] command.
  
 
Each controller port can be set with two inputs modes:
 
Each controller port can be set with two inputs modes:
* AMS = Amstrad joystick and GX4000 gamepad
+
* AMS = Amstrad joystick and [[GX4000]] gamepad
* AMI = Amiga joystick / mouse (and compatible)
+
* AMI = [[Amiga]] joystick / mouse (and compatible)
  
 
Each mouse sensitivity is 200dpi / 4bit acceleration.  (DK'Tronics mouse is 50dpi / 1bit)
 
Each mouse sensitivity is 200dpi / 4bit acceleration.  (DK'Tronics mouse is 50dpi / 1bit)
Line 24: Line 24:
 
</pre>
 
</pre>
  
== Manual ==
+
About usages:
  
* Any manual exists?
+
- Reading from BASIC with 50Hz interrupt is fine to handle a fast char pointer with acceleration.
  
 +
- Reading from ASM with 300Hz interrupt is fine to handle a fast pixel pointer with acceleration.
  
== Downloads ==
+
== I/O ports ==
  
* Any MultiPlay example or driver software exists?
+
Port &F990 = Port A Actions bits
 +
 
 +
Port &F991 = Port B Actions bits
 +
 
 +
Port &F992 = Port A Mouse POS-X value
 +
 
 +
Port &F993 = Port A Mouse POS-Y value
 +
 
 +
Port &F994 = Port B Mouse POS-X value
 +
 
 +
Port &F995 = Port B Mouse POS-Y value
 +
 
 +
Ports &F996 and &F997 are unused
 +
 
 +
=== Action bits ===
 +
 
 +
bit0: Up
 +
 
 +
bit1: Down
 +
 
 +
bit2: Left
 +
 
 +
bit3: Right
 +
 
 +
bit4: 1st fire or LMB
 +
 
 +
bit5: 2nd fire or RMB
 +
 
 +
bit6: 3rd fire or MMB
 +
 
 +
bit7: 0
 +
 
 +
=== Mouse position bits ===
 +
 
 +
bit0-2: value
 +
 
 +
bit3-7: sign (all 0 or 1)
 +
 
 +
 
 +
Buttons 1, 2, 3 are the same for joystick and mouse input A/B.
 +
 
 +
Mouse register X/Y return the offset since the last read. These are 4 bit value with sign extension. The 4 values are sign extended to 8 bit, so negative value will have bit7-4 at one. In fact bit 7-4 = bit 3.
 +
 
 +
Note also that the X/Y value will saturate if not read for a long time (or if the movement is fast). It will never overflow or wrap.
 +
 
 +
From a software point of view, just read the port and add its value to your position variable.
 +
 
 +
== Text Cursor ==
 +
 
 +
<pre>
 +
10 MODE 2:BORDER 0
 +
20 s=1:'sensitivity can also be fractional
 +
30 w=80:h=25
 +
40 x=w*0.5:y=h*0.5
 +
50 LOCATE x,y:PRINT"*":
 +
60 xp=x:yp=y
 +
70 xo=INP(&F994):yo=INP(&F995):a=INP(&F991)
 +
80 IF xo>7 THEN xo=xo-255
 +
90 IF yo>7 THEN yo=yo-255
 +
100 x=x+xo*s
 +
110 y=y+yo*s
 +
120 LOCATE 1,1:IF a AND 16 THEN PRINT"LEFT  " ELSE IF a AND 32 THEN PRINT"RIGHT " ELSE IF a AND 64 THEN PRINT"MIDDLE" ELSE PRINT"      "
 +
130 IF x<1 THEN x=1
 +
140 IF x>w THEN x=w
 +
150 IF y<1 THEN y=1
 +
160 IF y>h THEN y=h
 +
170 IF x<>xp OR y<>yp THEN FRAME:LOCATE xp,yp:PRINT" ";:LOCATE x,y:PRINT"*";
 +
180 GOTO 60
 +
</pre>
 +
 
 +
== Graphics Cursor ==
 +
 
 +
<pre>
 +
10 MODE 2:BORDER 0
 +
20 s=8:'sensitivity can also be fractional
 +
30 w=640:h=400
 +
40 x=w*0.5:y=h*0.5
 +
50 TAG:MOVE x,h-y:PRINT"^";
 +
60 xp=x:yp=y
 +
70 xo=INP(&F994):yo=INP(&F995):a=INP(&F991)
 +
80 IF xo>7 THEN xo=xo-255
 +
90 IF yo>7 THEN yo=yo-255
 +
100 x=x+xo*s
 +
110 y=y+yo*s
 +
120 TAGOFF:LOCATE 1,1:IF a AND 16 THEN PRINT"LEFT  " ELSE IF a AND 32 THEN PRINT"RIGHT " ELSE IF a AND 64 THEN PRINT"MIDDLE" ELSE PRINT"      "
 +
130 IF x<1 THEN x=1
 +
140 IF x>w THEN x=w
 +
150 IF y<1 THEN y=1
 +
160 IF y>h THEN y=h
 +
170 IF x<>xp OR y<>yp THEN FRAME:TAG:MOVE xp,h-yp:PRINT" ";:MOVE x,h-y:PRINT"^";
 +
180 GOTO 60
 +
</pre>
 +
 
 +
== Links ==
 +
 
 +
*[https://www.cpc-power.com/index.php?page=database&lemot=MultiPlay&r1=0&r2=1&r3=0&r4=1 All games using MultiPlay on CPC-Power]
 +
 
 +
*[https://www.cpcwiki.eu/forum/amstrad-cpc-hardware/multiplay-mx4-expansion MultiPlay topic on CPCWiki forum]
  
  
 
[[Category:Peripherals]] [[Category:Input Device]]
 
[[Category:Peripherals]] [[Category:Input Device]]

Latest revision as of 16:03, 31 May 2024

The MultiPlay allows to add two controllers on the expansion port. It is easy to use them from BASIC, with the INP() command.

Each controller port can be set with two inputs modes:

  • AMS = Amstrad joystick and GX4000 gamepad
  • AMI = Amiga joystick / mouse (and compatible)

Each mouse sensitivity is 200dpi / 4bit acceleration.  (DK'Tronics mouse is 50dpi / 1bit) Last but not least: Left, Middle and Right buttons are supported.

50Hz games support w/o conflict. It is handled like arcade machines!

Technical

200 DPI (1 inch = 200 pixel movement)

         ________          ________
 A _____|        |________|        |________
             ________          ________        
 B _________|        |________|        |________

200 DPI |1  |2   |3  |4   |5  |6   |7  |8                                   
 50 DPI |1                |2 

About usages:

- Reading from BASIC with 50Hz interrupt is fine to handle a fast char pointer with acceleration.

- Reading from ASM with 300Hz interrupt is fine to handle a fast pixel pointer with acceleration.

I/O ports

Port &F990 = Port A Actions bits

Port &F991 = Port B Actions bits

Port &F992 = Port A Mouse POS-X value

Port &F993 = Port A Mouse POS-Y value

Port &F994 = Port B Mouse POS-X value

Port &F995 = Port B Mouse POS-Y value

Ports &F996 and &F997 are unused

Action bits

bit0: Up

bit1: Down

bit2: Left

bit3: Right

bit4: 1st fire or LMB

bit5: 2nd fire or RMB

bit6: 3rd fire or MMB

bit7: 0

Mouse position bits

bit0-2: value

bit3-7: sign (all 0 or 1)


Buttons 1, 2, 3 are the same for joystick and mouse input A/B.

Mouse register X/Y return the offset since the last read. These are 4 bit value with sign extension. The 4 values are sign extended to 8 bit, so negative value will have bit7-4 at one. In fact bit 7-4 = bit 3.

Note also that the X/Y value will saturate if not read for a long time (or if the movement is fast). It will never overflow or wrap.

From a software point of view, just read the port and add its value to your position variable.

Text Cursor

10 MODE 2:BORDER 0
20 s=1:'sensitivity can also be fractional
30 w=80:h=25
40 x=w*0.5:y=h*0.5
50 LOCATE x,y:PRINT"*":
60 xp=x:yp=y
70 xo=INP(&F994):yo=INP(&F995):a=INP(&F991)
80 IF xo>7 THEN xo=xo-255
90 IF yo>7 THEN yo=yo-255
100 x=x+xo*s
110 y=y+yo*s
120 LOCATE 1,1:IF a AND 16 THEN PRINT"LEFT  " ELSE IF a AND 32 THEN PRINT"RIGHT " ELSE IF a AND 64 THEN PRINT"MIDDLE" ELSE PRINT"      "
130 IF x<1 THEN x=1
140 IF x>w THEN x=w
150 IF y<1 THEN y=1
160 IF y>h THEN y=h
170 IF x<>xp OR y<>yp THEN FRAME:LOCATE xp,yp:PRINT" ";:LOCATE x,y:PRINT"*";
180 GOTO 60

Graphics Cursor

10 MODE 2:BORDER 0
20 s=8:'sensitivity can also be fractional
30 w=640:h=400
40 x=w*0.5:y=h*0.5
50 TAG:MOVE x,h-y:PRINT"^";
60 xp=x:yp=y
70 xo=INP(&F994):yo=INP(&F995):a=INP(&F991)
80 IF xo>7 THEN xo=xo-255
90 IF yo>7 THEN yo=yo-255
100 x=x+xo*s
110 y=y+yo*s
120 TAGOFF:LOCATE 1,1:IF a AND 16 THEN PRINT"LEFT  " ELSE IF a AND 32 THEN PRINT"RIGHT " ELSE IF a AND 64 THEN PRINT"MIDDLE" ELSE PRINT"      "
130 IF x<1 THEN x=1
140 IF x>w THEN x=w
150 IF y<1 THEN y=1
160 IF y>h THEN y=h
170 IF x<>xp OR y<>yp THEN FRAME:TAG:MOVE xp,h-yp:PRINT" ";:MOVE x,h-y:PRINT"^";
180 GOTO 60

Links