(с) Василий.
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 |
- воскресенье). | ||||
|
********************************************************* | |||||
|
| |||||