게임보이 어드벤스의 에뮬레이터중 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

,

지금까지 define같은 매크로는 const로 해결하거나 함수로 만들어서 해결하려고 발악해왔지만, mc68k 에뮬레이션에서는 그것마저도 한계에 다다릅니다. 전처리가 아니면 해결할 수 없는 예외상황이 너무 많아서 일단 소스차원의 다이렉트 포팅은 힘들겠다는 판단. 속도문제도 생기고하니 일단 다른 방법을 찾아야했달까..

참고로.. as3에는 매크로로 쓸만한 그 어떤것도 제공하지 않습니다. 툴에서도 그렇고. 아마 일부 Flex에서 가능한 부분이 있는듯 한데 이제와서 Flex 라이브러리를 만들 생각은 없으니까 그 마저도 아웃오브안중.

이런 부분을 해결하고자.. c에서 전처리 이후의 소스로 포팅을 시도하고있습니다. gcc에서 -E 옵션으로 preprocessing  까지만 돌리고 compile 이나 linking은 패스. 그 결과 macro가 모두 사라지고 inline 함수들이 빼고하게 차오른 상태의 소스를 얻을 수 있었습니다. 대신 그만큼 정리도 안되고 지저분해지는 단점이 생기지만 일단 해결하기 어려운 많은 문제가 이로써 해결. 이렇게 단순한 방법을 몰라서 고생도 많이 했습니다. 

부작용이라면.. 이렇게 하고나니 지금까지 포팅했던 수많은 소스도 다시 고쳐야 한다는 압박감이 생기기 시작.




WRITTEN BY
buzzler

,
파일 IO와 관련된 부분을 마무리하고 간단히 테스트 완료. video나 memory 부분을 갖춰좋고 cpu를 건드리려고 생각해봤으나 일단 큰 장벽으 하나 넘어야 마음이 놓일것 같아서 MC68000 구현을 먼저할까 합니다.
스을쩍 코드를 봤는데 미칠듯한 OPCODE 가득. 지금까지 수많은 포인터는 잘 참아 왔는데 어셈블리 코드는 어찌해야할지 조금 난감한 상황. 어셈블리코드를 에뮬레이션하기위한 어셈블리코드를 다시 에뮬레이션 하거나 아니면 완전히 새로..

WRITTEN BY
buzzler

,

이미 오래전에 만들어진 포멧이라 자료도 많고 예제도 많아서 쉽게쉽게 파서를 구현했습니다.  다만.. .iso에는 오디오 트랙이 포함되지 않기 때문에 게임에서 BGM재생을 위해 필요한 CDDA 기능은 .mp3를 따로 추가하거나 폴더를 지정하는 방식으로 에뮬레이팅 해야겠음.

만들면서 생각난 사실인데.. 다른 에뮬레이터들은 게임롬과 바이오스롬의 덤프/배포가 불법이라서 완전무결한 서비스를 만드는데 걸림돌이 항상 있어왔는데..  네오지오-시디는 컴퓨터의 시디롬에 정품 소프트를 넣고 에뮬레이셔닝하면 그런 문제가 사라지고, 바이오스롬도 개발자들이 직접 만든 유니버셜 바이오스를 사용하면 법의 테두리 안에서 서비스도 가능하겠다 싶네요.

중요한건

할 생각이 없다는거. 단지 가능하다 안하다의 이야기일뿐.




'programming > as3neocd' 카테고리의 다른 글

C 에서 actionscript 로 변환시 매크로 문제.  (0) 2012.06.20
MC68000 에뮬레이셔닝  (0) 2012.06.16
as3neocd 레포지토리 생성  (0) 2012.06.07
참고자료 모음  (0) 2012.06.07
NeoCD/SDL flash port  (1) 2011.02.19

WRITTEN BY
buzzler

,

라이센스들 읽어볼 겨를이 없어서 일단 무시하고 달리는 중 입니다. 완성이 되면 그때 읽어보고 공개를 하던지 말던지 할 생각. 완성이 안되면 말고.

초기 목표는 alchemy 포트를 노렸었고 실제 swc컴파일도 성공하긴 했는데 이유를 알수없는 state error?? 라는 상황까지.이에 질세라 실수로 그간 포팅하던 소스도 다 날려먹고 잊혀진 프로젝트가 됐습니다만, as3gb리뉴얼을 성공적으로 한 이후 자신감이 붙어서 직접 네이티브 코드로 개발을 계획하고 다시 시작헀습니다.
SDL 기반으로 gcc로 만들어낸 원본이라 한계가 예상되지만 일단 그래도 고. 고고. (아아.. 포인터로 기교 부린 코드는 정말...)

데이터는 ISO9660 로더를 만들어서 쓰면 될것같고.. CDDA는 .swf만으로는 디바이스 접근 방법이 없을듯 하니 MP3로 리핑된 트랙을 가상으로 CDDA구축해야 할 것같은 느낌. 아직 찾아보진 않았는데 아마도 그렇지 않을까 합니다. 현제 인터페이스 만들어놨고 어플리케이션 소스중 cdrom.* cdaudio.* 는 구현 완료된 상태. 이번 주중에 ISO9660 로더 구현에 돌입!

가장 큰 난관은 CPU인 MC68000 와 코프로세서인 Z80, YM2610 의 포팅인데.. 이 부분은 아직 발도 들이놓지 않은 상태. 갈 길이 천리입니다.

'programming > as3neocd' 카테고리의 다른 글

C 에서 actionscript 로 변환시 매크로 문제.  (0) 2012.06.20
MC68000 에뮬레이셔닝  (0) 2012.06.16
ISO9660 파서 구현 완료  (0) 2012.06.13
참고자료 모음  (0) 2012.06.07
NeoCD/SDL flash port  (1) 2011.02.19

WRITTEN BY
buzzler

,

H/W spec.

NeoGeoProgrammersGuide.pdf


개발 메뉴얼

NeoGeoPM.pdf


ISO 9660 spec

The ISO 9660 FileSystem.pdf


NEOCD/SDL 컴파일 환경 구축

http://ubuntu-gamedev.wikispaces.com/How-To+Setup+SDL+for+games+development

'programming > as3neocd' 카테고리의 다른 글

C 에서 actionscript 로 변환시 매크로 문제.  (0) 2012.06.20
MC68000 에뮬레이셔닝  (0) 2012.06.16
ISO9660 파서 구현 완료  (0) 2012.06.13
as3neocd 레포지토리 생성  (0) 2012.06.07
NeoCD/SDL flash port  (1) 2011.02.19

WRITTEN BY
buzzler

,

에뮬레이터 제작시 필수 자료인 CPU 명세서

GBCPUman.pdf



WRITTEN BY
buzzler

,