/*************************************************************************** * Copyright (C) 2007-2020 by SEMIKO * * mail@semico.ru * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include // Коды выхода BSD from @(#)sysexits.h 8.1 (Berkeley) 6/2/93 // Copyright (c) 1987, 1993 // The Regents of the University of California. All rights reserved. #define EX_USAGE 64 /* command line usage error */ #define EX_DATAERR 65 /* data format error */ #define EX_NOINPUT 66 /* cannot open input */ #define EX_NOUSER 67 /* addressee unknown */ #define EX_NOHOST 68 /* host name unknown */ #define EX_UNAVAILABLE 69 /* service unavailable */ #define EX_SOFTWARE 70 /* internal software error */ #define EX_OSERR 71 /* system error (e.g., can't fork) */ #define EX_OSFILE 72 /* critical OS file missing */ #define EX_CANTCREAT 73 /* can't create (user) output file */ #define EX_IOERR 74 /* input/output error */ #define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ #define EX_PROTOCOL 76 /* remote error in protocol */ #define EX_NOPERM 77 /* permission denied */ #define EX_CONFIG 78 /* configuration error */ #define EX_COMPILATION 100 /* error in a compilation */ // end sysexits.h char mkversion[]="Version 0.36"; // 0.11 - устранена ошибка // 0.12 - добавлена команда РР В/О // 0.13 - введено сообщение об ошибке компилятора Е015: совпадение имени метки и идентификатора // - исправлена ошибка перекодировки в/из UTF-8 и UCS-2 // 0.14 - изменен номер версии для исправления, сделанного NPP // - исправлена ошибка отсутствия вывода в .htm команды "F X=0" (mkkom.name1[94]) // 0.15 - исправлена ошибка операторов .DA .DAH .DAL при разборе меток на втором проходе // 0.16 - исправлена ошибка v0.15 при разборе меток на втором проходе // 0.17 - исправлена ошибка вывода в начало файла .mkp лишнего байта равного нулю // - по замечанию NPP // 0.18 - добавлены псевдооператоры .DD .DDH .DDL (адреса DEC-HEX) // - исправлены ошибки в реализации .DA .DAH .DAL (адреса DEC-BCD) // - [соответствует mk.exe v1.14] // - используется файл конфигурации пакета mk.cfg (вместо mkl2mkp.cfg) // - не используется установка кодировки ключом -c // 0.19 - корректная обработка букв Ё и ё в кодировке 1251 при разборе .TEXT // 0.20 (15.01.10) - используется файл конфигурации mkcfg v0.11, распознавание mkcfg v0.10 // 0.21 (16.04.10) - добавлен псевдооператор .NUMT - адрес из трёх байт // - в MKP добавлен признак текста 200h (hex - 100h) // - изменён формат вывода в TXT и HTM файлы // - ключ -i - вывод информации // - предупреждение W003 - четырёхзначное число в NUMT // 0.22 (21.04.10) - в вывод помощи -h добавлена информация по -i, сообщения переведены на русский // - дополнительная проверка при выводе символов текста в HTM-файлы // 0.23 (28.03.11) // - исправлена ошибка в реализации .DD; // - в операторах .DA, .DB, .DD строки могут заканчиватся запятой; // - добавлены псевдооператоры .BASE и .DBB - установка базы и запись смещения относительно базы. // 0.24 (14.10.11) // - добавлены псевдооператоры .NUMD и .NUMI; // - исправлена ошибка при вычислении контрольной суммы XOR для HTM-файла // - убраны лишние символы пробелов в HTM-файле // 0.25 (14.11.11) // - добавлены псевдооператоры .DW и .DWB // 0.25 En (06.08.13) // - интерфейс переведен на английский // (перевод выполнил Vitali Samurov aka Vitasam) // 0.26 En (08.08.13) // - вывод об ошибках модифицирован для интеграции с парсером Geany. // (Vitali Samurov aka Vitasam) // 0.27 (11.11.13) // - добавлениe команд интерфейса .FORM, .TAB, .LDX, .LDY etc // - команда .END вставляет 0FFh для совместимости с описанием ГИ // - для обозначения конца секции .MKP используется .ENDP // 0.28 (02.04.14) // - команда DRAWR исправлена на DRAWP (см. Д1 изм. 21) // 0.29 (04.09.14) // - дополнения для ручной оптимизации (OPT & 2): // - предупреждение W001 - двухбайтовые адреса переходов внутри страницы // - предупреждение W004 - ведущий нуль в .NUM и .NUMT // - предупреждение W005 - используется расширенная адресация для R0-R99 // 0.30 (29.09.14.) // - обработка чисел до 65535 в .DW и .EQU // 0.31 (05.11.14) // - обработка восьмеричных (...o), четвертичных (...q), троичных (...t) и двоичных (...b) чисел. // - десятичные числа (...d) установлены по умолчанию. // 0.32 (14.07.15) // - исправление ошибки короткой адресации при включенной шестнадцатиричной оптимизации // (OPT & 1) адресов от 100 до 105. // 0.33 (18.03.16) // - исправление ошибки обращения к каталогам nix из командной строки // - по замечанию Павла Петрова (vk.com/id88535872) // 0.34 (23.03.19) // - исправление ошибки .NUMT // - по замечанию AtH // 0.35 (10.04.19) // - исправление ошибки .NUMT v0.34 // 0.36 (20.11.20) // - исправление ошибки .TEXT (устранено сжатие последовательных пробелов) // - исправление ошибки .DA, .DAH, .DAL (установка признака данных) // - по замечаниям Павла Петрова (vk.com/id88535872) int dos=2; // 0-GNU/Linux 1-DOS 2-Windows (Win32) char mes[24][256]; // сообщения программы char fname[6][256]; //0-MKL без расширения 1-MKL исходный 2-MKP 3-TXT 4-HTM int fname_vsego; // всего файлов в строке аргументов FILE *fp0, *fp1,*fp2, *fp3, *fp4; //потоки 0-CFG 1-MKL 2-MKP 3-MKP.TXT 4-MKP.HTM int kluch_i; /* ключ -i - вывод информации при компилировании v0.21 */ char temp[256]; char ctemp[512]; /* вспомогательная строка */ char ctemp1[512]; /* вспомогательная строка */ char ctemptoa[40]; // вспомогательная строка для sprintf (DOS - itoa ltoa) int mkbufp[10240]; /* буфер для компиляции программы */ int flag_mkbufp; /* 0 - нет информации 1 - есть информация */ int comp_const=4096; /* константа признаков для первого прохода - с v0.21*/ int comp_progks1=0; int comp_progks2=0; /* контрольные суммы ADD XOR */ long comp_stroka; /* текущая компилируемая строка */ long comp_adres; /* текущий адрес в mkbufp при компиляции */ long comp_chislo; /* число считанное comp_get_chislo */ long comp_charset; /* кодировка 1251 или 866 (пока) */ char comp_metka[40]; /* метка считанная comp_get_metka */ char comp_ident[40]; /* идентификатор считанный comp_get_ident */ char comp_text[256]; int comp_flag_adres; /* 0-только десятичные адреса 1-допустимы шестнадцатиричные цифры */ int comp_flag_opt2; /* OPT & 2 - выдача предупреждений 1, 4 и 5 для ручной оптимизации (v0.29) */ int comp_progmin; // начало программы в страницах int comp_proglen; // длина программы в страницах long comp_base; // v0.23 (v1.18 mk.exe) - текущая база для операторов .BASE и .DBB int mkiocharset; // 0=CP866|1=CP1251|2=KOI8R|3=UTF8|4=UCS2 char compilation_error = 0; struct MKKOM{ // команды МК int len[256]; // количество доп байт команды 0-нет int par[256]; // параметр команды 0-нет; 1,2 - адрес; 3,4 - номер регистра 1 или 2 байта char name[256][16]; // мнемоника команды ЛАТ char name1[256][20]; // мнемоника команды РУС HTML [20] 17 min! char name2[256][16]; // мнемоника команды LAT комп (упакованная без пробелов) int init; // признак инициализации структуры 0-нет 1-есть } mkkom; struct METKA // структура меток для компилятора { char name[10000][34]; // имя long val[10000]; // значение long stroka[10000]; // строка программы в которой использована метка int use[10000]; // использование 0-нет, // 1 - есть val (определено) // 2 - используется в тексте // после компиляции все метки должны быть 3 (по ИЛИ) long vsego; // всего установлено меток } metka; struct MBASE { // v0.23 (mk_v118.exe)для операторов .BASE и .DBB - список баз long val[10004]; // значение long stroka [10004]; // строка программы в которой установлена база long vsego; // всего установлено баз } mbase; struct IDENT // структура идентификаторов EQU для компилятора { char name[10000][34]; // имя идентификатора long val[10000]; // значение long stroka[10000]; // строка программы в которой определен int use[10000]; // использование 0-нет, // 1 - есть val (.EQU) // 2 - используется в тексте // после компиляции все метки должны быть 3 (по ИЛИ) long vsego; // всего установлено идентификаторов } ident; struct MKERROR // таблица найденных ошибок компиляции { int n[1024]; // тип ошибки long stroka[1024]; char sss[1024][40]; // сопровождающий текст (например имя метки или непонятный оператор) long vsego; // всего при компиляции ошибок char name[30][256]; // описание ошибок с номером n int w; // номер с которого идут предупреждения, ошибки начинаются с 0 int initvsego; // количество сообщений (name)=20 int init; // признак инициализации структуры 0-нет 1 -есть } mkerror; long mkcharset[68][5]= //а=0 я=32 А=33 Я=65 0-866 1-1251 2-koi8 3-utf8 4-ucs2 {0xA0,0xE0,0xC1,0xD0B0,0x0430, // а 0xA1,0xE1,0xC2,0xD0B1,0x0431, // б 0xA2,0xE2,0xD7,0xD0B2,0x0432, 0xA3,0xE3,0xC7,0xD0B3,0x0433, 0xA4,0xE4,0xC4,0xD0B4,0x0434, 0xA5,0xE5,0xC5,0xD0B5,0x0435, // е 0xF1,0xB8,0xA3,0xD191,0x0451, // ё 0xA6,0xE6,0xD6,0xD0B6,0x0436, // ж 0xA7,0xE7,0xDA,0xD0B7,0x0437, 0xA8,0xE8,0xC9,0xD0B8,0x0438, 0xA9,0xE9,0xCA,0xD0B9,0x0439, 0xAA,0xEA,0xCB,0xD0BA,0x043A, 0xAB,0xEB,0xCC,0xD0BB,0x043B, 0xAC,0xEC,0xCD,0xD0BC,0x043C, 0xAD,0xED,0xCE,0xD0BD,0x043D, 0xAE,0xEE,0xCF,0xD0BE,0x043E, 0xAF,0xEF,0xD0,0xD0BF,0x043F, // п 0xE0,0xF0,0xD2,0xD180,0x0440, // р 0xE1,0xF1,0xD3,0xD181,0x0441, 0xE2,0xF2,0xD4,0xD182,0x0442, 0xE3,0xF3,0xD5,0xD183,0x0443, 0xE4,0xF4,0xC6,0xD184,0x0444, 0xE5,0xF5,0xC8,0xD185,0x0445, 0xE6,0xF6,0xC3,0xD186,0x0446, 0xE7,0xF7,0xDE,0xD187,0x0447, 0xE8,0xF8,0xDB,0xD188,0x0448, 0xE9,0xF9,0xDD,0xD189,0x0449, 0xEA,0xFA,0xDF,0xD18A,0x044A, 0xEB,0xFB,0xD9,0xD18B,0x044B, 0xEC,0xFC,0xD8,0xD18C,0x044C, 0xED,0xFD,0xDC,0xD18D,0x044D, 0xEE,0xFE,0xC0,0xD18E,0x044E, 0xEF,0xFF,0xD1,0xD18F,0x044F, // я 0x80,0xC0,0xE1,0xD090,0x0410, // А 0x81,0xC1,0xE2,0xD091,0x0411, 0x82,0xC2,0xF7,0xD092,0x0412, 0x83,0xC3,0xE7,0xD093,0x0413, 0x84,0xC4,0xE4,0xD094,0x0414, 0x85,0xC5,0xE5,0xD095,0x0415, 0xF0,0xA8,0xB3,0xD081,0x0401, // Ё 0x86,0xC6,0xF6,0xD096,0x0416, 0x87,0xC7,0xFA,0xD097,0x0417, 0x88,0xC8,0xE9,0xD098,0x0418, 0x89,0xC9,0xEA,0xD099,0x0419, 0x8A,0xCA,0xEB,0xD09A,0x041A, 0x8B,0xCB,0xEC,0xD09B,0x041B, 0x8C,0xCC,0xED,0xD09C,0x041C, 0x8D,0xCD,0xEE,0xD09D,0x041D, 0x8E,0xCE,0xEF,0xD09E,0x041E, 0x8F,0xCF,0xF0,0xD09F,0x041F, // П 0x90,0xD0,0xF2,0xD0A0,0x0420, // Р 0x91,0xD1,0xF3,0xD0A1,0x0421, 0x92,0xD2,0xF4,0xD0A2,0x0422, 0x93,0xD3,0xF5,0xD0A3,0x0423, 0x94,0xD4,0xE6,0xD0A4,0x0424, //Ф v0.13 - кодировка koi8 исправлено 0x95,0xD5,0xE8,0xD0A5,0x0425, 0x96,0xD6,0xE3,0xD0A6,0x0426, 0x97,0xD7,0xFE,0xD0A7,0x0427, 0x98,0xD8,0xFB,0xD0A8,0x0428, 0x99,0xD9,0xFD,0xD0A9,0x0429, 0x9A,0xDA,0xFF,0xD0AA,0x042A, 0x9B,0xDB,0xF9,0xD0AB,0x042B, 0x9C,0xDC,0xF8,0xD0AC,0x042C, 0x9D,0xDD,0xFC,0xD0AD,0x042D, 0x9E,0xDE,0xE0,0xD0AE,0x042E, 0x9F,0xDF,0xF1,0xD0AF,0x042F, // Я 0,0,0,0,0}; /*================================================================= Функции ============================*/ //void compil(void); void compil_l(void); // компиляция исходного текста (MKL) //int win2dos(char* ); //int dos2win(char* ); void mkstrcpy (char* , char* , int , int ); //int file2text(void); //int text2file(void); int init_mkkom(void); // мнемоники команд int init_mkerror(void); // коды ошибок int init_msg(void); // сообщения void buf2txt(void); // из mkbufp в файл листинга TXT void buf2htm(void); // из mkbufp в файл HTML int comp_strupr(void); // аналог DOS strupr для корректной работы со строками программы в ctemp int comp_get_chislo(char*, int); // считать число из строки int comp_set_error(int, long, char*); // установить ошибку в структуре int comp_get_metka(char* ); // считать метку из строки int comp_get_ident(char*, int ); // считать идентификатор из строки int comp_get_equ(char* , int ); // считать псевдооператор EQU из строки int comp_set_metka(char*, long, int); // установить метку в структуре metka int comp_set_ident(char*, long, int); // установить идентификатор в структуре ident int comp_get_oper(char*, int); // считать оператор из строки и произвести требуемые действия с mkbufp int comp_get_adres(char*, int, int); // считать адрес из строки (м.б. число или идентификатор) int comp_set_adres(char*, int, int); // считать и записать число-адрес z байт int comp_find_ident(char*); // возвращает номер записи с найденным значением int comp_find_metka(char*); // возвращает номер записи с найденным значением int comp_add_mkbufp(int); // устанавливает число в буфере программы // по текущему адресу с должными проверками int comp_set_base(char*, int, int); // добавление базы в структуру mbase (v0.23) int comp_get_text(char*, int); // считывает строку в comp_text int comp_set_text(void); // переносит строку из comp_text в mkbufp int comp_get_num(char*, int); // считать число из строки, м.б. метка или адрес, записать его в mkbufp int comp_get_num_hl(char*, int, int); // разбор NUMH NUML с v0.15 int comp_set_oper(char* ,int); // разбор одной мнемоники оператора с начала строки, // возврат - число параметров и т.д. // z-0 вернуть оператор если есть оканчивающийся в этом месте int comp_pass2(void); // второй проход - заменить метки в тексте программы re=0 OK re!=0 есть ошибки int comp_get_db(char*, int, int); // считать ряд чисел, перечисленных через запятую из строки до конца строки int comp_get_dbz(char*, int, int); // считать ряд из z чисел, перечисленных через запятую из строки (v0.27) int comp_get_dbb(char*, int, int); // считать ряд чисел как однобайтовое смещение // относительно базы .BASE (v0.23) int comp_get_dbbz(char*, int, int); // считать ряд из z чисел как однобайтовое смещение // относительно базы .BASE (v0.27) int comp_get_da(char*, int, int); // считать ряд чисел или меток 2 байта, // перечисленных через запятую из строки до конца строки // последний параметр - 0-все число, 1 - млчасть (%100), 2 - ст часть (/100) int comp_get_da1(char*, int, int); // считать ряд чисел или меток 2 байта - 1 шт // и удалить следующую запятую (v0.27) int comp_get_dd(char*, int, int); // считать ряд чисел или меток как DEC int comp_get_dw(char*, int, int); // считать ряд чисел или меток как HEX (v0.25) /*================================================================ ПРОГРАММА ================================*/ /*------------------------------------------- Вспомогательные ПП компиляции MKL -----*/ int comp_get_chislo (char* sss, int n) { int i,j,len; int flag_chislo, flag_hex; int osn_syst; // v0.31 char c; int re; // Считывание числа long d DEC или HEX из строки sss с позиции n // v0.31 - добавлены восьмеричная (o), четвертичная (q) троичная (t) и двоичная (b) системы. i=n; j=0; len=strlen(sss); //strupr(sss); comp_chislo=-1; flag_chislo=0; //flag_hex=0; osn_syst=10; // v0.31 m0: c=sss[i]; if ((c==0)||(c==';')||(c=='\r')||(c=='\n')) {if (flag_chislo==0) {re=0; goto end;} else {re=i; goto m1;} } if ((c=='H')||(c=='h')) { //flag_hex=1; osn_syst=16; re=i+1; goto m1; } /* v0.31 - другие системы */ if ((c=='D')||(c=='d')) { osn_syst=10; // разбор продолжается до пробела - это может быть шестнадцатиричное число re=i+1; } if ((c=='O')||(c=='o')) { osn_syst=8; re=i+1; goto m1; } if ((c=='Q')||(c=='q')) { osn_syst=4; re=i+1; goto m1; } if ((c=='T')||(c=='t')) { osn_syst=3; re=i+1; goto m1; } if ((c=='B')||(c=='b')) { osn_syst=2; re=i+1; // разбор продолжается до пробела - это может быть шестнадцатиричное число } /*--- end v0.31*/ if ((c==' ')||(c=='\t')) { if (flag_chislo!=0) {re=i; goto m1;} else { if (i='0')&&(c<='9')) || ((c>='A')&&(c<='F')) || ((c>='a')&&(c<='f'))) { temp[j]=c; if (j<255) j++; temp[j]=0; flag_chislo=1; if (i2) comp_chislo+=2; else goto err; break; case '3': if (osn_syst>3) comp_chislo+=3; else goto err; break; case '4': if (osn_syst>4) comp_chislo+=4; else goto err; break; case '5': if (osn_syst>5) comp_chislo+=5; else goto err; break; case '6': if (osn_syst>6) comp_chislo+=6; else goto err; break; case '7': if (osn_syst>7) comp_chislo+=7; else goto err; break; case '8': if (osn_syst>8) comp_chislo+=8; else goto err; break; case '9': if (osn_syst>9) comp_chislo+=9; else goto err; break; case 'a': case 'A': if (osn_syst>10) comp_chislo+=10; else goto err; break; case 'b': case 'B': if (osn_syst==2) break; // обработка двоичных чисел if (osn_syst>11) comp_chislo+=11; else goto err; break; case 'c': case 'C': if (osn_syst>12) comp_chislo+=12; else goto err; break; case 'd': case 'D': if (osn_syst==10) break; // обработка десятичных чисел if (osn_syst>13) comp_chislo+=13; else goto err; break; case 'e': case 'E': if (osn_syst>14) comp_chislo+=14; else goto err; break; case 'f': case 'F': if (osn_syst>15) comp_chislo+=15; else goto err; break; default: goto end; } } goto end; err: comp_set_error(8,comp_stroka,temp); // ошибка - неверное значение end: return(re); } /*----------------- установить ошибку ---------------*/ int comp_set_error(int n, long str, char* sss) { int re=0; long lv; if (mkerror.init==0) init_mkerror(); lv=mkerror.vsego; if (lv<1020) { mkerror.n[lv]=n; mkerror.stroka[lv]=str; if ((sss!=NULL)&&(strlen(sss)<38)) strcpy(mkerror.sss[lv],sss); else mkerror.sss[lv][0]=0; mkerror.vsego=lv+1; } else { lv=1020; mkerror.n[lv]=1; mkerror.stroka[lv]=0; mkerror.sss[lv][0]=0; mkerror.vsego=lv; } return(re); } /*----------------------------- считать метку из строки */ int comp_get_metka(char* sss) { int re=0; /* указателя смещения в строке нет, ибо подразумевается, что метка перехода всегда начинается с начала строки Возврат re=символ, следующий за последним разобранным (в данном случае ':') re<=0 - ошибка метка переносится в comp_metka */ int i,j,k; int err; char c; i=0; j=0; k=strlen(sss); comp_metka[0]=0; err=0; m1: c=sss[i]; if ((c==' ')&&(j==0)) goto m2; // игнорировать начальные пробелы if ( (c==0) || ((c==' ')&&(j!=0)) || ((c==':')&&(j==0)) ||(c=='\r')||(c=='\n')) { // недопустимое имя метки - метка пустая или непонятная ошибка разбора err=1; re=i; goto end; } if ( ((c>='0')&&(c<='9')&&(j==0)) ) { // недопустимое имя метки начинается с цифры err=1; } if (c==':') { // конец метки re-указатель на символ за двоеточием re=i+1; goto end; } if ( (c<'0') || ((c>'9')&&(c<'A')) || ((c>'Z')&&(c!='_')) ) { // недопустимое имя не те символы err=1; } if (j<32) { comp_metka[j]=c; j++; comp_metka[j]=0; } m2: i++; if (i=0) { comp_set_error(15,comp_stroka,sss); // ошибка - совпадение имени goto end; } i=comp_find_metka(sss); if (i>=0) { comp_set_error(13,comp_stroka,sss); // неправильное имя метки goto end; } // end of add v0.13 if (lv<9999) { strcpy(metka.name[lv],sss); metka.val[lv]=val; metka.stroka[lv]=comp_stroka; if ((val>=0)&&(val<10000)&&(use==1)) metka.use[lv]=1; // в поле val - значение метки м.б. ее адрес if ((val>=0)&&(val<10000)&&(use==2)) metka.use[lv]=2; // в поле val - адрес установки метки (заменить значением) if (use==0) metka.use[lv]=0; metka.vsego=lv+1; } else { comp_set_error(12,comp_stroka,""); // слишком много меток } end: return(re); } /*------------------------------ установить идентификатор в структуре */ int comp_set_ident(char* sss, long val, int use) { int re=0; int i; long lv; lv=ident.vsego; // v0.13 - поиск совпадения i=comp_find_metka(sss); if (i>=0) { comp_set_error(15,comp_stroka,sss); // ошибка - совпадение имени goto end; } i=comp_find_ident(sss); if (i>=0) { comp_set_error(4,comp_stroka,sss); // недопустимое имя идентификатора goto end; } // end of add v0.13 if (lv<9999) { strcpy(ident.name[lv],sss); ident.val[lv]=val; ident.stroka[lv]=comp_stroka; if ((val>=0)&&(val<=65535)&&(use==1)) ident.use[lv]=1; // в поле val - значение идентификатора по EQU // до v0.30 - (val<10000) // с v0.30 (val<=65535) if ((val>=0)&&(val<10000)&&(use==2)) ident.use[lv]=2; // в поле val - адрес установки идентификатора (заменить значением) if (use==0) ident.use[lv]=0; ident.vsego=lv+1; } else { comp_set_error(3,comp_stroka,""); // слишком много идентификаторов } end: return(re); } /*-------------------------------------------- FIND IDENT */ int comp_find_ident(char* sss) { int re=-1; int i,j; if (ident.vsego==0) goto end; if (strlen(sss)>32) sss[32]=0; for (i=0; i32) sss[32]=0; for (i=0; i='0')&&(c<='9')&&(j==0)) ) { // недопустимое имя идентификатора начинается с цифры err=1; re=0; } if ((c==0)||(c==' ')||(c==',')||(c==';')||(c=='\r')||(c=='\n')) // добавлена запятая для разбора DB и DA { // конец идентификатора re-указатель на символ re=i; goto end; } if ( (c<'0') || ((c>'9')&&(c<'A')) || ((c>'Z')&&(c!='_')) ) { // недопустимое имя не те символы err=1; re=0; } if (j<32) { comp_ident[j]=c; j++; comp_ident[j]=0; } m2: i++; if (i='0')&&(c<='9')&&(z>0)) { i1=comp_get_chislo(sss,i); if ((comp_chislo>=0)&&(comp_chislo<=9999)&&(i1>=i)) { re=i1; goto end; } else { if ((z==4)&&(comp_chislo>=0)&&(comp_chislo<=65535)&&(i1>=i)) // v0.30 для z==4 { re=i1; goto end; } else { sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(6, comp_stroka, ctemptoa); // недопустимый адрес re=i; goto end; } } } if (z<=1) { comp_set_error(6, comp_stroka,""); // недопустимый адрес re=i; goto end; } if ( ((c>='A')&&(c<='Z')) || (c=='_')) { i1=comp_get_ident(sss,i); if (i1>i) { // имя идентификатора или метки существует j=comp_find_ident(comp_ident); if ((j>=0)&&(j=0) && (ident.val[j]<10000) && ((ident.use[j] & 1)!=0)) { ident.use[j]|=2; // идентификатор использован в программе comp_chislo=ident.val[j]; // переместить адрес в comp_chislo re=i1; goto end; } else { // v0.30 для z==4 if ((z==4) && (ident.val[j]>=0) && (ident.val[j]<=65535) && ((ident.use[j] & 1)!=0)) { ident.use[j]|=2; // идентификатор использован в программе comp_chislo=ident.val[j]; // переместить адрес в comp_chislo re=i1; goto end; } else { sprintf(ctemptoa,"%d",ident.val[j]); comp_set_error(5, comp_stroka, ctemptoa); // недопустимое значение идентификатора re=i1; goto end; } } } if (z<=2) // метку не искать { comp_set_error(6, comp_stroka,""); // недопустимый адрес re=i; goto end; } j=comp_find_metka(comp_ident); if ((j>=0)&&(j=0) && (metka.val[j]<10000) && ((metka.use[j] & 1)!=0)) { metka.use[j]|=2; // метка использована в программе comp_chislo=metka.val[j]; // переместить адрес в comp_chislo re=i1; goto end; } else { sprintf(ctemptoa,"%d",metka.val[j]); comp_set_error(14, comp_stroka, ctemptoa); // недопустимое значение метки re=i1; goto end; } } else { comp_set_metka(comp_ident,comp_adres,2); // метка используется но не найдена } re=i1; } else { comp_set_error(4, comp_stroka,""); // недопустимое имя идентификатора re=i; } goto end; } end: return(re); } /*--------------------------------ADD_MKBUFP ----------------------- */ int comp_add_mkbufp(int x) { int re=0; if ((comp_adres>=0)&&(comp_adres<10000)) {mkbufp[comp_adres]=x; comp_adres++; } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } return(re); } /*-------------------------------- SET_BASE (v0.23) ----------------------- */ int comp_set_base(char* sss, int n, int z) { int re=0; int i,j; long l; if ((comp_adres>=0)&&(comp_adres<10000)) { comp_base=comp_adres; if (mbase.vsego<=0) goto m1; // пока нет баз // Поиск по структуре, если адрес уже есть - не добавлять j=0; for (i=0; i10000) mbase.vsego=10000; mbase.val[mbase.vsego]=comp_adres; mbase.stroka[mbase.vsego]=comp_stroka; mbase.vsego++; if (mbase.vsego<=1) goto end; // Упорядочить таблицу баз for (i=1; imbase.val[i]) { l=mbase.val[j]; mbase.val[j]=mbase.val[i]; mbase.val[i]=l; l=mbase.stroka[j]; mbase.stroka[j]=mbase.stroka[i]; mbase.stroka[i]=l; } } } } else {sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } end: re=n+5; return(re); } /*------------------------------- COMP ADRES ------------------*/ int comp_set_adres(char* sss, int n, int z) { // считать из строки и записать в программу адрес z 1 или 2 байт // z==3 или 4 - соответственно номер регистра памяти 1 или 2 байт // z==5 или 6 - вставить адрес из comp_chislo - один или два байта // (вставить с учетом comp_adres) // v0.16 // z==7 - вставить адрес из comp_chislo - один байт без проверки comp_adres (код) // v0.18 // z==8 - вставить адрес из comp_chislo - один байт без проверки comp_adres (DEC) // z==9 - вставить адрес из comp_chislo - два байта без проверки comp_adres (DEC) // v0.25 // z==10 - вставить число из comp_chislo - два байта без проверки (HEX) // v0.36 // z==11 - вставить адрес из comp_chislo - один байт без проверки comp_adres (BCD) // z==12 - вставить адрес из comp_chislo - два байта без проверки comp_adres (BCD) int i,j,k,k1,pa,pch; int re=0; if ((z>=1)&&(z<=4)) comp_chislo=-1; if ((z==1)||(z==2)) { i=comp_get_adres(sss,n,3); if (comp_chislo<0) { // значение метки не обнаружено // оставить на второй проход, а пока вставить временное значение в mkbufp, // в структуру metka метка уже д.б. вставлена с use=2 if (z==1) { comp_add_mkbufp(comp_const+513); // metka z=1 } if (z==2) { comp_add_mkbufp(comp_const+514); // метка 2 байта comp_add_mkbufp(comp_const+512); // байт не используется } re=i; goto end; } } if ((z==3)||(z==4)) { i=comp_get_adres(sss,n,2); // только число или идентификатор if (comp_chislo<0) { comp_add_mkbufp(comp_const+515); // неверное значение if (z==4) comp_add_mkbufp(comp_const+512); // не используется comp_set_error(7,comp_stroka,""); // значение идентификатора не определено re=i; goto end; } } if ((z==5)||(z==6)||(z==7)||(z==8)||(z==9)||(z==10)||(z==11)||(z==12)) // z==7 - v0.16 z==8,9 - v0.18 z==10 v0.25 z==11,12 v0.36 { // подставить фиктивное значение i i=n+1; if (comp_chislo<0) { // неверное значение comp_set_error(7,comp_stroka,""); // значение идентификатора не определено re=i; goto end; } } if ((z==1)||(z==5)) { // адрес 1 байт if (comp_flag_adres==0) j=100; else j=166; if ((z==1)&&(i<=n)) { comp_add_mkbufp(comp_const+515); comp_set_error(8,comp_stroka,""); // неверное значение re=n; goto end; } pa=comp_adres/100; pch=comp_chislo/100; if (pa==pch) { // вставить на той же странице k=comp_chislo%100; k=16*(k/10)+(k%10); // преобразовать в BCD comp_add_mkbufp(k); re=i; goto end; } k=comp_chislo-100*pa; // расстояние от начала текущей страницы if ((pa==pch-1) && (k>=100)&&(k=100)&&(k<160)) k=16*(k/10)+(k%10); // преобразовать в BCD else // v0.32 - исправлена ошибка { if ((k>=160)&&(k<166)) k+=90; // k=240+(k-150); else comp_set_error(6,comp_stroka,""); // неверный адрес } comp_add_mkbufp(k); re=i; goto end; } comp_add_mkbufp(comp_const+515); comp_set_error(6,comp_stroka,""); // неверный адрес re=i; goto end; } // end z==1, 5 if (z==7) { //v0.16 k=comp_chislo%100; k=16*(k/10)+(k%10); // преобразовать в BCD comp_add_mkbufp(k); //comp_add_mkbufp(k+256); // v0.36 испр. ошибки .DAH, .DAL (признак данных для z==7) re=i; goto end; } if (z==8) { //v0.18 k=comp_chislo%256; // не преобразовывать в BCD comp_add_mkbufp(k+256); re=i; goto end; } if (z==9) { //v0.18 k=comp_chislo/100; // не преобразовывать в BCD comp_add_mkbufp(k+256); k=comp_chislo%100; // не преобразовывать в BCD comp_add_mkbufp(k+256); re=i; goto end; } if (z==10) { //v0.25 k=comp_chislo/256; // HEX ст. comp_add_mkbufp(k+256); k=comp_chislo%256; // HEX мл. comp_add_mkbufp(k+256); re=i; goto end; } if (z==11) { //v0.36 k=comp_chislo%100; k=16*(k/10)+(k%10); // преобразовать в BCD comp_add_mkbufp(k+256); // v0.36 испр. ошибки .DAH,.DAL re=i; goto end; } if (z==3) { // номер регистра памяти if (comp_flag_adres==0) j=100; else j=166; if ((i<=n)||(comp_chislo<0)||(comp_chislo>=j)) { comp_add_mkbufp(comp_const+515); comp_set_error(8,comp_stroka,""); // неверное значение re=n; goto end; } k=comp_chislo; if ((k>=0)&&(k<160)) k=16*(k/10)+(k%10); // преобразовать в BCD if ((k>=160)&&(k<166)) k+=90; // k=240+(k-150); comp_add_mkbufp(k); re=i; goto end; } // end z==3 if ((z==2)||(z==4)||(z==6)) { // адрес или номер регистра всегда только десятичный // при z==6 i=n+1 if ((i>n)&&(comp_chislo>=0)&&(comp_chislo<10000)) { k=comp_chislo/100; k1=k; k=16*(k/10)+(k%10); // преобразовать в BCD comp_add_mkbufp(k); //if (z==6) comp_add_mkbufp(k+256); else comp_add_mkbufp(k); // v0.36 испр. ошибки .DA (признак данных для z==6) if (comp_flag_opt2!=0) { // предупреждения v0.29 if ((k1==0)&&(z==4)) { // регистр sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(mkerror.w+5,comp_stroka,ctemptoa); } if ((k1==(comp_adres/100))&&(z==2)) { // адрес sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(mkerror.w+1,comp_stroka,ctemptoa); } } k=comp_chislo%100; k=16*(k/10)+(k%10); // преобразовать в BCD comp_add_mkbufp(k); //if (z==6) comp_add_mkbufp(k+256); else comp_add_mkbufp(k); // v0.36 испр. ошибки .DA (признак данных для z==6) re=i; goto end; } else { if (z!=6) {comp_add_mkbufp(comp_const+515); comp_add_mkbufp(comp_const+512); } sprintf(ctemptoa,"%d",comp_chislo); if (z==2) comp_set_error(8,comp_stroka, ctemptoa); // неверное значение else comp_set_error(6,comp_stroka, ctemptoa); // неверный адрес re=n; goto end; } } // end z==2, 4, 6 if (z==12) { // v0.36 // адрес или номер регистра всегда только десятичный if ((i>n)&&(comp_chislo>=0)&&(comp_chislo<10000)) { k=comp_chislo/100; k1=k; k=16*(k/10)+(k%10); // преобразовать в BCD comp_add_mkbufp(k+256); // v0.36 испр. ошибки .DA (признак данных) k=comp_chislo%100; k=16*(k/10)+(k%10); // преобразовать в BCD comp_add_mkbufp(k+256); // v0.36 испр. ошибки .DA (признак данных) re=i; goto end; } else { comp_add_mkbufp(comp_const+515); comp_add_mkbufp(comp_const+512); sprintf(ctemptoa,"%d",comp_chislo); if (z==2) comp_set_error(8,comp_stroka, ctemptoa); // неверное значение else comp_set_error(6,comp_stroka, ctemptoa); // неверный адрес re=n; goto end; } } // end z==12 end: return(re); } /*------------------------- GET DB --------------------*/ int comp_get_db(char* sss, int n, int z) { int i,i1,j,k; char c; // v0.23 (v1.18 mk.exe) для sss[] int m; // v0.23 (v1.18 mk.exe) флаг наличия символа int re=0; // считать из строки и записать в программу ряд чисел или идентификаторов // через запятую отсюда и до конца строки // z = по 1 или 2 байт - не используется см. comp_get_da i=n; k=strlen(sss); m1: j=comp_get_adres(sss,i,3); if ((j>i)&&(comp_chislo>=0)&&(comp_chislo<256)) { if ((comp_adres>=0)&&(comp_adres<10000)) { comp_add_mkbufp(comp_chislo+256); // v +256 - HEX } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } else { sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(8,comp_stroka,ctemptoa); // неверное значение } if ((j<=0)||(j<=n)) { re=j; // ошибка или конец goto end; } // v0.23 (v1.18 mk.exe) - проверка наличия чего-либо до конца строки или комментария m=0; for (i1=j; i1i)&&(comp_chislo>=0)&&(comp_chislo<256)) { if ((comp_adres>=0)&&(comp_adres<10000)) { comp_add_mkbufp(comp_chislo+256); // v +256 - HEX } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } else { sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(8,comp_stroka,ctemptoa); // неверное значение } z--; if ((j<=0)||(j<=n)) { re=j; // ошибка или конец goto end; } // проверка наличия чего-либо до конца строки или комментария m=0; for (i1=j; i10) { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(10,comp_stroka,ctemptoa); // нет требуемого количества параметров } goto end; // нет в конце ничего } for (i1=j; i10) { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(10,comp_stroka,ctemptoa); // нет требуемого количества параметров } re=0; goto end; } } // затычка re=0; end: return(re); } /*------------------------- GET DBB v0.23 (v1.18 mk.exe) --------------------*/ int comp_get_dbb(char* sss, int n, int z) { int i,i1,j,k; int i2; char c; int m; int re=0; // считать из строки и записать в программу ряд чисел или идентификаторов // через запятую отсюда и до конца строки // из числа вычесть базу установленную по .BASE // z - не используется i=n; k=strlen(sss); m1: j=comp_get_adres(sss,i,3); // считать число, метку или т.п. if ((j>i)&&(comp_chislo>=0)&&(comp_chislo<10000)) { if ((comp_adres>=0)&&(comp_adres<10000)) { i2=comp_chislo-comp_base; // вычитание базы if ((i2>=0)&&(i2<256)) comp_add_mkbufp(i2+256); // HEX else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(8,comp_stroka,ctemptoa); } } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } else { if (j>i) { // метка уже в структуре после comp_get_adres comp_add_mkbufp(comp_const+526); // 526 метка с базой } else {sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(8,comp_stroka,ctemptoa); // неверное значение } } if ((j<=0)||(j<=n)) { re=j; // ошибка или конец goto end; } m=0; for (i1=j; i1i)&&(comp_chislo>=0)&&(comp_chislo<10000)) { if ((comp_adres>=0)&&(comp_adres<10000)) { i2=comp_chislo-comp_base; // вычитание базы if ((i2>=0)&&(i2<256)) comp_add_mkbufp(i2+256); // HEX else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(8,comp_stroka,ctemptoa); } } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } else { if (j>i) { // метка уже в структуре после comp_get_adres comp_add_mkbufp(comp_const+526); // 526 метка с базой } else {sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(8,comp_stroka,ctemptoa); // неверное значение } } if ((j<=0)||(j<=n)) { re=j; // ошибка или конец goto end; } m=0; for (i1=j; i10) { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(10,comp_stroka,ctemptoa); // нет требуемого количества параметров } goto end; // нет в конце ничего } for (i1=j; i10) { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(10,comp_stroka,ctemptoa); // нет требуемого количества параметров } re=0; goto end; } } re=0; end: return(re); } /*------------------------- GET DА --------------------*/ int comp_get_da(char* sss, int n, int z) { int i,i1,j,k; int i2; // v0.18 char c; // v0.23 (v1.18 mk.exe) int m; // v0.23 (v1.18 mk.exe) int re=0; // считать из строки и записать в программу ряд чисел, меток или идентификаторов // через запятую отсюда и до конца строки и записать в программу как адреса // z = 0 - 2 байта, =1 - мл часть =2 - ст. часть числа i=n; k=strlen(sss); m1: j=comp_get_adres(sss,i,3); // считать число, метку или т.п. if ((j>i)&&(comp_chislo>=0)&&(comp_chislo<10000)) { if ((z==0)||(z==2)) { if ((comp_adres>=0)&&(comp_adres<10000)) { i2=comp_chislo/100; i2=(16*(i2/10)+(i2%10))%256; // v0.18 - BCD //comp_add_mkbufp(comp_chislo/100+256); // ст. часть адреса +256=HEX v0.15 comp_add_mkbufp(i2+256); //v0.18 } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } if ((z==0)||(z==1)) { if ((comp_adres>=0)&&(comp_adres<10000)) { i2=comp_chislo%100; i2=(16*(i2/10)+(i2%10))%256; // v0.18 - BCD //comp_add_mkbufp(comp_chislo%100+256); // мл. часть адреса +256=HEX v0.15 comp_add_mkbufp(i2+256); //v0.18 } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } } else { // v 0.15 - добавить разбор метки не определенной к моменту использования if ((j>i)&&(z>=0)&&(z<=2)) { // метка уже в структуре после comp_get_adres if (z==0) { comp_add_mkbufp(comp_const+531); // v0.36 (514 -> 531) comp_add_mkbufp(comp_const+512); } if (z==1) { //comp_add_mkbufp(513); до v0.18 comp_add_mkbufp(comp_const+533); //v0.18 - 1 байт BCD v0.36 524->533 } if (z==2) { comp_add_mkbufp(comp_const+532); // метка - ст часть v0.36 520 -> 532 } } else {sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(8,comp_stroka,ctemptoa); // неверное значение } } if ((j<=0)||(j<=n)) { re=j; // ошибка или конец goto end; } // v0.23 (v1.18 mk.exe) - проверка наличия чего-либо до конца строки или комментария m=0; for (i1=j; i1i)&&(comp_chislo>=0)&&(comp_chislo<10000)) { if ((z==0)||(z==2)) { if ((comp_adres>=0)&&(comp_adres<10000)) { i2=comp_chislo/100; i2=(16*(i2/10)+(i2%10))%256; // v0.18 - BCD comp_add_mkbufp(i2+256); } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } if ((z==0)||(z==1)) { if ((comp_adres>=0)&&(comp_adres<10000)) { i2=comp_chislo%100; i2=(16*(i2/10)+(i2%10))%256; // v0.18 - BCD comp_add_mkbufp(i2+256); } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } } else { // v 0.15 - добавить разбор метки не определенной к моменту использования if ((j>i)&&(z>=0)&&(z<=2)) { // метка уже в структуре после comp_get_adres if (z==0) { comp_add_mkbufp(comp_const+531); // v0.36 (514 -> 531) comp_add_mkbufp(comp_const+512); } if (z==1) { comp_add_mkbufp(comp_const+533); //v0.18 - 1 байт BCD v0.36 (524 -> 533) } if (z==2) { comp_add_mkbufp(comp_const+532); // метка - ст часть v0.36 (520 -> 532) } } else {sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(8,comp_stroka,ctemptoa); // неверное значение } } if ((j<=0)||(j<=n)) { re=j; // ошибка или конец goto end; } // v0.23 (v1.18 mk.exe) - проверка наличия чего-либо до конца строки или комментария m=0; for (i1=j; i1255)) ic=0; if (c=='"') { if (flag_text==0) {flag_text=1; goto next_i;} // начало текста if ((flag_text!=0)&&(flag_slash==0)) {re=i+1; goto end;} // конец текста if ((flag_text!=0)&&(flag_slash!=0)) { // кавычки внутри текста flag_slash=0; comp_text[j]='"'; goto next_j; // код символа '"' (кавычка) } } if ((c==0)||(c=='\r')||(c=='\n')|| ((flag_text==0)&&(c==';')) ) { comp_text[0]=0; // удалить все comp_set_error(mkerror.w+2,comp_stroka,""); // текст отсутствует re=i; goto end; // обрыв строки } if (flag_text==0) goto next_i; if ((ic==0x5C)&&(flag_text!=0)) { if (flag_slash==0) { flag_slash=1; goto next_i; } else { flag_slash=0; comp_text[j]=(char)0x5C; // код символа '\' } } if (ic<=32) { // служебные символы comp_text[j]=' '; goto next_j; } if (flag_slash!=0) { // возврат каретки, перевод строки и табуляция if (c=='r') comp_text[j]=13; if (c=='n') comp_text[j]=10; if (c=='t') comp_text[j]=9; if (c=='0') comp_text[j]=3; // символ 3 ETX заменяет 0 при разборе flag_slash=0; goto next_j; } if ((ic>32)&&(ic<128)) { // ASCII comp_text[j]=c; // перекодировка не требуется goto next_j; } if ((ic>=128)&&(ic<256)) { if (comp_charset==866) {comp_text[j]=c; // перекодировка не требуется goto next_j; } if (comp_charset==1251) { // Win 2 DOS if ((ic>=192)&&(ic<240)) {ic-=64; comp_text[j]=(char)ic; goto next_j;} if (ic>=240) {ic-=16; comp_text[j]=(char)ic; goto next_j;} if (ic==168) {ic=240; comp_text[j]=(char)ic; goto next_j;} // Ё - v1.19 if (ic==184) {ic=241; comp_text[j]=(char)ic; goto next_j;} // ё - v1.19 ic=32; comp_text[j]=(char)ic; goto next_j; } comp_text[j]=c; // если charset не определен перекодировка не делается goto next_j; } next_j: if (j<255) j++; comp_text[j]=0; next_i: i++; if (i255)) ic=0; // символ 3 ETX заменяет 0 //comp_add_mkbufp(ic+256); // До v0.21 перенести символ в программу +256=HEX comp_add_mkbufp(ic+512); // С v0.21 перенести символ в программу +512=TEXT } return(re); } /*-------------------------- COMP_STRUPR -----------*/ int comp_strupr(void) { // strupr для ctemp с учетом специфики строки программы // т.е. не трогать текст и комментарии int re=0; int i,ic,k; int flag_k, flag_tz, flag_s; char c; flag_k=0; // кавычки flag_tz=0; // точка с запятой flag_s=0; // слэш k=strlen(ctemp); i=0; m1: c=ctemp[i]; ic=(int)c; if (ic<0) ic+=256; if ((ic<0)||(ic>255)) ic=0; if (ic==0) goto end; if ((c=='"')&&(flag_s==0)) { if (flag_k==0) flag_k=1; else flag_k=0; } if ((c==';')&&(flag_k==0)) { flag_tz=1; } if ((ic==0x5C)&&(flag_k!=0)) { if (flag_s==0) flag_s=1; else flag_s=0; } else flag_s=0; if ((c>='a')&&(c<='z')&&(flag_k==0)&&(flag_tz==0)) ctemp[i]=(char)(ic-32); // a-z преобразовать в A-Z если не в кавычках и не в комментариях if (i'9')) && (c!='-') && (c!=',') && (c!='.')) { flag_metka=1; re=i; goto m2; // разбор метки или идентификатора } if ( ((c>='0')&&(c<='9')) || ((c>='A')&&(c<='F')) || (c=='-') ||(c==',') ||(c=='.')) { if (c=='-') { if (flag_zap==1) flag_eeminus=1; else flag_minus=1; } if ((c==',')||(c=='.')) flag_zap=1; if ((c>='0')&&(c<='9')) flag_chislo=1; temp[j]=c; j++; temp[j]=0; if (i9999) { // недопустимый адрес sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(6,comp_stroka,ctemptoa); comp_add_mkbufp(comp_const+517); // ошибка числа-адреса в RX comp_add_mkbufp(comp_const+512); // метка 2 байта comp_add_mkbufp(comp_const+512); // байт не используется comp_add_mkbufp(comp_const+512); // байт не используется re=i; goto end; } // comp_chislo>=0 <=9999 // записать число в программу j=comp_chislo; j1=(j/1000)%10; if (j1!=0) comp_add_mkbufp(j1); j%=1000; j2=(j/100)%10; if ((j1!=0)||(j2!=0)) comp_add_mkbufp(j2); j%=100; j3=(j/10)%10; if ((j1!=0)||(j2!=0)||(j3!=0)) comp_add_mkbufp(j3); j%=10; comp_add_mkbufp(j%10); // ноль тоже записать re=i; goto end; end: return(re); } /*----------------------------------------------------------------- v0.15, изм v0.21 ---*/ int comp_get_num_hl(char* sss, int n, int z) { int i,j; int j0,j1,j2,j3; // j0 - v0.35 int re=0; // разбор псевдооператора NUMH (при z=1) и NUML (z=0) // разбор псевдооператора NUMT (при z=2) - v0.21 // разбор псевдооператоров NUMD (при z=3) и NUMI (z=4) - v0.24 comp_chislo=-1; i=comp_get_adres(sss,n,3); // =3 число идентификатор или метка if (i<=n) { comp_set_error(7,comp_stroka,""); // значение идентификатора не определено re=n; goto end; } if (comp_chislo<0) { // значение метки не обнаружено // оставить на второй проход, а пока вставить временное значение в mkbufp, // в структуру metka метка уже д.б. вставлена с use=2 if (z==3) { comp_add_mkbufp(comp_const+527); // С v0.24 число-адрес с декрементом NUMD comp_add_mkbufp(comp_const+512); comp_add_mkbufp(comp_const+512); } if (z==4) { comp_add_mkbufp(comp_const+528); // С v0.24 число-адрес с инкрементом NUMI comp_add_mkbufp(comp_const+512); comp_add_mkbufp(comp_const+512); } if (z==2) { comp_add_mkbufp(comp_const+525); // С v0.21 число-адрес 3 байта в RX comp_add_mkbufp(comp_const+512); } if (z==1) comp_add_mkbufp(comp_const+518); // число-адрес в RX if (z==0) comp_add_mkbufp(comp_const+519); if ((z!=0) && (z!=1) && (z!=2)) comp_add_mkbufp(comp_const+517); //ошибка в z comp_add_mkbufp(comp_const+512); // метка 2 байта при z==0 или 1 // v0.21 - 3 байта при z==2 re=i; goto end; } if (comp_chislo>9999) { // недопустимый адрес sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(6,comp_stroka,ctemptoa); comp_add_mkbufp(comp_const+517); // ошибка числа-адреса в RX comp_add_mkbufp(comp_const+512); // метка 2 байта re=i; goto end; } // comp_chislo>=0 <=9999 // записать число в программу if ((z==0)||(z==1)) // v0.21 { j=comp_chislo; j1=(j/1000)%10; if ((j1!=0)&&(z==1)) comp_add_mkbufp(j1); j%=1000; j2=(j/100)%10; if (z==1) comp_add_mkbufp(j2); // ноль тоже записать NUMH z==1 j%=100; j3=(j/10)%10; if ((j3!=0)&& (z==0)) comp_add_mkbufp(j3); j%=10; if (z==0) comp_add_mkbufp(j%10); // ноль тоже записать NUML z==0 re=i; goto end; } if (z==2) // добавлено с v0.21 - 3 или 4 байта { j=comp_chislo; j0=(j/1000)%10; if (j0!=0) {comp_add_mkbufp(j0); // записать тысячи, если они всё же есть // и выдать предупреждение W003 sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(mkerror.w+3,comp_stroka,ctemptoa); } j%=1000; j1=(j/100)%10; if ((j0!=0)||(j1!=0)) comp_add_mkbufp(j1); // v0.35 - устранение ошибки j%=100; j2=(j/10)%10; if ((j0!=0)||(j1!=0)||(j2!=0)) comp_add_mkbufp(j2); // v0.34, v0.35 - устранение ошибки j%=10; comp_add_mkbufp(j); // ноль тоже записать re=i; goto end; } if ((z==3)||(z==4)) { // v0.24 - NUMD и NUMI j=comp_chislo; if (z==3) j--; if (z==4) j++; if ((j<0)||(j>9999)) { sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(6,comp_stroka,ctemptoa); comp_add_mkbufp(comp_const+517); // ошибка числа-адреса в RX comp_add_mkbufp(comp_const+512); // метка 2 байта re=i; goto end; } j1=(j/1000)%10; if (j1!=0) comp_add_mkbufp(j1); j%=1000; j2=(j/100)%10; if ((j1!=0)||(j2!=0)) comp_add_mkbufp(j2); j%=100; j3=(j/10)%10; if ((j1!=0)||(j2!=0)||(j3!=0)) comp_add_mkbufp(j3); j%=10; comp_add_mkbufp(j%10); // ноль тоже записать re=i; goto end; } end: return(re); } /*-----------------------------------*/ int comp_set_oper(char* sss, int z) { // принимает и разбирает мнемонику одного оператора начиная с начала строки // z=0 - если есть оканчивающийся в этом месте оператор из нескольких (например +/- и +) то вставить его // z=1 - не разрыв и не конец строки int re=-1; // -2: ошибка нет такого оператора // -1: возможны варианты - продолжить разбор // 0: оператор разобран параметров нет // 1-4: есть дополнительные параметры // 1,2 - адрес 1 или 2 байта, // 3,4 - номер регистра 1 или 2 байта. int i,j,k,len,noper,ioper; int flag_sovp; len=strlen(sss); // инициализация if (mkkom.init==0) init_mkkom(); noper=0; // число найденных операторов ioper=0; // поиск в таблице на точное совпадение при z==0 if (z==0) { for (i=0; i<256; i++) { k=strlen(mkkom.name2[i]); if (k==len) { flag_sovp=1; for (j=0; j=0)&&(ioper<=255)) { // вставить найденный оператор comp_add_mkbufp(ioper); re=mkkom.par[ioper]; goto end; } re=-1; goto end; } // end z==0 // поиск в таблице на совпадение при z=1 (может быть несколько совпадений) for (i=0; i<256; i++) { k=strlen(mkkom.name2[i]); if (k>=len) { // более короткие операторы не проверять flag_sovp=1; for (j=0; j=0)&&(ioper<=255)) { // одно точное совпадение // вставить найденный оператор comp_add_mkbufp(ioper); re=mkkom.par[ioper]; goto end; } if (noper>1) {re=-1; goto end;} // более одного совпадения if (noper==0) {re=-2; goto end;} // нет совпадений end: return(re); } /*-----------------------------------*/ int comp_get_oper(char* sss, int n) { int i,i1,j,k; int re=0; // Считывание оператора из строки sss с позиции n // Заполнение структур metka и массива mkbufp[] // Оператор - {пусто | псевдооператор | оператор} [м.б. адрес] // Адрес - {число от 0 до 9999 (или шестнадцатиричное) | идентификатор} int flag_oper; char c; char temp[256]; flag_oper=0; k=strlen(sss); if ((sss[n]==' ')||(sss[n]=='\t')) { // пусто re=n+1; goto end; } if (sss[n]=='.') { // псевдооператор /* .END конец программы .EQU устанавливает значение идентификатора равное числу (здесь игнорировать оба, уже разобрано!) .CHARSET число 866 1251 влияет на разбор текста .TEXT содержимое в comp_charset .DB число 0-255 .DA число 0-9999 (или FFFF=16665 при comp_flag_adres!=0) BCD адрес 2 байта старший /100 младший %100 .DAH только старшая часть адреса 1 байт .DAL только младшая часть адреса 1 байт .DD число 0-9999 в десятичном виде по байтам v0.18 .DDH старшая часть - байт = /100 v0.18 .DDL младшая часть - байт = %100 v0.18 .TEXT "строка" в т ч \n \r \t \\ \" .NUM вставляет число или адрес метки в программу в виде числа в RX .NUMH старшая часть числа или адреса (номер страницы) в RX (с v0.15) .NUML младшая часть числа или адреса в RX (с v0.15) .NUMT число или адрес от 0 до 999 в RX (с v0.21) .NUMD и .NUMI число или адрес в RX а декрементом и инкрементом (с v0.24) .ORG число 0-9999 или определенный ранее идентификатор .PAGE = ORG с новой страницы кратной 100 .OPT число 0-нет, 1 (бит0) -использовать шестн адреса, &2 (бит1) - предупреждения оптимизации .BASE - установка текущего адреса как базы для вычисления смещения в .DBB (v0.23) .DBB - смещение 0-255 относительно базы (вставляется метка-база), можно через запятую (v0.23) .DW - число или адрес 2 байта HEX ст-мл (v0.25) .DWB - адрес по базе 2 байта HEX ст-мл (v0.25) .FORM - форма ГИ == .BASE + DB + 7*DBB (v0.27) .TAB - нач позиция == .DB 96 + 2*DB (v0.27) .LDX - позиция по X из регистра == .DB 104 + DA1 (v0.27) .LDY - позиция по Y из регистра == .DB 105 + DA1 (v0.27) .TYPE - шрифт == .DB 101 + DB .ATYPE .LDADR .SQU .FRAME .DRAWP (.DRAWR) .DRAWB .TXTP .TXTB .TXTK .PREXP .PRFORM .PRHEX .MCALL .RETUM .LCALL .RETUL .JNEZ .JM .END - сейчас вставляет 0xFF (255) - старая команда .ENDP */ if (n+7n+8) { if (comp_chislo==866) comp_charset=866; if (comp_chislo==1251) comp_charset=1251; if ((comp_chislo!=866)&&(comp_chislo!=1251)) { // значение charset не определено sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(8,comp_stroka,ctemptoa); // неверное значение } re=i; goto end; } else { comp_set_error(8,comp_stroka,""); // неверное значение re=n+8; goto end; } } // end .CHARSET } // end len 7 if (n+6=0)&&(j<10000)&&(j%100==0)) { if (metka.vsego>0) { if ((metka.val[metka.vsego-1]==comp_adres)&&((metka.use[metka.vsego-1]&1)!=0) ) { // если последняя установленная метка существует // и указывает на ORG - заменить ее значение metka.val[metka.vsego-1]=j; } } comp_adres=j; // заменить счетчик адреса } else { sprintf(ctemptoa,"%d",j); comp_set_error(6,comp_stroka,ctemptoa); // недопустимый адрес } re=n+5; goto end; } // end .PAGE if ((sss[n+1]=='T')&&(sss[n+2]=='E')&&(sss[n+3]=='X')&&(sss[n+4]=='T')) { // .TEXT re=comp_get_text(sss,n+5); comp_set_text(); goto end; } // end .TEXT // NUMH и NUML введены с версии 0.15 if ((sss[n+1]=='N')&&(sss[n+2]=='U')&&(sss[n+3]=='M')&&(sss[n+4]=='H')) { // .NUMH re=comp_get_num_hl(sss,n+5,1); // z==1 - NUMH goto end; } // end .NUMH if ((sss[n+1]=='N')&&(sss[n+2]=='U')&&(sss[n+3]=='M')&&(sss[n+4]=='L')) { // .NUML re=comp_get_num_hl(sss,n+5,0); // z==0 - NUML goto end; } // end .NUML // NUMT введен с версии 0.21 if ((sss[n+1]=='N')&&(sss[n+2]=='U')&&(sss[n+3]=='M')&&(sss[n+4]=='T')) { // .NUMT re=comp_get_num_hl(sss,n+5,2); // z==2 - NUMT goto end; } // end .NUMT if ((sss[n+1]=='B')&&(sss[n+2]=='A')&&(sss[n+3]=='S')&&(sss[n+4]=='E')) { // .BASE (v0.23) re=comp_set_base(sss,n+5,0); // z==0 goto end; } // end .BASE // NUMD и NUMI введены с версии v0.24 if ((sss[n+1]=='N')&&(sss[n+2]=='U')&&(sss[n+3]=='M')&&(sss[n+4]=='D')) { // .NUMD re=comp_get_num_hl(sss,n+5,3); // z==3 - NUMD goto end; } // end .NUMD if ((sss[n+1]=='N')&&(sss[n+2]=='U')&&(sss[n+3]=='M')&&(sss[n+4]=='I')) { // .NUMI re=comp_get_num_hl(sss,n+5,4); // z==4 - NUMI goto end; } // end .NUMI // v0.27 - операторы ГИ if ((sss[n+1]=='F')&&(sss[n+2]=='O')&&(sss[n+3]=='R')&&(sss[n+4]=='M')) { // .FORM v0.27 re=comp_set_base(sss,n+5,0); // z==0 if (re<=0) goto end; re=comp_get_dbz(sss,n+5,1); // считать байт, параметр z - количество байт =1 if (re<=0) goto end; i=re; re=comp_get_dbbz(sss,i,7); // считать смещения по уст. базе, параметр z - количество байт =7 goto end; } // end .FORM if ((sss[n+1]=='T')&&(sss[n+2]=='Y')&&(sss[n+3]=='P')&&(sss[n+4]=='E')) { // .TYPE v0.27 comp_add_mkbufp(357); // = 101 (TYPE) + 256 (HEX) re=comp_get_dbz(sss,n+5,1); // считать байт, параметр z - количество байт =1 goto end; } // end .TYPE if ((sss[n+1]=='T')&&(sss[n+2]=='X')&&(sss[n+3]=='T')&&(sss[n+4]=='P')) { // .TXTP v0.27 comp_add_mkbufp(339); // = 83 (TXTP) + 256 (HEX) re=comp_get_dbz(sss,n+5,1); // считать 1 байт атрибутов i=re; if (i<=0) goto end; re=comp_get_da1(sss,i,0); // считать 1 адрес BCD, параметр z=0 goto end; } // end .TXTP if ((sss[n+1]=='T')&&(sss[n+2]=='X')&&(sss[n+3]=='T')&&(sss[n+4]=='B')) { // .TXTB v0.27 comp_add_mkbufp(341); // = 85 (TXTB) + 256 (HEX) re=comp_get_dbz(sss,n+5,1); // считать 1 байт атрибутов i=re; if (i<=0) goto end; re=comp_get_da1(sss,i,0); // считать 1 адрес BCD, параметр z=0 goto end; } // end .TXTB if ((sss[n+1]=='T')&&(sss[n+2]=='X')&&(sss[n+3]=='T')&&(sss[n+4]=='K')) { // .TXTK v0.27 comp_add_mkbufp(343); // = 87 (TXTK) + 256 (HEX) re=comp_get_dbz(sss,n+5,1); // считать 1 байт атрибутов i=re; if (i<=0) goto end; re=comp_get_da1(sss,i,0); // считать 1 адрес BCD, параметр z=0 goto end; } // end .TXTK if ((sss[n+1]=='J')&&(sss[n+2]=='N')&&(sss[n+3]=='E')&&(sss[n+4]=='Z')) { // .JNEZ v0.27 comp_add_mkbufp(257); // = 1 (JNEZ) + 256 (HEX) re=comp_get_da1(sss,n+5,0); // считать 1 адрес BCD, параметр z=0 i=re; if (i<=0) goto end; re=comp_get_dbbz(sss,i,1); // считать 1 байт смещение goto end; } // end .JNEZ if ((sss[n+1]=='E')&&(sss[n+2]=='N')&&(sss[n+3]=='D')&&(sss[n+4]=='P')) { // .ENDP v0.27 re=n+5; // пока - игнорировать goto end; } // end .ENDP } // end len 4 if (n+3n+4)&&(comp_chislo>=0)&&(comp_chislo<=9999)) { // проверить существование метки указывающей на адрес до изменения if (metka.vsego>0) { if ((metka.val[metka.vsego-1]==comp_adres)&&((metka.use[metka.vsego-1]&1)!=0) ) { // если последняя установленная метка существует // и указывает на ORG - заменить ее значение metka.val[metka.vsego-1]=comp_chislo; } } comp_adres=comp_chislo; // заменить счетчик адреса } else { sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(6,comp_stroka,ctemptoa); // недопустимый адрес if (i0) comp_set_error(10,comp_stroka,temp); // отсутствуют параметры оператора // если i1==0 - оператор опознан параметров нет } re=i; goto end; } if (((c==' ')||(c=='\t')) && (flag_oper==0)) {if (i=0)) goto m01; // завершить разбор оператора // иначе (i1==-1) продолжить if (i1) { temp[j-1]=0; i1=comp_set_oper(temp,0); // и считать это концом оператора if ((i1>=0)&&(i>1)) {i-=2; goto m02;} // а так все нормально, значит снять символ и продолжить разбор c текущего } comp_set_error(9,comp_stroka,temp); // иначе неопознан оператор if (i0)&&(i1<5)) { // оператор опознан и успешно разобран в i1 признак наличия адреса или номера регистра // 0-нет, 1-адрес 1 байт, 2 - адрес 2 б, 3 - регистр 1 б, 4 - регистр 2 б if (i=5 непонятно что это, но выйдем корректно if (i=0)&&(j=metka.vsego)) { // ошибка - метка не определена comp_set_error(11,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } // иначе вставить в программу значение метки comp_stroka=metka.stroka[k]; comp_adres=i; //v0.16 if ((j==513)||(j==514)) { // как в версиях до v0.15 comp_chislo=metka.val[k1]; // число взять из определенной метки comp_set_adres(ctemp,0,j-508); // фиктивная строка и n, z=5 или 6 адрес из comp_chislo } if (j==520) {//v0.16 comp_chislo=metka.val[k1]/100; comp_set_adres(ctemp,0,7); // фиктивная строка и n, z=7 - один байт без проверки comp_adres } goto next_i; // одного совпадения достаточно } } // нет ни одного совпадения - ?? if (re<256) re++; comp_set_error(11,0,""); } if ((j==515)||(j==517)) { // =515 - ошибка при использовании короткого адреса (недопустимое значение) // =517 - ошибка при использовании адреса в виде числа re++; } if ((j==516)||(j==518)||(j==519)) { // =516 - адрес в виде числа в программе 4 байта // =518 только старшая или =519 младшая часть адреса v0.15 // записать число в программу for (k=0; k=metka.vsego)) { // ошибка - метка не определена comp_set_error(11,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } // иначе вставить в программу значение метки comp_stroka=metka.stroka[k]; comp_adres=i; ia=metka.val[k1]; // число взять из определенной метки // j=516 записать 4 байта, (с v0.15) 518 и 519 - 2 байта ia1=(ia/1000)%10; if ((j==516)||(j==518)) comp_add_mkbufp(ia1); if ((comp_flag_opt2!=0)&&(j==516)&&(ia1==0)) { comp_set_error(mkerror.w+4,metka.stroka[k],metka.name[k]); // W004 - старший 0 в .NUM v0.29 } ia%=1000; ia1=(ia/100)%10; if ((j==516)||(j==518)) comp_add_mkbufp(ia1); ia%=100; ia1=(ia/10)%10; if ((j==516)||(j==519)) comp_add_mkbufp(ia1); ia%=10; if ((j==516)||(j==519)) comp_add_mkbufp(ia%10); goto next_i; // одного совпадения достаточно } } // нет ни одного совпадения - ?? if (re<256) re++; comp_set_error(11,0,""); } if ((j==521)||(j==522)||(j==523)||(j==524)) { //=521 (v0.18) - вставить байт из структуры mkmetka - DEC DDH //=522 (v0.18) - вставить байт из структуры mkmetka - DEC DDL //=523 (v0.18) - вставить 2 байта из структуры mkmetka - DEC DD //=524 (v0.18) - вставить 1 байт из структуры mkmetka BCD DAL for (k=0; k=metka.vsego)) { // ошибка - метка не определена comp_set_error(11,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } // иначе вставить в программу значение метки comp_stroka=metka.stroka[k]; comp_adres=i; if (j==521) { comp_chislo=metka.val[k1]; // число взять из определенной метки comp_chislo/=100; comp_set_adres(ctemp,0,8); // фиктивная строка и n, z=8 число из comp_chislo } if (j==522) { comp_chislo=metka.val[k1]; // число взять из определенной метки comp_chislo%=100; comp_set_adres(ctemp,0,8); // фиктивная строка и n, z=8 число из comp_chislo } if (j==523) { comp_chislo=metka.val[k1]; // число взять из определенной метки comp_set_adres(ctemp,0,9); // фиктивная строка и n, z=9 число 2 байта из comp_chislo } if (j==524) { comp_chislo=metka.val[k1]; // число взять из определенной метки comp_chislo%=100; comp_set_adres(ctemp,0,7); // фиктивная строка и n, z=7 число BCD из comp_chislo } goto next_i; // одного совпадения достаточно } } // нет ни одного совпадения - ?? if (re<256) re++; comp_set_error(11,0,""); } if (j==525) { // =525 - адрес в виде числа в программе 3 байта, v0.21 // записать число в программу for (k=0; k=metka.vsego)) { // ошибка - метка не определена comp_set_error(11,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } // иначе вставить в программу значение метки comp_stroka=metka.stroka[k]; comp_adres=i; ia=metka.val[k1]; // число взять из определенной метки if (ia>999) { // ошибка - неверный адрес comp_set_error(6,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } ia1=(ia/100)%10; if ((comp_flag_opt2!=0)&&(ia1==0)) { comp_set_error(mkerror.w+4,metka.stroka[k],metka.name[k]); // W004 - старший 0 в .NUMT v0.29 } comp_add_mkbufp(ia1); ia%=100; ia1=(ia/10)%10; comp_add_mkbufp(ia1); ia%=10; comp_add_mkbufp(ia%10); goto next_i; // одного совпадения достаточно } } // нет ни одного совпадения - ?? if (re<256) re++; comp_set_error(11,0,""); } if (j==526) { // v0.23 // =526 - метка из структуры mkmetka вставить по адресу 1 байт // с учётом ближайшей базы for (k=0; k=metka.vsego)) { // ошибка - метка не определена comp_set_error(11,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } // иначе вставить в программу значение метки comp_stroka=metka.stroka[k]; comp_adres=i; comp_chislo=metka.val[k1]; // число взять из определенной метки // поиск ближайшей установленной базы if (mbase.vsego<=0) goto m1; // нет базы - не вычитать, считать базу равной 0. for (i1=mbase.vsego-1; i1>=0; i1--) { if (mbase.val[i1]<=comp_chislo) { // найдена первая не превышающая адреса база comp_chislo-=mbase.val[i1]; if ((comp_chislo<0)||(comp_chislo>255)) { comp_set_error(6,metka.stroka[k],metka.name[k]); goto next_i; } goto m1; } } m1: comp_set_adres(ctemp,0,8); // фиктивная строка и n, z=8 байт %256 из comp_chislo goto next_i; // одного совпадения достаточно } } // нет ни одного совпадения - ?? if (re<256) re++; comp_set_error(11,0,""); } if ((j==527)||(j==528)) { // =527 - адрес в виде числа в программе 4 байта c декрементом // =528 - с инкрементом // v0.24 - записать число в программу for (k=0; k=metka.vsego)) { // ошибка - метка не определена comp_set_error(11,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } // иначе вставить в программу значение метки comp_stroka=metka.stroka[k]; comp_adres=i; ia=metka.val[k1]; // число взять из определенной метки if (j==527) { ia--; if (ia<0) {ia=0; comp_set_error(14,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } } if (j==528) { ia++; if (ia>9999) {ia=9999; comp_set_error(14,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } } // записать 4 байта ia1=(ia/1000)%10; comp_add_mkbufp(ia1); ia%=1000; ia1=(ia/100)%10; comp_add_mkbufp(ia1); ia%=100; ia1=(ia/10)%10; comp_add_mkbufp(ia1); ia%=10; comp_add_mkbufp(ia%10); goto next_i; // одного совпадения достаточно } } // нет ни одного совпадения - ?? if (re<256) re++; comp_set_error(11,0,""); } if ((j==529)||(j==530)) { //=529 (v0.25) - вставить 2 байта из структуры mkmetka - HEX DW //=530 (v0.25) - вставить 2 байта из структуры mkmetka по базе - HEX DWB for (k=0; k=metka.vsego)) { // ошибка - метка не определена comp_set_error(11,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } // иначе вставить в программу значение метки comp_stroka=metka.stroka[k]; comp_adres=i; if (j==529) { comp_chislo=metka.val[k1]; // число взять из определенной метки comp_set_adres(ctemp,0,10); // фиктивная строка и n, z=10 2б HEX число из comp_chislo } if (j==530) { comp_chislo=metka.val[k1]; // число взять из определенной метки // поиск ближайшей установленной базы if (mbase.vsego<=0) goto m2; // нет базы - не вычитать, считать базу равной 0. for (i1=mbase.vsego-1; i1>=0; i1--) { if (mbase.val[i1]<=comp_chislo) { // найдена первая не превышающая адреса база comp_chislo-=mbase.val[i1]; if (comp_chislo<0) { comp_set_error(6,metka.stroka[k],metka.name[k]); goto next_i; } goto m2; } } m2: comp_set_adres(ctemp,0,10); // фиктивная строка и n, z=10 2б HEX число из comp_chislo } goto next_i; // одного совпадения достаточно } } // нет ни одного совпадения - ?? if (re<256) re++; comp_set_error(11,0,""); } // v0.36 из-за ошибки ввода признака HEX if ((j==531)||(j==532)||(j==533)) { //=531 (v0.36) - DA вставить 2 байта из структуры mkmetka - BCD //=532 (v0.36) - DAH вставить байт из структуры mkmetka - BCD //=533 (v0.36) - DAL вставить байт из структуры mkmetka - BCD for (k=0; k=metka.vsego)) { // ошибка - метка не определена comp_set_error(11,metka.stroka[k],metka.name[k]); if (re<256) re++; goto next_i; } // иначе вставить в программу значение метки comp_stroka=metka.stroka[k]; comp_adres=i; // v0.36 - изменения 191120 if (j==531) { comp_chislo=metka.val[k1]; // число взять из определенной метки comp_set_adres(ctemp,0,12); // фиктивная строка и n, z=12 число 2 байта из comp_chislo } if (j==532) { comp_chislo=metka.val[k1]; // число взять из определенной метки comp_chislo/=100; comp_set_adres(ctemp,0,11); // фиктивная строка и n, z=11 число из comp_chislo } if (j==533) { comp_chislo=metka.val[k1]; // число взять из определенной метки comp_chislo%=100; comp_set_adres(ctemp,0,11); // фиктивная строка и n, z=11 число из comp_chislo } goto next_i; // одного совпадения достаточно } } // нет ни одного совпадения - ?? if (re<256) re++; comp_set_error(11,0,""); } next_i: ; } comp_progmin=(progmin+1)/100; // начало программы в страницах if (progmax<=progmin) comp_proglen=0; else { // длина программы в страницах comp_proglen=(progmax/100)-comp_progmin+1; } return(re); } /*------------------------------------------ COMPIL L -------------*/ void compil_l(void) { // подпрограмма копиляции исходного текста программы MKL int i,j,k,ic; int flag_metka, flag_probel, flag_err2, flag_equ, flag_end; int flag_tz, flag_k; long l; //extern int gmkbufp[10020]; //extern int gcomp_proglen, gcomp_progmin, gflag_mkbufp; mkerror.vsego=0; metka.vsego=0; ident.vsego=0; flag_end=0; mbase.vsego=0; //v0.23 (v1.18 mk.exe) // очистка for (l=0; l<10000; l++) mkbufp[l]=comp_const+512; // v0.21 для последующей проверки длины программы //text1[0]=0; //flag_text1=0; l=0; comp_adres=0; // текущий адрес в программе mkbufp comp_stroka=0; // первая строка comp_flag_adres=0; // по умолчанию только десятичные адреса comp_flag_opt2=0; // по умолчанию нет предупреждений для оптимизации v0.29 ml00: if (flag_end!=0) goto ml2; ctemp[0]=0; // считать строку из входного файла в ctemp[] if (fp1!=NULL) { if (fgets(ctemp,256,fp1)==NULL) goto ml2; // конец текста else goto ml01; // разбор строки } else goto end; ml01: // В ctemp - очередная строка текста comp_stroka++; // номер строки увеличить на 1 comp_strupr(); // просто strupr(ctemp) не подойдет flag_metka=0; flag_equ=0; flag_tz=0; flag_k=0; j=strlen(ctemp); if (j==0) goto ml1; for (i=0; i=128)&&(flag_err2==0)) { // ошибка 2 - недопустимый символ в строке ctemp[0]=ic; ctemp[1]=0; comp_set_error(2,comp_stroka,ctemp); flag_err2=2; // теперь не будет второго сообщения } ctemp1[j]=ctemp[i]; if (j<256) j++; ctemp1[j]=0; } } strcpy(ctemp,ctemp1); // скопировать полученную строку в ctemp ml1: // Здесь пробелы убраны, строка ctemp выровнена влево i=0; // i= указатель на первый не разобранный символ if (flag_metka!=0) { // считать метку и поместить ее в таблицу со значением текущего адреса i=comp_get_metka(ctemp); if (i>0) { comp_set_metka(comp_metka,comp_adres,1); } else i=-i; // иначе пропустить метку } if (flag_equ!=0) { // для этого псевдооператора сначала идет идентификатор, // поэтому и обработать его отдельно i=comp_get_ident(ctemp,0); if (i>0) { j=i; i=comp_get_equ(ctemp,j); if (i>j) { j=i; i=comp_get_chislo(ctemp,j); // if ((comp_chislo>=0)&&(comp_chislo<10000)) до v0.30 if ((comp_chislo>=0)&&(comp_chislo<=65535)) // с v0.30 { comp_set_ident(comp_ident,comp_chislo,1); // установлен идентификатор равный указанному в EQU числу } else { sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(5,comp_stroka,ctemptoa); // недопустимое значение идентификатора } } else goto ml00; // ошибка в операторе EQU ?? } else goto ml00; // ошибка в идентификаторе - разобрать след строку // i - указатель на последний разобранный элемент } k=strlen(ctemp); ml11: // i= указатель на первый не разобранный символ после метки или {идент .EQU число} if ((ctemp[i]==0)||(ctemp[i]=='\r')||(ctemp[i]=='\n')||(i>=k)) { goto ml00; // новая строка } j=comp_get_oper(ctemp,i); if (j>i) {i=j; goto ml11;} // повторить разбор оператора if (flag_end!=0) goto ml2; // конец программы goto ml00; ml2: // конец разбора текста программы comp_pass2(); //Проход 2 - проверить mkbufp и заменить метки на их значения if (fp2==NULL) goto end; // записать файл MKP if (comp_progmin<0) comp_progmin=0; if (comp_progmin>99) comp_progmin=99; if (comp_proglen<1) goto end; // программы нет if (comp_progmin+comp_proglen>100) comp_proglen=100-comp_progmin; // ограничить длину if (fputc((char)(comp_progmin%256),fp2)==EOF) goto end; // v0.17 - корректное преобразование в char for (l=100*comp_progmin; l<100*(comp_progmin+comp_proglen); l++) { // запись программы побайтно в MKP-файл i=mkbufp[l]; if (fputc((char)(i%256),fp2)==EOF) goto end; // v0.17 - исправлен порядок следования if (fputc((char)(i/256),fp2)==EOF) goto end; // на младший - старший } // вывести сообщения об ошибках for (l=0; l 0) { compilation_error = 1; } return; } /*----------------------------------------------------*/ int comp_get_dd(char *sss, int n, int z) { int i,i1,j,k; int re=0; // v0.18 // считать из строки и записать в программу ряд чисел, меток или идентификаторов // через запятую отсюда и до конца строки в десятичном виде // z = 0 - 2 байта, =1 - мл часть =2 - ст. часть числа - все в десятичном виде i=n; k=strlen(sss); m1: j=comp_get_adres(sss,i,3); // считать число, метку или т.п. if ((j>i)&&(comp_chislo>=0)&&(comp_chislo<10000)) { if ((z==0)||(z==2)) { if ((comp_adres>=0)&&(comp_adres<10000)) { comp_add_mkbufp(comp_chislo/100+256); } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } if ((z==0)||(z==1)) { if ((comp_adres>=0)&&(comp_adres<10000)) { comp_add_mkbufp(comp_chislo%100+256); } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } } else { if ((j>i)&&(z>=0)&&(z<=2)) { // метка уже в структуре после comp_get_adres if (z==0) { comp_add_mkbufp(comp_const+523); comp_add_mkbufp(comp_const+512); // изменено v0.36 } if (z==1) { comp_add_mkbufp(comp_const+522); } if (z==2) { comp_add_mkbufp(comp_const+521); // метка - ст часть } } else {sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(8,comp_stroka,ctemptoa); // неверное значение } } if ((j<=0)||(j<=n)) { re=j; // ошибка или конец goto end; } for (i1=j; i1i)&&(comp_chislo>=0)) { if (z==0) { if ((comp_adres>=0)&&(comp_adres<9999)) { comp_add_mkbufp((comp_chislo/256)%256+256); comp_add_mkbufp(comp_chislo%256+256); } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(6,comp_stroka,ctemptoa); } } if (z==1) { i2=comp_chislo-comp_base; // вычитание базы if ((i2>=0)&&(comp_adres>=0)&&(comp_adres<9999)) { comp_add_mkbufp((i2/256)%256+256); comp_add_mkbufp(i2%256+256); } else { sprintf(ctemptoa,"%d",comp_adres); comp_set_error(8,comp_stroka,ctemptoa); } } } else { if ((j>i)&&(z>=0)&&(z<=1)) { // метка уже в структуре после comp_get_adres if (z==0) { comp_add_mkbufp(comp_const+529); comp_add_mkbufp(comp_const+512); } if (z==1) { comp_add_mkbufp(comp_const+530); comp_add_mkbufp(comp_const+512); } } else { sprintf(ctemptoa,"%d",comp_chislo); comp_set_error(8,comp_stroka,ctemptoa); // неверное значение } } if ((j<=0)||(j<=n)) { re=j; // ошибка или конец goto end; } // v1.18 - проверка наличия чего-либо до конца строки или комментария m=0; for (i1=j; i1=512)&&(ic<768)) { // TEXT, v0.22 ic-=512; if ( ((ic>=32)&&(ic<176)) || ((ic>=224)&&(ic<242)) ) { ics[0]=ic; ics[1]=0; sprintf(ctemp,"'%s'",ics); } else sprintf(ctemp,"%02Xh ",ic); strcat(temp, ctemp); goto mp01; } if ((ic>=256)&&(ic<512)) { // HEX sprintf(ctemp,"%02Xh",ic%256); strcat(temp, ctemp); goto mp01; } if (ic<256) { if (j==0) { // команда strcat(temp, mkkom.name[ic]); j=mkkom.par[ic]; if (j<0) j=0; if (j==3)j=1; if (j>=4) j=2; // адрес или регистр если он есть if (j>0) { ic=(int)mkbufp[l1+1]%256; if (ic<0) ic+=256; if (ic<0) ic=0; sprintf(ctemp," %02X",ic); strcat(temp, ctemp); } if (j>1) { ic=(int)mkbufp[l1+2]%256; if (ic<0) ic+=256; if (ic<0) ic=0; sprintf(ctemp," %02X",ic); strcat(temp, ctemp); } } else { // адрес или регистр - нет мнемоники if (j>0) j--; if (j<0) j=0; } goto mp01; } // end ic<256 if (ic>=comp_const) { // ошибка v0.21 ic%=256; sprintf(ctemp,"%Xh ?",ic); strcat(temp, ctemp); } mp01: strcat(temp, " \t;"); // символ ic=(int)mkbufp[l1]%256; if (ic<0) ic+=256; if (ic<0) ic=0; ctemp[0]=(char)ic; ctemp[1]=0; mkstrcpy(ctemp1,ctemp,mkiocharset,0); strcat(temp,ctemp1); mp1: strcat(temp,mes[0]); if (fputs(temp,fp3)==EOF) goto endp; l++; l1++; if (l<100*comp_proglen) goto mp0; // Добавить комментарии с КС sprintf(temp,"; %s ADD %d %s",mes[12],comp_progks1,mes[0]); if (fputs(temp,fp3)==EOF) goto endp; sprintf(temp,"; %s XOR %d %s",mes[12],comp_progks2,mes[0]); if (fputs(temp,fp3)==EOF) goto endp; endp: return; } /*------------------------------------------------------------------- HTML ------*/ void buf2htm() { // запись в файл sp4 в формате HTML int i,j,ic; long l,l1; char ics[4]; //v0.21 // вычислить контрольную сумму comp_progks1=0; comp_progks2=0; for (i=0; i<100*comp_proglen; i++) { ic=(int)(mkbufp[100*comp_progmin+i] % 256); // мл часть только if (ic<0) ic+=256; comp_progks1+=ic; comp_progks2^=ic; // исправлено в v0.24 } // простой дизассемблер l=0; // текущий адрес относительно начала файла l1=100*comp_progmin; // текущий адрес относительно начала файла в памяти j=0; // 0-интерпретировать байт как команду, 1 и 2 - как адрес или номер регистра. strcpy(temp, "\r\n\r\n"); if (fputs(temp,fp4)==EOF) goto endp; strcpy(temp,"\r\n
\r\n\r\n"); if (fputs(temp,fp4)==EOF) goto endp; strcpy(temp,"\r\n\r\n\r\n\r\n\r\n\r\n"); if (fputs(temp,fp4)==EOF) goto endp; strcpy(temp,"\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"); if (fputs(temp,fp4)==EOF) goto endp; mph0: if ((l%10)==0) { sprintf(temp,"\r\n\r\n",l1); } strcat(temp, "\r\n"); l++; l1++; if ((l%10)==0) {strcat(temp, "\r\n\r\n"); if (fputs(temp,fp4)==EOF) goto endp; } if (l<100*comp_proglen) goto mph0; strcpy(temp, "
 0123456789
