``` Аннотация Уважаемый пользователь ПК "Вектор-06ц"! Перед тем, как Вы начнете изучение данной документации, хотелось бы об'яснить Вам, для кого и для чего она напи - сана, и какой круг вопросов освещает. Первое знакомство с азами программирования начинается, как правило, с язы - ка Бейсик. И это, наверное, правильно: на этом этапе пользователю совсем необязательно знать устройство своего компьютера. По мере накопления опыта программирования, а также появления новых инструментальных средств, програм- мист начинает работать на других, более совершенных языках и системах. Но даже на этом уровне, у многих остается чувство "неполной власти" над своим компью - тером. Т.к. даже полное знание языка Ассемблера не дает ответа на некоторые вопросы, связанные с программированием внутренней аппаратуры машины. Да и чисто человеческое любопытство остается неудовлетворенным. Сложность самостоятельного понимания этих вопросов заключается в том, что пользователю-программисту необходимо хорошо знать электронику и отлично раз- бираться в принципиальной электрической схеме своего компьютера. Поэтому, многие программисты тратят огромное количество времени на выяснение этих тон - костей. Цель этого описания - избавить программиста от кропотливого труда и дать ему сразу конечный продукт этих изысканий на конкретных примерах программ. Описание будет очень полезно и тем, кто уже имеет опыт работы на других ком - пьютерах, а сейчас стал заниматься "Вектором". Теперь о формате данного описания: оно представляет собой листинг программ на языке Ассемблера с подробными комментариями в каждой строке. Чтобы ввести его в компьютер, Вам необходимо загрузить МОНИТОР-ОТЛАДЧИК и после его запус - ка выбрать режим "2". Затем через директиву "R" монитора-отладчика, ввести программу "Редактор-Ассемблер" и, пользуясь им, ввести текст программы без комментариев - т.е. только команды ассемблера. А точки с запятой и весь текст за ним не печатать - т.к. весь текст просто не поместится в память при режиме монитора "2", да и комментарии у Вас уже распечатаны. Для тех, кто пока еще не работал с редактором-ассемблером, в Приложении 1 дана распечатка машинных кодов этой программы, работающая только с монитором (или вообще автономно). Начинается и запускается эта программа с адреса 0100h. Для изменения парамет - ров дана распечатка таблицы меток. Данную программу можно использовать как учебную - т.е. изменять ее, транс - лировать и наблюдать работу. Но можно делать на ее базе свою программу, осо - бенно, если Вам нужен минимальный об'ем (например такую программу, как ТЕСТ ТЕХРПОГОНА - всего 4 блока) или когда об'ем графики или данных в Вашей прог - рамме не позволяет использовать Стандартные Драйверы Устройств. Опытные программисты могут использовать листинг программы как справку по программированию ПЭВМ "Вектор-06ц". ;**************************************************************** ; Программирование режимов ПЭВМ "Вектор-06ц" на языке Ассемблера. ; Секреты "Вектора"-1992г. Лебедев А.З. ; 400119, Волгоград, А/Я 2684. ;**************************************************************** ; ; У многих владельцев ПЭВМ "Вектор-06ц" наверняка возникало желание попро - ;бовать свои силы в программировании на языке Ассемблера, но это начинание ;сразу же наталкивалось на необходимость программной установки режимов ПЭВМ: ;цветов изображения, фона, бордюра, управление скроллингом экрана, выводом ;звука и опросом клавиатуры. ; Возможно, предлагаемая программа поможет Вам преодолеть этот барьер. ; ; Запуск программы: Сейчас Вы имеете Т Е К С Т программы с комментариями. ;Прежде чем запустить, его надо оттранслировать в машинные коды, для этого: ;нажмите клавишу "СТР" и, после появления надписи "АССЕМБЛЕР", нажмите 3. ;Появится число, показывающее конец машинных кодов этой программы, а начина- ;ется она с адреса 1800h. Далее, нажмите клавишу "ВК" и, тем самым, выйдите ;в МОНИТОР. Запустите программу командой G1800, по окончанию она вызовет ;РЕДАКТОР. В РЕДАКТОРе нажмите на клавишу "АР2" и затем "B" - и Вы снова ;увидите этот текст. Теперь Вы можете изменять текст программы, затем трансли- ;ровать ее в машинные коды, запускать и наблюдать работу. ; Подпрограммы "Start" и "INIT" пока не трогайте - чтобы их усовершенство- ;вать Вам надо хорошо знать аппаратную часть машины т.к. они и выполняют всю ;настройку (инициализацию) ПЭВМ и нужны именно для того, чтобы Ваши программы ;в машинных кодах могли работать на ПЭВМ "Вектор-06ц". ; Свою программу располагайте с метки "PROGRM:" и, если Вы будете запускать ;ее из МОНИТОРА, устанавливайте стек 53FFh, чтобы не стереть монитор. ; ; Для успешной работы Вам необходимо всегда иметь под рукой описание ;МОНИТОРА-ОТЛАДЧИКА, АССЕМБЛЕРА-РЕДАКТОРА, описание работы ПЭВМ "Вектор-06ц" ;и, желательно, справочник по программированию БИС 580ВВ55 и 580ВИ55. ; ; Начало программы: Как Вы заметили, многие программы на "Векторе" могут пе- ;резапускаться после нажатия на клавиши "БЛК" и "СБРОС". После нажатия на эти ;клавиши счетчик комант процессора указывает на адрес 0000h - то есть именно ;с этого адреса начнется выполнение программы. Поэтому, если Ваша программа ;начинается не с нулевого адреса, а Вы хотите иметь ее перезапуск, Вам необ- ;ходимо установить по адресу 0000h переход на Вашу программу. Кроме того, Вам ;надо установить переход на обработку прерывания с адреса 0038h на адрес, где ;начинается программа INIT (о которой будет сказано далее). Если в Вашей сис- ;теме есть электронный диск (КВАЗИДИСК), или Вы хотите чтобы Ваши программы ;нормально запускались как на обычном "Векторе", так и на "Векторе" с квази- ;диском, то Вам необходимо при старте Вашей программы отключить обращение к ;ОЗУ квазидиска. Эти начальные установки выполняются в участке программы с ;меткой "Start". ; ORG 1800h ; Определить начало машинных кодов этой программы Start: DI ; Запретить прерывания (т.к. пока не ясно куда переход) MVI A,0C3h ; установить переход (код команды JMP) в STA 0000h ; нулевой адрес и STA 0038h ; адрес вызова прерывания. LXI H,Progrm ; Установить адрес перехода по "БЛК","СБРОС" SHLD 0001h ; (сразу после кода команды JMP) LXI H,Init ; Установить адрес перехода на обработку прерывания SHLD 0039h ; (также после JMP) XRA A ; Этой командой проще всего записать в аккумультор ноль OUT 10h ; и пересылкой кода 00h в порт 10h отключить квазидиск EI ; Резрешить прерывания, т.к. переходы установлены JMP PROGRM ; Перейти на начало программы ; ; Теперь поговорим о прерывании, т.к. для многих это довольно темный вопрос. ;Микропроцессор 580ВМ80, которым обладает "Вектор" и ряд других бытовых ком- ;пьютеров, имеет, так называемый ВХОД запроса прерывания. Если на этот вход ;будет подан сигнал, то процессор, независимо от того, в каком месте памяти он ;выполнял программу, сделает переход на один из восьми фиксированных адресов, ;точнее не переход, а вызов подпрограммы, после выполнения которой он благопо- ;лучно вернется на тот адрес, с которого произошло П Р Е Р Ы В А Н И Е основ- ;ной программы. Вас, как программиста, не должно это очень пугать - т.к. у ;"Вектора" задействован только один такой адрес - 0038h, а вход запроса преры- ;вания Вам программно недоступен. Так что же вызывает прерывание? Прерывание ;вызывает схема компьютера, дающая импульсы синхронизации для Вашего дисплея ;(телевизора). Этот импульс, а, следовательно, и вызов подпрограммы по 0038h ;адресу происходит 50 раз в секунду, в моменты обратного хода кадровой раз- ;вертки, т.е. моменты, когда экран вашего дисплея погашен (если Вы думали что ;экран телевизора светится всегда, Вы ошибались - подвигайте быстро рукой пе - ;ред экраном и Вы увидите строб-эффект, связанный с миганием экрана). ; Вполне возможно, что у Вас возникнет вопрос - зачем это надо: вызывать ;подпрограмму, обращение к которой Вы в программе нигде не ставите? Да еще де- ;лать это так часто, и почему в "темное" для экрана время? ; Ну вообще-то такое прерывание существует во всех профессиональных ЭВМ т.к. ;это очень удобная вещь для подсчета реального времени. В самом деле: ведь ;если в программе обработки прерывания организовать счетчик, который будет ;увеличивать через каждые 50 прерываний - это будет точный счетчик секунд, ;ну, а значит, и все остальное (время и дата) сделать тоже просто. И эти часы ;будут работать вместе с Вашей программой, абсолютно не мешая ей! ; Но иногда, такая полезная вещь как прерывание, становится ненужной: при ;работе со стеком (можно потерять адрес возврата из прерывания), или когда ;Вам необходимо "выжать" всю скорость из компьютера. В таких случаях прерыва - ;ние можно запретить командой DI, а вновь разрешить командой EI. ; ; А конкретно для "Вектора" прерывание имеет еще большее значение: устано- ;вить цвет экранных плоскостей и опросить клавиатуру можно лишь во время пре- ;рывания, иначе будет дергаться изображение, т.к. микросхема, к которой под- ;ключена клавиатура, управляет и цветом бордюра, и скроллингом (вертикальным ;перемещением экрана). ; Чтобы было более понятно, опишем, чем должна заниматься программа обработ- ;ки прерывания: ; ;1). Сохранить все регистры микропроцессора, чтобы прерванная программа могла ;нормально продолжтиь свою работу. ; ;2). Записать в ОЗУ цветогенератора (порт 0Ch) шестнадцать байт, которые обыч- ;но называют таблицей цветов. При записи надо переключать по порядку адрес ОЗУ ;цветогенератора - адресные шины этого ОЗУ подключены к четырем младшим разря- ;дам порта 02. ; ;3). Опросить клавиатуру (кроме клавиш "УС","СС","РУС/LAT"), которая подключе- ;на в виде матрицы 8x8 к портам 03h и 02h. Причем опрос клавиш производится ;следующим образом: только на один бит порта 03h можно подавать лог."0" и за- ;тем читать состояние линейки из восьми клавиш из порта 02h. Чтобы опросить ;все клавиши надо последовательно подавать лог."0" на все биты порта 03h и по- ;следовательно читать состояние каждой линейки из порта 02h. ; ;4). После записи таблицы цветов и опроса клавиатуры надо установить режимы ;отображения информации на время вывода ее на дисплей (до следующего прерыва - ;ния): ;4.1). Установить на четырех младших битах порта 02h номер цвета (от 0 до 15) ;бордюра. ;4.2). Записать в порт 03h байт, значение которого определяет вертикальное по- ;ложение экрана. Фактически это номер строки, с которой начнется отображение ;информации на экране. Правда, этот номер должен быть записан в порт 03h в ин- ;версном виде. Например: надо получить нормальное положение экрана (не сдвину- ;тое по вертикали), значит в порт 03h надо занести номер 0-й строки, но инвер- ;тированный - т.е. FFh. ; ;5). Записать в третий бит порта 01 сигнал управления индикатором "РУС/LAT" и ;в первый бит порта 01 сигнал управления реле (в некоторых "Векторах" это реле ;отсутствует, т.к. далеко не каждый пользователь подключает двигатель своего ;магнитофона через это реле). ; ;6). Вернуть из стека все регистры микропроцессора, разрешить прерывания и ;выйти из подпрограммы обработки прерываний командой RET, как при выходе из ;обычной подпрограммы. ; ; Для того, чтобы удобно было менять задаваемые в прерывании режимы компью- ;тера, надо под эти параметры отвести соответствующие ячейки памяти и исполь- ;зовать их как системные ячейки из своей основной программы. В самом деле, бу- ;дет значительно удобнее и понятнее, если, например, для изменения цвета ка- ;кой-либо плоскости экрана или цвета бордюра, Вам надо будет лишь изменить ;значение ячейки памяти с соответствующей меткой - "COLR" или "BORDER", совер- ;шенно не думая об адресах портов. Итак, определим эти ячейки: ; ; Border: DB 15 ;Цвет бордюра (сейчас соответствует цвету 15) Color: DB 00h ;Цвет фона (задан черный цвет) ; COLR1: DB 07h ;Цвет плоскости E000-FFFF (задан ярко-красный цвет) COLR2: DB 38h ;Цвет плоскости C000-DFFF (задан ярко-зеленый цвет) COLR3: DB 16h ;Цвет совмещения E000-FFFF и C000-DFFF (кирпичный) COLR4: DB 0C0h ;Цвет плоскости A000-BFFF (задан ярко-синий цвет) COLR5: DB 86h ;Цвет совмещения A000-BFFF и E000-FFFF (малиновый) COLR6: DB 20h ;Цвет совмещения A000-BFFF и C000-DFFF (темно-зеленый) COLR7: DB 0C5h ;Цвет совм.A000-BFFF,C000-DFFF,E000-FFFF (фиолетовый) COLR8: DB 3Fh ;Цвет плоскости 8000-9FFF (ярко-желтый цвет) COLR9: DB 04h ;Цвет совмещения 8000-9FFF и E000-FFFF (темно-красный) COLR10: DB 52h ;Цвет совмещения 8000-9FFF и C000-DFFF (серый) COLR11: DB 98h ;Цвет совм.8000-9FFF,C000-DFFF,E000-FFFF (бирюзовый) COLR12: DB 80h ;Цвет совм.8000-9FFF,A000-BFFFF (темно-синий) COLR13: DB 24h ;Цвет совм.8000-9FFF,A000-BFFF,E000-FFFF (темно-желтый) COLR14: DB 0ffh ;Цвет совм.8000-9FFF,A000-BFFF,C000-DFFF (ярко-белый) COLR15: DB 0f7h ;Цвет совм.8000-9FFF,A000-9FFF,C000-DFFF,E000-FFFF (гол.) ; ; ; Номер байта в таблице цветов - это математический код цвета (т.е какой из ;16-ти байт цветогенератора?), а значение этого байта - это физический код ;цвета. Физический код цвета кодируется очень просто и Вы можете присвоить лю- ;бой другой цвет, любой из плоскостей или любому из их сочетаний, а также ;цвету фона. Кодировка такая: младшие три бита - яркость красного цвета (на- ;пример 07h - самый яркий красный, а 01h - самый темный), следующие три бита - ;яркость зеленого, два самых сташих бита - яркость синего. Смешивая значения ;яркостей (соответствующих им битов) цветов, можно получить до 255 различных ;цветов и оттенков для каждой плоскости и их любых сочетаний. ; ; Scroll: DB 0FFh ;ячейка скроллинга экрана (сейчас нормальное положение) KeyKod: DB 0FFh ;ячейка в которой будет код нажатой клавиши ; ; ; В данной программе, с целью ее упрощения, реализован опрос только одной ;линейки клавиш, где расположены клавиши курсора (кроме диагональной), а также ;клавиши "ВК", "ПС", "ЗБ" и "ТАБ". Если ни одна из этих клавиш не нажата, то ;в ячейке "KeyKod" будет 0FFh. Если какая-либо из клавиш этой линейки нажата, ;то в ячейке "KeyKod" будет код этой клавиши, но его не надо путать со стан- ;дартным кодом (ASCII или КОИ) - это физический код пересечения одной линии ;порта 03h с одной из 8-ми линий порта 02h. Чтобы было проще проверять в ос- ;новной программе эти коды, надо определить их через соответствующие метки: ; ; Down: EQU 7Fh ;Код клавиши "Курсор вниз" Up: EQU 0DFh ;Код клавиши "Курсор вверх" Right: EQU 0BFh ;Код клавиши "Курсор вправо" Left: EQU 0EFh ;Код клавиши "Курсор влево" Del: EQU 0F7h ;Код клавиши "ЗБ" CR: EQU 0FBh ;Код клавиши "ВК" LF: EQU 0FDh ;Код клавиши "ПС" TAB: EQU 0FEh ;Код клавиши "ТАБ" ; IndRUS: DB 00h ;Признак вкл.индикатора "РУС/LAT"(00-не горит, 08-горит) Rele: DB 00h ;Признак вкл.реле упр. магн. (02-выкл, 00-включено) ; ;================================== ;Подпрограмма обработки прерывания. ;================================== ; INIT: PUSH H ;Сохранить все регистры в стеке PUSH B ; PUSH D ; PUSH PSW ; MVI A,88h ;Установить режимы портов: 02 - вывод, 03 - вывод OUT 00 ;мл.4 бита порта 01 - вывод, старшие 4 бита - ввод LXI H,COLR15 ;в пару "HL" - адрес последнего цвета таблицы цветов MVI D,16 ;в "D" - счетчик колич. устанавл. цветов (размер табл) MVI E,15 ;в "E" - адрес для записи в ОЗУ цветогенератора INIT1: MOV A,E ;установить адрес ОЗУ цвета через OUT 02 ;порт 02 MOV A,M ;взять в "A" байт (физический код) цвета из таблицы цветов OUT 0Ch ;записать этот байт в ОЗУ цветогенератора и повторить OUT 0Ch ;несколько раз для надежной записи по одному адресу, OUT 0Ch ;т.к. в некоторых "Векорах" наблюдается очень плохая OUT 0Ch ;запись в ОЗУ цветогенератора и лучше подстраховаться. OUT 0Ch ; DCX H ;уменьшить адрес-указатель в таблице цветов OUT OCh ; DCR E ;уменьшить адрес для ОЗУ цветогенератора OUT 0Ch ; DCR D ;уменьшить счетчик байт в таблице цветов OUT 0Ch ; JNZ INIT1 ;если не вся таблица записана в цв.ген. - продолжать MVI A,8Ah ;установить режимы портов 02-ввод, 03-вывод OUT 00 ;мл. 4 бита порта 01 - вывод, старшие 4 бита - ввод MVI A,0FEh ;установить в младшем разряде порта 03 нулевой потенциал OUT 03 ;чтобы опросить 1-ую линейку клавиатуры (курсоры и т.д.) IN 02 ;взять из порта 02 физич. код нажатия клавиш линейки STA KeyKod ;поместить этот код в ячейку "KeyKod" MVI A,88h ;установить режимы портов 02-вывод, 03-вывод OUT 00 ;мл. 4 бита порта 01 - вывод, старшие 4 бита - ввод LDA Border ;взять цвет бордюра ячейки "Border" (матем. код) и OUT 02 ;установить цвет бордюра на 4-х младших битах порта 02 LDA Scroll ;взять из ячейки "Scroll"вертикальное положение экрана OUT 03 ;и установить в порт 03 LDA IndRus ;взять признак включения индикатора "РУС/LAT" MOV B,A ;временно поместить в регистр "B" LDA Rele ;взять признак включения реле из ячейки "Rele" и ORA B ;об'единить с признаком включения индикатора "РУС/LAT" OUT 01 ;вывести сигналы управления индикатором и реле в порт 01 POP PSW ;вернуть все регистры из стека POP D ; POP B ; POP H ; EI ;разрешить прерывание (иначе оно будет только один раз) RET ;вернуться к выполнению прерванной программы ; ; Для тех, кто не знаком с программированием микросхемы параллельного адап- ;тера 580ВВ55, конечно, не понятны команды типа MVI A,88h и затем OUT 00. Эта ;микросхема как раз и представляет в ПЭВМ "Вектор-06ц" порты с номерами 00,01, ;02 и 03. Записью определенных кодов в порт 00 осуществляется управление рабо- ;той (переключение на ВВОД или ВЫВОД) остальных портов - 01, 02, 03. ; Если Вас устраивает такое об'яснение и пример в программе - какими кодами ;были сделаны необходимые переключения, то можете на этом успокоиться. Если ;нет - необходимо справиться в соответствующей литературе. ; Порту 01 соответствует канал "C", 02 - канал "B", 03 - канал "A" 580ВВ55. ; ; На этом самые "темные" вопросы ПЭВМ "Вектор-06ц", пожалуй, заканчиваются, ;особенно для тех, кто имел опыт программирования на языке ассемблера микро- ;процессора 580ВМ80 для других ПЭВМ, не имеющих программируемого цветогенера- ;тора и аппаратных прерываний. Можно сделать вывод, что для "Вектора-06ц" ;очень важны ячейки 0000h-0002h и 0038h-003Ah (старт по "БЛК"+"СБРОС" и пере- ;ход на прерывание) и это необходимо учитывать при переносе программ с других ;компьютеров на "Вектор", особенно тех программ, которые начинаются с адре- ;са 0000h. ; ;******************************************** ; Начало основной демонстрационной программы, ; использующей модули "Start" и "Init" ;******************************************** ; ; Теперь, когда режимы работы компьютера программно установлены, и есть сис- ;темные ячейки, через которые можно эти режимы изменять, самое время попробо- ;вать написать программу, использующую эти модули. Особое удовольствие это до- ;ставит тем, кого раздражали огромные дополнительные объемы вспомагательных ;программ, когда хотелось написать очень маленькую программу - несколько "ква- ;дратиков" начального загрузчика, но работающую со всеми цветовыми и звуковыми ;эффектами. Все вышеописанное (т.е. модули "Start" и "Init"), после трансляции ;в машинные коды, занимает об'ем немногим более ста байт, а это всего лишь по- ;ловина одного "квадратика" в карте начальной загрузки. ; ; Сначала очистим все четыре плоскости экрана: ; Progrm: LXI SP,53FFh ;Установить стек "под МОНИТОР 2" Next: LXI H,8000h ;Адрес начала экранного ОЗУ поместить в "HL" Pro: MVI M,00h ;Записать нули по адресу "HL" INX H ;Следующий адрес MOV A,H ;Проверить конец экранного ОЗУ: ORA A ;старший байт адреса = 00? - значит предыдущий JNZ Pro ;адрес был FFFFh - т.е. экр.ОЗУ, если нет - продолжение ; ; Нарисуем четыре квадратика в разных плоскостях для того чтобы показать ус- ;тановленные цвета плоскостей. ; LXI H,09060h ;начало квадратика для плоскости 8000h-9FFFh CALL Kvadro ;на подпрограмму вывода 8-ми байт квадратика LXI H,0B070h ;начало квадратика для плоскости A000h-BFFFh CALL Kvadro ;вывести квадратик LXI H,0D080h ;начало квадратика для плоскости C000h-DFFFh CALL Kvadro ; LXI H,0F090h ;начало квадратика для плоскости E000h-FFFFh CALL Kvadro ; MVI C,5 ;установить время 5 секунд и вызвать подпр. CALL Time ;задержки (пауза для показа квадратиков) ; ; Переключение цвета фона экрана цветами из установленной таблицы цветов. ; LXI H,Color ;установить в "HL" адрес цвета фона LXI D,COLR15 ;установить в "DE" адрес последнего цвета таблицы MVI B,15 ;в "B" - счетчик количества переключаемых цветов Fon1: LDAX D ;взять байт цвета из таблицы и MOV M,A ;записать по адресу цвета фона экрана MVI C,01 ;время задержки при переключении = 1 сек CALL Time ;вызвать П/П задержки для лучшего восприятия DCX D ;перейди к следующему цвету DCR B ;все цвета перебраны? JNZ Fon1 ;если нет - продолжать MVI M,00 ;вернуть фону прежний черный цвет ; ; Мигание бордюра цветами таблицы ; MVI A,15 ;установить в "A" номер последнего цвета таблицы Bord1: STA Border ;записать его в ячейку цвета бордюра MVI C,01 ;время задержки = 1 сек CALL Time ;вызвать П/П задержки DCR A ;все цвета таблицы перебраны? JNZ Bord1 ;если нет - продолжать MVI A,15 ;вернуть бордюру цвет 15 STA Border ; ; ;------------------------------ ;Управление скроллингом экрана. ;------------------------------ ; ;Движение экрана вверх ; ScUp: LDA Scroll ;взять номер начальной строки экрана DCR A ;уменьшить его STA Scroll ;затем снова записать в "Scroll" HLT ;Останов процессора до следующего прерывания HLT ;(так можно формировать задержки кратные 1/50 с) ORA A ;полная прокрутка экрана? JNZ ScUp ;если нет - продолжать ; ;Движение экрана вниз ; ScDown: LDA Scroll ;все аналогично ScUp, только INR A ;здесь нужно увеличивать номер STA Scroll ; HLT ; HLT ; ORA A ; JNZ ScDown ; ; ; Некоторых начинающих программистов может удивить использование команды HLT. ;Да, это еще одна приятная особенность использования прерывания. В тех ПЭВМ, ;где аппаратное (т.е. вызываемое схемой компьютера) прерывание не реализовано, ;эта команда "убила" бы программу и компьютер бы "замер". Здесь же "смерть" ;продлится недолго - до следующего прерывания, т.е. максимум 1/50 секунды. ; С помощью команды HLT можно не только формировать короткие задержки, но и ;организовывать счетчик времени в другом месте программы, а не только в под- ;программе обработки прерывания - например, это использует П/П "Time". ; Но если Вы запретили прерывания на какое-то время командой DI, то после ;этого HLT лучше не делать - выйти из такого "мертвого" останова можно будет ;только по "ВВОДу" или "СБРОСу" "Вектора"! После временного запрета прерывания ;обязательно должна следовать команда его разрешения - EI. ; ;Мигание индикатором "РУС/LAT" ; MVI B,08 ;в регистр "B" - счетчик миганий Rus: MVI A,08 ;зажечь светодиод индикатора "РУС/LAT" путем записи STA IndRus ;в ячейку "IndRus" кода 08 (это как раз 1 в третьем бите) MVI C,01 ;задержка 1 секунда CALL Time ; MVI A,00 ;погасить индикатор STA IndRus ; MVI C,01 ;задержка 1 секунда CALL Time ; DCR B ;количество миганий отработано? JNZ Rus ;если НЕТ - продолжать JMP Voice0 ;иначе - перейти на генерацию звука ; ; Теперь о программировании звука: Из описания ПЭВМ "Вектор-06ц" и некоторых ;рекламных программ следует, что "Вектор" наделен трехголосным синтезатором ;звука. Пусть термин "синтезатор" не пугает Вас - это сказано скорее в реклам- ;ных целях? на самом деле все гораздо проще. В качестве "синтезатора" исполь- ;зован обычный трехканальный таймер 580ВИ53, который при генерации звука рабо- ;тает как обычный делитель частоты с изменяемым коэффициентом деления. ; Теперь подробнее: имеется три отдельных делителя частоты. входы всех трех ;делителей соединены вместе и на них, в схеме "Вектора" всегда поступает час- ;тота 1.5 МГц (1 500 000 Гц). Выходы всех трех делителей об'единены через ре- ;зисторный смеситель и подключены к динамику и выходу на магнитофон. Чтобы по- ;лучить нужную Вам частоту звука, необходимо записать в один из делителей чис- ;ло (коэф. деления), чтобы после деления на него 1 500 000 получилась именно ;эта частота: ; ; Коэффициент деления = 15000000/частота (Гц) ; ; Эти делители называются каналами - 0-й,1-й,2-й. Для обращения к этим кана- ;лам в "Векторе" выделены следующие адреса портов: ; ; 0-й канал - порт 0Bh, 1-й канал - порт 0Ah, 2-й канал - порт 09h ; ; Для управления (выбора канала) служит порт 08h. Приведем пример генерации ;трехголосного звука, с поочередным включением каналов (голосов) и затем их ;поочередным выключением. Как и при установке других режимов ПЭВМ, выделим для ;каждого канала отдельные ячейки памяти, в которые можно будет записывать со- ;ответствующие им коэффициеты деления (для удобства записывайте коэфф. деления ;в десятичном виде, т.е. без "h" в конце числа). ; Sound0: DW 1500 ;коэф.для 0-го канала (1000Гц) Sound1: DW 0750 ;коэф.для 1-го канала (2000Гц) Sound2: DW 0500 ;коэф.для 2-го канала (3000Гц) ; Voice0: MVI A,36h ;задать режим 3 (мл.байт,ст.байт) для канала 0 OUT 08 ;записать в регистр режима LHLD Sound0 ;взять коэффициент деления для 0-го канала из "Sound0" MOV A,L ;записать сначала младший байт в OUT 0Bh ;делитель 0-го канала MOV A,H ;затем старший байт OUT 0Bh ;в тот же канал ; ; После этого появится один звук (один голос) с частотой 1000 Гц. Для того, ;чтобы услышать только его, сделаем задержку до появления следующего звука: ; MVI C,03 ;задержка на 3 секунды CALL Time ; ; ; Аналогично включаются остальные каналы, меняются только адреса портов и ;значение, которое заносится в порт 08h (регистр режима) для выбора канала. ; Voice1: MVI A,76h ;включить 1-й канал OUT 08 ; LHLD Sound1 ; MOV A,L ; OUT 0Ah ; MOV A,H ; OUT 0Ah ; ; MVI C,03 ;задержка до появления следующего звука CALL Time ; ; Voice1: MVI A,0B6h ;включить 2-й канал OUT 08 ; LHLD Sound2 ; MOV A,L ; OUT 09h ; MOV A,H ; OUT 09h ; ; MVI C,05 ;задержка, чтобы услышать все 3 голоса CALL Time ; ; ; Выключение канала производится записью в порт того же значения, которое ;записывалось для включения данного канала, но без записи в канал коэф.деления. ; OfVoc0: MVI A,36h ;выключение 0-го канала OUT 08 ; ; MVI C,03 ;задержка до отключения следующего канала CALL Time ; ; OfVoc1: MVI A,76h ;выключение 1-го канала OUT 08 ; ; MVI C,03 ;задержка CALL Time ; ; OfVoc2: MVI A,0B6h ;выключение 0-го канала OUT 08 ; ; ; На этом демонстрационная программа заканчивается и, чтобы вернуться в ;Редактор-Ассемблер, надо сделать переход на адрес 0100h: ; JMP 0100h ;вернуться в Редактор-Ассемблер ; ;========================== ;Используемые подпрограммы: ;========================== ; ;Вывод квадратика из 8-ми байт ; Kvadr0: MVI C,08 ;в регистр "C" - счетчик байт Kvadr1: MVI M,0FFh ;записать по адресу "HL" все единицы INR L ;следующий байт для вывода DCR С ;все 8 байт квадратика записаны в видео ОЗУ? JNZ Kvadr1 ;если НЕТ - продолжать RET ;иначе - выйти из п/п вывода квадратиков ; ;Подпрограмма задержки ; Time: PUSH B ;сохранить значение пары "BC" в стеке Time2: MVI B,50 ;в рег. "B" - счетчик прерываний (каждую 1/50 с) Time1: HLT ;ожидать прерывание DCR B ;секунда обработана? (прошло 50 прерываний?) JNZ Time1 ;если НЕТ - продолжать подсчет прерываний DCR C ;заданные секунды отработаны? JNZ Time2 ;если НЕТ - продолжать POP B ;вернуть значение "BC" RET ;и выйти из п/п задержки ; ; На этом весь об'ем демонстрационной части программы заканчивается. Здесь ;специально не даны примеры использования клавиш, т.к., согласно описанию, ;программа после запуска должна отработать и вернуться в Редактор-Ассемблер. ;Но Вы легко можете проверить работу клавиш, если сами дополните программу ;существующими модулями, например, такого типа: ; TstKey: LDA KeyKod ;взять код нажатой клавиши и проверить: CPI Up ;это код клавиши "курсор вверх" ? JZ UpScrn ;и если ДА - то что-то выполнить (например скрол.вверх) CPI Down ;это код клавиши "курсор вниз" ? JZ DwScrn ;если ДА - скроллинг вниз CPI LF ;была нажата клавиша "ПС" ? JZ 0100h ;тогда вернуться в Редактор-Ассемблер JMP TstKey ;если ни одна из этих трех клавиш не нажата - пров.снова UpScrn: HLT ;сделать задержку по ожиданию прерывания, чтобы HLT ;экран не двигался слишком быстро LDA Scroll ;взять номер строки начала отображения и DCR A ;уменьшить его STA Scroll ;записать уменьшенный номер в ячейку "Scroll" JMP TstKey ;снова вернуться на опрос клавиатуры DwScrn: HLT ;скроллинг вниз аналогично, но HLT ;с увеличением номера строки LDA Scroll ; INR A ; STA Scroll ; JMP TstKey ; ; ; Надо заметить что клавиши "РУС/LAT","УС","СС" не входят в матрицу основной ;клавиатуры 8x8, а подключены отдельно к 7-му, 6-му и 5-му биту порта 01 соот- ;ветственно. Эти биты порта 01 больше ничем не управляют и поэтому опрос этих ;клавиш можно производить в любое время, а не только по прерыванию. Например: ; IN 01 ;взять байт из порта 01 ANI 80h ;маска для 7-го бита (проверка клавиши "РУС/LAT") JZ 0100h ;вернуться в Редактор-Ассемблер если нажата. ; ; В тексте основной программы также не оговорены еще некоторые адреса портов ;и значения некоторых битов (чтоб не загромождать описание и сделать его более ;понятным). Приведем их значения для полноты информации. ; ; 4-й бит порта 02 - переключатель формата 256 или 512 точек на экране по ;горизонтали. Если он установлен в лог."0" - то 256 точек и справедливо все, о ;чем говориться в этом описании (это касается цветов). Если лог."1" - то 512 ;точек, но при этом на экране могут быть только 4 цвета и будет усложнен вывод ;изображения на экран, т.к. две соседние точки экрана принадлежат разным плос- ;костям. Этот режим не рассматривался в описании с целью упрощения, но его ;легко включить, если установить этот бит в ячейке "Border" т.к. цвет бордюра ;занимает биты 0-3 этой ячейки (от 0 до 15), а в конце программы прерывания ;байт из ячейки "Border" выставляется на линии порта 02. ; ; 4-й бит порта 01 - вход для ввода информации с магнитофона ; 0-й бит порта 01 - выход для вывода информации на магнитофон и через него ; же можно выводить программно-формируемый звук без ис- ; пользования таймера ; порт 04h - регистр режима внешнего параллельного адаптера ; порт 05h - канал "C" ; порт 06h - канал "B" ; порт 07h - канал "A" ; Линии каналов A,B,C этого адаптера, выведены через раз'ем "ПУ" ; На тот же раз'ем выведен канал "0" таймера ; порт 10h - управление переключением ОЗУ электронного диска (КВАЗИДИСКА) ; порт 18h - регистр данных контроллера НГМД ; порт 19h - регистр сектора дорожки контроллера НГМД ; порт 1Ah - регистр дорожки контроллера НГМД ; порт 1Bh - регистр команд и статуса контроллера НГМД ; порт 1Сh - регистр выбора и управления контроллера НГМД ; ; В конце хотелось бы отметить, что данное описание - это отнюдь не учебник ;по программированию на языке Ассемблера. В нем дан лишь справочный материал ;по программной установке режимов ПЭВМ "Вектор-06ц" с примерами, в которых для ;наглядности использованы простейшие команды Ассемблера. Для изучения языка ;Ассемблера и создания более сложных программ лучше пользоваться следующей ли- ;тературой: ; ; (1) Р.Токхайм ; "Микропроцессоры", Москва, ЭнергоАтомИздат, 1988 ; (2) Л.Левенталь, У.Сэйвилл ; "Программирование на языке Ассемблера для микропроцессоров 8080 и 8085" ; перевод А.А.Батнера, Москва, Радио и Связь, 1987 ; (3) А.Гуртовцев, С.Гудымено ; "Программы для микропроцессоров", Минск, Вышэйшая Школа, 1989 ; (4) Г.Зеленко, В.Панов, С.Попов ; "Радиолюбителю о микропроцессорах и микроЭВМ", журналы "Радио" 1982-1983 ; ; А также внимательно изучать и пользоваться описанием программ для "Вектора": ;"Редактор-Ассемблер" и "Монитор-Отладчик" П/О СчетМаш г.Кишинев. ; ; ; ; ; ПРИЛОЖЕНИЕ 1. ; ; Таблица машинных кодов программы, приведенной в данном описании. ; (коды можно ввести пользуясь МОНИТОРОМ-ОТЛАДЧИКОМ и затем ; запустить директивой "G100") ; ; ; ; 0100: F3 3E C3 32 00 00 32 38 00 21 00 78 22 01 00 21 ; 0110: 31 01 22 39 00 AF D3 10 FB C3 85 01 0F 00 07 38 ; 0120: 16 C0 86 20 C5 3F 04 52 98 80 24 FF F0 FF FF 00 ; 0130: 00 E5 C5 D5 F5 3E 88 D3 00 21 2C 01 16 10 1E 0F ; 0140: 7B D3 02 7E D3 0C D3 0C D3 0C D3 0C D3 0C 2B D3 ; 0150: 07 1D D3 0C 15 D3 0C C2 40 01 3E 8A D3 00 3E FE ; 0160: D3 03 DB 02 32 2E 01 3E 88 D3 00 3A 1C 01 D3 02 ; 0170: 3A 2D 01 D3 03 3A 2F 01 47 3A 30 01 B0 D3 01 F1 ; 0180: D1 C1 E1 FB C9 31 FF 53 21 00 80 36 00 23 7C B7 ; 0190: C2 8B 01 21 60 90 CD 65 02 21 70 B0 CD 65 02 21 ; 01A0: 80 D0 CD 65 02 21 90 F0 CD 65 02 0E 05 CD 6F 02 ; 01B0: 21 1D 01 11 2C 01 06 0F 1A 77 0E 01 CD 6F 02 1B ; 01C0: 05 C2 B8 01 36 00 3E 0F 32 1C 01 0E 01 CD 6F 02 ; 01D0: 3D C2 C8 01 3E 0F 32 1C 01 3A 2D 01 3D 32 2D 01 ; 01E0: 76 76 B7 C2 D9 01 3A 2D 01 3C 32 2D 01 76 76 B7 ; 01F0: C2 E6 01 06 08 3E 08 32 2F 01 0E 01 CD 6F 02 3E ; 0200: 00 32 2F 01 0E 01 CD 6F 02 05 C2 F5 01 C3 16 02 ; 0210: DC 05 EE 02 F4 01 3E 36 D3 08 2A 10 02 7D D3 0B ; 0220: 7C D3 0B 0E 03 CD 6F 02 3E 76 D3 08 2A 12 02 7D ; 0230: D3 0A 7C D3 0A 0E 03 CD 6F 02 3E B6 D3 08 2A 14 ; 0240: 02 7D D3 09 7C D3 09 0E 05 CD 6F 02 3E 36 D3 08 ; 0250: 0E 03 CD 6F 02 3E 76 D3 08 0E 03 CD 6F 02 3E B6 ; 0260: D3 08 C3 00 01 0E 08 36 FF 2C 0D C2 67 02 C9 C5 ; 0270: 06 32 76 05 C2 72 02 0D C2 70 02 C1 C9 00 00 00 ; ; ВНИМАНИЕ !!! В ячейках 010Ah, 010Bh записан адрес перехода при нажатии на ;клавиши "БЛК/СБР" - 7800h для выхода в Монитор (режим 2). Если Ваша программа ;должна работать без Монитора и иметь перезапуск по "СБРОСу", занесите в эти ;ячейки адрес 0100h. ; ; ; Таблица значений символьных меток программы ; (для изменения параметров в машинных кодах) ; ; 01C8 Bord1 011C Border 011D Color 011E COLR1 0127 COLR10 ; 0128 COLR11 0129 COLR12 012A COLR13 012B COLR14 012C COLR15 ; 011F COLR2 0120 COLR3 0121 COLR4 0122 COLR5 0123 COLR6 ; 0124 COLR7 0125 COLR8 0126 COLR9 01B8 Fon1 012F IndRus ; 0131 Init 0140 Init1 012E KeyKod 0267 Kvadr1 0265 Kvadr0 ; 0188 Next 024C OfVoc0 0255 OfVoc1 025E OfVoc2 018B Pro ; 01F3 Prery 0185 Progrm 0130 Rele 01F5 Rus 01E6 ScDown ; 012D Scroll 01D9 ScUp 0210 Sound0 0212 Sound1 0214 Sound2 ; 0100 Start 026F Time 0272 Time1 0270 Time2 0216 Voice0 ; 0228 Voice1 023A Voice2 ; ```