;--------- ЗАГОЛОВОК -----------
;   11:09.86
;   АССЕМБЛЕР MACRO-11 / ОСДВК
;********************************************************************
;*       МОДУЛЬ ST10 ОБЕСПЕЧИВАЕТ РАБОТОСПОСОБНОСТЬ ПРОГРАММЫ,      *
;*  ПОСТРОЕННОЙ КОМПИЛЯТОРОМ ПАСКАЛЯ, НА БК-0010. МЕТКА $ST10 -     *
;*  ТОЧКА ВХОДА В ЗАГРУЗОЧНЫЙ МОДУЛЬ, ОБРАЗУЮЩИЙСЯ ПРИ КОМПОНОВКЕ   *
;*  ОБЪЕКТНОГО МОДУЛЯ ST10.OBJ И МОДУЛЕЙ ПРОГРАММЫ. ФРАГМЕНТЫ       *
;*  ST10 ОСУЩЕСТВЛЯЮТ НАЧАЛЬНУЮ НАСТРОЙКУ ИСПОЛНЯЮЩЕЙ СИСТЕМЫ       *
;*  ПАСКАЛЯ И ПРЕОБРАЗУЮТ ЗАПРОСЫ К МОНИТОРУ ОСДВК В ЭКВИВАЛЕНТНЫЕ  *
;*  ЗАПРОСЫ К МОНИТОРУ БК-0010, РАСПОЛОЖЕННОМУ В ПЗУ.               *
;********************************************************************
;--------- ОПРЕДЕЛЕНИЯ ---------
        .GLOBL $RESR5, $RESR6, $KORE, $FREE ; ЯЧЕЙКИ ДЛЯ СВЯЗИ С
                                            ; ИСПОЛНЯЮЩЕЙ СИСТЕМОЙ
                                            ; ПАСКАЛЯ.
        .GLOBL $BEGIN                       ; ТОЧКА ВХОДА ПРОГРАММЫ,
                                            ; ПОСТРОЕННОЙ КОМПИЛЯТОРОМ.
        BUFSIZ = 100                        ; РАЗМЕР БУФЕРА ДЛЯ ПРИЕМА
                                            ; СТРОКИ С КЛАВИАТУРЫ.
        NETLOW = 34000                      ; ВЕРХНИЙ АДРЕС ДОСТУПНОЙ
                                            ; ПРОГРАММЕ ПАМЯТИ.
;-------- ТЕЛО -----------------
$ST10::
        EMT     4           ; ИНИЦИАЛИЗИРОВАТЬ ДРАЙВЕР КЛАВИАТУРЫ
        MOV     #NETLOW,SP  ; БК-0010. УСТАНОВИТЬ УКАЗАТЕЛЬ СТЕКА.
        MOV     SP, $RESR6  ; НАСТРОИТЬ ЯЧЕЙКИ ИСПОЛНЯЮЩЕЙ СИСТЕМЫ.
        CLR     $FREE
        MOV     $RESR5, R5  ; РЕГИСТР R5 УКАЗЫВАЕТ НА НАЧАЛО ОБЛАСТИ
        MOV     R5, $KORE   ; ГЛОБАЛЬНЫХ ДАННЫХ.
        MOV     @#30, SV30  ; СОХРАНИТЬ ВЕКТОР ПРЕРЫВАНИЙ ПО КОМАНДЕ
        MOV     @#32, SV32  ; EMT, ПЕРЕКЛЮЧИТЬСЯ НА ОБСЛУЖИВАНИЕ
        JSR     PC, $$T60   ; ЗАПРОСОВ К МОНИТОРУ ОСДВК.
        JMP     $BEGIN      ; ПРИСТУПИТЬ К ИСПОЛНЕНИЮ ПРОГРАММЫ.

SV30  : .WORD               ; ЯЧЕЙКИ ДЛЯ ХРАНЕНИЯ ВЕКТОРА ПРЕРЫВАНИЙ
SV32  : .WORD               ; ПО EMT.
BUFFER: .BLKB   BUFSIZ      ; БУФЕР ДЛЯ ПРИЕМА СТРОКИ С КЛАВИАТУРЫ.
ENDBUF: .WORD
DELIM : .BYTE   BUFSIZ      ; ПРЕДЕЛЬНОЕ ЧИСЛО СИМВОЛОВ В СТРОКЕ.
        .BYTE   12          ; ОГРАНИЧИТЕЛЬ СТРОКИ.
COUNT : .WORD               ; УКАЗАТЕЛЬ НА СИМВОЛ, ПРОЧИТАННЫЙ ИЗ
FLG   : .WORD 0             ; БУФЕРА. ЯЧЕЙКА FLG ОЧИЩАЕТСЯ, КОГДА
                            ; ПРОЧИТАНЫ ВСЕ СИМВОЛЫ.
