게임보이 어드벤스의 에뮬레이터중 VisualBoyAdvance (이하 VBA) 를 플래시 .swf 파일로 컨버팅하였습니다.

VBA는 두가지의 옵션으로 컴파일이 가능합니다. GTK와 SDL. 

사실 컴파일 옵션이 바로 직전에 작업했던 gngeo에 비해서 조금 까다로운편이었는데..

libpng 라이브러리를 1.5 미만의 버전으로 해야만 컴파일이 가능했습니다. 게다 GDB 지원으로 socket을 사용하는 코드중에서 도저히 찾을 수 없는 호출이 존재해서 이 부분은 주석처리.

평소에 쓰던 fink 툴로 libpng14를 설치하여 flascc와 섞어서 컴파일. 또한 2xsai 같은 필터도 같이 컴파일한 덕분에 비주얼도 출중해졌습니다.


as3gba.zip

VisualBoyAdvance.zip


컴파일 순서를 납겨보자면...

1. 노파심에 만든 vfs도 생성했습니다. 사실 gngeo 컨버팅하면서 사용한 것 재활용

genfs vfs testvfs

2. 위에서 생성된 .as를 .abc로 컴파일하고..

java -jar ~/flascc/sdk/usr/lib/asc2.jar -merge -md -import ~/flascc/sdk/usr/lib/builtin.abc -import ~/flascc/sdk/usr/lib/playerglobal.abc -import ~/flascc/sdk/usr/lib/BinaryData.abc -import ~/flascc/sdk/usr/lib/ISpecialFile.abc -import ~/flascc/sdk/usr/lib/IBackingStore.abc -import ~/flascc/sdk/usr/lib/IVFS.abc -import ~/flascc/sdk/usr/lib/InMemoryBackingStore.abc -import ~/flascc/sdk/usr/lib/PlayerKernel.abc testvfsRootFSBackingStore.as -outdir . -out VFS

3. 이걸 받아서 Console.as 를 다시 컴파일 했습니다.

java -jar ~/flascc/sdk/usr/lib/asc2.jar -merge -md -import ~/flascc/sdk/usr/lib/builtin.abc -import ~/flascc/sdk/usr/lib/playerglobal.abc -import ~/flascc/sdk/usr/lib/BinaryData.abc -import ~/flascc/sdk/usr/lib/ISpecialFile.abc -import ~/flascc/sdk/usr/lib/IBackingStore.abc -import ~/flascc/sdk/usr/lib/IVFS.abc -import ~/flascc/sdk/usr/lib/InMemoryBackingStore.abc -import ~/flascc/sdk/usr/lib/PlayerKernel.abc -import VFS.abc Console.as -outdir . -out Console

4. Makefile 생성를 위한 configure 를 실행하는데.. 아래와같이 조큼 많이 옵션을 추가

CXXFLAGS="-I/fink/include/libpng14 -DFINAL_VERSION=1" ./configure --disable-profiling --disable-gtk --disable-dev --disable-dependency-tracking --disable-sdltest --disable-nls --disable-rpath

5. 본격 에뮬레이터 소스를 컴파일 합니다.

make

6. 위에서 컴파일한 Console.abc와 VFS.abc 함께 에뮬레이터 소스를 .swf 로 엮으면 완성.. 화면사이즈는 2xSai 필터 때문에 기본 두배 사이즈로 결정하였습니다. 만.. 뭐 컴파일 하시는분 마음대로 고치시길. 그러보니 GBA 의 두배 해상도가 iPhone 3gs 해상도네요. 그 두배가 iPhone 4 레티나 해상도가 되겠지요.

g++ -fno-exceptions -I/Users/USER_ID/flascc/sdk/usr/include/SDL -D_GNU_SOURCE=1 -I/fink/include/libpng14 -DC_CORE -DFINAL_VERSION=1 SDL.o debugger.o 2xSaI.o Cheats.o EEprom.o Flash.o GBA.o Gfx.o Globals.o Mode0.o Mode1.o Mode2.o Mode3.o Mode4.o Mode5.o RTC.o Sound.o Sram.o Text.o Util.o admame.o agbprint.o armdis.o bilinear.o bios.o elf.o expr-lex.o expr.o exprNode.o getopt.o getopt1.o hq2x.o interframe.o memgzio.o motionblur.o pixel.o remote.o scanline.o simple2x.o unzip.o ../gb/libgb.a -L/Users/USER_ID/flascc/sdk/usr/lib -Wl,-rpath,/Users/USER_ID/flascc/sdk/usr/lib -lSDL -lm -lvgl -lpng -lz ../../VFS.abc ~/flascc/sdk/usr/lib/AlcVFSZip.abc -symbol-abc=../../Console.abc -emit-swf -swf-version=17 -swf-size=480x320 -o VisualBoyAdvance.swf



