2010년 6월 1일 화요일

DOS2 Banking Library & Build tool 제작 #2

얼마전부터 만들던 HI-TECH C용 뱅킹 라이브러리가 기본 틀이 완성되었습니다.

 

Makefile에서 소스 파일들을 뱅크 별로 목록만 만들면,

뱅크간 참조되는 함수 콜을 생성해서, DOS2의 세그먼트 전환으로 실행되도록 구현했습니다.

 

빌드가 완료되면, 실행파일(*.COM)과 각 뱅크의 코드 묶음(*.OVL)이 생성됩니다.

DOS2에서 실행하면 *.OVL 파일 크기에 따라 필요한 메모리 세그먼트를 할당 하고 파일을 로딩합니다.

로딩이 완료되면 main() 함수가 실행됩니다.


뱅크 내의 각 함수(main 함수 포함)들은 크기 제한(32KB)외에는 자유롭게 뱅크를 선택해서 만들수 있습니다.

 

뱅크간 참조 함수 처리는 빌드시, 특정 프로그램으로 생성되는데요. 아래의 순서로 진행됩니다.

 

1. 각 뱅크별로 소스들을 컴파일 하고, 임시로 라이브러리와 링크를 수행합니다.

    이 때, 링크 시 없는 함수들은 따로 리스트를 만들어 놓습니다. (*.LST 파일)

 

2. 각 뱅크별로 소스들만 컴파일/링크해서, 존재하는 함수 목록을 만듭니다. (링크 시 생성된 *.MAP 사용)

 

3. 모든 소스의 함수들의 실제 엔트리 주소와 뱅크 번호를 모아서 목록을 만듭니다. (*.REF 파일)

 

4. 1번 리스트에 등록된 함수와 3번의 전체 함수 목록을 참조해서,

    뱅크 전환 후 점프되는 가짜 함수를 만듭니다. (어셈블리 *.AS 생성)

 

5. 각 뱅크별 소스와 가짜 함수 코드를 같이 컴파일해서 링크합니다.

    참고로 가짜 함수는 콜을 하는 소스와 같은 뱅크에 존재하지만,

    실제 실행되면 진짜 함수가 존재하는 뱅크로 메모리 전환 후 콜됩니다.

    함수에서 리턴시, 원래 뱅크로 복귀.

 

6. 뱅크0의 코드는 Loader프로그램과 함해져서 실행파일(*.COM)로 생성되고,

   나머지 뱅크들은 1개의 *.OVL 파일로 합쳐집니다.

 

 

아래는 MSX 에뮬레이터에서 MSX-DOS2 환경으로 실행된 모습입니다.

뱅크가 3개인 프로그램(TESTAPP)를 실행한 모습입니다.

뱅크0는 기본으로 로딩되기 때문에 2개 뱅크(4개 메모리 세그먼트)가 추가로 할당되는 모습을 볼수 있습니다.




라이브러리 및 빌드시 필요한 프로그램은 좀 더 정리되면, 자료실에 업로드하겠습니다.

 

어셈블리 코드로 만들 필요가 없으니,

앞으로 메모리 걱정없이 편하게 C로 코딩할수 있게 되었습니다. ㅎ.ㅎ

댓글 없음:

댓글 쓰기