invalid-file

파일 다운로드



흐.. 이런... libfat의 버그를 찾다 찾다 결국 그냥 포기...
(사실 귀찮아서 소스 보기를 포기... ㅡ_ㅡ )

버그를 우회하는 식으로 해결했다.
이놈이 글쎄.. fopen으로 r+ 옵션으로 열어서 파일 끝에서 데이터를 추가하면...
이상하게 변한다.... ㅡ_ㅡa.. 캐쉬 정책이랑 실제 flash write하는 기능이
제대로 동작하지 않는거 같기도 하고.... ㅜ_ㅜ...

그래서 파일 끝에서 추가할때는 a+ 옵션을 줘서 일부러 클러스터를 다 따라가게
만들고, 추가없이 파일을 수정만때는 r+ 옵션으로 열어서 바꾸도록 했다.

이렇게 하니 별 이상없이 동작하는구나... ㅜ_ㅜ...

크윽.. 젠장... 나중에 삼성과제 끝나고 나면 그걸 그대로 올려야 겠다.
역시... 내손으로 만드는게 좀더 믿음직 하네...

사용자 삽입 이미지
아우... 메모장 하나 만드는데 왜이렇게 오래 걸리는지... ㅡ_ㅡ;;;

메모장 하나 만들려고 윈도우 구조 다 세우고 Window base Class 만들고 CDC 만들고...
아주 난리다... ㅡ_ㅡa...

왜 이짓을 하는지 의문이긴한데... 어느정도 대충 가다는 나왔다는 ㅎㅎㅎ
이제 조금만 더하면 그림판 같은걸 만들 수 있겠다.

앗싸~ >ㅁ<)/~
libfat를 받아서 내 의사용 microSD io 코드를 추가한 다음
약간의 수정을 거쳐 만든 library 및 소스

테스트 결과....

이상없음~!!!

이로서 파일/폴더 관리 및 생성이 가능해졌다...

정말 대단하군.. @0@)/~

ZOrder 및 Window Frame을 구현한 간단한 윈도우 시스템을 구현했다.
정말 아주 간단한... ㅡ_ㅡa.. 그냥 윈도우 그리고 이동시켰을 때 처리 정도만
해놓은 버전...

나름대로 잘 동작해서 흐믓하다.
일단 윈도우 API와 비슷하게 구현했다.

그럭저럭 만족~ ㅎㅎ

사용자 삽입 이미지
Interrupt, Touch Screen, Button을 이용해서 간단한 메모장을 만들었다.

크으... 뭐 쉽진 않았지만... 기본적인 부분들은 어느정도 Library에서
구현 되어있었기때문에, 스펙을 보면서 구현하다가 잘 안되면 소스 뒤져서 확인하는 방식으로
진행했다.

여튼 나름 괜찮게 된다는거 ㅋㅋ
MicroSD 접근용 IO Interface 소스

출처 : http://chishm.drunkencoders.com/libfat/

libfat

A FAT library for the Nintendo GBA and DS

This is the successor to GBA NDS FAT. It features better reentrancy support, cleaner source code and is built as a proper library.

Installation

libfat is packaged as part of DevkitPro. Download the DevkitPro Updater and run it to start the installation. You will need to install as a minimum DevkitARM r20, libnds and libfat. I also suggest you install the GBA and NDS examples.

Using libfat in a project

The following assumes that you are using one of the example NDS templates.

The first step is adding libfat to the list of libraries. In the ARM9 Makefile (or the top level one if there is no specific ARM9 Makefile), look for the list of libraries. It should look like:

LIBS	:= -lnds9

Change this to:

LIBS	:= -lfat -lnds9

The order is important! Make sure that -lfat comes before -lnds9. The include directory will already be set, so you don't need to worry about this.

Next, you'll need to include fat.h in your main source file. Near the top of the file, insert the line:

#include <fat.h>

Before you can use any file functions, you'll need to initialise the library. You should only do this once within the execution of the program. Somewhere within the program's startup code, insert the line:

fatInitDefault();

This will initialise libfat and set the number of cached sectors to the default (8 on the DS, 2 on the GBA). It will also set libfat as the default stdio file device. If you prefer to use your own settings, use the line:

fatInit(cache_size, set_as_default);

In this case, cache_size is the number of sectors to store in the cache at any one time and if set_as_default is true it then libfat will be the default stdio file device.

Both fatInit and fatInitDefault return true if the library was successfully initialised and false otherwise.

That is all that's needed to get libfat running within your project.

Using files

