PDA

Просмотр полной версии : Определение типа процессора на клонах Вектора



ivagor
07.09.2012, 06:15
Выкладываю фрагмент своей программки с subjем, определяются Z80, 580ВМ1, 580ВМ80, 1821ВМ85:

;Определение типа процессора
xra a
dcr a
jpe cpuNotZ80
;Z80
lxi h,Z80txt
shld cputype+1
jmp PrintResult

cpuNotZ80:
push psw
pop h
mov e,l
mvi a,00001010b
xra l
mov l,a
push h
pop psw
push psw
pop h
mov a,l
xra e
cpi 00001000b
jz ItsVM1 ;переход, если 580ВМ1
cpi 00000010b
jnz PrintResult ;переход, если 580ВМ80
;1821ВМ85
lxi h,i8085txt

Несомненно можно сделать короче, но мне не кажется это важным для данного применения.

PPC
07.09.2012, 17:33
Спасибо, ivagor
Вот мой вариант, но не определяет i8085

;OUTPUT
; <A> - CPU type: 0-i8080, 1-KP580BM1, 2-Zilog z80
; <HL>- 0-terminated string with corresponding CPU type
;REMARKS: <BC> and <FLAGS> are not saved

CPUTXT: lxi h,_z80
lxi b,0220h
mov a,b
inr b
rpo ; 2 is returned when z80
lxi h,_580VM1
push b
pop psw
push psw
pop b
mov a,c
sui 21h
rp ; 1 is returned when KP580BM1
lxi h,_i8080
xra a
ret

DSeg

_i8080: DB "i8080",0
_580VM1:DB "KP580BM1",0
_z80: DB "z80",0

Tim0xA
07.09.2012, 17:57
У меня в архиве нашелся еще один вариант


cpu 8080
org 100h

lxi d, hellojpg
mvi c, 9
call 5
call cpudetect
mvi c, 9
call 5
ret
hellojpg db "DETECTING CPU TYPE",0dh,0ah,"THE CPU IS: $"
msg_z80 db "Z80$"
msg_8080 db "KP580BM80A$"
msg_vm1 db "KP580BM1$"
cpudetect: lxi d, msg_z80
xra a
dcr a
rpo
lxi h, 0020h
push h
pop psw
push psw
pop h
mvi a, 20h
ana l
jz kr580
lxi d, msg_vm1
ret
kr580: lxi d, msg_8080
ret
end

svofski
07.09.2012, 18:12
Узнаю свой код? Кто бы еще назвал метку hellojpg :D

ivagor
07.09.2012, 20:41
Ну вы даете!
Мне стало стыдно за страшный первоначальный вариант, поэтому пришлось улучшать. Решил сделать под дос, поэтому в качестве прототипа взял вариант svofski.

.org 100h

lxi d, msg_cpu
mvi c, 9
call 5
call cpudetect
mvi c, 9
call 5
ret
msg_cpu .db "CPU $"
msg_z80 .db "Z80$"
msg_8080 .db "580BM80$"
msg_8085 .db "1821BM85$"
msg_vm1 .db "580BM1$"
cpudetect: lxi d, msg_z80
xra a
dcr a
rpo
mvi l, 00001000b
push h
pop psw
push psw
pop h
xra a
ora l
lxi d, msg_8085
rz
lxi d, msg_8080
rpo
lxi d, msg_vm1
ret

.end

ivagor
08.09.2012, 06:53
Еще один вариант, он на два байта короче и, если заменить возвраты на переходы, может обойтись без стека (сама детектилка, без обращений к дос). Используются недокументированные команды 8080 и 8085.


.org 100h

lxi d, msg_cpu
mvi c, 9
call 5
call cpudetect
mvi c, 9
call 5
ret
msg_cpu .db "CPU $"
msg_z80 .db "Z80$"
msg_8085 .db "1821BM85$"
msg_8080 .db "580BM80$"
msg_vm1 .db "580BM1$"
cpudetect: lxi d, msg_z80
xra a
dcr a
rpo
lxi d, msg_8080
lxi h, 3835h
shlx
mov d, h
mov e, l
dsub d
lxi d, msg_vm1
rz
lxi d, msg_8085
ret

