Toy Project

[라이브러리] DOS 시절의 XMS 라이브러리

prostars 2007. 9. 22. 22:32
자아~ 추석 연휴가 시작되었다.
오늘은 어린 마음에 여기저기서 베껴놓고 스스로 만들었다고 착각했던 XMS 라이브러리를 올려본다.
97년도 자료니까...벌써 10년 전이다... 내 나이가...ㅠ,ㅠ...벌써...험..험...
역시 이것도 홈페이지에 올려놨던 자료를 옮겨 오는 과정의 하나다.
전혀 쓸데없지는 않을 것이라는 생각에 폐기되는 자료목록에서 살아남은 놈이다.
참...방 정리하면서 책도 하나 찾았다.
이 라이브러리의 상당부분을 이 책에서 차용했을 것이다.
프로그래머를 위한 확장 메모리 사용법
성안당
이하는 홈페이지에 올렸던 내용은 옮긴다.
---------------------------------------------------------------------------------------------

https://github.com/prostars/XMS-Library-for-DOS


안녕하세요~
어제 시디 조금 정리하다 몇년전에 백업받은 시디를 찾았습니다~
쿠쿠~
오래전에 어셈이랑 씨언어 공부할때 만들었던...
파일날짜로 봐서...97년도 같습니다...
나름데로 라이브러리 였던 겁니다.
머...책이나 기타 다른건 많이 참조해서 만들었겠지만..^^;
기억에..없답니다..깨끗하게..ㅡ_ㅡ;
6년전이니 기억이 안나도...그다지 아쉽지는 않다는...쿨럭...
아..참...파일 열어봤더니 주석이 모두 조합형 한글 입니다.
메모장으로 여시면 한글이 깨져보인답니다.
워드로 여실때 '조합형'을 고르시거나 아크로에디터로 여셔서 '조합형'으로 변환을 하시면 잘 보입니다.
물론, 지금은 쓰잘때기 없겠지만...^^;
DOS에서의 시스템 콜이라든가 어셈과 C의 혼용 프로그래밍 이라든가...
약간은 참고가 될듯 하여 올립니다.

아래는 헤더파일 내용입니다.
97년도가 맞나보네요...
어린맘에...어디서 배꼈는지...Copyright도 붙어있습니다...ㅡ_ㅡ;..
라이브러리 스팰링도 틀려있었습니다..험험....ㅡ_ㅜ;...

**************************************************************************
*   Extened Memory Manager Library              Version 0.9              *
*                                               Program by Lee Sang Woo  *
*   Copyright (c) 1997, Lee Sang Woo                                     *
**************************************************************************


**************************************************************************
short XMMinstalled ();
   HIMEM.SYS 가 인스톨 되었는지 확인한다.
   리턴 값 : 인스톨 되어 있다면 1을
             인스톨 되어 있지 않다면 0을 리턴한다.
**************************************************************************

**************************************************************************
short GetXMMVersion (short num);
   인수로 1, 2, 3 중 하나를 받는다.
   리턴 값 : 인수로 1을 주었을때의 경우.
                   XMS 의 버젼을 리턴한다.
             인수로 2를 주었을때의 경우.
                   XMS Driver의 버젼을 리턴한다.
             인수로 3을 주었을때의 경우.
                   HMA 가 존재하는지 확인하며, 존재한다면 1을 아니면 0을 리턴.
   (리턴 값은 16진수 이다.)
**************************************************************************

**************************************************************************
unsigned short GetEMBSize (short num);
   인수로 1, 1외의 값중 하나를 받는다.
   리턴 값 ; 인수로 1을 주었을 경우.
                   사용가능한 EMB의 최대 크기를 리턴한다.
             인수로 1외의 값을 주었을 경우.
                   사용가능한 EMB의 전체 크기를 리턴한다.
             에러가 발생할경우.
                   -1, -2, -3 중 하나를 리턴한다.
                   -1 : 지정 펑션을 사용할수 없다.
                   -2 : VDISK 가 검출되었다.
                   -3 : 모든 EMB 가 할당되었다.
**************************************************************************

**************************************************************************
short EMBAlloc (short EMB_Size);
   인수로 할당받을 EMB의 크기(Kbyte)를 받는다.
   리턴 값 : 성공적으로 할당이 이루어지면 그 메모리 블럭의 핸들을 리턴.
             핸들은 16비트 크기 이다.
             에러가 발생하면, 음수 값이 리턴된다.
                   -1 : 지정 펑션을 사용할수 없다.
                   -2 : VDISK 가 검출되었다.
                   -3 : 모든 EMB 가 할당되었다.
                   -4 : 모든 EMB 핸들이 사용되었다.
**************************************************************************

**************************************************************************
short EMB_reSize (short handle, short EMB_size);
   인수로 EMB의 핸들(16bit)과 새 EMB 크기(KByte) 를 받는다.
   리턴 값 : 성공적으로 변경이 이루어지면 1을 리턴한다.
             에러가 발생하면, 음수 값이 리턴된다.
                   -1 : 지정 펑션을 사용할 수 없다.
                   -2 : VDISK 가 검출 되었다.
                   -3 : 모든 EMB 가 할당되었다.
                   -4 : 모든 EMB 핸들이 사용되었다.
                   -5 : 핸들 지정이 잘못되었다.
**************************************************************************