Through the magic of DevkitARM and libfat, files can be openned like on any other POSIX system. Most of the functions in the stdio.h header should work. You do not need to worry about the cache. It will be taken care of, as long as you remember to close any open files before turning off the power.

Paths are separated by a forward slash -- / . Directories are specified by their path. The directory itself can be refered to as . and the parent as ... The root directory is simply / or /..

When libfat is not the default stdio device, you will need to refer to files and directories with a device specifier. This is done by using fat: before a path. You can also use a single digit in the device specifier, such as fat0: or fat1:. It is possible to use both slots at once on a DS. This is done by specifying the slot with a number. The full list of device specifiers is:

  • fat: -- the default device
  • fat0: -- same as fat:
  • fat1: -- the device in Slot-1 of the DS
  • fat2: -- the device in Slot-2 of the DS
  • fat3: -- a custom mounted device

To open a file called graphics.bin for reading within a directory called app_data located on the card in Slot-2, you would use:

FILE* test = fopen ("fat2:/app_data/graphics.bin", "rb");

If libfat is set as default, and you don't mind which slot the card is in, you could use:

FILE* test = fopen ("/app_data/graphics.bin", "rb");

If you are already in app_data (after a chdir("/app_data"), for example), you could use:

FILE* test = fopen ("graphics.bin", "rb");

Using directories

Directory functions do not follow POSIX standards. Custom functions are used for various reasons.

To add directory support to a project, you'll need to include <sys/dir.h>


To open a directory, use:

DIR_ITER* dp = diropen ("/directory/path/");

diropen returns NULL and sets errno on failure.


To iterate through a directory, use:

dirnext (dp, filename, &filestat);

dp is a previously openned directory, filename will be filled with the filename of the next file or directory, and filestat will be filled with the file's stats. If filestat is NULL, it won't be filled.

To start at the begining of a directory again, use:

dirreset (dp);

To close a directory, use:

dirclose (dp);

dirnext, dirreset, and dirclose all return 0 on success. If they fail for any reason, they will return -1 and set errno. dirnext will set errno to ENOENT if there are no file or directory names left in the directory.


The directory functions mkdir and chdir work as normal.

A quick file listing demo:

struct stat st;char filename[256]; // to hold a full filename and string terminator
DIR_ITER* dir;dir = diropen ("/");
if (dir == NULL) {
iprintf ("Unable to open the directory.\n");
}
else {
while (dirnext(dir, filename, &st) == 0) { // st.st_mode & S_IFDIR indicates a directory
iprintf ("%s: %s\n", (st.st_mode & S_IFDIR ? " DIR" : "FILE"),
filename);
}
}
허허... 이거 나원참....

ARM7쪽만 Touch Screen 쪽에 접근할 수 있어서 어찌 할까 고민중이었는데....
이런 대박이... ㅡ_ㅡa... libnds에서 이미 다 제공해 주는...

ARM7쪽 더미 코드를 둬서 이미 ARM9 쪽으로 IPC를 사용해서 넘기도록 되어있었다.
으으.... 그럼 일단 이건 그냥 쓰도록 하고...

ARM9쪽 코드를 우선적으로 libnds에 의존하지 않는 방향으로 수정하는게 나을듯도...
일단 그래 하던동...
반나절 삘삘 노력해서 겨우 16x16을 출력하도록 수정했다. ㅎㅎ

자모 다 넣고 완성형 한글을 넣어서 이제 잘나온다.
>ㅁ<)/~ 잇힝~ 좋구나아~

사용자 삽입 이미지
대단한걸.. @0@)/~

이거 완전 거의 Application을 짤 수 있도록 만들어놨네...

정말 대단.. @0@)/~
가에서 부터 힝까지만 있는 거였군....

계산하는 알고리즘이 0xb0a1을 0으로 하는 base를 사용하더라... ㅠ_ㅠ..

그럼 자음에 대한 폰트는 내가 만들어서 써줘야 하는건가?? ㅡ_ㅡa...

크윽... 뭔가 일이 커지는 듯한... 폰트 생성 툴이라도 만들던지 해야지 원....

앗싸~ 한글/영문 출력~~!!

아직 약간 좀 이상하긴 하지만 되긴 된다...

한 비트 때문에 삽질을 오만상 하긴 했지만.. ㅡ_ㅡa...

뭐 되긴 된다는거 ㅋㅋ


사용자 삽입 이미지

사이트를 돌다가 여기저기 들러서 스펙이랑
메모리 구조랑 보면서 이것 저것 했다...

