Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which use a logographic writing system and need larger font sizes.
***/

/*{{{*/
body {font-size:0.8em;}

#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}

.subtitle {font-size:0.8em;}

.viewer table.listView {font-size:0.95em;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
![[Пример|Пример 2]] 



! Задание
1.	Разработать программу вычисления и вывода значения функции.

для вводимого из IR значения аргумента х. Функции и допустимые пре¬делы изменения аргумента приведены в табл. 2, варианты заданий — в табл. 3.
2.	Исходя из допустимых пределов изменения аргумента функций (табл. 2) и значения параметра а для своего варианта задания (табл. 3) выделить на числовой оси Ох области, в которых функция у вычисляется по представленной в п. 1 формуле, и недопустимые значения аргумента. На недопустимых значениях аргумента программа должна выдавать на OR максимальное отрицательное число: 199 999.
3.	Ввести текст программы в окно Текст программы, при этом возможен набор и редактирование текста непосредственно в окне Текст программы или загрузка текста из файла, подготовленного в другом редакторе.
4.	Ассемблировать текст программы, при необходимости исправить синтаксические ошибки.
5.	Отладить программу. Для этого:
а)	записать в IR значение аргумента х > а (в области допустимых значений);
б)	записать в PC стартовый адрес программы;
в)	проверить правильность выполнения программы (т. е. правильность результата и адреса останова) в автоматическом режиме. В случае наличия ошибки выполнить пп. 5, г и 5, д; иначе перейти к п. 5, е;
Г)	записать в PC стартовый адрес программы;
 
д)	наблюдая выполнение программы в режиме Шаг, найти команду, являющуюся причиной ошибки; исправить ее; выполнить пп. 5, а — 5, в;
е)	записать в IR значение аргумента х < а (в области допустимых значений); выполнить пп. 5, б и 5, в;
ж)	записать в IR недопустимое значение аргумента х и выполнить пп. 5, б
и 5, в.
6. Для выбранного допустимого значения аргумента х наблюдать выполнение отлаженной программы в режиме Шаг и записать в форме табл. содержимое регистров ЭВМ перед 

[img[Функция|Lz10tab3.jpg]]

[[Варианты|Варианты Лз 10]]
Целью этого занятия является изучение способов организации взаимодействия процессора и внешних устройств (ВУ) в составе ЭВМ.

Cвязь процессора и ВУ может осуществляться в синхронном или асинхронном режиме. Синхронный режим используется для ВУ, всегда готовых к обмену. В нашей модели такими ВУ являются дисплей и тоногенератор — процессор может обращаться к этим ВУ, не анализируя их состояние (правда дисплей блокирует прием данных после ввода 128 символов, формируя флаг ошибки). Асинхронный обмен предполагает анализ процессором состояния ВУ, которое определяет готовность ВУ выдать или принять данные или факт осуществления некоторого события, контролируемого системой. К таким устройствам в модели можно отнести клавиатуру и блок таймеров. Анализ состояния ВУ может осуществляться процессором двумя способами:

* в программно-управляемом режиме;
* в режиме прерывания.

Большинство внешних устройств содержит регистры управления CR и состояния SR, причем обычно регистры CR доступны процессору только по записи, а SR — по чтению.>

Регистр CR содержит флаги и поля, определяющие режимы работы ВУ, a SR — флаги, отражающие текущее состояние ВУ. Флаги SR устанавливаются аппаратно, но сбрасываются программно (или по внешнему сигналу). Поля и флаги CR устанавливаются и сбрасываются программно при записи кода данных в регистр CR или специальными командами.

В описываемой модели контроллер ВУ интерпретирует код, записываемый по адресу CR как команду, если третий разряд этого кода равен 1, или как записываемые в CR данные, если третий разряд равен 0. В случае получения командного слова запись в регистр CR не производится, а пятый (младший) разряд слова рассматривается как код команды для ВУ.

Для подключения ВУ в систему необходимо:

1. В главном окне Модель учебной ЭВМ выполнить команду Внешние устройства/Менеджер ВУ или нажать кнопку МВУ;
2. В открывшемся окне Подключаемые устройства выбрать из списка Устройства нужное ВУ, при желании изменить предлагаемые по умолчанию вектор прерывания IRQ  и/или базовый адрес Base_Adr и нажать кнопку Подключить – при этом название устройства появится в списке Подключённые устройства;
3. Повторить п.2 для каждого из подключаемых устройств. Помните, что любое из ВУ в этой модели может быть подключено в систему только в одном экземпляре.
4. Закрыть окно Подключаемые устройства. 

Если закрыть окно обозревателя ВУ, оно не будет отключено от системы. Для отключения ВУ следует открыть окно Подключаемые устройства, выделить его в списке Подключённые устройства и нажать кнопку Отключить.

! [[Контроллер клавиатуры]]

Сначала выполняется работа с контроллером клавиатуры

! [[Дисплей]]
Реализация программы в ЭВМ сводится к последовательному выполнению команд. Каждая команда, в свою очередь, выполняется как последователь&shy;ность микрокоманд, реализующих элементарные действия над операционны&shy;ми элементами процессора.
В программной модели учебной ЭВМ предусмотрен Режим микрокоманд, в котором действие командного цикла реализуется и отображается на уровне микрокоманд. Список микрокоманд текущей команды выводится в специаль&shy;ном окне Микрокомандный уровень.

[img[ghj|Lz13omku.png]]

Рисунок - Окно Микрокомандный уровень

Окно Микрокомандный уровень  используется только в режиме микрокоманд, который устанавливается командой Режим микрокоманд ме&shy;ню Работа. В это окно выводится мнемокод выполняемой команды, список микрокоманд, ее реализующих, и указатель на текущую выполняемую мик&shy;рокоманду.
Шаговый режим выполнения программы или запуск программы в автомати&shy;ческом режиме с задержкой командного цикла позволяет наблюдать процесс выполнения программы на уровне микрокоманд.
Если открыть окно Микрокомандный уровень, не установив режим микро&shy;команд в меню Работа, то после начала выполнения программы в режиме Шаг (или в автоматическом режиме) в строке сообщений окна будет выдано сообщение "Режим микрокоманд неактивен".

!Задание 1

Выполнить снова последовательность команд по своему варианту 

[img[Таблица 3|Lz9tab3.jpg]]

в режиме ''Шаг''. Зарегистрировать изменения состояния процес&shy;сора и памяти в форме [[таблицы|таблица к Лз 13]], в которой приведены состояния ЭВМ при выполнении примера  в таблице 1 (фрагмент).

Таблица 1

|!Последовательность|!Значения|>|>|>|>|
|Команды|RD#20|WR30|ADD #5|WR@30|JNZ 002|
|Коды|21 1 020|22 0 030|23 1 005|22 2 030|12 0 002|

! Задание 2

Записать последовательность микрокоманд для следующих команд модели учебной ЭВМ:

* ADD R3
* ADD @R3
* ADD @R3+
* ADD -@R3
* JRNZ R3,M
* MOV R4,R2
* JMP M
* CALL M
* RET:  PUSH R3
* POP R5

! Контрольные вопросы

1.Какие микрокоманды связаны с изменением состояния аккумулятора?
2.Какие действия выполняются в модели по микрокоманде MRd? RWr?
3.Попробуйте составить микропрограмму (последовательность микро&shy;команд, реализующих команду) для несуществующей команды "умноже&shy;ние модулей чисел".
4.Что изменится в работе процессора, если в каждой микропрограмме мик&shy;рокоманду увеличения программного счетчика PC := PC + 1 переместить в самый конец микропрограммы?
#[[Общие положения|Общие положения Лабораторная работа 9]]
#[[Пример|Пример Лабораторная работа 9]]
#[[Задание|Задание Лабораторная работа 9]]
#[[Содержание отчета|Содержание отчета Лабораторная работа 9]]
#[[Контрольные вопросы|Контрольные вопросы Лабораторная работа 9]]
#[[Система команд учебной ЭВМ]]
#[[Представление данных в модели]] 
#[[Система команд]]
#[[Типы адресации, их коды и обозначения]] 

Для того, чтобы начать работать с TiddlyWiki, вы можете поменять следующие записи:
* SiteTitle & SiteSubtitle: Заголовок и подзаголовок сайта (после сохранения вы увидите их в заголовке окна)
* MainMenu: Меню (оно обычно слева)
* DefaultTiddlers: Список записей, которые будут открыты при запуске wiki.
Можно также почитать [[справку по вики|Вики-разметка (примеры)]].
Имя, которым будут подписаны ваши записи, можете ввести тут: <<option txtUserName>>
/***
|''Name:''|LegacyStrikeThroughPlugin|
|''Description:''|Support for legacy (pre 2.1) strike through formatting|
|''Version:''|1.0.2|
|''Date:''|Jul 21, 2006|
|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
***/

//{{{
// Ensure that the LegacyStrikeThrough Plugin is only installed once.
if(!version.extensions.LegacyStrikeThroughPlugin) {
version.extensions.LegacyStrikeThroughPlugin = {installed:true};

config.formatters.push(
{
	name: "legacyStrikeByChar",
	match: "==",
	termRegExp: /(==)/mg,
	element: "strike",
	handler: config.formatterHelpers.createElementAndWikify
});

} //# end of "install only once"
//}}}
GettingStarted
[[Занятие №  9| Лабораторная работа 9  Архитектура ЭВМ и система команд]]
[[Занятие № 11| Лабораторная работа 11  Программирование разветвляющегося процесса]]
[[Занятие № 12| Лабораторная работа 12  Моделирование работы внешних устройств]]
[[Занятие № 13| Лабораторная работа 13  Командный цикл процессора]]

---

