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:
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