
 "HOW TO CONNECT 8 SNES-PADS TO YOUR C64  V1.1"

    BY NINJA/DREAMS IN 1997-98

========================================================================

THE NECCESSARY STUFF...
------------------------

THOUGH I TRIED TO MAKE THIS PROJECT AS ERROR-FREE AS POSSIBLE, I CAN'T
GUARANTEE THAT THERE AREN'T ANY MISTAKES LEFT. SO I AM NOT RESPONSIBLE
FOR DAMAGED HARDWARE OR ANYTHING ELSE. IF YOU USE THIS, YOU DO IT AT
YOUR OWN RISK!!! AND: THIS PIECE OF WORK IS HEREBY DECLARED AS PUBLIC
DOMAIN. THAT MEANS YOU CAN USE IT LIKE YOU DEVELOPED IT BY YOURSELF.
BUT IF YOU USE IT, PLEASE MENTION ME IN THE CREDITS AND/OR SEND ME AN
EMAIL. THAT IS ALL I'M ASKING FOR.

BUT NOW TO THE INTERESTING PART....

------------------------------------------------------------------------


IN MY OPINION THE BEST JOYPAD EVER MADE IS THE ORIGINAL SNES CONTROLLER
BY NINTENDO. IT FEATURES GOOD HANDLING AND ITS 8 BUTTONS ARE EASY TO
"FIND" AFTER A SHORT TIME.

SO, WHAT ABOUT EIGHT (8!) SNES-CONTROLLERS WITH ALL THEIR BUTTONS ON
YOUR JOYPORTS??? YES, THE USERPORT REMAINS FREE, JUST THE JOYPORTS.
AND IN ADDITION TO THAT YOU WON'T NEED TOO MUCH HARDWARE NEITHER,
BECAUSE WHAT YOU HAVE TO BUILD IS MORE LIKE A CABLE. NOW, HOW DOES
THAT WORK?

IT IS NOT TOO COMPLICATED, IT'S JUST THAT YOU HAVE TO KNOW HOW THESE
PADS WORK (AND NINTENDO ISN'T NEITHER FAMOUS FOR GIVING INFORMATION NOR
FOR ACCEPTING ANY KIND OF STANDARD). AT FIRST I WILL TELL YOU WHAT PIN
DOES WHAT JOB. KEEP IN MIND THAT PIN A IS THE ONE AT THE FLAT END!


 SNES-PAD-PIN-DESCRIPTION:          C64-JOYPORT-PIN-DESCRIPTION:

  A = +5V                            1 = JOY 0
  B = CLOCK                          2 = JOY 1
  C = RESET                          3 = JOY 2
  D = DATA1                          4 = JOY 3
  E = DATA2 (UNUSED)                 5 = PADDLE Y
  F = DATA3 (UNUSED)                 6 = JOY 4
  G = GROUND                         7 = +5V
                                     8 = GROUND
                                     9 = PADDLE X

                                  (BUT YOU SURELY KNEW THAT ALREADY ;))

YOU SEE, THE SECRET OF CONNECTING EIGHT PADS TO THE JOYPORTS IS THAT THE
DATA IS SENT SERIAL! THE FLOW CONTROL IS DONE VIA PINS B AND C, THE DATA
ITSELF USES PIN D (NOTE: PINS E AND F ARE NOT USED BY NORMAL PADS, THEY
ARE NECESSARY FOR THOSE SNES-PORT-MULTIPLEXERS). LET'S HAVE A CLOSER
LOOK AT THIS. AT THE BEGINNING YOU HAVE TO RAISE AND LOWER THE
RESET-LINE. NOW YOU CAN READ THE FIRST BIT FROM DATA1. AFTER THAT YOU
RAISE AND LOWER THE CLOCK-LINE AND GET THE NEXT BIT FROM DATA1. REPEAT
THIS UNTIL YOU'VE GOT A TOTAL OF 12 BITS, THEN START AGAIN.