[[ЭВМ|http://nsa1952.narod.ru/evm.exe]]     
/***
|''Name:''|ReminderPlugin|
|''Version:''|2.3.8 (Mar 9, 2006)|
|''Source:''|http://www.geocities.com/allredfaq/reminderMacros.html|
|''Author:''|Jeremy Sheeley(pop1280 [at] excite [dot] com)|
|''Licence:''|[[BSD open source license]]|
|''Macros:''|reminder, showreminders, displayTiddlersWithReminders, newReminder|
|''TiddlyWiki:''|2.0+|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
|''Hacked by:'' | //Cleb. Support for Russian dates added// |
|''Hack version:'' | //0.8b// |
|''Hack source:'' | http://glebsite.ru/tw |

!Description
This plugin provides macros for tagging a date with a reminder.  Use the {{{reminder}}} macro to do this.  The {{{showReminders}}} and {{{displayTiddlersWithReminder}}} macros automatically search through all available tiddlers looking for upcoming reminders.

!Installation
* Create a new tiddler in your tiddlywiki titled ReminderPlugin and give it the {{{systemConfig}}} tag.  The tag is important because it tells TW that this is executable code.
* Double click this tiddler, and copy all the text from the tiddler's body.
* Paste the text into the body of the new tiddler in your TW.
* Save and reload your TW.
* You can copy some examples into your TW as well.  See [[Simple examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]

!Syntax:
|>|See [[ReminderSyntax]] and [[showRemindersSyntax]]|

!Revision history
* v2.3.8 (Mar 9, 2006)
**Bug fix: A global variable had snuck in, which was killing FF 1.5.0.1
**Feature: You can now use TIDDLER and TIDDLERNAME in a regular reminder format
* v2.3.6 (Mar 1, 2006)
**Bug fix: Reminders for today weren't being matched sometimes.
**Feature:  Solidified integration with DatePlugin and CalendarPlugin
**Feature:  Recurring reminders will now return multiple hits in showReminders and the calendar.
**Feature:  Added TIDDLERNAME to the replacements for showReminders format, for plugins that need the title without brackets.
* v2.3.5 (Feb 8, 2006)
**Bug fix: Sped up reminders lots.  Added a caching mechanism for reminders that have already been matched.
* v2.3.4 (Feb 7, 2006)
**Bug fix: Cleaned up code to hopefully prevent the Firefox 1.5.0.1 crash that was causing lots of plugins 
to crash Firefox.  Thanks to http://www.jslint.com
* v2.3.3 (Feb 2, 2006)
**Feature: newReminder now has drop down lists instead of text boxes.
**Bug fix:  A trailing space in a title would trigger an infinite loop.
**Bug fix:  using tag:"birthday !reminder" would filter differently than tag:"!reminder birthday"
* v2.3.2 (Jan 21, 2006)
**Feature: newReminder macro, which will let you easily add a reminder to a tiddler. Thanks to Eric Shulman (http://www.elsdesign.com) for the code to do this.
** Bug fix: offsetday was not working sometimes
** Bug fix: when upgrading to 2.0, I included a bit to exclude tiddlers tagged with excludeSearch.  I've reverted back to searching through all tiddlers
* v2.3.1 (Jan 7, 2006)
**Feature: 2.0 compatibility
**Feature AlanH sent some code to make sure that showReminders prints a message if no reminders are found.
* v2.3.0 (Jan 3, 2006)
** Bug Fix:  Using "Last Sunday (-0)" as a offsetdayofweek wasn't working.
** Bug Fix:  Daylight Savings time broke offset based reminders (for example year:2005 month:8 day:23 recurdays:7 would match Monday instead of Tuesday during DST.

!Code
***/
//{{{

//============================================================================
//============================================================================
//           ReminderPlugin
//============================================================================
//============================================================================

version.extensions.ReminderPlugin = {major: 2, minor: 3, revision: 8, date: new Date(2006,3,9), source: "http://www.geocities.com/allredfaq/reminderMacros.html"};

//============================================================================
// Configuration
// Modify this section to change the defaults for 
// leadtime and display strings
//============================================================================

config.macros.reminders = {};
config.macros["reminder"] = {};
config.macros["newReminder"] = {};
config.macros["showReminders"] = {};
config.macros["displayTiddlersWithReminders"] = {};

config.macros.reminders["defaultLeadTime"] = [0,6000];
config.macros.reminders["defaultReminderMessage"] = "DIFF: TITLE: DATE ANNIVERSARY";
config.macros.reminders["defaultShowReminderMessage"] = "DIFF: TITLE: DATE ANNIVERSARY -- TIDDLER";
config.macros.reminders["defaultAnniversaryMessage"] = "(DIFF-летие)";
config.macros.reminders["untitledReminder"] = "Что-то";
config.macros.reminders["noReminderFound"] = "В ближайшие дни (LEADTIMEUPPER) TITLE отсутствует в планах."
config.macros.reminders["todayString"] = "''Сегодня''";
config.macros.reminders["tomorrowString"] = "''Завтра''";
config.macros.reminders["ndaysString"] = "Через DIFF дней";
config.macros.reminders["emtpyShowRemindersString"] = "Ничего не запланировано!";


//============================================================================
//  Code
// You should not need to edit anything 
// below this.  Make sure to edit this tiddler and copy 
// the code from the text box, to make sure that 
// tiddler rendering doesn't interfere with the copy 
// and paste.
//============================================================================

// This line is to preserve 1.2 compatibility
 if (!story) var story=window; 
//this object will hold the cache of reminders, so that we don't
//recompute the same reminder over again.
var reminderCache = {};

config.macros.showReminders.handler = function showReminders(place,macroName,params)
{
   var now = new Date().getMidnight();
   var paramHash = {};
   var leadtime = [0,14];
   paramHash = getParamsForReminder(params);
   var bProvidedDate = (paramHash["year"] != null) || 
			(paramHash["month"] != null) || 
			(paramHash["day"] != null) || 
			(paramHash["dayofweek"] != null);
   if (paramHash["leadtime"] != null)
   {
      leadtime = paramHash["leadtime"];
      if (bProvidedDate)
      {
         //If they've entered a day, we need to make 
         //sure to find it.  We'll reset the 
         //leadtime a few lines down.
         paramHash["leadtime"] = [-10000, 10000];
      }
   }
   var matchedDate = now;
   if (bProvidedDate)
   {
      var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);
      var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);
      matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); 
   }

   var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);
   var elem = createTiddlyElement(place,"span",null,null, null);
   var mess = "";
   if (arr.length == 0)
   {
      mess += config.macros.reminders.emtpyShowRemindersString; 
   }
   for (var j = 0; j < arr.length; j++)
   {
      if (paramHash["format"] != null)
      {
         arr[j]["params"]["format"] = paramHash["format"];
      }
      else
      {
         arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];
      }
      mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);
      mess += "\n";
   }
   wikify(mess, elem, null, null);
};


config.macros.displayTiddlersWithReminders.handler = function displayTiddlersWithReminders(place,macroName,params)
{
   var now = new Date().getMidnight();
   var paramHash = {};
   var leadtime = [0,14];
   paramHash = getParamsForReminder(params);
   var bProvidedDate = (paramHash["year"] != null) || 
			(paramHash["month"] != null) || 
			(paramHash["day"] != null) || 
			(paramHash["dayofweek"] != null);
   if (paramHash["leadtime"] != null)
   {
      leadtime = paramHash["leadtime"];
      if (bProvidedDate)
      {
         //If they've entered a day, we need to make 
         //sure to find it.  We'll reset the leadtime 
         //a few lines down.
         paramHash["leadtime"] = [-10000,10000];
      }
   }
   var matchedDate = now;
   if (bProvidedDate)
   {
      var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);
      var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);
      matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); 
   }
   var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);
   for (var j = 0; j < arr.length; j++)
   {
      displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false);
   }
};

config.macros.reminder.handler = function reminder(place,macroName,params)
{
   var dateHash = getParamsForReminder(params);
   if (dateHash["hidden"] != null)
   {
      return;
   }
   var leadTime = dateHash["leadtime"];
   if (leadTime == null)
   {
      leadTime = config.macros.reminders["defaultLeadTime"]; 
   }
   var leadTimeLowerBound = new Date().getMidnight().addDays(leadTime[0]);
   var leadTimeUpperBound = new Date().getMidnight().addDays(leadTime[1]);
   var matchedDate = findDateForReminder(dateHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound);
   if (!window.story) 
   {
      window.story=window; 
   }
   if (!store.getTiddler) 
   {
      store.getTiddler=function(title) {return this.tiddlers[title];};
   }
   var title = window.story.findContainingTiddler(place).id.substr(7);
   if (matchedDate != null)
   {
      var diff = matchedDate.getDifferenceInDays(new Date().getMidnight());
      var elem = createTiddlyElement(place,"span",null,null, null);
      var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate, title);
      wikify(mess, elem, null, null);
   }
   else
   {
      createTiddlyElement(place,"span",null,null, config.macros.reminders["noReminderFound"].replace("TITLE", dateHash["title"]).replace("LEADTIMEUPPER", leadTime[1]).replace("LEADTIMELOWER", leadTime[0]).replace("TIDDLERNAME", title).replace("TIDDLER", "[[" + title + "]]") );
   }
};

config.macros.newReminder.handler = function newReminder(place,macroName,params)
{
  var today=new Date().getMidnight();
  var formstring = '<html><form>год: <select name="year"><option value="">Каждый год</option>';
  for (var i = 0; i < 5; i++)
  {
    formstring += '<option' + ((i == 0) ? ' selected' : '') + ' value="' + (today.getFullYear() +i) + '">' + (today.getFullYear() + i) + '</option>';
  }
formstring += '</select>&nbsp;&nbsp;день:<select name="day"><option value="">Каждый день</option>';
  for (i = 1; i < 32; i++)
  {
    formstring += '<option' + ((i == (today.getDate() )) ? ' selected' : '') + ' value="' + i + '">' + i + '</option>';
  }


  formstring += '</select>&nbsp;&nbsp;месяца:<select name="month"><option value="">Каждый месяц</option>';
  for (i = 0; i < 12; i++)
  {
    formstring += '<option' + ((i == today.getMonth()) ? ' selected' : '') + ' value="' + (i+1) + '">' + config.messages.dates.months[i] + '</option>';
  }
  
formstring += '</select>&nbsp;&nbsp;<br />название:<input type="text" size="40" name="title" value="Введите название. Можно форматировать." onfocus="this.select();"><input type="button" value="Добавить" onclick="addReminderToTiddler(this.form)"></form></html>';

  var panel = config.macros.slider.createSlider(place,null,"Добавить новое напоминание","Откройте, чтобы добавить напоминание в эту запись");
  wikify(formstring ,panel,null,store.getTiddler(params[1]));
};

