О.Г. КУЗНЕЦОВ
(Оренбургская обл.)
ФУНКЦИИ ТВЁРДОЙ КОПИИ ДЛЯ ФОКАЛа БК 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