DOS 프로그래밍 이야기

MS-DOS

MS-DOS는 개인용 컴퓨터 시대를 예정보다 20배 이상 앞당겨 준 의미있는 운영체제가 아닐까 싶다. 당시 IBM에서 Personal Computer라는 이름을 붙인 컴퓨터(IBM-PC)의 아키텍쳐를 화끈하게 오픈하시는 바람에 컴퓨터 제조사들이 앞다투어 호환되는 컴퓨터들을 만들어내기 시작하고 (그래서, IBM-PC호환기종이라 부름) 전 세계가 개인용 컴퓨터 풍년을 맞이하게 되었다.

춘추전국시대의 중심에서 다양하게 설계된 IBM-PC호환기종들을 구동시킬 수 있는 운영체제인 MS-DOS를 (CP/M의 호환 OS인 86-DOS를 인수해서 라벨을 MS로 옮겨붙여) 탄생시켜, 전 세계의 IBM-PC 호환기종들을 일거에 평정한건 정말 기가막힌 행운과 사업수완과 안목이 만들어 낸 기회였다.

DOS 만들기 놀이?

당시 프로그래머들 사이에서 운영체제를 만들어 보는건 일종의 레벨을 정하는 놀이 정도였던 것으로 기억한다. 내가 만든 코드를 디스크에 기록하고 부팅시켜 메모리에 로드하여 커맨드를 입력하고 디스크를 읽어들이고 화면을 제어하는 기초적인 운영체제는 ‘좀 한다’는 사람들의 연습과제 쯤 되었던 적이 있다. 하지만, 이미 모든 시장을 선점한 IBM + Intel + MS 진영과 대적할 수는 없었다.

Ms_dos