%04d"); // мнемоника ic ic=(int)mkbufp[l1]; if (ic<0) ic+=256; if (ic<0) ic=0; if ((ic>=256)&&(ic<512)) { // HEX ic-=256; sprintf(ctemp,"%02Xh",ic); strcat(temp,ctemp); goto mph01; } if ((ic>=512)&&(ic<768)) { // TEXT v0.21 ic-=512; if ( ((ic>=32)&&(ic<176)) || ((ic>=224)&&(ic<242)) ) //v0.22 { ics[0]=ic; ics[1]=0; sprintf(ctemp,"%02Xh '%s'",ic,ics); } else sprintf(ctemp,"%02Xh",ic); // убран пробел в v0.24 mkstrcpy(ctemp1,ctemp,1,0); // преобразовать ctemp из 866 в 1251 strcat(temp,ctemp1); goto mph01; } if (ic<256) { // обычный байт if (j==0) { // команда strcat(temp, mkkom.name1[ic]); // name1 - HTML формат кодировка cp1251 j=mkkom.par[ic]; if (j<0) j=0; if (j==3) j=1; if (j>=4) j=2; } else { // адрес или регистр если он есть sprintf(ctemp,"%02X",ic); strcat(temp, ctemp); if (j>0) j--; if (j<0) j=0; } goto mph01; } if (ic>=comp_const) { // ошибка v0.21 ic%=256; sprintf(ctemp,"%02Xh ?",ic); strcat(temp, ctemp); } mph01: strcat(temp, "
\r\n\r\n"); if (fputs(temp,fp4)==EOF) goto endp; // добавить к файлу HTML сообщение о контрольной сумме // Добавить комментарии с КС sprintf(temp,"

