안녕하세요~

제가 블로그 살림살이 한 이후로 원래 제 분야인 S/W 쪽은 전혀(!) 다루고 있지 않았습니다. 이번에 작업한 내용도 소개 드리고, 자동차 내용(특히 QM5)과 더불어 S/W 쪽도 올리는 기념으로 M480,M4800 사용자를 위한 맵피 사용 방법을 소개 드립니다.

M480x를 소유하시고 이전에 맵피 라이센스를 가지고 있는분들은 아시겠지만!
맵피가 작동되지 않습니다. RealVGA등으로 강제로 해상도를 낮추어도 - 실제 지도 화면조차 볼 수가 없었습니다.



관련하여 많은 사용자들이 M&Soft 에 요구도 하고, 항의도 하고, 심지어 애원도 했지만 - 답변은 매우 썰렁하다 못해 불쾌한 내용만 있었습니다. 즉 WM5 / WM2003 이 아니라 정식지원 안하고, 향후 기기업체와.... 등등의 구차한 변명만 답으로 올라 왔습니다.
간단히 정리하면 "돈도 안되는데 구지 예전 라이센스 사용자를 위해 320x320 해상도 제작은 배째라"로 표현 할 수 있다는 것이죠.

그렇습니다. 그렇다고 이미 가지고 있는 라이센스 팔기도 그렇고 - 답답한 제가 한번 삽질을 해 보았습니다.
현재 저는 이벤트로 받은 '파인드라이브'를 사용하기 때문에 차에서 구지 M480x에서 맵피가 없어도 되나, 실제 생활중에 지도 확인을 자주하던 생활 패턴으로는 답답하더군요.

실행 결과 Video 부터 소개 드립니다.



집에 캠코드가 없는 관계로(그렇다고 M4300 동영상 화질을 올리기에는 제가 용납을...) WM 6 320x320 해상도의 에뮬레이터에서 수정한 Mappy를 직접 실행 해 보았습니다.
M480x와는 달리 기본동작이 아닌 파일 저장 동작에는 약간에 문제가 있긴 하지만 - 화면 동작에는 무리 없는 결과를 확인 할 수 있습니다. 당연히 M480x에는 전기능 무사 동작 합니다.

그냥 수정된 파일만 짜잔 하고 공개하면 "Cracker"와 다를바 없기에(실은 cracker?!) 이번 삽질에 대한 내용을 글로서 언급 드릴려고 합니다.
*라이센스 등록없이 실행하는 부분에 대해서는 설명이 빠집니다. 이건 직접 언급하면 서로가 곤란하겠죠 ^.^
*당연히 전 Mappy 정식 등록 사용자 입니다.
*해상도 변경법을 소개 드리는 것입니다. M&Soft에서 해야 할 일을 사용자가 삽질 하고 있는 거죠.




수정버전
  Mappy v5.5.1 [2005-5-12 현재 최신 다운로드]

필요사항
  IDA Pro : Disassembler
  UltraEdit 등의 Hex editio
  Computer에 대한 여러 지식
  ARM instruction 지식 등등



M480x에서 맵피를 실행 해 보셨으면 아시겠지만 첫 intro 화면만 살짝 - 그것도 늘어진듯한 정상적이지 못한 image로 말이죠 - 보이다가 실제 지도 화면이 나오는 부분에서는 아무런 내용이 보이지 않습니다. 터치하면 동작은 하는데 말이죠.

그래서 고민을 했습니다.
왜! 그래픽 부분은 나오지 않고, bitmap 부분만 나오는 것이냐?

나름 vector 그래픽 처리 부분이데 엉망도 아니고 먹통이라는 것이죠. 그래서 이래저래 짱돌 돌리다 생각 난 것이... 240x320용으로 만들어진 맵피가 320x320에서는 먹통이라는 말은 240과 320의 차이에서 그 차이를 뒷감당 못하고 있다는 결론이 나왔습니다. [가로/세로는 대응 합니다 - 코드가 좀 답답하지만...]

그래서 해상도를 320x320이 아닌 강제로 240x320 혹은 320x240으로 인식 시키면 어떨까 생각 했습니다.
아! 당연히 멍충이 Mappy를 위해 RealVGA를 이용해서 96dpi 상태에서의 작업입니다. 기본인 128dpi는 기대도 하지 않았습니다(당연히 128dpi에서는 동작 안합니다)

자~ 아이디어는 나왔습니다. 멍충이에게 딱 어울리는 240x320 혹은 320x240으로 해상도를 고정시키자는 것이죠.
그런데 어떻게 고정 시킬것이가... 다시 고민이 밀려 옵니다.
분명 시스템의 해상도를 알아다가 이것을 기반으로 최초 화면을 구성한다는 것은 필수적인 과정이라 할 수 있습니다.

그래서 찾은 단서가 GetDeviceCaps 함수 입니다.
함수 원형은 아래와 같습니다.
GetDeviceCaps : This function retrieves information about the capabilities of a specified device.
int GetDeviceCaps( HDC hdc, int nIndex );
그리고 입력값을 살펴보면 (나머지는 생략)
  HORZRES       8     /* Horizontal width in pixels    */ 
  VERTRES       10    /* Vertical height in pixels      */

넵... 그렇군요 가로, 세로의 픽셀수를 가져올 수 있다는 것입니다.

