nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 18 Mar 2024 23:00



Reply to topic  [ 15 posts ] 
Процессор 1810ВМ86М и написание эмулятора 286 инструкций... 
Author Message
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Некоторое время назад приобрел по случаю пару 1810ВМ86М, один из которых сейчас разместился в Поиск-2.
Документации на процессор нет, и в сети ходили лишь слухи и догадки - умеет ли он 186+ опкоды, или не умеет, и отличается ли чем то от 1810ВМ86, кроме повышенной рабочей частоты? Так вот, спустя время, экспериментально подтверждено следующее:
- процессор умеет выполнять аппаратно такие 186+ команды как: POPA, PUSHA, PUSH imm, LEAVE, INS, OUTS;
- процессор умеет генерировать int 06h (invalid opcode).

Затем, нашлась некоторая методичка, записанная "от руки" пользователем serg с форума "полигон призраков" о компьютере ЕС1842, которая подтвердила результаты экспериментов. Согласно ей, действительно, процессор включает:
- дополнительные управляющие признаки в регистре FLAG;
- реализацию команд POPA, PUSHA, PUSH imm, LEAVE, INS, OUTS и модификацию выполнения команд IRET, CLD, CLI, STD, STI;
- 3 дополнительных прерывания: 1) по недействительному коду в реальном и виртуальном режимах (вектор 06); 2) при изменении содержимого сегментного регистра в виртуальном режиме (вектор 05); 3) при эмуляции команды ESC в виртуальном и реальном режимах (вектор 07)
- аппаратная поддержка переключения стека при прерываниях в виртуальном режиме.

Таким образом, 1810ВМ86М - уникальная разработка, не имеющая аналогов в мире (c) Серьезно, это не клон 8086, не клон 80186 и не клон V30. В паре с "контроллером виртуальной памяти" К1845ВГ1 вполне вероятно, что оно вполне могло эмулировать 286, причем не только реальный режим, но и расширенный режим 286. До наших дней сохранился некий "ЭМУЛЯТОР" с дискеты от ЕС1842, который так же немного приоткрывает завесу тайны. Если его дизассемблировать, то видно, что существуют дополнительные опкоды вида F1 FA и F1 FB, которые, по-видимому, служат для переключения теневой пары регистров SS':SP' . Так же там еще встречаются инструкции вида F1 FD, и если не ошибаюсь, то и F1 FC. Что они делают - я не разобрался. Данный эмулятор конечно же не запускается на ПК Поиск-2, так как у него отсутствует К1845ВГ1, отсутствует память в районе E8000, куда эмулятор пытается установить теневой стек и прочие мелочи, немного отличающие Поиск-2 от ЕС1842....

...Поэтому, решено было попробовать написать свой эмулятор 186+ инструкций реального режима для данного процессора. На удивление, сперва все пошло гладко, и я написал в перехваченном int 06h эмуляцию:
- всех видов сдвигов на значение отличное от 1 (опкоды C0, C1);
- знакового деления со значением (опкоды 6B, 69), пока только для регистровой адресации;

и запнулся на реализации команды ENTER. Нужно в прерывании затолкнуть в стек значение (push bp), только в стек до прерывания. Казалось бы простая задача, а поставила меня в тупик. Хочется красивого решения, но пока единственное, что придумывается, смещать все значения в стеке на одно вниз, корректировать реальный SP.... Как-то вроде не красиво, поэтому прошу совета. Вот, например, примерно так выглядит обработчик 06h:

Code:
        _rfl    equ 020h
        _rcs    equ 018h
        _rip    equ 016h
        _ax     equ 014h
        _cx     equ 012h
        _dx     equ 010h
        _bx     equ  0Eh
        _sp     equ  0Ch
        _bp     equ  0Ah
        _si     equ  08h
        _di     equ  06h
        _es     equ  04h
        _ds     equ  02h
        _ss     equ  00h

new_06h:
.286
        pusha
.8086
;   push ax
;   push cx
;   push dx
;   push bx
;   push bp
;   push si
;   push di

        push    es
        push    ds                      ;Save ALL registers.
        push    ss                      ;Its not really nesecary to save SS ;)
        mov     bp,sp                   ;but this engine was built for expansion

        ;One thing to note, if you want to know the TRUE value of SP, that
        ;is, you must subtract 6 from it, which covers the calling cs, ip & f.
        ;and thats sub w[bp+_sp],6  not sub sp,6 ;)

        push    cs
        pop     ds