// onclick: process input and insert reminder at 'marker'
window.addReminderToTiddler = function(form) {
   if (!window.story) 
   {
      window.story=window; 
   }
   if (!store.getTiddler) 
   {
      store.getTiddler=function(title) {return this.tiddlers[title];};
   }
   var title = window.story.findContainingTiddler(form).id.substr(7);
   var tiddler=store.getTiddler(title);
  var txt='\n<<reminder ';
  if (form.year.value != "")
    txt += 'year:'+form.year.value + ' ';
  if (form.month.value != "")
    txt += 'month:'+form.month.value + ' ';
  if (form.day.value != "")
    txt += 'day:'+form.day.value + ' ';
  txt += 'title:"'+form.title.value+'" ';
  txt +='>>';
   tiddler.set(null,tiddler.text + txt);
   window.story.refreshTiddler(title,1,true);
   store.setDirty(true);
};

function hasTag(tiddlerTags, tagFilters)
{
  //Make sure we respond well to empty tiddlerTaglists or tagFilterlists
  if (tagFilters.length==0 || tiddlerTags.length==0)
  {
    return true;
  }

  var bHasTag = false;
  
  /*bNoPos says: "'till now there has been no check using a positive filter"
     Imagine a filterlist consisting of 1 negative filter:
         If the filter isn't matched, we want hasTag to be true.
         Yet bHasTag is still false ('cause only positive filters cause bHasTag to change)
         
     If no positive filters are present bNoPos is true, and no negative filters are matched so we have not returned false
         Thus: hasTag returns true.
      
      If at any time a positive filter is encountered, we want at least one of the tags to match it, so we turn bNoPos to false, which
      means bHasTag must be true for hasTag to return true*/
  var bNoPos=true;
  
for (var t3 = 0; t3 < tagFilters.length; t3++)
  {
      for(var t2=0; t2<tiddlerTags.length; t2++)
      {
           if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!') 
           {
              if (tiddlerTags[t2] == tagFilters[t3].substring(1))
              {
                 //If at any time a negative filter is matched, we return false
                  return false;
              }
           }
           else 
           {
              if (bNoPos)
              {
                 //We encountered the first positive filter
                 bNoPos=false;
              }
              if (tiddlerTags[t2] == tagFilters[t3])
              {
                  //A positive filter is matched. As long as no negative filter is matched, hasTag will return true
                  bHasTag=true;
              }
           }
        }
    }
    return (bNoPos || bHasTag);
};

//This function searches all tiddlers for the reminder  //macro.  It is intended that other plugins (like //calendar) will use this function to query for 
//upcoming reminders.
//The arguments to this function filter out reminders //based on when they will fire.
//
//ARGUMENTS:
//baseDate is the date that is used as "now".  
//leadtime is a two element int array, with leadtime[0] 
//         as the lower bound and leadtime[1] as the
//         upper bound.  A reasonable default is [0,14]
//tags is a space-separated list of tags to use to filter 
//         tiddlers.  If a tag name begins with an !, then 
//         only tiddlers which do not have that tag will 
//         be considered.  For example "examples holidays"  
//         will search for reminders in any tiddlers that  
//         are tagged with examples or holidays and 
//         "!examples !holidays" will search for reminders 
//         in any tiddlers that are not tagged with 
//         examples or holidays.  Pass in null to search 
//         all tiddlers.
//limit.  If limit is null, individual reminders can 
//        override the leadtime specified earlier.  
//        Pass in 1 in order to override that behavior.

window.findTiddlersWithReminders = function findTiddlersWithReminders(baseDate, leadtime, tags, limit)
{
//function(searchRegExp,sortField,excludeTag)
//   var macroPattern = "<<([^>\\]+)(?:\\*)([^>]*)>>";
   var macroPattern = "<<(reminder)(.*)>>";
   var macroRegExp = new RegExp(macroPattern,"mg");
   var matches = store.search(macroRegExp,"title","");
   var arr = [];
   var tagsArray = null;
   if (tags != null)
   {
      tagsArray = tags.split(" ");
   }
   for(var t=matches.length-1; t>=0; t--)
   {
      if (tagsArray != null)
      {
         //If they specified tags to filter on, and this tiddler doesn't 
	 //match, skip it entirely.
         if ( ! hasTag(matches[t].tags, tagsArray))
         {
            continue;
         }
      }

      var targetText = matches[t].text;
      do {
         // Get the next formatting match
         var formatMatch = macroRegExp.exec(targetText);
         if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")
         {
            //Find the matching date.
            
            var params = formatMatch[2] != null ? formatMatch[2].readMacroParams() : {};
            var dateHash = getParamsForReminder(params);
            if (limit != null || dateHash["leadtime"] == null)
            {
               if (leadtime == null)
                   dateHash["leadtime"] = leadtime;
               else
               {
                  dateHash["leadtime"] = [];
                  dateHash["leadtime"][0] = leadtime[0];
                  dateHash["leadtime"][1] = leadtime[1];
               }
            }
	    if (dateHash["leadtime"] == null)
               dateHash["leadtime"] = config.macros.reminders["defaultLeadTime"]; 
            var leadTimeLowerBound = baseDate.addDays(dateHash["leadtime"][0]);
            var leadTimeUpperBound = baseDate.addDays(dateHash["leadtime"][1]);
            var matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);
            while (matchedDate != null)
            {
               var hash = {};
               hash["diff"] = matchedDate.getDifferenceInDays(baseDate);
               hash["matchedDate"] = new Date(matchedDate.getFullYear(), matchedDate.getMonth(), matchedDate.getDate(), 0, 0);
               hash["params"] = cloneParams(dateHash);
               hash["tiddler"] = matches[t].title;
               hash["tags"] = matches[t].tags;
               arr.pushUnique(hash);
	       if (dateHash["recurdays"] != null || (dateHash["year"] == null))
	       {
	         leadTimeLowerBound = leadTimeLowerBound.addDays(matchedDate.getDifferenceInDays(leadTimeLowerBound)+ 1);
                 matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);
	       }
	       else matchedDate = null;
            }
         }
      }while(formatMatch);
   }
   if(arr.length > 1)  //Sort the array by number of days remaining.
   {
      arr.sort(function (a,b) {if(a["diff"] == b["diff"]) {return(0);} else {return (a["diff"] < b["diff"]) ? -1 : +1; } });
   }
   return arr;
};

//This function takes the reminder macro parameters and
//generates the string that is used for display.
//This function is not intended to be called by 
//other plugins.
 window.getReminderMessageForDisplay= function getReminderMessageForDisplay(diff, params, matchedDate, tiddlerTitle)
{
   var anniversaryString = "";
   var reminderTitle = params["title"];
   if (reminderTitle == null)
   {
      reminderTitle = config.macros.reminders["untitledReminder"];
   }
   if (params["firstyear"] != null)
   {
      anniversaryString = config.macros.reminders["defaultAnniversaryMessage"].replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));
   }
   var mess = "";
   var diffString = "";
   if (diff == 0)
   {
      diffString = config.macros.reminders["todayString"];
   }
   else if (diff == 1)
   {
      diffString = config.macros.reminders["tomorrowString"];
   }
   else if (diff == 2)
   {
      diffString = "''Послезавтра''";
   }
   else if (diff == -1)
   {
      diffString = "//Вчера//";
   }
   else if (diff == -2)
   {
      diffString = "//Позавчера//";
   }
   else
   {
      diff-=1; //HACK(ru)
      diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);
   }
   var format = config.macros.reminders["defaultReminderMessage"];
   if (params["format"] != null)
   {
      format = params["format"];
   }
   mess = format;
//HACK!  -- Avoid replacing DD in TIDDLER with the date
   mess = mess.replace(/TIDDLER/g, "TIDELER");
   mess = matchedDate.formatStringDateOnly(mess);
   mess = mess.replace(/TIDELER/g, "TIDDLER");
   if (tiddlerTitle != null)
   {
      mess = mess.replace(/TIDDLERNAME/g, tiddlerTitle);
      mess = mess.replace(/TIDDLER/g, "[[" + tiddlerTitle + "]]");
   }
   
   mess = mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("DDD, [[DD MMM]], YYYY")).replace("ANNIVERSARY", anniversaryString);
//RUSSIAN LANGUAGE HACK
   var daysS = diff.toString();
   var lastD = daysS.charAt(daysS.length-1);
   var lastDs = daysS.substring(daysS.length-2 );

   
   var rD = "дней";
   var rD1 = "1";
   var rD234 = "2-3-4";
   var rD5_9 = "5-6-7-8-9";

   daysS = daysS.substring(daysS.length-2);

if( (lastDs.indexOf("14") == -1)&&(lastDs.indexOf("13") == -1)&&(lastDs.indexOf("12") == -1)&&(lastDs.indexOf("11") == -1) ){
      if (rD1.indexOf(lastD)!=-1){
         rD = "день";  
      }
      if (rD234.indexOf(lastD)!=-1){
         rD = "дня";  
     }
  } 

if(diff<0){
mess = mess.replace(/Через -/, ""  );
mess = mess.replace(/ дней/, " дней назад"  );
}
   mess = mess.replace(/ дней/, " "+rD  );
//HACK ENDS
   return mess;
};



