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