Этим Вы окажете большую помощь науке и медицине. См. подробнее: http://solidstate.karelia.ru/~yura/pyldin/yura/computing.htm |
НАУЧНО-ИССЛЕДОВАТЕЛЬСКАЯ И ПРОИЗВОДСТВЕННАЯ ЛАБОРАТОРИЯ "ПРОГРАМНО ОСИГУРЯВАНЕ" ------------------------------------------------------- ПЕРСОНАЛЬНЫЙ МИКРОКОМПЬЮТЕР ПЫЛДИН 601 / 601-А / 601-У / 601-M U n i B I O S версия 3.00 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ редакция 2. София - 1991 Copyright (с) 1989-1991 НИПЛ "Програмно осигуряване", София, НРБ UniDOS и UniBIOS являются регистрированными торговыми марками и наименованиями НИПЛ"Програмно осигуряване". "Пылдин" является регистрированной торговой маркой и наименованием Содружества "АБАКУС", НРБ. Настоящий документ, как и любая его часть, не может быть копирован, передан или включен в информационно-поисковые системы каким либо способом без предварительного письменного согласия со стороны НИПЛ"Програмно осигуряване". Все права на программный продукт, как и на любую его часть, сохранены. НИПЛ"Програмно осигуряване" не несет ответственности за работоспособность программного продукта в случаях его нерегламентированной перезаписи или пользования. ПРОГРАММНЫЙ ДИЗАИН И РЕАЛИЗАЦИЯ: Иво Ненов, Орлин Шопов, Леонид Калев с участием Георгия Петрова и Ивана Горинова АВТОРЫ документа: Орлин Шопов, Иво Ненов ПЕРЕВОД на русский язык и общая редакция: Недялко Тодоров Предтипографическя подготовка: Иво Ненов НИПЛ "Програмно осигуряване" благодарит каждого, кто вышлет свои замечания, рекомендации и деловые предложения по адресу: Болгария 1113, София, бульвар "Ленин" - 125 Студенски общежития блок 1 НИПЛ"Програмно осигуряване" --------------------------- phone/fax: (3592) 706248 СОДЕРЖАНИЕ ПРЕДИСЛОВИЕ 1. ЗНАКОМСТВО С ВАШИМ ПЫЛДИН-ом 2. ОРГАНИЗАЦИЯ ПАМЯТИ И СТРУКТУРА ВВОДА - ВЫВОДА 3. ОПИСАНИЕ СИСТЕМНЫХ ФУНКЦИЙ 4. УПРАВЛЕНИЕ УСТРОЙСТВАМИ И ЛОГИЧЕСКАЯ СТРУКТУРА ДИСКА 5. СИСТЕМНАЯ ПРОГРАММА MONITOR A. МИКРОПРОЦЕССОР СМ601 (MC6800) B. ОШИБКИ И ДИАГНОСТИЧЕСКИЕ СООБЩЕНИЯ РЕГИСТРАЦИОННАЯ КАРТА ПРЕДИСЛОВИЕ Реализация системного программного обеспечения микрокомпьютера "ПЫЛДИН" моделей "601","601-А", "601-У", "601-М" является результатом продoлжительной и напряженной, с полным применением богатого опыта авторов и всего коллектива проекта "Пылдин" в области системного программирования для компьютеров этого класса, работой, направленной на создание удобной и функциональной программной среды. При создании программного обеспечения микрокомпьютера ПЫЛДИН сознательно применялся стиль программных продуктов для 16-битовых персональных компьютеров типа IBM PC, с целью максимального облегчения перехода от работы на одном микрокомпьютере к работе на другом. Результатом усилий достижения функциональной совместимости и внешнего единообразия является не только основная концепция системного и прикладного програмного обеспечения, но и ряд технических решений. Например, входящий в комплект "Пылдин" дисковод, а также формат записи на дискетах, стандартны для компьютеров типа IBM РС. Это означает, что дискеты, записанные на микрокомпьютере ПЫЛДИН, могут быть прочитаны, записаны, копированы также и на компьютерах типа IBM PC и наоборот. Таким образом, микрокомпьютер ПЫЛДИН ФАЙЛОВО СОВМЕСТИМ с микрокомпьютерами типа IBM PC, что открывает перед пользователем широкие возможности. Настоящий документ написан исходя из предположения, что читатель имеет определенные знания в области программирования и может написать простую программу на Pascal-е или BASIC-е. Если читатель владеет програмированием на ассемблере - еще лучше. Для тех, кто никогда не программировал на ассемблере, в приложениях даны подробные сведения. Если читатель программировал на каком нибудь ассемблере - 8080, 6502, 8088, Z80 или даже 360/370, у него не будет существенных проблем в процессе применения как настоящего руководства, так и самого компьютера на уровне системного программиста. Мы надеемся, что при помощи микрокомпьютера ПЫЛДИН и этой книги, мы введем Вас в мир компьютеров и программирования, который интересен и богат не менее любого другого мира. От имени всех программистов, инженеров, конструкторов, администраторов и других специалистов, создавших микрокомпьютер ПЫЛДИН, плодотворной работы желают Вам авторы настоящего документа Орлин Шопов, Иво Ненов 1. ЗНАКОМСТВО С ВАШИМ ПЫЛДИНом ------------------------------ 1.1. ПРЕДНАЗНАЧЕНИЕ 1.2. ОСНОВНАЯ ПЛАТКА 1.3. КЛАВИАТУРА 1.4. ВИДЕО ДИСПЛЕЙ 1.5. ГРОМКОГОВОРИТЕЛЬ 1.6. КАССЕТОФОННЫЙ ИНТЕРФЕЙС 1.7. СЕРИЙНЫЙ ИНТЕРФЕЙС 1.8. ПАРАЛЛЕЛЬНЫЙ ИНТЕРФЕЙС 1.9. ДИСКОВОДЫ 1.1. ПРЕДНАЗНАЧЕНИЕ ПЫЛДИН фамилии "601" - универсальный микрокомпьютер, предназначенный для широкого круга пользователей. Он построен на базе болгарской микропроцессорной фамилии СМ600. ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ: ¦ микропроцессор: СМ601 (MC6800) - тактовая частота 1 MHz ¦ оперативная память: 64 килобайта DRAM ¦ постоянная память: - модели 601, 601-У, 601-А: 4 килобайта PROM, с възможностью расширения до 68 килобайт; - модель 601-М: 68 килобайт PROM ¦ клавиатура: - модели 601, 601-У, 601-А: квазисенсорная с 77 клавишей, вкл. 15 функциональных; - модель 601-А: возможность подключения внешней клавиатуры типа IBM PC/XT; - модель 601-М: внешняя клавиатура типа IBM PC/XT; ¦ текстовый режим: 40*25 черно/белого изображения [Пылдин 601] 80*25 черно/белого изображения [Пылдин 601А,М] 40*25 цветного изображения [Пылдин 601А,М] ¦ графический режим: - черно/белого изображения: 640 х 200 т. [Пылдин 601А,М] 320 х 200 т. [Пылдин 601] - цветного изображения: 320 х 200 т. в 4 цветах [Пылдин 601A,М] 160 х 200 т. в 4 цветах [Пылдин 601] 160 х 200 т. в 16 цветах [Пылдин 601A,М] 80 х 200 т. в 16 цветах [Пылдин 601] ¦ возможность подключения цветных или монохромных мониторов ¦ возможность подключения телевизора системы SECAM [Пылдин 601] ¦ параллельный интерфейс (Centronics) ¦ серийный интерфейс [Пылдин 601] ¦ RS-232-C серийный интерфейс [Пылдин 601А,М] ¦ кассетофонный интерфейс [Пылдин 601] ¦ контролер для двух односторонных или двусторонных дисководов с двойной или четверной плотностью с капацитетом 360 KВ или 720 KВ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ: ¦ операционная система UniDOS, файлово совместимая с MS-DOS ¦ базовая система ввода/вывода UniBIOS, обеспечивающая все технические устройства, графический и музикальный интерфейс ¦ системная программа MONITOR ¦ транслятор и интерпретатор UniPASCAL языка Pascal ¦ интерпретатор UniBASIC языка BASIC ¦ текстовый экранный редактор UniED ¦ ассемблер UniASM и кросс-ассемблер UniCROSS ¦ СУБД UniBASE, совместимая с продуктом dBASE II для IBM PC ¦ специализированные продукты ¦ коммуникационные средства ¦ программы для обучения и развлечения Первые три програмные продукта являются обязательной состовляющей систем всех моделей, а первые шесть продуктов - модели 601-М. 1.2. ОСНОВНАЯ ПЛАТКА На основной платке расположены: - микропроцессор СМ601 (MC6800); - оперативная память: 64 КВ DRAM с организацией: -- модели 601, 601-У, 601-А: 8 чипов 64 K * 1 бит; -- модель 601-М: 1 чип 512 K * 1 бит; - постоянная память: 4 КВ (содержащая основной части UniBIOS-а); - контролер видеодисплея СМ607 (MC6845); - схема формирования телевизионного сигнала SECAM [Пылдин 601]; - параллельный интерфейсный адаптер СМ602 (MC6820/6821) (управление клавиатурой, видео-режимами и кассетофонным интерфейсом). На основной платке расположены также и 4 разъема (модель 601-М: 3 разъема) европейского стандарта (64 контакта) для включения дополнительных платок. В модели 601-А на основной платке расположены также: - расширение постоянной памяти (страничный ROM) с организацией 8 страниц по 8 КВ - контролер печатающего устройства (принтера). В модели 601-М на основной платке расположены также: - расширеннная постоянная память (страничный ROM) с организацией 8 страниц по 8 КВ с записанными: XBIOS, BASIC-интерпретатор, PASCAL-интерпретатор, сетевое программное обеспечение; - контролер для двух односторонных или двусторонных дисководов с двойной или четверной плотностью с капацитетом 360 KВ или 720 KВ; - контролер печатающего устройства (принтера); - RS-232-C серийный интерфейс. Контролер управления дисководами СМ609 (I8272A) и контролер СМ603 (MC6850) интерфейса RS-232-C [Пылдин 601А] расположены на отдельных вставляемых платках моделей 601, 601-У и 601-А. На тильной стороне компьютера расположены разъемы: - видеомонитора и телевизора [601, 601-У, 601-А]; - кассетофона [601, 601-У]; - серийного псевдоинтерфейса [601, 601-У] или внешней клавиатуры [601-A]; - серийного интерфейса [601-M]; - параллельного интерфейса [601-M]; Питание микрокомпьютеров Пылдин 601/601А осуществляется от сети (~220 V) или от аккумулятора (+12 V). Питание дисководов (от сети - ~220 V) независимое. 1.3. КЛАВИАТУРА Клавиатура микрокомпьютера Пылдин моделей 601/601-У/601-А - квазисенсорная, с 77 клавишей, включая: 15 функциональных клавишей: 4 клавиши управления курсора (стрелки); специальные клавиши Ctrl, Shift, Tab, Esc, Del, CapsLock, Lat/Кир, Return и Reset. Клавиатура модели 601-М - стандартная внешняя типа IBM-PC/XT. Такая клавиатура может быть подключена в качестве дополнительной к модели 601-А. При нажатии любой клавиши генерируется 8-битовый код, одинаковый с ASCII-кодом соответствующего символа. Клавиатура генерирует маскируемое перерывание (-IRQ), которое обслуживается программами UniBIOS-а. Коды нажатых клавиш накапливаются в циклическом магазине (тип FIFO) с капацитетом 15 кодов. Коды специалных клавиш клавиатуры: ----------------------------------------T-------T-------T-------¦ L К Л А В И Ш И L L shift LcontrolL +-------------------T-------------------L L L L L601 / 601-У / 601-АL 601-М L L L L +-------------------+-------------------+-------+-------+-------L L Esc L Esc L$1B/027L$1B/027L$1B/027L +-------------------+-------------------+-------+-------+-------L L F1 L F1 L$C9/201L$D5/213L$E1/225L +-------------------+-------------------+-------+-------+-------L L F2 L F2 L$CA/202L$D6/214L$E2/226L +-------------------+-------------------+-------+-------+-------L L F3 L F3 L$CB/203L$D7/215L$E3/227L +-------------------+-------------------+-------+-------+-------L L F4 L F4 L$CC/204L$D8/216L$E4/228L +-------------------+-------------------+-------+-------+-------L L F5 L F5 L$CD/205L$D9/217L$E5/229L +-------------------+-------------------+-------+-------+-------L L F6 L F6 L$CE/206L$DA/218L$E6/230L +-------------------+-------------------+-------+-------+-------L L F7 L F7 L$CF/207L$DB/219L$E7/231L +-------------------+-------------------+-------+-------+-------L L F8 L F8 L$D0/208L$DC/220L$E8/232L +-------------------+-------------------+-------+-------+-------L L F9 L F9 L$D1/209L$DD/221L$E9/233L +-------------------+-------------------+-------+-------+-------L L F10 L F10 L$D2/210L$DE/222L$EA/234L +-------------------+-------------------+-------+-------+-------L L F11 L F11 L$D3/211L$DF/223L$EB/235L +-------------------+-------------------+-------+-------+-------L L F12 L F12 L$D4/212L$E0/224L$EC/236L +-------------------+-------------------+-------+-------+-------L L Tab L Tab L$ED/237L$EE/238L$ED/237L +-------------------+-------------------+-------+-------+-------L L Backspace L Backspace L$7F/127L$7F/127L$EF/239L +-------------------+-------------------+-------+-------+-------L L Enter L Enter L$C0/192L$C0/192L$F0/240L +-------------------+-------------------+-------+-------+-------L L Left L Left L$C1/193L$C5/197L$F1/241L +-------------------+-------------------+-------+-------+-------L L Right L Right L$C2/194L$C6/198L$F2/242L +-------------------+-------------------+-------+-------+-------L L Down L Down L$C3/195L$C7/199L$F3/243L +-------------------+-------------------+-------+-------+-------L L Up L Up L$C4/196L$C8/200L$F4/244L +-------------------+-------------------+-------+-------+-------L L F13 Home (s-Left)L Home L$C5/197L$C5/197L$F5/245L +-------------------+-------------------+-------+-------+-------L L F14 End (s-Right)L End L$C6/198L$C6/198L$F6/246L +-------------------+-------------------+-------+-------+-------L L PageDown (s-Down) L PageDown L$C7/199L$C7/199L$F7/247L +-------------------+-------------------+-------+-------+-------L L PageUp (s-Up) L PageUp L$C8/200L$C8/200L$F8/248L +-------------------+-------------------+-------+-------+-------L L Delete L Delete L$F9/249L$F9/249L$F9/249L +-------------------+-------------------+-------+-------+-------L L F15 Insert L Insert L$FA/250L$FA/250L$FA/250L +-------------------+-------------------+-------+-------+-------L L Lat/Кир L <not available> L$FB/251L$FB/251L$FB/251L +-------------------+-------------------+-------+-------+-------L L CapsLock L <not available> L$FC/252L$FC/252L$FC/252L +-------------------+-------------------+-------+-------+-------L L Pause (s-Space) L Pause (c-NumLock) L$FD/253L$FD/253L$FD/253L +-------------------+-------------------+-------+-------+-------L L Break (c-Space) LBreak(c-ScrollLock)L$FE/254L$FE/254L$FE/254L L-------------------+-------------------+-------+-------+-------- По заказу клиента поставляются клавиатуры со схемой, удовлетворяющей требованиям БДС (Болгарского государственного страндарта) или ГОСТ 14289-69. 1.4. ВИДЕО ДИСПЛЕЙ Микрокомпьютер Пылдин 601/601А обладает текстовым и графическим режимами изображения, но у модели 601А - более богатые возможности. Характеристики видеорежимов следующие: -------------------------T-------------------T------------------¦ L ВИДЕОРЕЖИМ L ПЫЛДИН 601,601-У LПЫЛДИН 601-А,601-МL +------------------------+-------------------+------------------L L 0 - текст 40 * 25 L черно/белый L цветной L L 1 - графика 16 цветов L 80 х 200 L 160 х 200 L L 2 - графика 4 цветов L 160 х 200 L 320 х 200 L L 3 - графика 2 цветов L 320 х 200 L 640 х 200 L L 4 - текст 80 * 25 L - L черно/белый L L------------------------+-------------------+------------------- Текстовый экран микрокомпьютера доступен только для записи. Он расположен в области памяти $F000Ў$FFFF и начало экрана перемещается при сдвиге изображения (scroll). У моделей 601 и 601-У строки расположены через 42 байта последовательно и последние 2 байта из каждой строки не используются. У моделей 601-А и 601-М строки расположены через 80 байтов. При видеоежиме 0 (текст 40 * 25) каждому символу предшествует свой атрибут цветности, т.е. каждый байт с четным номером содержит атрибут, а с нечетным - символ. Атрибут цветности имеет следующую структуру: ¦ бит 7 - режим мерцания, ¦ биты 6,5,4 - цвет символа, ¦ биты 3,2,1,0 - цвет фона. Кодировка цветов организована по схеме IRGB. Сооветствие между цветами и их номерами следующее: IRGB IRGB 0 (0000) - черный 8 (1000) - ярко черный (серый) 1 (0001) - синий 9 (1001) - ярко синий 2 (0010) - зеленый 10 (1010) - ярко зеленый 3 (0011) - сине-зеленый 11 (1011) - ярко сине-зеленый 4 (0100) - красный 12 (1100) - ярко красный 5 (0101) - фиолетовый 13 (1101) - ярко фиолетовый 6 (0110) - желтый 14 (1110) - ярко желтый 7 (0111) - белый 15 (1111) - ярко белый Графический экран микрокомпьютера имеет размер 8000 байтов (модели 601,601-М) или 16000 байта (модели 601-А,601-М). Он может быть расположен в любом месте памяти так, чтобы его начальный адрес был кратным 8, т.е. последняя шестнадцатеричная цифра была 0 или 8 - $XXX0 или $XXX8. Графический экран состоит из 25 строк по 40 (80 при 601-А и 601-М) блокам, расположенные последовательно в памяти. Каждый блок состоит из 8 последовательных байтов, так что байту с самым меньшим адресом соответствует самая верхная линия блока, а байту с самым большим адресом - самая нижняя линия. Каждый из байтов содержит информацию о 2 (при режим 1), 4 (при режим 2) или 8 точках (при режим 3), расположенных горизонтально. Старшие биты соответствуют левым точкам. Следующая таблица содержит часть адресной карты экрана относительно начала графического экрана моделей 601-А и 601-М. --------T-------T-------T-------T--- - - ---T-------T-------¦ L + 0 L + 8 L + 16 L + 24 L L + 624 L + 632 L +-------+-------+-------+-------+--- - - ---+-------+-------L L + 1 L + 9 L + 17 L + 25 L L + 625 L + 633 L +-------+-------+-------+-------+--- - - ---+-------+-------L L + 2 L + 10 L + 18 L + 26 L L + 626 L + 634 L +-------+-------+-------+-------+--- - - ---+-------+-------L L + 3 L + 11 L + 19 L + 27 L L + 627 L + 635 L +-------+-------+-------+-------+--- - - ---+-------+-------L L + 4 L + 12 L + 20 L + 28 L L + 628 L + 636 L +-------+-------+-------+-------+--- - - ---+-------+-------L L + 5 L + 13 L + 21 L + 29 L L + 629 L + 637 L +-------+-------+-------+-------+--- - - ---+-------+-------L L + 6 L + 14 L + 22 L + 30 L L + 630 L + 638 L +-------+-------+-------+-------+--- - - ---+-------+-------L L + 7 L + 15 L + 23 L + 31 L L + 631 L + 639 L +-------+-------+-------+-------+--- - - ---+-------+-------L L + 640 L + 648 L + 656 L + 664 L L + 1264L + 1272L +-------+-------+-------+-------+--- - - ---+-------+-------L L + 641 L + 649 L + 657 L + 665 L L + 1265L + 1273L +-------+-------+-------+-------+--- - - ---+-------+-------L | | | | | | | | | | | | | | | | +-------+-------+-------+-------+--- - - ---+-------+-------L L +15367L +15375L +15383L +15391L L +15991L +15999L L-------+-------+-------+-------+--- - - ---+-------+-------- Для всех графических режимов исползуется единая координатная система с началом верхный левый угол и осями X: 0Ў639 - горизонтальная и Y: 0Ў399 - вертикальная, т.е. одна точка экрана может быть адресована несколькими соседными координатами. В микрокомпьютере применяется широко распространненный в Болгарии символьный набор для 16-битовых микрокомпьютеров, совместимых с IBM PC. В графических режимах 2 и 3 возможно отпечатать, а также переопределить набор символов. Символьный набор: ---T---------------------------------¦ L L 0 1 2 3 4 5 6 7 8 9 A B C D E F L +--+---------------------------------L L00L L L10L § L L20L ! " # $ % & ' ( ) * + , - . / L L30L 0 1 2 3 4 5 6 7 8 9 : ; < = > ? L L40L @ A B C D E F G H I J K L M N O L L50L P Q R S T U V W X Y Z [ \ ] ^ _ L L60L ` a b c d e f g h i j k l m n o L L70L p q r s t u v w x y z { | } ~ L L80L А Б В Г Д Е Ж З И Й К Л М Н О П L L90L Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я L LA0L а б в г д е ж з и й к л м н о п L LB0L р с т у ф х ц ч ш щ ъ ы ь э ю я L LC0L L + T + - + ¦ ¦ L г ¦ T ¦ = + ¦ L LD0L ¦ T T L L - г + + - - - - ¦ ¦ - L LE0L - - - ¦ + ¦ ¦ ¬ ¬ ¦ ¦ ¬ - - - ¬ L LF0L Ё ё Є є Ї ї Ў ў ° • · v № ¤ ¦ L L--+---------------------------------- На тильной стороне компьютера - разъем "пятерка", обозначенный "RGB", для включения видеомонитора с комплексным сигналом или телевизора через антенный вход. У моделей 601-А и 601-М есть разъем DB-9 для включения RGB-видеомонитора. Расположение контактов разъема следующее: ----------------------------------------------------------¦ L 1 - Ground 4 - Green 7 - (Monochrome) L L 2 - Ground 5 - Blue 8 - Hor. Sync. L L 3 - Red 6 - Intensity 9 - Ver. Sync. L L---------------------------------------------------------- 1.5. ГРОМКОГОВОРИТЕЛЬ Микрокомпьютер ПЫЛДИН имеет встроенный громкоговоритель. Мембрану громкоговорителя можно переключать программно между состояниями "выпуклая вовне" и "выпуклая вовнутрь" через выход CB2 на основном параллельном интерфейсном адаптере (СМ 602). В UniBIOS-е реализована функция, при помощи которой можно сыграть ноты из 6-октавного диапазона с 7 степенями регуляции тембра. Продолжительность звучания нот определяется с интервалом в 1.536 миллисекунд. 1.6. КАССЕТОФОННЫЙ ИНТЕРФЕЙС На тильной стороне микрокомпьютера расположен разъем "пятерка" кассетофона. Сигнал из кассетофона после преобразования подается к входу PB7 основного параллельного интерфейсного адаптера (СМ 602), а сигнал к кассетофону после преобразования подается с выхода PB6. В UniBIOS-е есть функции записи и считывания соответствующих областей памяти. 1.7. СЕРИЙНЫЙ ИНТЕРФЕЙС Серийный интерфейс реализован по разному в разных моделях. В моделях 601 и 601-У интерфейс осуществляется микропроцессором. Скорость обмена - 1200 зн/сек, формат - 8-битовые данные, 2 стоповые бита, с или без контроля четности или нечетности. В моделях 601А и 601-М используются контролер СМ603 (MC6850) и разъем DB-25 ("мужкой"). Осуществляется стандарт RS-232-C со скоростью обмена от 300 до 19200 зн/сек, формат - 7- или 8-битовые данные, 1 или 2 стоповые бита и контроль че- тности или нечетности. На тильной стороне микрокомпьютера расположен разъем "пятерка", обозначенный "RS232". В модели 601 через него осуществляется серийный интерфейс, а в модели 601-А этот разъем используется для включения внешней клавиатуры. Расположение контактов разъема DB-25: -----------------------T-------------------------¦ L N Сигнал НаправлениеL N Сигнал НаправлениеL +----------------------+-------------------------L L 2 TxD Out L 6 DSR In L L 3 RxD In L 7 Gnd -- L L 4 RTS Out L 8 DCD In L L 5 CTS In L 20 DTR Out L L----------------------+-------------------------- 1.8. ПАРАЛЛЕЛЬНЫЙ ИНТЕРФЕЙС Параллельный интерфейс осуществляется по стандарту Centronics. В частности, интерфейс применяется для подключения стандартного печатающего устройства (принтера). В моделях 601-А и 601-М интерфейс находится на основной плате и имеет расположенный на тильной стороне компьютера разъем DB-25 ("женский") со следующим расположением контактов: ----------------------T----------------------T-----------------------¦ L N Сигнал НаправлениеL N Сигнал НаправлениеL N Сигнал НаправлениеL +---------------------+----------------------+-----------------------L L 1 -Strobe Out L 7 D5 Out L 13 Selected In L L 2 D0 Out L 8 D6 Out L 14 -AutoFeed Out L L 3 D1 Out L 9 D7 Out L 15 -Error In L L 4 D2 Out L 10 -Acknlg In L 16 -Init Out L L 5 D3 Out L 11 Busy In L 17 -SlctIn Out L L 6 D4 Out L 12 PaperEnd In L18Ў25 Ground -- L L---------------------+----------------------+------------------------ 1.9. ДИСКОВОДЫ К моделям 601,601-У и 601-А через интерфейсную платку, а к модели 601-М - непосредственно, можно включить 1 или 2 стандартных дисковода с автономным питанием. Устройства могут быть с 1 и 2 головками и шагом в 48 или 96 трэков (дорожек) на дюйм (40 или 80 цилиндров на дискету). Использованный формат записи - MFM со скоростью обмена 250 тысяч бит в секунду. Капацитет форматированной дискеты: ---------------------------T-----------------T-----------------¦ L L одностороанная L двухсторонная L +--------------------------+-----------------+-----------------L L 40 цилиндров х 9 секторовL 180 Кбайт L 360 Кбайт L L 80 цилиндров х 9 секторовL 360 Кбайт L 720 Кбайт L L--------------------------+-----------------+------------------ 2. ОРГАНИЗАЦИЯ ПАМЯТИ И ПРОЦЕССОВ ВВОДА-ВЫВОДА 2.1. КОНЦЕПЦИЯ ОПЕРАЦИОННОЙ СИСТЕМЫ 19 2.2. РАСПРЕДЕЛЕНИЕ ПАМЯТИ 19 2.3. ОБЛАСТЬ ВВОДА-ВЫВОДА 22 2.4. СТРАНИЧНЫЙ ROM 24 2.5. РАЗЪЕМ ДЛЯ ДОПОЛНИТЕЛЬНЫХ ПЛАТОК 25 2.1. КОНЦЕПЦИЯ UniDOS-а Обращения к функциям операционной системы осуществляются инструкциями SWI хх (программное прерывание), где хх - номер прерывания в интервале [0, 255]. В некоторых ассемблерах предусмотрена макроинструкция INT n, где n - число в интервале 0Ў255. При вызове функции INT хх входные и выходные параметры передаются через регистры микропроцессора. В случае необходимости разработки потребителем собственных системных функции необходимо учитывать, что входные параметры автоматически дублируются в системных переменных SWIC, SWIB, SWIA и SWIX. После выполнения функции содержание этих переменных автоматически переносится в соответствующие регистры. Поэтому пользователь объязан формировать результат функций в системных переменных. Потребительские системные функции должны завершаться инструкцией RTS. Механизмом системных функций осуществляется переключение страниц ROM-памяти. Концепция операционной системы не предусматривает прямого изменения системных переменных (кроме обьявленных), указателей границ памяти (LOMEM и HIMEM) и векторов (номера страниц и адресов) прерываний. Прямое изменение опасно и может привести к сбою системы. Кроме того, прямое, а не через предусмотренные для этой цели функции, обращение к коду операционной системы является признаком плохого стиля программирования и приводит к потере совместимости сo следующими версиями операционной системы. Воспринятый механизм динамического распределения памяти не позволяет потребительским программам изменять расположение в памяти стека микропроцессора. 2.2. РАСПРЕДЕЛЕНИЕ ПАМЯТИ Микропроцессор СМ601 имеет 16-битовую адресную магистраль, позволяющая адресирование 64 КВ памяти. Магистраль данных - 8-битовая. В компьютере есть 64 КВ динамической памяти (RAM), занимающей все адресное пространство. В области $F000 Ў $FFFF находится 4 КВ постоянной памяти (ROM), в которой записана основная часть UniBIOS-а. В этой же области расположен и системный текстовый экран компьютера, который доступен только для записи. Область $C000 Ў $DFFF адресного пространства предусмотрена для разширения памяти. Для этой области размером в 8 килобайт используется страничная организация. Переключение страниц (до 16) управляется 4-битовым регистром, расположенным по адресу $E6F0. Страницы с номерами 0 Ў 7 предусмотрены для RAM-памяти, а 8 Ў F - для ROM-памяти. Страница 0 используется логически BIOS-ом для запрещения переключения страниц, а страница 7 используется для включения основной памяти (т.е. для выключения расширений). К микрокомпьютеру "Пылдин 601" предлагается дополнительная платка ROM-памяти (в моделях 601-А и 601-М соответствующий объем памяти реализован на основной платке). На платке расположены 4 разъема, в которые можно вставить ROM интегральные схемы с организацией 8K х 8 или 16K х 8, совместимыe со схемами 2764 или 27128 - EPROM . Можно использовать схем обоих видов одновременно. В случае применения схем типа 27128 можно достичь максимального - в 64 КВ - расширения памяти. В модели 601-М использован один чип типа 27512. Область ввода-вывода микрокомпьютера расположена в адресном пространстве $E600 Ў $E6FF и распределена на 8 подобластей по 32 байта каждая. Нулевая страница ($0000 Ў $00FF) используется UniBIOS-ом и UniDOS-ом. Часть ее используется UniPascal-ем и UniBASIC-ом. Свободная память (для програмных программ) начинается с $0100 и ограничена сверху стековым указателем (регистром микропроцессора). Стек микропроцессора расположен в конце доступной памети (обычно около $BE00) и заполняется вниз (к младшим адресам). Карта адресного пространства: $0000 Ў $007F - рабочая область операционной системы $0080 Ў $00FF - рабочая область трансляторов $0100 Ў LOMEM - область, в которой расположен .CMD файл или зарезервирована функцией INT_35 (нормально LOMEM = $0100) LOMEM Ў STACK - свободная память. Значение указателя LOMEM и размер свободной памяти можно получить при помощи функции INT_36. STACK Ў HIMEM - системный стек HIMEM Ў RESID. - область, в которой расположен .PGM файл или зарезервирована функцией INT_2A. Новое значение указателя HIMEM получается при выполнения функции RESID.Ў $BFFF - резидентная область. Используется для загрузки драйверных и других программ, которые должны находиться постоянно в оперативной памяти. При выполнении функции INT_2C указатель начала резидентной области принимает текущее значение указателя HIMEM (конец доступной памяти). $C000 Ў $DFFF - страничная область. Страница 7 основной памяти используется командным интерпретатором UniDOS-а $E000 Ў $E5FF - рабочая область операционной системы $E600 Ў $E6FF - область ввода-вывода $E700 Ў $ED7F - рабочая область операционной системы $ED80 Ў $EFFF - страницы (расширения памяти) и адресы системных функций $F000 Ў $FFFF - BIOS или системный текстовый экран (только для записи) Разрешенные для использования потребительскими и прикладными программами СИСТЕМНЫЕ ПЕРЕМЕННЫЕ и их предназначения перечислены ниже: $0004 SWIC - передача и получение содержания регистра состояния процессора при реализации системных или потребительских функций $0005 SWIB - сохранение содержания аккумулятора B $0006 SWIA - сохранение содержания аккумулятора А $0007 SWIX - сохранение содержания индексного регистра X $ED00 RESMAGIC - индикация "холодного" и "теплого" восстановления (reset). После первого выполнения reset записывается $A55A. $ED0C KBDSTORE - указатель конца циклического магазина буферирования клавиатуры $ED0E KBDLOAD - указатель начала циклического магазина буферирования клавиатуры. Если оба указателя равны, то буфер пустой. $ED20 MSGLINE - указатель 26-й строки системного текстового экрана. Может быть использован прикладными программами для вывода сообщений. При сдвиге изображения (scroll) и при очистке экрана его значение меняется. $ED22 CONPARMS - указатель параметров консоли - масив из 8 байтов, содержащий следующие параметры: 0 - клавиша паузы, нормально ^S; 1 - клавиша прерывания, нормально ^C; 2,3 - начальная и последняя скен-линия курсора в режиме replace (замещение), нормально 6 и 7; 4,5 - курсор в режиме insert (вставка), нормально 0 и 7; 6,7 - курсор в пассивном режиме (когда не ожидается нажатие клавиши); $ED26 FDDPARMS - указатель параметров дисководов - масив из 9 байтов, содержащий следующие параметры: 0 - время выполнения шага и размагничивания головки. Нормально $6F, что соответствует времени шага 20 msec. $DF означает шаг за 6 msec; 1 - время подмагничивания головки, нормально $03; 2 - тип сектора - $02 для 512 байта; 3 - число секторов на дорожке (треке) - $09 4 - размер gap1, нормально $2A; 5 - размер данных (DTL) - $FF; 6 - размер gap2, нормально $50; 7 - заполнение при форматировании, нормально $E5; 8 - опаздывание двигателя, нормально $80, означает выключение двигателя после $80 х 20 msec = 2.56 sec после окончания операции. $FFDC NAME - начало строки с именeм компьютера $FFEC BIOSDATE - дата BIOS-a, формат yyyyyyymmmmddddd $FFEE BIOSVERS - версия BIOS-a $FFF7 MODEL - модель компьютера: $00 - модели 601 и 601-У; $80 - модель 601-А; $C0 - модель 601-М. В модели 601-М предусмотрены следующие дополнительные системные переменные: $ED09 SCANCODE - последный скен-код, полученный со стороны клавиатуры и обработанный прерыванием INT 09 $ED0A SHIFTSTATUS - флаги всех нажатых/опущенных клавиш типа ШИФТ. Отдельные биты имеют следующее предназначение: 7 - scroll_lock 6 - caps_lock 5 - cyr_lock 4 - num_lock 3 - alt 2 - ctrl 1 - cyr 0 - shift $ED0B LOCKSTATUS - флаги всех нажатых/опущенных клавиш типа КАПСЛОК. Отдельные биты имеют следующее предназначение: 7 - scroll_lock 6 - caps_lock 5 - cyr_lock 4 - num_lock 3 .. 0 - резервированные 2.3. ОБЛАСТЬ ВВОДА-ВЫВОДА Адресное пространство $E600-$E6FF делится на 8 областей, каждая размером 32 байта. Обращение микропроцессора к адресу этих областей формирует сигнал Device Select 0-7. В скобках после адреса указана позволенная операция (Read либо Write). Сигнал DS0 ---------- Сигнал DS0 используется видеоконтролером СМ607. Используются адреса: $E600 (W) - адресный регистр СМ607, $E601 (RW) - данные регистра СМ607. Сигнал DS1 ---------- Сигнал DS1 используется схемой PIA СМ602. Используются адреса: $E628 (RW) - DRA - регистр данных порта (стороны) A СМ602; $E629 (RW) - DRB - регистр данных порта B СМ602; $E62A (RW) - CRA - контрольный регистр порта A на СМ602; $E62B (RW) - CRB - контрольный регистр порта B на СМ602. Распределение битов следующее: -----T-----------T-----------------------------------------------¦ LБИТ LНаправлениеL ЗНАЧЕНИЕ L +----+-----------+-----------------------------------------------L LPA L in L ASCII-код считанного из клавиатуры символа L LCA1 L in L стробирование клавитуры L LCA2 L out L светодиод для CAPSLOCK L LPB0 L out L режим LAT/-КИР клавитуры L LPB1 L out L видеорежим LORES/-MIDRES L LPB2 L out L видеорежим COLOR/-B&W L LPB3 L out L палета для видеорежима MIDRES L LPB4 L out L палета для видеорежима MIDRES L LPB5 L out L видеорежим GRAF/-TEXT L LPB6 L out L кассетофон и серийный выход L LPB7 L in L кассетофон и серийный вход L LCB1 L in L 50 Hz L LCB2 L out L громкоговоритель L L----+-----------+------------------------------------------------ В моделях 601-А и 601-М сигнал DS1 используется и контролером принтера. Контролер реализован на основе PIA СМ602 с использованием следующих адресов: $E630 (RW) - DRA - регистр данных порта (стороны) A схемы СМ602; $E631 (RW) - DRB - регистр данных порта В; $E632 (RW) - CRA - контрольный регистр порта A; $E633 (RW) - CRB - контрольный регистр порта B; Распределение битов следующее: ------------T-----------T-----------¦ L БИТ LНаправлениеL Значение L +-----------+-----------+-----------L L CA2 = PA7 L in L +BUSY L L CB1 = PA6 L in L -ERROR L L CB2 = PA5 L in L +PEND L L CA1 L in L -ACKNLG L L PA4 L in L +SELECT L L PA3 L out L -SLCTIN L L PA2 L out L -INIT L L PA1 L out L -AUTOFD L L PA0 L out L -STROBE L L PB L out L данные L L-----------+-----------+------------ Сигнал DS2 ---------- Сигнал DS2 используется серийным интерфейсом RS-232-C моделей 601-А и 601-М, реализованным на основе ACIA СМ603. Используются адреса: $E645 (RW) - регистр определения скорости и сигналов DTR и DSR: бит 7 (out) - сигнал DTR бит 6 (in) - сигнал DSR биты 2,1,0 - скорость (в бодах): 0 - 150, 4 - 2400, 1 - 300, 5 - 4800, 2 - 600, 6 - 9600, 3 - 1200, 7 - 19200; $E646 (RW) - CR / SR (контрольный/статус регистр СМ603); $E647 (RW) - RxDR / TxDR (регистр данных СМ603). Сигнал DS6 ---------- Сигнал DS5 используется контролером дисководов. Исползуются адреса: $E6C0 (W) - регистр (4 бита) управления режима: бит 0 - -RESET, бит 1 - TC, бит 2 - drive select, бит 3 - motor on; $E6D0 (R) - статус регистр СМ609; $E6D1 (RW) - регистр данных СМ609. Сигнал DS7 ---------- Сигнал DS7 используется для управления страничным ROM-ом. Используется адрес $E6F0 (RW) - регистр (4 бита) для номера страницы. 2.4. СТРАНИЧНЫЙ ROM Монтированные на платке ROM-схемы типа 2764, 27128 или 27512 для нормальной работы операционной системы должны отвечать следующим требованиям: ¦ сумма всего ROM-а (2764), каждой из половин 27128 и каждой из одной восмых 27512 должна быть 0 при 8-битовом сложении без переноса; ¦ первые 2 байта ROM-а должны содержать идентификатор $A55A для 2764, первой половины 27128 и каждой из первых четырех одной восьмых 27512 и $5AA5 для второй половины 27128 и каждой из вторыых четырех одной восьмых 27512; ¦ следующие 8 байтов содержaт имя ROM-a ¦ следующие 3 байта содержат инструкцию перехода к процедуре инициализации ROM-a; ¦ следующие 3 байта содержат инструкцию перехода к нормальной входной точке ROM-а; ¦ следуют групы по трем байтам. Первый байт содержит номер системной функции, а остальные два - ее адрес. Векторы этих функций (номер страницы и адрес) устанавливаются перед инициализацией ROM-а; ¦ следует байт с значением 0 (конец множества групп). Установка векторов системных функции и инициализация ROM-ов расширения памяти делается каждый раз после reset (начальная установка) микропроцессора. 2.5. РАЗЪЕМ ДЛЯ ДОПОЛНИТЕЛЬНЫХ ПЛАТКАХ Ниже дана схема контактов соединительного разъема (слота) микрокомпьютера "Пылдин". Заключенные в скобках сигналы имеют место только в моделях 601-А и 601-М: -----------------¦ +---T--------T---L GND L L A 01 C L L GND -TxSTB L L A 02 C L L BF2 -BA L L A 03 C L L -RAMDIS -NMI L L A 04 C L L BF1 -HALT L L A 05 C L L -IRQ -BRES L L A 06 C L L R/-W A13 L L A 07 C L L A12 A14 L L A 08 C L L A15 A10 L L A 09 C L L A11 A8 L L A 10 C L L A9 A6 L L A 11 C L L A7 A4 L L A 12 C L L A5 A2 L L A 13 C L L A3 A0 L L A 14 C L L A1 D1 L L A 15 C L L D0 D3 L L A 16 C L L D2 D5 L L A 17 C L L D4 D7 L L A 18 C L L D6 -ROMDIS L L A 19 C L L 8MHz -DS5 L L A 20 C L L -DS6 -DS4 L L A 21 C L L -DS7 -DS2 L L A 22 C L L -DS3 (N.C.) L L A 23 C L L (N.C.) -DECA L L A 24 C L L -DECB -DEC9 L L A 25 C L L -DECC -DEC8 L L A 26 C L L -DECD (4MHz) L L A 27 C L L -DECE (-ENIO) L L A 28 C L L -DECF (N.C.) L L A 29 C L L (N.C.) (+12V) L L A 30 C L L (+12V) (N.C.) L L A 31 C L L (N.C.) +5V L L A 32 C L L +5V +---+--------+---L L----------------- Полное описание сигналов на разъеме и их нагрузочные характеристики можно найти в технической документации микрокомпьютера. 3. ОПИСАНИЕ СИСТЕМНЫХ ФУНКЦИЙ INT_01 RESET INT_02 NMI INT_03 IRQ INT_04 ПОТРЕБИТЕЛЬСКОЕ ПРЕРЫВАНИЕ INT_05 ПРЕРЫВАНИЕ 50 Hz INT_06 ПРЕРЫВАНИЕ 1 Hz INT_07 КРИТИЧЕСКАЯ ОШИБКА INT_08 УКАЗАТЕЛЬ УКАЗАТЕЛЕЙ КОДОВЫХ ТАБЛИЦ [601-М] INT_09 ОБСЛУЖИВАНИЕ ПРЕРЫВАНИЯ С КЛАВИАТУРЫ INT_0A КЛАВИАТУРНЫЕ МАКРОСЫ INT_10 ПРОВЕРКА КЛАВИАТУРЫ INT_11 СЧИТЫВАНИЕ КЛАВИАТУРЫ INT_12 ИНИЦИАЛИЗАЦИЯ ВИДЕОРЕЖИМА INT_13 ТЕКУЩИЙ ВИДЕОРЕЖИМ INT_14 ТЕКУЩЕЕ ПОЛОЖЕНИЕ КУРСОРА INT_15 ПОЗИЦИОНИРОВАНИЕ КУРСОРА INT_16 УСТАНОВКА АТРИБУТА INT_17 УПРАВЛЕНИЕ ДИСКОВОДОМ INT_18 ПРИЕМ ПО СЕРИЙНОМУ КАНАЛУ INT_19 ПЕРЕДАЧА ПО СЕРИЙНОМУ КАНАЛУ INT_1A ЧТЕНИЕ С КАССЕТОФОНА INT_1B ЗАПИСЬ НА КАССЕТОФОНЕ INT_1C ПОЛУЧЕНИЕ ОПЕРАТИВНОГО ВРЕМЕНИ INT_1D УСТАНОВКА ОПЕРАТИВНОГО ВРЕМЕНИ INT_1E ПОЛУЧЕНИЕ ОПЕРАТИВНОЙ ДАТЫ INT_1F УСТАНОВКА ОПЕРАТИВНОЙ ДАТЫ INT_20 ЧТЕНИЕ СИМВОЛА С КОНСОЛИ INT_21 ЧТЕНИЕ СТРОКИ С КОНСОЛИ INT_22 ВЫВОД СИМВОЛА НА КОНСОЛИ INT_23 ВЫВОД СТРОКИ НА КОНСОЛИ INT_24 ВЫВОД НА КОНСОЛИ ДВУХБАЙТОВОГО ЧИСЛА В 10-ФОРМАТЕ INT_25 ШЕСТНАДЦАТЕРИЧНЫЙ ВЫВОД БАЙТА INT_26 УПРАВЛЕНИЕ ПРИНТЕРОМ INT_27 УПРАВЛЕНИЕ ИНТЕРФЕЙСОМ RS-232-C INT_28 УМНОЖЕНИЕ БЕЗ ЗНАКА INT_29 ДЕЛЕНИЕ БЕЗ ЗНАКА INT_2A ЗАНЯТИЕ ПАМЯТИ INT_2B ОСВОБОЖДЕНИЕ ЗАНЯТОЙ ПАМЯТИ INT_2C ОБЪЯВЛЕНИЕ ОБЛАСТИ ПАМЯТИ РЕЗИДЕНТНОЙ INT_2D ПЕРЕНОС СОДЕРЖИМОГО ПАМЯТИ INT_2E ПОЛУЧЕНИЕ ВЕКТОРА INT_2F ЗАДАНИЕ ВЕКТОРА INT_30 MONITOR INT_31 BASIC INT_35 РЕЗЕРВИРОВАНИЕ ПАМЯТИ INT_36 СВОБОДНАЯ ПАМЯТЬ INT_37 ВЫПОЛНЕНИЕ ФУНКЦИИ INT_38 ЗАВЕРШЕНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ INT_39 ВЫПОЛНЕНИЕ СИСТЕМНОЙ КОМАНДЫ INT_3A ВЫХОД В СРЕДУ UniDOS-а INT_3B ЧИСЛО ПАРАМЕТРОВ НА КОМАНДНОЙ ЛИНИИ (ARGC) INT_3C ПОЛУЧЕНИЕ ПАРАМЕТРА С КОМАНДНОЙ ЛИНИИ (ARGV) INT_3D ТЕКСТ ОШИБКИ INT_3F ПОЛУЧЕНИЕ ПОЛНОГО ИМЕНИ ФАЙЛА INT_40 ЧТЕНИЕ/ЗАПИСЬ ЛОГИЧЕСКОГО СЕКТОРА INT_41 ВЕРСИЯ UniDOS INT_42 ПОИСК ПЕРВОЙ ЗАПИСИ В ДИРЕКТОРИИ INT_43 ПОИСК СЛЕДУЮЩЕЙ ЗАПИСИ В ДИРЕКТОРИИ INT_44 ЗАМЕНА ТЕКУЩЕГО УСТРОЙСТВА INT_45 ПОЛУЧЕНИЕ НОМЕРА ТЕКУЩЕГО УСТРОЙСТВА INT_46 ЗАМЕНА ТЕКУЩЕЙ ДИРЕКТОРИИ INT_47 ТЕКУЩАЯ ДИРЕКТОРИЯ INT_48 СОЗДАНИЕ ПОДДИРЕКТОРИИ INT_49 УНИЧТОЖЕНИЕ ПОДДИРЕКТОРИИ INT_4A ОТКРЫТИЕ ФАЙЛА INT_4B СОЗДАНИЕ ФАЙЛА INT_4C ЧТЕНИЕ ФАЙЛА INT_4D ЗАПИСЬ В ФАЙЛ INT_4E ЗАКРЫТИЕ ФАЙЛА INT_4F УНИЧТОЖЕНИЕ ФАЙЛА INT_50 ПОЗИЦИОНИРОВАНИЕ В ФАЙЛЕ INT_51 РАЗМЕР ФАЙЛА INT_52 СВОБОДНОЕ ПРОСТРАНСТВО НА ДИСКЕ INT_53 ПОЗИЦИЯ В ФАЙЛЕ INT_54 АТРИБУТЫ ФАЙЛА INT_55 ДАТА И ВРЕМЯ ФАЙЛА INT_56 ПЕРЕИМЕНОВАНИЕ ФАЙЛА INT_57 ЧТЕНИЕ СТРОКИ ИЗ ФАЙЛА INT_58 ПРОВЕРКА НА КОНЕЦ ФАЙЛА INT_5A ЗАПИСЬ СОДЕРЖИМОГО ВСЕХ БУФЕРОВ ФАЙЛА INT_5D ЗАПУСК ДРАЙВЕРА БЛОКОВОГО УСТРОЙСТВА INT_5E ЗАПУСК ДРАЙВЕРА СИМВОЛЬНОГО УСТРОЙСТВА INT_60 АЛЛОКИРОВАНИЕ ГРАФИЧЕСКОГО ЭКРАНА INT_61 ОСВОБОЖДЕНИЕ ГРАФИЧЕСКОГО ЭКРАНА INT_63 АДРЕС ГРАФИЧЕСКОГО ЭКРАНА INT_64 АДРЕС НАБОРА СИМВОЛОВ INT_65 КООРДИНАТЫ ГРАФИЧЕСКОГО КУРСОРА INT_66 ГРАФИЧЕСКИЕ КОМАНДЫ INT_67 РЕДАКТИРОВАНИЕ СТРОКИ INT_68 ЗАПИСЬ ASCII-СТРОКИ INT_69 ЗАПИСЬ СИМВОЛА НА STDOUT INT_6A СОЗДАНИЕ ВРЕМЕННОГО ФАЙЛА INT_6B СОЗДАНИЕ НОВОГО ФАЙЛА INT_6C УРЕЗАНИЕ ФАЙЛА INT_6D ПОЛУЧЕНИЕ РАЗМЕРА ЭКРАНА INT_6E МУЗИКАЛЬНЫЕ КОМАНДЫ INT_6F ИСПОЛНЕНИЕ НОТЫ INT_70 ЗАПРЕТ/РАЗРЕШЕНИЕ ДОСТУПА К ФАЙЛУ INT_00 резервированная INT_01 RESET Функция обслуживания reset. После выполнения процедуры reset (горячего или холодного рестартирования системы) управление передается этой функции. Нормально управление передается при помощи INT_01 командному интерпретатору UniDOS, программе MONITOR или BASIC в зависимости от расположения соответствующих ROM-чипов. INT_02 NMI Функция обслуживания немаскируемого прерывания NMI. При получении прерывания управление передается ей. Из-за критических по времени процедур обслуживания контролера дисковых устройств и кассетофона, не предусмотрена работа микрокомпьютера немаскируемыми прерываниями. Потребитель должен запустить собственную обслуживающую прерывания программу (драйвер). INT_03 IRQ Функция обслуживания маскируемого прерывания IRQ. При получении прерывания управление передается ей. Потребитель должен запустить собственную обслуживающую прерывания программу (драйвер). ПРИМЕР: Пусть в микрокомпьютере получается прерывание IRQ при опасности аварии в контролируемой им системе. В такой ситуации на экран дисплея выводится сообщение о ситуации. example_03 proc ldaa #$03 ; функция 03 clrb ; оперативная память ldx #nmi_handler ; адрес облуживающей программы int $2f ; запуск rts irq_handler proc ; процедура обслуживания IRQ ldx #message ; адрес сообщения int $23 ; вывод на экран rts message db 13,10,'ОПАСНОСТЬ АВАРИИ!',7,0 endp ; irq_handler endp ; example_03 РЕЗУЛЬТАТ: ОПАСНОСТЬ АВАРИИ! СРОДНЫЕ ФУНКЦИИ: INT_02 - NMI (немаскируемое прерывание) INT_04 ПОТРЕБИТЕЛЬСКОЕ ПРЕРЫВАНИЕ Функция обслуживания прерывания с клавиатуры (CTRL-C). При нажатии клавиши BREAK (CTRL-C) во время чтения символа из клавиатуры (INT_20) или его записи (INT_22) выполняется INT_04. Программа потребителя должна перехватить этот вектор в случае необходимости. INT_05 ПРЕРЫВАНИЕ 50 Hz Функция обслуживания прерывания с часов (частота 50 Hz). Используется BIOS-ом для обслуживания двигателя дискового устройства и для считывания оперативного времени. Во время прерывания с часов не могут выполняться другие функции, так как они не реентерабельны! Не рекомендуется использование этой функции потребительскими программами. СРОДНЫЕ ФУНКЦИИ: INT_06 - прерывание 1 Hz INT_06 ПРЕРЫВАНИЕ 1 Hz Функция обслуживания прерывания с часов (частота 1 Hz). Используется UniDOS-ом для считывания оперативного времени. Во время прерывания с часов не могут выполняться другие функции, так как они не реентерабельны! Не рекомендуется использование этой функции потребительскими программами. СРОДНЫЕ ФУНКЦИИ: INT_05 - прерывание 50 Hz INT_07 КРИТИЧЕСКАЯ ОШИБКА Функция обслуживания критической ошибки. Если потребитель должен принять решение по обработке ошибки, выполняется INT_07. Потребительские программы могут перехватить этот вектор в случае необходимости. ИМПОРТ: A - бит 7 определяет тип устройства: 1 - disk; 0 - char. Биты 6-0 - код ошибки. B - (только если A.7 = 1 - дисковод) - определяет класс ошибки и возможную реакцию: бит 6 - ответ FAIL разрешен бит 5 - ответ RETRY разрешен бит 4 - ответ IGNORE разрешен бит 3-2 - область: 0 - DOS, 1 - FAT, 2 - Dir, 3 - Data бит 1-0 - операция: 0 - Init, 1 - Read, 2 -Write X - (если A.7 = 1 - дисковод) - указатель параметров INT_40 ЭКСПОРТ: A - ответ(реакция): 0 - Ignore, 1 - Retry, 2 - Abort, 3 - Fail Если значение, которое возвращается в аккумулятор А - недействительно, UniDOS автоматически перекодирует его следующим образом: A = 0 - (ignore), а ignore не разрешено, A дается значение 3 (fail) A = 1 - (retry), а retry не разрешено, A дается значение 3 (fail) A = 3 - (fail), а fail не разрешено, A дается значение 2 (abort) ПРИМЕР: critical_error proc ldaa #3 ;Fail rts endp . . ldaa #7 ; номер вектора clrb ; номер страницы ldx #critical_error ; адрес функции int $2F ; переназначение вектора . . РЕЗУЛЬТАТ: После захвата вектора INT 7, всегда, когда возникнет ошибка, будет возвращаться ее код. INT_08 УКАЗАТЕЛЬ УКАЗАТЕЛЕЙ КОДОВЫХ ТАБЛИЦ ВНИМАНИЕ ! Указатель применим ТОЛЬКО в модели 601-М. INT_08 является указателем массива из пяти указателей к таблицам перекодировки скен-кодов клавиатуры типа IBM-PC/XT. Каждый из пяти указателей содержит один байт с номером страницы ROM-а и одно слово с адресом соответствующей таблицы перекодировки скен-кодов. Таблицы перекодировки имеют следующее предназначение: Таб. 0 - латиница; Таб. 1 - латиница SHIFT; Таб. 2 - кириллица; Таб. 3 - кириллица SHIFT; Таб. 4 - control. Генерируемые скен-коды клавиатуры имеют значения в диапазоне [0..95]. Таблицы содержат коды, описанные в 1.3. INT_09 ОБСЛУЖИВАНИЕ ПРЕРЫВАНИЯ С КЛАВИАТУРЫ Функция обслуживанияе прерывания с клавиатуры. Считанный символ накапливается в циклическом магазине с объемом 15 кодов. INT_0A УКАЗАТЕЛЬ КЛАВИАТУРНЫХ МАКРОСОВ Указатель клавиатурных макродефиниций (макросов). Клавиатурные макросы представляют собой таблицу со следующей структурой: <дефиниция> [<дефиниция>] <терминатор> Дефиниция имеет следующую структуру: <скен-код><строка (символьная строка)><терминатор строки> ПРИМЕР: иллюстрация дефинирования клавиши F1, имеющей скен-код 201 (см. приложение). При нажатии этой клавиши вводится слово Hello: example_0A proc ldx #defs ;адрес дефиниции clrb ;страница памяти ldaa #$0A ;вектор #0A int $2F ;задание вектора rts defs db 201 ;скен-код клавиши F1 db 'Hello',0 ;дефиниция db $FF ;конец дефиниции endp INT_0B pезервированная INT_0C резервированная INT_0D служебная Служебный указатель. Его модифицирование опасно и может привести к краху системы ! INT_0E служебная Служебный указатель. Его модифицирование опасно и может привести к краху системы ! INT_0F служебная Служебный указатель. Его модифицирование опасно и может привести к краху системы ! INT_10 ПРОВЕРКА КЛАВИАТУРЫ Функция проверки состояния клавиатуры (наличие нажатой клавиши). Из-за технических особеностей возможно не принятие короткого нажатия (без задержки) клавиши. ЭКСПОРТ: A - $FF - если нет нажатой клавиши СРОДНЫЕ ФУНКЦИИ: INT_11 - чтение клавитуры (скен-код) INT_11 ЧТЕНИЕ КЛАВИАТУРЫ Функция чтения символа с клавитуры. Возвращает скен-кода нажатой клавиши или $FF при одновременном нажатии нескольких клавишей или при ошибке. Рекомендуется использование INT_20 при разработке программ, читающих прямо с клавиатуры. ЭКСПОРТ: A - скен-код (см. приложение) СРОДНЫЕ ФУНКЦИИ: INT_11 - проверка клавитуры INT_20 - чтение символа с консоли INT_12 ИНИЦИАЛИЗАЦИЯ ВИДЕОРЕЖИМА Функция инициализации видеорежима. К номеру режима можно добавить $80, чтобы при инициализации экран очищился. Для текстовых режимов делать этого не рекомендуется (из-за особенностей системного текстового экрана - хардверный скролл). Необходимо помнить, что горизонтальная разрешающая способность модели 601-A в два раза больше чем модели 601. ИМПОРТ: A - видеорежим (в скобках указаны характеристики модели 601), режим 4 возможeн только при варианте 601-А: 0 - текстовый: 80 (40) символов в 25 строках; 1 - графика 160 (80) по 200 точек в 16 цветах; 2 - графика 320 (160) по 200 точек в 4 цветах одной, определяемой значением B, из 4 палитр; 3 - графика 640 (320) по 200 точек в 2 цветах; 4 - текст 40 символов в 25 строках с атрибутами цветности и мерцания; B - палитра в режиме 2 или атрибут в режиме 4: Палитра: 0 - "холодная": синий, сине-зеленый, фиолетовый, белый; 1 - "теплая": черный, зеленый, красный, желтый; 2 - яркая "холодная" палитра; 3 - яркая "теплая" палитра. Атрибут: биты 3-0 - цвет фона; 6-4 - цвет изображения; 7 - мерцание. Коды цветов: определяются сигналами (битами) I-интенсивность (яркость), R-красный, G-зеленый и B-синий цвет +-----+-----+--------------------------+ |номер|IRGB | цвет | +-----+-----+--------------------------+ | 0 |0000 | черный | | 1 |0001 | синий | | 2 |0010 | зеленый | | 3 |0011 | сине-зеленый (циян) | | 4 |0100 | красный | | 5 |0101 | виолетовый | | 6 |0110 | желтый | | 7 |0111 | белый | | 8 |1000 | ярко черный | | 9 |1001 | ярко синий | | 10 |1010 | ярко зеленый | | 11 |1011 | ярко сине-зеленый (циян) | | 12 |1100 | ярко красный | | 13 |1101 | ярко виолетовый | | 14 |1110 | ярко желтый | | 15 |1111 | ярко белый | +-----+-----+--------------------------+ Цвета, коды которых заканчиваются на 1, составляют "холодные" палитры, а остальные - "теплые" палитры. При кодировке цветов изображения не предусмотрен бит интенсивности - цвета неинтенсивные. X - адрес экрана (необходим в графических режимах и текстовых режимах без очистки экрана) СРОДНЫЕ ФУНКЦИИ: INT_13 - текущий видеорежим INT_14 - положение курсора INT_15 - позиционирoвание курсора INT_16 - установка атрибута (только для модели 601-А) INT_13 ТЕКУЩИЙ ВИДЕОРЕЖИМ Функция получения текущего видеорежима ЭКСПОРТ: A - видеорежим (как он задан в INT_12) B - палитра / атрибут X - базовый адрес экрана СРОДНЫЕ ФУНКЦИИ: INT_12 - инициализация видеорежима INT_14 ТЕКУЩЕЕ ПОЛОЖЕНИЕ КУРСОРА Функция получения положения курсора ЭКСПОРТ: A - колонка B - строка X - начальный адрес экрана (в текстовом режиме) - из-за хардверного скролла, этот адрес меняется, он необходим при инициализации текстового видеорежима без очистки экрана (INT_12) СРОДНЫЕ ФУНКЦИИ: INT_12 - инициализация видеорежима INT_15 - позиционирование курсора INT_15 ПОЗИЦИОНИРОВАНИЕ КУРСОРА Функция позиционирования курсора. Если новые координаты недействительны (попадают вне рамки экрана), то они игнорируются. ИМПОРТ: A - колонка B - строка ПРИМЕР: Следующая программа позиционирует курсор на 5 строку, 8 колонку example_15 proc ldaa #8 ;колонка ldab #5 ;строка int $15 rts endp СРОДНЫЕ ФУНКЦИИ: INT_14 - текущее положение курсора INT_16 УСТАНОВКА АТРИБУТА Функция установки атрибута видеорежима. Функция выполняется только при видеорежиме 4. Установленный функцией атрибут применяется при изображении текста после выполнения функции. ИМПОРТ: B - атрибут (см. INT_12): бит 3-0 - цвет изображения бит 6-4 - цвет фона бит 7 - мерцание (режим 4) или интенсивность фона INT_17 УПРАВЛЕНИЕ ДИСКОВОДОМ Функция управления дисководом. Обеспечивает инициализацию и управление контролером дисковода (разработан на основе СМ-609, аналог Intel-8272A и NEC-765) - чтение, запись сектора, форматирование трека (дорожки). ИМПОРТ: A - команда: 0 - инициализация контролера (рекомендуется выполнение после каждой ошибки) 1 - чтение сектора 2 - запись сектора 4 - форматирование трека X - указатель к таблице с параметрами (не нужна команде 0 - инициализация контролера); Таблица имеет длину 6 байтов и содержит: ¦ номер устройства: 0 - A, 1 - B (1 байт) ¦ номер цилиндра: 0 - 39 (1 байт) ¦ номер головки: 0 или 1, при односторонных устройствах разрешена только головка 0 (1 байт) ¦ номер сектора 1 - 9 (1 байт) ¦ адрес буфера размером в 512 байтов для перезаписи сектора (2 байта) ЭКСПОРТ: A - код ошибки, отдельные биты означают: бит 0 - защита от записи бит 1 - контролер не обслужен (overrun) бит 2 - плохая контрольная сумма (CRC) бит 3 - плохая запись бит 4 - плохой адресный маркер бит 5 - ошибка при позиционировании бит 6 - timeout бит 7 - хардверная ошибка ПРИМЕР: Следующая примерная программа демонстрирует чтение сектора 1, стороны 0, трека 5 из устройства A и вывод на экран кода и текста сообщения о резултате. example_17 proc ldaa #1 ;команда чтения ldx #parms ;указатель к параметрам int $17 ;выполнение команды tsta ;проверка результата bne error ;если ошибки ldx #ok_message ;указатель к тексту сообщения int $23 ;вывод сообщения на экран rts error ldx #fail_message ;указатель к тексту сообщения int $23 ;вывод сообщения на экран int $25 ;вывод кода ошибки rts ;в шестнадцатеричном формате parms db 0 ;устройство A db 5 ;дорожка 5 db 0 ;сторона 0 db 1 ;сектор 1 dw buffer ;указатель к буферу ok_message db 'Операция выполнена успешно',13,10,0 fail_message db 'Операция закончена Код ошибки $',13,10,0 buffer ds $200 ;буфер с размером 512 байтов,в котором ;перезаписан сектор endp РЕЗУЛЬТАТ: Операция выполнена успешно СРОДНЫЕ ФУНКЦИИ: INT_40 - чтение логических секторов INT_18 ПРИЕМ ПО СЕРИЙНОМУ КАНАЛУ Функция приема символа по серийному каналу. Функция недоступна на модели 601-A. ЭКСПОРТ: A - принятый символ ПРИМЕР: example_18 proc int $18 ; прием символа int $22 ; вывод на экране rts endp СРОДНЫЕ ФУНКЦИИ: INT_19 - передача символа по серийному каналу INT_19 ПЕРЕДАЧА ПО СЕРИЙНОМУ КАНАЛУ Функция передачи символа по серийному каналу. Функция недоступна на модели 601-A. ИМПОРТ: A - передаваемый символ ПРИМЕР: example_19 proc int $20 ; чтение символа клавитурой int $19 ; передача символа rts endp СРОДНЫЕ ФУНКЦИИ: INT_18 - прием символа по серийному каналу INT_1A ЧТЕНИЕ С КАССЕТОФОНА Функция чтения с кассетофона. ЭКСПОРТ: BA - длина прочитанной записи X - начальный адрес прочитанной записи ПРИМЕР: example_1A proc ldx #message ; адрес сообщения int $23 ; вывод сообщения int $20 ; ожидание клавиши int $1A ; чтение записи stx address ; сохранение адреса stab length ; сохранение длины staa length+1 rts address ds 2 ; переменная для начального адреса length ds 2 ; переменная для длины message db 'Bключите кассетофон и нажмите' db ' любую клавишу', 0 endp СРОДНЫЕ ФУНКЦИИ: INT_1B - запись на кассетофоне Замечание: При отсутствии информационного сигнала возможно блокирование системы. INT_1B ЗАПИСЬ НА КАССЕТОФОНЕ Функция записи на кассетофоне. ИМПОРТ: BA - длина записи X - начальнный адрес буфера ПРИМЕР: example_1B proc ldx #buffer ; адрес буфера ldab #/length ; объем буфера ldaa #length int $1B ; запись буфера rts endp СРОДНЫЕ ФУНКЦИИ: INT_1A - чтение с кассетофона INT_1C ПОЛУЧЕНИЕ ОПЕРАТИВНОГО ВРЕМЕНИ Функция получения текущего оперативного времени. Оперативное время установливается на 0:00:00.00 01-JAN-1989 при включении питания и меняется при помощи прерываний с чaстотой 50 герц. ЭКСПОРТ: A - минуты B - часы X - секунды (старший байт), сотыe (младший байт) СРОДНЫЕ ФУНКЦИИ: INT_1D - установка оперативного времени INT_1D УСТАНОВКА ОПЕРАТИВНОГО ВРЕМЕНИ Функция установки оперативного времени. Оперативное время устанавливается в соответствии с заданными значениями. ИМПОРТ: A - минуты B - часы X - секунды (старший байт), сотые (младший байт) СРОДНЫЕ ФУНКЦИИ: INT_1C - получение оперативного времени INT_1E ПОЛУЧЕНИЕ ОПЕРАТИВНОЙ ДАТЫ Функция получения даты. Смотрите INT_1C ЭКСПОРТ: A - месяц B - день X - год СРОДНЫЕ ФУНКЦИИ: INT_1F - установка даты INT_1F УСТАНОВКА ОПЕРАТИВНОЙ ДАТЫ Функция установки оперативной даты. ИМПОРТ: A - месяц B - день X - год СРОДНЫЕ ФУНКЦИИ: INT_1E - получение даты INT_20 ЧТЕНИЕ СИМВОЛА С КОНСОЛИ Функция чтения символа с консоли. Во время выполнения функции прослеживается пользовательское прерывание. ЭКСПОРТ: A - код прочитанного символа ПРИМЕР: example_20 proc loop int $20 ; чтение символа int $22 ; вывод символа на экране bra loop ; бесконечный цикл endp СРОДНЫЕ ФУНКЦИИ: INT_11 - чтение с клавитуры INT_21 ЧТЕНИЕ СТРОКИ С КОНСОЛИ Функция чтения строки с консоли. Строка завершается нажатием клавиши RETURN. После последнего введенного символа записывается NULL - в следующем байте записывается 0. Символ NULL не учитывается в длине строки. Код клавиши RETURN не записывается в буфере. Если до выполнения функции в буфере не был записан допустимый код, необходимо обнулить первый байт буфера. ИМПОРТ: B - максимальная длина строки X - указатель буфера, размером на 1 больше максимальной длины строки ЭКСПОРТ: A - реальная длина прочитанной строки ПРИМЕР: example_21 proc ldx #buffer ; адрес буфера clr 0,x ; очистка буфера ldab #10 ; не более 10 символов int $21 ; чтение строки staa length ; сохранение ее длины rts length ds 1 ; переменная для размера buffer ds 11 ; буфер на 11 символов endp СРОДНЫЕ ФУНКЦИИ: INT_20 - чтение символа с консоли INT_67 - редактирование строки INT_22 ВЫВОД СИМВОЛА НА КОНСОЛЬ Функция вывода символа на консоль. Во время выполнения функции поддeрживаются и графические режимы видеоконтролера, если инсталирован XBIOS. Допустимы следующие управляющие символы: * $04 - textcolor (цвет текста) * $05 - grafcolor (цвет графики) $06 - set palette (установка палитры) $07 - bell (звонок) $08 - backspace (назад) $09 - tab (табуляция) * $10 - plot comand (команда вычерчивания) $0A - new line (lf) (переход на новую строку) $0C - new page (cls)(новая страница - очистка экрана) $0D - carriage return (возврат кареты - переход в первую позицию следующей строки) $16 - set video mode (установка видеорежима) $18 - clear to end of line (очистка строки с позиции курсора до конца) * $19 - clear to end of screen (очистка до конца экрана) $1B - escape (следующий символ выводится как нормальный, а не как управляющий) $1E - gotoxy (следующие два символа задают новую позицию курсора (при основе $20)) $7F - rubout (стирание символа слева от курсора и перемещение курсора на одну позицию в лево) ВНИМАНИЕ ! Помеченные звездочкой символы применимы только в графических режимах. ИМПОРТ: A - код символа ПРИМЕР: example_22 proc ldaa #'@' ; код символа "@" int $22 ; вывод символа rts endp РЕЗУЛЬТАТ: @ СРОДНЫЕ ФУНКЦИИ: INT_25 - вывод шестнадцатеричного кода символа (hex) INT_23 ВЫВОД СТРОКИ НА КОНЗОЛЬ Функция вывода строки символов на консоль. Строка должна завершаться символом NULL (байт с содержимым 0). ИМПОРТ: X - адрес строки ПРИМЕР: example_23 proc ldx #text ; адрес строки int $23 ; вывод строки rts text db 'Здравствуй, мир!',0 endp РЕЗУЛЬТАТ: Здравствуй, мир! СРОДНЫЕ ФУНКЦИИ: INT_22 - вывод символа INT_24 ВЫВОД НА КОНСОЛЬ ДВУХБАЙТОВОГО ЧИСЛА В 10-ФОРМАТЕ Функция вывода на консоль двухбайтового числа без знака в десятичном формате. ИМПОРТ: X - число в интервале [0, 65535] ПРИМЕР: example_24 proc ldx #12345 int $24 rts endp РЕЗУЛЬТАТ: 12345 INT_25 ШЕСТНАДЦАТЕРИЧНЫЙ ВЫВОД БАЙТА Функция вывода на консоль содержимого байта в шестнадцатеричном формате (hex). ИМПОРТ: A - шестнадцатеричное число в диапазоне [$00, $FF] ПРИМЕР: example_25 proc ldaa #'@' ; загрузка кода символа "@" int $25 ; вывод содержимого байта rts endp РЕЗУЛЬТАТ: 40 СРОДНЫЕ ФУНКЦИИ: INT_22 - вывод символа INT_26 УПРАВЛЕНИЕ ПРИНТЕРОМ Функция управления печатающим устройством (принтером). ИМПОРТ: A - символ (только для операции 0) B - операция: 0 - вывод символа на печат 1 - получение статуса принтера 2 - инициализация принтера ЭКСПОРТ: A - статус принтера (состояние сигналов): бит 0 - TIMEOUT (отсутствие готовности) бит 4 - SELECTED (выбран) [601A] бит 5 - PAPER_END (конец бумаги) бит 6 - ERROR (ошибка) бит 7 - BUSY (занят) INT_27 УПРАВЛЕНИЕ ИНТЕРФЕЙСОМ RS-232-C Функция управления серийным интерфейсом RS-232-C. Интерфейс доступен только на машинах Пылдин 601A. ИМПОРТ: A - символ (для операции 1 и 2) B - операция: 0 - статус интерфейса 1 - прием символа 2 - передача символа 3 - режим интерфейса: бит 0 - определяет уровень сигнала DTR биты 7,6,5 - определяют генерирование прерывания после выполнения операции приема/ передачи символа и записываются в контрольном регистре СМ603, 4 - инициализация интерфейса: биты 2,1,0 - определяют скорость обмена: 000 - 150 бодов 001 - 300 бодов ... 110 - 9600 бодов 111 - 19200 бодов биты 5,4,3 - определяют формат переданных данных и записываются в контрольном регистре СМ603 ЭКСПОРТ: A - принятый символ / статус интерфейса: биты 0,1,2,3,7 - состояние СМ603 (соответствуют по содержанию тем-же битам регистра состояния СМ603) бит 6 - уровень сигнала DSR B - код ошибки: биты 4,5,6 - ошибка по линии (соответствуют по содержанию тем-же битам регистра состояния СМ603) бит 7 - конец контрольного времени INT_28 УМНОЖЕНИЕ БЕЗ ЗНАКА Функция умножения без знака двух 8-битовых чисел. Результат - 16-битовое число. ИМПОРТ: A - множимое B - множитель ЭКСПОРТ: BA - результат ПРИМЕР: example_28 proc ldaa #19 ; множимое ldab #43 ; множитель int $28 ; умножение staa result+1; младший байт произведения stab result ; старший байт произведения ldx result int $24 ; вывод результата rts result ds 2 endp РЕЗУЛЬТАТ: 817 СРОДНЫЕ ФУНКЦИИ: INT_29 - деление без знака INT_29 ДЕЛЕНИЕ БЕЗ ЗНАКА Функция 16-битового деления без знака. Делимое, делитель, частное и остаток - 16-битовые числа. При делении на 0 остаток = $FFFF ИМПОРТ: BA - делитель X - делимое ЭКСПОРТ: BA - остаток X - частное СРОДНЫЕ ФУНКЦИИ: INT_28 - умножение без знака INT_2A ЗАНЯТИЕ ПАМЯТИ Функция занятия (аллокирования) памяти. Память аллокируется текущей программой (задачей). Аллокирование памяти можно осуществить только на определенной границе памяти - до адреса, кратного степени двойки. Предположение, что две последовательно занятые области образуют общую непрерывную область НЕ КОРРЕКТНО ! Занятая память может быть освобождена при помощи функции INT_2B или по окончанию выполнения программы. Память занимается и освобождается по принципу стека, т.е. освобождение одной области памяти означает освобождение и всех других позднее занятых областей ! ИМПОРТ: B - степень двойки в диапазоне [0, 8], по которой осуществляется выравнивание границы памяти: 2^0 - выравнивание на границе байта; ... 2^8 - выравнивание на границе страницы X - размер в байтах аллокированной области ЭКСПОРТ: X - указатель аллокированной области. Если X = 0, то аллокирование не осуществлено (нет достаточно свободной памяти) ПРИМЕР: Примерная программа занятия памяти для графического экранa: example_2A proc ldx #grscreen_size ; размер графического экрана ldab #3 ; может быть расположен на границе ; 8 байтов в памяти int $2A ; аллокирование памяти для ; экрана cpx #0 ; проверка на ошибку beq error ; ошибка stx grscreen_base ; сохранение адреса rts ; аллокированой памяти error ldx #message ; адрес сообщения об ошибке int $23 ; вывод сообщения rts message db 'Hет свободной памяти', 7, 0 grscreen_base ds 2 ; переменная адреса графического ; графического экран grscreen_size = 8000 ; размер графического экрана при ; Пылдин-601 endp СРОДНЫЕ ФУНКЦИИ: INT_35 - резервирование памяти INT_2B ОСВОБОЖДЕНИЕ ЗАНЯТОЙ ПАМЯТИ Функция освобождения занятой памяти. Освобождение памяти связано с некоторыми ограничениями - см. функцию INT_2A. ИМПОРТ: X - граница освобождаемой памяти - все области занятой памяти, расположенные на меньших адресах (позднее алокированные) будут освобождены ЭКСПОРТ: X - размер освобожденной памяти ПРИМЕР: См. пример функции INT_2A) example_2B proc ldaa #grscreen_size ldab #/grscreen_size ; размер графического экрана adda grscreen_base+1 adcb grscreen_base ; адрес экрана staa grscreen_end+1 stab grscreen_end ; граница экрана ldx grscreen_end int $2B ; освобождение памяти экрана cpx #grscreen_size ; сравнение с размерами экрана beq ok ; все в порядке rts grscreen_base ds 2 ; адрес графического экрана grscreen_size = 8000 ; размер графического экрана grscreen_end ds 2 ; граница графического экрана endp СТОДНЫЕ ФУНКЦИИ: INT_2A - аллокирование памяти INT_2C ОБЪЯВЛЕНИЕ ОБЛАСТИ ПАМЯТИ РЕЗИДЕНТНОЙ Функция объявления уже аллокированной памяти резидентной. При выполнении функции все аллокированные до этого момента области памяти становятся резидентными. Указание резидентности служит для предохранения от освобождения аллокированной памяти. Функция используется в резидентных программах, чей код должен остаться в памяти после завершения их выполнения (например - программы управления внешными устройствами). ИМПОРТ: нет ЭКСПОРТ: нет ПРИМЕР: example_2C proc int $2C ; указание резидентности rts endp СРОДНЫЕ ФУНКЦИИ: INT_2A - аллокирование памяти INT_2B - освобождение памяти INT_2D ПЕРЕНОС СОДЕРЖИМОГО ПАМЯТИ Функция переноса содержимого одной области памяти в другую область. Правильное направление переноса (копирования) в случаях, когда оригинал и копия перекрываются, выбирается автоматически. ИМПОРТ: BA - число копируемых байтов X - указатель 4-байтовой структуры, содержащей адрес оригинала и адрес копии ЭКСПОРТ: X - число скопированных байтов ПРИМЕР: example_2D proc ldx #addrs ; указатель адресов ldab #/count ; старший байт числа байтов ldaа #count ; младши байт числа байтов int $2D ; перенос rts addrs dw source ; адрес оригинала dw target ; адрес копии endp INT_2E ПОЛУЧЕНИЕ ВЕКТОРА Функция получения вектора (адреса и страницы) функции. Рекомендуется получать векторы этим способом ввиду возможности их изменения в результате прерывания. ИМПОРТ: A - номер вектора ЭКСПОРТ: B - страница X - адрес ПРИМЕР: example_2E proc ldaa #$22 ; вектор $22 - вывод символа int $2E ; получение вектора stab page ; запоминание страницы stx addr ; запоминание адреса rts page ds 1 addr ds 2 endp СРОДНЫЕ ФУНКЦИИ: INT_2F - задание вектора INT_2F ЗАДАНИЕ ВЕКТОРА Функция задания вектора (адреса и страницы) функции. Задание вектора другим способом (прямо в оперативной памяти) опасно! ИМПОРТ: A - номер вектора B - страница памяти X - адрес функции ЭКСПОРТ: нет ПРИМЕР: example_2F proc ldaa #$22 ; вектор $22 ldab #0 ; страница, 0 - оперативная память ldx #new_addr ; адрес новой функции int $2F ; задание вектора rts endp СРОДНЫЕ ФУНКЦИИ: INT_2E - получение вектора INT_30 MONITOR Функция вызова системной программы MONITOR. ИМПОРТ: нет ЭКСПОРТ: нет ПРИМЕР: example_30 proc int $30 ; вызов программы MONITOR rts endp INT_31 BASIC Функция вызова BASIC интерпретатора. Запускается BASIC (UniBASIC) интерпретатор, записанный в постоянной памяти (ROM). Функция применяется в случаях работы без дисководов. ИМПОРТ: нет ЭКСПОРТ: нет INT_32 служебная INT_33 резервированная Функция предназначена для использования (Uni)BASIC-ом для интерпретирования строки музикальных комманд. ИМПОРТ: X - указатель строки ЭКСПОРТ: нет СРОДНЫЕ ФУНКЦИИ: INT_6E - выполнение музикальных комманд (одна за другой) INT_6F - воспроизвение ноты INT_34 резервированная Функция предназначена для использования (Uni)BASIC-ом для интерпретирования строки графических команд. ИМПОРТ: X - указатель строки ЭКСПОРТ: нет СРОДНЫЕ ФУНКЦИИ: INT_66 - графические команды INT_35 РЕЗЕРВИРОВАНИЕ ПАМЯТИ Функция резервирования памяти. Предназначена для устранения необходимости выделения больших буферов в самом коде программы. Резервированная память освобождается в конце выполнения программы. Если резервирование невозможно (нет нужной памяти), в качестве действительного размера возвращается 0. ИМПОРТ: BA - размер (в байтах) запрошенной памяти ЭКСПОРТ: BA - действительный размер резервированной памяти X - указатель резервированной памяти ПРИМЕР: example_35 proc ldab #/size ; старший байт размера ldaa #size ; младший байт размера int $35 ; резервирование памяти tstb ; проверка является ли действительный bne ok ; размер различным от 0 tsta beq error ok stx pointer ; сохранение указателя error rts endp СРОДНЫЕ ФУНКЦИИ: INT_2A - аллокирование памяти INT_36 СВОБОДНАЯ ПАМЯТЬ Функция получения объема свободной памяти. ИМПОРТ: нет ЭКСПОРТ: BA - объем в байтах X - начальный адрес ПРИМЕР: example_36 proc int $36 ; получение размера stx addr ; сохранение адреса stab size ; и размера staa size+1 ldx size int $24 ; вывод размера ldx #msg int $23 ; вывод съобщения rts addr ds 2 size ds 2 msg db ' байта(ов) свободные.',13,10,0 endp РЕЗУЛЬТАТ: 47104 байта(ов) свободные. INT_37 ВЫПОЛНЕНИЕ ФУНКЦИИ Функция выполнения заданной вектором функции. Предназначена для выполнения функции, заданной оригинальным вектором. Содержание регистров получается через переменные SWIA, SWIB и SWIX, находящиеся в нулевой странице памяти. Выполнение функции INT_37 соответствует безусловному переходу (JMP). ИМПОРТ: B - страница памяти X - адрес функции ЭКСПОРТ: зависит от выполняемой функции ПРИМЕР: Следующая программа - пример как можно сделать перекодирующую таблицу для печатающего устройства с нестандартным набором символов. Программа остается резидентной в памяти и перекодирует вывод к печатающему устройству. example_37 proc ldaa #$26 ; номер вектора int $2E ; получение оригинального stx addr_26 ; адреса функции для обслуживания stab page_26 ; принтера ldx #new_26 ; адрес новой функции ldab #0 ; страница - 0 (оперативная память) int $2F ; задание нового вектора $26 int $2C ; программа остается ; резидентной int $38 ; конец выполнения page_26 ds 1 ; содержание оригинального ; вектора addr_26 ds 2 swia equ $0006 ; регистр A new_26 tstb ; проверка команды bne call_orig ; это не вывод символа bsr translate ; перекодировка символа(рег.А) staa swia ; передача параметров ldab page_26 ; оригинальный вектор ldx addr_26 int $37 ; выполнение функции translate ; здесь перекодировать rts ; символ в регистре A endp INT_38 ЗАВЕРШЕНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ Функция завершения выполнения текущей программы. Автоматически закрываются все файлы, открытые этой программой и освобождается занятая память. Восстанавливаются прежние значения (до пуска программы) векторов INT 01 - reset, INT 04 - break, INT 07 - critical error, INT 0A - указатель клавиатурных макросов. Существенно для этой функции то, что необязательно восстанавливать стека до ее вызовом. Это означает, что можно вызвать функцию из подпрограммы. ИМПОРТ: Нет ЭКСПОРТ: Нет ПРИМЕР: example_38 org $100 jmp main terminate proc ldx #message int $23 ; вывод стоки int $20 ; считывание символа с ; клавиатуры cmpa #'N' beq return int $38 ; выход из программы return rts message db 'Are you sure (Y/N) ? ', 0 endp main . . jsr terminate . . end INT_39 ВЫПОЛНЕНИЕ СИСТЕМНОЙ КОМАНДЫ Функция для выполнение команды UniDOS-а. Функция вызывает командный интерпретатор UniDOS-а для выполнения заданной команды. ИМПОРТ: X - указатель к ASCIIZ-строки команды ЭКСПОРТ: A - код ошибки ПРИМЕР: show_dir proc ldx #command int $39 tsta bne error rts command db 'DIR *.ASM', 0 endp РЕЗУЛЬТАТ: После выполнения этой подпрограммы на экране будут показаны все файлы с расширением имени .ASM . СРОДНЫЕ ФУНКЦИИ: INT_3А - выход в среду UniDOS INT_3A ВЫХОД В СРЕДУ UniDOS-а Функция выхода в операционную систему UniDOS. Функция приводит к прерыванию выполнения потребительской программы и передаче управления командному интерпретатору UniDOS-а. В диалоговом командном режиме можно применять любые команды операционной системы. Команда EXIT приводит к возвращению управления потребительской программе, по ходу выполнения которой вызвана функция INT_3А. ИМПОРТ: Нет ЭКСПОРТ: Нет ПРИМЕР: exit_to_dos proc int $3A ; выход в UniDOS rts endp СРОДНЫЕ ФУНКЦИИ: INT_39 - выполнение системной команды INT_3B ЧИСЛО ПАРАМЕТРОВ НА КОМАНДНОЙ ЛИНИИ (ARGC) Функция определения числа параметров на командной линии. Функция возвращает в аккумулятор A число введеных на командной линии параметров. Нулевой параметр - имя выполняемой программы. Если нет заданных параметров, функция возвращает 1. ИМПОРТ: Нет ЭКСПОРТ: A - число параметров ПРИМЕР: check_parms_cnt proc ; проверка числа заданных параметров int $3B cmpa #3 ; 2 обязательные параметра ; + 1 для имени программы je valid ldx #message int $23 valid rts endp message db 'Hеправильное число параметров', 0 РЕЗУЛЬТАТ: Если с командной линии не будут введены 2 параметра, то процедура выведет сообщение о неправильном числе параметров. СРОДНЫЕ ФУНКЦИИ: INT_3C - получение параметра с командной линии INT_3C ПОЛУЧЕНИЕ ПАРАМЕТРА С КОМАНДНОЙ ЛИНИИ(ARGV) Функция получения с командной линии значения параметра. Функция позволяет получить с командной линии значение параметра с очередным номером, заданным в аккумуляторе А. Параметром с нулевым номером считается имя программы, вызвавшей функцию. ИМПОРТ: A - Номер параметра X - Указатель 81-байтного буфера в памяти ЭКСПОРТ: Нет ПРИМЕР: print_name proc clra ; параметр 0 - имя программы ldx #buffer ; адрес буфера int $3C ; ARGV ldx #buffer int $23 ; вывод на экран rts endp buffer ds 81 ; 81-байтный буфер РЕЗУЛЬТАТ: Процедура print_name выводить на экран имя выполняемой программы. СРОДНЫЕ ФУНКЦИИ: INT_3B - число параметров на командной линии INT_3D ТЕКСТ ОШИБКИ Функция получения текста системного сообщения. Функция позволяет получить текст системного сообщения (как правило - об обнаруженной ошибке), чей код находится в аккумуляторе A. Если не существует сообщение с заданным кодом, то возвращается сообщение: "Unknown error" . ИМПОРТ: A - Код ошибки X - Указатель 65-байтного буфера в памяти ЭКСПОРТ: Нет ПРИМЕР: delete_file proc ldx #file_name ; имя файла для уничтожения int $4F ; уничтожение файла tsta ; проверка на ошибку beq no_error ; нет ошибки ; обработка ошибки ldx #buffer int $3D ; текст ошибки ldx #buffer int $23 ; вывод no_error rts file_name db 'test.txt', 0 buffer ds 65 ; 65-байтный буфер endp РЕЗУЛЬТАТ: Процедура delete_file уничтожает файл с именем 'TEST.TXT'. Если обнаружится ошибка, процедура выдаст на экране текст сообщения об этом. INT_3E резервированная INT_3F ПОЛУЧЕНИЕ ПОЛНОГО ИМЕНИ ФАЙЛА Получение в <dest> полной файловой спецификации файла, ссылка на который содержится в <src> ИМПОРТ: X - адрес таблицы с содержанием: - src (одно слово) - ссылка на имя файла - dest - адрес выходного буфера с длиной на 64 байта больше длины буфера, указанного src ЭКСПОРТ: A - код ошибки INT_40 ЧТЕНИЕ/ЗАПИСЬ ЛОГИЧЕСКОГО СЕКТОРА Функция чтения и записи логического сектора диска. Допустимы следующие коды операций : 1 - чтение сектора 2 - запись сектора Таблица дополнительных параметров имеет формат: 1W - указатель буфера чтения/записи 1B - номер логического устройства (0 - A:, 1 - B:, ...) 1W - номер логического сектора ИМПОРТ: A - код операции X - указатель таблицы дополнительных параметров ЭКСПОРТ: A - код ошибки ПРИМЕР: read_sector proc ldx #buffer stx table+0 ;адрес буфера ldx sector stx table+3 ;номер логического сектора clr table+2 ;устройство A: ldaa #1 ;операция "чтение" ldx #table int $40 tsta ;проверка на ошибку bne error ;обработка ошибки rts endp write_sector proc ldx #buffer stx table+0 ;адрес буфера ldx sector stx table+3 ;номер логического сектора clr table+2 ;устройство A: ldaa #2 ;операция "запись" ldx #table int $40 tsta ;проверка на ошибку bne error ;обработка ошибки rts endp sector dw 0 table ds 5 buffer ds 512 INT_41 ВЕРСИЯ UniDOS-а Функции получения номера версии операционной системы UniDOS. Если версия UniDOS - 1.0, то после выполнения этой функции в регистре B будет записана 1, а в регистре A - 0. ИМПОРТ: Нет ЭКСПОРТ: BA - номер версии UniDOS-а ПРИМЕР: check_version proc int $42 ; необходимая версия UniDOS-а cmpb #1 bne invalid ; неправильная версия tsta bne invalid ; неправильная версия rts invalid ; реакция на неправильную версию . . endp INT_42 ПОИСК ПЕРВОЙ ЗАПИСИ В ДИРЕКТОРИИ Функция поиска первой записи в директории. Таблица параметров имеет следующий формат : 1 слово - указатель $18-байтного буфера 1 слово - указатель $20-байтного буфера записи из директории 1 слово - указатель ASCIIZ-строки имени файла, которого нужно отыскать. Разрешается использование wildcard (заменителей символов - символы * и ?) в имени файла. Маски обязательных и недействительных атрибутов имеют тот же формат как у байта атрибутов в записи директории. Бит 7 в регистре B служит для запрещения использования wildcard. Если в имени файла пропущен код устройства или не указан полный путь к файлу, этим параметрам присваивается значение по умолчанию. UniDOS находит в директории первую запись (имя файла), которая удовлетворяет заданным условиям. В буфере помещается найденная в директории запись. ИМПОРТ: A - маска обязательных атрибутов B - маска недействительных атрибутов X - указатель таблицы параметров ЭКСПОРТ: A - код ошибки ПРИМЕР: buffer ds $18 dir_entry ds $20 file_name db '*.ASM', 0 table dw buffer dw dir_entry dw file_name\c example_42 proc clra ;все файлы ldab #%00011000 ;за исключением Volume label и ;поддиректории ldx #table int $42 tsta beq found ;найден файл с расширением .ASM cmpa #$0B ;код ошибки Invalid path beq not_found ;нет такого файла bra error ;другая ошибка (например ошибка при ;чтении с диска) . . rts endp РЕЗУЛЬТАТ: Подпрограмма example_42 находит первый файл с разширением имени .ASM на текущем устройстве и в текущей директории. СРОДНЫЕ ФУНКЦИИ: INT_43 - поиск следующей записи в директории INT_43 ПОИСК СЛЕДУЮЩЕЙ ЗАПИСИ В ДИРЕКТОРИИ Функция поиска в директории следующей записи. Таблицы параметров имеет следующий формат : 1 слово - указатель $18-байтного буфера 1 слово - указатель $20-байтного буфера для записа из директории Функция используется после выполнения INT_42. Она находит в директории следующую запись, удовлетворяющую заданным условиям. ИМПОРТ: X - указатель таблицы параметров ЭКСПОРТ: A - код ошибки ПРИМЕР: buffer ds $18 dir_entry ds $20 file_name db '*.ASM', 0 table_42 dw buffer dw dir_entry dw file_name table_43 dw buffer dw dir_entry\c example_43 proc clra ;все файлы ldab #%00011000 ;за исключением Volume label и ;поддиректории ldx #table_42 int $42 loop tsta beq found ;найден файл с расширением .ASM cmpa #$0B ;код ошибки Invalid path beq exit_loop ;нет такого файла bra error ;другая ошибка (например ошибка при ;чтении с диска) found . . ldx #table_43 int $43 bra loop exit_loop rts endp РЕЗУЛЬТАТ: Подпрограмма example_43 находит все файлы с расширением имени .ASM на текущем устройстве и в текущей директории. СРОДНЫЕ ФУНКЦИИ: INT_42 - поиск первой записи в директории INT_44 ЗАМЕНА ТЕКУЩЕГО УСТРОЙСТВА Функция замены текущего дискового устройства на новое. Устройство, код которого записан в регистре A, становится текущим. ИМПОРТ: A - номер устройства ЭКСПОРТ: A - код ошибки ПРИМЕР: change_drive proc ldaa #0 ;устройство A: int $44 tsta ;проверка на ошибку bne error ;обработка ошибки rts . . endp РЕЗУЛЬТАТ: После выполнения подпрограммы change_drive устройство A: становится текущим. СРОДНЫЕ ФУНКЦИИ: INT_45 - получение номера текущего устройства; INT_46 - замена текущей директории; INT_47 - текущая директория INT_45 ПОЛУЧЕНИЕ НОМЕРА ТЕКУЩЕГО УСТРОЙСТВА Функция записи в аккумуляторе А номер текущего устройства. ИМПОРТ: Нет ЭКСПОРТ: A - номер текущего устройства ПРИМЕР: get_drive proc int $45 rts endp РЕЗУЛЬТАТ: Подпрограмма get_drive возвращает в регистр A номер текущего устройства. (0 - A:, 1 - B:, ...) СРОДНЫЕ ФУНКЦИИ: INT_44 - замена текущего устройства; INT_46 - замена текущей директории; INT_47 - текущая директория INT_46 ЗАМЕНА ТЕКУЩЕЙ ДИРЕКТОРИИ Функция замены текущей директории новой. Указанная директория на указанном устройстве становится текущей директории этого устройства. Если в имени директории пропущен номер устройства или не указан полный путь, эти параметры определяются по умолчанию. Максимальная длина полного имени - 64 байта. ИМПОРТ: X - указатель ASCIIZ-строки имени директории ЭКСПОРТ: A - код ошибки ПРИМЕР: buffer ds 64 message db 'Введите имя новой текущей директории : ', 0 change_dir proc ldx #message int $23 ;вывод строки ldx #buffer ;адрес буфера ldab #64 ;длина буфера int $21 ;чтение строки с клавиатуры ldx #buffer int $46 tsta ;проверка на ошибку bne error rts . . endp РЕЗУЛЬТАТ: Подпрограмма current_dir выводит на экране имя текущей директории на устройстве А: . СРОДНЫЕ ФУНКЦИИ: INT_44 - замена текущего устройства; INT_45 - получение номера текущего устройства; INT_47 - текущая директория INT_47 ТЕКУЩАЯ ДИРЕКТОРИЯ Функция получения имени текущей директории. В буфер возвращается имя текущей директории указанного устройства. Имя записано в формате : "path\dirname", 0. ИМПОРТ: A - номер устройства X - указатель буфера имени (макс. 64 байта) ЭКСПОРТ: A - код ошибки ПРИМЕР: buffer ds 64 current_dir proc ldaa #0 ;устройство A: ldx #buffer int $47 tsta ;проверка на ошибку bne error ldx #buffer int $23 ;вывод строки на экране rts . . endp РЕЗУЛЬТАТ: После выполнения подпрограммы, указанная с клавиатуры директория становится текущей. СРОДНЫЕ ФУНКЦИИ: INT_44 - замена текущего устройства; INT_45 - получение номера текущего устройства; INT_46 - замена текущей директории; INT_48 СОЗДАНИЕ ПОДДИРЕКТОРИИ Функция создания поддиректории с указанным именем на указанном устройстве. Если в имени директории пропущен номер дисковода или не указан полный путь, эти параметры определяются по умолчанию. ИМПОРТ: X - указатель имени ЭКСПОРТ: A - код ошибки ПРИМЕР: buffer ds 64 message db 'Ввести имя директории: ', 0 change_dir proc ldx #message int $23 ;вывод строки ldx #buffer ;адрес буфера ldab #64 ;длина буфера int $21 ;чтение строки с клавиатуры ldx #buffer int $48 tsta ;проверка на ошибку bne error rts . . endp РЕЗУЛЬТАТ: Подпрограмма создает поддиректорию с введенным с клавиатуры именем. СРОДНЫЕ ФУНКЦИИ: INT_49 - уничтожение поддиректории INT_49 УНИЧТОЖЕНИЕ ПОДДИРЕКТОРИИ Функция уничтожения указанной директории на указанном устройстве. Если в имени директории пропущен номер дисковода и/или полный путь не указаны, эти параметры определяются по умолчанию. ИМПОРТ: X - указатель ASCIIZ строки имени поддиректории ЭКСПОРТ: A - код ошибки ПРИМЕР: dir_name db 'B:\SUBDIR', 0 remove_dir proc ldx #dir_name int $49 tsta bne error rts . . endp РЕЗУЛЬТАТ: Подпрограмма remove_dir уничтожает директорию B:\SUBDIR. СРОДНЫЕ ФУНКЦИИ: INT_48 - создание поддиректории INT_4A ОТКРЫТИЕ ФАЙЛА Функция открытия файла с указанным именем. Если в имени файла пропущен номер дисковода или не указан полный путь, эти параметры определяются по умолчанию. Таблица параметров имеет следующий формат : 1 слово - указательь ASCIIZ-строки с именем файла 1 слово - указатель буфера файла. Длина буфера $208 байтов. Если этот указатель 0, по умолчанию применяется буфер UniDOS-а. Структура буфера файла: $200 байтов - буфер сектора диска 1 байт - номер устройства 2 байта - номер сектора 1 байт - флаг, указывающий модифицирован ли буфер 1 байт - число открытых файлов в этом буфере Когда открывается первый файл с заданным буфером, номер устройства должно быть $FF (недействительное устройство), флаг модифицирования буфера и число открытых файлов должны быть равны 0. ИМПОРТ: A - код доступа A = 1 - только для чтения A = 2 - только для записи A = 3 - для чтения и записи X - указатель таблицы параметров ЭКСПОРТ: A - код ошибки B - file handle (описатель файла) ПРИМЕР: file_name db 'A:\SUBDIR\MAIN.DTA', 0 table dw file_name ;указатель имени dw 0 ;буфер по умолчанию file_handle ds 1 open_data proc ldaa #1 ;только для чтения ldx #table int $4A tsta ;проверка на ошибку bne error stab file_handle rts . . endp РЕЗУЛЬТАТ: Подпрограмма open_data открывает файл с именем MAIN.DTA, который находится в поддиректории A:\SUBDIR. СРОДНЫЕ ФУНКЦИИ: INT_4B - создание файла INT_4C - чтение из файла INT_4D - запись в файл INT_4E - закрытие файла INT_4B СОЗДАНИЕ ФАЙЛА Функция создания файла с указанным именем. Если в имени файла пропущен номер дисковода или не указан полный путь, эти параметры определяются по умолчанию. Формат таблицы параметров: 1 слово - указатель ASCIIZ-строки с именем файла 1 слово - указатель буфера файла. Длина буфера $208 байтов. Если этот указатель 0, подразумевается буфер UniDOS-а. Формат атрибутов файла : бит 0 = 1 - файл только для чтения (read only) бит 1 = 1 - файл "невидим" (hidden) бит 2 = 1 - системный файл Структура буфера файла: $200 байта - буфер сектора диска 1 байт - номер устройства 2 байта - номер сектора 1 байт - флаг, указывающий модифицирован ли буфер 1 байт - число открытых файлов в этом буфере Когда открывается первый файл с заданным буфером, номер устройства должен быть $FF (недействительное устройство), флаг модифицирования буфера и число открытых файлов должны быть равны 0. ИМПОРТ: A - атрибуты файла X - указатель к таблице с параметрами ЭКСПОРТ: A - код ошибки B - file handle (описатель файла) ПРИМЕР: file_name db 'A:\SUBDIR\MAIN.DTA', 0 table dw file_name ;указатель имени dw 0 ;буфер по умолчанию file_handle ds 1 create_file proc ldaa #0 ;создание нормального файла ldx #table int $4B tsta ;проверка на ошибку bne error stab file_handle rts . . endp РЕЗУЛЬТАТ: Подпрограмма create_file создает файл с именем MAIN.DTA в поддиректории A:\SUBDIR. СРОДНЫЕ ФУНКЦИИ: INT_4A - открытие файла INT_4C - чтение из файла INT_4D - запись в файл INT_4E - закрытие файла INT_4C ЧТЕНИЕ ИЗ ФАЙЛА Функция чтения указанного числа байтов из указанного файла. Формат таблицы параметров: 1 слово - адрес буфера для чтения 1 слово - число байтов для чтения Не всегда число реально прочитанных байтов равен заданному числу. Например, при чтении из стандартного входа (STDIN) вводится одна строка текста. Если после выполнения функции в регистрах A и Х записана 0, это означает, что сделана попытка чтения после конца файла. Это может быть использовано как средство проверки достижения конца файла. ИМПОРТ: A - file handle (описатель файла) X - указатель таблицы параметров ЭКСПОРТ: A - код ошибки X - число прочитанных байтов ПРИМЕР: buffer ds $80 table dw buffer dw $80 example_read proc ldaa #0 ; файл STDIN ldx #table int $4C tsta bne error rts . . endp РЕЗУЛЬТАТ: Подпрограмма читает строку из стандартного входного файла. СРОДНЫЕ ФУНКЦИИ: INT_4A - открытие файла INT_4B - создание файла INT_4C - чтение из файла INT_4E - закрытие файла INT_4D ЗАПИСЬ В ФАЙЛ Функция записи заданного числа байтов в указанный файл. Формат таблицы параметров: 1 слово - адрес буфера записи 1 слово - число байтов записи При нормальной работе число записанных байтов должно быть равно заданному числу. Это условие не будет выполнено, если во время записи обнаружена ошибка. ИМПОРТ: A - file handle (описатель файла) X - указатель таблицы параметров ЭКСПОРТ: A - код ошибки X - число записанных байтов ПРИМЕР: name1 db 'FILE1.DTA', 0 name2 db 'FILE2.DTA', 0 buffer ds $200 open_tbl dw name1 dw 0 create_tbl dw name2 dw 0 read_tbl dw buffer dw $200 write_tbl dw buffer ds 2 handle1 ds 1 handle2 ds 1 copy_file proc ldaa #1 ;доступ для чтения ldx #open_tbl int $4A ;открытие файла tsta ;проверка на ошибку bne error ;обработка ошибки stab handle1 ldaa #0 ;нормальный файл ldx #create_tbl int $4B ;создание файла tsta bne error stab handle2\c loop ldaa handle1 ldx #read_tbl int $4C ;чтение из файла tsta bne error cpx #0 ;проверка на конец файла ;А = 0 и X = 0 beq close_files stx write_tbl+2 ldaa handle2 ldx #write_tbl int $4D ;запись в файл tsta bne error bra loop close_files ldaa handle1 int $4E ;файл закрывается ldaa handle2 int $4E rts . . endp РЕЗУЛЬТАТ: Подпрограмма создает файл с именем FILE2.DTA и копирует в нем содержание файла FILE1.DTA . СРОДНЫЕ ФУНКЦИИ: INT_4C - чтение из файла INT_4E ЗАКРЫТИЕ ФАЙЛА Функция закрытия файла с заданным в регистре A описателем. ИМПОРТ: A - file handle (описатель файла) ЭКСПОРТ: A - код ошибки СРОДНЫЕ ФУНКЦИИ: INT_4A - открытие файла INT_4B - создание файла INT_4F УНИЧТОЖЕНИЕ ФАЙЛА Функция уничтожения указанного файла. Если в имени файла не указано устройство или не указан полный путь доступа, эти параметры принимаются по умолчанию. Имя файла не должно включать заменители символов (wildcard): символы "*" и "?". ИМПОРТ: X - указатель ASCIIZ-строки имени файла ЭКСПОРТ: A - код ошибки ПРИМЕР: file_name db 'DAYS.DTA', 0 delete_file proc ldx #file_name int $4F tsta bne error rts . . endp РЕЗУЛЬТАТ: Программа уничтожает файл с именем DAYS.DTA на текущем устройстве и в текущей директории. INT_50 ПОЗИЦИОНИРОВАНИЕ В ФАЙЛЕ Функция сдвига указателя ввода/вывода на заданную позицию файла. Новая позиция в файле определяется точкой и размером смещения относительно точки. После выполнения функции в буфер Х загружается указатель поля памяти, где записана абсолютная позиция ввода/вывода в файле. ИМПОРТ: A - file handle (описатель файла) B - точка смещения B = 0 - начало файла B = 1 - текущая позиция B = 2 - конец файла X - указатель 4-байтового целого числа, определяющего размер смещения. ЭКСПОРТ: A - код ошибки X - указатель поля памяти, где записана абсолютная позиция ввода/вывода в файле ПРИМЕР: distance db 0, 0, 0, $10 seek proc ldaa handle ldab #2 ;с конца файла ldx #distance int $50 tsta ;проверка на ошибку bne error ;обработка ошибки rts . . endp РЕЗУЛЬТАТ: Программа seek позиционирует указатель ввода/вывода на $10 байтов от конца файла. СРОДНЫЕ ФУНКЦИИ: INT_53 - позиция в файле INT_51 РАЗМЕР ФАЙЛА Функция определения размера указанного файла. Длина файла записывается в буфере в виде 4-байтового целого числа без знака. ИМПОРТ: A - file handle (описатель файла) X - указатель буфера длиной в 4 байта ЭКСПОРТ: A - код ошибки INT_52 СВОБОДНОЕ ПРОСТРАНСТВО НА ДИСКЕ Функция определения размера свободной области на дискете. Размер свободной области дискеты записывается в буфере в виде 4-байтового целого числа без знака. ИМПОРТ: A - номер устройства X - указатель буфера длиной в 4 байта ЭКСПОРТ: A - код ошибки INT_53 ПОЗИЦИЯ В ФАЙЛЕ Функция получения текущего значения указателя позиции. Функция записывает в буфере текущее значение указателя ввода/вывода для указанного файла в виде 4 байтового целого числа без знака. ИМПОРТ: A - file handle (описатель файла) X - указатель буфера длиной в 4 байта ЭКСПОРТ: A - код ошибки СРОДНЫЕ ФУНКЦИИ: INT $50 - позиционирование в файле INT_54 АТРИБУТЫ ФАЙЛА Функция получения/определения атрибутов файла. Формат атрибутов файла одинаковый с форматом записи директории. Не используются только биты 3 и 4 (Volume label, Subdirectory). ИМПОРТ: A - операция A = 0 - определение атрибутов A = 1 - получение атрибутов B - новые атрибуты (если A = 0) X - указатель ASCIIZ-строки имени файла ЭКСПОРТ: A - код ошибки B - атрибуты файла (если A = 1) ПРИМЕР: name db 'MAIN.DTA', 0 example_54 proc ldaa #0 ;определение атрибутов ldab #3 ;read only, hidden ldx #name int $54 tsta ;проверка на ошибку bne error rts . . endp РЕЗУЛЬТАТ: Программа example_54 задает файлу MAIN.DTA атрибуты "только для чтения" и "невидим". INT_55 ДАТА И ВРЕМЯ ФАЙЛА Функция получения/определения времени и даты последней модификации файла. В зависимости от содержания регистра A функция позволяет получить или определить время и дату последней модификации открытого файла. Формат таблицы параметров: 1 слово - пакетированная дата бит 4..0 - день бит 8..5 - месяц бит 15..9 - год - 1980 1 слово - пакетированное время бит 4..0 - секунды / 2 бит 10..5 - минута бит 15..11 - час ИМПОРТ: A - операция A = 0 - получение A = 1 - определение B - file handle (описатель файла) X - указатель таблицы параметров ЭКСПОРТ: A - код ошибки X - указатель таблицы параметров (для A = 0) ПРИМЕР: table ds 4 set_time_date proc ldx #table ldaa #0 ;дата и время получить ldab handle1 int $55 tsta bne error ldx #table ldaa #1 ;определить дату и время ldab handle2 int $55 tsta bne error rts . . endp РЕЗУЛЬТАТ: Второй файл получает дату и время первого файла. INT_56 ПЕРЕИМЕНОВАНИЕ ФАЙЛА Функция изменения имени существующего файла. Имена файла не должны содержать заменители символов - wildcard. Если в именах файлов пропущено устройство или не указан полный путь, эти параметры определяются по умолчанию. Если в старом и новом имени указаны разные пути, то запись о файле переносится в новую директорию. Формат таблицы параметров: 1 слово - указатель ASCIIZ-строки старого имени 1 слово - указатель ASCIIZ-строки нового имени ИМПОРТ: X - указатель таблицы параметров ЭКСПОРТ: A - код ошибки ПРИМЕР: old_name db 'OLDFILE.DTA', 0 new_name db 'NEWFILE.DTA', 0 table dw old_name dw new_name rename proc ldx #table int $56 tsta bne error . . endp РЕЗУЛЬТАТ: Файл OLDFILE.DTA в текущей директории текущего устройства получает новое имя NEWFILE.DTA . INT_57 ЧТЕНИЕ СТРОКИ ИЗ ФАЙЛА Функция ввода строки из текстового файла в память. Если буфер короче строки, символы до конца строки пропускаются. В длине буфера учитывается и завершающая 0. ИМПОРТ: A - file handle (описатель файла) B - длина буфера (в байтах) X - адрес буфера ЭКСПОРТ: A - код ошибки СРОДНЫЕ ФУНКЦИИ: INT_58 - проверка на конец файла INT_58 ПРОВЕРКА НА КОНЕЦ ФАЙЛА Функция проверки достижения конца файла. Функция записывает в регистре B ненулевое значение, если достигнут конец файла. Для текстового файла следует применять эту функцию вместе с INT_57 (чтение строки из файла) для нахождения символа с кодом $1А (control-Z), обозначающего конец текстового файла. ИМПОРТ: A - file handle (описатель файла) B - тип файла: B = 0 - двоичный файл (binary mode) B = 1 - текстовой файл ЭКСПОРТ: A - код ошибки B <> 0 - достигнут конец файла ПРИМЕР: file_name db 'FILE.TXT', 0 open_table dw file_name dw 0 handle ds 1 line ds $41 show_file proc ldaa #1 ;доступ для чтения ldx #open_table int $4A ;файл открывается tsta bne error stab handle loop ldaa handle ldab #1 ;текстовый режим int $58 tsta bne error tstb ;проверка на конец файла bne end_file ldaa handle ldab #41 ldx #line int $57 ;чтение строки tsta bne error ldx #line int $23 ;вывод на экрана ldaa #13 ;переход на новую строку int $22 ldaa #10 int $22 bra loop end_file . . endp РЕЗУЛЬТАТ: Программа show_file выводит на экран содержание файла с именем FILE.TXT, который находится в текущей директории текущего устройства. СРОДНЫЕ ФУНКЦИИ: INT_57 - чтение строки из файла INT_59 резервированная INT_5A ЗАПИСЬ СОДЕРЖИМОГО ВСЕХ БУФЕРОВ ФАЙЛА Запись содержимого всех буферов файла. ИМПОРТ: A - file handle (описатель файла) ЭКСПОРТ: B - код ошибки INT_5B резервированная INT_5C резервированная INT_5D ЗАПУСК ДРАЙВЕРА БЛОКОВОГО УСТРОЙСТВА Функция запуска программы управления (драйвера) блоковыми устройствами. Предусмотрена возможность для запуска не более 8 драйверов. Номера устройств задаются последовательно. Драйверу с номером 0 соответствует устройство A:, с номером 1 - B: и т.д. ИМПОРТ: B - страница, на которой находится драйвер X - адрес пролога драйвера (device driver header) ЭКСПОРТ: A - код ошибки СРОДНЫЕ ФУНКЦИИ: INT_5E - запуск драйвера символьного устройства INT_5E ЗАПУСК ДРАЙВЕРА СИМВОЛЬНОГО УСТРОЙСТВА Функция запуска программы управления (драйвера) символным устройством. При запуске драйвера выполняется инициализация. ИМПОРТ: B - страница, на которой находится драйвер X - адрес пролога драйвера (device driver header) ЭКСПОРТ: A - код ошибки СРОДНЫЕ ФУНКЦИИ: INT_5D - запуск драйвера блокового устройства INT_5F служебная INT_60 АЛЛОКИРОВАНИЕ ГРАФИЧЕСКОГО ЭКРАНА Функция аллокирования (исползуя INT_2A) буфера для графического экрана. ИМПОРТ: нет ЭКСПОРТ: X - адрес графического экрана (0, если нет достаточно памяти) ПРИМЕР: example_60 proc int $60 ; аллокирoвание экрана stx gr_screen int $2C ; экран может быть резидентным ldaa #3 ; черно-белый видеорежим ldx gr_screen int $12 ; инициализация видеорежима rts gr_screen ds 2 endp СРОДНЫЕ ФУНКЦИИ: INT_63 - получение адреса графического экрана INT_61 ОСВОБОЖДЕНИЕ ГРАФИЧЕСКОГО ЭКРАНА Функция освобождения памяти графического экрана. Память графического экрана (если не резидентна) освобождается по окончанию выполнения функции. ИМПОРТ: нет ЭКСПОРТ: нет СРОДНЫЕ ФУНКЦИИ: INT_60 - аллокирование графического экрана INT_62 служебная INT_63 АДРЕС ГРАФИЧЕСКОГО ЭКРАНА Функция для получение адреса текущего (если существует) графического экрана. ИМПОРТ: нет ЭКСПОРТ: BA - размер (в байтах) X - начальный адрес СРОДНЫЕ ФУНКЦИИ: INT_60 - аллокирование графического экрана INT_64 АДРЕС НАБОРА СИМВОЛОВ Функция определения адресов страниц наборов символов (фонтов). Каждый набор символов (фонт) представляет собой 8 страниц х 32 символа х 8 байта. Каждая страница фонта (256 байтов) должна занять полностью одну страницу памяти. ИМПОРТ: A - каждый бит соответствует странице фонта B - начальная страница памяти (соответствует самой нижней странице фонта) ЭКСПОРТ: нет INT_65 КООРДИНАТЫ ГРАФИЧЕСКОГО КУРСОРА Функция получения текущих координат графического курсора. ИМПОРТ: нет ЭКСПОРТ: X - указатель 4-байтового буфера INT_66 ГРАФИЧЕСКИЕ КОМАНДЫ Функция черчения на графическом экране. Координатная система экрана - одинаковая для всех видеорежимов, с началом в верхным левым углом. Горизонтальная координата X принимает значения 0 - 639, а вертикальная координата Y - 0 - 399. В зависимости от видеорежима один пиксел (точка экрана) может имет несколько координат. Для черчения на экране см. также INT_22 - вывод символа на консоль. ИМПОРТ: A - команда (для применения относительных координат необходимо к номеру команды добавить $80) 0 - Mode (Color, Function) - номер цвета (см. INT_12) и номер логической функции +------+--------------------+ | номер| лог.функция | +------+--------------------+ | 0 | P := P | | 1 | P := S xor P | | 2 | P := 1 | | 3 | P := not S | | 4 | P := 0 | | 5 | P := S | | 6 | P := 1 | | 7 | P := not S | | 8 | P := S or P | | 9 | P := not S and P | | 10 | P := not S or P | | 11 | P := not (S and P) | | 12 | P := S and not P | | 13 | P := S and P | | 14 | P := not S and P | | 15 | P := not (S and P) | +------+--------------------+ где: P - выводимое (новое) изображение (Picture), S - старое изображение на экране 1 - Move (X,Y) - новые координаты графического курсора 2 - Line To (X,Y) - изображение линии с текущего до нового положения графического курсора 3 - Point (X,Y) - изображение точки в позиции графического курсора 4 - Circle (R1,R2) - изображение окружности с центром в позиции графического курсора и радиусами R1,R2 (если R1 не равно R2 - изображение эллипсы) 5 - Bar (X,Y) - изображение прямоугольника с противолежащими углами в текущей и в новой позиции курсора 6 - Disc (R1,R2) - изображение заполненной элипсы (окружности) с центром в позиции графического курсора и с радиусами R1 и R2 8 - Shape (Pointer - указатель описателя фигуры, Rotation/Scale - описатель изображения) Описатель фигуры состоит из одного слова, содержащего число байтов описания фигуры (n) и последовательности n байтов. Каждый байт описания содержит: ¦ бит 7 - флажок включения (1) / выключения (0) изображения в процессе передвижения ¦ биты 6,5,4 - направление движения относительно горизонтальной осы в шагах по 45° по часовой стрелке ¦ биты 3,2,1,0 - величина передвижения ($0 - 1 шаг, ..., $F - 16 шагов) Описатель изображения содержит число шагов (по 45°) поворота (биты 6,5,4) и коэффициент масштабирования (увеличения всей фигурой) (биты 3,2,1,0) X - указатель двухсловного поля, содержащего координатную пару (X,Y) или другой параметр, например, длину радиуса окружности ЭКСПОРТ: нет ПРИМЕР: example_66 proc ldx #c1 ldaa #1 ; команда Move int $66 ldx #c2 ldaa #2 ; команда Line To int $66 ldx #c3 ldaa #4 ; команда Circle int $66 ldx #c4 ldaa #8 ; команда Shape int $66 rts c1 dw 0,0 ; верхный левый угол c2 dw 320,200 ; центр экрана c3 dw 100,100 ; радиус 100 c4 dw shape,0 ; фигура квадрата shape dw 4 db $8F,$AF,$CF,$EF endp СРОДНЫЕ ФУНКЦИИ: INT_65 - координаты графического курсора INT_67 РЕДАКТИРОВАНИЕ СТРОКИ Функция редактирования строки. Содержание буфера редактируется до нажатия клавиши RETURN или функциональной клавиши. ИМПОРТ: A - флаг вывода содержания буфера в начале редактирования B - максимальный размер строки, буфер должен быть на 1 байт больше X - адрес буфера. Если буфер пустой, то должен содержать 0 в первой позиции ЭКСПОРТ: A - длина редактированной строки B - скен-код клавиши, нажатием которой закончено редактирование СРОДНЫЕ ФУНКЦИИ: INT_21 - чтение строки с консоли INT_68 ЗАПИСЬ ASCII-СТРОКИ Запись ASCII-строки, завершающаяся символом NULL ( байт с содержанием 0), на STDOUT ( file handle 1) ИМПОРТ: X - адрес строки ЭКСПОРТ: нет INT_69 ЗАПИСЬ СИМВОЛА НА STDOUT Запись символа на STDOUT. ИМПОРТ: A - символ ЭКСПОРТ: нет INT_6A СОЗДАНИЕ ВРЕМЕННОГО ФАЙЛА Функция создания временного файла. ИМПОРТ: A - атрибуты файла ( см. INT_4B) X - адрес таблицы параметров: 1 слово - указатель имени директории, где должен быть создан временний файл. Должно быть предусмотрено пространство памяти для записи имени созданного файла (13 байта) 2 слово - указатель буфера файла ЭКСПОРТ: A - код ошибки B - file handle (описатель файла) INT_6B СОЗДАНИЕ НОВОГО ФАЙЛА Функция создания нового файла. Функция отличается от функции INT_4B только тем, что если указанный файл уже существует, то возникает ситуация "ОШИБКА". INT_6C УРЕЗАНИЕ ФАЙЛА Функция урезания файла до текущей позиции. ИМПОРТ: A - file handle (описатель файла) ЭКСПОРТ: B - код ошибки INT_6D ПОЛУЧЕНИЕ РАЗМЕРА ЭКРАНА Функция получения размера экрана в текущем видеорежиме ИМПОРТ: нет ЭКСПОРТ: A - число колонок B - число строк INT_6E МУЗЫКАЛЬНЫЕ КОМАНДЫ Функция выполнения последовательности из музикальных команд. ИМПОРТ: X - указатель последовательности 3-байтовых команд состоящихся из номера ноты(см. INT_6F), продолжительности ноты и продолжительности паузы в единицах по 7 миллисекунд и 1-байтовых команд: $FE-$F8 для тембра и $FF - для конца последовательности ЭКСПОРТ: нет СРОДНЫЕ ФУНКЦИИ: INT_6F - исполнение ноты INT_6F ИСПОЛНЕНИЕ НОТЫ Функция исполнения ноты. Доступны 6 октав по 12 полутонов или 72 нот. ИМПОРТ: A - нота: 1Ў72, 29 - соответствует ноты ЛА первой октавы, 0 - пауза B - тембр: 1Ў7 X - продолжительность в единицах по 1.536 миллисекунд ЭКСПОРТ: нет СРОДНЫЕ ФУНКЦИИ: INT_6E - выполнение музикальных команд INT_70 ЗАПРЕТ/РАЗРЕШЕНИЕ ДОСТУПА К ФАЙЛУ Запрет/разрешение доступа к части файла (интерфейс описан в документе "U-LAN - Руководство пользователя") Внимание! Функция применима только в составе сетевого программного обеспечения! 4. УПРАВЛЕНИЕ УСТРОЙСТВАМИ И ЛОГИЧЕСКАЯ СТРУКТУРА ДИСКА 4.1. УПРАВЛЕНИЕ УСТРОЙСТВАМИ 85 4.2. ЛОГИЧЕСКАЯ СТРУКТУРА ДИСКА 87 4.1. УПРАВЛЕНИЕ УСТРОЙСТВАМИ UniDOS управляет устройствами двух основных типов: символьным и блоковым. Символьные устройства осуществляют последовательный побайтный ввод/вывод. Примерами таких устройств являются CON и PRN. Устройства этого типа могут быть открытыми в качестве файлов. Блоковые устройства могут осуществять произвольный обмен информацией блоками длиной в 512 байта. У этих устройств нет имен и по этой причине они не могут быть открытыми как файлы. Каждому такому устройству отвечает одна буква латинского алфавита: A, B, и т.д. Операционная система может управлять такими устройствами в количестве до 8, которым отвечают буквы из A до H. Примером блоковых устройств могут служить флоппи-дисковые устройства. В дальнейшем, для краткости изложения, программы управления устройствами будем называть "ДРАЙВЕРАМИ". В соответствии с типами устройств в операционную систему входят и драйверы двух типов: символьные и блоковые. Соответственно, предусмотрены две функции запуска драйферов: INT $5D - запуск драйфера блокового устройства и INT $5Е - запуск драйвера символьного устройства. Каждый драйфер состоит из двух основных частей: блок заголовка и подпрограммы ввода/вывода. ДРАЙВЕР СИМВОЛЬНЫХ УСТРОЙСТВ Формат заголовка: байт 0..7 - имя устройства байт 8..9 - адрес подпрограммы чтения байт 10..11 - адрес подпрограммы записи байт 12..13 - адрес подпрограммы инициализации байт 14..16 - резервированные Блок заголовка должен находиться вне области страничного ROM-а (адреса $C000 до $E000). Имя устройства дополняется до 8 байтов пробелами (символами " "). Подпрограмма чтения: помещает в аккумулятор A считанный символ, если CF = 0. При обнаружении ошибки CF установляется в 1 и в аккумулятор A записывается код ошибки. Подпрограмма записи: в аккумуляторе A должен находиться записываемый символ. При обнаружении ошибки записи CF установляется в 1 и в аккумулятор A записывается код ошибки. Подпрограмма инициализации: вызывается при запуске драйвера. Если инициализация прошла успешно, CF устанавливается в 0. При ошибке CF=1 и в аккумуляторе A записан код ошибки. Если устройство, для которого предназначен драйвер, не осуществляет чтение или запись, то адрес соответствующей подпрограммы должен быть 0. Например, из устройства PRN нельзя читать. Адрес подпрограммы для чтения - 0 и при попытке чтения из PRN возникает ситуация ошибки. ДРАЙВЕР БЛОКОВЫХ УСТРОЙСТВ Формат заголовка: байт 0..1 - адрес подпрограммы инициализаций байт 2..3 - адрес подпрограммы чтения байт 4..5 - адрес подпрограммы записи байт 6 - страница, на которой находятся подпрограммы чтения, записи и инициализации байт 7..8 - адрес буфера (длина $200 байтов) FAT (таблицы файловых атрибутов) байт 9..10 - адрес буфера (длина 66 байтов) текущей директории устройства байт 11..13 - резервированные байт 14..15 - число байтов в секторе (версия 1.XX UniDOS-а не управляет устройствами с секторами с длиной $200 байтов) байт 16 - число секторов cluster-а байт 17 - число резервированных секторов в начале диска байт 18 - число FAT-ов байт 19..20 - максимальное число записей в основной директории байт 21..22 - число секторов устройства байт 23 - идентификатор формата (media descriptor) байт 24 - сектор FAT-а байт 25 - сектор дорожки байт 26 - число головок Блок заголовка должен находится вне области страничного ROM-а (адреса $C000 до $E000). Подпрограмма инициализации вызывается UniDOS-ом при выполнении системной функций INT $42 (нахождение первой записи в директории), если на указанном устройстве нет открытых файлов. Задача подпрограммы - занести в блок заголовка драйвера информацию о виде диска. Если инициализация прошла успешно, подпрограмма устанавливает CF=0. При ошибке CF=1 и в аккумуляторе A - код ошибки. При обращении к подпрограммам чтения и записи UniDOS загружает в регистр X адрес таблицы со следующим форматом: 2 байта - адрес буфера чтения/записи 1 байт - номер устройства (0 - A, 1 - B, ...) 2 байта - номер логического сектора Если чтение или запись прошли успешно, устанавливается CF=0. При ошибке CF=1 и в аккумуляторе А - код ошибки. 4.2. ЛОГИЧЕСКАЯ СТРУКТУРА ДИСКА Для UniDOS-а диск представляет собой последовательность логических секторов. Номерация секторов начинается с 0 - это физический сектор 1, цилиндр 0, сторона 0. Следуют остальные секторы с той же стороны и того же цилиндра. Номерация продолжается секторами цилиндра 0, стороны 1. Следуют секторы цилиндра 1, стороны 0 и т.д. Диск состоит из четырех расположенных последовательно областей: - запись первоначальной загрузки - FAT (таблица файловых атрибутов) - основная директория - область данных ЗАПИСЬ НАЧАЛЬНОЙ ЗАГРУЗКИ Запись начальной загрузки находится в логическом секторе с номером 0. В ней содержится короткая программа, которая загружает командный интерпретатор UniDOS-а. При начальной загрузке этот сектор записывается в память, начиная с адреса $100, и осуществляется переход на адрес $150 (байт $50 сектора начальной загрузки). Кроме программы начальной загрузки в этом секторе записана и таблица основных параметров диска. Она начинается с байта $B и имеет формат: 2 байта - размер секторов (в байтах) 1 байт - число секторов cluster-а 2 байта - число резервированных секторов в начале диска 1 байт - число копий FAT-а 2 байта - максимальное число записей в основной директории 2 байта - число секторов диска 1 байт - идентификатор формата (media descriptor) 2 байта - размер FAT-а (в секторах) 2 байта - число секторов на дорожке 2 байта - число головок устройства Примечание: все двухбайтовые числа в таблице записаны в последовательности: младший байт, старший байт. FAT (Таблица файловых атрибутов) FAT используется DOS-ом для резервирования места на диске. Аллокация происходит по частям, названым cluster-ами. FAT состоит из 12-битовых (1.5 байта) записей для каждого cluster-а диска. Для большей надежности сохраняются две копия FAT-а, расположеные последовательно на диске. Первые две записи (3 байта) имеют специальное предназначение. Первый байт FAT-а предназначен для идентификатора диска. У него могут быть следующие значения: $FF - двусторонный диск, 8 секторов на дорожке $FЕ - односторонный диск, 8 секторов на дорожке $FD - двусторонный диск, 9 секторов на дорожке $FC - односторонный диск, 9 секторов на дорожке Второй и третий байт FAT-а всегда $FF. Записи FAT-а должны иметь следующие значения: $000 - свободный cluster $FF8..$FFF - последний cluster файла $FF0..$FF7 - резервированный cluster ФОРМАТ ЗАПИСИ В ДИРЕКТОРИИ Записи имеют длину 32 байта и следующий формат: БАЙТЫ 0..7 - имя файла. Первый символ (байт) имени файла, если имеет перечисленные ниже значения, служит указателем специальных ситуаций: - значение 0 - запись никогда не была использована; - значение $Е5 - файл иничтожен; - значение $2E - запись служит для описания самой директорий. Эсли и во втором байте записано $2Е, то поле номера cluster-а содержит начальный cluster родительской директорий ($000, эсли это запись основной директории). - все останальные значения - первая буква имени. БАЙТЫ 8..10 - разширение имени файла. БАЙТ 11 - атрибуты файла. Каждый бит этого байта задает определеной атрибут файла: бит 0 - файл только для чтения (read only); бит 1 - файл "невидим"; бит 2 - системненый файл; бит 3 - запись содержит имя тома (volume label) в первых 11 байтах; бит 4 - запись определяет поддиректорию бит 5 - архивный файл Все остальные биты резервированы и должны содержать 0. БАЙТЫ 12..21 - резервированные БАЙТЫ 22..23 - время последней модификации файла. Поле имеет формат: < байт 23 > < байт 22 > 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ч ч ч ч ч м м м м м м x x x x x Где: чч - час (0..23) мм - минута (0..59) xx - секунда / 2 (0..29) БАЙТЫ 24..25 - дата последней модификации файла. Поле имеет формат: < байт 25 > < байт 24 > 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 г г г г г г г м м м м д д д д д Где: гг - год 0..99 (1980..2099) мм - месяц 1..12 дд - день 1..31 БАЙТЫ 26..27 - начальный cluster. Первым записан младший байт номера cluster-а. БАЙТЫ 28..31 - длина файла в байтах. Первым записано младшее слово длины. Оба слова начинаются младшими байтами. ПРИМЕЧАНИЕ: формат и логическая структура диска совместимы с MS-DOS для IBM PC, PC/XT, PC/AT. СТРУКТУРА ВЫПОЛНИМЫХ ФАЙЛОВ В операционной системе UniDOS существуют три типа выполнимых файлов: .JOB - текстовый файл, представляющий собой последовательность команд командного интерпретатора UniDOS-а; .CMD - двоичный выполнимый файл, которой загружается и выполняется с адреса $0100; .PGM - выполнимый файл, представляющий собой программу на Паскале или Ассемблере. Файлы типа .PGM, которые содержат программы ассемблера, могут загружаться и выполняться с начала каждой страницы памяти. В их структуру входит информация об объектах кода, адрес которых должен быть изменен перед выполнением программы. Структура PGM-файлов, содержащих программы ассемблера, следующая: $0000 - magic, должен быть $A55A для программ ассемблера; $0002 - число объектов для релокации; $0004 - смещение истинного кода (тела программы); $0006 - длина истинного кода (тела программы); $0008 - смещение входной точки кода относительно его начала; $000A Ў $000F - резервированные (должны содержать 0); $0010 - начало массива с размером, равным числу объектов для релокаций, и содержащий смещения объектов для релокаций относительно начала кода. ПРИМЕЧАНИЕ: Тип смещения, число и размер - 16-битовые числа без знака (word). 5. СИСТЕМНАЯ ПРОГРАММА MONITOR 5.1. ВЫЗОВ МОНИТОРА 92 5.2. ВИЗУАЛИЗАЦИЯ ПАМЯТИ 92 5.3. МОДИФИКАЦИЯ СОДЕРЖАНИЯ ПАМЯТИ 93 5.4. КОПИРОВАНИЕ ОБЛАСТИ ПАМЯТИ 94 5.5. СРАВНЕНИЕ ОБЛАСТЕЙ ПАМЯТИ 95 5.6. ЗАПУСК И ОТЛАДКА ПРОГРАММ 96 5.7. ПРОВЕРКА И ИЗМЕНЕНИЕ РЕГИСТРОВ 97 5.8. ЗАПИСЬ НА КАССЕТОФОНЕ 98 5.9. ЧТЕНИЕ С КАССЕТОФОНА 98 5.10 ВВОД/ВЫВОД ПО СЕРИЙНОМУ КАНАЛУ 98 5.11 ЗАПИСЬ ФАЙЛА 99 5.12 ЧТЕНИЕ ФАЙЛА 99 5.13 ПЕРЕКОДИРОВКА ЧИСЕЛ 99 5.1. ВЫЗОВ МОНИТОРА В ROM-е компьютера записана программа, названная MONITOR-ом. Она позволяет визуализировать содержание нескольких или всех клеток памяти, изменять содержание памяти, писать программы на машинном коде и прямо передавать их для непосредственного выполнения. При помощи MONITOR-а можно также записать и читать программы и данные на кассетофоне или дискете, перемещать и сравнивать большие массивы байтов и, наконец, можно узнать секреты, записанные в 65536-ом байте памяти. Вызов MONITOR-а можно осуществить несколькими способами. Если система находится в командном режиме операционной системы или если активен интерпретатор BASIC-а, вызов осуществляется командой MON. Из потребительской программы вызов осуществляется системной функцией INT_30 или переходом по адресу $F000 памяти. После завершения действия MONITOR-а управление передается вызвавшей его программе. Промптом программы MONITOR служит символ "" (ромб). После появления на экране промпта и курсора можно вводить команды. Длина комманд MONITOR-а не должна превышать 80 символов. Практически длина ограничена длиной строки экрана - команда должна поместиться полностью на одной экранной строке. Таким образом, если работаете в 40-колонном режиме, команда может занять до 40 символов. Параметрами команд могут служить шестнадцатеричные числа (используются цифры от 0 до 9 и буквы от A до F для значений от 10 до 15). Две шестнадцатеричные цифры могут быть представлены числом от 0 до 255, т.е. числом, помещающимся в одной клетки памяти (байт). Когда вводятся данные, необходимо применять группы из двух шестнадцатеричных цифр. Группой из четырех шестнадцатеричных цифр можно представить числом от 0 до 65535. Если это число имеет смысл адреса, то им можно охватить полное адресное пространство компьютера. Если в данных или адресах есть ведущие нули, их можно пропустить при вводе. Все команды программы MONITOR - односимвольные - буквы латинского алфавита и специальные знаки. Можно пользоваться как строчными так и прописными буквами. Ввод команды завершается нажатием клавиши <RETURN>. 5.2. ВИЗУАЛИЗАЦИЯ ПАМЯТИ Если в качестве команды введен адрес и непосредственно за ним буква P (Print), в результате на экране появится тотже адрес и содержание 8 или 16 (в зависимости от режима - 40 или 80 колонок в строке экрана) последовательных клеток памяти (начиная с клетки с указанным адресом) в шестнадцатеричном (группами из двух цифр) и символном формате. Примерно: 4000P 4000 00 00 00 00 00 00 00 00 F000P F000 3F 30 39 7E F9 88 0F CE ?09~•И + При повторном вводе команды P без параметра будет визуализировано содержание следующих 8 или 16 клеток памяти. Примерно: P F008 00 00 FF E6 2A CE 00 7F ¦*+ PP F010 FF E6 28 CE 37 37 FF E6 ¦(+77 ¦ F018 2A 86 01 B7 E6 29 5F CE *Жч¦)_+ Нажатием клавиши F2 вводится удобная макрокоманда MONITOR-а - PPPPPPPP<RETURN>. В качестве параметра команды P-rint можно ввести начальный и конечный адрес, разделенные точкой, визуализируемой области памяти. Примерно: FFDC.FFE7P FFDC 8F 9A 8B 84 88 8D 20 36 ПЪЛДИН 6 FFE4 30 31 41 00 B2 EF 80 00 01A т¬А 5.3. МОДИФИКАЦИЯ СОДЕРЖАНИЯ ПАМЯТИ Команда модификации (изменения) содержания ячейки памяти имеет формат: [адрес_клетки]=[новое_содержание] Выполните следующий пример: 4000P 4000 00 00 00 00 00 00 00 00 4000=41 Чтобы убедиться в результате, проверьте снова содержание выбранной ячейки: 4000P 4000 41 00 00 00 00 00 00 00 A Одной командой можно модифицировать содержание нескольких ячеек (начиная с ячейки с указанным адресом), если их новое содержание указано последовательностью групп из двух шестнадцатеричных цифр. Группы отделяются пробелами. Пример: 4100=41 42 43 44 4100P 4100 41 42 43 44 00 00 00 00 ABCD Дальнейшее изменение содержания следующих ячеек можно произвести вводом знака команды "=" и последовательности новых значений. Пример: 4200=61 62 63 64 =65 66 67 68 69 4200PP 4200 61 62 63 64 65 66 67 68 abcdefgh 4208 69 00 00 00 00 00 00 00 i Новое содержание ячеек можно ввести и в виде строки символов, предшествуемой кавычкой. Пример: 4300=0D 0A "Hello, world! =7 0 4300PPP 4300 0D 0A 48 65 6C 6C 6F 2C Hello, 4308 20 77 6F 72 6C 64 21 07 world! 4310 00 00 00 00 00 00 00 00 ПРИМЕЧАНИЕ: В Вашем конкретном случае используемые ячейки памяти могут иметь и другое содержание, а не 0 как в приведеных примерах. 5.4. КОПИРОВАНИЕ ОБЛАСТИ ПАМЯТИ Командой копирования содержания одной области памяти в другую область памяти можно обеспечить перенос данных из одной области в другую. Формат команды: [куда]<[откуда]M где: [куда] - начальный адрес области копии; [откуда] - область оригинала в виде: [начальный_адрес].[конечный_адрес]; < - знак копирования; М - команда Move. Следующий пример показывает, как можнo перенести (скопировать) содержание ROM-а в область с начальным адресом $5000 (ROM расположен в области $F000 Ў $FFFF): 5000P 5000 00 00 00 00 00 00 00 00 5000<F000.FFFFM 5000P 5000 3F 30 39 7E F9 88 0F CE ?09~•И + F000P F000 3F 30 39 7E F9 88 0F CE ?09~•И + Во время выполнения команды копирования автоматически определяется направление переноса в случаях перекрытия области оригинала областью копии. В MONITOR-е существует команда "размножения" содержания области памяти, являющаяся разновидностью команды копирования. Команда размножения имеет формат: [начальный_адрес_откуда]<[куда]Z Во время выполнения команды размножения содержание области, ограниченной адресами [откуда] и [начальный_адрес_куда - 1] последовательно копируется в область, ограниченную адресами [начальный_адрес_куда] и [конечный_адрес_куда]. Отметим, что последная копия может быть "обрезанной" из-за нехватки пространства. Например, если необходимо заполнить область $4400 Ў $4410 текстом "hello", нужно сначала ввести его в первую часть области, а потом - размножить в остатке области. 4400="hello 4400P 4400 68 65 6C 6C 6E 00 00 00 hello 4400<4405.4410Z 4400.4410P 4400 68 65 6C 6C 6E 68 65 6C hellohel 4408 6C 6E 68 65 6C 6C 6E 68 lohelloh 4410 65 00 00 00 00 00 00 00 e Команда размножения особенно полезна при необходимости инициализации буферов. 5.5. СРАВНЕНИЕ ОБЛАСТЕЙ ПАМЯТИ Команда сравнения содержания областей памяти позволяет сравнить содержание одной области памяти - [область_1], заданной своими начальным и конечным адресами, с содержанием другой области [область_2], заданной своим начальным адресом. Формат команды: [область_2]<[область_1]V где: [область_1] задается в виде: [начальный_адрес].[конечный_адрес] V - код команды Verify. Если во время сравнения обнаружится различие, появляется сообщение, содержащее адрес в области_1, содержание которого не совпадает с содержанием соответствующей клетки области_2, содержание этого адреса, разделительный символ "|" и содержание клетки области_2. Если не обнаружено различие, выполнение функции не имеет видимого результата. Например, после копирования содержания основного ROM-а (пример копирования памяти), копие не должно отличаться от оригинала: 5000<F000.FFFFM 5000<F000.FFFFV Если изменить одну из клеток и сравнить снова обе области, появится соответствующее сообщение: 5000=0 5000<F000.FFFFV F000 3F|00 5.6. ЗАПУСК И ОТЛАДКА ПРОГРАММ Машинный язык - самый еффективный язык компьютера. Но одновременно - самый неприятный для программирования. Программа MONITOR предлагает некоторые средства для тех, кто чувствует себя предопределенным писать на машинном языке. Вы можете написать программу на машинном языке, но необходимо ввести шестнадцатеричные коды инструкций и операндов при помощи описанных выше команд. Можете визуализировать свою программу, перенести ее из одной области памяти в другую и записать ее на внешнем носителе. Самая важная команда, связанная с программами на машинном языке - это команда G (Go) выполнения программы. Формат команды: [начальный_адрес_программы]G Машинные программы интерпретируются MONITOR-ом в качестве подпрограмм, т.е. они должны завершаться инструкцией RTS, чтобы передать управление программе MONITOR. Следующая примерная программа выводит на экране буквы латинского алфавита: 100=86 41 3F 22 4C 81 5B 26 F9 39 100PP 0100 86 41 3F 22 4C 81 5B 26 ЖA?"LБ[& 0108 F9 39 00 00 00 00 00 00 •9 100G ABCDEFGHIJKLMNOPQRSTUVWXYZ Непривычный шестнадцатеричный код не самое приятное зрелище, когда необходимо прочест программу и отладить ее. Заботясь о себе и своих коллегах, авторы включили в составе MONITOR-а комманду, при помощи которой можно визуализировать инструкцию в ассемблерском виде (дизассемблирование). Команда дизассемблирования U имеет тотже синтаксис и действие, что и команда визуализации памяти P. Существует и макрокоманда, вызываемая нажатием клавиши F1, которая дизассемблирует 8 последовательных инструкций, начиная с текущего адреса. 100.109U 0100 86 41 ldaa #$41 0102 3F 22 int $22 0104 4C inca 0105 81 5B cmpa #$5B 0107 26 F9 bne $0102 0109 39 rts Узнали эти строки? Они представляют собой ассемблерскую форму приведенной выше программы. 5.7. ПРОВЕРКА И ИЗМЕНЕНИЕ РЕГИСТРОВ Программа MONITOR использует системные переменые SWIC, SWIB, SWIA и SWIX для передачи первоначального содержания регистров при запуске машинной программы и для получения содержания регистров при ее завершении (при запуске программы командой G). Содержание регистров можно проверить при помощи команды ?. В результате ее выполнения визуализируется содержание аккумуляторов A и B, индексного регистра X, стекового указателя SP и регистра состояния CC: ? A=00 B=00 X=FFFF SP=BA00 CC=00 ПРИМЕЧАНИЕ: В вашем конкретном случае сoдeржание регистров может быть другое. Приведенные значения в примере произвольные. Сoдeржание регистров можно изменить модификацией системных переменных SWIC, SWIB, SWIA и SWIX, разположенных на адресах $0004, $0005, $0006 и $0007Ў$0008, соответсвенно. Лучший способ - это загрузка регистров при помощи инструкции в программе: 200=86 01 C6 02 CE 03 04 39 200UUUU 0200 86 01 ldaa #$01 0202 C6 02 ldab #$02 0204 CE 0304 ldx #$0304 0207 39 rts 200G ? A=01 B=02 X=0304 SP=BA00 CC=00 При изменении содержания регистров необходимо быть особенно внимательным, чтобы не изменить содержание бита I регистра состояния микропроцессора. Этот бит (бит 4 - маска #$10) запрещает (маскирует) прерывания IRQ к микропроцессору и самовольное его изменение может имет опасный результат. 5.8. ЗАПИСЬ НА КАССЕТОФОНЕ Команда записи на кассетофоне области памяти (данные или программа) содержит начальный и конечный адреса области и командный символ W (Write): 100.109W Перед нажатием клавиши <RETURN> необходимо подготовить кассетофон для записи. После нажатия <RETURN> на кассетофоне записываются синхронизирующий сигнал, начальный и конечный адрес области и, наконец, ее содержание. 5.9. ЧТЕНИЕ ИЗ КАСЕТОФОНА Команда чтения данных из кассетофона может содержать начальный и конечный адрес области памяти, в которой будут записаны данные и символ команды R (Read). Если адреса пропущены, данные будут записаны в той области памяти, откуда были перенесены на кассетофоне. 120.129R или R Прежде, чем нажать клавишу <RETURN> необходимо подготовить кассетофон для воспроизведения и отрегулировать положение пленки таким образом, чтобы головка находилась в секторе, где записан синхронизирующий сигнал. Особо отметим, что при отсутствии данных на пленке, чтение прерывается. 5.10. ВВОД/ВЫВОД ПО СЕРИЙНОМУ КАНАЛУ Микрокомпьютеры "Пълдин" позволяют передачу и прием данных по серийному каналу (процессорная эмуляция). Последовательно передаются начальный адрес области памяти, конечный адрес, содержание области и, если передается программа, стартовый адрес. Команда приема данных не прерывается при отсутствии данных. Синтаксис команд совпадает с синтаксисом команд обслуживания кассетофона. Команда приема определяется символом I (Input), а команда передачи - символом O (Output). 100.109O 120.129I I ВНИМАНИЕ! Обе команды остаются без последствий при выполнении на микрокомпютерах модели "601-А" из-за отсутствия соответствующих системных функций. 5.11. ЗАПИСЬ ФАЙЛА Команда записи в файле на дискете имеет синтаксис: начальный и конечный адреса области, командный символ S (Save) и имя файла (имя может включать спецификацию устройства и директории): 1000.1FFFS MYFILE Если командный интерпретатор UniDOS-а загружен, в случае обнаружения ошибки выводится соответствующее сообщение. 5.12. ЧТЕНИЕ ФАЙЛА Команда чтения данных файла на дискете содержит начальный и конечный адреса области памяти, в которой будут записаны данные, командный символ L (Load) и имя файла: 4000.4FFFL MYFILE Если командный интерпретатор UniDOS-а загружен, в случае обнаружения ошибки выводится соответствующее сообщение. Если размер указанной области меньше размера файла, файл записывается в памяти до заполнения отведенной области. 5.13. ПЕРЕКОДИРОВКА ЧИСЕЛ При вводе числа и нажатии клавиши <RETURN> число выводится на экране в десятичном формате (0Ў65535): FFFF $FFFF = 65535 1000 $1000 = 4096 0 $0000 = 0 Этот механизм может быть использован для визуализации ASCII-кода символа: "@ $0040 = 64 Приложение А. МИКРОПРОЦЕССОР СМ601 (MC6800) А.1. ПРОГРАММНАЯ МОДЕЛЬ 103 А.2. ИНСТРУКЦИИ МИКРОПРОЦЕССОРА 104 А.1. ПРОГРАММНАЯ МОДЕЛЬ МИКРОПРОЦЕССОРА Аккумулятор A 8 битов Аккумулятор B 8 битов Индексный регистр X 16 битов Стековый указатель S 16 битов Програмный счетчик PC 16 битов Регистр статуса P 8 битов 11HINZVC LLLLLL Carry LLLLL- oVerflow LLLL-- Zero LLL--- Negative LL---- Interrupt disable L----- Half carry А.2. ИНСТРУКЦИИ МИКРОПРОЦЕССОРА ------T------------T-----T-----T-----T------T-----T-----T------¦ LMnemoL Operation LIMPLILRELA LIMMEDLDIRECTLINDE LEXTENLHINZVCL L L LED 1 LTIVE2L 2 L 2 LXED 2LDED 3L L +-----+------------+-----+-----+-----+------+-----+-----+------L LABA L A+B -> A L1B 2L L L L L L*.****L LADC AL A+M+C -> A L L L89 2L99 3LA9 5LBD 4L*.****L LADC BL B+M+C -> B L L LC9 2LD9 3LE9 5LF9 4L*.****L LADD AL A+M -> A L L L8B 2L9B 3LAB 5LBB 4L*.****L LADD BL B+M -> B L L LCB 2LDB 3LEB 5LFB 4L*.****L LAND AL A&M -> A L L L84 2L94 3LA4 5LB4 4L..**0.L LAND BL B&M -> B L L LC4 2LD4 3LE4 5LF4 4L..**0.L LASL L shift left L L L L L68 7L78 6L..****L LASL AL shift left L48 2L L L L L L..****L LASL BL shift left L58 2L L L L L L..****L LASR L Aritm shr L L L L L67 7L77 6L..****L LASR AL Aritm shr L47 2L L L L L L..****L LASR BL Aritm shr L57 2L L L L L L..****L LBCC L if C = 0 L L24 4L L L L L......L LBCS L if C = 1 L L25 4L L L L L......L LBEQ L if Z = 1 L L27 4L L L L L......L LBGE L if N ^ V =0L L2C 4L L L L L......L LBGT L Z|(N^V) = 0L L2E 4L L L L L......L LBHI L C | Z = 0 L L22 4L L L L L......L LBIT AL A & M L L L85 2L95 3LA5 5LB5 4L..**0.L LBIT BL B & M L L LC5 2LD5 3LE5 5LF5 4L..**0.L LBLE L Z|(N^V) = 1L L2F 4L L L L L......L LBLS L C | Z = 1 L L23 4L L L L L......L LBLT L N ^ V = 1 L L2D 4L L L L L......L LBMI L N = 1 L L2B 4L L L L L......L LBNE L Z = 0 L L26 4L L L L L......L LBPL L N = 0 L L2A 4L L L L L......L LBRA L uncond L L20 4L L L L L......L LBSR L Brnch SubrtL L8D 8L L L L L......L LBVC L V = 0 L L28 4L L L L L......L LBVS L V = 1 L L29 4L L L L L......L LCBA L A - B L11 2L L L L L L..****L LCLC L 0 -> C L0C 2L L L L L L.....0L LCLI L 0 -> I L0E 2L L L L L L.0....L LCLR L 0 -> M L L L L L6F 7L7F 7L..0100L LCLR AL 0 -> A L4F 2L L L L L L..0100L LCLR BL 0 -> B L5F 2L L L L L L..0100L LCLV L 0 -> V L0A 2L L L L L L....0.L LCMP AL A - M L L L81 2L91 3LA1 5LB1 4L..****L LCMP BL B - M L L LC1 2LD1 3LE1 5LF1 4L..****L LCOM L not M -> M L L L L L63 7L73 7L..**01L LCOM AL not A -> A L43 2L L L L L L..**01L LCOM BL not B -> B L53 2L L L L L L..**01L LCPX L X - M(16) L L L8C* 3L9C 4LAC 6LBC 5L..***.L LDAA L dec adjust L19 2L L L L L L..****L LDEC L M - 1 -> M L L L L L6A 7L7A 6L..***.L LDEC AL A - 1 -> A L4A 2L L L L L L..***.L LDEC BL B - 1 -> B L5A 2L L L L L L..***.L LDES L S - 1 -> S L34 4L L L L L L......L LDEX L X - 1 -> X L09 4L L L L L L...*..L LEOR AL A ^ M -> A L L L88 2L98 3LA8 5LB8 4L..**0.L LEOR BL B ^ M -> B L L LC8 2LD8 3LE8 5LF8 4L..**0.L L-----+------------+-----+-----+-----+------+-----+-----+------- ------T------------T-----T-----T-----T------T-----T-----T------¦ LMnemoL Operation LIMPLILRELA LIMMEDLDIRECTLINDE LEXTENLHINZVCL L L LED 1 LTIVE2L 2 L 2 LXED 2LDED 3L L +-----+------------+-----+-----+-----+------+-----+-----+------L LINC L M + 1 -> M L L L L L6C 7L7C 6L..***.L LINC AL A + 1 -> A L4C 2L L L L L L..***.L LINC BL B + 1 -> B L5C 2L L L L L L..***.L LINS L S + 1 -> S L31 4L L L L L L......L LINX L X + 1 -> X L08 4L L L L L L...*..L LJMP L jump L L L L L6E 4L7E 3L......L LJSR L jump SubrtnL L L L LAD 8LBD 9L......L LLDA AL M -> A L L L86 2L96 3LA6 5LB6 4L..**0.L LLDA BL M -> B L L LC6 2LD6 3LE6 5LF6 4L..**0.L LLDS L M(16) -> S L L L8E* 3L9E 4LAE 6LBE 5L..**0.L LLDX L M(16) -> X L L LCE* 3LDE 4LEE 6LFE 5L..**0.L LLSR L Logic shr L L L L L64 7L74 6L..0***L LLSR AL Logic shr L44 2L L L L L L..0***L LLSR BL Logic shr L54 2L L L L L L..0***L LNEG L 0 - M -> M L L L L L60 7L70 6L..****L LNEG AL 0 - A -> A L40 2L L L L L L..****L LNEG BL 0 - B -> B L50 2L L L L L L..****L LNOP L NoOPerationL01 2L L L L L L......L LORA AL A | M -> A L L L8A 2L9A 3LAA 5LBA 4L..**0.L LORA BL B | M -> B L L LCA 2LDA 3LEA 5LFA 4L..**0.L LPSH AL Push A L36 4L L L L L L......L LPSH BL Push B L37 4L L L L L L......L LPUL AL Pull A L32 4L L L L L L......L LPUL BL Pull B L33 4L L L L L L......L LROL L rol C<-M<-CL L L L L69 7L79 6L..****L LROL AL rol C<-B<-CL49 2L L L L L L..****L LROL BL rol C<-B<-CL59 2L L L L L L..****L LROR L ror C->M->CL L L L L66 7L76 6L..****L LROR AL ror C->A->CL46 2L L L L L L..****L LROR BL ror C->B->CL56 2L L L L L L..****L LRTI L Rtrn IntrptL3B 10L L L L L L******L LRTS L Rtrn SubrtnL39 5L L L L L L......L LSBA L A - B -> A L10 2L L L L L L..****L LSBC AL A-M-C -> A L L L82 2L92 3LA2 5LB2 4L..****L LSBC BL B-M-C -> B L L LC2 2LD2 3LE2 5LF2 4L..****L LSEC L 1 -> C L L L L L L L.....1L LSEI L 1 -> I L L L L L L L.1....L LSEV L 1 -> V L L L L L L L....1.L LSTA AL A -> M L L L L97 4LA7 6LB7 5L..**0.L LSTA BL B -> M L L L LD7 4LE7 6LF7 5L..**0.L LSTS L S -> M(16) L L L L9F 5LAF 7LBF 6L..**0.L LSTX L X -> M(16) L L L LDF 5LEF 7LFF 6L..**0.L LSUB AL A - M -> A L L L80 2L90 3LA0 5LB0 4L..****L LSUB BL B - M -> B L L LC0 2LD0 3LE0 5LF0 4L..****L LSWI L Soft IntrptL3F 12L L L L L L.1....L LTAB L A -> B L16 2L L L L L L..**0.L LTAP L A -> P L06 2L L L L L L******L LTBA L B -> A L17 2L L L L L L..**0.L LTPA L P -> A L07 2L L L L L L......L LTST L M - 0 L L L L L6D 7L7D 6L..**00L LTST AL A - 0 L4D 2L L L L L L..**00L LTST BL B - 0 L5D 2L L L L L L..**00L LTSX L S + 1 -> X L30 4L L L L L L......L LTXS L X - 1 -> S L35 4L L L L L L......L LWAI L Wait IntrptL3E 9L L L L L L.1....L L-----+------------+-----+-----+-----+------+-----+-----+------- ПРИЛОЖЕНИЕ B ОШИБКИ И ДИАГНОСТИЧЕСКИЕ СООБЩЕНИЯ В настоящем приложении приведены в порядке возрастания кодов ошибки и соответствующие им диагностические сообщения. Указаны найболее вероятные причины, если они не очивидны. 0 - No error 1 - Invalid function number - неправильный номер (системной) функции. 2 - Invalid drive - неправильно указан дисковод. 3 - Disk write protected - диск защищен от записи на нем - если необходимо произвести запись/стирание на диске, снимите защитную полоску. 4 - Address failure - ошибка в адресном поле диска - вероятнее всего диск физически поврежден. 5 - Data failure - ошибка в поле данных при обращении к диску - вероятнее всего диск физически поврежден. 6 - General failure - общая ошибка при обращении к диску - вероятнее всего диск не форматирован или произошла хардверная ошибка. 7 - Invalid sector - неправильно указан сектор (диска). 8 - резервированная 9 - Invalid media type - неправильный тип (формата) дискеты. 10 - FAT failure - ошибка в FAT-е (в таблице описаний файлов). 11 - Path not found - не найдена (указанная) траектория. 12 - резервированная 13 - Too many open files - число открытых файлов больше допустимого - вероятно сделана попытка открыть файл, когда уже открыты столько файлов, сколько указано командой HANDLES. 14 - Access denied - доступ отказан - попытка выполнить над файлом запрещенную его атрибутами операцию. 15 - File already open - файл (указанный) уже открыт. 16 - Invalid file handle - неправильный описатель файла. 17 - Disk full - диск заполнен. 18 - File lost in directory - запись файла в директории потеряна (повреждена). 19 - Invalid name - неправильное имя. 20 - Root directory full - главная директория заполнена. 21 - Directory exists - указанная директория уже существует. 22 - Attempt to remove the current directory - попытка удалить текущую директорию. 23 - Directory not empty - указанная директория не пуста. 24 - Bad LSEEK position - неправильная позиция передвижения головки диска. 25 - резервированная 26 - Not disk file - не дисковый файл - ожидается указание дискового файла - вероятнее всего попытка применения резервированного имени. 27 - Too many drivers installed - запущено максимально допустимое число драйверов (управляющих программ). 28 - Not same device - не то устройство - проверьте синтаксис команды. 29 - File exists - файл (указанный) существует. 30 - Printer timeout - принтер на реагировал за положенное время - вероятнее всего принтер на включен или еще не выполнил предидущую команду. 31 - Printer general failure - общая ошибка при обращении к принтеру - вероятнее всего принтер на включен. 32 - Printer out of paper - кончилась бумага принтера. 33 - AUX: timeout - до конца контрольного времени обмен не реализован. 34 - AUX: parity - контроль по четности/нечетности показал ошибку приема/передачи. 35 - AUX: overrun - перекрытие байтов, идущих по серийному интерфейсу. 36 - AUX: framing - хардверная ошибка серийного интерфейса. 37 .. 63 - резервированные 64 - Invalid number of parameters - неправильное число параметров. 65 - Bad command or file name - неправильная команда или неправильно введенное имя файла. 66 - Insufficient memory - оперативная память не хватает (для выполнения программы). 67 - Failure in .PGM file - ошибка при запуске .PGM файла - вероярнее всего - поврежение .PGM файла. 68 - Language not available - язык недоступен - вероятнее всего попытка вызвать несуществующий компилятор языка программирования. 69 - Cannot execute .CMD file - нельзя выполнить .CMD файла - чаще всего - уже стартирован .CMD файл. 70 - File cannot be copied onto itself - нельзя копировать файл на себя. 71 - File opening failure - ошибка при открытии файла. 72 - File creation failure - ошибка при создании файла. 73 - File not found - файл (указанный) не найден. 74 - Invalid parameter - неправильный параметр. 75 .. 127 - резервированные | | РЕГИСТРАЦИОННАЯ КАРТА | | При помощи настоящей регистрационной карты, Вы будете | регистрирован в качестве пользователя базового программного | обеспечения микрокомьпютеров ПЫЛДИН 601/601А. Регистрация | обеспечит Вам бесплатное получение актуальной информации - новые | продукты, новые версии существующих продуктов, обмен программными | продуктами и идеями между отдельными пользователями. | | Просьба, заполнить карту печатным шрифтом, вырезать лист по | пунктиру и выслать в почтовом конверте. | |---------------------------------------------------------------------- | | | Имя, Фамилия: ________________________________________________ | | (Организация, отдел): ________________________________________ | | Улица, - _____________________________________________________ | | Город, Область: ______________________________________________ | | Государство, п.код: __________________________________________ | | | | Пожалуйста, отметьте какие базовые программные продукты есть у Вас: | | Программный продукт: ___________________________________________ | --T-T-T-T-T-T-¦ --T---¦ | Серийный номер дискеты: L-+-+-+-+-+-+-- Версия: L-+-+-- | | | Программный продукт: ___________________________________________ | --T-T-T-T-T-T-¦ --T---¦ | Серийный номер дискеты: L-+-+-+-+-+-+-- Версия: L-+-+-- | | | | Пожалуйста, отметьте програмные продукты, о которых Вы желаете | получить информацию: | | UniBIOS - базовая система ввода/вывода | UniDOS - дисковая операционна системма | UniBASIC - интерпретатор языка BASIC | UniPASCAL - компилятор языка Pascal | UniED - текстовый экранный редактор | UniASM - ассемблер СМ601 (MC6800) | UniCROSS - кросс-ассемблер СМ601, для компьютеров типа IBM/PC | EduLan - гетерогенная локальная компьютерная сеть | UniBASE - система управления реляционной базой данных | (совместимая с dBASE III) | | | Пожалуйста, напишите в каких програмных продуктах и/или | технических средствах (интерфейсах) Вы нуждаетесь: | | _______________________________________________________________ | | _______________________________________________________________ | | _______________________________________________________________ | | _______________________________________________________________ | | | | | Пожалуйста, дайте Ваши рекомендации для развития | программного обеспечения микрокомпьютеров ПЫЛДИН 601/601А: | | _______________________________________________________________ | | _______________________________________________________________ | | _______________________________________________________________ | | _______________________________________________________________ | | | | Пожалуйста, отметьте на каком языке желаете получать | информацию: | | 1.болгарский 2.русский 3.английский 4. ____________ | | | | | | Посылайте карту по адрессу : | | ----------------------------------¦ | L L | L НИПЛ "Програмно осигуряване" L | L бул. "Ленин" - 125 блок 1 L | L (Студентски общежития) L | L София 1113 L | L БОЛГАРИЯ L | L L | L---------------------------------- |