.end


P.S.
Добавил в архив "автономный" вариант, работающий без доса на клонах вектора.

PPC
08.09.2012, 13:15
Ещё бы очень хотелось, чтобы в аккумуляторе возвращались различные значения, ну, скажем, 0,1,2,3 или, если слишком код распухнет какие-нибудь 1,2,4,8. Первое предпочтительнее, потому что легче потом использовать в самомодифицирующемся коде для вычисления адреса перехода.

ivagor
08.09.2012, 13:44
Ещё бы очень хотелось, чтобы в аккумуляторе возвращались различные значения, ну, скажем, 0,1,2,3
Например так? :
<A> - CPU type: 0-i8080, 1-KP580BM1, 2-Zilog z80, 3-1821BM85


cpudetect: lxi d, msg_z80
xra a
dcr a
mvi a, 2
rpo
lxi d, msg_8080
lxi h, первые две буквы msg_8080
xra a
shlx
mov d, h
mov e, l
dsub d
lxi d, msg_vm1
mvi a, 1
rz
lxi d, msg_8085
mvi a, 3
ret

А лучше (на 2 байта короче) так:
<A> - CPU type: 0-i8080, 1-KP580BM1, 2-1821BM85, 3-Zilog z80


cpudetect: lxi d, msg_z80
xra a
dcr a
mvi a, 3
rpo
lxi d, msg_8080
lxi h, первые две буквы msg_8080
xra a
shlx
inr a
mov d, h
mov e, l
dsub d
lxi d, msg_vm1
rz
lxi d, msg_8085
inr a
ret

PPC
08.09.2012, 14:30
Вот, прямо из печки



;OUTPUT
; <A> - CPU type: 0-i8080, 1-KP580BM1, 2-Zilog z80, 3-i8085
; <HL>- 0-terminated string with corresponding CPU type
;REMARKS: <BC> and <FLAGS> are not saved

CPUTXT: lxi h,_z80
lxi b,0208h
mov a,b
inr b
rpo ; 2 is returned when z80
push b
pop psw
push psw
pop b
xra a
ora c
lxi h,_i8085
mov a,b
rz
lxi h,_580VM1
mov a,c
sui 9h
rp ; 1 is returned when KP580BM1
lxi h,_i8080
xra a
ret


_i8080: DB "i8080",0
_580VM1: DB "KP580BM1",0
_z80: DB "z80",0
_i8085: DB "i8085",0


---------- Post added at 06:30 ---------- Previous post was at 06:28 ----------


Например так? :
А лучше (на 2 байта короче) так:
<A> - CPU type: 0-i8080, 1-KP580BM1, 2-1821BM85, 3-Zilog z80


cpudetect: lxi d, msg_z80
xra a
dcr a
mvi a, 3
rpo
lxi d, msg_8080
lxi h, первые две буквы msg_8080
xra a
shlx
inr a
mov d, h
mov e, l
dsub d
lxi d, msg_vm1
rz
lxi d, msg_8085
inr a
ret

Вот этот! Это-запредел. Мой уже смотрится уродливо :-)

ivagor
08.09.2012, 14:48
В принципе можно еще пару байт сбросить заменой lxi d на mvi e, если адреса всех текстовых сообщений (вернее попарно msg_z80 и msg_8080; msg_vm1 и msg_8085) имеют одинаковый старший байт.

Все варианты хорошие, только некоторые более спортивные :)

PPC
08.09.2012, 14:55
Одна тонкость, в production-strength коде всё-таки наверное не стоит использовать недокументированные команды, хотя нам - самое оно.

ivagor
08.09.2012, 15:09
Недокументированные команды - моя слабость, пусть их использование и не очень хорошая вещь.

