Хотел последний 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
Последний раз редактировалось PPC; 09.09.2012 в 00:50.
Хорошая придумка с 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
Последний раз редактировалось ivagor; 12.09.2012 в 20:19.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)