Jump to content

MultiPlay

From CPCWiki - THE Amstrad CPC encyclopedia!
Revision as of 00:45, 10 April 2025 by Phi2x (talk | contribs) (Links)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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:

  • 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