{"id":11258,"date":"2026-10-26T12:50:09","date_gmt":"2026-10-26T11:50:09","guid":{"rendered":"https:\/\/retrofixer.it\/?page_id=11258"},"modified":"2026-10-26T12:50:31","modified_gmt":"2026-10-26T11:50:31","slug":"atari-tos-splitter","status":"publish","type":"page","link":"https:\/\/retrofixer.it\/en\/atari-tos-splitter\/","title":{"rendered":"Atari TOS Splitter"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11258\" class=\"elementor elementor-11258\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c852729 e-con-full e-flex e-con e-parent\" data-id=\"c852729\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0549164 elementor-widget elementor-widget-html\" data-id=\"0549164\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>window.RF_EN=\/^en\/i.test(document.documentElement.lang||'');if(window.RF_EN)document.documentElement.classList.add('rf-en');<\/script>\r\n<style>.rf-en .rf-it{display:none!important}<\/style>\r\n<div class=\"rf-it\" data-no-translation>\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Press+Start+2P&family=VT323&family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n\r\n<style>\r\n.rts{\r\n  --bg:#0f0c24; --bg2:#171338; --panel:#1d1846; --line:#342c74; --text:#eceaff; --muted:#aaa5d8;\r\n  --c64l:#7c70da; --yel:#ffd23f; --grn:#5ad15f; --cya:#3fd8ff; --ora:#f8961e; --red:#f94144; --mag:#e0398a;\r\n  --atari:#e0e0e0;\r\n  font-family:'Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif; color:var(--text); background:var(--bg); line-height:1.55;\r\n  position:relative; padding:44px 0 70px; overflow:clip;\r\n}\r\n.rts *,.rts *::before,.rts *::after{box-sizing:border-box}\r\n.rts h2,.rts h3,.rts h4,.rts p,.rts ul,.rts ol{margin:0;padding:0}\r\n.rts h2,.rts h3,.rts h4{font-family:'Inter',system-ui,sans-serif!important;letter-spacing:0;text-transform:none;font-weight:700}\r\n.rts a{color:inherit;text-decoration:none}\r\n.rts button,.rts input{font:inherit;color:inherit}\r\n.rts button{cursor:pointer;margin:0!important;height:auto!important;min-height:0!important;text-transform:none!important;letter-spacing:0!important;box-shadow:none}\r\n.rts [hidden]{display:none!important}\r\n.rts .wrap{max-width:1240px;margin:0 auto;padding:0 20px}\r\n.rts .stripe{height:6px;background:linear-gradient(90deg,var(--red) 0 16.6%,var(--ora) 0 33.3%,var(--yel) 0 50%,var(--grn) 0 66.6%,var(--cya) 0 83.3%,var(--c64l) 0);position:absolute;left:0;right:0;top:0}\r\n.rts .kicker{display:inline-block;font-family:'Press Start 2P',monospace;font-size:10px;color:var(--yel);letter-spacing:.06em;margin-bottom:12px}\r\n.rts .h2{font-family:'Press Start 2P',monospace!important;font-size:clamp(17px,2.4vw,26px);line-height:1.45;color:#fff;text-shadow:3px 3px 0 #000;margin-bottom:10px;font-weight:400}\r\n.rts .h3{font-family:'Press Start 2P',monospace!important;font-size:clamp(12px,1.5vw,15px);line-height:1.5;color:#fff;margin-bottom:8px;font-weight:400}\r\n.rts .sub{color:var(--muted);font-size:15.5px;max-width:860px}\r\n.rts .sub b,.rts p b{color:#fff}\r\n.rts section{margin-top:52px}\r\n.rts .head{margin-bottom:16px}\r\n.rts .panel{background:var(--bg2);border:2px solid var(--line);border-radius:16px;padding:16px}\r\n.rts .lbl{display:block;font-family:'Press Start 2P',monospace;font-size:9px;color:var(--yel);margin-bottom:10px;letter-spacing:.04em}\r\n.rts .hint{font-size:12.5px;color:var(--muted)}\r\n.rts .btn{display:inline-flex!important;align-items:center;justify-content:center;gap:8px;font-family:'Press Start 2P',monospace!important;font-size:9px!important;line-height:1.4!important;padding:11px 13px!important;border-radius:8px!important;border:2px solid var(--line)!important;background:rgba(255,255,255,.05)!important;color:#fff!important;white-space:nowrap}\r\n.rts .btn:hover{border-color:var(--c64l)!important}\r\n.rts .btn.y{background:var(--yel)!important;border-color:var(--yel)!important;color:#231a00!important;box-shadow:0 4px 0 #a07d00}\r\n.rts .btn.c{background:#123c48!important;border-color:var(--cya)!important}\r\n.rts .btn.s{padding:8px 10px!important;font-size:8px!important}\r\n.rts .btn:disabled{opacity:.35;cursor:not-allowed}\r\n.rts .btn .ic{font-family:'Segoe UI Symbol','Apple Color Emoji','Segoe UI Emoji',system-ui,sans-serif!important;font-style:normal;font-size:14px;line-height:1}\r\n\r\n.rts .grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);gap:18px;margin-top:22px;align-items:start}\r\n.rts .col{display:grid;gap:18px;min-width:0}\r\n.rts .col>*{min-width:0}\r\n\r\n\/* caricamento *\/\r\n.rts .drop{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;border:3px dashed var(--line);border-radius:16px;padding:24px 16px;background:repeating-linear-gradient(45deg,rgba(255,255,255,.015) 0 10px,transparent 10px 20px);transition:border-color .2s,background .2s;cursor:pointer}\r\n.rts .drop:hover,.rts .drop.hot{border-color:var(--yel);background:rgba(255,210,63,.06)}\r\n.rts .drop .ico{font-size:34px;line-height:1}\r\n.rts .drop b{font-family:'Press Start 2P',monospace;font-size:10px;color:#fff;line-height:1.6}\r\n.rts .drop p{font-size:13px;color:var(--muted)}\r\n.rts .drop input{display:none}\r\n\r\n\/* scheda della ROM *\/\r\n.rts .rom{display:grid;grid-template-columns:auto minmax(0,1fr);gap:14px;align-items:center}\r\n.rts .chip{width:74px;height:92px;border-radius:6px;background:#1b1b1b;border:2px solid #000;position:relative;box-shadow:inset 0 0 0 3px #2a2a2a}\r\n.rts .chip::before,.rts .chip::after{content:\"\";position:absolute;top:8px;bottom:8px;width:6px;background:repeating-linear-gradient(180deg,#c9c9c9 0 4px,transparent 4px 8px)}\r\n.rts .chip::before{left:-7px}.rts .chip::after{right:-7px}\r\n.rts .chip i{position:absolute;inset:14px 10px;border-radius:3px;background:radial-gradient(circle at 50% 50%,#5a6bff 0 30%,#2b2f6d 31% 100%);opacity:.9}\r\n.rts .chip span{position:absolute;left:0;right:0;bottom:6px;text-align:center;font-family:'VT323',monospace;font-size:14px;color:#ddd}\r\n.rts .facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\r\n.rts .facts div{background:var(--panel);border:2px solid var(--line);border-radius:10px;padding:7px 10px;min-width:0}\r\n.rts .facts b{display:block;font-family:'VT323',monospace;font-size:22px;line-height:1.05;color:var(--yel);font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\r\n.rts .facts span{font-size:11.5px;color:var(--muted)}\r\n.rts .msg{margin-top:12px;font-size:13.5px;padding:10px 12px;border-radius:12px;border:2px solid var(--line);background:var(--panel);color:#dcd8f6}\r\n.rts .msg.warn{background:#2a0c14;border-color:#7a1d33;color:#ffd6e0}\r\n.rts .msg.ok{background:#11301a;border-color:#2b7a3a;color:#d6ffde}\r\n.rts .msg b{color:#fff}\r\n\r\n\/* modalita' *\/\r\n.rts .modes{display:grid;gap:8px}\r\n.rts .mode{display:grid!important;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center;text-align:left!important;padding:10px 12px!important;border-radius:12px!important;border:2px solid var(--line)!important;background:var(--panel)!important;color:#fff!important;line-height:1.3!important;width:100%}\r\n.rts .mode:hover{border-color:var(--c64l)!important}\r\n.rts .mode.on{border-color:var(--yel)!important;background:#2a2350!important}\r\n.rts .mode .dot{width:16px;height:16px;border-radius:50%;border:2px solid var(--muted);display:inline-block}\r\n.rts .mode.on .dot{border-color:var(--yel);background:radial-gradient(circle,var(--yel) 0 45%,transparent 50%)}\r\n.rts .mode b{display:block;font-size:14.5px}\r\n.rts .mode small{display:block;font-size:12px;color:var(--muted);font-weight:400}\r\n.rts .mode em{font-style:normal;font-family:'VT323',monospace;font-size:18px;color:var(--cya);white-space:nowrap}\r\n.rts .mode .tip{display:inline-block;font-family:'Press Start 2P',monospace;font-size:7px;padding:3px 6px;border-radius:4px;background:#1f4a25;color:#9ef0a2;margin-left:6px;vertical-align:2px}\r\n.rts .acts{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}\r\n\r\n\/* risultati *\/\r\n.rts .files{display:grid;gap:7px;margin-top:6px}\r\n.rts .file{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:10px;align-items:center;background:var(--panel);border:2px solid var(--line);border-radius:10px;padding:7px 10px}\r\n.rts .file b{font-family:'VT323',monospace;font-size:20px;font-weight:400;color:#fff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n.rts .file small{display:block;font-size:11.5px;color:var(--muted);font-family:'Inter',sans-serif}\r\n.rts .file span{font-family:'VT323',monospace;font-size:16px;color:var(--muted);white-space:nowrap}\r\n.rts .crc{font-family:'VT323',monospace;font-size:18px;color:var(--grn);background:#000;border:2px solid #333;border-radius:8px;padding:8px 12px;margin-top:10px;overflow-x:auto;white-space:nowrap}\r\n.rts .empty{text-align:center;color:var(--muted);font-size:14px;padding:18px;border:2px dashed var(--line);border-radius:12px}\r\n\r\n\/* mappa dei byte *\/\r\n.rts .bytes{display:flex;flex-wrap:wrap;gap:3px;margin:8px 0 4px;font-family:'VT323',monospace;font-size:16px}\r\n.rts .bytes i{font-style:normal;width:30px;text-align:center;border-radius:4px;padding:1px 0;color:#0b0920}\r\n\r\n\/* testi *\/\r\n.rts .cols{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}\r\n.rts .gcard{display:flex;flex-direction:column;gap:8px;background:var(--panel);border:2px solid var(--line);border-radius:12px;padding:16px}\r\n.rts .gcard .ico{font-size:26px;line-height:1}\r\n.rts .gcard h4{font-size:15.5px;color:#fff;line-height:1.3}\r\n.rts .gcard p{font-size:14px;color:var(--muted)}\r\n.rts .gcard code,.rts p code{font-family:'VT323',monospace;font-size:18px;color:var(--grn)}\r\n.rts a.gcard{transition:border-color .2s,transform .2s}\r\n.rts a.gcard:hover{border-color:var(--yel);transform:translateY(-3px)}\r\n.rts a.gcard .go{margin-top:auto;font-family:'Press Start 2P',monospace;font-size:8px;color:var(--yel)}\r\n.rts .credit{margin-top:14px;font-size:12.5px;color:var(--muted);text-align:center}\r\n\r\n.rts .toast{position:fixed;left:50%;bottom:22px;transform:translateX(-50%) translateY(20px);opacity:0;pointer-events:none;z-index:99999;background:#0b0920;border:2px solid var(--yel);color:#fff;border-radius:10px;padding:10px 16px;font-size:14px;box-shadow:0 10px 30px rgba(0,0,0,.6);transition:opacity .25s,transform .25s;max-width:calc(100vw - 32px)}\r\n.rts .toast.on{opacity:1;transform:translateX(-50%)}\r\n.rts .toast.w{border-color:var(--red)}\r\n\r\n@media (max-width:900px){.rts .grid{grid-template-columns:minmax(0,1fr)}.rts .cols{grid-template-columns:repeat(2,minmax(0,1fr))}}\r\n@media (max-width:560px){.rts{padding:30px 0 50px}.rts .wrap{padding:0 14px}.rts .cols{grid-template-columns:minmax(0,1fr)}.rts .panel{padding:12px}.rts .facts{grid-template-columns:minmax(0,1fr)}.rts .rom{grid-template-columns:minmax(0,1fr)}.rts .chip{display:none}.rts .mode{grid-template-columns:auto minmax(0,1fr)}.rts .mode em{grid-column:2}.rts .file{grid-template-columns:minmax(0,1fr) auto}.rts .file span{grid-column:1}.rts .acts .btn{flex:1 1 auto}}\r\nbody:has(.rts) .post-views.entry-meta{display:block;margin:0;padding:7px 16px;text-align:center;\r\n  font:12px\/1.4 'Inter',system-ui,sans-serif;color:#aaa5d8;background:#0f0c24;border-top:2px solid #342c74;border-bottom:2px solid #5ad15f}\r\n<\/style>\r\n\r\n<div class=\"rts\" id=\"rts\">\r\n  <div class=\"stripe\"><\/div>\r\n  <div class=\"wrap\">\r\n\r\n    <div class=\"head\">\r\n      <span class=\"kicker\">ATARI TOS SPLITTER<\/span>\r\n      <h2 class=\"h2\">Dividi la ROM TOS<\/h2>\r\n      <p class=\"sub\">Carica l'immagine della <b>TOS<\/b> del tuo Atari ST, STE, Mega o TT: la pagina la riconosce, ti consiglia come dividerla e crea i file da scrivere sulle <b>EPROM<\/b>, uno per zoccolo. Per le TOS da 256 KB controlla e corregge anche il <b>CRC<\/b>. Tutto avviene nel tuo browser, il file non viene inviato a nessuno.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"grid\">\r\n      <div class=\"col\">\r\n        <div class=\"drop\" id=\"rtsDrop\" tabindex=\"0\" role=\"button\" aria-label=\"Carica l'immagine TOS\">\r\n          <div class=\"ico\">\ud83d\udd79\ufe0f<\/div>\r\n          <b>TRASCINA QUI L'IMMAGINE TOS<\/b>\r\n          <p>.img .rom .bin .tos fino a 512 KB, oppure<\/p>\r\n          <span class=\"btn c\"><i class=\"ic\">\ud83d\udcc1<\/i> SFOGLIA<\/span>\r\n          <input type=\"file\" id=\"rtsFile\" accept=\".img,.rom,.bin,.tos,application\/octet-stream\">\r\n        <\/div>\r\n\r\n        <div class=\"panel\">\r\n          <span class=\"lbl\">1 \u00b7 LA TUA ROM<\/span>\r\n          <div id=\"rtsInfo\"><p class=\"empty\">Nessun file caricato.<\/p><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"col\">\r\n        <div class=\"panel\">\r\n          <span class=\"lbl\">2 \u00b7 COME DIVIDERLA<\/span>\r\n          <div class=\"modes\" id=\"rtsModes\"><\/div>\r\n          <div class=\"acts\">\r\n            <button class=\"btn y\" data-a=\"split\" id=\"rtsSplit\" disabled><i class=\"ic\">\u2702<\/i> DIVIDI<\/button>\r\n            <button class=\"btn\" data-a=\"crc\" id=\"rtsCrc\" disabled><i class=\"ic\">\u2714<\/i> CONTROLLA CRC<\/button>\r\n            <button class=\"btn s\" data-a=\"reset\" id=\"rtsReset\" disabled><i class=\"ic\">\u21ba<\/i> RICOMINCIA<\/button>\r\n          <\/div>\r\n          <div id=\"rtsCrcOut\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"panel\">\r\n          <span class=\"lbl\">3 \u00b7 FILE DA SCRIVERE<\/span>\r\n          <div id=\"rtsOut\"><p class=\"empty\">Scegli il tipo di divisione e premi <b>DIVIDI<\/b>.<\/p><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <section>\r\n      <div class=\"head\"><span class=\"kicker\">COME FUNZIONA<\/span><h3 class=\"h3\">Perch\u00e9 la TOS va divisa<\/h3><\/div>\r\n      <div class=\"cols\">\r\n        <div class=\"gcard\"><div class=\"ico\">\ud83e\uddee<\/div><h4>Bus a 16 bit, EPROM a 8 bit<\/h4><p>Il 68000 legge 16 bit alla volta, ma le EPROM ne danno 8. Per questo i byte pari vanno in una EPROM (<code>HI<\/code>) e quelli dispari in un'altra (<code>LO<\/code>): lette insieme ricompongono la parola a 16 bit.<\/p><\/div>\r\n        <div class=\"gcard\"><div class=\"ico\">\ud83e\udde9<\/div><h4>Le tre divisioni<\/h4><p><b>2 parti HI\/LO<\/b>: ST e STE con due zoccoli, due EPROM da 128 KB (<code>27C010<\/code>). <b>6 parti<\/b>: i primi ST con sei zoccoli e TOS fino alla 1.04, sei EPROM da 32 KB (<code>27C256<\/code>). <b>4 parti TT<\/b>: il TT legge 32 bit, quattro EPROM da 128 KB.<\/p><\/div>\r\n        <div class=\"gcard\"><div class=\"ico\">\ud83d\udd10<\/div><h4>Il CRC delle TOS da 256 KB<\/h4><p>Le TOS da 256 KB (1.06, 1.62, 2.0x) negli ultimi 4 byte hanno due CRC, uno per i byte pari e uno per i dispari. Se modifichi la TOS (lingua, patch) il CRC va ricalcolato, altrimenti il test di avvio pu\u00f2 segnalare un errore.<\/p><\/div>\r\n      <\/div>\r\n      <p class=\"credit\">Rifacimento web di <b>Atari ST ROM Splitter<\/b> di P. Putnik, a cura di RetroFixer.<\/p>\r\n    <\/section>\r\n\r\n    <section>\r\n      <div class=\"head\"><span class=\"kicker\">CONTINUA<\/span><h3 class=\"h3\">Pagine collegate<\/h3><\/div>\r\n      <div class=\"cols\">\r\n        <a class=\"gcard\" href=\"\/magicbin\/\"><div class=\"ico\">\ud83e\uddf0<\/div><h4>MagicBIN<\/h4><p>Il programma completo per unire, dividere e modificare le immagini ROM, anche per Atari.<\/p><span class=\"go\">APRI \u25b6<\/span><\/a>\r\n        <a class=\"gcard\" href=\"\/rom-creator\/\"><div class=\"ico\">\ud83d\udcbe<\/div><h4>ROM Creator<\/h4><p>Componi una EPROM con pi\u00f9 immagini, spazi vuoti e banchi selezionabili con i DIP switch.<\/p><span class=\"go\">APRI \u25b6<\/span><\/a>\r\n        <a class=\"gcard\" href=\"\/rom-e-adattatori\/\"><div class=\"ico\">\ud83d\udd0c<\/div><h4>ROM e adattatori<\/h4><p>Pinout delle EPROM 27xx e 23xx e come adattarle agli zoccoli della scheda.<\/p><span class=\"go\">APRI \u25b6<\/span><\/a>\r\n      <\/div>\r\n    <\/section>\r\n\r\n  <\/div>\r\n  <div class=\"toast\" id=\"rtsToast\"><\/div>\r\n<\/div>\r\n\r\n<script>if(!window.RF_EN){\r\n(function () {\r\n  var root = document.getElementById('rts'); if (!root || root.getAttribute('data-ok')) return; root.setAttribute('data-ok', 1);\r\n  function $(id) { return document.getElementById(id); }\r\n  var KB = 1024, file = null, rom = null, mode = 'lohi', parts = [];\r\n  var MODES = [\r\n    { id: 'lohi', name: '2 parti \u00b7 HI \/ LO', note: 'ST, STE e Mega con due zoccoli ROM', out: '2 \u00d7 128 KB \u00b7 27C010' },\r\n    { id: '6parts', name: '6 parti \u00b7 HI \/ LO 0-2', note: 'Primi ST con sei zoccoli, TOS fino alla 1.04', out: '6 \u00d7 32 KB \u00b7 27C256' },\r\n    { id: 'tt', name: '4 parti \u00b7 TT', note: 'Atari TT030 (bus a 32 bit)', out: '4 \u00d7 128 KB \u00b7 27C010' }\r\n  ];\r\n  \/* tabella CRC dello splitter originale di P. Putnik *\/\r\n  var CT = [0,8464,16928,25392,33856,42320,50784,59248,2177,10641,19105,27569,36033,44497,52961,61425,12562,4098,29490,21026,46418,37954,63346,54882,14739,6275,31667,23203,48595,40131,65523,57059,25124,17204,8196,276,58980,51060,42052,34132,27301,19381,10373,2453,61157,53237,44229,36309,21302,29222,4374,12294,55158,63078,38230,46150,23479,31399,6551,14471,57335,65255,40407,48327,50248,58712,34408,42872,16392,24856,552,9016,52425,60889,36585,45049,18569,27033,2729,11193,62810,54346,46970,38506,28954,20490,13114,4650,64987,56523,49147,40683,31131,22667,15291,6827,42604,34684,58444,50524,8748,828,24588,16668,44781,36861,60621,52701,10925,3005,26765,18845,38782,46702,54622,62542,4926,12846,20766,28686,40959,48879,56799,64719,7103,15023,22943,30863,34961,43393,51889,60321,3281,11745,20209,28657,32784,41216,49712,58144,1104,9536,18032,26464,47491,39059,64419,55987,15811,7379,32739,24275,45314,36882,62242,53810,13634,5202,30562,22130,60085,52133,43157,35205,28405,20453,11477,3525,57908,49956,40980,33028,26228,18276,9300,1348,56231,64183,39303,47255,24551,32503,7623,15575,54054,62006,37126,45078,22374,30326,5446,13398,19673,28105,3833,12265,51353,59785,35513,43945,17496,25928,1656,10088,49176,57608,33336,41768,32203,23771,16363,7931,63883,55451,48043,39611,30026,21594,14186,5754,61706,53274,45866,37434,12029,4077,27869,19917,43709,35757,59549,51597,9852,1900,25692,17740,41532,33580,57372,49420,8175,16127,24031,31951,39855,47807,55695,63647,5998,13950,21838,29790,37678,45598,53518,61470];\r\n  var COUNTRY = ['USA', 'Germania', 'Francia', 'Regno Unito', 'Spagna', 'Italia', 'Svezia', 'Svizzera (fr)', 'Svizzera (de)', 'Turchia', 'Finlandia', 'Norvegia', 'Danimarca', 'Arabia Saudita', 'Olanda', 'Rep. Ceca', 'Ungheria'];\r\n\r\n  function hex(n, w) { return n.toString(16).toUpperCase().padStart(w || 2, '0'); }\r\n  function fmt(n) { return n % KB ? n.toLocaleString('it-IT') + ' byte' : n \/ KB + ' KB'; }\r\n  function esc(s) { return String(s).replace(\/[&<>\"]\/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c]; }); }\r\n  function toast(t, warn) { var el = $('rtsToast'); el.textContent = t; el.className = 'toast on' + (warn ? ' w' : ''); clearTimeout(toast.t); toast.t = setTimeout(function () { el.className = 'toast'; }, 2800); }\r\n  function base() { return file ? file.name.replace(\/\\.[^.]*$\/, '') || 'rom' : 'rom'; }\r\n  var C32 = (function () { var t = new Uint32Array(256); for (var n = 0; n < 256; n++) { var c = n; for (var k = 0; k < 8; k++) c = c & 1 ? 0xEDB88320 ^ (c >>> 1) : c >>> 1; t[n] = c >>> 0; } return t; })();\r\n  function crc32(d) { var c = 0xFFFFFFFF; for (var i = 0; i < d.length; i++) c = C32[(c ^ d[i]) & 255] ^ (c >>> 8); return (c ^ 0xFFFFFFFF) >>> 0; }\r\n  function crc16(d, start, n) { var o = 0; for (var i = 0; i < n; i++) { var s = (o >> 8 ^ d[start + i * 2]) & 255; o = o << 8 & 65280 ^ CT[s]; } return o; }\r\n  function download(data, name) { var b = new Blob([data], { type: 'application\/octet-stream' }), u = URL.createObjectURL(b), a = document.createElement('a'); a.href = u; a.download = name; document.body.appendChild(a); a.click(); a.remove(); setTimeout(function () { URL.revokeObjectURL(u); }, 4000); }\r\n\r\n  \/* intestazione TOS: BRA all'inizio, versione a +2, data BCD a +$18, paese in os_conf a +$1C *\/\r\n  function header(d) {\r\n    if (d.length < 0x30) return null;\r\n    var swapped = d[1] === 0x60 && d[0] !== 0x60;\r\n    if (d[0] !== 0x60 && !swapped) return { ok: false };\r\n    var g = swapped ? function (i) { return d[i ^ 1]; } : function (i) { return d[i]; };\r\n    var ver = g(2) + '.' + hex(g(3)), bcd = function (i) { return hex(g(i)); };\r\n    var date = bcd(0x19) + '\/' + bcd(0x18) + '\/' + bcd(0x1A) + bcd(0x1B), cc = (g(0x1C) << 8 | g(0x1D)) >> 1;\r\n    return { ok: true, swapped: swapped, ver: ver, major: g(2), minor: g(3), date: date, country: COUNTRY[cc] || ('codice ' + cc) };\r\n  }\r\n  function suggest(h) {\r\n    if (!h || !h.ok) return null;\r\n    if (h.major === 3) return 'tt';\r\n    if (h.major === 1 && h.minor <= 4) return rom.length <= 192 * KB ? '6parts' : 'lohi';\r\n    return 'lohi';\r\n  }\r\n\r\n  function drawModes() {\r\n    var h = rom && header(rom), sg = suggest(h);\r\n    $('rtsModes').innerHTML = MODES.map(function (m) {\r\n      return '<button class=\"mode' + (m.id === mode ? ' on' : '') + '\" data-mode=\"' + m.id + '\"><span class=\"dot\"><\/span><span><b>' + m.name + (m.id === sg ? '<span class=\"tip\">CONSIGLIATA<\/span>' : '') + '<\/b><small>' + m.note + '<\/small><\/span><em>' + m.out + '<\/em><\/button>';\r\n    }).join('');\r\n  }\r\n\r\n  function drawInfo() {\r\n    if (!rom) { $('rtsInfo').innerHTML = '<p class=\"empty\">Nessun file caricato.<\/p>'; return; }\r\n    var h = header(rom), msg = '';\r\n    var f = '<div><b>' + esc(file.name) + '<\/b><span>File<\/span><\/div><div><b>' + fmt(rom.length) + '<\/b><span>Dimensione<\/span><\/div>';\r\n    if (h && h.ok) f += '<div><b>TOS ' + h.ver + '<\/b><span>Versione<\/span><\/div><div><b>' + h.date + '<\/b><span>Data \u00b7 ' + esc(h.country) + '<\/span><\/div>';\r\n    if (!h || !h.ok) msg = '<div class=\"msg warn\">L\\'inizio del file non sembra una TOS Atari (manca l\\'istruzione <b>BRA $60xx<\/b>). Puoi dividerla comunque, ma controlla di aver caricato il file giusto.<\/div>';\r\n    else if (h.swapped) msg = '<div class=\"msg warn\">Questa immagine ha i <b>byte scambiati<\/b> (letta come 16 bit al contrario). Dividendola, HI e LO risulteranno invertiti: scambia i due file quando programmi le EPROM.<\/div>';\r\n    else msg = '<div class=\"msg ok\">TOS riconosciuta. La divisione consigliata \u00e8 evidenziata qui a fianco.<\/div>';\r\n    if (rom.length > 512 * KB) msg += '<div class=\"msg warn\">Il file supera i 512 KB: non \u00e8 una TOS.<\/div>';\r\n    $('rtsInfo').innerHTML = '<div class=\"rom\"><div class=\"chip\"><i><\/i><span>TOS<\/span><\/div><div class=\"facts\">' + f + '<\/div><\/div>' + msg;\r\n  }\r\n\r\n  function load(fl) {\r\n    if (!fl) return;\r\n    fl.arrayBuffer().then(function (b) {\r\n      file = fl; rom = new Uint8Array(b); parts = [];\r\n      var h = header(rom), sg = suggest(h); if (sg) mode = sg;\r\n      $('rtsSplit').disabled = $('rtsCrc').disabled = $('rtsReset').disabled = false;\r\n      $('rtsCrcOut').innerHTML = ''; drawInfo(); drawModes(); drawOut();\r\n      toast('\u00ab' + fl.name + '\u00bb caricata (' + fmt(rom.length) + ')');\r\n    }).catch(function () { toast('Impossibile leggere il file', true); });\r\n  }\r\n\r\n  \/* stesse regole dello splitter originale: riempie con $FF fino a 256 o 512 KB *\/\r\n  function padded() { var n = rom.length <= 256 * KB ? 256 * KB : 512 * KB, g = new Uint8Array(n); g.fill(255); g.set(rom); return g; }\r\n  function split() {\r\n    if (!rom) { toast('Carica prima un file ROM', true); return; }\r\n    if (rom.length > 512 * KB) { toast('La ROM non pu\u00f2 superare i 512 KB', true); return; }\r\n    var g = padded(), b = base(); parts = [];\r\n    if (mode === 'lohi') {\r\n      var hi = new Uint8Array(131072), lo = new Uint8Array(131072);\r\n      for (var i = 0; i < 131072; i++) { hi[i] = g[i * 2]; lo[i] = g[i * 2 + 1]; }\r\n      parts.push([b + '.HI', hi, 'byte pari \u00b7 D8-D15'], [b + '.LO', lo, 'byte dispari \u00b7 D0-D7']);\r\n    } else if (mode === '6parts') {\r\n      for (var k = 0; k < 3; k++) {\r\n        var h6 = new Uint8Array(32768), l6 = new Uint8Array(32768);\r\n        for (var j = 0; j < 32768; j++) { h6[j] = g[k * 65536 + j * 2]; l6[j] = g[k * 65536 + j * 2 + 1]; }\r\n        parts.push([b + '.HI' + k, h6, 'banco ' + k + ' \u00b7 byte pari'], [b + '.LO' + k, l6, 'banco ' + k + ' \u00b7 byte dispari']);\r\n      }\r\n    } else {\r\n      var t = [0, 1, 2, 3].map(function () { return new Uint8Array(131072); });\r\n      for (var r = 0; r < 131072; r++) for (var q = 0; q < 4; q++) t[q][r] = g[r * 4 + q];\r\n      t.forEach(function (d, q) { parts.push([b + '.TT' + q, d, 'byte ' + q + ' di ogni parola a 32 bit']); });\r\n    }\r\n    if (mode === '6parts' && rom.length > 192 * KB) toast('Attenzione: la divisione in 6 parti usa solo i primi 192 KB', true);\r\n    else toast('ROM divisa in ' + parts.length + ' file');\r\n    drawOut();\r\n  }\r\n  function drawOut() {\r\n    if (!parts.length) { $('rtsOut').innerHTML = '<p class=\"empty\">Scegli il tipo di divisione e premi <b>DIVIDI<\/b>.<\/p>'; return; }\r\n    var cols = ['#3fd8ff', '#ffd23f', '#5ad15f', '#f8961e', '#e0398a', '#7c70da'], g = padded(), n = mode === 'tt' ? 4 : 2;\r\n    var map = '<p class=\"hint\">Cos\u00ec vengono distribuiti i primi byte della ROM:<\/p><div class=\"bytes\">';\r\n    for (var i = 0; i < 16; i++) map += '<i style=\"background:' + cols[i % n] + '\" title=\"$' + hex(i, 4) + '\">' + hex(g[i]) + '<\/i>';\r\n    map += '<\/div>';\r\n    $('rtsOut').innerHTML = map + '<div class=\"files\">' + parts.map(function (p, i) {\r\n      return '<div class=\"file\"><div style=\"min-width:0\"><b style=\"color:' + cols[(mode === '6parts' ? i % 2 : i % n)] + '\">' + esc(p[0]) + '<\/b><small>' + p[2] + '<\/small><\/div><span>' + fmt(p[1].length) + ' \u00b7 CRC32 ' + hex(crc32(p[1]), 8) + '<\/span><button class=\"btn s\" data-dl=\"' + i + '\"><i class=\"ic\">\u2b07<\/i><\/button><\/div>';\r\n    }).join('') + '<\/div><div class=\"acts\"><button class=\"btn y\" data-a=\"all\"><i class=\"ic\">\u2b07<\/i> SCARICA TUTTI (' + parts.length + ')<\/button><\/div>';\r\n  }\r\n\r\n  function checkCrc() {\r\n    if (!rom) { toast('Carica prima un file ROM', true); return; }\r\n    var g = rom;\r\n    if (g.length < 256 * KB) { g = new Uint8Array(256 * KB); g.fill(255); g.set(rom); }\r\n    if (g.length > 256 * KB) { $('rtsCrcOut').innerHTML = '<div class=\"msg warn\">Il controllo CRC vale solo per le TOS da <b>256 KB<\/b> (1.06, 1.62, 2.0x). Questa \u00e8 di ' + fmt(rom.length) + '.<\/div>'; return; }\r\n    var e = crc16(g, 0, 131070), o = crc16(g, 1, 131070), se = g[262140] << 8 | g[262142], so = g[262141] << 8 | g[262143];\r\n    var row = '<div class=\"crc\">PARI: calcolato $' + hex(e, 4) + ' \u00b7 nella ROM $' + hex(se, 4) + '<br>DISPARI: calcolato $' + hex(o, 4) + ' \u00b7 nella ROM $' + hex(so, 4) + '<\/div>';\r\n    if (e === se && o === so) { $('rtsCrcOut').innerHTML = '<div class=\"msg ok\">CRC corretto, non serve cambiare nulla.<\/div>' + row; return; }\r\n    var fx = new Uint8Array(g); fx[262140] = e >> 8 & 255; fx[262142] = e & 255; fx[262141] = o >> 8 & 255; fx[262143] = o & 255;\r\n    $('rtsCrcOut').innerHTML = '<div class=\"msg warn\">Il CRC non corrisponde: ho preparato la ROM corretta con i nuovi valori <b>$' + hex(e, 4) + '<\/b> e <b>$' + hex(o, 4) + '<\/b>.<\/div>' + row + '<div class=\"acts\"><button class=\"btn y\" data-a=\"fixed\"><i class=\"ic\">\u2b07<\/i> SCARICA ' + esc(base()) + '_fixed.img<\/button><button class=\"btn\" data-a=\"usefixed\"><i class=\"ic\">\u21bb<\/i> USA LA ROM CORRETTA<\/button><\/div>';\r\n    checkCrc.fixed = fx;\r\n  }\r\n\r\n  root.addEventListener('click', function (ev) {\r\n    var t = ev.target, q;\r\n    if ((q = t.closest('[data-mode]'))) { mode = q.getAttribute('data-mode'); parts = []; drawModes(); drawOut(); return; }\r\n    if ((q = t.closest('[data-dl]'))) { var p = parts[+q.getAttribute('data-dl')]; download(p[1], p[0]); return; }\r\n    if (t.closest('#rtsDrop')) { $('rtsFile').click(); return; }\r\n    if (!(q = t.closest('[data-a]'))) return;\r\n    var a = q.getAttribute('data-a');\r\n    if (a === 'split') split();\r\n    else if (a === 'crc') checkCrc();\r\n    else if (a === 'all') parts.forEach(function (p, i) { setTimeout(function () { download(p[1], p[0]); }, i * 400); });\r\n    else if (a === 'fixed') download(checkCrc.fixed, base() + '_fixed.img');\r\n    else if (a === 'usefixed') { rom = checkCrc.fixed; file = new File([rom], base() + '_fixed.img'); parts = []; drawInfo(); drawOut(); checkCrc(); toast('Ora stai usando la ROM con il CRC corretto'); }\r\n    else if (a === 'reset') { file = rom = null; parts = []; $('rtsSplit').disabled = $('rtsCrc').disabled = $('rtsReset').disabled = true; $('rtsCrcOut').innerHTML = ''; drawInfo(); drawModes(); drawOut(); }\r\n  });\r\n  root.addEventListener('change', function (ev) { if (ev.target.id === 'rtsFile') { load(ev.target.files[0]); ev.target.value = ''; } });\r\n  root.addEventListener('keydown', function (ev) { if (ev.target.id === 'rtsDrop' && (ev.key === 'Enter' || ev.key === ' ')) { ev.preventDefault(); $('rtsFile').click(); } });\r\n  var drop = $('rtsDrop'), dc = 0;\r\n  root.addEventListener('dragenter', function (e) { if (e.dataTransfer && [].indexOf.call(e.dataTransfer.types, 'Files') >= 0) { e.preventDefault(); dc++; drop.classList.add('hot'); } });\r\n  root.addEventListener('dragover', function (e) { if (e.dataTransfer && [].indexOf.call(e.dataTransfer.types, 'Files') >= 0) { e.preventDefault(); e.dataTransfer.dropEffect = 'copy'; } });\r\n  root.addEventListener('dragleave', function () { if (--dc <= 0) { dc = 0; drop.classList.remove('hot'); } });\r\n  root.addEventListener('drop', function (e) { if (!e.dataTransfer || !e.dataTransfer.files.length) return; e.preventDefault(); dc = 0; drop.classList.remove('hot'); load(e.dataTransfer.files[0]); });\r\n\r\n  drawModes();\r\n  window.rtsDebug = { load: load, split: function () { split(); return parts; }, crc16: crc16, header: function () { return rom && header(rom); }, fixed: function () { return checkCrc.fixed; } };\r\n})();\r\n\r\n}<\/script>\r\n<\/div>\r\n<script type=\"text\/plain\" class=\"rf-en-src\" data-no-translation><link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Press+Start+2P&family=VT323&family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n\r\n<style>\r\n.rts{\r\n  --bg:#0f0c24; --bg2:#171338; --panel:#1d1846; --line:#342c74; --text:#eceaff; --muted:#aaa5d8;\r\n  --c64l:#7c70da; --yel:#ffd23f; --grn:#5ad15f; --cya:#3fd8ff; --ora:#f8961e; --red:#f94144; --mag:#e0398a;\r\n  --atari:#e0e0e0;\r\n  font-family:'Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif; color:var(--text); background:var(--bg); line-height:1.55;\r\n  position:relative; padding:44px 0 70px; overflow:clip;\r\n}\r\n.rts *,.rts *::before,.rts *::after{box-sizing:border-box}\r\n.rts h2,.rts h3,.rts h4,.rts p,.rts ul,.rts ol{margin:0;padding:0}\r\n.rts h2,.rts h3,.rts h4{font-family:'Inter',system-ui,sans-serif!important;letter-spacing:0;text-transform:none;font-weight:700}\r\n.rts a{color:inherit;text-decoration:none}\r\n.rts button,.rts input{font:inherit;color:inherit}\r\n.rts button{cursor:pointer;margin:0!important;height:auto!important;min-height:0!important;text-transform:none!important;letter-spacing:0!important;box-shadow:none}\r\n.rts [hidden]{display:none!important}\r\n.rts .wrap{max-width:1240px;margin:0 auto;padding:0 20px}\r\n.rts .stripe{height:6px;background:linear-gradient(90deg,var(--red) 0 16.6%,var(--ora) 0 33.3%,var(--yel) 0 50%,var(--grn) 0 66.6%,var(--cya) 0 83.3%,var(--c64l) 0);position:absolute;left:0;right:0;top:0}\r\n.rts .kicker{display:inline-block;font-family:'Press Start 2P',monospace;font-size:10px;color:var(--yel);letter-spacing:.06em;margin-bottom:12px}\r\n.rts .h2{font-family:'Press Start 2P',monospace!important;font-size:clamp(17px,2.4vw,26px);line-height:1.45;color:#fff;text-shadow:3px 3px 0 #000;margin-bottom:10px;font-weight:400}\r\n.rts .h3{font-family:'Press Start 2P',monospace!important;font-size:clamp(12px,1.5vw,15px);line-height:1.5;color:#fff;margin-bottom:8px;font-weight:400}\r\n.rts .sub{color:var(--muted);font-size:15.5px;max-width:860px}\r\n.rts .sub b,.rts p b{color:#fff}\r\n.rts section{margin-top:52px}\r\n.rts .head{margin-bottom:16px}\r\n.rts .panel{background:var(--bg2);border:2px solid var(--line);border-radius:16px;padding:16px}\r\n.rts .lbl{display:block;font-family:'Press Start 2P',monospace;font-size:9px;color:var(--yel);margin-bottom:10px;letter-spacing:.04em}\r\n.rts .hint{font-size:12.5px;color:var(--muted)}\r\n.rts .btn{display:inline-flex!important;align-items:center;justify-content:center;gap:8px;font-family:'Press Start 2P',monospace!important;font-size:9px!important;line-height:1.4!important;padding:11px 13px!important;border-radius:8px!important;border:2px solid var(--line)!important;background:rgba(255,255,255,.05)!important;color:#fff!important;white-space:nowrap}\r\n.rts .btn:hover{border-color:var(--c64l)!important}\r\n.rts .btn.y{background:var(--yel)!important;border-color:var(--yel)!important;color:#231a00!important;box-shadow:0 4px 0 #a07d00}\r\n.rts .btn.c{background:#123c48!important;border-color:var(--cya)!important}\r\n.rts .btn.s{padding:8px 10px!important;font-size:8px!important}\r\n.rts .btn:disabled{opacity:.35;cursor:not-allowed}\r\n.rts .btn .ic{font-family:'Segoe UI Symbol','Apple Color Emoji','Segoe UI Emoji',system-ui,sans-serif!important;font-style:normal;font-size:14px;line-height:1}\r\n\r\n.rts .grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);gap:18px;margin-top:22px;align-items:start}\r\n.rts .col{display:grid;gap:18px;min-width:0}\r\n.rts .col>*{min-width:0}\r\n\r\n\/* caricamento *\/\r\n.rts .drop{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;border:3px dashed var(--line);border-radius:16px;padding:24px 16px;background:repeating-linear-gradient(45deg,rgba(255,255,255,.015) 0 10px,transparent 10px 20px);transition:border-color .2s,background .2s;cursor:pointer}\r\n.rts .drop:hover,.rts .drop.hot{border-color:var(--yel);background:rgba(255,210,63,.06)}\r\n.rts .drop .ico{font-size:34px;line-height:1}\r\n.rts .drop b{font-family:'Press Start 2P',monospace;font-size:10px;color:#fff;line-height:1.6}\r\n.rts .drop p{font-size:13px;color:var(--muted)}\r\n.rts .drop input{display:none}\r\n\r\n\/* scheda della ROM *\/\r\n.rts .rom{display:grid;grid-template-columns:auto minmax(0,1fr);gap:14px;align-items:center}\r\n.rts .chip{width:74px;height:92px;border-radius:6px;background:#1b1b1b;border:2px solid #000;position:relative;box-shadow:inset 0 0 0 3px #2a2a2a}\r\n.rts .chip::before,.rts .chip::after{content:\"\";position:absolute;top:8px;bottom:8px;width:6px;background:repeating-linear-gradient(180deg,#c9c9c9 0 4px,transparent 4px 8px)}\r\n.rts .chip::before{left:-7px}.rts .chip::after{right:-7px}\r\n.rts .chip i{position:absolute;inset:14px 10px;border-radius:3px;background:radial-gradient(circle at 50% 50%,#5a6bff 0 30%,#2b2f6d 31% 100%);opacity:.9}\r\n.rts .chip span{position:absolute;left:0;right:0;bottom:6px;text-align:center;font-family:'VT323',monospace;font-size:14px;color:#ddd}\r\n.rts .facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\r\n.rts .facts div{background:var(--panel);border:2px solid var(--line);border-radius:10px;padding:7px 10px;min-width:0}\r\n.rts .facts b{display:block;font-family:'VT323',monospace;font-size:22px;line-height:1.05;color:var(--yel);font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\r\n.rts .facts span{font-size:11.5px;color:var(--muted)}\r\n.rts .msg{margin-top:12px;font-size:13.5px;padding:10px 12px;border-radius:12px;border:2px solid var(--line);background:var(--panel);color:#dcd8f6}\r\n.rts .msg.warn{background:#2a0c14;border-color:#7a1d33;color:#ffd6e0}\r\n.rts .msg.ok{background:#11301a;border-color:#2b7a3a;color:#d6ffde}\r\n.rts .msg b{color:#fff}\r\n\r\n\/* modalita' *\/\r\n.rts .modes{display:grid;gap:8px}\r\n.rts .mode{display:grid!important;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center;text-align:left!important;padding:10px 12px!important;border-radius:12px!important;border:2px solid var(--line)!important;background:var(--panel)!important;color:#fff!important;line-height:1.3!important;width:100%}\r\n.rts .mode:hover{border-color:var(--c64l)!important}\r\n.rts .mode.on{border-color:var(--yel)!important;background:#2a2350!important}\r\n.rts .mode .dot{width:16px;height:16px;border-radius:50%;border:2px solid var(--muted);display:inline-block}\r\n.rts .mode.on .dot{border-color:var(--yel);background:radial-gradient(circle,var(--yel) 0 45%,transparent 50%)}\r\n.rts .mode b{display:block;font-size:14.5px}\r\n.rts .mode small{display:block;font-size:12px;color:var(--muted);font-weight:400}\r\n.rts .mode em{font-style:normal;font-family:'VT323',monospace;font-size:18px;color:var(--cya);white-space:nowrap}\r\n.rts .mode .tip{display:inline-block;font-family:'Press Start 2P',monospace;font-size:7px;padding:3px 6px;border-radius:4px;background:#1f4a25;color:#9ef0a2;margin-left:6px;vertical-align:2px}\r\n.rts .acts{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}\r\n\r\n\/* risultati *\/\r\n.rts .files{display:grid;gap:7px;margin-top:6px}\r\n.rts .file{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:10px;align-items:center;background:var(--panel);border:2px solid var(--line);border-radius:10px;padding:7px 10px}\r\n.rts .file b{font-family:'VT323',monospace;font-size:20px;font-weight:400;color:#fff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n.rts .file small{display:block;font-size:11.5px;color:var(--muted);font-family:'Inter',sans-serif}\r\n.rts .file span{font-family:'VT323',monospace;font-size:16px;color:var(--muted);white-space:nowrap}\r\n.rts .crc{font-family:'VT323',monospace;font-size:18px;color:var(--grn);background:#000;border:2px solid #333;border-radius:8px;padding:8px 12px;margin-top:10px;overflow-x:auto;white-space:nowrap}\r\n.rts .empty{text-align:center;color:var(--muted);font-size:14px;padding:18px;border:2px dashed var(--line);border-radius:12px}\r\n\r\n\/* mappa dei byte *\/\r\n.rts .bytes{display:flex;flex-wrap:wrap;gap:3px;margin:8px 0 4px;font-family:'VT323',monospace;font-size:16px}\r\n.rts .bytes i{font-style:normal;width:30px;text-align:center;border-radius:4px;padding:1px 0;color:#0b0920}\r\n\r\n\/* testi *\/\r\n.rts .cols{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}\r\n.rts .gcard{display:flex;flex-direction:column;gap:8px;background:var(--panel);border:2px solid var(--line);border-radius:12px;padding:16px}\r\n.rts .gcard .ico{font-size:26px;line-height:1}\r\n.rts .gcard h4{font-size:15.5px;color:#fff;line-height:1.3}\r\n.rts .gcard p{font-size:14px;color:var(--muted)}\r\n.rts .gcard code,.rts p code{font-family:'VT323',monospace;font-size:18px;color:var(--grn)}\r\n.rts a.gcard{transition:border-color .2s,transform .2s}\r\n.rts a.gcard:hover{border-color:var(--yel);transform:translateY(-3px)}\r\n.rts a.gcard .go{margin-top:auto;font-family:'Press Start 2P',monospace;font-size:8px;color:var(--yel)}\r\n.rts .credit{margin-top:14px;font-size:12.5px;color:var(--muted);text-align:center}\r\n\r\n.rts .toast{position:fixed;left:50%;bottom:22px;transform:translateX(-50%) translateY(20px);opacity:0;pointer-events:none;z-index:99999;background:#0b0920;border:2px solid var(--yel);color:#fff;border-radius:10px;padding:10px 16px;font-size:14px;box-shadow:0 10px 30px rgba(0,0,0,.6);transition:opacity .25s,transform .25s;max-width:calc(100vw - 32px)}\r\n.rts .toast.on{opacity:1;transform:translateX(-50%)}\r\n.rts .toast.w{border-color:var(--red)}\r\n\r\n@media (max-width:900px){.rts .grid{grid-template-columns:minmax(0,1fr)}.rts .cols{grid-template-columns:repeat(2,minmax(0,1fr))}}\r\n@media (max-width:560px){.rts{padding:30px 0 50px}.rts .wrap{padding:0 14px}.rts .cols{grid-template-columns:minmax(0,1fr)}.rts .panel{padding:12px}.rts .facts{grid-template-columns:minmax(0,1fr)}.rts .rom{grid-template-columns:minmax(0,1fr)}.rts .chip{display:none}.rts .mode{grid-template-columns:auto minmax(0,1fr)}.rts .mode em{grid-column:2}.rts .file{grid-template-columns:minmax(0,1fr) auto}.rts .file span{grid-column:1}.rts .acts .btn{flex:1 1 auto}}\r\nbody:has(.rts) .post-views.entry-meta{display:block;margin:0;padding:7px 16px;text-align:center;\r\n  font:12px\/1.4 'Inter',system-ui,sans-serif;color:#aaa5d8;background:#0f0c24;border-top:2px solid #342c74;border-bottom:2px solid #5ad15f}\r\n<\/style>\r\n\r\n<div class=\"rts\" id=\"rts\">\r\n  <div class=\"stripe\"><\/div>\r\n  <div class=\"wrap\">\r\n\r\n    <div class=\"head\">\r\n      <span class=\"kicker\">ATARI TOS SPLITTER<\/span>\r\n      <h2 class=\"h2\">Split the TOS ROM<\/h2>\r\n      <p class=\"sub\">Load the <b>TOS<\/b> image of your Atari ST, STE, Mega or TT: the page recognises it, suggests how to split it and creates the files to burn on the <b>EPROMs<\/b>, one per socket. For 256 KB TOS images it also checks and fixes the <b>CRC<\/b>. Everything happens in your browser; the file is not sent anywhere.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"grid\">\r\n      <div class=\"col\">\r\n        <div class=\"drop\" id=\"rtsDrop\" tabindex=\"0\" role=\"button\" aria-label=\"Load the TOS image\">\r\n          <div class=\"ico\">\ud83d\udd79\ufe0f<\/div>\r\n          <b>DROP THE TOS IMAGE HERE<\/b>\r\n          <p>.img .rom .bin .tos up to 512 KB, or<\/p>\r\n          <span class=\"btn c\"><i class=\"ic\">\ud83d\udcc1<\/i> BROWSE<\/span>\r\n          <input type=\"file\" id=\"rtsFile\" accept=\".img,.rom,.bin,.tos,application\/octet-stream\">\r\n        <\/div>\r\n\r\n        <div class=\"panel\">\r\n          <span class=\"lbl\">1 \u00b7 YOUR ROM<\/span>\r\n          <div id=\"rtsInfo\"><p class=\"empty\">No file loaded.<\/p><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"col\">\r\n        <div class=\"panel\">\r\n          <span class=\"lbl\">2 \u00b7 HOW TO SPLIT IT<\/span>\r\n          <div class=\"modes\" id=\"rtsModes\"><\/div>\r\n          <div class=\"acts\">\r\n            <button class=\"btn y\" data-a=\"split\" id=\"rtsSplit\" disabled><i class=\"ic\">\u2702<\/i> SPLIT<\/button>\r\n            <button class=\"btn\" data-a=\"crc\" id=\"rtsCrc\" disabled><i class=\"ic\">\u2714<\/i> CHECK CRC<\/button>\r\n            <button class=\"btn s\" data-a=\"reset\" id=\"rtsReset\" disabled><i class=\"ic\">\u21ba<\/i> START OVER<\/button>\r\n          <\/div>\r\n          <div id=\"rtsCrcOut\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"panel\">\r\n          <span class=\"lbl\">3 \u00b7 FILES TO BURN<\/span>\r\n          <div id=\"rtsOut\"><p class=\"empty\">Choose how to split it and press <b>SPLIT<\/b>.<\/p><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <section>\r\n      <div class=\"head\"><span class=\"kicker\">HOW IT WORKS<\/span><h3 class=\"h3\">Why the TOS has to be split<\/h3><\/div>\r\n      <div class=\"cols\">\r\n        <div class=\"gcard\"><div class=\"ico\">\ud83e\uddee<\/div><h4>16-bit bus, 8-bit EPROMs<\/h4><p>The 68000 reads 16 bits at a time, but an EPROM only provides 8. So the even bytes go in one EPROM (<code>HI<\/code>) and the odd bytes in another (<code>LO<\/code>): read together they rebuild the 16-bit word.<\/p><\/div>\r\n        <div class=\"gcard\"><div class=\"ico\">\ud83e\udde9<\/div><h4>The three splits<\/h4><p><b>2 parts HI\/LO<\/b>: ST and STE with two sockets, two 128 KB EPROMs (<code>27C010<\/code>). <b>6 parts<\/b>: early STs with six sockets and TOS up to 1.04, six 32 KB EPROMs (<code>27C256<\/code>). <b>4 parts TT<\/b>: the TT reads 32 bits, four 128 KB EPROMs.<\/p><\/div>\r\n        <div class=\"gcard\"><div class=\"ico\">\ud83d\udd10<\/div><h4>The CRC of 256 KB TOS<\/h4><p>256 KB TOS images (1.06, 1.62, 2.0x) store two CRCs in their last 4 bytes, one for the even bytes and one for the odd ones. If you modify the TOS (language, patches) the CRC must be recalculated, otherwise the power-on test may report an error.<\/p><\/div>\r\n      <\/div>\r\n      <p class=\"credit\">Web remake of <b>Atari ST ROM Splitter<\/b> by P. Putnik, by RetroFixer.<\/p>\r\n    <\/section>\r\n\r\n    <section>\r\n      <div class=\"head\"><span class=\"kicker\">KEEP GOING<\/span><h3 class=\"h3\">Related pages<\/h3><\/div>\r\n      <div class=\"cols\">\r\n        <a class=\"gcard\" href=\"\/en\/magicbin\/\"><div class=\"ico\">\ud83e\uddf0<\/div><h4>MagicBIN<\/h4><p>The full program to merge, split and edit ROM images, Atari included.<\/p><span class=\"go\">OPEN \u25b6<\/span><\/a>\r\n        <a class=\"gcard\" href=\"\/en\/rom-creator\/\"><div class=\"ico\">\ud83d\udcbe<\/div><h4>ROM Creator<\/h4><p>Build an EPROM with several images, blank space and banks you select with DIP switches.<\/p><span class=\"go\">OPEN \u25b6<\/span><\/a>\r\n        <a class=\"gcard\" href=\"\/en\/rom-e-adattatori\/\"><div class=\"ico\">\ud83d\udd0c<\/div><h4>ROMs and adapters<\/h4><p>27xx and 23xx EPROM pinouts and how to adapt them to the board's sockets.<\/p><span class=\"go\">OPEN \u25b6<\/span><\/a>\r\n      <\/div>\r\n    <\/section>\r\n\r\n  <\/div>\r\n  <div class=\"toast\" id=\"rtsToast\"><\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n  var root = document.getElementById('rts'); if (!root || root.getAttribute('data-ok')) return; root.setAttribute('data-ok', 1);\r\n  function $(id) { return document.getElementById(id); }\r\n  var KB = 1024, file = null, rom = null, mode = 'lohi', parts = [];\r\n  var MODES = [\r\n    { id: 'lohi', name: '2 parts \u00b7 HI \/ LO', note: 'ST, STE and Mega with two ROM sockets', out: '2 \u00d7 128 KB \u00b7 27C010' },\r\n    { id: '6parts', name: '6 parts \u00b7 HI \/ LO 0-2', note: 'Early STs with six sockets, TOS up to 1.04', out: '6 \u00d7 32 KB \u00b7 27C256' },\r\n    { id: 'tt', name: '4 parts \u00b7 TT', note: 'Atari TT030 (32-bit bus)', out: '4 \u00d7 128 KB \u00b7 27C010' }\r\n  ];\r\n  \/* tabella CRC dello splitter originale di P. Putnik *\/\r\n  var CT = [0,8464,16928,25392,33856,42320,50784,59248,2177,10641,19105,27569,36033,44497,52961,61425,12562,4098,29490,21026,46418,37954,63346,54882,14739,6275,31667,23203,48595,40131,65523,57059,25124,17204,8196,276,58980,51060,42052,34132,27301,19381,10373,2453,61157,53237,44229,36309,21302,29222,4374,12294,55158,63078,38230,46150,23479,31399,6551,14471,57335,65255,40407,48327,50248,58712,34408,42872,16392,24856,552,9016,52425,60889,36585,45049,18569,27033,2729,11193,62810,54346,46970,38506,28954,20490,13114,4650,64987,56523,49147,40683,31131,22667,15291,6827,42604,34684,58444,50524,8748,828,24588,16668,44781,36861,60621,52701,10925,3005,26765,18845,38782,46702,54622,62542,4926,12846,20766,28686,40959,48879,56799,64719,7103,15023,22943,30863,34961,43393,51889,60321,3281,11745,20209,28657,32784,41216,49712,58144,1104,9536,18032,26464,47491,39059,64419,55987,15811,7379,32739,24275,45314,36882,62242,53810,13634,5202,30562,22130,60085,52133,43157,35205,28405,20453,11477,3525,57908,49956,40980,33028,26228,18276,9300,1348,56231,64183,39303,47255,24551,32503,7623,15575,54054,62006,37126,45078,22374,30326,5446,13398,19673,28105,3833,12265,51353,59785,35513,43945,17496,25928,1656,10088,49176,57608,33336,41768,32203,23771,16363,7931,63883,55451,48043,39611,30026,21594,14186,5754,61706,53274,45866,37434,12029,4077,27869,19917,43709,35757,59549,51597,9852,1900,25692,17740,41532,33580,57372,49420,8175,16127,24031,31951,39855,47807,55695,63647,5998,13950,21838,29790,37678,45598,53518,61470];\r\n  var COUNTRY = ['USA', 'Germany', 'France', 'United Kingdom', 'Spain', 'Italy', 'Sweden', 'Switzerland (fr)', 'Switzerland (de)', 'Turkey', 'Finland', 'Norway', 'Denmark', 'Saudi Arabia', 'Netherlands', 'Czech Rep.', 'Hungary'];\r\n\r\n  function hex(n, w) { return n.toString(16).toUpperCase().padStart(w || 2, '0'); }\r\n  function fmt(n) { return n % KB ? n.toLocaleString('en-GB') + ' bytes' : n \/ KB + ' KB'; }\r\n  function esc(s) { return String(s).replace(\/[&<>\"]\/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c]; }); }\r\n  function toast(t, warn) { var el = $('rtsToast'); el.textContent = t; el.className = 'toast on' + (warn ? ' w' : ''); clearTimeout(toast.t); toast.t = setTimeout(function () { el.className = 'toast'; }, 2800); }\r\n  function base() { return file ? file.name.replace(\/\\.[^.]*$\/, '') || 'rom' : 'rom'; }\r\n  var C32 = (function () { var t = new Uint32Array(256); for (var n = 0; n < 256; n++) { var c = n; for (var k = 0; k < 8; k++) c = c & 1 ? 0xEDB88320 ^ (c >>> 1) : c >>> 1; t[n] = c >>> 0; } return t; })();\r\n  function crc32(d) { var c = 0xFFFFFFFF; for (var i = 0; i < d.length; i++) c = C32[(c ^ d[i]) & 255] ^ (c >>> 8); return (c ^ 0xFFFFFFFF) >>> 0; }\r\n  function crc16(d, start, n) { var o = 0; for (var i = 0; i < n; i++) { var s = (o >> 8 ^ d[start + i * 2]) & 255; o = o << 8 & 65280 ^ CT[s]; } return o; }\r\n  function download(data, name) { var b = new Blob([data], { type: 'application\/octet-stream' }), u = URL.createObjectURL(b), a = document.createElement('a'); a.href = u; a.download = name; document.body.appendChild(a); a.click(); a.remove(); setTimeout(function () { URL.revokeObjectURL(u); }, 4000); }\r\n\r\n  \/* intestazione TOS: BRA all'inizio, versione a +2, data BCD a +$18, paese in os_conf a +$1C *\/\r\n  function header(d) {\r\n    if (d.length < 0x30) return null;\r\n    var swapped = d[1] === 0x60 && d[0] !== 0x60;\r\n    if (d[0] !== 0x60 && !swapped) return { ok: false };\r\n    var g = swapped ? function (i) { return d[i ^ 1]; } : function (i) { return d[i]; };\r\n    var ver = g(2) + '.' + hex(g(3)), bcd = function (i) { return hex(g(i)); };\r\n    var date = bcd(0x19) + '\/' + bcd(0x18) + '\/' + bcd(0x1A) + bcd(0x1B), cc = (g(0x1C) << 8 | g(0x1D)) >> 1;\r\n    return { ok: true, swapped: swapped, ver: ver, major: g(2), minor: g(3), date: date, country: COUNTRY[cc] || ('code ' + cc) };\r\n  }\r\n  function suggest(h) {\r\n    if (!h || !h.ok) return null;\r\n    if (h.major === 3) return 'tt';\r\n    if (h.major === 1 && h.minor <= 4) return rom.length <= 192 * KB ? '6parts' : 'lohi';\r\n    return 'lohi';\r\n  }\r\n\r\n  function drawModes() {\r\n    var h = rom && header(rom), sg = suggest(h);\r\n    $('rtsModes').innerHTML = MODES.map(function (m) {\r\n      return '<button class=\"mode' + (m.id === mode ? ' on' : '') + '\" data-mode=\"' + m.id + '\"><span class=\"dot\"><\/span><span><b>' + m.name + (m.id === sg ? '<span class=\"tip\">SUGGESTED<\/span>' : '') + '<\/b><small>' + m.note + '<\/small><\/span><em>' + m.out + '<\/em><\/button>';\r\n    }).join('');\r\n  }\r\n\r\n  function drawInfo() {\r\n    if (!rom) { $('rtsInfo').innerHTML = '<p class=\"empty\">No file loaded.<\/p>'; return; }\r\n    var h = header(rom), msg = '';\r\n    var f = '<div><b>' + esc(file.name) + '<\/b><span>File<\/span><\/div><div><b>' + fmt(rom.length) + '<\/b><span>Size<\/span><\/div>';\r\n    if (h && h.ok) f += '<div><b>TOS ' + h.ver + '<\/b><span>Version<\/span><\/div><div><b>' + h.date + '<\/b><span>Date \u00b7 ' + esc(h.country) + '<\/span><\/div>';\r\n    if (!h || !h.ok) msg = '<div class=\"msg warn\">The start of the file does not look like an Atari TOS (the <b>BRA $60xx<\/b> instruction is missing). You can still split it, but check you loaded the right file.<\/div>';\r\n    else if (h.swapped) msg = '<div class=\"msg warn\">This image is <b>byte-swapped<\/b> (read as 16 bits the wrong way round). When split, HI and LO come out reversed: swap the two files when you burn the EPROMs.<\/div>';\r\n    else msg = '<div class=\"msg ok\">TOS recognised. The suggested split is highlighted alongside.<\/div>';\r\n    if (rom.length > 512 * KB) msg += '<div class=\"msg warn\">The file is larger than 512 KB: it is not a TOS.<\/div>';\r\n    $('rtsInfo').innerHTML = '<div class=\"rom\"><div class=\"chip\"><i><\/i><span>TOS<\/span><\/div><div class=\"facts\">' + f + '<\/div><\/div>' + msg;\r\n  }\r\n\r\n  function load(fl) {\r\n    if (!fl) return;\r\n    fl.arrayBuffer().then(function (b) {\r\n      file = fl; rom = new Uint8Array(b); parts = [];\r\n      var h = header(rom), sg = suggest(h); if (sg) mode = sg;\r\n      $('rtsSplit').disabled = $('rtsCrc').disabled = $('rtsReset').disabled = false;\r\n      $('rtsCrcOut').innerHTML = ''; drawInfo(); drawModes(); drawOut();\r\n      toast('\u00ab' + fl.name + '\u00bb loaded (' + fmt(rom.length) + ')');\r\n    }).catch(function () { toast('Could not read the file', true); });\r\n  }\r\n\r\n  \/* stesse regole dello splitter originale: riempie con $FF fino a 256 o 512 KB *\/\r\n  function padded() { var n = rom.length <= 256 * KB ? 256 * KB : 512 * KB, g = new Uint8Array(n); g.fill(255); g.set(rom); return g; }\r\n  function split() {\r\n    if (!rom) { toast('Load a ROM file first', true); return; }\r\n    if (rom.length > 512 * KB) { toast('The ROM cannot be larger than 512 KB', true); return; }\r\n    var g = padded(), b = base(); parts = [];\r\n    if (mode === 'lohi') {\r\n      var hi = new Uint8Array(131072), lo = new Uint8Array(131072);\r\n      for (var i = 0; i < 131072; i++) { hi[i] = g[i * 2]; lo[i] = g[i * 2 + 1]; }\r\n      parts.push([b + '.HI', hi, 'even bytes \u00b7 D8-D15'], [b + '.LO', lo, 'odd bytes \u00b7 D0-D7']);\r\n    } else if (mode === '6parts') {\r\n      for (var k = 0; k < 3; k++) {\r\n        var h6 = new Uint8Array(32768), l6 = new Uint8Array(32768);\r\n        for (var j = 0; j < 32768; j++) { h6[j] = g[k * 65536 + j * 2]; l6[j] = g[k * 65536 + j * 2 + 1]; }\r\n        parts.push([b + '.HI' + k, h6, 'bank ' + k + ' \u00b7 even bytes'], [b + '.LO' + k, l6, 'bank ' + k + ' \u00b7 odd bytes']);\r\n      }\r\n    } else {\r\n      var t = [0, 1, 2, 3].map(function () { return new Uint8Array(131072); });\r\n      for (var r = 0; r < 131072; r++) for (var q = 0; q < 4; q++) t[q][r] = g[r * 4 + q];\r\n      t.forEach(function (d, q) { parts.push([b + '.TT' + q, d, 'byte ' + q + ' of each 32-bit word']); });\r\n    }\r\n    if (mode === '6parts' && rom.length > 192 * KB) toast('Warning: the 6-part split only uses the first 192 KB', true);\r\n    else toast('ROM split into ' + parts.length + ' files');\r\n    drawOut();\r\n  }\r\n  function drawOut() {\r\n    if (!parts.length) { $('rtsOut').innerHTML = '<p class=\"empty\">Choose how to split it and press <b>SPLIT<\/b>.<\/p>'; return; }\r\n    var cols = ['#3fd8ff', '#ffd23f', '#5ad15f', '#f8961e', '#e0398a', '#7c70da'], g = padded(), n = mode === 'tt' ? 4 : 2;\r\n    var map = '<p class=\"hint\">This is how the first bytes of the ROM are distributed:<\/p><div class=\"bytes\">';\r\n    for (var i = 0; i < 16; i++) map += '<i style=\"background:' + cols[i % n] + '\" title=\"$' + hex(i, 4) + '\">' + hex(g[i]) + '<\/i>';\r\n    map += '<\/div>';\r\n    $('rtsOut').innerHTML = map + '<div class=\"files\">' + parts.map(function (p, i) {\r\n      return '<div class=\"file\"><div style=\"min-width:0\"><b style=\"color:' + cols[(mode === '6parts' ? i % 2 : i % n)] + '\">' + esc(p[0]) + '<\/b><small>' + p[2] + '<\/small><\/div><span>' + fmt(p[1].length) + ' \u00b7 CRC32 ' + hex(crc32(p[1]), 8) + '<\/span><button class=\"btn s\" data-dl=\"' + i + '\"><i class=\"ic\">\u2b07<\/i><\/button><\/div>';\r\n    }).join('') + '<\/div><div class=\"acts\"><button class=\"btn y\" data-a=\"all\"><i class=\"ic\">\u2b07<\/i> DOWNLOAD ALL (' + parts.length + ')<\/button><\/div>';\r\n  }\r\n\r\n  function checkCrc() {\r\n    if (!rom) { toast('Load a ROM file first', true); return; }\r\n    var g = rom;\r\n    if (g.length < 256 * KB) { g = new Uint8Array(256 * KB); g.fill(255); g.set(rom); }\r\n    if (g.length > 256 * KB) { $('rtsCrcOut').innerHTML = '<div class=\"msg warn\">The CRC check only applies to <b>256 KB<\/b> TOS images (1.06, 1.62, 2.0x). This one is ' + fmt(rom.length) + '.<\/div>'; return; }\r\n    var e = crc16(g, 0, 131070), o = crc16(g, 1, 131070), se = g[262140] << 8 | g[262142], so = g[262141] << 8 | g[262143];\r\n    var row = '<div class=\"crc\">EVEN: calculated $' + hex(e, 4) + ' \u00b7 in the ROM $' + hex(se, 4) + '<br>ODD: calculated $' + hex(o, 4) + ' \u00b7 in the ROM $' + hex(so, 4) + '<\/div>';\r\n    if (e === se && o === so) { $('rtsCrcOut').innerHTML = '<div class=\"msg ok\">CRC is correct, nothing needs changing.<\/div>' + row; return; }\r\n    var fx = new Uint8Array(g); fx[262140] = e >> 8 & 255; fx[262142] = e & 255; fx[262141] = o >> 8 & 255; fx[262143] = o & 255;\r\n    $('rtsCrcOut').innerHTML = '<div class=\"msg warn\">The CRC does not match: here is the fixed ROM with the new values <b>$' + hex(e, 4) + '<\/b> and <b>$' + hex(o, 4) + '<\/b>.<\/div>' + row + '<div class=\"acts\"><button class=\"btn y\" data-a=\"fixed\"><i class=\"ic\">\u2b07<\/i> DOWNLOAD ' + esc(base()) + '_fixed.img<\/button><button class=\"btn\" data-a=\"usefixed\"><i class=\"ic\">\u21bb<\/i> USE THE FIXED ROM<\/button><\/div>';\r\n    checkCrc.fixed = fx;\r\n  }\r\n\r\n  root.addEventListener('click', function (ev) {\r\n    var t = ev.target, q;\r\n    if ((q = t.closest('[data-mode]'))) { mode = q.getAttribute('data-mode'); parts = []; drawModes(); drawOut(); return; }\r\n    if ((q = t.closest('[data-dl]'))) { var p = parts[+q.getAttribute('data-dl')]; download(p[1], p[0]); return; }\r\n    if (t.closest('#rtsDrop')) { $('rtsFile').click(); return; }\r\n    if (!(q = t.closest('[data-a]'))) return;\r\n    var a = q.getAttribute('data-a');\r\n    if (a === 'split') split();\r\n    else if (a === 'crc') checkCrc();\r\n    else if (a === 'all') parts.forEach(function (p, i) { setTimeout(function () { download(p[1], p[0]); }, i * 400); });\r\n    else if (a === 'fixed') download(checkCrc.fixed, base() + '_fixed.img');\r\n    else if (a === 'usefixed') { rom = checkCrc.fixed; file = new File([rom], base() + '_fixed.img'); parts = []; drawInfo(); drawOut(); checkCrc(); toast('Now using the ROM with the fixed CRC'); }\r\n    else if (a === 'reset') { file = rom = null; parts = []; $('rtsSplit').disabled = $('rtsCrc').disabled = $('rtsReset').disabled = true; $('rtsCrcOut').innerHTML = ''; drawInfo(); drawModes(); drawOut(); }\r\n  });\r\n  root.addEventListener('change', function (ev) { if (ev.target.id === 'rtsFile') { load(ev.target.files[0]); ev.target.value = ''; } });\r\n  root.addEventListener('keydown', function (ev) { if (ev.target.id === 'rtsDrop' && (ev.key === 'Enter' || ev.key === ' ')) { ev.preventDefault(); $('rtsFile').click(); } });\r\n  var drop = $('rtsDrop'), dc = 0;\r\n  root.addEventListener('dragenter', function (e) { if (e.dataTransfer && [].indexOf.call(e.dataTransfer.types, 'Files') >= 0) { e.preventDefault(); dc++; drop.classList.add('hot'); } });\r\n  root.addEventListener('dragover', function (e) { if (e.dataTransfer && [].indexOf.call(e.dataTransfer.types, 'Files') >= 0) { e.preventDefault(); e.dataTransfer.dropEffect = 'copy'; } });\r\n  root.addEventListener('dragleave', function () { if (--dc <= 0) { dc = 0; drop.classList.remove('hot'); } });\r\n  root.addEventListener('drop', function (e) { if (!e.dataTransfer || !e.dataTransfer.files.length) return; e.preventDefault(); dc = 0; drop.classList.remove('hot'); load(e.dataTransfer.files[0]); });\r\n\r\n  drawModes();\r\n  window.rtsDebug = { load: load, split: function () { split(); return parts; }, crc16: crc16, header: function () { return rom && header(rom); }, fixed: function () { return checkCrc.fixed; } };\r\n})();\r\n<\\\/script><\/script>\r\n<script>(function(){if(!window.RF_EN)return;var s=document.currentScript,src=s.previousElementSibling,it=src.previousElementSibling;var box=document.createElement('div');box.setAttribute('data-no-translation','');box.innerHTML=src.textContent.replace(\/<\\\\(\\\/script|!--)\/gi,'<$1');it.parentNode.replaceChild(box,it);[].forEach.call(box.querySelectorAll('script'),function(o){var n=document.createElement('script');[].forEach.call(o.attributes,function(a){n.setAttribute(a.name,a.value)});n.textContent=o.textContent;o.parentNode.replaceChild(n,o)});})();<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>ATARI TOS SPLITTER Dividi la ROM TOS Carica l&#8217;immagine della TOS del tuo Atari ST, STE, Mega o TT: la pagina la riconosce, ti consiglia come<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-11258","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/11258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/comments?post=11258"}],"version-history":[{"count":3,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/11258\/revisions"}],"predecessor-version":[{"id":11261,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/11258\/revisions\/11261"}],"wp:attachment":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/media?parent=11258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/categories?post=11258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/tags?post=11258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}