Использование INT 21h, AX=6501h. Вот код для Turbo 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;
}
КПП. Прерывающий список Ralf Brown - отличный ресурс для системных вызовов DOS. Слишком плохо, что он прекратил поддерживать даже до того, как DOS исчерпала себя, поэтому некоторые «новейшие» вещи там не описаны.
Отличный ответ. К сожалению, DOSBox, похоже, не предоставляет полезную информацию о стране или кодовой странице. Возвращенная информация была 1 + 437 (страна США и кодовая страница). Текущая раскладка клавиатуры может быть единственным полезным источником для обнаружения страны. – digitalfootmark