개발에 대한 준비랄까...
뭐 일단 메모리 구조와 코어는 필수니까 열심히 보고 있는데...

보면 볼 수 록 괜찮다는 생각이 든다...
괜찮은 개발 Library도 있고... ㅜ_ㅜ

왠지 할일이 확~ 줄어든 듯 하기는 하지만...
기분은 참 좋은... ㅎㅎ

당분간 심심하지는 않겠구만 ㅋㅋ
으으.. 오늘 또 실컷 코딩하고 Commit을 날렸는데, 얼래.. up-to-date에러가 난다. 당체 먼지.. ㅡ_ㅡ;;; 분명 내 Sandbox에 있는 놈은 최신판이고 소스는 나밖에 안건드리는데.. ㅡ_ㅡ;;

물론 소스를 Commit하기전에 백업했기땜시롱 크게 문제는 없는데, 자꾸 에라가 나는걸 보면 먼가 문제가 확실히 있는거 같다.

쩝쩝... 이를 어쩌징...아무래도 CVS 클라이언트가 버그가 있는거 같기도 하고, 내 사용법이 문제가 있는거 같기도 한데, 조심해서 쓰도록 해야겠다.

낼 가서 또 삽질을 해야겠군. 제길... ㅡ0ㅠ/~


ps) 흐흐 나중에 알고 봤더니 Sandbox의 파일들을 일정시간 이상 Update하지 않으면 나타나는 경고(?)같은 현상이었음.. ㅋㅋ

요즘 회사일때문에 한참 폭발코딩중이다. 그중에 하나가 스크립트 파일을 읽어서 조건에 맞는 어떤일을 해주는 스크립트 프로그램인데, 이게 아주 예술(??)이다.

학교를 얼마 다니지 못하고 일하러 끌려온(??) 나로서 오토마타니 컴파일러니.. 이런 것들에 대한 지식이 있을리 만무하다. ㅡ0ㅡ/~~ 그나마 예전에 x86 Assembler를 만든다고 책을 좀 봐놓은게 있어서 구현하는데 무리를 느끼는건 아니지만, 그래도 체
계적인 지식이 부족하다고 생각한다. (학교로 돌아가면 공부를 열심히 해야 겠군..)

그동안 회사에서 한 일들이 그렇게 복잡도를 요구하는것이 아니어서 시간에 쪼달릴 뿐 머리를 그렇게 많이 쓰게 만드는건 없었건만, 이건.. 아까 언급했듯.. 아주 예술이다.

내가 원체 프로그램 기능 추가하고 머하고 하는걸 싫어하기 때문에, 이번 프로젝트는 추가적인 기능을 하는 놈을 아예 스크립트로 빼버려서 텍스트만 밀어넣고 데이터만 몇개 주면 조건에 맞추어 추가적인 기능을 하는 놈을 실행해 버리는.. 그런 대찬 프로젝트를 계획했다.

한 3일해서 아래의 if/else if/else문을 약간의 문제를 남기로 처리하는데까지 구현을 했는데, 역시 머리가 윽시로 아프다. ㅡ0ㅠ/~~


 

