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

AF

FILE INFORMATION

FILENAME(S): AF <p><strong>FILE TYPE(S):</strong> PRG</p> <p><strong>FILE SIZE:</strong> 1.1K</p> <p><strong>FIRST SEEN:</strong> 2025-11-30 21:05:16</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;"> 2ea7eccbb9d5a2d644fde890f90c43e9697ad52897fe9632682ce729a003cf2c </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=4652544fabb82f347e85f65bb0398e4335e1f542e9144bdb7021aaf9e6aefce8" style="color: #88aaff; text-decoration: none;" onmouseover="this.style.color='#ffffff'; this.style.textDecoration='underline';" onmouseout="this.style.color='#88aaff'; this.style.textDecoration='none';"> R W </a> </td> <td>AF<TITLE</td> <td>PRG</td> <td> DuncanTwain </td> <td>13</td> <td>2</td> <td> <a href="download_file.php?hash=2ea7eccbb9d5a2d644fde890f90c43e9697ad52897fe9632682ce729a003cf2c&disk=45430" 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: 02 FF 00 03 FF 00 00 FF 00 00 7D 00 0F 00 00 00 |..........}.....| 00000010: 07 FF E0 00 7F 00 00 00 18 07 80 F0 07 FF E0 04 |................| 00000020: 7F E0 04 17 60 00 16 40 00 06 C0 00 04 C0 00 04 |....`..@........| 00000030: 80 00 05 80 17 05 F8 18 FF 38 07 00 E0 00 FF 0D |.........8......| 00000040: 00 09 0B 0F FF C0 00 FE 0D 00 21 02 00 00 03 BD |..........!.....| 00000050: 00 03 FF 00 03 FF 00 03 FE 0D 00 03 0F 0D 00 00 |................| 00000060: FE 0D 00 21 02 00 00 03 FD 00 03 FF 00 03 FF 00 |...!............| 00000070: 03 FF 00 00 DF 00 00 7D 00 0F 0D 00 26 02 00 00 |.......}....&...| 00000080: 03 7D 00 03 FF 00 03 FF 00 03 FF 00 00 FF 00 00 |.}..............| 00000090: 7D 00 0F 0D 00 36 FF 00 00 7D 00 0F 0F FF C0 00 |}....6...}......| 000000A0: FE 0D 00 36 0F 0F FF C0 00 FE 0D 00 21 02 00 00 |...6........!...| 000000B0: 02 FD 00 03 7E 0D 00 09 0F 0F FF C0 00 FE 0D 00 |....~...........| 000000C0: 21 02 00 00 03 FD 00 03 FF 00 03 FF 00 03 FF 00 |!...............| 000000D0: 00 FF 0D 00 00 0F 0D 00 26 02 00 00 03 FD 00 03 |........&.......| 000000E0: F7 00 02 FF 00 03 FF 00 00 FF 00 00 7D 00 0F 0D |............}...| 000000F0: 00 05 01 00 00 01 80 00 00 E6 00 00 FF 00 00 7F |................| 00000100: 80 00 3F 80 00 3C 00 00 3C 00 00 3C 00 00 66 00 |..?..<..<..<..f.| 00000110: 00 66 00 00 66 00 00 66 00 00 E6 00 00 66 0D 00 |.f..f..f.....f..| 00000120: 06 08 0D 00 0C 84 00 00 4E 00 00 22 00 00 26 00 |........N.."..&.| 00000130: 00 0A 00 00 3C 00 00 28 00 00 44 00 00 22 00 00 |....<..(..D.."..| 00000140: 44 00 00 22 00 00 44 00 00 22 0D 00 06 02 0D 00 |D.."..D.."......| 00000150: 0B 01 04 00 00 CE 00 00 22 00 00 26 00 00 0A 00 |........"..&....| 00000160: 00 3C 00 00 28 00 00 44 00 00 22 00 00 44 00 00 |.<..(..D.."..D..| 00000170: 22 00 00 44 00 00 22 0D 00 06 02 0D 00 0B 01 04 |"..D..".........| 00000180: 00 00 CD 00 00 22 00 00 26 00 00 08 00 00 3C 00 |....."..&.....<.| 00000190: 00 28 00 00 44 00 00 22 00 00 44 00 00 22 00 00 |.(..D.."..D.."..| 000001A0: 44 00 00 22 0D 00 06 02 0D 00 08 01 00 00 00 84 |D.."............| 000001B0: 00 00 8D 00 00 46 00 00 24 00 00 08 00 00 3C 00 |.....F..$.....<.| 000001C0: 00 28 00 00 44 00 00 22 00 00 44 00 00 22 00 00 |.(..D.."..D.."..| 000001D0: 44 00 00 22 0D 00 06 02 0D 00 08 01 00 00 00 84 |D.."............| 000001E0: 00 00 8C 00 00 42 00 00 26 00 00 08 00 00 3C 00 |.....B..&.....<.| 000001F0: 00 28 00 00 44 00 00 22 00 00 44 00 00 22 00 00 |.(..D.."..D.."..| 00000200: 44 00 00 22 0D 00 06 02 0D 00 05 01 80 00 00 C0 |D.."............| 00000210: 00 00 E4 00 00 7E 00 00 3E 00 00 3E 00 00 3C 00 |.....~..>..>..<.| 00000220: 00 3C 00 00 3C 00 00 66 00 00 66 00 00 66 00 00 |.<..<..f..f..f..| 00000230: 66 00 00 E6 00 00 66 0D 00 06 08 0D 00 08 01 80 |f.....f.........| 00000240: 00 01 E4 00 00 FE 00 00 3E 00 00 3E 00 00 3E 00 |........>..>..>.| 00000250: 00 3C 00 00 3C 00 00 66 00 00 66 00 00 66 00 00 |.<..<..f..f..f..| 00000260: 66 00 00 E6 00 00 66 0D 00 06 08 0D 00 08 01 82 |f.....f.........| 00000270: 00 01 E7 00 00 FF 00 00 3E 00 00 3E 00 00 3C 00 |........>..>..<.| 00000280: 00 3C 00 00 3C 00 00 66 00 00 66 00 00 66 00 00 |.<..<..f..f..f..| 00000290: 66 00 00 E6 00 00 66 0D 00 06 08 0D 00 05 01 00 |f.....f.........| 000002A0: 00 01 81 00 00 E7 00 00 FF 00 00 7E 00 00 3C 00 |...........~..<.| 000002B0: 00 3C 00 00 3C 00 00 3C 00 00 66 00 00 66 00 00 |.<..<..<..f..f..| 000002C0: 66 00 00 66 00 00 E6 00 00 66 0D 00 06 08 0D 00 |f..f.....f......| 000002D0: 08 01 00 00 00 84 00 00 8C 00 00 42 00 00 27 00 |...........B..'.| 000002E0: 00 28 00 00 3C 00 00 28 00 00 44 00 00 22 00 00 |.(..<..(..D.."..| 000002F0: 44 00 00 22 00 00 44 00 00 22 0D 00 06 02 0D 00 |D.."..D.."......| 00000300: 02 01 80 00 00 18 00 00 18 00 00 18 0D 00 2A 0A |..............*.| 00000310: 0D 00 05 01 98 00 00 18 00 00 18 0D 00 2A 0A 0D |.............*..| 00000320: 00 05 01 9A 00 00 18 00 00 18 0D 00 2A 0A 0D 00 |............*...| 00000330: 03 01 00 02 19 00 00 18 00 00 18 0D 00 2A 0A 94 |.............*..| 00000340: 00 40 00 64 00 03 0D 00 01 94 00 40 00 64 00 03 |.@.d.......@.d..| 00000350: 00 00 00 1E 00 94 00 40 00 64 00 03 00 00 00 3C |.......@.d.....<| 00000360: 00 8F 00 FC FF 64 00 03 00 00 00 5A 00 A6 00 2D |.....d.....Z...-| 00000370: 00 64 02 03 00 15 00 6B 00 90 00 24 00 64 00 03 |.d.....k...$.d..| 00000380: 00 00 00 6D 00 8F 00 23 00 64 00 03 00 00 00 8F |...m...#.d......| 00000390: 00 8F 00 23 00 64 00 03 00 00 00 A0 00 32 52 39 |...#.d.......2R9| 000003A0: 28 52 53 29 33 54 33 55 35 52 32 35 61 36 52 53 |(RS)3T3U5R25a6RS| 000003B0: 52 33 54 33 55 32 30 30 52 2E 00 32 62 39 28 62 |R3T3U200R..2b9(b| 000003C0: 63 29 33 64 33 65 35 63 32 35 63 36 62 63 62 33 |c)3d3e5c25c6bcb3| 000003D0: 64 33 65 32 30 30 62 2E 00 32 57 39 28 57 58 29 |d3e200b..2W9(WX)| 000003E0: 33 59 33 5A 35 58 32 35 51 36 57 58 57 33 59 33 |3Y3Z5X25Q6WXW3Y3| 000003F0: 5A 32 30 30 57 2E 00 32 32 28 41 5F 29 34 34 41 |Z200W..22(A_)44A| 00000400: 32 32 28 41 5E 29 2E 00 42 00 32 32 28 4D 5F 29 |22(A^)..B.22(M_)| 00000410: 31 30 4D 4E 44 49 4F 45 32 4A 36 28 4B 50 46 29 |10MNDIOE2J6(KPF)| 00000420: 47 5B 2D 32 30 30 2C 30 5D 45 2E 00 32 32 28 48 |G[-200,0]E..22(H| 00000430: 5F 29 34 34 48 32 32 28 48 5E 29 2E 00 32 32 28 |_)44H22(H^)..22(| 00000440: 43 5F 29 34 34 43 32 32 28 43 5E 29 2E 00 |C_)44C22(C^).. | </pre> </div> <!-- PETSCII Dump Tab --> <div id="petscii-tab" class="tab-content dump-box"> <pre>..........}.......................`..@ .................8................!..... ...................!...................} ....&....}..............}....6...}...... ...6........!.......~...........!....... ................&...................}... .................?..<..<..<..F..F..F..F .....F..........N.."..&.....<..(..D..".. D.."..D.."...........N.."..&.....<..(..D .."..D.."..D.."...........M.."..&.....<. .(..D.."..D.."..D..".................F.. $.....<..(..D.."..D.."..D.."............ .....B..&.....<..(..D.."..D.."..D..".... .............~..>..>..<..<..<..F..F..F.. F.....F.................>..>..>..<..<..F ..F..F..F.....F.................>..>..<. .<..<..F..F..F..F.....F................. ...~..<..<..<..<..F..F..F..F.....F...... ...........B..'..(..<..(..D.."..D.."..D. ."....................*..............*.. ............*................*...@.D.... ...@.D.........@.D.....<.....D.....Z...- .D.....K...$.D.....M...#.D.........#.D.. ... .2R9(RS)3T3U5R25A6RSR3T3U200R..2B9(B C)3D3E5C25C6BCB3D3E200B..2W9(WX)3Y3Z5X25 Q6WXW3Y3Z200W..22(A_)44A22(A^)..B.22(M_) 10MNDIOE2J6(KPF)G[-200,0]E..22(H_)44H22( H^)..22(C_)44C22(C^).. </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,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" 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>