Rev 7696 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7696 | Rev 7983 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | Copyright (c) 2018-2019, Anton Krotov |
4 | Copyright (c) 2018-2020, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 14... | Line 14... | ||
14 | 14 | ||
15 | bit_depth* = 32; |
15 | bit_depth* = 32; |
16 | maxint* = 7FFFFFFFH; |
16 | maxint* = 7FFFFFFFH; |
Line 17... | Line -... | ||
17 | minint* = 80000000H; |
- | |
18 | - | ||
19 | DLL_PROCESS_ATTACH = 1; |
- | |
20 | DLL_THREAD_ATTACH = 2; |
- | |
21 | DLL_THREAD_DETACH = 3; |
- | |
22 | DLL_PROCESS_DETACH = 0; |
17 | minint* = 80000000H; |
23 | 18 | ||
Line 24... | Line -... | ||
24 | WORD = bit_depth DIV 8; |
- | |
25 | MAX_SET = bit_depth - 1; |
- | |
26 | - | ||
27 | - | ||
28 | TYPE |
- | |
29 | - | ||
30 | DLL_ENTRY* = PROCEDURE (hinstDLL, fdwReason, lpvReserved: INTEGER); |
19 | WORD = bit_depth DIV 8; |
Line 31... | Line 20... | ||
31 | PROC = PROCEDURE; |
20 | MAX_SET = bit_depth - 1; |
32 | 21 | ||
33 | - | ||
34 | VAR |
- | |
35 | - | ||
36 | name: INTEGER; |
- | |
37 | types: INTEGER; |
- | |
38 | bits: ARRAY MAX_SET + 1 OF INTEGER; |
- | |
39 | - | ||
40 | dll: RECORD |
- | |
41 | process_detach, |
- | |
Line 42... | Line 22... | ||
42 | thread_detach, |
22 | |
43 | thread_attach: DLL_ENTRY |
23 | VAR |
44 | END; |
24 | |
Line 95... | Line 75... | ||
95 | PROCEDURE [stdcall] _rot* (VAR A: ARRAY OF INTEGER); |
75 | PROCEDURE [stdcall] _rot* (VAR A: ARRAY OF INTEGER); |
96 | VAR |
76 | VAR |
97 | i, n, k: INTEGER; |
77 | i, n, k: INTEGER; |
Line 98... | Line 78... | ||
98 | 78 | ||
99 | BEGIN |
- | |
100 | 79 | BEGIN |
|
101 | k := LEN(A) - 1; |
80 | k := LEN(A) - 1; |
102 | n := A[0]; |
81 | n := A[0]; |
103 | i := 0; |
82 | i := 0; |
104 | WHILE i < k DO |
83 | WHILE i < k DO |
105 | A[i] := A[i + 1]; |
84 | A[i] := A[i + 1]; |
106 | INC(i) |
85 | INC(i) |
107 | END; |
86 | END; |
108 | A[k] := n |
- | |
109 | 87 | A[k] := n |
|
Line 110... | Line 88... | ||
110 | END _rot; |
88 | END _rot; |
111 | 89 | ||
Line 126... | Line 104... | ||
126 | 104 | ||
127 | RETURN a |
105 | RETURN a |
Line 128... | Line 106... | ||
128 | END _set; |
106 | END _set; |
129 | 107 | ||
130 | 108 | ||
131 | PROCEDURE [stdcall] _set1* (a: INTEGER): INTEGER; |
109 | PROCEDURE [stdcall] _set1* (a: INTEGER); (* {a} -> eax *) |
- | 110 | BEGIN |
|
- | 111 | SYSTEM.CODE( |
|
132 | BEGIN |
112 | 031H, 0C0H, (* xor eax, eax *) |
- | 113 | 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) (* ecx <- a *) |
|
133 | IF ASR(a, 5) = 0 THEN |
114 | 083H, 0F9H, 01FH, (* cmp ecx, 31 *) |
134 | SYSTEM.GET(SYSTEM.ADR(bits[0]) + a * WORD, a) |
115 | 077H, 003H, (* ja L *) |
135 | ELSE |
- | |
136 | a := 0 |
116 | 00FH, 0ABH, 0C8H (* bts eax, ecx *) |
Line 137... | Line 117... | ||
137 | END |
117 | (* L: *) |
138 | RETURN a |
118 | ) |
Line 313... | Line 293... | ||
313 | res: INTEGER; |
293 | res: INTEGER; |
314 | bRes: BOOLEAN; |
294 | bRes: BOOLEAN; |
315 | c: CHAR; |
295 | c: CHAR; |
Line 316... | Line 296... | ||
316 | 296 | ||
317 | BEGIN |
- | |
318 | 297 | BEGIN |
|
319 | res := strncmp(str1, str2, MIN(len1, len2)); |
298 | res := strncmp(str1, str2, MIN(len1, len2)); |
320 | IF res = minint THEN |
299 | IF res = minint THEN |
321 | IF len1 > len2 THEN |
300 | IF len1 > len2 THEN |
322 | SYSTEM.GET(str1 + len2, c); |
301 | SYSTEM.GET(str1 + len2, c); |
Line 347... | Line 326... | ||
347 | res: INTEGER; |
326 | res: INTEGER; |
348 | bRes: BOOLEAN; |
327 | bRes: BOOLEAN; |
349 | c: WCHAR; |
328 | c: WCHAR; |
Line 350... | Line 329... | ||
350 | 329 | ||
351 | BEGIN |
- | |
352 | 330 | BEGIN |
|
353 | res := strncmpw(str1, str2, MIN(len1, len2)); |
331 | res := strncmpw(str1, str2, MIN(len1, len2)); |
354 | IF res = minint THEN |
332 | IF res = minint THEN |
355 | IF len1 > len2 THEN |
333 | IF len1 > len2 THEN |
356 | SYSTEM.GET(str1 + len2 * 2, c); |
334 | SYSTEM.GET(str1 + len2 * 2, c); |
Line 396... | Line 374... | ||
396 | VAR |
374 | VAR |
397 | i, a, b: INTEGER; |
375 | i, a, b: INTEGER; |
398 | c: CHAR; |
376 | c: CHAR; |
Line 399... | Line 377... | ||
399 | 377 | ||
400 | BEGIN |
- | |
401 | 378 | BEGIN |
|
402 | i := 0; |
379 | i := 0; |
403 | REPEAT |
380 | REPEAT |
404 | str[i] := CHR(x MOD 10 + ORD("0")); |
381 | str[i] := CHR(x MOD 10 + ORD("0")); |
405 | x := x DIV 10; |
382 | x := x DIV 10; |
Line 420... | Line 397... | ||
420 | 397 | ||
421 | 398 | ||
422 | PROCEDURE append (VAR s1: ARRAY OF CHAR; s2: ARRAY OF CHAR); |
399 | PROCEDURE append (VAR s1: ARRAY OF CHAR; s2: ARRAY OF CHAR); |
- | 400 | VAR |
|
423 | VAR |
401 | n1, n2, i, j: INTEGER; |
424 | n1, n2, i, j: INTEGER; |
402 | |
425 | BEGIN |
403 | BEGIN |
Line 426... | Line 404... | ||
426 | n1 := LENGTH(s1); |
404 | n1 := LENGTH(s1); |
Line 435... | Line 413... | ||
435 | INC(i); |
413 | INC(i); |
436 | INC(j) |
414 | INC(j) |
437 | END; |
415 | END; |
Line 438... | Line 416... | ||
438 | 416 | ||
439 | s1[j] := 0X |
- | |
440 | 417 | s1[j] := 0X |
|
Line 441... | Line 418... | ||
441 | END append; |
418 | END append; |
442 | 419 | ||
443 | 420 | ||
Line 444... | Line 421... | ||
444 | PROCEDURE [stdcall] _error* (module, err, line: INTEGER); |
421 | PROCEDURE [stdcall] _error* (module, err, line: INTEGER); |
445 | VAR |
- | |
446 | s, temp: ARRAY 1024 OF CHAR; |
- | |
447 | 422 | VAR |
|
448 | BEGIN |
423 | s, temp: ARRAY 1024 OF CHAR; |
449 | 424 | ||
450 | s := ""; |
425 | BEGIN |
451 | CASE err OF |
426 | CASE err OF |
452 | | 1: append(s, "assertion failure") |
427 | | 1: s := "assertion failure" |
453 | | 2: append(s, "NIL dereference") |
428 | | 2: s := "NIL dereference" |
454 | | 3: append(s, "division by zero") |
429 | | 3: s := "bad divisor" |
455 | | 4: append(s, "NIL procedure call") |
430 | | 4: s := "NIL procedure call" |
456 | | 5: append(s, "type guard error") |
431 | | 5: s := "type guard error" |
457 | | 6: append(s, "index out of range") |
432 | | 6: s := "index out of range" |
458 | | 7: append(s, "invalid CASE") |
433 | | 7: s := "invalid CASE" |
459 | | 8: append(s, "array assignment error") |
434 | | 8: s := "array assignment error" |
Line 460... | Line 435... | ||
460 | | 9: append(s, "CHR out of range") |
435 | | 9: s := "CHR out of range" |
Line 461... | Line 436... | ||
461 | |10: append(s, "WCHR out of range") |
436 | |10: s := "WCHR out of range" |
Line 511... | Line 486... | ||
511 | RETURN p MOD 2 |
486 | RETURN p MOD 2 |
512 | END _guard; |
487 | END _guard; |
Line 513... | Line 488... | ||
513 | 488 | ||
514 | - | ||
- | 489 | ||
515 | PROCEDURE [stdcall] _dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER; |
490 | PROCEDURE [stdcall] _dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER; |
Line 516... | Line -... | ||
516 | VAR |
- | |
517 | res: INTEGER; |
- | |
518 | - | ||
519 | BEGIN |
- | |
520 | CASE fdwReason OF |
- | |
521 | |DLL_PROCESS_ATTACH: |
- | |
522 | res := 1 |
- | |
523 | |DLL_THREAD_ATTACH: |
- | |
524 | res := 0; |
- | |
525 | IF dll.thread_attach # NIL THEN |
- | |
526 | dll.thread_attach(hinstDLL, fdwReason, lpvReserved) |
- | |
527 | END |
- | |
528 | |DLL_THREAD_DETACH: |
- | |
529 | res := 0; |
- | |
530 | IF dll.thread_detach # NIL THEN |
- | |
531 | dll.thread_detach(hinstDLL, fdwReason, lpvReserved) |
- | |
532 | END |
- | |
533 | |DLL_PROCESS_DETACH: |
- | |
534 | res := 0; |
- | |
535 | IF dll.process_detach # NIL THEN |
- | |
536 | dll.process_detach(hinstDLL, fdwReason, lpvReserved) |
- | |
537 | END |
- | |
Line -... | Line 491... | ||
- | 491 | RETURN API.dllentry(hinstDLL, fdwReason, lpvReserved) |
|
- | 492 | END _dllentry; |
|
538 | ELSE |
493 | |
539 | res := 0 |
494 | |
Line 540... | Line 495... | ||
540 | END |
495 | PROCEDURE [stdcall] _sofinit*; |
541 | 496 | BEGIN |
|
542 | RETURN res |
497 | API.sofinit |
Line 569... | Line 524... | ||
569 | 524 | ||
570 | SYSTEM.PUT8(i * tcount + j + types, ORD(t0 = t1)) |
525 | SYSTEM.PUT8(i * tcount + j + types, ORD(t0 = t1)) |
571 | END |
526 | END |
Line 572... | Line -... | ||
572 | END; |
- | |
573 | - | ||
574 | j := 1; |
- | |
575 | FOR i := 0 TO MAX_SET DO |
- | |
576 | bits[i] := j; |
- | |
577 | j := LSL(j, 1) |
- | |
578 | END; |
527 | END; |
579 | - | ||
580 | name := modname; |
- | |
581 | - | ||
582 | dll.process_detach := NIL; |
- | |
583 | dll.thread_detach := NIL; |
- | |
584 | dll.thread_attach := NIL; |
- | |
585 | 528 | ||
Line 586... | Line -... | ||
586 | fini := NIL |
- | |
587 | END _init; |
- | |
588 | - | ||
589 | - | ||
590 | PROCEDURE [stdcall] _sofinit*; |
- | |
591 | BEGIN |
- | |
592 | IF fini # NIL THEN |
- | |
593 | fini |
- | |
594 | END |
- | |
595 | END _sofinit; |
- | |
596 | - | ||
597 | - | ||
598 | PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY); |
- | |
599 | BEGIN |
- | |
600 | dll.process_detach := process_detach; |
- | |
601 | dll.thread_detach := thread_detach; |
- | |
602 | dll.thread_attach := thread_attach |
- | |
603 | END SetDll; |
- | |
604 | - | ||
605 | - | ||
606 | PROCEDURE SetFini* (ProcFini: PROC); |
- | |
607 | BEGIN |
- | |
608 | fini := ProcFini |
529 | name := modname |