if( ( ( NODEID == 1001 ) || ( NODEID == 1002 ) ) &amp;&amp; ( GROUPID == 1000 ) )
{
 if( ( NODEID == 1000 ) || ( GROUPID != 1000 ) )
 {
  if( NODEID == 1001 )
  {
   exec 1.exe;
  }
  else
  {
   exec 2.exe;
  }
  exec a.exe;
 }
 else if( GROUPID == 1000 )
 {
  exec b.exe;
 }
}
else if( ( GROUPID != 1000 ) &amp;&amp; ( ( NODEID &gt; 2000 ) &amp;&amp; ( NODEID &lt; 2002 ) )
{
 exec c.exe;
}
else if( GROUPID != 1000 )
{
 exec d.exe;
}
else
{
 exec e.exe;
}

exec f.exe;
kill PROCESSID;



음.. 적고나니 실제로 이것보다는 약간 더 복잡했던듯.. ㅡ_ㅡ;;;
사실 예전부터 이런걸 한번 해보고 싶었는데, 이번에 새로 프로젝트를 진행하게되어 한번 해볼 수 있었다.

역시나 복잡하군.. ㅡ_ㅡ;;;
조 30줄도 안되는걸 처리할라고 내가 아는 모든 지식은 총동원되고, 아아 빡심...
나의 내공은 아직도 멀었나 보다.

쩝쩝.. 좀 한가해지면 x86Assembly나 빨리 완성해야 겠다.
그람 먼가 내공이 좀 올라가겠지. ㅋㅋㅋ

얼마전부터 사용하기 시작한 CVS인데, 처음에는 약간 회의적인 생각도 들었지만, 쪼금더 생각해 보니, CVS가 있으므로해서 얻는 이득이 귀찮은거 보다 더 큰거 같아서 한참 익숙해 질려고 노력하고 있다.

머니머니해도 젤 좋은점은 그 골치아픈 버전관리에 크게 신경을 쓸일이 없다는 것인데, 이건 정말 큰 매력인거 같다.

안그래도 요즘 여기저기 사이트가 늘어서 소스관리에 정신이 없는데, 정말 적절한시기가 아닐까 싶다. 무엇보다 서버가 외부망에 있으니, 어디서든 인터넷만 되면 바로 다운받거나 업하거나 할 수 있다.

음.. 대단 대단 @0@/~~
 안녕하십니까 까마굽니다 (__)
 으으.. 오늘 Machine Code Generator를 만들다가, OpCode까지는 어케 선택을 해줬는데, Mod 및 SIB를 선택하지 못하여 하루종일 보냈슴다. 이제야 필을 받아서 일단 mov reg, reg 형식을 대략 완성하고 output을 냈는데요,다행이도 nasm이랑 output이 같게 나오는걸 보니, 테이블을 틀리게 만든건 아닌거같군요.

 흠, 아직 테이블을 좀더 만들고 테스트해야 하는게 있긴하지만 머, 일단 첫발을내딛었기땜시롱 한자 끄적여 봅니다. 처음에는 모든 경우의 수를 생각하고 Scanner랑 Parser를 만들었는데요, 오늘 딱생각하니 빼먹은것이 있군요.

 으으, 다 포함하려니 소스가 자꾸 복잡해져서리 일단간단하게 완성하고 덧붙이던가 해야 되겠군요.에궁, 징짜 너무 빡시네요.

 그럼 좋은하루 되세요 (__)아래는 테스트 결과
/////////////////////////////////////////////////////////////////////////////
//input file
/////////////////////////////////////////////////////////////////////////////
mov ebx, eax
mov ebx, ecx
mov ebx, edx
mov ebx, esi
mov ebx, edi
mov ecx, eax
mov ecx, ebx
mov ecx, ecx
mov ecx, edx
mov ecx, esi
mov ecx, edi
mov edx, eax
mov edx, ebx
mov edx, ecx
mov edx, edx
mov edx, esi
mov edx, edi
mov esi, eax
mov esi, ebx
mov esi, ecx
mov esi, edx
mov esi, esi
mov esi, edi
mov edi, eax
mov edi, ebx
mov edi, ecx
mov edi, edx
mov edi, esi
mov edi, edi

//////////////////////////////////////////////////////////////////////////////
// 아래는 Kkamagui Simple Asambler Output
//////////////////////////////////////////////////////////////////////////////
Output[89C3]
Output[89CB]
Output[89D3]
Output[89F3]
Output[89FB]
Output[89C1]
Output[89D9]
Output[89C9]
Output[89D1]
Output[89F1]
Output[89F9]
Output[89C2]
Output[89DA]
Output[89CA]
Output[89D2]
Output[89F2]
Output[89FA]
Output[89C6]
Output[89DE]
Output[89CE]
Output[89D6]
Output[89F6]
Output[89FE]
Output[89C7]
Output[89DF]
Output[89CF]
Output[89D7]
Output[89F7]
Output[89FF]

 안녕하십니까 까마굽니다 (__)
 넹 커널을 릴리즈한지 며칠이 지났는데요, 다행이도 "왜 일케 짯어요??" "정신이 있는 사람이에요??" 이런식의 글이 올라오지 않아서 긴장을 풀고 있습니다. ㅋㅋㅋ사실 잔뜩 요 며칠 쫄아있었기 땜시롱, 워낙 허접한 코드를 릴리즈해놔서 이것 또한걱정이군요.

 ㅡ0ㅡ;;;흠, 당분간 커널 소스는 손을 안대고, 다른걸 쪼금씩 해볼 생각을 하고 있습니다.머, 다음에 손보게 되면, FAT를 좀더 보강하고, 스레드를 구현해 넣고 GUI 함수약간 더 추가하는 정도가 될것 같군요.스레드와 GUI 함수에 대해서는 아직 뚜렷한 방향이 잡히지 않아서 약간 시간이 걸리겠구요, FAT 루틴은 사실 약간 보강이 된 상태인데 추가해야 할 부분이 생겨서그부분에 대한 처리를 미뤄둔 상태입니다.

 음, 글고보니 응용 프로그램용 라이브러리와 응용프로그램 전송하는 방법에 대한언급이 없었네요. 이것도 시간나는대로 릴리즈를... ㅋㅋㅋ아아, 눈탱이가 아프군요... 갑자기 왜이러지...그만 자야겠습니다.

 다들 좋은밤 되세요 (__)

 안녕하십니까 까마굽니다 (__)
 오늘 한번 어셈블러를 끄적거려 볼려고 했었습니다만, 쇼크만 먹었습니다.흠, 전 지금까지 Opcode는 각 명령에 대해서 1:1로 대응되는줄 알고있었기때문에,쉽게 보고 있었는데, 오늘 문서를 보니 같은 mov라도 뒤의 Operand에 따라서 Opcode가 틀리더군요.

 또 뒤에 오는 Operand 타입에 따라서 옵션으로 설정되는 것들이 있고, 으아~~ 어찌나 복잡하던지...하는수 없이, 책을 일단 쬐금 복사한다음 nasm을 이용해서 역어셈해가면서 봤습니다.규칙이 있긴하던데, 머 관건은 머신코드를 작성할때 적절한 Opcode를 선택하기위해서는 Operand의 Type을 알고있어야 한다는 결론에 봉착한것 말고는 별 소득이 없네요.테이블도 몇개를 이용해야 될꺼 같고, 으음 일단 mov 명령을 잘 뜯어본다음 nasm과동일한 output이 나오도록 한번 해봐야 겠습니다.

 그러려고하니 문제가, scanner를 만들어야 하겠는데 머 만드는거야 별 문제가 없지만 중요한건 scanner의 output을 parser가 가지고가서 문법 체크를 하고, 다시 이걸넘겨받아서 머신코드를 만드는 놈이 output을 만들어 내야 하는데, scanner의 output을 어떤식으로 할지가 문제군요.머 일단 Token단위로 자른다 치면, scanner의 output으로는 Token별 String도 있어야 할터인데 어떤식으로 할지 걱정이군요.걍 Queue에 넣어버릴까나, 쩝쩝... 암생각하지말고 String의 크기만큼 동적할당해서걍 스트링 복사한다음 Queue에 넣는 무식한 방법도 생각하고 있습니다.

 오홀홀홀.. 혹시 머 좋은 생각 있으신분 계신가요??있으시면 답글좀...
 그럼 좋은하루 되세요 (__)

 안녕하십니까 까마굽니다 (__)
 요즘 계속 소스를 정리한다고 거의 기능 추가부분은 손을 안대고 있습니다.그래도 계속 무리를 좀 했더니 대충은 끝나 가는군요.사실, 세부적인 정리는 안했고 그냥 인덴트랑 주석을 좀 정리하고, 가장 중요한디버깅 코드들을 삭제하는데 중점을 두었습니다.

 머 사실 몇몇 파일들은 한참 개발중이기 때문에 정리자체가 무의미 하다고 생각되어 무시한것도 있습니다만, 여튼 끝이 보입니다.이제 파일도 몇개 안남았는데( 사실 무쟈게 많더군요... ㅡ0ㅠ.. 죽는줄 알았음 또 소스는 얼마나 긴지.. 꼭 공부 못하는 애들이 코드가 길듯.. ), 정리 되고 나면커널 소스를 올리겠습니다.

 그럼 좋은하루 되세요 (__)
 ps) 홧팅입니다 @0@/~~

 안녕하십니까 까마굽니다 (__)
 크윽, 소스를 밤낮 할꺼 없이 좀 무리해서 정리를 했더니만, 동작이 이상하군요.ㅡ0ㅠ 분명 정리하다가 멀 같이 지워버린거 같습니다.

 크윽 젠장, 두군데나 벌써 이상이 생겼는데요, 막막하군요. 정리를 마저하고 디버깅을 해야 할지, 아니면 일단 지금 해결하고 다시 정리를 시작해야 할지...한가지 분명한건, 잘못 정리했다는 것이죠.

 ㅡ0ㅠ.. 아아, 젠장 젠장...소스는 정신이 말짱할때만 봐야 겠네요.
 그럼 좋은하루 되세요 (__)
 
 ps) 요즘 질답란의 폭주로 인해 상당히 뿌듯하다는...모두들 홧팅입니다. @0@/~

+ Recent posts