![](http://www.nedopc.org/nedopc/image/nedobanner3.gif) |
nedoPC.orgElectronics hobbyists community established in 2002 |
![](http://www.nedopc.org/nedopc/image/nedobanner4.gif) |
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну это меня не приблизит к результату по сабжу... Собственно, меня же не завешивание процессора интересует, а почему вешает процессор программа, корректно написанная на Паскале. Я хоть и не поклонник Паскаля, но всё же считал, что он создаёт довольно приличный код под DOS. И я пока не вижу явных причин ему вешаться. Отсюда и копаю код исключений, потому как под отладчиком отловить момент не удаётся. Порой часть программы прохожу пошагово - всё хорошо идёт. В следующий раз - пройти эту часть быстро до метки - и тут вдруг вылетает: Machine Check Error ... ![:roll:](./images/smilies/icon_rolleyes.gif)
_________________ iLavr
|
16 Mar 2024 11:29 |
|
![](./styles/getaway/theme/images/spacer.gif) |
imsushka
Senior
Joined: 01 Jan 2022 04:34 Posts: 173 Location: USSR, Tashkent
|
деление на ноль - это crt.tpu ошибка была. на новых процах частота больше чем 640к памяти, которой все хватит. отладка в досе или в эмуляторе ? пошаговая отладка (если в TD) не ловит трюки с изменением кода и с кешем команд. только запуск до метки причем, если до метки допрыгнули, то ставим след метку, сбрасываем прогу и стартуем от начала
|
16 Mar 2024 12:52 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Это : Error 200: Divisiоn by zero. Давно пропатчена. Отладка в чистом ДОСе с загрузочной флешки. В ДОС-боксе никаких проблем нет, но он мне не нужен. Debug у меня от Novell DOS, TD и многих других полезных DOS утилит давненько уж нет... Изменение кода самим современным процессором? Я что-то не думаю, чтобы сам компилятор Паскаля был способен на такое. Никлаус Вирт был бы явно против этого. Так и делаю в общем-то... Вот только результат не повторяется... Я же уже один раз запустил-таки программу обойдя под отладчиком подозрительный очевидно CALL, но второй раз фокус не удался... Я, собственно, и повторил всё на другом ноутбуке уже, чтобы убедиться, что вся засада не сам Ом ноутбуке... ![:wink:](./images/smilies/icon_wink.gif)
_________________ iLavr
|
16 Mar 2024 18:02 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Вся засада всё-таки, видимо, в процессоре... Загрузился с флешки под DOS 8.0 под более старым, но не совсем уж устаревшим процессором: Совершенно никаких проблем нет! ![:o](./images/smilies/icon_eek.gif) На неделе попробую еще под более новым, чем мой Intel Atom загрузиться... Если он, конечно, сможет стартануть под DOS 8.0... Но во всех источниках клятвенно утверждают, что процессоры Intel при старте ведут себя как быстрый 8086 с некоторыми расширениями... Нигде нет конкретной информации, что могут быть глюки. В конце концов-то, многие ноутбуки продают с предустановленной Free DOS, для удешевления. Сегодня просто не получилось заставить новый процессор стартануть с USB HDD. BIOS у него зело замороченный... ![neutral :neutral:](./images/smilies/icon_neutral.gif)
_________________ iLavr
|
20 Mar 2024 12:12 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Собственно, получается, что разница между системами, где всё работает безошибочно и где выскакивает ошибка, совсем небольшая. Здесь работает безошибочно: Здесь выскакивает ошибка: Intel Atom даже медленнее, ядро у него одно (хотя пишут, что 2 виртуальных). И везде клятвенно (начиная с сайта Intel) утверждают, что ошибка типа Machine Check Error - это НЕ ошибка самог О процессора: Разница остаётся тогда только в следующем: У Intel Atom на борту Графический контроллер: Intel GMA 3600 (PowerVR SGX545) @400 MHz И этот контроллер в Интернете не хвалят. Хотя опять же, графика программы, вызывающей ошибку, работала даже на EGA! Но с другой стороны, у этой системы: ![Image](http://www.nedopc.org/forum/download/file.php?id=14065) видеокарта внешняя на шине...
_________________ iLavr
|
21 Mar 2024 07:37 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну вот... настырно фотографируя очередные метки таким методом, повторил результат, полученный отладчиком ещё на предыдущем ноутбуке... Запуском до метки нашел крайнюю точку до которой ошибки нет, а при вызове этой функции, что подчеркнута желтым, и вылетает ошибка Machine Check Error. А вот дальше и происходит то, о чём я уже писал тут: этот вызов можно пройти пошагово и ошибки Machine Check Error не случается. А вот если уже успешно пройденные участки запускать "до метки" то машина падает с ошибкой! ![:roll:](./images/smilies/icon_rolleyes.gif) Я посмотрел код, этот вызов повторяется многократно: Поэтому в этот раз я не стал обходить этот вызов вручную, а поставил RETF на первый байт адреса, по которому он вызывается. И дальше всё замечательно проскочило в сам эмулятор, который отлично работает, но без красивых элементов оформления... ![:-?](./images/smilies/icon_confused.gif) В общем, я попал в итоге в тот же тупик, что и в прошлый раз: я не знаю, как найти ошибку в коде, который безошибочно проходится пошагово, но выдаёт ошибку в динамике... ![:(](./images/smilies/icon_frown.gif)
_________________ iLavr
|
21 Mar 2024 15:10 |
|
![](./styles/getaway/theme/images/spacer.gif) |
imsushka
Senior
Joined: 01 Jan 2022 04:34 Posts: 173 Location: USSR, Tashkent
|
а в той подпрограмме метку поставить зя ?
или она вызывается до этого момента часто, но ошибок не вылетает ?
|
21 Mar 2024 22:09 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
![Reply with quote Reply with quote](./styles/getaway/imageset/en/icon_post_quote.gif)
К моему немалому удивлению оказалось, что эти два режима отладки выполняются по-разному... В пошаговой отладке " Trace" используется аппаратный режим трассировки микропроцессора 8086. ( INT 01 — исключение #DB «Отладочное прерывание») При прохождении "до метки" - " Go" или " Proceed" Debug помещает код прерывания (0CCh - INT 03 — «Точка останова») по указанным адресам точек останова. А я почему-то был уверен, что отладчик всегда работает через INT 03... Получается, что по командам " Go" и " Proceed" участок кода выполняется естественным образом, а по команде " Trace" — аппаратное прерывание самим процессором после исполнения каждой команды. Метку туда поставить можно, но это сразу даёт вылет с ошибкой. А вот если в неё зайти через " Trace", то некоторый участок можно ещё пройти "до метки", но метка всякий раз разная. ![:-?](./images/smilies/icon_confused.gif) Я вот думаю, может быть это глюки встроенной в Intel Atom видеокарты... На всех машинах, где эта программа не падает, видюхи внешние. Встроенную в Intel Atom видеокарту откровенно не хвалят, да и общие отзывы следующие:
_________________ iLavr
|
22 Mar 2024 07:27 |
|
![](./styles/getaway/theme/images/spacer.gif) |
imsushka
Senior
Joined: 01 Jan 2022 04:34 Posts: 173 Location: USSR, Tashkent
|
ну про пошаговый режим я и так знал, поэтому и говорил что надо ставить метку и прыгать до нее
до подпрограммы выполняется без ошибок ? по метке ?
как только заходит в подпрограмму метка начинает ошибку давать ?
|
22 Mar 2024 07:45 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
да - по метке и без ошибок. именно так. У меня есть ещё очень косвенное предположение, что там с сегментными регистрами что-то напутано. Замечал я за многие годы пользования этой программой один глючок, вылетающий на отдельных процессорах. Но он не мешал её работе в то время... Ошибка заключалась в том, что 2 Паскалевские переменные становились видны в верхнем левом углу экрана. ![:roll:](./images/smilies/icon_rolleyes.gif) А поскольку это были счетчики, на экране было поточечно видно, как они считают. ![:wink:](./images/smilies/icon_wink.gif) Но в данном случае под отладкой оригинал программы без этих переменных. Они были введены позже для эмуляции таймера К580ВИ53 на двух каналах таймера IBM PC.
_________________ iLavr
|
22 Mar 2024 08:02 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Продебужил под DOS-BOX чтобы посмотреть, что ж там без ошибки происходит... Я бы такой код руками ни за что не написал! Debug, ожидая "до метки", теряет управление, потому как из этой функции по-человечески не выходят! Из неё выходят дальним джампом в код раньше вызова этой функции, а потом вызывают её снова... Стек, может быть, где-то и встаёт на место, но Debug теряется в таком коде... Понятно, что по одному оператору аппаратно это как-то проходится... Похоже на странную рекурсию... ![neutral :neutral:](./images/smilies/icon_neutral.gif)
_________________ iLavr
|
22 Mar 2024 10:44 |
|
![](./styles/getaway/theme/images/spacer.gif) |
imsushka
Senior
Joined: 01 Jan 2022 04:34 Posts: 173 Location: USSR, Tashkent
|
это больше на турбовижн похоже типа вызов методов
нету у меня старых прог на просмотреть код
|
22 Mar 2024 11:19 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да и не надо, пожалуй, чего на него смотреть, когда в общем-то всё ясно. Этот код не подпатчить просто парой байтов, чтобы вдруг заработало. А отслеживать его странности смысла особого нет. Хотелось чтобы старая прога работала на ноутбуках с Виндой 7, но не судьба ей, видимо...
_________________ iLavr
|
22 Mar 2024 12:13 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
![Reply with quote Reply with quote](./styles/getaway/imageset/en/icon_post_quote.gif)
![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) | Lavr wrote: В пошаговой отладке " Trace" используется аппаратный режим трассировки микропроцессора 8086. ( INT 01 — исключение #DB «Отладочное прерывание») | ![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) |
Пришла мне напоследок совсем шаловливая мысль: Если пошаговое прохождение не вызывает ошибки, то, может быть, запустить всю программу под постоянным контролем каждого кода под пошаговым прерыванием INT 01, которое я перехватываю в собственный "костылик"? Получилось неплохо, хотя и INT 03 пришлось задействовать: первый байт программы меняется на 0CCH, в перехваченном мной INT 03 байт 0CCH заменяется на нормальный первый байт, IP откатывается на шаг назад, после чего взводится флаг INT 01 и программа запускается сначала, но уже под контролем INT 01. К сожалению, результат был всё тот же: Machine Check Error. По пути выяснил, что программу можно неплохо замедлить, если внутри INT 01 вставить циклы задержки... Это тоже не помогло, хотя и медленно было видно, как программа стартует, входит в свой графический режим 640х350х16 и тут уже падает с Machine Check Error крупным шрифтом... Наткнулся я на форум Паскалистов А как у AMD с паскалевскими программами для DOS?, где посетители пишут, что некоторые Паскалевские программы перестают падать при замедлении. Так что если кто захочет замедлить свою программу через INT 01, выкладываю здесь код: Код грязноватый, так как я адаптировал одну свою старую программу, взятую с этого форума. Но разобраться можно, я думаю, если понадобится. Сам я, возможно, её как-нибудь доделаю в простой отладчик с выводом информации в одну верхнюю строчку - такой фокус есть в "Специалист_МХ", и здесь мне его очень не хватало...
_________________ iLavr
|
04 Apr 2024 13:01 |
|
![](./styles/getaway/theme/images/spacer.gif) |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
![Reply with quote Reply with quote](./styles/getaway/imageset/en/icon_post_quote.gif)
Любопытно мне стало, что же такое может быть в библиотеке, написанной также на Паскале, что приводит к этому сАмому Machine Check Error. Разыскал я старые исходники этой программы, расставил точки останова, и был чрезвычайно удивлён полученным результатом! Программа вылетает в Machine Check Error на собственных графических примитивах Паскаля: Line(x1, y1, x2, y2: Integer); и Bar(x1, y1, x2, y2: Integer); - соответственно, отрисовка линии и закрашенного прямоугольника из egavga.obj . Чтобы точно убедиться в этом, написал аналоги этих функций через прерывание BIOS INT10H, AH=0CH: АНАЛОГ Line()![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) | Code: procedure TWin.WDrawRec(x,y,x1,y1:integer; flag:boolean); var colx: integer; {подпрограмма рисует прямоугольник} begin {if flag then SetColor((not col1) and $f) else SetColor(col1);} if flag then colx:=((not col1) and $f) else colx:=col1;
{Line(x1,y1,x1,y); Line(x1,y1,x,y1);} asm push ax push bx push cx push dx
mov dx,y1 {graphics row = y} @00:mov cx,x1 {graphics column = x} mov bh,$0 mov ax,colx {color number } mov ah,$0c int $10
dec dx cmp dx,y jnz @00
mov cx,x1 {graphics column = x} @01:mov dx,y1 {graphics row = y} mov bh,$0 mov ax,colx {color number } mov ah,$0c int $10 mov ah,$0c int $10
dec cx cmp cx,x jnz @01
mov ah,$0c int $10
pop dx pop cx pop bx pop ax end;
{if flag then SetColor(col1) else SetColor((not col1) and $f);} if flag then colx:=col1 else colx:=((not col1) and $f);
{Line(x,y,x1,y); Line(x,y,x,y1);} asm push ax push bx push cx push dx
mov cx,x1 {graphics column = x} @02:mov dx,y {graphics row = y} mov bh,$0 mov ax,colx {color number } mov ah,$0c int $10
dec cx cmp cx,x jnz @02
mov ah,$0c int $10
mov dx,y1 {graphics row = y} @03:mov cx,x {graphics column = x} mov bh,$0 mov ax,colx {color number } mov ah,$0c int $10
dec dx cmp dx,y jnz @03
pop dx pop cx pop bx pop ax end; end; | ![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) |
АНАЛОГ Bar()![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) | Code: procedure TWin.WBar(x,y,x1,y1:integer); var colr: integer; begin colr:=col2; asm push ax push bx push cx push dx
mov dx,y1 {graphics row = y} @00:mov cx,x1 {graphics column = x} @01:mov bh,$0 mov al,colr {color number } mov ah,$0c int $10
dec cx cmp cx,x jnz @01
mov ah,$0c int $10
dec dx cmp dx,y jnz @00
pop dx pop cx pop bx pop ax end; end; | ![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) | ![](images/spacer.gif) |
Подправил я местами взаимодействие с этими самодельными функциями, и в общем-то программа с ними впервые нормально стартанула под DOS 8.0 и Intel ATOM 1.8 GGz! Я был очень удивлён таким результатом, поскольку ожидал в библиотеке каких-либо програмистских хитростей и нетривиальных решений... а там всё по-Паскалевски чистенько. Но потом я удивляться перестал, потому как сам Borland Pascal 7.0 под DOS 8.0 и Intel ATOM 1.8 GGz падает и вовсе безо всяких сообщений. А вот Quick BASIC 4.5 под DOS 8.0 и Intel ATOM 1.8 GGz HE падает! Как не приводит к краху и его функция LINE (X1, Y1)-(X2, Y2)... ![:lol:](./images/smilies/icon_lol.gif)
_________________ iLavr
|
07 Apr 2024 18:40 |
|
|
Who is online |
Users browsing this forum: No registered users and 79 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|