1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901
|
; flat assembler core
; Copyright (c) 1999-2021, Tomasz Grysztar.
; All rights reserved.
preprocessor:
mov edi,characters
xor al,al
make_characters_table:
stosb
inc al
jnz make_characters_table
mov esi,characters+'a'
mov edi,characters+'A'
mov ecx,26
rep movsb
mov edi,characters
mov esi,symbol_characters+1
movzx ecx,byte [esi-1]
xor eax,eax
mark_symbol_characters:
lodsb
mov byte [edi+eax],0
loop mark_symbol_characters
mov edi,locals_counter
mov ax,1 + '0' shl 8
stos word [edi]
mov edi,[memory_start]
mov [include_paths],edi
mov esi,include_variable
call get_environment_variable
xor al,al
stos byte [edi]
mov [memory_start],edi
mov eax,[additional_memory]
mov [free_additional_memory],eax
mov eax,[additional_memory_end]
mov [labels_list],eax
xor eax,eax
mov [source_start],eax
mov [tagged_blocks],eax
mov [hash_tree],eax
mov [error],eax
mov [macro_status],al
mov [current_line],eax
mov esi,[initial_definitions]
test esi,esi
jz predefinitions_ok
process_predefinitions:
movzx ecx,byte [esi]
test ecx,ecx
jz predefinitions_ok
inc esi
lea eax,[esi+ecx]
push eax
mov ch,10b
call add_preprocessor_symbol
pop esi
mov edi,[memory_start]
mov [edx+8],edi
convert_predefinition:
cmp edi,[memory_end]
jae out_of_memory
lods byte [esi]
or al,al
jz predefinition_converted
cmp al,20h
je convert_predefinition
mov ah,al
mov ebx,characters
xlat byte [ebx]
or al,al
jz predefinition_separator
cmp ah,27h
je predefinition_string
cmp ah,22h
je predefinition_string
mov byte [edi],1Ah
scas word [edi]
xchg al,ah
stos byte [edi]
mov ebx,characters
xor ecx,ecx
predefinition_symbol:
lods byte [esi]
stos byte [edi]
xlat byte [ebx]
or al,al
loopnzd predefinition_symbol
neg ecx
cmp ecx,255
ja invalid_definition
mov ebx,edi
sub ebx,ecx
mov byte [ebx-2],cl
found_predefinition_separator:
dec edi
mov ah,[esi-1]
predefinition_separator:
xchg al,ah
or al,al
jz predefinition_converted
cmp al,20h
je convert_predefinition
cmp al,3Bh
je invalid_definition
cmp al,5Ch
je predefinition_backslash
stos byte [edi]
jmp convert_predefinition
predefinition_string:
mov al,22h
stos byte [edi]
scas dword [edi]
mov ebx,edi
copy_predefinition_string:
lods byte [esi]
stos byte [edi]
or al,al
jz invalid_definition
cmp al,ah
jne copy_predefinition_string
lods byte [esi]
cmp al,ah
je copy_predefinition_string
dec esi
dec edi
mov eax,edi
sub eax,ebx
mov [ebx-4],eax
jmp convert_predefinition
predefinition_backslash:
mov byte [edi],0
lods byte [esi]
or al,al
jz invalid_definition
cmp al,20h
je invalid_definition
cmp al,3Bh
je invalid_definition
mov al,1Ah
stos byte [edi]
mov ecx,edi
mov ax,5C01h
stos word [edi]
dec esi
group_predefinition_backslashes:
lods byte [esi]
cmp al,5Ch
jne predefinition_backslashed_symbol
stos byte [edi]
inc byte [ecx]
jmp group_predefinition_backslashes
predefinition_backslashed_symbol:
cmp al,20h
je invalid_definition
cmp al,22h
je invalid_definition
cmp al,27h
je invalid_definition
cmp al,3Bh
je invalid_definition
mov ah,al
mov ebx,characters
xlat byte [ebx]
or al,al
jz predefinition_backslashed_symbol_character
mov al,ah
convert_predefinition_backslashed_symbol:
stos byte [edi]
xlat byte [ebx]
or al,al
jz found_predefinition_separator
inc byte [ecx]
jz invalid_definition
lods byte [esi]
jmp convert_predefinition_backslashed_symbol
predefinition_backslashed_symbol_character:
mov al,ah
stos byte [edi]
inc byte [ecx]
jmp convert_predefinition
predefinition_converted:
mov [memory_start],edi
sub edi,[edx+8]
mov [edx+12],edi
jmp process_predefinitions
predefinitions_ok:
mov esi,[input_file]
mov edx,esi
call open
jc main_file_not_found
mov edi,[memory_start]
call preprocess_file
cmp [macro_status],0
je process_postponed
mov eax,[error_line]
mov [current_line],eax
jmp incomplete_macro
process_postponed:
mov edx,hash_tree
mov ecx,32
find_postponed_list:
mov edx,[edx]
or edx,edx
loopnz find_postponed_list
jz preprocessing_finished
process_postponed_list:
mov eax,[edx]
or eax,eax
jz preprocessing_finished
push edx
mov ebx,edx
find_earliest_postponed:
mov eax,[edx]
or eax,eax
jz earliest_postponed_found
mov ebx,edx
mov edx,eax
jmp find_earliest_postponed
earliest_postponed_found:
mov [ebx],eax
call use_postponed_macro
pop edx
cmp [macro_status],0
je process_postponed_list
mov eax,[error_line]
mov [current_line],eax
jmp incomplete_macro
preprocessing_finished:
mov [source_start],edi
ret
use_postponed_macro:
lea esi,[edi-1]
push ecx esi
mov [struc_name],0
jmp use_macro
preprocess_file:
push [memory_end]
push esi
mov al,2
xor edx,edx
call lseek
push eax
xor al,al
xor edx,edx
call lseek
pop ecx
mov edx,[memory_end]
dec edx
mov byte [edx],1Ah
sub edx,ecx
jc out_of_memory
mov esi,edx
cmp edx,edi
jbe out_of_memory
mov [memory_end],edx
call read
call close
pop edx
xor ecx,ecx
mov ebx,esi
preprocess_source:
inc ecx
mov [current_line],edi
mov eax,edx
stos dword [edi]
mov eax,ecx
stos dword [edi]
mov eax,esi
sub eax,ebx
stos dword [edi]
xor eax,eax
stos dword [edi]
push ebx edx
call convert_line
call preprocess_line
pop edx ebx
next_line:
cmp byte [esi-1],0
je file_end
cmp byte [esi-1],1Ah
jne preprocess_source
file_end:
pop [memory_end]
clc
ret
convert_line:
push ecx
test [macro_status],0Fh
jz convert_line_data
mov ax,3Bh
stos word [edi]
convert_line_data:
cmp edi,[memory_end]
jae out_of_memory
lods byte [esi]
cmp al,20h
je convert_line_data
cmp al,9
je convert_line_data
mov ah,al
mov ebx,characters
xlat byte [ebx]
or al,al
jz convert_separator
cmp ah,27h
je convert_string
cmp ah,22h
je convert_string
mov byte [edi],1Ah
scas word [edi]
xchg al,ah
stos byte [edi]
mov ebx,characters
xor ecx,ecx
convert_symbol:
lods byte [esi]
stos byte [edi]
xlat byte [ebx]
or al,al
loopnzd convert_symbol
neg ecx
cmp ecx,255
ja name_too_long
mov ebx,edi
sub ebx,ecx
mov byte [ebx-2],cl
found_separator:
dec edi
mov ah,[esi-1]
convert_separator:
xchg al,ah
cmp al,20h
jb control_character
je convert_line_data
symbol_character:
cmp al,3Bh
je ignore_comment
cmp al,5Ch
je backslash_character
stos byte [edi]
jmp convert_line_data
control_character:
cmp al,1Ah
je line_end
cmp al,0Dh
je cr_character
cmp al,0Ah
je lf_character
cmp al,9
je convert_line_data
or al,al
jnz symbol_character
jmp line_end
lf_character:
lods byte [esi]
cmp al,0Dh
je line_end
dec esi
jmp line_end
cr_character:
lods byte [esi]
cmp al,0Ah
je line_end
dec esi
jmp line_end
convert_string:
mov al,22h
stos byte [edi]
scas dword [edi]
mov ebx,edi
copy_string:
lods byte [esi]
stos byte [edi]
cmp al,0Ah
je no_end_quote
cmp al,0Dh
je no_end_quote
or al,al
jz no_end_quote
cmp al,1Ah
je no_end_quote
cmp al,ah
jne copy_string
lods byte [esi]
cmp al,ah
je copy_string
dec esi
dec edi
mov eax,edi
sub eax,ebx
mov [ebx-4],eax
jmp convert_line_data
backslash_character:
mov byte [edi],0
lods byte [esi]
cmp al,20h
je concatenate_lines
cmp al,9
je concatenate_lines
cmp al,1Ah
je unexpected_end_of_file
or al,al
jz unexpected_end_of_file
cmp al,0Ah
je concatenate_lf
cmp al,0Dh
je concatenate_cr
cmp al,3Bh
je find_concatenated_line
mov al,1Ah
stos byte [edi]
mov ecx,edi
mov ax,5C01h
stos word [edi]
dec esi
group_backslashes:
lods byte [esi]
cmp al,5Ch
jne backslashed_symbol
stos byte [edi]
inc byte [ecx]
jz name_too_long
jmp group_backslashes
no_end_quote:
mov byte [ebx-5],0
jmp missing_end_quote
backslashed_symbol:
cmp al,1Ah
je unexpected_end_of_file
or al,al
jz unexpected_end_of_file
cmp al,0Ah
je extra_characters_on_line
cmp al,0Dh
je extra_characters_on_line
cmp al,20h
je extra_characters_on_line
cmp al,9
je extra_characters_on_line
cmp al,22h
je extra_characters_on_line
cmp al,27h
je extra_characters_on_line
cmp al,3Bh
je extra_characters_on_line
mov ah,al
mov ebx,characters
xlat byte [ebx]
or al,al
jz backslashed_symbol_character
mov al,ah
convert_backslashed_symbol:
stos byte [edi]
xlat byte [ebx]
or al,al
jz found_separator
inc byte [ecx]
jz name_too_long
lods byte [esi]
jmp convert_backslashed_symbol
backslashed_symbol_character:
mov al,ah
stos byte [edi]
inc byte [ecx]
jmp convert_line_data
concatenate_lines:
lods byte [esi]
cmp al,20h
je concatenate_lines
cmp al,9
je concatenate_lines
cmp al,1Ah
je unexpected_end_of_file
or al,al
jz unexpected_end_of_file
cmp al,0Ah
je concatenate_lf
cmp al,0Dh
je concatenate_cr
cmp al,3Bh
jne extra_characters_on_line
find_concatenated_line:
lods byte [esi]
cmp al,0Ah
je concatenate_lf
cmp al,0Dh
je concatenate_cr
or al,al
jz concatenate_ok
cmp al,1Ah
jne find_concatenated_line
jmp unexpected_end_of_file
concatenate_lf:
lods byte [esi]
cmp al,0Dh
je concatenate_ok
dec esi
jmp concatenate_ok
concatenate_cr:
lods byte [esi]
cmp al,0Ah
je concatenate_ok
dec esi
concatenate_ok:
inc dword [esp]
jmp convert_line_data
ignore_comment:
lods byte [esi]
cmp al,0Ah
je lf_character
cmp al,0Dh
je cr_character
or al,al
jz line_end
cmp al,1Ah
jne ignore_comment
line_end:
xor al,al
stos byte [edi]
pop ecx
ret
lower_case:
mov edi,converted
mov ebx,characters
convert_case:
lods byte [esi]
xlat byte [ebx]
stos byte [edi]
loop convert_case
case_ok:
ret
get_directive:
push edi
mov edx,esi
mov ebp,ecx
call lower_case
pop edi
scan_directives:
mov esi,converted
movzx eax,byte [edi]
or al,al
jz no_directive
mov ecx,ebp
inc edi
mov ebx,edi
add ebx,eax
mov ah,[esi]
cmp ah,[edi]
jb no_directive
ja next_directive
cmp cl,al
jne next_directive
repe cmps byte [esi],[edi]
jb no_directive
je directive_found
next_directive:
mov edi,ebx
add edi,2
jmp scan_directives
no_directive:
mov esi,edx
mov ecx,ebp
stc
ret
directive_found:
call get_directive_handler_base
directive_handler:
lea esi,[edx+ebp]
movzx ecx,word [ebx]
add eax,ecx
clc
ret
get_directive_handler_base:
mov eax,[esp]
ret
preprocess_line:
mov eax,esp
sub eax,[stack_limit]
cmp eax,100h
jb stack_overflow
push ecx esi
preprocess_current_line:
mov esi,[current_line]
add esi,16
cmp word [esi],3Bh
jne line_start_ok
add esi,2
line_start_ok:
test [macro_status],0F0h
jnz macro_preprocessing
cmp byte [esi],1Ah
jne not_fix_constant
movzx edx,byte [esi+1]
lea edx,[esi+2+edx]
cmp word [edx],031Ah
jne not_fix_constant
mov ebx,characters
movzx eax,byte [edx+2]
xlat byte [ebx]
ror eax,8
mov al,[edx+3]
xlat byte [ebx]
ror eax,8
mov al,[edx+4]
xlat byte [ebx]
ror eax,16
cmp eax,'fix'
je define_fix_constant
not_fix_constant:
call process_fix_constants
jmp initial_preprocessing_ok
macro_preprocessing:
call process_macro_operators
initial_preprocessing_ok:
mov esi,[current_line]
add esi,16
mov al,[macro_status]
test al,2
jnz skip_macro_block
test al,1
jnz find_macro_block
preprocess_instruction:
mov [current_offset],esi
lods byte [esi]
movzx ecx,byte [esi]
inc esi
cmp al,1Ah
jne not_preprocessor_symbol
cmp cl,3
jb not_preprocessor_directive
push edi
mov edi,preprocessor_directives
call get_directive
pop edi
jc not_preprocessor_directive
mov byte [edx-2],3Bh
jmp near eax
not_preprocessor_directive:
xor ch,ch
call get_preprocessor_symbol
jc not_macro
mov byte [ebx-2],3Bh
mov [struc_name],0
jmp use_macro
not_macro:
mov [struc_name],esi
add esi,ecx
lods byte [esi]
cmp al,':'
je preprocess_label
cmp al,1Ah
jne not_preprocessor_symbol
lods byte [esi]
cmp al,3
jne not_symbolic_constant
mov ebx,characters
movzx eax,byte [esi]
xlat byte [ebx]
ror eax,8
mov al,[esi+1]
xlat byte [ebx]
ror eax,8
mov al,[esi+2]
xlat byte [ebx]
ror eax,16
cmp eax,'equ'
je define_equ_constant
mov al,3
not_symbolic_constant:
mov ch,1
mov cl,al
call get_preprocessor_symbol
jc not_preprocessor_symbol
push edx esi
mov esi,[struc_name]
mov [struc_label],esi
sub [struc_label],2
mov cl,[esi-1]
mov ch,10b
call get_preprocessor_symbol
jc struc_name_ok
mov ecx,[edx+12]
add ecx,3
lea ebx,[edi+ecx]
mov ecx,edi
sub ecx,[struc_label]
lea esi,[edi-1]
lea edi,[ebx-1]
std
rep movs byte [edi],[esi]
cld
mov edi,[struc_label]
mov esi,[edx+8]
mov ecx,[edx+12]
add [struc_name],ecx
add [struc_name],3
call move_data
mov al,3Ah
stos byte [edi]
mov ax,3Bh
stos word [edi]
mov edi,ebx
pop esi
add esi,[edx+12]
add esi,3
pop edx
jmp use_macro
struc_name_ok:
mov edx,[struc_name]
movzx eax,byte [edx-1]
add edx,eax
push edi
lea esi,[edi-1]
mov ecx,edi
sub ecx,edx
std
rep movs byte [edi],[esi]
cld
pop edi
inc edi
mov al,3Ah
mov [edx],al
inc al
mov [edx+1],al
pop esi edx
inc esi
jmp use_macro
preprocess_label:
dec esi
sub esi,ecx
lea ebp,[esi-2]
mov ch,10b
call get_preprocessor_symbol
jnc symbolic_constant_in_label
lea esi,[esi+ecx+1]
cmp byte [esi],':'
jne preprocess_instruction
inc esi
jmp preprocess_instruction
symbolic_constant_in_label:
mov ebx,[edx+8]
mov ecx,[edx+12]
add ecx,ebx
check_for_broken_label:
cmp ebx,ecx
je label_broken
cmp byte [ebx],1Ah
jne label_broken
movzx eax,byte [ebx+1]
lea ebx,[ebx+2+eax]
cmp ebx,ecx
je label_constant_ok
cmp byte [ebx],':'
jne label_broken
inc ebx
cmp byte [ebx],':'
jne check_for_broken_label
inc ebx
jmp check_for_broken_label
label_broken:
call replace_symbolic_constant
jmp line_preprocessed
label_constant_ok:
mov ecx,edi
sub ecx,esi
mov edi,[edx+12]
add edi,ebp
push edi
lea eax,[edi+ecx]
push eax
cmp esi,edi
je replace_label
jb move_rest_of_line_up
rep movs byte [edi],[esi]
jmp replace_label
move_rest_of_line_up:
lea esi,[esi+ecx-1]
lea edi,[edi+ecx-1]
std
rep movs byte [edi],[esi]
cld
replace_label:
mov ecx,[edx+12]
mov edi,[esp+4]
sub edi,ecx
mov esi,[edx+8]
rep movs byte [edi],[esi]
pop edi esi
inc esi
jmp preprocess_instruction
not_preprocessor_symbol:
mov esi,[current_offset]
call process_equ_constants
line_preprocessed:
pop esi ecx
ret
get_preprocessor_symbol:
push ebp edi esi
mov ebp,ecx
shl ebp,22
movzx ecx,cl
mov ebx,hash_tree
mov edi,10
follow_hashes_roots:
mov edx,[ebx]
or edx,edx
jz preprocessor_symbol_not_found
xor eax,eax
shl ebp,1
adc eax,0
lea ebx,[edx+eax*4]
dec edi
jnz follow_hashes_roots
mov edi,ebx
call calculate_hash
mov ebp,eax
and ebp,3FFh
shl ebp,10
xor ebp,eax
mov ebx,edi
mov edi,22
follow_hashes_tree:
mov edx,[ebx]
or edx,edx
jz preprocessor_symbol_not_found
xor eax,eax
shl ebp,1
adc eax,0
lea ebx,[edx+eax*4]
dec edi
jnz follow_hashes_tree
mov al,cl
mov edx,[ebx]
or edx,edx
jz preprocessor_symbol_not_found
compare_with_preprocessor_symbol:
mov edi,[edx+4]
cmp edi,1
jbe next_equal_hash
repe cmps byte [esi],[edi]
je preprocessor_symbol_found
mov cl,al
mov esi,[esp]
next_equal_hash:
mov edx,[edx]
or edx,edx
jnz compare_with_preprocessor_symbol
preprocessor_symbol_not_found:
pop esi edi ebp
stc
ret
preprocessor_symbol_found:
pop ebx edi ebp
clc
ret
calculate_hash:
xor ebx,ebx
mov eax,2166136261
mov ebp,16777619
fnv1a_hash:
xor al,[esi+ebx]
mul ebp
inc bl
cmp bl,cl
jb fnv1a_hash
ret
add_preprocessor_symbol:
push edi esi
xor eax,eax
or cl,cl
jz reshape_hash
cmp ch,11b
je preprocessor_symbol_name_ok
push ecx
movzx ecx,cl
mov edi,preprocessor_directives
call get_directive
jnc reserved_word_used_as_symbol
pop ecx
preprocessor_symbol_name_ok:
call calculate_hash
reshape_hash:
mov ebp,eax
and ebp,3FFh
shr eax,10
xor ebp,eax
shl ecx,22
or ebp,ecx
mov ebx,hash_tree
mov ecx,32
find_leave_for_symbol:
mov edx,[ebx]
or edx,edx
jz extend_hashes_tree
xor eax,eax
rol ebp,1
adc eax,0
lea ebx,[edx+eax*4]
dec ecx
jnz find_leave_for_symbol
mov edx,[ebx]
or edx,edx
jz add_symbol_entry
shr ebp,30
cmp ebp,11b
je reuse_symbol_entry
cmp dword [edx+4],0
jne add_symbol_entry
find_entry_to_reuse:
mov edi,[edx]
or edi,edi
jz reuse_symbol_entry
cmp dword [edi+4],0
jne reuse_symbol_entry
mov edx,edi
jmp find_entry_to_reuse
add_symbol_entry:
mov eax,edx
mov edx,[labels_list]
sub edx,16
cmp edx,[free_additional_memory]
jb out_of_memory
mov [labels_list],edx
mov [edx],eax
mov [ebx],edx
reuse_symbol_entry:
pop esi edi
mov [edx+4],esi
ret
extend_hashes_tree:
mov edx,[labels_list]
sub edx,8
cmp edx,[free_additional_memory]
jb out_of_memory
mov [labels_list],edx
xor eax,eax
mov [edx],eax
mov [edx+4],eax
shl ebp,1
adc eax,0
mov [ebx],edx
lea ebx,[edx+eax*4]
dec ecx
jnz extend_hashes_tree
mov edx,[labels_list]
sub edx,16
cmp edx,[free_additional_memory]
jb out_of_memory
mov [labels_list],edx
mov dword [edx],0
mov [ebx],edx
pop esi edi
mov [edx+4],esi
ret
define_fix_constant:
add edx,5
add esi,2
push edx
mov ch,11b
jmp define_preprocessor_constant
define_equ_constant:
add esi,3
push esi
call process_equ_constants
mov esi,[struc_name]
mov ch,10b
define_preprocessor_constant:
mov byte [esi-2],3Bh
mov cl,[esi-1]
call add_preprocessor_symbol
pop ebx
mov ecx,edi
dec ecx
sub ecx,ebx
mov [edx+8],ebx
mov [edx+12],ecx
jmp line_preprocessed
define_symbolic_constant:
lods byte [esi]
cmp al,1Ah
jne invalid_name
lods byte [esi]
mov cl,al
mov ch,10b
call add_preprocessor_symbol
movzx eax,byte [esi-1]
add esi,eax
lea ecx,[edi-1]
sub ecx,esi
mov [edx+8],esi
mov [edx+12],ecx
jmp line_preprocessed
define_struc:
mov ch,1
jmp make_macro
define_macro:
xor ch,ch
make_macro:
lods byte [esi]
cmp al,1Ah
jne invalid_name
lods byte [esi]
mov cl,al
call add_preprocessor_symbol
mov eax,[current_line]
mov [edx+12],eax
movzx eax,byte [esi-1]
add esi,eax
mov [edx+8],esi
mov al,[macro_status]
and al,0F0h
or al,1
mov [macro_status],al
mov eax,[current_line]
mov [error_line],eax
xor ebp,ebp
lods byte [esi]
or al,al
jz line_preprocessed
cmp al,'{'
je found_macro_block
dec esi
skip_macro_arguments:
lods byte [esi]
cmp al,1Ah
je skip_macro_argument
cmp al,'['
jne invalid_macro_arguments
or ebp,-1
jz invalid_macro_arguments
lods byte [esi]
cmp al,1Ah
jne invalid_macro_arguments
skip_macro_argument:
movzx eax,byte [esi]
inc esi
add esi,eax
lods byte [esi]
cmp al,':'
je macro_argument_with_default_value
cmp al,'='
je macro_argument_with_default_value
cmp al,'*'
jne macro_argument_end
lods byte [esi]
macro_argument_end:
cmp al,','
je skip_macro_arguments
cmp al,'&'
je macro_arguments_finisher
cmp al,']'
jne end_macro_arguments
not ebp
macro_arguments_finisher:
lods byte [esi]
end_macro_arguments:
or ebp,ebp
jnz invalid_macro_arguments
or al,al
jz line_preprocessed
cmp al,'{'
je found_macro_block
jmp invalid_macro_arguments
macro_argument_with_default_value:
or [skip_default_argument_value],-1
call skip_macro_argument_value
inc esi
jmp macro_argument_end
skip_macro_argument_value:
cmp byte [esi],'<'
jne simple_argument
mov ecx,1
inc esi
enclosed_argument:
lods byte [esi]
or al,al
jz invalid_macro_arguments
cmp al,1Ah
je enclosed_symbol
cmp al,22h
je enclosed_string
cmp al,'>'
je enclosed_argument_end
cmp al,'<'
jne enclosed_argument
inc ecx
jmp enclosed_argument
enclosed_symbol:
movzx eax,byte [esi]
inc esi
add esi,eax
jmp enclosed_argument
enclosed_string:
lods dword [esi]
add esi,eax
jmp enclosed_argument
enclosed_argument_end:
loop enclosed_argument
lods byte [esi]
or al,al
jz argument_value_end
cmp al,','
je argument_value_end
cmp [skip_default_argument_value],0
je invalid_macro_arguments
cmp al,'{'
je argument_value_end
cmp al,'&'
je argument_value_end
or ebp,ebp
jz invalid_macro_arguments
cmp al,']'
je argument_value_end
jmp invalid_macro_arguments
simple_argument:
lods byte [esi]
or al,al
jz argument_value_end
cmp al,','
je argument_value_end
cmp al,22h
je argument_string
cmp al,1Ah
je argument_symbol
cmp [skip_default_argument_value],0
je simple_argument
cmp al,'{'
je argument_value_end
cmp al,'&'
je argument_value_end
or ebp,ebp
jz simple_argument
cmp al,']'
je argument_value_end
argument_symbol:
movzx eax,byte [esi]
inc esi
add esi,eax
jmp simple_argument
argument_string:
lods dword [esi]
add esi,eax
jmp simple_argument
argument_value_end:
dec esi
ret
find_macro_block:
add esi,2
lods byte [esi]
or al,al
jz line_preprocessed
cmp al,'{'
jne unexpected_characters
found_macro_block:
or [macro_status],2
skip_macro_block:
lods byte [esi]
cmp al,1Ah
je skip_macro_symbol
cmp al,3Bh
je skip_macro_symbol
cmp al,22h
je skip_macro_string
or al,al
jz line_preprocessed
cmp al,'}'
jne skip_macro_block
mov al,[macro_status]
and [macro_status],0F0h
test al,8
jnz use_instant_macro
cmp byte [esi],0
je line_preprocessed
mov ecx,edi
sub ecx,esi
mov edx,esi
lea esi,[esi+ecx-1]
lea edi,[edi+1+16]
mov ebx,edi
dec edi
std
rep movs byte [edi],[esi]
cld
mov edi,edx
xor al,al
stos byte [edi]
mov esi,[current_line]
mov [current_line],edi
mov ecx,4
rep movs dword [edi],[esi]
mov edi,ebx
jmp initial_preprocessing_ok
skip_macro_symbol:
movzx eax,byte [esi]
inc esi
add esi,eax
jmp skip_macro_block
skip_macro_string:
lods dword [esi]
add esi,eax
jmp skip_macro_block
postpone_directive:
push esi
mov esi,edx
xor ecx,ecx
call add_preprocessor_symbol
mov eax,[current_line]
mov [error_line],eax
mov [edx+12],eax
pop esi
mov [edx+8],esi
mov al,[macro_status]
and al,0F0h
or al,1
mov [macro_status],al
lods byte [esi]
or al,al
jz line_preprocessed
cmp al,'{'
jne unexpected_characters
jmp found_macro_block
rept_directive:
mov [base_code],0
jmp define_instant_macro
irp_directive:
mov [base_code],1
jmp define_instant_macro
irps_directive:
mov [base_code],2
jmp define_instant_macro
irpv_directive:
mov [base_code],3
jmp define_instant_macro
match_directive:
mov [base_code],10h
define_instant_macro:
mov al,[macro_status]
and al,0F0h
or al,8+1
mov [macro_status],al
mov eax,[current_line]
mov [error_line],eax
mov [instant_macro_start],esi
cmp [base_code],10h
je prepare_match
skip_parameters:
lods byte [esi]
or al,al
jz parameters_skipped
cmp al,'{'
je parameters_skipped
cmp al,22h
je skip_quoted_parameter
cmp al,1Ah
jne skip_parameters
lods byte [esi]
movzx eax,al
add esi,eax
jmp skip_parameters
skip_quoted_parameter:
lods dword [esi]
add esi,eax
jmp skip_parameters
parameters_skipped:
dec esi
mov [parameters_end],esi
lods byte [esi]
cmp al,'{'
je found_macro_block
or al,al
jnz invalid_macro_arguments
jmp line_preprocessed
prepare_match:
call skip_pattern
mov [value_type],80h+10b
call process_symbolic_constants
jmp parameters_skipped
skip_pattern:
lods byte [esi]
or al,al
jz invalid_macro_arguments
cmp al,','
je pattern_skipped
cmp al,22h
je skip_quoted_string_in_pattern
cmp al,1Ah
je skip_symbol_in_pattern
cmp al,'='
jne skip_pattern
mov al,[esi]
cmp al,1Ah
je skip_pattern
cmp al,22h
je skip_pattern
inc esi
jmp skip_pattern
skip_symbol_in_pattern:
lods byte [esi]
movzx eax,al
add esi,eax
jmp skip_pattern
skip_quoted_string_in_pattern:
lods dword [esi]
add esi,eax
jmp skip_pattern
pattern_skipped:
ret
purge_macro:
xor ch,ch
jmp restore_preprocessor_symbol
purge_struc:
mov ch,1
jmp restore_preprocessor_symbol
restore_equ_constant:
mov ch,10b
restore_preprocessor_symbol:
push ecx
lods byte [esi]
cmp al,1Ah
jne invalid_name
lods byte [esi]
mov cl,al
call get_preprocessor_symbol
jc no_symbol_to_restore
mov dword [edx+4],0
jmp symbol_restored
no_symbol_to_restore:
add esi,ecx
symbol_restored:
pop ecx
lods byte [esi]
cmp al,','
je restore_preprocessor_symbol
or al,al
jnz extra_characters_on_line
jmp line_preprocessed
process_fix_constants:
mov [value_type],11b
jmp process_symbolic_constants
process_equ_constants:
mov [value_type],10b
process_symbolic_constants:
mov ebp,esi
lods byte [esi]
cmp al,1Ah
je check_symbol
cmp al,22h
je ignore_string
cmp al,'{'
je check_brace
or al,al
jnz process_symbolic_constants
ret
ignore_string:
lods dword [esi]
add esi,eax
jmp process_symbolic_constants
check_brace:
test [value_type],80h
jz process_symbolic_constants
ret
no_replacing:
movzx ecx,byte [esi-1]
add esi,ecx
jmp process_symbolic_constants
check_symbol:
mov cl,[esi]
inc esi
mov ch,[value_type]
call get_preprocessor_symbol
jc no_replacing
mov [current_section],edi
replace_symbolic_constant:
mov ecx,[edx+12]
mov edx,[edx+8]
xchg esi,edx
call move_data
mov esi,edx
process_after_replaced:
lods byte [esi]
cmp al,1Ah
je symbol_after_replaced
stos byte [edi]
cmp al,22h
je string_after_replaced
cmp al,'{'
je brace_after_replaced
or al,al
jnz process_after_replaced
mov ecx,edi
sub ecx,esi
mov edi,ebp
call move_data
mov esi,edi
ret
move_data:
lea eax,[edi+ecx]
cmp eax,[memory_end]
jae out_of_memory
shr ecx,1
jnc movsb_ok
movs byte [edi],[esi]
movsb_ok:
shr ecx,1
jnc movsw_ok
movs word [edi],[esi]
movsw_ok:
rep movs dword [edi],[esi]
ret
string_after_replaced:
lods dword [esi]
stos dword [edi]
mov ecx,eax
call move_data
jmp process_after_replaced
brace_after_replaced:
test [value_type],80h
jz process_after_replaced
mov edx,edi
mov ecx,[current_section]
sub edx,ecx
sub ecx,esi
rep movs byte [edi],[esi]
mov ecx,edi
sub ecx,esi
mov edi,ebp
call move_data
lea esi,[ebp+edx]
ret
symbol_after_replaced:
mov cl,[esi]
inc esi
mov ch,[value_type]
call get_preprocessor_symbol
jnc replace_symbolic_constant
movzx ecx,byte [esi-1]
mov al,1Ah
mov ah,cl
stos word [edi]
call move_data
jmp process_after_replaced
process_macro_operators:
xor dl,dl
mov ebp,edi
before_macro_operators:
mov edi,esi
lods byte [esi]
cmp al,'`'
je symbol_conversion
cmp al,'#'
je concatenation
cmp al,1Ah
je symbol_before_macro_operators
cmp al,3Bh
je no_more_macro_operators
cmp al,22h
je string_before_macro_operators
xor dl,dl
or al,al
jnz before_macro_operators
mov edi,esi
ret
no_more_macro_operators:
mov edi,ebp
ret
symbol_before_macro_operators:
mov dl,1Ah
mov ebx,esi
lods byte [esi]
movzx ecx,al
jecxz symbol_before_macro_operators_ok
mov edi,esi
cmp byte [esi],'\'
je escaped_symbol
symbol_before_macro_operators_ok:
add esi,ecx
jmp before_macro_operators
string_before_macro_operators:
mov dl,22h
mov ebx,esi
lods dword [esi]
add esi,eax
jmp before_macro_operators
escaped_symbol:
dec byte [edi-1]
dec ecx
inc esi
cmp ecx,1
rep movs byte [edi],[esi]
jne after_macro_operators
mov al,[esi-1]
mov ecx,ebx
mov ebx,characters
xlat byte [ebx]
mov ebx,ecx
or al,al
jnz after_macro_operators
sub edi,3
mov al,[esi-1]
stos byte [edi]
xor dl,dl
jmp after_macro_operators
reduce_symbol_conversion:
inc esi
symbol_conversion:
mov edx,esi
mov al,[esi]
cmp al,1Ah
jne symbol_character_conversion
lods word [esi]
movzx ecx,ah
lea ebx,[edi+3]
jecxz convert_to_quoted_string
cmp byte [esi],'\'
jne convert_to_quoted_string
inc esi
dec ecx
dec ebx
jmp convert_to_quoted_string
symbol_character_conversion:
cmp al,22h
je after_macro_operators
cmp al,'`'
je reduce_symbol_conversion
lea ebx,[edi+5]
xor ecx,ecx
or al,al
jz convert_to_quoted_string
cmp al,'#'
je convert_to_quoted_string
inc ecx
convert_to_quoted_string:
sub ebx,edx
ja shift_line_data
mov al,22h
mov dl,al
stos byte [edi]
mov ebx,edi
mov eax,ecx
stos dword [edi]
rep movs byte [edi],[esi]
cmp edi,esi
je before_macro_operators
jmp after_macro_operators
shift_line_data:
push ecx
mov edx,esi
lea esi,[ebp-1]
add ebp,ebx
lea edi,[ebp-1]
lea ecx,[esi+1]
sub ecx,edx
std
rep movs byte [edi],[esi]
cld
pop eax
sub edi,3
mov dl,22h
mov [edi-1],dl
mov ebx,edi
mov [edi],eax
lea esi,[edi+4+eax]
jmp before_macro_operators
concatenation:
cmp dl,1Ah
je symbol_concatenation
cmp dl,22h
je string_concatenation
no_concatenation:
cmp esi,edi
je before_macro_operators
jmp after_macro_operators
symbol_concatenation:
cmp byte [esi],1Ah
jne no_concatenation
inc esi
lods byte [esi]
movzx ecx,al
jecxz do_symbol_concatenation
cmp byte [esi],'\'
je concatenate_escaped_symbol
do_symbol_concatenation:
add [ebx],cl
jc name_too_long
rep movs byte [edi],[esi]
jmp after_macro_operators
concatenate_escaped_symbol:
inc esi
dec ecx
jz do_symbol_concatenation
movzx eax,byte [esi]
cmp byte [characters+eax],0
jne do_symbol_concatenation
sub esi,3
jmp no_concatenation
string_concatenation:
cmp byte [esi],22h
je do_string_concatenation
cmp byte [esi],'`'
jne no_concatenation
concatenate_converted_symbol:
inc esi
mov al,[esi]
cmp al,'`'
je concatenate_converted_symbol
cmp al,22h
je do_string_concatenation
cmp al,1Ah
jne concatenate_converted_symbol_character
inc esi
lods byte [esi]
movzx ecx,al
jecxz finish_concatenating_converted_symbol
cmp byte [esi],'\'
jne finish_concatenating_converted_symbol
inc esi
dec ecx
finish_concatenating_converted_symbol:
add [ebx],ecx
rep movs byte [edi],[esi]
jmp after_macro_operators
concatenate_converted_symbol_character:
or al,al
jz after_macro_operators
cmp al,'#'
je after_macro_operators
inc dword [ebx]
movs byte [edi],[esi]
jmp after_macro_operators
do_string_concatenation:
inc esi
lods dword [esi]
mov ecx,eax
add [ebx],eax
rep movs byte [edi],[esi]
after_macro_operators:
lods byte [esi]
cmp al,'`'
je symbol_conversion
cmp al,'#'
je concatenation
stos byte [edi]
cmp al,1Ah
je symbol_after_macro_operators
cmp al,3Bh
je no_more_macro_operators
cmp al,22h
je string_after_macro_operators
xor dl,dl
or al,al
jnz after_macro_operators
ret
symbol_after_macro_operators:
mov dl,1Ah
mov ebx,edi
lods byte [esi]
stos byte [edi]
movzx ecx,al
jecxz symbol_after_macro_operatorss_ok
cmp byte [esi],'\'
je escaped_symbol
symbol_after_macro_operatorss_ok:
rep movs byte [edi],[esi]
jmp after_macro_operators
string_after_macro_operators:
mov dl,22h
mov ebx,edi
lods dword [esi]
stos dword [edi]
mov ecx,eax
rep movs byte [edi],[esi]
jmp after_macro_operators
use_macro:
push [free_additional_memory]
push [macro_symbols]
mov [macro_symbols],0
push [counter_limit]
push dword [edx+4]
mov dword [edx+4],1
push edx
mov ebx,esi
mov esi,[edx+8]
mov eax,[edx+12]
mov [macro_line],eax
mov [counter_limit],0
xor ebp,ebp
process_macro_arguments:
mov al,[esi]
or al,al
jz arguments_end
cmp al,'{'
je arguments_end
inc esi
cmp al,'['
jne get_macro_arguments
mov ebp,esi
inc esi
inc [counter_limit]
get_macro_arguments:
call get_macro_argument
lods byte [esi]
cmp al,','
je next_argument
cmp al,']'
je next_arguments_group
cmp al,'&'
je arguments_end
dec esi
jmp arguments_end
next_argument:
cmp byte [ebx],','
jne process_macro_arguments
inc ebx
jmp process_macro_arguments
next_arguments_group:
cmp byte [ebx],','
jne arguments_end
inc ebx
inc [counter_limit]
mov esi,ebp
jmp process_macro_arguments
get_macro_argument:
lods byte [esi]
movzx ecx,al
mov eax,[counter_limit]
call add_macro_symbol
add esi,ecx
xor eax,eax
mov [default_argument_value],eax
cmp byte [esi],'*'
je required_value
cmp byte [esi],':'
je get_default_value
cmp byte [esi],'='
jne default_value_ok
get_default_value:
inc esi
mov [default_argument_value],esi
or [skip_default_argument_value],-1
call skip_macro_argument_value
jmp default_value_ok
required_value:
inc esi
or [default_argument_value],-1
default_value_ok:
xchg esi,ebx
mov [edx+12],esi
mov [skip_default_argument_value],0
cmp byte [ebx],'&'
je greedy_macro_argument
call skip_macro_argument_value
call finish_macro_argument
jmp got_macro_argument
greedy_macro_argument:
call skip_foreign_line
dec esi
mov eax,[edx+12]
mov ecx,esi
sub ecx,eax
mov [edx+8],ecx
got_macro_argument:
xchg esi,ebx
cmp dword [edx+8],0
jne macro_argument_ok
mov eax,[default_argument_value]
or eax,eax
jz macro_argument_ok
cmp eax,-1
je invalid_macro_arguments
mov [edx+12],eax
call finish_macro_argument
macro_argument_ok:
ret
finish_macro_argument:
mov eax,[edx+12]
mov ecx,esi
sub ecx,eax
cmp byte [eax],'<'
jne argument_value_length_ok
inc dword [edx+12]
sub ecx,2
or ecx,80000000h
argument_value_length_ok:
mov [edx+8],ecx
ret
arguments_end:
cmp byte [ebx],0
jne invalid_macro_arguments
mov eax,[esp+4]
dec eax
call process_macro
pop edx
pop dword [edx+4]
pop [counter_limit]
pop [macro_symbols]
pop [free_additional_memory]
jmp line_preprocessed
use_instant_macro:
push edi
push [current_line]
push esi
mov eax,[error_line]
mov [current_line],eax
mov [macro_line],eax
mov esi,[instant_macro_start]
cmp [base_code],10h
jae do_match
cmp [base_code],0
jne do_irp
call precalculate_value
cmp eax,0
jl value_out_of_range
push [free_additional_memory]
push [macro_symbols]
mov [macro_symbols],0
push [counter_limit]
mov [struc_name],0
mov [counter_limit],eax
lods byte [esi]
or al,al
jz rept_counters_ok
cmp al,'{'
je rept_counters_ok
cmp al,1Ah
jne invalid_macro_arguments
add_rept_counter:
lods byte [esi]
movzx ecx,al
xor eax,eax
call add_macro_symbol
add esi,ecx
xor eax,eax
mov dword [edx+12],eax
inc eax
mov dword [edx+8],eax
lods byte [esi]
cmp al,':'
jne rept_counter_added
push edx
call precalculate_value
mov edx,eax
add edx,[counter_limit]
jo value_out_of_range
pop edx
mov dword [edx+8],eax
lods byte [esi]
rept_counter_added:
cmp al,','
jne rept_counters_ok
lods byte [esi]
cmp al,1Ah
jne invalid_macro_arguments
jmp add_rept_counter
rept_counters_ok:
dec esi
cmp [counter_limit],0
je instant_macro_finish
instant_macro_parameters_ok:
xor eax,eax
call process_macro
instant_macro_finish:
pop [counter_limit]
pop [macro_symbols]
pop [free_additional_memory]
instant_macro_done:
pop ebx esi edx
cmp byte [ebx],0
je line_preprocessed
mov [current_line],edi
mov ecx,4
rep movs dword [edi],[esi]
test [macro_status],0Fh
jz instant_macro_attached_line
mov ax,3Bh
stos word [edi]
instant_macro_attached_line:
mov esi,ebx
sub edx,ebx
mov ecx,edx
call move_data
jmp initial_preprocessing_ok
precalculate_value:
push edi
call convert_expression
mov al,')'
stosb
push esi
mov esi,[esp+4]
mov [error_line],0
mov [value_size],0
call calculate_expression
cmp [error_line],0
je value_precalculated
jmp [error]
value_precalculated:
mov eax,[edi]
mov ecx,[edi+4]
cdq
cmp edx,ecx
jne value_out_of_range
cmp dl,[edi+13]
jne value_out_of_range
pop esi edi
ret
do_irp:
cmp byte [esi],1Ah
jne invalid_macro_arguments
movzx eax,byte [esi+1]
lea esi,[esi+2+eax]
lods byte [esi]
cmp [base_code],1
ja irps_name_ok
cmp al,':'
je irp_with_default_value
cmp al,'='
je irp_with_default_value
cmp al,'*'
jne irp_name_ok
lods byte [esi]
irp_name_ok:
cmp al,','
jne invalid_macro_arguments
jmp irp_parameters_start
irp_with_default_value:
xor ebp,ebp
or [skip_default_argument_value],-1
call skip_macro_argument_value
cmp byte [esi],','
jne invalid_macro_arguments
inc esi
jmp irp_parameters_start
irps_name_ok:
cmp al,','
jne invalid_macro_arguments
cmp [base_code],3
je irp_parameters_start
mov al,[esi]
or al,al
jz instant_macro_done
cmp al,'{'
je instant_macro_done
irp_parameters_start:
xor eax,eax
push [free_additional_memory]
push [macro_symbols]
mov [macro_symbols],eax
push [counter_limit]
mov [counter_limit],eax
mov [struc_name],eax
cmp [base_code],3
je get_irpv_parameter
mov ebx,esi
cmp [base_code],2
je get_irps_parameter
mov edx,[parameters_end]
mov al,[edx]
push eax
mov byte [edx],0
get_irp_parameter:
inc [counter_limit]
mov esi,[instant_macro_start]
inc esi
call get_macro_argument
cmp byte [ebx],','
jne irp_parameters_end
inc ebx
jmp get_irp_parameter
irp_parameters_end:
mov esi,ebx
pop eax
mov [esi],al
jmp instant_macro_parameters_ok
get_irps_parameter:
mov esi,[instant_macro_start]
inc esi
lods byte [esi]
movzx ecx,al
inc [counter_limit]
mov eax,[counter_limit]
call add_macro_symbol
mov [edx+12],ebx
cmp byte [ebx],1Ah
je irps_symbol
cmp byte [ebx],22h
je irps_quoted_string
mov eax,1
jmp irps_parameter_ok
irps_quoted_string:
mov eax,[ebx+1]
add eax,1+4
jmp irps_parameter_ok
irps_symbol:
movzx eax,byte [ebx+1]
add eax,1+1
irps_parameter_ok:
mov [edx+8],eax
add ebx,eax
cmp byte [ebx],0
je irps_parameters_end
cmp byte [ebx],'{'
jne get_irps_parameter
irps_parameters_end:
mov esi,ebx
jmp instant_macro_parameters_ok
get_irpv_parameter:
lods byte [esi]
cmp al,1Ah
jne invalid_macro_arguments
lods byte [esi]
mov ebp,esi
mov cl,al
mov ch,10b
call get_preprocessor_symbol
jc instant_macro_finish
push edx
mark_variable_value:
inc [counter_limit]
mov [edx+4],ebp
next_variable_value:
mov edx,[edx]
or edx,edx
jz variable_values_marked
mov eax,[edx+4]
cmp eax,1
jbe next_variable_value
mov esi,ebp
movzx ecx,byte [esi-1]
xchg edi,eax
repe cmps byte [esi],[edi]
xchg edi,eax
je mark_variable_value
jmp next_variable_value
variable_values_marked:
pop edx
push [counter_limit]
add_irpv_value:
push edx
mov esi,[instant_macro_start]
inc esi
lods byte [esi]
movzx ecx,al
mov eax,[esp+4]
call add_macro_symbol
mov ebx,edx
pop edx
mov ecx,[edx+12]
mov eax,[edx+8]
mov [ebx+12],eax
mov [ebx+8],ecx
collect_next_variable_value:
mov edx,[edx]
or edx,edx
jz variable_values_collected
cmp ebp,[edx+4]
jne collect_next_variable_value
dec dword [esp]
jnz add_irpv_value
variable_values_collected:
pop eax
mov esi,ebp
movzx ecx,byte [esi-1]
add esi,ecx
cmp byte [esi],0
je instant_macro_parameters_ok
cmp byte [esi],'{'
jne invalid_macro_arguments
jmp instant_macro_parameters_ok
do_match:
mov ebx,esi
call skip_pattern
call exact_match
mov edx,edi
mov al,[ebx]
cmp al,1Ah
je free_match
cmp al,','
jne instant_macro_done
cmp esi,[parameters_end]
je matched_pattern
jmp instant_macro_done
free_match:
add edx,12
cmp edx,[memory_end]
ja out_of_memory
mov [edx-12],ebx
mov [edx-8],esi
call skip_match_element
jc try_different_matching
mov [edx-4],esi
movzx eax,byte [ebx+1]
lea ebx,[ebx+2+eax]
cmp byte [ebx],1Ah
je free_match
find_exact_match:
call exact_match
cmp esi,[parameters_end]
je end_matching
cmp byte [ebx],1Ah
je free_match
mov ebx,[edx-12]
movzx eax,byte [ebx+1]
lea ebx,[ebx+2+eax]
mov esi,[edx-4]
jmp match_more_elements
try_different_matching:
sub edx,12
cmp edx,edi
je instant_macro_done
mov ebx,[edx-12]
movzx eax,byte [ebx+1]
lea ebx,[ebx+2+eax]
cmp byte [ebx],1Ah
je try_different_matching
mov esi,[edx-4]
match_more_elements:
call skip_match_element
jc try_different_matching
mov [edx-4],esi
jmp find_exact_match
skip_match_element:
cmp esi,[parameters_end]
je cannot_match
mov al,[esi]
cmp al,1Ah
je skip_match_symbol
cmp al,22h
je skip_match_quoted_string
add esi,1
ret
skip_match_quoted_string:
mov eax,[esi+1]
add esi,5
jmp skip_match_ok
skip_match_symbol:
movzx eax,byte [esi+1]
add esi,2
skip_match_ok:
add esi,eax
ret
cannot_match:
stc
ret
exact_match:
cmp esi,[parameters_end]
je exact_match_complete
mov ah,[esi]
mov al,[ebx]
cmp al,','
je exact_match_complete
cmp al,1Ah
je exact_match_complete
cmp al,'='
je match_verbatim
call match_elements
je exact_match
exact_match_complete:
ret
match_verbatim:
inc ebx
call match_elements
je exact_match
dec ebx
ret
match_elements:
mov al,[ebx]
cmp al,1Ah
je match_symbols
cmp al,22h
je match_quoted_strings
cmp al,ah
je symbol_characters_matched
ret
symbol_characters_matched:
lea ebx,[ebx+1]
lea esi,[esi+1]
ret
match_quoted_strings:
mov ecx,[ebx+1]
add ecx,5
jmp compare_elements
match_symbols:
movzx ecx,byte [ebx+1]
add ecx,2
compare_elements:
mov eax,esi
mov ebp,edi
mov edi,ebx
repe cmps byte [esi],[edi]
jne elements_mismatch
mov ebx,edi
mov edi,ebp
ret
elements_mismatch:
mov esi,eax
mov edi,ebp
ret
end_matching:
cmp byte [ebx],','
jne instant_macro_done
matched_pattern:
xor eax,eax
push [free_additional_memory]
push [macro_symbols]
mov [macro_symbols],eax
push [counter_limit]
mov [counter_limit],eax
mov [struc_name],eax
push esi edi edx
add_matched_symbol:
cmp edi,[esp]
je matched_symbols_ok
mov esi,[edi]
inc esi
lods byte [esi]
movzx ecx,al
xor eax,eax
call add_macro_symbol
mov eax,[edi+4]
mov dword [edx+12],eax
mov ecx,[edi+8]
sub ecx,eax
mov dword [edx+8],ecx
add edi,12
jmp add_matched_symbol
matched_symbols_ok:
pop edx edi esi
jmp instant_macro_parameters_ok
process_macro:
push dword [macro_status]
or [macro_status],10h
push [counter]
push [macro_block]
push [macro_block_line]
push [macro_block_line_number]
push [struc_label]
push [struc_name]
push eax
push [current_line]
lods byte [esi]
cmp al,'{'
je macro_instructions_start
or al,al
jnz unexpected_characters
find_macro_instructions:
mov [macro_line],esi
add esi,16+2
lods byte [esi]
or al,al
jz find_macro_instructions
cmp al,'{'
je macro_instructions_start
cmp al,3Bh
jne unexpected_characters
call skip_foreign_symbol
jmp find_macro_instructions
macro_instructions_start:
mov ecx,80000000h
mov [macro_block],esi
mov eax,[macro_line]
mov [macro_block_line],eax
mov [macro_block_line_number],ecx
xor eax,eax
mov [counter],eax
cmp [counter_limit],eax
je process_macro_line
inc [counter]
process_macro_line:
lods byte [esi]
or al,al
jz process_next_line
cmp al,'}'
je macro_block_processed
dec esi
mov [current_line],edi
lea eax,[edi+10h]
cmp eax,[memory_end]
jae out_of_memory
mov eax,[esp+4]
or eax,eax
jz instant_macro_line_header
stos dword [edi]
mov eax,ecx
stos dword [edi]
mov eax,[esp]
stos dword [edi]
mov eax,[macro_line]
stos dword [edi]
jmp macro_line_header_ok
instant_macro_line_header:
mov eax,[esp]
add eax,16
find_defining_directive:
inc eax
cmp byte [eax-1],3Bh
je defining_directive_ok
cmp byte [eax-1],1Ah
jne find_defining_directive
push eax
movzx eax,byte [eax]
inc eax
add [esp],eax
pop eax
jmp find_defining_directive
defining_directive_ok:
stos dword [edi]
mov eax,ecx
stos dword [edi]
mov eax,[macro_line]
stos dword [edi]
stos dword [edi]
macro_line_header_ok:
or [macro_status],20h
push ebx ecx
test [macro_status],0Fh
jz process_macro_line_element
mov ax,3Bh
stos word [edi]
process_macro_line_element:
lea eax,[edi+100h]
cmp eax,[memory_end]
jae out_of_memory
lods byte [esi]
cmp al,'}'
je macro_line_processed
or al,al
jz macro_line_processed
cmp al,1Ah
je process_macro_symbol
cmp al,3Bh
je macro_foreign_line
and [macro_status],not 20h
stos byte [edi]
cmp al,22h
jne process_macro_line_element
copy_macro_string:
mov ecx,[esi]
add ecx,4
call move_data
jmp process_macro_line_element
process_macro_symbol:
push esi edi
test [macro_status],20h
jz not_macro_directive
movzx ecx,byte [esi]
inc esi
mov edi,macro_directives
call get_directive
jnc process_macro_directive
dec esi
jmp not_macro_directive
process_macro_directive:
mov edx,eax
pop edi eax
mov byte [edi],0
inc edi
pop ecx ebx
jmp near edx
not_macro_directive:
and [macro_status],not 20h
movzx ecx,byte [esi]
inc esi
mov eax,[counter]
call get_macro_symbol
jnc group_macro_symbol
xor eax,eax
cmp [counter],eax
je multiple_macro_symbol_values
call get_macro_symbol
jc not_macro_symbol
replace_macro_symbol:
pop edi eax
mov ecx,[edx+8]
mov edx,[edx+12]
or edx,edx
jz replace_macro_counter
and ecx,not 80000000h
xchg esi,edx
call move_data
mov esi,edx
jmp process_macro_line_element
group_macro_symbol:
xor eax,eax
cmp [counter],eax
je replace_macro_symbol
push esi edx
sub esi,ecx
call get_macro_symbol
mov ebx,edx
pop edx esi
jc replace_macro_symbol
cmp edx,ebx
ja replace_macro_symbol
mov edx,ebx
jmp replace_macro_symbol
multiple_macro_symbol_values:
inc eax
push eax
call get_macro_symbol
pop eax
jc not_macro_symbol
pop edi
push ecx
mov ecx,[edx+8]
mov edx,[edx+12]
xchg esi,edx
btr ecx,31
jc enclose_macro_symbol_value
rep movs byte [edi],[esi]
jmp macro_symbol_value_ok
enclose_macro_symbol_value:
mov byte [edi],'<'
inc edi
rep movs byte [edi],[esi]
mov byte [edi],'>'
inc edi
macro_symbol_value_ok:
cmp eax,[counter_limit]
je multiple_macro_symbol_values_ok
mov byte [edi],','
inc edi
mov esi,edx
pop ecx
push edi
sub esi,ecx
jmp multiple_macro_symbol_values
multiple_macro_symbol_values_ok:
pop ecx eax
mov esi,edx
jmp process_macro_line_element
replace_macro_counter:
mov eax,[counter]
and eax,not 80000000h
jz group_macro_counter
add ecx,eax
dec ecx
call store_number_symbol
jmp process_macro_line_element
group_macro_counter:
mov edx,ecx
xor ecx,ecx
multiple_macro_counter_values:
push ecx edx
add ecx,edx
call store_number_symbol
pop edx ecx
inc ecx
cmp ecx,[counter_limit]
je process_macro_line_element
mov byte [edi],','
inc edi
jmp multiple_macro_counter_values
store_number_symbol:
cmp ecx,0
jge numer_symbol_sign_ok
neg ecx
mov al,'-'
stos byte [edi]
numer_symbol_sign_ok:
mov ax,1Ah
stos word [edi]
push edi
mov eax,ecx
mov ecx,1000000000
xor edx,edx
xor bl,bl
store_number_digits:
div ecx
push edx
or bl,bl
jnz store_number_digit
cmp ecx,1
je store_number_digit
or al,al
jz number_digit_ok
not bl
store_number_digit:
add al,30h
stos byte [edi]
number_digit_ok:
mov eax,ecx
xor edx,edx
mov ecx,10
div ecx
mov ecx,eax
pop eax
or ecx,ecx
jnz store_number_digits
pop ebx
mov eax,edi
sub eax,ebx
mov [ebx-1],al
ret
not_macro_symbol:
pop edi esi
mov al,1Ah
stos byte [edi]
mov al,[esi]
inc esi
stos byte [edi]
cmp byte [esi],'.'
jne copy_raw_symbol
mov ebx,[esp+8+8]
or ebx,ebx
jz copy_raw_symbol
cmp al,1
je copy_struc_name
xchg esi,ebx
movzx ecx,byte [esi-1]
add [edi-1],cl
jc name_too_long
rep movs byte [edi],[esi]
xchg esi,ebx
copy_raw_symbol:
movzx ecx,al
rep movs byte [edi],[esi]
jmp process_macro_line_element
copy_struc_name:
inc esi
xchg esi,ebx
movzx ecx,byte [esi-1]
mov [edi-1],cl
rep movs byte [edi],[esi]
xchg esi,ebx
mov eax,[esp+8+12]
cmp byte [eax],3Bh
je process_macro_line_element
cmp byte [eax],1Ah
jne disable_replaced_struc_name
mov byte [eax],3Bh
jmp process_macro_line_element
disable_replaced_struc_name:
mov ebx,[esp+8+8]
push esi edi
lea edi,[ebx-3]
lea esi,[edi-2]
lea ecx,[esi+1]
sub ecx,eax
std
rep movs byte [edi],[esi]
cld
mov word [eax],3Bh
pop edi esi
jmp process_macro_line_element
skip_foreign_symbol:
lods byte [esi]
movzx eax,al
add esi,eax
skip_foreign_line:
lods byte [esi]
cmp al,1Ah
je skip_foreign_symbol
cmp al,3Bh
je skip_foreign_symbol
cmp al,22h
je skip_foreign_string
or al,al
jnz skip_foreign_line
ret
skip_foreign_string:
lods dword [esi]
add esi,eax
jmp skip_foreign_line
macro_foreign_line:
call skip_foreign_symbol
macro_line_processed:
mov byte [edi],0
inc edi
push eax
call preprocess_line
pop eax
pop ecx ebx
cmp al,'}'
je macro_block_processed
process_next_line:
inc ecx
mov [macro_line],esi
add esi,16+2
jmp process_macro_line
macro_block_processed:
call close_macro_block
jc process_macro_line
pop [current_line]
add esp,12
pop [macro_block_line_number]
pop [macro_block_line]
pop [macro_block]
pop [counter]
pop eax
and al,0F0h
and [macro_status],0Fh
or [macro_status],al
ret
local_symbols:
lods byte [esi]
cmp al,1Ah
jne invalid_argument
mov byte [edi-1],3Bh
xor al,al
stos byte [edi]
make_local_symbol:
push ecx
lods byte [esi]
movzx ecx,al
mov eax,[counter]
call add_macro_symbol
mov [edx+12],edi
movzx eax,[locals_counter]
add eax,ecx
inc eax
cmp eax,100h
jae name_too_long
lea ebp,[edi+2+eax]
cmp ebp,[memory_end]
jae out_of_memory
mov ah,al
mov al,1Ah
stos word [edi]
rep movs byte [edi],[esi]
mov al,'?'
stos byte [edi]
push esi
mov esi,locals_counter+1
movzx ecx,[locals_counter]
rep movs byte [edi],[esi]
pop esi
mov eax,edi
sub eax,[edx+12]
mov [edx+8],eax
xor al,al
stos byte [edi]
mov eax,locals_counter
movzx ecx,byte [eax]
counter_loop:
inc byte [eax+ecx]
cmp byte [eax+ecx],'9'+1
jb counter_ok
jne letter_digit
mov byte [eax+ecx],'A'
jmp counter_ok
letter_digit:
cmp byte [eax+ecx],'Z'+1
jb counter_ok
jne small_letter_digit
mov byte [eax+ecx],'a'
jmp counter_ok
small_letter_digit:
cmp byte [eax+ecx],'z'+1
jb counter_ok
mov byte [eax+ecx],'0'
loop counter_loop
inc byte [eax]
movzx ecx,byte [eax]
mov byte [eax+ecx],'0'
counter_ok:
pop ecx
lods byte [esi]
cmp al,'}'
je macro_block_processed
or al,al
jz process_next_line
cmp al,','
jne extra_characters_on_line
dec edi
lods byte [esi]
cmp al,1Ah
je make_local_symbol
jmp invalid_argument
common_block:
call close_macro_block
jc process_macro_line
mov [counter],0
jmp new_macro_block
forward_block:
cmp [counter_limit],0
je common_block
call close_macro_block
jc process_macro_line
mov [counter],1
jmp new_macro_block
reverse_block:
cmp [counter_limit],0
je common_block
call close_macro_block
jc process_macro_line
mov eax,[counter_limit]
or eax,80000000h
mov [counter],eax
new_macro_block:
mov [macro_block],esi
mov eax,[macro_line]
mov [macro_block_line],eax
mov [macro_block_line_number],ecx
jmp process_macro_line
close_macro_block:
cmp esi,[macro_block]
je block_closed
cmp [counter],0
je block_closed
jl reverse_counter
mov eax,[counter]
cmp eax,[counter_limit]
je block_closed
inc [counter]
jmp continue_block
reverse_counter:
mov eax,[counter]
dec eax
cmp eax,80000000h
je block_closed
mov [counter],eax
continue_block:
mov esi,[macro_block]
mov eax,[macro_block_line]
mov [macro_line],eax
mov ecx,[macro_block_line_number]
stc
ret
block_closed:
clc
ret
get_macro_symbol:
push ecx
call find_macro_symbol_leaf
jc macro_symbol_not_found
mov edx,[ebx]
mov ebx,esi
try_macro_symbol:
or edx,edx
jz macro_symbol_not_found
mov ecx,[esp]
mov edi,[edx+4]
repe cmps byte [esi],[edi]
je macro_symbol_found
mov esi,ebx
mov edx,[edx]
jmp try_macro_symbol
macro_symbol_found:
pop ecx
clc
ret
macro_symbol_not_found:
pop ecx
stc
ret
find_macro_symbol_leaf:
shl eax,8
mov al,cl
mov ebp,eax
mov ebx,macro_symbols
follow_macro_symbols_tree:
mov edx,[ebx]
or edx,edx
jz no_such_macro_symbol
xor eax,eax
shr ebp,1
adc eax,0
lea ebx,[edx+eax*4]
or ebp,ebp
jnz follow_macro_symbols_tree
add ebx,8
clc
ret
no_such_macro_symbol:
stc
ret
add_macro_symbol:
push ebx ebp
call find_macro_symbol_leaf
jc extend_macro_symbol_tree
mov eax,[ebx]
make_macro_symbol:
mov edx,[free_additional_memory]
add edx,16
cmp edx,[labels_list]
ja out_of_memory
xchg edx,[free_additional_memory]
mov [ebx],edx
mov [edx],eax
mov [edx+4],esi
pop ebp ebx
ret
extend_macro_symbol_tree:
mov edx,[free_additional_memory]
add edx,16
cmp edx,[labels_list]
ja out_of_memory
xchg edx,[free_additional_memory]
xor eax,eax
mov [edx],eax
mov [edx+4],eax
mov [edx+8],eax
mov [edx+12],eax
shr ebp,1
adc eax,0
mov [ebx],edx
lea ebx,[edx+eax*4]
or ebp,ebp
jnz extend_macro_symbol_tree
add ebx,8
xor eax,eax
jmp make_macro_symbol
include_file:
lods byte [esi]
cmp al,22h
jne invalid_argument
lods dword [esi]
cmp byte [esi+eax],0
jne extra_characters_on_line
push esi
push edi
mov ebx,[current_line]
find_current_file_path:
mov esi,[ebx]
test byte [ebx+7],80h
jz copy_current_file_path
mov ebx,[ebx+8]
jmp find_current_file_path
copy_current_file_path:
lods byte [esi]
stos byte [edi]
or al,al
jnz copy_current_file_path
cut_current_file_name:
cmp edi,[esp]
je current_file_path_ok
cmp byte [edi-1],'\'
je current_file_path_ok
cmp byte [edi-1],'/'
je current_file_path_ok
dec edi
jmp cut_current_file_name
current_file_path_ok:
mov esi,[esp+4]
call expand_path
pop edx
mov esi,edx
call open
jnc include_path_ok
mov ebp,[include_paths]
try_include_directories:
mov edi,esi
mov esi,ebp
cmp byte [esi],0
je try_in_current_directory
push ebp
push edi
call get_include_directory
mov [esp+4],esi
mov esi,[esp+8]
call expand_path
pop edx
mov esi,edx
call open
pop ebp
jnc include_path_ok
jmp try_include_directories
mov edi,esi
try_in_current_directory:
mov esi,[esp]
push edi
call expand_path
pop edx
mov esi,edx
call open
jc file_not_found
include_path_ok:
mov edi,[esp]
copy_preprocessed_path:
lods byte [esi]
stos byte [edi]
or al,al
jnz copy_preprocessed_path
pop esi
lea ecx,[edi-1]
sub ecx,esi
mov [esi-4],ecx
push dword [macro_status]
and [macro_status],0Fh
call preprocess_file
pop eax
and al,0F0h
and [macro_status],0Fh
or [macro_status],al
jmp line_preprocessed
|