NO PROBLEM WITH THAT. AND AS OUR C64 GOT 10 DIGITAL LINES ON
ITS JOYPORTS, MINUS TWO FOR THE FLOW CONTROL, WE SHOULD BE ABLE TO
CONNECT EIGHT OF THOSE GREAT PADS TO IT. HERE IS HOW IT CAN BE DONE:


  C64-JOYSTICK-PORTS:

           PORT 2                          PORT 1

    7     1 2 3 4 8   6               7 4 6 1 2  3  8
    O     O O O O O   O               O O O O O  O  O
    I     I I I I I   I               I I I I I  I  I
    I *---I-I-I-I-I---I---------------I-* I I I  I  I
    I I *-I-I-I-I-I---I---------------I-I-* I I  I  I
    I I I I I I I I   I               I I I I I  I  I
    I I I I I I I I   I               I I I I I  I  I
   -*-*-*-*-------*-  I              -*-*-*-*-------*-
  I O O O O   O O O ) I             I O O O O   O O O )
   -*-*-*---------*-  I              -*-*-*---------*-
    I I I   I I I I   I               I I I   I  I  I
    I I I ,-' I I I   I               I I I ,-'  I  I
    I I I I   I I I   I               I I I I    I  I
   -*-*-*-*-------*-  I              -*-*-*-*-------*-
  I O O O O   O O O ) I             I O O O O   O O O )
   -*-*-*---------*-  I              -*-*-*---------*-
    I I I     I I I   I               I I I      I  I
    I I I ,---' I I   I               I I I ,----'  I
    I I I I     I I   I               I I I I       I
   -*-*-*-*-------*-  I              -*-*-*-*-------*-
  I O O O O   O O O ) I             I O O O O   O O O )
   -*-*-*---------*-  I              -----------------
    I I I       I I   I               A B C D   E F G
    I I I ,-----' I   I
    I I I I       I   I
   -*-*-*-*-------*-  I
  I O O O O   O O O ) I
   -*-*-*---------*-  I
    I I I         I   I
    I I I ,-------I---'
    I I I I       I
   -*-*-*-*-------*-
  | O O O O   O O O )
   -----------------
    A B C D   E F G

I DECIDED TO USE PORT 1 FOR DOING THE FLOW CONTROL, BECAUSE THEN YOU CAN
HAVE THREE PADS CONNECTED WHILE STILL USING YOUR JOYSTICK IN PORT 2.
I THINK THIS WILL BE SUITABLE FOR MOST CASES, SINCE THERE ARE NOT TOO
MANY GAMES FOR MORE THAN THREE PLAYERS. IN ADDITION TO THAT WE NOW
REDUCED THE CHANCE THAT KEYBOARD ROUTINES WILL DISTURB THE PADS SINCE
YOU NORMALLY WRITE TO $DC00 AND RARELY TO $DC01. ON THE OTHER HAND THE
PADS MAY INTERFERE WITH THE KEYBOARD, BUT WE CAN GET AROUND THIS PROBLEM
VERY EASY (SEE LISTING).

BUT, OF COURSE, THERE IS A PROBLEM. THE CONNECTORS OF SNES PADS ARE
REALLY ANNOYING :( BUT WE HAVE TO COME AROUND THIS SOMEHOW, SO HERE ARE
YOUR OPTIONS:

 1) TRY FINDING A STORE WHERE THEY SELL THEM (VERY UNLIKELY)
 2) GET THEM FROM A SNES, MULTITAP OR JOYPAD-CABLE-EXTENDER (EXPENSIVE)
 3) BE CREATIVE AND MAKE YOUR OWN! (IS CHEAP, LOOKS CHEAP, CHEAP QUALITY
    (AT LEAST IN MY CASE ;))) IF YOU HAVE ABSOLUTELY NO IDEA HOW TO DO
    THIS, SEND ME A MAIL, PERHAPS I CAN HELP YOU.
 4) CUT THEM OFF AND USE DIFFERENT CONNECTORS. PROBABLY THE BEST
    SOLUTION, IF YOU WANT TO USE THE PADS ONLY ON YOUR C64 AND NOT ON
    A SUPER-NINTENDO.

ENOUGH ABOUT THE HARDWARE, LET'S GO OVER TO THE SOFTWARE. HERE IS AN
DOCUMENTED EXAMPLE, WHICH SHOULD INCLUDE EVERYTHING YOU NEED TO KNOW.

