{"product_id":"atari-2600-sega-vectrex-db9-joystick-cable-with-all-9-pins-new","title":"ATARI 2600 \/ Coleco \/ SEGA \/ Vectrex - DB9 Joystick Cable With All 9 Pins - NEW","description":"\u003ch2 style=\"text-align: center;\"\u003eATARI 2600 \/ Coleco \/ SEGA \/ Vectrex\u003c\/h2\u003e\n\u003ch2 style=\"text-align: center;\"\u003eDB9 Joystick Cable\u003c\/h2\u003e\n\u003ch2 style=\"text-align: center;\"\u003eAll 9 Pins Connected - NEW!\u003c\/h2\u003e\n\u003chr\u003e\n\u003cdiv dir=\"auto\" style=\"text-align: center;\"\u003e\n\u003cp\u003eSo many systems utilize these, aside from the above, we can think of:\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eCommodore VIC-20\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eCommodore C64\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eAmiga\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eSony MSX\u003c\/strong\u003e\u003c\/p\u003e\n\u003ch3\u003e\u003cspan style=\"text-decoration: underline;\"\u003e\u003cstrong\u003ePerfect for:\u003c\/strong\u003e\u003c\/span\u003e\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli style=\"text-align: left;\"\u003eJoystick and paddle repair.\u003c\/li\u003e\n\u003cli style=\"text-align: left;\"\u003eCustom projects like arcade sticks, conversions and even communication, like our ancient MCP development kit for the 7800.\u003c\/li\u003e\n\u003cli style=\"text-align: left;\"\u003eMuch more...\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp style=\"text-align: left;\"\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cspan style=\"text-decoration: underline;\"\u003e\u003cstrong\u003e\u003cspan style=\"color: rgb(255, 42, 0); text-decoration: underline;\"\u003eNOTE:\u003c\/span\u003e\u003c\/strong\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cspan style=\"color: rgb(0, 0, 0);\"\u003eThese cables require soldering and are not direct replacements for Atari joysticks, as an example.\u003c\/span\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"width: 100%; background: #111827; border-radius: 12px; overflow: hidden; position: relative;\"\u003e\n\u003ccanvas style=\"display: block; width: 100%; height: 480px;\" id=\"c\"\u003e\u003c\/canvas\u003e\n\u003cdiv style=\"position: absolute; bottom: 12px; left: 50%; transform: translateX(-50%); color: #9ca3af; font-size: 12px; font-family: var(--font-sans);\"\u003edrag to rotate · scroll to zoom\u003c\/div\u003e\n\u003cdiv style=\"position: absolute; top: 12px; right: 12px; background: rgba(0,0,0,0.6); border-radius: 8px; padding: 10px 14px; font-family: var(--font-sans); font-size: 11px; color: #e5e7eb; line-height: 1.8;\" id=\"legend\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp\u003e\u003cscript src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"\u003e\u003c\/script\u003e \u003cscript\u003e\n(function(){\nconst canvas = document.getElementById('c');\nconst W = canvas.parentElement.clientWidth || 680;\nconst H = 480;\ncanvas.width = W; canvas.height = H;\n\nconst renderer = new THREE.WebGLRenderer({canvas, antialias:true, alpha:false});\nrenderer.setSize(W, H);\nrenderer.setPixelRatio(Math.min(window.devicePixelRatio,2));\nrenderer.shadowMap.enabled = true;\nrenderer.shadowMap.type = THREE.PCFSoftShadowMap;\nrenderer.setClearColor(0x111827);\n\nconst scene = new THREE.Scene();\nconst camera = new THREE.PerspectiveCamera(40, W\/H, 0.1, 100);\ncamera.position.set(0, 1.2, 9);\ncamera.lookAt(0, 0, 0);\n\n\/\/ Lights\nscene.add(new THREE.AmbientLight(0xffffff, 0.35));\nconst sun = new THREE.DirectionalLight(0xffffff, 0.9);\nsun.position.set(4, 6, 5);\nsun.castShadow = true;\nscene.add(sun);\nconst fill = new THREE.PointLight(0x6688ff, 0.4, 20);\nfill.position.set(-4, 2, 3);\nscene.add(fill);\nconst rim = new THREE.PointLight(0xffd080, 0.3, 20);\nrim.position.set(0, -3, -4);\nscene.add(rim);\n\nconst group = new THREE.Group();\nscene.add(group);\n\n\/\/ Materials\nconst shellMat = new THREE.MeshStandardMaterial({color:0x5a6478, metalness:0.8, roughness:0.25});\nconst faceMat  = new THREE.MeshStandardMaterial({color:0x222831, metalness:0.3, roughness:0.6});\nconst pinMat   = new THREE.MeshStandardMaterial({color:0xd4af37, metalness:0.95, roughness:0.05});\nconst holeMat  = new THREE.MeshStandardMaterial({color:0x080a0c, metalness:0, roughness:1});\n\n\/\/ DB9 shell using ExtrudeGeometry (D-shape)\nconst s = new THREE.Shape();\nconst hw=2.2, hh=1.35;\ns.moveTo(-hw, -hh+0.25);\ns.lineTo(-hw+0.25, -hh);\ns.lineTo( hw-0.25, -hh);\ns.lineTo( hw, -hh+0.25);\ns.lineTo( hw, hh-0.25);\ns.lineTo( hw-0.25, hh);\ns.lineTo(-hw+0.25, hh);\ns.lineTo(-hw, hh-0.25);\ns.closePath();\n\nconst ext = new THREE.ExtrudeGeometry(s, {depth:1.8, bevelEnabled:true, bevelThickness:0.12, bevelSize:0.08, bevelSegments:4});\nconst shell = new THREE.Mesh(ext, shellMat);\nshell.position.z = -0.9;\nshell.castShadow = true;\ngroup.add(shell);\n\n\/\/ Face plate\nconst face = new THREE.Mesh(new THREE.PlaneGeometry(4.1, 2.4), faceMat);\nface.position.z = 0.92;\ngroup.add(face);\n\n\/\/ Pin data: [pin, color hex, x, y]\nconst pins = [\n  [1, 0xee2222,  1.55, 0.55],\n  [2, 0x1a1a1a,  0.77, 0.55],\n  [3, 0x9e9e9e,  0.00, 0.55],\n  [4, 0xff8800, -0.77, 0.55],\n  [5, 0xc8955a, -1.55, 0.55],\n  [6, 0x22bb44,  1.16,-0.55],\n  [7, 0xfafafa,  0.39,-0.55],\n  [8, 0x2255ff, -0.39,-0.55],\n  [9, 0xddcc00, -1.16,-0.55],\n];\n\nconst colorNames = {\n  1:'Red', 2:'Black', 3:'Gray', 4:'Orange', 5:'Lt Brown',\n  6:'Green', 7:'White', 8:'Blue', 9:'Yellow'\n};\n\npins.forEach(([pin, col, x, y]) =\u003e {\n  \/\/ Pin cylinder\n  const pg = new THREE.CylinderGeometry(0.13, 0.13, 0.55, 20);\n  const pm = new THREE.Mesh(pg, pinMat);\n  pm.rotation.x = Math.PI\/2;\n  pm.position.set(x, y, 1.2);\n  pm.castShadow = true;\n  group.add(pm);\n\n  \/\/ Pin hole ring\n  const hg = new THREE.TorusGeometry(0.16, 0.04, 8, 20);\n  const hm = new THREE.Mesh(hg, holeMat);\n  hm.position.set(x, y, 0.94);\n  group.add(hm);\n\n  \/\/ Colored wire (TubeGeometry along CatmullRom curve)\n  const spread = 0.7;\n  const pts = [\n    new THREE.Vector3(x, y, -0.88),\n    new THREE.Vector3(x*0.8, y*0.8, -1.8),\n    new THREE.Vector3(x*spread, y*spread, -3.2),\n    new THREE.Vector3(x*spread*1.2, y*spread*1.2+0.1*(pin%2===0?1:-1), -5.5),\n  ];\n  const curve = new THREE.CatmullRomCurve3(pts);\n  const tube = new THREE.TubeGeometry(curve, 24, 0.075, 8, false);\n  const wireMat = new THREE.MeshStandardMaterial({\n    color: col,\n    metalness: 0.0,\n    roughness: 0.6,\n    envMapIntensity: 0\n  });\n  \/\/ White wire needs a slight off-white to be visible\n  if(col === 0xfafafa) wireMat.color.set(0xdee0e3);\n  const wire = new THREE.Mesh(tube, wireMat);\n  wire.castShadow = true;\n  group.add(wire);\n\n  \/\/ Wire end cap sphere\n  const ep = pts[pts.length-1];\n  const cap = new THREE.Mesh(new THREE.SphereGeometry(0.08,12,12), wireMat);\n  cap.position.copy(ep);\n  group.add(cap);\n});\n\n\/\/ Mounting ears (screw holes)\n[-1,1].forEach(side =\u003e {\n  const ear = new THREE.Mesh(\n    new THREE.CylinderGeometry(0.2,0.2,0.4,16),\n    shellMat\n  );\n  ear.rotation.x = Math.PI\/2;\n  ear.position.set(side*2.7, 0, 0.3);\n  group.add(ear);\n  const screw = new THREE.Mesh(\n    new THREE.CylinderGeometry(0.1,0.1,0.45,12),\n    new THREE.MeshStandardMaterial({color:0xaaaaaa, metalness:0.9, roughness:0.2})\n  );\n  screw.rotation.x = Math.PI\/2;\n  screw.position.set(side*2.7, 0, 0.32);\n  group.add(screw);\n});\n\n\/\/ Legend\nconst leg = document.getElementById('legend');\nlet html = '';\npins.forEach(([pin, col, ,]) =\u003e {\n  const hex = '#'+col.toString(16).padStart(6,'0');\n  const textColor = col === 0x1a1a1a ? '#fff' : '#111';\n  const bg = col === 0x1a1a1a ? '#555' : hex;\n  html += `\u003cdiv style=\"display:flex;align-items:center;gap:6px;margin-bottom:2px\"\u003e\n    \u003cspan style=\"display:inline-block;width:10px;height:10px;border-radius:50%;background:${bg};border:1px solid rgba(255,255,255,0.25)\"\u003e\u003c\/span\u003e\n    \u003cspan style=\"color:#9ca3af\"\u003eP${pin}\u003c\/span\u003e\n    \u003cspan\u003e${colorNames[pin]}\u003c\/span\u003e\n  \u003c\/div\u003e`;\n});\nleg.innerHTML = html;\n\n\/\/ Initial pose\ngroup.rotation.x = 0.18;\ngroup.rotation.y = 0.4;\n\n\/\/ Mouse \/ touch interaction\nlet dragging = false, lastX = 0, lastY = 0;\ncanvas.addEventListener('mousedown', e =\u003e { dragging=true; lastX=e.clientX; lastY=e.clientY; });\nwindow.addEventListener('mouseup', ()=\u003e{ dragging=false; });\nwindow.addEventListener('mousemove', e =\u003e {\n  if(!dragging) return;\n  group.rotation.y += (e.clientX-lastX)*0.012;\n  group.rotation.x += (e.clientY-lastY)*0.009;\n  group.rotation.x = Math.max(-1.1, Math.min(1.1, group.rotation.x));\n  lastX=e.clientX; lastY=e.clientY;\n});\ncanvas.addEventListener('wheel', e =\u003e {\n  camera.position.z = Math.max(4, Math.min(14, camera.position.z + e.deltaY*0.01));\n  e.preventDefault();\n}, {passive:false});\n\n\/\/ Touch\ncanvas.addEventListener('touchstart', e =\u003e { dragging=true; lastX=e.touches[0].clientX; lastY=e.touches[0].clientY; });\ncanvas.addEventListener('touchend', ()=\u003e{ dragging=false; });\ncanvas.addEventListener('touchmove', e =\u003e {\n  if(!dragging) return;\n  group.rotation.y += (e.touches[0].clientX-lastX)*0.012;\n  group.rotation.x += (e.touches[0].clientY-lastY)*0.009;\n  lastX=e.touches[0].clientX; lastY=e.touches[0].clientY;\n});\n\nlet auto = true;\ncanvas.addEventListener('mousedown', ()=\u003e{ auto=false; });\n\n(function animate(){\n  requestAnimationFrame(animate);\n  if(auto) group.rotation.y += 0.006;\n  renderer.render(scene, camera);\n})();\n})();\n\u003c\/script\u003e\u003c\/p\u003e","brand":"CPUWIZ LABS","offers":[{"title":"Default Title","offer_id":54440004419889,"sku":null,"price":3.49,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0971\/8661\/1505\/files\/DB9Chord.png?v=1780661056","url":"https:\/\/cpuwizlabs.com\/products\/atari-2600-sega-vectrex-db9-joystick-cable-with-all-9-pins-new","provider":"CPUWIZ LABS","version":"1.0","type":"link"}