Перейти к публикации
Alleksh

redpower Гайд по RedPower. Компьютеры. High Level.

Рекомендованные сообщения

Часть 1. Основы


Многие недооценивают компьютеры из RP, а еще больше - не знают о них вовсе.
В этом гайде я о них вам поведаю.
Для начала вам понадобится:
Центральный процессор, монитор, дисковод, объединительная плата, 8K RAM модуль, extended FORTH disk (желательно).
Примечание:
Позади ЦП вы можете установить до 8 8K RAM модулей.

Устанавливаете центральный процессор, позади него - объединительную плату, на неё - 8K RAM модуль:
image.thumb.png.a4afefd659ec662826bac8786c2fb966.png
Чтобы объединять разную периферию(дисководы, мониторы, ЦП и т.п.) - их можно ставить вплотную друг к другу, или же использовать плоские кабеля:
image.thumb.png.9f951535089de83d4fd1946b949fd44c.png
Каждый блок может иметь собственный ID, устанавливать его можно используя отвёртку, нажав shift+ПКМ:
image.png.dcba6d6d0ccefecb4c06ed4a423f74df.png
Компьютер использует эти ID для подключения к устройству, рекомендуется делать их разными в одной сети.
К слову про сети:
image.thumb.png.10c0b64b78b64932d41d4b33f45ec578.png
Как можно наглядно увидеть, устройство(далее - узел) номер один видит лишь 3 и 2.
То есть, узлы не могут пропускать через себя сигнал. Чтобы подключить первый узел к шестому - необходимо, чтобы между ними была связь в виде плоских кабелей.
И так, вернёмся к постройке нашего ПК.
Нажав ПКМ по ЦП, мы увидим такой интерфейс:
image.thumb.png.81d4377d23830b2b51350fc2c5ce5b33.png
Disk - идентификатор загрузочного дисковода,
Console - идентификатор монитора, в котором мы будем работать,
ID - идентификатор ЦП.
START - Запустить устройство.
HALT - приостановить работу устройству.
RESET - Остановить работу устройства, при нажатии START - загрузка с дискеты.
Датчики справа от кнопок обозначают, включено ли устройство. 
Сверху - включено, снизу - отключено.

Итак, приступим к самому компьютеру.
Чтобы он запустился - необходимо вставить в дисковод дискету и нажать START в ЦП.
Если вы всё правильно настроили - вас должно встретить следующее сообщение: 
 image.thumb.png.f327cf421ae1f5ffd4384f56f2c4c350.png