**************************************************************************
short FreeEMB (short handle);
   인수로 EMB의 핸들(16bit) 를 받는다.
   리턴 값 : 성공적으로 해제가 이루어지면 1을 리턴한다.
             에러가 발생하면, 음수 값이 리턴된다.
                   -1 : 지정 펑션을 사용할 수 없다.
                   -2 : VDISK 가 검출 되었다.
                   -3 : 모든 EMB 가 할당되었다.
                   -4 : 모든 EMB 핸들이 사용되었다.
                   -5 : 핸들 지정이 잘못되었다.
                   -6 : 핸들이 록(LOCK) 상태이다.
**************************************************************************

**************************************************************************
short EMB_HandleInfo (short handle, short num);
   인수로 EMB의 핸들과 기능번호(1,2,3)를 받는다.
   리턴 값 : 인수로 1을 주었을 경우.
                   록(LOCK)인 상태인 블록 수를 리턴.
             인수로 2를 주었을 경우.
                   시스템에서 사용 가능한 EMB 핸들 수를 리턴.
             인수로 3을 주었을 경우.
                   블록 길이(KByte)를 리턴.
             에러가 발생하면, 음수 값 리턴.
                   -1 : 지정 펑션을 사용할 수 없다.
                   -2 : VDISK가 검출 되었다.
                   -3 : 핸들 지정이 잘못되었다.
**************************************************************************

**************************************************************************
unsigned long EMB_Lock (short handle);
   인수로 EMB의 핸들을 받는다.
   리턴 값 : 성공적으로 잠금이 이루어지면 LOCK된 블록 번지(32bit)를 리턴.
             에러가 발생하면, 16비트 크기의 1부터 5사이의 값이 리턴된다.
                    1 : 지정 펑션을 사용할 수 없다.
                    2 : VDISK가 검출되었다.
                    3 : 핸들 지정이 잘못되었다.
                    4 : 블록 LOCK 수가 초과되었다.
                    5 : 록(LOCK) 실패.
**************************************************************************

**************************************************************************
short EMB_UNLock (short handle);
   인수로 EMB의 핸들을 받는다.
   리턴 값 : 성공적으로 해제가 이루어지면 1을 리턴.
             에러가 발생하면, 음수를 리턴.
                   -1 : 지정 펑션을 사용할 수 없다.
                   -2 : VDISK가 검출되었다.
                   -3 : 핸들 지정이 잘못되었다.
                   -4 : 블록이 록(LOCK) 상태가 아니다.
**************************************************************************

**************************************************************************
short MoveEMB (EMMStruct far *moveInfo);
   인수로 EMMStruct 형 구조체의 주소를 받는다.
   리턴 값 : 성공적으로 이동이 이루어지면 1을 리턴한다.
             에러가 발생하면, 음수 값을 리턴한다.
                   -1 : 지정 펑션을 사용할 수 없다.
                   -2 : VDISK가 검출되었다.
                   -3 : A20 에러 발생.
                   -4 : 소스 핸들 지정이 잘못되었다.
                   -5 : 소스 옵셋 지정이 잘못되었다.
                   -6 : 목적 핸들 지정이 잘못되었다.
                   -7 : 목적 옵셋 지정이 잘못되었다.
                   -8 : 길이 지정이 잘못되었다.
                   -9 : 이동시 잘못 겹쳐(overlap)졌다.
                  -10 : 패리티(parity)에러가 발생했다.

   이 함수는 아래의 함수들이 내부적으로 호출하여 사용한다.
   사용자가 이함수를 호출할일은 없을것이다.
**************************************************************************

**************************************************************************
//  이하의 함수들은 MoveEMB ()를 쉽게 사용하기위하여 C로 만든 함수로
//  리턴 값은 MoveEMB ()의 리턴 값을 그대로 리턴한다.
**************************************************************************

**************************************************************************
short MEMtoEMB (void far *Buffer, unsigned short Handle, unsigned long offset, unsigned long Length);
   인수로 버퍼의 주소(옮기고자 하는 메모리 블럭), EMB의 핸들(할당받은 EMB 핸들)
   옮겨 놓고자 하는 EMB블럭의 시작주소, 옮길 크기를 준다.
**************************************************************************

**************************************************************************
short EMBtoMEM (unsigned short Handle, unsigned long offset, void far *Buffer, unsigned long Length);
   인수로 받는 값은 위의 함수와 같고 순서만 다르다.
**************************************************************************

**************************************************************************
short EMBtoEMB (unsigned short S_Handle, unsigned long S_offset, unsigned short D_Handle, unsigned long D_offset, unsigned Length);
   인수로 EMB 핸들과 EMB블럭의 시작 주소만을 받는다.
   앞의 두개는 소스 EMB블럭의 핸들과 시작 주소를,
   뒤의 두개는 목적 EMB블럭의 핸들과 시작 주소를 말한다.
**************************************************************************

**************************************************************************
short EMBWrite (unsigned short Handle, unsigned short offset, void far *Buffer, unsigned long Length);
   인수로 EMB의 핸들과 EMB블럭의 시작 주소를 그리고, 버퍼의 주소와 그 크기를 받는다.
**************************************************************************

**************************************************************************
short EMBRead (unsigned short Handle, unsigned short offset, void far *Buffer, unsigned long Length);
   인수로 받는 값은 위의 함수와 같다.
**************************************************************************


반응형