#include <dos.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> struct myCOUNTRY{ short co_date; // date format char co_curr[5]; // currency symbol char co_thsep[2]; // thousands separator char co_desep[2]; // decimal separator char co_dtsep[2]; // date separator char co_tmsep[2]; // time separator char co_currstyle; // currency style char co_digits; // significant digits in currency char co_time; // time format long co_case; // case map char co_dasep[2]; // data separator char co_fill[10]; // filler }; union REGS inregs; union REGS outregs; struct SREGS segregs; struct myCOUNTRY country_info; void main(void) { inregs.h.ah = 0x38; inregs.h.al = 0x00; segregs.ds = FP_SEG(&country_info); inregs.x.dx = FP_OFF(&country_info); intdosx(&inregs, &outregs, &segregs); // Åñëè ïîñëå âûïîëíåíèÿ ïðåðûâàíèÿ óñòàíîâëåí // ôëàã ïåðåíîñà, âûâîäèì ñîîáùåíèå îá îøèáêå if(outregs.x.cflag != 0) { printf("\n\nError:\t%d", outregs.x.ax); // Ïîëó÷àåì ðàñøèðåííóþ èíôîðìàöèþ îá îøèáêå // ñ ïîìîùüþ ôóíêöèè 0x59 ïðåðûâàíèÿ INT 21h inregs.h.ah = 0x59; inregs.x.bx = 0; // Ñîõðàíÿåì ðåãèñòðû â ñòåêå, òàê êàê èõ ñîäåðæèìîå // èçìåíèòñÿ asm push ds asm push es asm push si asm push di // Âûçûâàåì ïðåðûâàíèå intdosx(&inregs, &outregs, &segregs); // Âîññòàíàâëèâàåì ñîäåðæèìîå ðåãèñòðîâ asm pop di asm pop si asm pop es asm pop ds // Âûâîäèì ðàñøèðåííóþ èíôîðìàöèþ îá îøèáêå printf("\nExtended error code :%d" "\nError Class :%d" "\nAction :%d" "\nLocalization :%d", outregs.x.ax, outregs.h.bh, outregs.h.bl, outregs.h.ch); } else { printf("\n Date format : %d \ \n Currency symbol :'%s'\ \n Thousand separator :'%s'\ \n Decimal separator :'%s'\ \n Date separator :'%s'\ \n Time separator :'%s'\ \n Currstyle : %d \ \n Digits : %d \ \n Time Format : %d \ \n Case procedure addr: %ld\ \n Data separator :'%s'\ \n Fill :'%s'", country_info.co_date, country_info.co_curr, country_info.co_thsep, country_info.co_desep, country_info.co_dtsep, country_info.co_tmsep, country_info.co_currstyle, country_info.co_digits, country_info.co_time, country_info.co_case, country_info.co_dasep, country_info.co_fill ); printf("\n\n After decoding:\n"); // Ðàñøèôðîâûâàåì ïîëó÷åíóþ èíôîðìàöèþ //Ôîðìàò äàòû: // 0 = ÑØÀ (ìåñÿö/äåíü/ãîä) // 1 = Åâðîïà (äåíü/ìåñÿö/ãîä) // 2 = ßïîíèÿ (ãîä/ìåñÿö/äåíü) char *date; date = (char *) malloc(sizeof(char)*8); switch (country_info.co_date) { case 0: strcpy(date,"MM"); strcat(date,country_info.co_dtsep); strcat(date,"DD"); strcat(date,country_info.co_dtsep); strcat(date,"YY"); break; case 1: strcpy(date,"DD"); strcat(date,country_info.co_dtsep); strcat(date,"MM"); strcat(date,country_info.co_dtsep); strcat(date,"YY"); break; case 2: strcpy(date,"YY"); strcat(date,country_info.co_dtsep); strcat(date,"MM"); strcat(date,country_info.co_dtsep); strcat(date,"DD"); break; } //Ôîðìàò âðåìåíè: // 0 = 12-÷àñîâîé // 1 = 24-÷àñîâîé char *time; time = (char *) malloc(sizeof(char)*16); switch(country_info.co_time) { case 0: strcpy(time,"hh"); strcat(time,country_info.co_tmsep); strcat(time,"mm"); strcat(time,country_info.co_tmsep); strcat(time,"ss [AM/PM]"); break; case 1: strcpy(time,"HH"); strcat(time,country_info.co_tmsep); strcat(time,"MM"); strcat(time,country_info.co_tmsep); strcat(time,"SS"); break; } char *numb; numb = (char *) malloc(sizeof(char)*8); strcpy(numb,"1"); strcat(numb,country_info.co_thsep); strcat(numb,"000"); strcat(numb,country_info.co_desep); strcat(numb,"00"); printf("\n Date format :'%s'",date); printf("\n Time format :'%s'",time); printf("\n Number format :'%s'",numb); } printf("\n\nPress any key..."); getch(); } |