Apple ][ 의 Apple DOS 3.3도  있었던 것으로 기억되는데, 본격적으로 입문한 기기가 8088(XT) 기종이다 보니, (값비싼) Apple ][ 는 친구 집에서 오락용으로 몇 번 만져본게 전부였다. ( ][ = 로마숫자 II의 당시 애플식 표기)

Apple-II

뭐, 당시로서는 지금처럼 아름다운 툴들이 마땅히 없었으니 edit 이나 debug (MS-DOS외부커맨드)나 가지고 놀고, MASM (MS매크로어셈블러) 을 왜 공부해야 하는지 이유도 모른 채, 필요에 의해 그냥 즐겼던 것으로 기억(만) 된다. 8086/8088 어셈블러를 다루면서 컴퓨터바이러스의 일부를 메모리에 덤프하고 잘라내 고치고 변형시키면서 습득한 기술로 바이러스 만드는 놀이에 미친듯이 빠져서 꿈속에서도 답을 찾으며 지내기 시작했지만. 남들보다 월등히 떨어지는 생체 CPU로 인한 슬럼프와 학업성적의 급락, 집구석에 처박혀 두문불출 오타쿠 생활에 대한 가족갈등 등이 복잡하게 얽혀, 한계를 극복하지 못하던 어느 날…

Quick-BASIC 4.5

친구의 PC를 가지고 놀다가 우연히 발견한 인터프리터가 있었으니… 바로 Quick-BASIC 이었다. 뭐, 엄밀히 말하자면, MS-DOS에 내장된 보급형(?) Quick-BASIC이 아닌 Quick-BASIC 4.5 였다. 컴파일러가 제공되었기 때문에, 인터프리터로 손쉽게 코딩하고, 키보드 한 번에 컴파일하여 .EXE 파일로 생성할 수 있었기 때문에, 교육대학교에 진학해서 대학신문사 DM발송 프로그램을 제작해 술값 정도 버는 알바도 했었다.

개인적으로 참 못된 성격이 하나 있는데, 컴퓨터 게임을 하더라도 남들이 기피하는 캐릭터나 장비를 어떻게든 마스터해서 고수가 되려 한다든지(사무라이쇼다운의 다치바나 유쿄, 태켄의 레이 우롱, 맥워리어의 타나토스 같은…), 여튼 남들이 하지 않는 길을 찾는 것이 지금까지도 고치고 싶지 않은 부분이다.

QuickBasic_Opening_Screen

그래서, 한창 재미있게 물올리고 있던, C와 Pascal에서 과감히 손을 떼고, Quick-BASIC으로 전향해서 끝판 왕을 깨보려 시도해 나갔고, 처절한 한계를 접하기도 하고, 어쩔 수 없이 C나 어셈블러로 모듈을 컴파일해서 불러들이는 꼼수를 사용하기도 하면서 나름 괜찮은 코드들을 만들어가며 레벨을 높였다. (지금 생각해보면 얼마나 바보같은 짓이었는지 모른다)

1994년만 해도 BASIC을 한다고 하면, 일단 까고(?) 들어갈 정도로 볼랜드사의 Turbo C의 인기가 절정에 이르던 시절이었지만, Quick-BASIC으로 BIOS Interrupt를 이용해 왠만한 PC 제어 프로그램은 금새금새 만들 수 있었기 때문에, 큰 필요성을 느끼지 못했다.

예를들어, 플로피디스크 드라이브를 대기시켰다가 디스켓을 넣으면, DOS 커맨드를 입력하지 않아도 자동으로 파일 목록을 보여주며, 키보드를 이용해 파일을 선택하고 실행할 수 있도록 하는 간단한 기능?

NC, Mdir

지금은 Windows 라는 GUI 환경의 기가막힌 운영체제가 너무나 빠르고 편리하게 동작하고 있어서, 위의 내용이 잘 이해되지 않을지도 모르겠다. MS-DOS 세대는 공감하겠지만, NC(norton commander)나 Mdir 없이 PC를 이용 한다는 것은, 마치 마우스 없이 Windows를 사용하는 것과 같은 의미였다. 그런 환상적인 유틸리티인 NC와 Mdir의 모든 기능을 똑같이 Quick-BASIC으로 구현할 수 있을 정도로 푹 빠져들어 있었다.

재귀호출, 시분할, 램상주, 삭제파일복구, 디스크무결성검사 같은 간단한(?) 코드 부터, 시리얼포트와 모뎀을 이용한 네트워킹 같은 신통방통한 코드까지…

불행히도, C와 같은 언어는 라이브러리가 잘 공개되어 있어서 갖다 붙이고 값만 주고 받으면 구현되었지만, Quick-BASIC은 코드 자체가 공개되어 있지 않았고, 온라인으로 소스 코드를 구하기도 쉽지 않았던 시절이라 어렵사리 구한(성안당에 근무하셨던 아버지를 통해) 서적과 절반은 알아듣지도 못하는 영문 문서를 보면서 핵심 알고리즘을 0 byte 코딩했었다는 점이 지금도 추억으로 남아있다.

당연히, 좋지도 않은 머리로 맨 땅에 헤딩하려니 상당한 시간과 노력이 들었지만, 그 만큼 온갖 잔머리를 둘려야만 했었고, 제대로 작동할 때의 성취감은 이루 말할 수 없는 전율과 심각한 중독 증세를 일으켰다. 암호문을 역해독하는 문제를 푸느라 방학 2주 가량을 잠도 거의 안자고 밥만먹고 컴퓨터 앞에 앉아서 50여장의 낙서 가득한 연습장과 어이없이 수학공식 가득한 문서를 보며, 수업시간에 거들떠 보지도 않던 ‘수학의 정석’을 본의 아니게 공부했던 기억도 있다.

뭐, 더 이야기를 풀고 싶어도 5년이 지나면 기억을 상실하는 고질병이 있어서 더이상은 기억이 나지 않아, 에피소드를 나열하기에 어려움이 있지만, 그 중에서 가장 종합적이고 기억이 살아있는 경험을 한꼭지 풀어볼까 한다.

메모리 점유없이 다른 프로그램을 실행하기

Quick-BASIC에서 외부 프로그램을 실행하기 위해서는 SHELL 명령을 이용하면 된다. 그런데, SHELL 명령은 본 프로그램이 메모리에 상주해 있는 상태에서 COMMAND.COM이 프로그램 명령어를 실행하기 때문에, 당시 512KB, 640KB (MB도 아니고 GB도 아닌) 의 주기억장치(RAM)을 사용하던 8088 PC에서 본 프로그램의 메모리를 차지한 상태에서 큰 메모리가 필요한 외부 프로그램이 실행하다보면, 메모리 부족을 일으키게 되는 문제가 있었다.

Super Signal Man = SS.EXE

이름도 참 유치하게, 슈퍼시그널맨이라니…

필요성

8088(XT) 컴퓨터로 어떤 배치작업이나 파일을 압축하는 등의 작업울 실행하면 CPU의 속도도 문제가 있었지만, 디스크의 I/O 속도가 지금의 기기들과는 천지차이였기 때문에, 상상 이상의 시간이 소요되었고, 게다가 MS-DOS는 멀티태스킹 운영체제가 아니었기 때문에 작업이 끝날 때까지 모니터 앞에 앉아서 마냥 기다리고 있어야 했다.

이런 불필요한 기다림을 줄이기 위해 SS.EXE는 파일 압축이나 기타 오랜 시간이 걸리는 명령이 끝나면, PC스피커로 음악을 연주해 종료를 알려주는 유틸리티였다. 명령을 내리고 나면, 작업이 끝나 음악이 연주될 때까지 PC앞을 떠나 차를 마시거나 다른 일을 할 수 있는 하이브리드 멀티태스킹(?)을 구현하는게 핵심이었다.

커맨드

C:\> SS.EXE [COMMAND]
ex) C:\> SS.EXE PKZIP C:\DOCUMENT\*.* A:\BACKUP.ZIP -&
ex) C:\> SS.EXE XCOPY C:\PICTURES\*.* A:\