RUS   : .WORD 0             ; ПРИЗНАК ТЕКУЩЕГО РЕГИСТРА (РУС ИЛИ ЛАТ)

$$T10:: MOV     SV30, @#30  ; ПОДПРОГРАММА ПЕРЕКЛЮЧЕНИЯ НА ОБСЛУЖИВАНИЕ
        MOV     SV32, @#32  ; ЗАПРОСОВ К МОНИТОРУ 5К-0010.
        RTS     PC

$$T60:: MOV     #EMT60,@#30 ; ПОДПРОГРАММА ПЕРЕКЛЮЧЕНИЯ НА ОБСЛУЖИВАНИЕ
        CLR     @#32        ; ЗАПРОСОВ К МОНИТОРУ ОСДВК.
        RTS     PC

OUTPUT: CMPB    R0, #16     ; ПОДПРОГРАММА ВЫВОДА СИМВОЛА С УЧЕТОМ
        BNE     1$          ; ПРИЗНАКА РЕГИСТРА ( ЯЧЕЙКИ RUS ).
        MOV     #1, RUS
        RTS     PC
   1$ : CMPB    R0, #17
        BNE     2$
        CLR     RUS
        RTS     PC
   2$ : TST     RUS
        BEQ     3$
        CMPB    R0,#77
        BLOS    3$
        BIS     #200, R0
   3$ : EMT     16
        RTS     PC

EMT60:  MOV     R0,-(SP)    ; ОБРАБОТАТЬ ПРЕРЫВАНИЕ - СОХРАНИТЬ
        MOV     R1,-(SP)    ; РЕГИСТРЫ, ИЗВЛЕЧЬ КОД КОМАНДЫ EMT,
        MOV     4(SP),R0    ; ВЫЗВАВШЕЙ ПРЕРЫВАНИЕ, ПРИСТУПИТЬ К
        MOV     -(R0),-(SP) ; АНАЛИЗУ КОДА.
        MOVB    (SP)+,R0
        JSR     PC,$$T10
        CMPB    R0,#340     ; ОБСЛУЖИВАНИЕ ЗАПРОСОВ НА ВВОД С
        BNE     E341        ; КЛАВИАТУРЫ ( .TTYIN, .TTINR ).
        TST     FLG
        BNE     10$
        MOV     R2,-(SP)
        MOV     #BUFFER, R1
        MOV     DELIM, R2
        EMT     10
        MOV     (SP)+,R2
        MOV     #BUFFER, COUNT
        MOV     #1, FLG
  10$ : MOV     COUNT, R0
        MOVB    (R0),2(SP)
        CMPB    (R0),#12
        BEQ     20$
        INC     COUNT
        CMP     COUNT, #ENDBUF
        BEQ     20$
        BR      EXEMT
  20$ : CLR     FLG
        BR      EXEMT

E341  : CMPB    R0,#341     ; ОБСЛУЖИВАНИЕ ЗАПРОСОВ НА ВЫВОД СИМВОЛА
        BNE     E351        ; ( .TTYQUT, .TTOUTR ).
        MOV     2(SP),R0
        JSR     PC, OUTPUT
        BR      EXEMT

; .PRINT
E351  : CMPB    R0, #351    ; ОБСЛУЖИВАНИЕ ЗАППОСА .PRINT#
        BNE     EXIT
        MOV     2(SP),R1
PRINT : CMPB    (R1),#0
        BEQ     EXEMT
        CMPB    (R1), #200
        BEQ     EXEMT
        MOVB    (R1)+,R0
        JSR     PC, OUTPUT
        BR      PRINT

EXIT  : CMPB    R0, #350    ; ОБСЛУЖИВАНИЕ ЗАПРОСА .EXIT.
        BNE     FAIL
        HALT

FAIL  : MOV     #MESSAG, R1 ; СЮДА ПЕРЕДАЕТСЯ УПРАВЛЕНИЕ, ЕСЛИ
        BR      PRINT       ; ОБРАБОТКА ТЕКУЩЕГО EMT НЕ РЕАЛИЗОВАНА.

MESSAG: .ASCIZ  /ERROR IN EMT /<12>
        .EVEN

EXEMT : JSR     PC,$$T60    ; ЗАВЕРШИТЬ ОБРАБОТКУ ПРЕРЫВАНИЯ -
        BIC     #1,6(SP)    ; УСТАНОВИТЬ  ПРИЗНАК УСПЕШНОГО
        MOV     (SP)+,R1    ; ИСПОЛНЕНИЯ  ЗАПРОСА В БУДУЩЕМ СЛОВЕ
        MOV     (SP)+,R0    ; СОСТОЯНИЯ, ВОССТАНОВИТЬ СОДЕРЖИМОЕ
        RTI                 ; РЕГИСТРОВ.
        .END
