|
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, возможно в других версиях все
нормально.
Другие статьи номера:
Похожие статьи:
В этот день... 20 ноября