핵심 알고리즘

Quick-BASIC으로 작성된 SS.EXE가 아규먼트로 받아온 명령을 해석하여

SHELL 커맨드를 사용하지 않고, 명령어를 실행한 뒤,

실행된 명령어가 종료되면, 다시 SS.EXE로 돌아와 음악을 연주하고 끝.

문제

SHELL 커맨드를 사용하지 않으면, 외부 명령어를 실행할 방법이 없음.

명령어를 실행했다 하더라도 종료 후에 다시 SS.EXE를 재 실행할 수 있는 방법은?

해결책

  • SS.EXE가 명령어가 포함된 _SS_.BAT 파일을 생성한 뒤,
C:\> TYPE _SS_.BAT
CLS
@ECHO OFF
PKZIP C:\DOCUMENT\** A:\BACKUP.ZIP -&
SS.EXE /end
  • SS.EXE를 종료한 상태에서 _SS_.BAT 배치파일을 실행 시키고,
  • 배치파일에 기록된 대로 다시 SS.EXE를 실행
  • 단, 종료 시그널을 발생시키도록 옵션을 다시 입력받아 실행하여 음악 연주

또 다른 문제

  • 이미 프로그램이 종료된 시점에서 무슨 수로 _SS_.BAT 파일을 어떻게 실행시킬 것인가?
  • 여기서 SHELL을 호출하면 결국 도루묵인데.

궁극의 해결책

인터럽트를 이용한 키보드 버퍼 제어

내가 닉네임에 사용할 정도로 존경하는 인물인 Peter Norton은 정말 천재였다. 원서로 된 MS-DOS 매뉴얼을 읽던 도중, 천금같은 아이디어를 얻었는데… 키보드 버퍼를 조작해 마치 내가 키보드로 직접 입력한 것 처럼 기록하면 프로그램이 종료된 다음, 키보드 버퍼의 내용이 타이핑 되어 실행된다는 것이었다.

소스코드를 첨부하고 싶지만, 1996년도 백업디스크가 손상되어 모든 소스코드들을 날려버리고 근 한 달을 패닉상태로 지낸 사건이 있었다. 그 때 사라진 1988년부터의 천금같은 소스 코드들에 대한 미련을 술과 함께 잊어가면서 동시에 기억도, 뇌세포도 상당부분 지워져 버렸다. (지금의 컴맹으로 다시 태어나게 된 중대한 사건 중 하나)

