Мне кажется, операции 3-4 плюс retы и lxi для сообщений
Причём пока непонятно, либо "стековый" метод, либо - сложения/сдвиги
Кстати, сложения/сдвиги мы ещё не пробовали :)
Пасиб, а то мой m80 до недокументированных команд не дорос :-)
Вид для печати
Хотел последний dcr a заменить на сдвиг, для убыстрения на 4 такта, но поленился перекомпилировать и снова проверять. Хотя наверно такую мелочь можно было и без проверки.
А если так каждую процедуру оптимизировать? :)
На векторе в "классических" программах много рыхлого кода. Например в бейсике это бросается в глаза - "альтаировская" часть очень плотная в отличие от векторовской.
---------- Post added at 23:06 ---------- Previous post was at 23:02 ----------
Забыл в последнем варианте указать
0-i8085, 1 - KP580BM1, 2 - i8080, 3-Zilog z80
На Векторе только так и надо, я ж писал как-то недавно, шаманство, чистое шаманство :-)
---------- Post added at 13:08 ---------- Previous post was at 13:06 ----------
Ну да, я в такой режим свалился постов 10 назад.
Думаю, ничего, что i8080 стал двойкой а не нулём
Теперь 8080 стал единицей :-)
---------- Post added at 15:00 ---------- Previous post was at 13:08 ----------
Код:; CPUTxt Detects CPU type, returns 0-terminated CPU type string
; INPUT: NONE
; OUTPUT: <A> - CPU type: 0-z80, 1-i8080, 2-i8085, 3-KP580BM1
; <DE> - 0-terminated CPU type string
CPUTXT: sub a
lxi d,_z80
rpo
inr a
push psw
pop b
lxi d,_i8080
DB 0D9h ; shlx
ora c
lxi d,_580VM1
rpe
inr a
lxi d,_i8085
ret
_i8080: DB "i8080",0
_580VM1: DB "KP580BM1",0
_z80: DB "z80",0
_i8085: DB "i8085",0
---------- Post added at 16:31 ---------- Previous post was at 15:00 ----------
Можно ещё чуть ускорить
Код:; CPUTxt Detects CPU type, returns 0-terminated CPU type string
; INPUT: NONE
; OUTPUT: <A>-CPU type: 0-z80, 1-i8080, 2-i8085, 3-KP580BM1
; <DE> - 0-terminated CPU type string
CPUTXT: sub a
lxi d,_z80
rpo
inr a
push psw
pop b
lxi d,_i8080
DB 0D9h ; shlx
ora c
lxi d,_580VM1
rpe
ral
lxi d,_i8085
ret
_i8080: DB "i8080",0
_580VM1: DB "KP580BM1",0
_z80: DB "z80",0
_i8085: DB "i8085",0
Хорошая придумка с sub a.
У самого короткого варианта есть незначительное ограничение - на ВМ1 д.б. активен банк памяти 0.
Можно чуть ускорить наиболее вероятную ветку 8080 перенеся push pop после shlx. При этом можно избавится от порчи BC, заменив pop b на pop d и ora с на ora e.
Сделал независимый от банка вариант, и без push pop (можно переделать в "бесстековый", заменив retы на переходы). Но в универсальном виде он на 2 байта длиннее. Если старший или младший байты адреса _i8080 принадлежат диапазону [2,127], то можно еще байт сократить. Выкладывать неохота, вдруг его еще можно сократить :)
---------- Post added at 13:58 ---------- Previous post was at 13:41 ----------
В VV интересный момент. Если изменять банк памяти ВМ1 через smf, то все предсказуемо. А если изменить банк в отладчике, то он на следующей команде "вернется". В emu без сюрпризов.
Мне тоже не очень нравится, что регистровая пара <BC> так бесславно теряет своё значение ради ora c. Наверное, стоит по-крайней мере, подумать об ora e. Единственно, категорически не нравятся варианты с ограничением по размещению в памяти. Я вижу, откуда появится [2,127], но экономия на регистре таким образом, по-моему перебор. Многие (и я) используют перемещаемый ассемблер и библиотеки, и хоть компоновщик засовывает combined сегмент данных до сегмента кода, это не гарантия, что _i8080 попадёт в начало. Делать absolute addressing mode для этих данных не хочется ещё больше по туче причин. Похоже, будем жить с последним вариантом. Было прикольно её оптимизить вдвоём. Спасибо, ivagor, надеюсь когда нибудь ещё поработать вместе. Только, наверное, offline если не против, а то вон мы тут сколько постов нагенерили. Одно оправдание, что весь процесс оптимизации на виду.
По-моему то, что вы делаете, это замечательно. Можно отдельную тему завести: "ivagor & PPC работают вместе" ;)
Для задачи определения типа процессора это, конечно, перебор. Если бы что-то действительно критичное (графика, супер-расчеты, интерпрератор чего-то), тогда бы наверно имело смысл.
Тогда наверно стоит зафиксировать (с учетом вышеупомянутых правок):
И альтернативный, "почти бесстековый" вариант.Код:cpudetect:
sub a
lxi d,_z80
rpo
inr a
lxi d,_i8080
shlx
push psw
pop d
ora e
ani 00000011b ;чтобы не зависеть от банка памяти ВМ1
lxi d,_580VM1
rpe
ral
lxi d,_i8085
ret
Да, было прикольно, в свою очередь хочу сказать спасибо за такое интересное и полезное взаимодействие. Когда есть взгляд со стороны, свежие идеи - меньше риск что-то просмотреть или зациклиться на неудачных решениях. Ни и дух соревновательности подталкивает :)Код:cpudetect:
sub a
lxi d,_z80
rpo
inr a
lxi d,_i8080
shlx
inr a
cpi 3
lxi d,_i8085
jof SkipVM1
inr a
lxi d,_580VM1
SkipVM1:
ret
Насчет поработать вместе - кто знает, у меня много пятниц на неделе, лучше я ничего определенного говорить не буду, но не исключно :)
Сейчас немного занят, подробно ответить не смогу.
У меня немножко другой взгляд на вещи типа активного банка, и я бы написал в NOTES секции о том, что нужен банк 0, а код бы релизнул с conditional compilation следующего вида:
Но это уже детали, а с остальным согласен.Код:
ANYBNK EQU 0
cpudetect:
sub a
lxi d,_z80
rpo
inr a
lxi d,_i8080
shlx
push psw
pop d
ora e
IF ANYBNK
ani 00000011b ;чтобы не зависеть от банка памяти ВМ1
EndIF
lxi d,_580VM1
rpe
ral
lxi d,_i8085
ret
Для коллекции еще один "потенциально бесстековый" вариант. Особенность в том, что используются только "старые" флаги, но учтена установка AC командами ana/ani на 8085. Заодно выяснилось, что в VV это сейчас не реализовано.
Код:cpudetect:
; CPUTxt Detects CPU type, returns 0-terminated CPU type string
; INPUT: NONE
; OUTPUT: <A>-CPU type: 0-z80, 1-i8080, 2-KP580BM1, 3-i8085,
; <DE> - 0-terminated CPU type string
sub a
lxi d,_z80
rpo
inr a
lxi d,_i8080
shlx
ani 0
daa
mvi a,2
lxi d,_580VM1
rz
lxi d,_i8085
inr a
ret