일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 티스토리챌린지
- snes
- 닌텐도 스위치
- 앙상블
- 패미컴
- YS
- 모빌슈트
- 게임보이
- 컨트롤러
- 메가드라이브
- 오블완
- 슈퍼패미컴
- 슈퍼마리오
- PSP
- ensemble
- GOG
- fpga
- ps4
- MSX
- mobilesuit
- Game Gear
- PC엔진
- analogue
- 게임기어
- 건담
- mister
- 메트로이드
- 이스
- 3DS
- Apple II
- Today
- Total
Just a Blog
SDCC와 Fusion-C를 통한 MSX용 C 프로그래밍 소감 본문
C언어로 MSX 프로그램을 만들기 위해 얼마전에 시도해 보았던 z88dk 환경에서 MSX 라이브러리 사용에 불편함이 느껴졌다.
그 다음으로 SDCC 컴파일러 환경에서 Fusion-C를 사용하는 것을 고려해 보았다.
SDCC는 구버전이라도 Ubuntu 18.04에서 APT 형식으로 설치가 되었다. 사용한 버전은 3.5.0인데, Fusion-C 1.2 기준으로 3.6.0 버전이 권장된다. 이 글의 작성 시점에 최신 버전은 4.4.0이다. SDCC도 z88dk처럼 다양한 프로세서와 플랫폼을 타겟으로 한다.
사용한 Fusion-C는 1.2였다. 이 글의 작성 시점에 1.3 버전은 베타 상태이다.
처음에 라이브러리에 있는 다양한 펑션들에 바로 눈길이 갔다. 콘솔 텍스트 출력 용도의 펑션들이 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 에뮬레이터를 연계해서 사용하기에 불편하지는 않았다.