์ ์ฌ ์๋
๋ณต๊ณ ํ ํ๋์จ์ด๋ฅผ ์ข์ํ๋ ์ ๋ ํ๋ ์๊ตญ ํ๋งค์๋ก๋ถํฐ ZX Spectrum+๋ฅผ ๊ตฌ์ ํ์ต๋๋ค. ์ปดํจํฐ ์์ฒด์๋ ๊ฒ์์ด ํฌํจ๋ ์ฌ๋ฌ ์ค๋์ค ์นด์ธํธ(์ง์ ์ฌํญ์ด ํฌํจ๋ ์๋ ํฌ์ฅ)์ ํน๋ณํ ํ์ ์์ด ์นด์ธํธ์ ๋ น์๋ ํ๋ก๊ทธ๋จ์ด ํฌํจ๋์ด ์์ต๋๋ค. ๋๋๊ฒ๋ 40๋ ๋ ์นด์ธํธ์ ๋ฐ์ดํฐ๋ ์ ์ฝ์ ์ ์์๊ณ ๊ฑฐ๊ธฐ์์ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์๊ณผ ํ๋ก๊ทธ๋จ์ ๋ค์ด๋ก๋ํ ์ ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ผ๋ถ ์นด์ธํธ์์ ZX Spectrum ์ปดํจํฐ๋ก ๋
น์ํ ๊ฒ์ด ๋ถ๋ช
ํ์ง ์์ ๋
น์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๋ค์ ์์ ํ ๋ค๋ฅด๊ฒ ๋ค๋ ธ์ผ๋ฉฐ ์ธ๊ธ๋ ์ปดํจํฐ์ ๋
น์๊ณผ ๋ฌ๋ฆฌ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ํ๋ก๊ทธ๋จ๊ณผ ๊ฒ์์ ๋
น์์ ์กด์ฌํ๋ ์งง์ BASIC ๋ถํธ๋ก๋๋ก ์์๋์ง ์์์ต๋๋ค.
ํ๋์ ์ด๊ฒ์ด ๋๋ฅผ ๊ดด๋กญํ์ต๋๋ค. ๋๋ ๊ทธ ์์ ๋ฌด์์ด ์จ๊ฒจ์ ธ ์๋์ง ์ ๋ง๋ก ์๊ณ ์ถ์์ต๋๋ค. ์ค๋์ค ์ ํธ๋ฅผ ์ผ๋ จ์ ๋ฐ์ดํธ๋ก ์ฝ์ ์ ์๋ค๋ฉด ์ ํธ์ ์ถ์ฒ๋ฅผ ๋ํ๋ด๋ ๋ฌธ์๋ ๋ชจ๋ ๊ฒ์ ์ฐพ์ ์ ์์ต๋๋ค. ์ผ์ข
์ ๋ณต๊ณ ํ ๊ณ ๊ณ ํ.
์ด์ ์ญ ๊ฐ๋ณด๋ ์นด์ธํธ ๋ผ๋ฒจ ์์ฒด๋ฅผ ๋ณด๋ ๋ฏธ์๊ฐ ์ง์ด์ง๋ค์.
๋ต์ ์ญ ๋ด ๋์์ ์์์ด
์ผ์ชฝ ์นด์ธํธ์ ๋ผ๋ฒจ์๋ TRS-80 ์ปดํจํฐ ์ด๋ฆ์ด ์๊ณ ์ ์กฐ์
์ฒด ์ด๋ฆ ๋ฐ๋ก ์๋์๋ "Manufactured by Radio Shack in USA"๊ฐ ์์ต๋๋ค.
(๋๊น์ง ์ค๊ฑฐ๋ฆฌ๋ฅผ ์ ์งํ๊ณ ์ถ์ผ์ ๋ถ์ ์คํฌ์ผ๋ฌ์ ๋ค์ด๊ฐ์ง ๋ง์ธ์)
์ค๋์ค ์ ํธ ๋น๊ต
์ฐ์ , ์ค๋์ค ๋ น์์ ๋์งํธํํด ๋ณด๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์๋ฆฌ๋ฅผ ๋ค์ด๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์์ ๊ฐ์ด ZX Spectrum ์ปดํจํฐ์ ๋ น์ ์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ น์ ์์ ๋ถ๋ถ์ ์์ ํ์ผ๋ฟ ํค - ๋์ผํ ์ฃผํ์์ ์ฌ์ด๋(์ฒซ ๋ฒ์งธ ๋ น์์์๋ 1์ด ๋ฏธ๋ง์ผ๋ก ๋งค์ฐ ์งง์ง๋ง ๊ตฌ๋ณํ ์ ์์). ํ์ผ๋ฟ ํค์ ์ปดํจํฐ์ ๋ฐ์ดํฐ ์์ ์ ์ค๋นํ๋ผ๋ ์ ํธ๋ฅผ ๋ณด๋ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ ์ปดํจํฐ๋ ์ ํธ์ ๋ชจ์๊ณผ ์ฃผํ์๋ฅผ ํตํด "์์ฒด" ํ์ผ๋ฟ ํค๋ง ์ธ์ํฉ๋๋ค.
์ ํธ ํํ ์์ฒด์ ๋ํด ๋งํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ZX ์คํํธ๋ผ์์๋ ๋ชจ์์ด ์ง์ฌ๊ฐํ์ ๋๋ค.
ํ์ผ๋ฟ ํค์ด ๊ฐ์ง๋๋ฉด ZX Spectrum์ ํ๋ฉด ํ
๋๋ฆฌ์ ๋นจ๊ฐ์๊ณผ ํ๋์ ๋ง๋๋ฅผ ๋ฒ๊ฐ์ ํ์ํ์ฌ ์ ํธ๊ฐ ์ธ์๋์์์ ๋ํ๋
๋๋ค. ํ์ผ๋ฟ ํค ์ข
๋ฃ ๋๊ธฐ ํ์ค, ์ด๋ ์ปดํจํฐ์ ๋ฐ์ดํฐ ์์ ์ ์์ํ๋ผ๋ ์ ํธ๋ฅผ ๋ณด๋
๋๋ค. (ํ์ผ๋ฟ ํค ๋ฐ ํ์ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ) ์ง์ ์๊ฐ์ด ๋ ์งง์ ๊ฒ์ด ํน์ง์
๋๋ค(๊ทธ๋ฆผ ์ฐธ์กฐ).
๋๊ธฐํ ํ์ค๊ฐ ์์ ๋ ํ ์ปดํจํฐ๋ ์ ํธ์ ๊ฐ ์์น/ํ๊ฐ์ ๊ธฐ๋กํ์ฌ ์ง์ ์๊ฐ์ ์ธก์ ํฉ๋๋ค. ๊ธฐ๊ฐ์ด ํน์ ์ ํ๋ณด๋ค ์์ผ๋ฉด ๋นํธ 1์ด ๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ๋ก๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ด ๊ธฐ๋ก๋ฉ๋๋ค. ๋นํธ๋ ๋ฐ์ดํธ๋ก ์์ง๋๊ณ N ๋ฐ์ดํธ๊ฐ ์์ ๋ ๋๊น์ง ํ๋ก์ธ์ค๊ฐ ๋ฐ๋ณต๋ฉ๋๋ค. ์ซ์ N์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ด๋ก๋ํ ํ์ผ์ ํค๋์์ ๊ฐ์ ธ์ต๋๋ค. ๋ก๋ฉ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์ผ๋ฟ ํค
- ํค๋(๊ณ ์ ๊ธธ์ด), ๋ค์ด๋ก๋ํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ(N), ํ์ผ ์ด๋ฆ ๋ฐ ์ ํ์ด ํฌํจ๋ฉ๋๋ค.
- ํ์ผ๋ฟ ํค
- ๋ฐ์ดํฐ ๊ทธ ์์ฒด
๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ก๋๋์๋์ง ํ์ธํ๊ธฐ ์ํด ZX Spectrum์ ์์ ๋งํ๋ ํจ๋ฆฌํฐ ๋ฐ์ดํธ (ํจ๋ฆฌํฐ ๋ฐ์ดํธ), ์ด ๋ฐ์ดํฐ์ ๋ชจ๋ ๋ฐ์ดํธ๋ฅผ XORํ์ฌ ํ์ผ์ ์ ์ฅํ ๋ ๊ณ์ฐ๋ฉ๋๋ค. ํ์ผ์ ์ฝ์ ๋ ์ปดํจํฐ๋ ์์ ๋ ๋ฐ์ดํฐ์์ ํจ๋ฆฌํฐ ๋ฐ์ดํธ๋ฅผ ๊ณ์ฐํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๋ ๊ฒ๊ณผ ๋ค๋ฅผ ๊ฒฝ์ฐ "R Tape loading error"๋ผ๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ์๋ฐํ ๋งํ๋ฉด ์ปดํจํฐ๊ฐ ์ฝ์ ๋ ํ์ค๋ฅผ ์ธ์ํ ์ ์๋ ๊ฒฝ์ฐ(๋๋ฝ๋์๊ฑฐ๋ ์ง์ ์๊ฐ์ด ํน์ ์ ํ์ ํด๋นํ์ง ์๋ ๊ฒฝ์ฐ) ์ด ๋ฉ์์ง๋ฅผ ๋ ์ผ์ฐ ๋ฐํํ ์ ์์ต๋๋ค.
์ด์ ์ ์ ์๋ ์ ํธ๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ด๊ฒ์ด ํ์ผ๋ฟ ํค์ด๋ค. ์ ํธ์ ๋ชจ์์ ํฌ๊ฒ ๋ค๋ฅด์ง๋ง ์ ํธ๊ฐ ํน์ ์ฃผํ์์ ์งง์ ํ์ค๋ฅผ ๋ฐ๋ณตํ์ฌ ๊ตฌ์ฑ๋์ด ์์์ ๋ถ๋ช
ํฉ๋๋ค. 44100Hz์ ์ํ๋ง ์ฃผํ์์์ "ํผํฌ" ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ ๋๋ต 48๊ฐ ์ํ์
๋๋ค(์ด๋ ์ฃผํ์ ~918Hz์ ํด๋น). ์ด ์์น๋ฅผ ๊ธฐ์ตํด ๋ด
์๋ค.
์ด์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ๋ณ ํ์ค ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํ๋ฉด "๊ธด" ํ์ค ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ ์ฌ์ ํ ~48๊ฐ ์ํ์ด๊ณ , ์งง์ ํ์ค ์ฌ์ด๋ ~24๊ฐ์
๋๋ค. ์กฐ๊ธ ์์ ๋ด๋ค๋ณด๋ฉด ๊ฒฐ๊ตญ 918Hz ์ฃผํ์์ "์ฐธ์กฐ" ํ์ค๊ฐ ํ์ผ์ ์ฒ์๋ถํฐ ๋๊น์ง ๊ณ์ํด์ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ๊ธฐ์ค ํ์ค ์ฌ์ด์ ์ถ๊ฐ ํ์ค๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฅผ ๋นํธ 1๋ก ๊ฐ์ฃผํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ผ๋ก ๊ฐ์ฃผํ๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋๊ธฐํ ํ์ค๋ ์ด๋ป์ต๋๊น? ๋ฐ์ดํฐ์ ์์ ๋ถ๋ถ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ์ผ๋ฟ ํค์ด ์ข
๋ฃ๋๊ณ ๋ฐ์ดํฐ๊ฐ ์ฆ์ ์์๋ฉ๋๋ค. ์ ์ ํ, ์ฌ๋ฌ ๊ฐ์ง ์ค๋์ค ๋
น์์ ๋ถ์ํ ํ ๋ฐ์ดํฐ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ๊ฐ ํญ์ ๋์ผํ๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ ์ ์์์ต๋๋ค(10100101b, A5h). ์ปดํจํฐ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ํ ๋ฐ์ดํฐ ์ฝ๊ธฐ๋ฅผ ์์ํ ์ ์์ต๋๋ค.
๋ํ ๋๊ธฐํ ๋ฐ์ดํธ์ ๋ง์ง๋ง ์ฒซ ๋ฒ์งธ ํ์ค ์งํ ์ฒซ ๋ฒ์งธ ๊ธฐ์ค ํ์ค์ ์ด๋์ ์ฃผ์ํ ์๋ ์์ต๋๋ค. ํ์ฐธ ํ์ ๋ฐ์ดํฐ ์ธ์ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ ๊ณผ์ ์์ ํ์ผ ์์ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ์ฝ์ ์ ์๋ ํ์์ด ๋ฐ๊ฒฌ๋์์ต๋๋ค.
์ด์ ์ค๋์ค ํ์ผ์ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ์ดํฐ ๋ก๋
๋จผ์ , ์๊ณ ๋ฆฌ์ฆ์ ๋จ์ํ๊ฒ ์ ์งํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ฐ์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- WAV ํ์์ ํ์ผ๋ง ๊ณ ๋ คํฉ๋๋ค.
- ์ค๋์ค ํ์ผ์ ํ์ผ๋ฟ ํค์ผ๋ก ์์ํด์ผ ํ๋ฉฐ ์์ ๋ถ๋ถ์ ๋ฌด์์ด ํฌํจ๋์ด์๋ ์ ๋ฉ๋๋ค.
- ์์ค ํ์ผ์ ์ํ๋ง ์๋๋ 44100Hz์ฌ์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ 48๊ฐ ์ํ์ ๊ธฐ์ค ํ์ค ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ ์ด๋ฏธ ๊ฒฐ์ ๋์ด ์์ผ๋ฏ๋ก ์ด๋ฅผ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ณ์ฐํ ํ์๊ฐ ์์ต๋๋ค.
- ์ํ ํ์์ ๋ฌด์์ด๋ ๊ฐ๋ฅํฉ๋๋ค(8/16๋นํธ/๋ถ๋ ์์์ ). ์ฝ์ ๋ ์ํ๋ ํ์์ผ๋ก ๋ณํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์์ค ํ์ผ์ด ์งํญ์ผ๋ก ์ ๊ทํ๋์ด ๊ฒฐ๊ณผ๊ฐ ์์ ํ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ฝ๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฝ์ด๋ค์ด๋ ๋์์ ์ํ ํ์์ 8๋นํธ๋ก ๋ณํํฉ๋๋ค.
- ์ค๋์ค ๋ฐ์ดํฐ์์ ์ฒซ ๋ฒ์งธ ํ์ค์ ์์น๋ฅผ โโ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ต๋ ์งํญ์ ๊ฐ๋ ์ํ ์๋ฅผ ๊ณ์ฐํด์ผ ํฉ๋๋ค. ๋จ์ํ๋ฅผ ์ํด ์๋์ผ๋ก ํ ๋ฒ ๊ณ์ฐํ๊ฒ ์ต๋๋ค. prev_pos ๋ณ์์ ์ ์ฅํด ๋ณด๊ฒ ์ต๋๋ค.
- ๋ง์ง๋ง ํ์ค ์์น์ 48์ ๋ํฉ๋๋ค. (pos := prev_pos + 48)
- ์์น๋ฅผ 48๋งํผ ์ฆ๊ฐ์ํจ๋ค๊ณ ํด์ ๋ค์ ์ฐธ์กฐ ํ์ค ์์น(ํ ์ดํ ๊ฒฐํจ, ํ ์ดํ ๋๋ผ์ด๋ธ ๋ฉ์ปค๋์ฆ์ ๋ถ์์ ํ ์๋ ๋ฑ)์ ๋๋ฌํ๋ค๋ ๋ณด์ฅ์ ์์ผ๋ฏ๋ก ํ์ค ์์น์ ์์น๋ฅผ โโ์กฐ์ ํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ(pos-8;pos+8)์ ๊ฐ์ ธ์์ ์ต๋ ์งํญ ๊ฐ์ ์ฐพ์ผ์ธ์. ์ต๋๊ฐ์ ํด๋นํ๋ ์์น๊ฐ pos์ ์ ์ฅ๋ฉ๋๋ค. ์ฌ๊ธฐ์ 8 = 48/6์ ์คํ์ ์ผ๋ก ์ป์ ์์๋ก, ์ด๋ ์ ํํ ์ต๋๊ฐ์ ๊ฒฐ์ ํ๊ณ ๊ทผ์ฒ์ ์์ ์ ์๋ ๋ค๋ฅธ ์ํ์ค์ ์ํฅ์ ๋ฏธ์น์ง ์์์ ๋ณด์ฅํฉ๋๋ค. ๋งค์ฐ ๋์ ๊ฒฝ์ฐ, ์ฆ ํ์ค ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ 48๋ณด๋ค ํจ์ฌ ์๊ฑฐ๋ ํด ๊ฒฝ์ฐ ํ์ค์ ๋ํ ๊ฐ์ ๊ฒ์์ ๊ตฌํํ ์ ์์ง๋ง ์ด ๊ธฐ์ฌ์ ๋ฒ์ ๋ด์์ ์๊ณ ๋ฆฌ์ฆ์์๋ ์ด์ ๋ํด ์ค๋ช ํ์ง ์์ต๋๋ค.
- ์ด์ ๋จ๊ณ์์๋ ๊ธฐ์ค ํ์ค๊ฐ ์ ํ ๋ฐ๊ฒฌ๋์๋์ง ํ์ธํ๋ ๊ฒ๋ ํ์ํฉ๋๋ค. ์ฆ, ๋จ์ํ ์ต๋๊ฐ์ ์ฐพ๋๋ค๊ณ ํด์ ์ด ์ธ๊ทธ๋จผํธ์ ์ถฉ๋์ด ์กด์ฌํ๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์๋ ์์ต๋๋ค. ์ต๊ทผ ๊ตฌํํ ์ฝ๊ธฐ ํ๋ก๊ทธ๋จ์์๋ ์ธ๊ทธ๋จผํธ์ ์ต๋ ์งํญ ๊ฐ๊ณผ ์ต์ ์งํญ ๊ฐ์ ์ฐจ์ด๋ฅผ ํ์ธํ๊ณ , ํน์ ํ๋๋ฅผ ์ด๊ณผํ๋ฉด ์ํ์ค์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋ฌธ์ ๋ ๊ธฐ์ค ํ์ค๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํด์ผ ํ๋๊ฐ์ ๋๋ค. ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ข ๋ฃ๋๊ณ ์นจ๋ฌต์ด ์ด์ด์ง๊ฑฐ๋, ์ด๋ฅผ ์ฝ๊ธฐ ์ค๋ฅ๋ก ๊ฐ์ฃผํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋จ์ํํ๊ธฐ ์ํด ์ด๋ฅผ ์๋ตํ๊ฒ ์ต๋๋ค.
- ๋ค์ ๋จ๊ณ์์๋ ๋ฐ์ดํฐ ํ์ค(๋นํธ 0 ๋๋ 1)์ ์กด์ฌ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ธ๊ทธ๋จผํธ์ ์ค๊ฐ(prev_pos;pos) middle_pos๋ฅผ middle_pos := (prev_pos+pos)/2์ ๋์ผํ๊ฒ ์ทจํ๊ณ ์ธ๊ทธ๋จผํธ(middle_pos-8;middle_pos +8)์ middle_pos ๊ทผ์ฒ์์ ์ต๋ ๋ฐ ์ต์ ์งํญ์ ๊ณ์ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๋ ์ฌ์ด์ ์ฐจ์ด๊ฐ 10๋ณด๋ค ํฌ๋ฉด ๊ฒฐ๊ณผ์ ๋นํธ 1์ ์ฐ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ์๋๋ค. 10์ ์คํ์ ์ผ๋ก ์ป์ ์์์ ๋๋ค.
- ํ์ฌ ์์น๋ฅผ prev_pos์ ์ ์ฅํฉ๋๋ค. (prev_pos := pos)
- ์ ์ฒด ํ์ผ์ ์ฝ์ ๋๊น์ง 3๋จ๊ณ๋ถํฐ ๋ฐ๋ณตํฉ๋๋ค.
- ๊ฒฐ๊ณผ ๋นํธ ๋ฐฐ์ด์ ๋ฐ์ดํธ ์งํฉ์ผ๋ก ์ ์ฅ๋์ด์ผ ํฉ๋๋ค. ์ฝ์ ๋ ๋๊ธฐํ ๋ฐ์ดํธ๋ฅผ ๊ณ ๋ คํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋นํธ ์๊ฐ 8์ ๋ฐฐ์๊ฐ ์๋ ์ ์์ผ๋ฉฐ ํ์ํ ๋นํธ ์คํ์ ๋ ์ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์์๋ ๋๊ธฐํ ๋ฐ์ดํธ์ ์กด์ฌ๋ฅผ ๋ชฐ๋๊ธฐ ๋๋ฌธ์ ๋จ์ํ ์คํ์ ๋นํธ ์๊ฐ ๋ค๋ฅธ 8๊ฐ์ ํ์ผ์ ์ ์ฅํ์ต๋๋ค. ๊ทธ ์ค ํ๋์๋ ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์์ต๋๋ค. ์ต์ข ์๊ณ ๋ฆฌ์ฆ์์๋ A5h๊น์ง์ ๋ชจ๋ ๋นํธ๋ฅผ ๊ฐ๋จํ ์ ๊ฑฐํ์ฌ ์ฌ๋ฐ๋ฅธ ์ถ๋ ฅ ํ์ผ์ ์ฆ์ ์ป์ ์ ์์ต๋๋ค.
๊ด์ฌ ์๋ ๋ถ๋ค์ ์ํ Ruby ์๊ณ ๋ฆฌ์ฆ
์ ๊ฐ ํ๋ก๊ทธ๋จ ์์ฑ ์ธ์ด๋ก Ruby๋ฅผ ์ ํํ ์ด์ ๋... ๋๋ ๋๋ถ๋ถ์ ์๊ฐ์ ํ๋ก๊ทธ๋๋ฐํฉ๋๋ค. ์ต์
์ ๊ณ ์ฑ๋ฅ์ ์๋์ง๋ง ์ฝ๊ธฐ ์๋๋ฅผ ์ต๋ํ ๋น ๋ฅด๊ฒ ๋ง๋๋ ์์
์ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
# ะัะฟะพะปัะทัะตะผ gem 'wavefile'
require 'wavefile'
reader = WaveFile::Reader.new('input.wav')
samples = []
format = WaveFile::Format.new(:mono, :pcm_8, 44100)
# ะงะธัะฐะตะผ WAV ัะฐะนะป, ะบะพะฝะฒะตััะธััะตะผ ะฒ ัะพัะผะฐั Mono, 8 bit
# ะะฐััะธะฒ samples ะฑัะดะตั ัะพััะพััั ะธะท ะฑะฐะนั ัะพ ะทะฝะฐัะตะฝะธัะผะธ 0-255
reader.each_buffer(10000) do |buffer|
samples += buffer.convert(format).samples
end
# ะะพะทะธัะธั ะฟะตัะฒะพะณะพ ะธะผะฟัะปััะฐ (ะฒะผะตััะพ 0)
prev_pos = 0
# ะ ะฐัััะพัะฝะธะต ะผะตะถะดั ะธะผะฟัะปััะฐะผะธ
distance = 48
# ะะฝะฐัะตะฝะธะต ัะฐัััะพัะฝะธั ะดะปั ะพะบัะตััะฝะพััะธ ะฟะพะธัะบะฐ ะปะพะบะฐะปัะฝะพะณะพ ะผะฐะบัะธะผัะผะฐ
delta = (distance / 6).floor
# ะะธัั ะฑัะดะตะผ ัะพั
ัะฐะฝััั ะฒ ะฒะธะดะต ัััะพะบะธ ะธะท "0" ะธ "1"
bits = ""
loop do
# ะ ะฐัััะธััะฒะฐะตะผ ะฟะพะทะธัะธั ัะปะตะดัััะตะณะพ ะธะผะฟัะปััะฐ
pos = prev_pos + distance
# ะัั
ะพะดะธะผ ะธะท ัะธะบะปะฐ ะตัะปะธ ะดะฐะฝะฝัะต ะทะฐะบะพะฝัะธะปะธัั
break if pos + delta >= samples.size
# ะะพััะตะบัะธััะตะผ ะฟะพะทะธัะธั pos ะพะฑะฝะฐััะถะตะฝะธะตะผ ะผะฐะบัะธะผัะผะฐ ะฝะฐ ะพััะตะทะบะต [pos - delta;pos + delta]
(pos - delta..pos + delta).each { |p| pos = p if samples[p] > samples[pos] }
# ะะฐั
ะพะดะธะผ ัะตัะตะดะธะฝั ะพััะตะทะบะฐ [prev_pos;pos]
middle_pos = ((prev_pos + pos) / 2).floor
# ะะตัะตะผ ะพะบัะตััะฝะพััั ะฒ ัะตัะตะดะธะฝะต
sample = samples[middle_pos - delta..middle_pos + delta]
# ะะฟัะตะดะตะปัะตะผ ะฑะธั ะบะฐะบ "1" ะตัะปะธ ัะฐะทะฝะธัะฐ ะผะตะถะดั ะผะฐะบัะธะผะฐะปัะฝัะผ ะธ ะผะธะฝะธะผะฐะปัะฝัะผ ะทะฝะฐัะตะฝะธะตะผ ะฝะฐ ะพััะตะทะบะต ะฟัะตะฒััะฐะตั 10
bit = sample.max - sample.min > 10
bits += bit ? "1" : "0"
end
# ะะฟัะตะดะตะปัะตะผ ัะธะฝั
ัะพ-ะฑะฐะนั ะธ ะทะฐะผะตะฝัะตะผ ะฒัะต ะฟัะตะดัะตััะฒัััะธะต ะฑะธัั ะฝะฐ 256 ะฑะธั ะฝัะปะตะน (ัะพะณะปะฐัะฝะพ ัะฟะตัะธัะธะบะฐัะธะธ ัะพัะผะฐัะฐ)
bits.gsub! /^[01]*?10100101/, ("0" * 256) + "10100101"
# ะกะพั
ัะฐะฝัะตะผ ะฒัั
ะพะดะฝะพะน ัะฐะนะป, ัะฟะฐะบะพะฒัะฒะฐั ะฑะธัั ะฒ ะฑะฐะนัั
File.write "output.cas", [bits].pack("B*")
๊ฒฐ๊ณผ
์๊ณ ๋ฆฌ์ฆ๊ณผ ์์์ ์ฌ๋ฌ ๋ณํ์ ์๋ํ ๊ฒฐ๊ณผ ์ด์ด ์ข๊ฒ๋ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ๊ฒ์ ์ป์์ต๋๋ค.
๋ฐ๋ผ์ ๋ฌธ์์ด๋ก ํ๋จํ๋ฉด ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก๊ทธ๋จ ํ
์คํธ์๋ ํค์๋๊ฐ ์์ต๋๋ค. ๋ชจ๋ ํค์๋๋ ๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค(๊ฐ ๊ฐ > 80h). ์ด์ ์ฐ๋ฆฌ๋ 80๋
๋์ ์ด๋ค ์ปดํจํฐ๊ฐ ์ด ํ์์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ ์ฅํ ์ ์๋์ง ์์๋ด์ผ ํฉ๋๋ค.
์ค์ ๋ก BASIC ํ๋ก๊ทธ๋จ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ZX Spectrum ์ปดํจํฐ๋ ํ๋ก๊ทธ๋จ์ ๊ฑฐ์ ๋์ผํ ํ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ํ
์ดํ์ ์ ์ฅํฉ๋๋ค. ํน์๋ ํด์ ํค์๋๋ฅผ ํ์ธํด๋ดค๋๋ฐ
๋ํ ์ธ๊ธฐ ์๋ Atari, Commodore 64 ๋ฐ ๋น์ ๋ค๋ฅธ ์ฌ๋ฌ ์ปดํจํฐ์ BASIC ํค์๋๋ฅผ ํ์ธํ์ฌ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์์์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. ๋ ํธ๋ก ์ปดํจํฐ ์ ํ์ ๋ํ ์ง์์ด ๊ทธ๋ฆฌ ๋์ง ์์ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ ๊ฐ๊ธฐ๋ก ๊ฒฐ์ ํ์ด์
์ปดํจํฐ ํ ๋/๋ผ๋์ค ํ์ฃ์ง TRS-80
๊ธฐ์ฌ ์์ ๋ถ๋ถ์์ ์ ๊ฐ ์์๋ก ์ ์ํ ๋ฌธ์ ์ ์ค๋์ค ๋ น์์ ๋ค์๊ณผ ๊ฐ์ ์ปดํจํฐ์์ ๋ง๋ค์ด์ก์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค.
์ด ์ปดํจํฐ์ ๊ทธ ์ข
๋ฅ(๋ชจ๋ธ I/๋ชจ๋ธ III/๋ชจ๋ธ IV ๋ฑ)๋ ํ๋ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ์์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค(๋ฌผ๋ก ๋ฌ์์์์๋ ์๋). ๊ทธ๋ค์ด ์ฌ์ฉํ ํ๋ก์ธ์๋ Z80์ด๋ผ๋ ์ ์ด ์ฃผ๋ชฉํ ๋งํ๋ค. ์ด ์ปดํจํฐ์ ๊ฒฝ์ฐ ์ธํฐ๋ท์์ ์ฐพ์ ์ ์์ต๋๋ค.
์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ์ต๋๋ค
๋๋ ์ฐพ์์ด
CAS ํ์ผ ํ์(๋๊ธฐํ ๋ฐ์ดํธ๊ฐ ์๋ ํค๋๋ฅผ ์ ์ธํ๊ณ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ํ ์ดํ์ ๋ฐ์ดํฐ๋ฅผ ๋นํธ ๋จ์๋ก ๋ณต์ฌํ ๊ฒ์ผ๋ก ๋ฐํ์ง)์ ์์๋ธ ํ ๋ค์์ ๋ง๋ค์์ต๋๋ค. ๋ด ํ๋ก๊ทธ๋จ์ ๋ช ๊ฐ์ง ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๊ณ ์๋ฎฌ๋ ์ดํฐ(TRS-80 Model III)์์ ์๋ํ๋ CAS ํ์ผ์ ์ถ๋ ฅํ ์ ์์์ต๋๋ค.
๋๋ ์ฒซ ๋ฒ์งธ ํ์ค์ ๊ธฐ์ค ํ์ค ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ฒฐ์ ํ๋ ๋ณํ ์ ํธ๋ฆฌํฐ์ ์ต์ ๋ฒ์ ์ GEM ํจํค์ง๋ก ์ค๊ณํ์ต๋๋ค. ์์ค ์ฝ๋๋ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ฐ๋ฆฌ๊ฐ ๊ฑธ์ด์จ ๊ธธ์ ๊ณผ๊ฑฐ๋ก์ ๋งคํน์ ์ธ ์ฌํ์ด์๊ณ , ๊ฒฐ๊ตญ ๊ทธ ๋ต์ ์ฐพ๊ฒ ๋์ด ๊ธฐ์๋ค. ๋ฌด์๋ณด๋ค๋ ๋๋:
- ZX Spectrum์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํ์์ ํ์ ํ๊ณ ์ค๋์ค ์นด์ธํธ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ/์ฝ๊ธฐ ์ํ ๋ด์ฅ ROM ๋ฃจํด์ ์ฐ๊ตฌํ์ต๋๋ค.
- ๋๋ TRS-80 ์ปดํจํฐ์ ๊ทธ ์ข ๋ฅ์ ๋ํด ์๊ฒ ๋์๊ณ , ์ด์ ์ฒด์ ๋ฅผ ์ฐ๊ตฌํ๊ณ , ์ํ ํ๋ก๊ทธ๋จ์ ์ดํด๋ณด๊ณ , ๊ธฐ๊ณ์ด ์ฝ๋๋ก ๋๋ฒ๊น ํ ๊ธฐํ๋ ๊ฐ์ก์ต๋๋ค(๊ฒฐ๊ตญ Z80 ๋๋ชจ๋์ ๋ชจ๋ ๋์๊ฒ ์ต์ํฉ๋๋ค).
- ์ค๋์ค ๋ น์์ "๊ณต์" ์ ํธ๋ฆฌํฐ์์ ์ธ์๋์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ CAS ํ์์ผ๋ก ๋ณํํ๊ธฐ ์ํ ๋ณธ๊ฒฉ์ ์ธ ์ ํธ๋ฆฌํฐ๋ฅผ ์์ฑํ์ต๋๋ค.
์ถ์ฒ : habr.com