О.Г. КУЗНЕЦОВ

(Оренбургская обл.)

ФУНКЦИИ ТВЁРДОЙ КОПИИ ДЛЯ ФОКАЛа БК 0010

Пользователям БК 0010 существенно недостаёт возможности документирования выходной информации как в расчётных задачах, так и в редакторах. Встроенный БЕЙСИК хотя и имеет выход на печать, но работа с символьными переменными вызывает большие неудобства, связанные с потерей времени при обращении к массивам и несовершенством версии оператора MID¤.

В решении многих из этих проблем может помочь предлагаемая мной программа TUCOPY1, предназначенная для вывода твёрдой копии экрана на принтер. Программа ориентирована на принтер «Электроника» УВВПЧ 30-004, как наиболее доступный, но при желании не составит труда переориентировать программу на другие виды печати, заменив некоторые управляющие коды. Схема подключения БК к принтеру:

УВВПЧ

 

БК 0010

Б14

Д0

A16

Б13

Д1

A13

Б12

Д2

B12

Б11

Д3

B10

Б10

Д4

B5

Б9

Д5

B7

Б8

Дб

B6

Б7

Д7

A7

Б6

СТР

A28

Б4

ЗП

B31

Б1

ОВ

A19

А1

ОВ

A19

 

Программа работает с интерфейсом встроенных функций, вызывается как подпрограмма через JSR PC. Использование ее в качестве функции БЕЙСИКА вызывает необходимость ввода листинга программы в цикле через РОКЕ.

; Ассемблер MACRO процессор К1801М1А
;****************************************************************************
;*
;* ПРОГРАММА TUCOPY1 ПРЕДНАЗНАЧЕНА ДЛЯ ПОЛУЧЕНИЯ
;* ТВЕРДОЙ КОПИИ ИЗОБРАЖЕНИЯ ЭКРАНА ТЕЛЕВИЗОРА
;* ПОДКЛЮЧЕННОГО К БК 0010 НА ПЕЧАТАЮЩЕЕ
;* УСТРОЙСТВО "ЭЛЕКТРОНИКА" УВВПЧ 30-004
;* Кузнецов О. Г. версии 01 20.11.89 г.
;****************************************************************************
; Использованы регистры R1,R2,R3,R4,R5
        MOVB    @#177664,R1     ;РЕГИСТР РУЛОННОГО СДВИГА В R1
        SWAB    R1              ;ОЧИСТИТЬ СТАРШИЙ БАЙТ
        CLRB    R1              ;
        SWAB    R1              ;
        CMP     R1,#330         ;СРАВНИТЬ С КОНСТАНТОЙ 330
        BLO     A01             ;ЕСЛИ МЕНЬШЕ
        MOV     #40000,R3       ;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО
        SUB     #330,R1         ;В R1 РАЗНОСТЬ
A15:    MOV     #5,R2           ;R2-СЧЕТЧИК ЦИКЛА УМНОЖЕНИЯ
A16:    ASL     R1              ;УМНОЖИТЬ НА 100
        DEC     R2              ;
        BPL     A16             ;
ASC:    ADD     R3,R1           ;В R1 АДРЕС ЛЕВОГО ВЕРХНЕГО УГЛА
                                ;ЭКРАНА
        MOV     R1,ADR          ;В БУФЕР
A02:    MOV     #44,R1          ;R1 СЧЕТЧИК СТРОК
AA0:    MOV     #6,C01          ;СЧЕТЧИК БАЙТОВ БЛОКА
        MOV     #7,C02          ;ВЕЛИЧИНА СМЕЩЕНИЯ КАРЕТКИ ПО ; ВЕРТИКАЛИ
AAA:    JSR     PC,COP          ;
        ADD     #603,ADR        ;АДРЕС НАЧАЛА СЛЕДУЮЩЕЙ СТРОКИ JSR PC,PST
        DEC     R1              ;
        BPL     AAA             ;RETURN
        RTS     PC              ;ВЫХОД
A01:    MOV     #45000,R3       ;АДРЕС СООТВ-Й 0 В МЛ. БАЙТЕ
                                ;РЕГ 177664
        BR      A15             ;
C00:    MOV     #6,R5           ;
        SUB     R0,R5           ;
        MOV     R5,C01          ;В C01 ВЕЛИЧИНА ОТРАБОТАННЫХ
        ADD     #1,R5           ;ЦИКЛОВ КОПИРОВАНИЯ БАЙТОВ ДО
        MOV     R5,C02          ;ВСТРЕЧИ 100000 АДРЕСА В С02 ВЕЛИ-
                                ;ЧИНА СМЕЩЕНИЯ ПО ОСИ "У"
        MOV     #326,R5         ;ОЧИСТКА БУФЕРА
        MOV     #6,R0           ;ЦИКЛ