뭐.. 사용법은 ROM 버튼 클릭하고 .gba 파일이나 압축된 .zip 파일을 선택하면 START버튼이 나타나고 그걸 클릭하시면 됩니다.

방향키와 ENTER.. 나머지 버튼은 설정하지 않았는데.. 어딘가 기본값이 있긴 있을겁니다 -_-

마지막으로 스크린샷 몇장.








WRITTEN BY
buzzler

,

이 소스는 gngeo-0.7 버전에 기반한것으로 모든 라이센스는 gngeo의 것을 그대로 따릅니다.

SDL 로 만들어진 원본을 flascc에서 컴파일이 가능하도록 최소한의 수정을 하였습니다.

드라이버와 설정, 세이브데이터같은 시스템 파일들은 flascc의 vfs에서 동작하도록 수정되었고,

memalloc 을 memory.h 에서 stdlib.h 으로 교체하였습니다.

FP에서 구동을 위한 Console.as 가 추가되어 main loop 로직이 일부 변경되었습니다.


as3gngeo-0.7.zip

gngeo.zip


컴파일하기

1. flascc sdk에 포함된 genfs를 이용하여 vfs 폴더를 .as 파일로 추출한다.

FLASCC=~/flasccpath/sdk

PATH=~/flasccpath/sdk/usr/bin:$PATH


genfs vfs testvfs

2. 생성된 .as 파일을 .abc 로 컴파일한다. 이는 나중에 gngeo 파일들과 함께 링크하게된다. 만약 vfs 폴더에 스스로 게임 롬파일을 넣어두었다면 큰 용량 때문에 자바 컴파일러가 heap 에러를 발생한다. 이럴 경우를 대비해 heap의 크기를 늘려주는 비표준 옵션을 추가.

java -Xmx1G -jar $FLASCC/usr/lib/asc2.jar -merge -md -import $FLASCC/usr/lib/builtin.abc -import $FLASCC/usr/lib/playerglobal.abc -import $FLASCC/usr/lib/BinaryData.abc -import $FLASCC/usr/lib/ISpecialFile.abc -import $FLASCC/usr/lib/IBackingStore.abc -import $FLASCC/usr/lib/IVFS.abc -import $FLASCC/usr/lib/InMemoryBackingStore.abc -import $FLASCC/usr/lib/PlayerKernel.abc testvfsRootFSBackingStore.as -outdir . -out VFS

3. Console.as 를 .abc 로 컴파일시, 위에서 생성된 .abc 파일을 첨부한다.

java -Xmx1G -jar $FLASCC/usr/lib/asc2.jar -merge -md -import $FLASCC/usr/lib/builtin.abc -import $FLASCC/usr/lib/playerglobal.abc -import $FLASCC/usr/lib/BinaryData.abc -import $FLASCC/usr/lib/ISpecialFile.abc -import $FLASCC/usr/lib/IBackingStore.abc -import $FLASCC/usr/lib/IVFS.abc -import $FLASCC/usr/lib/InMemoryBackingStore.abc -import $FLASCC/usr/lib/PlayerKernel.abc -import VFS.abc Console.as -outdir . -out Console

4. 에뮬레이터 소스(./src)를 컴파일한다.

cd src

sudo make

Makefile 이 이미 Configure를 통해서 생성해놓은 상태입니다. 옵션은 MAMEZ80 와 GENERATOR68K 를 사용하며 i386 asm을 꺼놓았습니다.

뭐... 이 옵션이 마음에 안드는분은 직접 설정해서 컴파일 해보시길.

위의 옵션은 모두 ASM을 사용하지 않기위함이었는데.. 이때문에 super sai같은 이펙트들을 사용할 수 없습니다.

5. 위에서 컴파일하고 남은 .o 파일들을 모아서 .swf로 링크시키는 작업이 남았습니다.

gcc  -I$FLASCC/usr/include/SDL -D_GNU_SOURCE=1 -DUSE_GENERATOR68K -DUSE_MAMEZ80 -O3 -Wall -Wno-unused -funroll-loops -ffast-math -g  fileio.o pd4990a.o streams.o video.o profiler.o main.o star_interf.o memory.o mamez80_interf.o raze_interf.o timer.o frame_skip.o messages.o screen.o emu.o unzip.o neocrypt.o sound.o generator68k_interf.o debug.o state.o conf.o transpack.o pbar.o driver.o list.o gui_interf.o videogl.o cyclone_interf.o gp2x.o drz80_interf.o menu.o effect/libeffect.a blitter/libblitter.a ym2610/libym2610.a generator68k/libgenerator68k.a mamez80/libmamez80.a    -lSDL -lz -lm  -L$FLASCC/usr/lib -Wl,-rpath,$FLASCC/usr/lib -lSDL -lm -lvgl ../VFS.abc $FLASCC/usr/lib/AlcVFSZip.abc -symbol-abc=../Console.abc -emit-swf -swf-version=17 -swf-size=704x512 -o gngeo.swf

