Just a Blog

SDCC와 Fusion-C를 통한 MSX용 C 프로그래밍 소감 본문

IT, Computer

SDCC와 Fusion-C를 통한 MSX용 C 프로그래밍 소감

wehong 2024. 7. 18. 23:06

C언어로 MSX 프로그램을 만들기 위해 얼마전에 시도해 보았던 z88dk 환경에서 MSX 라이브러리 사용에 불편함이 느껴졌다.

 

z88dk를 통한 MSX용 C 프로그래밍 소감

MSX에서 자주 쓰던 BASIC 프로그램을 빠르게 구동하고 싶어서 비슷한 기능을 하는 프로그램을 BASIC이 아닌 다른 방법으로 만들어 보아야 겠다는 생각이 들었다. 8비트 컴퓨터에서는 어셈블리 언어

wehong.tistory.com

그 다음으로 SDCC 컴파일러 환경에서 Fusion-C를 사용하는 것을 고려해 보았다.

 

SDCC는 구버전이라도 Ubuntu 18.04에서 APT 형식으로 설치가 되었다. 사용한 버전은 3.5.0인데, Fusion-C 1.2 기준으로 3.6.0 버전이 권장된다. 이 글의 작성 시점에 최신 버전은 4.4.0이다. SDCC도 z88dk처럼 다양한 프로세서와 플랫폼을 타겟으로 한다.

 

SDCC - Small Device C Compiler

What is SDCC? SDCC is a retargettable, optimizing Standard C (ANSI C89, ISO C99, ISO C11, ISO C23) compiler suite that targets the Intel MCS51 based microprocessors (8031, 8032, 8051, 8052, etc.), Maxim (formerly Dallas) DS80C390 variants, Freescale (forme

sdcc.sourceforge.net

 

사용한 Fusion-C는 1.2였다. 이 글의 작성 시점에 1.3 버전은 베타 상태이다.

 

GitHub - ericb59/Fusion-C-v1.2: MSX C Library for SDCC compiler

MSX C Library for SDCC compiler. Contribute to ericb59/Fusion-C-v1.2 development by creating an account on GitHub.

github.com

처음에 라이브러리에 있는 다양한 펑션들에 바로 눈길이 갔다. 콘솔 텍스트 출력 용도의 펑션들이 MSX에 기본 내장된 MSX-BASIC 수준에 가깝다는 느낌이 들었다. 스탠다드 C 라이브러리 함수들 대신 이런 것들을 사용하니, 과거 DOS 사용 시절 Turbo-C로 프로그래밍 하던 생각이 났다. C 언어로는 로직만 구현하고 기능들은 라이브러리에 내장된 펑션들을 그냥 이용하면 되는 수준 같이 느껴지기도 했다.

SDCC의 성능 때문인지 또는 Fusion-C 라이브러리 함수의 최적화 때문인지 명확하지는 않으나, 콘솔 텍스트 출력이 주가 되는 비슷한 기능의 프로그램을 z88dk로 구현했을 때 보다 성능도 더 나았고 생성 파일의 크기도 약간 더 작았다. z88dk에서는 거의 C 표준 라이브러리 함수를 사용했으니 당연한 것인지도 모르겠다.

아쉬운 점 중의 하나는, 사용한 SDCC가 오래된 버전이어서 그런지 최근의 C 표준 규격을 준수하지 못했다.최신 버전은 ANSI C89, ISO C99, ISO C11, ISO C23 표준을 준수한다고 나와 있는 것 같은데, 사용한 3.5.0에서는 scope 내에서 변수 선언도 되지 않아서 'for(int i=0;i<10;i++)' 같이 for 루프 내부 변수를 선언할 수 없었다.

SDCC의 최적화(optimization)도 간혹 이상한 경우가 있었다. 정의한 함수의 내부에서는 값이 바뀌지 않지만 전역변수여서 다른 함수에서 값이 바뀔 수 있음에도 불구하고, 함수 자체의 로직만 보고 while 문의 조건을 마음대로 고정하는 경우가 있었다. 이 때 컴파일러가 'warning 110: conditional flow changed by optomizer: so said EVELYN to the modified DOG'라는 문구를 출력했다.

 

Linux에서의 빌드에 다소 복잡한 Makefile 파일이 필요하고, hex2bin이라는 외부 유틸리티가 필요하다. Linux에서 터미널과 에디터 및 openMSX 에뮬레이터를 연계해서 사용하기에 불편하지는 않았다.

 

Comments