Кстати, версия 1.0 (http://zx-pk.ru/showpost.php?p=538130&postcount=5) возвращала уникальные значения аккумулятора для каждого типа процессора, только не по порядку:
00 - 1821ВМ85
02 - 580ВМ80
0A - 580ВМ1
FF - Z80

PPC
08.09.2012, 15:18
Недокументированные команды - моя слабость, пусть их использование и не очень хорошая вещь.

Ну в 8085 их использование почти нормально. Когда у Intel его лицензировали чтобы сделать low power 80с85, то вообще в даташите описали, хотя Intel потом протестовал несильно, потому в последующих версиях камня разработчикам ядра приходится эти команды тащить/эмулировать.



URL="http://zx-pk.ru/showpost.php?p=538130&postcount=5"]версия 1.0[/URL] возвращала уникальные значения аккумулятора для каждого типа процессора, только не по порядку:

По порядку, само собой лучше по понятным причинам: сдвиг влево, и вот уже готов ключ адреса перехода в таблице.

ivagor
08.09.2012, 15:30
Оффтоп про 8085.
В прошлом году нагуглил название древней статьи про флаг x5 (http://www.sciencedirect.com/science?_ob=ArticleURL&_udi=B6V0X-4805N43-1VF&_user=10&_coverDate=08%2F31%2F1985&_rdoc=1&_fmt=high&_orig=gateway&_origin=gateway&_sort=d&_docanchor=&view=c&_searchStrId=1757741693&_rerunOrigin=google&_acct=C000050221&_version=1&_urlVersion=0&_userid=10&md5=36ef51a1ead15f3539ef0e9689883871&searchtype=a). К сожалению в открытом доступе я ее не нашел. Может там ничего нового и нет, но все же интересно.

PPC
08.09.2012, 18:19
Пораскинул мозгами, есть вариант ещё на байт короче, чем самый короткий выше, весь на документированных командах и не требует инициализации <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

ivagor
08.09.2012, 18:56
Круто, но вариант с недокументированными снова короче :)
Инициализировать 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

PPC
08.09.2012, 19:15
Ну тогда можно ещё короче :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

ivagor
08.09.2012, 20:36
И еще короче:

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

PPC
08.09.2012, 20:40
И еще короче:


push psw
pop b

Не поверишь, но я сейчас прогонял именно такие варианты :)
А кстати, какой опкод у dsub d?

ivagor
08.09.2012, 20:43
Интересно, какова нижняя граница? Волшебная однобайтовая операция + 4 разных reta (ну и lxi для сообщений)? :)

---------- Post added at 22:43 ---------- Previous post was at 22:41 ----------


Не поверишь, но я сейчас прогонял именно такие варианты
Почему же, верю :) Вариантов то не так уж много (хотя сначала я думал, что вариантов почти нет).


какой опкод у dsub d?
18h

PPC
08.09.2012, 20:50
Интересно, какова нижняя граница? Волшебная однобайтовая операция + 4 разных reta (ну и lxi для сообщений)?

Мне кажется, операции 3-4 плюс retы и lxi для сообщений
Причём пока непонятно, либо "стековый" метод, либо - сложения/сдвиги
Кстати, сложения/сдвиги мы ещё не пробовали :)


18h

Пасиб, а то мой m80 до недокументированных команд не дорос :-)

ivagor
08.09.2012, 21:06
Кстати, сложения/сдвиги мы ещё не пробовали
Хотел последний dcr a заменить на сдвиг, для убыстрения на 4 такта, но поленился перекомпилировать и снова проверять. Хотя наверно такую мелочь можно было и без проверки.

А если так каждую процедуру оптимизировать? :)
На векторе в "классических" программах много рыхлого кода. Например в бейсике это бросается в глаза - "альтаировская" часть очень плотная в отличие от векторовской.

---------- Post added at 23:06 ---------- Previous post was at 23:02 ----------

Забыл в последнем варианте указать
0-i8085, 1 - KP580BM1, 2 - i8080, 3-Zilog z80

PPC
09.09.2012, 00:31
На Векторе только так и надо, я ж писал как-то недавно, шаманство, чистое шаманство :-)

---------- Post added at 13:08 ---------- Previous post was at 13:06 ----------



Забыл в последнем варианте указать
0-i8085, 1 - KP580BM1, 2 - i8080, 3-Zilog z80
Ну да, я в такой режим свалился постов 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

