파일 시스템이란 운영제제가 파일을 시스템의 디스크상에 구성하는 방식을 말한다. 운영체제는 시스템의 디스크 파티션상에 파일들을 연속적이고 일정한 규칙을 가지고 저장하는데 파일 시스템은 이러한 규칙들의 방식을 제시하는 역할을 한다. 또한 파일 시스템은 시스템 디스크나 파티션 그라고 파일 시스템의 형식을 말할 경우에도 쓰일 수 있다. 파티션과 파일 시스템은 다른 것이다. 파일 시스템은 파티션을 구성해 주는 역할을 한다. 파일 시스템을 포함하지 못한 파티션은 파일 시스템을 사용될 수 있도록 초기화되고 파일 정보를 기록하기 위한 형식을 만들어야 한다. 이 과정을 거쳐야 파티션은 파일 시스템으로 사용될 수 있다. 1.1) 파일 시스템의 구조◎ 슈퍼블록(super block)슈퍼블록(Super Block)은 파일 시스템에 의존하는 정보를 가지며 파일 시스템의 크기 등과 같은 파일 시스템의 전체 적인 정보를 가지고 있다.◎ 아이노드(inode) 파일이나 디렉토리는 그에 해당하는 하나의 inode를 가지고 있으며, 이 inode는 그 파일에 대한 모든 정보를 가지고 있으며, 한 inode는 64byte로 이루어진다. 또한 이 inode를 가지고 있는 표를 시스템 inode표(inode-table)라고 한다. 어떤 한 파일이나 디렉토리가 생성되면 하나의 inode가 만들어지고 그 inode가 inode-table에 등록되며, 등록되는 entry-number를 그 inode에 대한 inumber라 한다. ◦ inode : 한 파일이나 디렉토리의 모든 정보를 갖고 있는 64byte로 구성된 표◦ inode-table : 한 파일시스템에서 파일이나 디렉토리들의 inode를 갖고 있는 표 ◦ imunber : inode가 inode-table에 등록되는 entry number
< The Black Snake Bite >1. 게임 설명이 게임은 Snake를 오랫동안 살아남게 하여 높은 점수를 올리는 것이 목적이다. Snake 머리가 사용자 공간의 벽에 닿거나 자신의 몸통에 부딪히면 게임은 종료된다. 일정 시간이 지남에 따라 Snake 이동의 속도는 단계별로 빨라져 게임의 난이도가 높아지게 되고 기본 아이템과 특수 아이템을 두어 Snake의 몸통 길이와 이동 속도에 변화를 주어 게임의 다양성에 초점을 맞추어서 설계하였다.2. 요구 사항 분석1) 화면 구성(1) 사용자 공간은 과 같이 16×16의 정사각형으로 이루어져 있다.- 점선은 실제 보이지 않는 선임- 1개의 정사각형은 18×18(PIXEL)로 이루어져 있다.(2) 사용자 공간의 사각형 안에는 1마리의 Snake가 위치한다.- Snake : 시작위치는 정중앙(좌측에서 8, 위에서 7 번째 자리)에서 위쪽으로 전진하는 것으로 하며 그 위치는 항상 같다. 파란 색 사각형이 Snake 머리에 해당하고 나머지 부 분은 몸통으로 표현한다. 몸통은 분홍색으로 표시한다. 방향키로 뱀의 이동방향을 바꿀 수 있음. 시간에 따라 한 칸씩 Snake가 계속 앞으로 전진(시간은 100분의 1초로 나누어 레벨에 따라 0.20초, 0.15초, 0.10초, 0.05초의 간격을 두고 움직인다.)(3) 시작 시에 3개의 아이템이 위치한다.- 위치는 Random하게 지정, 단 시작 시에 아이템이 Snake의 출발지점에 위치하는 것은 피하도록 한다.(뱀 머리부분 근처에는 아이템은 바로 발생하지 않게 한다.)(4) 화면 하단에 진행 중인 시간을 분:초 ([예] 01:58) 로 나타나며 4 단계 속도 측정계를 Display 한다.- 시간은 흰색으로 표시한다. 60초 단위로 분으로 넘어간다. 시간은 10진수로 표시한다.(5) 우측상단에는 Snake의 생명 게이지를 나타낸다.- 생명 게이지는 총 3칸이며 노란색으로 한다. 게이지가 남아 있지 않게 될 경우 게임을 종료 시킨다. 즉, 생명게이지가 하나도 표시되어있지 않을 때를 확인한다.만약 키보다 값이 있다면 위, 아래, 좌, 우, ESC값만을 확인하여 넘어가는데 변수하나를 더 두어 그곳에 잠시 저장하여 이전 움직임과 비교를 한다. 만약 이전 움직임과 비교하였을 시에 이전 움직임이 위, 아래였을 시 좌, 우 값만을 받아들이고, 이전움직임이 좌, 우였을 시에 위, 아래 값만을 받아들인다.비교가 다 끝났을 시 이전움직임 변수에 현재 움직임을 저장시켜 이전 움직임에 따라 스네이크가 움직이도록 조작한다. 만약 ESC값이 입력이 되었다면 라이프 값을 모두 지워 게임의 끝을 알려 게임을 종료하도록 한다. 움직임은 머리부분의 위치는 몸통으로 몸통의 위치는 꼬리로, 꼬리의 위치는 지우개의 위치로 변화화면서 스네이크를 움직인다. 즉, 다음과 같이 움직임을 표시해 줄 수 있다.UP:CMPBH,UP_ARROW;윗쪽방향키인가?JNEDOWN;아니면 아랫쪽방향키로...CALLITEM_EFFECT;아이템 상태를 점검한다.MOVCX,SNAKE_TAIL_XMOVSNAKE_CLEAR_X,CX;스네이크 꼬리의 잔상을 지운다.MOVCX,SNAKE_TAIL_YMOVSNAKE_CLEAR_Y,CX;스네이크 꼬리의 잔상을 지운다.MOVZXBX,STATE_TAIL;아이템 상태에 따른 움직임 상태UP01:MOVCX,LENGTH_X[BX]MOVSNAKE_TAIL_X,CX;꼬리부분을 몸통부분으로 옮긴다.MOVCX,LENGTH_Y[BX]MOVSNAKE_TAIL_Y,CX;꼬리부분을 몸통부분으로 옮긴다.MOVCX,SNAKE_HEAD_XMOVSNAKE_BODY_X,CX;몸통부분을 머리부분으로 옮긴다.MOVCX,SNAKE_HEAD_YMOVSNAKE_BODY_Y,CX;몸통부분을 머리부분으로 옮긴다.SUBSNAKE_HEAD_Y,18;머리부분을 위쪽으로 옮긴다.JMPDELAY;스네이크 속도를 확인한다.우선 입력키 값을 BH에 넣은 후 그 값이 위쪽이냐 아래쪽이냐, 좌측이냐, 우측이냐를 판별 후 스네이크를 이동 시켜주면 된다. 중간에 아이템에 따라 스네이크의 움직임이 다소 변할 수 있으므로 아를 눌렀느냐??JNE GMOVER02MOV GMOVER_CHECK,03 ;그렇다면 체크3를 한다.또한 게임오버에 대한 체크를 두어 메인 프로시저에서 게임을 다시 시작할지 안할지를 확인하게 한다. 예로, 체크 2는 다시 시작한다는 표시이며 체크 3는 게임을 완전히 종료한다는 의미로 전달한다.예예아니요아니요GMOVER모듈 시작GAME OVER란 글자DISPAYESC를 눌렀나?GMOVER모듈 종료TO START THE GAME TO PRESS SPACE BAR점수와 보너스를 초기화SPACE BAR를 눌렀나?GMOVER_CHECK를 2로 설정GMOVER_CHECK를 3로설정< GMOVER 순서도 >21) PRINT_SEC, 22) PRINT_MINPRINT_SEC PROC와 PRINT_MIN PROC는 GAME이 진행된 시간(초,분)을 출력하는 프로시저이다. 시간을 출력하기 위해서는 INT 10H 기능 2CH와 기능 2DH를 이용해야 한다. INT 10H 기능 2CH는 시스템 시간을 획득하여 CL에 분(00?59), DH에 초(00?59), DL에 100분의 1초(00?99)를 2진값으로 반환한다. INT 10H 기능 2DH는 시스템 시간을 설정 하며 CL 분(00?59), DH 초(00?59), DL 100분의 1초(00?99)에 저장된 값으로 시스템 시간을 로드한다.게임이 시작될 때 INT 10H 기능 2DH를 이용해서 현재 시간을 00분 00초로 설정한다.MOVCL, 00; 분 = 00MOVDH, 00; 초 = 00MOVDL, 00; 100분의 1초 = 00MOVAH, 2DHINT21H; 현재시간을 00분 00초로 설정PRINT_SEC가 호출되면 INT 10H 기능 2CH를 이용해서 현재 초를 DH에 저장하고, DH에서 SECOND DATA값(0)을 빼면 게임이 진행된 시간(초)이 DH에 저장되게 된다.MOVAH, 2CH; INT 21H 기능 2CH를 하면 DH에 프로그램 시작후; 경과된 시간 '초'가 16진수로 저장된다.INT21HSUBDH, SECOND; 현 얻을 수 없게 됨을 알았다. 그래서 현재 시간과 프로그램 시작 시간의 차를 구하기 전에, 두 값을 비교해서 현재 시간이 프로그램 시작 시간보다 작다면 현재 시간에 60을 더해서 문제를 해결하였다.하지만 이 방법도 매번 현재 시간과 프로그램 시작 시간의 크기 비교를 해야 한다는 번거로움이 있었다.프로그램이 시작할 때 INT 21H 기능 2DH를 이용해서 시작 시간을 00분 00초 00ms로 리셋 시킨 후 시작시간을 데이터에 저장시켰다. 이렇게 하게 되면 프로그램 시작시간은 항상 00분 00초 00ms이기 때문에 현재 시간과 프로그램 시작 시간의 대소 비교를 할 필요가 없어진다.5) 스택의 이용처음에는 스택이 얼마나 충분한 지에 대한 지식이 없어서 64로 놓고 돌렸는데 그래프가 전혀 나타나지를 않았다. 픽셀을 하나하나 찍다보니 PUSH와 POP하는 일들이 많아져 스택이 모자람을 나중에서야 깨닫고 512로 늘렸을 때, 그래프가 나옴을 알았다. 그 뒤로 크게 스택이 모자람을 느낄 수 없었다. 그리고 스네이크의 이동에서 스네이크가 이동을 할 때 수많은 위치 좌표를 남기는데 그 좌료를 도대체 어떻게 변수를 써서 남겨야 하는가에 대한 문제에 봉착하게 되었다.스택을 이용하려 했으나 그것은 first in last out이 되니 스네이크의 움직임을 묘사하는데는 부적절했다. 다른 방법으로 변수를 쓰려했으나 스네이크가 길어짐에 따라 스네이크의 움직임을 묘사하는데 드는 변수 이름이 너무 많아짐을 알아 고민을 많이 했다. 하지만 변수를 다르게 인덱스를 이용하여 선언하면 쉽게 위치를 접근할수 있음을 깨닫고 작업에 착수하여 스네이크의 움직임을 묘사하는데 성공했다.하지만 여기서 모든 것이 다 해결된 것은 아니었다. 인덱스를 지정할 수 있는 레지스터가 따로 있음을 깨닫지 못한채 파라미터값을 이용하여 임의의 위치를 접근하려 했으나 컴파일시 에러만 생겼다. 이것은 그리 어렵지 않게 해결할 수 있었으나 그 다음 스네이크의 움직임을 살펴본 결과 스네이크가 몸이 분리된 채 사방으로 돌아다님을 확인;스네이크 잔재 지움 Y좌표, 즉 COLUMNCALL SNAKE_CLEAR_GRAPHIC;스네이크 잔재 지움CALL SNAKE_DIE;스네이크가 죽었냐?CMP GMOVER_CHECK,01 ;죽었는지 체크JNE MOVE00MOV CX,NOW_LIFE_XSUB CX,19;죽었으면 라이프를 하나 줄인다.MOV NOW_LIFE_X,CXJMP ENDMOV;움직임을 끝내라MOVE00:MOV BH,PRECURRENT;현재 진행방향 BH에 저장MOVE10:MOV AH,0BH;키보드입력을 확인한다.INT 21HCMP AL,0FFH;키보드값이 있냐?JNE UP;없으면 점프해라.;만약있다면....MOV AH,10H;에코없이 키보드입력을 받아들인다.INT 16HCMP AH,48H;스캔코드가 UP ARROW인가?JNE MOVE20MOV CH,UP_ARROWMOV CURRENT,CH;현재상태를 위쪽으로 바꿔라JMP MOVE80MOVE20:CMP AH,50H;스캔코드가 DOWN ARROW인가?JNE MOVE30MOV CH,DOWN_ARROWMOV CURRENT,CH;현재상태를 아래쪽으로 바꿔라JMP MOVE80MOVE30:CMP AH,4DH;스캔코드가 RIGHT ARROW인가?JNE MOVE40MOV CH,RIGHT_ARROWMOV CURRENT,CH;현재상태를 오른쪽으로 바꿔라JMP MOVE60MOVE40:CMP AH,4BH;스캔코드가 LEFT ARROW인가?JNE MOVE50MOV CH,LEFT_ARROWMOV CURRENT,CH;현재상태를 왼쪽으로 바꿔라JMP MOVE60MOVE50:CMP AH,01H;ESC가 눌려졌느냐?JE MOVE1JMP MOVE10;다음 키보드 버퍼값을 확인하려고 점프한다.MOVE1:MOV NOW_LIFE_X,406;ESC가 눌렸으면 게임을 끝내라JMP ENDMOVMOVE60:CMP BH,UP_ARROW;현재 진행 방향이 윗쪽이나 아랫쪽방향이냐?JE MOVE70CMP BH,DOWN_ARROW;왼쪽,오른쪽 방향키가 들어오면 방향전환해라JNE UPMOVE70:ML_X
/* The basic scientific calculator using stack */#include <stdio.h>#include <math.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#define MAX 128 #define NULL 0#define UNDERFLOW -1long stack[MAX]; // all characters are inputed.float stack1[MAX]; // After grasping inputed characters, input floating numbers.int top = -1;/* Insert value n into stack, which operator is push */int push(long n){top++;if (top > MAX)// check overflow of stack{printf("nStack Overflow!n");exit(1);}stack[top]=n; // push on stackreturn 1;}