2016-08-18 4 views
0

국가를 감지 할 수있는 로케일 별 정보를 얻는 방법은 무엇입니까? 예 : 현재 국가 코드, 키보드 레이아웃 또는 터보 C 코드 페이지 환경에 있습니까?DOS : 터보 C의 현재 국가 코드 또는 코드 페이지를 얻는 방법

Turbo C 라이브러리 기능으로는 불가능한 경우 BIOS 호출이이를 수행 할 수 있습니다 (INT 21)?.

KEYB 프로그램은 예를 들어 다음과 같이 표시 할 수 있습니다. 키보드 레이아웃. 그건 내 목적에 충분할 것입니다 : https://www.dosbox.com/wiki/KEYB

답변

3

INT 21h, AX=6501h을 사용하십시오. 터보 C 코드는 다음과 같습니다.

#include <dos.h> 
#include <stdio.h> 

struct country_info_buffer 
{ 
    unsigned char info_id; 
    unsigned short buffer_size; 
    unsigned short country_id; 
    unsigned short code_page; 
    struct COUNTRY country_info; 
}; 

int main() 
{ 
    /* Registers for INT21 call */ 
    union REGS regs; 
    struct SREGS sregs; 
    /* Output buffer */ 
    struct country_info_buffer info; 

    /* Get current value of segment registers */ 
    segread(&sregs); 

    /* Get extended country information/general internationalization info */ 
    regs.x.ax = 0x6501; 
    /* Global code page */ 
    regs.x.bx = 0xFFFF; 
    /* Current country */ 
    regs.x.dx = 0xFFFF; 
    /* Size of output buffer */ 
    regs.x.cx = sizeof(info); 
    /* Pointer to output buffer goes to ES:DI */ 
    sregs.es = FP_SEG(&info); 
    regs.x.di = FP_OFF(&info); 

    /* Call int21 */ 
    intdosx(&regs, &regs, &sregs); 

    if (regs.x.cflag) 
    { 
    printf("Call failed, ax=%d\n", regs.x.ax); 
    return 1; 
    } 
    printf("Country code: %d, Code page: %d\n", info.country_id, info.code_page); 
    return 0; 
} 

Btw Ralf Brown의 인터럽트 목록은 DOS 시스템 호출에 유용한 리소스입니다. DOS가 호의를 잃기도 전에 그것이 유지되는 것을 멈추게했다. 그래서 몇몇 "최신"물건은 거기에 기술되지 않았다.

+0

우수 답변. Unfortunatelly DOSBox는 유용한 국가 또는 코드 페이지 정보를 제공하지 않는 것 같습니다. 반환 된 정보는 1 + 437 (미국 국가 및 코드 페이지)이었습니다. 현재 자판 배열이 국가를 탐지하는 유일한 유용한 소스 일 수 있습니다. – digitalfootmark