이스6 멀티코어 프로세서로 실행이 안될때 (일본어판)

이스6의 초회판의 시디를 가지고 있습니다만 최근까지 돌려보질 못했습니다.

저희 집 컴퓨터의 경우는 q6600.. 그러니까 쿼드코어를 사용하고 있는데,

이스6 한글패치의 경우 멀터코어에서는 불가능하니 일단 접어둡니다.

(강제로 싱글코어로 윈도우를 인식시켜도 불가, vmware를 사용하여 프로세서를 1개로 인식시켜도 불가)

1106패치후 보통 한글패치를 사용하는것이 정석입니다만, 이것은 싱글코어의 얘기고,

멀티 코어의 경우는 1109패치부터 실행이 가능합니다.

팔콤 홈페이지에서 1109 패치 (http://www.falcom.co.jp/qanda/update/index.html 에서 참조)를 받으시면 되는데

자신의 이스6의 시디가 어떤 버전이냐에 따라 업데이트 할수 있는것이 다릅니다.

위 사이트에 가보면 이스 6 패치의 경우 3가지가 있는데 각각

イースVIナピシュテムの匣(特典版) -> 특전판 (=초회판)

イースVIナピシュテムの匣(通常版) -> 통상판

イースVIナピシュテムの匣(普及版) -> 보급판

위 3가지가 존재하므로 자신의 시디 버전에 맞춰서 업데이트를 해주시면 됩니다.

저의 경우에는 초회한정판을 가지고 있으므로 맨 위의 특전판 업데이트로 1109 패치를 실행하였더니

그제서야 멀티코어에서도 이스6이 실행됩니다.

언어문제는 후커로 어찌어찌 해결해보도록 합시다. ㅇㅆㅇ;;;

멀티코어 상에서의 이스6 실행시의 증상들. (프로세서는 쿼드코어(q6600), 시디는 초회판 기준, 한글패치는 1.00a 기준)

1. Windows XP SP3에서 Ver 1.0.0.0(차후 1000으로 표기)을 실행

-> 마우스 커서가 잠시 모래시계로 바뀐후 아무 응답없음

2. Windows XP SP3에서 Applocale을 사용하여 일본어로 언어환경을 바꾼후 실행

-> 1번과 마찬가지 증상

3. Windows XP SP3에서 1106 패치 후 한글패치 하고 하나비 런쳐를 applocale을 이용하여 언어를 English로 바꾸고 실행

-> 하나비 런쳐에서 “게임 실행 준비중”까지 뜨고 종료.

4. Windows XP에서(초기버전) Applocale을 사용하여 일본어로 언어환경을 바꾼후 실행

-> 1번과 마찬가지 증상

5. Windows XP에서 1106 패치 후 한글패치 하고 하나비 런쳐를 applocale을 이용하여 언어를 English로 바꾸고 실행

-> 3번과 마찬가지 증상

6. Windows XP SP2에서 1106 패치 후 한글패치 하고 하나비 런쳐를 applocale을 이용하여 언어를 English로 바꾸고 실행

-> 3번과 마찬가지 증상

7. 일본어판 Windows XP SP2에서 이스6 설치후 (1000버전) 실행

-> 1번과 마찬가지 증상

8. 일본어판 Windows XP SP2에서 이스6 설치 뒤 1109 패치 적용 후 실행

-> 실행가능

9. Windows XP SP3 에서 이스6 설치 뒤 1109 패치 적용 후 applocale을 이용하여 언어를 일본어로 바꾸고 실행

-> 실행가능

10. boot.ini파일에서 numproc=1 옵션으로 강제로 프로세서의 개수를 1개로 맞춘후 Windows XP 초기버전,SP1,SP2,SP3에서의 1106패치 후 한글패치의 설치 후 실행

-> 3번과 마찬가지 증상

11. Windows XP에서 “국가별 설정”에서 모두 일본어로 맞춘후 실행

-> 1번과 마찬가지 증상

12. Windows XP 초기버전, SP1~3에서의 1000버전에서 바로 한글패치후 실행

-> 3번과 마찬가지 증상

13. Vmware상에서 프로세서의 개수를 1개로 설정후 위 모든 과정의 실행

-> 위에서 설명한것과 동일한 증상

14. Windows 98에서 일본어 언어팩 설치후 한글패치를 설치하고 실행

-> 3번과 마찬가지 증상

15. Windows 2000에서 “국가별 설정”에서 모두 일본어로 맞춘 후 실행

-> 1번과 마찬가지 증상

이상 제가 실험해본 목록입니다.

따라서 1109패치를 해주시면 일단 “실행”은 가능하니 차후 언어문제에 관해서는 후커로 해결을 보는쪽으로 가닥을 잡으면

멀티코어에서도 이스6을 즐기실수 있다고 봅니다.



피 2 남겨놓고 처참한 패배…

4Bit Full Adder for PCB

전에 한번 8Bit 7-Segment LED를 이용하여 Bread Board에 Full Adder를 만든것을 포스팅 한적이 있다.

이번에 학교에서 이것을 PCB로 떠서 4Bit (보드 크기가 제한되어 8Bit는 불가)로 전가산기를 만드는 프로젝트가 있어서 이 기회에 다시한번 remind 하고자 이 포스트를 작성하였다.

이 회로를 간단히 설명하자면 DIP스위치로 숫자를 입력 받아 7segment LED로 4bit 가감산 결과를 (7483 Full Adder 이용) 출력하는 회로이다.



Toggle Switch를 이용하여 덧셈을 할 것인지 뺄셈을 할 것인지 정하고 숫자의 입력은 DIP Switch로 0~F (Binary : 0000~1111) 까지의 숫자 입력 범위를 가진다.

다만 F+F와 같은 연산은 8bit 연산이므로 Carry를 넘길 수 없는 단점이 존재한다.

제일 먼저 할일은 7-Segment LED의 점등을 위한 진리표를 만들어야 한다.

이를 위해서는 7-Segment LED의 원리를 알 필요가 있는데, 아래의 그림을 참고한다.



Cathode의 경우는 그라운드가 공통이며 Anode의 경우는 Vcc(+5v)가 공통이다.
용도에 따라서 다르게 쓸수 있으나 Active Low가 대세이므로 Anode 타입을 사용하며 다음과 같이
회로가 켜질 수 있도록 설계하는것이 포인트.



이 때 신호는 Active Low가 되야 하므로 0이 될때 Vcc와 Signal 사이의 전압차가 생겨서 전류가 흐르므로 LED가 켜지게 된다.

TTL 7447 (Binary to Decimal Decoder)를 사용해도 좋지만 이것의 경우는 0~9까지만 표시되므로
0~F까지의 범위를 가질 수 있도록 GAL을 이용하여 따로 프로그램을 작성하기로 한다.

위 7-Segment LED에 A,B,C,D 와 같이 알파벳으로 값이 매겨져 있는데 그것은 하나의 LED를 뜻한다.
A자리에 불이 들어오게 하기 위한 진리표는 다음과 같다.

수(Bin)
수(Hex)
0000
0x00
1
0001
0x01
0
0010
0x02
1
0011
0x03
1
0100
0x04
0
0101
0x05
1
0110
0x06
1
0111
0x07
1
1000
0x08
1
1001
0x09
1
1010
0x0A
1
1011
0x0B
0
1100
0x0C
1
1101
0x0D
0
1110
0x0E
1
1111
0x0F
1

왜 이런값을 매겼냐하면 다음과 같은 Character Set을 이용하기 위함이다.



숫자 0을 예로 들어보면 현재 켜져 있는 LED는 A, B, C, D, E, F가 켜져있고 G는 꺼져있는 상태이다.
0에서 A가 켜지므로 이것의 값은 1이 나와야 한다.

하나의 예를 더 들어보자면 숫자 1에는 현재 켜져 있는 LED가 B,C가 켜져있고 나머지는 꺼져있으므로
A의 값은 0이 된다.

이러한 진리표를 Boolean Algebra를 만든 후 식을 축약하는데, 여기서는 카노맵을 사용하면 된다.
카노맵과 원래 식이 맞는지 확인하기 위해 다음과 같은 프로그램을 만들었다.

// Equivalent Discriminator for Boolean Function by Xeriars

#include <stdio.h>
#include <stdlib.h>

int main () {

int a_,b_,i,fcount=0;
system(“cls”);
printf(”   Truth Tablenn”);
for(i=0;i<16;i++) {
int A=!!(i&8), B=!!(i&4), C=!!(i&2), D=!!(i&1);
a_ = (!A & !B & !C & !D) + (!A & !B & !C & D) + (!A & B & C & D) + (A & B & !C & !D);
b_ = (!A & !B & !C) + (B & (!A & C & D) + (A & !C & !D));
if (a_ != b_) { printf(“%X : t1 = %d, t2 = %d ——– Xn”, i,a_,b_); ++fcount; }
else { printf(“%X : t1 = %d, t2 = %dn”, i,a_,b_); }
}
if (fcount > 0) { printf(“nFalse Count : %d”, fcount); }
getch();
return 0;
}

a_랑 b_ 부분을 수정해서 컴파일해보면 알 수 있다.



원래 식과 축약된 식이 일치하면 위와 같은 화면을 볼 수 있지만 틀리다면 다음과 같이 프로그램의 출력이 변한다.



2개가 틀렸다는것을 알 수 있다. 이 식은 잘못된 경우이다. 축약을 다시 하여야 한다.
아무튼 이 짓이 싫으면 Karnaugh Minimizer란 프로그램을 구해서 사용하면 된다.

아래 표는 0~F까지의 진리표를 종합한 것이다.

Input
Output
HEX.
A
B
C
D
OUTA
OUTB
OUTC
OUTD
OUTE
OUTF
OUTG
0
0
0
0
1
1
1
1
1
1
0
0
0
0
0
1
0
1
1
0
0
0
0
1
0
0
1
0
1
1
0
1
1
0
1
2
0
0
1
1
1
1
1
1
0
0
1
3
0
1
0
0
0
1
1
0
0
1
1
4
0
1
0
1
1
0
1
1
0
1
1
5
0
1
1
0
1
0
1
1
1
1
1
6
0
1
1
1
1
1
1
0
0
0
0
7
1
0
0
0
1
1
1
1
1
1
1
8
1
0
0
1
1
1
1
0
0
1
1
9
1
0
1
0
1
1
1
0
1
1
1
A
1
0
1
1
0
0
1
1
1
1
1
B
1
1
0
0
1
0
0
1
1
1
0
C
1
1
0
1
0
1
1
1
1
0
1
D
1
1
1
0
1
0
0
1
1
1
1
E
1
1
1
1
1
0
0
0
1
1
1
F

여기서 사용할 GAL은 G22V10이며 핀배치는 아래처럼 생겼다.



이것을 wincupl의 형식에 맞게 적용한 파일은 다음과 같다.
———————————————————————————–

Name     7segment;
PartNo   g22v10;
Date     2007-05-18 ;
Revision 01;
Designer Xeriars;
Company  The X.D.C.;
Assembly 000;
Location In_the_Hell;
Device   g22v10;

/* *************** INPUT PINS *********************/
PIN 02 = A;
PIN 03 = B;
PIN 04 = C;
PIN 05 = D;

/* *************** OUTPUT PINS *********************/
PIN 17 = OUTA;
PIN 18 = OUTB;
PIN 19 = OUTC;
PIN 20 = OUTD;
PIN 21 = OUTE;
PIN 22 = OUTF;
PIN 23 = OUTG;

/* *************** EQUATIONS *********************/

!OUTA = (B & C) # (!A & C) # (A & !D) # (!B & !D) # (!A & B & D) # (A & !B & !C);
!OUTB = (!B & !D) # (!B & !C) # (!A & C & D) # (A & !C & D) # (!A & !C & !D);
!OUTC = (!C & D) # (!A & D) # (A & !B) # (!A & B) # (!B & !C);
!OUTD = (!A & C & !D) # (!B & C & D) # (B & !C & D) # (A & B & !D) # (!B & !C & !D);
!OUTE = (C & !D) # (A & C) # (A & B) # (!B & !D);
!OUTF = (A & C) # (A & !B) # (B & !D) # (!C & !D) # (!A & B & !C);
!OUTG = (A & C) # (!B & C) # (A & !B) # (B & !C & D) # (!A & B & !D);

———————————————————————————–

위 내용을 복사해서 붙인후 *.pld 파일로 저장한다음 Rom Wrinter로 GAL을 구워주면 된다.
이렇게 만들어진 GAL의 핀 관련정보는 위에서 보면 잘 나와있으므로 자세한 설명은 생략한다.





덧셈과 뺄셈을 하기 위해서는 TTL 7483(Full Adder)과 7486(XOR Gate)을 사용하게 되는데 IC 부품 가게에 가면 두가지 타입이 있다.

74LS83과 74HC83 두가지가 있는데 이 두가지는 사용법이 엄연히 다르므로 주의해서 사용하여야 하지만
이 포스트에서는 모든 핀을 사용하므로 이것에 대한 자세한 설명은 생략하지만 HC Type을 쓰는경우
안쓰는 핀은 반드시 High로 신호를 걸어주는 편이 신상에 이롭다.
(이것을 모르면 개피보는 수가 생기므로 반드시 주의한다.)



모든 회로에는 타임차트를 작성하여 동작 원리를 알수 있도록 한다.
이렇게 해주면 실수할 확률이 상당히 줄어든다.

1단계적인 완성을 위해 위에서 설명한 내용을 종합하여 아래와 같은 회로 설계를 할 수 있다.



스위치 부위에 Array 저항(10k)를 달아서 스위치가 닫혔을때도 신호가 제대로 들어갈 수 있도록 하여야 한다.



위 도면은 전원부 관련 회로이다. 7805(5Volt Regulator)를 사용하였고 전해 커페시터를 사용하여 전압이 항상 일정하게 공급될 수 있도록 해준다. (커페시터를 달아주는것은 7805 Data Sheet에서 권장하고 있는 형태이다.)
그리고 각 IC에는 반드시 커페시터를 달아서(이것을 Bypass Capacitor라고 표현) 노이즈를 막고 또한 전압이 일정하게 공급될수 있도록 한다.

※ 7805를 사용하려면 입력전압이 2~5V정도 높은 것을 사용하여야 한다.
필자는 9V/500mA의 어뎁터를 사용하였다.

이렇게 회로를 구성했으면 PCB를 뜨기위한 Footprint 작업으로 넘어간다.
다음 표를 참고하여 PCB Footprint의 정보를 입력한다.

No.
Part Name
PCB Footprint
1
7SEG-ANODE
r_FND_507 (직접 제작)
2
Capacitor 10u
CYL/D.250/LS.125/.031
3
Capacitor 104
RAD/.150X.100/LS.100/.031
4
Resistor 330
10k
AX/.400X.100/.031,BLKCON.100/VH/TM1SQ/W.100/6
5
TTL 74LS83
DIP.100/16/W.300/L.800
6
TTL 74HC86
DIP.100/14/W.300/L.700
7
GAL22V10
DIP.100/24/W.300/L1.175
8
HEADER2
BLKCON.100/VH/TM1SQ/W.100/2
9
LM7805
TO220AA/RF2
10
SW DIP-4/SM
DIP.100/8/W.300/L.400
11
SW KEY-SPDT
BLKCON.100/VH.TM1SQ/W.100/3

OrCAD Lay-out을 사용하여(사용법은 알아서 숙지) 수작업으로 Routing을 하던지 아니면
OrCAD Layout Plus SmartRoute Calibrate를 사용하여 자동으로 뜨는 방법을 고려한다.

필자는 Routing이 귀찮아서 후자의 방법을 채택하였으나 몇가지 기준은 필요하다.

1. PCB는 양면기판 이상을 사용하자. (단면기판은 라우팅 하기가 까다롭다, 그리고 4층 이상의 다층 기판을 사용하게 되면 한면은 VCC, 다른 한면은 GND로 사용할수 있는 장점이 있으므로 노이즈에 대해서도 매우 유리하다. 다만 돈이 많이 들게 되므로 대량생산하는 경우는 심각히 고려해야 할 사항이다.)

2. 앞면을 세로 기준으로 라우팅을 한다면 뒷면은 가로 기준으로 라우팅을 하자. (이렇게 기준을 정하면 회로가 미관상으로 이뻐 보인다.)

3. 가급적 뺑뺑 돌아가는 라우팅은 피한다. (공간 전도 노이즈에 감염될 확률이 높아지며, 배선 자체가 코일, 저항 역할을 하게 되므로 전류흐름의 방해요소로 작용된다.)

필자는 시간이 없어서 자동 라우팅을 하고 급하게 PCB를 뜨고 나서 생각해보니 3번항목을 지키지 못하였다.
아무튼 결과는 다음과 같이 나왔다.



양면 기판을 사용하여 작성하였고 PCB 기판의 크기 제한은 11cm x 7cm이다.
신호선폭은 12mil(1/1000인치), 전원 선폭은 25mil로 작성되었다.



PCB 기판의 앞면만 나타낸 모습이다. 자동 뜨기를 했더니만 2번항목이 전혀 지켜지지 않았다. -_-;;



PCB 기판의 뒷면만 나타낸 모습이다. 앞면에 비해서 2번항목이 비교적 잘 지켜졌다.

이렇게 라우팅이 100%가 된다고 끝나는 것은 아니다. Copper pour 라는 작업을 해주어 동판이 기판에 전반적으로 덮을 수 있도록 해준다. 이것은 양면기판으로 다층기판의 효과를 낼 수 있다.
필자의 경우는 앞면을 VCC, 뒷면을 GND로 Copper pour 작업을 해주었다.



녹색부분이 Copper pour 작업이 된 부분인데 라우팅의 문제로 Copper가 기판 곳곳으로 끝까지 들어가지 않았다. (빨강,검정부분이 들어가지 않은 부분)



마찬가지로 뒷면도 Copper pour 작업을 해준다. 역시 앞면처럼 라우팅의 문제로 Copper가 제대로 들어가지 않았다. (녹색, 검정부분이 들어가지 않은 부분임)

이렇게 해서 라우팅이 되면 Gerber File을 생성하여 PCB 생산 업체에 보내주면 PCB기판을 제작해준다.



완성된 PCB에 각종 부품을 조립한 모습이다.
(뒷면은 납땜질이 서툰관계로 차마 공개할수가 없었다.. -_-;;;)

누군가에 의해 검색된 이 자료가 많은 도움이 되길 바라며 이 포스팅으로 2008년의 모든 포스팅을 마친다.

DJ MAX Trilogy의 Gold와 Point를 에딧 해보자.

DJ MAX TR을 즐기다보니 포인트와 골드가 너무 부족하다는 사실을 절실히 깨닳게 되었다.

노래 하나 해금되는건 좋은데 사기 위해서 필요한 골드가 한곡당 5000골드..

보통 한곡을 깨면 500골드정도가 채워지니 대충 열판 정도를 해야 하나의 노래를 해금할 수 있다.

기어나 케릭터는 더욱 비싸고…

그래서 메모리 후킹을 통한 에디트를 시도해 보았다.

일단 해금곡, 최대 점수, 최대 콤보, 아이템 정보 등등은 USB Profile key에 저장이 다 되고

하드디스크에 인스톨되는것은 구동관련 부분(음악 등등)만 된다.

쉽게말하면 세이브 파일이 하드디스크에 저장되지 않기 때문에 헥스 에딧등은 불가능하다.

게다가 1.07버전부터는 (2008년 12월 26일 기준)에서는 메모리 후킹이 제대로 작동하지 않는다.

치트오메틱, 티서치, 치트엔진, 게임핵, 게임위저드 등등이 대표적인 프로그램인데..

1.07버전에서 시도해본 결과 제대로 된 값을 찾아내지 못한다.

그래서 어떻게 할까 고심하다가 약간의 꼼수를 써서 골드, 포인트 에딧에 성공하였다.

————————————————————————————————-

경고 :
1. 너무 심한 에딧은 게임의 재미를 급격히 저하시킬 수 있으므로
정도것 사용할 것.

2. 이 방법으로 에딧은 가능하지만 모든 문제에 대한것은 본인이
책임질 것.


준비물 : DJ MAX TR Install disc (초회,한정판 또는 일반판이되 1.00으로 제작된 시디), 메모리 후킹 프로그램 (위에서 설명한 대표적인 프로그램중 하나. 필자는 티서치를 사용하였다)

이제부터 본격적인 설명에 들어가겠다.

1. 제일 먼저 DJ MAX TR을 언인스톨 한다. (이건 기본적인 내용이므로 자세한 방법은 생략)

2. 랜선을 뽑던지 시작 -> 실행 -> cmd 치고 엔터 -> ipconfig /release 치고 엔터 를 쳐서 인터넷 접속을 차단.
※ 제보에 의하면 DJ MAX TR이 인스톨 된 디렉토리를 찾아가서 TR.exe 파일을 실행하면 업데이트가 진행되지 않는다고 하니 위 과정이 귀찮은 사람의 경우 이것을 참조.

3. 준비한 DJ MAX TR 시디를 인스톨
(이 때 USB Profile key의 드라이버가 같이 인스톨되니 왠만하면 포트에서 빼두자.)

4. 설치가 완료되면 티서치 실행하고난후 DJMAX TR을 실행하고 잠시 기다리면 아래와 같은 스샷을 볼 수 있다.



애초에 랜선을 뽑는것으로 인터넷을 차단한 이유가 강제 업데이트를 막기 위함이다.
(상위버전에선 메모리 후킹 불가)

5. Start를 누르고 게임을 시작한다.

6. 현재 골드와 포인트의 상태를 확인한다. (필자는 골드부터 에디트) 그다음 Alt + Tab 키를 눌러서 티서치로
전환 후에 확인한 값을 메모리에서 찾는다. (빨간 동그라미(?)를 참조할것)

※ 메모리 후킹 프로그램의 사용법은 숙지하고 있는 것으로 가정하고 설명하였음.



7. 전형적인 방법대로 목표 수치의 변환을 준다. (게임을 한판 한다던지..)
필자는 게임을 한판 한 후에 골드가 변한 것을 확인하고 next search를 이용하여 해당 메모리값을 찾았다.



메모리 값을 찾은 후 값을 바꿔주면 얘기는 끝난것이다.

8. 마찬가지로 포인트도 이런식으로 찾으면 된다.



이렇게 에딧후에 사고싶은걸 산다던지 그런건 맘대로 한다.
다른 컴퓨터에서 하거나 버전이 바뀌더라도 USB Profile key에 모든것이 저장되므로 걱정할 필요는 없음.

9. 이제 다시 랜선을 꼽던지 아니면 시작 -> 실행 -> cmd 치고 엔터 -> ipconfig /renew 치고 엔터키를
눌러 인터넷을 연결 한 후 DJ MAX TR을 실행하여 자동패치가 되기를 기다린다.



10. 패치가 된 후 정상적으로 USB Profile key에 모든것이 저장되었는지 확인하면 끝.



거듭 강조하지만 너무 심한 에딧은 자중하자.

Pro-Engineer를 이용한 NC Tool path 생성 및 시뮬레이션


학교에서 나눠준 과제로 모델링과 함께 금형, NC Tool path(공구경로) 생성까지 해오라는 지시를 받았다.

주어진 치수를 가지고 만든 모델은 다음과 같다.

뭐 그다지 어렵잖게 10분만에 후다닥 만들었는데, 이걸 가지고 Pro/Mold의 작업과 NC Tool Path의 작업을 하는것이 중요하다는것이다.

Pro/Mold로 작업할때 가장 중요한 점은 수축률을 주는것과 상판과 하판을 따는 일이다. 이것의 결과는 다음과 같다.

금형을 오픈한 상태로 찍은 스샷인데 상판의 모습이 잘 보이지 않아 상판과 하판의 모습을 개별적으로 다시 올린다.

상판의 모습. 원본 모델과 음각의 조화를 이룬다.

하판의 모습은 양각이긴 한데 좀 모양이 이쁘지 않게 나왔다. 라운드를 어설프게 줘서 그런건지
Shell 명령시 Thickness를 너무 두껍게 준건지.. 쩝.. 맘에 들지 않는다.

아무튼 이것으로 Pro/Mold를 이용한 금형제품을 만들어보았다.

NC Tool path 생성에서 가장 먼저 해야 할일은 참조 모델을 불러 온 후 (반드시 Fix 시켜야함), NC Model을 만드는 것이다.



이것은 마치 조각상으로 치면 깎이기 전 원석과 같은 형태라고 볼 수 있다.
녹색부분이 재료부분이며 그 속에 비치는 것이 완성된 형태이다.

관례상 Z축을 상판으로 하여 공구 기본좌표를 설정하여야 한다.



재료를 깎을 엔드밀의 종류와 공구길이, 직경을 지정해준다.



깎지 말아야 할 부분을 선택해주어야 한다. 자신이 원하는 형상의 모든 Surface를 선택해준다.



Play path를 이용하여 공구경로를 살펴보니 밝은 빨강색으로 가공이 안된 부위가 표시된다.
이런경우는 원하는 형상이 제대로 나오지 않기 때문에 NC Model에 수정을 가할 필요가 있다.



NC Model의 높이를 40mm에서 45mm로 수정하였다.



높이 변화 후 이제 가공이 제대로 되는것을 확인 할 수 있다.

NC Check기능을 이용하면 이렇게 설정한 공구 경로가 실제로 NC에서 어떻게 깎이는지 시뮬레이션이 된다.
동영상을 재생하면 엔드밀이 바쁘게 움직이면서 작업하는데 실제론 저렇게 빠르지 않다. -_-;;;
뭐 깎이는것은 재질에 따라 다르겠지만 금속의 경우는 절삭유까지 뿌려주면서 해야하기 때문에 더욱 오래 걸린다.

이러한 과정을 모두 거친 후 Post Processing을 해주면 NC Data Code가 나온다.
이걸 수동으로 디코딩해볼 생각을 하는것은 일찌감치 접는것이 좋다. -_-;;;

시간이 없어서 실제로 NC데이터를 입력해서 깎아보기까진 하지 못했는데 다음에 기회가 있으면
한번 돌려 봤으면 한다.

POPS사용 시 바이오해저드2,3 멈춤현상 해결하기

포스팅에 앞서 전하는 말씀
이 포스팅은 커스텀 펌웨어가 설치된 PSP를 응용하는법을 담고 있지만 소니의 관련 저작권에 관련된
일체의 파일이나 무력화 방법 또는 대행에 대한 내용을 담고 있지 않습니다.
PSP에서는 PS1게임을 약간의 변환과정을 거쳐서 구동을 할수 있는 메리트가 있다.

그런데 이것이 아주 완벽하게 구동되는것이 아니고, 또한 펌웨어 별로 다르게 구동된다.

내가 좋아하는 PS1 게임중에 바이오 해저드 2,3이 있는데 이것들은 둘다 문제가 조금씩 있다.

POPS(Playstation One Portable Station) 사용시 바이오 해저드2의 문제점은 경찰서에 도착한 후 메인 홀에서

프리징(Freezing) 현상이 일어나는것인데, 분명 소리는 나지만

화면은 꺼멓게 되어 더이상 작동은 불가능한 상태가 된다.

또한 POPS사용 시 바이오 해저드3에서는 두군데에서 프리징이 된다.

1. 시계탑으로 가기위한 전차를 작동시키기 위한 준비물 3가지(퓨즈, 합성오일, 전원 케이블)를 구하러 가는
도중에 Parking lot을 지난후 렌치를 사용하여 호스를 빼낸 후 목적지로 향하는 문을 여는순간 프리징

2. 카를로스 플레이 종료 후 질로 플레이시 시계탑 건물에서 공원과 병원의 갈림길 나오기 전의 문 (카를로스
플레이 전에는 무거운 종으로 막혀있는데 카를로스가 밀어 낸 후에는 갈 수 있게 됨)을 여는 순간 프리징

해결법
바이오 해저드2 : POPS변환시 GameID를 SLPS-01222로 바꾸면 해결. (이미 변환한 경우에는 GameID를 변환하는 프로그램을 여기 에서 받는다.)

바이오 해저드3 :
1번의 경우 : GameID를 SLPS-01222로 바꾼다. 또는 호스를 가지고 다시 Parking lot의 세이브 포인트를 가서 호스를 집어넣고 Parking lot -> 호스 얻은곳 -> 통로 -> 경찰서 갈림길 -> 세이브 포인트(여기서 호스를 다시 꺼냄) -> 호스 사용 으로 문제 해결
2번의 경우 : GameID를 SLPS-01222로 바꾸고 popsloader를 사용하여 3.52버전으로 구동하면 해결.

————————————————————————————————–

How to solve freezing on RE 2,3?

first of all, This posting is not included file about Sony’s copyright. Just Application 🙂

One of My favorite game is Resident Evil series, But it game had some problem.

Resident Evil2 have a problem. If you are arive at Police Station, you will be frozen the game.
when convert PS1 image to POPS, you must use gameID SLPS-01222, hence you can’t be freezing at Police Station.

Resident Evil3 have two problem. Use SLPS-01222 (BioHazard 2 Game ID) to avoid Clock Tower game freeze. To avoid game freeze after getting the firehose, instead of going directly to the alley, go back to the parking lot to deposit the hose in the chest. Now go directly to the alley (without the fire hose) and then there you withdraw the hose skipping the door where the game freezes.

PSP용 DOSBOX로 페르시아 왕자2를 돌려보았다.

포스팅에 앞서 전하는 말씀
이 포스팅은 커스텀 펌웨어가 설치된 PSP를 응용하는법을 담고 있지만 소니의 관련 저작권에 관련된
일체의 파일이나 무력화 방법 또는 대행에 대한 내용을 담고 있지 않습니다.
어릴때부터 무척이나 좋아하던 고전게임 페르시아 왕자(Prince of Persia)
최근에 PSP에 있는 홈브류중 dosbox를 사용하면 도스용 페르시아 왕자2를 돌릴수 있다는 소식을 들을 수 있었다.
그래서 몇번의 시행착오끝에 돌리는데 성공.

pspmini(http://pspmini.mud4u.com/)에서는 페르시아 왕자1에 관한 내용을 다루고 있으나
페르시아 왕자2에 대한 내용을 다루고 있지 않아서 설치법을 필자의 블로그에 설명하고자 한다.

준비물 :
커스텀 펌웨어가 설치된 PSP : 알아서 구할것
페르시아 왕자2 게임 파일 : 알아서 구할것
dosbox for psp : http://www.cgemulation.de/dosemus.html#sony%20psp257
dosbox용 설정파일 :

dosbox.conf

(클릭시 다운로드 가능)

smartdrv.exe :

smartdrv

(클릭시 다운로드 가능)

페르시아 왕자2 키 설정 배치파일 :

prince2.bat

(클릭시 다운로드 가능)

구동법 :

1. 폴더 두개를 만든다. 하나의 이름은 dosbox 나머지 하나의 이름은 dosgame으로 한다.



2. dosbox 폴더에 저기 위에 사이트에서 받은 파일과 설정파일(첨부파일), smartdrv.exe(첨부파일) 파일을 복사한다.



3. dosgame 폴더 안에 prince2 라는 폴더를 만든다.

4. prince2 폴더안에 페르시아 왕자2 게임 파일 및 키 설정 배치파일(첨부파일)을 복사한다.



5. 이부분이 가장 중요한 부분인데, 실행에 관한 중대한 영향을 미칠수 있다. 페르시아 왕자2 게임 파일 폴더 안에 있는 setup.exe 파일을 실행하여 다음과 같이 세팅한다.



설정을 Sound Blaster Pro로 하고 싶었으나 할 수 없었다.

그렇게 설정하고 실행을 하니 자꾸 NIS.dat 파일을 리소스로 사용할수 없다고 나오는데.
이유를 외쿡 사이트에서 찾게 되었다.

PoP2 stuck in “Sound Blaster” mode. I used the option “PC Speaker” for the audio. Game stuck after taking the boat loading the file “nis.dat”: this why the PSP Kernel can run maximum 9 files per time. Is impossible to fix this.

대충 설명하자면 “PSP 커널에서는 한번에 최대 9개의 파일까지만 실행이 가능하기 때문에 사운드 블라스터를 사용할 수 없고, 이것은 해결하는것이 불가능하다.” 라는 뜻이다.

그래서 눈물을 머금고 환상의 사운드(?)를 자랑하는 PC Speaker 모드를 사용하여야 PSP에서 원할하게 돌릴수 있다.

※수정내용.
다음의 사운드는 동작은 하나 음악이 좀 끊긴다.
Ad lib
Pro Audio Spectrum
IBM PS/1 (PC 스피커와 음질이 같음)
Tandy Sound (PC 스피커와 음질이 같음)
Roland MT-32  (PC 스피커와 음질이 같음)

6. 이제 기본적인 세팅은 다 끝났다. 이제 PSP를 usb에 연결한후 다음의 경로에 복사한다.
dosbox 폴더 : ms0:/psp/game/
dosgame 폴더 : ms:0/

(※ ms:0/는 메모리스틱 루트를 의미한다. 즉, 쉽게 설명하자면 내 컴퓨터에서 PSP에 물려있는 메모리 스틱이 이동식 디스크로 잡혀있을텐데 그곳을 더블클릭하면 바로 나오는 공간을 말함.)

7. 이제 설치는 끝났고, 돌려보세~

Conveyor Calculator for Windows



Conveyor 설계시 구동하기 위해서 Sprocket의 치수(齒數)를 결정해야하는데,
매번 계산기를 두들기는게 귀찮아서 만든 프로그램.

필수입력사항 부분에 간단히 필요한 숫자만 넣어주면 나머진 자동으로 계산해서 알려준다.

일반적으로는 계산하기 버튼만 누르면 맨 위에 있는 textbox에 결과값이 나오며
실제 속도를 보정하고 싶을때 Sprocket만 조정하여 주면 되므로
(다른 값을 바꾸려면 필수 입력사항 값을 변화 해주면 되며
이때 필수 입력 사항의 “Sprkt1 치수” 의 값은 무시 된다.)
Sprkt1,2의 값을 적절히 바꾸면 원하는 속도값을 얻을 수 있다.



계산 공식
컨베이어 속도  = Motor RPM / 감속비 * 3.14 * ØD1 * (Sprkt1 / Sprkt2)

convcal

(클릭하면 다운로드 받습니다.)

만약 vb6ko.dll을 찾을수 없다는 메시지가 나올 경우는 다음 파일을 c:windowssystem32에 복사한다.

vb6ko

(클릭하면 다운로드 받습니다.)

Ver 0.2 수정사항.

1. 속도보정계산시 필수입력사항의 스프라켓 치수에 영향을 받던 문제 해결.
2. 속도보정계산시 애러메시지가 없어서 강제종료 되던문제 해결.
3. 결과삭제버튼 추가.

버그문의는 댓글로..
이 프로그램은 제작자 허락없이 배포는 가능하나 출처를 남겨주시고 판매하는 것은 금합니다.

PSP로 무선인터넷을 사용해보자. ~_~

요즘 psp를 여러가지로 활용하는 맛이 들렸다.마침 우리학교에서는 무선인터넷이 사용가능해서 혹시나 모를 우리학교내의

psp를 가지고 있는 사람들 중 무선인터넷을 사용하고 싶은사람들을 위하여 간단한 설정법을 소개하고자 한다.



당연히 인터넷을 사용하려면 ID가 있어야한다. 우리학교내의 홈페이지중 “E-SNUT -> 모바일캠퍼스” 로 들어가서 학번과 종합정보시스템에 썼던 비밀번호를 입력하면 위 스샷처럼 아이디를 신청하는 페이지로 갈 수 있다.



대충 사용할 기관이라던가 학과, 비밀번호 등을 입력한 후 (참고로 우리학교의 무선인터넷 ID 사용기간은 최대 7일이다.) “신청”을 누른다.



다음과 같이 신청된 모습을 볼 수 있다. 일반 노트북 사용자는 여기서 끝마치고 cm을 사용하여도 되지만
psp에는 psp용 cm으로 로그인할수 있는 세션이 존재하지 않으므로 MAC Address를 이용한 인증을 하여야 한다.



MAC ID 신청을 눌러서 인증 타입을 꼭 MACID로 바꾼 후 MACID를 아래 스샷과 같이 찾아서 넣어준다.



먼저 PSP를 켠후에 시스템 설정을 들어간 후



버전 확인하는 곳을 살펴보면 MAC Address를 확인 할 수 있다. 여기서 :를 뺀 나머지 숫자,영어 조합을
위에 있던 MAC ID칸에 넣어주면 된다.

여기까지 했다면 일단 무선인터넷을 사용하기 위한 ID등록은 마친것이다.
다음으로는 당연히 AP가 설치된 건물로 들어가야한다.

우리학교의 경우는 아래 링크에 잘 나와있으니 참고하시라.
http://www.snut.ac.kr/snut_2005/nespot/bbs/ap_search.htm

AP가 설치되지 않은 건물은 당연히 인터넷을 사용할 수 없다.
시험삼아 어학원에서 수업을 들을때 켜보았지만 AP를 찾을 수 없었다.

아무튼 이제 PSP내에서 네트워크 접속을 만들어보면 된다.
그 전에 반드시 WLAN 버튼을 오른쪽으로 이동시켜 WLAN ON 상태가 되어야 한다.



위 스샷은 필자의 블로그의 RSS페이지이다. 인터넷 관련 서비스를 PSP에서 이용하려고 하면
결국은 아래와 같은 화면을 보게될것이다.



당연히 당장 “네트워크 접속”이 없으면 접속을 할수 없으니 ○ 키를 눌러서 새로 만든다.



○키를 누르면 PSP가 알아서 AP 신호를 잡기 시작한다.



강의실 안에서 찍은 스샷인데 신호 세기가 100%가 나온다. 아무튼 ○를 눌러서 결정을 하자.



뭐 별다른게 없으니 방향버튼(십자키) 중 →를 눌러서 넘어간다.



아까 신호 잡혔을때 봤다시피 보안설정은 “없음”으로 하여야한다.
오히려 유식한척 한다고 엉뚱한걸 선택하면 결과도 엉뚱하게 나오므로 주의.



뭐 마찬가지로 그냥 지나간다. 십자키중 →를 누르면 된다.



설정의 막바지에 이르렀다. ○ 키를 눌러서 저장을 하자.



이제 NESPOT 이라고 이름이 지어진 네트워크 접속을 통해서 인터넷에 접속할 수 있다.



접속하면 위와 같은 스샷이 나오고 인증은 아까 등록한 MAC ID를 통해서 가능하게 된다.



인터넷 브라우저를 통해서 필자의 블로그에 접속해보도록 하겠다.



뜨는데 좀 걸리니 인내심을 가지고 기다릴것…



표시하려는 페이지에 플래시 무비(flash movie)가 들어있던가 하면 저런 메시지가 뜰 수 있다.



아날로그 스틱을 통해서 마우스 포인터를 움직이면서 서핑을 하면 된다.

강의는 여기까지.
아무쪼록, 이 포스팅을 통해서 많은 이들이 편리하게 학교내에서 무료로 무선인터넷을 즐기길 바란다.

7-segment display 이용 가감산기 (4bit)

학교에서 디지털 공학이란 과목을 듣는다고 만든 삽질작품.8bit으로 하려다가 사다놓은 GAL이 하나 모잘라서 그냥 4bit으로…

wincupl 로 GAL을 굽기위해 7-segment로 진리표(Truth Table)을 만들어봤는데

그중에 A자리에 불이 들어가게 하는 진리표는 다음과 같다.

수       값

0000       1
0001       0
0010       1
0011       1
0100       0
0101       1
0110       1
0111       1
1000       1
1001       1
1010       1
1011       0
1100       1
1101       0
1110       1
1111       1

음… 이것을 Boolean Function으로 만드는데 축약식으로 만들때

1에 관한 식으로 만들어도 좋지만 0에 관한 식으로 만들어서 반전시키면 식이 적게 나온다.

아무튼 위 식을 카노맵으로 만들어서 축약시키면 된다.

손으로 무식하게 하는편도 좋지만 Karnaugh Minimizer를 쓰면 편하다.

축약 시킨 식과 원래 식과 같은지 비교하기 위해서 만든 프로그램.

// Equivalent Discriminator for Boolean Function by Xeriars

#include <stdio.h>
#include <stdlib.h>

int main () {

int a_,b_,i,fcount=0;
system(“cls”);
printf(”   Truth Tablenn”);
for(i=0;i<16;i++) {
int A=!!(i&8), B=!!(i&4), C=!!(i&2), D=!!(i&1);
a_ = (!A & !B & !C & !D) + (!A & !B & !C & D) + (!A & B & C & D) + (A & B & !C & !D);
b_ = (!A & !B & !C) + (B & (!A & C & D) + (A & !C & !D));
if (a_ != b_) { printf(“%X : t1 = %d, t2 = %d ——– Xn”, i,a_,b_); ++fcount; }
else { printf(“%X : t1 = %d, t2 = %dn”, i,a_,b_); }
}
if (fcount > 0) { printf(“nFalse Count : %d”, fcount); }
getch();
return 0;
}

a_랑 b_ 부분을 수정해서 컴파일해보면 알 수 있다.

아무튼 이런 과정을 거쳐서 wincupl에 맞는 언어(?)로 7-segment를 구현한것이다.

Name     7segment;
PartNo   g22v10;
Date     2007-05-18 ;
Revision 01;
Designer Xeriars;
Company  The X.D.C.;
Assembly 000;
Location In_the_Hell;
Device   g22v10;

/* *************** INPUT PINS *********************/
PIN 02 = A;
PIN 03 = B;
PIN 04 = C;
PIN 05 = D;

/* *************** OUTPUT PINS *********************/
PIN 17 = OUTA;
PIN 18 = OUTB;
PIN 19 = OUTC;
PIN 20 = OUTD;
PIN 21 = OUTE;
PIN 22 = OUTF;
PIN 23 = OUTG;

/* *************** EQUATIONS *********************/

!OUTA = (B & C) # (!A & C) # (A & !D) # (!B & !D) # (!A & B & D) # (A & !B & !C);
!OUTB = (!B & !D) # (!B & !C) # (!A & C & D) # (A & !C & D) # (!A & !C & !D);
!OUTC = (!C & D) # (!A & D) # (A & !B) # (!A & B) # (!B & !C);
!OUTD = (!A & C & !D) # (!B & C & D) # (B & !C & D) # (A & B & !D) # (!B & !C & !D);
!OUTE = (C & !D) # (A & C) # (A & B) # (!B & !D);
!OUTF = (A & C) # (A & !B) # (B & !D) # (!C & !D) # (!A & B & !C);
!OUTG = (A & C) # (!B & C) # (A & !B) # (B & !C & D) # (!A & B & !D);

이것을 복사해서 붙인후 .pld 파일로 저장하면 된다.

이제 회로를 꾸민다.

준비물은 7-segment (에노드 타입) 3개, GAL(22V10) 3개, Bread Board, 전선, Wire Striper(option), TTL 7483(전가산기), 330k 저항소자 21개정도,Deep Switch, Toggle Switch, 5V 전원 공급기 (없으면 만들어도 좋다.), Jumper (Option)

아래는 완성한 스샷. (토글이 없어서 수동으로..-_-;;)



덧셈. 7 + 7 = E(Decimal : 14)

뺄셈. F(Decimal : 15) – B(Decimal : 11) = 4

Flash를 안터트렸더니 화질이 구리게 나왔다.

흠.. 목요일날 시험보는데 그때까지 Counter 제작해오라네..-_-;;

언제 다 만든담…

[펌] 10000000까지의 소수 표와, 구하는 프로그램의 속도를 높여보자.

10000000까지의 소수는 직접 적어드릴수는 없습니다.

10000000까지의 소수의 개수는 정확하게  664579개입니다.

이 글에서는, 소수 구하는 프로그램 소스는 가르쳐 드리지 않습니다.

중간중간에 써드리는 소스 만으로도 충분히 짜맞추실수 있기 때문이죠.

소수 구하는 법을 아시는 분만 보시기 바랍니다.

C++ 배우시는 분들이라면 소수 구하기는 80% 이상 해보셨을 겁니다.

일반적으로, 100 정도밖에 안 구해 보셨을텐데요..

그렇기 때문에 속도 차가 별로 나지가 않죠.

하지만, 구하는 범위가 아주 넓어진다면 어떨까요??(이런.. 드라군 놀이가 생각나는걸..)

시간차가 많이 날겁니다.

죄송한 말씀이지만, C++를 처음 다루시는 분들이라면 정중히 뒤로 버튼을 누르라고 할께요.

소수 구하는 프로그램을 짤때의 실수 유형을 봅시다!

[1차원 배열을 사용해서 푸는 분들..]

배열을 사용하는 방법은 작은 수에서는 상관이 없지만,

10만이 넘어가는 경우에는 오류가 납니다.

배열을 쓰시면 안되고, Check라는 변수를 만드세요!

Check=0;

if(i%j==0) Check=1;

Check방을 0으로 초기화합니다. 그리고, i를 j로 나눕니다(꼭 i, j가 아니여도 됩니다.)

그리고, i를 j로 나눴을대 나머지가 0이라면 결국 나누어 떨어진다는 말이므로,

Check방을 1로 만듭니다. 그리고 그 아래부분에 이런 코드를 삽입해보죠.

if(Check==1) break;

한번이라도 나누어 떨어졌다면, 밖으로 튕겨 버리세요.

(계속 해봤자 소수가 아니기 때문에 시간 낭비입니다.)

그러면, 본격적으로 들어갑시다!

[나누는 수를 몇까지 해야 할까?]

일반적으로 소수는 에라토스테네스의 체 방법을 사용하죠.

하지만, 이 방법은 시간이 조금 오래 걸린다는 단점이 있습니다.

하지만, 가장 쉬운 방법이기도 하죠.

쉽고, 빠르게 하는 방법이 있을까요?

예! 있죠, 나누는 수의 범위를 바꿉시다.

다음 코드를 볼까요?

for(i=2;i<=10000000;i++){
check=0;
for(j=2;j<=i;j++){

check방은 아까 설명 드렸을 겁니다. 초기화 시키는 것이죠.

다중 for문을 사용했는데요, i 나누기 j 를 해서 값을 구할 것입니다.

초보자 분들이시라면 저렇게 짜셨을 겁니다.

그러면, for(j) 부분을 살펴 봅시다~!

그 부분이 나누는 수 부분이 되겠지요.

소수를 판별하려면 어디까지 다 나눠보아야 할까요?

5라는 수가 있습니다. 일반적으로, 이 수가 소수인지 아닌지 판별하려면

2부터 4까지 모두 나눠보게 되죠.

(자기 자신과 1은 나누어 떨어지기 때문에 생략해야 합니다.)

5÷2, 5÷3, 5÷4    <= 3번 계산을 하게 됩니다.

물론, 3번 정도야 0.01초도 안걸리지만, 숫자가 무지하게 커진다면 어떨까요?

저같은 경우는 1000만까지의 소수를 구해보려고 합니다.

1000만개를 모두 나눠 보아야 할텐데, 언제 다 하겠습니까..

그래서, 더 효과적인 방법을 찾아보자는 겁니다.

1. for(j=2;j<=i/2;j++)

이 방법은 아까 전보다는 시간을 2배 절약할 수 있습니다.

이 방법도 정답이 틀리지는 않죠.

왜냐하면, 어떤 수의 2분의 1보다  약수는 1개밖에(자기 자신) 없기 때문이죠.

어떤 수의 2분의 1보다 큰 약수가 2개라면

1개는 자기 자신이고, 나머지 1개는 어떤수의 2분의 1보다는 큰수.

0

정도로 식이 만들어지겠네요.

j 의 값들 중에서, 자연수는 존재하지가 않기 때문에, 이렇게 해도 된다는 것입니다.

하지만, 이것보다 효과적인 방법이 있을까요?

예! 있습니다!

바로, 그 수의 제곱근 까지만 구해보면 됩니다.

이것은 제가 직접 증명은 못해드리지만, 적당히 해보시면 답이 똑같다는 것을 알수 있습니다.

제곱근은  대략 √  요녀석을 말합니다.

제곱근 함수를 쓰시려면, #include 로 하나를 더 불러와야 하는데요,

math.h  를 불러와야 합니다.

#include[math.h] 처럼요.

[는 <로 바꿔주셔야 하는거 아시죠?

sqrt(a)

라고 쓰시면, a 의 제곱근이 구해집니다.

그러면, 이렇게 변신하겠죠.

for(j=2;j<=sqrt(i);j++){

그러면 얼마나 속도가 향상될까요?

제가 위의 세방법의 시간을 모두 재봤습니다.

1번째 방법 : 측정 불가 (1시간 이상)

2번째 방법 : 27분

3번째 방법 : 1분 24초 -_-;;

엄청난 차이가 있습니다.

프로그래밍을 잘하려면 수학적 능력도 필요하다는 것을 절실히 느끼게 해주는 문제이네요.