GetOpCode:
        lds     si,dword ptr [bp+_rip]  ;Get the seg:off of the next opcode

   dec si            ; !!! WARNING here !!!

        cld                             ;clear direction
        lodsw                           ;get opcode

        ;AL now holds our bytevalue opcode.

   cmp al,0c8h         ; ENTER opcode?
   jne Bad_opcode

       lodsw
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; HERE I NEED DO
; push bp
; mov bp,sp
; sub sp,ax
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Bad_opcode:
RunNextOpCode:
        pop     ss
        pop     ds
        pop     es                      ;Restore the flags
.286
        popa
.8086
;   pop di
;   pop si
;   pop bp
;   pop bx
;   pop dx
;   pop cx
;   pop ax
        iret                            ;Run the next opcode.

_________________
https://t.me/tronix_blog


01 Dec 2019 09:38
Profile
Doomed

Joined: 16 Dec 2014 11:58
Posts: 370
Location: Киев
Reply with quote
Хм.. я так понял, 80186 он умеет? Тогда зачем писать свой ENTER/LEAVE ? Или умеет, но не все?
Что за "виртуальный" режим? Да еще и с контроллером памяти... :o

Далее, если даже enter понадобился, то не все так просто.
Code:
; push bp
; mov bp,sp
; sub sp,ax

Вот этого совершенно недостаточно, enter выглядит так
Code:
C8 iw ib
ENTER imm16, imm8

А вот его реализация из моего софт-эмулятора (извините, комментарии поплыли)
Code:
//C8 enter
void TCPUState::_C8()
{
    u16 iw = GetCode(szW);           //выборка iw
    u8 ib = GetCode(szB);               //выборка ib
    ib %= 32;                 //так согласно мануалу
    SW.PushPopSize = DataSizeDQ;  //размер операции со стеком, word для 8086/80286
    MRQ.Data[0].udq = GPR[R_BP].udq;  //будем пушить bp
    Push();   //пушим

    u64 tmp = GPR[R_SP].udq;  //запомнили sp
    u32 ss_size = HAVE_LONG_CS ? szQ : ((Segs[S_SS].Desc.Attr & ATTR_DB) ? szD : szW);  //размер стековых операций, для 8086/80286 = word
    if (ib)
    {
        u32 decsize = 1 << DataSizeDQ;  //опять же, размер уменьшения стека
        for (u32 i = 1; i < ib; i++)
        {
            (this->*OFFSGPR[ss_size])(R_BP,-decsize); //смещаем bp на -2 байта
            MRQ.Data[0].udq = GPR[R_BP].udq;  //будем его пушить
            Push(); //пушим
        }
        MRQ.Data[0].udq = tmp;  //будем пушить запомненый sp
        Push(); //пушим
    }

    (this->*WGPR[ss_size])(R_BP,tmp); //bp = запомненый sp
    (this->*IncDecRSP)(-iw); //смещаем sp на -iw
}


03 Dec 2019 07:23
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Vic3Dexe wrote:
Хм.. я так понял, 80186 он умеет? Тогда зачем писать свой ENTER/LEAVE ? Или умеет, но не все?


Умеет, но не все. В этом то и прикол.
Умеет: POPA, PUSHA, PUSH imm, LEAVE, INS, OUTS
Не умеет: SHIFT's со значением, отличным от 1, ENTER, IMUL imm8/imm16

Ну, насчет ENTER - мне пока попались только ENTER imm16, 0. В принципе, я набросал реализацию, push bp / mov bp,sp / sub sp,imm16, но пока не проверял - времени нет.

Vic3Dexe wrote:
Что за "виртуальный" режим? Да еще и с контроллером памяти...


В методичке немного описано. Лучше чем там, инфы увы нет нигде.

_________________
https://t.me/tronix_blog


03 Dec 2019 11:10
Profile
Doomed

Joined: 16 Dec 2014 11:58
Posts: 370
Location: Киев
Reply with quote
Tronix wrote:
мне пока попались только ENTER imm16, 0.

Ну так это же не значит, что других вариантов для ib нет :wink:
ib - номер кадра в стеке, iw - его размер. Если будет несколько вложеных процедур, и где-то изнутри понадобится обратиться к локальным переменным внешней - будет enter imm16,не-ноль.

Tronix wrote:
В методичке немного описано. Лучше чем там, инфы увы нет нигде.

Увы, яндекс у нас не тогойт...


03 Dec 2019 13:43
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Vic3Dexe wrote:
Увы, яндекс у нас не тогойт...


А, ну да, забываю. Положил на гугл-драйв.

_________________
https://t.me/tronix_blog


03 Dec 2019 22:17
Profile
Doomed

Joined: 16 Dec 2014 11:58
Posts: 370
Location: Киев
Reply with quote
Афигеть, реально от руки! Я думал - фигура речи. :o
Спасибо, пойду изучать.

upd: Ясно, теневые дескрипторы и вообще механизмы протмоды 286 попросту засунули в отдельный внешний чип, обозвав это "виртуальной" памятью.

Tronix, сорян, но я не вполне копенгаген, зачем он вообще нужен без своей "защищенной" половинки. Обычные команды 186 - и те толком не доделали. Протмода тем более не стартанет. О каком эмуляторе 286 может идти речь? Ну это я, глядя на название темы...

Ну и если совсем по сабжу:
Quote:
Нужно в прерывании затолкнуть в стек значение (push bp), только в стек до прерывания. Казалось бы простая задача, а поставила меня в тупик. Хочется красивого решения, но пока единственное, что придумывается, смещать все значения в стеке на одно вниз, корректировать реальный SP.... Как-то вроде не красиво, поэтому прошу совета.

А без вариантов. Именно потому, что bp должно быть в стеке ДО прерывания. Ну либо завести себе глобальные переменные где-то, куда сейвить CS/IP/FL + все используемые регистры, потом, почистив стек:
Code:
sub sp,2
mov bp,sp
mov ax,[cs:bp_saved]
mov [bp],ax
<прочие_телодвижения>
<восстанавливаем_регистры>
push [cs:flags_saved]
push [cs:cs_saved]
push [cs:ip_saved]
iret


04 Dec 2019 01:18
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Tronix wrote:
Таким образом, 1810ВМ86М - уникальная разработка, не имеющая аналогов в мире (c) Серьезно, это не клон 8086, не клон 80186 и не клон V30. В паре с "контроллером виртуальной памяти" К1845ВГ1 вполне вероятно, что оно вполне могло эмулировать 286, причем не только реальный режим, но и расширенный режим 286.
Есть у меня большое подозрение, что я с таким сталкивался, но не купил его в древние времена.

286-ю машину я себе покупал по частям, поскольку денег вечно не хватало, карта на ней у меня
стояла EGA, но дисплей был "Электроника 32ВТЦ".
Работать неудобно было, т.к. некоторые программы переходили в режим развертки EGA сразу,
а развёртка Электроники такого осилить не могла.
Поэтому озадачился я EGA-дисплей приобрести.

И как-то меня пригласили посмотреть два EGA-дисплея на выбор.
Дисплей я себе тогда и приобрёл, но меня очень удивила машина, с которой
мне дисплеи демонстрировали: сделана она была по канонам IBM, но видно, что
из отечественных комплектующих в основном.
Я поинтересовался - что за системник, и мне сказали, что это "советская двойка",
причем "процессор у неё выполнен не на одном кристалле".
Предлагали купить недорого в приложение к дисплею, но я отказался, так
к тому времени уже "накушался" "Искры-1030", которая была неполность
совместимой ХТ-шкой, что также очень мешало работать.

С тех пор "советская двойка" мне не попадалась никогда, но, видимо, в ней
и был этот самый 1810ВМ86М.

Кстати, мне думается, это проделка конторы Кобылинского - он же состряпал
комплект 580 и комплект 1810, за что и получил "доктора" без защиты дисертации.
580ВМ80 они потом допилили до раритетного 580ВМ1, возможно, и с 1810ВМ86 -
такая же история...

_________________
iLavr


04 Dec 2019 05:50
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Vic3Dexe wrote:
Tronix, сорян, но я не вполне копенгаген, зачем он вообще нужен без своей "защищенной" половинки. Обычные команды 186 - и те толком не доделали. Протмода тем более не стартанет. О каком эмуляторе 286 может идти речь? Ну это я, глядя на название темы...


Да понятно, что толком то и не нужен, потому что есть NEC V30, да и вообще, вон AMD тандерриперы II всякие, но так, интересу ради... О полноценном 286 речи не идет, да, это я немного не верно выразился. Речь идет о эмулировании 186+ инструкций. Ну или 286, но только реального режима.

Например, конкретная цель - запустить игрушку Flashback на этом камне на Поиск-2. Она прекрасно себя чувствует с V30, но естественно не запускается на 8086, потому что скомпилирована как раз для реального режима 286.

Что касается реализации - да, пришел к такому же выводу, уменьшаем SP на два, потом просто все значения в стеке двигаем на два, в дырку пишем нужное значение и выходим с выгрузкой из стека pop'ами. Пока нет времени проверить на железе.

_________________
https://t.me/tronix_blog


04 Dec 2019 06:21
Profile
Doomed

Joined: 16 Dec 2014 11:58
Posts: 370
Location: Киев
Reply with quote
Tronix wrote:
Речь идет о эмулировании 186+ инструкций

Ну тогда по поводу enter мне добавить нечего. Ежели чего - обращайся :)


04 Dec 2019 06:43
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Кстати, мне думается, это проделка конторы Кобылинского - он же состряпал комплект 580 и комплект 1810...
Из интересу посмотрел в поиске - это, действительно, украинское изделие:
Quote:
Микропроцессор КР1810ВМ86М
Электрические параметры:


- Номинальное напряжение питания - 5 В +- 5 %;
- Выходное напряжение низкого уровня - 0,45 В;
- Выходное напряжение высокого уровня - 2,4 В;
- Ток утечки на управляющем входе - +-10 мкА;
- Ток потребления - 350 мА;
- Тактовая частота - 8 Мгц.

Удивился, что по меньшей мере до 2017 года его выпускали: Музей электронных раритетов - 1810 серия :o
А производил его с 1986 года завод "Квазар", тот же, что 580-й комплект делал: Музей электронных раритетов - 580 серия

_________________
iLavr


04 Dec 2019 07:02
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22382
Location: Silicon Valley
Reply with quote
Хм, это интересно! А наши реверс-инжыниры его ещё не восстановили потранзисторно?...

P.S. Поскрёб по сусекам - у меня только обычные ВМ86 есть несколько штук - с буковкой М нету - видимо надо идти к знакомым украинским ебейщикам ;)

_________________
:dj: https://mastodon.social/@Shaos


06 Dec 2019 20:36
Profile WWW
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Пока как-то непонятно все.... Нужно разобраться с парой теневых регистров SS':SP'

Во-первых, после входа в прерывание по вектору 6 у меня SS равен FFFF. Это с одной стороны понятно, а с другой - не понятно. Понятно - потому что в методичке есть запись "аппаратная поддержка переключения стека при прерываниях в виртуальном режиме". Не понятно - потому что у меня процессор в реальном режиме (биты 13 и 14 в флагах я не трогаю).
Хотя нужно проверить, что там, но по умолчанию я думаю он в реальном режиме должен работать.
Получается, что при прерывании он автоматически переключает SS':SP' на SS:SP. А по IRET, соответственно меняет обратно. Это наверное круто, если знать точно как оно работает, но пока мне не нужно и даже во вред, так как когда я меняю SP и всовываю в стек значение, по IRET я улетаю куда-то неведомо куда, но точно не туда, откуда пришел.

Во-вторых, досовый Turbo Debugger в DosBox как то тоже не круто работает, если пытаться что-то делать со стеком в прерывании. Похоже он запоминает перед входом в прерывание значение CS:IP у себя в памяти, а по IRET восстанавливает свои CS:IP из памяти, а не из настоящего стека, поэтому отладка "на кошках" не получается.

В-третьих, надо разобраться с опкодами F1 FA и F1 FB. Написал простенькую програмку показывающую значение всех регистров, в середину запихну F1 FB, затем меняем SS:SP, затем F1 FA, показываем значение всех регистров. И еще разобраться с F1 FD - вот это вообще не понятно. Просмотреть еще раз дизасм "ЭМУЛЯТОР ЕС1842", по-моему я там видел еще и F1 FC. Это загадки. Осложняется все тем, что все это нужно делать на реальной машине, а она сейчас не на столе, а в ящике. Грубо говоря - собрал "на весу", чуть чуть проверил что-то и приходится разбирать. Неудобно крайне.

_________________
https://t.me/tronix_blog


09 Dec 2019 11:32
Profile
Novelist

Joined: 13 Jan 2016 11:07
Posts: 34
Reply with quote
А чем "заводской" эмулятор не устраивает?
Который m286.com ?


Attachments:
04.jpg
04.jpg [ 1003.19 KiB | Viewed 9285 times ]
03.jpg
03.jpg [ 778.85 KiB | Viewed 9285 times ]
28 Feb 2020 05:06
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
dk1spb wrote:
А чем "заводской" эмулятор не устраивает?
Который m286.com ?


Tronix wrote:
Данный эмулятор конечно же не запускается на ПК Поиск-2, так как у него отсутствует К1845ВГ1, отсутствует память в районе E8000, куда эмулятор пытается установить теневой стек и прочие мелочи, немного отличающие Поиск-2 от ЕС1842....

_________________
https://t.me/tronix_blog


28 Feb 2020 07:36
Profile
Novelist

Joined: 13 Jan 2016 11:07
Posts: 34
Reply with quote
А, понял. Мой косяк: пропустил что это для Поиск-2. Сорри


28 Feb 2020 08:30
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 15 posts ] 

Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.