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(®s, ®s, &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のInterrupt Listは、DOSシステムコールのための素晴らしいリソースです。 DOSが好意を失う前でさえ、それは維持されていませんでしたので、いくつかの「最新の」ものはここには記載されていません。
優れた答えです。 Unfortunatelly DOSBoxは有用な国またはコードページの情報を提供していないようです。返された情報は1 + 437(米国の国とコードページ)でした。現在のキーボードレイアウトは国を検出する唯一の有用なソースかもしれません。 – digitalfootmark