Этюды - несколько полезных советов для написания оптимальных процедур.
(с) Василий.
Hello, Inforcom. Я хочу на страницах вашего журнала обратиться к вашим читателям, посылающим свои процедуры в раздел Этюды.
Уважаемые "производители" этюдов! Прежде чем посылать в журнал свои процедуры постарайтесь сначала оптимизировать их, сделать проще и эффективнее. Не торопитесь! Пусть Ваша процедура прекрасно работает, пусть даже в ней заложена хорошая и нужная идея, но если ее можно сделать короче в 1,5 раза, и если она ужасна по своей структуре, то какой же это "перл" и, тем более, "алмаз" Этим самым Вы портите замечательную идею ААИванова. Я конечно же имею в виду не все про-
_ZX-PeniP >y/1"g
ЭТЮДЫ
цедуры - некоторые из них воистину шедевры, но речь идет не о них.
В качестве примера (я мог взять любой другой) привожу на ваш суд свое собственное решение процедуры Redefine Keys (аналогичную процедуре А.Шокало и написанную мной еще полгода назад). Она занимает всего 14 байт (у А.Шокало 23 байта). Вот она: REDEF LD BC,#7FFE С1 RRC В
IN А,(С) CPL
AND 31 JR Z,C1 LD С,A RET
Сравните ее с процедурой А.Шокало (ZX РЕВЮ 96/4-5). Как Вы видите она гораздо короче, проще и понятнее. Старший байт порта в регистре В, бит нажатой клавиши установлен в С.
И в заключение даю в таблице пару советов, посвященных оптимизации программ (уж это то должен знать каждый, кто работает в ас
Предлагаю вам также переделанную мною процедуру TRANSF (2 TRANSF
байт против 46).
CALL
CO
RLCA
RLCA
RLCA
LD
E.A
LD
A,B
CPL
CALL
CO
ADD
A.E
LD
E,A
LD
A, 44
SUB
E
LD
L,A
LD
H,2
LD
A.(HL)
RET
LD
H,#FF
INC
H
RRA
JR
NC.CC
LD
A,H
RET
СО СС
семблере):
Команда
Команда на которую можно заменить
Примечание. Следует учитывать при замене
xor #ff
cpl
Инверсия регистра A. CPL не изменяет, в отличии от XOR, флаги CY, Z, P/V, S
ср 0
and a (or а)
При проверке на 0, СР 0 можно заменить на AND А. Флаг Z устанавливается точно также.
and х ср 0 jr z,lll
and х jr z,lll,
где x=n,A,B,C,D,E,H, L,(hl),(ix+d),(iy+d)
ср 0 делать не обязательно, см 2.
Id а,0
xor a, sub a
При SUB А и XOR А портятся флаги, поэтому использование их не всегда возможно. (Команда LD флаги не портит)
scf ccf
and a
Обнуление флага CY. AND А портит другие флаги и это следует учитывать
ret z
jr z,mmm
Выигрыша в размере нет, но
jr mmm
ret
Вашу процедуру будет легче читать(видно конец процедуры)!
P.S. Предлагаю конкурс. Придумайте процедуру календарь. В регистре DE задается год, в регистре А - число. Нужно получить в регистре