| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa |
| software:sistema [2026/05/03 07:18] – jesus | software:sistema [2026/05/05 18:04] (actual) – jesus |
|---|
| <html> | <html> |
| <style> | <style> |
| /* --- MOTOR VISUAL CRT (ORIGINAL BLINDADO) --- */ | .system-terminal { background-color: #000b00; font-family: 'Courier New', monospace; padding: 30px; color: #00ff00; border: 2px solid #004400; display: flex; flex-direction: column; align-items: center; position: relative; } |
| .system-terminal { background-color: #000b00 !important; font-family: 'Courier New', monospace !important; padding: 30px; color: #00ff00 !important; border: 2px solid #004400; } | .main-system-title { font-size: 2.2em; color: #00ff00; text-align: center; text-transform: uppercase; font-weight: 900; margin-bottom: 20px; text-shadow: 0 0 15px rgba(0, 255, 0, 0.7); } |
| .main-system-title { font-size: 2.8em; color: #00ff00; text-align: center; text-transform: uppercase; font-weight: 900; margin-bottom: 20px; text-shadow: 0 0 20px rgba(0, 255, 0, 0.7); letter-spacing: 4px; } | .selector-panel { background: rgba(0, 40, 0, 0.3); border: 2px solid #00ff00; padding: 15px; text-align: center; border-radius: 4px; display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin-bottom: 20px; } |
| .selector-panel { background: rgba(0, 40, 0, 0.3); border: 1px solid #004400; padding: 15px; margin-bottom: 30px; text-align: center; border-radius: 4px; } | .btn-model { background: transparent; color: #00ff00; border: 1px solid #00ff00; padding: 6px 12px; cursor: pointer; font-family: 'Courier New', monospace; font-weight: bold; transition: 0.3s; font-size: 12px; } |
| .btn-model { background: transparent; color: #00ff00; border: 1px solid #00ff00; padding: 6px 12px; cursor: pointer; font-family: 'Courier New', monospace; font-weight: bold; margin: 3px; transition: 0.3s; font-size: 11px; } | .btn-model:hover, .btn-model.active { background: #00ff00 !important; color: #000 !important; box-shadow: 0 0 10px #00ff00; } |
| .btn-model:hover, .btn-model.active { background: #00ff00; color: #000; box-shadow: 0 0 10px #00ff00; } | .lang-selector { margin-bottom: 20px; display: flex; gap: 15px; justify-content: center; min-height: 50px; } |
| .flag-btn { width: 45px; height: auto; cursor: pointer; filter: grayscale(1) opacity(0.5); transition: 0.3s; margin: 0 8px; border: 1px solid transparent; vertical-align: middle; } | .flag-btn { width: 60px; height: auto; cursor: pointer; border: 1px solid #004400; transition: 0.3s; filter: grayscale(0.7); padding: 2px; background: #111; } |
| .flag-btn:hover, .flag-btn.active { filter: grayscale(0) opacity(1); border-color: #00ff00; transform: scale(1.1); } | .flag-btn:hover, .flag-btn.active { filter: grayscale(0); border-color: #00ff00; transform: scale(1.1); box-shadow: 0 0 10px #00ff00; } |
| #display-screen { border: 2px solid #00ff00; background: rgba(0,30,0,0.4); margin: 20px auto; min-height: 120px; width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; padding: 15px; box-sizing: border-box; } | |
| | |
| .blink-yellow { color: #ffff00 !important; animation: blinker-msg 1s linear infinite; font-weight: bold; } | #display-screen { border: 1px solid #004400; background: rgba(0,20,0,0.2); width: 100%; min-height: 280px; padding: 20px; box-sizing: border-box; display: flex; flex-direction: column; align-items: center; } |
| .status-green { color: #00ff00 !important; font-weight: bold; animation: none !important; } | .disk-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 15px; justify-items: center; width: 100%; margin-bottom: 25px; } |
| @keyframes blinker-msg { 50% { opacity: 0; } } | .disk-item { text-align: center; font-size: 10px; color: #00ff00; font-weight: bold; } |
| | .disk-item img { border: 1px solid #00ff00; background: #000; width: 130px; height: auto; display: block; margin: 0 auto 5px auto; cursor: zoom-in; } |
| |
| .download-link { margin-top: 10px; display: inline-block; padding: 8px 20px; border: 1px solid #ffff00; color: #ffff00 !important; text-decoration: none !important; font-weight: bold; font-size: 12px; text-transform: uppercase; transition: 0.3s; } | .download-zone { margin-top: 10px; text-align: center; width: 100%; } |
| .download-link:hover { background: #ffff00; color: #000 !important; } | .btn-download { display: inline-block; background: transparent; color: #ffff00; border: 2px solid #ffff00; padding: 10px 20px; font-family: 'Courier New', monospace; font-weight: bold; cursor: pointer; text-decoration: none; transition: 0.3s; font-size: 13px; } |
| | .btn-download:hover { background: #ffff00; color: #000; box-shadow: 0 0 15px rgba(255,255,0,0.5); } |
| |
| /* UNIDAD DE DISCO VIRTUAL (BLINDADA) */ | #disk-modal { display: none; position: fixed; z-index: 9999; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,11,0,0.9); align-items: center; justify-content: center; flex-direction: column; } |
| .drive-bay { background: linear-gradient(180deg, #222 0%, #111 100%); border: 4px solid #333; width: 380px; height: 110px; margin: 0 auto 30px auto; position: relative; border-radius: 6px; } | #modal-img { border: 3px solid #00ff00; max-width: 80%; max-height: 80%; } |
| .disk-slot { background: #000; width: 320px; height: 10px; margin: 35px auto 0 auto; box-shadow: inset 0 2px 5px rgba(0,0,0,0.8); border-bottom: 1px solid rgba(0,255,0,0.3); } | .close-modal { margin-top: 20px; background: transparent; color: #00ff00; border: 2px solid #00ff00; padding: 10px 20px; cursor: pointer; font-family: 'Courier New', monospace; } |
| .eject-button { width: 45px; height: 20px; background: #0a0a0a; position: absolute; bottom: 12px; left: 30px; border: 2px solid #555; border-radius: 2px; cursor: pointer; } | |
| .drive-led { width: 16px; height: 8px; background: #300; position: absolute; bottom: 15px; right: 30px; border-radius: 2px; } | |
| .led-active { background: #ff0000; box-shadow: 0 0 15px #ff0000; } | |
| .led-reading { animation: led-blink-fast 0.08s infinite; } | |
| @keyframes led-blink-fast { 50% { opacity: 0.3; } } | |
| | |
| /* ESTRUCTURA FÍSICA DISCO (BLINDADA) */ | |
| .disk-shelf { display: none; flex-wrap: wrap; gap: 40px; justify-content: center; margin-top: 50px; perspective: 1200px; } | |
| .disk-wrapper { display: flex; flex-direction: column; align-items: center; gap: 15px; } | |
| .disk-container { width: 175px; height: 225px; position: relative; transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1); transform-style: preserve-3d; } | |
| .is-flipped { transform: rotateY(180deg); } | |
| .disk-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; background: #111; border-radius: 4px; border: 1px solid #000; overflow: hidden; } | |
| .disk-back { transform: rotateY(180deg); } | |
| .disk-container .disk-back { pointer-events: none; } | |
| .disk-container.is-flipped .disk-back { pointer-events: auto; } | |
| .disk-container.is-flipped .disk-front { pointer-events: none; } | |
| .hole-left-rect { position: absolute; top: 0px; left: 12px; width: 6px; height: 12px; background: #fff; border-radius: 0 0 1px 1px; } | |
| .hole-right-circ { position: absolute; top: 6px; right: 14px; width: 6px; height: 6px; background: #fff; border-radius: 50%; } | |
| .disk-hub-wrapper { position: absolute; top: 85px; left: 50%; margin-left: -20px; width: 40px; height: 40px; z-index: 5; } | |
| .hub-3inch { background: #fdfdfd; border-radius: 50%; border: 1px solid #ccc; width: 100%; height: 100%; position: relative; } | |
| .hub-3inch::after { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 8px; height: 8px; background: #000; border-radius: 50%; } | |
| .hub-3inch-notch { position: absolute; top: 5px; left: 50%; margin-left: -1.5px; width: 3px; height: 10px; background: #000; border-radius: 1px; } | |
| .spinning { animation: rotate-hub 0.5s linear infinite !important; } | |
| @keyframes rotate-hub { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } | |
| | |
| /* ETIQUETAS (BLINDADO MÁSTER) */ | |
| .disk-label-amsoft { position: absolute; bottom: 8px; left: 8px; right: 8px; height: 82px; background: #fff; border-radius: 2px; overflow: hidden; display: flex; flex-direction: column; font-family: Arial, sans-serif; z-index: 10; cursor: pointer;} | |
| .header-de { background: #bcbcbc; border-bottom: 1.2px solid #000; } | |
| .header-es { background: #e18dae; border-bottom: 1.2px solid #c07090; } | |
| .header-uk { background: #2a7089; border-bottom: 1.2px solid #1a5a70; } | |
| .header-fr { background: #7ae500; border-bottom: 1.2px solid #5ba800; } | |
| .label-header { height: 22px; padding: 0 6px; display: flex; align-items: center; justify-content: space-between; } | |
| .amsoft-logo-text { color: #fff; font-weight: bold; font-style: italic; font-size: 12.5px; font-family: "Times New Roman", Times, serif; text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; } | |
| .amstrad-subtext-black { color: #000; font-size: 4.8px; font-weight: 900; text-transform: uppercase; line-height: 0.95; } | |
| .side-indicator-container { display: flex; align-items: center; gap: 4px; color: #000; font-size: 11px; font-weight: 900; } | |
| .arrow-cajetin { background: #fff; border: 1.2px solid #000; display: flex; align-items: center; justify-content: center; height: 11px; width: 10px; font-size: 12px; } | |
| .label-body-replica { flex: 1; padding: 3px 6px 0 6px; color: #000; text-align: left; position: relative; display: flex; flex-direction: column; } | |
| .txt-desc-top { font-size: 5px; font-weight: 900; text-transform: uppercase; margin-bottom: 1px; } | |
| .serial-box-only { position: absolute; border: 1px solid #000; background: #fff; z-index: 12; display: flex; align-items: center; justify-content: center; text-align: center; box-sizing: border-box; white-space: nowrap; overflow: hidden; } | |
| .txt-small-legales { font-size: 3.5px; font-weight: 900; text-transform: uppercase; line-height: 1.1; margin-top: auto; margin-bottom: 2px; } | |
| .label-footer-grey { background: #bcbcbc; height: 15px; border-top: 1px solid #000; padding: 0 6px; display: flex; align-items: center; gap: 5px; } | |
| .cs-logo-label { border: 1px solid #000; color: #fff; font-size: 6px; font-weight: 900; padding: 0 2px; background: #000; } | |
| .copy-text-replica { font-size: 3.4px; color: #000; font-weight: bold; } | |
| | |
| /* CORRECCIÓN BOTÓN GIRAR DISCO */ | |
| .flip-btn { background: transparent; color: #00ff00; border: 1px solid #00ff00; font-size: 10px; cursor: pointer; padding: 5px 12px; border-radius: 3px; text-transform: uppercase; font-weight: bold; margin-top: 10px; transition: 0.2s; outline: none; } | |
| .flip-btn:hover { background: #00ff00; color: #000; box-shadow: 0 0 8px #00ff00; } | |
| .flip-btn:active { background: #004400; color: #00ff00; } | |
| | |
| /* SCHNEIDER (BLINDADO) */ | |
| .schneider-container { display: flex; align-items: center; gap: 3px; transform: scale(0.9); transform-origin: left; } | |
| .schneider-symbol { position: relative; width: 13px; height: 10px; } | |
| .u-shape { position: absolute; width: 7.2px; height: 4.2px; border: 2.3px solid; border-radius: 2.2px 0 0 2.2px; border-right:0; } | |
| .u-black { border-color: #000; top: -1px; left: 0; } | |
| .u-red { border-color: #ff0000; bottom: -1px; right: 0; transform: rotate(180deg); } | |
| .schneider-text-logo { font-size: 10.2px; font-weight: 900; color: #000; letter-spacing: -0.4px; } | |
| .schneider-subtext { font-size: 3.4px; font-weight: 900; text-transform: uppercase; color: #000; line-height: 1; } | |
| </style> | </style> |
| |
| <div class="system-terminal"> | <div class="system-terminal"> |
| <div class="main-system-title">Discos de Sistema</div> | <div class="main-system-title">DISCOS DE SISTEMA</div> |
| <div id="main-app"> | <div class="selector-panel"> |
| <div class="selector-panel"> | <button class="btn-model" onclick="seleccionarPCW('8256', this)">PCW 8256</button> |
| <button class="btn-model" onclick="selectModel('8256', this)">PCW 8256</button> | <button class="btn-model" onclick="seleccionarPCW('8512', this)">PCW 8512</button> |
| <button class="btn-model" onclick="selectModel('8512', this)">PCW 8512</button> | <button class="btn-model" onclick="seleccionarPCW('9512', this)">PCW 9512</button> |
| <button class="btn-model" onclick="selectModel('9256', this)">PCW 9256</button> | <button class="btn-model" onclick="seleccionarPCW('9256', this)">PCW 9256</button> |
| <button class="btn-model" onclick="selectModel('9512', this)">PCW 9512</button> | <button class="btn-model" onclick="seleccionarPCW('9512plus', this)">PCW 9512+</button> |
| <button class="btn-model" onclick="selectModel('9512+', this)">PCW 9512+</button> | <button class="btn-model" onclick="seleccionarPCW('10', this)">PCW 10</button> |
| <button class="btn-model" onclick="selectModel('10', this)">PCW 10</button> | <button class="btn-model" onclick="seleccionarPCW('16', this)">PCW 16</button> |
| <button class="btn-model" onclick="selectModel('16', this)">PCW 16</button> | |
| <div id="lang-selector" style="display:none; margin-top:15px;"> | |
| <img id="flag-es" src="/lib/exe/fetch.php?media=botones:espana.jpg" class="flag-btn" onclick="selectLang('es', this)"> | |
| <img id="flag-uk" src="/lib/exe/fetch.php?media=botones:reino_unido.jpg" class="flag-btn" onclick="selectLang('uk', this)"> | |
| <img id="flag-fr" src="/lib/exe/fetch.php?media=botones:francia.jpg" class="flag-btn" onclick="selectLang('fr', this)"> | |
| <img id="flag-de" src="/lib/exe/fetch.php?media=botones:alemania.jpg" class="flag-btn" onclick="selectLang('de', this)"> | |
| </div> | |
| </div> | |
| <div class="drive-bay"><div class="disk-slot"></div><div class="eject-button" onclick="location.reload()"></div><div class="drive-led" id="drive-led"></div></div> | |
| <div id="display-screen"><div id="status-msg" class="blink-yellow">POR FAVOR, SELECCIONE SU MODELO DE AMSTRAD PCW</div><div id="download-zone" style="display:none;"></div></div> | |
| <div id="disk-shelf-display" class="disk-shelf"></div> | |
| </div> | </div> |
| | <div id="lang-container" class="lang-selector"></div> |
| | <div id="display-screen"><div style="text-align:center; padding-top:100px; opacity:0.5;">SELECCIONE MODELO:</div></div> |
| </div> | </div> |
| | |
| | <div id="disk-modal" onclick="cerrarZoom()"> |
| | <img id="modal-img" src=""> |
| | <button class="close-modal">CERRAR [ESC]</button> |
| | </div> |
| | |
| <script> | <script> |
| let currentModel = ""; let currentLang = ""; let currentLoading = null; | var pcwActual = ''; |
| let audioCtx = null; let motorNode = null; let motorLFO = null; | var rutaBanderas = "/lib/exe/fetch.php?media=botones:"; |
| let isSystemLoaded = false; | var rutaDiscos = "/lib/exe/fetch.php?media=sistema:discos:imagenes:"; |
| |
| const translations = { | function seleccionarPCW(modelo, boton) { |
| es: { code: "es", name: "ESPAÑOL", header: "header-es", amstrad: "AMSTRAD CONSUMER<br>ELECTRONICS plc", d1: { desc: "PROCESADOR DE TEXTOS", t2: "LOCO SCRIPT", ser: "2433345" }, d2: { desc: "SIST. OPERATIVO/UTILID.", t2: "CP/M PLUS", ser: "VER LA OTRA CARA" }, d3: { desc: "", t2: "UTILIDADES DE <br> PROGRAMACION", ser: "2433347" }, d4: { desc: "", t2: "DR. LOGO Y AYUDA", ser: "VER LA OTRA CARA" }, lic: "EL USO DE ESTOS PROGRAMAS ESTA SUJETO A CONDICIONES DEL ACUERDO DE LICENCIA DE USUARIO FINAL ESTABLECIDAS EN EL APENDICE DEL MANUAL DE INSTRUCCIONES DEL USUARIO DE ESTE PRODUCTO.", copy: "PROGRAMAS COPYRIGHT © 1985 LOCOMOTIVE SOFTWARE LTD & AMSTRAD plc." }, | pcwActual = modelo; |
| uk: { code: "en", name: "INGLÉS", header: "header-uk", amstrad: "AMSTRAD CONSUMER<br>ELECTRONICS plc", d1: { desc: "WORDPROCESSOR", t2: "LOCO SCRIPT", ser: "2119203" }, d2: { desc: "SYSTEM/UTILITIES/BASIC DISC", t2: "CP/M PLUS", ser: "SEE OTHER SIDE" }, d3: { desc: "", t2: "PROGRAMMING<br>UTILITIES", ser: "2119205" }, d4: { desc: "", t2: "DR. LOGO & HELP", ser: "SEE OTHER SIDE" }, lic: "THE USE OF THIS SOFTWARE IS SUBJECT TO THE CONDITIONS OF THE END USER LICENSE AGREEMENT APPENDIX IN THE PRODUCT´S USER INSTRUCTION MANUAL", copy: "PROGRAMMES COPYRIGHT © 1985 LOCOMOTIVE SOFTWARE LTD & AMSTRAD plc." }, | var botones = document.getElementsByClassName('btn-model'); |
| fr: { code: "fr", name: "FRANCÉS", header: "header-fr", amstrad: "AMSTRAD CONSUMER<br>ELECTRONICS plc", d1: { desc: "TRAITEMENT DE TEXTES", t2: "LOCO SCRIPT", ser: "3210101" }, d2: { desc: "SYSTEME / UTILITAIRES / BASIC", t2: "CP/M PLUS", ser: "VOIR AUTRE COTE" }, d3: { desc: "", t2: "UTILITAIRES DE<br>PROGRAMMATION", ser: "3210103" }, d4: { desc: "", t2: "DR. LOGO & HELP", ser: "VOIR AUTRE COTE" }, lic: "L'UTILISATION DE CE LOGICIEL EST DEFINIE POR LES CONDITIONS DE LICENSE PARA UTILISATEUR FINAL INDIQUEES DANS L´ANNEXE DU GUIDE DE L´UTILISATEUR.", copy: "PROGRAMMES COPYRIGHT © 1985 LOCOMOTIVE SOFTWARE LTD & AMSTRAD plc." }, | for (var i = 0; i < botones.length; i++) { botones[i].classList.remove('active'); } |
| de: { code: "de", name: "ALEMÁN", header: "header-de", amstrad: "COMPUTER SOFTWARE", d1: { desc: "TEXTVERARBEITUNGSSYSTEM", t2: "LOCO SCRIPT", ser: "2202187" }, d2: { desc: "SYSTEM/DIENSTPROGRAMME-BASIC", t2: "CP/M PLUS", ser: "vgl. andere Seite" }, d3: { desc: "", t2: "DIENSTPROGRAMME", ser: "2202189" }, d4: { desc: "", t2: "DR. LOGO UND HELP", ser: "vgl. andere Seite" }, lic: "Für die aplicación dieser Software son die Condiciones del Lizenzabkommens für Endbenutzer maßgebend (vgl. Anhang Benutzerhandbuch).", copy: "PROGRAMME COPYRIGHT © 1985 LOCOMOTIVE SOFTWARE LTD & AMSTRAD CONSUMER ELECTRONICS pls." } | boton.classList.add('active'); |
| }; | document.getElementById('display-screen').innerHTML = '<div style="text-align:center; padding-top:100px; opacity:0.5;">SELECCIONE IDIOMA:</div>'; |
| | |
| function initAudio() { if (!audioCtx) audioCtx = new (window.AudioContext || window.webkitAudioContext)(); } | var contenedor = document.getElementById('lang-container'); |
| | contenedor.innerHTML = ''; |
| | |
| | var listaIdiomas = (modelo === '8256' || modelo === '8512') ? |
| | [{id:'es', img:'españa.jpg'}, {id:'en', img:'reino_unido.jpg'}, {id:'de', img:'alemania.jpg'}, {id:'fr', img:'francia.jpg'}] : |
| | [{id:'en', img:'reino_unido.jpg'}]; |
| |
| function playBuzzerError() { | listaIdiomas.forEach(function(lang) { |
| initAudio(); const now = audioCtx.currentTime; | var img = document.createElement('img'); |
| const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); | img.src = rutaBanderas + lang.img; |
| osc.type = 'square'; osc.frequency.setValueAtTime(3750, now); | img.className = 'flag-btn'; |
| gain.gain.setValueAtTime(0.08, now); gain.gain.exponentialRampToValueAtTime(0.001, now + 0.12); | img.onclick = function() { |
| osc.connect(gain); gain.connect(audioCtx.destination); | var flags = document.getElementsByClassName('flag-btn'); |
| osc.start(); osc.stop(now + 0.12); | for (var j = 0; j < flags.length; j++) { flags[j].classList.remove('active'); } |
| | this.classList.add('active'); |
| | mostrarDiscos(lang.id); |
| | }; |
| | contenedor.appendChild(img); |
| | }); |
| } | } |
| |
| function playRecalibrate() { | function mostrarDiscos(idLang) { |
| initAudio(); const startTime = audioCtx.currentTime; | var pantalla = document.getElementById('display-screen'); |
| for(let i=0; i<12; i++) { | var htmlDiscos = ''; |
| const t = startTime + (i * 0.045); const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); | |
| osc.type = 'square'; osc.frequency.setValueAtTime(90, t); | if (pcwActual === '8256' || pcwActual === '8512') { |
| gain.gain.setValueAtTime(0.18, t); gain.gain.linearRampToValueAtTime(0, t + 0.03); | htmlDiscos = '<div class="disk-grid">' + |
| osc.connect(gain); gain.connect(audioCtx.destination); | '<div class="disk-item"><img src="' + rutaDiscos + 'systemdisk_' + idLang + '_side1.jpg" onclick="abrirZoom(this.src)">DISCO 1</div>' + |
| osc.start(t); osc.stop(t + 0.03); | '<div class="disk-item"><img src="' + rutaDiscos + 'systemdisk_' + idLang + '_side2.jpg" onclick="abrirZoom(this.src)">DISCO 2</div>' + |
| | '<div class="disk-item"><img src="' + rutaDiscos + 'systemdisk_' + idLang + '_side3.jpg" onclick="abrirZoom(this.src)">DISCO 3</div>' + |
| | '<div class="disk-item"><img src="' + rutaDiscos + 'systemdisk_' + idLang + '_side4.jpg" onclick="abrirZoom(this.src)">DISCO 4</div>' + |
| | '</div>'; |
| | } else if (pcwActual === '9512plus') { |
| | htmlDiscos = '<div class="disk-grid">' + |
| | '<div class="disk-item"><img src="' + rutaDiscos + 'locoscript2_9512plus_bubblejet_disk_front.jpg" onclick="abrirZoom(this.src)">LOCO FRONT</div>' + |
| | '<div class="disk-item"><img src="' + rutaDiscos + 'locoscript2_9512plus_bubblejet_disk_back.jpg" onclick="abrirZoom(this.src)">LOCO BACK</div>' + |
| | '<div class="disk-item"><img src="' + rutaDiscos + 'cpm_plus_9512plus_bubblejet_disk_front.jpg" onclick="abrirZoom(this.src)">CPM FRONT</div>' + |
| | '<div class="disk-item"><img src="' + rutaDiscos + 'cpm_plus_9512plus_bubblejet_disk_back.jpg" onclick="abrirZoom(this.src)">CPM BACK</div>' + |
| | '</div>'; |
| | } else if (pcwActual === '9512' || pcwActual === '10' || pcwActual === '16' || pcwActual === '9256') { |
| | var discosData = { |
| | '9512': ['systemdisk_9512_en_disc1.jpg', 'systemdisk_9512_en_disc2.jpg'], |
| | '10': ['systemdisk_10_en_disc2.jpg', 'systemdisk_10_en_disc1.jpg'], |
| | '16': ['systemdisk_16_en_rescue.jpg'], |
| | '9256': ['systemdisk_9256_en_disc1.jpg', 'systemdisk_9256_en_disc2.jpg'] |
| | }; |
| | var lista = discosData[pcwActual] || []; |
| | htmlDiscos = '<div class="disk-grid">'; |
| | lista.forEach(function(img, index){ |
| | htmlDiscos += '<div class="disk-item"><img src="' + rutaDiscos + img + '" onclick="abrirZoom(this.src)">DISCO ' + (index+1) + '</div>'; |
| | }); |
| | htmlDiscos += '</div>'; |
| } | } |
| } | |
| |
| function playStepSound() { | |
| initAudio(); const now = audioCtx.currentTime; | |
| const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); const filter = audioCtx.createBiquadFilter(); | |
| osc.type = 'triangle'; osc.frequency.setValueAtTime(130, now); | |
| filter.type = 'bandpass'; filter.frequency.setValueAtTime(1100, now); | |
| gain.gain.setValueAtTime(0.22, now); gain.gain.exponentialRampToValueAtTime(0.001, now + 0.035); | |
| osc.connect(filter); filter.connect(gain); gain.connect(audioCtx.destination); | |
| osc.start(); osc.stop(now + 0.035); | |
| } | |
| |
| function startMotorSound() { | |
| initAudio(); motorNode = audioCtx.createOscillator(); const motorGain = audioCtx.createGain(); | |
| motorNode.type = 'sine'; motorNode.frequency.setValueAtTime(42, audioCtx.currentTime); | |
| motorLFO = audioCtx.createOscillator(); const lfoGain = audioCtx.createGain(); | |
| motorLFO.frequency.setValueAtTime(6, audioCtx.currentTime); lfoGain.gain.setValueAtTime(0.004, audioCtx.currentTime); | |
| motorLFO.connect(lfoGain); lfoGain.connect(motorGain.gain); | |
| motorGain.gain.setValueAtTime(0.007, audioCtx.currentTime); motorNode.connect(motorGain); motorGain.connect(audioCtx.destination); | |
| motorNode.start(); motorLFO.start(); | |
| } | |
| |
| function stopMotorSound() { if (motorNode) { motorNode.stop(); motorNode = null; } if (motorLFO) { motorLFO.stop(); motorLFO = null; } } | |
| |
| function selectModel(model, btn) { | |
| if (isSystemLoaded) { playBuzzerError(); document.getElementById('status-msg').innerHTML = `<span class="blink-yellow">PULSE EJECT PARA EXTRAER EL DISCO</span>`; return; } | |
| document.querySelectorAll('.btn-model').forEach(b => b.classList.remove('active')); | |
| btn.classList.add('active'); currentModel = model; | |
| document.getElementById('lang-selector').style.display = 'block'; | |
| const flags = { es: document.getElementById('flag-es'), fr: document.getElementById('flag-fr'), de: document.getElementById('flag-de') }; | |
| const showAll = (model === '8256' || model === '8512'); | |
| Object.values(flags).forEach(f => { if(f) f.style.display = showAll ? 'inline-block' : 'none'; }); | |
| const status = document.getElementById('status-msg'); status.className = ""; | |
| status.innerHTML = `<span class="status-green">PCW ${model} SELECCIONADO.</span><br><span class="blink-yellow" style="display:block; margin-top:5px;">SELECCIONE EL IDIOMA DEL DISCO DE SISTEMA</span>`; | |
| } | |
| |
| function selectLang(lang, btn) { | if (htmlDiscos !== '') { |
| if (isSystemLoaded) { playBuzzerError(); document.getElementById('status-msg').innerHTML = `<span class="blink-yellow">PULSE EJECT PARA EXTRAER EL DISCO</span>`; return; } | var sufijo = (idLang === 'es') ? "" : idLang; |
| document.querySelectorAll('.flag-btn').forEach(b => b.classList.remove('active')); | // URL Corregida: sistema (en singular) |
| btn.classList.add('active'); currentLang = lang; | var urlFinal = "doku.php?id=sistema:discos:descargas:pcw" + pcwActual + sufijo; |
| isSystemLoaded = true; | |
| const status = document.getElementById('status-msg'); status.className = ""; | htmlDiscos += '<div class="download-zone">' + |
| if (currentModel === '8256' || currentModel === '8512') { | '<a href="' + urlFinal + '" target="_blank" class="btn-download">DESCARGAR DISCOS SISTEMA ' + pcwActual.toUpperCase() + ' (' + idLang.toUpperCase() + ')</a>' + |
| status.innerHTML = `<span class="status-green">SISTEMA PCW ${currentModel} (${translations[lang].name}) LISTO.</span><br><span class="blink-yellow" style="display:block; margin-top:5px;">PULSE EJECT PARA REINICIAR O CARGUE UN DISCO</span>`; | '</div>'; |
| updateShelf(); | pantalla.innerHTML = htmlDiscos; |
| } else { | } else { |
| status.innerHTML = `<span class="status-green">PCW ${currentModel} (${translations[lang].name}) SELECCIONADO.</span><br><span style="color:#ff0000 !important; font-weight:900; display:block; margin-top:5px;" class="blink-yellow">ERROR: Disco de Sistema no disponible</span>`; | pantalla.innerHTML = '<div style="text-align:center; padding-top:100px; opacity:0.5;">CONTENIDO NO DISPONIBLE_</div>'; |
| } | } |
| } | } |
| |
| function updateShelf() { | function abrirZoom(src) { |
| const shelf = document.getElementById('disk-shelf-display'); | document.getElementById('modal-img').src = src; |
| shelf.innerHTML = ""; shelf.style.display = 'flex'; | document.getElementById('disk-modal').style.display = 'flex'; |
| for(let i=1; i<=2; i++) { | |
| shelf.innerHTML += ` | |
| <div class="disk-wrapper"> | |
| <div class="disk-container" id="disk${i}"> | |
| <div class="disk-face disk-front" onclick="triggerLoadFromDisk(${i}, false)"> | |
| <div class="hole-left-rect"></div><div class="hole-right-circ"></div> | |
| <div class="disk-hub-wrapper"><div class="hub-3inch" id="hub${i}front"><div class="hub-3inch-notch"></div></div></div> | |
| <div class="disk-label-amsoft">${getLabelHTML(i, 'A')}</div> | |
| </div> | |
| <div class="disk-face disk-back" onclick="triggerLoadFromDisk(${i}, true)"> | |
| <div class="hole-left-rect"></div><div class="hole-right-circ"></div> | |
| <div class="disk-hub-wrapper"><div class="hub-3inch" id="hub${i}back"><div class="hub-3inch-notch"></div></div></div> | |
| <div class="disk-label-amsoft">${getLabelHTML(i, 'B')}</div> | |
| </div> | |
| </div> | |
| <button class="flip-btn" onclick="document.getElementById('disk${i}').classList.toggle('is-flipped'); this.blur();">⟲ GIRAR DISCO ${i}</button> | |
| </div>`; | |
| } | |
| } | } |
| |
| function getLabelHTML(diskNum, side) { | function cerrarZoom() { |
| const t = translations[currentLang]; const isA = (side === 'A'); | document.getElementById('disk-modal').style.display = 'none'; |
| const sideNum = (diskNum === 1) ? (isA ? "1" : "2") : (isA ? "3" : "4"); | |
| let data = t['d' + sideNum]; | |
| let isLongSer = !isA; | |
| let serStyle = isLongSer ? `width: 54px; height: 11px; right: 2px; font-size: 3.6px; top: 4px;` : `width: 44px; height: 13px; right: 6px; font-size: 8px; top: 4px;`; | |
| if (currentLang === 'de' && !isA) serStyle = `width: 52px; height: 11px; right: 2px; font-size: 3.8px; top: 4px;`; | |
| let logo = (currentLang === 'de') ? `<div class="schneider-container"><div class="schneider-symbol"><div class="u-shape u-black"></div><div class="u-shape u-red"></div></div><div style="display:flex;flex-direction:column;"><span class="schneider-text-logo">Schneider</span><span class="schneider-subtext">COMPUTER SOFTWARE</span></div></div>` : `<div style="display:flex; align-items:center; gap:8px;"><span class="amsoft-logo-text">Amsoft</span><span class="amstrad-subtext-black">${t.amstrad}</span></div>`; | |
| let finalStyle = "font-size: 11px; font-weight: 900; display: block; text-transform: uppercase; line-height: 1.1; margin-top: -1px; white-space: nowrap;"; | |
| if (sideNum === "3") { | |
| let esMargin = (currentLang === 'es') ? "margin-top: -1px;" : "margin-top: -4px;"; | |
| finalStyle = `font-size: 10.5px; font-weight: 900; line-height: 0.95; ${esMargin} display: block; width: 130px; white-space: normal;`; | |
| if(currentLang === 'fr' || currentLang === 'uk') finalStyle = "font-size: 9.2px; font-weight: 900; line-height: 0.95; margin-top: 2px; display: block; width: 125px; white-space: normal;"; | |
| if(currentLang === 'fr') finalStyle += "transform: scaleX(0.92); transform-origin: left;"; | |
| if(currentLang === 'de') finalStyle = "font-size: 10.5px; font-weight: 950; line-height: 1; margin-top: -1px; transform: scaleX(0.8); transform-origin: left; display: block; width: 140px;"; | |
| } | |
| if (sideNum === "4") { | |
| finalStyle = "font-size: 9.2px; font-weight: 900; display: block; text-transform: uppercase; line-height: 1; margin-top: 1px; white-space: nowrap; transform: scaleX(0.9); transform-origin: left;"; | |
| if (currentLang === 'de') finalStyle = "font-size: 8.8px; font-weight: 950; line-height: 1; transform: scaleX(0.88); transform-origin: left; width: 150px; letter-spacing: -0.1px;"; | |
| } | |
| return `<div class="label-header ${t.header}">${logo}<div class="side-indicator-container">${sideNum} <div class="arrow-cajetin">↑</div></div></div><div class="label-body-replica"><span class="txt-desc-top">${data.desc}</span><span style="${finalStyle}">${data.t2}</span><div class="serial-box-only" style="${serStyle}"><span>${data.ser}</span></div><div class="txt-small-legales">${t.lic}</div></div><div class="label-footer-grey"><div class="cs-logo-label">CS</div><span class="copy-text-replica">${t.copy}</span></div>`; | |
| } | } |
| |
| function triggerLoadFromDisk(idx, isBack) { | document.onkeydown = function(evt) { |
| const sideChar = isBack ? 'B' : 'A'; const sideNum = (idx === 1) ? (isBack ? "2" : "1") : (isBack ? "4" : "3"); | if (evt.key === "Escape") cerrarZoom(); |
| if(currentLoading) clearInterval(currentLoading); | }; |
| const t = translations[currentLang]; let name = (t['d' + sideNum].t2 || t['d' + sideNum].desc).replace(/<[^>]*>?/gm, ' ').replace(/\s\s+/g, ' '); | |
| const status = document.getElementById('status-msg'); const led = document.getElementById('drive-led'); const dlZone = document.getElementById('download-zone'); | |
| dlZone.style.display = 'none'; status.className = ""; status.style.color = "#ffff00"; led.className = "drive-led led-active led-reading"; | |
| const hub = document.getElementById(`hub${idx}${isBack ? 'back' : 'front'}`); | |
| document.querySelectorAll('.hub-3inch').forEach(h => h.classList.remove('spinning')); | |
| if(hub) hub.classList.add('spinning'); | |
| playRecalibrate(); setTimeout(() => startMotorSound(), 550); | |
| let track = 0; | |
| currentLoading = setInterval(() => { | |
| status.innerHTML = `LEYENDO DISCO ${idx} [CARA ${sideChar}] - PISTA ${track}...<br>CARGANDO: <span style="color:#fff; font-weight:bold;">${name}</span>`; | |
| if (track > 0) playStepSound(); | |
| track++; | |
| if (track > 40) { | |
| clearInterval(currentLoading); stopMotorSound(); led.className = "drive-led"; if(hub) hub.classList.remove('spinning'); | |
| status.innerHTML = `<span class="status-green">SISTEMA MONTADO: ${name}</span><br><span style='color:#fff;'>DISCO LISTO</span>`; | |
| const fileName = `Disco_sistema_${currentModel}_${t.code}_d${idx}_${sideChar}.zip`; | |
| dlZone.innerHTML = `<a href="/lib/exe/fetch.php?media=sistema:descargas:${fileName}" class="download-link">OBTENER IMAGEN .DSK DEL SISTEMA</a>`; | |
| dlZone.style.display = 'block'; | |
| } | |
| }, 180); | |
| } | |
| </script> | </script> |
| </html> | </html> |
| |