BTC:    CLR     (R5)+           ;
        DEC     R0              ;
        BPL     BTC             ;RETURN
        JSR     PC,CCC          ;ЗАКОНЧИТЬ ЦИКЛ ВЫВОДА СТРОКИ
        MOV     #40000,ADR      ;
        JSR     PC,PST          ;
        MOV     #6,C01          ;ВОССТАНОВИТЬ СЧЕТЧИК ЦИКЛА
        MOV     #7,C02          ;ВОССТАНОВИТЬ ВЕЛИЧИНУ СМЕЩЕНИЯ
                                ;КАРЕТКИ
        BR      AAA             ;
ADR:    HALT                    ;
BLC:    HALT                    ;
BLS:    HALT                    ;
C01:    HALT                    ;
C02:    HALT                    ;
COP:    MOV     #74,R4          ;R4 СЧЕТЧИК БАЙТОВ В СТРОКЕ ЭКРАНА
B01:    MOV     ADR,R3          ;В R3 АДРЕС ОЧЕРЕДНОГО БЛОКА ;БАЙТОВ
        MOV     #326,R2         ;В R2 АДРЕС БУФЕРА
        MOV     C01,R0          ;СЧЕТЧИК ЦИКЛА
D00:    MOVB    @R3,(R2)+       ;БАЙТ СКОПИРОВАН В БУФЕР
        ADD     #100,R3         ;В R3 АДРЕС НИЖНЕГО БАЙТА
        CMP     R3,#100000      ;ПРОВЕРКА НА ВЫХОД ИЗ ОЗУ ЭКРАНА
        BEQ     C00             ;ДА
        DEC     R0              ;НЕТ
        BPL     D00             ;RETURN
        CLR     BLC             ;ОЧИСТКА РЕГИСТРА ВЫВОДИМОГО
                                ;НА ПЕЧАТЬ
CCC:    MOV     #7,R5           ;R5 СЧЕТЧИК (БИТОВ В БАЙТЕ) ЦИКЛА
        MOV     R2,BLS          ; СОХРАНИТЬ АДРЕС БУФЕРА
B00:    JSR     PC,PR1          ;
        DEC     R5              ;
        BPL     B00             ;RETURN
        INC     ADR             ;УВЕЛИЧЕНИЕ АДРЕСА КОПИРУЕМОГО
                                ;БЛОКА НА 1
        DEC     R4              ;
        BPL     B01             ;RETURN
        RTS     PC              ;КОНЕЦ СТРОКИ
PST:    MOV     #33,R0          ;УСТАНОВКА X=0 (ВОЗВРАТ КАРЕТКИ)
        JSR     PC,PRT          ;
        MOV     #130,R0         ;
        JSR     PC,PRT          ;
        MOV     #0,R0           ;
        JSR     PC,PRT          ;
        MOV     #0,R0           ;
        JSR     PC,PRT          ;
        MOV     #33,R0          ;УВЕЛИЧЕНИЕ У НА ВЕЛИЧИНУ = C02
        JSR     PC,PRT          ;(ПЕРЕВОД СТРОКИ)
        MOV     #132,R0         ;
        JSR     PC,PRT          ;
        MOV     C02,R0          ;
        JSR     PC,PRT          ;
        RTS     PC              ;ВОЗВРАТ
PR1:    MOV     C01,R0          ;R0 - СЧЕТЧИК ЦИКЛА (ЧИСЛО
                                ;КОЛОНОК В БЛОКЕ)
        MOV     BLS,R2          ;В R2 АДРЕС БУФЕРА БЛОКА БАЙТОВ ; КОПИИ
        CLR     BLC             ;ОЧИСТКА БАЙТА ВЫВОДИМОГО НА
                                ;ПЕЧАТЬ
