MultiPlay: Difference between revisions
| (4 intermediate revisions by the same user 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 [[Locomotive_BASIC#INP_.28.E2.80.B9port_number.E2.80.BA.29|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. | ||
[[File:MultiPlay.jpg]] | |||
Each controller port can be set with two inputs modes: | Each controller port can be set with two inputs modes: | ||
| Line 32: | Line 34: | ||
== I/O ports == | == I/O ports == | ||
&F990 = Port A Actions bits | Port &F990 = Port A Actions bits | ||
&F991 = Port B Actions bits | Port &F991 = Port B Actions bits | ||
&F992 = Port A Mouse POS-X value | Port &F992 = Port A Mouse POS-X value | ||
&F993 = Port A Mouse POS-Y value | Port &F993 = Port A Mouse POS-Y value | ||
&F994 = Port B Mouse POS-X value | Port &F994 = Port B Mouse POS-X value | ||
&F995 = Port B Mouse POS-Y value | Port &F995 = Port B Mouse POS-Y value | ||
Ports &F996 and &F997 are unused | Ports &F996 and &F997 are unused | ||
| Line 79: | Line 81: | ||
From a software point of view, just read the port and add its value to your position variable. | 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://framagit.org/offset/multiplay-acepansion MultiPlay ACEpansion] on Framagit | |||
*[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 00:45, 10 April 2025
The MultiPlay allows to add two controllers on the expansion port. It is easy to use them from BASIC, with the INP() command.
Error creating thumbnail: Unable to save thumbnail to destination
Each controller port can be set with two inputs modes:
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