(с) Василий.
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 задается год, в регистре А - число. Нужно получить в регистре
|
А день недели (0...6 или 1...7, где 0 и 7 |
- воскресенье). | ||||
|
********************************************************* | |||||