_  __   _  _         _ _     _      _           _           
  __| |/ /_ | || |     __| (_)___| | __ (_)_ __   __| | _____  __
 / _` | '_ \| || |_   / _` | / __| |/ / | | '_ \ / _` |/ _ \ \/ /
| (_| | (_) |__   _| | (_| | \__ \   <  | | | | | (_| |  __/>  < 
 \__,_|\___/   |_|    \__,_|_|___/_|\_\ |_|_| |_|\__,_|\___/_/\_\
                                                                 
            

AF

FILE INFORMATION

FILENAME(S): AF <p><strong>FILE TYPE(S):</strong> PRG</p> <p><strong>FILE SIZE:</strong> 526b</p> <p><strong>FIRST SEEN:</strong> 2025-11-30 18:12:39</p> <p><strong>APPEARS ON:</strong> 1 disk(s)</p> </div> <div class="info-group"> <h3>FILE HASH</h3> <p style="font-size: 10px; word-break: break-all; font-family: monospace;"> 2b4948b3bb4f0d3c238dc791cbfda8ed53629dc4a30960efb71aa896f91ca3c2 </p> </div> </div> </div> <div class="file-list"> <h2>FOUND ON DISKS (1 DISKS)</h2> <table class="file-table"> <thead> <tr> <th>DISK TITLE</th> <th>FILENAME</th> <th>FILE TYPE</th> <th>COLLECTION</th> <th>TRACK</th> <th>SECTOR</th> <th>ACTIONS</th> </tr> </thead> <tbody> <tr> <td> <a href="disk.php?hash=4dba147b9699d13e294127e913fbccf9a4a58ab9cee7ef67933b6ae4a729f1e5" style="color: #88aaff; text-decoration: none;" onmouseover="this.style.color='#ffffff'; this.style.textDecoration='underline';" onmouseout="this.style.color='#88aaff'; this.style.textDecoration='none';"> RED STORM S 1 </a> </td> <td>AF<TITLE</td> <td>PRG</td> <td> Sailor, Ganheden </td> <td>13</td> <td>16</td> <td> <a href="download_file.php?hash=2b4948b3bb4f0d3c238dc791cbfda8ed53629dc4a30960efb71aa896f91ca3c2&disk=34700" style="color: #88aaff; text-decoration: none; font-size: 12px;" onmouseover="this.style.color='#ffffff'; this.style.textDecoration='underline';" onmouseout="this.style.color='#88aaff'; this.style.textDecoration='none';">DOWNLOAD FILE</a> </td> </tr> </tbody> </table> </div> <div class="welcome-message"> <h2>FILE CONTENT & ANALYSIS</h2> <!-- Tab Navigation --> <div class="tab-navigation" style="margin: 15px 0 5px 0;"> <button class="tab-btn active" onclick="switchTab(event, 'analysis-tab')" data-tab="analysis">ANALYSIS</button> <button class="tab-btn" onclick="switchTab(event, 'hex-tab')" data-tab="hex">HEX DUMP</button> <button class="tab-btn" onclick="switchTab(event, 'petscii-tab')" data-tab="petscii">PETSCII DUMP</button> <button class="tab-btn" onclick="switchTab(event, 'image-tab')" data-tab="image">IMAGE</button> </div> <!-- Analysis Tab --> <div id="analysis-tab" class="tab-content active dump-box" style="font-family: monospace; font-size:12px; white-space:normal; line-height:1.4;"> <p></p> </div> <!-- Hex Dump Tab --> <div id="hex-tab" class="tab-content dump-box"> <pre>00000000: 0D 50 4D 0F 0F 07 00 CE 00 2A 80 00 2A 80 00 2A |.PM......*..*..*| 00000010: 80 03 FF C0 07 FF C0 07 FF C0 07 FF C0 07 FF C0 |................| 00000020: 07 FF C0 07 FF C0 07 FF C0 07 FF C0 07 FF C0 00 |................| 00000030: 94 00 32 00 64 02 01 E8 05 00 00 94 00 32 00 64 |..2.d........2.d| 00000040: 00 01 00 00 00 02 00 60 00 0A 00 64 02 01 18 00 |.......`...d....| 00000050: 00 3A 00 78 00 0A 00 64 02 01 30 00 00 3C 00 90 |.:.x...d..0..<..| 00000060: 00 0A 00 64 02 01 48 00 00 3E 00 A8 00 0A 00 64 |...d..H..>.....d| 00000070: 02 01 60 00 00 40 00 1F 00 06 00 64 02 01 0C F0 |..`..@.....d....| 00000080: 00 42 05 00 01 FA 02 01 77 FF 00 44 00 44 00 24 |.B......w..D.D.$| 00000090: 31 30 30 20 32 38 28 45 5E 29 24 32 35 35 20 38 |100 28(E^)$255 8| 000000A0: 30 28 45 3C 29 24 31 30 30 20 35 30 28 45 3C 3C |0(E<)$100 50(E<<| 000000B0: 3C 5E 29 45 5B 2B 32 33 30 2C 30 5D 37 30 28 45 |<^)E[+230,0]70(E| 000000C0: 3C 3C 3C 5F 29 2A 00 46 00 47 00 48 00 49 00 4A |<<<_)*.F.G.H.I.J| 000000D0: 00 41 42 43 00 A0 A0 A0 A0 A0 A0 00 00 00 00 00 |.ABC............| 000000E0: 00 00 00 00 07 00 00 00 82 0F 04 41 46 3C 43 A0 |...........AF<C.| 000000F0: A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 00 00 00 01 50 |...............P| 00000100: 4D 0F 0F 07 01 09 00 00 00 00 00 00 00 00 00 00 |M...............| 00000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000120: 07 00 00 6B 01 FF F7 00 00 00 00 00 00 00 00 00 |...k............| 00000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000150: 00 00 00 00 00 00 00 00 00 00 00 00 BD 00 00 00 |................| 00000160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000190: 00 00 00 00 00 00 00 00 00 BA 00 0B CF 40 00 00 |.............@..| 000001A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001D0: 00 00 00 00 00 00 00 00 01 7D 00 0F AB E0 00 00 |.........}......| 000001E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001F0: 00 00 00 00 00 00 00 00 00 00 00 00 0E 50 4D 0F |.............PM.| 00000200: 0F 07 0E 03 AA 9A 6A 6A AA AA 6A A6 9A AA |......jj..j... | </pre> </div> <!-- PETSCII Dump Tab --> <div id="petscii-tab" class="tab-content dump-box"> <pre>.PM....N.*..*..*........................ ..........2.D........2.D.......`...D.... .:.X...D..0..<.....D..H..>.....D..`..@.. ...D.....B......W..D.D.$100 28(E^)$255 8 0(E<)$100 50(E<<<^)E[+230,0]70(E<<<_)*.F .G.H.I.J.ABC. ................AF<C ....PM....................... ...........K............................ ........................................ ........................................ ............O@.......................... .................................}...... .............................PM.......JJ ..J... </pre> </div> <!-- IMAGE Tab --> <div id="image-tab" class="tab-content dump-box" style="text-align:center;"> <div class="c64-preview-controls" style="margin:10px 0; display:flex; align-items:center; gap:10px;"> <label for="c64-vis-type">Visualization:</label> <select id="c64-vis-type" onchange="c64OnVisChange()"> <option value="koala" >Koala</option> <option value="raw_bitplane" >Raw (Bitplane)</option> <option value="raw_cellular" selected>Raw (Cellular)</option> <option value="doodle" >Doodle</option> </select> <div id="c64-raw-controls" style="display: inline-block; margin-left:10px;"> <label for="c64-raw-width">Width:</label> <input type="number" id="c64-raw-width" value="320" min="8" step="8" style="width:70px;" onchange="c64OnWidthChange()" /> <label style="margin-left:10px;"> <input type="checkbox" id="c64-raw-skip-load" onchange="c64OnSkipLoadChange()" checked /> Skip load address (+2) </label> <label style="margin-left:10px;"> <input type="checkbox" id="c64-raw-invert" onchange="c64OnInvertChange()" /> Invert </label> </div> </div> <div style="text-align:center; padding:10px;"> <img id="c64-preview-img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAQCAIAAADoCzG+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACm0lEQVRoge1ay47DIAyEVf//l9lDJIu1PYMhkDRZ5lARAuN3iNumlFIpJaV0DI6xDCwKAF/Wy6PGriYrQAy/hkT8PybCdZoduxG32y1bJJoNC411rgK9QJq7UghJ3IpvRMSAsYJEy7p0qwfBREEJ3aWAyzOQdkgfst4dk+29JqMYqbH6lF3uvLrbVL43ExBPTTVGmP5aNwvWXXP5tSSbBMQpNmx8AVqpAo9if9K6p/A0RSAXuaWFLu28mnTDUU82+adD5YmaRxYNSDmn5nX8n/oi51zHIOeccz7m5RPJPu4iFdVdwqMWHyrJzLFLNLG0ZF5RyUrLj3QO8iAFXB5CrhRzfSgxikDIFb/My125JFToltW/HiTPgXHY3IioFMSwVpxzLuFZuOdnqh6NCnxZXOh0hbsYzquhCAlVRAo6Z9BeJVGdqFYfe7pyuXFMOSGtYgkfznGGFVAe7s38qAAlrL6bqNObBRksbLveSiRZ1eURl8dlHuCxhsRtr/cSrVCAEs6PSHSIaTYcKDGIb9GWMSAewj9L9DOA7AwmZTNl3eiiZUudPot8mKf2kvKY8p6qAeteXqhENCngyPo4egPKS3SggBN4JM3FSS/F8RF5thGyOsk43tOi3ljm6wYbbUd3S7inJX1Xb2+M9HFFFNy0F9NnNuPttqyKGVmKWug6rd0Os9kWxh0+kNDKY8M8CafiCkzvpTc2lgO9Pqw+7v4z9nPCQX00PfFRyt+VLpOu3hFuUeb1+JlF5DZmD3ro2mbyRmUGoBy+tFRsiJH0o4ZR87KxMROPK9oaF3xr4j6U+QvzfoXe2PgWkFrdhXoXpr1Cb7weV36LuxHELuA34MZa2v3tvfi0l7wL6sfPM//LvQuRH6WXgv9NeuNK/AIc92dMhlbXBwAAAABJRU5ErkJggg==" alt="C64 Preview" style="border:1px solid #666; image-rendering:pixelated; max-width:100%; cursor:pointer;" onclick="c64OpenModal()" /> </div> <div id="c64-modal" class="modal" style="display:none; position:fixed; inset:0; background:rgba(0,0,0,0.9); z-index:1000;"> <span id="c64-modal-close" class="modal-close" style="position:absolute; top:15px; right:25px; color:#ff6600; font-size:40px; cursor:pointer;">×</span> <img id="c64-modal-img" class="modal-content" style="display:block; margin:2% auto; max-width:95%; max-height:95%; border:2px solid #ff6600;"> <div id="c64-modal-caption" class="modal-info" style="text-align:center; color:#ffaa66; font-family:monospace; margin-top:10px;"> C64 Image </div> </div> <script> function c64OnVisChange() { var type = document.getElementById('c64-vis-type').value; var url = new URL(window.location.href); if (type === 'raw_bitplane' || type === 'raw_cellular') { url.searchParams.set('preview', 'raw'); url.searchParams.set('raw_type', type === 'raw_bitplane' ? 'bitplane' : 'cellular'); var widthVal = document.getElementById('c64-raw-width').value || '320'; url.searchParams.set('raw_width', widthVal); var skip = document.getElementById('c64-raw-skip-load').checked ? '1' : '0'; url.searchParams.set('raw_skip_load', skip); var inv = document.getElementById('c64-raw-invert').checked ? '1' : '0'; url.searchParams.set('raw_invert', inv); } else if (type === 'doodle') { url.searchParams.set('preview', 'doodle'); url.searchParams.delete('raw_type'); url.searchParams.delete('raw_width'); url.searchParams.delete('raw_invert'); url.searchParams.delete('raw_skip_load'); } else { url.searchParams.set('preview', 'c64'); url.searchParams.delete('raw_type'); url.searchParams.delete('raw_width'); url.searchParams.delete('raw_invert'); url.searchParams.delete('raw_skip_load'); } window.location.href = url.toString(); } function c64OnWidthChange() { var widthVal = parseInt(document.getElementById('c64-raw-width').value, 10); if (isNaN(widthVal) || widthVal < 8) widthVal = 320; widthVal = Math.round(widthVal / 8) * 8; document.getElementById('c64-raw-width').value = widthVal; var url = new URL(window.location.href); url.searchParams.set('preview', 'raw'); var type = document.getElementById('c64-vis-type').value; var rawType = (type === 'raw_cellular') ? 'cellular' : 'bitplane'; url.searchParams.set('raw_type', rawType); url.searchParams.set('raw_width', String(widthVal)); var skip = document.getElementById('c64-raw-skip-load').checked ? '1' : '0'; url.searchParams.set('raw_skip_load', skip); var inv = document.getElementById('c64-raw-invert').checked ? '1' : '0'; url.searchParams.set('raw_invert', inv); window.location.href = url.toString(); } function c64OnInvertChange() { var url = new URL(window.location.href); url.searchParams.set('preview', 'raw'); var type = document.getElementById('c64-vis-type').value; var rawType = (type === 'raw_cellular') ? 'cellular' : 'bitplane'; url.searchParams.set('raw_type', rawType); var widthVal = document.getElementById('c64-raw-width').value || '320'; url.searchParams.set('raw_width', widthVal); var inv = document.getElementById('c64-raw-invert').checked ? '1' : '0'; url.searchParams.set('raw_invert', inv); var skip = document.getElementById('c64-raw-skip-load').checked ? '1' : '0'; url.searchParams.set('raw_skip_load', skip); window.location.href = url.toString(); } function c64OnSkipLoadChange() { var url = new URL(window.location.href); url.searchParams.set('preview', 'raw'); var type = document.getElementById('c64-vis-type').value; var rawType = (type === 'raw_cellular') ? 'cellular' : 'bitplane'; url.searchParams.set('raw_type', rawType); var widthVal = document.getElementById('c64-raw-width').value || '320'; url.searchParams.set('raw_width', widthVal); var skip = document.getElementById('c64-raw-skip-load').checked ? '1' : '0'; url.searchParams.set('raw_skip_load', skip); window.location.href = url.toString(); } function c64OpenModal() { var modal = document.getElementById('c64-modal'); var img = document.getElementById('c64-preview-img'); var modalImg = document.getElementById('c64-modal-img'); modalImg.src = img.src; modal.style.display = 'block'; document.body.style.overflow = 'hidden'; } function c64CloseModal(){ var modal = document.getElementById('c64-modal'); modal.style.display = 'none'; document.body.style.overflow = 'auto'; } document.getElementById('c64-modal-close').onclick = function(){ c64CloseModal(); }; document.getElementById('c64-modal').onclick = function(e){ if(e.target && e.target.id==='c64-modal'){ c64CloseModal(); } }; document.addEventListener('keydown', function(e){ if(e.key==='Escape'){ c64CloseModal(); }}); </script> <p style="font-size:11px;color:#6699ff;margin-top:8px;">> CLICK IMAGE PREVIEW FOR FULL MODAL</p> </div> </div> </main> <footer class="footer"> <p>> <a href="javascript:history.back()" style="color: #6699ff;">BACK</a> | FILE INFORMATION</p> </footer> </div> <script> function switchTab(event, tabId) { // Hide all tab contents const tabContents = document.querySelectorAll('.tab-content'); tabContents.forEach(tab => { tab.classList.remove('active'); }); // Remove active class from all tab buttons const tabButtons = document.querySelectorAll('.tab-btn'); tabButtons.forEach(btn => { btn.classList.remove('active'); }); // Show the selected tab content document.getElementById(tabId).classList.add('active'); // Mark the clicked button as active event.target.classList.add('active'); // Update format description const formatDesc = document.getElementById('format-desc'); if (formatDesc) { if (tabId === 'petscii-tab') { formatDesc.textContent = 'PETSCII'; } else { formatDesc.textContent = 'ASCII'; } } } function extractFileContent(fileHash) { const btn = document.getElementById('extractContentBtn'); const status = document.getElementById('extractStatus'); btn.disabled = true; btn.textContent = 'EXTRACTING...'; status.innerHTML = '<span style="color: #ffaa44;">> SEARCHING D64 FILES FOR CONTENT...</span>'; fetch('extract_file_content.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: 'file_hash=' + encodeURIComponent(fileHash) }) .then(response => response.json()) .then(data => { if (data.success) { status.innerHTML = '<span style="color: #00ff00;">> SUCCESS: Content extracted (' + data.bytes + ' bytes)</span>'; setTimeout(() => { location.reload(); // Reload page to show hex dump }, 2000); } else { let errorMsg = '<span style="color: #ff6666;">> ERROR: ' + data.error + '</span>'; // Add debug information if available if (data.debug) { errorMsg += '<br><span style="color: #ffaa44; font-size: 10px;">'; errorMsg += '> DEBUG: Target: ' + data.debug.target_filename + '<br>'; errorMsg += '> Files found in D64: ' + data.debug.files_found + '<br>'; errorMsg += '> Target hash: ' + data.debug.target_hash.substring(0, 16) + '...<br>'; if (data.matches_found && data.matches_found.length > 0) { errorMsg += '> Filename matches found: ' + data.matches_found.length + '<br>'; data.matches_found.forEach(match => { errorMsg += '> - Has content: ' + match.has_content + ', Length: ' + match.content_length; if (match.content_hash) { errorMsg += ', Hash: ' + match.content_hash.substring(0, 16) + '...'; errorMsg += ', Matches: ' + match.hash_matches; } errorMsg += '<br>'; }); } else { errorMsg += '> No filename matches found<br>'; } errorMsg += '</span>'; } status.innerHTML = errorMsg; btn.disabled = false; btn.textContent = 'EXTRACT CONTENT FROM D64'; } }) .catch(error => { status.innerHTML = '<span style="color: #ff6666;">> ERROR: Network error</span>'; btn.disabled = false; btn.textContent = 'EXTRACT CONTENT FROM D64'; }); } // C64 Image Modal Functions function openC64Modal(fileHash, formatName) { const modal = document.getElementById('c64ImageModal'); const modalImage = document.getElementById('modalImage'); const modalInfo = document.getElementById('modalInfo'); modalImage.src = 'render_c64_image.php?hash=' + fileHash ; modal.classList.add('show'); // Prevent body scrolling when modal is open document.body.style.overflow = 'hidden'; } function closeC64Modal(event) { const modal = document.getElementById('c64ImageModal'); const modalImage = document.getElementById('modalImage'); // Only close if clicking on modal background or close button, NOT on the image itself if (!event || event.target === modal || event.target.classList.contains('modal-close')) { modal.classList.remove('show'); // Re-enable body scrolling document.body.style.overflow = 'auto'; // Clear the image source to stop loading modalImage.src = ''; } } // Close modal with Escape key document.addEventListener('keydown', function(event) { if (event.key === 'Escape') { closeC64Modal(); } }); </script> <script> function openMusPlayer(hash, name) { const w = 700, h = 500; const y = window.top.outerHeight / 2 + window.top.screenY - ( h / 2); const x = window.top.outerWidth / 2 + window.top.screenX - ( w / 2); window.open('jssid/player.html?hash=' + encodeURIComponent(hash) + '&name=' + name, 'sidPlayer', 'width=' + w + ',height=' + h + ',left=' + x + ',top=' + y + ',resizable=yes,scrollbars=no'); return false; } </script> </body> </html>