------------------------------------------------------------------------
              ORG $C000

JOY           = $0500       ; SO YOU CAN SEE, IF SOMETHING HAPPENS
                            ; OTHERWISE ZEROPAGE SHOULD BE PREFERRED

              SEI
              LDX #<(IRQ)   ; STANDARD...
              LDY #>(IRQ)   ; PROCEDURE...
              STX $0314     ; FOR...
              STY $0315     ; SETTING...
              LDA #$81      ; UP...
              STA $D01A     ; AN...
              LDA #$FF      ; IRQ-ROUTINE.
              STA $D012     ; NOTHING...
              LDA #$1B      ; SPECIAL...
              STA $D011     ; ABOUT...
              CLI           ; IT..
              RTS           ; RETURN TO BASIC...

IRQ:
              LDA $D019     ; GET IRQ-FLAG
              BPL NOIRQ     ; IRQ GENERATED BY VIC?
              STA $D019     ; YES, THEN CLEAR FLAG
              JSR GETSNES   ; MAIN ROUTINE
NOIRQ:

 ; THIS ROUTINE WILL PREVENT THE PADS FROM INTERFERING WITH THE
 ; KEYBOARD. IT IS NECESSARY AS WE NEED TO RESET $DC03 TO ZERO FOR THE
 ; KEYBOARD SCAN. UNFORTUNATELY THIS CAUSES A PERMANENT HIGH SIGNAL ON
 ; OUR SNES-RESET-LINE, WHAT MEANS WE ALWAYS HAVE THE STATUS BIT FROM
 ; BUTTON B PRESENT ON $DC01. SO, THIS IS HOW YOU CAN GET AROUND THAT
 ; LITTLE PROBLEM.

              LDA #$FF      ; DISABLE KEYS BY SETTING ALL KEYBOARD
              STA $DC00     ; SCAN LINES HIGH...
              CMP $DC01     ; ...SO ANY LOW SIGNAL MUST BE SENT BY A PAD
              BNE NOKEYB    ; DID WE GET AN INTERFERENCE?
              JMP $EA31     ; NO, THEN WE CAN CHECK THE KEYBOARD
NOKEYB:
              JMP $EA7E     ; YES, SKIP KEYBOARD THIS TIME


 ; THE FOLLOWING ROUTINE GRABS ALL THE BITS FROM THE SNES-PADS.
 ; OF COURSE, THIS CODE ISN'T OPTIMIZED, SINCE IT IS ONLY FOR
 ; DEMONSTRATION PURPOSES. ANYWAY, HERE ARE THE BIT DESCRIPTIONS IN THE
 ; ORDER AS THEY ARE SENT BY THE PAD. ROL THEM, ROR THEM, READ THEM AT
 ; ONCE FOR ALL 8 PADS, OR WHATEVER. YOU HAVE QUITE A NUMBER OF OPTIONS
 ; :)
 ;
 ;    BIT  0 : BUTTON B
 ;    BIT  1 : BUTTON Y
 ;    BIT  2 : SELECT
 ;    BIT  3 : START
 ;    BIT  4 : UP
 ;    BIT  5 : DOWN
 ;    BIT  6 : LEFT
 ;    BIT  7 : RIGHT
 ;    BIT  8 : BUTTON A
 ;    BIT  9 : BUTTON X
 ;    BIT 10 : TOP-LEFT L
 ;    BIT 11 : TOP-RIGHT R
 ;    BIT 12+: ALWAYS 1
 ;
 ; NORMALLY A CLEARED BIT MEANS 'BUTTON PRESSED'. OF COURSE, YOU CAN
 ; CHANGE THIS BY USING AN EOR #$?? COMMAND.

GETSNES:
              LDA #$00      ; PA 0-7 = INPUT
              STA $DC02     ;
              LDA #$F8      ; PB 0-2 = INPUT
              STA $DC03     ; PB 3-7 = OUTPUT
              LDA #$10      ; SEND "RESET" COMMAND
              STA $DC01     ; TO ALL PADS
              LDA #0        ; AND
              STA $DC01     ; CLEAR IT
              LDY #16       ; GET 16 BITS (WE ACTUALLY NEED ONLY 12
                            ; BITS, BUT THIS WAY WE HAVE CONSTANT
