Так как процессор 1801ВМ1 не поддерживает команды EIS и FIS, то при появлении ДВК-2 с процессором 1801ВМ2, который эти команды поддерживает - у пользователей ДВК возникла проблема совместимости, решить которую был призван драйвер EM.SYS, эмулирующий команды EIS и FIS.
Код:
; Ныс И.Д.
; Московский
; Инженерно-Физический
; Институт
; каф. 17
; 6 Марта 1985 г. - начало работы.
; 25 марта 1985 г. - конец работы.
; 17 апреля - изменена установка признаков DIV.
; 23 апреля - изменен алгоритм команды MUL.
; 10 мая - прогонка FIS/EIS тестов, коррекция особых ситуаций.
; 2 ноября - переходы по таблице - PIC код, добавлена шапка драйвера
;01 31 окт. 1988 - эмулятор FIS для машины с FPP.
; При работе над эмулятором использовались
; - эмулятор Паскаля
; - подпрограммы Фортран-библиотеки
; - описание процессора M2
; - эмулятор FIS(FPP) из Модулы-2
; Модуль эмулирует наборы команд
; EIS: MUL 070RSS 0.35- 0.5 MS
; DIV O71RSS 0.6
; ASH 072RSS 0.3 - 0.35(вправо)
; - 0.4 (влево)
; ASHC 073RSS 0.3 - 0.5 (вправо)
; - 0.61(влево)
; FIS: FADD 07500R 0.9 - 1.3 MS
; FSUB 07501R - " " -
; FMUL 07502R 1.0 -1.6
; FDIV 07503R 1.6
;
; Времена для процессора с быстродействием
; около 250000 команд регистр - регистр в
; секунду, цикл памяти - 500 наносекунд
; После прерывания по резервной команде, дол-
; жна осуществляться передача управления
; в точку $EMUL.
; Управление передается в точку $ILCOD,
; Если эммулятор не способен обработать преры-
; вание ( вызванное командой, не входящей в
; FIS или EIS)
; Для исключения FIS или EIS набора из эмуля-
; тора, поставьте ";" перед определениями со-
; ответствующих символов в следующих строках
; Эмулятор FIS для процессора с отдельным процессором
; плавающей запятой включен Мухамеджановым Алексеем
; 01 ноября 1988 г., (C) фирма "МИГ" кооп. <1988>
; Команды XOR, SOB включены Яковлевым Михаилом
; 12-декабря-86 г. МИФИ, каф. 25
;
; XOR - 0.3 MS
; SOB - 30-50 MKS (в зависимости от вложенности)
У меня обнаружились исходники двух версий этого драйвера - "общеизвестной" v1.0 и последней - v1.1 ( в последней версии добавлена возможность генерации драйвера с эмуляцией команд FIS при помощи команд FPP ).
При сравнении этих исходников:
EM.SYS v1.0 (фрагмент):
Код:
.TITLE EM
; ДРАЙВЕР-ЭМУЛЯТОР FIS/EIS НАБОРА КОМАНД.
; КОМАНДЫ SET EM ON/OFF ИЗ TH ДРАЙВЕРА БЕЛИЦКОГО Е.
.SBTTL MACROS AND DEFINITIONS
.MCALL .DRDEF, .PRINT, .EXIT, .WAIT
.DRDEF EM, 377, 0, 0, 0, 10
; Имя, Код, Тип, Размер, Адрес, Вектор
JSW=44 ; Слово описания
SYSPTR=54 ; Указатель на начало монитора
EIS$=400 ; Бит расширенного набора
CONFIG=370 ; Смещение слова конфигурации
SYSGEN=372 ; Слово параметров
EIS=1 ; Включить EIS
FIS=1 ; Включать FIS
; SM3=1 ; Включить SOB, XOR
.SBTTL INSTALATION VERIFICATION
.ASECT
.=200
NOP
RETURN
; Определение состояния драйвера
FINDRV:
MOV PC,R0
ADD #DEVNAM-.,R0
MOV PC,-(SP)
ADD #AREA-.,(SP)
EMT 342 ; PIC .DSTATUS
BCS O.BAD
MOV AREA+4,R1
O.GOOD:
TST (PC)+
O.BAD: SEC
RETURN
DEVNAM:
.RAD50 /EM /
AREA:
.BLKW 4
EMON: .ASCIZ /?EM-I-Аlready running/
IMSG: .ASCII /?EM-I-V1.0 BY I.NYS, 116-20-42/<15><12>
.ASCII /OPTIONS: /
.IIF DF EIS .ASCII / EIS/
.IIF DF FIS .ASCII / FIS/
.IIF DF SM3 .ASCII / SOB XOR/
.BYTE 0
.EVEN
.IIF GT,<.-400>, .ERROR .-400; INSTALL CODE TO BIG!
EM.SYS v1.1 (фрагмент):
Код:
.TITLE EM
; Драйвер-эмулятор FIS/EIS набора команд.
; Команды SET EM ON/OFF из ТН драйвера Белицкого Е.
.SBTTL MACROS AND DEFINITIONS
.MCALL .DRDEF, .PRINT, .EXIT, .WAIT
.DRDEF EM, 377, 0, 0, 0, 10
; ИМЯ, КОД, ТИП, РАЗМЕР, АДРЕС, ВЕКТОР.
JSW=44 ; Слово описания
SYSPTR=54 ; Указатель на начало монитора
EIS$=400 ; Бит расширенного набора
CONFG1=300 ; Смещение 1 слова конфигурации
CONFIG=370 ; Смещение 2 слова конфигурации
SYSGEN=372 ; Слово параметров
;
EIS=1 ; Включить EIS
; SM3=1 ; Включить SOB, XOR
; FPP=1 ; Включить FIS на FPP
.IF NDF FPP
FIS=1 ; Включить FIS
.ENDC
.IF DF FPP
AC0 =R0
AC1 =R1
FPPS =^O1400
FPP$ =^O100
.ENDC
.SBTTL INSTALATION VERIFICATION
.ASECT
.=200
NOP
RETURN
; Определение состояния драйвера
FINDRV:
MOV PC, R0
ADD #DEVNAM-., R0
MOV PC, -(SP)
ADD #AREA-., (SP)
EMT 342 ; PIC .DSTATUS
BCS OO.BAD ; Ошибка .DSTATUS
MOV AREA+4, R1
O.GOOD: CMP (PC)+,(PC)+
OO.BAD: TST (SP)+
O.BAD: SEC
RETURN
L1$: MOV PC, R0
ADD #EMON-., R0
PEX: .PRINT
BR O.GOOD
EMON: .ASCIZ /?EM-I-Already running/
IMSG: .ASCII /EM V1.1 by I.NYS, MX/<15><12>
.ASCII /Options:/
.IIF DF EIS .ASCII / EIS/
.IIF DF FPP .ASCII / FIS(for FPP)/
.IIF DF FIS .ASCII / FIS/
.IIF DF SM3 .ASCII / SOB XOR/
.BYTE 0
.EVEN
.IIF GT,<.-400>, .ERROR .-400; INSTALL CODE TO BIG!
.SBTTL SET OPTION PARAMETR TABLE
.DRSET INFORM, -1, O.INF ; Параметры генерации
.DRSET ON,-1,O.ON ; Включить
.DRSET OFF,-1,O.OFF ; Выключить
.DRSET SYSGEN,NOP,O.SYSG ; SYSGEN
.SBTTL SET OPTION PROCESSING ROUTINES
O.SYSG:
MOV @#SYSPTR,R0 ; Не знаю, будет ли работать с диспетчером
BIT #2,SYSGEN(R0) ; MMG$T
BNE O.BAD
MOVB SYSGEN(R0), 60
RETURN
O.ON:
CALL FINDRV
TST R1 ; Если драйвер уже загружен,
BNE L1$ ; напечатать об этом
MOV @#SYSPTR, R0
BIS #EIS$,CONFIG(R0) ; включить EIS
.IF DF FPP
BIT #FPP$,CONFG1(R0) ; Ошибка, если нет FPP.
BNE 2$
JSR R0,3$
.ASCIZ /?EM-F-Use FPP/
.EVEN
3$: .PRINT
MOV (SP)+,R0;
BR O.BAD
2$:
.ENDC
JSR R1, SETCMD
.ASCIZ /$LOAD EM/
.BYTE 200
.EVEN
RETURN
O.INF:
MOV PC, R0
ADD #IMSG-., R0
BR PEX
O.OFF: CALL FINDRV
TST R1 ; Драйвер загружен?
BEQ N.OFF ; Уже нет
JSR R1, SETCMD
.ASCIZ /$UNLOAD EM/
.ASCIZ /$SET EM OFF/
.EVEN
RETURN
N.OFF:
MOV PC, R0
ADD #NOEIS-., R0
MOV R0, @#10
MUL R0, R0 ; Интересно, есть EIS?
MOV @#4, @#10 ; Вектор
MOV @#6, @#12 ; Статус
BIS #1, @#12 ; С установленным C - разрядом
CLC
RETURN
DEVNAM:
.RAD50 /EM /
AREA:
.BLKW 4
NOEIS: MOV @#SYSPTR, R0
BIC #EIS$,CONFIG(R0) ; Включить EIS
RTI
; Передача команд монитору
SETCMD:
MOV #512, R0
CLR R2
1$: INC R2
MOVB (R1)+, (R0)+
BPL 1$
DEC R2
MOV R2, @#510
BIS #4040, @#JSW
CLR R0
.EXIT
.IIF GT,<.-1000>, .ERROR .-1000; SET CODE TO BIG!
Возникло ощущение, что перенеся в версии 1.1 DEVNAM и AREA за пределы инсталляционного кода - разработчики стали получать постоянную ошибку инсталляции, что заставило изменить завершение инсталлятора с такого:
v1.0
Код:
MOV PC,-(SP)
ADD #AREA-.,(SP)
EMT 342 ; PIC .DSTATUS
BCS O.BAD
MOV AREA+4,R1
O.GOOD:
TST (PC)+
O.BAD: SEC
RETURN
DEVNAM:
.RAD50 /EM /
AREA:
.BLKW 4
на такое:
v1.1
Код:
MOV PC, -(SP)
ADD #AREA-., (SP)
EMT 342 ; PIC .DSTATUS
BCS OO.BAD ; Ошибка .DSTATUS
MOV AREA+4, R1
O.GOOD: CMP (PC)+,(PC)+
OO.BAD: TST (SP)+
O.BAD: SEC
RETURN