문제없이 링크가 되었다면 gngeo.swf 생성이 되었으니 플래시플레이어를 통해서 실행을 하거나 브라우져로 실행을 하면 끝.


WRITTEN BY
buzzler

,

*바이오스파일과 롬파일이 있어야 에뮬레이션이 가능합니다*

유니바이오스를 내장하고 있지만 그 외 저작권 문제가 있는 sfix.sfx000-lo.lo 파일이 필요합니다.

구글에서 검색하면 쉽게 찾을 수 있으니 그건 이용자의 몫.

그리고 게임 롬파일이 있어야 합니다. 기본적으로 gngeo 에뮬레이터와 호환이 가능한 롬이라면 모두 구동이 가능합니다만 유니바이오스라서 생기는 차이점들이 있을 수 있습니다.



how to use

  1. BIOS 버튼을 클릭하여 sfix.sfx 파일과 000-lo.lo를 선택하고 확인버튼을 클릭. 로드가 완료되면 화면에 선택된 파일이 로드되었다는 메시지가 나옵니다.
  2. ROM 버튼을 클릭하여 게임 롬파일을 선택하고 확인버튼을 클릭. BIOS버튼과 같이 메시지가 출력되며 문제가 없으면 START버튼이 보입니다.
  3. START버튼을 클릭하고 기다린다..

key mapping

1P

coin : 3

start : 1

A : z

B : x

C : a

D : s

arrow key



WRITTEN BY
buzzler

,

neocd와 gngeo를 번갈아가며 삽질을 거듭하면서 좌절을 반복하던 찰나에 등장한 FlasCC 가 SDL 라이브러리와 zlib 등을 내장하고 1.0 버전의 배포가 시작되어 긴급 개발 방향을 선회하였습니다. 약 2년전 gngeo 0.7 소스를 alchemy로 포팅해놓고 하드를 날려먹는 어이없는 실수를 했던 터라 팠던 곳을 또 파는 삽질의 연속.

퇴사후 독립게임 개발에 열중하면서 한편으론 서버를 우분투12.4로 바꾸고 한동안 커맨드라인에 익숙해져 있던 터라 이번 포팅에 큰 도움이 된듯합니다. 지금까지 우분투를 쓰면서 하라는대로 해도 안되는일이 태반이었는데 돌이켜 생각해보면 kr.ubuntu 저장소가 뻑난탓에 패키지들 설치가 원활하지 않아서 그랬던것 같네요.

또하나 이번 포팅을 하면서 놀라웠던 점이 있는데.. SSH로 서버에 접속하고 서버단에서 gngeo를 컴파일하고 실행까지 하면 SSH 터미널 상에서 네오지오 에뮬레이터가 구동이되는 놀라움을 경험할 수 있었다는 사실. 이바닥에선 흔한일인지 어떤지 모르겠지만 오색 찬란한 아스키코드로 네오지오 게임을 렌더링하는 놀라움을 보고 감탄하지 않을 수 없었습니다. 아스키 렌더러 만든분께 존경을 표하는바.

이만 각설하고 스크린샷 첨부.






포팅을 수월하게 하기위해서 M68K 소스는 Generator68K 로 하고 Z80 소스는 MAMEZ80 으로 컴파일. 덕분에 속도저하가 조금 생긴듯합니다만 사실 이 부분 때문에 생기는 프레임드랍은 전혀 없고, 오히려 as3 단계에서 키보드나 마우스 입력 처리에 따른 드랍이 비번한편. 입력문제를 깔끔하게 개선해야할듯.

VFS 에 첨부할 파일용량이 살짝 큰 경우 .as -> .abc 컴파일시 에러가 생겨서.. .swf 파일에 롬까지 같이 구워서 돌리려면 저용량 롬만 가능할 것이고 그 외 외부 저장소에서 따로 롬을 로드한다면 스크린샷과 같이 용량이 많더라도 구동이 가능하도록 바꿔놓았습니다. 고용량 파일을 VFS에 담는 과정에서 생기는 에러는.. 롬파일을 통으로 String으로 as3에 임베딩해서 저장해놓고 그걸 컴파일 하는 과정에서 JVM이 메모리 방전으로 뻗어버리는 것으로 파악됨.

사운드가 아직 안나오고 있는데... 이유는 지금 전혀 파악된바가 없고 앞으로 비벼가며 손을 봐야할 부분입니다.






WRITTEN BY
buzzler

,