// Parse out the macro parameters into a hashtable.  This
// handles the arguments for reminder, showReminders and 
// displayTiddlersWithReminders.
window.getParamsForReminder = function getParamsForReminder(params)
{
   var dateHash = {};
   var type = "";
   var num = 0;
   var title = "";
   for(var t=0; t<params.length; t++)
   {
      var split = params[t].split(":");
      type = split[0].toLowerCase();
      var value = split[1];
      for (var i=2; i < split.length; i++)
      {
         value += ":" + split[i];
      }
      if (type == "nolinks" || type == "limit" || type == "hidden")
      {
         num = 1;
      }
      else if (type == "leadtime")
      {
         var leads = value.split("...");
         if (leads.length == 1)
         {
            leads[1]= leads[0];
            leads[0] = 0;
         }
         leads[0] = parseInt(leads[0], 10);
         leads[1] = parseInt(leads[1], 10);
         num = leads;
      }
      else if (type == "offsetdayofweek")
      {
          if (value.substr(0,1) == "-")
          {
             dateHash["negativeOffsetDayOfWeek"] = 1;
	     value = value.substr(1);
          }
          num = parseInt(value, 10);
      }
      else if (type != "title" && type != "tag" && type != "format")
      {
         num = parseInt(value, 10);
      }
      else
      {
         title = value;
         t++;
         while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"' && params[t] != undefined)
         {
            title += " " + params[t++];
         }
         //Trim off the leading and trailing quotes
         if (title.substr(0,1) == "\"" && title.substr(title.length - 1,1)== "\"")
         {
            title = title.substr(1, title.length - 2);
            t--;
         }
         num = title;
      }
      dateHash[type] = num;
   }
   //date is synonymous with day
   if (dateHash["day"] == null)
   {
      dateHash["day"] = dateHash["date"];
   }
   return dateHash;
};

//This function finds the date specified in the reminder 
//parameters.  It will return null if no match can be
//found.  This function is not intended to be used by
//other plugins.
window.findDateForReminder= function findDateForReminder( dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound)
{
   if (baseDate == null)
   {
     baseDate = new Date().getMidnight();
   }
   var hashKey = baseDate.convertToYYYYMMDDHHMM();
   for (var k in dateHash)
   {
      hashKey += "," + k + "|" + dateHash[k];
   }
   hashKey += "," + leadTimeLowerBound.convertToYYYYMMDDHHMM();
   hashKey += "," + leadTimeUpperBound.convertToYYYYMMDDHHMM();
   if (reminderCache[hashKey] == null)
   {
      //If we don't find a match in this run, then we will
      //cache that the reminder can't be matched.
      reminderCache[hashKey] = false;
   }
   else if (reminderCache[hashKey] == false)
   {
      //We've already tried this date and failed
      return null;
   }
   else
   {
      return reminderCache[hashKey];
   }
   
   var bOffsetSpecified = dateHash["offsetyear"] != null || 
				dateHash["offsetmonth"] != null || 
				dateHash["offsetday"] != null || 
				dateHash["offsetdayofweek"] != null || 
				dateHash["recurdays"] != null;
   
   // If we are matching the base date for a dayofweek offset, look for the base date a 
   //little further back.
   var tmp1leadTimeLowerBound = leadTimeLowerBound;  
   if ( dateHash["offsetdayofweek"] != null)
   {
      tmp1leadTimeLowerBound = leadTimeLowerBound.addDays(-6);  
   }
   var matchedDate = baseDate.findMatch(dateHash, tmp1leadTimeLowerBound, leadTimeUpperBound);
   if (matchedDate != null)
   {
      var newMatchedDate = matchedDate;
      if (dateHash["recurdays"] != null)
      {
         while (newMatchedDate.getTime() < leadTimeLowerBound.getTime())
         {
            newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);
         }
      }
      else if (dateHash["offsetyear"] != null || 
		dateHash["offsetmonth"] != null || 
		dateHash["offsetday"] != null || 
		dateHash["offsetdayofweek"] != null)
      {
         var tmpdateHash = cloneParams(dateHash);
         tmpdateHash["year"] = dateHash["offsetyear"];
         tmpdateHash["month"] = dateHash["offsetmonth"];
         tmpdateHash["day"] = dateHash["offsetday"];
         tmpdateHash["dayofweek"] = dateHash["offsetdayofweek"];
	 var tmpleadTimeLowerBound = leadTimeLowerBound;
	 var tmpleadTimeUpperBound = leadTimeUpperBound;
	 if (tmpdateHash["offsetdayofweek"] != null)
	 {
	 	if (tmpdateHash["negativeOffsetDayOfWeek"] == 1)
		{
		   tmpleadTimeLowerBound = matchedDate.addDays(-6);
		   tmpleadTimeUpperBound = matchedDate;

		}
		else
		{
		   tmpleadTimeLowerBound = matchedDate;
		   tmpleadTimeUpperBound = matchedDate.addDays(6);
		}

	 }
	 newMatchedDate = matchedDate.findMatch(tmpdateHash, tmpleadTimeLowerBound, tmpleadTimeUpperBound);
         //The offset couldn't be matched.  return null.
         if (newMatchedDate == null)
         {
            return null;
         }
      }
      if (newMatchedDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))
      {
         reminderCache[hashKey] = newMatchedDate;
         return newMatchedDate;
      }
   }
   return null;
};

//This does much the same job as findDateForReminder, but
//this one doesn't deal with offsets or recurring 
//reminders.
Date.prototype.findMatch = function findMatch(dateHash, leadTimeLowerBound, leadTimeUpperBound)
{

   var bSpecifiedYear =     (dateHash["year"] != null);
   var bSpecifiedMonth =     (dateHash["month"] != null);
   var bSpecifiedDay =     (dateHash["day"] != null);
   var bSpecifiedDayOfWeek =     (dateHash["dayofweek"] != null);
   if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)
   {
      return new Date(dateHash["year"], dateHash["month"]-1, dateHash["day"], 0, 0);
   }
   var bMatchedYear = !bSpecifiedYear;
   var bMatchedMonth = !bSpecifiedMonth;
   var bMatchedDay = !bSpecifiedDay;
   var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;
   if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)
   {

      //Shortcut -- First try this year.  If it's too small, try next year.
      var tmpMidnight = this.getMidnight();
      var tmpDate = new Date(this.getFullYear(), dateHash["month"]-1, dateHash["day"], 0,0);
      if (tmpDate.getTime() < leadTimeLowerBound.getTime())
      {
         tmpDate = new Date((this.getFullYear() + 1), dateHash["month"]-1, dateHash["day"], 0,0);
      }
      if ( tmpDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))
      {
         return tmpDate;
      }
      else
      {
         return null;
      }
   }

   var newDate = leadTimeLowerBound; 
   while (newDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))
   {
      var tmp = testDate(newDate, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek);
      if (tmp != null)
        return tmp;
      newDate = newDate.addDays(1);
   }
};

function testDate(testMe, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek)
{
   var bMatchedYear = !bSpecifiedYear;
   var bMatchedMonth = !bSpecifiedMonth;
   var bMatchedDay = !bSpecifiedDay;
   var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;
   if (bSpecifiedYear)
   {
      bMatchedYear = (dateHash["year"] == testMe.getFullYear());
   }
   if (bSpecifiedMonth)
   {
      bMatchedMonth = ((dateHash["month"] - 1)  == testMe.getMonth() );
   }
   if (bSpecifiedDay)
   {
      bMatchedDay = (dateHash["day"] == testMe.getDate());
   }
   if (bSpecifiedDayOfWeek)
   {
      bMatchedDayOfWeek = (dateHash["dayofweek"] == testMe.getDay());
   }

   if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)
   {
      return testMe;
   }
};

//Returns true if the date is in between two given dates
Date.prototype.isBetween = function isBetween(lowerBound, upperBound)
{
  return (this.getTime() >= lowerBound.getTime() && this.getTime() <= upperBound.getTime());
}
//Return a new date, with the time set to midnight (0000)
Date.prototype.getMidnight = function getMidnight()
{
   return new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0);
};
// Add the specified number of days to a date.
Date.prototype.addDays = function addDays(numberOfDays)
{
   return new Date(this.getFullYear(), this.getMonth(), this.getDate() + numberOfDays, 0, 0);
};
//Return the number of days between two dates.
Date.prototype.getDifferenceInDays = function getDifferenceInDays(otherDate)
{
//I have to do it this way, because this way ignores daylight savings
   var tmpDate = this.addDays(0);
   if (this.getTime() > otherDate.getTime())
   {
      var i = 0;
      for (i = 0; tmpDate.getTime() > otherDate.getTime(); i++)
      {
         tmpDate = tmpDate.addDays(-1);
      }
      return i;
   }
   else
   {
      var i = 0;
      for (i = 0; tmpDate.getTime() < otherDate.getTime(); i++)
      {
         tmpDate = tmpDate.addDays(1);
      }
      return i * -1;
   }
   return 0;
};
function cloneParams(what) {
    var tmp = {};
    for (var i in what) {
        tmp[i] = what[i];
    }
    return tmp;
}
// Substitute date components into a string
Date.prototype.formatStringDateOnly = function formatStringDateOnly(template)
{
	template = template.replace("YYYY",this.getFullYear());
	template = template.replace("YY",String.zeroPad(this.getFullYear()-2000,2));
	template = template.replace("MMM",config.messages.dates.months[this.getMonth()]);
	template = template.replace("0MM",String.zeroPad(this.getMonth()+1,2));
	template = template.replace("MM",this.getMonth()+1);
	template = template.replace("DDD",config.messages.dates.days[this.getDay()]);
	template = template.replace("0DD",String.zeroPad(this.getDate(),2));
	template = template.replace("DD",this.getDate());
	return template;
};

//}}}
/***
|''Name:''|RuStyle|
|''Description:''|TW russianization|
|''Version:''|0.6.0|
|''Date:''|2006|
|''Source:''|http://www.glebsite.ru|
|''Author:''|Глеб Тржемецкий (Gleb Trzhemetski)|
|''License:''|BSD open source license|
|''CoreVersion:''|2.1.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|

***/

//{{{