ivagor
09.09.2012, 06:48
Хорошая придумка с sub a.

ivagor
09.09.2012, 11:58
У самого короткого варианта есть незначительное ограничение - на ВМ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 без сюрпризов.

PPC
09.09.2012, 15:08
Мне тоже не очень нравится, что регистровая пара <BC> так бесславно теряет своё значение ради ora c. Наверное, стоит по-крайней мере, подумать об ora e. Единственно, категорически не нравятся варианты с ограничением по размещению в памяти. Я вижу, откуда появится [2,127], но экономия на регистре таким образом, по-моему перебор. Многие (и я) используют перемещаемый ассемблер и библиотеки, и хоть компоновщик засовывает combined сегмент данных до сегмента кода, это не гарантия, что _i8080 попадёт в начало. Делать absolute addressing mode для этих данных не хочется ещё больше по туче причин. Похоже, будем жить с последним вариантом. Было прикольно её оптимизить вдвоём. Спасибо, ivagor, надеюсь когда нибудь ещё поработать вместе. Только, наверное, offline если не против, а то вон мы тут сколько постов нагенерили. Одно оправдание, что весь процесс оптимизации на виду.

svofski
09.09.2012, 15:13
По-моему то, что вы делаете, это замечательно. Можно отдельную тему завести: "ivagor & PPC работают вместе" ;)

ivagor
09.09.2012, 15:59
Единственно, категорически не нравятся варианты с ограничением по размещению в памяти.
Для задачи определения типа процессора это, конечно, перебор. Если бы что-то действительно критичное (графика, супер-расчеты, интерпрератор чего-то), тогда бы наверно имело смысл.


Похоже, будем жить с последним вариантом.
Тогда наверно стоит зафиксировать (с учетом вышеупомянутых правок):


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


Было прикольно её оптимизить вдвоём. Спасибо, ivagor, надеюсь когда нибудь ещё поработать вместе. Только, наверное, offline если не против, а то вон мы тут сколько постов нагенерили. Одно оправдание, что весь процесс оптимизации на виду.
Да, было прикольно, в свою очередь хочу сказать спасибо за такое интересное и полезное взаимодействие. Когда есть взгляд со стороны, свежие идеи - меньше риск что-то просмотреть или зациклиться на неудачных решениях. Ни и дух соревновательности подталкивает :)
Насчет поработать вместе - кто знает, у меня много пятниц на неделе, лучше я ничего определенного говорить не буду, но не исключно :)

PPC
09.09.2012, 17:21
Сейчас немного занят, подробно ответить не смогу.
У меня немножко другой взгляд на вещи типа активного банка, и я бы написал в 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


Но это уже детали, а с остальным согласен.

ivagor
12.09.2012, 20:08
Для коллекции еще один "потенциально бесстековый" вариант. Особенность в том, что используются только "старые" флаги, но учтена установка 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

PPC
12.09.2012, 20:19
Красивый вариант, особенно понравилось использование десятичной коррекции.