LOOP3:                      ; VALUES ON THE SCREEN.)
              LDX #14       ; COUNTER FOR 8 PADS
              LDA $DC01     ; GET DATA FROM JOYPORT 1
              EOR #7        ; INVERT BITS FROM PADS (NOT NECESSARY)
LOOP1:
              LSR           ; SHIFT BIT FROM PAD INTO CARRY...
              ROL JOY+0,X   ; ...THEN INTO ITS DESTINATION
              ROL JOY+1,X   ; ...ROTATE 16 BITS
              DEX           ; DECREMENT COUNTER BY 2 AS WE USE
              DEX           ; TWO BYTES FOR STORAGE
              CPX #8        ; FIRST THREE PADS DONE?
              BNE LOOP1     ; NO? THEN CONTINUE
              LDA $DC00     ; GET DATA FROM JOYPORT 2
              EOR #$1F      ; INVERT BITS FROM PADS (NOT NECESSARY)
LOOP2:
              LSR           ; SHIFT BIT FROM PAD INTO CARRY...
              ROL JOY+0,X   ; ...THEN INTO ITS DESTINATION
              ROL JOY+1,X   ; ...ROTATE 16 BITS
              DEX           ; AGAIN DECREMENT COUNTER
              DEX
              BPL LOOP2     ; ALL DONE?
              LDA #8        ; SEND "NEXT" COMMAND
              STA $DC01     ; TO ALL PADS
              LDA #0        ; AND
              STA $DC01     ; CLEAR IT
              DEY           ; DID WE GET 12 BITS?
              BNE LOOP3     ; IF NOT, LOOP
              LDA #$FF      ; BACK...
              STA $DC02     ; TO...
              LDA #$00      ; NORMAL...
              STA $DC03     ; FOR KEYBOARD SCAN.
              RTS           ; GO BACK...

 ; IF YOU USE THE ROL INSTRUCTION TO COLLECT THE BITS FROM THE PAD,
 ; YOU CAN USE THIS TABLE TO FIX THE DIRECTIONS, SO THAT IT IS
 ; COMPATIBLE WITH THE STANDARD C64 FORMAT. SIMPLY ISOLATE THE
 ; DIRECTION-BITS AND USE THEM AS AN INDEX. BY THE WAY USE THE ROR
 ; INSTRUCTION AND YOU WON'T HAVE THIS PROBLEM...

FIXTAB:
              BYT $00,$08,$04,$0C,$02,$0A,$06,$0E
              BYT $01,$09,$05,$0D,$03,$0B,$07,$0F

------------------------------------------------------------------------

I KNOW, THIS ROUTINE ISN'T FAST AT ALL, BUT AS LONG AS YOU DON'T NEED
ALL BUTTONS ON ALL PADS THERE ARE LOTS OF WAYS TO REDUCE THE AMOUNT OF
RASTERTIME (EVEN TURRICAN 2 HAS ENOUGH TIME LEFT FOR A PAD!).

SO, WITH THIS LITTLE PIECE OF INEXPENSIVE HARDWARE THE LIMITS ARE NOW
EIGHT DEVICES WITH EIGHT DIFFERENT BUTTONS EACH. HEY, GAME-DEVELOPERS!
COULDN'T THIS BECOME USEFUL TO YOU???

AND LOOK OUT FOR MY SNES-PAD-TOOL-DISK. THERE WILL BE SOME GFX-TOOLS,
WHICH I PATCHED TO USE THE EXTRA BUTTONS, AS WELL AS AN AMICA-PAINT
DRIVER AND A SPECIAL SURPRISE TO ALL GAME FREAKS OUT THERE ;)

ANY QUESTIONS OR COMMENTS? FEEL FREE TO WRITE ME AN EMAIL:

   NINJA/DREAMS   (EMAIL: NINJA@P25.BOOX.FIDO.DE)