merge(config.messages,{
	customConfigError: "Возникли проблемы при загрузке плагинов. См. PluginManager ",
	pluginError: "Ошибка: %0",
	pluginDisabled: "Не задействован, так как помечен 'systemConfigDisable' ",
	pluginForced: "Задействован, так как помечен 'systemConfigForce' ",
	pluginVersionError: "Не задействован из-за несоответствия версий",
	nothingSelected: "Ничего не выделено.",
	savedSnapshotError: "Похоже, эта wiki была неправильно сохранена. См. http://www.tiddlywiki.com/#DownloadSoftware ",
	subtitleUnknown: "(неизвестно)",
	undefinedTiddlerToolTip: "Записи '%0' не существует",
	shadowedTiddlerToolTip: "Запись '%0' заполнена по умолчанию.",
	tiddlerLinkTooltip: "%0 - %1, %2",
	externalLinkTooltip: "Ссылка: %0",
	noTags: "Нет помеченных записей",
	notFileUrlError: "Сохраните TiddlyWiki в файл, чтобы иметь возможность сохранять изменения ",
	cantSaveError: "Сохранение невозможно. Либо ваш браузер не подерживает эту функцию (используйте по возможности FireFox), либо путь к файлу содержит недопустимые символы",
	invalidFileError: "Файл '%0' не похож на файл TiddlyWiki",
	backupSaved: "Резервная копия сохранена",
	backupFailed: "Не получилось сохранить резервную копию",
	rssSaved: "RSS сохранен",
	rssFailed: "Не получилось сохранить RSS",
	emptySaved: "Пустой шаблон сохранен",
	emptyFailed: "Не получилось сохранить пустой шаблон",
	mainSaved: "Файл TiddlyWiki сохранен",
	mainFailed: "Не получилось сохранить файл TiddlyWiki. Изменения не сохранены",
	macroError: "Ошибка в сценарии <<%0>>",
	macroErrorDetails: "Ошибка при выполнении сценария  <<%0>>:\n%1",
	missingMacro: "Нет такого сценария",
	overwriteWarning: "Запись '%0' уже есть. Нажмите OK, чтобы перезаписать",
	unsavedChangesWarning: "ВНИМАНИЕ! Есть несохраненные изменения! \n\nНажмите OK, чтобы сохранить\nНажмите CANCEL чтобы не сохранять",
	confirmExit: "--------------------------------\n\nИзменения в TiddlyWiki не сохранены. Если вы продолжите, они потеряются.\n\n--------------------------------",
	saveInstructions: "SaveChanges",
	unsupportedTWFormat: "Неподдерживаемый TiddlyWiki формат '%0'",
	tiddlerSaveError: "Ошибка при сохранении записи '%0'",
	tiddlerLoadError: "Ошибка при открытии записи '%0'",
	wrongSaveFormat: "Не получается сохранить в формате '%0'. Сохранено в стандартном формате.",
	invalidFieldName: "Недопустимое имя поля %0",
	fieldCannotBeChanged: "Поле '%0' нельзя изменять"});

merge(config.messages.messageClose,{
	text: "×",
	tooltip: "скрыть сообщение"});

config.messages.dates.months = ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября","декабря"];
config.messages.dates.days = ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];
config.messages.dates.shortMonths = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"];
config.messages.dates.shortDays = ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"];

merge(config.views.wikified.tag,{
	labelNoTags: "меток нет",
	labelTags: "метки: ",
	openTag: "Открыть метку '%0'",
	tooltip: "Показать записи, помеченные как '%0'",
	openAllText: "Открыть все",
	openAllTooltip: "Открыть все эти записи",
	popupNone: "Нет других записей с меткой '%0'"});

merge(config.views.wikified,{
	defaultText: "Записи '%0' не существует. Создайте ее двойным щелчком.",
	defaultModifier: "(?)",
	shadowModifier: "(системная запись)",
	createdPrompt: "создана: "});

merge(config.views.editor,{
	tagPrompt: "Введите метки, разделенные пробелами, [[используйте квадратные скобки]] если нужно, или выберите метки из списка.",
	defaultText: "Здесь мог бы быть осмысленный текст на тему '%0'"});

merge(config.views.editor.tagChooser,{
	text: "метки",
	tooltip: "Выберите метки из списка",
	popupNone: "Меток пока нет",
	tagTooltip: "Добавить метку '%0'"});

merge(config.macros.search,{
	label: "поиск",
	prompt: "Поиск по всем записям",
	accessKey: "F",
	successMsg: "%0 записей, соответствующих критерию: %1",
	failureMsg: "Не найдено записей по запросу: %0"});

merge(config.macros.tagging,{
	label: "отмечены: ",
	labelNotTag: "нету",
	tooltip: "Список записей, помеченных: '%0'"});

merge(config.macros.timeline,{
	dateFormat: "DD.mmm.YYYY"});

merge(config.macros.allTags,{
	tooltip: "Показать записи, помеченные '%0'",
	noTags: "Нет таких записей"});

config.macros.list.all.prompt = "Все записи по алфавиту";
config.macros.list.missing.prompt = "Ненаписанные";
config.macros.list.orphans.prompt = "Записи, на которые нет ссылок";
config.macros.list.shadowed.prompt = "Системные записи";

merge(config.macros.closeAll,{
	label: "закрыть все",
	prompt: "Закрыть все записи \(кроме редактируемых\)"});

merge(config.macros.permaview,{
	label: "ссылка",
	prompt: "Постоянная ссылка"});

merge(config.macros.saveChanges,{
	label: "сохранить изменения",
	prompt: "Сохранить всё",
	accessKey: "S"});

merge(config.macros.newTiddler,{
	label: "новая запись",
	prompt: "Создать новую запись",
	title: "Новая запись",
	accessKey: "N"});

merge(config.macros.newJournal,{
	label: "новая датированная запись",
	prompt: "Создать запись, с названием, соответствующим текущей дате",
	accessKey: "J"});

