Одна тонкость, в production-strength коде всё-таки наверное не стоит использовать недокументированные команды, хотя нам - самое оно.
Вид для печати
Одна тонкость, в production-strength коде всё-таки наверное не стоит использовать недокументированные команды, хотя нам - самое оно.
Недокументированные команды - моя слабость, пусть их использование и не очень хорошая вещь.
Кстати, версия 1.0 возвращала уникальные значения аккумулятора для каждого типа процессора, только не по порядку:
00 - 1821ВМ85
02 - 580ВМ80
0A - 580ВМ1
FF - Z80
Ну в 8085 их использование почти нормально. Когда у Intel его лицензировали чтобы сделать low power 80с85, то вообще в даташите описали, хотя Intel потом протестовал несильно, потому в последующих версиях камня разработчикам ядра приходится эти команды тащить/эмулировать.
По порядку, само собой лучше по понятным причинам: сдвиг влево, и вот уже готов ключ адреса перехода в таблице.
Оффтоп про 8085.
В прошлом году нагуглил название древней статьи про флаг x5. К сожалению в открытом доступе я ее не нашел. Может там ничего нового и нет, но все же интересно.
Пораскинул мозгами, есть вариант ещё на байт короче, чем самый короткий выше, весь на документированных командах и не требует инициализации <HL> в первые буквы сообщения.
Скорее всего и это ещё не предел.
Код:
;_CPUTxt Detects CPU type, returns 0-terminated CPU type string
;_INPUT: NONE
;_OUTPUT: <A>-CPU type:0-i8085, 1-KP580BM1, 2 - i8080, 3-Zilog z80
CPUTXT: lxi b,0908h
mvi a,2
inr a
lxi h,_z80
rpo
push b
pop psw
push psw
pop b
lxi h,_580VM1
mov a,c
sub b
rp
add b
lxi h,_i8080
rnz
lxi h,_i8085
ret
_i8080: DB "i8080",0
_580VM1: DB "KP580BM1",0
_z80: DB "z80",0
_i8085: DB "i8085",0
Круто, но вариант с недокументированными снова короче :)
Инициализировать HL буквами действительно не стоит, т.к. надпись 580ВМ80 испортится только на ВМ1 и ВМ85, соответственно ее никто не увидит.
Код:cpudetect: lxi d, msg_z80
xra a
dcr a
mvi a, 3
rpo
lxi d, msg_8080
xra a
shlx
inr a
mov h, d
mov l, e
dsub d
lxi d, msg_vm1
rz
lxi d, msg_8085
inr a
ret
Ну тогда можно ещё короче :v2_wink2:
Код:cpudetect: lxi d, msg_z80
mvi a,2
inr a
rpo
lxi d, msg_8080
xra a
shlx
inr a
mov h, d
mov l, e
dsub d
lxi d, msg_vm1
rz
lxi d, msg_8085
inr a
ret
И еще короче:
Код:cpudetect:
mvi a,2
inr a
lxi d,_z80
rpo
push psw
pop b
dcr a
lxi d,_i8080
shlx
ana c
lxi d,_i8085
rz
lxi d,_580VM1
dcr a
ret
Интересно, какова нижняя граница? Волшебная однобайтовая операция + 4 разных reta (ну и lxi для сообщений)? :)
---------- Post added at 22:43 ---------- Previous post was at 22:41 ----------
Почему же, верю :) Вариантов то не так уж много (хотя сначала я думал, что вариантов почти нет).
18h