Документации на процессор нет, и в сети ходили лишь слухи и догадки - умеет ли он 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. 
				 
  
 