정리

  1. SS.EXE와 명령어를 입력한다.
  2. 입력하지 않은 경우 사용법이 안내된다.
  3. SS.EXE는 명령어가 담긴 _SS_.BAT 파일을 디스크에 생성한다.
  4. 프로그램을 종료하기 전, 인터럽트를 가로채 키보드 버퍼에 _SS_.BAT <엔터> 를 기록한다. (엔터를 ASCII 코드로 반드시 기록해야 함)
  5. _SS_.BAT 파일에 기록된 대로 명령이 실행된 다음,
  6. /end 라는 종료 옵션을 받은 SS.EXE는 음악을 연주
  7. – 개선된 버전에서는 화면보호기와 함께 실행했던 것으로 기억됨.

 

DOS 기반 프로그래밍의 추억

상상+만들기=상상+프로그래밍

개인적으로 과학과 공작에 유달리 관심이 많아 서랍장을 온통 주워온 고물과 분해한 부품들로 꽉 채워, 그저 틈나는 대로 무언가를 만들었던 어린 시절

TV외화 시리즈의 주인공안 맥가이버를 보며, 주인공 ‘MACGYVER’가 만들었던 어떤 것을 집에 와서 꼭~ 만들어야만 했던 추억

초등학교에 취학하기 전부터, 출판사에 근무하시던 아버지께서 편집을 위해 가져오신 전자전기관련 서적과 일본에서 들여와 번역한 과학이론서적, 관상이며 음양오행이며 한자가 잔뜩 섞인 동양 철학 서적을 그림책 보듯이 빠져들어, 알아 듣지도 못하는 내용을 그림과 숫자와 글을 내 멋대로 이해해가며 어렴풋이나마 이해가 될 때까지 수십 번을 곱씹고 읽으며, 마치 놀이하듯 책 읽던 기억

이런 어린 시절의 기억들이 물리학자의 꿈을 갖게 하였고, 성장의 과정에서 컴퓨터라는 기회를 만나 ‘내가 상상한’ 것을 ‘공작하여 만들기’에서 ‘컴퓨터로 구현하기’로 살짝 방향 전환을 했을 뿐…

프로그래밍교육에 대한 질문

  1. 최근 프로그래밍교육이라는 화두를 접하며, 우리 교육이 인문학과 기초과학에 충분히 접근하여 아이들이 충분히 경험하고 있는가에 대한 질문과
  2. 아이들의 생각과 두뇌를 활짝 열어 놓은 준비된 상태에서, 응용과학을 이야기하고자 하는 것인가 하는 질문을 던지고 싶다.

프로그래밍교육에 대한 시도는 여러 차례 이루어져 왔었다. 물론, 시도 자체를 부정하는 것은 결코 아니다. 시도하지 않으면 배우는 것도 없고, 발전도 없다는데 전적으로 동감한다.

  • 다만, 인프라에 비해 교육과정이 준비되지 않았다거나,
  • 상업적 이해 관계가 교육현장보다 강했다거나,
  • 정부주도 실적중심의 비교육적 사업에 대한 관심이 지나쳤다거나,
  • 교사들 스스로의 가르칠 필요성보다 교사들이 가르쳐야만 한다는 압력이 지배적이었다거나,

하는 문제가 충분히 해소되고 있는지에 대한 궁금증일 뿐이다.

미친 놈에서 컴맹의 길로 접어든지 20년 가까이 되어가는 시점에서 옛 추억을 떠올리며, 그냥 옛 추억이 떠올라 한 꼭지 적어 보았다. 인기가 좋으면, 다른 이야기 꼭지를 풀게 될지도… ^^

 

컴맹 맥노턴 선생.

 

 

(추신) 워낙 오래 전 기억이고, 좋지도 않은 머리로 쥐어짜내 쓰다보니, 내용 중에 잘못된 부분이 있을 겁니다. 아래 댓글로 콕~ 찍어주시면 감사하겠습니다.

글쓴이: 맥노턴

초등교사커뮤니티 '인디스쿨' 대표