From: Michael Gernoth Date: Sat, 5 Sep 2020 18:54:01 +0000 (+0200) Subject: extractor for Geraet 32620 ROMs X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/32620_extract/commitdiff_plain/0263d8ee5413ee00e518d6c222bc7edd4bd7893d extractor for Geraet 32620 ROMs --- 0263d8ee5413ee00e518d6c222bc7edd4bd7893d diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e0b4ff --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.raw +*.wav +2620_8401.bin +2620_span.bin +extract diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..c8a4233 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,15 @@ +stages: + - build + +build-binary: + stage: build + image: + name: debian:buster + script: + - apt-get update + - apt-get -y install build-essential sox + - make + artifacts: + paths: + - extract + - ./*.wav diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d916bf4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The following license is not applicable to files in the "ROMs" directory, + +Copyright (c) 2020 Michael Gernoth + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..91de5f8 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +CFLAGS=-Wall + +all: convert + +2620_8401.bin: $(sort $(wildcard ROMs/2620_8401-*.bin)) + cat $^ >$@ + +2620_span.bin: $(sort $(wildcard ROMs/2620_span-*.bin)) + cat $^ >$@ + +german: 2620_8401.bin extract + ./extract 2620_8401.bin german + +spanish: 2620_span.bin extract + ./extract 2620_span.bin spanish + +convert: german spanish + $(MAKE) wav + +wav: $(patsubst %.raw,%.wav,$(wildcard *.raw)) + +%.wav: %.raw + sox -t raw -r 8000 -b 8 -e unsigned-integer -c 1 $< $@ + +clean: + -rm -f extract {german,spanish}-*.raw {german,spanish}-*.wav 2620_8401.bin 2620_span.bin + +.PHONY: clean all convert wav +.SUFFIXES: .wav .raw diff --git a/README.md b/README.md new file mode 100644 index 0000000..0e9c586 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Extract ROMs from Gerät 32620 (Sprach-Morese-Generator) to WAV files + +Clone and run `make` + +Rom files from: [Crypto Museum](https://www.cryptomuseum.com/spy/owvl/32620/index.htm) + +Decoding information from: [Taking a look at Gerät 32620](https://blog.ardy.io/2020/8/geraet-32620/) diff --git a/ROMs/2620_8401-1.bin b/ROMs/2620_8401-1.bin new file mode 100644 index 0000000..5208ffe Binary files /dev/null and b/ROMs/2620_8401-1.bin differ diff --git a/ROMs/2620_8401-2.bin b/ROMs/2620_8401-2.bin new file mode 100644 index 0000000..71de426 Binary files /dev/null and b/ROMs/2620_8401-2.bin differ diff --git a/ROMs/2620_8401-3.bin b/ROMs/2620_8401-3.bin new file mode 100644 index 0000000..b086eed Binary files /dev/null and b/ROMs/2620_8401-3.bin differ diff --git a/ROMs/2620_8401-4.bin b/ROMs/2620_8401-4.bin new file mode 100644 index 0000000..5e9486d Binary files /dev/null and b/ROMs/2620_8401-4.bin differ diff --git a/ROMs/2620_8401-5.bin b/ROMs/2620_8401-5.bin new file mode 100644 index 0000000..7740d3d Binary files /dev/null and b/ROMs/2620_8401-5.bin differ diff --git a/ROMs/2620_8401-6.bin b/ROMs/2620_8401-6.bin new file mode 100644 index 0000000..a93d082 Binary files /dev/null and b/ROMs/2620_8401-6.bin differ diff --git a/ROMs/2620_span-1.bin b/ROMs/2620_span-1.bin new file mode 100644 index 0000000..913e2f7 Binary files /dev/null and b/ROMs/2620_span-1.bin differ diff --git a/ROMs/2620_span-2.bin b/ROMs/2620_span-2.bin new file mode 100644 index 0000000..2f908fb Binary files /dev/null and b/ROMs/2620_span-2.bin differ diff --git a/ROMs/2620_span-3.bin b/ROMs/2620_span-3.bin new file mode 100644 index 0000000..762a6e0 Binary files /dev/null and b/ROMs/2620_span-3.bin differ diff --git a/ROMs/2620_span-4.bin b/ROMs/2620_span-4.bin new file mode 100644 index 0000000..d327a99 --- /dev/null +++ b/ROMs/2620_span-4.bin @@ -0,0 +1 @@ +mklptuy~ƒˆŒŒŒ‹‹‹Šˆƒ|zz}‚‡‹ŽŒ‰„{tokmqrtw|…‰ŒŒŒŠ‹‹Š†€|z{„ˆ‰ŒŒŒ‹‡€ytpmortwz}‚‡Š‹‹‹ŠŠ‹‡ƒ€|{~‚†ˆ‰ŒŒ‰‡„xsqprtvw{€ƒ†‰‹‹ŠŠŠŠ‡ƒ~|}~€„ˆ‰‹‰ˆ…‚~ytrrsuwz|€ƒ…ˆŠ‹‹ˆ‰Š‡„~|~‚…‡ˆˆ‡†„|xvttvxz|~€ƒ†ˆˆ‰ˆˆˆ‡‡ƒ€~}€ƒƒ††††ƒƒ}{yvvvx{|~€‚„†‡ˆ‡‡‡‡‡…„~€ƒ„†|ƒ‰ˆ|tzƒxqv€ƒ€{}„ˆˆ…†‡‰‰‡„‚ƒ~}‚€€ƒ~|{|}}}|~‚„„…‡ˆ†…………„„~}}~~€‚ƒƒƒ‚€}{{}~}~ƒ……††‡‡‡‡„„ƒ}|||}~€‚ƒƒƒ‚€~}~€€‚ƒ„…††…„ƒƒ‚‚€€~}}}‚‚‚ƒ‚‚€~€€‚ƒƒƒ€‚…‡„ƒ~}€€€€}}ƒƒƒƒ‚ƒƒƒƒ€€€€€€‚‚‚‚‚‚ƒ‚‚‚‚‚‚€€€€€}‚„„…ƒ‚ƒƒ„…‚€€~€‚€€~{}‚ƒ„„ƒƒ„„€‚ƒ‚~€~€}‚ƒ„ƒ‚‚ƒ„„„‚€~€€€€‚‚ƒ‚‚‚‚‚‚‚€€€‚‚‚‚‚‚‚‚€€€€€€‚‚‚ƒ‚‚‚‚‚€€€‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚‚€€‚€‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚€€‚‚‚ƒ‚‚€€€‚‚‚‚‚‚‚‚€€€€‚‚‚‚‚‚€€€€‚‚‚‚‚‚€‚‚‚‚‚‚€€‚‚‚€‚‚‚€€€‚‚‚‚€‚‚‚‚‚‚€€‚‚€€€‚‚€‚‚‚€‚}„‡„|x{‚†ˆ‚z‚…‡…yv€„‹‡‚}z}€‚………‚~|~‚††ƒ}{}€„…ƒ€~}€‚ƒƒ‚‚‚‚~|„ˆ„~z}ƒ†‚}z}‚‡ˆ„~~ƒ…ƒ€~}~ƒ„‚€~€„‡‡ƒ~yw{ƒ……ƒƒƒ„„†…|{~ƒƒ|}ƒ…„…‚{|}€‚ƒƒƒ„„……ƒ‚€~~€‚€€€ƒ…„€‚ƒƒƒƒ€‚„ƒ€€€€€€~~~€€‚‚ƒ„‡‰‹ˆ…‚€~|yvvx{~€‚„„{}…–™“Š‚~}~xqjhoz„‹Š‰ŠŠ†uifm€•Ÿ£ž”‹‡xi\VZhx‡Ž‘“”•‘Šwf^c{–¤¦“ŽŒ{fSLRf}Ž••’“•‘€i]]u”ª®¡•‹ˆ‹ŠzeQLVm…‘•ŒŽ”aPNl˜¼Ä·›‹†‡Š{`E9Dc‹§­¢‘†‡ŒˆwS@@i£ÐÝˤ†|z€qU8,=gš½Á°”ƒ€‚‚lI9>p±àìÒ¥€rotfN5.Gt¦Åů~y{x`E;O‡ÃççŘuhik_L8:Y‹¸Ì pquqUC=d¤Þø趃`YbdZH;Gp¤ËжŒnekriMCKƒÄóü؝iLO]`[HH]ˆ´ËÄ£}jeijSKNx´äõâ«xRKU_aUQZy¢ÀîŠqeb`RKPv°àóä°~WMR\`ZV`xš´¹ªŽxlgbRJTz³àîÛ§xUNWbe^Xc|ž¶·£†rhd^NJ[‰ÂéîҙkMO\fi`]iƒ¡±®™}pie\MPe™ÎìèÀŠ`MTblj`apŒ¥­£Œxnihb]d|£ÅÒÆ¡z^Xbnsnfi|—©«›ƒof_XPVk–ÂàݾhTXcnohfsˆ¡©£ylb\TWf‰³ÑÖœv]Z`lppms‘š”†wj^UVg‡¬Æ̺›{hbfkonnuƒ’šš‘„xlcXVe‚¨Âɹ›|jdinrons€˜˜ƒwme^^i ¹Â¶›nhkqtqos•—‚vlgcfp„ž±¸¯—€oimrwttv}ˆ“Ž„vlgdm|£ª©™…vnr|…†{uw{††€vnlnyˆ˜¡¢›‰{tv€‰Šwrqv{€€}wrqt}‰”žŸ™‹wyƒŒŒ‚yompv|~|vstx‚˜ž›”†|x~‡”‚sjfksx{wuu{‚“š™“ˆ€}€†Œ’’Š~tkgjnsuxz}‚‹‘™š–Œ‚|{‚‹‘’ƒxnhgkptvuz€‹–žž—Šy|ƒŠŠƒ|uolknquvy}†šŸ›’…{y~†Šƒ{urqqqpttx|‚‰“™œ—ƒ|~‚ˆŒˆƒ|vsttvuvtvy}„Œ”™™’Š‚~€ƒ‡†‚}xtsuxyzyxy{€ˆ•—’Œ…„†„€|yvuuwy{||||ƒŠ””ˆƒƒ„…‚~yuttvxz|~€€‚„‡‹Œ‡ƒ‚‚‚€|yvttvy|€ƒ„‡ŠŒŽ‰†„‚‚€€~}zwvuwy}€ƒƒ‚ƒ„‡ŠŒŒŠ‡„‚‚‚}|{zzyz|~€‚ƒ‚‚ƒ†ˆŠŠ‡…„ƒƒ‚‚}{yxyy{~‚ƒƒ‚‚„…ˆ‰Š‡…‚‚‚‚‚€~|zyy{|~ƒƒƒƒ‚ƒ„†‡‡‡„‚ƒƒƒ‚~||zz|}~€‚ƒƒƒ‚ƒƒ…‡‡†„ƒƒƒƒƒ€~}||}|~~€€‚‚‚ƒ…………ƒƒƒƒ‚‚€~}}}~~~‚‚‚‚€‚€‚€‚‚€€ƒ~ƒ~ƒ‚€ƒ€‚‚‚‚ƒ€ƒ€ƒ€‚ƒƒ}„~„~„}†}„~‚~ƒ~…~ƒ~„~ƒƒ€‚‚€„~ƒƒ‚€ƒ‚€ƒ€‚€ƒ~ƒ‚€‚‚‚‚„}„€‚‚€‚€ƒ€‚€ƒ€‚‚~ƒ€‚‚~ƒ‚‚~‚‚‚‚€ƒ‚‚€‚ƒ€ƒ}…}„ƒ€€‚ƒ€‚ƒ‚€‚€‚€ƒ‚~€‚~…}†{ˆ{†|ƒ€€‚€ƒ~„|‡z‡z‡|…~€†{‡{ˆz†|…‚|†}…{‡z‰|„~‚‚€ƒ|‡}„}„~‡{…~ƒ‚~…}…~…{„€€ƒƒ~ƒ„~„}‚‚€ƒ‚ƒ€‚€‚‚€€‚}„~‚„€ƒ€‚‚ƒ}ƒ€€‚‚‚€ƒ‚„~…‚€€‚€‚‚‚€€„~†~…}ƒ}‚ƒ€€ƒ~€„€‚~‚€…}‚‚‚|†~„€…~€‚€‚€€„~‚ƒ~…zˆ{…~€„~‚‚„ƒ‚‚ƒ‚}‚‚€ƒ|€ƒ~ƒƒ~ƒ…‚€„‚ƒ‚ƒ~€ƒ€‚€‚†|…}…~ƒ}‚€…}„€‚€€~„€ƒ€ƒ~ƒƒ€ƒ~€ƒ†|‚ƒ€ƒ|„€ƒ}‡}‚~ƒ„~„~„}…~ƒ|…}ƒ€†~ƒ}„{ƒ~ƒ€ƒ„€ƒ‡}…~~‚~ƒ~ƒ€ƒ~„|…ƒ~„€€„‚~ƒ€‚ƒ}„{†|ˆ{†~ƒ}„€€‚‚~„‚ƒ‚ƒ€‚}‚ƒ‚„}ƒ‚~‚ƒ‚~…{ƒ€€„ƒ~ƒ‚}‚‚‚„€‚ƒ}‚}ƒ‚€€‚„~ƒ‚€ƒ~‚‚€€~„…~ƒ€„{‡}ƒ„|…}„‚ƒ~ƒ~„ƒ~ƒ„€‚ƒ~ƒ~‚‚€ƒ€‚ƒ‚€‚…}ƒ~‚‚ƒ€€‚‚‚}‚„‚€„{‡|„„}ƒ‚|‡„€„€ƒ~‚„~€ƒ„€„~‚ƒƒ€ƒ€ƒ~‚ƒ‚€‚‚€ƒ„€ƒ~ƒ„}‚„‚~„‚~‚‚€‚‚…~‚€„ƒ~‚‚‚ƒ}…~„z‰z‡}…|€‚ƒ€€ƒ~ƒƒ„‚ƒƒ„~€„}…ƒ~…€ƒ|…~‚|„‚‚€„€‚~ƒ€€‚~ƒƒƒ}„~‚„‚‚€€„~‚„‚‚~„~…z†~„€€€†~€ƒ€‚ƒ~„‚€}‚ƒ|„†}€„€†~ƒ€‚„~ƒ~…~‚‚€…~‚‚€„ƒ}ˆ|ƒ~†}‚~‚‚~‚~„~„‚€€†}…€ƒ‚‚€„~ƒ}ƒ…€€ƒƒ‚}„~‚~‚‚€‚‚‚€ƒ‚€‚€€€‚€€ƒ€€‚‚‚„ƒ~„€‚ƒ€‚‚€€‚€„}ƒ‚‚€‚‚ƒ}ƒƒ‚‚‚€‚€ƒ‚‚€‚„€‚ƒ€€‚€ƒ€‚ƒ~„~ƒ‚‚~‚ƒ€‚ƒ„ƒ~‚ƒ~~‚ƒ€‚€…€ƒ€‚~„‚ƒƒ„„‡„‚ƒ€}}{€}z~€ƒƒyi„œ“Œ”•™†vxpjh`u„‹‘“‹‡…{zwsx}pK…¶š—¥§°ŠhzhSOMcq|­©¥ ‹€llvs{~{Š‹u6~½†ˆ´¨°‰h‹fFUSdxk¡¯ž°£‹zesvfƒ}„…‡y*TȒtô»”m•p6R[Wqo˜­“§µ†qwssd|‡uŽxcxËrˆé±¨‘”D1lSCu†¦œ’¼¨o|…jakŠ~‘„ul8A½‡zã´¬¥ƒ„Z+bS8yŠ•ªŸ´¤u‡x^qu~£‰ŽhC«©ZÀô›¢¤†k!Vj%T¤¬¯·zu†[\~}}‹©Ÿq“ˆT= «¤VØÿ†µÄrX(_T h¸t¢Î³¬|‰r@qƒe…¢ž–‚”YOu·e²ÿŠ®Éuc8:c_ZÊ¥‹å©n˜xOevgv˜ŽŒ™‰ˆr\/fªK²ÿ[ÔãUŽ~9@A\PZŏ”ë”~²kRwrb~Žz”–tV& zTçÄ`õ·O©i9CTS<‡°q½àv¢©Yndgˆ~uŸ„‚“iZ+µaiÿ‹~ÿ†d¿JDTJIG›ŽzÛ¹y¼T€vZp…t‚œw•Œ^VF¶JÿQÀöSŸ¦1]T8IXœušáŽ¦³uxgbv{o‹‘xŸ|dXP²Lœ÷JÝØN½‹.pF4R[’q«Ù‰¸¬oˆtaplpwˆŒ~£|fa>¸O‹ùSÆçY³›1rD5RNˆtžÓ˜¶·|„}]hmht… …oi?¶M…ñQ¿ëW²§3xN3UIs–É™·µs™xa}_o{q‚ou7¡od܋€þzƒÎBhg0OQlw‚¼¤¢É‡Žexgfsm‡…„™xsKy™I¼ÁM÷¥bÜdT8DXXup¨¬˜È”¡j€s]~bwŽr‘’ku@«cpÞvŠùoÈ?zk2TV`h„¨œ®¼ƒ«m^lp`ƒ}yœ‚nuH¶SˆæLÀØY¼¥;Y+eL_kŒ˜À­‘ª…{algk|x†‘~xl[®T™ÏEÛ¾VӉI™H:fFan‹šž¾¢«|Š|`mhhw}}Ž{xY…—V»§YòŒuÛYl‡:Q\Keq““§¸—´š˜bnsVuvyƒ‡xxL²evÕg—ãbªÁ=˜h5dKVa}’³¨¸‰Œ^{e\|px|rjq§U®¸Oé•oÙdjŽ@Q^JcmŒž·“³ „›jsvXvsr…€t{K·]ˆÑY´Ì^¾¢FžWFeF]a€†‘·ª±‰›~h{\hvk~‚q|S¦v{ËyŽáf¨·HšeAhIXbt…Žª¨¤´’™Œg}b`wgu‡nxZœ~yÈ~åoœÁL•n=iLPep|©¦¤¸‘ž‘iƒ`]xbq†jyX¦t‚Ís–Ùf¬°MbFiKTbvu“¬š®³Œ§Špƒ^evcr€kz]¯a•ÌVÁ¯eȇc¤SVgH\cztœ§¼ “­w}}XpoavujcœbÄ£fís”ÌV‘zHaWL_nt„£œ ¾Ž§›qŒjcvakxiqQ©qƒÒp¡Õa»¦P¥\PeJS`si—¤‹À¥“¹„‡\tl]tmefn¤Z½¬d膊Ëhƒ‰J^^FYoly©Œ¦¼Œ³›|’miv\kpbnOªc“ÌhºÀj“fžZ]`NU`pk•”¹š¥¬‚•}jzecpbfYˆmΈâw¬³eœoXdRI_bf‹‘·™¬°Š™†qzkchh^^n’_¸žy߄ ¼q•}ZiTK[]d…ƒ’ª›­­—›Š{~kgjbcZe’W±Ÿyى¤»w™`lVOZXdy‹¤ž¥¯˜ž•}‚qfk_aOwwgµ„“Ò¸¯v¦rfqSR_Y^~|†¥•¤®—£“‚…slk_UdzU‹|Ȉ¨¸„¤‹jxeNc\R|p|Ÿ‰¡©”¦›‡’{tp[Y~J„‰f±—·‘œœxu[g`Ymqr…‘ ’ ›–{yWƒYlŠ^‘€­‘•¤~Œ~pqi`nmk‚z‰˜Šž–‘˜‰ƒkm~RŠrl¤s™ ˆ¢vnxagudzx“Œ‘˜“†‡xeƒdjˆc„’x£’Œ¡ƒŒ…uxpeopi}w‡˜’”˜Š‚qwz\Šks—pš•‹…xvzepqg}u}ˆƒ‘’—‘Ž†oˆ^ƒujxˆ–‡•—ƒ‘€v~kmukxyw†ƒˆ’Š”’‡„rŠe„wmŽu‡†’‘„Œ€wkrvk{|v‰‚‡‘‰‘‰…~z‡hŽqxu‘‹ˆ‹ˆ{w€hwwm~zx‰Šˆ“‰ƒv†rx‡o‡ˆ{˜‡Œ‘…‚v{uj|ptu……‚ŽŠŽ‘‹„||rŒk‡‡z–†‹…‚ˆs}wjzpt~zˆ‚ŒŒ‰‘‰ƒ~€{t‹l‡ˆ|–‰‹‘‡‡s{vmxqt}z€ˆ‚‰Š‘‰‚z†r{ˆkŽ‚™ƒ“ƒˆ‚s~rlzmw~w„„ƒŒ‰ˆ~ˆjŠxuŽ}‡•†’ŽŠ{v|nrzn|zy‡‚†Œ†Œ€}rzg„y˜„‰•ƒ„Št~yl{ss€w‚…€Š‡†…{Š~r“l„‹y“Š†“ˆ‹wy}mwxn‚v~ˆ~‹‰†ƒ{Š{wo…‡|‘Šˆ’‡„‡x{zmyss€x€„Š‰†‹}Žv‚†q’ƒŒ„‡„wvq|o{{z‚‰…ˆ‡{‡ƒwwƒŠ}Œ†‡~†xx{rzxw€|†€…‡‚†€|‰wˆƒ{‹‰‡Š€ƒ|t{pszu|}†‡„Š†ƒ|…z‚‚|‰„ˆŽŠ‹„ƒvxtpvxw€~ƒˆ…‹‡ƒ‚}…zƒ~‡„ˆŒ‹‹‹„€€vxuqwxy}‚†„‰†„‚€ƒz…€‰„‹Œ‰‰„‚}uxrqzs}}~‡ƒ‡Šƒ†ƒ€}…„‰…ŒŒŠ‡ƒwuwotwv~|†„ˆ‡…ƒ„|ƒ€‡„ŠŒ‹ŒŠ„ƒyvyptws}{„‚‡ˆ„ˆ€…‚„€…‡ˆ‹Œ‰Š…‚}vxqtvu{|ƒ„†‡„‡†‚ƒ„‚…‡‡‰‹Š‰„„{xvsrvvy}}ƒ‚…†ƒ†‡ƒ„‚‡‡ˆŠ‹‹Š„{xurvsvz{ƒƒˆ„†„ƒ††„…‡ˆ‰‹ŠŠ‡ƒzxsrttxy}€‚…††‡ƒˆ„‚‰ƒ…‰„‰Š†ˆ‡{uwtrwwz~}‚„…‡„„ˆƒˆ‡†‰†ˆ‰††‡}vytswtx|z‚ƒ‡†„Š†ˆ‹†ˆ‰†‰†„†~xwurvtw|z€ƒˆ‡…‰‰‡‹‡ˆ‰†‡†„…‚}zwuvrvxw|}€„…ˆŠ‰ŒŒ‰Œˆˆˆƒ…ƒ‚~{zvvvsvxx{~„†ˆ‹ŒŒŠŠ‡‡ƒ„€€~{zwwusvwxz€~††‰ŒŠŽŽŠŒ‰†…‚€€}|zwyvuyv|{}‚€„‰‡‰‹‰‹ŒˆˆŠ…‚„~~|zxxxw}yw}€€ƒ„‹‰„Š‹ˆ‰‡„……‚€}}yy|wy||€„‚…†……‡‡††„ƒ„…‚~}€€{z{}z|€„†‡…„…†…„‚„ƒƒƒ‚}€~|}{~{€~„„€‡‡‚‚…„ƒ€„~}~ƒ~€}„‚‚ƒ„‚‡ƒƒ~{€~€‚‚€ƒƒ€ƒƒƒ„‚€„‚‚~~€€{~ƒ€€†ƒ…~‚‚€‚…~~{€‚|~ƒ„…„ƒ„ƒ‚‚€‚€‚}~€€~ƒ„‚ƒƒ„„ƒ‚ƒƒ€~€‚‚€‚~€€€‚ƒ‚‚ƒ„ƒ‚ƒ€‚€€‚€€‚‚€ƒƒ…‚„‚€€€‚~€€~ƒ€ƒ…‚‚ƒƒ‚‚‚‚€€ƒ~€€‚ƒ€‚€€€ƒ€€ƒ„‚‚‚ƒ~€ƒ„€}€‚€ƒ‚€‚ƒ€ƒ‚ƒ‚‚‚‚€‚‚~€ƒ€‚€‚ƒƒ‚ƒ‚€‚‚‚€ƒ‚€€‚ƒ‚~‚„‚‚‚€€ƒ‚€€‚€~€€‚€€‚ƒ€‚„‚…€‚~ƒ€‚€‚…~‚‚‚‚€€€‚‚€€‚€€‚‚‚ƒ‚‚€„‚„ƒ€‚€ƒ…€‚ƒ…‚‚‚‚„‚€ƒ€€ƒƒƒ~…€~ƒ‚‚ƒ}€ƒ‚€~ƒ‚„„‚‚ƒ~‚‚‚…‚}‚‚ƒ~ƒ€~‚~€…€€‚€ƒ€ƒ‚‚‚~€„ƒ}€€‚‚€‚€„~‚€€‚€‚‚‚€‚ƒƒ~‚„‚€‚€€‚€‚ƒ€ƒ€‚€€‚‚‚€€‚„ƒ‚€~€ƒ‚‚‚‚€€€‚ƒ€‚‚€€€‚ƒ‚€‚€‚€€‚‚€~€ƒƒ~ƒ€‚‚€‚ƒ‚‚‚ƒƒ€€€€€‚‚ƒ‚€€€€‚€‚‚ƒ€‚‚ƒ€‚‚ƒ€‚€ƒ‚ƒ‚€€ƒ‚‚‚‚‚ƒ€ƒ~„€ƒ€‚€€‚‚‚ƒ€‚€‚‚ƒ€€‚€~‚„€„~€‚€~€ƒƒƒ€‚‚‚ƒ‚€‚€‚€‚~€ƒ€€€‚ƒ‚‚€‚‚ƒ‚‚ƒ€ƒ€~~€ƒ„‚€€‚‚~‚ƒ€‚€€‚‚‚‚ƒ‚‚‚‚‚ƒ€€‚‚€‚€~‚‚~‚ƒ„‚€~‚‚ƒ€‚ƒ~‚‚~ƒƒ€~ƒ‚~}‚‚€‚‚‚ƒ‚€‚‚‚€‚‚‚ƒƒ€„‚~„€ƒ~ƒƒ‚€ƒƒ~„…€‚€€€€‚‚‚€€‚ƒ~‚‚€€€‚ƒ€€„ƒ€‚€‚‚‚‚€ƒ‚~€‚€„‚€‚‚ƒ€‚€€~‚‚€€€‚‚€€€‚€‚~~‚ƒ‚ƒ€ƒ‚‚€‚€‚€ƒ‚€~‚€‚‚€‚‚‚€€‚‚€‚€‚‚€ƒ€‚€€‚‚‚~ƒ€‚„ƒ‚„‚€‚€€€‚€€‚~‚„ƒƒ~€ƒƒ€€€‚€€€‚ƒ‚‚€€‚€‚ƒƒ€€ƒƒ€€‚€€ƒ‚€‚‚€€ƒƒƒ~‚€‚€€ƒ‚€€‚€‚‚€ƒƒ€€€ƒ€‚‚€‚‚€ƒ€~€€€€‚€€‚‚€€‚‚€‚‚ƒ„„ƒ‚€‚ƒ€€‚ƒ‚ƒ€~‚~€‚€€€‚‚‚‚ƒ€ƒ‚~ƒƒƒ€~€ƒƒƒ‚~}ƒ‚‚€~‚„~„‚~€‚‚‚€ƒ‚~‚‚ƒ€€~‚„ƒ€€€€€‚~~‚‚€‚ƒ‚€€€‚€€ƒ‚‚~ƒ€‚‚€€~ƒ€‚€‚‚€‚€‚€‚‚€ \ No newline at end of file diff --git a/ROMs/2620_span-5.bin b/ROMs/2620_span-5.bin new file mode 100644 index 0000000..0223a7f Binary files /dev/null and b/ROMs/2620_span-5.bin differ diff --git a/ROMs/2620_span-6.bin b/ROMs/2620_span-6.bin new file mode 100644 index 0000000..25920c5 Binary files /dev/null and b/ROMs/2620_span-6.bin differ diff --git a/ROMs/2620_span-7.bin b/ROMs/2620_span-7.bin new file mode 100644 index 0000000..ff52975 --- /dev/null +++ b/ROMs/2620_span-7.bin @@ -0,0 +1 @@ +¶žÈc|U@;[W[œ¤¸¸¡‘phhhat‡Š•Ž„wOZ¤[”µ›¯¯½o}=HIWJv™Ž¶¹®¢›‰pqgdfv|{‡ˆwG|–Y£ª”²±«tŠr>YDPUt‰¸°¬«˜wqmcgqytŒ{\c¯VŽ½‚²®«…‚€KWOC\`~¡´¨¶™š‰kyc`iss}“|ŽŒmSž|fº—‰Åž•„†kJaBY^g‹¢¬­¢ž™y~z]lrnu€‚€‹€zYš„k»‰Å„ŒlX`@a_g’‹¢¬¡š““{…yj|qy~|‚{xq[…Œi¾›‘Ń˜xqbjTulx—†‘–‚~{}{„‡‰ŽˆŒy‰ytykfj˜c­¡€À…ˆopklfx~|šŒˆ–v{vvz‰‡‘ŒŽzƒ{qxlgk˜h§§„»‰}mlvgkw|‘€‘sx{q‡„’–Œz|~kvoiktŽ±ƒ¤¡p•zkhpyxz‰‰|‹xqƒp~Ž‚‘–Š”Ž€€}myrlk‡v‚«€œ¦n˜…mŒpp~q{„~‚…ywƒs~Ž|‘’„–‹„…|wzrtk}xs¢ƒ®u•”n‘yj„hu‡t„v}€v‰ˆ™‰‰Š{}ysyjw|jšˆ†®~Œœs€h†jp‰m€Šqƒu††~‰ˆ”‡‹‹|xu{ksf’}©Ž€£|‚f}xe…wt‹uy‡t‚‰|‹„“Šˆ}w}tn|lv—’¦|’˜v€m‚kq†m…q„}vˆ‚„Ž‡ˆŒˆ‚}zzxutvmƒ˜œ”}zq~juru‚|~†ƒˆŠˆ‹ŒŒ‰…‚|{}xyusn|…–‚Ž“Š€uynt|w€x|}ƒ†‰†ˆŒŠŒ‹…‚}{}y|uqnv‹‹œ‹†’‡ƒ†{rrtxz€}xzyƒ†‹ˆ‰ŒŒ‹Œˆƒ|{|y|zqos„Ž™”…‹Œƒƒ‚xorxv}€xvz‡Œˆ‡‹‹‹ŒŠ„|{{x|}vpo}Š”’‰‡ŠŠ†}uqvy|}{wv}ƒ‡Šˆˆ‡ŠŒ‰Š†{||}}|tovƒ‹’”†ˆŠˆ‡‚zrrwx|}xuy…ˆ‹Š‡‰‹‹‹‰„}z}|}|uovƒ‰‘”‹…ˆ‹‰‰ƒzrqvy{}yvy€†‰Œ‰†Š‹‹‰†ƒ}y}~|€~yts~ˆŒ“‡‡‹‹ˆƒ|vpsx{}{yx}„ˆŠŠ††ˆ‰ˆ†}|}}€|uw‰Œ‘Ž†…ŠŠ…~{spsvz||{|€†Š‹‹ˆˆ‰‰‡…||~~€}{}yt|†ŠŽ‘‹‡ˆ‰†‚}xqpvy|}{}ƒ‡‰Šˆ…†‰‰†ƒ}}€~}|~zx€‡ŠŒ‡†‡†ƒ}vqty|€|{€„‡ˆŠ‡…††ˆ…‚€}~}~~zx~†‹ŒŒ††…‡„€}wsvz}€{yƒ†‰ˆ„…†ˆ‰„„~‚€€~€}y{…Š‹‡„„†ƒƒ€|xwy|~|z}„‡‡„ƒ…‡‡‡†ƒ€€‚‚€~}~~}~„†‡ˆ„ƒ†ƒ€~{xz|{~€|~ƒ…††††‡‡„…ƒ€€€€€~€}{z~‚…ˆˆ…†…………‚~|zz|}{{||}€‚„†‡‰‡ˆ‰†„…‚‚€€~{wy|…ˆ†‚ƒ…„……ƒ€|{|~~|{{~€ƒ……†…‡‰‰†„‚‚ƒ€}{ywz~‚†‡†„…†‡……‚~}{{|}{zz|~ƒ…††ˆŠ‰Š‡„ƒƒ‚‚€€}zyyx{~€ƒ††‡ˆ‡ˆ†…ƒ€}{zz{|z|}~‚„†ˆ‰‰Šˆ‡„‚‚€}||{||}€„…†ˆ‡†…„ƒƒ€~}{z{{|}~‚„ƒ††‡‡†ˆ……€‚}}{}~€€‚‚ƒ……†‡„„„‚€}|{~{}}‚‚…‚…ƒ†……ƒ„ƒƒ‚ƒ‚|~~€~~€€‚„……‚ƒ„‚‚‚ƒ}€~€€‚„‚‚†€…ƒƒƒ‚€‚€~~~€ƒ}…‚ƒ€„€ƒ€ƒ€~ƒ‚~…}€‚‚}ƒ‚„ƒ„}„€€ƒ…ƒ€}ƒ…}ƒ}…{†‚ƒƒƒƒƒ‡ƒ‚~†}ƒ€~„{€~„‚„„ƒ€„‚€…€„{„z„€{ƒ~|‚„„~†ƒ„ƒ‚ƒ}„€‚~|„~}…|‚‚ƒƒ‰}‡}†~‡z‰w‡{„}‚}ƒ~†{ˆ|‡~†‚ƒ€„~„}„~ƒ~„€ƒ€‚‡{„€ƒ„zŒ{„„€…z‰y†z‚}ƒ„ƒ~…‚„€†zˆ|…}†~}‡}€…}€„~„ƒ‚|‡ƒ~„„~„‚€}„€„}ˆ|‚€…}ƒ}ƒ€€€ˆ|€‡{„~‡}…}„~‚|‡}…€„‚€ƒ„„|‚€‰z€‚ƒ{…‡€‚‚„~„€€ƒƒ€~‚€€„€|‚‡{‡z‡|ƒ~‰w…}„€€ˆwŠvŒ{‡y‡‚€…€ƒƒ}Šw‰z‡~‚xr‰{ˆ|ƒ‚†xˆ|‰vŠyŽvˆ{‰v‰|‚…z‰z‰z‰||qxu…„€ƒzŒuŒ{…~ƒ‚‚€€†|†€‚}†~~ˆ|ƒ€ƒ€„ƒ‚…~‡ƒ~‚~„‡€|Š|‚€ƒ{‡|†|‚zŒyˆ{„‚€‚‰tŒvˆ|„{ˆ~€‡|†wŠtŠ|†yˆ{„„†{†{Šx‹w‰x„„~…w“qŠwŽsˆz‡~ƒ‚…|„€†y‡{ˆvŠxq‹yŒxƒ…€€‰xˆx‰}€…~€„z†}„{‹zˆuwˆ~†z‡z„ˆwŽr‘n‘rwˆzˆ{…€…|‰xŠuŒ{‚€†~€ŠwŒsssŠz†zˆ}ƒ{‡z†~Š{ƒ€…}„{‰}ƒ|…}‡zˆ|~ƒ€…{†{‡~‚‚…€|†z‡{‹x††{‡z‰{ŠxŠ|‚„}‡y‹x‡~†xˆ~ƒ€„€ƒ|ˆ‚‚‚|†€€‚‚„}„}‡z‰zƒ{Š|†{‰vˆ|~ˆ€}„…€~ˆ~ˆ}€‚‡}~†|†…‚ƒƒ€‚ƒ‚{†~‚~ˆ|ƒƒƒ|‡}‡y†ƒ}…|…|…€‡}ƒ~€ƒ~‰{‡{‡~„~„„x‰~„|‚€ƒ…‚}‚…}€ƒ}„‚ƒ€€€…‚z†„~ƒ€„{‚ƒ‚€€‰}ƒzˆ~‚~†|…|…€‚{‰|‚†€~€†~}…ƒ€…~…ƒ~‚}†~…~ƒ~„|‚…€€„‚~‡~€„}…€€„ƒ|ˆ‚ƒ‚|…€€{†~ƒ~„‚}†„}„|‡}„}†€…€€„€€‚‚~‚ƒ†€~‚ƒƒ€ƒ€‚€‚€„€€€~ƒƒ€‚…ƒ„ƒ„†}~‚{y€x…€~‡x|Š‡}Ž‡ŠŽŠ}ˆ„swwopvvy‚ƒ|†…‹‰okžuŽœˆˆwf‚i[tojw‡„˜™˜}ƒ‡dg‹“w™•“‘‰’|f}e[qghz„ˆ——•‘–Š€…od™^x›q„©‡“““†qoWwi_|z}†’Ÿ‹‹”y€b€„R”X­—y¦’‰…z€\pwUt€l‡Š‰Œ˜–šŠu‚`Œnc¢sk¾}Š¯†‹ˆ{v_tnT‚pl€…”’–‡˜xˆ^Œq^žwd¾{ˆ³„}{`xjT€kk‰z†ŽšŠ•”}Š`q^žtdÀuŠ¶€“xzgufY|gjŠu‡“Žœ‘’|ŠarWŸvYÁw‚½‚šw}irdasgo‚wŠŽ›—Œ ƒ„rm˜B‘ŽM§žb»•¡…xrsk\sih~v‚†œ™Šœ‘zcœIƒ•UŒµ\°¨t “n|qk\redvw˜—ŸŠ—žxc‚G¡xO¿}yÅ~¦vuoben_tzp…ž”Ž¢††wj›DŒŒR›¤_º˜|¦Šp€pe]r_i€m‚–~žŸ‹ž™{Š`g`ŸgeÄg‘Âw•¦j‚sk\odcwwu”„“ž–‘¢…„wgšDˆP˜¬]¸¡u¨Œi„lb`m`k}t—„›¢‹šw„b’Xl›bjÊd•Ät“ªewc`jjdvs’’ˆ¥™‡§ƒ}qt„G‡O¬Ÿbšt«„h€k^cp`kƒx~œ‰˜§ˆ˜šs{b“Iv˜]zÊg ¾y’§dzsaZhjbx‡t•–§•Ž¢vzdŽVi™nbÁ}ŠÈ•ˆ¬nfc^T`vjo•|Ž¬—œœ‡|zmi™A~­a›Òešªt‡jc[lX\”}q°…©Žˆ…o}Uo–C’ÂX´Ëd¤¤n‚qm\N‚`X¨p°Žx Ž‚ƒ‹‰j{M‘h[®œ`Ø¡uª•mctQY‹]d³pz¨…z™Œw—‡iZq•;ŽÊb™àvŽŒt]wk6ˆT‹¥o‚˜…{}|›QX¸Gh͒qȐz‘NT–HY–kœ‹€yŠ‹|Žš|‡VI·Qpºž„¼¥px“a@Šaeƒ††ˆyuvŒ‹”ƒ–~KO¹Qt·¤’«Š¶he•g=~mzw …e‹{vŠ¢}›ƒ;W­b{«¨ªœ{´oX„mYve”g”‹gto‚‹„¦ž…u.Ša™§¢¹ˆ‰œaiw]tyl™‡x‡ttpkˆ–¢ŒT, ~wž§³³l“ƒ]mhhŒu˜~qf|kr“—¡›‰‘5Rš|–›ªÃ’kŽffp^|’}•‰}€]izj”£¨Ž‡M(Œƒ—¨¡¯­udSkl{{œ”y|b`uk…œ«›‹‡g.Y†‘¶ª¨«†o@bt|‰ƒ‘¦wbYop{Š•­¥–„lC@x‹Á­¤ª–ƒyCZhŽ~•¥‹€_Vlrz~¯¥˜†uL.pŽÂºªŸ‹ƒ†QP]v˜”š„~c]gr~‚Œ§£›…xa+_†¾Ë¬¡‚u‹fQWh‘›¦˜pdhgu€|ŽŸ¢™„{h+S‚¿Ù° ys€r[WdŠœ¬™‚h]fnyzˆ™ª›…va2ZˆÉв–tnytg]fƒ›¬ [Ybu……‚…•£˜ˆrO.`–ÞÓ°bg‚|ice„›±£tKKaƒ™”‡}Š˜™ŒwN'ZšåᲁP^|ˆxjbz–¶¦{JDY€žœŠ}‰––‹u?+`ªñà´n@[}’‡nbs³¦xI@T…§§y€”Žs85hÅõà¬W4T‘xdiŒ¯ŸtI>XŒ°±•|z‹k9DuÌíàŸK1P~¥ž†fg„ ˜wOE\‰ª­•‡|…]AU˜ÖäЄA7X‡¢¢‡gl†”ŠlOHl™±©”|vy…~VIf¨×åÁo87^‹¦¨‰imƒŽƒnQOn™¬©š‚vss]RdÈØΏP=Qw˜¦˜wnyƒƒwaRcƒ£§¤”{qq^Rb•ÁÒў_@Mi‹¢Ÿƒsr~ƒykY^|˜¦§š…wr`TY‚´ÌÖ¯tKF[~™¤zru{}tebqˆš¤¤–€s\NW±ÈÒ®yRN]z–žŽ€utx{vkgs…’ž •†u]P[†«Ä̪{\T]y“›wpmruqv}„Œ–˜‘‹cO[„¢½È«cZ^r™ˆ}pknmly†‹•’Šƒze\m¢µ¶œ}pgfuˆ‰ŠqiihpŠŽ’“†€rac™ª´¦ˆunmq}‡ƒ…ˆskdds‡‘–•ˆ{lcsŒ¬­›uomvƒƒ†ƒyoifizŠ‘–•†sdf~•¥®£}usty}ƒˆ…{oc\hšž–‡~xlgw‹š¨¨˜†{vru|~|ƒ‚~ypedq’…zlgx–¡¡–Šƒ~yvywy‚}vpkku~†’˜“‹ƒrjv‰•ŸŸ“‡ƒƒ~{ytsz~|ysnls‰’Ž‡‚wt“˜–Œ…††{vuzyxuplq{…‘…€|w}Œ’–˜’ˆ„†„{xxwuuplot|†“„~ww„“˜š•‹„…‡ƒzwy{{xpjin{…‹Ž‹Š…z|†Ž–š•Œ‡‡„‚}xutvz{tmjmy†‹…|€Š’“‹‹Ž‹„}yvtttspnrty…‡ˆˆ‡ƒˆ•—‘Š†‰‹‰ƒ}xrpsromos{„‰ˆƒ‚†•˜™‘Š†‡†„€}xsplkmmq{ƒ‡ŠŠ…~‚‹–›œ–†…ƒƒ~{xvxysnhfl{…ŠŠ†‚‚‡Œ“—™”Œ‰„{|xvsrnopnry€…‡ˆˆ„‚ˆŽ“˜˜’Œˆ‡ƒ€}yurnmmnpv|‚‚‚……Š•™›—‘‹‡ƒ~€~{wrljmnosx}‚……†„‡Œ“™œ™“Š†‚‚|wurnpmkmqu{ƒ„‡‡‰•˜˜™”ŽŒŠ…}xrnllkmmqu|‚„‡ˆ‰‘—›œ˜’‹‰Š†‚}vpnnmkjlov~‚„†‡†Œ“˜››—ŒŒˆƒ€{uqpolkkmpw}€‚†‡ˆ•™›š–Œ‰„yrnnnlkjkow~„‡ˆŠ‘—œ›•ŽŒŒ‡‚}volnlklkkqw}‡ŠŒŽ”™œ›˜’Œ‡zsmklkjkloty}…‰‹“šž œ—ŒŒ‰…yrmkhggilqw{ƒ†‰•œ  —‘Š†{upnkgeghlrx|†ŠŒ’˜ŸŸš”ŽŠ„yrnkhfggjnsx}ƒˆŠ˜  —’‹†{vpnkfeghlrwz„‰•›Ÿ ž™”‘Š„~xrmjgeghkotx}‚†Œ•›Ÿ Ÿš•’Š„€{upkgeegjosx|‚†Š’™Ÿ š•’‹…{vqmigffkorv{€…Š’˜œ˜—”‘ˆ‚|vqligffjnrv{€„Š‘˜œž›—““‰ƒ|vqmkihhlnrw{„Š—›œ›–“’Œˆƒ}wqmkighlptx|€…Š•š›š—”‘ŽŠ†|vroljikmpux|†Œ’–™™–““‘Ž‹†€ztpnlklmpswz}†Œ‘–˜—–“‘Œ‰„zuqoljlnqux{ƒˆŽ“–—•”’‹‡‚|xtqpmlnpsvz}€…‰Ž“–—”’ŽŒ‰…€zvsrpnnpquy|~…‰Ž“””“ŽŒ‰„zvtspoopsvz|ƒ‡Š””“’ŽŒŠ†‚}zwutqooqtx|~€„ˆ‹’’‘‘ŽŽŒ‰…€}zvusqprsvy|~…ˆŒ‘‘ŒŒŠˆ„€}ywvtqqsux{~~…ˆŒ‘ŽŒŠ‰…‚~|zxvtrruwy|„‡‰‹ŽŽŒŠŠ‡„~|zxvtstvwz}ƒ†‰ŒŽŽŽ‹Šˆ†ƒ€}{ywvttuwy|~ƒ…ˆŠŒŽŽŒŒŠ‰†„|zywvuuvx{}€‚„†ˆŠŒŒ‹‰††ƒ€~|zxwwuvxz|~‚„†ˆŠ‹Œ‹‹‰ˆ†„‚€~|zyxwvwy{}ƒ…‡‰Š‹‹ŠŠ‰‡…ƒ‚}|zzxwwy{}€‚ƒ…‡ˆ‰ŠŠ‰ˆ††ƒ€~}|{zyxzz|~€‚ƒ„…‡ˆˆˆˆ‡††ƒƒ~}||{{|{}~‚„„…†††††……„„‚€€~}|||}}}~~€‚ƒ„………………„…„‚‚€€~~~}~}~€€‚ƒ„„„„„ƒ„ƒƒ‚‚€€~~€‚‚‚‚‚€‚‚‚‚‚‚€‚‚‚‚€‚‚€€‚€‚‚‚‚€‚€‚‚ƒ‚€€‚€‚‚‚€€‚‚€‚€‚€‚€‚€€‚‚€‚‚€‚‚€‚ƒ€€‚‚‚€‚‚‚€‚€ƒ‚€ƒ€‚‚€‚€‚‚€‚ƒ€‚€ƒ‚ƒƒ€‚ƒ€‚ƒ€€‚‚‚€‚‚‚‚‚‚‚‚€€‚‚€‚‚‚ƒ‚‚‚‚€ƒ€‚‚€ƒ‚‚€ƒ‚‚€‚€€‚‚‚€‚€‚‚‚‚‚‚€‚€ƒƒ€€‚‚€‚‚‚ƒƒ€€€‚‚‚‚‚ƒ€‚‚‚€ƒ€‚€‚€€‚‚€‚€‚‚€‚ƒ€‚‚‚€ƒ‚€ƒ‚€ƒ€€„ƒ‚ƒ€‚‚‚ƒ‚‚‚‚‚ƒ€‚ƒ€€‚€‚€€‚ƒ€‚‚€‚ƒ€‚€€‚ƒ€‚‚€‚‚ƒ‚‚€‚‚‚~‚€‚‚€€ƒ€€‚ƒ€‚€‚‚‚‚€‚}ˆ€€‚€‚ƒ~ƒƒ‚‚‚~‚‚ƒ€‚‚€‚‚€ƒƒƒ‚€‚‚€ƒ€ƒ‚€~ƒƒ‚€‚‚ƒ€ƒ€~‚‚€ƒ‚€‚€‚ƒ€€‚‚‚€‚€‚‚€ƒ‚€~‚‚ƒ€ƒ„~ƒ€‚ƒƒƒ€‚€‚€ƒ€ƒ‚€‚€‚‚€ƒ‚€‚€ƒ‚€‚ƒ€‚‚~ƒ€ƒƒƒ€ƒ€ƒ‚‚‚ƒ‚‚€‚€‚‚€ƒ‚~ƒ€‚ƒ€ƒ€€‚ƒ‚ƒƒ€ƒ€€‚€„€ƒ~‚ƒ‚‚‚~„€ƒ…‚~‚‚‚ƒ‚€ƒ„}‚‚~‚‚‚‚‚ƒ~€ƒ€~„‚~„~‚€€~ƒ‚}€‰‚„€€{|~„‚€„…‚ƒƒ€~€‚‚€‚‚„~‚~„€‚ƒ€€ƒ€‚‚‚€‚ƒ‚‚‚‚€‚€ƒ‚ƒ€‚‚‚€‚‚‚‚ƒ€‚ƒ‚‚‚‚‚‚ƒ‚ƒ€‚€€~€ƒ‚€~‚~€€‚€‚‚†…†ˆ‰‡†„‚|yxvvy|~ƒ‡†‡„ƒ…|r„’~ƒ–ŒŠ‹‡vznclpmw~ŠŽŒ”˜Ž‡~y||tzxf…—v†¤ŒŒ˜’Š€{|e_khaw€‡Œ—š•™ˆ‚vrpnqef“‚y£†¦¡ˆ€qai`Ucptœ™Ÿ©šŒ’ƒsvmegSnŽe´… À”—¢„{je\LWaQ~‡~§§œ¶¥˜“‹{qmga\T„qmª”Å¥Ž²—|l^SSZNdy{‘¢¡®­©¢“ŠoheZVRvrm£š…Æ«’»œzŽm[WTNNcmp’™¶¯¦­›‹‰sje\[PY…`„µ¢ÑŒ«¼yŽ‰Ub\IUServ˜™Ÿ±§ª¨“•‚rr^[WL~_sª{—Њ®¿~™Ž\sXI`M`kuŒŽ£©¢´¤š™…zoeaWNrjbžˆ„Æ– ÂŒ‘œgqgS\Y\lp|Ž™¥Ÿ¢§’’Œvyl_eRppdœƒ‚ÄŒ Âƒ˜_}jHjSYrg}ˆ¤¡¡¨¡•‡tvi\`Vy_{˜x µ…¼¦„©}k~VYeOfoiˆ¤¤™® Ž™‚rzdbfU}gt›u–±|´£ƒ©ƒrŠ\akT`tfyŽƒ›¤—©£™†v|gafPnzT¤Ŋ¡¿ƒŸšf‡eWgUVlgo„‘§˜£®’œ{~nciZX‰S‰•n«ªƒÂ—Ž¤yx{Y`bSfik~†Œžž ¦ž˜“ˆz|kfhXgPŸ{ºŽ™½†››n‚n\c_Xhqg†‚¯•œ¶‡¤y‡lgl[\g€S¦€‚ÀŽ¾‚™i„jUe]Rmlj‰Š© ­•›‘nig_bWˆ`ƒ¢t©³¾•Œ {m~S[gPgsi„Š£Ÿ£ž•’…|tmfeeZrƒX´z½ˆ£³‹¡ipZLa`[pstŒŸš³«• „€‡txuakdSXŽ¥p´¬|ÀxgheVkmeƒ|wž¢†˜•ˆ‘‹‚}mulh_†ipµr›Àz¨ ƒŠqf_pZr}r‡…†‡ŽŽŠ‘…‰„ˆ}utrmspxy‡‹˜›œ›“Žvqkgknnrw}ƒˆŽ‘‘‹Œ‹„|wrnmqy|ˆ‹Œ“œœ˜•Š{snhfjlpp{‚„Œ’‘””Œˆ|vqlhmpv‡Œ’›žš”†yqnggmmnu}…Ž“‹‹„}ztihlqw‚‹Œ‘Ÿžš’„vnnfflmmt|…Ž’“”““Œ†€zslehqs~ˆŠŸš”…vpnhgmoot}ƒ…““ŒŽ‹…~xskemqt‰‹“œ¡ž˜“ƒuqnihnlos|‚†Š‘‘“•ŽŠ…ysjeipu€ŠŽ‘ž¡œ™“„uongflops}ƒ…‹’’““ŽŠ…€yrmfipuˆ‹šŸž™”‡xqojglpot{‚†ŠŽ‘‘’‘Ž‹‡‚xqiehos€‹’ £Ÿš”„tnmgfjnps~„‡ŒŽ‘’‘’’‹…€xqffjosƒŒ“ ¢ž—‘ƒtnlhhlosv}‚ŠŽ‹Ž“”Ž‹ƒxnegmpv†Ž– ¢ž—~smhfkmlsx€„Š‘‘‘‘Š„}ukbhprx‰˜¢£”‰yomhglnmr|ƒ„Š‘““ˆƒ}uibjpow‹’˜¡¡œ‘‡ypnfipmor}… \ No newline at end of file diff --git a/ROMs/2620_span-8.bin b/ROMs/2620_span-8.bin new file mode 100644 index 0000000..03fc607 Binary files /dev/null and b/ROMs/2620_span-8.bin differ diff --git a/ROMs/README.md b/ROMs/README.md new file mode 100644 index 0000000..c494fb8 --- /dev/null +++ b/ROMs/README.md @@ -0,0 +1 @@ +# The files in this directory are from the [Crypto Museum](https://www.cryptomuseum.com/spy/owvl/32620/index.htm) diff --git a/extract.c b/extract.c new file mode 100644 index 0000000..79fd423 --- /dev/null +++ b/extract.c @@ -0,0 +1,148 @@ +/* Extractor for Geraet 32620 ROM files + * + * Copyright (c) 2020 Michael Gernoth + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + uint8_t header[64]; + uint32_t adrs[(64/3)+1] = { 0 }; + uint8_t last_cs = 0; + int fd; + int r; + int i; + int count = 0; + + if (argc != 3) { + fprintf(stderr, "Syntax: %s in.bin prefix\n", argv[0]); + exit(EXIT_FAILURE); + } + + fd = open(argv[1], O_RDONLY); + if (fd == -1) { + perror("Can't open ROM"); + exit(EXIT_FAILURE); + } + + r = read(fd, header, sizeof(header)); + if (r != sizeof(header)) { + perror("Can't read header"); + exit(EXIT_FAILURE); + } + + /* + * From: https://blog.ardy.io/2020/8/geraet-32620/ + * + * 00000000 01000000 01000011 10110111 01001010 01000011 11000011 01011000 + * ^^^^^^^^ ^^^^^^^^ ^^^^^^^^| | + * LIIIIIII LIILIIII I????LII + * I I I I +-- Amplification (Default: 3) + * I I I +--------- Remaining chip select line? (but not quite?) + * I I +----------- Address (HI Byte) + * I +---------------- Chip Select lines A15, A14, A13 + * +-------------------- Address (LO Byte) + */ + for (i = 0; i < 62; i+=3) { + uint8_t hi, lo, amp, cs; + uint32_t adr; + + lo = header[i]; + if ((header[i+2] & 0xf8) & 0x40) { + cs = ((header[i+1] & 0xe0) >> 5) - 2; + } else { + cs = (((header[i+1] & 0xe0) >> 5) | (1 << 3)) - 4; + } + + //EOF?! + if ((header[i+2] & 0xf8) == 0xf8) + cs = last_cs; + else + last_cs = cs; + + hi = header[i+1] & 0x1f; + amp = header[i+2] & 0x3; + + adr = ((hi << 8) | lo) + (cs * 8192); + if (cs == 0) + adr += sizeof(header); + + printf("%02d. hi: 0x%02x, lo: 0x%02x, cs: 0x%02x -> adr: 0x%04x; amp: 0x%02x\n", + i/3, hi, lo, cs, adr, amp); + + adrs[i/3] = adr; + if ((header[i+2] & 0xf8) == 0xf8) + break; + + count++; + } + + for (i = 0; i < count; i++) { + uint8_t buf[65536]; + uint32_t len; + char file[32]; + int fd_out; + + lseek(fd, adrs[i], SEEK_SET); + + len = adrs[i+1] - adrs[i]; + + if (!len) + break; + + printf("%02d. Length: %d\n", i, len); + memset(file, 0, sizeof(file)); + snprintf(file, sizeof(file)-1, "%s-%02d.raw", argv[2], i); + + fd_out = open(file, O_WRONLY|O_CREAT|O_TRUNC, 0644); + if (fd_out == -1) { + perror("Can't open out"); + exit(EXIT_FAILURE); + } + + r = read(fd, buf, len); + if (r != len) { + perror("Can't read content"); + exit(EXIT_FAILURE); + } + + r = write(fd_out, buf, len); + if (r != len) { + perror("Can't write content"); + exit(EXIT_FAILURE); + } + + close(fd_out); + + } + + close(fd); + + return EXIT_SUCCESS; +}