merge(config.macros.plugins,{
	skippedText: "(Этот плагин не запущен, так как был добавлен после запуска)",
	noPluginText: "Плагинов нет",
	confirmDeleteText: "Вы действительно хотите удалить записи:\n\n%0",
	listViewTemplate : {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Title', field: 'title', tiddlerLink: 'title', title: "Title", type: 'TiddlerLink'},
			{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
			{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
			{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
			{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
			{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'warning'}
			],
		actions: [
			{caption: "Действия...", name: ''},
			{caption: "Сделать не системной записью", name: 'remove'},
			{caption: "Удалить из wiki", name: 'delete'}
			]}
	});

merge(config.macros.refreshDisplay,{
	label: "обновить",
	prompt: "Обновить отображение"
	});

merge(config.macros.importTiddlers,{
	defaultPath: "http://www.tiddlywiki.com/index.html",
	fetchLabel: "загрузить",
	fetchPrompt: "Загрузить файл TiddlyWiki",
	fetchError: "Ошибка при загрузке файла",
	confirmOverwriteText: "Вы уверены, что хотите перезаписать следующие записи:\n\n%0",
	wizardTitle: "Импорт записей из файла TiddlyWiki",
	step1: "Шаг 1: Введите путь к файлу",
	step1prompt: "Введите URL или путь к локальному файлу: ",
	step1promptFile: "...или выберите тут: ",
	step1promptFeeds: "...или из предустановленных: ",
	step1feedPrompt: "Выберите...",
	step2: "Шаг 2: Загрузка файла",
	step2Text: "Дождитесь окончания загрузки: %0",
	step3: "Шаг 3: Выберите записи для импорта:",
	step4: "%0 записей импортировано",
	step5: "Готово!",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Title', field: 'title', title: "Title", type: 'String'},
			{name: 'Snippet', field: 'text', title: "Snippet", type: 'String'},
			{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
			],
		rowClasses: [
			],
		actions: [
			{caption: "Действия...", name: ''},
			{caption: "Импортировать", name: 'import'}
			]}
	});

merge(config.commands.closeTiddler,{
	text: "закрыть",
	tooltip: "Закрыть запись"});

merge(config.commands.closeOthers,{
	text: "закрыть остальные",
	tooltip: "Закрыть все записи, кроме этой"});

merge(config.commands.editTiddler,{
	text: "редактировать",
	tooltip: "Редактировать запись",
	readOnlyText: "исходный код",
	readOnlyTooltip: "Просмотреть исходный код записи"});

merge(config.commands.saveTiddler,{
	text: "готово",
	tooltip: "Сохранить изменения"});

merge(config.commands.cancelTiddler,{
	text: "отменить",
	tooltip: "Отменить изменения",
	warning: "Вы уверены, что не хотите сохранить запись '%0'?",
	readOnlyText: "обычный вид",
	readOnlyTooltip: "Вернуться к обычному просмотру"});

merge(config.commands.deleteTiddler,{
	text: "удалить",
	tooltip: "Удалить запись",
	warning: "Вы действительно хотите удалить '%0'?"});

merge(config.commands.permalink,{
	text: "ссылка",
	tooltip: "Постоянная ссылка на эту запись"});

merge(config.commands.references,{
	text: "ссылки сюда",
	tooltip: "Показать записи, ссылающиеся на эту",
	popupNone: "Ссылок нет"});

merge(config.commands.jump,{
	text: "перейти...",
	tooltip: "Перейти на другие открытые записи"});

merge(config.shadowTiddlers,{
	DefaultTiddlers: "GettingStarted",
	MainMenu: "GettingStarted",
	SiteTitle: "~TiddlyWiki(ru)",
	SiteSubtitle: "нелинейный гипертекстовый органайзер",
	SiteUrl: "http://www.tiddlywiki.com/",
	GettingStarted: "Для того, чтобы начать работать с TiddlyWiki, вы можете поменять следующие записи:\n* SiteTitle & SiteSubtitle: Заголовок и подзаголовок сайта (после сохранения вы увидите их в заголовке окна)\n* MainMenu: Меню (оно обычно слева)\n* DefaultTiddlers: Список записей, которые будут открыты при запуске wiki.\nИмя, которым будут подписаны ваши записи, можете ввести тут: <<option txtUserName>>",
	SideBarOptions: "<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY г.'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'установки »' 'Различные опции TidlyWiki'>>",
	OptionsPanel: "Эти установки сохраняются в&nbsp\;Вашем браузере\n\nВаше имя для подписывания заметок. Лучше, если вы напишете его WotTak\n\n<<option txtUserName>>\n<<option chkSaveBackups>> Сохранять резервные копии\n<<option chkAutoSave>> Автосохранение\n<<option chkRegExpSearch>> Поиск с&nbsp\;регулярными выражениями\n<<option chkCaseSensitiveSearch>> Поиск чувствителен к&nbsp\;регистру?\n<<option chkAnimate>> Анимация\n\n----\n[[Дополнительно|AdvancedOptions]]\n[[Плагины|PluginManager]]\n[[Импорт записей|ImportTiddlers]]",
	AdvancedOptions: "<<option chkGenerateAnRssFeed>> Публиковать RSS\n<<option chkOpenInNewWindow>>  Ссылки в новом окне\n<<option chkSaveEmptyTemplate>> Сохранять пустой шаблон\n<<option chkToggleLinks>> Щелчок по ссылке на открытую заметку закрывает ее\n^^(с Ctrl или другой функциональной клавишей не&nbsp\;будет срабатывать)^^\n<<option chkHttpReadOnly>> Не показывать инструменты редактирования через HTTP\n<<option chkForceMinorUpdate>> Не менять дату заметки при редактировании\n^^(для изменеия - жмите Shift при сохранеии, либо сохраняйте, нажимая Ctrl-Shift-Enter^^\n<<option chkConfirmDelete>> Подтверждать удаление\nМаксимум строк в&nbsp\;поле редактирования: <<option txtMaxEditRows>>\nСохранять бэкапы в&nbsp\;папке: <<option txtBackupFolder>>\n<<option chkInsertTabs>> При нажатии Tab вводить знак табуляции, а&nbsp\;не&nbsp\;переходить к&nbsp\;следующему элементу формы",
	SideBarTabs: "<<tabs txtMainTab История История TabTimeline Все 'Все заметки' TabAll Метки 'Все метки' TabTags Ещё... 'Остальные списки' TabMore>>",
	TabTimeline: "<<timeline>>",
	TabAll: "<<list all>>",
	TabTags: "<<allTags>>",
	TabMore: "<<tabs txtMoreTab Нужные 'Ненаписанные заметки' TabMoreMissing Забытые 'Забытые заметки' TabMoreOrphans Системные 'Системные записи' TabMoreShadowed>>",
	TabMoreMissing: "<<list missing>>",
	TabMoreOrphans: "<<list orphans>>",
	TabMoreShadowed: "<<list shadowed>>",
	PluginManager: "<<plugins>>",
	ImportTiddlers: "<<importTiddlers>>"});



//}}}
Лабораторные работы
Вычислительная техника и программирование
[img[Варианты|zan10zadanie.jpg]]
Данная запись даёт примеры разных видов вики-разметки. Можете использовать эту запись как встроенную справку, чтобы узнать, как набирать текст в TiddlyWiki.

Самое важное: выделяйте слово или группу слов двойными квадратными скобками вот так:
{{{
[[Список дел]]
}}}
чтобы появилась вики-ссылка, например [[Список дел]]. На первое время этого хватит.

Другие возможности:
* [[Гипертекстовые ссылки (подробнее)|Ссылки (примеры)]]
* [[Разные шрифты|Разные шрифты (примеры)]]
* [[Нумерованные и ненумерованные списки|Списки (примеры)]]
* [[Выделение цитат|Цитирование (примеры)]]
* [[Подзаголовки|Подзаголовки (примеры)]]
* [[Таблицы|Набор таблиц (примеры)]]
* [[Вставка изображений|Вставка изображений (примеры)]]

Не забывайте сохранять сделанные изменения!

Если в вашу вики дополнительно установлен [[ReminderMacros(ru)]], то вы можете помещать напоминания в ваши записи:
* [[Напоминания (примеры)]]
Изображения вставляются следующим образом:
{{{
[img[путь-к-файлу-с-изображением]]
}}}

Обычно удобно, если изображение находится в том же каталоге, что и файл с TiddlyWiki. Тогда во внутренних квадратных скобках достаточно указать имя файла.
Дисплей  представляет собой модель внешнего устройства, реали&shy;зующую функции символьного дисплея. Дисплей может отображать симво&shy;лы, задаваемые ASCII-кодами, поступающими на его регистр данных. Дис&shy;плей включает:
видеопамять объемом 128 слов (ОЗУ дисплея);
символьный экран размером 8 строк по 16 символов в строке;
четыре программно-доступных регистра:

DR (адрес 0) — регистр данных;
CR (адрес 1) — регистр управления;
SR (адрес 2) — регистр состояния;
AR (адрес 3) — регистр адреса.

[img[Схема|Lz12shema2.jpg]]


Окно обозревателя контроллера дисплея

[img[Окно обозревателя контроллера дисплея|Lz12ris2.jpg]]


Через регистры адреса AR и данных DR по записи и чтению осуществляется доступ к ячейкам видеопамяти. При обращении к регистру DR по записи со-
держимое аккумулятора записывается в DR и в ячейку видеопамяти, адрес которой установлен в регистре AR.
Регистр управления CR доступен только по записи и содержит в 4-м и 5-м разрядах соответственно два флага:
Е — флаг разрешения работы дисплея; при Е = 0 запись в регистры AR и DR блокируется;
А — флаг автоинкремента адреса; при А = 1 содержимое AR автомати&shy;чески увеличивается на 1 после любого обращения к регистру DR— по записи или чтению.
Изменить значения этих флагов можно, если записать по адресу CR (по умолчанию — 11) код ххх0nn, при этом изменение 4-го и 5-го разрядов реги&shy;стра CR произойдет согласно выражению (8.1).
Для программного управления дисплеем предусмотрены две команды, коды которых должны записываться по адресу регистра CR, причем в третьем раз&shy;ряде командных слов обязательно должна быть 1:
xxxl0l — очистить дисплей (действие команды эквивалентно нажатию кнопки Очистить в окне Дисплей), при этом очищается видеопамять (в каждую ячейку записывается код пробела — 032), устанавливается в ООО регистр адреса AR и сбрасываются флаги ошибки Err и автоинкремента А;
ххх102 — сбросить флаг ошибки Err.
Регистр состояния SR доступен только по чтению и содержит единственный флаг (в пятом разряде) ошибки Err. Этот флаг устанавливается аппаратно при попытке записать в регистр адреса число, большее 127, причем как в режиме прямой записи в AR, так и в режиме автоинкремента после обращения по ад&shy;ресу 127. Сбрасывается флаг Err программно или при нажатии кнопки Очи&shy;стить в окне Дисплей.




Пример простой программы, выводящей на дисплей (в начало экрана) слово «Май»:

Метка 	Команда	Примечание
 	RD #11	; включаем дисплей и устанавливаем
 	OUT 11	; флаг автоинкремента;
 	RD #0	; задаём начальный адрес
 	OUT 13	; выводимого слова;
 	RD #204	; ввод кода буквы «М»
 	OUT 10	; вывод на дисплей
 	RD #224	; ввод кода буквы «а»
 	OUT 10	; вывод на дисплей
 	RD #233	; ввод кода буквы «й»
 	OUT 10	; вывод на дисплей
 	HLT	 

Ещё один пример программы, выставляющей в начало каждой строки её номер:

Метка	Команда	Примечание
 	RD #10	; включаем
 	OUT 11	; дисплей;
 	RD #0	; задаём начальный
 	WR R1	; адрес вывода;
 	RD #49	; вводим код
 	WR R2	; цифры «1»;
 	RD #8	; вводим число
 	WR R3	; повторений цикла;
M1:   	RD R1	; читаем текущий адрес
 	OUT 13	; и передаём в регистр адреса дисплея;
 	ADD #16	; увеличиваем адрес на 16 – на начало следующей строки;
 	WR R1	; сохраняем изменённый адрес;
 	RD R2	; читаем код цифры – номер строки;
 	OUT 10	; передаём код цифры на дисплей;
 	RD @R2+	; увеличиваем содержимое R2 (код цифры) на единицу;
 	JRNZ R3,M1 	; декремент R3 и переход на начало цикла, если R3 ≠ 0;
 	HLT	 
1.	Ознакомиться с архитектурой ЭВМ (см. Лекции).
2.	Записать в ОЗУ "программу", состоящую из пяти команд— варианты задания выбрать из табл. 
3.     Команды разместить в последовательных ячейках памяти.
3.	При необходимости установить начальное значение в устройство ввода IR.
4.	Определить те программно-доступные объекты ЭВМ, которые будут изменяться при выполнении этих команд.
5.	Выполнить в режиме Шаг введенную последовательность команд, фиксируя изменения значений объектов, определенных в п. 4, в таблице (см. форму табл. 2).
6.	Если в программе образуется цикл, необходимо просмотреть не более двух повторений каждой команды, входящей в тело цикла.

[img[Таблица 3|Lz9tab3.jpg]]
Контроллер клавиатуры представляет собой модель внешнего устройства, принимающего ASCII-коды  от клавиатуры ПЭВМ.

[img[Схема|Lz12shema1.jpg]]

Окно обозревателя контроллера клавиатуры

[img[Окно обозревателя контроллера клавиатуры|Lz12ris1.jpg]]


Символы помещаются последовательно в буфер символов, размер которого установлен равным 50 символам, и отображаются в окне обозревателя.
В состав контроллера клавиатуры входят три программно-доступных регистра:
*	DR (адрес 0) — регистр данных;
*	CR (адрес 1) — регистр управления, определяет режимы работы контроллера и содержит следующие флаги:
**	Е — флаг разрешения приема кодов в буфер;
**	I — флаг разрешения прерывания;
**	S — флаг режима посимвольного ввода.
*	SR (адрес 2) — регистр состояния, содержит два флага:
**	Err — флаг ошибки;
**	Rd — флаг готовности.


Регистр данных DR доступен только для чтения, через него считываются ASCII-коды из буфера, причем порядок чтения кодов из буфера соответствует порядку их записи в буфер — каждое чтение по адресу 0 автоматически перемещает указатель чтения буфера. В каждый момент времени DR содержит код символа по адресу указателя чтения буфера.
Флаги регистра управления CR устанавливаются и сбрасываются программно.
 
Флаг Е, будучи установленным, разрешает прием кодов в буфер. При Е = О контроллер игнорирует нажатие на клавиатуре, прием кодов в буфер не про¬изводится. На считывание кодов из буфера флаг Е влияния не оказывает.
Флаг I, будучи установленным, разрешает при определенных условиях формирование контроллером запроса на прерывание. При I = 0 запрос на прерывание не формируется.
Флаг S = 1 устанавливает т. н. режим посимвольного ввода, иначе контроллер работает в обычном режиме. Флаг S устанавливается и сбрасывается программно, кроме того, S сбрасывается при нажатии кнопки Очистить буфер в окне Контроллер клавиатуры.
Условия формирования запроса на прерывание определяются, с одной стороны, значением флага разрешения прерывания I, с другой — режимом работы контроллера. В режиме посимвольного ввода запрос на прерывание формируется после ввода каждого символа (разумеется, при 1=1), в обычном режиме запрос будет сформирован по окончании набора строки.
Завершить набор строки можно, щелкнув по кнопке Завершить ввод в окне Контроллер клавиатуры. При этом устанавливается флаг готовности Rd (от англ. ready) в регистре состояния SR. Флаг ошибки Err (от англ. error) в том же регистре устанавливается при попытке ввода в буфер 51-го символа. Ввод 51-го и всех последующих символов блокируется.
Сброс флага Rd осуществляется автоматически при чтении из регистра DR, флаг Err сбрасывается программно. Кроме того, оба эти флага сбрасываются при нажатии кнопки Очистить буфер в окне Контроллер клавиатуры; одновременно со сбросом флагов производится очистка буфера— весь буфер заполняется кодами OOh, и указатели записи и чтения устанавливаются на начало буфера.
Для программного управления контроллером предусмотрен ряд командных слов. Все команды выполняются при записи по адресу регистра управления CR кодов с 1 в третьем разряде.
Контроллер клавиатуры интерпретирует следующие командные слова:
*	xxx101 — очистить буфер (действие команды эквивалентно нажатию кнопки ''Очистить буфер'');
* 	ххх102 — сбросить флаг Err в регистре SR;
*	ххх10З — установить флаг S в регистре CR; 
*       ххх104 — сбросить флаг S в регистре CR.

Если по адресу 1 произвести запись числа ххх0nn, то произойдет изменение 4-го и 5-го разрядов регистра CR по следующему правилу:

[img[Формула|Lz12form1.jpg]]



Пример программирования контроллера клавиатуры в режиме посимвольного ввода:

Метка	Команда	Примечание
 	RD #10	; установить флаг Е в регистре CR
 	OUT 1	; - включить клавиатуру;
 	OUT 11	; заодно включаем и дисплей
 	RD #103	; передаём в контроллер код команды
 	OUT 1 	; Установить S в «1» (режим посимвольного вода);
M1:   	IN 2	; проверка нажатия –  флага готовности Rdy
 	JZ M1 	; ожидание Rdy  = 1;
 	IN 0 	; считывание введённого символа из буфера в аккумулятор;
 	OUT 10 	; передача ASCII-кода (например) на символьный дисплей;
 	JMP M1 	; возврат к ожиданию следующего нажатия.

Внимание! Контроллер клавиатуры с установленным битом Е будет реагировать на нажатие клавиш только когда окно обозревателя  Контроллер клавиатуры активно.

1.	Из каких основных частей состоит ЭВМ и какие из них представлены в модели?
2.	Что такое система команд ЭВМ?
3.	Какие классы команд представлены в модели?
4.	Какие действия выполняют команды передачи управления?
5.	Какие способы адресации использованы в модели ЭВМ? В чем отличие между ними?
6.	Какие ограничения накладываются на способ представления данных в модели ЭВМ?
7.	Какие режимы работы предусмотрены в модели и в чем отличие между ними?
8.	Как записать программу в машинных кодах в память модели ЭВМ?
9.	Как просмотреть содержимое регистров процессора и изменить содержимое некоторых регистров?
10.   Как просмотреть и, при необходимости, отредактировать содержимое ячейки памяти?
11.	Как запустить выполнение программы в режиме приостановки работы после выполнения каждой команды?
12.	Какие способы адресации операндов применяются в командах ЭВМ?
13.	Какие команды относятся к классу передачи управления?
|!заголовок левой колонки|!заголовок правой колонки|
|>| объединение ячеек по горизонтали |
| объединение ячеек по вертикали |левое выравнивание|
|~| правое выравнивание|
|bgcolor(#a0ffa0):цветовыделение| центрирование |
|Таблица|c

Эта таблица набрана так:
{{{
|!заголовок левой колонки|!заголовок правой колонки|
|>| объединение ячеек по горизонтали |
| объединение ячеек по вертикали |левое выравнивание|
|~| правое выравнивание|
|bgcolor(#a0ffa0):цветовыделение| центрирование |
|Таблица|c
}}}
Прошу не обвинять в поклонении перед Западом, я просто оставил прилагавшийся к плагину файл, это все же просто демо. Ну, перевел кое-что.
!!!!Обычные напоминания, день месяца каждый год.
*<<reminder month:1 day:1 title:"Новый Год, один из моих любимых дней" >>
*<<reminder month:2 day:2 title:"День Сурка ;)" >>

!!!!Напоминания со смещением (...день недели месяца)
*Третий понедельник февраля
**<<reminder month:2 day:15 offsetdayofweek:1 title:"Американский День Президента">>
*Второе воскресенье мая
**<<reminder month:5 day:8 offsetdayofweek:0 title:"Американский День Матери">>
*Последний понедельник мая (обратите внимание -- offsetdayofweek отрицательное число, что означает обратный отсчет)
**<<reminder month:5 day:31 offsetdayofweek:-1 title:"Memorial Day">>

!!!И просто так
*<<reminder month:4 day:1 title:"День Юмора" >>
*<<reminder month:10 day:31 title:"Хэллоуин" >>
*<<reminder month:12 day:25 title:"Католическое рождество" >>
Для решения с помощью ЭВМ некоторой задачи должна быть разработана программа. Программа на языке ЭВМ представляет собой последовательность команд. Код каждой команды определяет выполняемую операцию, тип адресации и адрес. Выполнение программы, записанной в памяти ЭВМ, осуществляется последовательно по командам в порядке возрастания адресов команд или в порядке, определяемом командами передачи управления.
Для того чтобы получить результат выполнения программы, пользователь должен:
-	ввести программу в память ЭВМ;
-	определить, если это необходимо, содержимое ячеек ОЗУ и РОН, содержащих исходные данные, а также регистров IR и BR;
-	установить в PC стартовый адрес программы;
-	перевести модель в режим ''Работа''.

Каждое из этих действий выполняется посредством интерфейса модели, Ввод программы может осуществляться как в машинных кодах непосредственно в память модели, так и в мнемокодах в окно Текст программы с последующим ассемблированием.

Цель настоящей лабораторной работы — знакомство с интерфейсом модели ЭВМ, методами ввода и отладки программы, действиями основных классов команд и способов адресации. Для этого необходимо ввести в память ЭВМ и выполнить в режиме Шаг некоторую последовательность команд (определенную вариантом задания) и зафиксировать все изменения на уровне программно-доступных объектов ЭВМ, происходящие при выполнении этих команд.

Команды в память учебной ЭВМ вводятся в виде шестиразрядных десятичных чисел 

В настоящей лабораторной работе будем программировать ЭВМ в машинных кодах.
Подзаголовки разных уровней набираются так:
{{{
! Заголовок верхнего уровня
!! Подзаголовок
!!! Подподзаголовок
!!!! Подзаголовок 4 уровня
!!!!! Подзаголовок 5 уровня
}}}
а выглядят так:
! Заголовок верхнего уровня
!! Подзаголовок
!!! Подподзаголовок
!!!! Подзаголовок 4 уровня
!!!!! Подзаголовок 5 уровня
Данные в ЭВМ представляются в формате, показанном на рис. 8.2. Это целые десятичные числа, изменяющиеся в диапазоне "-99 999...+99 999", содержащие знак и 5 десятичных цифр.
Старший разряд слова данных используется для кодирования знака: плюс (+) изображается как 

{{{
0          1         2        3        4        5
----------------------------------------------------  
Знак  |                 Данные                      |
----------------------------------------------------
}}}

0, минус (-)— как 1. Если результат арифметической операции выходит за пределы указанного диапазона, то говорят, что произошло переполнение разрядной сетки. АЛУ в этом случае вырабатывает сигнал переполнения OV = 1. Результатом операции деления является целая часть частного. Деление на ноль вызывает переполнение.
В качестве примера  рассмотрим программу вычисления функции

[img[Функция|Lz10form.jpg]]

В данной лабораторной работе используются двухсловные команды с непосредственной адресацией, позволяющие оперировать отрицательными числами и числами по модулю, превышающие 999, в качестве непосредственного операнда.

[img[Функция|Lz10graf.jpg]]

Оценив размер программы примерно в 20—25 команд, отведем для области данных ячейки ОЗУ, начиная с адреса 030. Составленная программа с комментариями представлена в виде табл. 

[[Программа|Программа ЛЗ 10]]
Дана последовательность мнемокодов, которую необходимо преобразовать в машинные коды, занести в ОЗУ ЭВМ, выполнить в режиме Шаг и зафиксировать изменение состояний программно-доступных объектов ЭВМ (табл. 1). 

Таблица 1

|!Последовательность|!Значения|>|>|>|>|
|Команды|RD#20|WR30|ADD #5|WR@30|JNZ 002|
|Коды|21 1 020|22 0 030|23 1 005|22 2 030|12 0 002|

Таблица 2

|!PC|!Асс|!М(30)|!М(20)|
|000|000000|000000|000000|
|001|000020|||
|002||000020||
|003|000025|||
|004|||00025|
|002||||
|003|000030|||
|004|||00030|


Введем полученные коды последовательно в ячейки ОЗУ, начиная с адреса 000. Выполняя команды в режиме Шаг, будем фиксировать изменения программно-доступных объектов (в данном случае это Асс, PC и ячейки ОЗУ 020 и 030) в табл. 2.
|!Адрес|!Мнемокод|!Код|!Примечание|
|000|IN|010000|Ввод х|
|001|WR 30|220030||
|002|SUB #16|241016||
|003|JS 010|130o10||
|004|RD 30|210030||
|005|SUB #11|241011||
|006|WR 31|220031||
|007|MUL 31|250031||
|008|SUB #125|241125||
|009|JMP 020|100020||
|010|RD 30|21030||
|011|MUL 30|250030||
|012|WR 31|220031||
|013|RD 30|210030|||
|014|MUL #72|251072||
|015|ADD 31|230031||
|016|ADI 106400|430000||
|017||106400||
|018|DIVI 100168|||
|019||100168||
|020|OUT|020000||
|021|HLT|090000||
| !Как выглядит | !Как набирать |h
| ''полужирный'' | {{{''полужирный''}}} (два апострофа) |
| --перечёркнутый-- | {{{--перечёркнутый--}}} |
| __подчёркнутый__ | {{{__подчёркнутый__}}} (два подчёркивания) |
| //курсив// | {{{//курсив//}}} |
| верхний индекс: 2^^3^^=8 | {{{2^^3^^=8}}} |
| нижний индекс: a~~ij~~ | {{{a~~ij~~}}} |
| @@выделенный@@ | {{{@@выделенный@@}}} |
| {{{моноширинный}}} | тройные фигурные скобки |
! Форматы команд

Большинство команд учебной ЭВМ являются одноадресными или безадрес¬ными, длиной в одно машинное слово (6 разрядов). Исключение составляют двухсловные команды с непосредственной адресацией и команда MOV, являющаяся двухадресной.
В форматах команд выделяется три поля:
-	два старших разряда [0:1] определяют код операции СОР;
-	разряд 2 может определять тип адресации (в одном случае (формат 5а) он определяет номер регистра);
-	разряды [3:5] могут определять прямой или косвенный адрес памяти, номер регистра (в команде MOV номера двух регистров), адрес перехода или короткий непосредственный операнд. В двухсловных командах непосредственный операнд занимает поле [6:11].
Полный список форматов команд показан на рис. 8.3, где приняты следующие обозначения:
-	СОР — код операции; *
-	ADR — адрес операнда в памяти;
-	ADC — адрес перехода;
-	I — непосредственный операнд;
-	R, Rl, R2 — номер регистра;
-	ТА — тип адресации;

[img[Таблица КОП|Lz9tab4.jpg]]


-	X — разряд не используется

! Способы адресации

В ЭВМ принято различать пять основных способов адресации: прямая, кос¬венная, непосредственная, относительная, безадресная. Каждый способ имеет разновидности. В модели учебной ЭВМ реализованы семь способов.

Адресация в командах учебной ЭВМ

[img[Таблица |Lz9tab5.jpg]]

 
|!КОП|!Мнемокод|!Название|!Действие|
|00|NOP|Пустая операция|Нет|
|01|IN|Ввод|Асе <- IR|
|02|OUT|Вывод|OR <- Асс|
|03|iRET|Возврат из прерывания|FLAGS.PC <- M(SP); INC(SP)|
|04|WRRB|Загрузка RB|RB <- CR[ADR]|
|05|WRSP|Загрузка SP|SP <- CR[ADR]|
|06|PUSH|Поместить в стек|DEC(SP); M(SP) R|
|07|POP|Извлечь из стека|R -> M(SP); INC(SP)|
|08|RET|Возврат|PC -> M(SP);INC(SP)|
|09|HLT|Стоп|Конец командных циклов|
|10|JMP|Безусловный переход|PC <- CR[ADR]|
|11|JZ|Переход, если 0|if Асе = 0 then PC <- CR[ADR]|
|12|JNZ|Переход, если не 0|if Асс ? 0 then PC <- CR[ADR]|
|13|JS|Переход, если отрицательно|if Асс < 0 then PC <- CR[ADR]|
|14|JNS|Переход, если положительно|if Acc ? 0 then PC <- CR[ADR]|
|15|JO|Переход, если переполнение|if abs Acc > 99999 then PC <- CR[ADR]|
|16|JN|Переход,если нет переп.|if abs Acc<-99999 then PC <-CR[ADR]|
|17|JRNZ|Цикл|DEC(R); if R > 0 then PC <- CR[ADR]|
|18|INT|Программное прерывание|DEC(SP); M(SP) <~ FLAGS.PC; PC <- M(V)|
|19|CALL|Вызов подпрограммы|DEC(SP); M(SP) <- PC; PC *- CR(ADR)|
|20|Нет|||
|21|RD|Чтение|Acc <- DD|
|22|WR|Запись|M(*) <- Acc|
|23|ADD|Сложение|Acc <- Acc + DD|
|24|SUB|Вычитание|Acc <- Acc - DD|
|25|MUL|Умножение|Acc <- Acc x DD|
|26|DIV|Деление|Acc <- Acc/DD|
|27|Нет|||
|28|EI|Разрешить прерывание|IF <— 1|
|29|DI|Запретить прерывание|IF4-0|
|30|MOV|Пересылка|R1 <-R2|
|31|RD|Чтение|Acc <- R*|
|32|WR|Запись|R* <- Acc|
|33|ADD|Сложение|Acc <- Acc + R*|
|34|SUB|Вычитание|Acc <- Acc - R*|
|35|MUL|Умножение|Acc <- Acc x R*|
|36|DIV|Деление|Acc <- Acc/R*|
|37|IN|Ввод|Acc <- BУ(CR[ADR*])|
|38|OUT|Вывод|BУ(CR[ADR*]) <- Асс|
|39|Нет|||
|40|Нет|||
|41|RDI|Чтение|Асс<-1 *|
|42|Нет|||
|43|ADI|Сложение|Асс <— Асс + I|
|44|SBI|Вычитание|Асс <— Асс -1|
|45|MULI|Умножение|Асс <— Асс х I|
|46|DIVI|Деление|Асс <— Асс/1|
1.	Формулировка варианта задания.
2.	Машинные коды команд, соответствующих варианту задания.
3.	Результаты выполнения последовательности команд в форме табл. 2.
Ненумерованный список набирается так:
{{{
* яблоки
* печенье
* молоко
}}}
а отображается так:
* яблоки
* печенье
* молоко

Нумерованный список набирается так:
{{{
# посадить дерево
# построить дом
# вырастить сына
}}}
а отображается так (номера подставляются автоматически):
# посадить дерево
# построить дом
# вырастить сына

Можете попробовать отредактировать эту запись, чтобы увидеть, как был набран вот этот многоуровневый список:
* Программы
** Свободные
*** GNU/Linux
*** Firefox
*** OpenOffice.org
*** GIMP
*** TiddlyWiki
** Несвободные
*** Windows
*** Internet Explorer
*** MS Word
*** MS Paint
*** Notepad
* Пиво
** Бесплатное
** Платное
* Свобода слова
** Говори что хошь
** Все ходы записаны
| Ссылка | Как набирать |h
| GettingStarted | {{{GettingStarted}}}, слово латиницей, буквами разных регистров, автматически обрабатывается как вики-ссылка |
| [[Вики-разметка (примеры)]] | {{{[[Вики-разметка (примеры)]]}}}, двойные квадратные скобки указывают, что является ссылкой |
| [[Справка|Вики-разметка (примеры)]] | {{{[[Справка|Вики-разметка (примеры)]]}}}, прямая черта {{{|}}} внутри отделяет описание и ссылку |
| [[Яндекс|http://www.ya.ru/]] | {{{[[Яндекс|http://www.ya.ru/]]}}}, этот же приём можно использовать и для внешних ссылок |
| http://www.ya.ru/ | {{{http://www.ya.ru/}}}, ссылки на интернет-адреса (URL) создаются автоматически |
|!Обозначения|!Код|!Тип адресации|!Пример команды|
||0|Прямая(регистровая)|ADD 23 (ADD R3)|
|#|1|Непосредственная|ADD #33|
|@|2|Косвенная|ADD @33|
|[]|3|Относительная|ADD [33]|
|@R|4|Косвенно-регистровая|ADD @R3|
|@R+|5|Индексная с постинкрементом|ADD @R+|
|-@R|6|Индексная с прединкрементом|ADD -@R|
Можно наглядно выделить цитату, например:
<<<
И я понял: прежде всего нужно строить корабль, снаряжать караван, возводить храм — они долговечнее человека. Люди с радостью будут тратить себя на то, что драгоценнее их самих.
//Антуан де Сент-Экзюпери, «Цитадель»//
<<<
Это было сделано с помощью знака {{{<<<}}}:
{{{
<<<
И я понял: прежде всего нужно строить
корабль, снаряжать караван, возводить
храм — они долговечнее человека. Люди
с радостью будут тратить себя на то,
что драгоценнее их самих.
//Антуан де Сент-Экзюпери, «Цитадель»//
<<<
}}}

Также доступно цитирование в стиле электронной почты, с использованием знака {{{>}}} в начале строки:
>> Уже пользуешься TiddlyWiki?
> Да, просто невероятная вещь!
Это набирается так:
{{{
>> Уже пользуешься TiddlyWiki?
> Да, просто невероятная вещь!
}}}
|Адрес| Мнемокод|Микрокоманда|>|ОЗУ|>|>|CR|>|АУ|>|Ячейки|
|~|~|~|MAR|MDR|COP|TA|ADR|Acc|DR|020|030|
|000|RD #20|MAR := PC|000|000000|00|0|000|000000|000000|000000|000000|
|||MRD|000|||||||||
|||CR :=MRD||211020||||||||
|||PC :=PC+1|||21|1|020|||||
|001||Acc :=000ADR||||||||||
||WR 30|MAR :=PC||||||000020||||
|||MRd|001|||||||||
Hosted by uCoz