1
0
mirror of https://github.com/nzeemin/bkbtl-doc.git synced 2025-04-18 05:44:04 +03:00

Initial commit

This commit is contained in:
nzeemin 2015-03-27 21:39:03 +03:00
parent c86eb0afbb
commit 118d9d4947
81 changed files with 53858 additions and 0 deletions

41
FDD_drivers.txt Normal file
View File

@ -0,0 +1,41 @@
http://forum.maxiol.com/index.php?showtopic=3893
История версий
1. 253я - cамая первая версия драйвера контроллера дисковода
устанавливалась в контроллер для БК-0011
В 253 прошивке нет встроенного отладчика, поэтому командой T из Мони-
тора БК-0010(.01) не попадешь в отладчик и не загрузишься (нужно будет
набирать S 160000 <ВВОД>).Также следует иметь в виду что 253 прошивка
единственная из всех не имеющая в своем составе блока эмуляции команд
EIS/FIS. Кроме того, с 253 прошивкой не работает ОСБК/RT11,по-видимому
из-за того что драйвер BY.SYS рассчитан на 326 и cовместимые с ней
прошивки и делает прямые вызовы в дисковое ПЗУ.
2. 326я - cамая популярная но имеющая ошибку которая не позволяет читать диски отформатированные на IBM
3. 327ая - их множество версий:
fdd/hdd rom 327 version 12 © dj.H key features
- 100% совместимость с эмулятором БК Савельева А. так и с реальными БК-0011М,
БК-0011, БК-0010, БК-0010.01 с дополнительным ОЗУ (или без него);
- Обслуживание 31 дискового устройства - приводы A:-Z:, [, \, ], ^, _
- Проверка контрольной суммы дискового ПЗУ при начальной загрузке;
- Начальная загрузка с 4 приводов - A:, B:, C:, D:
- Поддержка чтения/записи дисков отформатированных и записанных на IBM PC
без каких либо дополнительных программ;
- Встроенный мини-отладчик - вызов из монитора БК00-10 по команде T
(требуется Монитор БК10 по адресу 100000 или его эмуляция в режиме БК-11М);
- Полная 100% совместимость с более ранними версиями дискового ПЗУ-326 и 327;
- Поддержка дополнительного "сетевого" дравера BK-LINK /LPT/ сети размещаемо-
го по адресу 170000 (требуется rom 327 v15).

767
FL11M.txt Normal file
View File

@ -0,0 +1,767 @@
========================================================================
= ОПИСАНИЕ БК-11М ГЛАВА ПЕРВАЯ: РЕГИСТРЫ ВНЕШНИХ УСТРОЙСТВ = fl.1=
========================================================================
* описания подготовил БАГАЕВ МАКСИМ * дом. тел (8322)60-28-05 после 21
* ВНИМАНИЕ ! ВСЕ АДРЕСА УКАЗАНЫ В ВОСЬМЕРИЧНОЙ СИСТЕМЕ ИСЧИСЛЕНИЯ
1.1 РЕГИСТР СОСТОЯНИЯ КЛАВИАТУРЫ
АДРЕС = 177660
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
¦ ¦
--------------------------------+¬ -+-------------------------¬
¦ готовность ¦ ¦разрешение прерывания ¦
¦ "1"- в этом разряде означает,¦ ¦"0" - разрешает прерывание¦
¦что в регистре данных клавиатуры¦ ¦от клавиатуры ¦
¦(177662) находится код нажатой ¦ L---------------------------
¦клавиши. сбрасывается при чтении¦
¦кода из регистра (177662). ¦
¦ = доступен только по чтению = ¦
L---------------------------------
* остальные разряды НЕ ИСПОЛЬЗУЮТСЯ и читаются как "0"
* по сигналу на ОШ 'INIT' (команда RESET) разряд '6'="0", '7'="0"
1.2 РЕГИСТР ДАННЫХ КЛАВИАТУРЫ
АДРЕС = 177662
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦--------¬¦ ¦ ¦ ¦-----------------¬¦
¦ ¦ ¦ L+палитра+- L--T- L+код с клавиатуры+-
¦ ¦ ¦ L-------- ¦ L-----------------
¦ ¦ ¦----------------¬¦
¦ ¦ L+не используется+-
¦ ¦ L----------------
¦ ¦------------------------------------------------¬
¦ L+разрешение прерывания по таймеру (вектор 100)¦
¦ ¦ ("0"-разрешено) Fтаймера = 48.5 Hz ¦
¦ L------------------------------------------------
¦ ------------------------------------------------¬
L---+ перекл. буферов зкрана : "1" - N%6, "0" - N%5 ¦
L------------------------------------------------
* при ВКЛЮЧЕНИИИ ПИТАНИЯ разряд '15'="0" (буфер N% 0 [стр N% 5]),
а разряд '14'="1"(запрещено прерывание от таймера)
* неиспользуемые (7,12,13) разряды читаются как "0"
* МЛАДШИЙ БАЙТ доступен только ПО ЧТЕНИЮ
* код ПАЛИТЫ доступен только ПО ЗАПИСИ
* по включению устанавливается палитра N%15
** ТАБЛИЦА ПАЛИТР **
-------T-------------------T-------------------------------------------¬
¦номер ¦ код палитры ¦ код точки ¦
¦ +----T----T----T----+--------T----------T-----------T-----------+
¦ NN% ¦ 11 ¦ 10 ¦ 09 ¦ 08 ¦ 00 ¦ 10 ¦ 01 ¦ 11 ¦
+------+----+----+----+----+--------+----------+-----------+-----------+
¦ 00 ¦ 0 ¦ 0 0 0 ¦ черный ¦ зеленый ¦ синий ¦ красный ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 01 ¦ 0 ¦ 0 0 1 ¦ .... ¦ сирениев.¦ желтый ¦ красный ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 02 ¦ 0 ¦ 0 1 0 ¦ .... ¦ синий ¦ голубой ¦ сиреневый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 03 ¦ 0 ¦ 0 1 1 ¦ .... ¦ голубой ¦ зеленый ¦ желтый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 04 ¦ 0 ¦ 1 0 0 ¦ .... ¦ голубой ¦ сиренев. ¦ белый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 05 ¦ 0 ¦ 1 0 1 ¦ .... ¦ белый ¦ белый ¦ белый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 06 ¦ 0 ¦ 1 1 0 ¦ .... ¦красно- ¦ темно- ¦ красный ¦
¦ ¦ ¦ ¦ ¦-коричнев.¦ -красный ¦ ¦
¦ 07 ¦ 0 ¦ 1 1 1 ¦ .... ¦светло- ¦ салатовый ¦ желтый ¦
¦ ¦ ¦ ¦ ¦ -зеленый ¦ ¦ ¦
¦ 08 ¦ 1 ¦ 0 0 0 ¦ .... ¦ фиолетов.¦ фиолетов. ¦ сиреневый ¦
¦ ¦ ¦ ¦ ¦ синий ¦ ¦ ¦
¦ 09 ¦ 1 ¦ 0 0 1 ¦ .... ¦ фиолетов.¦ светло- ¦ красно- ¦
¦ ¦ ¦ ¦ ¦ синий ¦ -зеленый ¦-коричневый¦
¦ 10 ¦ 1 ¦ 0 1 0 ¦ .... ¦ фиолетов.¦ салатовый ¦ темно- ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ -красный ¦
¦ 11 ¦ 1 ¦ 0 1 1 ¦ .... ¦ желтый ¦ голубой ¦ красный ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 12 ¦ 1 ¦ 1 0 0 ¦ .... ¦ зеленый ¦ красный ¦ голубой ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 13 ¦ 1 ¦ 1 0 1 ¦ .... ¦ желтый ¦ голубой ¦ белый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 14 ¦ 1 ¦ 1 1 0 ¦ .... ¦ зеленый ¦ желтый ¦ белый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 15 ¦ 1 ¦ 1 1 1 ¦ .... ¦ зеленый ¦ голубой ¦ белый ¦
L------+----+--------------+--------+----------+-----------+------------
2.1 РЕГИСТР СМЕЩЕНИЯ
АДРЕС = 177664
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
------------------¬¦ ¦--------------------¬¦
¦'малый'экран ="0"+- L+ смещение +-
L------------------ L--------------------
* при установке разряда '9' в "0" отображается только четверть зкрана
- режим РП (ОЗУ пользователя возрастает до 28 кБ (от 1000 до 70000)
* задание смещения экрана, начальная установка (адресу 40000
сответствует левый верхний угол) - запись числа 1330
4.1 РЕГИСТР ********
АДРЕС = 177700
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
* ПРИМЕЧАНИЕ: установка битов '0' или '1' приводит к зависанию,
а установка бита 2 вводит машину в состояние, аналогичное
команде WAIT
4.2 РЕГИСТР ********
АДРЕС = 177702
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
4.3 РЕГИСТР ********
АДРЕС = 177704
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
5. СИСТЕМНЫЙ ТАЙМЕР
ТАЙМЕР СОСТОИТ:
A. генератор с периодом 32 мкс (т.к. тактовая частота процессора
В. делители на 4 и 16 БК-11 и БК-11М составляет 4 MHz, а
C. реверсивный счетчик (177710) не 5 MHz, kak написано в литературе)
D. регистр установки (177706)
E. регистр команд и состояний (177712)
* ДЛЯ СПРАВКИ: тактовая частота, поступающая на процессор, делится на
128. , а потом поступает на таймер
5.1 РЕГИСТР УСТАНОВКИ
АДРЕС = 177706
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
* доступен и по записи и по чтению
5.2 РЕВЕРСИВНЫЙ СЧЕТЧИК
АДРЕС = 177710
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
* козфициент деления закладывается в регистр установки (177706)
* счетчик загружается из регитра установки (177706) в момент пуска и
перехода через "0" или при обращении к биту 1 регистра управления
* доступен и по записи и по чтению
5.3 РЕГИСТР УПРАВЛЕНИЯ
АДРЕС = 177712
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
¦--------------------¬¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L+ не используются +- ¦ ¦ ¦ ¦ ¦ ¦ ¦ L-------¬
¦и установлены в "1"¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ --------+-------¬
L-------------------- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ "1" остановка ¦
---------------- ¦ ¦ ¦ ¦ ¦ ¦ L----------------
-----------------+---------------¬ ¦ ¦ ¦ ¦ ¦ L--------¬
¦ указатель окончания счета - ¦ ¦ ¦ ¦ ¦ ¦ ---------+---------¬
¦- готовность "1"; в зависимости ¦ ¦ ¦ ¦ ¦ ¦ ¦ начальная ¦
¦от режима (бит3) останавливается¦ ¦ ¦ ¦ ¦ ¦ ¦установка таймера¦
¦ либо продолжает считать ¦ ¦ ¦ ¦ ¦ ¦ L-------------------
L--------------------------------- ¦ ¦ ¦ ¦ L----------¬
------------------- ¦ ¦ ¦ -----------+----------¬
-----------------+---------------¬ ¦ ¦ ¦ ¦разрешение установки¦
¦ включает делитель на 4 ¦ ¦ ¦ ¦ ¦сигнала 'конец счета'¦
L--------------------------------- ¦ ¦ ¦ L----------------------
---------------------- ¦ L------------¬
-----------------+---------------¬ ¦ -------------+-----------¬
¦ включает делитель на 16 ¦ ¦ ¦ режим одновибратора ¦
L--------------------------------- ¦ L-------------------------
-----------------+--------------¬
¦ запуск счетчика; по чтению - ¦
¦ - состояние: "1" - считает ¦
L--------------------------------
6.1 РЕГИСТР ПОРТА
АДРЕС = 177714
ФОРМАТ РЕГИСТРА
------------ РЕГИСТР 714 --------¬
 ¦
----------------------------------------------¬ ¦
¦ по чтению ¦ ¦
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬ ¦
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦ ¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--- ¦
¦
-----------

----------------------------------------------¬
¦ по записи ¦
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
========================================================================
= ПРОДОЛЖЕНИЕ В СЛЕДУЮЩЕМ ФАЙЛЕ =
========================================================================
КИРОВ 1993
========================================================================
= ОПИСАНИЕ БК-11М ГЛАВА ПЕРВАЯ: РЕГИСТРЫ ВНЕШНИХ УСТРОЙСТВ = fl.2=
========================================================================
* описания подготовил БАГАЕВ МАКСИМ * дом. тел (8332)60-28-05 после 21
* ВНИМАНИЕ ! ВСЕ АДРЕСА УКАЗАНЫ В ВОСЬМЕРИЧНОЙ СИСТЕМЕ ИСЧИСЛЕНИЯ
РАСПРЕДЕЛEНИЕ АДРЕСНОГО ПРОСТРАНСТВА
окно N%0 окно N%1
0 40000 100000 140000 160000 177777
---------------T-------------T-------------T------------T------------¬
¦ стр ОЗУ 0 ¦ ХХХХХХ ¦ ХХХХХХ ¦ сист. ПЗУ ¦регистры ВУ¦
L--------------+-------------+-------------+------------+-------------
¦ ¦
--------- L--------¬
--------------+------------¬ -------------+------------¬
¦ стр ОЗУ 0....7 ¦ ¦ стр ОЗУ 0....7 ¦
L--------------------------- L--------------------------
или
--------------------------¬
¦ стр ПЗУ 8....11 ¦
L--------------------------
6.1 РЕГИСТР ПОРТА
АДРЕС = 177716
ФОРМАТ РЕГИСТРА
------------ РЕГИСТР 716 --------¬
 ¦
----------------------------------------------¬ ¦
¦ по чтению ¦ ¦
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬ ¦
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦ ¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--- ¦
¦--------------------¬¦ ¦ ¦ ¦ ¦ ¦
L+ адрес начального +- ¦ ¦ ¦ ¦ ¦
¦ пуска 140000 ¦ ¦ ¦ ¦ ¦ ¦
L-------------------- ¦ ¦ ¦ ¦ ¦
--------------- ¦ ¦ L---¬ ¦
----------+---------¬ ¦ ¦ --------+-------¬ ¦
¦ наличие арифм.ПРЦ ¦ ¦ ¦ ¦признак записи¦ ¦
¦ "1" - норма ¦ ¦ ¦ ¦в сист. регистр¦ ¦
L-------------------- ¦ ¦ L---------------- ¦
--------------------------¬¦ ¦---------------------¬ ¦
¦ "0" - нажатие клавиши +- L+данные с магнитофона¦ ¦
L-------------------------- L--------------------- ¦
¦
-------------------------------+
 ¦
----------------------------------------------¬ ¦
¦ по записи, без установки бита 11 ¦ ¦
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬ ¦
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦ ¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--- ¦
¦ ¦ ¦ ¦ ¦ ¦
------------+----------¬ ¦ -+--+------------------¬ ¦
¦'0' разрешение ¦ ¦ ¦ данные на магнитофон ¦ ¦
¦ прерывания по (СТОП) ¦ ¦ L----------------------- ¦
L----------------------- ¦ ¦
--------------------------+---------¬ -----------
¦'0' включние двигателя магнитофона ¦ ¦
L------------------------------------ 
----------------------------------------------¬
¦ по записи, при установленом бите 11 ¦
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
------------------------¬ ¦¦¦¦¦¦¦ ¦ ¦¦¦¦¦¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ окно ОЗУ N%0 +---+------ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L------------------------ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
------------------------¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ окно ОЗУ N%1 +------------¦--+----- ¦ ¦ ¦ ¦ ¦ ¦
L------------------------ ¦ ¦ ¦ ¦ ¦ ¦ ¦
------------------------¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ стробирование записи +------------- ¦ ¦ ¦ ¦ ¦ ¦
L------------------------ ¦ ¦ ¦ ¦ ¦ ¦
----------------------------------------------------------¦--¦-----¦--¦¬
¦ подключение стр. ППЗУ NN% по адресу 100000-140000 11..10....9..8¦
L-----------------------------------------------------------------------
* запись в регистр возможна ТОЛЬКО при установленном 11 БИТЕ и
командами, работающими с регистом, как с целым СЛОВОМ
* в странице 8 ппзу и адресном пространстве 100000-117777 страницы 9
записан BASIC, далее по адресам 12000-137777 расположены подпрограммы
драйвер мониторной ситемы
* ВНИМАНИЕ ! 11й бит по записи обозначает запись параметров
конфигурации памяти , если же 11й бит НЕ установлен, то доступен
регистр управления магнитофоном и прерыванием по клавише (СТОП)
* ОСОБЕННОСТЬ работы с данными выводимыми НА магнитофон, см график:
V напряжение на выходе порта магнитофона

¦ ----¬
¦ ¦ ¦
¦ ¦ ¦
¦ ----¬ ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ ----¬ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦
о +------------------------------------------ t
  
установлен бит 2 ¦ установлен бит 6
¦
установлен бит 5
* на пьезодинамик поступают данные только бита 6 !
* в остальном это примитивный музыкальный ЦАП
КОДИРОВКА ПЕРЕКЛЮЧАЕМЫХ СТАНИЦ ОЗУ
-----------------T------------------T----------------T-----------------¬
¦ НОМЕР СТРАНИЦЫ ¦ МАСКА (14;13;12) ¦ МАСКА (10,9,8) ¦ СТАТУС ¦
+----------------+------------------+----------------+-----------------+
¦ 0 ¦ 60000 ¦ 3000 ¦ отображена ¦
¦ ¦ ¦ ¦ 0....40000 ¦
¦ 1 ¦ 00000 ¦ 0000 ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ 2 ¦ 20000 ¦ 1000 ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ 3 ¦ 30000 ¦ 1400 ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ 4 ¦ 40000 ¦ 2000 ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ 5 ¦ 10000 ¦ 0400 ¦ БУФЕР ЭКРАНА 0 ¦
¦ ¦ ¦ ¦ ¦
¦ 6 ¦ 70000 ¦ 3400 ¦ БУФЕР ЭКРАНА 1 ¦
¦ ¦ ¦ ¦ ¦
¦ 7 ¦ 50000 ¦ 2400 ¦ ¦
L----------------+------------------+----------------+------------------
* ВНИМАНИЕ ! маска указана без учета бита 11
7. РЕГИСТРЫ КНГМД
7.1 РЕГИСТР УПРАВЛЕНИЯ
АДРЕС = 177130
ФОРМАТ РЕГИСТРА
------------ РЕГИСТР 130 --------¬
 ¦
----------------------------------------------¬ ¦
¦ по чтению ¦ ¦
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬ ¦
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦ ¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--- ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦----------------------¬
¦ ¦ L---- н/о ------- ¦ L-- н/о -- ¦ ¦ L+ признак '0' дорожка ¦
¦ ¦ -------------------+-----------¬ ¦ ¦ L----------------------
¦ ¦ ¦ запрос на чтение или записи ¦ ¦ ¦ ----------------------¬
¦ ¦ ¦ данных из регистра данных ¦ ¦ L---+ готовность к работе ¦
¦ ¦ L------------------------------- ¦ L----------------------
¦ ¦ -------------------------¬ ¦ ----------------------¬
¦ L--+ признак форматирования ¦ L------+ 'защита от записи' ¦
¦ L------------------------- L----------------------
¦ -------------------------¬ ¦
L-----+ признак '0' сектор ¦ ¦
L------------------------- ¦
¦
-----------

----------------------------------------------¬
¦ по записи ¦
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L---- н/о ---- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
---------------------------------¬¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ переключение схем предкорреции +- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L--------------------------------- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
---------------------------------¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ признак 'запись маркера' +---- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L--------------------------------- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
---------------------------------¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ признак 'начало чтения' +------- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L--------------------------------- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
---------------------------------¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ переключение 40/80 дорожек +---------- ¦ ¦ ¦ ¦ ¦ ¦ ¦
L--------------------------------- ¦ ¦ ¦ ¦ ¦ ¦ ¦
---------------------------------¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ направление перем. головок +------------- ¦ ¦ ¦ ¦ ¦ ¦
L--------------------------------- ¦ ¦ ¦ ¦ ¦ ¦
---------------------------------¬ ¦ ¦ ¦ ¦ ¦ ¦
¦ выбор головки: "0"-верхняя +---------------- ¦ ¦ ¦ ¦ ¦
L--------------------------------- ¦ ¦ ¦ ¦ ¦
---------------------------------¬ ¦ ¦ ¦ ¦ ¦
¦ включение эл-ля, опускание гол.+------------------- ¦ ¦ ¦ ¦
L--------------------------------- ¦ ¦ ¦ ¦
-----------------------------------------------------------------¬
¦ выбор накопителя: номера --------------------- 3 2 1 0¦
L-----------------------------------------------------------------
* примечание: в дисководах 6022 сигнал 'готовность к работе' не
используется
* при подаче сигнала 'включение электродвигателя' происходит его
включение и после проверки готовности двигателя и наличия дискеты
происходит опускание головок
* ОЧЕНЬ ВАЖНАЯ ОСОБЕННОСТЬ ! нельзя читать или писать в регистр
данных, если не выставлен бит 7 в регистре управления !
7.2 РЕГИСТР ДАННЫХ
АДРЕС = 177132
ФОРМАТ РЕГИСТРА
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--¬
¦15¦14¦13¦12¦11¦10¦09¦08¦07¦06¦05¦04¦03¦02¦01¦00¦
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
* Все разряды регистра доступны по чтению и по записи
========================================================================
BMS corp. КИРОВ 1993
========================================================================
========================================================================
= ОПИСАНИЕ БК-11М ГЛАВА ВТОРАЯ: КОМАНДЫ МОНИТОРА БК 11М = fl3 =
========================================================================
* описания подготовил БАГАЕВ МАКСИМ * дом. тел (8332)60-28-05 после 21
* ВНИМАНИЕ ! ВСЕ АДРЕСА УКАЗАНЫ В ВОСЬМЕРИЧНОЙ СИСТЕМЕ ИСЧИСЛЕНИЯ
* МОНИТОР БК 11М *
* готовность монитора к работе - символ '@'
* все числа выводятся в восьмеричеой системе счисления
* собщение об ошибке - '?'
1. РАБОТА С ПАМЯТЬЮ
------------------------------T----------------------------------------¬
¦ @XXXXXX\  открыть байт ¦ содержимое можно изменить, ¦
¦ ¦ введя новое значение и подав одну ¦
¦ @XXXXXX/  открыть слово ¦ из команд работы с памятью ¦
¦ ¦ ¦
¦ ¦ ¦
¦ @<>  открыть пердыдущее ¦ ¦
¦ слово, байт, регистр ¦ ¦
¦ ¦ ¦
¦ @<>  открыть следующее ¦ ¦
¦ слово, байт, регистр ¦ ¦
¦ ¦ ¦
¦ @RX/  открыть регистр, где¦ ¦
¦ X = (0...7) или 'S' ¦ ¦
¦ ¦ ¦
¦ @<->  закрыть слово, байт ¦ если было введено новое значение, ¦
¦ или регистр ¦ то оно будет записано ¦
¦ ¦ ¦
¦ ¦ ¦
¦ @<>  закрыть ячейку и ¦ по формуле: ¦
¦ вычислить адрес ¦ АДРЕС=[адрес тек. ячейки] + [ее содер- ¦
¦ ¦ -жимое (новое)] + 2 ¦
¦ ¦ ¦
¦ ¦ команда используется для открытия ¦
¦ ¦ аргумента команд с адресацией "67" ¦
¦ ¦ ¦
¦ @<>  закрыть ячейку и ¦ по формуле: ¦
¦ вычислить адрес ¦ АДРЕС=[адрес тек. ячейки] + [содер - ¦
¦ ¦ жимое мл. байта]*2 + 2 ¦
¦ ¦ ¦
¦ ¦ команда используется для открытия ¦
¦ ¦ ячейки, на которуя выполняется переход ¦
¦ ¦ по комнде "BR" ¦
¦ ¦ ¦
¦ @<@>  закрыть ячейку и ¦ по формуле: ¦
¦ вычислить адрес ¦ АДРЕС=[адрес тек. ячейки] ¦
¦ ¦ ¦
L-----------------------------+-----------------------------------------
2. СПЕЦИАЛЬНЫЕ КОМАНДЫ
@N;MC  отобразить станицу памяти "N" по адресу "M"
N=(0...7) - ОЗУ N=(10...13) - ПЗУ
M=0 означает адреса с 40000 по 100000
M=1 означает адреса со 100000 по 140000
@XB  загрузить оп/систему с накопителя с номером X
- если номер не задан, то поиск системы
производится автоматически
@XXXXXXL  загрузить с адреса двоичный файл с МЛ
- если адрес не задан, то загузка производится
по адресу, указанному в заголовке
- в ответ на запрос ввести имя, при вводе
пустого имени производится загрузка
первого встретевшгося файла
@NNNNNN-MMMMMM;U  вывести в файл информацию, где NNNNNN -
начальный адрес, а MMMMMM - конечный адрес (включительно)
@NNNNNN+MMMMMM;U  вывести в файл информацию, где NNNNNN -
начальный адрес, а MMMMMM - длина в байтах
@XM  включить(X=1)/выключить(X=0) двигатель МГ
@XXXXXXG передать управление на программу пользователя
- если адрес не указан, то производится запуск по
адресу загрузки (ячейка 40)
@P  продолжить выполнение программы, прерванное прерыванием
по вектору 4
@<ШАГ>  пошаговое выполнение программы
@<-+>  анулировать последнюю введенную цифру
@СУ/Е  выход в непосредственный режим - используется для
настройки драйвера экрана
- в драйвер передается код ESC (код33), после чего монитор
все вводимуе символы передает драйверу экрана
- выход из режима - СУ/@
- ESC-последовательности ниже 
пример:
СУ/Е 0 СУ/@ - установка цветного режима
СУ/Е ;21 СУ/@ - установка цвета фона 2 и цвета смволов 1
-----------------------T-----------------------------------------------¬
¦ КОМАНДА ¦ НАЗНАЧЕНИЕ ¦
+----------------------+-----------------------------------------------+
¦ ESC 0 (033,060) ¦ - 32 символа в строке ¦
¦ ESC 1 (033,061) ¦ - 64 символа в строке ¦
¦ ESC 2 (033,062) ¦ - 80 символов в строке ¦
¦ ESC 3 (033,063) ¦ - двойная ширина символов ¦
¦ ESC 4 (033,064) ¦ - одинарна ширина символов ¦
¦ ESC 5 (033,065) ¦ - двойная высота символов (верхняя половина) ¦
¦ ESC 6 (033,066) ¦ - двойная высота символов (нижняя половина) ¦
¦ ESC 7 (033,067) ¦ - отмена двойной высоты ¦
¦ ESC 8 (033,071) ¦ - отбражение курсора ¦
¦ ESC 9 (033,072) ¦ - запрет отображения курсора ¦
¦ ESC : (033,073) ¦ - установка палитры * ¦
¦ ESC ; (033,075) ¦ - установка цветов ** ¦
¦ ESC = (033,076) ¦ - вводит режим дополнительной клавиатуры ¦
¦ ESC > (033,100) ¦ - сбрасывает режим дополнительной клавиатуры ¦
¦ ESC @ (033,101) ¦ - раздвижка символов от курсора вправо ¦
¦ ESC A (033,102) ¦ - курсор вверх (в первой строке игнорируется) ¦
¦ ESC B (033,103) ¦ - курсор вниз (в последней строке игнорируется¦
¦ ESC C (033,104) ¦ - курсор вправо (зависят от режима авто- ¦
¦ ESC D (033,105) ¦ - курсор влево -переноса) ¦
¦ ESC E (033,110) ¦ - очистка экрана ¦
¦ ESC H (033,111) ¦ - курсор 'домой' (левый вехний угол) ¦
¦ ESC I (033,112) ¦ - "обратный ПС" (сдвиг экрана вниз) ¦
¦ ESC J (033,113) ¦ - стирание вправо от курсора до конца экрана ¦
¦ ESC K (033,114) ¦ - стирание вправо от курсора до конца строки ¦
¦ ESC L (033,115) ¦ - раздвижка строк вниз ¦
¦ ESC M (033,116) ¦ - сдвижка строк снизу, с уничтожением строки ¦
¦ ESC N (033,117) ¦ - подчеркивание символов ¦
¦ ESC O (033,120) ¦ - запрет подчеркивания символов ¦
¦ ESC P (033,121) ¦ - сдвижка символов к курсору влево ¦
¦ ESC Q (033,122) ¦ - курсор в начало следующей строки ¦
¦ ESC R (033,123) ¦ - курсор в начало текущей строки ¦
¦ ESC T (033,124) ¦ - инверсия символов ¦
¦ ESC V (033,125) ¦ - запрет инверсии ¦
¦ ESC Y (033,131) ¦ - прямая адресация курсора *** ¦
¦ ESC Z (033,132) ¦ - индентификация **** ¦
L----------------------+------------------------------------------------
ПРИМЕЧАНИЯ:
* после команды должен следовать байт, младшие 4 бита которого
задают код палитры (см )
** после команды должны следовать 2 байта, задающие фон и цвет
символов
*** после команды должны следовать 2 байта, задающие код строки и
код позиции в строке (пример: код 040 - верхняя сторка и крайне левая
позиция)
**** в ответ на команду в драйвер клавиатуры передается командная
последовательность: ESC K
** ТАБЛИЦА ПАЛИТР **
-------T-------------------T-------------------------------------------¬
¦номер ¦ код палитры ¦ код точки ¦
¦ +----T----T----T----+--------T----------T-----------T-----------+
¦ NN% ¦ 11 ¦ 10 ¦ 09 ¦ 08 ¦ 00 ¦ 10 ¦ 01 ¦ 11 ¦
+------+----+----+----+----+--------+----------+-----------+-----------+
¦ 00 ¦ 0 ¦ 0 0 0 ¦ черный ¦ зеленый ¦ синий ¦ красный ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 01 ¦ 0 ¦ 0 0 1 ¦ .... ¦ сирениев.¦ желтый ¦ красный ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 02 ¦ 0 ¦ 0 1 0 ¦ .... ¦ синий ¦ голубой ¦ сиреневый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 03 ¦ 0 ¦ 0 1 1 ¦ .... ¦ голубой ¦ зеленый ¦ желтый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 04 ¦ 0 ¦ 1 0 0 ¦ .... ¦ голубой ¦ сиренев. ¦ белый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 05 ¦ 0 ¦ 1 0 1 ¦ .... ¦ белый ¦ белый ¦ белый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 06 ¦ 0 ¦ 1 1 0 ¦ .... ¦красно- ¦ темно- ¦ красный ¦
¦ ¦ ¦ ¦ ¦-коричнев.¦ -красный ¦ ¦
¦ 07 ¦ 0 ¦ 1 1 1 ¦ .... ¦светло- ¦ салатовый ¦ желтый ¦
¦ ¦ ¦ ¦ ¦ -зеленый ¦ ¦ ¦
¦ 08 ¦ 1 ¦ 0 0 0 ¦ .... ¦ фиолетов.¦ фиолетов. ¦ сиреневый ¦
¦ ¦ ¦ ¦ ¦ синий ¦ ¦ ¦
¦ 09 ¦ 1 ¦ 0 0 1 ¦ .... ¦ фиолетов.¦ светло- ¦ красно- ¦
¦ ¦ ¦ ¦ ¦ синий ¦ -зеленый ¦-коричневый¦
¦ 10 ¦ 1 ¦ 0 1 0 ¦ .... ¦ фиолетов.¦ салатовый ¦ темно- ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ -красный ¦
¦ 11 ¦ 1 ¦ 0 1 1 ¦ .... ¦ желтый ¦ голубой ¦ красный ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 12 ¦ 1 ¦ 1 0 0 ¦ .... ¦ зеленый ¦ красный ¦ голубой ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 13 ¦ 1 ¦ 1 0 1 ¦ .... ¦ желтый ¦ голубой ¦ белый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 14 ¦ 1 ¦ 1 1 0 ¦ .... ¦ зеленый ¦ желтый ¦ белый ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ 15 ¦ 1 ¦ 1 1 1 ¦ .... ¦ зеленый ¦ голубой ¦ белый ¦
L------+----+--------------+--------+----------+-----------+------------
========================================================================
= BMS corp. Kirov 1993 =
========================================================================
+======================================================================+
¦ ОПИСАНИЕ БК-11М ГЛАВА ТРЕТЬЯ: СИСТЕМНЫЕ ЗАПРОСЫ БК-11М = fl4 ¦
+======================================================================+
* описания подготовил БАГАЕВ МАКСИМ * дом. тел (8332)60-28-05 после 21
* ВНИМАНИЕ ! ВСЕ АДРЕСА УКАЗАНЫ В ВОСЬМЕРИЧНОЙ СИСТЕМЕ ИСЧИСЛЕНИЯ
----------T--------T---------T--------T--------------------------------¬
¦ N% EMT ¦ АДРЕС ¦ АДРЕС @ ¦ КОМАДА ¦ ФУНКЦИЯ ¦
+---------+--------+---------+--------+--------------------------------+
¦ ЕМТ 0 ¦ 150414 ¦ 140010 ¦ .BINIT ¦ инициализация БOC ¦
¦ EMT 1 ¦ 147712 ¦ 140012 ¦ .BEXIT ¦ выход в клавиатурный монитор ¦
¦ EMT 2 ¦ 147742 ¦ 140014 ¦ .BTRPS ¦ перехват вектора 4 ¦
¦ EMT 3 ¦ 150070 ¦ 140016 ¦ .BTIM ¦ управление таймером ¦
¦ EMT 4 ¦ 152202 ¦ 140020 ¦ .BEMT ¦ управление обработкой ЕМТ ¦
¦ EMT 10 ¦ 150474 ¦ 140030 ¦ .BMEM ¦ чтение состояния прамяти ¦
¦ EMT 11 ¦ 150504 ¦ 140032 ¦ .BTEST ¦ чтение статуса страницы ¦
¦ EMT 12 ¦ 150514 ¦ 140034 ¦ .BPAGE ¦ подключение страницы ОЗУ/ПЗУ ¦
¦ EMT 13 ¦ 150530 ¦ 140036 ¦ .BWORK ¦ назначение/чт.рабочей страницы ¦
¦ EMT 14 ¦ 150540 ¦ 140040 ¦ .BGETW ¦ чтение слова из раб. страницы ¦
¦ EMT 15 ¦ 150564 ¦ 140042 ¦ .BGETB ¦ чтение байта из раб. страницы ¦
¦ EMT 16 ¦ 150612 ¦ 140044 ¦ .BPUTW ¦ запись слова в рабочую страницу¦
¦ EMT 17 ¦ 150654 ¦ 140046 ¦ .BPUTB ¦ запись байта в рабочую страницу¦
¦ EMT 20 ¦ 151140 ¦ 140050 ¦ .BMOVW ¦ пересылка массива слов ¦
¦ EMT 21 ¦ 151156 ¦ 140052 ¦ .BMOVB ¦ пересылка массива байтов ¦
¦ EMT 22 ¦ 151006 ¦ 140054 ¦ .BJSR ¦ вызов подпрограммы из раб. стр.¦
¦ EMT 23 ¦ 151114 ¦ 140056 ¦ .BJMP ¦ переход в рабочую стр. ( JMP ) ¦
¦ EMT 30 ¦ 146714 ¦ 140070 ¦ .BKINI ¦ инициализация драйв. клавиатуры¦
¦ EMT 31 ¦ 146752 ¦ 140072 ¦ .BKSET ¦ установка реж. драйв. клавиат. ¦
¦ EMT 32 ¦ 146764 ¦ 140074 ¦ .BKGET ¦ чтение режима драйв. клавиатуры¦
¦ EMT 33 ¦ 147550 ¦ 140076 ¦ .BTTIN ¦ ввод символа с ожиданием ¦
¦ EMT 34 ¦ 147406 ¦ 140100 ¦ .BINKEY¦ ввод символа без ожидания ¦
¦ EMT 35 ¦ 151336 ¦ 140102 ¦ .BGLIN ¦ ввод строки с редактираванием ¦
¦ EMT 36 ¦ 151266 ¦ 140104 ¦ .BEDIT ¦ редактирование сущ. строки ¦
¦ EMT 37 ¦ 147636 ¦ 140106 ¦ .BKRES ¦ сброс буфера клавиатуры ¦
¦ EMT 40 ¦ 147672 ¦ 140110 ¦ .BSFUN ¦ установка функциональных клавиш¦
¦ EMT 41 ¦ 147702 ¦ 140112 ¦ .BGFUN ¦ чтение функциональных клавиш ¦
¦ EMT 50 ¦ 143456 ¦ 140130 ¦ .BTINI ¦ инициализация драйвера экрана ¦
¦ EMT 51 ¦ 143446 ¦ 140132 ¦ .BTSET ¦ уст. режима драйвера экрана ¦
¦ EMT 52 ¦ 143434 ¦ 140134 ¦ .BTGET ¦ чтение режима драйвера экрана ¦
¦ EMT 53 ¦ 143274 ¦ 140136 ¦ .BSCOL ¦ установка цветов ¦
¦ EMT 54 ¦ 143414 ¦ 140140 ¦ .BGCOL ¦ чтение цветов ¦
¦ EMT 55 ¦ 150000 ¦ 140142 ¦ .BPAL ¦ установка/чтение палитры ¦
¦ EMT 56 ¦ 143466 ¦ 140144 ¦ .BBUF ¦ переключение буферов экрана ¦
¦ EMT 57 ¦ 143476 ¦ 140146 ¦ .BSPOS ¦ установка координат А/Ц курсора¦
¦ EMT 60 ¦ 143560 ¦ 140150 ¦ .BGPOS ¦ чтение координат А/Ц курсора ¦
¦ EMT 61 ¦ 143572 ¦ 140152 ¦ .BSCRL ¦ сдвиг экрана ¦
¦ EMT 62 ¦ 143622 ¦ 140154 ¦ .BCLS ¦ очистка экрана ¦
¦ EMT 63 ¦ 143070 ¦ 140056 ¦ .BTOUT ¦ вывод символа ¦
¦ EMT 64 ¦ 143142 ¦ 140160 ¦ .BPRIN ¦ вывод строки в формате RT-11 ¦
¦ EMT 65 ¦ 143130 ¦ 140162 ¦ .BSTR ¦ вывод строки символов ¦
¦ EMT 66 ¦ 152470 ¦ 140164 ¦ .BSGRF ¦ установка тек. граф. координат ¦
¦ EMT 67 ¦ 152506 ¦ 140166 ¦ .BGGRF ¦ чтение текущих граф. координат ¦
¦ EMT 70 ¦ 152524 ¦ 140170 ¦ .BSCRG ¦ установка гафического цвета ¦
¦ EMT 71 ¦ 152546 ¦ 140173 ¦ .BGCGR ¦ чтение графического цвета ¦
¦ EMT 72 ¦ 152564 ¦ 140174 ¦ .BGMOD ¦ установка/чтение реж. рисования¦
¦ EMT 73 ¦ 152230 ¦ 140176 ¦ .BSPNT ¦ вывод графической точки ¦
¦ EMT 74 ¦ 152372 ¦ 140200 ¦ .BGPNT ¦ чтение цвета графической точки ¦
¦ EMT 75 ¦ 152460 ¦ 140202 ¦ .BVECT ¦ вывод вектора ¦
¦ EMT 76 ¦ 153424 ¦ 140204 ¦ .BRECT ¦ вывод закрашеного прямоугол. ¦
¦ EMT 77 ¦ 152722 ¦ 140206 ¦ .BCIRC ¦ вывод дуги или окружности ¦
¦ EMT 100 ¦ 154202 ¦ 140210 ¦ .BFILL ¦ закраска гранично-опред. обл. ¦
¦ EMT 101 ¦ 143636 ¦ 140212 ¦ .BSOUN ¦ выдача звука ¦
¦ EMT 102 ¦ 153000 ¦ 140214 ¦ .BSWIN ¦ установка графического окна ¦
¦ EMT 103 ¦ 153134 ¦ 140216 ¦ .BGWIN ¦ чтение графического окна ¦
¦ EMT 105 ¦ 152614 ¦ 140222 ¦ .BSTYP ¦ установка типа вектора ¦
¦ EMT 106 ¦ 152660 ¦ 140224 ¦ .BGTYP ¦ чтение типа вектора ¦
¦ EMT 107 ¦ 153166 ¦ 140226 ¦ .BGOSET¦ уст./чт. ориент. граф. символов¦
¦ EMT 110 ¦ 153226 ¦ 140230 ¦ .BGOUT ¦ графический вывод символа ¦
¦ EMT 114 ¦ 154550 ¦ 140240 ¦ .BMOT ¦ управление двигателем магн. ¦
¦ EMT 115 ¦ 154614 ¦ 140242 ¦ .BMB10 ¦ вызов формата БК-0010(.01) ¦
¦ EMT 124 ¦ 156560 ¦ 140260 ¦ .BPINI ¦ инициализация драйвера принтера¦
¦ EMT 125 ¦ 156612 ¦ 140262 ¦ .BPSET ¦ установка режима печати ¦
¦ EMT 126 ¦ 156664 ¦ 140264 ¦ .BPGET ¦ чтение режима печати ¦
¦ EMT 127 ¦ 156736 ¦ 140266 ¦ .BPOUT ¦ вывод символа на печать ¦
¦ EMT 130 ¦ 156676 ¦ 140270 ¦ .BPRDY ¦ определение готовности принтера¦
¦ EMT 131 ¦ 156724 ¦ 140272 ¦ .BPPOS ¦ определиние позиции печ. гол. ¦
L---------+--------+---------+--------+---------------------------------
========================================================================
= BMS corp. продолжение следует Kirov 1993 =
========================================================================

BIN
KeyboardMapping.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,31 @@
R MACRO
MONIT=GEN,MONIT
IO=GEN,IO
TRAP=GEN,TRAP
COMP=GEN,COMP
JMIN=GEN,JMIN
JMP=GEN,JMP
GRAF=GEN,GRAF
GRAF11=GEN,GRAF11
FLOATS=GEN,FLOATS
^C
R LINK
,,BAS1[4]/B:100000=MONIT,IO,TRAP
,,BAS2[9]/B:100000/T:100000=COMP,JMIN,JMP//
GRAF,GRAF11,FLOATS//
BAS2[97],BAS2[17]/W/T:100000/B:100000=COMP,JMIN,JMP//
GRAF,GRAF11,FLOATS,BAS1.STB//
^C
DEL BAS1.STB/NOQ
RU KPTSAB
BAS2=BAS2
^C
DEL BAS2.SAV/NOQ
R LINK
BAS1[80],BAS1[17]/W/B:100000=MONIT,IO,TRAP,BAS2.STB
^C
DEL BAS2.STB/NOQ
RU KPTSAB
BAS1=BAS1
^C
DEL BAS1.SAV/NOQ

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,75 @@
.ENABLE LC
;
; ###################
; # #
; # BASIC - VVU #
; # #
; ###################
;
; ispolnitelx: wckp wgu
; wilxn`s,1987
;
; ======================
; ****blok nastroiki****
; ======================
;
BK0011 =1
BK0010 =2
DVK2B =3 ;DVK SU BK0010 KLASE
DVK2 =4
VUMS =5 ;SILELIS
DVK3 =6
UK =7
MDS =10 ;MDS RAFOS
;------------------------
MASINA =BK0011 ; .IF EQ,MASINA-XX
;------------------------
.IF GT,MASINA-DVK2B
UKM=MASINA
.IF EQ,MASINA-UK
KLAS=UK
MSX=MASINA
.IFF
KLAS=BK0010
MSX=0
.ENDC
.IFF
UKM=0
KLAS=BK0010
MSX=0
.ENDC
;
.IF GT,MASINA-BK0010
.IF EQ,MASINA-DISK
RAM=160000
.IFF
.IF EQ,MASINA-NET
RAM=150000
.IFF
RAM=160000
.ENDC
.ENDC
ROM=0
.IFF
.IF EQ,MASINA-BK0011
RAM=1
ROM=0
.IFF
MVIDEO=40000
RAM=MVIDEO
ROM=120000
.ENDC
.ENDC
;------------------------
MEMTYP =RAM ; .IF EQ,MEMTYP-RAM (ROM)
VM =1 ; .IF EQ,VM-1 (2)
SNG =0 ; .IF DF,SNG
; HOOKS =0 ; .IF DF,HOOKS
DISK =0 ; .IF EQ,MASINA-DISK
NET =0 ; .IF EQ,MASINA-NET
CASET =MASINA ; .IF EQ,MASINA-CASET
MESSAG =0 ; .IF EQ,MESSAG
STACK =2000 ; .IF EQ,STACK-1000 (2000)
;------------------------

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,736 @@
Утверждаю
главный инженер ОКБ
_________ Ю.В.Майоров
"___" ________ 1986г.
Блок КЛС
техническое описание
13
листов
начальник отделения 2
________ С.М.Косенков
"___" ________ 1986г.
Начальник сектора
_______ З.А.Счепицкий
"___" ________ 1986г.
Инженер
_________ В.А.Никулин
"___" ________ 1986г.
Нормоконтроль
_____________ Е.С.Кац
"___" _________ 1986г.
Первичное применение литера о
2.165.002
1986
- 2 -
Блок КЛС
1. Введение.
Настоящее техническое описание (ТО) предназначено для озна-
комления с устройством и работой блока контроллера локальной
сети (КЛС).
При изучении настоящего то следует дополнительно пользо-
ваться следующими документами:
- 4.883.020 ЭЗ плата КЛС. Схема электрическая принци-
пиальная;
- 4.883.020 СБ плата КЛС. Сборочный чертеж.
2. Назначение.
Блок КЛС предназначен для обеспечения обмена информацией
между персональной эвм "электроника БК0011" (ПЭВМ) в кольцевой
локальной вычислительной сети.
- 3 -
Блок КЛС
3. Основные технические характеристики.
Блок КЛС обеспечивает по последовательному каналу:
- скорость обмена 57600 бод;
- прием и выдачу посылки в формате 8 информационных бит;
- формирование и контроль бита паритета.
Тип линии связи - токовая петля.
Блок КЛС обеспечивает:
- считывание сетевого адреса, установленного с помощью пе-
реключателя;
- программно-управляемое отключение станции из сети;
- поддержание целостности кольца при механическом или элек-
трическом отключении сетевой станции с помощью электроме-
ханического шунта, обеспечивающего шунтирование нерабо-
тающей станции.
Амплитуда тока в линии связи - 60 ма.
- 4 -
Блок КЛС
4. Устройство и работа блока КЛС.
Блок КЛС выполнен в виде функционально законченного модуля,
подключаемого к раз'ему межмодульного параллельного интерфейса
(МПИ). Все элементы блока смонтированы на одной печатной пла-
те.
Структурная схема блока КЛС приведена на рис.1.
Микросхема К1801ВП1-065 предназначена для преобразования
параллельной информации в последовательную и наоборот, обеспе-
чивает по последовательным входу и выходу требования интерфей-
са для радиального подключения устройств с последовательной
передачей информации (ИРПС).
Схема формирования сигнала "выбор устройства" (ВУ) предназ-
начена для формирования сигнала низкого уровня при выдачи из
ПЭВМ адреса в диапазоне 160000 - 177776. Выполнена на элемен-
тах D11.4, D11.5, D11.6, D4.3 (см. Схему электрическую принци-
пиальную).
- 5 -
Блок КЛС
структурная схема блока КЛС.
-----------
! !
! ! -------- --------
/--------\ ! ! ! ! ! 10 !----->
/ 13 \! 1 !------>! 6 !-----> --------
\ /! !<------! !<----- -------- 11
\ ------/ ! ! ! ! ! 9 !<-----
! ! ! ! -------- --------
! ! ! ! !
! ! ---- ----------- !
! -\ !2 !--! ! ! ! ! !
! -/ ! ! ! ! ! ! -----------
! ! ---- ! ! ! ! ! ! 12
! ! ---- ! ! ! !-------! 8 !------------------->
! ! !3 !----! ! ! ! !
! ! ! ! ! ! -----------
! ! ---- ! ! ----------- !
! ! ---- ! ! ! ! !
! ! !4 !------+-!--! 7 !---
! ! ! ! ! ! !
! ! ---- ! -----------
! ! ---- !
! ---!5 !<-------!
!-----! !
----
1.бис асинхронного приемо-передатчика К1801ВП1-065.
2.схема формирования сигнала "выбор устройства".
3.схема задания режима работы блока.
4.задающий генератор.
5.схема формирования сетевого адреса.
6.электронный шунт.
7.таймер.
8.схема управления коммутацией.
9.входной узел приемника.
10.выходной узел передатчика.
11.информационные линии связи.
12.линия управления электро-механическим шунтом.
13.МПИ.
Рис.1.
- 6 -
Блок КЛС
Схема задания режима работы блока предназначена для задания
следующего режима работы микросхемы К1801ВП1-065:
а) адреса регистров и векторов прерываний, задаваемые с по-
мощью перемычек 31-32, 33-34, соответствуют таблице 2.
Б) формат посылок по последовательному каналу, задаваемый
перемычками 35-36, 37-38, 39-40, соответствует рис.2. причем
перемычка 37-38 задает количество информационных бит в посыл-
ке, равное 8, а перемычки 35-36, 39-40 определяют наличие и
контроль бита нечетности в посылке.
В) скорость обмена по последовательному каналу, задаваемая
перемычками 41-42, 43-44, 45-46, равна 57600 бод.
Формат посылки
- ----------------------------------------- -
! Стоп ! ! 1 ! 2 ! 3 ! 4 ! 5 ! 6 ! 7 ! 8 ! ! Стоп !
-------- ! --------------------------------------------
! !
Старт бит паритета
рис.2.
Задающий генератор предназначен для формирования высокоста-
бильного синхросигнала частотой 4608 кгц. Стабильность частоты
синхросигнала определяет стабильность скорости обмена по пос-
ледовательному каналу. Выполнен на элементах D11.1, D11.2,
D11.3.
Схема формирования сетевого адреса предназначена для зада-
ния сетевого адреса в диапазоне 0-255, в разрядах 8-11, 13, 14
по адресам 176560-176566. Выполнен на наборе переключателей
SA1, наборе резисторов е2.1 и микросхемах D2, D3.1, D3.2,
D5.3.
Электронный шунт предназначен для сохранения целостности
кольцевой ЛВС посредством электронного замыкания входного узла
приемника с выходным узлом передатчика при программном отклю-
чении станции от ЛВС. Выполнен на элементах D7.4, D7.3.
Таймер предназначен для подсчета времени прошедшего после
последнего обращения ПЭВМ к регистрам приемника блока КЛС в
случае, когда электронный шунт разомкнут и отсутствует сигнал
"ОСТ". Когда это время превышает 2,5с в схему управления ком-
мутацией выдается соответствующий сигнал. Выполнен на элемен-
тах D8, D3.5, D4.1, D5.1, D5.2.
- 7 -
Блок КЛС
Схема управления коммутацией предназначена для:
а) формирования сигнала управления электронным шунтом в
случае обращения по адресу 176560 по записи. Запись во 2-й
разряд лог. 1 Замыкает электронный шунт. Запись лог.0 размы-
кает электронный шунт и подключает последовательный выход мик-
росхемы К1801ВП1-065 к выходному узлу передатчика. Б) формиро-
вания сигнала управления электромеханическим шунтом при появ-
лении соответствующего сигнала от таймера. Выполнена на эле-
ментах D5.4, D6, D3.3, D3.4 D4.2 и транзисторе VT1.
Входной узел приемника предназначен для преобразования им-
пульсов токов в линии связи в потенциальный сигнал, подаваемый
на последовательный вход микросхемы К1801ВП1-065 и электронный
шунт, а также для осуществления гальванической развязки блока
КЛС от линии связи. Выполнен на элементах D7.1, D7.2, тран-
сформаторе TV1.
Выходной узел передатчика предназначен для преобразования
потенциального последовательного сигнала в импульсы тока дли-
тельностью = 650+20 нс в линии связи, а также для организации
гальванической развязки блока КЛС от линии связи. Выполнен на
элементах D9, D10, трансформаторе TV2.
Связь блока КЛС с ПЭВМ осуществляется через раз'ем межмо-
дульного параллельного интерфейса (МПИ) ХТ1, номера контактов
которого и соответствующие им обозначения сигналов приведены в
таблице 1.
Интерфейс связи соответствует ОСТ 11.305.903-80.
Блок КЛС содержит 4 системных регистра и 2 источника адре-
сов векторов прерываний
адреса регистров и векторов прерываний приведены в таблице
2.
Регистр состояния приемника (РСПР) имеет следующий формат:
15 12 7 6 2 0
------------------------------------------------------------
! Х ! Х ! Х ! Х ! Х ! Х ! Х ! Х ! Х ! Х ! ! ! ! Х ! ! !
------------------------------------------------------------
0, 1, 3-5, разряды - не используются, читаются как лог."0".
2Р - разряд управления электронным шунтом. Доступен по записи.
- 8 -
Блок КЛС
Читается всегда как лог."0". Запись лог."0" в этот разряд оп-
ределяет режим выдачи посылок от ПЭВМ.
Запись лог."1" в этот разряд определяет режим ретрансляции
принимаемых из линии посылок.
6Р - разрешение работы приемника по прерыванию. Если 6р ус-
тановлен в "1", то прерывание разрешено, если в "0", - запре-
щено. Доступен по записи и чтению. Сбрасывается в "0" по сиг-
налу "СБРОС".
7 - Флаг состояния приемника. Устанавливается в "1" по
окончании прихода посылки из линии в буферный регистр приемни-
ка.
Сбрасывается в "0" по окончании чтения посылки из буферного
регистра приемника или по сигналу "СБРОС". Доступен по чтению.
- 9 -
Блок КЛС
таблица 1
-------------------------------------------------
! Номер контакта ХТ1 ! Наименование сигнала !
!-----------------------------------------------!
! А 31 ! АД 00 н !
! В 31 ! АД 01 н !
! В 29 ! АД 02 н !
! В 30 ! АД 03 н !
! В 28 ! АД 04 н !
! А 28 ! АД 05 н !
! В 27 ! АД 06 н !
! В 32 ! АД 07 н !
! В 26 ! АД 08 н !
! А 27 ! АД 09 н !
! В 25 ! АД 10 н !
! А 26 ! АД 11 н !
! В 24 ! АД 12 н !
! А 25 ! АД 13 н !
! В 23 ! АД 14 н !
! В 7 ! АД 15 н !
! В 22 ! СИА Н !
! В 20 ! СИП Н !
! А 24 ! ППР 2 Н !
! В 5 ! ТПР Н !
! А 5 ! ПРТ Н !
! В 19 ! СБРОС Н !
! В 21 ! ВЫВОД Н !
! А 23 ! ВВОД Н !
! А 1 ! ОСТ Н !
! А 29 ! Е !
! А 4, А 12, В 12 ! +5В !
! А 2, А 3, В 2, В 3 ! ОБЩИЙ !
-------------RFEJSA (mpi) ht1, NOMERA KONTAKTOW
KOTOROGO I SOOTWETSTWU@]IE IM OBOZNA^ENIQ SIGNALOW PRIWEDENY W
TABLICE 1.
iNTERFEJS SWQZI SOOTWETSTWUET ost 11.305.903-80.
bLOK kls SODERVIT 4 SISTEMNYH REGISTRA I 2 ISTO^NIKA ADRE-
SOW WEKTOROW PRERYWANIJ
ADRESA REGISTROW I WEKTOROW PRERYWANIJ PRIWEDENY W TABLICE
2.
Регистр состояния приемника (РСПР) имеет следующий формат:
15 12 7 6 2 0
------------------------------------------------------------
! Х ! Х ! Х ! Х ! Х ! Х ! Х ! Х ! Х ! Х ! ! ! ! Х ! ! !
------------------------------------------------------------
0, 1, 3-5, разряды - не используются, читаются как лог."0".
2Р - разряд управления электронным шунтом. Доступен по записи.
- 8 -
Блок КЛС
Читается всегда как лог."0". Запись лог."0" в этот разряд оп-
ределяет режим выдачи посылок от ПЭВМ.
Запись лог."1" в этот разряд определяет режим ретрансляции
принимаемых из линии посылок.
Устанавливается в "1", если в
сдвиговый регистр приемника поступило более одной посылки без
чтения из буферного регистра приемника первой поступившей по-
сылки.
При этом независимо от числа поступивших в канал приемника
посылок в буферном регистре сохраняется первая посылка. Нахо-
дится в "0", если поступившая в буферный регистр посылка чи-
тается до окончания поступления в сдвиговый регистр последнего
информационного бита следующей посылки. Сбрасывается в "0" по
окончании чтения буферного регистра приемника или по сигналу
"СБРОС Н". Доступен по чтению.
15Р - ошибка в принятой посылке. Устанавливается в "1", ес-
ли есть ошибка паритета в принятой посылке. В противном случае
находится в "0". Признак ошибки сбрасывается в "0" с момента
чтения содержимого буферного регистра приемника или по сигналу
"СБРОС". Доступен по чтению.
Буферный регистр приемника (БРПР) имеет следующий формат:
15 14 13 12 11 8 7 0
-----------------------------------------------------
! ! Х х ! ! Х х х х ! Х х х х х х х х !
-----------------------------------------------------
0-7Р по чтению - содержит посылку принятую с линии. В 0р
находится первый бит посылки, в 7р - восьмой.
8-11, 13, 14р - содержат системный адрес (см. РСПР).
12, 15р - не используются, читаются как лог."0".
Регистр состояния передатчика (РСПЕР).
15 14 13 11 8 7 6 2 0
--------------------------------------------------------
! ! Х х ! ! Х х х х ! Х ! Х ! ! Х ! ! Х !
--------------------------------------------------------
0Р - разрыв линии. Если 0 разряд установлен в "1", то на
выходе контроллера формируется состояние "СТАРТ". Доступен по
записи и чтению. Сбрасывается в "0" по сигналу "СБРОС".
2Р - проверка работы. Если 2р установлен в "1", то выдавае-
- 11 -
Блок КЛС
мая в линию посылка поступает также и на канал приемника.
Сбрасывается в "0" по сигналу "СБРОС". Доступен по записи и
чтению.
6Р - разрешение работы передатчика по прерыванию. Если 6р
установлен в "1", то прерывание разрешено, если в "0" - запре-
щено. Доступен по записи и чтению. Сбрасывается в "0" по сиг-
налу "СБРОС".
7Р - флаг состояния передатчика. Устанавливается в "1" в
момент выдачи посылки на линию или по сигналу "ОСТ". Сбрасы-
вается в "0" по записи информации в буферный регистр передат-
чика. 7Р в "1" свидетельствует о том, что буферный регистр пе-
редатчика пустой. Если запись информации в буферный регистр
передатчика произошла во время выдачи посылки, то следующая
посылка начинается сразу же по окончанию предыдущей. 7Р досту-
пен по чтению.
8-11, 13, 14р - содержат системный адрес (см. РСПР).
12, 15 - не используются, читаются как лог."0".
Буферный регистр передатчика (БРПСР).
15 8 7 0
------------------------------------------------
! ! Х х х х х х х х !
------------------------------------------------
0-7Р - разряды для передачи посылки в линию. В 0р записы-
вается первый бит посылки, в 7р - восьмой. Посылка поступает в
линию по окончании записи данных в БРПСР. При соблюдении усло-
вия формирования бита паритета он автоматически следует за
последним битом посылки.
При чтении по адресу бпрср в 0-7р читается адрес вектора
прерывания, в 8-11, 13, 14р - читается системный адрес (см.
РСПР), а 12, 15р читается как лог."0".
Запрос на прерывание от приемника возникает, если 6 и 7
разряды рспр установлены в "1". При обработке запроса на пре-
рывание читается адрес вектора прерывания приемника равный
360.
Запрос на прерывание от передатчика возникает если 6 и 7
разряды рспср установлены в "1". При обработке запроса на пре-
рывание читается адрес вектора прерывания передатчика равный
364.
Приоритет запроса от приемника выше приоритета запроса от
- 12 -
Блок КЛС
передатчика.
Все разряды системных регистров кроме разрядов 8-11, 13,
14, содержащих системный адрес и 2р рспр находятся в микросхе-
ме К1801ВП1-065.
2Р рспр выполнен на триггере D6.2. Разряды 8-11, 13, 14 ре-
гистров блока КЛС выполнены на наборе переключателей SA1.
Основным элементом блока КЛС является БИС асинхронного пос-
ледовательного приемо-передатчика К1801ВП1-065.
Временные диаграммы работы микросхемы К1801ВП1-065 пред-
ставлены на рис.3..8.
Временные диаграммы работы выходного узла передатчика пред-
ставлены на рис.9.
Временные диаграммы работы входного узла приемника пред-
ставлены на рис.10.
- 13 -
Блок КЛС
Содержание
1. Введение. . . . . . . . . . . . . . . . . . . . . . . 2
2. Назначение. . . . . . . . . . . . . . . . . . . . . . 2
3. Основные технические характеристики. . . . . . . . . . 3
4. Устройство и работа блока КЛС. . . . . . . . . . . . . 4

View File

@ -0,0 +1,478 @@
; #############################################################
; # #
; # Д Р А Й В Е Р Н Ы Й М О Д У Л Ь Б К - 0 0 1 0 #
; # #
; #############################################################
; РАЗРАБОТАЛ: ДЯБИН М.И.
; МОСКВА, 1983 Г.
;
; ПОСЛЕДНЯЯ РЕДАКЦИЯ: МАЙ 1984 Г.
; ====================================
; **** АРГУМЕНТЫ КОМАНДЫ EMT DMBK ****
; ====================================
; КЛАВИАТУРА
; ----------
INDKLW = 4 ;- ИНИЦИАЛИЗАЦИЯ ДРАЙВЕРА КЛАВИАТУРЫ
CTKOD = 6 ;- ЧТЕНИЕ КОДА С КЛАВИАТУРЫ
; ВЫХОД: R0 - КОД В МЛ. БАЙТЕ
CTSTR = 10 ;- ЧТЕНИЕ СТРОКИ С КЛАВИАТУРЫ
; ВХОД: R1 - АДРЕС БУФЕРА СТРОКИ
; R2 - ДЛИНА СТРОКИ (МЛ.Б.)
; - СИМВОЛ-ОГРАНИЧИТЕЛЬ (СТ.Б.)
USTKLC = 12 ;- УСТАНОВКА КЛЮЧЕЙ КЛАВИАТУРЫ
; ВХОД: R0 - НОМЕР КЛЮЧА
; R1 - АДРЕС ТЕКСТА КЛЮЧА
; TV-МОНИТОР
; ----------
INDMBK = 14 ;- ИНИЦИАЛИЗАЦИЯ DMBK
FSIM = 16 ;- ФОРМИРОВАНИЕ СИМВОЛА
; ВХОД: R0 - КОД СИМВОЛА В МЛ.Б.
FSTR = 20 ;- ФОРМИРОВАНИЕ СТРОКИ
; ВХОД: R1 - АДРЕС СТРОКИ
; R2 - ДЛИНА СТРОКИ (МЛ.Б.)
; - СИМВОЛ-ОГРАНИЧИТЕЛЬ (СТ.Б.)
ZSIMSS = 22 ;- ЗАПИСЬ СИМВОЛА В СЛУЖЕБНУЮ СТРОКУ
; ВХОД: R0 - КОД СИМВОЛА (0-СБРОС СТРОКИ)
; R1 - НОМЕР ПОЗИЦИИ В СС
USTKK = 24 ;- УСТАНОВКА КУРСОРА ПО КООРДИНАТАМ
; ВХОД: R1 - КООРДИНАТА X
; R2 - КООРДИНАТА Y
SEMKK = 26 ;- С'ЕМ КООРДИНАТ КУРСОРА
; ВЫХОД: R1 - КООРДИНАТА X
; R2 - КООРДИНАТА Y
FTCK = 30 ;- ФОРМИРОВАНИЕ ТОЧКИ
; ВХОД: R0 - 1-ЗАПИСЬ, 0-СТИРАНИЕ
; R1 - КООРДИНАТА X
; R2 - КООРДИНАТА Y
FWEKT = 32 ;- ФОРМИРОВАНИЕ ВЕКТОРА
; ВХОД: R0 - 1-ЗАПИСЬ, 0-СТИРАНИЕ
; R1 - КООРДИНАТА X
; R2 - КООРДИНАТА Y
CTSSD = 34 ;- ЧТЕНИЕ СЛОВА СОСТОЯНИЯ ДИСПЛЕЯ
; ВЫХОД: R0 - СЛОВО СОСТ. ДИСПЛ.
; МАГНИТОФОН
; ----------
DMAG = 36 ;- ДРАЙВЕР МАГНИТОФОНА
; ВХОД: R1 - АДРЕС БЛОКА ПАРАМЕТРОВ
; TLG-КАНАЛ
; ---------
INDTLG = 40 ;- ИНИЦИАЛИЗАЦИЯ ДРАЙВЕРА ТЛГ-КАНАЛА
; ВХОД: R0 - НОМЕР СКОРОСТИ
PDBYT = 42 ;- ПЕРЕДАЧА БАЙТА
; ВХОД: R0 - МЛ.Б. НА ПЕРЕДАЧУ
PRBYT = 44 ;- ПРИЕМ БАЙТА
; ВЫХОД: R0 - МЛ.Б. ПРИНЯТ
PDMAS = 46 ;- ПЕРЕДАЧА МАССИВА
; ВХОД: R1 - АДРЕС МАССИВА
; R2 - ДЛИНА МАССИВА
PRMAS = 50 ;- ПРИЕМ МАССИВА
; ВХОД: R1 - АДРЕС БУФЕРА МАССИВА
; R2 - ДЛИНА МАССИВА
; РЕЗЕРВ
; ------
RW1 = 52
RW2 = 54
RW3 = 56
RW4 = 60
RW5 = 62
RW6 = 64
RW7 = 66
RW8 = 70
RW9 = 72
RW10 = 74
RW11 = 76
RW12 = 100
RW13 = 102
RW14 = 104
RW15 = 106
RW16 = 110
; ======================
; *** КОНСТАНТЫ DMBK ***
; ======================
AWPZAW = 4 ;- АДР.ВЕКТ.ПРЕР. ПО ЗАВИСАНИЮ
AWPEMT = 30 ;- АДР.ВЕКТ.ПРЕР. ПО КОМАНДЕ ЕМТ
APORT = 177714 ;- АДРЕС ПОРТА
ASPORT = 177716 ;- АДРЕС СИСТЕМНОГО ПОРТА
; ============================
; **** ОБЛАСТЬ СВЯЗИ DMBK ****
; ============================
DMBK: JMP MNDMBK ;- ПЕРЕХОД НА МОНИТОР DMBK
; -------------------------------
; ** ВХОДЫ ДРАЙВЕРА КЛАВИАТУРЫ **
; -------------------------------
WIDKLW: .WORD MIDKLW ;- ВХОД ИНИЦИАЛИЗАЦИИ DKLAW
WCTKOD: .WORD MCTKOD ;- ВХОД ЧТЕНИЯ КОДА
WCTSTR: .WORD MCTSTR ;- ВХОД ЧТЕНИЯ СТРОКИ
WUKLC: .WORD MUKLC ;- ВХОД УСТАНОВКИ КЛЮЧЕЙ
; --------------------------------
; ** ВХОДЫ ДРАЙВЕРА TV-МОНИТОРА **
; --------------------------------
WIDMBK: .WORD MIDMBK ;- ВХОД ИНИЦИАЛИЗАЦИИ DMBK
WFSIM: .WORD MFSIM ;- ВХОД ФОРМИРОВАНИЯ СИМВОЛА
WFSTR: .WORD MFSTR ;- ВХОД ФОРМИРОВАНИЯ СТРОКИ
WZSSS: .WORD MZSSS ;- ВХОД ЗАПИСИ СИМВОЛА В СЛУЖ. СТРОКУ
WUSTKK: .WORD MUSTKK ;- ВХОД УСТАНОВКИ КООРДИНАТ КУРСОРА
WSKK: .WORD MSKK ;- ВХОД С'ЕМА КООРДИНАТ КУРСОРА
WFTCK: .WORD MFTCK ;- ВХОД ФОРМИРОВАНИЯ ТОЧКИ
WFWEKT: .WORD MFWEKT ;- ВХОД ФОРМИРОВАНИЯ ВЕКТОРА
WCTSSD: .WORD MCTSSD ;- ВХОД ЧТЕНИЯ ССД
; --------------------------------
; ** ВХОДЫ ДРАЙВЕРА МАГНИТОФОНА **
; --------------------------------
WDMAG: .WORD MDMAG ;- ВХОД ЗАПИСИ/ЧТЕНИЯ МАССИВА
; -------------------------------
; ** ВХОДЫ ДРАЙВЕРА ТЛГ-КАНАЛА **
; -------------------------------
WIDTLG: .WORD MIDTLG ;- ВХОД ИНИЦИАЛИЗАЦИИ DTLG
WPDBYT: .WORD MPDBYT ;- ВХОД ПЕРЕДАЧИ БАЙТА
WPRBYT: .WORD MPRBYT ;- ВХОД ПРИЕМА БАЙТА
WPDMAS: .WORD MPDMAS ;- ВХОД ПЕРЕДАЧИ МАССИВА
WPRMAS: .WORD MPRMAS ;- ВХОД ПРИЕМА МАССИВА
; --------------------------
; ** РЕЗЕРВНЫЕ ВХОДЫ DMBK **
; --------------------------
RWDM1: .WORD 160000
RWDM2: .WORD 160004
RWDM3: .WORD 160010
RWDM4: .WORD 160014
RWDM5: .WORD 160020
RWDM6: .WORD 160024
RWDM7: .WORD 160030
RWDM8: .WORD 160034
RWDM9: .WORD 160040
RWDM10: .WORD 160044
RWDM11: .WORD 160050
RWDM12: .WORD 160054
RWDM13: .WORD 160060
RWDM14: .WORD 160064
RWDM15: .WORD 160070
RWDM16: .WORD 160074
; ==============================
; ***** ДИСПЕТЧЕР Е М Т *****
; ==============================
DEMT: MOV R5,-(SP)
MOV 2(SP),R5 ; АДРЕС МОДУЛЯ
MOV -(R5),R5
BIC #177400,R5
MOV DMBK(R5),R5
JSR PC,(R5) ; ОБРАЩЕНИЕ К МОДУЛЮ
MOV (SP)+,R5
RTI
; =====================================
; ***** МОДУЛЬ ИНИЦИАЛИЗАЦИИ DMBK *****
; =====================================
MIDMBK: CLR R1 ; УСТАНОВКА ВЕКТОРОВ
MOV #20,R2
1$: MOV #100000,(R1)+
SOB R2,1$
MOV #MNZAW,@#AWPZAW
MOV #DEMT,@#AWPEMT
MOV #200,@#AWPEMT+2
MOV #120,R2 ; СБРОС ПРИЗНАКОВ
2$: CLR (R1)+
SOB R2,2$
EMT INDKLW ;- ИНИЦИАЛИЗАЦИЯ DKLAW
INC DSIMB ;- ИНИЦИАЛИЗАЦИЯ DTVM
INCB NMPGT
COM MASCW
COM MCWSS
JSR PC,PPRP1
MOV #KDBIT0,DLBIT0 ;- ИНИЦИАЛИЗАЦИЯ DMAG
MOV #KDBIT1,DLBIT1
CLR R0
EMT INDTLG ;- ИНИЦИАЛИЗАЦИЯ DTLG
CLR @#APORT ;- СБРОС ПОРТА
MOV #220,@#ASPORT ;- УСТАНОВКА СИСТЕМНОГО ПОРТА
MTPS R0 ;- РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ
RTS PC
; ======================================
; ***** М О Н И Т О Р D M B K *****
; ======================================
MNDMBK: MOV #1000,SP ;- УСТАНОВКА СТЕКА
JSR PC,MIDMBK
JSR PC,@#120000 ;- ЗАПУСК ФОКАЛА
JSR PC,MIDMBK ;- ВЫХОД ИЗ ФОКАЛА
MNKOM: JSR R5,PPCT ;- "МОНИТОР БК-0010"
.WORD TMON
MNKOM1: JSR R5,PPCT ;- ">"
.WORD TPRIGL
MOV SP,R1 ; ПРИЕМ КОМАНДЫ
SUB #100,R1
MOV R1,R5
2$: EMT CTKOD
CMPB R0,#30 ;- АНС
BNE 1$
CMP R5,R1
BEQ 2$
3$: CLR (R5)+
4$: EMT FSIM
BR 2$
1$: MOV R0,-(R5) ;- ЗАПИСЬ КОДА В БУФЕР
TSTB R5
BEQ 3$
CMPB R0,#12 ;- "ПС"
BNE 4$
EMT FSIM
MOV -(R1),R4 ; ЧТЕНИЕ КОМАНДЫ
CLR R5 ;- ЧИСЛО
MOV R4,R3
7$: CMP R3,R0 ;- "ПС"
BEQ 5$
CMP R3,#67 ;- ЦИФРА
BHI 6$
SUB #60,R3
BMI 6$
ASL R5
ASL R5
ASL R5
ADD R3,R5
6$: MOV -(R1),R3 ;- ЧТЕНИЕ СЛЕД.СИМВ.
BR 7$
5$: BIC #240,R4 ; АНАЛИЗ КОМАНДЫ
CMPB R4,#124 ;- "T"
BHI 10$
SUB #114,R4 ;- "L"
BMI 11$
ASL R4
MOV MNKOMT(R4),R1 ; ПЕРЕДАЧА УПРАВЛЕНИЯ
JSR PC,(R1)
BR MNKOM1
11$: ADD #13,R4 ;- A : K
BPL MNDMBK
BR MNKOM1
10$: JSR PC,@#160110 ;- > T
BR MNKOM1
MNKOMT: .WORD PCTTLG ;- "L"
.WORD PCTMAG ;- "M"
.WORD 160110 ;- "N"
.WORD 160110 ;- "O"
.WORD 140000 ;- "P"
.WORD 160110 ;- "Q"
.WORD 160104 ;- "R"
.WORD PSTART ;- "S"
.WORD 160100 ;- "T"
; -----------------------------------
; ** 0. ОБРАБОТКА ЗАВИСАНИЯ И СТОП **
; -----------------------------------
MNZAW: MOV #1000,SP
MOV #220,@#ASPORT
EMT INDKLW
BR MNKOM
; -----------------------------
; ** 1. ЧТЕНИЕ ФАЙЛА С ЛИНИИ **
; -----------------------------
PCTTLG: EMT PRBYT ; УСТАНОВКА СВЯЗИ
EMT PDBYT
MOV #BUFSTA,R1 ; ПРИЕМ АДРЕСА И ДЛИНЫ
MOV #4,R2
EMT PRMAS
TST R5
BEQ 1$
MOV R5,BUFSTA
1$: MOV BUFSTA,R1 ; ПРИЕМ МАССИВА
MOV BUFDL,R2
EMT PRMAS
JSR R5,PPCT ;- ПЕЧАТЬ СООБЩЕНИЯ
.WORD TFZ
RTS PC
; -----------------------------------
; ** 2. ЧТЕНИЕ ФАЙЛА С МАГНИТОФОНА **
; -----------------------------------
PCTMAG: MOV #BPDMAG,R1 ; ЗАГРУЗКА BPDMAG
MOV #3,(R1)+ ;- КОМАНДА
MOV R5,(R1)+ ;- АДРЕС
CLR (R1)+ ;- ДЛИНА
JSR R5,PPCT ;- "ИМЯ ФАЙЛА?"
.WORD TIMF
MOV #5020,R2
EMT CTSTR
DEC R1
2$: MOVB #40,(R1)+
DEC R2
BPL 2$
1$: MOV #BPDMAG,R1 ; ЧТЕНИЕ ФАЙЛА
EMT DMAG
MOVB 1(R1),R0 ; АНАЛИЗ ОТВЕТА
BEQ 4$
DEC R0
BNE 3$
JSR PC,5$ ;- ПЕЧАТЬ ИМ. ТЕК. ФАЙЛА
MOV #12,R0
EMT FSIM
BR 1$
3$: JSR R5,PPCT ;- "*ОШИБКА*"
.WORD TOH
BR KCTMAG
4$: JSR R5,PPCT ;- "ЗАГРУЖЕН ФАЙЛ "
.WORD TZF
5$: ADD #32,R1
MOV #20,R2
EMT FSTR
KCTMAG: RTS PC
; --------------
; ** 3. СТАРТ **
; --------------
PSTART: TST R5
BNE 1$
MOV BUFSTA,R5 ;- СТАРТОВЫЙ АДРЕС
1$: JSR PC,(R5)
RTS PC
; ----------------------
; ** 4. ПЕЧАТЬ ТЕКСТА **
; ----------------------
PPCT: MOV (R5)+,R3
BR 1$
2$: EMT FSIM
1$: MOVB (R3)+,R0
BNE 2$
RTS R5
; =====================
; *** ДАННЫЕ MNDMBK ***
; =====================
TMON: .BYTE 12,355,357,356,351,364,357,362,40 ; МОНИТОР БК-0010
.BYTE 342,353,55,60,60,61,60,0
TPRIGL: .BYTE 12,12,76,40,0 ; >
TIMF: .BYTE 351,315,321,40,306,301,312,314,301,77,40,0 ; ИМЯ ФАЙЛА?
TZF: .BYTE 12,372,301,307,322,325,326,305,316,40 ; ЗАГРУЖЕН ФАЙЛ
.BYTE 306,301,312,314,40,0
TFZ: .BYTE 12,346,301,312,314,40 ; ФАЙЛ ЗАГРУЖЕН
.BYTE 332,301,307,322,325,326,305,316,0
TOH: .BYTE 12,52,357,373,351,342,353,341,52,0 ; *ОШИБКА*
.EVEN

View File

@ -0,0 +1,461 @@
; **********************************************
; * *
; * Д Р А Й В Е Р К Л А В И А Т У Р Ы *
; * *
; **********************************************
; =======================
; *** КОНСТАНТЫ DKLAW ***
; =======================
AWPKL1 = 60 ;- АДРЕС ВЕКТОРА ПР. КЛАВ.1
AWPKL2 = 274 ;- АДРЕС ВЕКТОРА ПР. КЛАВ.2
ARSKL = 177660 ;- АДРЕС РЕГ.СОСТОЯНИЯ КЛАВ.
ARDKL = 177662 ;- АДРЕС РЕГ.ДАННЫХ КЛАВ.
ASPORT = 177716 ;- АДРЕС СИСТЕМНОГО ПОРТА
APRWK = 262 ;- АДРЕС ПРИЗНАКА ВК
KPOWTS = 20000 ;- КОНСТАНТА ПОВТОРА СИМВОЛА
KPOWTG = 4000 ;- КОНСТАНТА ПОВТОРА ГТ
; ======================================
; ***** МОДУЛЬ ИНИЦИАЛИЗАЦИИ DKLAW *****
; ======================================
MIDKLW: MOV #BCTKW1,@#AWPKL1 ;- УСТ. ВКЛ1
MOV #200,@#AWPKL1+2
MOV #BCTKW2,@#AWPKL2 ;- УСТ. ВКЛ2
MOV #200,@#AWPKL2+2
CLR APOPKL ;- СБРОС РЕЖИМА ПРЕРЫВАНИЯ
CLR PRWK ;- СБРОС ПРИЗНАКА КОДА ВК
CLR @#ARSKL ;- СБРОС МАСКИ ПРЕРЫВАНИЯ
RTS PC
; ==============================
; ***** МОДУЛЬ ЧТЕНИЯ КОДА *****
; ==============================
MCTKOD: ;ВЫХОД: R0 - КОД В МЛ.БАЙТЕ
; =================================
; *** 1. БЛОК УПРАВЛЕНИЯ MCTKOD ***
; =================================
BUMCTK: MOV @#ARDKL,R0 ;- ФИКТИВНОЕ ЧТЕНИЕ КЛАВ.
1$: TSTB PRZKB ; ЧТЕНИЕ КОДА С КЛАВИАТУРЫ
BEQ 2$
CLR R0
BISB BUFKL,R0
CLRB PRZKB ;- РАЗРЕШЕНИЕ ЗАПИСИ КОДА В БУФЕР
RTS PC
2$: TSTB SCKLC ; КЛЮЧ
BEQ 3$
JSR PC,PZKKLC
BR 1$
3$: TSTB SCTAB ; ТАБУЛЯЦИЯ
BEQ 4$
JSR PC,PZKTAB
BR 1$
4$: TSTB PRPOWT ; ПОВТОР
BEQ 5$
JSR PC,PPOWT
BR 1$
5$: MTPS #0 ;- РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ
BR 1$
; ========================================
; *** 2. БЛОК ЧТЕНИЯ КОДА ПО ВЕКТОРУ 1 ***
; ========================================
BCTKW1: JSR R4,PSREG0
MOV R5,-(SP)
JSR PC,PCTK ; ЧТЕНИЕ КОДА
CMPB R0,#20 ; КОДЫ РЕЖИМОВ КЛАВ.
BHI 1$
MOV R0,R1 ; ВЫБОР КОДА
SUB #12,R1
BMI 2$
ASL R1
ADD R1,PC
BR 3$
BR 2$
BR 2$
BR 4$
BR 5$
BR 6$
BR 7$
3$: TST @#APRWK ; ПС
BEQ 2$
MOV #15,R0
BR 2$
5$: MOVB #200,PRRUS ; РУС
BR 9$
6$: CLRB PRRUS ; ЛАТ
9$: CLR R0
CLR SCKOD
JSR PC,PFINDR
BR KCTKW1
7$: CLR R3 ;- СБР. ТАБ.
4$: JSR PC,PUTAB ;- УСТ. ТАБ.
BR KCTKW1
1$: CMPB R0,#77 ; МОДИФ. КОДА
BLOS 2$
BISB PRRUS,R0
2$: JSR PC,PZKBUF ; ЗАПИСЬ КОДА В БУФЕР
KCTKW1: MOV (SP)+,R5
JSR R4,PWREG
RTI
; ------------------------------
; ** 2.1. УСТАНОВКА ТАБУЛЯЦИИ **
; ------------------------------
PUTAB: JSR PC,POPSIM ; ОПРЕД. ПОЗ. СИМВОЛА
TST R3 ; УСТ. ТАБ.
BEQ 1$
BIS R0,MTAB(R1)
BR 2$
1$: BIC R0,MTAB(R1) ; СБР. ТАБ.
2$: JSR PC,PFINDT ; УСТАНОВКА ИНДИК.ТАБ.
RTS PC
; ========================================
; *** 3. БЛОК ЧТЕНИЯ КОДА ПО ВЕКТОРУ 2 ***
; ========================================
BCTKW2: JSR R4,PSREG0
MOV R5,-(SP)
JSR PC,PCTK ; ЧТЕНИЕ И МОДИФ. КОДА
BISB #200,R0
CMPB R0,#277 ; КОДЫ ПОЛУГРАФИКИ
BLOS 1$
BICB #100,R0
BISB #40,R0
BR 2$
1$: CMPB R0,#271 ; КЛЮЧИ
BHI 3$
MOV R0,R1
SUB #260,R1
BMI 3$
TSTB SCKLC
BNE KCTKW2
ASL R1
MOV AKLC(R1),TAKLC ;- ЗАПУСК КЛЮЧА
BEQ KCTKW2
MOVB @TAKLC,SCKLC
INC TAKLC
JSR PC,PZKLC1
BR KCTKW2
3$: CMPB R0,#237 ; КОДЫ РЕЖИМОВ ДИСПЛЕЯ
BLOS 4$
BICB #40,R0
BISB #20,R0
CMPB R0,#232 ;- ГАШ. К.
BEQ 8$
CMPB R0,#235 ;- ИНВ. Э.
BEQ 8$
CMPB R0,#236 ;- УСТ.ИНД.
BNE 2$
8$: EMT FSIM ;- ИСУ,БЛР,ГАШ.К,ИНВ.Э,УСТ.ИНД
BR KCTKW2
4$: CMPB R0,#211 ; ТАБ
BLO 5$
BNE 6$
JSR PC,PTAB
BR KCTKW2
5$: CMPB R0,#204 ; БЛР,ИСУ
BHI 7$
CMPB R0,#201 ; ПОВТОР
BHI 8$
BNE 7$
INCB PRPOWT
JSR PC,PPOWT1
BR KCTKW2
7$: BIS #20,R0 ; ГРАФ. КОДЫ И ШАГ
BR 2$
6$: CMPB R0,#212 ; ОСТАНОВ
BNE 9$
10$: TSTB @#ARSKL
BPL 10$
JSR PC,PCTK
BR KCTKW2
9$: CMPB R0,#213 ; СБР.К.СТР.
BNE 2$
MOV #231,R0
2$: JSR PC,PZKBUF ; ЗАПИСЬ КОДА В БУФЕР
KCTKW2: MOV (SP)+,R5
JSR R4,PWREG
RTI
; ----------------------------
; ** 3.1. ЗАПИСЬ КОДА КЛЮЧА **
; ----------------------------
PZKKLC: MOVB @TAKLC,R0
JSR PC,PZKBUF
INC TAKLC
DECB SCKLC
BEQ KZKKLC
PZKLC1: TST @#APOPKL ;- РЕЖИМ ПРЕР.
BNE PZKKLC
KZKKLC: RTS PC
; --------------------
; ** 3.2. ТАБУЛЯЦИЯ **
; --------------------
PTAB: JSR PC,POPSIM ; ОПРЕД. ПОЗ. СИМВ.
MOVB #1,SCTAB ; ПОИСК ПОЗИЦИИ
ASL R0
BCS 1$
2$: BIT R0,MTAB(R1)
BNE PZKT1
INCB SCTAB
ASL R0
BCC 2$
1$: ADC R0 ; ИЗМЕНЕНИЕ АДР. СЛОВА
ADD #2,R1
CMP R1,#4
BLO 2$
TSTB PRCW
BNE PZKT1
CMP R1,#10
BNE 2$
PZKT1: TST @#APOPKL ; ЗАПИСЬ КОДА ТАБУЛЯЦИИ
BEQ KTAB
PZKTAB: MOV #40,R0
JSR PC,PZKBUF
DECB SCTAB
BNE PZKT1
KTAB: RTS PC
; -----------------
; ** 3.3. ПОВТОР **
; -----------------
PPOWT: JSR PC,PZKB1
MOV BKPOWT,R0 ;- ЗАДЕРЖКА
1$: SOB R0,1$
BIT #100,@#ASPORT ;- ПРОВЕРКА РЕЖ. ПОВТ.
BEQ PPOWT1
CLRB PRPOWT
BR KPOWT
PPOWT1: TST @#APOPKL ;- РЕЖИМ ПРЕР.
BNE PPOWT
KPOWT: RTS PC
; ================================
; ***** МОДУЛЬ ЧТЕНИЯ СТРОКИ *****
; ================================
; ВХОД: R1 - АДРЕС СТРОКИ
; R2 - ДЛИНА СТРОКИ (МЛ.Б.),СИМВ.ОГРАНИЧ.(СТ.Б.)
MCTSTR: MOV R0,-(SP)
MOV R2,R5 ; ПОДГОТОВКА ОГРАНИЧ.
SWAB R5
BIC #177400,R2
MOV R2,-(SP)
1$: EMT CTKOD ; ЧТЕНИЕ СИМВОЛА
CMPB R0,#30 ;- АНС
BNE 2$
CMP R2,(SP)
BEQ 1$
DEC R1
ADD #2,R2
BR 3$
2$: MOVB R0,(R1)+
3$: EMT FSIM
CMPB R0,R5 ; ПРОВЕРКА ОГРАНИЧ.
BEQ KCTSTR
SOB R2,1$
KCTSTR: MOV (SP)+,R0
MOV (SP)+,R0
RTS PC
; ===================================
; ***** МОДУЛЬ УСТАНОВКИ КЛЮЧЕЙ *****
; ===================================
; ВХОД: R0 - НОМЕР КЛЮЧА
; R1 - АДРЕС ТЕКСТА КЛЮЧА
MUKLC: TST R0 ; ПРОВЕРКА НОМЕРА КЛЮЧА
BLE KUKLC
CMP R0,#12
BHI KUKLC
BNE 1$
CLR R0
1$: ASL R0
MOV R1,AKLC(R0) ; УСТАНОВКА КЛЮЧА
KUKLC: RTS PC
; ======================================
; **** БИБЛИОТЕКА ПОДПРОГРАММ DKLAW ****
; ======================================
; ----------------------
; ** 0.1. ЧТЕНИЕ КОДА **
; ----------------------
PCTK: TST SCUIND ; УСТ. ИНДИКАТОРОВ
BEQ 4$
JSR PC,PUINDR
4$: MOV #177777,SCKOD
PSIGN: MOV #50,R2 ; СИГНАЛ
MOV #100,R3
3$: MOV #320,@#ASPORT ;- 1
MOV R3,R0
1$: SOB R0,1$
MOV #220,@#ASPORT ;- 0
MOV R3,R0
2$: SOB R0,2$
DEC R3
SOB R2,3$
MOV @#ASPORT,R0 ;- СБРОС ПРИЗН. СТОП
MOVB @#ARDKL,R0 ;- ЧТЕНИЕ КОДА
RTS PC
; ------------------------------
; ** 0.2. ЗАПИСЬ КОДА В БУФЕР **
; ------------------------------
PZKBUF: TSTB PRZKB ; ЗАПИСЬ КОДА В БУФ.
BNE PZKB2
MOVB R0,BUFKL
PZKB1: INCB PRZKB
PZKB2: MOV @#APOPKL,R5 ; ПЕРЕДАЧА УПР. ПО ПРЕРЫВАНИЮ
BEQ KZKBUF
JSR PC,(R5)
KZKBUF: RTS PC
; -----------------------------------------------
; ** 0.3. ОПРЕДЕЛЕНИЕ ПОЗИЦИИ СИМВОЛА В СТРОКЕ **
; -----------------------------------------------
POPSIM: MOV NOMSIM,R1 ; ПОДГ. СЧ. ПОЗ.
BIC #177700,R1
TSTB PRCW
BEQ 1$
ASR R1
1$: MOV R1,R2 ; ОПРЕД. ПОЗ. В СЛОВЕ
BIC #177760,R2
INC R2
CLR R0
SEC
2$: ROL R0
SOB R2,2$
BIC #177717,R1 ; ОПРЕД. СЛОВА
ASR R1
ASR R1
ASR R1
RTS PC

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,820 @@
; ======================================
; ***** МОДУЛЬ ФОРМИРОВАНИЯ СТРОКИ *****
; ======================================
; ВХОД: R1 - АДРЕС СТРОКИ
; R2 - ДЛИНА СТРОКИ (МЛ.Б.)
; - СИМВОЛ - ОГРАНИЧИТЕЛЬ (СТ.Б.)
MFSTR: MOV R0,-(SP)
MOV R3,-(SP)
MOV R2,R3 ; ПОДГОТОВКА ОГРАНИЧИТЕЛЕЙ
SWAB R3
BIC #177400,R2
1$: MOVB (R1)+,R0 ; ЗАПИСЬ СТРОКИ
JSR PC,MFSIM
CMPB R0,R3
BEQ KMFSTR
SOB R2,1$
KMFSTR: MOV (SP)+,R3
MOV (SP)+,R0
RTS PC
; ======================================
; ***** МОДУЛЬ ЗАПИСИ СИМВОЛА В СС *****
; ======================================
; ВХОД: R0 - КОД СИМВОЛА (0 - СБРОС СТРОКИ)
; R1 - НОМЕР ПОЗИЦИИ В СС
MZSSS: JSR R4,PSREG
TST R0
BNE 1$
JSR PC,PFSSTR ; СБРОС СС
BR KMZSSS
1$: CMPB R0,#177 ; ПОДГОТ. АДР. ИЗОБРАЖ.
BHI 3$
CMPB R0,#10
BNE 4$
MOV #21,R0
4$: SUB #20,R0
BMI KMZSSS
BR 5$
3$: CMPB R0,#237
BLOS KMZSSS
SUB #60,R0
5$: JSR PC,PFSSS ; ФОРМИРОВАНИЕ СИМВОЛА
KMZSSS: JSR R4,PWREG
RTS PC
; ----------------------------------
; ** 1. ФОРМИРОВАНИЕ СИМВОЛА В СС **
; ----------------------------------
PFSSS: MOV R1,-(SP) ; R0 - СМЕЩЕНИЕ ИЗОБРАЖЕНИЯ
MOV R2,-(SP) ; R1 - НОМЕР ПОЗИЦИИ В СТРОКЕ
TSTB PRCW ; ПОДГ. АДР.
BEQ 1$
ASL R1
1$: BIC #177700,R1
ADD BAZVP,R1
SUB #1700,R1
BIC #140000,R1
ADD ANVP,R1
MOV AS,-(SP) ; ФОРМИРОВАНИЕ СИМВОЛА
MOV R1,AS
BIC #177400,R0
JSR PC,PFSIM
MOV (SP)+,AS
KFSSS: MOV (SP)+,R2
MOV (SP)+,R1
RTS PC
; ==============================================
; ***** МОДУЛЬ УСТАНОВКИ КООРДИНАТ КУРСОРА *****
; ==============================================
; ВХОД: R1 - КООРДИНАТА X
; R2 - КООРДИНАТА Y
MUSTKK: JSR R4,PSREG
JSR PC,PSTK
MOV 2(SP),R1
MOV 4(SP),R2
TSTB PRCW ; ПОДГ. КООРД. X
BEQ 1$
ASL R1
1$: MOV #6,R0 ; ПОДГ. КООРД. Y
2$: ASL R2
SOB R0,2$
TSTB PRGRAF
BNE PUKGK
; ------------------------------------------------
; ** 1. УСТАНОВКА КООРДИНАТ СИМВОЛЬНОГО КУРСОРА **
; ------------------------------------------------
PUKSK: BIC #177700,R1 ; ПОДГ. КООРД. X
1$: SUB KSVP,R2 ; ПОДГ. КООРД. Y
BPL 1$
2$: ADD KSVP,R2
BMI 2$
ADD R1,R2 ; ФОРМ. АДР. СИМВОЛА
MOV R2,NOMSIM
CLR R5
JSR PC,PFASIM
BR KUSTKK
; -------------------------------------------------
; ** 2. УСТАНОВКА КООРДИНАТ ГРАФИЧЕСКОГО КУРСОРА **
; -------------------------------------------------
PUKGK: BIC #177000,R1 ; ПОДГ. КООРД. X
1$: MOV R1,R3
ASR R1
ASR R1
ASR R1
MOVB NMPGT,R0 ; ПОДГ. MASPGT
BIC #177770,R3
BEQ 2$
3$: ASL R0
SOB R3,3$
2$: MOVB R0,MASPGT
4$: SUB DGPB,R2 ; ПОДГ. КООРД. Y
BPL 4$
5$: ADD DGPB,R2
BMI 5$
ADD R1,R2 ; ВЫЧИСЛЕНИЕ AGTVP
MOV R2,AGTVP
CLR R1 ; ВЫЧ. AGT
CLR R2
JSR PC,PFAGT
KUSTKK: JSR PC,PFK
JSR R4,PWREG
RTS PC
; ==========================================
; ***** МОДУЛЬ С'ЕМА КООРДИНАТ КУРСОРА *****
; ==========================================
; ВЫХОД: R1 - КООРДИНАТА X
; R2 - КООРДИНАТА Y
MSKK: MOV R0,-(SP)
TSTB PRGRAF
BNE PSKGK
; -------------------------------------------
; ** 1. С'ЕМ КООРДИНАТ СИМВОЛЬНОГО КУРСОРА **
; -------------------------------------------
PSKSK: MOV NOMSIM,R1 ; КООРД. X
MOV R1,R2
BIC #177700,R1
BR PSK1
; --------------------------------------------
; ** 2. С'ЕМ КООРДИНАТ ГРАФИЧЕСКОГО КУРСОРА **
; --------------------------------------------
PSKGK: MOV AGTVP,R1 ; КООРД. X
MOV R1,R2
BIC #177700,R1
ASL R1
ASL R1
ASL R1
MOVB MASPGT,R0
2$: ASR R0
BCS PSK1
INC R1
BR 2$
PSK1: TSTB PRCW
BEQ 3$
ASR R1
3$: BIC #77,R2 ; КООРД. Y
MOV #6,R0
4$: ASR R2
SOB R0,4$
MOV (SP)+,R0
RTS PC
; =====================================
; ***** МОДУЛЬ ФОРМИРОВАНИЯ ТОЧКИ *****
; =====================================
; ВХОД: R0 - 1-ЗАПИСЬ, 0-СТИРАНИЕ
; R1 - КООРДИНАТА X
; R2 - КООРДИНАТА Y
MFTCK: MOV R1,BUFX ; СОХР. КООРД.
MOV R2,BUFY
MOVB R0,PRZTCK
MFTCK1: JSR R4,PSREG ; СОХР. РЕГ.
TSTB PRCW ; ПОДГ. КООРД. X
BEQ 1$
ASL R1
BCS KMFTCK
1$: CMP R1,#1000
BHIS KMFTCK
MOV #6,R0 ; ПОДГ. КООРД. Y
2$: ASL R2
BCS KMFTCK
SOB R0,2$
CMP R2,DGPB
BHIS KMFTCK
MOV R1,R3 ; ФОРМ. АДР. ТОЧКИ
ASR R1
ASR R1
ASR R1
ADD R2,R1
ADD BAZVP,R1
BIC #140000,R1
ADD ANVP,R1
MOVB NMPGT,R2 ; ФОРМИРОВАНИЕ МАСКИ ТОЧКИ
BIC #177770,R3
BEQ 3$
4$: ASL R2
SOB R3,4$
3$: MOVB (R1),R0 ; ФОРМИРОВАНИЕ ТОЧКИ
BICB R2,R0
MOV MASCW,R3
TSTB PRZTCK
BNE 5$
MOV FON,R3
5$: COM R2
BIC R2,R3
BISB R3,R0
MOVB R0,(R1)
KMFTCK: JSR R4,PWREG ; ВОССТ. РЕГ.
RTS PC
; =======================================
; ***** МОДУЛЬ ФОРМИРОВАНИЯ ВЕКТОРА *****
; =======================================
; ВХОД: R0 - 1-ЗАПИСЬ, 0-СТИРАНИЕ
; R1 - КООРДИНАТА X
; R2 - КООРДИНАТА Y
MFWEKT: JSR R4,PSREG
MOVB R0,PRZTCK
MOV R1,R3 ; ЗАМЕНА КООРДИНАТ
MOV R2,R4
MOV BUFX,R1
MOV BUFY,R2
MOV R3,BUFX
MOV R4,BUFY
CLR R0 ; ОПРЕД. DX И НАПРАВЛЕНИЯ
SUB R1,R3
BMI 1$
BEQ 2$
INC R0
BR 2$
1$: DEC R0 ;- НАПРАВЛЕНИЕ
NEG R3 ;- DX
2$: CLR R5 ; ОПРЕД. DY И НАПРАВЛЕНИЯ
SUB R2,R4
BMI 3$
BEQ 4$
INC R5
BR 4$
3$: DEC R5 ;- НАПРАВЛЕНИЕ
NEG R4 ;- DY
4$: CMP R4,R3 ; ОПРЕД. ДЛИННОЙ КООРД.
BHI 5$
MOV R5,-(SP) ;- DX >= DY
CLR -(SP)
MOV R3,R5
MOV R4,R3
MOV R5,R4 ;- R4 - ДЛИННАЯ КООРД.
CLR R5
BR 6$
5$: CLR -(SP) ;- DX < DY
MOV R0,-(SP)
CLR R0 ;- R0,R5 - DСЕГМ. (SP) - DКООРД.
6$: CLR -(SP) ; ОПРЕД. ПАРАМ. ВЕКТОРА
TST R3
BNE 7$
INC R3 ;- ОСЕВОЙ ВЕКТОР
SUB #12,SP
BR 8$
7$: SUB R3,R4 ;- ВЫЧИСЛЕНИЕ ДЛИНЫ СЕГМ.
BMI 9$
INC (SP) ;- ДЛИНА СЕГМЕНТА
BR 7$
9$: ADD R3,R4 ;- R3 - СЧ. СЕГМ. R4 - ОСТАТОК
MOV R3,-(SP) ;- КОЛИЧ. СЕГМ.
MOV R3,-(SP)
ASR (SP) ;- КОЛИЧ. СЕГМ./2
MOV R4,-(SP) ;- ОСТАТОК
CLR -(SP)
CLR -(SP)
CLR R4
11$: ADD 4(SP),2(SP) ; ОПРЕД. ДЛИНЫ СЕГМ.
BEQ 10$
CMP 2(SP),6(SP)
BLE 10$
INC R4
SUB 10(SP),2(SP)
10$: ADD 12(SP),R4
MOV R4,(SP)
ASR R4
SUB R4,(SP) ;- ДЛИНА 2-ГО ПОЛУСЕГМ.
JSR PC,PFSEGM ;- ФОРМ. 1-ГО ПОЛУСЕГМ.
ADD 14(SP),R1
ADD 16(SP),R2
MOV (SP),R4
8$: JSR PC,PFSEGM ;- ФОРМ. 2-ГО ПОЛУСЕГМ.
SOB R3,11$ ; КОНЕЦ ФОРМ. СЕГМ.
ADD #20,SP
JSR R4,PWREG
RTS PC
PFSEGM: TST R4 ; ФОРМИРОВАНИЕ СЕГМЕНТА
BEQ KFSEGM
1$: ADD R0,R1
ADD R5,R2
JSR PC,MFTCK1
SOB R4,1$
KFSEGM: RTS PC
; =============================
; ***** МОДУЛЬ ЧТЕНИЯ ССД *****
; =============================
; ВЫХОД: R0 - СЛОВО СОСТОЯНИЯ ДИСПЛЕЯ
MCTSSD: MOV R1,-(SP)
CLR R0 ; ПОДГ. ПАРАМ.
MOV #SYSPR,R1
1$: SEC ; УСТАНОВКА ФЛАЖКОВ
2$: ROR R0
BCS KCTSSD
TSTB (R1)+
BNE 1$
BR 2$
KCTSSD: MOV (SP)+,R1
RTS PC
; ======================================
; **** БИБЛИОТЕКА ПОДПРОГРАММ DTVMN ****
; ======================================
; -------------------------------
; ** 0.1. СОХРАНЕНИЕ РЕГИСТРОВ **
; -------------------------------
PSREG0: MOV #220,@#ASPORT ;- СБРОС ГТ. ТЛГ.
PSREG: MOV R3,-(SP)
MOV R2,-(SP)
MOV R1,-(SP)
MOV R0,-(SP)
MOV R4,-(SP)
RTS R4
; -----------------------------------
; ** 0.2. ВОССТАНОВЛЕНИЕ РЕГИСТРОВ **
; -----------------------------------
PWREG: MOV (SP)+,R0
MOV (SP)+,R0
MOV (SP)+,R1
MOV (SP)+,R2
MOV (SP)+,R3
RTS R4
; ----------------
; ** 0.3. СБРОС **
; ----------------
PSBR: JSR PC,PFINDT ; УСТ.ИНД.ТАБ.
CLR NOMSIM ; ФОРМ. AS
JSR PC,PFASIM
MOV FON,R0 ; СБРОС VP
MOV AS,R3
MOV DGPB,R2
ASR R2
1$: MOV R0,(R3)+
TST R3
BPL 2$
SUB DVPB,R3
2$: SOB R2,1$
PSBR1: CLR R5 ; ФОРМ. AGT
JSR PC,PFAGT1
CLR SCTVS
MOVB NMPGT,MASPGT
JSR PC,PFK ; ФОРМ. КУРСОРА
RTS PC
; ----------------------------------------
; ** 0.4. ФОРМИРОВАНИЕ СЛУЖЕБНОЙ СТРОКИ **
; ----------------------------------------
PFSSTR: JSR PC,PFINDT ; ФОРМ. ИНД. ТАБ.
MOV MCWSS,R1 ; ФОРМИР. ЧЕРТЫ
JSR PC,PZTVSW
MOV FONSS,R1 ; СБРОС ИНДИКАТОРОВ
MOV #KTVSSS-4,R4
1$: JSR PC,PZTVSW
SOB R4,1$
PUINDR: CLR R0 ; УСТАНОВКА ИНДИКАТОРОВ
CLR SCKOD
MOV #6,R2
2$: MOV R0,-(SP)
MOV R2,-(SP)
JSR PC,PFINDR
MOV (SP)+,R2
MOV (SP)+,R0
INC R0
SOB R2,2$
RTS PC
; -----------------------------------------
; ** 0.5. ФОРМИРОВАНИЕ ИНДИКАТОРА РЕЖИМА **
; -----------------------------------------
PFINDR: INC SCUIND ; УСТ. ПРИЗН. ФОРМ. ИНД.
TST SCKOD
BNE KFINDR
CLR SCUIND
MOV #PRRUS,R1 ; ВХОД: R0 - НОМЕР ИНД.
ADD R0,R1
ASL R0
ADD R0,PC
BR 1$
BR 2$
BR 3$
BR 4$
BR 5$
BR 6$
1$: MOV #LAT,R3 ; РУС/ЛАТ
TSTB (R1)
BEQ 7$
MOV #RUS,R3
BR 7$
2$: TSTB (R1) ; ПОДЧ.
BEQ 8$
MOV #PODC,R3
BR 7$
3$: TSTB (R1) ; ИНВ. С.
BEQ 8$
MOV #INW,R3
BR 7$
4$: TSTB (R1) ; ИНД. СУ
BEQ 8$
MOV #ISU,R3
BR 7$
5$: TSTB (R1) ; БЛОК. РЕД.
BEQ 8$
MOV #BLR,R3
BR 7$
6$: TSTB (R1) ; ГРАФ/ЗАП/СТИР
BEQ 8$
TSTB PRZAP
BEQ 9$
MOV #ZAP,R3
BR 7$
9$: MOV #GRAF,R3
TSTB PRSTIR
BEQ 7$
MOV #STIR,R3
BR 7$
8$: MOV #SBRIND,R3 ; СБРОС ИНДИК.
7$: ASL R0 ; ПОДГ. ПАРАМ. ИНД.
ADD #4,R0
MOV #100,R1
TSTB PRCWSS
BEQ 10$
ASR R1
10$: SUB R0,R1
MOV #4,R2
MOV FON,-(SP) ; СОХРАНЕНИЕ ПРИЗНАКОВ
MOV MASCW,-(SP)
MOV PRCW,-(SP)
MOV PRPODC,-(SP)
MOV FONSS,FON ; УСТАНОВКА ПРИЗНАКОВ СС
MOV MCWSS,MASCW
MOVB PRCWSS,PRCW
MOV PRPSSS,PRPODC
11$: MOVB (R3)+,R0 ; ФОРМИРОВАНИЕ ИНДИКАТОРА
MOV R3,-(SP)
JSR PC,PFSSS
MOV (SP)+,R3
INC R1
SOB R2,11$
MOV (SP)+,PRPODC ; ВОССТ. ПРИЗНАКОВ
MOV (SP)+,PRCW
MOV (SP)+,MASCW
MOV (SP)+,FON
KFINDR: RTS PC
; --------------------------------------------
; ** 0.6. ФОРМИРОВАНИЕ ИНДИКАТОРА ТАБУЛЯЦИИ **
; --------------------------------------------
PFINDT: MOV FONSS,R1 ; СБРОС ИНДИКАТОРА
MOV BAZVP,R3
ADD ANVP,R3
MOV #3,R4
10$: JSR PC,PZTVSW
SOB R4,10$
MOV #20,R4 ; УСТ. ДЛИНЫ СЛОВА
TSTB PRCW
BEQ 1$
ASL R4
1$: CLR R5 ; ПОИСК ПОЗИЦИИ ТАБУЛЯЦИИ
7$: CLR R2
MOV MTAB(R5),R0
4$: ROR R0
BCS 2$
BEQ 3$
6$: INC R2
BR 4$
2$: MOV R2,R1 ; УСТАНОВКА ИНДИКАТОРА
TSTB PRCW
BNE 5$
ADD R3,R1
MOVB MCWSS,(R1)
BR 6$
5$: ASL R1
ADD R3,R1
MOV MCWSS,(R1)
BR 6$
3$: ADD #2,R5 ; ИЗМЕНЕНИЕ АДРЕСОВ
ADD R4,R3
BIT #77,R3
BNE 7$
SUB #100,R3
RTS PC
; -------------------------------
; ** 0.7. ФОРМИРОВАНИЕ КУРСОРА **
; -------------------------------
PFK: ; ФОРМИР. И СТИР. КУРСОРА
PSTK: TSTB PRGRAF
BNE 1$
JSR PC,PFSK ; СИМВ. КУРСОР
MOV #KPOWTS,BKPOWT
BR KFK
1$: JSR PC,PFGK ; ГРАФ. КУРСОР
MOV #KPOWTG,BKPOWT
KFK: RTS PC
; ---------------------------------------------
; ** 0.8. РЕДАКТИРОВАНИЕ СИМВОЛЬНОГО КУРСОРА **
; ---------------------------------------------
PREDSK: JSR PC,PSTSK
CLR R5
JSR PC,PFASIM
JSR PC,PFSK
RTS PC
; ------------------------
; ** 0.9. СБРОС СИМВОЛА **
; ------------------------
PSBRS: MOV FON,R0 ; ПОДГ. ПАРАМ.
MOV AS,R3
MOV #12,R2
3$: TSTB PRCW ; ЗАПИСЬ ФОНА
BNE 1$
MOVB R0,(R3)
BR 2$
1$: MOV R0,(R3)
2$: JSR PC,PFTAN ; ИЗМЕНЕНИЕ АДР.
SOB R2,3$
RTS PC
; ---------------------------------------------
; ** 0.10. ФОРМИРОВАНИЕ ТЕКУЩЕГО АДРЕСА ВНИЗ **
; ---------------------------------------------
PFTAN: ADD #DTVSTB,R3
BPL KFTAN
SUB DVPB,R3
KFTAN: RTS PC
; --------------------------------------
; ** 0.11. ЗАПОЛНЕНИЕ TV-СТРОКИ ВВЕРХ **
; --------------------------------------
PZTVSW: MOV #DTVSTS,R2 ; R1 - ФОН, R3 - АДРЕС
CMP R3,ANVP
BHI 1$
ADD DVPB,R3
1$: MOV R1,-(R3)
SOB R2,1$
RTS PC
; -------------------------------------
; ** 0.12. ЗАПОЛНЕНИЕ TV-СТРОКИ ВНИЗ **
; -------------------------------------
PZTVSN: MOV #DTVSTS,R2 ; R1 - ФОН, R3 - АДРЕС
TST R3
BPL 1$
SUB DVPB,R3
1$: MOV R1,(R3)+
SOB R2,1$
RTS PC
; -----------------------
; ** 0.13. СДВИГ ВВЕРХ **
; -----------------------
PSDWW: MOV R1,R3 ; ПОДГОТОВКА АДРЕСОВ
SUB #DSSTRB,R3
CMP R3,ANVP
BHIS 1$
ADD DVPB,R3
1$: TST R2 ; ПОСЛЕДНЯЯ СТРОКА
BEQ PSBRSN
5$: MOV #DTVSTS,R4 ; СДВИГ
2$: MOV (R1)+,(R3)+
SOB R4,2$
TST R1
BPL 3$
SUB DVPB,R1
BR 4$
3$: TST R3
BPL 4$
SUB DVPB,R3
4$: SOB R2,5$
PSBRSN: MOV #KTVSS,R4 ; СБРОС СТРОКИ ВНИЗ
MOV FON,R1
1$: JSR PC,PZTVSN
SOB R4,1$
RTS PC
; ----------------------
; ** 0.14. СДВИГ ВНИЗ **
; ----------------------
PSDWN: MOV R1,R3 ; ПОДГ. АДРЕСОВ
ADD #DSSTRB,R3
CMP R1,ANVP
BHI 11$
ADD DVPB,R1
11$: CMP R3,#100000
BLOS 1$
SUB DVPB,R3
1$: TST R2 ; ПОСЛЕДНЯЯ СТРОКА
BEQ PSBRSW
5$: MOV #DTVSTS,R4 ; СДВИГ
2$: MOV -(R1),-(R3)
SOB R4,2$
CMP R1,ANVP
BHI 3$
ADD DVPB,R1
BR 4$
3$: CMP R3,ANVP
BHI 4$
ADD DVPB,R3
4$: SOB R2,5$
PSBRSW: MOV #KTVSS,R4 ; СБРОС СТРОКИ ВВЕРХ
MOV FON,R1
1$: JSR PC,PZTVSW
SOB R4,1$
RTS PC

View File

@ -0,0 +1,263 @@
; ======================
; **** トタヘヘロナ DTVMN ****
; ======================
; ----------------
; ** ネヘトネハタメホミロ **
; ----------------
LAT: .BYTE 20,274,261,304
RUS: .BYTE 20,302,305,303
PODC: .BYTE 300,277,264,316
INW: .BYTE 271,276,307,20
ISU: .BYTE 271,303,305,20
BLR: .BYTE 262,274,302,20
GRAF: .BYTE 267,302,261,266
ZAP: .BYTE 312,261,300,20
STIR: .BYTE 303,304,271,302
SBRIND: .BYTE 20,20,20,20
; -----------
; ** フタムハネ **
; -----------
MASPOZ: .WORD 177777 ; フタムハネ マホヌネヨネネ
.WORD 140000
.WORD 030000
.WORD 006000
.WORD 001400
.WORD 000300
.WORD 000060
.WORD 000014
.WORD 000003
KMASCW: .WORD 177777 ; フタムハネ ヨツナメタ (ハ/ヌ/ム/ラ)
.WORD 125252
.WORD 052525
.WORD 000000
; --------------------------
; ** ネヌホチミタニナヘネナ ムネフツホヒホツ **
; --------------------------
IZSIM: .WORD 160777,156735,176741,176775,177777 ; ^P
.WORD 000000,002010,002176,000010,000000 ; フヒ
.WORD 000577,006475,022425,000501,000000 ; フヘン
.WORD 037000,016010,004052,004010,000000 ; ムメミ.ツ.
.WORD 004000,004010,016052,037010,000000 ; ムメミ.ヘ.
.WORD 000000,042110,002176,000010,000000 ; ヘム
.WORD 000000,005022,005176,000022,000000 ; ムネフ.ヒ.
.WORD 000000,021022,021176,000022,000000 ; ムネフ.マ.
.WORD 000000,022050,022176,000050,000000 ; タヘム
.WORD 000000,020020,020176,000020,000000 ; フマ
.WORD 004000,025034,004010,004010,000000 ; フツ
.WORD 004000,004010,025010,004034,000000 ; フヘ
.WORD 017000,005006,020022,000100,000000 ; フヒツ
.WORD 074000,050140,002110,000002,000000 ; フマツ
.WORD 000000,002002,050110,074140,000000 ; フマヘ
.WORD 000000,020100,005022,017006,000000 ; フヒヘ
.WORD 000000,000000,000000,000000,000000 ; マミホチナヒ
.WORD 004000,004010,004010,004000,000000 ; !
.WORD 022000,011044,000000,000000,000000 ; "
.WORD 012000,037024,037024,012024,000000 ; #
.WORD 021000,021034,021042,021034,000000 ; $
.WORD 003000,010046,002010,030062,000000 ; %
.WORD 004000,012024,025014,026022,000000 ; &
.WORD 014000,002010,000000,000000,000000 ; '
.WORD 010000,002010,002004,010010,000000 ; (
.WORD 002000,010010,010020,002010,000000 ; )
.WORD 000000,025010,025034,000010,000000 ; *
.WORD 000000,004010,004076,000010,000000 ; +
.WORD 000000,000000,000000,006014,002010 ; ,
.WORD 000000,000000,000076,000000,000000 ; -
.WORD 000000,000000,000000,006014,000000 ; .
.WORD 000000,010040,002010,000002,000000 ; /
.WORD 016000,031042,023052,016042,000000 ; 0
.WORD 004000,005014,004010,037010,000000 ; 1
.WORD 016000,020042,002030,037002,000000 ; 2
.WORD 037000,010040,020030,016042,000000 ; 3
.WORD 010000,012030,037022,010020,000000 ; 4
.WORD 037000,017002,020040,016042,000000 ; 5
.WORD 034000,001004,021036,016042,000000 ; 6
.WORD 037000,010040,002010,002004,000000 ; 7
.WORD 016000,021042,021034,016042,000000 ; 8
.WORD 016000,021042,020074,007020,000000 ; 9
.WORD 000000,006000,000014,006014,000000 ; :
.WORD 000000,006000,000014,006014,002010 ; ;
.WORD 010000,002010,002002,010010,000000 ; <
.WORD 000000,037000,037000,000000,000000 ; =
.WORD 002000,010010,010040,002010,000000 ; >
.WORD 016000,020042,004020,004000,000000 ; ?
.WORD 016000,025062,035052,016002,000000 ; @
.WORD 004000,021024,037042,021042,000000 ; A
.WORD 017000,021042,021036,017042,000000 ; B
.WORD 016000,001042,001002,016042,000000 ; C
.WORD 017000,022044,022044,017044,000000 ; D
.WORD 037000,001002,001036,037002,000000 ; E
.WORD 037000,001002,001036,001002,000000 ; F
.WORD 016000,001042,031002,036042,000000 ; G
.WORD 021000,021042,021076,021042,000000 ; H
.WORD 016000,004010,004010,016010,000000 ; I
.WORD 034000,010020,010020,006022,000000 ; J
.WORD 021000,005022,005006,021022,000000 ; K
.WORD 001000,001002,001002,037002,000000 ; L
.WORD 021000,025066,021052,021042,000000 ; M
.WORD 021000,023042,031052,021042,000000 ; N
.WORD 016000,021042,021042,016042,000000 ; O
.WORD 017000,021042,001036,001002,000000 ; P
.WORD 016000,021042,025042,026022,000000 ; Q
.WORD 017000,021042,005036,021022,000000 ; R
.WORD 016000,001042,020034,016042,000000 ; S
.WORD 037000,004010,004010,004010,000000 ; T
.WORD 021000,021042,021042,016042,000000 ; U
.WORD 021000,021042,012024,004010,000000 ; V
.WORD 021000,021042,025052,012052,000000 ; W
.WORD 021000,012042,012010,021042,000000 ; X
.WORD 021000,012042,004010,004010,000000 ; Y
.WORD 037000,010040,002010,037002,000000 ; Z
.WORD 016000,002004,002004,016004,000000 ; [
.WORD 000000,002002,010010,000040,000000 ; \
.WORD 016000,010020,010020,016020,000000 ; ]
.WORD 000000,037000,020040,000000,000000 ; ^
.WORD 000000,000000,000000,000000,000076 ; _
.WORD 006000,010010,000000,000000,000000 ; ^'
.WORD 000000,016000,036040,056042,000000 ; SA
.WORD 001000,015002,021046,015046,000000 ; SB
.WORD 000000,016000,001042,016042,000000 ; SC
.WORD 020000,026040,021062,026062,000000 ; SD
.WORD 000000,016000,037042,036002,000000 ; SE
.WORD 014000,002044,002016,002004,000000 ; SF
.WORD 000000,026000,021062,026062,016040 ; SG
.WORD 001000,015002,021046,021042,000000 ; SH
.WORD 004000,006000,004010,016010,000000 ; SI
.WORD 010000,010000,010020,010020,006022 ; SJ
.WORD 001000,021002,007022,021022,000000 ; SK
.WORD 006000,004010,004010,016010,000000 ; SL
.WORD 000000,013000,025052,025052,000000 ; SM
.WORD 000000,015000,021046,021042,000000 ; SN
.WORD 000000,016000,021042,016042,000000 ; SO
.WORD 000000,015000,021046,015046,001002 ; SP
.WORD 000000,026000,021062,026062,020040 ; SQ
.WORD 000000,015000,001046,001002,000000 ; SR
.WORD 000000,016000,016002,017040,000000 ; SS
.WORD 002000,007004,002004,014044,000000 ; ST
.WORD 000000,021000,021042,026062,000000 ; SU
.WORD 000000,021000,021042,004024,000000 ; SV
.WORD 000000,021000,025042,012052,000000 ; SW
.WORD 000000,021000,004024,021024,000000 ; SX
.WORD 000000,021000,021042,004024,001004 ; SY
.WORD 000000,037000,004020,037004,000000 ; SZ
.WORD 030000,004010,004006,030010,000000 ; F[
.WORD 004000,004010,004010,004010,000000 ; ^I
.WORD 003000,004010,004060,003010,000000 ; F]
.WORD 000076,000000,000000,000000,000000 ; ^_
.WORD 037000,037076,037076,037076,000000 ; ヌチ
.WORD 037100,012025,012024,021024,000000 ; マネ
.WORD 004010,004010,000377,000000,000000 ; _I
.WORD 033000,077577,037177,004010,000000 ; ラナミツタ
.WORD 000000,000000,004017,004010,004010 ; ^テ
.WORD 004010,007410,007410,004010,004010 ; =I
.WORD 004010,004010,004370,004010,004010 ; I-
.WORD 004010,004010,000370,000000,000000 ; L
.WORD 000000,177400,177400,000000,000000 ; =
.WORD 000000,177400,177400,004010,004010 ; T-
.WORD 004000,037034,077577,037034,000000 ; マネハタ
.WORD 000000,000000,004370,004010,004010 ; テ
.WORD 000000,000000,004377,004010,004010 ; T
.WORD 012024,012024,000377,000000,000000 ; _II
.WORD 004000,004010,025010,004034,000000 ; ムヘ
.WORD 004010,004010,004377,004010,004010 ; +
.WORD 012024,012024,012024,012024,012024 ; II
.WORD 004010,004010,004017,004010,004010 ; -I
.WORD 000000,002010,002176,000010,000000 ; ムヒ
.WORD 012024,177424,177424,012024,012024 ; ++
.WORD 004000,025034,004010,004010,000000 ; ムツ
.WORD 016000,065434,065577,016010,000000 ; ハミナムメタ
.WORD 000000,000000,000377,000000,000000 ; -
.WORD 012024,012024,012377,012024,012024 ; -II
.WORD 004010,004010,004010,004010,004010 ; I
.WORD 004000,037034,037177,004034,000000 ; チモチヘタ
.WORD 004010,004010,000017,000000,000000 ; ^L
.WORD 004010,177410,177410,004010,004010 ; /=
.WORD 000000,000000,012377,012024,012024 ; マ
.WORD 004010,177410,177400,000000,000000 ; __I
.WORD 004010,174010,174010,004010,004010 ; I=
.WORD 000000,020020,020176,000020,000000 ; ムマ
.WORD 031714,031714,031714,031714,031714 ; ムナミロノ ヌタチホノ
.WORD 000000,031000,047112,031112,000000 ; ム゙
.WORD 000000,016000,036040,056042,000000 ; ムタ
.WORD 020000,001034,021036,016042,000000 ; ムチ
.WORD 000000,011000,011022,037022,000040 ; ムヨ
.WORD 000000,036000,022044,077044,000102 ; ムト
.WORD 000000,016000,037042,036002,000000 ; ムナ
.WORD 000000,004000,025076,037052,004010 ; ムヤ
.WORD 000000,037000,001042,001002,000000 ; ムテ
.WORD 000000,021000,004024,021024,000000 ; ムユ
.WORD 000000,021000,025062,021046,000000 ; ムネ
.WORD 016000,021000,025062,021046,000000 ; ムノ
.WORD 000000,021000,007022,021022,000000 ; ムハ
.WORD 000000,034000,022044,021044,000000 ; ムヒ
.WORD 000000,021000,025066,021042,000000 ; ムフ
.WORD 000000,021000,037042,021042,000000 ; ムヘ
.WORD 000000,016000,021042,016042,000000 ; ムホ
.WORD 000000,037000,021042,021042,000000 ; ムマ
.WORD 000000,036000,036042,021044,000000 ; ム゚
.WORD 000000,015000,021046,015046,001002 ; ムミ
.WORD 000000,016000,001042,016042,000000 ; ムム
.WORD 000000,037000,004010,004010,000000 ; ムメ
.WORD 000000,021000,021042,004024,001004 ; ムモ
.WORD 000000,025000,016052,025052,000000 ; ムニ
.WORD 000000,017000,017042,017042,000000 ; ムツ
.WORD 000000,001000,017002,017042,000000 ; ムワ
.WORD 000000,041000,047102,047122,000000 ; ムロ
.WORD 000000,017000,014040,017040,000000 ; ムヌ
.WORD 000000,025000,025052,037052,000000 ; ムリ
.WORD 000000,017000,036040,017040,000000 ; ムン
.WORD 000000,025000,025052,077052,000100 ; ムル
.WORD 000000,021000,037042,020040,000000 ; ムラ
.WORD 000000,003400,036005,036104,000000 ; ム'ワ
.WORD 031000,045112,045116,031112,000000 ; ゙
.WORD 004000,021024,037042,021042,000000 ; A
.WORD 037000,001002,021036,017042,000000 ; チ
.WORD 021000,021042,021042,077042,000100 ; ヨ
.WORD 036000,022044,022044,077044,000102 ; ト
.WORD 037000,001002,001036,037002,000000 ; E
.WORD 004000,025076,025052,004076,000000 ; ヤ
.WORD 037000,001042,001002,001002,000000 ; テ
.WORD 021000,012042,012010,021042,000000 ; ユ
.WORD 021000,031042,023052,021042,000000 ; ネ
.WORD 000034,031042,023052,021042,000000 ; ノ
.WORD 021000,005022,005006,021022,000000 ; ハ
.WORD 034000,022044,022044,021044,000000 ; ヒ
.WORD 021000,025066,021052,021042,000000 ; フ
.WORD 021000,021042,021076,021042,000000 ; ヘ
.WORD 016000,021042,021042,016042,000000 ; ホ
.WORD 037000,021042,021042,021042,000000 ; マ
.WORD 036000,021042,024074,021044,000000 ; ゚
.WORD 017000,021042,001036,001002,000000 ; ミ
.WORD 016000,001042,001002,016042,000000 ; ム
.WORD 037000,004010,004010,004010,000000 ; メ
.WORD 021000,021042,004024,001004,000000 ; モ
.WORD 025000,025052,025034,025052,000000 ; ニ
.WORD 017000,021042,021036,017042,000000 ; ツ
.WORD 001000,001002,021036,017042,000000 ; ワ
.WORD 041000,041102,051116,047122,000000 ; ニ
.WORD 016000,020042,020030,016042,000000 ; ヌ
.WORD 021000,025052,025052,037052,000000 ; リ
.WORD 007000,020020,020074,007020,000000 ; ン
.WORD 021000,025052,025052,077052,000100 ; ル
.WORD 021000,021042,020076,020040,000000 ; ラ
.WORD 003400,002005,042074,036104,000000 ; 'ワ

View File

@ -0,0 +1,789 @@
; ************************************************
; * *
; * Д Р А Й В Е Р М А Г Н И Т О Ф О Н А *
; * *
; ************************************************
; ======================
; *** КОНСТАНТЫ DMAG ***
; ======================
ASPORT = 177716 ;- АДРЕС СИСТЕМНОГО ПОРТА
APSTOP = 4 ;- АДРЕС ПЕРЕХОДА ПО "СТОП"
KDBIT0 = 100 ;- ДЛИНА БИТА НА ЗАПИСЬ
KDBIT1 = 400 ;
DRAZBR = 4 ;- ДИАПАЗОН РАЗБРОСА Н.П.
KPUSK = 20 ;- КОНС. ПУСК
KSTOP = 220 ;- КОНС. СТОП
KBIT00 = 20 ;- КОНС. -0
KBIT10 = 60 ;- КОНС. -1
KBIT01 = 160 ;- КОНС. +0
KBIT11 = 120 ;- КОНС. +1
; ==================================
; ***** МОДУЛЬ УПРАВЛЕНИЯ DMAG *****
; ==================================
; ВХОД: R1 - АДРЕС БЛОКА ПАРАМЕТРОВ
; R3 - АДРЕС ПОРТА
MDMAG: JSR R4,PSREG
MOV R1,ABP ; ПОДГ. ПАРАМ
MOV #ASPORT,R3
CLRB PROH
CLR PRFCT
MOV @#APSTOP,-(SP) ; ПОДГ. ВЫХ. ПО "СТОП"
MOV #AWDMAG,@#APSTOP
MOV SP,BUFSP
MOVB (R1),R0 ; АНАЛИЗ КОМАНДЫ
BNE 1$ ;- СТОП
MOV #KSTOP,(R3)
BR KMDMAG
1$: DEC R0 ;- ПУСК
BNE 2$
MOV #KPUSK,(R3)
BR KMDMAG
2$: DEC R0 ;- ЗАПИСЬ МАССИВА
BNE 3$
JSR PC,BZMAS
BR KMDMAG
3$: DEC R0 ;- ЧТЕНИЕ МАССИВА
BNE 4$
5$: JSR PC,BCTMAS
BR KMDMAG
4$: INC PRFCT ;- ФИКТИВНОЕ ЧТЕНИЕ МАССИВА
DEC R0
BEQ 5$
MOV #KDBIT0,DLBIT0 ;- УСТАНОВКА СКОРОСТИ ЗАПИСИ
MOV #KDBIT1,DLBIT1
BR 6$
7$: ASR DLBIT0
ASR DLBIT1
6$: SOB R0,7$
BR KMDMAG
AWDMAG: MOV BUFSP,SP ; АВАРИЙНЫЙ ВЫХОД ИЗ DMAG
MOVB #4,PROH
MOV #KSTOP,(R3) ;- ОСТАНОВ ДВИГАТЕЛЯ
KMDMAG: MOV ABP,R1 ; ВЫХОД
MOVB PROH,1(R1)
MOV (SP)+,@#APSTOP
JSR R4,PWREG
RTS PC
; ==============================
; *** 1. БЛОК ЗАПИСИ МАССИВА ***
; ==============================
; ВХОД: R1 - АДРЕС БЛОКА ПАРАМЕТРОВ
BZMAS: MOV #KPUSK,(R3) ; ПУСК ДВИГАТЕЛЯ
MOV 2(R1),R5 ; ПОДСЧЕТ КОНТРОЛЬНОЙ СУММЫ
MOV 4(R1),R4
BEQ 1$
CLR R0
2$: CLR R2
BISB (R5)+,R2
ADD R2,R0
ADC R0
SOB R4,2$
MOV R0,BUFKS
MOV #11,R4 ; ЗАПИСЬ НАСТРОЕЧНОЙ ПОСЛЕДОВАТЕЛЬНОСТИ
MOV #10000,R0
BR 3$
4$: MOV R4,R0
3$: JSR PC,PZNP
SOB R4,4$
MOV (R1)+,R0 ; ЗАПИСЬ ИМЕНИ
MOV #24,R2
JSR PC,PZBL
MOV ABP,R1 ; ЗАПИСЬ МАССИВА
MOV 4(R1),R2
MOV 2(R1),R1
JSR PC,PZBL
MOV #BUFKS,R1 ; ЗАПИСЬ KS
MOV #10,R2
JSR PC,PZBL
1$: MOV #KSTOP,(R3) ;- ОСТАНОВ ДВИГАТЕЛЯ
RTS PC
; ------------------------------------------------
; ** 1.1. ЗАПИСЬ НАСТРОЕЧНОЙ ПОСЛЕДОВАТЕЛЬНОСТИ **
; ------------------------------------------------
; ВХОД: R0 - СЧЕТЧИК НУЛЕВЫХ ИМПУЛЬСОВ
; ВЫХОД: C = 0
; R0,R5 - РАБОЧИЕ
PZNP: BCS 1$
2$: JSR PC,PZ0P ; ЗАПИСЬ 0 В ЦИКЛЕ
1$: JSR PC,PZ0M
SOB R0,2$
JSR PC,PZ1P ; ЗАПИСЬ МАРКЕРА(+1,-1)
JSR PC,PZ1M
RTS PC
; -----------------------
; ** 1.2. ЗАПИСЬ БЛОКА **
; -----------------------
; ВХОД: R1 - АДРЕС БЛОКА
; R2 - ДЛИНА БЛОКА
; R0 - R2,R4,R5 - РАБОЧИЕ
PZBL: MOV #20,R0 ; ЗАПИСЬ БУФ. ПОСЛЕД.
JSR PC,PZNP
PZBL1: BISB (R1)+,R0 ;- ПОДГОТОВКА БАЙТА
MOV #10,R4
PZB: BCS PZMBIT ; ЗАПИСЬ БАЙТА
ASR R0
BCS 1$
JSR PC,PZ0P ;- ЗАПИСЬ +0
BR KZB
1$: JSR PC,PZ1P ;- ЗАПИСЬ +1
BR KZB
PZMBIT: ASR R0
BCS 1$
JSR PC,PZ0M ;- ЗАПИСЬ -0
BR KZB
1$: JSR PC,PZ1M ;- ЗАПИСЬ -1
BR KZB
KZB: SOB R4,PZB ; КОНЕЦ ЗАПИСИ БАЙТА
KZBL: SOB R2,PZBL1 ; КОНЕЦ ЗАПИСИ БЛОКА
RTS PC
; ----------------------
; ** 1.3. ЗАПИСЬ БИТА **
; ----------------------
PZ0P: MOV #KBIT01,(R3) ; ЗАПИСЬ +0
MOV DLBIT0,R5
1$: SOB R5,1$
SEC
RTS PC
PZ0M: MOV #KBIT00,(R3) ; ЗАПИСЬ -0
MOV DLBIT0,R5
1$: SOB R5,1$
CLC
RTS PC
PZ1P: MOV #KBIT11,(R3) ; ЗАПИСЬ +1
MOV DLBIT1,R5
1$: SOB R5,1$
SEC
RTS PC
PZ1M: MOV #KBIT10,(R3) ; ЗАПИСЬ -1
MOV DLBIT1,R5
1$: SOB R5,1$
CLC
RTS PC
; ==============================
; *** 2. БЛОК ЧТЕНИЯ МАССИВА ***
; ==============================
; R0 - R5 - РАБОЧИЕ
; R5 - МАСКА ИНФОРМАЦИОННОГО РАЗРЯДА
BCTMAS: MOV #40,R5 ; ПОДГ.ПАРАМ. И ПУСК ДВИГАТЕЛЯ
MOV #KPUSK,(R3)
MOV #1,INCADR
CLR PROH
JSR PC,PPNF ; ПОИСК НАЧАЛА ФАЙЛА
JSR PC,PCTIM ; ЧТЕНИЕ IMMAS
TSTB PROH
BNE KCTMAS
JSR PC,PCTMAS ; ЧТЕНИЕ БЛОКА ИНФОРМАЦИИ
MOV #KSTOP,(R3)
KCTMAS: RTS PC
; -----------------------------
; ** 2.1. ПОИСК НАЧАЛА ФАЙЛА **
; -----------------------------
PPNF: MOV #2000,R2 ; ПОИСК НУЛЕЙ
CLR R0
4$: CLR R4 ;- ЧТЕНИЕ ИМПУЛЬСА
1$: BIT R5,(R3)
BEQ 1$
2$: INC R4
BIT R5,(R3)
BNE 2$
SUB R4,R0 ; ОПРЕДЕЛЕНИЕ РАЗБРОСА
BMI 3$
CMP R0,#DRAZBR
BHI PPNF
3$: MOV R4,R0
SOB R2,4$
CLR R0 ; НАСТРОЙКА НА СКОРОСТЬ
MOV #100,R2
5$: JSR PC,PCTBIT ;- СЧЕТ ИМПУЛЬСОВ
ADD R4,R0
SOB R2,5$
MOV #5,R2 ;- ВЫЧИСЛЕНИЕ ГРАНИЦЫ 0
6$: ASR R0
SOB R2,6$
ADD #4,R0
MOV R0,GRDL0
JSR PC,PPM ; ПРОВЕРКА КЛЮЧА
MOV #20,R0
11$: MOV R0,R2
10$: JSR PC,PCTBIT
BCS PPNF
SOB R2,10$
JSR PC,PCTBIT
BCC PPNF
JSR PC,PCTBIT
BCC PPNF
DEC R0
SOB R0,11$
RTS PC
; -------------------------------
; ** 2.2. ЧТЕНИЕ ИМЕНИ МАССИВА **
; -------------------------------
PCTIM: MOV ABP,R1 ; ЧТЕНИЕ ИМЕНИ
ADD #26,R1
MOV #24,R2
JSR PC,PCTBL
MOV #10,R2
2$: CMP -(R1),-24(R1) ; СРАВНЕНИЕ ИМЕН
BNE 1$
SOB R2,2$
MOV -(R1),BUFDL ;- УСТ. ДЛИНЫ МАССИВА
MOV -26(R1),BUFSTA ;- УСТ. СТАРТ. АДРЕСА
BNE KCTIM
MOV -(R1),BUFSTA
BR KCTIM
1$: INCB PROH
KCTIM: RTS PC
; -------------------------
; ** 2.3. ЧТЕНИЕ МАССИВА **
; -------------------------
PCTMAS: MOV BUFSTA,R1 ; ЧТЕНИЕ МАССИВА
MOV BUFDL,R2
SUB PRFCT,INCADR
BNE 1$
MOV #BUFKS,R1 ;- ФИКТИВНОЕ ЧТЕНИЕ
1$: JSR PC,PCTBL
MOV R0,-(SP)
MOV #BUFKS,R1 ; ЧТЕНИЕ KS
MOV #2,R2
MOV #1,INCADR
JSR PC,PCTBL
CMP (SP)+,BUFKS ; СРАВНЕНИЕ KS
BEQ KCTM
MOVB #2,PROH
KCTM: RTS PC
; -----------------------
; ** 2.4. ЧТЕНИЕ БЛОКА **
; -----------------------
; ВХОД: R1 - АДРЕС ОЗУ
; R2 - ДЛИНА БЛОКА
; ВЫХОД: R0 - КОНТРОЛЬНАЯ СУММА
PCTBL: JSR PC,PPM ; ПОИСК МАРКЕРА
CLR -(SP)
2$: MOV #10,R0 ; ЧТЕНИЕ БЛОКА
1$: JSR PC,PCTBIT ; ЧТЕНИЕ БАЙТА
RORB (R1)
SOB R0,1$
BISB (R1),R0 ;- ПОДСЧЕТ KS
ADD R0,(SP)
ADC (SP)
ADD INCADR,R1 ;- ИЗМЕНЕНИЕ АДРЕСА
SOB R2,2$
MOV (SP)+,R0
KCTBL: RTS PC
; ----------------------
; ** 2.5. ЧТЕНИЕ БИТА **
; ----------------------
; ВЫХОД: C = 0 - 0 БИТ
; C = 1 - 1 БИТ
; R4 - РАБОЧИЙ
PCTBIT: CLR R4 ; СЧЕТЧИК ДЛИНЫ БИТА
BIT R5,(R3)
BEQ 1$
2$: INC R4 ; +
BIT R5,(R3)
BNE 2$
BR 3$
1$: INC R4 ; -
BIT R5,(R3)
BEQ 1$
3$: CMP GRDL0,R4 ;- УСТАНОВКА БИТА C
RTS PC
; ------------------------
; ** 2.6. ПОИСК МАРКЕРА **
; ------------------------
; R4 - РАБОЧИЙ
PPM: JSR PC,PCTBIT
BCC PPM
JSR PC,PCTBIT
BCC PPM
RTS PC
; **********************************************
; * *
; * Д Р А Й В Е Р Т Л Г - К А Н А Л А *
; * *
; **********************************************
; ======================
; *** КОНСТАНТЫ DTLG ***
; ======================
ASPORT = 177716 ;- АДРЕС СИСТЕМНОГО ПОРТА
KTLG0 = 200 ;- КОНС. УСТАНОВКИ 0
KTLG1 = 220 ;- КОНС. УСТАНОВКИ 1
; =====================================
; ***** МОДУЛЬ ИНИЦИАЛИЗАЦИИ DTLG *****
; =====================================
; ВХОД: R0 - НОМЕР ЗНАЧЕНИЯ СКОРОСТИ
MIDTLG: ASL R0
MOV KDLBIT(R0),DLBIT
RTS PC
; =================================
; ***** МОДУЛЬ ПЕРЕДАЧИ БАЙТА *****
; =================================
; ВХОД: R0 - МЛ. БАЙТ
MPDBYT:
; ===========================
; *** БЛОК ПЕРЕДАЧИ БАЙТА ***
; ===========================
BPDB: MOV R0,-(SP)
MOV R4,-(SP)
BIS #1400,R0 ; ПОДГ. ПАРАМЕТРОВ
MOV #13,R4
6$: BIT #200,@#ASPORT ; ОЖ. ГОТОВНОСТИ
BEQ 6$
CLC ; УСТАНОВКА БИТА
BR 1$
4$: ASR R0
1$: BCC 2$
MOV #KTLG1,@#ASPORT
BR 3$
2$: MOV #KTLG0,@#ASPORT
BR 3$
3$: MOV DLBIT,R5 ; ЦИКЛ ПЕРЕДАЧИ БИТА
5$: SOB R5,5$
SOB R4,4$
MOV (SP)+,R4
MOV (SP)+,R0
RTS PC
; ===============================
; ***** МОДУЛЬ ПРИЕМА БАЙТА *****
; ===============================
; ВЫХОД: R0 - МЛ. БАЙТ
MPRBYT:
; =========================
; *** БЛОК ПРИЕМА БАЙТА ***
; =========================
BPRB: MTPS #0 ;- РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ
MOV R3,-(SP)
MOV R4,-(SP)
MOV #ASPORT,R3 ; ПОДГ. ПАРАМ.
MOV #20,R4 ;- СЧЕТЧИК БАЙТА
CLR R0
1$: BIT R4,(R3) ; ПОИСК СТАРТОВОГО БИТА
BEQ 1$
11$: MOV #260,(R3) ;- УСТ. ГОТОВН. ПРИЕМА
BIT R4,(R3)
BNE 11$
MTPS #200 ;- ЗАПРЕТ ПРЕРЫВАНИЙ
MOV DLBIT,R5 ; ПОИСК СЕРЕД. СТ. БИТА
ASR R5
2$: SOB R5,2$
ASR R4
6$: MOV DLBIT,R5 ;- ЧТЕНИЕ БАЙТА
3$: SOB R5,3$
BIT #20,(R3)
BNE 4$
CLC
BR 5$
4$: SEC
BR 5$
5$: RORB R0
SOB R4,6$
MOV #220,(R3) ;- СБРОС ГОТОВН. ПРИЕМА
MOV (SP)+,R4
MOV (SP)+,R3
RTS PC
; ===================================
; ***** МОДУЛЬ ПЕРЕДАЧИ МАССИВА *****
; ===================================
; ВХОД: R1 - АДРЕС МАССИВА
; R2 - ДЛИНА МАССИВА В БАЙТАХ
MPDMAS: MOV R0,-(SP)
1$: MOVB (R1)+,R0 ; ПЕРЕДАЧА МАССИВА
JSR PC,BPDB
SOB R2,1$
MOV (SP)+,R0
RTS PC
; =================================
; ***** МОДУЛЬ ПРИЕМА МАССИВА *****
; =================================
; ВХОД: R1 - АДРЕС ПАМЯТИ ДЛЯ МАССИВА
; R2 - ДЛИНА МАССИВА В БАЙТАХ
MPRMAS: MOV R0,-(SP)
1$: JSR PC,BPRB ; ПРИЕМ МАССИВА
MOVB R0,(R1)+
SOB R2,1$
MOV (SP)+,R0
RTS PC
; ===================
; *** ДАННЫЕ DTLG ***
; ===================
KDLBIT: ; КОНСТАНТЫ ДЛИНЫ БИТА
DL9600: .WORD 14
DL4800: .WORD 36
DL2400: .WORD 103
DL1200: .WORD 213
DL600: .WORD 435
DL300: .WORD 1100
DL200: .WORD 1542
DL150: .WORD 2206
DL110: .WORD 3300
DL75: .WORD 4422
DL50: .WORD 6633
; ================================
; ***** БЛОК ПЕРЕМЕННЫХ DMBK *****
; ================================
.ASECT
; ===============================
; *** СИСТЕМНЫЕ ПРИЗНАКИ DMBK ***
; ===============================
. = 40
SYSPR:
PRCW: .BYTE 0 ;- ПРИЗНАК ЦВЕТНОГО РЕЖИМА
PRINWF: .BYTE 0 ;- ПРИЗНАК ИНВЕРСИИ ФОНА
PRRP: .BYTE 0 ;- ПРИЗНАК РАСШИРЕННОЙ ПАМЯТИ
PRRUS: .BYTE 0 ;- ПРИЗНАК РУССКОГО РЕГИСТРА
PRPODC: .BYTE 0 ;- ПРИЗНАК ПОДЧЕРКИВАНИЯ СИМВОЛА
PRINWS: .BYTE 0 ;- ПРИЗНАК ИНВЕРСИИ СИМВОЛА
PRISU: .BYTE 0 ;- ПРИЗНАК ИНДИКАЦИИ СУ
PRBLR: .BYTE 0 ;- ПРИЗНАК БЛОКИРОВКИ РЕДАКТИРОВАНИЯ
PRGRAF: .BYTE 0 ;- ПРИЗНАК ГРАФИЧЕСКОГО РЕЖИМА
PRZAP: .BYTE 0 ;- ПРИЗНАК РЕЖИМА ЗАПИСИ
PRSTIR: .BYTE 0 ;- ПРИЗНАК РЕЖИМА СТИРАНИЯ
PRCWSS: .BYTE 0 ;- ПРИЗНАК ЦВЕТНОГО РЕЖИМА В СС
PRPSSS: .BYTE 0 ;- ПРИЗНАК ПОДЧЕРКИВАНИЯ СИМВОЛА В СС
PRISSS: .BYTE 0 ;- ПРИЗНАК ИНВЕРСИИ СИМВОЛА В СС
PRGAHK: .BYTE 0 ;- ПРИЗНАК ГАШЕНИЯ КУРСОРА
; ========================
; *** ПЕРЕМЕННЫЕ DKLAW ***
; ========================
. = 100
WPTM: .WORD 0 ;- ВЕКТОР ПРЕРЫВАНИЯ ТАЙМЕРА
SSPTM: .WORD 0 ;- СЛОВО СОСТОЯНИЯ ПРЦ
BUFKL: .BYTE 0 ;- БУФЕР КЛАВИАТУРЫ
PRZKB: .BYTE 0 ;- ПРИЗНАК ЗАПИСИ КОДА В БУФЕР
BKPOWT: .WORD 0 ;- БУФЕР КОНСТАНТЫ ПОВТОРА
PRPOWT: .BYTE 0 ;- ПРИЗНАК ПОВТОРА КОДА
SCTAB: .BYTE 0 ;- СЧЕТЧИК ТАБУЛЯЦИИ
MTAB: .BLKW 4 ;- МАСКА ТАБУЛЯЦИИ
SCKLC: .BYTE 0 ;- СЧЕТЧИК КЛЮЧА
.EVEN
TAKLC: .WORD 0 ;- ТЕКУЩИЙ АДРЕС КЛЮЧА
AKLC: .BLKW 12 ; АДРЕСА КЛЮЧЕЙ
; ========================
; *** ПЕРЕМЕННЫЕ DTVMN ***
; ========================
PRNRUL: .BYTE 0 ;- ПРИЗНАК НАРУШЕНИЯ РУЛОНА
PRZTCK: .BYTE 0 ;- ПРИЗНАК ЗАПИСИ ТОЧКИ
MASPGT: .BYTE 0 ;- МАСКА ПОЗИЦИИ ГТ
NMPGT: .BYTE 0 ;- НАЧАЛЬНАЯ МАСКА ПОЗИЦИИ ГТ
NOMSIM: .WORD 0 ;- НОМЕР СИМВОЛА НА ЭКРАНЕ
AS: .WORD 0 ;- АДРЕС СИМВОЛА
DSIMB: .WORD 0 ;- ДЛИНА СИМВОЛА В БАЙТАХ
KSVP: .WORD 0 ;- КОЛИЧЕСТВО СИМВОЛОВ НА ЭКРАНЕ
AGTVP: .WORD 0 ;- АДРЕС ГТ НА ЭКРАНЕ
AGT: .WORD 0 ;- АДРЕС ГТ
DGW: .WORD 0 ;- ДЛИНА ГРАФИЧЕСКОГО ВЕКТОРА
SCTVS: .WORD 0 ;- СЧЕТЧИК TV-СТРОК
BUFX: .WORD 0 ;- БУФЕР КООРДИНАТЫ X
BUFY: .WORD 0 ;- БУФЕР КООРДИНАТЫ Y
ANVP: .WORD 0 ;- АДРЕС НАЧАЛА ВИДЕОПАМЯТИ
BAZVP: .WORD 0 ;- БАЗА ВИДЕОПАМЯТИ
DVPB: .WORD 0 ;- ДЛИНА ВИДЕОПАМЯТИ В БАЙТАХ
DGPB: .WORD 0 ;- ДЛИНА ГРАФ. ПАМЯТИ В БАЙТАХ
FON: .WORD 0 ;- ФОН ЭКРАНА
MASCW: .WORD 0 ;- МАСКА ЦВЕТА
FONSS: .WORD 0 ;- ФОН СС
MCWSS: .WORD 0 ;- МАСКА ЦВЕТА СС
SCKOD: .WORD 0 ;- СЧЕТЧИК КОДОВ
SCUIND: .WORD 0 ;- СЧЕТЧИК УСТАНОВКИ ИНДИКАТОРОВ
; =======================
; *** ПЕРЕМЕННЫЕ DMAG ***
; =======================
. = 300
PROH: .BYTE 0 ;- ПРИЗНАК ОШИБКИ
.EVEN
PRFCT: .WORD 0 ;- ПРИЗНАК ФИКТИВНОГО ЧТЕНИЯ
INCADR: .WORD 0 ;- ИНКРЕМЕНТ АДРЕСА МАССИВА
ABP: .WORD 0 ;- АДРЕС БЛОКА ПАРАМЕТРОВ
BUFSP: .WORD 0 ;- БУФЕР УКАЗАТЕЛЯ СТЕКА
BUFKS: .WORD 0 ;- БУФЕР КОНТРОЛЬНОЙ СУММЫ
GRDL0: .WORD 0 ;- ГРАНИЦА ДЛИНЫ 0
. = 320
BPDMAG: ; БЛОК ПАРАМЕТРОВ DMAG
KOM: .BYTE 0 ;- КОМАНДА
OTWET: .BYTE 0 ;- ОТВЕТ
ADRMAS: .WORD 0 ;- АДРЕС МАССИВА
DLMAS: .WORD 0 ;- ДЛИНА МАССИВА НА ЗАПИСЬ
IMMAS: .BLKB 20 ;- ИМЯ МАССИВА
ADRTM: .WORD 0 ;- АДРЕС ТЕКУЩЕГО МАССИВА
DLTMAS: .WORD 0 ;- ДЛИНА ТЕКУЩЕГО МАССИВА
IMTMAS: .BLKB 20 ;- ИМЯ ТЕКУЩЕГО МАССИВА
; =================================
; *** СИСТЕМНЫЕ ПЕРЕМЕННЫЕ DMBK ***
; =================================
. = 250
DLBIT0: .WORD 0 ;- ДЛИНА 0 DMAG
DLBIT1: .WORD 0 ;- ДЛИНА 1 DMAG
DLBIT: .WORD 0 ;- ДЛИНА БИТА DTLG
KPORT: .WORD 0 ;- КОПИЯ ПОРТА
APOPKL: .WORD 0 ;- АДР.ПРОГР.ОБР.ПРЕР.ОТ КЛАВ.
PRWK: .WORD 0 ;- ПРИЗНАК КОДА ВК
BUFSTA: .WORD 0 ;- БУФЕР СТАРТОВОГО АДРЕСА
BUFDL: .WORD 0 ;- БУФЕР ДЛИНЫ МАССИВА
.END

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,324 @@
.Mcall .Module
.Module BCIRCL,Release=X02, Version=02, Comment=<BK0011 Circle Drawing>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl Point,Vector
.Psect $CodOvr
.SbTtl Circle Routine (Circle Drawing)
;
; This Routine draws the circle or circle arc with parameters specified.
; Routine Uses All the registers (R0..R5).
; Input parametres are in static memory area:
;
; $XC - X coordinate of arc center
; $YC - Y coordinate of arc center
; $RAD - circle or arc radius
; $BEG - Start angle
; $END - End angle
; $CX - X-Coordinate concise coeffitient
; $CY - Y-Coordinate concise coeffitient
;
;$BEG and $END - Integer number 0...77777 (Octal)
;0 -> 0
;77777 -> 2*pi
;
;If number given less than <0, absolute value of parameter
;is angle, appropriate point of arc concatenated with arc center.
;
;$CX, $CY - 0..177777, If equal zero than no concise, else
; Real Coordinate X = X * $CX / 2 ** 16
; Real Coordinate Y = Y * $CY / 2 ** 16
;
CIRCLE::
Clr $LB ; Clear LE and LB (Sign Flags)
ClrB $LE
Clr $INV
Mov #BufOut,R0 ; Clear "BufOut" Buffer
Mov #4,R1
10$: Clr (R0)+
Sob R1,10$
Mov $BEG,R1 ; Test initial angle
Bpl 20$
Neg R1 ; Get absolute value
IncB $LB ; and set flag
20$: Mov R1,-(SP) ; store initial angle
Call Octet ; Compute octet and coordinate
Mov R1,$$BEG ; Store initial coordinate
Mov R5,R4 ; and octet No
Mov $END,R1 ; Process ending point
Bpl 30$
Neg R1
IncB $LE
30$: Mov R1,-(SP) ; Store End point
Call Octet
Mov R1,$$END ; Ending coordinate
BisB #2,BufOut(R4) ; Mark begin
Cmp R4,R5 ; End sector=Begin sector?
Bne 40$ ; No...
Cmp (SP)+,(SP)+ ; Compare End and Begin Coordinates
Bgt 60$ ; End > Begin - normal direction
Inc $INV ; Mark Inverse Direction
Br 50$
40$: Cmp (SP)+,(SP)+ ; Clear Stack
50$: Inc R4 ; Increase octet No
Bic #^C7,R4
Cmp R4,R5 ; last octet?
Beq 60$ ; Yes
BisB #200,BufOut(R4) ; Set "Always write" Flag
Br 50$
60$: BisB #4,BufOut(R4) ; Set "Test the end" Flag
.SbTtl Second part of Routine - Drawing proper
;
;Register are:
; R1- Relative X
; R2- Relative Y
; R5- Sector's Counter
; R0- D
; R3 and R4 are working
;
Clr R1 ; X=0
Mov $RAD,R2 ; Y=R
Mov R2,R0
Asl R0
Neg R0
Add #3,R0 ; D=3-2*R
.SbTtl Main Loop of Drawing Algorithm
70$: Cmp R1,R2
Bgt 100$ ; If(X>Y) - Than Exit
; Else {
Call DRAW8 ; Write eigth points of circle
Tst R0 ; If D<0
Bge 80$
Mov R1,R3 ; Then D = D+4*X+6
Asl R3
Asl R3
Add #6,R3
Add R3,R0
Br 90$
80$: Mov R1,R3 ; Else D = D+4*(X-Y)+10.
Sub R2,R3 ;; X - Y
Asl R3
Asl R3
Add #10.,R3
Add R3,R0
Dec R2 ; Y--
90$: ;/* EndIf*/
Inc R1 ; X++
Br 70$
100$: Return
.SbTtl DRAW8 - Selective drawing of arc points
;
;Input:
;R1 - Relative X-coordinate of point
;R2 - Relative Y-coordinate of point
;
;This routine also uses $XC, $YC, $BEG, $END, $CX, $CY and Bufout Data
;
DRAW8: Mov R0,-(SP) ;Save R0 Thru r2
Mov R1,-(SP)
Mov R2,-(SP)
Mov #7,R5 ;sektor No
;
;Sector's Loop
;
10$: Clr R4 ; Clear "Radius Drawing" flag
Mov (SP),R2 ;Restore original Y
Mov 2(SP),R1 ; and X Coordinates
MovB BufOut(R5),R0 ;Test Flags for sector processing
Beq 90$ ; == 0 --> skip this sector
Bmi 30$ ; < 0 --> Draw All points
Call @TTAB-2(R0) ; > 0 --> Check Cordinates
Bcs 90$ ; Not draw this point
30$: Bit #2,R5 ; swap Coordinates ?
Beq 40$ ; No...
Mov R1,R3
Mov R2,R1 ; Swap(X,Y)
Mov R3,R2
40$: Mov R5,-(SP) ; Store temporary
Mov $CX,R3 ; X-Scaling
Beq 50$ ; not used...
Call CMul ; Used...
50$: Mov $CY,R3 ; Y-Scaling processing
Beq 60$
Mov R1,-(SP)
Mov R2,R1
Call CMul
Mov R1,R2
Mov (SP)+,R1
60$: Mov (SP)+,R5 ; Restore Octet No
MovB SIGS(R5),R0 ; Table of signs
Bpl 70$ ; X-Sign
Neg R1 ; is "-"
70$: AslB R0 ; Y-Sign
Bpl 80$ ; "+"
Neg R2 ; "-"
80$: Add $XC,R1 ; Get Absolute coordinates
Add $YC,R2 ; ....
Call Point ;Draw the point
Tst R4 ;Radius Drawing?
Beq 90$ ;No
Mov $XC,R1
Mov $YC,R2
Call Vector ;Write Vector
90$: Dec R5 ;Goto the Next Octet
Bpl 10$
Mov (SP)+,R2 ;All done, Restore registers and exit
Mov (SP)+,R1
Mov (SP)+,R0
Return
TTAB: .Word TBeg, TEnd, TAll
;
;Octet Signs Table
;
SigS: .BYTE 100, 300, 300, 200; mask 200 - "-X"
.BYTE 200, 0, 0, 100 ; mask 100 - "-Y"
.Enabl LSB
.SbTtl Points Testing ROutines
TBEG: Mov $$BEG,R3 ; Bound Value
Call TEST
Bgt 20$ ; Not Draw
Bne 10$ ; not at bound, Draw
TstB $LB ; Initial Radius Drawing ?
15$: Beq 10$ ; No
Inc R4 ; Yes, Mark...
10$: Tst (PC)+
20$: SeC
Return
TEND: Mov $$END,R3
Call TEST
BlT 20$
Bne 10$
TstB $LE
Br 15$
TALL: Clr R0
Call TBEG
Adc R0
Call TEND
Adc R0 ;Now R0=0
Sub $INV,R0
Bgt 20$
Br 10$
TEST:
Bit #1,R5 ; Sector Writting Direction
Bne 30$
Cmp R1,R3
Return
30$: Cmp R3,R1
Return
.Dsabl LSB
.SbTtl Octet Computing Routine
;
; Input:
;R2 = Positive Angle value.
; Output:
;R5 = Octet No
;R1 = Initial coordinate of Octet @r5
;R4 Not Changed.
;Uses MySin Routine
;
Octet: Mov R1,R5
Bic #^C70000,R5 ;Octet No bits
Bic R5,R1 ;R1 = internal octet angle
Asr R5 ;111 000 000 000 00
Asr R5 ;111 000 000 000 0
Asr R5 ;111 000 000 000
Asr R5 ;111 000 000 00
Swab R5 ;111
Dec R5
Bic #^C7,R5 ;R5=Octet No
Bit #1,R5 ;Internal Coordinate direction must be
;changed ?
Bne 10$ ; No
Neg R1
Add #7777,R1
10$: Call MySin ; R1=$RAD*Sin(R1/10000*Pi/4)
Return
.SbTtl Sine function approcsimation
; R1 = $RAD*Sin(R1/10000*Pi/4) where R1=0..7777
;
; It's the simpliest realization - linear approcsimation used:
;R1=R1/10000*Sin(Pi/4)
;
;R4 and R5 are unchanged.
;
SinPi4 = 132404
MySin:
Mov R4,-(SP)
Mov R5,R2 ;Save R4 and R5
Asl R1
Asl R1
Asl R1
Asl R1 ;Fix decimal point at the left of MSB
Mov $Rad,R3 ;and Scale R1
Call CMul
Mov #SinPi4,R3 ;Sin(Pi/4)
Call CMul
Mov R2,R5 ;Restore R5
Mov (SP)+,R4 ;and R4
Return
.SbTtl CMul R1 to R3 Scaling procedure
;
;Computes R1=R1*R3/2**16
;
;R0, R3, R4 and R5 are changed
;
CMul:
Mov R2,-(SP)
Mov R1,R0 ;Multiplier
Clr R1
Clr R2
Clr R5
10$: Ror R0 ;Shift out the following Bit (C == 0)
Bcc 20$
Add R5,R1 ;Most significant part
Add R3,R2 ;LSP
Adc R1
20$: Asl R3
Rol R5
Tst R0 ;All Done?
Bne 10$ ;No, Continue
Mov (SP)+,R2 ;Restore R2
Return ;And Exit
.Psect $Ram
CrcBlk::
$XC: .BlkW ; X0
$YC: .BlkW ; Y0
$RAD: .BlkW ; radius
$BEG: .BlkW ; Initial Main Coordinate
$END: .BlkW ; Ending Main Coordinate
$CX: .BlkW ; X-Scaling factor
$CY: .BlkW ; Y-Scaling factor
$$BEG: .BlkW ;
$$END: .BlkW ;
$INV: .BlkW ;
$LB: .BlkB ;
$LE: .BlkB ;Must be folow $LB
BufOut: .BlkB 8. ;Circle definition table
.Even
.END

View File

@ -0,0 +1,91 @@
.Mcall .Module
.Module BKCLR,Release=X02, Version=01, Comment=<BK0011 Color Routines>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BkHead"
.Globl SavRg, RetEmt, PutUBt, GetUBt
ClrCU == 177762
.Psect $CodOvr
.SbTtl $BGcolor - Exam Color Map
$BGCOL::
Tst ClrFlg ;Test Color Control Device
Beq Nocol
Jsr R0,SavRg
Mov R0,R5
Mov #ClrLng,R1
Mov #ClrTab,R4
10$: MovB (R4)+,R0
Call PutUBt
Sob R1,10$
Jmp RetEmt
Nocol: SeC
Return
.SbTtl $BScolor - Set Color Map
$BSCOL::
Tst ClrFlg
Beq Nocol
Jsr R0,SavRg
Mov R0,R5
Mov #ClrLng,R1
Clr R3
Clr R4
Mov #ClrCU,R2
10$: Call GetUBt
MovB R0,ClrTab(R4)
Bis R3,R0
Mov R0,@R2
Add #400,R3
Sob R1,10$
Jmp RetEmt
.Psect $Code
.SbTtl ClrIni Color Control Unit Initialization Routine
ClrIni::
Mov @#Vec4,ClrFlg
Mov #10$,@#Vec4
Clr ClrCU
Mov ClrFlg,@#Vec4
Mov #ClrTb0,R0
Mov #ClrTab,R1
Mov #ClrLng,R2
Clr R3
Mov #ClrCU,R5
20$: MovB (R0)+,R4
Bis R3,R4
MovB R4,(R1)+
MovB R4,@R5
Add #400,R3
Sob R2,20$
Return
10$: Mov ClrFlg,@#Vec4
Cmp (SP)+,(SP)+
Clr ClrFlg
Sec
Return
.Psect $RAM
ClrFlg::0
ClrTab::.BlkB 16. ;Color Map
ClrLng=.-ClrTab
.Psect $Const
ClrTb0::
.Byte 0
.Rept 15.
.Byte -1
.EndR
.Even
.End

View File

@ -0,0 +1,187 @@
.Mcall .Module
.Module BKCOMM,Release=X02,Version=02,Comment=<BK0011 Common Routines>
;
; Copyright (c) 1986 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl USPSav,ScrSel
.SbTtl General Register Save/Restore Routines
;
;Routine Saves R0..R4
;Calling sequence:
; Jsr R0,SavRg
; Resault Stack:
;
; +---------------+
; ! Old R5 !
; +---------------+
; ! $B... RetAdr !
; +---------------+
; ! Old R0 !
; +---------------+
; ! Old R1 !
; +---------------+
; ! Old R2 !
; +---------------+
; ! Old R3 !
; +---------------+
; ! Old R4 !
; +---------------+
;
SavRg:: Mov R1,-(SP)
Mov R2,-(SP)
Mov R3,-(SP)
Mov R4,-(SP)
Mov 10(SP),-(SP) ;Old R0
Rts R0 ;Exit to User Program
;
;Routine Restores R0..R4 and issues RTS PC Command
;Calling Sequence:
; Jmp RetEmt
;
RetEmt::Mov (SP)+,R4
Mov (SP)+,R3
Mov (SP)+,R2
Mov (SP)+,R1
Mov (SP)+,R0
Return
.SbTtl Emt Get ARGumet Routine
;
;This Routine Extracts Args from User Stack
;
;Calling Sequence:
; Jsr R0,GetArg
;
;Old Stack:
;
; +---------------+
; ! Arg 1 !
; ! Arg 2 !
; +---------------+ <----UspSav
;
; +---------------+
; ! Old R5 ! 4
; !$B.... RetAdr ! 2
; ! Old R0 ! 0
; +---------------+
;
; Output Stack:
; +---------------+
; ! Old R5 ! 14
; ! $B.... RetAdr ! 12
; ! Old R0 ! 10
; ! Old R1 ! 6
; ! Old R2 ! 4
; ! Old R3 ! 2
; ! Old R4 ! 0
; +---------------+
;
; R0 = Arg 1
; R1 = Arg 2
;
$OffR0 == 10 ;Offset to R0
GetArg::
Mov R1,-(SP) ;Save R0..R4
Mov R2,-(SP)
Mov R3,-(SP)
Mov R4,-(SP)
Mov R0,TmpR0 ;Save Return Address
Mov @#UspSav,R0
Mov @#$$UsrS,@#Sel1
Mov (R0)+,R1 ;Second Arg
Mov (R0)+,R0 ;First Arg
Mov @#$$SysS,@#Sel1
Tst @#Sel1
Add #4,@#UspSav
Jmp @TmpR0
.Save
.Psect $RAM
TmpR0: .BlkW
.Restore
.SbTtl Put R0 Word to (R5)+ in User Space
PutUWd::Mov @#$$UsrS,@#Sel1
Tst @#Sel1
Mov R0,(R5)+
Mov @#$$SysS,@#Sel1
Tst @#Sel1
Return
.SbTtl Put R0 Byte to (R5)+ in User Space
PutUBt::Mov @#$$UsrS,@#Sel1
Tst @#Sel1
MovB R0,(R5)+
Mov @#$$SysS,@#Sel1
Tst @#Sel1
Return
.SbTtl Get (R5)+ Byte from User Space
GetUBt::Mov @#$$UsrS,@#Sel1
Tst @#Sel1
MovB (R5)+,R0
Mov @#$$SysS,@#Sel1
Tst @#Sel1
Bic #^C377,R0
Return
.SbTtl Get (R5)+ Word from User Space
GetUWd::Mov @#$$UsrS,@#Sel1
Tst @#Sel1
Mov (R5)+,R0
Mov @#$$SysS,@#Sel1
Tst @#Sel1
Tst R0
Return
.SbTtl Character Check and GO routine
;
;Calling Sequence:
;
; Mov Switch,R0
; Jsr R0,ChrGo
;A:
; .Byte <Addr-A>/2,Code
;................
; .Byte <Exit-A>/2,0
;
; This routine uses R1,R2.
; R0 Contents is unchanged.
;
ChrGo:: Mov R0,R1 ;Table Address
10$: Clr R2
BisB (R1)+,R2 ;Routine Address Offset
TstB @R1
Beq 20$ ;End of List
CmpB (R1)+,@SP ;Check Character
Bne 10$
20$: Asl R2
Add R2,R0
Rts R0
.SbTtl Screen Mapping/Unmaping Routines
SeTScS::Mov @#$$UsrS,-(SP)
Bic #^C<TapMsk!ScrMsk>,@SP
Bis ScrSel,(SP)
Mov (SP)+,@#Sel1
Tst @#Sel1
Return
SeTScX::Mov @#$$SysS,@#Sel1
Tst @#Sel1
Return
.End

View File

@ -0,0 +1,211 @@
.Mcall .Module
.Module BKCTRL,Release=X02,Version=00,Comment=<BK0011 Control Codes Proc.>
;
; Copyright (c) 1986 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl CursX, CursY, AWrp$$, TtoFlg, StrLen, ScrBot
.Globl ScrlDw, MaxLin, CrsAdr, BkGnd, NxTVLn, FfLng
.Globl Lat$$, MixO$$, ScrlUp, SetScS, SetScX
.Macro Control Code, Indication, Function
.Save
.Psect $Const
.=IsgTab+<Code>
.Byte Indication
.=CtrTab+<<Code>*2>
.IF Nb <Function>
.Globl Function
.Word Function
.IFf
.Word 0
.EndC
.Restore
.EndM
.Save
.Psect $Const
IsgTab::
.Blkb 32.
CtrTab::
.BlkW 32.
.Restore
.SbTtl Control Code Tables
Control 0, '@-40 ;
Control 1, 'A-40, SetDbl ;Set Double Width
Control 2, 'B-40, SetSng ;Set Single Width
Control 3, 'C-40 ;
Control 4, 'D-40 ;
Control 5, 'E-40 ;
Control 6, 'F-40 ;
Control 7, 'G-40, Bell ;Ring the Bell
Control 10, -33, Bs ;BackSpace <---
Control 11, 'I-40, Ht ;Horizontal Tab
Control 12, -34, Lf ;Line Feed !___
Control 13, 'K-40, Vt ;Deleol
Control 14, 'L-40, Ff ;Clear Screen
Control 15, 'M-40, Cr ;Carriage Return
Control 16, 'N-40, So ;Set Cyrillic
Control 17, 'O-40, Si ;Set Latin
Control 20, 'P-40 ;
Control 21, 'Q-40 ;
Control 22, 'R-40, Dc2 ;Home
Control 23, 'S-40 ;
Control 24, 'T-40, Dc4 ;Set Mixed Char. Set
Control 25, 'U-40, Nak ;New Line
Control 26, -20 ;(In GetLine Only) <--!
Control 27, -21 ; !-->
Control 30, -35 ; <-!-
Control 31, -32, Em ;Cursor Right ---->
Control 32, -30, Sub ;Cursor Up ^
Control 33, -31, Esc ;Cursor Down \/
Control 34, '\-40 ;
Control 35, ']-40, ClrGet ;Color Setting Seq.
Control 36, '^-40, Dc3 ;Reverse LF
Control 37, '_-40 ;
.SbTtl Bell and Sound Routines - Ring the Bell and Sound
.Psect $Code
Bell::
Mov #300.,R0 ;Sound length
Mov #100.,R1 ;Sound tone
Sound:: ;Sound Routine (R1 pulses of R0 width)
Mov @#$$SysS,R2
Mov #Keflg,R4
Xor R2,R4
10$: Mov R4,@#Sel1
Mov R1,R3
Sob R3,.
Mov R2,@#Sel1
Mov R1,R3
Sob R3,.
Sob R0,10$
Tst @#Sel1 ; Clear Write Flag
Return
.SbTtl BS - BackSpace Routine
.Psect $CodOvr
BS::
DecB CursX ; Move character left
Bpl 3$ ; BS at middle of the line
Bit #AWrp$$,TtoFlg ; BS across the line boundary
Bne 10$ ; Jump if not allowed
DecB CursY ; To the end of the previous line
Bpl SetCr1 ;
ClrB CursY ; Clear "CursX" and "CursY"
10$: ClrB CursX ; Otherwice nope
3$: Return ;
SetCr1: MovB StrLen,CursX ;
DecB CursX ;
Return
.SbTtl HT - Move the Cursor to the Next Tab Stop
HT:: MovB StrLen,R1
Sub #8.,R1
CmpB CursX,R1
Blo 10$ ; <= 72 ==> Modulo 8
IncB CursX ; else one position right
Br 20$ ;
10$: BicB #7,CursX ;
Add #8.,CursX ;
20$: CmpB CursX,StrLen ; Line overflow
Bhis SetCr1 ;
Return
.SbTtl LF Line/Feed Operation
LF:
IncB CursY
CmpB CursY,MaxLin
Blo 10$
DecB CursY
Call ScrlDw
10$: Return
.Psect $Code
.SbTtl VT delete the end of line
VT: Mov CrsAdr,R0
Mov R0,-(SP) ;Old CrsAdr
Mov #9.,R5 ; TV-Line counter
Call SetScS ;Map Screen
10$: Mov CrsAdr,R1 ;Deleted Byte Address
20$: MovB Bkgnd,(R1)+
Bit #77,R1 ;End Of Line ?
Bne 20$ ;No, Delete byte
Call NxTVLn ;Yes, Goto next Line
Sob R5,10$
Call SetScX ;Unmap Screen
Mov (SP)+,CrsAdr ;Restore Cursor Address
Return
.SbTtl FF Clear Screen
FF: Mov ScrBot,R0 ;Clear All Screen
Mov FfLng,R1
Mov Bkgnd,R2
Call SetScS ;Map Screen
10$: Mov R2,(R0)+
Bis #100000,R0
Bic #40000,R0
20$: Sob R1,10$
Call SetScX ;UnMap Screen
Jmp DC2
.SbTtl DC2 Home Routine
.Psect $CodOvr
DC2: Clr CursX
.SbTtl CR Carriage Return
CR: ClrB CursX
Return
.SbTtl SO Set Latin
SO:
Bis #Lat$$,TtoFlg
Bic #MixO$$,TtoFlg
Return
.SbTtl SI Set Cyrillic
SI:
Bic #MixO$$!Lat$$,TtoFlg
Return
.SbTtl DC4 Set the Mixed Character Set
DC4:
Bis #MixO$$,TtoFlg
Bic #Lat$$,TtoFlg
Return
.SbTtl SUB Cursor up
SUB: DecB CursY
Bgt 10$
ClrB CursY
10$: Return
.SbTtl DC3 Reverse "LF"
DC3:
DecB CursY
Bpl 10$
ClrB CursY
Call ScrlUp
10$: Return
.SbTtl ESC Cursor down
ESC: IncB CursY
CmpB CursY,MaxLin
Blo 10$
DecB CursY
10$: Return
.SbTtl NAK New Line
CLFRtn::
NAK: ClrB CursX
Br LF
.End

View File

@ -0,0 +1,706 @@
.Mcall .Module
.Module MON11,Release=X02, Version=03, Comment=<BK0011 Debugger>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl BootRX, LinTap, TtoFlg, Block$, SetWid
.Globl $MixAs, $Ascii, KbMode, MixO$$, AscO$$, KbdCsr
.Globl KbdDbr, Screen
.Macro Command Code,Addr
.Psect $CnsOvr
.If NB <Code>
.Byte Code
.Psect $Adrtab
.Even
.Word Addr
.IfF
.Byte 0
.EndC
.EndM
TBit = 20 ;T-Bit MASK - STATUS REGISTER
BptVec = 14 ;BPT interrupt vector
BLKR = 204
.Radix 2
Opnf$$ = 1 ; "Open" flag
Byte$$ = 10 ; Byte mode Mask
Semi$$ = 100 ; Semicolon found flag
SemN$$ = 1000 ; nnn; flag
Mins$$ = 10000 ; nnn+-mmm Minus flag
Rgn$$ = 100000 ; nnn+-mmm Flag
RsOf$$ = 1000000 ; "RS" Open flag
Num$$ = ^O200 ; Number was found (Must be 200!!)
RSFl$$ = 100000000 ; "RS" found flag
RnnF$$ = 1000000000 ; Number after "Rn" Flag
RnFl$$ = 10000000000 ; "Rn" was found
Rfl$$ = 100000000000 ; "R" was found
SyFl$$ = 1000000000000 ; System address space flag
.Radix 8.
.Psect $Code
.SbTtl User's Trap to 4 Handler
O.Tr4U::
Mov @#$$UsrS,-(SP)
Bic #^C<ScrMsk!TapMsk>,@SP
Bis #SysSel,@SP
Mov @SP,@#$$SysS ;Set System Allocation
Mov (SP)+,@#Sel1
Tst $UsrTrp ;User Trap To 4 Processing ?
Beq Debug ;No
Mov R0,@#$Svare ;Yes, Save R0
Mov $UsrTrp,R0 ;and clear Routine address
Clr $UsrTrp ;
Mov @#$$UsrS,Sel1 ;Set User Allocation
Tst Sel1
Clr -(SP) ;Set PS and PC and
Mov R0,-(SP) ;
Mov @#$Svare,R0 ;
Rtt ;Process user routine
.SbTtl BPT Breakpoint Handler
.SbTtl Entry Point
Debug::
O.BpT::
Mov #O.Tr4S,@#Vec4 ;Set system interrupt
Mov #340,@#Vec4+2
Mov (SP)+,@#$SavPC ;Save status and PC from stack
Mov (SP)+,@#$SavPS
Jsr 0,SavReg ;And Save Registers (Mainly SP)
.BTtyou #25 ;New line
Mov O.UPC,R0
ClC
Call OctTyp ;Print user's PC
MovB Screen,R0
Swab R0
ComB R0
.Bbufset ;Set Screen for indication
Bic #Byte$$!Opnf$$!Semi$$!Num$$!Rgn$$,R4 ;Clear flags
Clr R3
Jmp O.Dcd
.Dsabl Lsb
.SbTtl System Trap To 4
O.Tr4S::
Cmp (SP)+,(SP)+
Mov @#$$SysS,@#Sel1
;;; Mov @#$$UsrS,@#UsrSav
Mov @#$$SysS,@#$$UsrS
Tst @#Sel1
Mov CurAdr,R5 ;Restore CurAdr
Mov DebFlg,R4 ; and DebFlg
Tst @#KbdDbr
Clr @#KbdCsr
Jmp O.Err
.SbTtl Command Decoder entry point
.Psect $CodOvr
O.DCD: Call ClsCRL ;Type <CR><LF>@
O.Scan: Call GetC ;Get a char, return in R0
CmpB #'0,R0 ;Compare with Ascii 0
Bhi 30$ ;Check legality if non-numeric
CmpB #'7,R0 ;Compare with Ascii 7
Blo 30$ ;Check legality if not octal
Bit #Rfl$$,R4 ;"R" in progress ?
Beq 20$ ; No
Bit #RnFl$$,R4 ;"Rn" in progress ?
Bne 10$ ; Yes, "Rnn"
Bis #RnFl$$,R4 ; No, set "Rn" flag
Br 20$
10$: Bis #RnnF$$,R4 ;Set Rnn flag
20$: Bic #^C7,R0 ;Convert to binary
Asl R3 ; Make room
Asl R3 ; in
Asl R3 ; R3
Bis R0,R3 ;Pack three bits in Number
Bis #Num$$,R4 ;Set numeric flag
Br O.Scan ; and try again
.SbTtl Table Search
30$: Bit #RSFl$$,R4 ;"RS" in progress ?
Bne 40$ ;Yes
Bit #Rfl$$,R4 ;"R" in progress ?
Beq 40$ ;No
CmpB R0,#'S
Beq O.RS ;"RS" Operation
40$: Mov #CodTab,R1 ;Set table pointer
50$: TstB @R1 ;Is the search done?
Beq O.Err ;Yes, not match
CmpB R0,(R1)+ ;Do the codes match?
Bne 50$ ;Re-Loop if no
Sub #CodTab+1,R1 ;Get table offset
Asl R1 ;Multiply by two
Jmp @GoTab(R1) ;Go to proper routine
.SbTtl Error Processing
O.Err: Mov #DStack,SP ;Set up stack
Mov @#$$UsrS,@#Sel1
Tst @#Sel1
Bic #Block$,TtoFlg
.BTtyou #'? ; ? to be typed
Br O.DCD
.SbTtl Reset the Monitor
ClsCRL: .BPrint #LFAT ;Type <LF>@
Clr R3 ;Clear argument buffer
Bic #Opnf$$!Rgn$$!Num$$!Semi$$!Semn$$,R4
Return
.Psect $Const
LFAT: .Byte 25,'@,200
.SbTtl Command Table
.Psect $CnsOvr
CodTab:
.Psect $AdrTab
GoTab:
Command 220,O.Step ; <Step> Execute one command
Command 12,O.Cret ; <Enter> Close location
Command 1,O.Ctrl ; Double Width
Command 2,O.Ctrl ; Single Width
Command 14,O.Ctrl ; Control Code, Type it
Command 10,O.Orrb ; <Left Arrow> Open related, rel. branch
Command 31,O.Orpc ; <Right Arrow>Open related, index - PC.
Command 32,O.Back ; <Up Arrow> Open Previous
Command 33,O.Next ; <Down Arrow> Modify, Close, Open next
Command '$,O.Reg ; $ Register Ops
Command '-,O.Mins ; - Set Save/Load Region
Command '+,O.Plus ; + Set Save/Load Region
Command '/,O.Wrd ; / Open word
Command 73,O.Semi ; ; Semicolon
Command '@,O.Oind ; @ Open Indirect
Command 'B,O.Boot ; B Boot from disk
Command 'G,O.Go ; G Go to address nnnnn
Command 'C,O.Conn ; C Connect memory page
Command 'L,O.Load ; L Load Binary File
Command 'M,O.Motor ; M On/Off Taperecorder Motor
Command 'P,O.Proc ; P Proceed
Command 'R,O.Reg ; R Register Ops
Command 'U,O.Unlo ; U Unload Binary File
Command '_,O.Orpc ; <Underline> Open related, index - PC.
Command '\,O.Byt ; \ Open byte -back slash
Command 233,O.Wdth ; Lw/";" Width Setting (One byte More)
Command ']-100,O.Clr ; Ctrl/"\" Color Setting Sequence
Command ;END OF Command TABLE
.Psect $Const
WdtCd: .Byte 10,40,10,200
.Psect $CodOvr
O.Clr: .Bttyou
Mtps #0
10$: .BinKey
Bcs 10$
.Bttyou
20$: .BinKey
Bcs 20$
Mtps #340
.Bttyou
.Bttyou #25
Br O.Scan
O.Wdth: .Bprint #WdtCd ;BackSpace
Mtps #0
10$: .BinKey
Bcs 10$
Mtps #340
Bic #^C3,R0
Mov R1,-(SP)
Mov R2,-(SP)
Mov R3,-(SP)
Mov R4,-(SP)
Mov R5,-(SP)
Call SetWid ;Width Setting
Mov (SP)+,R5
Mov (SP)+,R4
Mov (SP)+,R3
Mov (SP)+,R2
Mov (SP)+,R1
Br O.Scan
O.Ctrl: .Bttyou
Br O.Scan
.SbTtl <+><-> Set Save/Load Region
.Enabl LSB
O.Plus: Bic #Mins$$,R4 ;Reset "Minus" Flag
Br 10$
O.Mins: Bis #Mins$$,R4 ;Set Flag
10$: TstB R4 ;Check for number
Bpl O.Err
Mov R3,Begadr ;Save Start Address Of Save/Load
Bic #Num$$,R4 ;Reset Number
Clr R3 ;
Bis #Rgn$$,R4 ;Set Region flag
O.Scn2: Br O.Scan ;and go
.Dsabl LSB
.SbTtl RS State Register Ops
O.Rs: Bit #RnFl$$,R4 ;"Rn" operation ?
Bne O.Err ;Yes, Error
Bic #Byte$$!Semi$$!Opnf$$!Rgn$$!Rfl$$!RnFl$$!Num$$!RnnF$$!RsOf$$,R4
Bis #RSfl$$!SyFl$$,R4 ;Set "RS" flag and System space
Clr R3 ;
Br O.Scn2
.SbTtl <B> - Boot from disk
O.Boot: Clr R0 ;Default unit No = 0
TstB R4 ;Test number flag
Bpl 10$ ;No Number
Mov R3,R0 ;Present ==> set unit No.
10$: Call BootRX
Br O.Err ;Error booting operating system
.SbTtl <R>,<$> - Register Ops
O.Reg:
Bic #Semi$$!Byte$$!Opnf$$!Rgn$$!RSFl$$!Num$$!RnFl$$!RnnF$$!RsOf$$,R4
Clr R3 ;
Bis #SyFl$$!Rfl$$,R4 ;Set Register Flags
Br O.Scn2 ;
.Psect $Code
.SbTtl <G> Go to address nnnnn; <P> - Proceed
O.Go:: Clr @#O.UPS ;
TstB R4 ;
Bmi 10$ ;No Number flag
Mov @#UserPC,R3 ;Default
Beq O.ERR9 ;
10$: Bit #1,R3 ;Check for odd address ?
Bne O.ERR9 ;
Mov R3,O.UPC ;Set up new PC
O.Proc: Bic #TBit,@#O.UPS ;Clear T-bit
O.Prc2: Mov O.UPC,@#$SavPC ;
Mov O.UPS,@#$SavPS ;
Mov #O.Tr4U,@#Vec4 ;Set User's vector
Mov #2340,@#Vec4+2 ;And status
Jsr R0,ResReg ;Restore registers, Set User Allocation
Mov @#$SavPS,-(SP) ; status
Mov @#$SavPC,-(SP) ; and PC
Rtt ; Then GOTO...
.SbTtl Process <Step> - Execute One Command
O.Step: Bis #TBit,@#O.UPS
Mov #O.BPT,@#BptVec
Mov #2340,@#Bptvec+2
Br O.Prc2
.SbTtl Process C Connect memory page
O.Conn::Bit #Semi$$,R4 ;Test semicolon found flag
Beq O.ERR9 ;Clear ==> Error
TstB R4
Bpl O.ERR9 ;No Number
Mov @#UsrSav,@#$$UsrS
Mov SP,SPTMP
Mov O.USP,SP
Mov @#$$UsrS,@#Sel1
.BSETPG R2,R3
Mov @#$$SysS,@#Sel1 ;Connect memory page
Mov SPTMP,SP
Bcs 10$ ;Error
Mov @#$$UsrS,UsrSav ;
Mov @#$$SysS,@#$$UsrS
Tst @#Sel1
Jmp O.Dcd ;Normal return
10$: Mov @#$$SysS,@#$$UsrS
Tst @#Sel1
O.ERR9: Jmp O.Err ;Error Return
.SbTtl Semicolon processing
.Psect $CodOvr
O.Semi: TstB R4 ;A semi-colon has been received
Bpl O.Err1
Bis #Semi$$,R4 ;Numeric flag to Semi$$,
Mov R3,R2 ;Number to SemNum
Bit #Rgn$$,R4 ;Is "Region" flag found
Beq 10$ ;No
Mov R3,Lngth ;Second Region bound ?
Beq O.Err1 ;Not found, Error
Bit #Mins$$,R4 ;
Beq 10$ ;"+"
Sub BegAdr,Lngth ;"-"
10$: Clr R3
Bic #Num$$,R4
Br O.Scn1 ;Go back for more
O.Err1: Jmp O.Err
.SbTtl Process / and \ - Open Word or Byte
.Enabl LSB
;Input - If Num$$ is ON a new rexp has been typed in
;Input - -address of word to be opened is in R3
O.Wrd: Bic #Byte$$,R4 ;Open word
Br 20$
O.Byt: Bit #RnnF$$,R4
Bne 10$
Bit #Rfl$$!RnFl$$!RSFl$$,R4 ;
Bne O.Err1 ;Illegal byte operation
10$: Bis #Byte$$,R4 ;Open byte
20$: Bit #RsFl$$,R4 ;
Bne 50$ ;Open RS
TstB R4 ;Set Address if Num$$ is non-zero
Bpl 70$ ;skip otherwise - reopen previous location
Bit #RnFl$$,R4 ;"Rn" operation ?
Bne 30$ ;Yes
Bic #SyFl$$,R4 ;Clear System State Address flag
30$: Bic #RsOf$$,R4 ;
Bit #RnnF$$,R4 ;"Rnn/" ?
Beq 40$ ;No
Bic #Rfl$$!RnFl$$!RnnF$$!Syfl$$!RsOf$$,R4
;Clear R, Rn, Rnn, Syst.Addr
40$: Bit #Rfl$$,R4 ;"Rn/" ?
Beq 60$ ;No
Asl R3 ;Generate Register Address
Add #O.UR0,R3 ;
Br 60$ ;
50$: Mov #O.UPS,R3 ;Yes, set appropriate address
Bis #SyFL$$!RsOf$$,R4 ;Set "RS Open flag"
Bic #RSFl$$,R4 ;Clear "RS" flag
60$: Mov R3,R5 ;Save new current address
Open:
70$: Call TypWB ;Get Word or Byte and type it
O.Scn1: Jmp O.Scan ; Wait for another char
.Dsabl LSB
.SbTtl Process <Enter> - Close Location
O.Cret: Call Close ;Close Location
Br O.DcD1 ;Return to decoder
.SbTtl <Down Arrow> Modify, Close, Open next
O.Next: Call Close ;Close location
Bit #RsOf$$,R4 ;Was it PS?
Bne O.DcD1 ;Yes, exit
Bit #Byte$$,R4 ;Byte operation ?
Bne 10$ ;Yes
Inc R5 ;Modify Address
10$: Inc R5 ;
O.Nxt1: .BTtyou #25 ;New Line
.BTtyou #40
Bit #Rfl$$,R4 ;"R" operation ?
Beq 10$ ;No
.BTtyou #'R ;
Sub #O.UR0,R5 ;Correct Register Address
Bic #^C16,R5 ;
Mov R5,R0 ;
Add #O.UR0,R5 ;
Asr R0 ;Get register number
Add #'0,R0
.BTtyou
.BTtyou #40
Br 20$
10$: Mov R5,R0
Clc
Call OctTyp ;Print Address
20$: Mov #"/\,R0
Bit #Byte$$,R4
Beq 30$
Swab R0
30$: .BTtyou
Br Open ;And open location
.SbTtl <Up Arrow> Open Previous Location
O.Back: Call Close ;Close location
Bit #RsOf$$,R4 ;Was it PS ?
Bne O.DcD1 ;Yes, exit
Bit #Byte$$,R4 ;Byte operation ?
Bne 10$ ;Yes
Dec R5 ;Modify Address
10$: Dec R5 ;
Br O.Nxt1 ;Go do the rest
.SbTtl Process @ - Open Indirect
.Enabl LSB
O.Oind: Call Close ;Close current location
Bit #Byte$$,R4 ;Test for byte mode
Bne O.Dcd1 ;Byte is illegal
Call GetWB ;Get the word
Bic #RsOf$$!SyFl$$!Rfl$$!Rnfl$$!RnnF$$,R4 ;Clear flags
Br 10$ ;
O.Dcd1: Jmp O.DcD
.SbTtl Underline Handler - Open Indexed on the PC
O.Orpc: Call O.TCls ;Test mode and close
Bcs O.DcD1 ;Illegal
Add R5,R0 ;Compute
Add #2,R0 ; new address
10$: Mov R0,R5 ;Update current address
Br O.Nxt1 ;Go finish up
.SbTtl Process > - Open Related, Rel. Branch
O.Orrb: Call O.TCls ;Test mode and close
Bcs O.DcD1 ;Illegal
MovB R0,R0 ;Extend the sign
Asl R0 ;R0=2(@CurAdr)
Inc R0 ; +2
Inc R0
Add R5,R0 ; +PC
Br 10$
.Dsabl LSB
O.TCls: Call Close ;Close current location
Bit #SyFl$$!Byte$$,R4 ;System Register or Byte
Beq 10$ ;No
SeC ;Yes, Error
Return
10$: Call GetWB
ClC
Return
.DSABL LSB
.SbTtl GetWB - General Word or Byte Get Routine
.Psect $Code
GetWB: Mov R5,CurAdr
Mov R4,DebFlg
Bit #SyFl$$,R4 ;User's memory ?
Bne 10$ ;No
Bit #SyFl$$,R4 ;User's memory ?
Bne 10$ ;No
Cmp R5,#160000
Bhis 10$ ;No
Mov @#UsrSav,@#$$UsrS
Mov @#UsrSav,@#Sel1
10$: Bit #Byte$$,R4 ;Byte mode ?
Bne 20$
Bic #1,R5
Mov @R5,R0 ;No, get the word
Br 30$
20$: MovB @R5,R0 ;Yes, get the byte
30$: Mov @#$$SysS,@#$$UsrS
Mov @#$$UsrS,@#Sel1
Tst @#Sel1
Return
.SbTtl TypWB - General Word or Byte Typing
.Psect $CodOvr
TypWB: Call GetWB ;Get Word or Byte
Mov R0,-(SP)
Bit #Byte$$,R4 ;Byte mode?
Beq 10$ ;No
SeC
10$: Call OctTyp ;and type it
Clr R3 ;Reset numeric arg
Bic #Semi$$!Rgn$$!Num$$,R4
Bis #Opnf$$,R4 ;Set "Open" mode
Mov (SP)+,R0
Return ;and exit
.SbTtl PutWB - General Word or Byte Put Routine
.Psect $Code
PutWB: Mov R5,CurAdr
Mov R4,DebFlg
Mov R3,R1 ;Number to we written
Mov @#UsrSav,@#$$UsrS
Bit #SyFl$$,R4 ;User's memory ?
Bne 10$ ;No
Cmp R5,#160000
Bhis 10$ ;No
Cmp R5,#100000
Blo 15$
Bit #RomMsk,@#$$UsrS
Beq 15$
Clr @#140000 ;Trap to 4 Simulation
15$: Mov @#UsrSav,@#Sel1
Tst @#Sel1
10$: Bit #Byte$$,R4 ;Byte mode ?
Bne 20$
Mov R1,@R5 ;No, write the word
Br 30$
20$: MovB R1,@R5 ;Yes, write the byte
30$: Mov @#$$SysS,@#Sel1
Mov @#$$UsrS,UsrSav
Mov @#$$SysS,@#$$UsrS
Tst @#Sel1
Return
.SbTtl Location Close Routine
.Psect $CodOvr
Close: TstB R4 ;Was the number ?
Bpl 20$ ;No
Bit #Opnf$$,R4 ;Was location open ?
Beq 20$ ;No
Bit #RsOf$$,R4 ;Was it PS ?
Beq 10$ ;No
Bic #^C357,R3 ;Yes, Clear T-bit etc.
10$: Call PutWB ;Put word or byte
20$: Bic #Opnf$$,R4 ;Clear "Open" flag
Return ;And exit
.SbTtl Type Out Contents of Word or Byte
.Psect $Code
OctTyp::Mov R3,-(SP)
Mov R4,DebFlg ; and DebFlg
Mov #6,R3 ;# of digits
Mov #-2,R4 ;# of bits first-3
Bcc 10$ ;See if word mode
;Branch if so
Asr R3 ;Only do 3 digits
Inc R4 ;do 2 bits first
Swab R0 ;And turn R0 around
10$: Mov R0,-(SP) ;Save R0
20$: Add #3,R4 ;Compute the number of bits to do
Clr R0
30$: Rol (SP) ;Get a bit
Rol R0 ;Store it away
Sob R4,30$ ;Loop if more bits needed
Add #'0,R0 ;Convert to Ascii
.BTtyou ;Type it
SoB R3,20$ ;Loop if more digits to do
Tst (SP)+ ;Get rid of junk
Mov DebFlg,R4
Mov (SP)+,R3
.BTtyou #40 ;Type trailing space
Return
.SbTtl L - Load Binary File
O.Load: Clr R1
Clr R0
TstB R4 ;Load Address ?
Bpl O.Ld1 ;No
Mov R3,R0 ;Yes, Move to R0
O.Ld1: Mov R5,-(SP)
Call LINTAP
Mov $$SysS,@#Sel1
Tst @#Sel1
Mov (SP)+,R5
Clr R4
Jmp O.DcD
.Psect $CodOvr
.SbTtl U - Unload From Memory to Binary File
O.Unlo: Call TstRgn
Mov #1,R1
Jmp O.Ld1
O.Err2: Jmp O.Err
TstRgn: Bit #Semi$$,R4 ;nnn+-mmm;xxxLU
Beq O.Err2 ;No ";", Error
Clr R0
TstB R4 ;Start Address ?
Bpl 10$ ;No
Mov R3,R0
Beq O.Err2 ;Illegal address
Cmp R0,Begadr
Blo O.Err2
Mov BegAdr,R3
Add Lngth,R3
Cmp R0,R3
Bhis O.Err2
10$: Return
.SbTtl M - On/Off Taperecorder Motor
O.Motor:Clr R0
TstB R4 ;Numeric Argument Found?
Bpl 10$ ;No
Mov R3,R0 ;Yes, get it
Bis #MOT$$$,@#$$SysS
Bis #MOT$$$,@#$$UsrS
Bis #MOT$$$,@#UsrSav
10$: Tst R0 ;Motor ON ?
Beq 20$ ;No, OFF
Bic #MOT$$$,@#$$SysS;Set motor on
Bic #MOT$$$,@#$$UsrS;Set motor on
Bic #MOT$$$,@#UsrSav;Set motor on
20$: Mov @#$$UsrS,@#Sel1
Tst @#Sel1
Jmp O.DcD1 ;And exit
.SbTtl General Character Input Routine
;
; Character input goes to R0
;
Getc: Mov R5,CurAdr ;Save CurAdr
Mov R4,DebFlg ; and DebFlg
Mtps #0
10$: .BinKey ;Get character
Bcs 10$
Mtps #340
Bis #Block$,TtoFlg
.BTtyou
Bic #Block$,TtoFlg
Return
.SbTtl Set System State, Save Registers R0-R6
.Psect $Code
SavReg: Mov R0,@#$Svare ;Save Return Address
Mov @#$$UsrS,R0
Bic #^C<ScrMsk!TapMsk>,R0
Bis #SysSel,R0
Mov R0,@#$$SysS
Mov (SP)+,R0 ;Restore R0
Mov @#$$SysS,@#Sel1
Mov SP,O.USP ;Save User Stack Address
Mov #DStack,SP ;Set Debugger Stack
Mov R0,O.UR0
Tst @#Sel1
Mov @#$$UsrS,UsrSav ;
Mov @#$$SysS,@#$$UsrS ;
Mov @#$SavPS,O.UPS ;Save User's PS
Mov @#$SavPC,O.UPC ;Save User's PC
Mov #O.UR0+2,R0 ;Set to Internal Save Area
Mov R1,(R0)+ ;Save
Mov R2,(R0)+ ; registers
Mov R3,(R0)+ ;1
Mov R4,(R0)+ ; thru
Mov R5,(R0)+ ; 5
Mov CurAdr,R5 ;Restore CurAdr
Mov DebFlg,R4 ; and DebFlg
; Mov KbMode,KbmSav ;Save mode
; Bis #$MixAs!$Ascii,KbMode
; Bis #MixO$$!AscO$$,TtoFlg
Jmp @$Svare ;Exit
.SbTtl Restore Registers R0-R6
ResReg: Mov R0,@#$Svare ;Return Address
Mov @#UsrSav,@#$$UsrS ;
Mov R5,CurAdr ;Save CurAdr
Mov R4,DebFlg ; and DebFlg
; Mov KbmSav,R0 ;
; Bic #^C$MixAs!$Ascii,R0
; Bic #^C$MixAs!$Ascii,KbMode
; Bis R0,KbMode ;Restore keyboard status
Mov #O.UR0+2,R0 ;Set Savearea Pointer
Mov (R0)+,R1 ;
Mov (R0)+,R2 ;
Mov (R0)+,R3 ;Restore
Mov (R0)+,R4 ;registers
Mov (R0)+,R5 ;0
Mov (R0)+,SP ;thru 6
Mov O.UR0,R0 ;
Mov @#$$UsrS,@#Sel1 ;
Tst @#Sel1
Jmp @$Svare ;and EXIT
.SbTtl Working Cells
.Psect $RAM
KbmSav: .BlkW ;KbMode Save Area
$UsrTrp:: .BlkW ;User's Trap to 4 Routine
BegAdr:: .BlkW ;nnnn+-mmmmm Address
Lngth:: .BlkW ;nnnn+-mmmmm Address
DebFlg: .BlkW ;Internal flags
CurAdr: .BlkW ;Current location address Save Area
UsrSav:: .BlkW ;
O.UPS: .BlkW ; PS
O.UR0: .BlkW ;User R0
O.UR1: .BlkW ; R1
O.UR2: .BlkW ; R2
O.UR3: .BlkW ; R3
O.UR4: .BlkW ; R4
O.UR5: .BlkW ; R5
O.USP: .BlkW ; SP
O.UPC: .BlkW ; PC
SPTMP:: .BlkW
.Psect $Stack
.BlkW 300
Dstack::
.Psect $Const
.Even
.Psect $CnsOvr
.Even
.End

View File

@ -0,0 +1,776 @@
.Mcall .Module
.Module BKDSK,Release=X02, Version=07, Comment=<BK0011 Floppy-Disk Handler>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl SavRg, RetEmt, GetUWD, PutUWD, UsrSav,PrePare,SelTbl,AdrSel
.Globl Window
.Iif NDF MY6021, MY6021=1
.SbTtl MY-Compatible Mini floppy disk Handler Request Block
;
; for Read/Write
; +-------+-------+
; !Sid,Un.! 0 ! 0 Operation Code=0
; +-------+-------+
; ! Track ! Sector! 2
; +-------+-------+
; ! Memory Address! 4 User Buffer Address
; +-------+-------+
; ! Pag1 ! Pag0 ! 6 Page No ( Upper wind, Lower wind.
; +-------+-------+ < 0==>Current)
; ! Length (Bytes)! 10 Buffer Length (WORDS!!)
; +---------------+
;
;
; for Parameter Setting
; +-------+-------+
; !Par No ! 1 ! 0
; +-------+-------+
; ! Par Value ! 2
; +---------------+
;
;
; for Formatting
; +-------+-------+
; !Sid,Un.! 123 ! 0
; +-------+-------+
; ! Track ! ! 2
; +---------------+
;
;
ArgLng = 12/2 ;Word Counter of Arg Block
;
; CODE is the operation code:
;
ReWrit = 0 ;Read or Write
PrmSet = 1 ;Parameter Setting
Format = 123 ;Format Track
MYInit = 377 ;Initialize Handler
;
;Error Codes returns in ErrByt as:
;
$.WlCC = 1 ;Write lock or data CRC Error
$.CcId = 2 ;Id CrC Error
$.Nhom = 3 ;Home Error
$.Seek = 4 ;Seek Error
$.Snfn = 5 ;Sector not found
$.Stop = 6 ;No Disk Motion
$.Tr4 = 7 ;NonExistent RAM error
$.NfAM = 10 ;Address Mark not found
$.NfDM = 11 ;Data Mark not found
$.Nstd = 12 ;Non-Standard disk format
.SbTtl Minifloppy Controller (1801WP1-097) Registers
Csr097 = 177130 ;State Register
Dat097 = 177132 ;Data Register
;
;Read ==> Write Off
;Write ==> Write ON
;
;
;Csr Bit Masks
;
;Write only
;
DS0 = 1 ;Device Select Bits
DS1 = 2 ;
DS2 = 4 ;
DS3 = 10 ;
Msw = 20 ;Motor On switch
USide = 40 ;Upper Disk Side
Dir = 100 ;Step Direction (0 ==> Inside)
Step = 200 ;Step
GoR = 400 ;Go Reading Process (Clear Sh. Reg and
;wait for index mark
WM = 1000 ;Write Index Mark
Rez = 2000 ;Compensation switching
;
;Read Only
;
Tr0 = 1 ;Track 0 (Home)
Rdy = 2 ;Ready (Not Used)
Wrp = 4 ;Write Protect
Drdy = 200 ;Data Ready
CRC = 40000 ;Crc Error
Ind = 100000 ;Indeks Mark
;
.SbTtl Disk Format Constants
$4E4E = 047116 ;Gap Code
$A1A1 = 120641 ;Mark Data
$A1FB = 120773 ;Normal data mark
$FBA1 = 175641
$A1F8 = 120770 ;Deleted data mark
$F8A1 = 174241
$FEA1 = 177241 ;Sector id mark
$A1FE = 120776
SecLen = 400
Gap3 = 18. ;Gap3 Length
Gap4 = 84. ;Gap4 Length
MaxSec = 10. ;Max Sector No
.SbTtl Floppy-Handler initialization
.Psect $Code
.Enabl LSB
RXini::
Clr GmdFlg
Mov @#Vec4,Ini4S
Mov #Ini4V,@#Vec4
Clr @#Csr097 ;
Call StpAll ;Stop all units
Br 10$
Ini4V: Mov #-1,GmdFlg
Cmp (SP)+,(SP)+
10$: Mov Ini4S,@#Vec4 ;Restore vector
Mov #TrkTab,R0 ;Forget all Track Numbers
Mov #-1,(R0)+
Mov #-1,(R0)+
.If EQ MY6021
Mov #6240.,TimUp ;Head Up Time for 6121
Mov #700.,TimTrk ;Track to track =
MovB #80.,TrkCor ;No Correction Switching
.IfF
Mov #10000.,TimUp ;Head Up =
Mov #5000.,TimTrk ;Track to Track =
MovB #24.,TrkCor ;Correction at track 24.
.EndC
Ror GmdFlg ;No disk ==> C=1
Return
.Dsabl LSB
.Save
.Psect $RAM
GmdFlg: .BlkW
Ini4S: .BlkW
.Restor
.SbTtl Routine to Dismount All Units, Stop Motor
StpAll: Tst GmdFlg
Bne 10$
Clr CsrW ;Clear All Units
Mov CsrW,@#Csr097 ;
Tst @#Dat097 ;Disable Writing
10$: Return
.Psect $CodOvr
BootRX::
Mov #Btab,R1
Bic #^C3,R0 ;Unit No
Swab R0
Mov R0,(R1)+ ;Unit No, Side
Mov #1,(R1)+
Mov #1000,(R1)+ ;Address
Mov #-1,(R1)+ ;Pages
Mov #400,(R1)+ ;400 Words
.Bdisk #Btab
Bcs 10$
Cmp @#1000,#240
Bne 10$
Call @#1000
Sec
10$: Return
Btab == 2000
.SbTtl $BDisk (EMT 70) Routine (Floppy-Disk Request)
.Psect $CodOvr
$Bdisk::
Jsr R0,SavRg ;Save Registers
ClrB ErrFlg ;Error flag
ClrB @#ErrByt ;Clear Error code
Mov @#Vec4,Sav4 ;Save Vector 4
Mov #DskV4,@#Vec4 ;And Set Temporary Vector
Mov SP,SPSave ;Save stack pointer value
Tst GmdFlg
Bne IllCmd ;No disk controller
Mov #ArgLng,R1 ;Byte Counter of Arg Block
Mov #Code,R2 ;System Working Area for handler
Mov R0,R5 ;Argument Block Address
10$: Call GetUWd
Mov R0,(R2)+ ;Move Arg Block to System Area
Sob R1,10$
MovB Code,R0 ;Command Code
Mov #TabFnc,R1
20$: Mov (R1)+,R2
Tst @R1
Beq IllCmd
CmpB R0,R2
Beq 30$
Tst (R1)+
Br 20$
30$: Call @(R1)+
Jmp Exit
.Save
.Psect $CnsOvr
TabFnc: .Word ReWrit, $Rewr, PrmSet, $Prmt, Format, $Frmt
.Word MYInit, RXIni, 0, 0
.Restore
IllCmd: Clr R0 ;Error 0
Jmp ErrExt ;Illegal Command
.SbTtl Parameter Setting Command
$Prmt: MovB Code+1,R0
Asl R0
Cmp R0,#MaxPrm
Bhi IllCmd
Tst Code+2
Beq IllCmd
Mov Code+2,@PrmTab(R0) ;Set Parameter
Return
.Psect $Code
DskV4: MovB #$.Tr4,R0 ;Set Error Code
ErrExt: MovB #-1,ErrFlg
Mov @#$$SysS,@#Sel1 ;
Mov SPSave,SP ;Restore Stack Pointer
MovB R0,@#ErrByt
Exit: Call StpAll ;Stop all Units
Mov Sav4,@#Vec4 ;Restore Vestor 4
RorB ErrFlg
Jmp RetEmt
.SbTtl Track Formatting
.Psect $CodOvr
$Frmt: Call SelUni ;Select Unit Desired
Call Seek ;Seek track
Call SetDev ;Set Correction
Bit #Wrp,@R4 ;Write protection ?
Beq 20$ ;No
Mov #$.WlCC,R0 ;Yes, Set Error Code
10$: Jmp ErrExt
20$: Swab SidTrk ;Side*400+Track;Prepare Code for Write
30$: MovB #MaxSec,R3 ;Sector Counter No
Mov #2*400+1,R2 ;Sect No, Length code
Clr R0
40$: Tst @R4 ;Index ?
Bpl 60$ ;No
Sob R0,40$ ;Sometime wait
;Index hole too large or no index -- No disk Motion
50$: Tst @R5 ;Reset Writing
Mov #$.Stop,R0
Br 10$ ;And exit
;Write not Index Zone By 4E4E (Hex)
60$: Clr R0 ;Write track by 4E4E
Mov #$4E4E,@R5
70$: Tst @R4 ;Index ?
Bmi 90$ ;Yes
80$: TstB @R4 ;Wait for Ready
Bpl 80$
Mov #$4E4E,@R5 ;And write data
Sob R0,70$ ;Check for finitivity
Br 50$ ;Track too long
90$: Mov #16.,R0 ;Index Founded, Write 32* "4E"
Mov #$FEA1,DatTyp ;Marker = Address mark
FrmSec: Call WrtId ;Write 4E4E and Mark
10$: TstB @R4 ;Wait for Ready
Bpl 10$
Mov SidTrk,@R5 ;Write Track No, Side
Mov CsrW,@R4 ;Clear WM bit
20$: TstB @R4 ;Wait for Ready
Bpl 20$
Mov R2,@R5 ;Sector No, Length code
Mov #11.,R0 ;Gap Length
Mov #$FBA1,DatTyp ;
30$: Bit #CRC,@R4 ;Wait for CRC writing
Beq 30$
Call WrtId ;Write gap and data mark
Mov #SecLen-1,R0 ;Sector Length
40$: TstB @R4
Bpl 40$
Mov #"@@,@R5 ;Write sector with filler
Mov CsrW,@R4
50$: TstB @R4
Bpl 50$
Mov #"@@,@R5
Sob R0,50$
Inc R2 ;Next sec
Mov #Gap3,R0 ;Gap Length
Mov #$FEA1,DatTyp ;Data code
60$: Bit #CRC,@R4 ;Write CRC
Beq 60$
Sob R3,FrmSec ;Count Sectors
Efrmt: TstB @R4 ;End of Track Writing
Bpl Efrmt
Mov #$4E4E,@R5 ;Write 4E4E
Tst @R4 ;Index ?
Bpl Efrmt ;No, write Again
Mov #5,R0 ;Write 5*4E4E
10$: TstB @R4
Bpl 10$
Mov #$4E4E,@R5
Sob R0,10$
Tst @R5 ;Set writing OFF
Retu: Return ;and exit
.SbTtl Read/write Processing
$ReWr: Mov #20.,Retry ;Retry Counter
ClrB WrtFlg ;Write flag
TstB Sectr ;Sector Number
Beq Nstd
CmpB Sectr,#MaxSec
Bhi Nstd
Tst Wcnt
Beq Retu ;Nothing to read/write
Bpl 10$ ;Read
Neg Wcnt
IncB WrtFlg ;Set Write Flag
Mov #$FBA1,DatTyp ;Normal Data mark
10$: Mov Address,R1 ;User Bus Address
Mov Wcnt,R2 ;Word to Byte Counter
Asl R2
Mov SelS,R5 ;Sel Address
Call Prepare
Bcc 20$
Mov #13,R0 ;$.Tr4,R0
Br Err2
20$: Mov Address,R2
Bic #140000,R2
Mov #SelTbl+2,AdrSel
Call SelUni ;Select Unit
TstB WrtFlg
Beq 30$
Bit #Wrp,@R4 ;Write Protected ?
Beq 30$ ;No
Mov #$.WlCC,R0 ;Write Lock Error
Br Err2
30$: Call Seek ;Seek Track
Call SetDev ;Set Unit Parameters
.SbTtl Sector Id Get Routine
MovB #$.NfAM,Flags ;Prepare Diag
40$: Call SearAm ;Search for Address Mark
Bcc 50$ ;OK
MovB Flags,R0 ;AM Not Found (Turns...)
Br Err2
50$: Call TwoWrd ;Read two words of header
Call CrcChk ;Check Crc
Bne 60$
MovB #$.CcId,Flags
Br 40$ ;CRC Error
60$: Bic #^C3,R1 ;Sector Length Code
CmpB R1,#2 ;Normal
Bne Nstd
Jmp ReaCom ;No, Error
Nstd: Mov #$.Nstd,R0 ;Non Standard Format
Err2: Jmp ErrExt
.SbTtl Track Seting done, Format Checked
.Psect $Code
ReaCom:
10$:
;
;;;; Mov #20.,Retry
;
Cmp Wcnt,#SecLen ;Sector Length
Blo 20$ ;Single-Sector operation
Clr SkpCnt ;More then one Sector
Br 30$
20$: Mov #SecLen,SkpCnt ;Set Counter for
Sub Wcnt,SkpCnt ;Data words to skip
30$: Call SearAM ;Address Mark Search
Bcc 40$
35$: Dec Retry
Bpl 30$ ;Retry once more
Mov #$.SnFn,R0
Br ErrExt
40$: TstB @R4 ;Wait for Data Ready
Bpl 40$
Cmp SidTrk,@R5 ;It's needed track/Side ?
Beq 50$ ;Side+<Track*400>
MovB #-1,@CurTrk
Br 35$ ;No, Again
50$: TstB @R4 ;Wait for data ready
Bpl 50$
Mov @R5,R1 ;Get Sector Number, Length
Swab R1
CmpB Sectr,R1 ;Compare sector No
Bne 30$ ;Not Equal, Once more
Mov #SecLen,R1 ;Length word to skip
Sub SkpCnt,R1 ;Words to read
Call CrcChk ;Check for legal CRC
Bne SecPrc ;OK, Process sector
Mov #$.CcId,R0 ;Id CRC Error
Br ErrExt
.SbTtl Sector Procesing Routine
SecPRC: Mov @AdrSel,@#Sel1
TstB WrtFlg ;Write ?
Bne WRICom ;Yes
.SbTtl Read Sector Routine
Call RdZero ;No, Search for Zero
TstB ErrCnt ;Founded
Beq 20$ ;No, Error - No data mark
Call StrtRd ;Set Go Reading
Mov #200.,R0
10$: TstB @R4 ;Wait for data Ready
Bmi 30$
Sob R0,10$
20$: Mov #$.NfDM,R0 ;Data mark not found
Br ErrExt
30$: Tst @R5 ;Skip A1A1 data
40$: TstB @R4 ;Wait for data ready
Bpl 40$
Mov @R5,R0 ;Data mark
Cmp #$A1FB,R0 ;Normal ?
Beq 50$ ;Yes
Cmp #$A1F8,R0 ;Deleted data ?
Bne 20$ ;No, Error
50$: Call ReaWrd ;Read Word to User Buffer
Call CrcChk ;Check CRC
Bne ChkAll ;OK
Mov #$.WlCC,R0 ;Data CRC Error
Br ErrExt ;
.SbTtl Multi-Sector Operations
ChkAll: Mov @#$$SysS,@#Sel1
Sub #SecLen,Wcnt ;All data processed ?
Bhi NxtSec ;No, Process next Sector
ClrB ErrByt
Return ;Yes, Exit
NxtSec: IncB Sectr ;Next Sect No
CmpB Sectr,#MaxSec ;Next Track ?
Blos 30$ ;no
Bit #USide,CsrW ;Upper side ?
Bne 10$ ;Yes
IncB SidTrk ;No, Skip to upper side
Bis #USide,CsrW ;Reset Side Flag
MovB #20.,Turns ;Max Turn Number
Br 20$ ;Side+<Track*400>
10$: Bic #USide,CsrW ;Reset Side Flag
IncB Track ;Go next Track
Call Seek ;Seek Track
MovB Track,SidTrk+1 ;
ClrB SidTrk ;Clear Side flag
20$: MovB #1,Sectr ;Sector = 1
Call SetDev ;Set Correction
30$: Jmp ReaCom
.SbTtl Write Commands processing
WRICom: Mov #11.,R0 ;"4E4E" Counter
Call WrtId ;Write Data Id Mark
Call WriUwd ;Write User Word
Mov CsrW,@R4 ;Command code
Dec R1 ;Loop Counter for Sector
Beq 20$ ;
10$: Call WriUwd
Sob R1,10$ ;and Loop
.SbTtl Sector end Zero filling
20$: Mov SkpCnt,R1 ;Filling Space Counter
Beq 40$ ;No Filling
30$: TstB @R4 ;Write a word of Zero
Bpl 30$ ;
Mov #0,@R5 ;
Sob R1,30$ ;
40$: Bit #CRC,@R4 ;Wait for CRC Writing
Beq 40$
Mov #$4E4E,@R5 ;Write GAP
50$: TstB @R4
Bpl 50$
Tst @R5 ;And Set Writing OFF
Br ChkAll ;Check for operation Complete
.SbTtl Read until Not Zero
.Psect $Code
RdZero: Tst @R5 ;Skip Data
MovB #100.,ErrCnt ;Time counter
10$: TstB @R4
Bpl 10$
Mov @R5,R0 ;Get Data
Beq 20$ ;Zero, Exit
Inc R0
Beq 20$ ;Complement Zero
DecB ErrCnt
Bne 10$ ;time count
20$: Return
.SbTtl Routine to read two disk words
.Psect $CodOvr
TwoWrd:
10$: TstB @R4 ;Wait for Data Ready
Bpl 10$
Mov @R5,R0 ;Read data Word
20$: TstB @R4
Bpl 20$
Mov @R5,R1 ;Read another word
Return
.SbTtl Address Mark Search Routine
.Psect $Code
SearAm: Mov #15.,R0 ;Time counter
10$: Tst @R5 ;Clear Data
Sob R0,10$ ;timeout
.SbTtl Initial Zero skiping (not index)
Clr R1 ;Index Flag
Clr IndTim ;Time of Index
Clr Index
.SbTtl Check for Data
20$: Call ChkInd
Bcs 100$
Beq 20$ ;Zero, skip it
Com R0
Beq 20$ ;---"----"-----
30$: Call ChkInd
Bcs 100$
Beq 40$
Com R0
Bne 30$
.SbTtl Real Adress mark Checking
40$: MovB #3,ErrCnt ;Retry Counter
50$: Mov @R5,R0 ;Data = Zero ?
Beq 60$ ;Yes,
Com R0 ;Inverted Zero ?
Bne 20$ ;No
60$: DecB ErrCnt ;Yes, Wait once more
Bne 50$
Call StrtRd ;Set GoR
Mov #20.,R0
70$: TstB @R4 ;Wait for Data ready
Bmi 80$ ;Ready
Sob R0,70$ ;Not Ready, Timeout
Br 20$
80$: Tst @R5 ;Skip Data
90$: TstB @R4 ;Wait for data ready
Bpl 90$
Cmp #$A1FE,@R5 ;Is it Address mark ?
Bne 20$ ;No, Repeat once more all program
ClC
100$: Return
.SbTtl Check for Index
ChkInd: Mov Index,R1
Mov @R4,R0 ;Index ?
Bpl Ind0 ;It's No Index
;It's Index
Tst Index
Bne Ind11
Ind01:
Clr IndTim ;Time of Index
Mov @PC,Index
DecB Turns
Bne ExChk
Sec
Return
ExChk: ClC
Mov @R5,R0
Return
Ind0: Tst Index
Beq Ind00
Ind10: Clr IndTim
Clr Index
Br ExChk
;Old Index
Ind00:
Ind11: Inc IndTim
Cmp IndTim,#65500.
Blos ExChk
Mov #$.Stop,R0
Jmp ErrExt
.SbTtl INTERNAL PROCEDURES
.SbTtl Check CRC-Bit
CrcChk: MovB #15.,ErrCnt
10$: Bit #CRC,@R4 ;CRC OK ?
Bne 20$ ;Yes
DecB ErrCnt ;No, Wait
Bne 10$ ;Exit on time-Out
20$: Return
.SbTtl (R0)* "4E4E", 6*"0000","A1A1",Dattyp Writing Routine
WrtId: Mov #$4E4E,@R5 ;Write 4E4E
10$: TstB @R4
Bpl 10$
Mov #$4E4E,@R5 ;.....
Sob R0,10$ ;Write R0 Times
Mov #6.,R0
20$: TstB @R4
Bpl 20$
Mov #0000,@R5 ;Write Zeroes
Sob R0,20$
Bis #WM,CsrW ;Write Mark
30$: TstB @R4
Bpl 30$
Mov #$A1A1,@R5
Mov CsrW,@R4
Bic #WM,CsrW ;Prepare for MW clearing
40$: TstB @R4
Bpl 40$
Mov DatTyp,@R5 ;Write mark
Return
.SbTtl Start of Read Sequence
StrtRd: Bis #GoR,CsrW ;Set and Clear GoR
Mov CsrW,@R4 ;Set..
Bic #GoR,CsrW
Mov #8.,R0
Sob R0,.
Mov CsrW,@R4 ;Clear..
Return
.SbTtl Read Disk Word, Write to User
ReaWrd:
10$: TstB @R4 ;Wait for data
Bpl 10$
Mov @R5,R0 ;Get Disk Word
Swab R0
Mov R0,Window(R2)
Tst (R2)+ ;and store it
Bit #140000,R2 ;Check Window Address
Beq 20$
Add #2,AdrSel
Bic #140000,R2
Mov @AdrSel,@#Sel1
20$: Sob R1,10$ ;Loop until all done
Mov SkpCnt,R1
Beq 40$
30$: TstB @R4 ;Skip sector Rest
Bpl 30$
Tst @R5
Sob R1,30$
40$: Return
.SbTtl Read User Word, Write to Disk
WriUwd:
10$: TstB @R4 ;Wait for data
Bpl 10$
Mov Window(R2),@R5 ;Get User Word
Tst (R2)+
Bit #140000,R2 ;Check Window Address
Beq 20$
Add #2,AdrSel
Bic #140000,R2
Mov @AdrSel,@#Sel1
20$: Return
.SbTtl Track Seek Routine
.Psect $CodOvr
Seek:
.Enabl LSB
TstB Track ;Home ?
Beq Home
TstB @CurTrk ;Known Track ?
Bpl 10$ ;Yes
Call Home ;No, Home
10$: CmpB @CurTrk,Track ;Where are we ?
Beq 30$ ;It's OK
Bhi 20$ ;We are at the center
Call PlStep ;
Br 10$
20$: Call MiStep ;Issue step
Br 10$
30$: Mov #10000.,R0 ;Time-Out
Sob R0,.
Seek1: MovB #20.,Turns ;Max Turn Number
Return
.SbTtl Step Routines
PlStep: IncB @CurTrk ;Forward step
Bmi 40$
Bit #Dir,CsrW
Bne KwkStp
Bis #Dir,CsrW
Br Lstp
40$: Mov #$.Seek,R0
Jmp ErrExt
MiStep: DecB @CurTrk
Bit #Tr0,@R4
Beq 50$
ClrB @CurTrk
Return
50$: Bit #Dir,CsrW
Beq KwkStp
Bic #Dir,CsrW
LStp: Mov #200.,R0
Br 60$
KwkStp: Mov #1,R0
60$: Mov CsrW,@R4
Sob R0,.
Bis #Step,CsrW
Mov CsrW,@R4
Mov TimTrk,R0
Bic #Step,CsrW
Sob R0,.
Return
.Dsabl LSB
.SbTtl Home Routine
Home: MovB #128.,@CurTrk
10$: Call MiStep ;Backward step
Bit #Tr0,@R4 ;We are home ?
Bne 20$ ;Yes, OK
TstB @CurTrk ;No, Step
Bne 10$
Mov #$.NHom,R0 ;No Home
Jmp ErrExt
20$: ClrB @CurTrk
Br Seek1
.SbTtl Unit Setting and Head Moving Routine
SetDev: CmpB TrkCor,@CurTrk ;Correction switching needed ?
Bhi 10$
Bis #Rez,CsrW ;Yes
Br 20$
10$: Bic #Rez,CsrW
20$: Mov CsrW,@R4
Return
.SbTtl Unit and Side Select Routine
SelUni: Mov #Csr097,R4
Clr SidTrk ;Side+<Track*400>
Mov R4,R5
Tst (R5)+ ;Pointer to Dat097
Bic #<Uside+Ds0+Ds1+Ds2+Ds3>,CsrW ;Clear unit, side bits
MovB Code+1,R1 ;Unit,Side
Bit #4,R1 ;Upper Side ?
Beq 10$ ;No
Bis #USide,CsrW ;Yes, Upper Side
Mov #1,SidTrk ;Set Side at SidTrk
10$: Bic #^C3,R1 ;Unit No
20$: Bis #Msw,CsrW ;Set Motor On
Mov CsrW,@R4 ;
Clr R0
Sob R0,.
Sob R0,. ;Wait for Motor On
BisB SelTAB(R1),CsrW ;Setup New Unit bits
Mov CsrW,@R4 ;And set Unit On
Add #TrkTab,R1 ;Track Table Offset ??
Mov R1,CurTrk ;And store in CurTrk
30$: Mov TimUp,R0 ;Wait for Head Down
Sob R0,.
MovB Track,SidTrk+1
Return
.Psect $CnsOvr
SelTab: .Byte Ds0,Ds1,Ds2,Ds3
PrmTab: .Word TimTrk,TimUp,TrkCor
Maxprm=.-PrmTab-2
.Psect $RAM
Sav4: .BlkW
SPSave: .BlkW
CsrW: .BlkW ;Csr097 Write only Copy
TimUp: .BlkW ;;Head Up Time
TimTrk: .BlkW ;Track ot track Time
TrkCor: .BlkB ;Correction switching track
ErrFlg: .BlkB ;Error Flag (For C-bit)
CurTrk: .BlkW ;Current Track Pointer
TrkTab: .BlkB 4 ;Current Tracks for Units
DatTyp: .BlkW ;Id Data
SidTrk: .BlkW ;Side+<Track*400>
TrnNum: .BlkW
ErrCnt: .BlkB ;Temporary Error Counter
WrtFlg: .BlkB ;Write Commands flag
IndTim: .BlkW
SkpCnt: .BlkW ;Words to skip Counter
Turns: .BlkB
Flags: .BlkB
Index: .BlkW
Retry: .BlkW
Code: .BlkB
.BlkB
Sectr: .BlkB
Track: .BlkB
AddRess:.BlkW
SelS: .BlkW
Wcnt: .BlkW
.End

View File

@ -0,0 +1,218 @@
.Mcall .Module
.Module BKEMT, Release=X02, Version=07, Comment=<BK0011 Emt Handler>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl ErrByt,Debug,$UsrTrp,SysFlg,PutUwd,UsrBuf
.Macro Command Routine,Number,Comment
.Iif NDF HigEmt, HigEmt==0
.=EmtTbl+Number
.Globl Routine
.Word Routine
.Iif GT <Number-HigEmt> HigEmt==Number
.=EmtTbl+HigEmt+2
.EndM
.SbTtl EMT Entry Point
EmtInt::
Mov (SP)+,$SavPC ;EMT PC And PS
Mov (SP)+,$SavPS ;
Mov SP,$SavSP ;SP Save Area
Mov R5,$SvAre
Mov $SavPC,R5 ;Emt Address+2
Mov -(R5),R5 ;Get EMT Request code
Mov $$UsrS,-(SP)
Bic #^C<TapMsk!ScrMsk>,@SP ;Unused Bits
Bis #SysSel,@SP
Mov (SP)+,@#$$SysS
Mov @#$$SysS,@#Sel1
Mov #SStack,SP ;Setup new stack
Mov $SavSP,USPSav ;User SP Save Area
Mov $SavPS,UPSSav ;User PS Save Area
Mov $SavPC,UPCSav ;User PC Save Area
Mov $SvAre,-(SP) ;Save Old R5 Register
Mov @#Vec4,SavV4
Mov #EmtV4,@#Vec4 ;Emt Vec 4 Routine
Bit #1,R5 ;Check for Even Request code
Bne IllEmt ;Illegal
Bic #^C376,R5 ;Clear Unused bits
Cmp R5,#HigEmt ;Check Request Legality
Bhi IllEmt ;This Emt is Illegal
ClrB SysFlg ;For Disk/Tape Handlers
Call @EmtTbl(R5) ;Call Appropriate Routine
MfPS R5 ;Set User PS N,Z,V and C
EmExt: Mov SavV4,@#Vec4
Mov USPSav,$SavSP ;User SP Save Area
Mov UPSSav,$SavPS ;User PS Save Area
Mov UPCSav,$SavPC ;User PC Save Area
Bic #17,$SavPS ;Set NZVC
Bic #^C17,R5 ;
Bis R5,$SavPS ;
EmtExi: Mov (SP)+,$SvAre ;R5 Save Area
Mov @#$$UsrS,@#Sel1
Tst @#Sel1 ;Set User Allocation
Mov $SavSP,SP
Mov $SavPS,-(SP)
Mov $SavPC,-(SP)
Mov $SvAre,R5
Rtt ;And return
.Save
.Psect $RAM
SavV4:: .BlkW
.Restore
EmtV4: Mov SavV4,@#Vec4
Mov USPSav,$SavSP ;User SP Save Area
Mov UPSSav,$SavPS ;User PS Save Area
Mov UPCSav,$SavPC ;User PC Save Area
Mov @#$$UsrS,@#Sel1
Tst @#Sel1 ;Set User Allocation
Mov $SavSP,SP
Mov $SavPS,-(SP)
Mov $SavPC,-(SP)
Jmp @Vec4 ;Go User Trap to 4
.SbTtl Illegal EMT Processing
$BRsrv: Tst (SP)+
IllEmt: Mov #ErrEmt,EmtPri
.SbTtl Illegal Command Entry Point
IllBrk::
Mov SysErr,R5 ;User's EMT-Error processing?
Beq Ill1 ;No
Sub #2,@#UspSav ;Yes,...
Mov @#USPSav,R5 ;Address
Mov R0,-(SP)
Mov UpcSav,R0
Call PutUwd ;Put onto User Stack (for RETURN)
Mov (SP)+,R0
Mov SysErr,UpcSav
Clr SysErr ;Reset Mode
Mov @#UPSSav,R5 ;New PS=OLD
Br EmExt
Ill1: Mov @#$$UsrS,@#UsrBuf ;Save...
Mov @#$$SysS,@#$$UsrS
Mov R0,-(SP)
Mov EmtPri,R0
Call $Bprint
Mov (SP)+,R0
Mov @#UsrBuf,@#$$UsrS ;Restore User Sel
Ill2: Mov USPSav,$SavSP ;User SP Save Area
Mov UPSSav,$SavPS ;User PS Save Area
Mov UPCSav,$SavPC ;User PC Save Area
Mov (SP)+,$SvAre ;R5 Save Area
Mov @#$$UsrS,@#Sel1
Tst @#Sel1 ;Set User Allocation
Mov $SavSP,SP
Mov $SavPS,-(SP)
Mov $SavPC,-(SP)
Mov $SvAre,R5
Jmp Debug ;And exit to Keyboard Monitor
.SbTtl $BEmtset (EMT 114) Routine (Illegal Emt Processing)
$BEmtset::
Mov R0,@#SysErr ;Set Illegal Emt Routine Address
Return
.SbTtl $Bexit (EMT 0) Routine (Exit from Users Program)
$Bexit::
Tst (SP)+
Tst R0
Bne Ill2
Call $Binit ;System initialization
Br Ill2
.SbTtl $Btrpset (EMT 112) Routine (User's HALT Processing)
$BtrpSet::
Mov R0,$Usrtrp ;Set User's Routine Address
Return
.Psect $Const
ErrEmt: .Byte 25
.Ascii /?BK-ILLEGAL EMT /<200>
.Even
.SbTtl EMT-Requests Address Table
EmtTbl:
.SbTtl General Purpose Requests
Command $Bexit 0 <Exit from Users Program>
Command $Binit 14 <Computer Initialization>
Command $Btrpset 112 <User's HALT Processing>
Command $BEmtset 114 <Illegal Emt Processing>
.SbTtl Memory Management Requests
Command $Bsetpg 52 <Connect Memory Page>
Command $Bjsr 54 <Jsr to Memory Page>
Command $Bjmp 56 <Jmp to Memory Page>
Command $Bpeek 60 <Get the Word from Memory Page>
Command $BpokB 62 <Put the Byte to Memory Page>
Command $Bpoke 120 <Put the Word to Memory Page>
Command $Btest 72 <Get Memory page status>
.SbTtl Keyboard Handler Requests
Command $Bkbini 4 <Initialize Keyboard>
Command $Bttyin 6 <Get One Character from Keyboard>
Command $Bgtlin 10 <Get String from Keyboard>
Command $Bfunct 12 <Set Function Switch>
Command $Bedit 66 <Edit the String>
Command $Bkset 100 <Set Keyboard Handler Mode>
Command $Bkget 116 <Read Keyboard Handler Mode>
Command $Binkey 102 <Get character Without Waiting>
.SbTtl TV-Set Handler Requests
Command $BTtyoy 16 <Type One Character>
Command $Bprint 20 <Type Character String>
Command $Bssout 22 <Type at Special String>
Command $Blocat 24 <Set Cursor Coordinates>
Command $Bpos 26 <Get Cursor Coordinates>
Command $Bpoint 30 <Set Graphics Point>
Command $Bgetpnt 104 <Get TV-Point Color>
Command $Bvect 32 <Draw Vector or .....>
Command $Bbufset 74 <Switch Screen Buffers>
Command $BtvSet 64 <Set TV-set Handler Mode>
Command $BtvGet 34 <Get TV-set Handler Mode>
Command $BGcolor 106 <Exam Color Map>
Command $BScolor 76 <Set Color Map>
Command $Bscroll 110 <TV-Line Scrolling>
Command $Bcircl 130 <Draw the Circle>
.SbTtl Sound Requests
Command $Bsound 124 <Sound Generation>
.SbTtl Peripherals Requests
Command $BDisk 70 <Floppy-Disk Request>
Command $BMtb10 36 <BK0010-compatible tape handler Request>
.SbTtl Reserved Requests
Command $BRsrv 132 <Msx Cassette-Tape Request $BMtMsx>
Command $BRsrv 122 <Draw Language $Bdraw>
Command $BRsrv 126 <Change color at TV-Screen $Bchclr>
Command $BRsrv 40
Command $BRsrv 42
Command $BRsrv 44
Command $BRsrv 46
Command $BRsrv 50
Command $BRsrv 2
.Psect $RAM
.Even
SysErr:: .BlkW
UPCSav:: .BlkW
UPSSav:: .BlkW
USPSav:: .BlkW
EmtPri:: .BlkW
.End

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,366 @@
.Mcall .Module
.Module BKGSub, Release=X02, Version=02, Comment=<BK0011 Graphics Routines>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl GetUWd,RetEmt,Shifts,ScrBot,$OffR0,Xcoord,Ycoord
.Globl RstrMX,Shiftm,Color,SavRg,ScrSel,SetScS,SetScX
.Globl Circle,CrcBlk,GetArg,Sound
.SbTtl $Bgetpnt (EMT 104) Routine (Get TV-Point Color)
$Bgetpnt::
Jsr R0,SavRG
Clr $OffR0(SP) ;Prepare Zero
Mov R0,R5 ;Argument Block Address
Tst (R5)+ ;Skip the first word
Call Coord ;Get Coordinates and Compute Address
Bcs 30$
Call SetScS ;Map Screen
MovB @R0,R3 ;Get Byte
Com R1 ;Inverted mask
Bic R1,R3 ;Clear Unused Bits
Tst R2 ;Shift Counter
Beq 20$ ;No Shift Needed
10$: Asr R3
Sob R2,10$
20$: Mov R3,$OffR0(SP) ;Mov Result to Stack
ClC
Call SetScX
30$: Jmp RetEmt
.SbTtl $Bpoint (EMT 30) Routine (Set Graphics Point)
$Bpoint::
Jsr R0,SavRg
Mov R0,R5
Call GetUwd ;Color for Drawing
Mov R0,PntBuf ;
Call Coord
$Bpoi1: Bcs 40$
Call SetScS
MovB PntBuf,R3
Bpl 10$
Mov Color,R3
10$: Tst R2
Beq 30$ ;No shifting
20$: Asl R3
Sob R2,20$
30$: BicB R1,@R0 ;Clear Points in Screen
Com R1
BicB R1,R3 ;Clear Unused Point
BisB R3,@R0
Call SetScX
40$: Jmp RetEmt
.SbTtl Coordinate processing Routine
Coord: Call GetUwd ;X
Mov R0,Xcoord
Call GetUwd
Mov R0,R1
Mov R1,Ycoord
Mov Xcoord,R0
CoordX: Cmp R1,RstrMx ;Maximum Raster No
Bhi 20$ ;Illegal line No
Mov R1,R2 ;Get Y coordinate
Swab R2 ;*400
ClrB R2
Ror R2 ;*200
Ror R2 ;Y-Address (*100)
Add ScrBot,R2 ;
Cmp R0,#511. ;X Max ?
Bhi 20$
Mov R0,R1
Clc
Bic #^C7,R1 ;Lower Bits of X
Asr R0
Asr R0
Asr R0 ;In Bytes
Add R2,R0 ;Screen address
Bic #40000,R0
Bis #100000,R0
Mov R1,R2 ;Lower 3 Bits
Asl R1
Asl R1 ;*4
BisB Shifts,R1
MovB PntTab(R1),R1 ;Get Point Mask
Bic #^C377,R1
MovB Shiftm,R3
Dec R3
Bic R3,R2
Clr R3
Tst (PC)+
20$: Sec
Return
.Psect $Const
PntTab:
;
; 512 256 128 Points
;
.Byte 1, 3, 17,
.Byte 2, 3, 17,
.Byte 4, 14, 17,
.Byte 10, 14, 17,
.Byte 20, 60, 360,
.Byte 40, 60, 360,
.Byte 100, 300, 360,
.Byte 200, 300, 360,
.Even
.Psect $RAM
PntBuf::.BlkW
X0:: .BlkW
Y0:: .BlkW
XK:: .BlkW
YK:: .BlkW
.Psect $Code
.SbTtl $Bvect (EMT 32) Routine (Draw Vector or .....)
$Bvect::
Jsr R0,SavRg
Mov R0,R5 ;Arg Block Address
Mov #PntBuf,R4
Mov #5,R3
10$: Call GetUwd
Mov R0,(R4)+
Sob R3,10$
Vect1: Mov #1,Flag
MovB PntBuf,R4 ;Color
Bpl 20$ ;Normal
Mov Color,R4
20$: MovB Shiftm,R0
Sec
Rol R0
MovB R0,Lmsk1
Com R0
Mov R4,R3
Bic R0,R4
MovB R4,Lmsk0
MovB ShiftM,R0
MovB #200,R1
30$: Dec R0
Beq 40$
AsrB R1
Br 30$
40$: MovB R1,Rmsk1
Com R1
Bic R1,R3
MovB R3,Rmsk0
Mov X0,X00
MovB Shiftm,R4
Mov R4,StepXX
Dec R4
Bic R4,X00
MovB Shifts,R3
2$: Dec R3
Bmi 1$
Asr X0
Asr XK
Br 2$
.Sbttl Linear Interpolation
1$: Mov XK,R4
Mov YK,R2
50$: Mov #1,DirX
Sub X0,R4 ;R4=DX=Xnew-Xold
Bge 60$ ;DX>=0 ==> Forward
Neg XK ;DX
Neg DirX ;X Direction (+-)
Neg StepXX
60$: Mov #1,DirY
Mov #100,YIncr ;Y-Address Increment
Sub Y0,R2 ;R2=DY=Ynew-Yold
Bge 70$
Neg R2
Neg DirY ;Y Direction (+-)
Neg YIncr ;Y Direction (+-)
70$: Mov R2,R3
Add R4,R3 ;R3=Dstn=DX+DY
Clr R0 ;Function=0
Cmp R4,R2 ;DX,DY
Beq 80$
Bge 90$ ;DX>DY
Mov #-1,R0 ;DX<DY
Br 90$
80$: Tst R4 ;DX=DY
Beq 210$ ;DX=DY=0==> Exit
90$: Clr Stp
Br 120$
100$: Clr Stp
Tst R0 ;
Bmi 110$ ;DX<DY
;
;X-Step
;
IncB Stp
Sub R2,R0 ;F=F-DY
Add DirX,X0
Add StepXX,X00
Br 120$
;
;Y-Step
;
110$: IncB Stp+1
Add R4,R0 ;F=F+DX
Add DirY,Y0 ;Y-Step
120$: Tst Y0
Bpl 121$
Tst DirY
Bmi 210$
Br 130$
121$: Cmp Y0,RstrMX
Ble 122$
Tst DirY
Bpl 210$
Br 130$
122$: Tst X0
Bpl 123$
Tst DirX
Bmi 210$
Br 130$
123$: Cmp X0,#512.
Blt 140$ ;Draw...
Tst DirX
Bpl 210$
130$: Inc Flag ;Not Draw
Br 200$
140$: Tst Flag
Beq 150$
Call Coor1
Br 190$
150$: TstB Stp+1
Beq 160$
Add YIncr,XYAddr
160$: MovB Shiftm,R1 ;Shifts Number
Clc
TstB Stp ;X-Step
Beq 190$
Tst DirX
Bpl 180$
170$: RorB ClrMap
Sob R1,170$
Bcc 190$
MovB Lmsk1,ClrMap
MovB Lmsk0,ClrCod
Dec XYAddr
Br 190$
180$: RolB ClrMap
Sob R1,180$
Bcc 190$
MovB Rmsk1,ClrMap
MovB Rmsk0,ClrCod
Inc XYAddr
190$: Mov XYAddr,R1
Bis #100000,R1
Bic #40000,R1
Call SetScS
BicB ClrMap,@R1
BisB ClrCod,@R1
Call SetScX
200$: Dec R3
Bne 100$
210$: Jmp RetEmt
Coor1: Jsr R0,SavRg
Mov X00,R0
Mov Y0,R1
Call CoordX
Mov R0,XYAddr ;New Screen Address
Mov PntBuf,R3
10$: Tst R2
Beq 30$ ;No shifting
20$: Asl R3
Sob R2,20$
30$: MovB R1,ClrMap
Com R1
BicB R1,R3 ;Clear Unused Point
MovB R3,ClrCod
Jmp RetEmt
.Psect $RAM
X00:: .BlkW
StepXX: .Blkw
XYAddr: .BlkW
Stp: .BlkW
ClrMap: .BlkB
ClrCod: .BlkB
DirX: .BlkW
DirY: .BlkW
YIncr: .BlkW
Flag: .BlkW
Lmsk0: .BlkB
Lmsk1: .BlkB
Rmsk0: .BlkB
Rmsk1: .BlkB
.Even
PntC: .BlkW
XC: .BlkW
YC: .BlkW
.Psect $CodOvr
.SbTtl $Bcircl (EMT 130) Routine (write circle or arc)
$Bcircl::
Jsr R0,SavRg
Mov R0,R5
Call GetUwd ;Color
Mov R0,Pntc ;
Mov #CrcBlk,R1
Mov #7,R2
20$: Call GetUwd
Mov R0,(R1)+
Sob R2,20$
Call Circle
ClC
Jmp RetEmt
.SbTtl Point Drawing Routine for $BCircle
;
;Input:
;R1 = X
;R2 = Y
;
Point:: Jsr R0,SavRg
Mov R1,XCoord
Mov R1,XC
Mov R2,Ycoord
Mov R2,YC
Mov R1,R0
Mov R2,R1
Mov PntC,PntBuf
Call CoordX ;Compute coordinates
Jmp $Bpoi1
.SbTtl Vector Drawing Routine for $BCircle
;
;Input:
;R1 = XEnd
;R2 = YEnd
;Xcoord and Ycoord
Vector::Jsr R0,SavRg
Mov Xc,XK
Mov Yc,YK
Mov R1,X0
Mov R2,Y0
Mov PntC,PntBuf
Jmp Vect1
;.SbTtl $Bchcl (EMT 126) Routine (Change colors)
;.Psect $Code
;$Bchcl::
;.SbTtl $Bdraw (EMT 122) Routine (Draw interpreter)
;$Bdraw::
; Sec
; Return
.SbTtl $Bsound (EMT 124) Sound Generation Routine
.Psect $CodOvr
$Bsound::
Jsr R0,GetArg ;One tone generation
Call Sound
Jmp RetEmt
.End

View File

@ -0,0 +1,28 @@
.TITLE SYMTAB
.IDENT /X02.00/
.SBTTL BK0011 SYMBOL GENERATORS TABLE
.INCLUDE "BKHEAD"
;
.ENABL GBL
.PSECT $CNSOVR
SYMGTB:: ; 0-37 ; 40-77 ;100-137;140-177;200-237;240-277;300-337;340-377;
; ĘÎČ-7H0
LAT: .WORD SYM$0, SYM$1, SYM$2, SYM$3, SYM$0, SYM$1, SYM$6, SYM$7
; ĘÎČ-7H1
RUS: .WORD SYM$0, SYM$1, SYM$6, SYM$7, SYM$0, SYM$1, SYM$2, SYM$3
; ĘÎČ-7H2
RUSLAT: .WORD SYM$0, SYM$1, SYM$2, SYM$7, SYM$0, SYM$1, SYM$6, SYM$3
;ĎŃĹÂÄÎĂĐŔÔČĘŔ.
PSGRAF: .WORD SYM$0, SYM$0, SYM$4, SYM$5, SYM$0, SYM$1, SYM$6, SYM$7
;
.WORD SYM$0, SYM$1, SYM$2, SYM$3, SYM$4, SYM$5, SYM$6, SYM$7
;
.WORD SYM$0, SYM$1, SYM$2, SYM$3, SYM$4, SYM$5, SYM$6, SYM$7
SYMGMT::
LAT2: .WORD SYM$81, SYM$81, SYM$82, SYM$83, SYM$81, SYM$81, SYM$86, SYM$87
RUS2: .WORD SYM$81, SYM$81, SYM$86, SYM$87, SYM$81, SYM$81, SYM$82, SYM$83
RUSLT2: .WORD SYM$81, SYM$81, SYM$82, SYM$87, SYM$81, SYM$81, SYM$86, SYM$83
.END

View File

@ -0,0 +1,368 @@
.Mcall .Module
.Module BKGTL,Release=X02, Version=01, Comment=<BK0011 Line Edit Routines>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl GetArg, RetEmt, TtoFlg,KbdCsr
.Globl Block$$,GetUbt, TStCrs, StrLen,$Bttyou,$Bprint
.Globl PutUBt, GetUbt, Crsr$$, ChrGo,$Binkey
.Globl TtyPrg, Curadr, SavRg
BufLng = 256.
Bell = 7
.Macro Command Code Routine
.Byte <Routine-CdT>/2,Code
.EndM
.Psect $CodOvr
.SbTtl $Bgtlin (EMT 10) Routine (Get String from Keyboard)
.Enabl LSB
$Bgtlin::
Jsr R0,GetArg ;Get Arguments to R0,R1
Mov R0,AdrLine ;User Buffer Address
Cmp R1,#BufLng
Blos 10$
Mov #BufLng,R1
10$: Dec R1
Mov R1,Length ;User Buffer Length
Newline:Mov #StrBuf,R4 ;System Buffer Address
Mov #StrBuf,NewEnd ;End of Buffer (The Byte of 200)
Clr BytCnt ;Byte Counter
GetCH: Bit #Crsr$$,TtoFlg
Beq 99$
Bic #Crsr$$,TtoFlg
Call TstCrs
99$: Call InByte
Call TstCrs
Bis #Crsr$$,TtoFlg
Bit #140,R0 ;Control Code ?
Beq 50$ ;Yes
PutCH: Clr OldEnd ;Flag for <WS>
TstB Insrt$$ ;Insert mode ?
Bne InsMd ;Yes
Cmp R4,NewEnd ;We are at the end of line ?
Bne 30$ ;No
Cmp BytCnt,Length ;Buffer or String owverflow ?
Beq 40$ ;String overflow
20$: Inc NewEnd ;1-st Unused Byte
Inc BytCnt
Br 30$
;
;Replace or Insert Character at The End of Line
;
30$: MovB R0,(R4)+ ;Write Byte
Call Ttuo ;Output Character
Br GetCh ;
;
;Insert Character
;
InsMd: Cmp BytCnt,Length
Beq 40$ ;Line Overflow
Cmp R4,NewEnd ;We are at the end of line?
Beq 20$ ;Yes
Mov #1,R3 ;
Call Ins
Br GetCH
40$: MovB #Bell,R0
Call Sttyo
Br GetCH
;
;0-37, 200-237 Codes
;
50$:
Bit #Block$$,@#TtoFlg
Bne PutCh
60$: Jsr R0,ChrGo
Cdt=.
Command 10 Left ;<--
Command 12 Enter ;Enter
Command 13 Dleol ;DelEol
Command 14 ClrScr ;Clear Screen
Command 23 WS ;WS
Command 26 DelChr ;<--!
Command 27 InsChr ;!-->
Command 30 Delete ;<-!-
Command 210 DelLine ;Lower/<-!-
Command 31 Right ;-->
Command 32 Up ;/\
Command 33 Down ;\/
Command 230 Insrt ;Insert
Command 0 Ctrl ;Other Control Characters
Insrt: ComB Insrt$$
GetCh2: Br GetCh
Ctrl: Br Putch
Left: Cmp R4,#StrBuf+1 ;Check for legality
Blo GetCh ;Illegal
Dec R4
GetCH1: Call Sttyo
Br Getch2
Right: Cmp R4,NewEnd
Beq Getch
Inc R4
Br GetCH1
Up: MovB StrLen,R1
Sub R1,R4
Cmp R4,#StrBuf
Bhis Getch1
Add R1,R4
Br GetCH2
Down: MovB StrLen,R1
Add R1,R4
Cmp R4,NewEnd
Blos GetCh1
Sub R1,R4
Br GetCH2
InsChr: Mov #40,R0
Mov #1,R3
Clr OldEnd ;Flag for <WS>
Call Ins
Mov #10,R0
Br Left
Delete: Cmp R4,#StrBuf
Beq Getch2
Mov #10,R0 ;Backspace
Call Sttyo
Dec R4
Del1: Dec BytCnt
Mov R4,R1
70$: MovB 1(R1),(R1)+
CmpB R1,NewEnd
Blo 70$
Dec NewEnd
Mov #1,R3
Call PriEOL
Clr OldEnd ;Flag for <WS>
Br GetCh2
DelChr: Cmp R4,NewEnd
Beq Getch2
Br Del1
Dleol:
Mov NewEnd,R1
Sub R4,R1
Beq Getch2
Tst BytCnt
Beq GetCh2
Mov NewEnd,OldEnd
Mov BytCnt,OldCnt
Mov R1,R2
80$: Mov #40,R0
Call $Bttyou
Sob R1,80$
Sub R2,BytCnt
Mov R4,NewEnd
Mov #10,R0
90$: Call Sttyo
Sob R2,90$
Br Getch2
DelLine:
Mov R4,R3 ;Old Addr
Call Bline
Bcs Getch2
Mov R3,R1 ;Old Addr
Sub R4,R3 ;-New Addr=Delete Length !!!
Sub R3,BytCnt ;BCNT=BCNT-R3+R4
Sub R3,NewEnd ;Line Length
Mov BytCnt,R2
Beq 999$
100$: MovB (R1)+,(R4)+
Sob R2,100$
Mov #StrBuf,R4
999$: Call PriEOL
Clr OldEnd ;Flag for <WS>
Br GetCH2
ClrScr: Call Sttyo
ClrSc1: Mov NewEnd,R4 ;
MovB #200,@NewEnd
Mov TtoFlg,-(SP)
Bis #Block$$,TtoFlg
Mov #StrBuf,R0
Call PrinPr
Mov (SP)+,@#TToflg
GetCh3: Jmp GetCh2
WS:
Tst BytCnt
Beq 110$
Call Bline
Bcc Getch3
Br ClrSc1
110$: Tst OldEnd
Beq ClrSc1
Mov OldEnd,NewEnd
Mov OldCnt,BytCnt
ClrSc2: Br ClrSc1
.Dsabl LSB
Enter:
Mov NewEnd,R1
Mov R1,OldEnd
Mov BytCnt,OldCnt
Sub R4,R1
Beq 20$
Mov #31,R0
10$: Call Sttyo
Sob R1,10$
20$: Mov #25,R0
Call Sttyo
Mov #StrBuf,R4 ;System Buffer Address
Mov AdrLine,R5 ;User Buffer Address
Mov BytCnt,R3 ;Number of Bytes to Send
Beq 40$
30$: MovB (R4)+,R0
Call PutUBt ;Put Byte to User Memory (R5)+
Sob R3,30$
40$: Clr R0
Call PutUBt
Bic #Crsr$$,TtoFlg
Call TstCrs
Jmp RetEmt
.SbTtl $Bedit (EMT 66) Routine (Edit the String)
$Bedit::
Jsr R0,GetArg
Mov R0,AdrLine ;User Buffer Address
Mov R0,R5
Cmp R1,#BufLng
Blos 9$
Mov #BufLng,R1
9$: Dec R1
Mov R1,Length ;User Buffer Length
Mov #StrBuf,R2
Clr R3
10$: Call GetUbt ;Get User Byte
Inc R3
Cmp R3,Length
Bhi 20$ ;Line too Long
MovB R0,(R2)+
Bne 10$
Dec R2
20$: Dec R3
Mov R3,BytCnt
Mov R2,NewEnd
Br ClrSc2
Sttyo: Mov TtoFlg,-(SP)
Bic #Block$$,TtoFlg
Br Ttt1
Ttuo: Mov TtoFlg,-(SP)
Bis #Block$$,TtoFlg
Ttt1: Mov R0,-(SP)
Call $Bttyou
Mov (SP)+,R0
Mov (SP)+,TToflg
Return
Ins: Inc NewEnd
Inc BytCnt
Mov NewEnd,R1
Mov R1,R2
Dec R1
10$: MovB -(R1),-(R2)
Cmp R1,R4
Bhi 10$
MovB R0,(R4)+
Call Ttuo
PriEOL::Mov NewEnd,R1
Sub R4,R1 ;Number of bytes for print
MovB #200,@NewEnd
Mov TtoFlg,-(SP)
Bis #Block$$,TtoFlg
Mov R4,R0
Call PrinPr
Bic #Block$$,TtoFlg
Add R3,R1
5$: MovB #40,R0
Call $Bttyou
Sob R3,5$
10$: Mov #10,R0 ;Backspace
Call $Bttyou ;Return Cursor Place
Sob R1,10$
Mov (SP)+,TToflg
Return
Bline: Mov R4,R1
Sub #StrBuf,R1
Beq 10$
Sub R1,R4
Mov #10,R0
100$: Call Sttyo
Sob R1,100$
Tst (PC)+
10$: SeC
Return
.Psect $Code
PrinPr: Jsr R0,SavRg ;Save R0..R4
Mov R0,R5
Call TStCrs ;Set Cursor Off
2$: MovB (R5)+,R0
Beq 11$ ;It's 0
CmpB R0,#200
Beq Retpri ;Code is 200
Mov R5,-(SP)
Call TtyPrg ;Type character
Mov (SP)+,R5
Br 2$
11$: Mov #25,R0
Call TtyPrg ;issue <CR><LF> Routine
Retpri: Call Curadr
Call TStCrs ;Set Cursor ON
Jmp RetEmt
InByte:
199$: Call $BinKey
Bcc 99$ ;Get one Character into R0
Mov @#$$UsrS,BUsrS
Mov Vec4,BVec4
Mov #Btrp,Vec4
Mov $$SysS,$$UsrS
Mtps #0
Nop
Mtps #340
Mov BUsrS,@#$$UsrS
Mov BVec4,Vec4
Br 199$
99$: Return
Btrp: Mov BUsrS,@#$$UsrS
Mov BVec4,Vec4
Jmp @Vec4
.Psect $RAM
BVec4: .BlkW
BUsrS: .BlkW
NewEnd: .BlkW
OldEnd::.Word 0
OldCnt::.Word 0
BytCnt: .Word 0
AdrLine:.Word 0
Length: .Word 0
StrBuf: .BlkB BufLng ;Input buffer Length
Insrt$$::.Byte 0 ;Insertion Flag
.Even
.End

View File

@ -0,0 +1,67 @@
.NList
;
; Copyright (c) 1986 by
; C-11 Special Interes Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Dsabl GBL
.Enabl MCL
;
;System Page (At 40000)
;
.Psect $RAM D,RW
.Psect $Stack D,RW
;
;Switched ROM Page (At 120000)
;
.Psect $CodOvr I,RO
.Psect $CnsOvr D,RO
;
;Resident ROM Page (At 140000)
;
.Psect $Code I,RO
.Psect $Const D,RO
.Psect $AdrTab D,RO
SEL1 == 177716 ;System Register
SEL2 == 177714 ;System Port
UStack == 1000 ;Initial User Stack Pointer
.Globl SStack
;
;SEL1 Bit masks
;
WrEnS == 4000 ;Write Enable Mask
ROMMSK == 1!2!10!20 ;ROM Connection
SysROM == 2 ;System ROM Mask
SysRam == 50000 ;System Rom Page Constant
SysPag == 7 ;System Page Number
Mot$$$ == 200 ;Taperecorder motor OFF
ScrMsk == 4 ;Selected Screen mask
TapMsk == Mot$$$!100!40 ;Taperecorder bits mask
SysSel == SysRAM!SysROM!Mot$$$!WrEnS ;System Sel1
KeFlg == 100 ;keyklick, key not pressed flag
.Library "BKLIB.MLB"
UserPC == 40
ErrByt == 52
$$SysS == 64 ;System allocation SEL1
$$UsrS == 66 ;User allocation SEL1
$SavPC == 250 ;System save area for PC
$SavPS == 252 ;System save area for PS
$SavSP == 114 ;System save area for SP
$Svare == 116 ;System save area
.Psect $Code
.List

View File

@ -0,0 +1,441 @@
.Mcall .Module
.Module BKKBD,Release=X02, Version=04, Comment=<Keyboard Handler>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl GetArg, RetEmt, SavRg, PutUWd, TtoFlg, Sound
.Globl Block$$,$Setss, LatSS, GetUbt, FncOut, PutUBt, FlInit
.Globl OldEnd, OldCnt, ChrGo, Insrt$$,BlrSS, KbdSS
.Globl $Bsetpg,GetUwd
KbUvc = 60
KbLvc = 274
KbdCsr == 177660
KbdDbr == 177662
BfrLen = 200
;
; Keyboard Mode Word (KbMode) format:
;
; +---^---+---+---^---+---+---^---+---+---^---+---+---^---+---+---^
; ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
; +---^---+---+---^---+---+---^---+---+---^---+---+---^---+---+---^
; ! ! ! ! ! !
; ! ! ! ! ! !
; ! +---------------------+ ! ! ! !
; ! ! ! ! ! !
; +---------------------+ ! ! ! ! !
; ! ! ! ! ! !
$Cyril == 100000 ;<--+ ! ! ! ! !
;1 ==> RUS ! ! ! ! !
;0 ==> "LAT" ! ! ! ! !
RptFg = 040000 ;<------+ ! ! ! !
;1==> "Repeat ! ! ! !
;processing ! ! ! !
; ! ! ! !
;Width Sequence ! ! ! !
$Keykl == 200 ;<---------------+ ! ! !
;1 ==> Disable KeyKlick ! ! !
$KklCm == 100 ;<-------------------+ ! !
;1 ==> Disable KeyKlick before ! !
; Completion Routine ! !
$MixAs == 4 ;<-------------------------------------+ !
;In Ascii Mode 1 ==> Mixed mode !
; (Big Cyrillic and Big Latin) !
$Ascii == 1 ;<---------------------------------------------+
;0 ==> UAscii, 1 ==> Ascii
.Macro Command Code Routine
.Byte <Routine-CdT>/2,Code
.EndM
.SbTtl $Bkset (EMT 100) Routine (Set Keyboard Handler Mode)
$Bkset::
Jsr R0,SavRg
Mov R0,R5 ;Get User Address
Call GetUwd ;Get Word
MovB R0,@#KBMode ;And Set New KeyBoard Mode
Call GetUwd
Mov R0,@#KbAddr ;Address
Beq 10$
Call GetUwd
Bic #ScrMsk!TapMsk,R0
Bis #WrEnS,R0
Mov R0,@#KbSel ;Sel Value
Call GetUwd
Mov R0,@#KbStC ;Stack Pointer
10$: Jmp RetEmt
.SbTtl $Bkbini (EMT 4) Routine (Initialize Keyboard)
KbdIni::
Clr KbMode
$Bkbini::
Jsr R0,SavRg ;Save User'S Registers
Mov #UKbInt,@#KbUvc ;Set Upper Case Vector
Mov #340,@#KbUvc+2
Mov #LKbInt,@#KbLvc ;Set Lower Case Vector
Mov #340,@#KbLvc+2
Clr KbSel ;Reset Completion Routine
Clr KbAddr
Mov #Ustack,KbStC
Bic #^C<$Cyril>,KbMode ;Reset Mode Word
Call ClrFnc ;Clear Function Keys
Clr @#KbdCsr ;Set Interrupt Enable
Mov #TtiBuf-2,R5 ;Input Buffer Initialization
Mov #Ibufr,R4
Mov R4,(R5)+ ;Write Address
Clr (R5)+ ;Byte Counter
Mov R4,(R5)+ ;Read Address
Mov #-1,REptfl
Clr OldEnd
Clr OldCnt
ClrB Insrt$$ ;Gtlin Insertion Mode
Tst FlInit
Beq 10$ ;Uninitialized TTO handler...
Call KbdSS
10$: Jmp RetEmt ;And Return
.SbTtl $Bkget (EMT 116) Routine (Read Keyboard Handler Mode)
$BkGet::
Mov R0,R5
Mov KbMode,R0
Call PutUWd
Mov KbAddr,R0
Call PutUWd
Mov KbSel,R0
Call PutUWd
Mov KbStC,R0 ;Stack Pointer
Call PutUwd
Return
.SbTtl Upper-Case Keyboard Interrupt Entry Point
.Enabl LSB
UKbInt::
Jsr R5,$Inten
Call Klick ;Issue KeyKlick
MovB @#KbdDbr,R0
CmpB R0,#100 ;Is it Letter ?
Blo 20$ ;No, Not Modify
Bit #$Ascii,KbMode
Bne CmnC1 ;Ascii
;Uascii
10$: Bit #$Cyril,KbMode
Beq CmnC1
Bis #200,R0 ;Set Cyrillic Bit for Uascii Letter
CmnC1: Jmp CmnCod
;
;0..40 codes
;
20$:
Jsr R0,ChrGo ;Check for special char's
Cdt=.
Command 16 Rus ;Rus
Command 17 Lat ;Lat
Command 0 CmnCod ;Other Chars ==> Write
Lat: Bic #$Cyril,KbMode
Br RusLat
Rus: Bis #$Cyril,KbMode
RusLat:
Mov R0,-(SP)
Call LatSS ;Special Line Indication
Mov (SP)+,R0
Bit #$Ascii,KbMode ;Is code Ascii
Beq Ign1 ;No, Uascii, Ignore Char.
Bit #$MixAs,KbMode ;Mixed ???
Beq CmnCod ;No, write
Ign1: Br CmnIgn ;Yes, ignore
.SbTtl Lower-Case Keyboard Interrupt Entry Point
.Enabl LSB
LKbInt::
Jsr R5,$Inten
Call Klick ;Issue KeyKlick
MovB @#KbdDbr,R0 ;Get Character From Keyboard
CmpB R0,#100 ;
Blo 10$
;
;Semi-Graphics Symbols (100-177)
;
Bis #240,R0
Bic #100,R0 ;Convert to 240-277
Br CmnCod ;And Store
10$: ;Check codes 0..77
Bit #40,R0
Bne 30$
;
;000..037 Code Processing
;
Cmp R0,#20
Blo 20$ ;0..17
;
;020..037 ==> 200..217
;
Add #200-20,R0
Br CmnCod ;Store Code
20$:
;
;000..017 ==> 220..237
;
TstB R0
Beq Rstep
Jsr R0,ChrGo
Cdt=.
Command 1 Repeat
Command 2 Isu
Command 4 Blr
Command 11 CmnCod ;HT
Command 13 CmnCod ;DelEol
Command 0 RNop
Repeat:
Tst REptfl ;Was Character Typed ?
Bmi CmnExi ;No, Ignore "Repeat"
Bis #Rptfg,KbMode ;Set "Repeat flag"
Br CmnExi
Rstep: Mov #220,R0
Br CmnCod
Isu: Call $SetSS ;Set/Clear Screen Special String Area
Br CmnIgn
Blr: Mov #Block$$,R0
xOr R0,@#TToFlg ;Set/Clear BlockRed Flag
Call BlrSS
Br CmnIgn
30$:
;
; 40..77 Processing
;
Jsr R0,ChrGo
Cdt=.
.Irp XX,<60,61,62,63,64,65,66,67,70,71>
Command XX FunKey
.EndR
Command 0 Rnop
Rnop: Bic #40,R0
Bis #220,R0
Br CmnCod ;Store Code
;
;Function Key Processing
;
FunKey: Bic #Rptfg,KbMode ;Clear Repeat Flag
Bic #^C17,R0 ;Function Number
Bne 40$
Add #10.,R0
40$: Asl R0
Mov FncTb-2(R0),FncO;Get Function string Address
Call Klick
Tst FncO
Beq CmnExi ;No String, Ignore
50$: MovB @FncO,R0
Beq 60$
Inc FncO ;End of String
Call ChrWri ;Write Code to Buffer
Br 50$
60$: Clr FncO
Br CmnExi
.Dsabl Lsb
CmnCod: Call ChrWri ;Write Code to Buffer
CmnIgn: Bic #Rptfg,KbMode ;Clear Repeat Flag
CmnExi: Jmp RetEmt ;Exit To Retint
.SbTtl Klick Routine
Klick: Bit #$Keykl,KbMode
Bne 30$ ;KeyKlick is disabled
Mov #60,R0 ;Sound Length
Mov #60,R1 ;Tone
Call Sound
30$: Mov #7000,R0
Sob R0,.
Return
.SbTtl Common Character Buffering/Completion Routine Call Program
ChrWri: Bic #^C377,R0
Mov R0,REptfl ;Set Flag
Mov KbAddr,R2 ;Completion Routine Found ?
Beq 30$ ;No
.SbTtl Completion Routine Procesing
Bic #^C<WrEnS!ScrMsk!TapMsk>,$$UsrS
Bis KbSel,$$UsrS ;New Sel1
Mov SP,SpCmpl ;Internal
Mov KbStC,SP ;And User Stack
Mov @#$$UsrS,@#Sel1 ;Set Allocation
Call @R2 ;And Issue Call
Rol R0 ;Save Carry in R0[00]
;Character Accepted
Mtps #340 ;Disable Interrupt
Mov @#$$SysS,@#Sel1
Mov #$$UsrS,@#$$SysS
Mov SpCmpl,SP ;Restore Original Stack Ptr
Mov @#$$UsrS,-(SP)
Bic #^C<ScrMsk!TapMsk>,@SP
Bic #ScrMsk!TapMsk,KbdUSS ;Saved UsrS
Bis (SP)+,KbdUSS ;
Ror R0 ;Restore C And R0
Bcc 50$ ;Not Write
.SbTtl Character BUfferization
30$: Mov #TTiBuf,R5 ;Input Buffer Header Address
Cmp @R5,#Bfrlen-1 ;Number of Bytes accepted
Bhis 50$ ;Buffer Overflow
Inc @R5 ;Byte Counter
Inc -(R5) ;Write Address
Cmp @R5,#Bfrend ;End of Buffer ?
Blo 40$ ;No
Sub #Bfrlen,@R5 ;Skip around Buffer bound
40$: MovB R0,@(R5) ;Put Byte
Tst (PC)+
50$: SeC ;O.K.
Return
.SbTtl Common Interrupt Entry Point Routine
$Inten::
;
;At this point Stack is:
;
;Old PS
;Old SP
;Old R5 <----SP
;
;State is Unknown !!!
;
Mov @#$$SysS,@#Sel1
Mov SP,KbdSP ;Save User Stack
Mov #KbStk,SP ;Set Keybord Stack Pointer
Mov @#$$UsrS,@#KbdUSS ;Save UsrS
Mov @#$$SysS,@#$$UsrS ;And Set System
Mov #Retint,-(SP) ;Return Address (For Return)
Jsr R0,SavRg ;Save Registers R0..R4
Tst @#KbdDbr
Jmp @R5 ;and Exit
.SbTtl Common Interrupt Exit Routine
Retint:
Mov @#KbdUSS,@#$$UsrS ;UsrS
Mov KbdSP,SP ;Restore Stack
Mov @#$$UsrS,@#Sel1 ;Restore Sel1
Mov (SP)+,R5 ;Restore R5
Rti ;And Exit
.SbTtl $Binkey (EMT 102) Routine (Get character Without Waiting)
.Enabl LSB
$Binkey::
Mov #Ttibuf,R5 ;Buffer Byte Counter Ptr
Tst (R5)+ ;Check Buffer
Beq Noinpt ;Is empty...
Inc @R5 ;Increment Read Address
Cmp @R5,#Bfrend
Blo 10$
Sub #Bfrlen,@R5 ;Ring Buffer Bound
10$: MovB @(R5),R0 ;Get The byte
Dec -(R5) ;Decrease Byte Counter
20$: Bic #^C377,R0 ;Clear Upper Byte and Exit
Tst (PC)+
30$: Sec
Return
Noinpt: Bit #Rptfg,KbMode ;Test "Repeat flag"
Beq 30$ ;Is reset, Exit
Bit #Keflg,@#SEL1 ;Pressed ?
Bne 30$ ;No
Mov @#KbdDbr,R5 ;Pressed, Clear Interrupt Request
Mov #40$,-(SP)
Jsr R0,SavRg ;Save Registers
Call Klick ;Klick
Jmp RetEmt ;-------+
40$: Mov REptfl,R0 ;<------+
Bpl 20$ ;Put Character
Clr R0 ;Else Clear Buffer
Br 30$
.Dsabl LSB
.SbTtl $Bttyin (EMT 6) Routine (Get One Character from Keyboard)
$Bttyin::
Mov @#$$UsrS,@#UsTTy ;Save Usrs for
Mov @#Vec4,@#TTYV4 ;Normal Completion Routine
Mov #12$,@#Vec4 ;Initialization
Mov @#$$SysS,@#$$UsrS ;(At Lower priority Must be
5$: Call $BinKey ;"User" State !!!)
Bcc 10$ ;OK
MtPS #0 ;No Character
Nop ;Wait for Ready...
Mtps #340
Br 5$
10$: Mov @#UsTty,@#$$UsrS
Mov @#TTYV4,@#Vec4
TstB R0
Return
12$: Mov @#UsTTY,@#$$UsrS
Mov @#TTYV4,@#Vec4
Jmp @Vec4
.SbTtl $Bfunct (EMT 12) Routine (Set Function Switch)
$Bfunct::
Jsr R0,GetArg
Tst R0 ;Key Number
Beq 40$ ;Reset All Keys
CmpB R0,#10.
Bhi 20$ ;Illegal Key Number
Dec R0 ;0..9
Mov R0,R2
Swab R2 ;
Asr R2 ;
Asr R2 ;R2=Key Number Mod 100
Asl R0 ;Key Number * 2
Add #FncMem,R2 ;
Mov R2,FncTb(R0) ;Save Internal String Address
Mov #100-1,R3 ;Byte Counter
Mov R1,R5 ;User String Address
Mov R0,R4 ;
10$: Call GetUbt ;Get User's Byte (R5)+
MovB R0,(R2)+ ;And store it
Beq 20$ ;End Of String
Sob R3,10$ ;Go next Byte
ClrB (R2)+ ;Last Byte
20$: Cmp R3,#100-1 ;String size
Bne 30$ ;
Clr FncTb(R4) ;Null String ==> Reset
30$: Call FncOut ;Output Special string
ClC
Jmp RetEmt
40$: Call ClrFnc
Br 30$
ClrFnc: Mov #FncTb,R0
Mov #10.,R5
10$: Clr (R0)+ ;Clear All Function Keys
Sob R5,10$
Return
.Psect $Stack
.BlkW 100
KbStk:: ;Keybord Initial Stack Pointer
.Psect $RAM
KbdSP:: .BlkW ;Save Area for User SP
KbdUSS::.BlkW ;$$UsrS Interrupt Buffer
UsTty: .BlkW
SpCmpl: .BlkW
FncO: .BlkW
TTYV4: .BlkW
KbMode::.BlkW ;Mode Flags
KbAddr: .BlkW ; Address
KbSel: .BlkW ;Completion Routine Sel1
KbStC: .BlkW ;Stack Pointer
REptfl: .BlkW ;Repeat Buffer
.BlkW ;Write Address
TtiBuf: .BlkW ;Byte Counter
.BlkW ;Read Address
FncTb:: .BlkW 10. ;Function Key String Address
FncMem::.BlkB 10.*100 ;Function Key String Buffer
Ibufr:: .BlkB BfrLen
Bfrend:
.Even
.End

View File

@ -0,0 +1,392 @@
;
; COPYRIGHT (C) 1986 BY
; C-11 SPECIAL INTEREST GROUP, LENINGRAD STATE UNIVERSITY.
; ALL RIGHTS RESERVED.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
; TRANSFERED.
;
; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY C-11 GROUP.
;
; C-11 ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
; SOFTWARE ON EQUIPMENT WHICH IS NOT SUBMITTED BY C-11.
;
.MACRO .BMACS
.MCALL ..BCM0,..BCM1,..BCM2,..BCM3
...B1=1
.ENDM
;
; STARG ---> STACK
;
.MACRO ..BCM0 ARG,INS
.IF B <ARG>
CLR -(SP)
.IFF
.IF IDN <ARG>,#0
CLR -(SP)
.IFF
.IIF IDN <ARG> <0> .ERROR ;?BKLIB-W-INVALID ARGUMENT, USE #0, NOT 0;
MOV ARG,-(SP)
.ENDC
.ENDC
.IIF NB <INS> EMT ^O<INS>
.ENDM
;
; <LOW>+<HIGH*400> --> R0
;
.MACRO ..BCM1 LOW,HIGH,INS
.IF NB <HIGH>
.NTYPE ...V2,HIGH
.IF EQ ...V2-^O27
MOV HIGH*^O400,R0
.IFF
MOV HIGH,R0
SWAB R0
CLRB R0
.ENDC
.IIF DIF <LOW>,<#0> BISB LOW,R0
.IFF
.IF NB <LOW>
CLR R0
BISB LOW,R0
.ENDC
.ENDC
.IIF NB <INS> EMT ^O<INS>
.ENDM
;
; ARG --> R0 (DEFAULT 0)
;
.MACRO ..BCM2 ARG,INS
.IF B <ARG>
CLR R0
.IFF
.IIF DIF <ARG>,R0 MOV ARG,R0
.ENDC
.IIF NB <INS> EMT ^O<INS>
.ENDM
;
; ARG --> R0
;
.MACRO ..BCM3 ARG,INS,BB
.IF NB <ARG>
.IIF DIF <ARG>,R0 MOV'BB ARG,R0
.ENDC
.IIF NB <INS> EMT ^O<INS>
.ENDM
.MACRO .BEXIT ARG
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM2 ARG,0
.ENDM
.MACRO .BINIT
EMT 14
.ENDM
.MACRO .BSETPG PAGE,ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM1 PAGE,ADDRESS,52
.ENDM
.MACRO .BJSR PAGE,ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM0 PAGE
..BCM0 ADDRESS,54
.ENDM
.MACRO .BJMP PAGE,ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM0 PAGE
..BCM0 ADDRESS,56
.ENDM
.MACRO .BPEEK PAGE,ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM0 PAGE
..BCM0 ADDRESS,60
.ENDM
.MACRO .BPOKB PAGE,ADDRESS,DATA
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 DATA,,B
..BCM0 PAGE
..BCM0 ADDRESS,62
.ENDM
.MACRO .BPOKE PAGE,ADDRESS,DATA
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 DATA
..BCM0 PAGE
..BCM0 ADDRESS,120
.ENDM
.MACRO .BTEST PAGE
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 PAGE,72
.ENDM
.MACRO .BKBINI
EMT 4
.ENDM
.MACRO .BTTYIN ADDRESS
EMT 6
.IF NB <ADDRESS>
.IIF DIF ADDRESS,R0 MOVB R0,ADDRESS
.ENDC
.ENDM
.MACRO .BGTLIN ADDRESS,LENGTH
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM0 ADDRESS
..BCM0 LENGTH,10
.ENDM
.MACRO .BFUNCT KEY,ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM0 KEY
..BCM0 ADDRESS,12
.ENDM
.MACRO .BEDIT ADDRESS,LENGTH
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM0 ADDRESS
..BCM0 LENGTH,66
.ENDM
.MACRO .BKSET ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,100
.ENDM
.MACRO .BINKEY
EMT 102
.ENDM
.MACRO .BTTYOU CODE
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 CODE,16,B
.ENDM
.MACRO .BPRINT ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,20
.ENDM
.MACRO .BSSOUT CODE,ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM0 CODE
..BCM0 ADDRESS,22
.ENDM
.MACRO .BLOCAT LINE,POSITION
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM1 POSITION,LINE,24
.ENDM
.MACRO .BPOS ADDRESS
EMT 26
.IF NB <ADDRESS>
.IIF DIF ADDRESS,R0 MOV R0,ADDRESS
.ENDC
.ENDM
.MACRO .BPOINT ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,30
.ENDM
.MACRO .BGETPNT ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,104
.ENDM
.MACRO .BVECT ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,32
.ENDM
.MACRO .BBUFSET VIDEO,WRITE
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM1 WRITE,VIDEO,74
.ENDM
.MACRO .BTVSET ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,64
.ENDM
.MACRO .BTVGET ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,34
.ENDM
.MACRO .BSCOLOR ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,76
.ENDM
.MACRO .BGCOLOR ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,106
.ENDM
.MACRO .BSCROLL NUMBER,SCREEN
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM0 SCREEN
..BCM0 NUMBER,110
.ENDM
.MACRO .BTRPSET ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,112
.ENDM
.MACRO .BEMTSET ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,114
.ENDM
.MACRO .BKGET ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,116
.ENDM
.MACRO .BDISK ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,70
.ENDM
.MACRO .BMTB10 ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,36
.ENDM
.MACRO .BCIRCL ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,130
.ENDM
.MACRO .BDRAW ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,122
.ENDM
.MACRO .BSPRITE ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,124
.ENDM
.MACRO .BCHCLR OLD,NEW
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM1 OLD,NEW,126
.ENDM
.MACRO .BCTMSX ADDRESS
.IF NDF ...B1
.MCALL .BMACS
.BMACS
.ENDC
..BCM3 ADDRESS,132
.ENDM

View File

@ -0,0 +1,564 @@
.Mcall .Module
.Module BKMTBK, Release=X02, Version=06, Comment=<BK0010-Compatible Tape>
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
.Include "BKHEAD"
.Globl SavRg, RetEmt, GetUbt, PutUbt,UsrSav,PrePare,SelTbl,AdrSel
.Globl Window
;
;Bk0010-Compatible Handler Request Table format:
;
; +-------+-------+
; ! ! CODE !
; +-------+-------+
; ! Memory Address!
; +-------+-------+
; ! Length (Bytes)!
; +---------------+
; ! Filename !\
; . . . . ] 16 Bytes
; ! !/
; +---------------+
; ! Page1 ! Page0 !
; +-------+-------+
; ! Memory Address! 2 Real
; +---------------+
; ! Length (Bytes)! 4 Real
; +---------------+
; ! Name ! 16B Realfilename
; +---------------+
;
; CODE is the operation code:
;
TapeOF = 0 ;Set Tape-Recorder Off
TapeOn = 1 ;Set Tape-Recorder On
Writape = 2 ;Write File
Reatap = 3 ;Read File
Fictp = 4 ;Fictious Reading
ReaNxt = 5 ;Read NExt File
DirFil = 6 ;Directory Operation
;
;Error Code Returns in Errbyt as:
;
NoErr = 0 ;Illegal Command
FilNfd = 1 ;Another file Name
ChkErr = 2 ;CheckSum Error
MemErr = 3 ;Memory Error
StpErr = 4 ;Manual interrupt
;
;Sel1 Tape Output Data Bit Mask
;
Dat00 =0 ;-0
Dat11 =140 ;+0
BitDat =140
;
;Timing Constants
;
LNG0 = 37.
LNG1 = 74.
Snc0 = 35.
Snc1 = 34.
Snc2 = 161.
Snc3 = 153.
LNGM = 147.
;
TapBit = 40 ;Sel1 Tape Data input bit
DspRd = 2 ;Maximum pulse dispersion during read
.SbTtl MtIni Routine Cassette-Tape Initialization
MtIni:: Bis #Mot$$$,@#$$UsrS
Bis #Mot$$$,@#$$UsrS
Bic #BitDat,@#$$UsrS
Bic #BitDat,@#$$SysS
Mov @#$$SysS,@#Sel1
Tst @#Sel1
Return
.SbTtl $BMtb10 (EMT 36) Routine (BK0010-compatible tape handler)
;
;BK0010-Compatible cassette-Tape handler Entry Point
;
.Psect $CodOvr
$BMtb10::
Jsr R0,SavRg ;Save Registers
Mov R0,R5
Mov R0,ArgAdr ;Save Arg Block Address
Mov #ArgLng,R1 ;Byte Counter of Arg Block
Mov #Bk10Scm,R2 ;System Working Area for tape handler
10$: Call GetUbt
MovB R0,(R2)+ ;Move Arg Block to System Area
Sob R1,10$
ClrB @#ErrByt ;Clear Error Flag
ClrB ErrFlg
ClrB Phase ;Clear Tape Phase Flag
ClrB NxtFlg
ClrB DirFlg
Clr Noread ;Clear "Not real Read" Flag
Mov @#Vec4,Sav4 ;Save Vector 4
Mov #TapV4,@#Vec4 ;And Set Temporary Vector
Mov SP,SPSave ;Save stack pointer value
MovB Code,R0 ;Command Code
Cmp R0,#MaxCmd
Bhis 20$
Asl R0
Jmp @CmdTab(R0)
20$: Jmp IllCmd ;Illegal Command
CmdTab: .Word CmdOff ;Set Tape-Recorder Off ;0
.Word CmdOn ;Set Tape-Recorder On ;1
.Word CmdWri ;Write Block ;2
.Word CmdRd ;Read Block ;3
.Word CmdFct ;Fictious Reading ;4
.Word CmdRnx ;Read NExt File ;5
.Word CmdDir ;Directory Operation ;6
MaxCmd = <.-CmdTab>/2
.Psect $Code
Err3: MovB #3,@#ErrByt
IllCmd: IncB ErrFlg
Jmp Exit ;Error 0
TapV4: Mov SPSave,SP ;Restore Stack Pointer
Mov @#$$SysS,@#Sel1 ;
MovB #StpErr,@#ErrByt;And Set Error Code
MovB #1,ErrFlg
Jmp CmdOff
CmdOff: Call Mtini ;Stop Taperecorder
Br Exit ;And Exit
CmdOn: Bic #BitDat!Mot$$$,$$UsrS
Bic #BitDat!Mot$$$,$$SysS
.SbTtl Exit Routine
Exit: Mov @#$$SysS,@#Sel1
Mov Sav4,@#Vec4 ;Restore Vestor 4
Mov ArgAdr,R5
Mov #ResLng,R2
Mov #Bk10Scm,R3
10$: MovB (R3)+,R0
Call PutUbt
Sob R2,10$
RorB ErrFlg
Jmp RetEmt
.SbTtl Checksum computing Routine
ChkSum: Mov AdrSel,R4
Mov (R4)+,@#Sel1 ;Initial User Sel1 Value
Clr R0 ;Accumulator
Br 20$
10$: Bit #140000,R1 ;Check Region No
Beq 30$
Mov (R4)+,@#Sel1 ;Set New Value
20$: Bic #140000,R1
30$: Clr R3 ;R1=addr., R2=Length (Bytes)
BisB Window(R1),R3
Add R3,R0
Adc R0
Inc R1
Sob R2,10$ ;R0 = Computed CheckSum
Mov SelTbl,@#Sel1
Return
.SbTtl SetTpe - Taperecorder preparing
SetTpe: Mov #SelTbl,AdrSel ;Initial Sel1 Value
Mov @AdrSel,R3
Mov R3,@#Sel1
Tst @#Sel1
Mov #0,R0
Sob R0,. ;Pause after taperecorder ON
Return
.SbTtl Write Command
CmdWri:
;
;This ROutine Writes Tape file from User's memory.
;File Name is from CmdNam Buffer,
;Start Address is "StAddr", File length is "Lngth" bytes
;
Mov StAddr,R1 ;Initial Read/Write Address
Mov Lngth,R2 ;File Length
Mov UsSel,R5
Call Prepare ;Set Tape On, Prepare Buffer
Bcc 10$
Jmp Err3 ;Illegal Region specification
10$: Mov #SelTbl+2,AdrSel;Initial Sel Address
Mov StAddr,R1
Mov Lngth,R2
Call ChkSum ;Compute CheckSum
Mov R0,SumBuf ;And store it
Call SetTpe ;Prepare Arguments and Taperecorder
Mov #4096.,R0 ;Write Initial synchronization
Clr R4
Mov #256.,R5
Call OutSnc
Mov #StAddr,R1 ;Header Address
Mov #2.+2.+16.,R2 ;Header Length
Mov SelTbl,R3 ;System Sel1
Call OutDat ;Write Data
Add #2,AdrSel ;to 1-st User Sel1
Mov @AdrSel,R3 ;New Sel1 Value
Mov StAddr,R1 ;Data Array Address
Mov Lngth,R2 ;Data Array Length
Call OutDat
Mov #SumBuf,R1 ;Write 2 Bytes of Checksum
Mov SelTbl,R3
Mov R3,@#Sel1 ;System Sel1
Mov #2,R2 ;Data Length (2 Bytes)
Call OutDt1 ;Write without Buffer Seq.
Mov #256.,R0 ;Write Final Synchronization
Mov R0,R4
Mov R0,R5
Call OutSnc
Jmp CmdOFF ;Stop Tape and Exit
.SbTtl Initial and final Synchronization Writing
;
;Input:
;
;R0= Pulse Counter
;R3= Sel1 Value without Data bits
;Uses R0, R5
;Output Carry=0
;
OutSnc:
10$: Bis #Dat11,R3 ;Write "0" ! *
Mov R3,@#Sel1 ; ! *
Add #Snc0,R5 ;U=UMAX ! *
Sob R5,. ; ! *
Bic #Dat11,R3 ;U=0 !*
Mov R3,@#Sel1 ; !*
Add #LNG0-2,R4 ; !*
Sob R4,. ; !*
Sob R0,10$ ;Count Pulses
OutSn1:
Bis #Dat11,R3 ;Write Marker ! *
Mov R3,@#Sel1 ; ! *
Mov #Snc2,R5 ;U=0.75 ! *
Sob R5,. ; ! *
Bic #Dat11,R3 ; ; *
Mov R3,@#Sel1 ; ! *
Mov #Snc3,R5 ; ! *
Sob R5,. ; ! *
Inc R4 ;R4=1
Mov R2,R0 ;Temporary Storage of R2
Mov R4,R2 ;R2=1 (1 byte, 1 bit)
Call OutBt1 ;Output bit of One
Mov R0,R2 ;And Restore R2
Return
.SbTtl Data Array Output
;
;Input:
;R1=Initial Buffer Address
;R2=Buffer length
;
OutDat: Mov #8.,R0 ;Write Buffer Sequence.
Call OutSnc
OutDt1: Br OutDt3
OutDt2: Inc R1
Bit #140000,R1
Beq 10$
Add #2,AdrSel
Mov @AdrSel,R3
Mov R3,@#Sel1
10$:
OutDt3: Bic #140000,R1
MovB Window(R1),R0 ;Data Byte
Mov #8.,R4 ;Bit per Byte counter
Outbit: Asr R0 ;Shift out the next bit
Bcs OutBt1
OutBt0: Bis #Dat11,R3
Mov R3,@#Sel1
Mov #LNG0,R5 ;Write 0; U=1 ! *
Sob R5,. ; ! *
Bic #Dat11,R3 ;U=0 !*
Mov R3,@#Sel1 ; !*
Mov #LNG0-1,R5 ; !*
Sob R5,. ; !*
Br OutSsi ; !*
OutBt1: Bis #Dat11,R3
Mov R3,@#Sel1
Mov #LNG1+3,R5 ;U=0.75 ! *
Sob R5,. ; ! *
Bic #Dat11,R3 ; ! *
Mov R3,@#Sel1 ;U=0.25 ! *
Mov #LNG1+3,R5 ; ! *
Sob R5,. ; ! *
;Synchro-Pulse writing
OutSsi: Bis #Dat11,R3 ;U=MAX ! *
Mov R3,@#Sel1 ; ! *
Mov #LNG0,R5 ; ! *
Sob R5,. ; ! *
Bic #Dat11,R3 ;U=0 !*
Mov R3,@#Sel1 ; !*
Mov #LNG0-2,R5 ; !*
Sob R5,. ; !*
Sob R4,Outbit ;Bit per Byte Loop
Dec R2
Bne OutDt2 ;Byte per Block Loop
Return
.SbTtl Tape Reading Routines
CmdDir: MovB #1,DirFlg ;Dir Operation
CmdRnX: MovB #1,NxtFlg
Br CmdRd
CmdFct: Inc Noread ;Set "Disable Reading Flag"
CmdRd: Clr R1 ;Initial Buffer Address
Mov #140000,R2 ;Buffer Length
Mov UsSel,R5
Call Prepare
Mov #TapBit,R5 ;Input Data bit mask
Mov #1,IncADR ;Address Increment
Mov #Sel1,R3 ;Sel1 Address
.SbTtl Synchronization Search Loop
Again: Mov #SelTbl,AdrSel ;Set System Sel1 Value
Mov SelTbl,@R3 ;Map System Page Twice, Set Tape On
Call GetSnc ;Initial Read Syncronization
Mov SelTbl,@R3 ;Map System Page Twice, Set Tape On
Call GetLbl ;Read file Label (Header)
Bcs 20$ ;Header Error - Illegal file name
TstB DirFLg
Bne 20$
10$: Call GetFil ;Read Data
Mov @#$$SysS,@#Sel1 ;Set Normal System Sel1
Call MtIni
Jmp Exit ;And Exit
20$: BisB #1,ErrFlg ;Set "Illegal File Name" Flag
Jmp Exit ;and Exit
.SbTtl Initial Synchronization Search Routine
GetSnc: ClrB Phase ;Inverted Phase Flag
10$: Mov #4000,R2 ;Loop Counter
Clr R0 ;Initial pulse width value
20$: Clr R4 ;Counter for one pulse time
30$: Bit R5,@R3 ;Wait for bit of "1"
Beq 30$ ;
40$: Inc R4 ;Count time of "1"
Bit R5,@R3 ;R4 = "1" Time
Bne 40$
Sub R4,R0 ;Compute Pulse Dispersion
Bmi 50$ ;
Cmp R0,#DspRd ;Dispersion greater ==>
Bhi 10$ ;new search
50$: Mov R4,R0 ;Wait another time (2048 Times)
Sob R2,20$
.SbTtl Phase and speed determination
Clr R0 ;Speed value
Mov #128.,R2 ;Pulse Counter
60$: Call GetBit ;R4= one Pulse width
Add R4,R0
Sob R2,60$ ;R0= T(128 pulses)
Mov #7,R2 ;
70$: Asr R0
Sob R2,70$ ;R0=Average pulse width
Mov R0,R4 ;
Asr R4
Add R4,R0
Mov R0,BitLng ; 1.5*Pulse width
.SbTtl Phase detection
;First Long pulse state=1 ==> Direct, =0 ==> Invert phase
80$: Clr R4 ;Initialize time counter
90$: Inc R4 ;Count time
Bit R5,@R3 ;What's this
Bne 90$ ;It's One, Count time
Cmp R4,R0 ;Time of One is Long (>1.5t) ?
Bhi 110$ ;Yes, direct phase
Clr R4 ;No, Wait another one
100$: Inc R4 ;Count Time of zero
Bit R5,@R3
Beq 100$
Cmp R4,R0 ;Time of 0 is long ?
Blo 80$ ;No, Wait once more
IncB Phase ;Long Zero ==> set Inverse flag
110$: Asl R0
;End of tuning operations
;
Cmp R4,R0 ;pulse too long (Direct Current) ?
Bhi GetSnc ;Yes, Ignore tuning operations, Go Again
Call GetBit ;Else Skip one bit and Return
Return
UNSYN1: Cmp (SP)+,(SP)+ ;Repeat search Once more
Br AGAIN
.SbTtl File Header Read Routine
GetLbl: Mov SelTbl,@R3 ;Set System Sel1
Mov #<ResBlk&<^C140000>>,R1 ;Real Header Buffer
Mov #16.+2.+2.,R2 ;Byte Counter
Call GetBlk ;Read Tape block
TstB NxtFlg
Bne 30$ ;Ill. File Name ==> Read Data
Mov #8.,R2 ;Compare Names
Mov #ResNam,R1
10$: Cmp CmdNam-ResNam(R1),(R1)+
Bne 20$ ;Different Filenames
Sob R2,10$
Br 30$
20$: MovB #1,@#ErrByt ;Another file Found
Br 40$
30$: Tst (PC)+
40$: Sec
Return
.SbTtl Data Block Read Routine
GetFil: Mov Rlngth,R2 ;File Length = Byte Counter
Mov #SumBuf,R1 ;Fictive Read Buffer Address
Mov #SelTbl,AdrSel ;And Sel1 Value
Sub Noread,IncAdr ;Fictive Read Operation ?
Beq 10$ ;Yes
Call ReAdr ;Get Read Address
10$: Bic #140000,R1 ;Get WIndow Address
Mov @AdrSel,@R3 ;Map Window
Call GetBlk ;Read Data Block
Mov #SelTbl,AdrSel ;
Mov @AdrSel,@R3 ;Set System Sel1
Mov #SumBuf&<^C140000>,R1 ;Checksum Address
Mov #2,R2 ;Block Size
Call GetDat ;Get CheckSum
Tst Noread ;Fictive Read ?
Bne 20$ ;Yes, Skip Computing
Call ReAdr ;Read Addr to R1, Prepare Sel1
Mov RLNGTH,R2 ;File Length
Call ChkSum ;Compute CheckSum
Cmp R0,SumBuf
Beq 20$ ;Checksum OK
MovB #CHKERR,@#ErrByt;
IncB ErrFlg
Sec
Return
20$: Clc
Return
ReAdr: Mov StAddr,R1 ;User Read Address
Bne 10$
Mov Raddr,R1 ;Not Found, Get from Label
10$: Mov R1,R0
Rol R0 ;
Rol R0 ;1
Rol R0 ;11
Rol R0 ;111
Bic #^C6,R0 ;Region No
Add #SelTbl+2,R0
Mov R0,AdrSel ;Correct No
Return
.SbTtl Block Get Routine
;
;Input Data:
;R1=Read Address (inside Memory window)
;R2=Byte Counter
;R3=Sel1 Adress
;R5=Input Data bit mask
;
GetBlk: Mov BitLng,R0 ;Speed-Depended value
TstB Phase ;What phase ?
Bne 30$ ;Inverted
;
;Direct Phase Read Operation
;
10$: Clr R4 ;Time Counter
20$: Inc R4
Bit R5,@R3
Bne 20$
Cmp R4,R0 ;What's about width?
Blo 10$ ;Too small, skip Sync-bit
Br 50$ ;It's Data, Compouse
;
;Inverted phase read
;
30$: Clr R4
40$: Inc R4
Bit R5,@R3
Beq 40$
Cmp R4,R0 ;Sync-Bit?
Blo 30$ ;Yes, Skip it
50$: Asl R0 ;R0 = Max time
Cmp R4,R0 ;Pulse too long ?
Bhi UNSYN1 ;Yes, Error (No Data)
Call GetBit ;Read One bit of data to sinchronize
Br GetDat
.SbTtl Bit to byte assembling, Read Data
GetDaX: Add IncADR,R1 ;Go next Address
Bit #140000,R1
Beq 10$
Add #2,AdrSel
Mov @AdrSel,@R3 ;Set New Sel1 Value
10$:
GetDat: Bic #140000,R1
Mov #8.,R0 ;Bit per Byte Counter
10$: Call GetBit ;Get Data bit
Cmp R4,BitLng ;Check bit Value
Bhi 20$
Tst (PC)+ ;Zero, Clear Carry
20$: SeC ;One, Set Carry
30$: RorB Window(R1) ;Shift Data bit in
Sob R0,10$ ;Byte loop
Sob R2,GetDaX ;Data Block Loop
Return
.SbTtl Bit Reading Routine
GetBit: Clr R4 ;
TstB Phase ;Inverted phase?
Bne 50$ ;Yes
;
;Direct Phase Read Routine
;
10$: Bit R5,@R3 ;Wait for 1 to 0 edge
Bne 10$
20$: Bit R5,@R3 ;Rising edge wait loop
Beq 20$
30$: Inc R4
Bit R5,@R3
Bne 30$
40$: Inc R4
Bit R5,@R3
Beq 40$
Return ;R4 = Pulse width
;
;Invert phase read routine
;
50$: Bit R5,@R3
Beq 50$
60$: Bit R5,@R3
Bne 60$
70$: Inc R4
Bit R5,@R3
Beq 70$
80$: Inc R4
Bit R5,@R3
Bne 80$
Return ;R4= Pulse width
.Psect $Ram
ArgAdr: .BlkW ;User Arg Block address
Bk10Scm: ;Handler Working Buffer of Arg Block
Code: .BlkB ;Op Code
.Even
StAddr: .BlkW ;Memory Address
Lngth: .BlkW ;File Length
CmdNam: .BlkB 16. ;File Name
UsSel: .BlkW ;Pages...
ArgLng=.-Bk10Scm
ResBlk:
Raddr: .BlkW
Rlngth: .BlkW
ResNam: .BlkB 16. ;Real Filename
ResLng=.-Bk10Scm
.SbTtl Internal Working Cells
Phase: .BlkB ;Tape Phase flag
ErrFlg: .BlkB
NxtFlg: .BlkB
DirFlg: .BlkB
.Even
Noread: .BlkW ;Fictious Reading Flag
SPSave: .BlkW ;Stack Pointer Save Area
Sav4: .BlkW ;Vector 4 Save Area
SumBuf: .BlkW ;CheckSum Buffer
IncADR: .BlkW
BitLng: .BlkW ;Bit pulse width
.End

View File

@ -0,0 +1,122 @@
.Mcall .Module
.Module OutSym,Release=X02,Version=00,Comment=<BK0011 Symbol Generation>
;
; Copyright (c) 1986 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl UndLn$,InvCh$$,ShiftM,ScrSel
.Globl Color,BkGnd,TtoFlg,NxTvLn,CrsAdr
.Psect $Code
.SbTtl Symbol Generation
;
; R0= Symbol code, R5= SymTab Address
;
; Symtab is the table with 9 bytes per symbol
;
OutSym::
Bic #^C377,R0
Mov @#$$UsrS,-(SP) ;Save Current User Sel1
Mov @SP,-(SP) ;Save Current User Sel1
Bic #^C<ScrMsk!TapMsk>,@SP
Mov ScrSel,@#$$UsrS ;Sel for Screen
Bic #TapMsk!ScrMsk,$$UsrS ;(Without tape and screen)
Bis (SP)+,@#$$UsrS ;Prepare SEL1 register for screen mapping
Mov R0,-(SP)
Asl R0 ; Compute the table offset
Asl R0 ; *4
Asl R0 ; *8 SymTab Shift
Add (SP)+,R0 ; *7
Add 2(R5),R0 ; Add SymTab Address
Mov CrsAdr,R1 ; Current Address
Mov R1,-(SP) ;Not Delete this Command !!!!!
;Addr Must be in R1 !!!
Mov @R5,-(SP) ;SymTab Map Constant
Bic #<TapMsk!ScrMsk>,@SP ;Set Current Taperecorder Bits
Mov @#$$SysS,R2 ;In Symtab Sel1
Bic #^C<TapMsk!ScrMsk>,R2;
Bis R2,@SP ;New screen and tape bits
Mov #9.,R2 ; Raster counter
.SbTtl Get SymTab Byte to R3
10$: Mov CrsAdr,R1 ; Current Address
20$: Mov @SP,@#Sel1 ;Set Symtab Map
MovB (R0)+,R3 ;Get Character From Symtab
Mov @#$$SysS,@#Sel1 ;And Restore System Maping
Tst @#Sel1
Cmp R2,#1
Bne 30$
Bit #Undln$,TtoFlg
Beq 30$
Com R3
30$: Call PutChr ;And Put Character to Screen
Sob R2,10$ ;Loop until 9 Rasters done
Tst (SP)+ ;Clear stack
Mov (SP)+,CrsAdr ;Restore Screen Address
Mov @#$$SysS,@#Sel1
Tst @#Sel1
Mov (SP)+,@#$$UsrS ;Restore User Mapping
Return
.SbTtl Routine to put character raster line to TV-Screen Buffer
PutChr:
Mov @#$$UsrS,@#Sel1 ;Set Screen Mapping
Tst @#Sel1 ;
Bit #InvCh$$,TtoFlg ; Inverted ?
Beq 10$ ;No, Do Nothing
Com R3 ; Yes, Invert code
10$: Mov #8.,-(SP) ;Bit per char counter
Mov R3,-(SP) ;Save symbol Code
20$: MovB Shiftm,R4 ;Character width
Dec R4 ;
Beq 50$ ;1 bit/Point, Do nothing
Ror @SP ;Else expand byte to 1 or Two words
Ror R5 ;Get new bit
Ror R3 ;(Second Word)
30$: Asr R5 ;Expand the sign bit
Ror R3 ;
Sob R4,30$ ;And loop
Dec 2(SP) ;Bit per Byte Counter
Bne 20$ ;
Mov R5,R4 ;Set Color for 1-st Word
Call ClSet ;
CmpB Shiftm,#2 ;256 Points ?
Bne 40$ ;No, 128
Mov R4,@R1 ;Write Word to Screen
Br 60$
40$: Mov R4,2(R1) ;Write First and
Mov R3,R4 ;Second Words
Call ClSet ;For 128 Points
Mov R4,@R1
Br 60$
50$: Mov R3,R4 ;Process 512 Points/Line Code
Call ClSet
MovB R4,@R1 ;Write Byte to screen
60$: Cmp (SP)+,(SP)+ ;Clear Stack Space
Call NxTVLn ;And Move TV-Raster line down
Return
.SbTtl Color Mapping Routine for symbol generation
ClSet: Mov BkGnd,-(SP)
Bic R4,@SP ;Clear Unused
Com R4
Mov Color,-(SP)
Bic R4,@SP
Bis (SP)+,@SP
Mov (SP)+,R4
Return
.End

View File

@ -0,0 +1,80 @@
.Mcall .Module
.Module BKSTRT, Release=X02, Version=03, Comment=<BK0011 Starting Routine>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl Debug, IniBK, BootRX, GetUwd
MYcsr == 177130 ;MY: Control state register
.SbTtl General Initialization Routine
Start:: MtPS #340
Mov #UStack,SP ;Set initiial Stack pointer
Tst -(SP) ;
Call IniBK ;Call Initialization Routine
Mov #UStack,SP ;Set initiial Stack pointer
Mov @#Vec4,SvaXX ;
Mov #1$,@#Vec4 ;
Clr @#MYcsr ;Test for MY: Disk controller
Mov @#SvaXX,@#Vec4 ;Restore vector
.Rem *
Clr -(SP) ;
2$: Mov @SP,R0 ;Get Unit No
Call BootRX ;Attempt to Boot the System
Bcs 1$ ;No Device
Inc @SP ;Go next unit
Cmp @SP,#3 ;
Blos 2$ ;
*
1$: Mov #UStack,SP ;Initialize Stack
Mov @#$$SysS,@#Sel1
Mov @#SvaXX,@#Vec4 ;Restore vector
Mov #13,SvaX1 ;The last ROM page number
5$: .BsetPg SvaX1,#1 ;Connect ROM
Bcs 3$ ;This ROM is illegal
Mov @#100000,R0 ;Read Word
Cmp #NOP,R0 ;Test for program
Bne 3$ ;Illegal ROM
Call @#100000 ;Call ROM program
3$: Mov @#$$SysS,@#Sel1
Mov @#$$SysS,@#$$UsrS
Tst @#Sel1
Dec SvaX1 ;Illegal ROM, check the next
Cmp SvaX1,#10 ;
Bhis 5$ ;
Mov #Mot$$$!WrEnS!<1*400>!<20*400>,@#$$UsrS
Mov #UStack,SP ;
Mov @#$$UsrS,@#Sel1
Tst @#Sel1
.Bprint #IniTxt
Clr -(SP) ;Original PC, PS = 0
Clr -(SP) ;
Jmp Debug
.Psect $Stack
.Blkw 200.
SStack::
.Psect $RAM
SvaXX: .Blkw
SvaX1: .Blkw
.Psect $Const
IniTxt: .AsciZ /BK0011 Keyboard Monitor/
.Even
.End Start

View File

@ -0,0 +1,868 @@
.Mcall .Module
.Module BKTV, Release=X02, Version=05, Comment=<BK0011 TV-Set Handler>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl SavRg,SymTab,SymG00,RetEmt,GetArg,IsgTab,CtrTab
.Globl KbMode,$MixAs,$Cyril,FncTb,OutSym,NAK,FF,SetScS,SetScX
.Globl GetUbt,GetUwd,PutUwd
.SbTtl Data Field Definitions and Constants
MemBeg = 100000
MemEnd = 140000
Scroll == 177664
; Symtab Format:
;
; 000 - 037 Space, !"#$%&'()*+,-./0123456789:;<=>?
; 040 - 077 @, UPPER CASE A-Z [\]^_
; 100 - 137 "`", lower case a-z{|}~,Rubout
; 140 - 177 Lower case Cyrillic
; 200 - 237 Upper case Cyrillic
;
;
;TtoFlg Word Definition:
;
.Radix 2
SSflg$ == 1000000000000000 ;100000 ;Special Line Disabled
Block$ == 100000000000000 ;40000 ;Control Characters Indication
Crsr$$ == 10000000000000 ;20000 ;Cursor indication Disabled
AWrp$$ == 1000000000000 ;10000 ;Auto Wrap Mode OFF
UndLn$$ == 100000000000 ;4000 ;Character Underlinning
InvCh$$ == 10000000000 ;2000 ;Character Inversion
Lat$$ == 1000000000 ;1000 ;Ascii ==> Latin Flag
MixO$$ == 100000000 ;400 ;Ascii ==> Mixed Mode
AscO$$ == 10000000 ;200 ;0==> UAscii, 1==> Ascii
D$Wid$ == 100 ;1 ==> Double Width Characters
WdtMsk == 11 ;Line Width Mask:
.Radix 8.
;
;0 ==> 128 Points per line
;1 ==> 256
;2 ==> 512
;3 ==> 256
.SbTtl TtyPrg - Symbol Output Routine
;
;
;
; This routine outputs one byte from R0 to TV-Set screen.
; If "AWrp$$" flag isn't set, automatical "Newline" operation is issued
; after printing character at the right margin.
; Otherwise the next symbol will be printed at the same place.
;
; Symbols are accepted in code, determined by the TtoFlg word flags
;
;
.If EQ 1
Symbol Codes:
----------------------------------------------------------------------
! Codes !Block$!AscO$$!MixO$$!Lat$$! Indication !
----------------------------------------------------------------------
! 0..37 ! 0 ! X ! X ! X !Control Char Processing !
! ! 1 ! X ! X ! X !Inverted Latin Or Graphics !
! 40..77 ! X ! X ! X ! X !Numeric and Special Codes !
!100..137 ! X ! 0 ! X ! X !Big Latin Letters !
! ! X ! 1 ! 0 ! 0 !Small Cyrillic Letters !
! ! X ! 1 ! 0 ! 1 !Big Latin Letters !
! ! X ! 1 ! 1 ! X !Big Latin Letters !
!140..177 ! X ! 0 ! X ! X !Small Latin Letters !
! ! X ! 1 ! 0 ! 0 !Big Cyrillic Letters !
! ! X ! 1 ! 0 ! 1 !Small Latin Letters !
! ! X ! 1 ! 1 ! X !Big Cyrillic Letters !
!200..237 ! 0 ! X ! X ! X !Unused !
! ! 1 ! X ! X ! X !Inverted Symbols !
!240..277 ! X ! X ! X ! X !Semi-Graphics !
!300..337 ! X ! 0 ! X ! X !Small Cyrillic Letters !
! ! X ! 1 ! 0 ! 0 !Small Cyrillic Letters !
! ! X ! 1 ! 0 ! 1 !Big Latin Letters !
! ! X ! 1 ! 1 ! X !Big Latin Letters !
!340..377 ! X ! 0 ! X ! X !Big Cyrillic Letters !
! ! X ! 1 ! 0 ! 0 !Big Cyrillic Letters !
! ! X ! 1 ! 0 ! 1 !Big Latin Letters !
! ! X ! 1 ! 1 ! X !Big Cyrillic Letters !
----------------------------------------------------------------------
.EndC
.Psect $CodOvr
;
;Input And Output State == System RAM, System ROM
;
TtyPrg::
Jsr R0,SavRg ;
Bic #^C377,R0
Tst Prefix ;Multi-Char Sequence ?
Beq 10$ ;No
Call @Prefix ;Yes, Process it
Br TtoExi
10$: Mov #AlpTab,R5 ;Symtab Address
Mov R0,R1
Asl R1
Asl R1
Asl R1
Swab R1
Bic #^C7,R1
Asl R1
Jmp @SelSym(R1)
.Save
.Psect $CnsOvr
SelSym: .Word S000,S001,S010,S011,S100,S101,S110,S111
.Restore
S100: Add #140-40-200,R0 ;Small latin
Bit #Block$,Ttoflg
Beq TtoExi
S000: Bit #Block$,TtoFlg ;Control Codes
Beq 30$
Mov #InvCh$$,R1
Xor R1,TtoFlg
MovB ISGTab(R0),R0
Bpl 20$
Mov #GrpTab,R5
Neg R0 ;
20$: Call OutSym
Mov #InvCh$$,R1
Xor R1,TtoFlg
Br StepCr ;Cursor Right
30$: Asl R0
Mov CtrTab(R0),R0
Beq TtoExi
Call @R0 ;Control Char. Processing
Call CurAdr ;Compute Cursor Address
Jmp RetEmt ;And Exit
S101: Mov #GrpTab,R5
S001: Bic #^C37,R0
Br SymOut
S010:
S011:
S110:
S111: Bit #AscO$$,TtoFlg
Bne 1$
TstB R0
Bpl 2$
Sub #100,R0
2$: Sub #40,R0
Br SymOut
1$: Bic #^C177,R0
Bit #MixO$$,TtoFlg
Beq 3$
Bit #40,R0
Beq 2$
5$: Add #40,R0
Br SymOut
3$: Bit #Lat$$,TtoFlg
Beq 5$
Br 2$
.SbTtl Common Printing Symbol Output
EM:: Tst (SP)+
Br StepCr
SymOut: Call OutSym ;and output symbol
StepCr: IncB CursX ;Step
MovB Shiftm,R0
Add R0,CrsAdr
Cmpb CursX,StrLen
Blo TtoExi
Bit #AWrp$$,TtoFlg
Beq 100$
DecB CursX
Sub R0,CrsAdr
Br TtoExi
100$: Call NAK ;New Line
Call CurAdr
TtoExi: Jmp RetEmt
.Psect $Code
.SbTtl Common Routines
.SbTtl Next TV-Line Routine
NxTVLn::
Add #100,CrsAdr ; One TV-line down
Bic #40000,CrsAdr
Bis #100000,CrsAdr
Return
.SbTtl Alphanumeric Cursor Address Computation
;
CurAdr::
;
; Line Addr=Y*100*11+ScrBot
;
MovB CursY,R1
SwaB R1 ; *100*4
ClrB R1
Mov R1,R0
Ror R0 ; *2*100
Ror R0 ; *1*100
Rol R1 ; *10*100
Add R1,R0 ; *11*100
Add ScrBot,R0 ; R0= TV-Line Address
Mov R0,CrsAdr
MovB CursX,R0
Bic #^C377,R0 ; X-Coordinate
MovB Shifts,R1
Beq 1$
2$: Asl R0
Sob R1,2$
1$: Add R0,CrsAdr
Bic #40000,CrsAdr
Bis #100000,CrsAdr
Return
.SbTtl Symbol Line Down Scroll
ScrlDw::
Mov ScrBot,R0 ;Screen Bottom (Upper Left Corner)
Mov R0,R1
Add #9.*100,R1 ;New Bottom
Bic #40000,R1
Bis #100000,R1
Mov R1,ScrBot ;Store it
Add #9.,@SclWri ;Scroll Register Address
Call SetScl
Call SetScS ;Map Screen
Cmp R0,#MemBeg
Bne 20$
Add #40000,R0
20$: Cmp R1,#MemBeg
Bhi 30$
Add #40000,R1
;
;Special Line Scroll
;
30$: Mov SpcLng,R2 ;Special Line Length (TV lines)
40$: Mov #100/2,R3
50$: Mov -(R0),-(R1)
Sob R3,50$
Cmp R0,#MemBeg
Bhi 60$
Add #40000,R0
60$: Cmp R1,#MemBeg
Bhi 70$
Add #40000,R1
70$: Sob R2,40$
Mov #9.,R2 ;String Counter
Mov Bkgnd,R0
80$: Mov #100/2,R3 ;Word Counter
90$: Mov R0,-(R1)
Sob R3,90$
Cmp R1,#MemBeg
Bhi 100$
Add #40000,R1
100$: Sob R2,80$
Call SetScX ;Unmap Screen
Return
.SbTtl Symbol Line Up Scroll
ScrlUp::
Mov ScrBot,R0
Sub #9.*100,R0
Cmp R0,#MemBeg
Bhis 10$
Add #40000,R0
10$: Mov R0,ScrBot
Sub #9.,@SclWri
Call SetScl
Add ScrLng,R0
Mov R0,R1
Add #9.*100,R1 ;Read Address
Call SetScs ;Map Screen
20$: Mov SpcLng,R2
30$: Bic #40000,R1
Bis #100000,R1
Bic #40000,R0
Bis #100000,R0
Mov #100/2,R3
40$: Mov (R1)+,(R0)+
Sob R3,40$
Sob R2,30$
Mov #9.,R2
Mov Bkgnd,R1
50$: Bic #40000,R0
Bis #100000,R0
Mov #100/2,R3
60$: Mov R1,(R0)+
Sob R3,60$
Sob R2,50$
Call SetScX ;Unmap Screen
Return
.SbTtl $Bscroll (EMT 110) Routine (TV-Line Scrolling)
$Bscroll::
Mov R0,-(SP)
Call TstCrs
Add R0,@SclWri
Call SetScl
Swab R0
ClrB R0
Asr R0
Asr R0
Add ScrBot,R0
Bis #100000,R0
Bic #40000,R0
Mov R0,Scrbot
Call CurAdr
Call TstCrs
Mov (SP)+,R0
Return
.Psect $CodOvr
.SbTtl Color Setting Routine
ClrGet::
Mov #10$,Prefix
Return
10$: Mov #20$,Prefix
Call Mult
Mov R0,Color
Return
20$: Clr Prefix
Call Mult
Mov R0,BkGnd
Return
Mult: Bic #^C17,R0
Mov R0,R1
Asl R0
Asl R0
Asl R0
Asl R0
Bis R1,R0
Mov R0,R1
Swab R0
Bis R1,R0
Return
.SbTtl Cursor Set/ Reset routine
.Psect $Code
;
;Input State: System RAM, System ROM
;
TStCrs::
Bit #Crsr$$,TtoFlg ; Cursor Off ?
Beq 10$ ; No
Return ; Yes, Exit
10$: Jsr R0,SavRg ; Save Registers R0..R4
Mov R5,-(SP) ; And R5
Mov CrsAdr,-(SP) ; Get Cursor Address
Call SetScS ; Map Screen...
Mov Color,R5 ;
Mov Bkgnd,R4 ;
Xor R5,R4 ;Color Change Mask in R4
Mov #9.,R5 ;Line Counter
30$: MovB Shiftm,R3
Mov CrsAdr,R2 ;Cursor Address
50$: MovB @R2,R1
Xor R4,R1
MovB R1,(R2)+
Sob R3,50$
Call NxTVLn ;Go next TV line
Sob R5,30$
Call SetScX ;UnMap Screen, Map System Rom, Ram
Mov (SP)+,CrsAdr
Mov (SP)+,R5
Jmp RetEmt ;Restore R0..R4 and Exit
.SbTtl Screen Width Setting Routine
.Psect $Code
;
;R0 Consists Width Code = 0 - 128, 1 - 256, 2 - 512, 3 - 256
;
SetWid::
Call TstCrs
Call SetSng
Bic #D$Wid$!WdtMsk,TtoFlg
Bic #^C3,R0
CmpB R0,#3
Bne 1$
Clr R0
1$: Mov R0,-(SP)
Asl R0
Add (SP)+,R0
Asl R0
Add #WdtTab,R0
MovB Shifts,R1 ;0 - 512 1 - 256 2 - 128
MovB (R0)+,Shifts
MovB (R0)+,Shiftm
BisB (R0)+,TtoFlg
MovB (R0)+,StrLen
MovB (R0)+,LenFnc
MovB (R0)+,SpcFnc
MovB Shifts,R0
Sub R0,R1
Beq 10$
Bmi 20$
11$: AslB CursX
Sob R1,11$
Br 10$
20$: Neg R1
21$: IncB CursX
AsrB CursX
Sob R1,21$
10$: Clr BkGnd
Mov #-1,Color
Mov #SsFlg$,R0
Xor R0,TtoFlg
Call TstCrs
Jmp $SetSS
.Psect $Const
SveAr: .Word SvBuf0,SvBuf1
SclTb: .Word SclAd0,SclAd1
SelTb: .Word 1*400,7*400
;
;Width Table
; Shifts Shiftm Ttoflg StrLen
WdtTab: .Byte 2, 4, 0, 16., 1, 0
.Byte 1, 2, 1, 32., 2, 1
.Byte 0, 1, 2, 64., 5, 1
.Byte 1, 2, 1, 32., 2, 1
.Even
.Psect $CodOvr
.SbTtl Single and Double Width Setting
SetDbl::Bit #WdtMsk,TtoFlg
Beq 10$
Bit #D$Wid$,TtoFlg
Bne 10$
Bis #D$Wid$,TtoFlg
AsrB StrLen
IncB Shifts
AslB Shiftm
IncB CursX
AsrB CursX
Cmpb CursX,StrLen
Blo 10$
Bit #AWrp$$,TtoFlg
Beq 100$
DecB CursX
Br 10$
100$: Jmp NAK ;New Line
10$: Return
SetSng::Bit #D$Wid$,TtoFlg
Beq 10$
Bic #D$Wid$,TtoFlg
AslB CursX
AslB StrLen
DecB Shifts
AsrB Shiftm
10$: Return
.SbTtl Special Line Processing
.SbTtl Special Line ON/OFF Routine
.Psect $Code
$SETSS::Mov #SSFlg$,R0
Xor R0,TtoFlg
Bit R0,TtoFlg
Beq 30$ ;Special Line ON
;Special Line OFF
Mov ScrBot,R0
Add #9.*24.*100,R0 ;Screen Length
Mov #256.-<9.*24.>,R1 ;Number of TV-lines
Mov BkGnd,R2
10$: Bis #100000,R0
Bic #40000,R0 ;Begin of Line
Mov #100/2,R3
Call SetScS ;Map Screen
20$: Mov R2,(R0)+
Sob R3,20$
Sob R1,10$
Call SetScX ;Unmap Screen
Mov #256.-<<256./9.>*9.>,SpcLng
Mov #<256./9.>,MaxLin
Mov #<<256./9.>*9.>*100,ScrLng
Mov #40000/2,FfLng
Mov #255.,RstrMx
Return
;Special Line ON
30$: MovB CursY,R0
Sub #24.,R0
Bmi 50$ ;OK
;Need to do Scrolling
Mov R0,-(SP)
40$: Call ScrlDw
Dec @SP
Bpl 40$
Tst (SP)+
MovB #23.,CursY
Call Curadr
50$: Call SetScS ;Map Screen
Mov ScrBot,R0
Add #9.*24.*100,R0 ;First Address
Mov #256.-<9.*24.>,R3
Mov Color,R1
60$: Bic #40000,R0
Bis #100000,R0
Mov #100/2,R2
70$: Mov R1,(R0)+ ;Horizontal Line
Sob R2,70$
Mov BkGnd,R1
Sob R3,60$
Mov #9.*24.*100,ScrLng
Mov #24.,MaxLin
Mov #256.-<9.*24.>,SpcLng
Mov #<9.*24.*100>/2,FfLng
Mov #9.*24.-1,RstrMx
Mov @#$$SysS,@#Sel1
Call SetScX ;Unmap Screen
Call KbdSS
Return
.SbTtl Special Line Rus/Lat/Mix Output
.Psect $CodOvr
KbdSS::
Call LatSS ;Output Keyboard-oriented Words
Call FncOut ;to Special Line
BlrSS::
Mov #BlrCns,R4
Bit #Block$,TtoFlg
Bne 10$
Mov #Spaces,R4
10$: MovB #-7,R1
Br SSO2
LATSS::
Mov #RusCns,R4
Bit #$Cyril,KbMode
Bne 10$
Mov #LatCns,R4
10$: Mov #-3,R1 ;Coordinate
SSO2: Mov #3,R2 ;Byte Counter
Jmp StrSS ;String to SS
.SbTtl Functional Key Special String Output
FncOut::
Mov #10.,R5 ;Key Counter
Mov #FncTb,FncAd ;String Address Table
Mov #400,R1 ;Coordinates
10$: Mov @FncAd,R4 ;String Address
Bne 20$
Mov #Spaces,R4
20$: MovB LenFnc,R2 ;Char. Number
Call StrSS ;Output String
MovB SpcFnc,R0
Add R0,R1
Add #2,FncAd
Sob R5,10$
Return
.SbTtl Output Symbol String to Special Line
StrSS:
Mov R5,-(SP)
Mov TtoFlg,-(SP)
Bit #D$Wid$,@SP
Beq 5$
AslB StrLen
DecB Shifts
AsrB Shiftm
5$: Tst R1
Bpl 6$
MovB StrLen,R3
Add R3,R1 ;Coordinate
6$: Bic #<UndLn$$!InvCh$$!Lat$$!MixO$$!AscO$$!D$Wid$>,TtoFlg
10$: MovB (R4)+,R0
Bne 11$
Dec R4
MovB #40,R0
11$: Call SsOutS ;Write Char
Inc R1
Sob R2,10$
Bit #D$Wid$,@SP
Beq 15$
AsrB StrLen
IncB Shifts
AslB Shiftm
15$: Mov (SP)+,TtoFlg
Mov (SP)+,R5
Return
.Save
.Psect $Const
LatCns: .Ascii /Lat/
RusCns: .Byte 'r+200,'U+200,'S+200
BlrCns: .Ascii /Blk/
Spaces: .AsciZ / /
.Even
.Restore
.SbTtl Special Line Symbol Output
SsOutS::
;
;At This Point R0 Contains Symbol Code
;R1 Contains Coordinates: Y*400+X
;Preserves Registers R0..R4
;
Bit #SsFlg$,TtoFlg ;Special Line On ?
Bne 10$ ;No, Exit
Jsr R0,SavRg ;Save R0..R4
Mov CrsAdr,@#SSCad ;Save Cursor Coordinates
Mov CursX,@#CrsSS ;
Mov TtoFlg,@#SSTtFg
Mov @#Vec4,@#SSVec4 ;Save Vec4
Mov #5$,@#Vec4 ;and set new
Bic #<Lat$$!MixO$$!AscO$$>,TtoFlg
Bis #Block$,TtoFlg
Mov R0,-(SP)
Mov R1,CursX ;
Call CurAdr ;Compute Address
Add #<9.*24.*100>+100,CrsAdr ;
Bis #100000,CrsAdr
Bic #40000,CrsAdr
Clr CursX ;To disable Wrapping
Mov (SP)+,R0
Call TtyPrg
Mov @#SSCad,CrsAdr ;Restore All
Mov @#CrsSS,CursX ;
Mov @#SSTtFg,TtoFlg ;
Mov @#SSVec4,@#Vec4 ;
Jmp RetEmt ;Restore Registers and Exit
10$: Return
5$: Mov @#SSCad,CrsAdr ;Trap to 4
Mov @#CrsSS,CursX ;
Mov @#SSTtFg,TtoFlg ;Restore All and Exit
Mov @#SSVec4,@#Vec4 ;
Jmp @Vec4 ;
.Save
.Psect $RAM
SSCad: .BlkW
CrsSS: .BlkW
SSTtFg: .BlkW
SSVec4: .BlkW
.Restore
.SbTtl $Bbufset (EMT 74) Routine (Switch Screen Buffers)
$Bbufset::
Jsr R0,SavRg
MovB R0,R3
ClrB R0
Swab R0 ;Upper Byte = Video Area
MovB Screen,R4
CmpB R3,R4 ;It's Current Screen ?
Beq 5$ ;Yes, Not Modify
CmpB R3,#1
Bhi 5$ ;Too Big, Not Modify
MovB R3,Screen
Asl R3
Asl R4
Mov SclTb(R3),SclWri;Scroll Temp Memory Address
Mov ScrSel,R5 ;
Bic #7*400,R5 ;Clear Screen Page bits
Bis SelTb(R3),R5 ;And Set New Value
Mov R5,ScrSel
Mov SveAr(R3),R3 ;Read Area Address
Mov SveAr(R4),R4 ;Old Screen Save Area
Mov #ScrAre,R1 ;Start of Work Area
Mov #ScrCnt,R2 ;Area Length
44$: Mov @R1,(R4)+ ;Save Old
Mov (R3)+,(R1)+ ;Restore New
Sob R2,44$
Mov R0,-(SP)
Call KbdSS
Mov (SP)+,R0
5$: Asl R0
Cmp R0,#2
Bhi 56$
Beq 55$
Bic #4,@#$$SysS
Bic #4,@#$$UsrS
Bic #4,ScrSel
Br 57$
55$: Bis #4,@#$$UsrS
Bis #4,@#$$SysS
Bis #4,ScrSel
57$: Mov SclTb(R0),SclVid
56$: Mov @#$$SysS,@#Sel1
Tst @#Sel1
Mov @SclVid,@#Scroll ;Set Real Scrolling Address
Jmp RetEmt
SetScl: Bic #^C377,@SclWri
Bis #1000,@SclWri
Mov @SclVid,@#Scroll ;Set Real Scrolling Address
Return
.SbTtl Terminal Output Initialization Routine
.Psect $Code
TtoIni::
Mov #ScrAre,R0 ;Write Address
Mov #3,R3 ;Screen Counter
2$: Mov #Scopy,R2 ;Read Address
Mov #ScrCnt,R1 ;Word Counter
1$: Mov (R2)+,(R0)+
Sob R1,1$
Sob R3,2$
Clr Screen ;Current screen =0
Mov #SclAd0,SclVid
Mov #SclAd0,SclWri
Mov #1330,SclAd0
Mov #1330,SclAd1
Mov #1330,@#Scroll
Mov #<SysRam!400!WrEnS!Mot$$$>,ScrSel
Mov #1,FlInit ;Enable SS Output
Mov #1,R0
Call $Bbufset ;Set Screen 1
Call TtoIn1
Clr R0
Call $Bbufset ;Set Screen 0
TtoIn1::
Mov #0,TtoFlg
ClrB Shifts
Mov #1,R0
Call SetWid ;Set Width, Special Line
Call FF
Jmp TstCrs
.SbTtl Work Areas
.Psect $RAM
ScrSel::.BlkW
FlInit::.Blkw
ScrAre::
CursX:: .BlkB
CursY:: .BlkB
CrsAdr::.BlkW
ScrBot::.BlkW
Shifts::.BlkB
Shiftm::.BlkB
StrLen::.BlkB
LenFnc::.BlkB
SpcFnc::.BlkB
.Even
PrefiX::.BlkW
TtoFlg::.BlkW
ScrLng::.BlkW
FfLng:: .BlkW
MaxLin::.BlkW
SpcLng::.BlkW
AlpTab::.BlkW 2
GrpTab::.BlkW 2
Color:: .BlkW
BkGnd:: .BlkW
XCoord::.BlkW
YCoord::.BlkW
RstrMx::.BlkW
ScrCnt==<.-ScrAre>/2
SvBuf0::.BlkW ScrCnt
SvBuf1::.BlkW ScrCnt
FncAd:: .BlkW
Screen::.BlkW
SclVid::.BlkW
SclWri::.BlkW
SclAd0::.BlkW
SclAd1::.BlkW
.Psect $Const
Scopy::
.Byte 0 ;CursX
.Byte 0 ;CursY
.Word MemBeg ;CrsAdr
.Word MemBeg ;ScrBot
.Byte 1 ;Shifts
.Byte 2 ;Shiftm
.Byte 32. ;StrLen
.Byte 2 ;LenFnc
.Byte 1 ;StrFnc
.Even
.Word 0 ;Prefix
.Word 0 ;TtoFlg
.Word 9.*24.*100 ;ScrLng
.Word <9.*24.*100>/2 ;FfLng
.Word 24. ;MaxLin
.Word 256.-<9.*24.> ;SpcLng
.Word SysSel,SymTab ;AlpTab
.Word SysSel,SymG00 ;GrpTab
.Word 177777 ;Color
.Word 0 ;BkGnd
.Word 0,0 ;Xcoord,Ycoord
.Word 24.*9.-1 ;RstrMx
.Psect $CodOvr
.SbTtl $BtvSet (EMT 64) Routine (Set TV-set Handler Mode)
$BtvSet::
Jsr R0,SavRg ;Save User's Registers
Mov R0,R5 ;User Table Address
Call GetUWd ;New User TtoFlg
Mov TtoFlg,R2 ;Get old TtoFlg
Mov R5,-(SP)
Mov R0,-(SP) ;Temporary copy of R0
Bic #<SSflg$!Crsr$$!D$Wid$!WdtMsk>,R0 ;Special bits are ignored
Bic #^C<SSflg$!Crsr$$!D$Wid$!WdtMsk>,R2
Bis R0,R2 ;Set Appropriate bits
Mov R2,TtoFlg ;And REstore Ttoflg
Mov @SP,R0
Bic #^C<SSflg$!Crsr$$!D$Wid$!WdtMsk>,R0 ;Only Special Bits
Mov R2,-(SP) ;Copy of TtoFlg
Bic #^C<SSflg$!Crsr$$!D$Wid$!WdtMsk>,@SP ;Only Special Bits
Xor R0,@SP ;Only Changed bits Are set
Mov #Crsr$$,R0
Bit R0,@SP ;Cursor state changed ?
Beq 10$ ;No
Call TstCrs ;Reset Cursor
Xor R0,TtoFlg ;Change State
Call TstCrs ;And set it Again
10$: Bit #SSflg$,@SP
Beq 20$
Call $SETSS ;Change Special string State
20$: Bit #WdtMsk,@SP
Beq 30$
MovB 2(SP),R0
Bic #^C<WdtMsk>,R0
Call Setwid ;Set Appropriate Width
30$: Bit #D$Wid$,@SP
Bne 50$
Bit #D$Wid$,2(SP) ;New mode is set ?
Bne 40$ ;Yes
Call SetSng
Br 50$
40$: Call SetDbl
50$: Cmp (SP)+,(SP)+
Mov (SP)+,R5 ;Restore User TAble Pointer
Call GetUwd
Beq 60$
Mov R0,AlpTab ;Alp. Table
Call GetUwd
Mov R0,AlpTab+2
Br 70$
60$: Mov #SysSel,AlpTab
Mov #SymTab,AlpTab+2
Call GetUwd
70$: Call GetUwd
Beq 80$
Mov R0,GrpTab
Call GetUwd
Mov R0,GrpTab+2
Br 90$
80$: Mov #SysSel,GrpTab
Mov #SymG00,GrpTab+2
Call GetUwd
90$: Call GetUbt
TstB R0
Bmi 100$
Call Mult
Mov R0,Color
100$: Call GetUbt
TstB R0
Bmi 110$
Call Mult
Mov R0,BkGnd
110$: ClC
Jmp RetEmt
.SbTtl $BtvGet (EMT 34) Routine (Get TV-set Handler Mode)
$BtvGet::Jsr R0,SavRg
Mov R0,R5 ;User TAble Adress
Mov TtoFlg,R0
Call PutUWd
Mov AlpTab,R0
Call PutUWd
Mov AlpTab+2,R0
Call PutUWd
Mov GrpTab,R0
Call PutUWd
Mov GrpTab+2,R0
Call PutUwd
MovB BkGnd,R0
Swab R0
ClrB R0
BisB Color,R0
Call PutUwd
ClC
Jmp RetEmt
.End

View File

@ -0,0 +1,18 @@
.IF EQ 0
.Psect $Code I,RO
.Psect $Const D,RO
.Psect $CodOvr I,RO
.Psect $CnsOvr D,RO
.Psect $AdrTab D,RO
.Psect $RAM D,RW
.Psect $Stack D,RW
.IFF
.Psect $Stack D,RW
.Psect $RAM D,RW
.Psect $CodOvr I,RO
.Psect $CnsOvr D,RO
.Psect $Code I,RO
.Psect $Const D,RO
.Psect $AdrTab D,RO
.ENDC
.End

View File

@ -0,0 +1,271 @@
.Mcall .Module
.Module LINTAP,Release=X02, Version=07, Comment=<BK0011 Line/Tape Handler>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
DlvCsr == 176560
Namlng = 16.+2.
.Globl UsrSav, BegAdr, Lngth, SavRg, RetEmt, OctTyp
.Globl TtoFlg, Block$, SysFlg, $BPrint,$Bttyou,$BgtLin
.Globl $BMtb10,ROMTab, RAM0Tb, RAM1Tb
.SbTtl Main Routine
;
; At this point R1 consists the type of operation:
; =0 ==> Load;
; =1 ==> Unload.
;
;BegAdr and Lngth words consist Start and End address of array
;to be written. R0 Consists file Load Address (For Read) Or file Start
;Address (For Write)
;
.Psect $CodOvr
LinTap::Jsr R0,SavRg
Mov R0,StAddr ;Start Or load Address
.Bprint #Prmpt
.BGtlin #Buffer,#NamLng ;Read file name
TstB Buffer ;Tape or line
Bne 10$
Jmp Line ;Line Input
10$: Mov #Buffer,R0
MovB (R0)+,R2
BicB #240,R2 ;Device Name
CmpB (R0)+,#':
Bne ErrNam ;Illegal Filename
CmpB R2,#'B ;BK0010 Format ?
Bne MsxTap ;No, MSX
.SbTtl BK0010-Tape processing
Tst R1 ;Read Or write ?
Beq BkRead ;Read
BkWrit: Mov #2,R5 ;Operation Code=Write (From Debug)
Call Set10B ;Set Argument Block
Call BkReq
Bcc Ret ;OK
Mov #UnlErr,R0
ErRet: .BPrint
Ret: Mov @#$$SysS,@#Sel1
Tst @#Sel1
Jmp RetEmt
ErrNam: Mov #TypTxt,R0
Br ErRet
.SbTtl BK0010-Format Read or Dir Command
BkRead: Mov #3,R5 ;Operation Code=Read
Mov StAddr,BegAdr ;Start Or load Address
CmpB @R0,#'?
Beq DirBK ;Directory Operation
TstB @R0 ;Next File ?
Bne 5$ ;No, FileName Specified
Mov #5,R5 ;Next File Read Operation
5$: Call Set10B
10$: Call BkReq
Call PRiBK
CmpB @#ErrByt,#1
Beq 10$ ;Another FIle Name
Br Ret
DirBK: Mov #6,SysCom ;Dir Operation
Call BkReq ;Read File
Call PriBK
CmpB @#ErrByt,#4 ;Manual Interrupt ?
Bne DirBK
Br Ret ;Yes, Exit
PriBK: Bcc 10$ ;Print File Params
MovB @#ErrByt,R1 ;Error Code
Asl R1
.BPrint ErrBK-2(R1) ;Print Error Message
CmpB @#ErrByt,#4
Beq 30$
Br 11$
10$: CmpB SysCom,#6 ;Dir Function ?
Beq 11$ ;Yes
Mov ResSta,@#UserPC
11$: .BPrint #Fname ;Filename:
Mov #ResNam,R1
Mov #16.,R2
Mov TtoFlg,-(SP)
Bis #Block$,TtoFlg
20$: MovB (R1)+,R0
.Bttyou ;Print File Name
Sob R2,20$
Mov (SP)+,TtoFlg
.BPrint #MemTxt
Mov ResStA,R0 ;Start Address
ClC
Call OctTyp
.BPrint #TLngth
Mov ResSta,R0
Add ResLng,R0
ClC
Call OctTyp
30$: .Bttyou #25
Return
MsxTap:
;;;
;;;
;;;
;;;Call @50
;;;
Jmp RET
BkReq: Mov UsrSav,R5 ;User Sel1
Bic #^C070000,R5 ;Only Page 40000-100000
SwaB R5 ;Page ...
Mov #RAM0Tb,R0
10$: CmpB R5,(R0)+
Bne 10$
Sub #Ram0Tb+1,R0
MovB R0,UsSel ;Lower Page
Mov UsrSav,R5
Bit #RomMsk,R5 ;It's ROM ?
Bne 30$
Bic #^C7*400,R5
SwaB R5
Mov #Ram1Tb,R0
20$: CmpB R5,(R0)+
Bne 20$
Sub #Ram1Tb+1,R0
MovB R0,UsSel+1
Br 50$
30$: Bic #^CRomMsk,R5
Mov #RomTab,R0
40$: CmpB R5,(R0)+
Bne 40$
Sub #RomTab+1-10,R0
MovB R0,UsSel+1
50$: Mov #SysCom,R0
Call $BMtb10 ;Read File
Return
Line: Call TstLine
Jmp RET
.SbTtl Special Routines
Set10B: Mov #SysCom,R1
Mov R5,(R1)+ ;Command Code
Mov BegAdr,(R1)+
Mov Lngth,(R1)+
Mov #16.,R2
5$: MovB (R0)+,R4
Beq 10$
MovB R4,(R1)+
Sob R2,5$
Return
10$: MovB #40,(R1)+
Sob R2,10$
Return
.SbTtl Line Type Detrmination
TstLine:Mov @#Vec4,-(SP)
Mov #20$,@#Vec4
Tst @#DlvCsr
Mov (SP)+,@#Vec4
Mov #DlvGet,@#GetAdr ;DLV is present
Mov #DlvPut,@#PutAdr
Mov #DlvClr,@#ClrAdr
Br 10$
20$: Cmp (SP)+,(SP)+ ;Trap to 4
Mov (SP)+,@#Vec4 ;Restore vector
Mov #PrtGet,@#GetAdr ;DLV is absent
Mov #PrtPut,@#PutAdr
Mov #PrtClr,@#ClrAdr
10$: Return
.SbTtl DLV-11 Byte Get/Put and Clear Routines
DlvGet: Tstb @#DlvCsr
Bpl DlvGet
MovB @#DlvCsr+2,R0
Return
DlvPut: Tstb @#DlvCsr+4
Bpl DlvPut
MovB R0,@#DlvCsr+6
Return
DlvClr: TstB @#DlvCsr+2
Clr DlvCsr+6
Return
.SbTtl Port Byte Get/Put and Clear Routines
PrtGet:
10$: Tst @#Sel2 ;Wait for Ready
Bmi 10$
Movb @#Sel2,R0
Comb R0
Bic #^C377,R0
Bis #40000,BufS2
Mov BufS2,@#Sel2
20$: Tst @#Sel2
Bpl 20$
Bic #40000,BufS2
Mov BufS2,@#Sel2 ;Set Request
Return
PrtPut: Comb R0
MovB R0,BufS2
10$: Bit #40000,@#Sel2 ;Wait for Request
Bne 10$
Bic #100000,BufS2
Mov BufS2,@#Sel2
20$: Bit #40000,BufS2
Beq 20$
Bis #100377,BufS2
Mov BufS2,@#Sel2
Comb R0 ;Restore original R0
Return
PrtClr: Mov #137777,BufS2
Mov BufS2,@#Sel2
Return
.Psect $CnsOvr
ErrBK: .Word BKER1,BKER2,BKER3,BKER4
BKER1: .Byte 0
BKER2: .BYTE 25
.AsciZ /CHECKSUM ERROR/
BKER3: .BYTE 25
.AsciZ /ILLEGAL PARAMETER VALUE/
BKER4: .BYTE 25
.AsciZ /MANUAL INTERRUPT OR TRAP TO 4/
Prmpt: .Byte 25
.Ascii / FILE NAME ? /<200>
Fname: .Byte 25
.Ascii /FILE: /<200>
MemTxt: .Byte 25,40,200
TLngth: .Ascii /- /<200>
TYPTXT: .BYTE 25
.AsciZ /ILLEGAL DEVICE NAME/
UnlErr: .Byte 25
.Ascii /WRITE ERROR/
.Psect $RAM
BufS2: .Word 0
Buffer: .BlkB Namlng+1
.Even
GetAdr: .BlkW
PutAdr: .BlkW
ClrAdr: .BlkW
StAddr: .BlkW
SysCom: .BlkW ;Code
.BlkW ;Address
.BlkW ;Length
.BlkB 16. ;Name
UsSel:: .BlkW
ResStA: .BlkW
ResLng: .BlkW
ResNAm: .BlkB 16. ;Resault Name
.End

View File

@ -0,0 +1,321 @@
.Mcall .Module
.Module MEMEMT, Release=X02, Version=09, Comment=<BK0011 Memory Management>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest Group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl O.Tr4U, TTOini, KBDini, RXini, MTini, ClrIni
.Globl GetArg, Debug, RetEmt, $OffR0, EmtInt, FlInit
.Globl EmtPri, IllBrk, PutUwd, USPSav, UPSSav, UPCSav
.Globl SysErr, $UsrTrp,SavV4
U.Vec = 100
U.Vec2 = 270
EmtVec = 30
.Psect $Code
IniBK::
MtPS #340
Clr R1 ;Vector Area Pointer
Mov (PC)+,(R1)+ ;Write "Exit" Sequence
Clr R0
Mov (PC)+,(R1)+ ;
EMT 0
Mov #<400-4>/4,R2
10$: Mov #O.Tr4U,(R1)+ ;Set vectors 4-374
Mov #2341,(R1)+
Sob R2,10$
Mov #4340,@#Vec4+2 ;"HALT" Vector
Mov #EmtInt,@#EmtVec;"EMT" Vector
Mov #4340,@#EmtVec+2;"EMT" Vector
Mov #U.Vec+2,@#U.Vec;Disable User Interrupts
Mov #Rti,@#U.Vec+2 ;
Mov #U.Vec2+2,@#U.Vec2
Mov #Rti,@#U.Vec2+2
.SbTtl Check for ROMs Available
Clr R0 ;All Pages Unavailable
Mov #ROMTab,R1 ;
Mov #40$,@#Vec4
20$: MovB (R1)+,R2
Beq 50$
Bis #SysRam!WrEnS!Mot$$$,R2 ;Set Write Enable flag
Mov R2,@#SEL1 ;Connect ROM
Tst @#100000 ;Check ROM module
BisB R2,R0 ;Set ROM Available Flag
30$: Br 20$
40$: Cmp (SP)+,(SP)+ ;Clear Stack
Br 20$ ;And test the next ROM
50$: MovB R0,MemFlg ;Save to Memory Pages Flag
Mov #SysSel!Mot$$$,@#$$SysS
Mov #SysSel!Mot$$$,@#$$UsrS
;
;Attention !!!
; $Binit routine must be at this point
;
.SbTtl $Binit (EMT 14) Routine (Computer Initialization)
$Binit::Mov #SysSel!Mot$$$,R0 ;Set System Sel1
Mov R0,@#$$SysS
Mov R0,@#Sel1
Clr $UsrTrp ;Reset User's Trap to 4
Clr SysErr ;Reset Illegal EMT Processing
Call ClrIni ;Color Control Unit Initialization
Clr FlInit ;Set Flag for disabling special line
Call KBDini ;Keyboard initialization
Call TTOini ;TV-Set
Call RXini ;Disk
Call MTini ;Tape
Clr @#SEL2 ;Port
Return
.SbTtl $Bsetpg (EMT 52) Routine (Connect Memory Page)
$BsetPg::
Mov R0,-(SP) ;Save R0
MovB R0,R5 ;Get Lsb, Extend sign !!
ClrB R0
SwaB R0 ;Determine the Address Window
Cmp R5,#77 ;System ROM Page ?
Beq 50$ ;Yes, Connect System Rom
Cmp R5,#177 ;System RAS Page ?
Bne 5$ ;No
Mov #7,R5
Br 6$
5$: Cmp R5,#13 ;Check Page Number
Bhi Err0 ;Jump if illegal
Cmp R5,#7 ;Is it RAM ?
Bhi 30$ ;Jump if ROM
Beq Err2 ;System Page, Error
6$: TstB R0 ;Determine Address Region
Beq 10$ ;Lower Region
MovB RAM1Tb(R5),R5 ; Upper (100000-140000)
Mov #7,R0 ;Bit Mask
Bic #ROMMSK,@#$$UsrS;Reset ROM
Br 20$
10$: MovB RAM0Tb(R5),R5 ;40000-100000
Mov #7*20,R0
20$: BicB R0,@#$$UsrS+1 ;Modify User SEL1
BisB R5,@#$$UsrS+1
Br Nerr
.SbTtl Rom Page Connecting
30$: BitB RomTab-10(R5),MEMFLG
Beq Err0
40$: TstB R0
Beq Err1
MovB ROMTab-10(R5),R5
Bic #^C<ROMMSK>,R5
Bic #ROMMSK,@#$$UsrS
Bis R5,@#$$UsrS
Br Nerr
50$: Mov #11,R5 ;System ROM Page No
Br 40$
Err0: ClrB @#ErrByt ;Illegal Page Number or Nonexisting
Br Err
Err1: MovB #1,@#ErrByt
Br Err
Err2: MovB #2,@#ErrByt
Br Err
Nerr: Tst (PC)+
Err: SeC
Mov (SP)+,R0
Return
.SbTtl $Btest (EMT 72) Routine (Get Memory page status)
$Btest::
Mov R1,-(SP)
Mov R0,R5
Clr R0
Cmp R5,#7
Bhi 60$ ;It's ROM
Beq 50$ ;System RAM Page ==> 1
10$: MovB @#$$UsrS+1,R1 ;User SEL1
Bic #^C<7*20>,R1
CmpB RAM0Tb(R5),R1
Bne 20$ ;Not Conected
Bis #1,R0 ;Connected to 40000
20$: Bit #ROMMSK,@#$$UsrS ;ROM Connected ?
Bne 40$ ;Yes, Exit
MovB @#$$UsrS+1,R1 ;Test for 100000-140000
Bic #^C7,R1
CmpB RAM1Tb(R5),R1
Bne 40$ ;Not Connected
30$: Bis #2,R0 ;Connected to 100000
40$: Mov (SP)+,R1
Return
50$: Bis #4,R0
Br 40$
.SbTtl Rom Connecting Checking
60$:
Cmp R5,#13 ;Check Page Number
Bhi 50$ ;Illegal Page Number
BitB RomTab-10(R5),MEMFLG
Beq 50$ ;Non-existing
BitB ROMTab-10(R5),@#$$UsrS
Bne 40$
Br 30$
.SbTtl $Bjmp (EMT 56) Routine (Jmp to Memory Page)
$BJmp::
Jsr R0,GetArg ;Reorganize Stack
Tst R1 ;Address
Bpl 10$
Add #400,R0 ;Inc MSB Of R0
10$: Call $BSetPg ;Connect Memory Page
Bcs ErrJmp ;Unable to Connect, Error
Mov R1,UPCSav ;New PC=Address
Jmp RetEmt
.SbTtl $Bjsr (EMT 54) Routine (Jsr PC to Memory Page)
$BJsr::
Mov @#$$UsrS,@#UsrBuf ;Save UsrS
Jsr R0,GetArg ;Reorganize Stack
Tst R1 ;Address
Bpl 10$
Add #400,R0
10$: Call $BSetPg ;Test Memory Page
Bcs ErrJmp ;Unable to Connect
Mov (SP)+,R4 ;Restore
Mov (SP)+,R3 ; R2 to
Mov (SP)+,R2 ; R4
; Mov @#UsrBuf,@#$$UsrS ;Old USER SEL1 ???
Sub #5*2,@#USPSav
Mov @#USPSav,R5 ;User Stack Pointer
Mov R1, R0 ;User Addr
Call PutUwd
Mov @#UPSSav,R0 ;User PS
Call PutUwd
Mov #JsrRet, R0 ;RetAddr
Call PutUwd
Mov @#UPCSav,R0 ;Old PC
Call PutUwd
Mov @#UsrBuf,R0 ;Old $$USRS
Call PutUwd
;+
; At This Point User's Stack is:
;
; Old Sel1
; Old PC
; JsrRet
; Users PS
; Routine Address
;-
Mov (SP)+,R1 ;From System Stack
Mov (SP)+,R0
Tst (SP)+ ;Emt Return
Mov (SP)+,R5 ;
Mov @#USPSav,SP ;Restore User SP
Mov @#SavV4,@#Vec4 ;Vector 4
Mov @#$$UsrS,@#Sel1 ;Set User's SEL
Rti ;Go...
;+
; .BJsr Return Routine
;Stack is:
;
; Old User Sel1 2
; Old PC 0
;
JsrRet::
MFPS -(SP) ;Save Status (User Stack)
Bic #^C<ScrMsk!TapMsk>,@#$$UsrS
Bic #TapMsk!ScrMsk,4(SP)
Bis 4(SP),@#$$UsrS ;Restore User Sel1
Mov @SP,4(SP) ;And Modify Stack (PS)
Tst (SP)+ ;Stack is clean Now
Mov @#$$UsrS,@#Sel1
Rtt ;And Return to User
.SbTtl Error in .Bjsr/.Bjmp
ErrJmp: Mov (SP)+,R4
Mov (SP)+,R3
Mov (SP)+,R2
Mov (SP)+,R1
Mov (SP)+,R0
Tst (SP)+
Mov #ErJmp,EmtPri
Jmp IllBrk
.SbTtl $Bpeek (EMT 60) Routine (Get the Word from Memory Page)
$Bpeek::
Jsr R0,GetArg ;Reorganize Stack
Bic #^C17,R0
Bic #^C37777,R1 ;Address in Page
CmpB R0,#SysPag
Bne 10$
Mov 40000(R1),R0 ;Read from system page
Br 30$
10$: Call PgSet ;Connect Page
Bcs 40$
Mov @#$$UsrS,@#Sel1
20$: Mov 100000(R1),R0 ;Get from window
Mov @#$$SysS,@#Sel1
Mov @#UsRBuf,@#$$UsrS
30$: Mov R0,$OffR0(SP)
40$: Jmp RetEmt
.SbTtl Internal Page Setting Routine
PgSet:: Mov @#$$UsrS,@#UsRBuf
Bis #400,R0
Call $BSetPg
Return
.SbTtl $BpokB (EMT 62) Routine (Put the Byte to Memory Page)
$BpokB::
Jsr R0,GetArg ;Reorganize Stack
Bic #^C17,R0 ;Page No
Bic #^C37777,R1 ;Address in Page
CmpB R0,#SysPag ;System Page ?
Bne 10$ ;No
MovB $OffR0(SP),40000(R1);Yes, Write it into System Page
Br PokE1
10$: Call PgSet ;Connect Page
Bcs PokE1
Mov $OffR0(SP),R0
Mov @#$$UsrS,@#Sel1
MovB R0,100000(R1) ;Write Byte
PokExi: Mov @#$$SysS,@#Sel1
Mov @#UsRBuf,@#$$UsrS
PokE1: Jmp RetEmt
.SbTtl $Bpoke (EMT 120) Routine (Put the Word to Memory Page)
$Bpoke::
Jsr R0,GetArg ;Reorganize Stack
Bic #^C17,R0
Bic #^C37777,R1 ;Address in Page
CmpB R0,#SysPag
Bne 10$
Mov $OffR0(SP),40000(R1)
Br PokE1
10$: Call PgSet ;Connect Page
Bcs PokE1
Mov $OffR0(SP),R0
Mov @#$$UsrS,Sel1
Mov R0,100000(R1)
Br PokExi
.Psect $RAM
MEMFLG:: .Byte 0 ;System Memory Available Flags
.Even
UsRBuf::.Word 0
.Psect $Const
ROMTab::.Byte 1,2,10,20,0 ;ROM Connecting Table
;
; Pages 0 1 2 3 4 5 6 7
;
RAM0Tb::.Byte 6*20, 0, 2*20, 3*20, 4*20, 1*20, 7*20, 5*20
RAM1Tb::.Byte 6, 0, 2, 3, 4, 1, 7, 5
ERJMP: .Byte 25
.Ascii /ILLEGAL .BJMP OR .BJSR FROM PC = /<200>
.Even
.End

View File

@ -0,0 +1,95 @@
.Mcall .Module
.Module TTEMT,Release=X02, Version=01, Comment=<BK0011 Terminal Emt Routines>
;
; Copyright (c) 1986,1987 by
; C-11 Special Interest group, Leningrad State University.
; All rights reserved.
;
; This software is furnished under a license and may be used and copied
; only in accordance with the terms of such license and with the
; inclusion of the above copyright notice. This software or any other
; copies thereof may not be provided or otherwise made available to any
; other person. No title to and ownership of the software is hereby
; transfered.
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by C-11 group.
;
; C-11 assumes no responsibility for the use or reliability of its
; software on equipment which is not submitted by C-11.
;
.Include "BKHEAD"
.Globl SavRg,RetEmt,TStCrs,GetUBt,StrLen,GetArg
.Globl CursX,CursY,MaxLin,TtyPrg,CurAdr,SsOutS
.Psect $CodOvr
.SbTtl $BTtyou (EMT 16) Routine (Type One Character)
;
; This routine outputs one symbol from R0 to TV-monitor screen
; at the place determined by current cursor coordinates.
; Cursor moved to the next position.
;
$Bttyou::
Call TStCrs ;Reset Cursor If it need
Call TtyPrg ;Call Output Routine
Call TStCrs ;Set Cursor ON (If it need)
ClC
Return
.SbTtl $Bprint (EMT 20) Routine (Type Character String)
;
;Input: R0=Character string Address.
;
;String must be folowwed by Zero or 200 byte.
;The code of Zero causes <CR><LF> sequence to output after the last
;byte.
;The code of <200> causes terminating of typing characters without any
;extra chars.
;
$Bprint::
Jsr R0,SavRg ;Save R0..R4
Mov R0,R5
Call TStCrs ;Set Cursor Off
2$: Call GetUBt ;Get Byte from User Space
Beq 11$ ;It's 0
CmpB R0,#200
Beq Retpri ;Code is 200
Mov R5,-(SP)
Call TtyPrg ;Type character
Mov (SP)+,R5
Br 2$
11$: Mov #25,R0
Call TtyPrg ;issue <CR><LF> Routine
Retpri: Call Curadr
Call TStCrs ;Set Cursor ON
ClC ;Clear Carry bit
Jmp RetEmt ;Restore registers and exit
.SbTtl $Bpos (EMT 26) Routine (Get Cursor Coordinates)
$Bpos:: Mov @#CursX,R0 ;Get Cursor Coordinates
Return ;And Exit
.SbTtl $Blocat (EMT 24) Routine (Set Cursor Coordinates)
$Blocat::
Jsr R0,SavRg
Call TStCrs ;Set Cursor Off
Mov R0,R5
CmpB R0,StrLen ;Check Position
Bhi 10$
MovB R0,@#CursX ;Right...
10$: SwaB R5
CmpB R5,MaxLin ;Check Line No
Bhis Retpri
MovB R5,@#CursY
Br Retpri
.SbTtl $Bssout (EMT 22) Routine (Type at Special String)
$Bssout::
MaxSS = <256./9.-24.> ;Max Special Zone Line No
Jsr R0,GetArg
Cmp R1,#MaxSS*400 ;Check Y-Coordinate
Bhis 10$ ;Is Illegal
CmpB R1,StrLen
Bhis 10$ ;Is Illegal
Call SsOutS
Tst (PC)+
10$: Sec
Jmp RetEmt
.End

BIN
ROMs/b11m_bos.rom Normal file

Binary file not shown.

BIN
ROMs/b11m_ext.rom Normal file

Binary file not shown.

BIN
ROMs/b11m_mstd.rom Normal file

Binary file not shown.

BIN
ROMs/basic10_1.rom Normal file

Binary file not shown.

BIN
ROMs/basic10_2.rom Normal file

Binary file not shown.

BIN
ROMs/basic10_3.rom Normal file

Binary file not shown.

BIN
ROMs/basic11m_0.rom Normal file

Binary file not shown.

BIN
ROMs/basic11m_1.rom Normal file

Binary file not shown.

BIN
ROMs/disk_253.rom Normal file

Binary file not shown.

BIN
ROMs/disk_326.rom Normal file

Binary file not shown.

BIN
ROMs/disk_327.rom Normal file

Binary file not shown.

BIN
ROMs/focal.rom Normal file

Binary file not shown.

BIN
ROMs/monit10.rom Normal file

Binary file not shown.

BIN
ROMs/tests.rom Normal file

Binary file not shown.

BIN
Subtitles/100000z5x.lst Normal file

Binary file not shown.

BIN
Subtitles/disk_326.lst Normal file

Binary file not shown.

BIN
Tests/791323 Normal file

Binary file not shown.

BIN
Tests/791323.bin Normal file

Binary file not shown.

BIN
Tests/791401 Normal file

Binary file not shown.

BIN
Tests/791401.bin Normal file

Binary file not shown.

BIN
Tests/791404 Normal file

Binary file not shown.

BIN
Tests/791404.bin Normal file

Binary file not shown.

BIN
Tests/loadtest.bin Normal file

Binary file not shown.

31
Tests/loadtest.mac Normal file
View File

@ -0,0 +1,31 @@
; Скопировать загрузчик 00200 байт с адреса 01000 на адрес 022000
000000: 012700 MOV #022000, R0
022000
000004: 012701 MOV #001000, R1
001000
000010: 012702 MOV #000100, R2
000100
000014: 012120 MOV (R1)+, (R0)+
077202 SOB R2, $-2
; Продолжаем работу загрузчика уже на адресах 022000+
000020: 000137 JMP #022024
022024
; Скопировать тест 020000 байт с адреса 02000 на адрес 000000
000024: 005000 CLR R0 ; Этот код уже исполняется с адреса 022024
012701 MOV #002000, R1
000030: 002000
012702 MOV #010000, R2
000034: 010000
012120 MOV (R1)+, (R0)+
000040: 077202 SOB R2, $-2
; Очистить PSW и запустить тест с адреса 0200
000042: 005000 CLR R0
106400 MTPS R0
000046: 000137 JMP #000200
000200
000052:
;-- END

16
Tests/readme.txt Normal file
View File

@ -0,0 +1,16 @@
791404 Тест прерываний
791323 Тест памяти
791401 Основной тест команд
http://bk0010.org/forum/?id=3716&page=
? anonymous - 11.12.2009 23:39
Первые два - из комплекта сдаточных тестов ВМ1, тест инструкций процессора и тест прерываний, третий - расширенный тест ОЗУ. Они обругают, если что-то не так съемулировано. Загружаются с адреса 0, диагностику выводят на учительскую машину через блок ИРПС. ИРПС эмулировать не сложно, там 4 регистра, перемычкой их адрес задается 0176560..0176567 для школьного бейсика и 0177560..0177567 для школьного фокала, последний вариант - стандартные адреса терминала в pdp11, на этих адресах и следует добавить эмуляцию с выводом в соседнее, например, окно, или в файл. В *560м регистре имеются два бита, 6й и 7й. 7 бит *560го регистра устанавливается, если во входной регистр *562 поступил новый байт, а если перед приемом байтов установить в 1 6й бит *560го регистра, то произойдет прерывание с вектором, адрес которого читается из регистра *566. *562й регистр - буфер приемника, оттуда считывается последний принятый байт, по записи регистр ничего не делает. В регистре *564 имеются тоже два бита, 6й и 7й, с тем же назначением, что и у приемника, 7й бит устанавливается в 0, когда процессор пишет байт в буфер передатчика, *566, и устанавливается в 1, когда заканчивается передача, т.е. когда буфер готов к приему следующего байта. Если при установке 7го бита был установлен 6й, то по готовности передатчика возникает прерывание с вектором, на 4 бОльшим, чем считываемое из регистра *566 значение. Регистр *566 - по записи - буфер передатчика, по чтению - регистр вектора прерывания, при установке адресов 0176560..0176567 вектор считывается 0360, приемник прерывает работу по 0360му вектору, а передатчик - по 0364му, при установке адресов 0177560..0177567 - адрес вектора 060 для приемника и 064 для передатчика.
По команде процессора reset все биты в регистрах приемника обнуляются, а в регистре передатчика устанавливается бит 7 - готовности к передаче.
? anonymous - 11.12.2009 23:44
тесты (расширение .256 у них от программатора осталось, т.к. я их в пзу жег)
http://qbus.narod.ru/791401.256
http://qbus.narod.ru/791401.256
http://qbus.narod.ru/791323.256

72
Tests/test791401.txt Normal file
View File

@ -0,0 +1,72 @@
002550 000205 RTS R5
000520 006402 MARK R2 ; Тестируемая команда; ИСПРАВЛЕНО
002400 100003 BPL 002410
002402 001002 BNE 002410
002404 102001 BVC 002410
002406 103404 BLO 002420
002420 022705 CMP #000404, R5
002424 001404 BEQ 002436 ; Тут идет неправильный переход
002426 012743 MOV #000057, -(R3)
002432 005243 INC -(R3)
002434 000000 HALT
007042 012704 MOV #177777, R4
007046 160304 SUB R3, R4
007050 004737 JSR PC, @#017164
017164 100403 BMI 017174
017166 001002 BNE 017174
017170 102401 BVS 017174
017172 103004 BHIS 017204
017204 000207 RTS PC
007054 021527 CMP (R5), #000053
007060 001032 BNE 007146 ; Тут OK
007062 005215 INC (R5) ; R5=000404 (R5)=000053
007064 012701 MOV #177777, R1
007070 005000 CLR R0
007072 106400 MTPS R0 ; Тестируемая команда
007074 004737 JSR PC, @#017062
017062 003402 BLE 017070
017064 100401 BMI 017070
017066 103004 BHIS 017100
017100 000207 RTS PC
007100 106701 MFPS R1
007102 001404 BEQ 007114 ; Тут идет неправильный переход; ИСПРАВЛЕНО
007104 012745 MOV #000201, -(R5)
007110 005245 INC -(R5)
007112 000000 HALT
016736 000004 IOT
017020 132737 BITB #000040, @#000421
017026 001012 BNE 017054
017030 017603 MOV @000000(SP), R3
017034 105713 TSTB (R3)
017036 001406 BEQ 017054
017040 105777 TSTB @000446
017044 100375 BPL 017040
017046 112377 MOVB (R3)+, @000450
...
017034 105713 TSTB (R3)
017036 001406 BEQ 017054
017040 105777 TSTB @000446
017044 100375 BPL 017040
017046 112377 MOVB (R3)+, @000450
017052 000770 BR 017034
017034 105713 TSTB (R3)
017036 001406 BEQ 017054
017054 062716 ADD #000002, (SP)
017060 000006 RTT
000016 000000 HALT ; Неправильный переход; ИСПРАВЛЕНО

128
Tests/test791404.txt Normal file
View File

@ -0,0 +1,128 @@
010522 MOV #000500, SP ; R5=177777
010526 MOV #010600, 000014 ; Вектор 14 PC = 010600
010534 CLR #000016 ; Вектор 14 PSW = 000000
010540 CLR #000022 ; Вектор 20 PSW = 000000
010544 MOV #010616, 000020 ; Вектор 20 PC = 010616
010552 MOV #000020, -(SP) ; PSW для возврата по RTT, бит T=1
010556 MOV #010564, -(SP) ; PC для возврата по RTT
010562 RTT ; PC := (SP)+; IF (PC>=1600008) THEN PSW[8:0] := (SP)+ ELSE PSW[7:0] := (SP)+
010564 IOT ; бит T=1; (SP) := CPSW; (SP) := CPC; PC := (20); PSW := (22)
010600 INC R5 ; R5=177777
010602 BEQ 010522 ; Возврат к началу цикла
010522 MOV #000500, SP
010526 MOV #010600, 000014
010534 CLR #000000
010540 CLR #000000
010544 MOV #010616, 000020
010552 MOV #000020, -(SP)
010556 MOV #010564, -(SP)
010562 RTT ; бит T=1;
010564 IOT
010600 INC R5 ; R5=000000
010602 BEQ 010522 ; Тут детектирована ошибка; ИСПРАВЛЕНО
010604 MOV #000223, @#000402
010612 INC (R2)
010614 HALT
010750 MOV #000500, SP
010754 MOV #000020, -(SP) ; PSW для возврата по RTI, бит T=1
010760 MOV #010774, -(SP) ; PC для возврата по RTI
010764 MOV #011010, 000014 ; Вектор 14 PC = 011010
010772 RTI ; Проверяется, что RTI с битом T=1 приведет к прерыванию по вектору 14
011010 MOV #000016, 000014 ; Вектор 14 PC = 000016
011016 CLR 000016 ; Вектор 14 PSW = 000000
011022 INC @#000404
011026 CMP #000063, @#000404
011034 BNE 011150
011036 TSTB @#177564
011042 BPL 011036 ; Ожидание установки бита 7 - готовности к передаче
011044 MOV #000500, SP
011050 MOV #000340, 013076
011056 MTPS 013076 ; 340 -> PSW -- разрешение прерываний
011062 MOV #011132, 000064 ; Вектор 64 PC = 011132 - Адрес прерывания по завершению передачи байта (на ошибку 227)
011070 MOV #000100, 177564 ; Установка флага прерываний по завершению передачи байта, готовность байта к передаче
011076 MOV #011144, 000034 ; Вектор 34 PC = 011144 - Адрес прерывания TRAP (на ошибку 230)
011104 MOV #011156, 000064 ; Вектор 64 PC = 011156 - Адрес прерывания по завершению передачи байта (на продолжение теста)
011112 MOV #000340, 000036 ; Вектор 34 PSW = 340 \
011120 CLR 013076 ; +- Окно в которое должно сработать прерывание
011124 MTPS 013076 ; 0 -> PSW -- запрет прерываний /
011130 TRAP 000000
011132 MOV #000227, @#000402
011140 INC (R2)
011142 HALT
011144 MOV #000230, @#000402
011152 INC (R2)
011154 HALT
011156 CLR 000036
011162 INC @#000404
011166 CMP #000064, @#000404
011174 BNE 011316
011176 BIC #000100, 177564 ; Снятие флага прерываний по завершению передачи байта, готовность байта к передаче
011204 MOV #000500, SP
011210 MOV #000340, 013076
011216 MTPS 013076 ; 340 -> PSW
011222 MOV #000100, 177564 ; Установка флага прерываний по завершению передачи байта, готовность байта к передаче
011230 MOV #011262, 000034 ; Вектор 34 PC = 011262 - Адрес прерывания TRAP (на IOT и ошибку 231)
011236 MOV #011276, 000064 ; Вектор 64 PC = 011276 - Адрес прерывания по завершению передачи байта (на продолжение теста)
011244 MOV #011264, 000020 ; Вектор 20 PC = 011264 - Адрес прерывания IOT (на ошибку 231)
011252 MOV #000340, 000022 ; Вектор 20 PSW = 340
011260 TRAP 000000
011262 IOT
011264 MOV #000231, @#000402
011272 INC (R2)
011276 CLR 000022
011302 CLR 000066
011306 MOV #000066, 000064
011314 MOV #000036, 000034
011322 MOV #000022, 000020
011330 INC @#000404
011334 CMP #000065, @#000404
011342 BNE 011420
011344 MTPS #000340
011350 MOV #000100, 177564
011356 MOV #000100, 177560
011364 RESET
011366 BIT #000100, 177564
011374 BEQ 011410
011410 BIT #000100, 177560
011416 BEQ 011432
011432 INC @#000404
011436 CMP #000066, @#000404
011444 BNE 011520
011446 MOV #000500, SP
011452 MOV #011510, 000014 ; Вектор 14 PC = 011510 - Адрес прерывания по T-разряду
011460 MOV #000020, -(SP) ; PSW на стек, бит T установлен
011464 MOV #011472, -(SP) ; PC на стек
011470 RTT
011472 RESET ; !!! Сразу после этого 000066 HALT
011510 CLR 013076
011514 MTPS 013076
011520 MOV #000016, 000014
011526 CLR 000016
011532 INC @#000404
011536 CMP #000067, @#000404
011544 BNE 011722
011546 RESET

2130
to-bk-1994-3.pdf Normal file

File diff suppressed because it is too large Load Diff

1597
to-bk-1994-4.pdf Normal file

File diff suppressed because it is too large Load Diff