그래서 GetDeviceCaps를 모두 찾아 보았습니다.
아래처럼 10개 미만으로 검색 되었네요
sub_49204+80
sub_49204+90
sub_CE1A0+4C  --> 수정의미 없는 코드임 (리턴값 사용 안함)
sub_CE1A0+58  --> 수정의미 없는 코드임 (리턴값 사용 안함)
sub_DA250+190 (DA3E0) --> CFrameWnd::OnCreate 호출 직후
sub_DA250+1A0
sub_DB498+2C  -------> 이놈이 진정 의미가 있고 / 나머지(설정값 사용 안함)는 의미 없을 듯
sub_DB498+3C
sub_22099C+180 --> CreateCompatibleDC 에 대한 BitPerPixel 확인 부분

냅 그렇습니다. 이정도면 무식하게 패치해서라도 충분히 테스트 할만 하다는 것이죠.
위 호출 부분에서의 코드는 아래 형태로 되어 있습니다.
BL      CreateDCW
CMP     R0, #0
BNE     loc_492A4
MOV     R1, #8          ; int
MOV     R0, #0          ; HDC
BL      GetDeviceCaps
MOV     R6, R0
MOV     R1, #0xA        ; int
MOV     R0, #0          ; HDC
BL      GetDeviceCaps
MOV     R5, R0
MOV     R0, #0          ; HDC
BL      DeleteDC
즉 GetDeviceCaps를 이용해서 가로,세로 픽셀을 받아오는 부분이 눈으로 확인이 됩니다.
그렇다면 이것을 직접 240x320 혹은 320x240으로 수정해야 하겠습니다.

GetDeviceCaps의 결과는 R0 로 넘어 옵니다. 그러므로 GetDeviceCaps 호출에 해당하는 BL 명령 대신 MOV 명령으로 바꾸어서 R0에 원하는 값을 대입 하도록 하면 되겠습니다.
즉 R0 에 240을 대입 하고 싶으면
MOV     R0, #0xF0   ==  F0 00 A0 E3

320을 대입 하고 싶으면 아래 처럼 구성 합니다. (ARM이 32bit로 명령하나가 완성되어 shift처리로 완성)
MOV     R0, #0x140  == 05 0D A0 E3
101(0x05) << 6(110b)  shift 부분===> 0D == 1011

자~ 이제 땜방 처리할 코드가 준비 되었습니다.
320x320을 인식 못하는 맵피를 위해 240x320 / 320x240 을 각각 준비 하면 아래와 같습니다.

보는법은 아래와 같습니다.
"차례"  "파일offset"
     [ 원본 hex code ]  --> [ 수정 hex code ]

240 x 320 설정용 patch data
1  0x038684
   [ F9 9C 07 EB ] --> [ F0 00 A0 E3 ]

2  0x038694
   [ F5 9C 07 EB ] --> [ 05 0D A0 E3 ]

3  0xC97E0
   [ A2 58 05 EB ] --> [ F0 00 A0 E3 ]

4  0xC97F0
   [ 9E 58 05 EB ] --> [ 05 0D A0 E3 ]

5  0xCA8C4
   [ 69 54 05 EB ] --> [ F0 00 A0 E3 ]

6  0xCA8D4
   [ 65 54 05 EB ] --> [ 05 0D A0 E3 ]

320 x 240 설정용 patch data      아래 부분만 수정하면 됩니다. 그러면 실행 성공 하게 되죠.
1  0x038684
   [ F9 9C 07 EB ] --> [ 05 0D A0 E3 ]

2  0x038694
   [ F5 9C 07 EB ] --> [ F0 00 A0 E3 ]

3  0xC97E0
   [ A2 58 05 EB ] --> [ 05 0D A0 E3 ]

4  0xC97F0
   [ 9E 58 05 EB ] --> [ F0 00 A0 E3 ]

5  0xCA8C4
   [ 69 54 05 EB ] --> [ 05 0D A0 E3 ]

6  0xCA8D4
   [ 65 54 05 EB ] --> [ F0 00 A0 E3 ]


자~ 위의 자료를 이용해서
Mappy.exe 파일로 부터 2개의 수정된 파일을 만듭니다 (Ultra edit값은 Hex 편집기 이용)
  Mappy_240x320_Fixed.exe
  Mappy_320x240_Fixed.exe

그리고 M480x에서 실행 해 봅니다.
실제 저는 240x320 만 먼저 실행 해 보고 - 급 좌절 해었죠... 한 2초 정도?!
그리고 320x240 버전을 언능(!) 만들어서 실행 했답니다.

결과!!!!!!!!!!!!!!
넵 320 x 240 강제 수정버전의 경우 지도 화면이 나왔습니다.
이 어찌나 기쁜 결과인가!! (물론 320x240 이므로 하단부분에는 배경 application이 보입니다 ㅎㅎ)


그리고 여기저기 다루어 보았습니다.
그런데 다른 문제가 있었습니다.

GPS 상태 버턴을 누르면 화면이 먹통이 되는 것입니다. 이 때 OK 버턴을 누르면 다시 지도 상태가 정상화 됩니다.
그런데 GPS 상태를 볼 수가 없다는 것이죠.
더구나 GPS가 인식이 되면(그냥 인식 잘 안됩니다 - GpsGate 프로그램을 사용 해야 합니다) 완전 먹통상태가 됩니다. Mappy를 강제로 죽여야 한다는 것이죠.


휴.... 한숨을 다시 쉬고 - 다시 생각 합니다 - 이번에는 무엇을 땜방 해 주어야 하는가....

다음 내용은 곧 다시 정리해서 post 하겠습니다.
[실제 위 내용 까지 정리 하고서, 몇주 뒤에 계속 해서 땜질 연구를 계속 했습니다]

----- TO BE CONTINUE~
다음글 보기



참고사진 추가~

M4800 실제 실행


에물레이터 실행 장면

+ Recent posts