CHF:    RORB    -(R2)           ;СДВИГ ОЧЕРЕДНОГО БАЙТА БЛОКА
                                ;(МЛ.БИТ В "С")
        RORB    BLC             ;СДВИГ БАЙТА ВЫВОДИМОГО НА
        DEC     R0              ;ПЕЧАТЬ ("С" В МЛ. БИТЕ БАЙТА)
        BPL     CHF             ;RETURN
        MOV     #33,R0          ;ВЫВОД БАЙТА НА ПЕЧАТЬ (ВЫВО-
        JSR     PC,PRT          ;ДЯТСЯ БИТЫ 1-7 ПРИ ЭТОМ МЛАДШИЙ
                                ;БИТ СНИЗУ)
        MOV     #117,R0         ;
        JSR     PC,PRT          ;
        MOV     BLC,R0          ;
        JSR     PC,PRT          ;
        MOV     #33,R0          ;ПЕРЕВОД КАРЕТКИ (X X+1)
        JSR     PC,PRT          ;
        MOV     #131,R0         ;
        JSR     PC,PRT          ;
        MOV     #1,R0           ;
        JSR     PC,PRT          ;
        RTS     PC              ;ВОЗВРАТ
PRT:    BIC     #177000,R0      ;ОЧИСТКА РАЗРЯДОВ СТ. БАЙТА
        BIS     #400,R0         ;ВЫСТАВИТЬ 9-Й БИТ РЕГИСТРА
                                ;ВЫВОДА ПОРТА
        BIT     #400,@#177714   ;ПРОВЕРКА БИТА ГОТОВНОСТИ ПЕЧАТИ
        BEQ     PRT             ;ПЕЧАТЬ НЕ ГОТОВА
        MOV     R0,@#177714     ;ВЫВЕСТИ БАЙТ ДАННЫХ НА ПЕЧАТЬ
D01:    BIT     #400,@#177714   ;БАЙТ СЧИТАН ?
        BNE     D01             ;НЕТ
        CLR     @#177714        ;
        RTS     PC              ;ВОЗВРАТ
        HALT                    ;
        .END                    ;

В основе программы лежит идея циклического выделения блоков экранной памяти по 7 байтов, расположенных вертикально, в буфер с последующим их поочерёдным сдвигом через бит «С» РСП в байт, выводимый на печать двумя последовательными операторами RORB Поиск адреса экранной памяти, соответствующего левому верхнему углу экрана в момент выдачи копии, производится через регистр рулонного сдвига.

Отличие значения младшего байта регистра от константы 330 равно количеству строк экрана, которое необходимо прибавить к адресу 40000 для получения необходимой величины. Значение байта меньше 330 нужно добавлять к адресу 45000, так как наибольшее значение байта - 377, после чего он обнуляется, т.е. 0 в значащем байте соответствует 45000 адресу. Поиск конца экранной памяти для возврата на адрес 40000 осуществляется внутри цикла копирования блока экранной памяти в буфер. Найдя адрес 100000, программа завершает цикл ввода на печать байтов, имеющих адреса меньше 100000, осуществляет возврат каретки и перевод её на величину, равную количеству выведенных байтов, не изменяя значения счётчика строк, и загружает в буфер адреса величину 40000.

Для тех, у кого возникнут трудности в использовании программы или другие вопросы подобного программного обеспечения, обращайтесь по адресу: 461127 Оренб. обл., п. Тоцкое-2, Калинина, 16-16. Кузнецов О. Г.

 

113701 177664 000301 105001 000301 020127 000330 103436
012703 040000 162701 000330 012702 000005 006301 005302
100375 060301 010167 000146 012701 000044 012767 000006
000142 012767 000007 000136 004767 000134 062767 000603
000114 004767 000220 005301 100367 000207 012703 045000
000743 012705 000006 160005 010567 000070 062705 000001
010567 000062 012705 000326 012700 000006 005025 005300
100375 004767 000106 012767 040000 000022 004767 000126
012767 000006 000016 012767 000007 000012 000725 042403
000000 000335 000006 000007 012704 000074 016703 177756
012702 000326 016700 177754 111322 062703 000100 020327
100000 001717 005300 100370 005067 177724 012705 000007
010267 177716 004767 000110 005305 100374 005267 177676
005304 100344 000207 012700 000033 004767 000172 012700
000130 004767 000162 012700 000000 004767 000152 012700
000000 004767 000142 012700 000033 004767 000132 012700
000132 004767 000122 016700 177614 004767 000112 000207
016700 177600 016702 177572 005067 177564 106042 106067
177556 005300 100373 012700 000033 004767 000052 012700
000117 004767 000042 016700 177526 004767 000032 012700
000033 004767 000022 012700 000131 004767 000012 012700
000001 004767 000002 000207 042700 177000 052700 000400
032737 000400 177714 001770 010037 177714 032737 000400
177714 001374 005037 177714 000207 000000 000000 

Performed by © gid, 2012-2022.