ivagor
14.12.2013, 13:50
Можно еще добавить определение AMDшных клонов, пусть даже на векторе их никогда не было. Инфа здесь (http://www.idb.me.uk/sunhillow/8080.html).

ivagor
04.01.2014, 21:54
Добавил как сумел детект amd8080

Выглядит почти также неуклюже, как 1й вариант в теме, т.к.
1. Не используются недокументированные команды
2. Не меняется банк памяти 580ВМ1

В идеале было бы здорово добавить детект разных вариантов z80 и даже режима эмуляции 8085 в NEC V20/V30, но я не готов. Пока даже не уверен, правильно ли добавил amd8080.

ivagor
18.01.2014, 19:27
Пока даже не уверен, правильно ли добавил amd8080.
Теперь уверен, все правильно.

ivagor
19.01.2014, 14:35
Добавил детект R800

ivagor
19.01.2014, 19:14
И почти без перерыва нечто менее экзотическое - опциональное определение CMOS/NMOS Z80. Опциональное (с ключом /Z) потому что используются прерывания, которые есть не на любой CP/M машинке.
Интересно, что в emu и VV такая фигня, как баг NMOSовских Z80 с LD A,R и LD A,I не поддерживается. А в BlueMSX поддерживается.

ivagor
20.01.2014, 11:08
Наспамил я в этой теме, но в итоге сделал практически все, что хотел (остались всякие хитрые Z80 и Co). В 1.5 добавил определение режима эмуляции 8080 (не 8085, как я писал выше) в NECах Vx0. Гарантировать правильность детектилки NECов могу не на 100% (во всех остальных уверен), но даже если она не сработает, CPUID15 напечатает i8080 или amd8080, т.е. не зависнет. Опция /Z (или /z) работает как и в 1.4, т.е. при наличии прерываний позволяет различить NMOS и CMOS Z80.

ivagor
20.01.2014, 17:11
Завершающий штрих. Изменил написание и смысл опции. Теперь не /Z, а /I.
Без /I прерывания не затрагиваются.
С /I возможны 2 варианта:
1. Если идем по ветке z80, то пробуем определить NMOS/CMOS. При выходе состояние прерываний как на входе. Т.е. все аналогично предыдущей опции /Z.
2. Если идем по ветке 8080, то получаем возможность уверенно детектить NECи Vx0 (без /I вероятность меньше 100%). При выходе прерывания будут разрешены.
В детектировании 8085 и 580ВМ1 прерывания не участвуют.

shurik-ua
23.08.2020, 00:10
детект C и N MOS Z80 и эмуля есть в тесте HorrorFasTest - вродебы прерывания не юзаются - давно смотрел

ivagor
23.08.2020, 06:20
Да, там детектят недокументированной командой. К сожалению это команда out, поэтому тоже не универсальный метод, надо знать, куда на данном компе можно записать, чтобы потом еще можно было и прочитать.

ivagor
23.08.2020, 10:01
Если подумать, то в HorrorFasTest вариант детекта cmos проца с прерываниями был бы более корректным, т.к. прерывания есть во всех спеках, а AY не во всех. Тем более в имеющемся варианте они сначала детектят проц с использованием AY, а уже потом определяют наличие AY.

NEO SPECTRUMAN
23.08.2020, 16:48
а про детекцию U880\т34\1858вм1 совсем забыли...

ivagor
08.01.2022, 09:01
Новая версия CPUID, теперь на githubе (https://github.com/ivagorRetrocomp/CPUID80/releases).
Убрал детект NEC V20/V30 (возможно потом верну с другим принципом идентификации).
Переделал детект NMOS/CMOS Z80 с прерываний на недокументированный out.
Теперь прерывания не нужны, изменил опцию /I на /P (запись/чтение порта 01, годится для вектора и ориона-про). Без /P будет детектить "просто Z80". С /P детект NMOS/CMOS Z80 и U880/наших клонов.
Как обычно новые фичи ведут к выявлению особенностей разных эмуляторов. Emu четко эмулирует "не U880", причем не только в outi, но и в остальных командах блочного ввода/вывода (спасибо Дмитрию2012 за проверки на реале). А вот Emu80 и VV похоже сделаны по официальному описанию, поэтому в текущих версиях этих эмуляторов в конфиге Z80 с оцпией /P будет определяться U880/наши клоны.

ivagor
18.06.2023, 08:26
Добавил в CPUID80 (https://github.com/ivagorRetrocomp/CPUID80) детект экзотического NEC8080A (не попсовых NEC8080AF, которые как Intel).

- - - Добавлено - - -

Пока далеко не отошел добавил еще различение Интел/AMD для 8085.

ivagor
22.06.2023, 18:03
NEC8080A оказался страньше (извините мой французский), чем я предполагал. Детект из 1.7 сам по себе должен работать (сделал по данным (https://gist.github.com/houmei/a58a07d4e1bdeb0239be83e8cc09af07) с реала), но скорее скорее всего до него дело не дошло бы и на предыдущей ветке свернул бы не туда. Переделал (https://github.com/ivagorRetrocomp/CPUID80) по книжке (https://datassette.s3.us-west-004.backblazeb2.com/livros/osborne_4_8_bit_microprocessor_handbook.pdf).