- •Введение:
- •Задание на курсовую работу:
- •Постановка задачи:
- •Структура входных и выходных данных:
- •Описание структуры входной и выходной информации:
- •Разработка и описание алгоритма:
- •Разработка и описание принципиальной схемы алгоритма:
- •263 Mvi m, 0; поместить 0 в nproc
- •301 Ani 63; выделить 6 младших битов
- •306 In port a1
- •307 Ani 31; выделить 5 младших битов
- •252 In port с1(4-7); ввод с порта c1(4-7)
- •253 Ani 112; выделить 5-й, 6-й и 7-й биты
- •465 Inx hl; переход к сост-ю персонажа
- •35 Ldax hl; звание I-го персонажа в a
- •281 Dcr m; уменьш. Старш. Байт ct1
- •Пример работы алгоритма:
- •Разработка и описание структурной схемы мпс:
- •Разработка и описание функциональной схемы мпс:
- •Заключение:
Структура входных и выходных данных:
Как уже было сказано в предыдущем разделе, входные данные представляются набором битов, следовательно, их можно аппаратно представить в виде набора кнопок, подключённых непосредственно к интерфейсу:
Предполагается, что пользователь нажимает кнопки (кроме кнопки «пауза») до начала работы МПС, при этом, достаточно нажать по одной кнопке из групп «События» и «Места действия», а из групп «Типажи» и «Имена» должно быть нажато по 3 кнопки. После этого запускается МПС, генерирующая текст на основании заданных начальных условий, и выводит этот текст на дисплей:
Дисплей имеет 8-разрядный вход, что вполне допускает представление символа всего одним байтом.
Структура управляющего слова КР580ВВ55:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Разряд 0: Порт С(0…3): «1» - ввод, «0» - вывод.
Разряд 1: Порт В: «1» - ввод, «0» - вывод.
Разряд 2: выбор режима: «0» - режим0, «1» - режим1,
Разряд 3:Порт С(4…7): «1» - ввод, «0» - вывод.
Разряд 4: Порт А: «1» - ввод, «0» - вывод.
Разряды 5 и 6:Задание режима: «00» - режим0, «01» - режим1, «10» или «11» - режим2.
Разряд 7:Задание режима «1».
Описание структуры входной и выходной информации:
Хотя для аппаратной реализации представленный выше формат данных достаточно удобен, программная обработка таких данных затруднительна. Следовательно, при получении входных данных, их следует преобразовать в формат, удобный для работы, при помощи специальной подпрограммы (схема и код которой будет подробно рассмотрены в разделах «разработка и описание алгоритма» и «разработка принципиальной схемы алгоритма»). В данном же разделе будет сделано распределение памяти, которое уже можно производить на основе данных, представленных в предыдущих разделах. Так как представленное здесь распределение является окончательным, назначение некоторых ячеек памяти (в основном это переменные-счётчики и переменные для хранения промежуточных результатов) будет понятно лишь при подробном ознакомлении с алгоритмом. Тем не менее, учитывая структуру входных данных, мы точно можем знать, что нам понадобятся:
Массив персонажей, каждый элемент которого включает имя персонажа и его типаж;
Переменные, характеризующие место действия;
Переменная, характеризующая происходящее событие.
Кроме того, на основе того, как будут представляться выходные данные, мы можем утверждать, что нам понадобится в ОЗУ буфер для результирующего текста, т.к. этот текст должен сохраняться всё время, пока будет нажата кнопка «пауза». Распределение памяти ОЗУ выглядит следующим образом:
(Здесь и далее все адреса приведены в шестнадцатеричном формате)
0000 |
|
стек |
0001 |
|
|
0002 |
|
|
0003 |
|
|
0004 |
|
|
0005 |
|
|
0006 |
|
|
0007 |
|
|
0008 |
|
|
0009, 000A |
CT1 |
Счётчик 1 |
000B, 000C |
CT2 |
Счётчик 2 |
000D, 000E |
CT3 |
Счётчик 3 |
000F |
DIR |
Порядок перебора (1-3 или 3-1) |
0010, 0011 |
RES |
Временная переменная 1 |
0012 |
|
Резерв |
0013, 0014 |
TMP |
Временная переменная 2 |
0015, 0016, 0017 |
OK1 |
Таблица окончаний |
0018, 0019, 001A |
OK2 |
|
001B, 001C, 001D |
OK3 |
|
001E, 001F, 0020 |
OK4 |
|
0021, 0022, 0023 |
OK5 |
|
0024, 0025, 0026 |
OK6 |
|
0027, 0028, 0029 |
OK7 |
|
002A, 002B, 002C |
OK8 |
|
002D, 002E, 002F |
OK9 |
|
0030, 0031, 0032 |
OK10 |
|
0033 |
FL |
Число/падеж |
0034, 0035 |
OBJ |
Адрес объекта |
0036, 0037 |
SUB |
Адрес субъекта |
0039 |
NPROC |
№ текущего события |
003A, 003B |
ITM1 |
Адреса названий предметов |
003C, 003D |
ITM2 |
|
003E, 003F |
ITM3 |
|
0040, 0041 |
ITM4 |
|
0042, 0043 |
ITM5 |
|
0044, 0045 |
ITM6 |
|
0046, 0047 |
ITM7 |
|
0048, 0049 |
ITM8 |
|
004A |
CC |
Текущий копируемый символ |
004B, 004C |
CH1N |
Массив персонажей: (имя j) |
004D |
CH1R |
(звание j) |
004E |
CH1S |
(состояние j)... |
004F, 0050 |
CH2N |
|
0051 |
CH2R |
|
0052 |
CH2S |
|
0053, 0054 |
CH3N |
|
0055 |
CH3R |
|
0056 |
CH3S |
|
0057, 0058 |
ENV |
Адрес текста с описанием места действия |
0059, 005A |
BP |
Указатель записи в буфер |
005B |
|
Буфер текста... |
Описание идентификаторов:
Переменные FL, СС и таблица окончаний (представляющая собой набор из 30 символов) требуются для орфографической обработки генерируемого текста.
Переменная ENV и набор предметов (ITM1 … ITM8) характеризуют место действия.
Переменная NPROC – это числовой идентификатор происходящего события.
Переменные с префиксом CH – это элементы массива персонажей.
Переменные OBJ и SUB нужны для взаимодействия персонажей друг с другом. SUB хранит адрес воздействующего персонажа (субъекта действия), а OBJ, соответственно, адрес персонажа, на которого действие направлено (объект действия)
BP – это переменная, хранящая адрес последней свободной ячейки в буфере с текстом, т.е. это указатель записи.
Начиная с ячейки 005B, расположен буфер для текста, и он занимает всю оставшуюся память.
Оценкой сверху было установлено, что, в среднем, сгенерированный текст занимает ~3500 байт (1 символ представляется одним байтом). Соответственно, округляя сумму требуемого размера буфера текста и объёма, занимаемого переменными, до ближайшей степени двойки, получаем объём памяти ОЗУ, равный 4096 байт.
Распределение памяти ПЗУ:
В ПЗУ должны содержаться как исходные отрывки текста, из которых будет сформирован результирующий текст, так и код всех программных модулей. Очевидно, что, так как текст занимает достаточно много памяти, лучше взять ПЗУ как можно большей вместительности. После, опять же, оценки сверху, был выбран объём памяти, равный 32768 байт.
В начале памяти ПЗУ будет располагаться код программных модулей и подпрограмм:
адрес главного программного модуля: 0000
адрес INIT: 0013
адрес BEGIN: 0258
адрес ITERATION: 02EC
адрес END: 0436
адрес OUTPUT: 050F
адрес TIMER: 0564
адрес TEXTLOAD: 056E
адрес SEARCH: 08FC
адрес REPRESENT1: 0947
адрес REPRESENT2: 0997
адрес REPRESENT3: 09E7
адрес REPRESENT4: 0A37
адрес REPRESENT5: 0A9B
адрес ANSWER1: 0AEB
адрес ANSWER2: 0B45
адрес ANSWER3: 0B9F
адрес ANSWER4: 0BF9
адрес REACT11: 0C00
адрес REACT12: 1000
адрес REACT13: 1400
адрес REACT14: 1800
адрес REACT15: 1C00
адрес REACT21: 2000
адрес REACT22: 2400
адрес REACT23: 2800
адрес REACT24: 2C00
адрес REACT25: 3000
адрес REACT31: 3400
адрес REACT32: 3800
адрес REACT33: 3C00
адрес REACT34: 4000
адрес REACT35: 4400
адрес REACT41: 4800
адрес REACT42: 4C00
адрес REACT43: 5000
адрес REACT44: 5400
адрес REACT45: 5800
Оценка сверху для размера каждого программного модуля (или подпрограммы) бралась из соотношения ~1-2 команды на каждый блок соответствующей блок-схемы и по 3 байта на команду.
После кода всех подпрограмм и программных модулей будут расположены отрывки текста, из которых будет формироваться результирующий рассказ. Для большей наглядности следует привести их не в виде таблицы, как для ОЗУ, а в виде, непосредственно, отрывков текста, каждому из которых предшествует адрес первого символа в нём.
В конце каждого отрывка текста выставляется завершающий символ (показан как 0);
Некоторые слова приведены без окончаний, вместо окончаний в них подставлены служебные символы (@, #, $ и т. д.), которые анализируются специальной подпрограммой и вместо них подставляются окончания, соответствующие числу и падежу, в котором это слово употреблено в тексте.
Таблицы окончаний приведены в самом начале ПЗУ (адреса 5C00 – 5D67):
[5C00]
[5C03]ий
[5C06]я
[5C09]ой
[5C0C]ий
[5C0F]е
[5C12]ь
[5C15]а
[5C18]о
[5C1B]
[5C1E]а
[5C21]ого
[5C24]и
[5C27]ого
[5C2A]его
[5C2D]я
[5C30]и
[5C33]ы
[5C36]а
[5C39]а
[5C3C]у
[5C3F]ому
[5C42]е
[5C45]ому
[5C48]ему
[5C4B]ю
[5C4E]и
[5C51]е
[5C54]у
[5C57]у
[5C5A]а
[5C5D]ого
[5C60]ю
[5C63]ой
[5C66]его
[5C69]е
[5C6C]ь
[5C6F]у
[5C72]о
[5C75]
[5C78]ом
[5C7B]им
[5C7E]ёй
[5C81]ым
[5C84]им
[5C87]ем
[5C8A]ью
[5C8D]ой
[5C90]ом
[5C93]ом
[5C96]е
[5C99]ом
[5C9C]е
[5C9F]ом
[5CA2]ем
[5CA5]и
[5CA8]и
[5CAB]е
[5CAE]е
[5CB1]ах
[5CB4]ы
[5CB7]ие
[5CBA]и
[5CBD]ые
[5CC0]ие
[5CC3]я
[5CC6]и
[5CC9]ы
[5CCC]а
[5CCF]ы
[5CD2]ов
[5CD5]их
[5CD8]и
[5CDB]ых
[5CDE]их
[5CE1]й
[5CE4]ей
[5CE7]
[5CEA]ен
[5CED]ов
[5CF0]ам
[5CF3]им
[5CF6]ям
[5CF9]ым
[5CFC]им
[5CFF]ям
[5D02]ям
[5D05]ам
[5D08]ам
[5D0B]ам
[5D0E]ов
[5D11]их
[5D14]и
[5D17]ые
[5D1A]их
[5D1D]я
[5D20]и
[5D23]ы
[5D26]а
[5D29]ы
[5D2C]ами
[5D2F]ими
[5D32]ями
[5D35]ыми
[5D38]ими
[5D3B]ями
[5D3E]ями
[5D41]ами
[5D44]ами
[5D47]ами
[5D4A]ах
[5D4D]их
[5D50]ях
[5D53]ых
[5D56]их
[5D59]ях
[5D5C]ях
[5D5F]ах
[5D62]ах
[5D65]ах
[5DA4]Балоун~0
[5DAC]Ходоунск@0
[5DB6]Швейк~0
[5DBD]Кац~0
[5DC2]Манштейн~0
[5DCC]Лукаш~0
[5DD3]окоп}0
[5DD9]земл#0
[5DDF]бруствер}0
[5DE9]пуст$ ящик} от боеприпасов0
[5E04]соседн% окоп}0
[5E2C]взвод} англичан, незаметно подползающих к окопу, чтобы совершить диверсию0
[5E76]вагон}0
[5E7D]пол}0
[5E82]стол}0
[5E88]сидени^0
[5E90]тамбур}0
[5EB8]взвод} французов, сидевших в засаде у дороги, чтобы пустить эшелон под откос0
[5F05]зал}0
[5F0A]пол}0
[5F0F]стойк*0
[5F16]стул}0
[5F1C]двер&0
[5F44]политическ@ информатор~, зашедш% в пивную, чтобы пополнить казематы очередной партией шпионов и клеветников0
[5FB0]пол^0
[5FB5]земл#0
[5FBB]бревн{0
[5FC2]пуст$ ящик} от боеприпасов0
[5FDD]лес}0
[6005]русск@ шпион~, наблюдавший за учениями0
[602C]Лето 1915 года было тёплым и солнечным. Таким тёплым, что мертвецы, свисающие с колючей проволоки, начинали разлагаться, издавая мерзкий трупный запах и повергая в смятение доблестных бойцов 72-го пехотного полка, расположившегося в окопах неподалёку от Домажлиц, где уже третий месяц славная чешская армия пыталась взять штурмом деревушку Мерклино.0
[618B]Весной 1914 года доблестный 45-й артиллерийский полк ехал эшелоном во Вршовицы. Дорога была спокойной и долгой. Машинист, напившись ореховки, спокойно кемарил у себя в кабине. Ничто не предвещало беды. Солдаты в вагонах маялись бездельем.0
[627C]Солнечным июньским днём в пивной "У Чаши", находящейся в деревушке Будейовицы, куда был расквартирован 28-й кавалерийский полк его императорского величества Франца-Иосифа, стоял такой шум, что несчастные жители деревни начали опасаться: Уж не переместилась ли сюда линия фронта?0
[6394]На опушке леса, близ деревни Велкопоповице, расположился 148-й гренадерский полк, находящийся на учениях. Собственно, учения должны были начаться ровно в полдень, однако солнце уже клонилось к горизонту, но сигнал о начале учений так и не поступал. Ведь сюда ещё не дошла весть о том, что фельдмаршал Иосиф-Фердинанд, который должен был командовать театром военных действий, находясь в сильном подпитии, забил свою курительную трубку пушечным порохом, из-за чего и лишился головы. Начинало смеркаться, солдаты скучали.0
[659D]Но вдруг, совершенно неожиданно, всё вокруг начало взрываться и солдатам на голову посыпалась шрапнель. А виной всему были пьяные немецкие наводчики артиллерии, которые с перепоя приняли этот полк за банду африканских зусулов и вдарили по ним из всех стволов.0
[66A2]Вдруг, неожиданно для всех, из 0
[66C3] вывалилась толпа пьяных венгерских сапёров, настроенных весьма недружелюбно. Чехи и венгры всегда недолюбливали друг друга, и мордобои между ними доходили частенько до того, что по количеству человеческих потерь их можно было сравнить лишь с миномётными обстрелами. Вот и сейчас началась такая драка, что уже невозможно было отличить своих от чужих.0
[6823]И тут, откуда ни возьмись, в 0
[6842] вошёл начальник тайной полиции в сопровождении нескольких шпиков. По его опухшей красной физиономии было видно, что он пьян в дрова, что и объясняло его присутствие в столь неподобающем месте. Все присутствующие, естественно, висилицы опасались куда сильнее, чем вражеских штыков, поэтому никто не посмел тревожить начальника. Напротив, все даже притихли.0
[69A8]После того, как разрывы снарядов затихли, 0
[69D3]Когда побоище прекратилось, 0
[69F0]После того, как ситуация прояснилась, 0
[6A18]Когда атака закончилась, 0
[6A32].0
[6A34], 0
[6A37], а 0
[6A3C] был посмертно награждён железным крестом за то, что отдал жизнь во славу отечества0
[6A92], находясь в полевом госпитале, подхватил дизентерию, от которой и умер0
[6ADC], валяясь без сознания, получил пулю в голову0
[6B0D] был опубликован на страницах фронтовой газеты, как пример героизма и находчивости0
[6B60] был посмертно приговорён к казни через повешенье за саботаж на поле боя0
[6D94]В центре 0
[6D9E] сидел толстый бородач - денщик 0
[6DC0] и поглощал кнедлики с кислой капустой, которыми он разжился в полевой кухне. 0
[6E0F]Вдалеке от всех, не обращая внимания на происходящее, сидел полковой писарь 0
[6E5C], с интересом читая третий том научных трудов Гюйгенса, посвящённый дифракции электронов на кристаллических решётках. 0
[6ED3]Прямо на 0
[6EDD], давно уже не понимая, где он находится, валялся пьяница обер-фельдкурат 0
[6F28]. Он хлестал креплёное церковное вино, бочонок с которым повсюду за ним таскал его несчастный денщик. 0
[6F8F] потягивал чай с ромом и, как всегда, находясь в жутком настроении, вымещал свою злость на подчинённых: "Эй, ты, свинья" - орал он на 0
[7016] - "ну-ка сбегай в полевую кухню и принеси мне коньяку, не то отдам тебя под трибунал!". 0
[7071]За 0
[7075] слева сидел старый полковник 0
[7094] и покуривал трубочку. Как и большинство полковников, он давно выжил из ума, и поэтому в данный момент он мирно беседовал с самим собой, многозначительно жестикулируя, и поддакивая своему воображаемому собеседнику. 0
[716C]Прогремевший рядом с 0
[7182] взрыв, а так же алкоголь, ударивший ему в голову, сбили его с ног. Он рухнул на землю, сильно ударившись при этом головой, в результате чего у него помутился рассудок. 0
[722C]Тем временем подпоручик, увидев ужасную неорганизованность своих подчинённых, попытался поднять боевой дух солдат. И единственным решением этой задачи, пришедшим в его голову, помутнённую алкоголем и ударом о землю, было: Поднявшись с земли и вытянувшись во весть рост заорать на 0
[7345]: "Ты, чешская скотина, обещаю тебе, что не пройдёт и недели, как ты будешь болтаться в петле!". 0
[73A7]Совсем забывшись в своём героическом порыве, подпоручик 0
[73E0] уже не обращал внимания на свистящие у него над головой осколки снарядов, за что и поплатился - ему отрвало голову шрапнелью. 0
[7460]Не долго думая, подпоручик 0
[747C] отхлебнул ром из бутылки и во всю глотку заорал: "Взвода! В атаку! Умрём за нашего императора!". И тут чешские солдаты пошли в атаку...0
[7506]А тем временем, прогремевший рядом с 0
[752C] взрыв поджёг разлитый им ром, и подпоручик с криком забегал по 0
[756D], полыхая, словно факел, чем и обратил в бегство 0
[759F]Стараясь не опозорить себя в глазах высших чинов, 0
[75D2] с храбрым видом спрятался под 0
[75F2]А вот в 0
[75FB], под которым скрывался 0
[7614], попала шрапнель, в результате чего подпоручик погиб во славу отечества. 0