Для начала стоит ознакомится с обозначениями, которые будут использоваться далее(взято с http://minecrafting.ru/topic/6612/ ) :


Для описания синтаксиса будут использоваться следующие обозначения.
Стековая диаграмма:
(  --  )
перечисляет все входные параметры для работы команды, если таковые имеются.
-- используется в качестве разделителя. 
описывает все выходные значения.
Вот несколько примеров:
( -- ) - не меняет содержимое стека.
( n -- ) - во время исполнения забирает число с вершины стека (т.е. убирается последнее).
( -- n ) - оставит на вершине стека некоторое значение, не затронув прочие числа.
( n1 -- n ) - забирает одно число и оставляет другое.
( n -- n ) - число используется программой, но не изменяется.
( n1 n2 -- n ) - забирает два числа и оставляет одно.


n	 Целое число любого назначения.	+ ( n1 n2 -- n )
b	 Используется только первый байт (8 бит)
f	 Логический флаг. FALSE = 0, а всё остальное TRUE.
addr Адрес ячейки в основной памяти.
str	 Адрес, указывающий на начало строки.

Во первых, нужно ознакомиться с синтаксисом FORTH.
Этот язык использует для своей работы стек, то есть вводя какое либо число и нажимая ENTER - вы его добавляете в стек.
Последнее число, которые мы добавили выйдет первым:
image.png.d685952cf0fdc1479a5c80a8ecbcd2a4.png
Арифметические операции забирают последние два числа со стека и кладут на вершину итог.
2 2 * .  выведет 4,
2 6 * .  выведет 12,
1 2 3 * + . выведет 7.

Чтобы исполнить какое-либо слово - достаточно просто его написать:
image.png.35e7358a5fd9c4ac3d8585f2329b6460.png
Создание слов


VARIABLE %name%

Создать переменную с именем %name%.


( n -- ) CONSTANT %name%

Создать константную переменную с именем %name%.
Для формирования исполняемых слов есть кое-что интереснее:


: %name% %body% ;

Где %name% - имя, а %body% - тело слова(то, что мы будем исполнять).
Например, в словаре есть слово EMIT:


( b -- ) EMIT

Оно берёт последнее значение со стека и выводит его в виде символа(ASCII).
42 в таблице ASCII - *
Создадим слово STAR, которое выведет звезду:
image.png.b7ce2ae0d671485b37607ef597850170.png
Ладно, а как нам вывести 10 звёзд? 20? 30? Неужели десятки раз писать STAR? 
Нет. Для этого можно использовать циклы.
Попробуем использовать цикл DO:


( n1 n2 -- ) DO %body% LOOP

Повторить %body% n1 - n2 раз.
Давайте сформируем слово STARS, которое будет выводить n звёзд:


: STARS 0 DO STAR LOOP ;

Использование:


( n -- ) STARS

Давайте попробуем его исполнить:
image.png.72e478f8ad014125f4c78b2f368e9ffd.png
Отлично сработано!
Давайте теперь попробуем нарисовать квадрат.
Для этого нам нужно вывести 10 строк по 10 звёзд.
Попробуем реализовать функцию SQUARE:


: SQUARE 10 0 DO 10 STARS LOOP ;

Попробуем ее вызвать:
image.png.821f8e0e965b03dee03341057891638a.png
О нет, она просто вывела 100 звёзд. 
В словаре есть слово, которое переносит нас на следующую строку - CR.
Давайте ею воспользуемся:


: SQUARE 10 0 DO CR 10 STARS LOOP ;

Вызовем SQUARE:

image.png.9ee8761a359ddd7f4dbd5019c2841dd1.png

О чудо, всё сработало отлично!
Попробуем нарисовать треугольник!
Неужели нам понадобиться каждый раз вводить 10 STARS CR 9 STARS CR 8 STARS...?
Нет, не придётся!
Внутри цикла DO LOOP можно использовать оператор I, который вернёт текущий счетчик цикла.
Напишем для теста слово test:


: test 10 0 DO I . LOOP ;

Воспользуемся:
image.png.f1ca7ef385361a160239a1f68c35f715.png
Отлично! Всё работает прекрасно.
Давайте теперь, зная всё это - создадим слово TRIANGLE:


: TRIANGLE 0 DO CR I STARS LOOP ;

Использование:


( n -- ) TRIANGLE

image.png.efe65ed1be3cbe70b1d8bbd376a56486.png
О нет, возникла какая-то ошибка.
А всё просто - самый первый вызов, 0 STARS.
0 0 DO LOOP цикл вечен, поэтому STARS будет выводить звёзды бесконечно. Ну, пока вы его не перезапустите ;).
Давайте теперь напишем правильно TRIANGLE:


: TRIANGLE 0 DO CR I STARS LOOP ;

Воспользуемся:
image.png.58cdf83a67dce31f6cd258474653b500.png

Ура! Наш треугольник появился!
Давайте теперь познакомимся с разветвлениями(IF/ELSE/THEN).
Попробуем сделать полый квадрат.
Нам понадобятся две строки, одна - полая, вторая - целая:


**********
*        *

ASCII код пробела - 32, давайте напишем слово SPACE:


: SPACE 32 EMIT ;

Давайте протестируем:
image.png.ce0b5a24582de9c8e67005857a08ed90.png
Сработало отлично!
Попробуем теперь написать полую линию, используя циклы и разветвления.


: HOLLOW_LINE
10 0 DO
I 0 = IF STAR THEN
I 9 = IF STAR THEN
I 0 > IF I 9 < IF SPACE THEN THEN LOOP ;

Описание:
В том случае, если счётчик равен нулю - рисуем звезду.
В том случае, если счётчик равен девяти - рисуем звезду.
В том случае, если счётчик больше нуля но меньше девяти - рисуем пробел.
Протестируем:
image.png.d7e1382c4bc4ed60c9fa0637ab03fd69.png
Сработало отлично!
Давайте воспользуемся тем же для квадрата, но немного улучшим.
Будем использовать ELSE.


: HOLLOW_SQUARE
10 0 DO CR
I 0 = IF 10 STARS ELSE 
I 9 = IF 10 STARS ELSE
HOLLOW_LINE THEN THEN  LOOP ;

В чём отличия?
Сейчас, если мы находимся на первой/девятой позиции - мы сразу переходим в конец, не проверяя больше 0 или меньше 9 наш счётчик.
Протестируем:
image.png.92ca5a137ce45dc8afb26d5be76ad1fc.png
Ура! Наш полый квадрат готов!

Ознакомиться со словарём и многим другим можно тут:
http://minecrafting.ru/topic/6612

  • Нравится 2
  • Одобряю 4

Поделиться сообщением


Ссылка на сообщение

Собственно вопрос, для чего всё это надо ? Думаю стоило об этом написать в самом начале.

Поделиться сообщением


Ссылка на сообщение
11 часов назад, WorldDominator сказал:

Собственно вопрос, для чего всё это надо ? Думаю стоило об этом написать в самом начале.

Ну, я в свое время написал казино и рубил уран на "азартных" игроках. 

Изменено пользователем Trickster
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...