Существут проблема со старыми программами на Clipper под DOS, которые неверно отрабатывают на более скоростных PIII и Celeron, с выдачей сообщения "run-time error R6003...".
Если нет исходников и перекомпиляция с __wait.obj не поможет, и не помогают замены в самом .exe, как это было в моем случае, решением стало применение следующего средства:
Две программы piiih и piiih-up позволяют временно замедлить выполнение программы при ее старте. Программа piiih является резидентной и загружается один раз в autoexec.bat, она томозит. Вторая программа piiih-up ее активизирует и запускается непосредственно перез загрузкой самого .exe тоже в командном файле.
piiih:

       cs:0100 EB41           JMP      0143
       cs:0102 0000           DW       0000                     ; признак активизации и настройка времени задержки
       cs:0104 AA00           DW       00AA                     ; счетчик повторения цикла уровень 1
       cs:0106 AA00           DW       00AA                     ; счетчик повторения цикла уровень 2
       cs:0108 AA00           DW       00AA                     ; счетчик повторения цикла уровень 3
       cs:010A 9C             PUSHF                             ; запинаем флаги для правильного их восстановления
       cs:010B 2EF7060201FFFF TEST     Word Ptr CS:[0102],FFFF  ; проверяем необходимость торможения
       cs:0112 7429           JZ       013D                     ; нет -- выполняем прерывание и уходим
       cs:0114 51             PUSH     CX                       ; цикл, уровень 1
       cs:0115 2E8B0E0401     MOV      CX,CS:[0104]             ; инициализация счетчика
       cs:011A 51             PUSH     CX                       ; цикл, уровень 2
       cs:011B 2E8B0E0601     MOV      CX,CS:[0106]             ; ...
       cs:0120 51             PUSH     CX                       ; цикл, уровень 3
       cs:0121 2E8B0E0801     MOV      CX,CS:[0108]             ; ...
       cs:0126 21C0           AND      AX,AX                    ; тело цикла: тормоз
       cs:0128 21DB           AND      BX,BX
       cs:012A 21C9           AND      CX,CX
       cs:012C 21D2           AND      DX,DX
       cs:012E E2F6           LOOP     0126                     ; цикл 3
       cs:0130 59             POP      CX
       cs:0131 E2ED           LOOP     0120                     ; цикл 2
       cs:0133 59             POP      CX
       cs:0134 E2E4           LOOP     011A                     ; цикл 1
       cs:0136 59             POP      CX 
       cs:0137 2E832E020101   SUB      Word Ptr CS:[0102],+01   ; изменения признака активности
       cs:013D 9A11110000     CALL     0000:1111                ; выполнение настоящего int 08h
       cs:0142 CF             IRET                              ; возврат из прерывания
       cs:0143 B80835         MOV      AX,3508                  ; читаем значение вектора int 08h
       cs:0146 CD21           INT      21
       cs:0148 2E891E3E01     MOV      CS:[013E],BX             ; ориентируем call на старый int 08h
       cs:014D 2E8C064001     MOV      CS:[0140],ES
       cs:0152 B80825         MOV      AX,2508                  ; подставляем новый int 08h
       cs:0155 BA0A01         MOV      DX,010A
       cs:0158 CD21           INT      21
       cs:015A B8CC25         MOV      AX,25CC                  ; тоже с int 0cch
       cs:015D BA0A01         MOV      DX,010A                  ; (указывает на параметры измененного вектора)
       cs:0160 CD21           INT      21                       ; 
       cs:0162 BA4801         MOV      DX,0148                  ;
       cs:0165 CD27           INT      27
   
Замечания: вызов настоящего int 08h перенесен в конец, так работает надежнее. Тело цикла можно сделать массивнее, для более эффектного торможения, но 3х счетчиков обычно вполне хватает.

piiih-up:

	cs:0100 B8CC35         MOV	AX,35CC                 ; читаем адрес int 0cch в es:bx
	cs:0103 CD21           INT	21                      ;
	cs:0105 81EB0A01       SUB	BX,010A                 ; если не установлен piiih -- ушел
	cs:0109 751C           JNZ	0127                    ;
	cs:010B 26C70602016600 MOV	Word Ptr ES:[0102],0066 ; выставляем задержку
	cs:0112 26C7060401AA00 MOV	Word Ptr ES:[0104],00AA ; счетчи цикла 1
	cs:0119 26C7060601AA00 MOV	Word Ptr ES:[0106],00AA ; счетчи цикла 2
	cs:0120 26C7060801AA00 MOV	Word Ptr ES:[0108],00AA ; счетчи цикла 3
	cs:0127 CD20           INT	20                      ; все
   
Значения в piiih-up для каждой конкретной машины свои: нужно подбирать!
Под Windows программа не работает, не всегда работает (кто объяснит как сделать -- первый приз :).
Hosted by uCoz