%s ADD %d\r\n

\r\n",mes[12],comp_progks1); // убран пробел в v0.24 if (fputs(temp,fp4)==EOF) goto endp; sprintf(temp,"

%s XOR %d\r\n

\r\n",mes[12],comp_progks2); // убран пробел в v0.24 if (fputs(temp,fp4)==EOF) goto endp; strcpy(temp, "\r\n"); if (fputs(temp,fp4)==EOF) goto endp; endp: return; } /*======================================================================== INIT ============*/ /*============================================ Инициализация таблицы команд */ int init_mkkom() { int re=0; int i; if (mkkom.init!=0) {re=1; goto end;} mkkom.init=1; for (i=0; i<256; i++) { mkkom.len[i]=0; mkkom.par[i]=0; strcpy(mkkom.name[i],""); strcpy(mkkom.name1[i],""); strcpy(mkkom.name2[i],""); } strcpy(mkkom.name[0],"0"); strcpy(mkkom.name1[0],"0"); strcpy(mkkom.name2[0],"0"); strcpy(mkkom.name[1],"1"); strcpy(mkkom.name1[1],"1"); strcpy(mkkom.name2[1],"1"); strcpy(mkkom.name[2],"2"); strcpy(mkkom.name1[2],"2"); strcpy(mkkom.name2[2],"2"); strcpy(mkkom.name[3],"3"); strcpy(mkkom.name1[3],"3"); strcpy(mkkom.name2[3],"3"); strcpy(mkkom.name[4],"4"); strcpy(mkkom.name1[4],"4"); strcpy(mkkom.name2[4],"4"); strcpy(mkkom.name[5],"5"); strcpy(mkkom.name1[5],"5"); strcpy(mkkom.name2[5],"5"); strcpy(mkkom.name[6],"6"); strcpy(mkkom.name1[6],"6"); strcpy(mkkom.name2[6],"6"); strcpy(mkkom.name[7],"7"); strcpy(mkkom.name1[7],"7"); strcpy(mkkom.name2[7],"7"); strcpy(mkkom.name[8],"8"); strcpy(mkkom.name1[8],"8"); strcpy(mkkom.name2[8],"8"); strcpy(mkkom.name[9],"9"); strcpy(mkkom.name1[9],"9"); strcpy(mkkom.name2[9],"9"); strcpy(mkkom.name[10],","); strcpy(mkkom.name1[10],","); strcpy(mkkom.name2[10],","); strcpy(mkkom.name[11],"+/-"); strcpy(mkkom.name1[11],"/-/"); strcpy(mkkom.name2[11],"+/-"); strcpy(mkkom.name[12],"EE"); strcpy(mkkom.name1[12],"ВП");// ВП strcpy(mkkom.name2[12],"EE"); strcpy(mkkom.name[13],"CX"); strcpy(mkkom.name1[13],"Cx"); // Cx strcpy(mkkom.name2[13],"CX"); strcpy(mkkom.name[14],"ENT"); strcpy(mkkom.name1[14],"B↑"); // B^ strcpy(mkkom.name2[14],"ENT"); strcpy(mkkom.name[15],"F ANS"); strcpy(mkkom.name1[15],"F Bx"); // F Bx strcpy(mkkom.name2[15],"FANS"); strcpy(mkkom.name[16],"+"); strcpy(mkkom.name1[16],"+"); strcpy(mkkom.name2[16],"+"); strcpy(mkkom.name[17],"-"); strcpy(mkkom.name1[17],"-"); strcpy(mkkom.name2[17],"-"); strcpy(mkkom.name[18],"*"); strcpy(mkkom.name1[18],"×"); strcpy(mkkom.name2[18],"*"); strcpy(mkkom.name[19],"/"); strcpy(mkkom.name1[19],"÷"); strcpy(mkkom.name2[19],"/"); strcpy(mkkom.name[20],"<->"); strcpy(mkkom.name1[20],"↔"); strcpy(mkkom.name2[20],"<->"); strcpy(mkkom.name[21],"F 10^X"); strcpy(mkkom.name1[21],"F 10x"); strcpy(mkkom.name2[21],"F10^X"); strcpy(mkkom.name[22],"F EXP"); strcpy(mkkom.name1[22],"F ex"); strcpy(mkkom.name2[22],"FEXP"); strcpy(mkkom.name[23],"F LG"); strcpy(mkkom.name1[23],"F lg"); strcpy(mkkom.name2[23],"FLG"); strcpy(mkkom.name[24],"F LN"); strcpy(mkkom.name1[24],"F ln"); strcpy(mkkom.name2[24],"FLN"); strcpy(mkkom.name[25],"F ARCSIN"); strcpy(mkkom.name1[25],"F arcsin"); strcpy(mkkom.name2[25],"FARCSIN"); strcpy(mkkom.name[26],"F ARCCOS"); strcpy(mkkom.name1[26],"F arccos"); strcpy(mkkom.name2[26],"FARCCOS"); strcpy(mkkom.name[27],"F ARCTG"); strcpy(mkkom.name1[27],"F arctg"); strcpy(mkkom.name2[27],"FARCTG"); strcpy(mkkom.name[28],"F SIN"); strcpy(mkkom.name1[28],"F sin"); strcpy(mkkom.name2[28],"FSIN"); strcpy(mkkom.name[29],"F COS"); strcpy(mkkom.name1[29],"F cos"); strcpy(mkkom.name2[29],"FCOS"); strcpy(mkkom.name[30],"F TG"); strcpy(mkkom.name1[30],"F tg"); strcpy(mkkom.name2[30],"FTG"); strcpy(mkkom.name[31],".DB 1Fh"); strcpy(mkkom.name1[31],"1Fh"); strcpy(mkkom.name2[31],"?"); strcpy(mkkom.name[32],"F PI"); strcpy(mkkom.name1[32],"F π"); strcpy(mkkom.name2[32],"FPI"); strcpy(mkkom.name[33],"F SQRT"); strcpy(mkkom.name1[33],"F √"); strcpy(mkkom.name2[33],"FSQRT"); strcpy(mkkom.name[34],"F X^2"); strcpy(mkkom.name1[34],"F x2"); strcpy(mkkom.name2[34],"FX^2"); strcpy(mkkom.name[35],"F 1/X"); strcpy(mkkom.name1[35],"F 1/x"); strcpy(mkkom.name2[35],"F1/X"); strcpy(mkkom.name[36],"F X^Y"); strcpy(mkkom.name1[36],"F xy"); strcpy(mkkom.name2[36],"FX^Y"); strcpy(mkkom.name[37],"F R"); strcpy(mkkom.name1[37],"F O"); strcpy(mkkom.name2[37],"FR"); strcpy(mkkom.name[38],"K M->D"); strcpy(mkkom.name1[38],"K М→Г");// К М-Г strcpy(mkkom.name2[38],"KM->D"); strcpy(mkkom.name[39],"K -"); strcpy(mkkom.name1[39],"K -"); strcpy(mkkom.name2[39],"K-"); strcpy(mkkom.name[40],"K PRGM"); strcpy(mkkom.name1[40],"K ИПРГ");// К ИПРГ strcpy(mkkom.name2[40],"KPRGM"); strcpy(mkkom.name[41],"K /"); strcpy(mkkom.name1[41],"K ÷"); strcpy(mkkom.name2[41],"K/"); strcpy(mkkom.name[42],"K MS->D"); strcpy(mkkom.name1[42],"K МС→Г"); strcpy(mkkom.name2[42],"KMS->D"); strcpy(mkkom.name[43],".DB 2Bh"); strcpy(mkkom.name1[43],"2Bh"); strcpy(mkkom.name2[43],"?"); strcpy(mkkom.name[44],".DB 2Ch"); strcpy(mkkom.name1[44],"2Ch"); strcpy(mkkom.name2[44],"?"); strcpy(mkkom.name[45],".DB 2Dh"); strcpy(mkkom.name1[45],"2Dh"); strcpy(mkkom.name2[45],"?"); strcpy(mkkom.name[46],".DB 2Eh"); strcpy(mkkom.name1[46],"2Eh"); strcpy(mkkom.name2[46],"?"); strcpy(mkkom.name[47],".DB 2Fh"); strcpy(mkkom.name1[47],"2Fh"); strcpy(mkkom.name2[47],"?"); strcpy(mkkom.name[48],"K D->MS"); strcpy(mkkom.name1[48],"K Г→МС"); strcpy(mkkom.name2[48],"KD->MS"); strcpy(mkkom.name[49],"K ABS"); strcpy(mkkom.name1[49],"K |x|");// K|x| strcpy(mkkom.name2[49],"KABS"); strcpy(mkkom.name[50],"K SGN"); strcpy(mkkom.name1[50],"K ЗН");// К ЗН strcpy(mkkom.name2[50],"KSGN"); strcpy(mkkom.name[51],"K D->M"); strcpy(mkkom.name1[51],"K Г→М"); strcpy(mkkom.name2[51],"KD->M"); strcpy(mkkom.name[52],"K INT"); strcpy(mkkom.name1[52],"K [x]");// K[x] strcpy(mkkom.name2[52],"KINT"); strcpy(mkkom.name[53],"K FRAC"); strcpy(mkkom.name1[53],"K {x}");// K{x} strcpy(mkkom.name2[53],"KFRAC"); strcpy(mkkom.name[54],"K MAX"); strcpy(mkkom.name1[54],"K max"); strcpy(mkkom.name2[54],"KMAX"); strcpy(mkkom.name[55],"K AND"); strcpy(mkkom.name1[55],"K AND"); strcpy(mkkom.name2[55],"KAND"); strcpy(mkkom.name[56],"K OR"); strcpy(mkkom.name1[56],"K OR"); strcpy(mkkom.name2[56],"KOR"); strcpy(mkkom.name[57],"K XOR"); strcpy(mkkom.name1[57],"K XOR"); strcpy(mkkom.name2[57],"KXOR"); strcpy(mkkom.name[58],"K NOT"); strcpy(mkkom.name1[58],"K NOT"); strcpy(mkkom.name2[58],"KNOT"); strcpy(mkkom.name[59],"K RAN"); strcpy(mkkom.name1[59],"K СЧ");// KСЧ strcpy(mkkom.name2[59],"KRAN"); strcpy(mkkom.name[60],".DB 3Ch"); strcpy(mkkom.name1[60],"3Ch"); strcpy(mkkom.name2[60],"?"); strcpy(mkkom.name[61],".DB 3Dh"); strcpy(mkkom.name1[61],"3Dh"); strcpy(mkkom.name2[61],"?"); strcpy(mkkom.name[62],".DB 3Eh"); strcpy(mkkom.name1[62],"3Eh"); strcpy(mkkom.name2[62],"?"); strcpy(mkkom.name[63],".DB 3Fh"); strcpy(mkkom.name1[63],"3Fh"); strcpy(mkkom.name2[63],"?"); strcpy(mkkom.name[64],"M 0"); strcpy(mkkom.name1[64],"П 0"); strcpy(mkkom.name2[64],"M0"); strcpy(mkkom.name[65],"M 1"); strcpy(mkkom.name1[65],"П 1"); strcpy(mkkom.name2[65],"M1"); strcpy(mkkom.name[66],"M 2"); strcpy(mkkom.name1[66],"П 2"); strcpy(mkkom.name2[66],"M2"); strcpy(mkkom.name[67],"M 3"); strcpy(mkkom.name1[67],"П 3"); strcpy(mkkom.name2[67],"M3"); strcpy(mkkom.name[68],"M 4"); strcpy(mkkom.name1[68],"П 4"); strcpy(mkkom.name2[68],"M4"); strcpy(mkkom.name[69],"M 5"); strcpy(mkkom.name1[69],"П 5"); strcpy(mkkom.name2[69],"M5"); strcpy(mkkom.name[70],"M 6"); strcpy(mkkom.name1[70],"П 6"); strcpy(mkkom.name2[70],"M6"); strcpy(mkkom.name[71],"M 7"); strcpy(mkkom.name1[71],"П 7"); strcpy(mkkom.name2[71],"M7"); strcpy(mkkom.name[72],"M 8"); strcpy(mkkom.name1[72],"П 8"); strcpy(mkkom.name2[72],"M8"); strcpy(mkkom.name[73],"M 9"); strcpy(mkkom.name1[73],"П 9"); strcpy(mkkom.name2[73],"M9"); strcpy(mkkom.name[74],"M A"); strcpy(mkkom.name1[74],"П A"); strcpy(mkkom.name2[74],"MA"); strcpy(mkkom.name[75],"M B"); strcpy(mkkom.name1[75],"П B"); strcpy(mkkom.name2[75],"MB"); strcpy(mkkom.name[76],"M C"); strcpy(mkkom.name1[76],"П C"); strcpy(mkkom.name2[76],"MC"); strcpy(mkkom.name[77],"M D"); strcpy(mkkom.name1[77],"П D"); strcpy(mkkom.name2[77],"MD"); strcpy(mkkom.name[78],"M E"); strcpy(mkkom.name1[78],"П E"); strcpy(mkkom.name2[78],"ME"); strcpy(mkkom.name[79],"P M"); strcpy(mkkom.name1[79],"P П"); mkkom.len[79]=1; strcpy(mkkom.name2[79],"PM"); mkkom.par[79]=3; strcpy(mkkom.name[80],"R/S"); strcpy(mkkom.name1[80],"С/П");// С/П strcpy(mkkom.name2[80],"R/S"); strcpy(mkkom.name[81],"GOTO"); strcpy(mkkom.name1[81],"БП"); mkkom.len[81]=1; // БП strcpy(mkkom.name2[81],"GOTO"); mkkom.par[81]=1; strcpy(mkkom.name[82],"RTN"); strcpy(mkkom.name1[82],"В/О");//В/О strcpy(mkkom.name2[82],"RTN"); strcpy(mkkom.name[83],"GSB"); strcpy(mkkom.name1[83],"ПП"); mkkom.len[83]=1; // ПП strcpy(mkkom.name2[83],"GSB"); mkkom.par[83]=1; strcpy(mkkom.name[84],"K NOP"); strcpy(mkkom.name1[84],"K НОП"); strcpy(mkkom.name2[84],"KNOP"); strcpy(mkkom.name[85],"K SCR"); strcpy(mkkom.name1[85],"K ЭКР"); // KЭКР strcpy(mkkom.name2[85],"KSCR"); strcpy(mkkom.name[86],"K GRPH"); strcpy(mkkom.name1[86],"K ГРФ");// KГРФ strcpy(mkkom.name2[86],"KGRPH"); strcpy(mkkom.name[87],"F X!=0"); strcpy(mkkom.name1[87],"F x≠0"); mkkom.len[87]=1; strcpy(mkkom.name2[87],"FX!=0"); mkkom.par[87]=1; strcpy(mkkom.name[88],"F L2"); strcpy(mkkom.name1[88],"F L2"); mkkom.len[88]=1; strcpy(mkkom.name2[88],"FL2"); mkkom.par[88]=1; strcpy(mkkom.name[89],"F X>=0"); strcpy(mkkom.name1[89],"F x≥0"); mkkom.len[89]=1; strcpy(mkkom.name2[89],"FX>=0"); mkkom.par[89]=1; strcpy(mkkom.name[90],"F L3"); strcpy(mkkom.name1[90],"F L3"); mkkom.len[90]=1; strcpy(mkkom.name2[90],"FL3"); mkkom.par[90]=1; strcpy(mkkom.name[91],"F L1"); strcpy(mkkom.name1[91],"F L1"); mkkom.len[91]=1; strcpy(mkkom.name2[91],"FL1"); mkkom.par[91]=1; strcpy(mkkom.name[92],"F X<0"); strcpy(mkkom.name1[92],"F x<0"); mkkom.len[92]=1; strcpy(mkkom.name2[92],"FX<0"); mkkom.par[92]=1; strcpy(mkkom.name[93],"F L0"); strcpy(mkkom.name1[93],"F L0"); mkkom.len[93]=1; strcpy(mkkom.name2[93],"FL0"); mkkom.par[93]=1; strcpy(mkkom.name[94],"F X=0"); strcpy(mkkom.name1[94],"F x=0"); mkkom.len[94]=1; strcpy(mkkom.name2[94],"FX=0"); mkkom.par[94]=1; strcpy(mkkom.name[95],".DB 5Fh"); strcpy(mkkom.name2[95],"?"); strcpy(mkkom.name[96],"RM 0"); strcpy(mkkom.name1[96],"ИП 0"); strcpy(mkkom.name2[96],"RM0"); strcpy(mkkom.name[97],"RM 1"); strcpy(mkkom.name1[97],"ИП 1"); strcpy(mkkom.name2[97],"RM1"); strcpy(mkkom.name[98],"RM 2"); strcpy(mkkom.name1[98],"ИП 2"); strcpy(mkkom.name2[98],"RM2"); strcpy(mkkom.name[99],"RM 3"); strcpy(mkkom.name1[99],"ИП 3"); strcpy(mkkom.name2[99],"RM3"); strcpy(mkkom.name[100],"RM 4"); strcpy(mkkom.name1[100],"ИП 4"); strcpy(mkkom.name2[100],"RM4"); strcpy(mkkom.name[101],"RM 5"); strcpy(mkkom.name1[101],"ИП 5"); strcpy(mkkom.name2[101],"RM5"); strcpy(mkkom.name[102],"RM 6"); strcpy(mkkom.name1[102],"ИП 6"); strcpy(mkkom.name2[102],"RM6"); strcpy(mkkom.name[103],"RM 7"); strcpy(mkkom.name1[103],"ИП 7"); strcpy(mkkom.name2[103],"RM7"); strcpy(mkkom.name[104],"RM 8"); strcpy(mkkom.name1[104],"ИП 8"); strcpy(mkkom.name2[104],"RM8"); strcpy(mkkom.name[105],"RM 9"); strcpy(mkkom.name1[105],"ИП 9"); strcpy(mkkom.name2[105],"RM9"); strcpy(mkkom.name[106],"RM A"); strcpy(mkkom.name1[106],"ИП A"); strcpy(mkkom.name2[106],"RMA"); strcpy(mkkom.name[107],"RM B"); strcpy(mkkom.name1[107],"ИП B"); strcpy(mkkom.name2[107],"RMB"); strcpy(mkkom.name[108],"RM C"); strcpy(mkkom.name1[108],"ИП C"); strcpy(mkkom.name2[108],"RMC"); strcpy(mkkom.name[109],"RM D"); strcpy(mkkom.name1[109],"ИП D"); strcpy(mkkom.name2[109],"RMD"); strcpy(mkkom.name[110],"RM E"); strcpy(mkkom.name1[110],"ИП E"); strcpy(mkkom.name2[110],"RME"); strcpy(mkkom.name[111],"P RM"); strcpy(mkkom.name1[111],"P ИП"); mkkom.len[111]=1; strcpy(mkkom.name2[111],"PRM"); mkkom.par[111]=3; strcpy(mkkom.name[112],"K X!=0 0"); strcpy(mkkom.name1[112],"K x≠0 0"); strcpy(mkkom.name2[112],"KX!=00"); strcpy(mkkom.name[113],"K X!=0 1"); strcpy(mkkom.name1[113],"K x≠0 1"); strcpy(mkkom.name2[113],"KX!=01"); strcpy(mkkom.name[114],"K X!=0 2"); strcpy(mkkom.name1[114],"K x≠0 2"); strcpy(mkkom.name2[114],"KX!=02"); strcpy(mkkom.name[115],"K X!=0 3"); strcpy(mkkom.name1[115],"K x≠0 3"); strcpy(mkkom.name2[115],"KX!=03"); strcpy(mkkom.name[116],"K X!=0 4"); strcpy(mkkom.name1[116],"K x≠0 4"); strcpy(mkkom.name2[116],"KX!=04"); strcpy(mkkom.name[117],"K X!=0 5"); strcpy(mkkom.name1[117],"K x≠0 5"); strcpy(mkkom.name2[117],"KX!=05"); strcpy(mkkom.name[118],"K X!=0 6"); strcpy(mkkom.name1[118],"K x≠0 6"); strcpy(mkkom.name2[118],"KX!=06"); strcpy(mkkom.name[119],"K X!=0 7"); strcpy(mkkom.name1[119],"K x≠0 7"); strcpy(mkkom.name2[119],"KX!=07"); strcpy(mkkom.name[120],"K X!=0 8"); strcpy(mkkom.name1[120],"K x≠0 8"); strcpy(mkkom.name2[120],"KX!=08"); strcpy(mkkom.name[121],"K X!=0 9"); strcpy(mkkom.name1[121],"K x≠0 9"); strcpy(mkkom.name2[121],"KX!=09"); strcpy(mkkom.name[122],"K X!=0 A"); strcpy(mkkom.name1[122],"K x≠0 A"); strcpy(mkkom.name2[122],"KX!=0A"); strcpy(mkkom.name[123],"K X!=0 B"); strcpy(mkkom.name1[123],"K x≠0 B"); strcpy(mkkom.name2[123],"KX!=0B"); strcpy(mkkom.name[124],"K X!=0 C"); strcpy(mkkom.name1[124],"K x≠0 C"); strcpy(mkkom.name2[124],"KX!=0C"); strcpy(mkkom.name[125],"K X!=0 D"); strcpy(mkkom.name1[125],"K x≠0 D"); strcpy(mkkom.name2[125],"KX!=0D"); strcpy(mkkom.name[126],"K X!=0 E"); strcpy(mkkom.name1[126],"K x≠0 E"); strcpy(mkkom.name2[126],"KX!=0E"); strcpy(mkkom.name[127],"PK X!=0"); strcpy(mkkom.name1[127],"PK x≠0"); mkkom.len[127]=1; strcpy(mkkom.name2[127],"PKX!=0"); mkkom.par[127]=3; strcpy(mkkom.name[128],"K GOTO 0"); strcpy(mkkom.name1[128],"K БП 0"); //KБП0 strcpy(mkkom.name2[128],"KGOTO0"); strcpy(mkkom.name[129],"K GOTO 1"); strcpy(mkkom.name1[129],"K БП 1"); strcpy(mkkom.name2[129],"KGOTO1"); strcpy(mkkom.name[130],"K GOTO 2"); strcpy(mkkom.name1[130],"K БП 2"); strcpy(mkkom.name2[130],"KGOTO2"); strcpy(mkkom.name[131],"K GOTO 3"); strcpy(mkkom.name1[131],"K БП 3"); strcpy(mkkom.name2[131],"KGOTO3"); strcpy(mkkom.name[132],"K GOTO 4"); strcpy(mkkom.name1[132],"K БП 4"); strcpy(mkkom.name2[132],"KGOTO4"); strcpy(mkkom.name[133],"K GOTO 5"); strcpy(mkkom.name1[133],"K БП 5"); strcpy(mkkom.name2[133],"KGOTO5"); strcpy(mkkom.name[134],"K GOTO 6"); strcpy(mkkom.name1[134],"K БП 6"); strcpy(mkkom.name2[134],"KGOTO6"); strcpy(mkkom.name[135],"K GOTO 7"); strcpy(mkkom.name1[135],"K БП 7"); strcpy(mkkom.name2[135],"KGOTO7"); strcpy(mkkom.name[136],"K GOTO 8"); strcpy(mkkom.name1[136],"K БП 8"); strcpy(mkkom.name2[136],"KGOTO8"); strcpy(mkkom.name[137],"K GOTO 9"); strcpy(mkkom.name1[137],"K БП 9"); strcpy(mkkom.name2[137],"KGOTO9"); strcpy(mkkom.name[138],"K GOTO A"); strcpy(mkkom.name1[138],"K БП A"); strcpy(mkkom.name2[138],"KGOTOA"); strcpy(mkkom.name[139],"K GOTO B"); strcpy(mkkom.name1[139],"K БП B"); strcpy(mkkom.name2[139],"KGOTOB"); strcpy(mkkom.name[140],"K GOTO C"); strcpy(mkkom.name1[140],"K БП C"); strcpy(mkkom.name2[140],"KGOTOC"); strcpy(mkkom.name[141],"K GOTO D"); strcpy(mkkom.name1[141],"K БП D"); strcpy(mkkom.name2[141],"KGOTOD"); strcpy(mkkom.name[142],"K GOTO E"); strcpy(mkkom.name1[142],"K БП E"); strcpy(mkkom.name2[142],"KGOTOE"); strcpy(mkkom.name[143],"PK GOTO"); strcpy(mkkom.name1[143],"PK БП"); mkkom.len[143]=1; strcpy(mkkom.name2[143],"PKGOTO"); mkkom.par[143]=3; strcpy(mkkom.name[144],"K X>=0 0"); strcpy(mkkom.name1[144],"K x≥0 0"); strcpy(mkkom.name2[144],"KX>=00"); strcpy(mkkom.name[145],"K X>=0 1"); strcpy(mkkom.name1[145],"K x≥0 1"); strcpy(mkkom.name2[145],"KX>=01"); strcpy(mkkom.name[146],"K X>=0 2"); strcpy(mkkom.name1[146],"K x≥0 2"); strcpy(mkkom.name2[146],"KX>=02"); strcpy(mkkom.name[147],"K X>=0 3"); strcpy(mkkom.name1[147],"K x≥0 3"); strcpy(mkkom.name2[147],"KX>=03"); strcpy(mkkom.name[148],"K X>=0 4"); strcpy(mkkom.name1[148],"K x≥0 4"); strcpy(mkkom.name2[148],"KX>=04"); strcpy(mkkom.name[149],"K X>=0 5"); strcpy(mkkom.name1[149],"K x≥0 5"); strcpy(mkkom.name2[149],"KX>=05"); strcpy(mkkom.name[150],"K X>=0 6"); strcpy(mkkom.name1[150],"K x≥0 6"); strcpy(mkkom.name2[150],"KX>=06"); strcpy(mkkom.name[151],"K X>=0 7"); strcpy(mkkom.name1[151],"K x≥0 7"); strcpy(mkkom.name2[151],"KX>=07"); strcpy(mkkom.name[152],"K X>=0 8"); strcpy(mkkom.name1[152],"K x≥0 8"); strcpy(mkkom.name2[152],"KX>=08"); strcpy(mkkom.name[153],"K X>=0 9"); strcpy(mkkom.name1[153],"K x≥0 9"); strcpy(mkkom.name2[153],"KX>=09"); strcpy(mkkom.name[154],"K X>=0 A"); strcpy(mkkom.name1[154],"K x≥0 A"); strcpy(mkkom.name2[154],"KX>=0A"); strcpy(mkkom.name[155],"K X>=0 B"); strcpy(mkkom.name1[155],"K x≥0 B"); strcpy(mkkom.name2[155],"KX>=0B"); strcpy(mkkom.name[156],"K X>=0 C"); strcpy(mkkom.name1[156],"K x≥0 C"); strcpy(mkkom.name2[156],"KX>=0C"); strcpy(mkkom.name[157],"K X>=0 D"); strcpy(mkkom.name1[157],"K x≥0 D"); strcpy(mkkom.name2[157],"KX>=0D"); strcpy(mkkom.name[158],"K X>=0 E"); strcpy(mkkom.name1[158],"K x≥0 E"); strcpy(mkkom.name2[158],"KX>=0E"); strcpy(mkkom.name[159],"PK X>=0"); strcpy(mkkom.name1[159],"PK x≥0"); mkkom.len[159]=1; strcpy(mkkom.name2[159],"PKX>=0"); mkkom.par[159]=3; strcpy(mkkom.name[160],"K GSB 0"); strcpy(mkkom.name1[160],"K ПП 0");//KПП0 strcpy(mkkom.name2[160],"KGSB0"); strcpy(mkkom.name[161],"K GSB 1"); strcpy(mkkom.name1[161],"K ПП 1"); strcpy(mkkom.name2[161],"KGSB1"); strcpy(mkkom.name[162],"K GSB 2"); strcpy(mkkom.name1[162],"K ПП 2"); strcpy(mkkom.name2[162],"KGSB2"); strcpy(mkkom.name[163],"K GSB 3"); strcpy(mkkom.name1[163],"K ПП 3"); strcpy(mkkom.name2[163],"KGSB3"); strcpy(mkkom.name[164],"K GSB 4"); strcpy(mkkom.name1[164],"K ПП 4"); strcpy(mkkom.name2[164],"KGSB4"); strcpy(mkkom.name[165],"K GSB 5"); strcpy(mkkom.name1[165],"K ПП 5"); strcpy(mkkom.name2[165],"KGSB5"); strcpy(mkkom.name[166],"K GSB 6"); strcpy(mkkom.name1[166],"K ПП 6"); strcpy(mkkom.name2[166],"KGSB6"); strcpy(mkkom.name[167],"K GSB 7"); strcpy(mkkom.name1[167],"K ПП 7"); strcpy(mkkom.name2[167],"KGSB7"); strcpy(mkkom.name[168],"K GSB 8"); strcpy(mkkom.name1[168],"K ПП 8"); strcpy(mkkom.name2[168],"KGSB8"); strcpy(mkkom.name[169],"K GSB 9"); strcpy(mkkom.name1[169],"K ПП 9"); strcpy(mkkom.name2[169],"KGSB9"); strcpy(mkkom.name[170],"K GSB A"); strcpy(mkkom.name1[170],"K ПП A"); strcpy(mkkom.name2[170],"KGSBA"); strcpy(mkkom.name[171],"K GSB B"); strcpy(mkkom.name1[171],"K ПП B"); strcpy(mkkom.name2[171],"KGSBB"); strcpy(mkkom.name[172],"K GSB C"); strcpy(mkkom.name1[172],"K ПП C"); strcpy(mkkom.name2[172],"KGSBC"); strcpy(mkkom.name[173],"K GSB D"); strcpy(mkkom.name1[173],"K ПП D"); strcpy(mkkom.name2[173],"KGSBD"); strcpy(mkkom.name[174],"K GSB E"); strcpy(mkkom.name1[174],"K ПП E"); strcpy(mkkom.name2[174],"KGSBE"); strcpy(mkkom.name[175],"PK GSB"); strcpy(mkkom.name1[175],"PK ПП"); mkkom.len[175]=1; strcpy(mkkom.name2[175],"PKGSB"); mkkom.par[175]=3; strcpy(mkkom.name[176],"K M 0"); strcpy(mkkom.name1[176],"K П 0"); strcpy(mkkom.name2[176],"KM0"); strcpy(mkkom.name[177],"K M 1"); strcpy(mkkom.name1[177],"K П 1"); strcpy(mkkom.name2[177],"KM1"); strcpy(mkkom.name[178],"K M 2"); strcpy(mkkom.name1[178],"K П 2"); strcpy(mkkom.name2[178],"KM2"); strcpy(mkkom.name[179],"K M 3"); strcpy(mkkom.name1[179],"K П 3"); strcpy(mkkom.name2[179],"KM3"); strcpy(mkkom.name[180],"K M 4"); strcpy(mkkom.name1[180],"K П 4"); strcpy(mkkom.name2[180],"KM4"); strcpy(mkkom.name[181],"K M 5"); strcpy(mkkom.name1[181],"K П 5"); strcpy(mkkom.name2[181],"KM5"); strcpy(mkkom.name[182],"K M 6"); strcpy(mkkom.name1[182],"K П 6"); strcpy(mkkom.name2[182],"KM6"); strcpy(mkkom.name[183],"K M 7"); strcpy(mkkom.name1[183],"K П 7"); strcpy(mkkom.name2[183],"KM7"); strcpy(mkkom.name[184],"K M 8"); strcpy(mkkom.name1[184],"K П 8"); strcpy(mkkom.name2[184],"KM8"); strcpy(mkkom.name[185],"K M 9"); strcpy(mkkom.name1[185],"K П 9"); strcpy(mkkom.name2[185],"KM9"); strcpy(mkkom.name[186],"K M A"); strcpy(mkkom.name1[186],"K П A"); strcpy(mkkom.name2[186],"KMA"); strcpy(mkkom.name[187],"K M B"); strcpy(mkkom.name1[187],"K П B"); strcpy(mkkom.name2[187],"KMB"); strcpy(mkkom.name[188],"K M C"); strcpy(mkkom.name1[188],"K П C"); strcpy(mkkom.name2[188],"KMC"); strcpy(mkkom.name[189],"K M D"); strcpy(mkkom.name1[189],"K П D"); strcpy(mkkom.name2[189],"KMD"); strcpy(mkkom.name[190],"K M E"); strcpy(mkkom.name1[190],"K П E"); strcpy(mkkom.name2[190],"KME"); strcpy(mkkom.name[191],"PK M"); strcpy(mkkom.name1[191],"PK П"); mkkom.len[191]=1; strcpy(mkkom.name2[191],"PKM"); mkkom.par[191]=3; strcpy(mkkom.name[192],"K X<0 0"); strcpy(mkkom.name1[192],"K x<0 0"); strcpy(mkkom.name2[192],"KX<00"); strcpy(mkkom.name[193],"K X<0 1"); strcpy(mkkom.name1[193],"K x<0 1"); strcpy(mkkom.name2[193],"KX<01"); strcpy(mkkom.name[194],"K X<0 2"); strcpy(mkkom.name1[194],"K x<0 2"); strcpy(mkkom.name2[194],"KX<02"); strcpy(mkkom.name[195],"K X<0 3"); strcpy(mkkom.name1[195],"K x<0 3"); strcpy(mkkom.name2[195],"KX<03"); strcpy(mkkom.name[196],"K X<0 4"); strcpy(mkkom.name1[196],"K x<0 4"); strcpy(mkkom.name2[196],"KX<04"); strcpy(mkkom.name[197],"K X<0 5"); strcpy(mkkom.name1[197],"K x<0 5"); strcpy(mkkom.name2[197],"KX<05"); strcpy(mkkom.name[198],"K X<0 6"); strcpy(mkkom.name1[198],"K x<0 6"); strcpy(mkkom.name2[198],"KX<06"); strcpy(mkkom.name[199],"K X<0 7"); strcpy(mkkom.name1[199],"K x<0 7"); strcpy(mkkom.name2[199],"KX<07"); strcpy(mkkom.name[200],"K X<0 8"); strcpy(mkkom.name1[200],"K x<0 8"); strcpy(mkkom.name2[200],"KX<08"); strcpy(mkkom.name[201],"K X<0 9"); strcpy(mkkom.name1[201],"K x<0 9"); strcpy(mkkom.name2[201],"KX<09"); strcpy(mkkom.name[202],"K X<0 A"); strcpy(mkkom.name1[202],"K x<0 A"); strcpy(mkkom.name2[202],"KX<0A"); strcpy(mkkom.name[203],"K X<0 B"); strcpy(mkkom.name1[203],"K x<0 B"); strcpy(mkkom.name2[203],"KX<0B"); strcpy(mkkom.name[204],"K X<0 C"); strcpy(mkkom.name1[204],"K x<0 C"); strcpy(mkkom.name2[204],"KX<0C"); strcpy(mkkom.name[205],"K X<0 D"); strcpy(mkkom.name1[205],"K x<0 D"); strcpy(mkkom.name2[205],"KX<0D"); strcpy(mkkom.name[206],"K X<0 E"); strcpy(mkkom.name1[206],"K x<0 E"); strcpy(mkkom.name2[206],"KX<0E"); strcpy(mkkom.name[207],"PK X<0"); strcpy(mkkom.name1[207],"PK x<0"); mkkom.len[207]=1; strcpy(mkkom.name2[207],"PKX<0"); mkkom.par[207]=3; strcpy(mkkom.name[208],"K RM 0"); strcpy(mkkom.name1[208],"K ИП 0"); //KИП0 strcpy(mkkom.name2[208],"KRM0"); strcpy(mkkom.name[209],"K RM 1"); strcpy(mkkom.name1[209],"K ИП 1"); strcpy(mkkom.name2[209],"KRM1"); strcpy(mkkom.name[210],"K RM 2"); strcpy(mkkom.name1[210],"K ИП 2"); strcpy(mkkom.name2[210],"KRM2"); strcpy(mkkom.name[211],"K RM 3"); strcpy(mkkom.name1[211],"K ИП 3"); strcpy(mkkom.name2[211],"KRM3"); strcpy(mkkom.name[212],"K RM 4"); strcpy(mkkom.name1[212],"K ИП 4"); strcpy(mkkom.name2[212],"KRM4"); strcpy(mkkom.name[213],"K RM 5"); strcpy(mkkom.name1[213],"K ИП 5"); strcpy(mkkom.name2[213],"KRM5"); strcpy(mkkom.name[214],"K RM 6"); strcpy(mkkom.name1[214],"K ИП 6"); strcpy(mkkom.name2[214],"KRM6"); strcpy(mkkom.name[215],"K RM 7"); strcpy(mkkom.name1[215],"K ИП 7"); strcpy(mkkom.name2[215],"KRM7"); strcpy(mkkom.name[216],"K RM 8"); strcpy(mkkom.name1[216],"K ИП 8"); strcpy(mkkom.name2[216],"KRM8"); strcpy(mkkom.name[217],"K RM 9"); strcpy(mkkom.name1[217],"K ИП 9"); strcpy(mkkom.name2[217],"KRM9"); strcpy(mkkom.name[218],"K RM A"); strcpy(mkkom.name1[218],"K ИП A"); strcpy(mkkom.name2[218],"KRMA"); strcpy(mkkom.name[219],"K RM B"); strcpy(mkkom.name1[219],"K ИП B"); strcpy(mkkom.name2[219],"KRMB"); strcpy(mkkom.name[220],"K RM C"); strcpy(mkkom.name1[220],"K ИП C"); strcpy(mkkom.name2[220],"KRMC"); strcpy(mkkom.name[221],"K RM D"); strcpy(mkkom.name1[221],"K ИП D"); strcpy(mkkom.name2[221],"KRMD"); strcpy(mkkom.name[222],"K RM E"); strcpy(mkkom.name1[222],"K ИП E"); strcpy(mkkom.name2[222],"KRME"); strcpy(mkkom.name[223],"PK RM"); strcpy(mkkom.name1[223],"PK ИП"); mkkom.len[223]=1; strcpy(mkkom.name2[223],"PKRM"); mkkom.par[223]=3; strcpy(mkkom.name[224],"K X=0 0"); strcpy(mkkom.name1[224],"K x=0 0"); strcpy(mkkom.name2[224],"KX=00"); strcpy(mkkom.name[225],"K X=0 1"); strcpy(mkkom.name1[225],"K x=0 1"); strcpy(mkkom.name2[225],"KX=01"); strcpy(mkkom.name[226],"K X=0 2"); strcpy(mkkom.name1[226],"K x=0 2"); strcpy(mkkom.name2[226],"KX=02"); strcpy(mkkom.name[227],"K X=0 3"); strcpy(mkkom.name1[227],"K x=0 3"); strcpy(mkkom.name2[227],"KX=03"); strcpy(mkkom.name[228],"K X=0 4"); strcpy(mkkom.name1[228],"K x=0 4"); strcpy(mkkom.name2[228],"KX=04"); strcpy(mkkom.name[229],"K X=0 5"); strcpy(mkkom.name1[229],"K x=0 5"); strcpy(mkkom.name2[229],"KX=05"); strcpy(mkkom.name[230],"K X=0 6"); strcpy(mkkom.name1[230],"K x=0 6"); strcpy(mkkom.name2[230],"KX=06"); strcpy(mkkom.name[231],"K X=0 7"); strcpy(mkkom.name1[231],"K x=0 7"); strcpy(mkkom.name2[231],"KX=07"); strcpy(mkkom.name[232],"K X=0 8"); strcpy(mkkom.name1[232],"K x=0 8"); strcpy(mkkom.name2[232],"KX=08"); strcpy(mkkom.name[233],"K X=0 9"); strcpy(mkkom.name1[233],"K x=0 9"); strcpy(mkkom.name2[233],"KX=09"); strcpy(mkkom.name[234],"K X=0 A"); strcpy(mkkom.name1[234],"K x=0 A"); strcpy(mkkom.name2[234],"KX=0A"); strcpy(mkkom.name[235],"K X=0 B"); strcpy(mkkom.name1[235],"K x=0 B"); strcpy(mkkom.name2[235],"KX=0B"); strcpy(mkkom.name[236],"K X=0 C"); strcpy(mkkom.name1[236],"K x=0 C"); strcpy(mkkom.name2[236],"KX=0C"); strcpy(mkkom.name[237],"K X=0 D"); strcpy(mkkom.name1[237],"K x=0 D"); strcpy(mkkom.name2[237],"KX=0D"); strcpy(mkkom.name[238],"K X=0 E"); strcpy(mkkom.name1[238],"K x=0 E"); strcpy(mkkom.name2[238],"KX=0E"); strcpy(mkkom.name[239],"PK X=0"); strcpy(mkkom.name1[239],"PK x=0"); mkkom.len[239]=1; strcpy(mkkom.name2[239],"PKX=0"); mkkom.par[239]=3; strcpy(mkkom.name[240],".DB 0F0h"); strcpy(mkkom.name1[240],"F0h"); strcpy(mkkom.name2[240],"?"); strcpy(mkkom.name[241],"P GOTO"); strcpy(mkkom.name1[241],"P БП"); mkkom.len[241]=2; //PБП strcpy(mkkom.name2[241],"PGOTO"); mkkom.par[241]=2; strcpy(mkkom.name[242],"PP RTN"); strcpy(mkkom.name1[242],"PP В/О"); strcpy(mkkom.name2[242],"PPRTN"); strcpy(mkkom.name[243],"P GSB"); strcpy(mkkom.name1[243],"P ПП"); mkkom.len[243]=2; //PПП strcpy(mkkom.name2[243],"PGSB"); mkkom.par[243]=2; strcpy(mkkom.name[244],"PP M"); strcpy(mkkom.name1[244],"PP П"); mkkom.len[244]=2; //PPП strcpy(mkkom.name2[244],"PPM"); mkkom.par[244]=4; strcpy(mkkom.name[245],".DB 0F5h"); strcpy(mkkom.name1[245],"F5h"); strcpy(mkkom.name2[245],"?"); strcpy(mkkom.name[246],"PP RM"); strcpy(mkkom.name1[246],"PP ИП"); mkkom.len[246]=2; strcpy(mkkom.name2[246],"PPRM"); mkkom.par[246]=4; strcpy(mkkom.name[247],"P X!=0"); strcpy(mkkom.name1[247],"P x≠0"); mkkom.len[247]=2; strcpy(mkkom.name2[247],"PX!=0"); mkkom.par[247]=2; strcpy(mkkom.name[248],"PF L2"); strcpy(mkkom.name1[248],"PF L2"); mkkom.len[248]=2; strcpy(mkkom.name2[248],"PFL2"); mkkom.par[248]=2; strcpy(mkkom.name[249],"P X>=0"); strcpy(mkkom.name1[249],"P x≥0"); mkkom.len[249]=2; strcpy(mkkom.name2[249],"PX>=0"); mkkom.par[249]=2; strcpy(mkkom.name[250],"PF L3"); strcpy(mkkom.name1[250],"PF L3"); mkkom.len[250]=2; strcpy(mkkom.name2[250],"PFL3"); mkkom.par[250]=2; strcpy(mkkom.name[251],"PF L1"); strcpy(mkkom.name1[251],"PF L1"); mkkom.len[251]=2; strcpy(mkkom.name2[251],"PFL1"); mkkom.par[251]=2; strcpy(mkkom.name[252],"P X<0"); strcpy(mkkom.name1[252],"P x<0"); mkkom.len[252]=2; strcpy(mkkom.name2[252],"PX<0"); mkkom.par[252]=2; strcpy(mkkom.name[253],"PF L0"); strcpy(mkkom.name1[253],"PF L0"); mkkom.len[253]=2; strcpy(mkkom.name2[253],"PFL0"); mkkom.par[253]=2; strcpy(mkkom.name[254],"P X=0"); strcpy(mkkom.name1[254],"P x=0"); mkkom.len[254]=2; strcpy(mkkom.name2[254],"PX=0"); mkkom.par[254]=2; strcpy(mkkom.name[255],".DB 0FFh"); strcpy(mkkom.name1[255],"FFh"); strcpy(mkkom.name2[255],"?"); for (i=0; i<256; i++) { strcpy(temp,mkkom.name1[i]); mkstrcpy(mkkom.name1[i],temp,1,0); // перекодировать в cp1251 для html } end: return(re); } /*---------------- Инициализация таблицы ошибок компиляции ----------------*/ int init_mkerror() { int i; int re=0; compilation_error = 0; if (mkerror.init!=0) {re=1; goto end;} mkerror.init=1; mkerror.initvsego=20; mkerror.vsego=0; for (i=0; i4)||(chset2<0)||(chset2>4)) {str2[0]=0; goto end; } i=0; j=0; if (chset1==4) i=2; if (chset2==4) {str2[0]=0xFF; str2[1]=0xFE; j=2; } ci: if ((chset1==0)||(chset1==1)||(chset1==2)) {l=str1[i]; i++; if (l<0) l+=256; goto ci1; } if (chset1==3) {l1=str1[i]; l2=str1[i+1]; if (l1<0) l1+=256; if (l1<128) {i+=1; l=l1;} else {if (l2<0) l2+=256; i+=2; l=l1*256+l2; } goto ci1; } if (chset1==4) {l1=str1[i]; l2=str1[i+1]; if (l1<0) l1+=256; if (l2<0) l2+=256; i+=2; l=l1+l2*256; goto ci1; } ci1: l2=l; // поиск по массиву. если ничего не будет найдено - не перекодировать for (m=0; m<66; m++) { l1=mkcharset[m][chset1]; if (l1==l) l2=mkcharset[m][chset2]; } if ((chset2==0)||(chset2==1)||(chset2==2)) { // вставить один байт в строку str2[j]=(char)(l2%256); j++; goto cinext; } if (chset2==3) { if (l2<128) { // вставить один байт в строку str2[j]=(char)(l2%256); j++; goto cinext; } str2[j]=(char)((l2/256)%256); str2[j+1]=(char)(l2%256); j+=2; goto cinext; } if (chset2==4) { str2[j]=(char)(l2%256); str2[j+1]=(char)((l2/256)%256); j+=2; } cinext: if ((i>=k)||(j>254)) { str2[j]=0; str2[j+1]=0; goto end; } else goto ci; end: return; } /*===================================================== MAIN ======================*/ int main(int argc, char *argv[]) { int i,j,k; char c; //int flag_charset; del v0.18 int re=EXIT_SUCCESS; fp0=fp1=fp2=fp3=fp4=NULL; fname_vsego=0; //flag_charset=0; del v0.18 mkiocharset=0; kluch_i=0; // v0.21 j=0; // считывание файла конфигурации - если он есть //fp0=fopen("mkl2mkp.cfg","rb"); // открыть файл CFG для чтения del v0.18 fp0=fopen("mk.cfg","rb"); // открыть файл CFG для чтения v0.18 if (fp0!=NULL) { i=fgetc(fp0); //if (i!=EOF) mkiocharset=i-48; // байт 0 - кодировка del v0.18 //if (i!=EOF) mkiocharset=i; // байт 0 - кодировка v0.18 del v0.20 if (i!=EOF) { // v0.20 if (i%256=='m') { k=fseek(fp0,32,SEEK_SET); if (k==0) i=fgetc(fp0); // байт 32 - кодировка для CFG v0.11 } mkiocharset=i; // байт 0 - кодировка для CFG v0.1 } if ((mkiocharset<0)||(mkiocharset>4)) mkiocharset=0; fclose(fp0); } init_msg(); // кодировка установлена - инициализировать сообщения повторно // разбор строки аргументов if (argc<=1) goto nach; for (i=1; i4) j=4; strncpy(fname[j+1],argv[i],255); if (j<4) fname_vsego++; } else { c=argv[i][1]; if ((c=='h')||(c=='H')||(c=='?')) { /* help */ // v0.22 printf("%s",mes[0]); printf("%s %s",mes[13],mes[0]); printf("%s %s",mes[14],mes[0]); printf("\t%s %s",mes[15],mes[0]); printf("\t%s %s",mes[16],mes[0]); printf("\t%s %s",mes[17],mes[0]); printf("\t%s %s",mes[18],mes[0]); printf("%s ",mes[19]); switch(mkiocharset) {case 0: printf("CP866"); break; case 1: printf("CP1251"); break; case 2: printf("KOI8R"); break; case 3: printf("UTF8"); break; case 4: printf("UCS2"); break; default: printf("?"); } printf("%s",mes[0]); //v0.13 printf("Russian charset is "); switch(mkiocharset) {case 0: printf("CP866"); break; case 1: printf("CP1251"); break; case 2: printf("KOI8R"); break; case 3: printf("UTF8"); break; case 4: printf("UCS2"); break; default: printf("?"); } goto end; } if ((c=='v')||(c=='V')) { /* version */ printf(mkversion); if (dos==0) printf(" (GNU/Linux)"); if (dos==1) printf(" (DOS)"); if (dos==2) printf(" (Win32)"); //v0.17 goto end; } /* del v0.18 if ((c=='c')||(c=='C')) { flag_charset=1; goto nextargv; } */ if ((c=='w')||(c=='W')) { /* copyleft & warranty */ printf("Copyright (C) 2007-2020 by NPP SEMIKO (Russia, Novosibirsk) %s%s",mes[0],mes[0]); printf("This program is free software; you can redistribute it and/or modify %s",mes[0]); printf("it under the terms of the GNU General Public License as published by %s",mes[0]); printf("the Free Software Foundation; either version 2 of the License, or %s",mes[0]); printf("(at your option) any later version. %s%s",mes[0],mes[0]); printf("This program is distributed in the hope that it will be useful, %s",mes[0]); printf("but WITHOUT ANY WARRANTY; without even the implied warranty of %s",mes[0]); printf("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %s",mes[0]); printf("GNU General Public License for more details. %s%s",mes[0],mes[0]); printf("You should have received a copy of the GNU General Public License %s",mes[0]); printf("along with this program; if not, write to the Free Software %s",mes[0]); printf("Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"); goto end; } if ((c=='i')||(c=='I')) { // v0.21 kluch_i=1; /* выводить информацию */ goto nextargv; } //if (flag_charset!=2) printf(mes[4]); goto end; //del v.018 } nextargv:; } nach: //if (fname_vsego<=0) {printf("%s %s %s %s",mes[4],mes[0],mes[4],mes[0]); re=EX_USAGE; goto end;} // нет файла v0.22 if (fname_vsego<=0) {printf("%s %s %s",mes[0],mes[4],mes[0]); re=EX_USAGE; goto end;} // нет файла v0.22 fp1=fopen(fname[1],"rt"); // открыть MKL как текст для чтения if (fp1==NULL) {printf(mes[5]); re=EX_NOINPUT; goto end;} // файл MKL не открыт k=strlen(fname[1]); for (i=k; i>0; i--) { if ( (fname[1][i]=='.')&&(i0)&&(i 0) { re = EX_COMPILATION; } return re; }