Scenergy
#02
31 декабря 1999 |
|
Coding - Баг в STS?
Баг в STS? В процессе подготовки ZXA library к публикации я столкнулся со странным поведением STS при отладке примеров работы с библиотекой. Я не могу сказать точно: баг ли это в STS или просто особенность работы, но все должны знать об этом, чтобы не искать несуществующие баги в своем коде. Итак, отлаживался следующий кусок кода: CALL ZXA_DRAW_FRAME INT_COUNTER EQU $+1 LD A,00 А на прерываниях висел следующий фрагмент: LD HL,INT_COUNTER INC (HL) Причем (важный момент!) время работы процедуры ZXA_DRAW_FRAME составляло чуть более прерывания, т.е. за время ее работы прерывание приходило обязательно. Так вот, если строка CALL ZXA_DRAW_FRAME является текущей (на нее установлен PC) и если пройти в STS эту строку по SS+T, то регистр SP ИЗМЕНИТ СВОЕ ЗНАЧЕНИЕ! Причем его значение обязательно будет равно #FBxx где xx - какое-нибудь число. Что это: баг или нет? Я не знаю... Знаю только, что потратил несколько часов на поиски ошибки в своем коде (ведь код работал, если его запустишь, и не работал при отладке в STS). Приведу пример программы, при отладке которой можно столкнуться с проявлением этой ошибки: DI LD HL,#6000 LD DE,#6001 LD BC,#100 LD (HL),#61 LDIR LD A,#C3 LD (#6161),A LD HL,IM2 LD (#6162),HL LD A,#60 LD I,A IM 2 EI LOOP HALT CALL PROC ;*** INT_CNT LD A,00 LD BC,#7FFE IN A,(C) AND 1 JR NZ,LOOP IM 1 RET ;HL=4000 чтобы время работы процедуры было ;равно примерно 1.5 прерываниям на ;Pentagon'е без турбо режима. PROC LD HL,4000 L1 DEC HL LD A,H OR L JR NZ,L1 RET IM2 PUSH HL LD HL,INT_CNT+1 INC (HL) POP HL EI RET Наберите эту программу, откомпилируйте, войдите в STS, протрассируйте до строки помеченной '***' и на ней нажмите SS+T. Затем посмотрите на регистр SP - у меня его значение после всех этих действий становится равным #FB00. А вот если после строки CALL PROC добавить несколько NOP'ов (столько, чтобы команда JP x не накрывала переменную INT_CNT), то все будет работать нормально. Так что, по всей вероятности, эта проблема возникает из-за того, что STS при нажатии SS+T просто ставит после команды точку останова и запускает ее. Да, еще забыл сказать что это проверялось в STS v4.3, возможно в других версиях все нормально.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября