Процессор 1810ВМ86М и написание эмулятора 286 инструкций...

16-битные ПЦ-совместимые компьютеры с процессорами 8086/8088/80286 работающие под управлением ДОС

Moderator: Shaos

Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Процессор 1810ВМ86М и написание эмулятора 286 инструкций...

Post by Tronix »

Некоторое время назад приобрел по случаю пару 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: Select all

        _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.
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Vic3Dexe »

Хм.. я так понял, 80186 он умеет? Тогда зачем писать свой ENTER/LEAVE ? Или умеет, но не все?
Что за "виртуальный" режим? Да еще и с контроллером памяти... :o

Далее, если даже enter понадобился, то не все так просто.

Code: Select all

; push bp
; mov bp,sp
; sub sp,ax
Вот этого совершенно недостаточно, enter выглядит так

Code: Select all

C8 iw ib
ENTER imm16, imm8
А вот его реализация из моего софт-эмулятора (извините, комментарии поплыли)

Code: Select all

//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
}
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Tronix »

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:Что за "виртуальный" режим? Да еще и с контроллером памяти...
В методичке немного описано. Лучше чем там, инфы увы нет нигде.
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Vic3Dexe »

Tronix wrote:мне пока попались только ENTER imm16, 0.
Ну так это же не значит, что других вариантов для ib нет :wink:
ib - номер кадра в стеке, iw - его размер. Если будет несколько вложеных процедур, и где-то изнутри понадобится обратиться к локальным переменным внешней - будет enter imm16,не-ноль.
Tronix wrote:В методичке немного описано. Лучше чем там, инфы увы нет нигде.
Увы, яндекс у нас не тогойт...
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Tronix »

Vic3Dexe wrote: Увы, яндекс у нас не тогойт...
А, ну да, забываю. Положил на гугл-драйв.
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Vic3Dexe »

Афигеть, реально от руки! Я думал - фигура речи. :o
Спасибо, пойду изучать.

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

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

Ну и если совсем по сабжу:
Нужно в прерывании затолкнуть в стек значение (push bp), только в стек до прерывания. Казалось бы простая задача, а поставила меня в тупик. Хочется красивого решения, но пока единственное, что придумывается, смещать все значения в стеке на одно вниз, корректировать реальный SP.... Как-то вроде не красиво, поэтому прошу совета.
А без вариантов. Именно потому, что bp должно быть в стеке ДО прерывания. Ну либо завести себе глобальные переменные где-то, куда сейвить CS/IP/FL + все используемые регистры, потом, почистив стек:

Code: Select all

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
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Lavr »

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
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Tronix »

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

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

Что касается реализации - да, пришел к такому же выводу, уменьшаем SP на два, потом просто все значения в стеке двигаем на два, в дырку пишем нужное значение и выходим с выгрузкой из стека pop'ами. Пока нет времени проверить на железе.
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Vic3Dexe »

Tronix wrote:Речь идет о эмулировании 186+ инструкций
Ну тогда по поводу enter мне добавить нечего. Ежели чего - обращайся :)
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Lavr »

Lavr wrote:Кстати, мне думается, это проделка конторы Кобылинского - он же состряпал комплект 580 и комплект 1810...
Из интересу посмотрел в поиске - это, действительно, украинское изделие:
Микропроцессор КР1810ВМ86М
Электрические параметры:


- Номинальное напряжение питания - 5 В +- 5 %;
- Выходное напряжение низкого уровня - 0,45 В;
- Выходное напряжение высокого уровня - 2,4 В;
- Ток утечки на управляющем входе - +-10 мкА;
- Ток потребления - 350 мА;
- Тактовая частота - 8 Мгц.
Удивился, что по меньшей мере до 2017 года его выпускали: Музей электронных раритетов - 1810 серия :o
А производил его с 1986 года завод "Квазар", тот же, что 580-й комплект делал: Музей электронных раритетов - 580 серия
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Shaos »

Хм, это интересно! А наши реверс-инжыниры его ещё не восстановили потранзисторно?...

P.S. Поскрёб по сусекам - у меня только обычные ВМ86 есть несколько штук - с буковкой М нету - видимо надо идти к знакомым украинским ебейщикам ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Tronix »

Пока как-то непонятно все.... Нужно разобраться с парой теневых регистров 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. Это загадки. Осложняется все тем, что все это нужно делать на реальной машине, а она сейчас не на столе, а в ящике. Грубо говоря - собрал "на весу", чуть чуть проверил что-то и приходится разбирать. Неудобно крайне.
dk1spb
Novelist
Posts: 38
Joined: 13 Jan 2016 11:07

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by dk1spb »

А чем "заводской" эмулятор не устраивает?
Который m286.com ?
You do not have the required permissions to view the files attached to this post.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by Tronix »

dk1spb wrote:А чем "заводской" эмулятор не устраивает?
Который m286.com ?
Tronix wrote: Данный эмулятор конечно же не запускается на ПК Поиск-2, так как у него отсутствует К1845ВГ1, отсутствует память в районе E8000, куда эмулятор пытается установить теневой стек и прочие мелочи, немного отличающие Поиск-2 от ЕС1842....
dk1spb
Novelist
Posts: 38
Joined: 13 Jan 2016 11:07

Re: Процессор 1810ВМ86М и написание эмулятора 286 инструкций

Post by dk1spb »

А, понял. Мой косяк: пропустил что это для Поиск-2. Сорри