WWW.DISS.SELUK.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА
(Авторефераты, диссертации, методички, учебные программы, монографии)

 

автор Sapsan

Внимание! Этот файл можно сохранить на жесткий диск, кликнув на иконку с

дискетой. Это экономит время и трафик!

ПРЕДИСЛОВИЕ

***

Цель данной книги – помочь новичкам научится

программировать. Также она будет полезной и для поклонников

более традиционных языков. Но есть и предостережение, если для

читателя язык FORTH - первый язык, то это может стать помехой для изучения более современных и лучших языков.

Ну а так как кто-то может сказать, что, мол, зачем писать целую книгу, если у Всемогущего Гугла можно скачать книгу по FORTH лучше чем моя, то скажу так: никакая книга в мире на русском языке не расскажет, как привязать язык FORTH к Minecraft. То есть, благодаря этой книге вы сможете писать не просто на FORTH, а прямо в Minecraft'e и научитесь делать многие механизмы, системы, ловушки, плюшки, и примочки которые намного лучше, чем то же из голого редстоуна.

Какой же стиль этой книги? Стиль будет намеренно не книжный. Ведь как вы будете ее читать?

Постепенно книга будет пополняться и расширятся. И вы всегда сможете ее обновить на том же сайте, на котором скачали (обновить).

Также в этой книге вам в помощь будут такие вещи:

- Типичная ошибка программирования - Хороший стиль программирования -Примеры программ Оглавление ПРЕДИСЛОВИЕ

Фундамент

Первое слово

Первый раз в первый класс!

Переменная и Константа

Наш друг IOX

На распутье

Циклы

Строки и массивы

Дискеты

В сердце системы FORTH

Интернет

Пародия на ООП

Каталоги и файлы(new)

Приложение

1) Таблица значений цветных проводов:

2) Дополнительные слова

3) дополнительная информация

4) Использование Forth в minecraft

5) Маленькие хитрости и советы

6) Полезные программки

7) Таблица символов

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

Первый кирпич – FORTH (читается "форт").

Форт очень необычный язык, он сильно отличается от других языков.

Запомните главное - этот язык является стек-ориентировочным языком.

Что такое стек я подробно объясню позже. В RedPower этот язык имеет дополнительные функции к стандартным возможностям.

Главное понятие – "слово". В Форте под "словом" подразумевается готовая программа (именем "слова" является комбинация символов оканчивающаяся разделителем). Слова берут необходимые данные со стека и оставляют свои результаты, если они есть, также на стеке.

Программа, написанная на языке Форт, выглядит как простая последовательность слов. Имя слова не должно превышать 31 литеры.

Стек – (с англ. stack – "стопка") разновидность структуры данных.

Коротко говоря, стек это "оперативная память" компьютера в minecraft.

Можно сказать, место в памяти, где хранятся промежуточные данные.

Наглядно стек можно представить как стопка книг. Если мы добавляем книгу к стопке, мы кладем ее наверх, если мы забираем книгу, то тоже берем ее сверху. Чтобы добраться до нужной книги, нужно убирать последовательно книги сверху. То же самое и со стеком. Данные (н-р, числа) добавляются в конец стека и берутся тоже с конца. Если же представит пустой стек вот так: [ ], то после добавления числа 1 будет так:

[1], после добавления числа 99 будет так: [1, 99], а если добавить еще 55, то стек станет таким: [1, 99, 55]. Теперь заберем число со стека: забранное число будет 55, а стек: [1, 99]. После перезагрузки системы и после выполнения многих операций стек очищается.

Структуру данных "стек" также называют LIFO – "последний вошел, первый вышел" (Last in, First out).

Переменная – (c англ. "variable") место в памяти, которое имеет свое имя (идентификатор), и хранит в себе некоторое число. Переменная имеет размер, который выражается в байтах (1 байт, 2 байта). Обычно в других языках переменные имеют тип, но в FORTH переменные не типизированные (все зависит от программы). Когда мы создаем (объявляем) переменную, то система выделяет под нее место в памяти, и получить доступ к этому месту мы можем обратившись через имя переменной. Например, имя переменной может быть таким: X, Y, LENGTH, RADIUS, COLOR, myAge, IDcomp.

Константа – это зарезервированное место в памяти, которое имеет свое имя и значение, но в отличие от переменной, мы не можем менять значение константы.

Словарь – весь набор слов, переменных и констант в памяти системы FORTH.

IS – ("In stack") так я буду коротко демонстрировать содержимое стека.

Например, IS[1,2] говорит о том, что в стеке есть два числа – 1 и 2.

В примерах буду выделять цветом:

Желтый – вывод данных на терминал Зелёный – запрос данных у пользователя Как быстро вводить текст больших программ читайте в приложении.

- Хороший стиль программирования Все переменные, константы и слова пишите с КАПСОМ Чтобы называться программистом, нужно уметь писать программы, а не только знать термины. Поэтому, первое, что Вы сделаете, будет готовая программа. Помним, что готовая программа называется "словом".

Сначала дадим своей программе личное имя. Пусть она называется MY_PROGRAMM. Для первого раза хватит и того, что она выведет нам какой-то текст.



Итак, пишите за мной (после." и перед текстом должен стоять разделитель! ):

: MY_PROGRAMM." Hello World !!!" ;

Как видите, для создания нового слова нужно писать " : " (двоеточие), следующее за ним слово будет именем нашей программки. Для завершения нашего слова пишем " ; " (точка с комой). Помните: между всеми операциями и словами обязательно ставить пробел! Также не забудьте включить КАПС.

Для вызова нашего слова пишем ее имя. На терминале увидим:

MY_PROGRAMM Hello World !!!

Для изменения вывода информации на терминал существуют разные стандартные слова, вот они:

CR – переход на следующую строку BS – стереть последний символ в строке SPACE – поставить пробел SCROLL – экран сдвинуть вверх PAGE – очистка экрана При написании нового слова, внутрь можно добавлять раннее написанные программы. Такая вещь является очень удобным инструментом для модификации и исправления программ. Для закрепления темы даю пример:

: MY_PROGRAMM_ / это мы создали еще одно слово для вывода текста : CONCAT (объединяем 2 слова в одно) MY_PROGRAMM MY_PROGRAMM_2 ;

При вызове слова MY_PROGRAMM_2, на терминале мы увидим такое:

MY_PROGRAMM_ I'm cool !!!

А когда запустим CONCAT, то при ее выполнении запустятся ОБЕ программы, и мы увидим такое:

CONCAT

Hello World !!!

I'm cool !!!

Такая крутая возможность позволяет делать большие программы из маленьких модулей. Использование модулей облегчит модификацию программы, а главное – при ошибке придется переписывать только данный модуль, а не всю программу… Важно: ФОРТ позволяет объявлять новые слова с тем же именем, какое имеет ранее написанное слово (даже системное), поэтому не называйте свою программу с таким именем, которое уже используется. В некоторых случаях создавать такие слова можно, если нужно новой программой заменить старую. Тогда в памяти будут обе программы с одинаковыми именами, но при вызове будет исполняться последняя.

Для просмотра всех известных слов пишем WORDS.

- Хороший стиль программирования Разбивайте все свои программы на модули, которые имеют не больше 6- рядков.

- Хороший стиль программирования Называйте слова так, чтобы название отражало их цель.

Научились говорить? Теперь пора научится считать!

Любая практическая программа содержит математику, поэтому сейчас научимся писать математические выражения. Для сначала немного введу вас в курс двоичной системы исчисления (так как все компьютеры работают только с "1" и "0").

Все данные на компьютерах закодированы в Для примера таблица виде ряда единиц и нолей (разрядов или битов). числа с десятичным:

последовательности из битов, число которых 0001 – кратные числу 8. Восемь разрядов (8 бит) 0010 – составляю байт. Также есть последовательности из 0011 – 16, 32, 64, 128 т.д. бит. От количества разрядов 0100 – зависит сколько чисел ими можно закодировать. 0101 – Например, одним битом можно закодировать числа – ноль и один. (0 и 1), двумя уже 4 – (00, 01, 1000 – 10, 11). Важно запомнить – каждый следующий бит 1001 – в 2 раза больше предыдущего. Число комбинаций 1010 – увеличивается тоже в двое при добавлении бита. 1011 – Один байт (8 бит) кодирует 256 чисел (0-255), два 1100 – байта (16 бит) уже 65536 (0-65535).

В FORTH данные в стеке являются двухбайтные (16 бит) значения. В зависимости от ситуации эти значения могут рассматриваться различным образом:

1) Как целые числа со знаком в диапазоне от -32768 до +32767;

2) как адреса оперативной памяти в диапазоне от 0 до 65535 (отсюда есть ограничение 64 Кб на размер адресного пространства);

3) как коды литер;

4) как номера блоков внешней памяти в диапазоне от 0 до 32767, или… 5) как 16-разрядные двоичные значения (целые числа без знака).

В процессе исполнения слов значения помещаются на стек и снимаются с него.

Итак, пришло время перейти к примерам. В FORTH для арифметических операторов используются такие же символы, как и в школе: " + " для сложения, " – " для вычитания, " * " для умножения. В Форте нет десятичных дробей, поэтому при делении результат будет без дробной части. Форт может вычислять остаток от деления и частное. Но запись формул уже отличается от привычной формы. В ФОРТЕ используется так называемая "обратная польская запись". Что это значит? Как уже говорилось, операции оперируют над значениями в стеке, потому сначала мы пишем числа (то есть, помещаем их в стек), а уже потом операцию, примеры:

10 3 в стеке 0 ) " / " - остаток от деления В первом примере мы сначала в стек добавили два числа. А когда написали " + ", то система берет из стека два последних числа, в данном случае 3 и 2, складывает их, а результат снова кладет в стек.

Еще есть другие операторы:

" /MOD " – вычисляет частное и остаток;

" MOD " – вычисляет частное;

" 1+ " прибавляет 1 к последнему числу в стеке;

" 1- " уменьшает на 1;

" NEGATE " число меняет знак;

" MAX " – возвращает максимальное число;

" MIN " – возвращает минимальное;

" 2/ " – деление на два (сдвиг битов вправо).

42 10 /MOD 42 10 MOD 42 1+ 42 1в стеке - 42 NEGATE 10 20 MIN 5 25 MAX 10 2/ Важно знать, когда операторы производят операции над числами в стеке, то эти числа удаляются из стека, но зато добавляются результаты.

Помним, для просмотра последнего значения в стеке ставим точку:

Теперь перейдем к более практичным программам. Создадим слово, которое складывает 2 числа и выведет эту операцию в удобной для нас форме, назовем ее ADD Теперь мы протестируем это новое слово:

Как работает это новоиспеченное слово? Так как при операции сложения и вывода числа убираются со стека, то надо их продублировать, для этого есть слово 2DUP (IS[2,5]) -> (IS[2,5,2,5]). После этого, для вывода в правильном порядке меняем местами числа словом SWAP (IS[2,5,2,5]) -> (IS[2,5,5,2]). Затем рисуется последнее число 2, ставится знак "+", потом выводится последнее число уже 5, ставится знак "=", затем складываются числа 5 и 2, которые остались в стеке, и на терминале результат 7.

Список доп. команд для работы со стеком – [смотреть] - Типичная ошибка программирования Использование операторов, когда в стеке недостаточно (или нет) данных. В таком случае при выполнении программы система пишет "Stack is empty" (стек пустой) и завершает выполнение слова.

- Типичная ошибка программирования Неправильная запись формул, типа 2+2. Сразу незаметна, а при выполнении слова может привести к неправильным результатам, но чаще пишет "Stack is empty".

- Хороший стиль программирования Если ваша программа выводит какой-то результат на экран, то вначале слова поставьте CR, для удобства чтения результата.

Как уже говорилось вначале, переменная это место в памяти, где могут храниться разные данные. Исходя из слова ясно, что значение переменной во время исполнения программы часто меняется. Цель переменных – хранить данные, притом имея к ним легкий доступ. Не усложняя тему, сразу перейду к делу.

Слово VARIABLE резервирует в словаре два байта (16 бит), а добавляется в словарь как новая команда, которая кладет на стек адрес зарезервированной двухбайтной области.

Можно сказать, что переменная работает, как константа, значением которой является адрес зарезервированной двухбайтной области.

Просто говоря, VARIABLE создает переменную с именем (имя может быть любым).

VARIABLE MY-FIRST-VARIABLE

При вызове этой переменной в стек кладется адрес переменной. А для того чтобы положить в стек значение переменной используем команду @, она берет с данного адреса двухбайтное число и кладет в стек. (Это понаучному, "разыменовать"):

MY-FIRST-VARIABLE @. // выведет Обратное действие производит "!" (можно прочитать как "присвоить" или "запомнить").

Таким образом, можно прочитать и записать любую ячейку памяти от до 65535 (или от -32768 до +32767).

Пример:

VARIABLE INT

INT @.

123 INT !

INT @.

-1 INT !

INT @.

INT @ 20 +.

Обратите внимание, что вышеуказанные слова читают и записывают по 2 байта. Существуют аналогичные слова, которые работают только с байтом: С@ и С! (принимается в счет только младший байт).

Слово CONSTANT работает следующим образом. Со стека снимается верхнее значение, а из входного текста выбирается очередное слово и запоминается в словаре как новая команда.

Ее действие состоит в следующем: поместить на стек значение, снятое со стека в момент ее определения. Например, выражение CONSTANT Pi. В дальнейшем при исполнении слова Pi число 314 будет положено на стек. Константа, просто говоря, неизменяемое значение. Для получения этого значения не нужно писать @ после имени:

314 CONSTANT Pi Pi. Полезным и коротким вариантом слова ! (присвоить) является сочетание +! (плюс-присвоить), которое увеличивает на значение, находящееся в памяти по адресу. Используется вместо

VARIABLENUM

Слова, определенные через CONSTANT и VARIABLE, — такие же равноправные слова форт-системы, как и определенные через двоеточие.

Их также можно использовать в определениях других слов и исключать из словаря словом FORGET.

Дополнительно. Команды @ и ! можно использовать не только для переменных, но и для любого адреса памяти, ведь адрес можно задать и вручную. С одной стороны это хорошо - полный контроль над памятью и никаких преград для записи и чтения, с другой - исполняемые программы находятся там же, и есть риск повредить эти данные и ввести компьютер в ступор. Программы хранятся в диапазоне от 1280 (0х500) до значения переменной HERE.

- Типичная ошибка программирования Для разыменования переменной забыли поставить @. В таком случае, при исполнении программы будет не ошибка, а неправильный результат.

- Типичная ошибка программирования После константы поставили @. Так будет неправильный результат.

Выход информации с системы Форт во внешний мир является важнейшим достоинством компьютера РедПавера. Без такой возможности компьютер был бы бесполезным.

Для вывода редстоун-сигналов есть специальный прибор, под название IOX (читается "и-о-икс"). К нему можно подключить связку проводов, или же просто один цветной провод.

Порядок старшинства проводов идет в порядке цветов шерсти – от белого к черному.

IOX может читать сигналы со связки и может устанавливать сигналы туда же. Вот команды:

n ->IOX! – устанавливает число в провод.

IOX@ -> n – читает число со связки и кладет его в стек.

n ->IOXSET – добавляет биты числа в связку.

n ->IOXRST – удаляет биты числа со связки.

Помните: через IOX выводится информация в двоичном виде!

Как это в двоичном виде? Например, мы написали на терминале IOX!. 10 в двоичном виде выглядит как 1010. То и провода в связке станут такими:

Видим, включились голубой и оранжевый провод. Или же мы можем сами, вручную, включить провода, например рычагом (для удобства, здесь показана половина связки):

Подключили рычаг к салатовому и к желтому проводу. Теперь когда на терминале мы введем IOX@. то получим число 48.

В конце книги вы сможете увидеть таблицу значений цветных проводов [смотреть].

В чем отличие IOX! от IOXSET? А в том, что при использовании IOX! в связке устанавливается именно то число, которое мы указали, а IOXSET логическим оператором ИЛИ к уже существующему сигналу добавляет указанный. Например, после 40 IOX! будет так:

А после 2 IOXSET:

Число 2 засветило оранжевый провод, но при этом провода салатовый и голубой остались включенными. Если вам не все так гладко для понимания, не огорчайтесь, в процессе практики вы набьете руку).

IOX имеет свой адрес, через который Форт обращается к прибору.

Таким образом, можно иметь связь с несколькими IOX. В словаре Форт есть стандартная переменная IOXADDR. Эта переменная хранит адрес IOX, с которым сейчас работает система. В ходе выполнения программы эту переменную можно менять. Настраивать адрес самого IOX'a нужно с помощью отвертки, зажав и ПКМ тыкнув по прибору. Всего можно настроить 256 разных адресов. Стандартный адрес IOX – 3 (такое же начальное значение переменной IOXADDR).

Большинство современных программ не рассчитаны на тупое выполнение действий. Во всех известных языках программирования есть логических операторах вы такая незаменимая вещь, как условный найдете на страницах оператор. Само слово говорит о том, что какойпроще то оператор связан с условием. Свяжем это с - сложнее буднями. Например, кто-то говорит: "Если мне 18 лет, то я совершеннолетний". В этом предложении есть условие: "Если мне 18 лет", и затем выражение "то я совершеннолетний". Структура "если-то" как раз и есть условным оператором. Раздел математики который занимается этой логикой называется "булевской математикой". Многие языки программирования имеют такой тип переменных – булевская переменная (такие переменные также называют флагами). Данная переменная может иметь только два значения – истина и ложь (TRUE и FALSE). Но так как ФОРТ не имеет типизированных переменных, то флаги принимают числовые значения: 0 – ложь, не 0 – истина. На каждое логическое условие можно ответить или "это правда", или "это ложь". На вышеприведенное выражение "18 лет?" кто-то может ответить "истина", а кто-то "это ложь".

На английский слово если переводится как IF (иф), а то – THEN (зен).

В Форте запись условного оператора делается так:

IF THEN

Как видно, условие записывается перед словом IF. Если условие исполняется, то в стек ложится флаг TRUE (ненулевое число). А оператор IF берет это последнее значение, и когда это это значение TRUE, то выполняется блок (может содержать несколько слов и даже еще логические выражения), а если значение FALSE, то данный блок игнорируется. Признак окончания блока – слово THEN.

Запишем на Форте наш первый условный оператор:

VARIABLE AGE // Создаем переменную возраста // слово установки и проверки совершеннолетия : setAge AGE !

AGE @ 17 >IF CR."You men ! " // вывести текст THEN ;

Теперь проверим, пишем 10 setAge, на терминале ничего. А если же введем 30 setAge, то выведется заданный текст " You men ! ".

Но условный оператор имеет еще множество "плюшек". Одна из них – дополнение ELSE (с англ. "иначе") для выполнения слов при условии, что условие не удовлетворено. Синтаксис:

IF ELSE THEN

Теперь мы можем усовершенствовать свое слово проверки возраста.

: setAge // слово установки и проверки совершеннолетия //переменой AGE присваивается значение со стека AGE !

AGE @ 17 > IF." You men ! " ELSE."You child ! " THEN ;

Тестируем: 10 setAge, и на терминале – "You child !". Как видно, это удобно использовать, если нужно сделать альтернативный вариант действия.

Но это еще не все. Что если нужно чтобы исполнялось несколько условий? Есть вариант вложенного второго условия:

IF IF THEN THEN

Здесь блок выполнится только тогда, когда оба условия исполняются!

Но есть вариант получше. В булевской математике есть такие логические операторы, как AND(и), OR(или), XOR (исключающее или), NOT(нет). Используя оператор AND, мы можем сократить предыдущую запись:

AND IF THEN

Здесь выполняются при удовлетворении обоих условий.

Запомните, операторы AND, OR, XOR берут со стека 2 значения! Оператора NOT в Форте нет, но это легко исправить:

: NOT Теперь задача. На работу принимают человека возрастом от 20 до лет. Написать слово, которое определяет, годен ли человек данного возраста к работе:

: EMPLOYER AGE ! // переменная = значению со стека AGE @ 20 >= AGE @ 60 256, то присвоить ей KEY? UNTIL ;

Слово LAMP будет бесконечно последовательно зажигать цветные провода от белого к светло серому. Для выхода с цикла нужно нажать любую клавишу.

- Типичная ошибка программирования Жестоко путают счетчики I и J. Помните, I – внутренний счетчик, а J – внешний.

Для продвинутых программ часто необходима работа со строками.

Строки (с англ. string) в народе называют текстом. В программировании, строка это массив символов. Итак:

Массив – упорядоченная последовательность однотипных элементов.

Массив удобен тем, что в памяти его элементы размещены последовательно, один за другим. Таким образом, нужно знать только адрес первого элемента, остальные элементы можно найти простым математическим способом. Символьный массив (строка) в памяти компьютера выглядит так:

Каждый символ имеет свой индекс.

Первый символ в примере -"Н". Его индекс (ноль). Для получения нужного символа переменную HERE (вершину нужно к адресу первого элемента прибавить памяти) на байтов вверх, индекс нужного символа (Symboli = addr0 + i). при этом в стек ложится адрес Допустим, буква "H" имеет адрес 10. Буква "Е" вершины зарезервированной имеет индекс 1. Тогда адрес этого символа: 10 области. И этот адрес получает + 1 = 11. Буква "D" имеет индекс 10, тогда его адрес равен 10 +10 = 20. Последний символ строки = null (абсолютный нуль) Длина данного массива – 12 ячеек (в длину включается и последний нулевой символ), а длина текста - только 11 символов.

В Форте массив нужно объявлять так:

ALLOT CONSTANT

- количество символов и оно должно включать в себя нулевой символ, поэтому если вы хотите сохранить строку длиной 32 символа нужно сделать равным 33. - имя массива, а точнее константы, значением которой является адрес начала строки. Чтобы сохранить в памяти вышеприведенный пример делаем так:

12 ALLOT CONSTANT MY-STRING.

Система выделила 12 ячеек, в которые можем записать любой текст (не длиннее 11 символов). Для ввода текста есть слово ACCPET, где - имя нашей константы, а - сколько символов ввести (если ввести больше, то лишнее отсекается). Для вывода используется слово TYPE. Данное слово выведет на терминал всю строку. Длину строки можно узнать словом STRLEN. А теперь всё вместе:

12 ALLOT CONSTANT MY-STRING // массив на 11 символов MY-STRING 12 ACCEPT (enter) HELLO WORLD // задаем текст MY-STRING TYPE (enter) HELLO WORLD MY-STRING STRLEN. MY-STRING 10 + C@ EMIT D MY-STRING 12 ACCEPT SAPSAN MY-STRING STRLEN. Коды в массиве имеют однобайтовый размер! Поэтому, для просмотра числа по адресу нужно использовать С@ -чтение 8 бит (байта). А для записи одного байта по адресу нужно использовать C!.

Если мы хотим вручную задавать значения нашему массиву (без использования ACCEPT), то очень важно помнить о последнем нулевом символе!

Для сравнения двух массивов есть слово STRCMP. Если строки равны, то в стек кладется значение FALSE. Допустим, надо проверить пароль. При правильном пароле открывается дверь. Вот что выйдет:

12 ALLOT CONSTANT PASS

12 ALLOT CONSTANT TRY

PASS 12 ACCEPT Qwerty : UNBLOCK

BEGIN TRUE WHILE

CR." Please, enter the password: " TRY 12 ACCEPT

TRY PASS STRCMP IF

CR." Wrong password! You will be banned! " 10000 TICKS

PAGE ELSE

CR." Yes, my lord" 1 IOX! 80 TICKS 0 IOX!

PAGE THEN REPEAT ; // очистка экрана и конец цикла Строки это лишь малая доля назначения массивов. Например, вместо того, чтобы час создавать 30 переменных, проще создать массив на ячеек. Часто массивы используют для статистических целей (допустим, продавец в массиве сохраняет сколько каждого ресурса он продал, или какая прибыль за каждый день день недели…). В ООП классы тоже является своеобразным Все вышерассмотренные массивы были массивов) являются линейные, то есть его элементы размещены в значением столбца и строки одной плоскости (одномерный или 1D массив). соответственно. Например, Есть также матрицы – двумерный массив (или элемент A[3,2] находится в массив массивов или 2D). Но это не всё. Можно реализовать трехмерный массив и даже массивы больших размерностей (хоть 101D). С помощью двумерного массива можно хранить картинки. Как раз сейчас мы рассмотрим как это сделать. Для примера вот такой символьный шедевр:

Так как память в компьютере линейная, то двумерный массив является таким условно, ведь его элементы размещены линейно. Разницей является только способ ввода-вывода и "арифметики".

Итак, для первого раза достаточно создать массив 4х4. То есть четыре столбца и четыре строки. Можно ее представить так:

0 1 2 3 1,0 1,1 1,2 1, На самом деле в памяти данный массив размещен линейно:

Данный массив имеет 16 ячеек (высота*ширину) и является квадратным. В таком массиве формула для вычисления ячейки A[I,J] такая:

(J*m)+I, где I – строка, J – столбец, m – сторона квадрата. Например, нужно достать содержимое ячейки A[3,2]. Сторона квадрата (m)=4. По формуле получаем (3*4)+2 = 14 ячейка.

Но дальше небольшая трудность. Как записывать туда данные? Если процедурно (не вручную), то просто. Вручную же чуть сложнее. Итак, сначала создадим двумерный массив и заполним его процедурно. Размер выбираем так: X*Y+1. Если Х=4, Y=4, то по формуле надо 4*4+1 = 17 ячеек (помним, последняя ячейка – пустая). Пишем 17 ALLOT CONSTANT ARRAY.

Система выделила нам 17 ячеек. Теперь слово заполнения:

: FILL 16 0 DO LOOP ;

Данная процедура заполнит последовательно все элементы массива числами от 0 к 15. Ничем не отличается от линейного массива. Как же так?

Ну вот так. Для вывода в виде двумерной матрицы напишем еще одно слово (ведь TYPE выведет нам его в виде линии):

: LOOK LOOP CR LOOP ;

Тестим:

LOOK 12 13 Вот вам и двумерный массив. Ну и ясно, можно вместо чисел выводить символы чтобы вышла картинка. Но для этого нужно более продвинутое слово заполнения матрицы.

Разберем нашу задачку. Нужен 2D массив. Если картинка 4х4, то по формуле берем 17 ячеек. Будем записывать построчно, каждая строка будет иметь смещения в памяти на I*m (m - сторона квадрата) и длиной тоже в сторону квадрата + 1.Теперь пишем за мной:

: ARRAY ALLOT CONSTANT ;

17 ARRAY IMG : DRAW 5 ACCEPT CR LOOP ;

DRAW ==== ~~~~ LOLO FORT : OPEN-IMG 0 = IF SPACE DROP

ELSE EMIT THEN

LOOP CR LOOP ;

OPEN-IMG ==== ~~~~ LOLO FORT Как видите, всё прекрасно работает. Можно сделать более продвинутую программку, например, слово DRAW создает картину с именем и сразу её можно рисовать. А OPEN открывает картинку с именем. Придумайте как это можно сделать, подсказка в приложении. (Для очень опытных – CREATE-IMG создает картинку (параметры – имя и размеры), при рисовании задает рамку, также показывает значение текущего столбца и строки и при определенных комбинация (типа UP, DOWN) можно переходить на нужную строку для перерисовки, а OPEN рисует рамку, в заголовке – имя рисунка, а в рамке сам рисунок).

(До конца главы – автор Хитрый Лис). Строки можно копировать, для этого есть слово MOVE. Допустим мы создали 2 строки – str1 и str2, и для копирования 10 символов строки str1 в str2 можно написать так: str1 str MOVE.

Также есть полезные слова для перевод строки в число и обратно.

ATOI преобразует строку в число с учётом знака, а UATOI - без учёта.

1) Преобразование осуществляется с учётом текущей системы счисления.

2) Цифры, большие 9 (т.е. буквы), используются только заглавные.

3) Преобразование заканчивается на символе, который не является числом (с учётом основания текущей системы счисления) - Типичная ошибка программирования Самая типичнейшая ошибка!!!! Внимание!!!

Индексы в массиве начинаются с ноля !!! Первый элемент имеет индекс 0.

- Типичная ошибка программирования Для получения ячейки по формуле забывают прибавить результат формулы к адресу начала – вместо MASIV I 4 * J + надо MASIV I 4 * J + +.

- Типичная ошибка программирования Забывают о С@, а пишут вместо этого @, что приводит к очень неправильным результатам.

- Типичная ошибка программирования При создании массива забывают о последнем нулевом значении.

- Хороший стиль программирования Если вам нужно создавать много массивов, легче сделать дополнительное слово : ARRAY ALLOT CONSTANT ; для сокращения записи. А для полного фана: ARRAY 1 + ALLOT CONSTANT ; тогда при создании 10 ячеек нужно так и писать 10, а не 11.

Пожалуй, дискеты сильно влияют на экономику сервера (при условии, что компы и мозги есть у многих). Представь, как удобно, если ты один на сервере умеешь писать на Forth! Запрограммировал Snake, Tetris, Mario и кучу хлама, а потом дорого продаешь нубам. Как раз для распространения программ и служат дискеты. Благодаря им можно сделать такие вещи, как Музыкальные пластинки, Паспорт, Кредитную карточку, хранить Картинки, Анимацию, распространять Вирусы и так далее.

Как же получить доступ к информации на дискете?

В процессоре есть небольшой буфер, куда можно положить один БЛОК с дискеты. Делается эт так: n BLOCK (n – номер блока). При использования этого слова в стеке оказывается число – адрес начала блока, чтобы его не потерять, его можно присвоить переменной. После того как вы там всё что надо сделали, то модифицированный блок можно вклеить обратно на дискету словом FLUSH (если есть флаг (blkup), то после слова BLOCK предыдущий блок уже сам запишется на дискету).

(До конца главы – автор Хитрый Лис). Если вы написали крутую программу, то вам захочется как-нибудь сохранить её на дискете, чтобы воспользоваться на другом компьютере (в самом деле, не вводить же всё с нуля!) или подарить копию другу. Сохранить отдельно одну единственную программу невозможно, т.к. она обязательно ссылается на другие программы, которые были описаны до неё (по-научному – программы адресозависимые). Вместо этого вы можете сохранить всё, что находится в памяти компьютера.

Функцию сохранения выполняет команда SAVE"" Например: SAVE" Test Disk". После извлечения дискеты вы обнаружите, что эта дискета называется "Test Disk".

Т.к. команда сохраняет всю систему (без стека), то с этой дискеты можно загрузиться, а загружать как с "FORTH Boot Disk" (загрузочный диск).

После загрузки с такой дискеты вы обнаружите, что ваши программы уже присутствуют в словаре и готовы к работе.

Будьте внимательны к тому, сколько памяти требует ваша копия: если памяти будет недостаточно, то первая же введённая команда приведёт компьютер в ступор.

Второе применение данной функции - восстановление системы.

Если вы хотите переименовать дискету, то для этого есть команда DISKNAME"" Работает аналогично предыдущей команде: DISKNAME" My FORTH" При этом не затрагивается содержимое дискеты (даже если на ней ничего нет).

Перенос дискет между мирами (одиночной игры).

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

Откройте файл с сохранением мира и в ней откройте папку redpower ("...\.minecraft\saves\\redpower"). В этой папке хранятся все дискеты, которые были созданы в данном мире. Вам нужен тот файл, который называется "disk_.img". Сохраните его где-нибудь отдельно.

Затем войдите в тот мир, в который вы хотите перенести дискету. Создайте пустую дискету и посмотрите её ID. Переименуйте сохранённый файл, заменив ID на новый. Полученный файл поместите в туже папку, но того мира, в который вы переносите. Самое прекрасное, что во время выполнения всех этих действий можно не выходить из игры и сразу же загрузиться с полученной дискеты.

Вам наверняка хотелось сделать так: вставил дискету, запустил компьютер и программа запустилась, при этом вы не вводили команду на её запуск. К счастью, в Форте есть возможность сделать такую дискету. Для этого всего-навсего нужно поменять пару байт кое-где в памяти, но прежде чем я скажу какие, вам нужно узнать о том, что делает Форт при запуске:

1) Первым делом он считывает ID дисковода и монитора, установленные на корпусе. (ID заносятся в первые 2 байта при нажатии на кнопку START) Эти ID помещаются в соответствующие переменные DISKADDR и TERMADDR. (Иначе компьютер не знал бы куда выводить информацию) 2) Далее он проверяет сколько установлено модулей памяти и результат помещает в переменную TOP.

3) Вычисляет свободное место и выводит приветствие.

Из всего этого следует, что перед запуском основного кода должно быть сделано следующее:

1) Если ваша программа использует монитор, то должна присутствовать такая строчка:

0 C@ TERMADDR !

2) Если использует дисковод:

1 C@ DISKADDR !

3) Если программе нужно знать предел памяти:

PROBETOP !

4) Если предусмотрен запуск Форт-системы, то все 3 пункта выше.

При невыполнении этих условий могут возникнуть проблемы во время выполнения программы.

Итак, вы предупреждены, теперь адрес: 1304. Но учтите, что это действительно для MineOSv1.1 и в других ОС придётся выискивать этот адрес самому. По этому адресу хранится ссылка на программу, которая будет выполняться первой. У чистого Форта там ссылка на COLD. (можете убедиться: " 1304 @. " и " ' COLD. " числа должны быть одинаковыми) Лучше оформить автозапуск в виде отдельной программы:

: ARUN 0 C@ DISKADDR !

1 C@ TERMADDR !

PROBE TOP !

Перед тем как менять ссылку, лучше сперва сохранить всё на отдельную дискету, т.к. в случае неудачи восстановление данных будет затруднительным.

Теперь можно менять ссылку:

После сохранения на дискету та будет сразу загружать вашу программу.

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

Чаще всего данные дискеты можно восстановить следующим образом:

Загрузиться с чистого форта -> Вставить "повреждённую" дискету в дисковод -> Восстановить ссылку на COLD прямо на дискете:

400 0 DISKRS 1D56 418 !

400 0 DISKWS ***возможно, будут еще примеры *** Форт имеет огромное преимущество перед другими языками – прямое управление памятью (ПУП). Преимущество такой возможности – можно делать абсолютно всё, максимальная эффективность языка (значит наименьшая избыточность, значит КПД приближается к 100%). Недостаток ведь дополнительная сложность, легко задеть не то что надо, адресозависимость, непереносимость на другие компьютеры с такой же системой.

Итак, что значит прямое управление памятью? Это значит, что программист может прямо обращаться к нужной ячейке памяти и менять нужные байты (в языках уровнем выше такой возможности обычно нету, за них это делает ОС).

В всех приборах RedPower есть своя внутренняя память. И когда мы используем эти устройства через программы, то программа "залезает" в память нужного устройства и просто меняет в нем нужные байты. Обычно для этого используются стандартные слова (IOX!, LOAD, PAGE). Но есть возможность вручную менять нужные нам байты!

Чтобы получить доступ к памяти устройства, необходимо использовать слово RBP!, параметром для этого слова есть ID устройства. Например, стандартный ID IOX – 3. Поэтому 3 RBP! "залезет" в память этого прибора.

(До конца главы – автор Хитрый Лис). Исполнение микрокоманд:

Некоторые типы устройств имеют особый байт состояния, отвечающий за исполнение некоторого действия этого устройства. Использовать их очень просто: поместите номер микрокоманды в этот байт. Как только устройство закончит выполнять действие, оно изменит этот байт на 0 (если всё прошло нормально) или 0хFF (если возникла ошибка).

Некоторым микрокомандам необходимо больше времени чем остальным. Например на чтение и запись в дисководе требуется время, т.к.

они обращаются к жёсткому диску.

Для IOX декодера:

0x00-0x01: Регистр входа (это 2-х байтовое число считывает IOX@) 0x02-0x03: Регистр генерации сигнала (это число устанавливает IOX!) Первые 2 байта - это совокупность сигналов, которые декодер генерирует и принимает (надеюсь, вы уже знаете как кодируются цвета =).

Вторая пара байтов - только те сигналы, которые декодер генерирует.

Например, если нет никаких сигналов, то оба числа равны 0.

Если выполнена команда 2 IOX! и нет других сигналов, то оба числа равны 2.

И наконец, если выполнена предыдущая команда и на декодер подаётся сигнал только с белого провода, то первое число 3, а второе 2.

Для дисковода:

0x00-0x7F: Буфер дисковода, размером в 1 сектор (128 байт).

0x80-0x81: Номер сектора 0x82: Команда для дисковода: (далее значения этого байта) 0: Ничего или удачное завершение предыдущей команды 1: Прочитать имя дискеты 2: Записать имя дискеты 3: Прочитать ID дискеты (серийный номер) 4: Прочитать сектор дискеты 5: Записать сектор дискеты 0xFF: Неудачное завершение предыдущей команды Серийный номер:

Каждая дискета при создании получает случайный ID, состоящий из HEX цифр в виде строки. Этот ID задаётся раз и навсегда (можно только "сбросить" на ID загрузочной дискеты с Фортом). Чтобы прочитать ID, необходимо выполнить команду №3. После выполнения команды дисковод оставит в начале буфера ID в виде текста (оставшееся место заполняется нулями). Дисковод выдаст ошибку только в одном случае: если нет дискеты.

Каждую дискету можно назвать как угодно и переименовывать сколь угодно раз. Максимальная длина имени 64 символа. Чтение имени аналогично чтению ID, только используется команда №1. Для того, чтобы изменить имя дискеты, поместите это имя в буфер (не забудьте, что последний байт должен быть нулевым) и выполните команду №2.

Ошибка может возникнуть если нет дискеты или вы попытались переименовать загрузочную дискету (у неё защита от записи).

Данные:

Данные с дискеты читаются и записываются на неё только секторами по 128 байт.

На каждой дискете может быть до 2049 секторов, это значит, что дискета может содержать до 262272 байт или, примерно, 256 Кб. Чтобы прочитать с дискеты нужный сектор, поместите его номер в байты 0x80x81 и выполните команду №4. Прочитанный сектор будет находится в буфере и вам остаётся только скопировать его в память компьютера (всем этим занимается DISKRS) или изменить данные прямо в буфере для последующей перезаписи.

Ошибка может возникнуть если нет дискеты или требуемый сектор не существует (чтение за пределом файла-образа).Примечание: если размер файла не кратен 128 байтам, то сектор, содержащий конец файла, может быть прочитан и размещён в буфере, но дисковод не обнулит оставшуюся часть и выдаст ошибку.

Чтобы переписать сектор дискеты, поместите данные в буфер, поместите номер сектора в соответствующие место и выполните команду №5. Ошибка возникнет, если нет дискеты или эта дискета загрузочная.

Для терминала:

Разрешение монитора 80х50 знакомест. Нумерация строк и столбцов от 0 слева-направо и сверху-вниз (по принципу таблицы Менделеева).

Курсор:

0x01: столбец x 0x02: строка y 0x03: режим (0: спрятан, 1: сплошной, 2: мигающий) Буфер ввода с клавиатуры (16 байт, FIFO):

0x04: Указатель начала очереди 0x05: Указатель конца очереди 0x06: Значение клавиши в начале очереди Действия с областями:

0x07: Команда (1: заполнить, 2: инверсия цвета; 3: копировать) Координаты левого верхнего угла:

0x08: x координата области источника / Значение для заполнения 0x09: y (необходимо только для копирования) 0x0A: x координата области, требуемой для изменения 0x0C: Ширина области 0x0D: Высота области Доступ к видеопамяти:

0x00: Номер строки для чтения/изменения 0x10-0x60: Содержимое строки Курсор:

Тут всё просто, помещаете в байты 0х01 и 0х02 нужные координаты и курсор переместится (этим занимается AT-XY). С режимом курсора тоже просто. Например, введите HEX 0 303 C! и курсор исчезнет (2 303 С! чтобы его вернуть).

Чтение с клавиатуры:

Терминал самостоятельно читает нажатие клавиш и помещает их значение в собственный буфер (при наличии места), даже если терминал не связан с компьютером. Буфер пуст, если оба указателя равны (это проверяет KEY?). Буфер переполнен, если указатель конца находится перед указателем начала. Таким образом, буфер может реально хранить до символов (если 16, то будет невозможно различить переполненный и пустой буфер). Если программе нужно прочитать символ, то необходимо сравнить указатели, если они не равны, то значение необработанной клавиши будет находится в байте 0x06. Терминал никак не реагирует на чтение с буфера, поэтому программе нужно самостоятельно увеличить на указатель начала (всё это выполняет KEY). Заметьте, что терминал самостоятельно уменьшает число указателя, если оно больше (возвращает остаток деления на 16).

Видеопамять:

Программы могут напрямую менять информацию, выводимою на экран. Для этого надо в байт 0x00 поместить номер строки (от 0 до 49) и в последнем диапазоне менять данные по своим нуждам. Терминал может выводить 128 различных символов. Оставшиеся 128 символов те же самые, только выводятся с инверсией цвета (чёрное на зелёном). Различить символы с инверсией можно по старшему биту.

- Типичная ошибка программирования При прямом управлении памятью забывают перейти на HEX (при условии, что адреса шестнадцатеричные).

Эх жалко, далеко не на всех серверах есть локальный чат. Так бы можно содрать побольше денег с юзеров. В принципе, на обычных серверах нету острой необходимости в связи по Интернету, ведь можно просто говорить в чат. Но все равно, это довольно интересно. Как же можно соорудить Интернет в RedPower? Как раз я об этом расскажу в данной главе.

Я давным-давно думал об Интернете на сервере, даже разрабатывал схему из чистого редстоуна. Но теперь есть компьютеры. Способов передачи данных есть огромное количество способов! Вот они:

Через один провод - последовательная передача (для бедняков).

Через связку (bundled cable).

Через шину данных (плоский кабель, Ribbon Cable) Через шину данных, но посредством IOX.

Наверное, самый лучший вариант – напрямую через шину данных. Но это очень сложно! Поэтому для меня самый простой вариант – последний.

Но я коротко рассмотрю все варианты. Для способа передачи есть много вариантов, но самый подходящий – вводим стоку, а потом ее передаем.

Вот код для ввода сообщения:

33 ALLOT CONSTANT MSG

: WRITE CR." [write]: " 33 ACCEPT MSG ;

: LOOK CR." [message]:" MSG TYPE ;

Для начала рассмотрим код приемника. Он у нас будет тупо ждать сигнала, а потом раскодировать его. Итак:

: PRIEM CR." Wait…" CR BEGIN IOX@ 0 = WHILE REPEAT // "заморозка".

BEGIN IOX@ WHILE

IOX@ EMIT 3 TICKS REPEAT ;

Итак, передача через один провод:

Одним проводом может служить и редстоун-пыль и провода из RP и цветной провод. Так как через такой канал передается только 1 бит за раз, то такая передача самая медленная и сложная. Ведь нужно конвертировать код в последовательный набор битов.

Слово для декодировки последовательного кода в текст я не напишу, это сильно примитивно. Ну а слово для кодировки вот:

VARIABLE COD

MSG STRLEN 0 DO

MSG I + C@ COD !

1 J 2 компов.

Программа такая же как и при передаче через цветную связку, но дополненная выбором ID компьютера, с которым устанавливается связь.

Добавляем вначале слова: IOXADDR !. Вот и всё. И перед вызовом программы ставим параметр – номер ID собеседника.

Также есть преимущество перед просто цветной связкой – возможность обратной связи. Для приема информации с другого компьютера нужно просто поменять значение IOXADDR на номер своего ID и читать байты.

ООП – объектно-ориентировочное программирование. Является наиболее используемым видом программированием.

Но наш же любимый Forth не ООП, а стек- программировании (ООП) вы реализовать ООП? В данной главе будет Википедии:

рассматриваться не сколько ООП, сколько перенесение некоторых его возможностей в язык Forth, такие как объекты, поля объектов и методы.

Главное понятие ООП – объект. Для понимания термина приведу пример. Возьмем лифт. Все согласны, что лифт это объект? Да, объект. Чем можно описать лифт? Ну например этим: вес, скорость, текущий этаж, этаж цели, этаж вызова, сколько людей может поднять, сколько их на данный момент, ID номер, тип, изготовитель и так до бесконечности. Еще есть такая важная вещь, как абстрагирование – процесс упрощения понятия (отбрасывания лишних свойств). Чем меньше свойств, тем абстрактнее объект. Для различных задач нужна разная степень абстракции. И важно очень точно подбирать точность описания – ни больше, ни меньше.

Для создания объекта используется конструктор. Конструктором можно создать сколько угодно объектов по одному шаблону.

Поля объекта я уже перечислил – вес, этаж и т.д. Является обязательной составляющим объекта.

Методы – действия с объектом. Например, лифт может подниматься, опускаться, открывать-закрывать двери, упасть, поломаться. Благодаря методам можно узнать значение веса лифта, количество людей и т.д.

Мы будем строить компьютерную модель лифта.

Самая первая наша задача – степень абстракции. Какой "обвес" (по научному – поля) нужен нашему лифту? Ясно, текущий этаж, этаж цели, этаж вызова, состояние дверей. Больше уточнять лифт не будем. Теперь, какие будут методы, или что сможет делать наш лифт. Во-первых, двигаться. Также открывать и закрывать дверь. Еще он должен уметь вычислять разницу между текущим этажом и целью. По ходу пьесы еще парочку придумаем.

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

Создаем массив на 5 ячеек:

5 ALLOT CONSTANT LIFT

Каждая ячейка хранит поле лифта. Это можно представить так:

Так выглядит наш лифт при создании массива. Намного же лучше использовать конструктор – тогда для создания нового объекта нужно просто вызвать конструктор. Также при использовании конструктора поля лифта приобретают начальные значения. Присваивание начальных значение можно сделать вручную (через параметры), стандартными, и смешанными.

Еще необходимо сделать указатель на объект, т.е указатель на тот объект, над каким будет производится действие, для этого будет служить переменная Iter. Создаем конструктор:

: CREATE 5 ALLOT DUP 1 SWAP C!

DUP ITER !

CONSTANT ;

Что здесь происходит? Во-первых, выделяется 5 ячеек памяти. Потом первому полю (текущий этаж) присваивается значение 1. Все остальные поля по нолям. Переменная ITER сразу автоматически указывает на новый объект. А слово CONSTANT служит для задания имени объекта. Теперь можем создать первый объект:

CREATE LIFT- Первый наш объект-лифт создан! Настало время перейти к полям.

Поля разных объектов имеют одинаковое имя. Допустим, мы создали еще один объект LIFT-2. В объектах LIFT-1 и LIFT-2 есть одинаковое поле "этаж", но значения этого поля у них отличается.

Как можно получить доступ к нужному полю? Из главы о массивах вы узнали, что для получения нужного элемента нужно к адресу начала (имени массива) прибавить индекс нужного элемента. Для простоты создадим еще парочку констант, которые будут заменять нам индексы:

Чтобы не писать постоянно формулу вычисления элемента, можно создать дополнительное слово, которое будет брать с объекта заданное поле и класть его значение в стек:

Данное слово берет значения поля объекта с указателя на объект – переменной ITER. Для этого нужно сначала указать эту переменную на объект - LIFT-1 ITER ! (надо использовать когда есть несколько объектов) Использование данного слова:

CREATE LIFT- LIFT-1 ITER !

FLOUR FIELD. DOOR FIELD. Но нужно же еще и слово для присваивания значения полю. Для этого создадим еще одно слово:

: FIELD!

Теперь можно написать первый метод:

FLOUR FIELD

FLOUR FIELD! ;

LIFT-1 UP LIFT-2 UP Использование методов сильно упрощает задачу – не нужно писать отдельные программы для отдельных объектов!!!

Очень полезная глава для тех, кто хочет навести порядок среди своих программ и файлов. Тут под словом "файл" подразумевается массив, который хранит некоторую информацию – музыка, картинка, текст, анимация и т.п. Файл имеет конкретный адрес. Каталогом у нас будет массив, который содержит адреса файлов (при небольшом усложнении можно делать вложенные каталоги). То есть, файлы можно собрать в одну кучу и оперировать ими (хотя физически они могут быть в разных местах памяти). Каталоги должны хранить адреса. И сейчас мы подробно разберем, как всё это сделать.

Сначала делаем слово-конструктор (см. главу выше), которое создает каталог на n ячеек и с именем name. Вот простой код:

: CATALOG // пример: 5 CATALOG IMAGES ALLOT DUP -ROT C! CONSTANT ;

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

n – количество ячеек в каталоге.

addr(n) – указатель на файл.

После адреса каталога идут индексы ячеек. (помним, последняя = 0).

Теперь для удобства создаем переменные ADDR и CAT, которые хранят адреса текущего каталога и файла. Теперь нужно как-то добавлять файлы в каталог. Для этого создаем слово ADDFILE : ADDFILE CAT ! ADDR !

CAT @ C@ 0 DO // цикл n раз (n – количество ячеек в каталоге) CAT @ I 2 * 1 + + @ 0 = IF // если в ячейке 0, то ADDR @." OK" LEAVE UNLOOP THEN LOOP ;

Данное слово ищет в каталоге свободное место и, найдя его, записывает туда адрес файла и пишет "ОК". Например, в каталог IMAGES мы можем добавить картинку так:

MyPhoto IMAGES ADDFILE Теперь нужно как-то брать адреса файлов с каталога. Для этого пишем еще одно слово GETFILE:

: GETFILE 2 * 1 - + @ ; // параметры: каталог, номер Это слово просто кладет в стек адрес n-ного элемента каталога.

Например, IMAGES 1 GETFILE даст нам адрес файла, который имеет 1-ый номер в каталоге. Теперь нужно как-то удалять ненужные адреса с каталога. Для этого создаем слово DELFILE:

Это слово удаляет (вместо адреса ставит 0) файл с каталога (но не с памяти). Пример – IMAGES 1 DELFILE удаляет 1-ый файл с каталога. Но для удобства мы создаем еще одно слово – для просмотра содержимого каталога. Для этого пишем слово SHOWFILES:

: SHOWFILES Например, если мы заполнили наполовину каталог картинками, то можно увидеть такое:

IMAGES SHOWFILES

5 – 6330 // пустые ячейки пропускает!

Для чего еще можно использовать каталоги? Если вы на сервере строите Интернет, то в каталоге можно удобно хранить сообщения и картинки, которые проще простого можно хранить, просматривать и отправлять другу! Также благодаря каталогам можно связать такие разные вещи, как текст и картинки – в одном каталоге хранятся картинки, а в другом – текст. И написав дополнительную программку, можно сделать удобный просмотр картинок на терминале – с одного каталога берет картинки, а с другого – название (или же комментарий).

P.S. Автор этой книги придумал каталоги, чтобы связать музыку и картинки в своем строящемся компьютере - под каждую музыку своя картинка =).

1) Таблица значений цветных проводов:

номера проводов:

(не у всех словах показан прядок и количество параметров, для дополнительной информации загляните на minecrafting.ru).S – выводит на экран весь стек.

WORDS – выведет весь словарь.

FORGET - удаляет слово и все остальные слова HEX – переход в шестнадцатеричную систему счисления.

DECIMAL – переход в десятичную систему.

TICK – ждет 1 тик (1/20) секунды.

TICKS – ждет указанное количество тиков.

TIMES - исполняет слово указанное количество раз.

DUP – дублирует последнее число из стека. IS[1] ->IS[1,1] ?DUP - дублирует число в стеке, если не ноль. IS[0 ] ->IS[0] 2DUP – дублирует два последних числа в стеке. IS[1,2] ->IS[1,2,1,2] DROP – удаляет последнее число из стека IS[1,2] ->IS[1] 2DROP – удаляет два последних. IS[1,2,3] ->IS[1] SWAP – меняет местами последние два числа. IS[0,1,2] ->IS[0,2,1] 2SWAP – меняет местами попарно 4 числа PICK – ставит в вершину стека число под номером n с вершины стека, (10 5 1 2 PICK – в стеке :10 5 1 5) OVER – тоже, что PICK, но n= 2OVER – тоже, что PICK, но n= ROT – сдвигает влево три последних числа. IS[1,2,3]->IS[2,3,1] -ROT – сдвигает вправо три последних числа. IS[1,2,3]->IS[3,1,2] NIP – удаляет предпоследнее значение из стека. IS[1,2]->IS[2] TUCK – копирует последнее число в начало стека. IS[1,2]->IS[1,2,1] R> - последнее число помещает в R-стек (стек возвратов) R< - из R-стека число перемещает в стек.

SPO – вершина стека (по умолчанию 512).

SP! – задаст вершину стека EMIT – выведет символ по коду ( 65 EMIT выведет "А") KEY – ждет нажатия клавиши, при нажатии кладет в стек ее код.

KEY? – при нажатии клавиши в стек ложится флаг TRUE AND – побитовая операция "AND" 1 3 AND. 1 (00000001 & 00000011 = 00000001) OR - побитовое "OR" 1 2 OR. 3 (00000001 | 00000010 = 00000011) XOR – побитовое "XOR" 5 7 XOR. 2 (00000101 xor 00000111 = 00000010) INVERT – побитовое "NOT" 128 INVERT. 127 (10000000 -> 01111111) > - сдвиг битов вправо n раз – 256 8 U>> -> IS[1] ' – адрес слова ( ' COLD выведет 1304).

EXECUTE – выполняет слово по адресу ( 1304 EXECUTE выполнит COLD).

TOP - Вершина доступной памяти. Зависит от числа установленных модулей.

FREE – свободная память в байтах.

TERMADDR – адрес текущего терминала AT-XY – перемещение курсора на X, Y.

MOVE – копирует содержимое одной строки в другую.

1) Учебник по Forth 2) Перевод RedPower от VikR на minecrafting.ru 3) англ. источник по ОС на Forth А также YouTube, Википедия, и другое… Автошахтер Автолеталка Автоферма Атомная электростанция Игра «Seven»

Интернет Компьютер (пре-релиз) Как быстро ввести программу на FORTH 1) Пишем на чужом компьютере FORGET DOCON и смотрим на реакцию хозяина. Данный прикол стирает абсолютно всю память системы !

2) Прячем курсор: HEX 0 303 C!

3) У всех начинающих писать на Forth'e появляется ужас от мысли, что нужно долго вводить текст, а при ошибке его вообще переписывать. Как исправить такую ситуацию? Я поступил так (смотреть на Ютубе):

скачал kbt – программа для ввода скачал эмулятор Forth скачал загрузочную дискету от Хитрый Лис Стандартную загрузочную дискету заменяем на скачанную дискету (в папке с эмулятором, в папку roms вставляем скачанную дискету и заменяем ею redforth.img. С этой дискеты система работает намного лучше и быстрее). Дальше создаем текстовый файл. В нём пишем свою программу. Затем включаем kbt, выберем свой файл. В эмуляторе нажимаем F9 и … ваша программа быстро и безошибочно введена в память! Примечание: kbt может вводить текст и в окне minecraft'а.

Если же нужно перенести программу с эмулятора в свой мир minecraft, то в эмуляторе пишете SAVE" name". Потом из папки roms берем созданный файл-диск и переносим в сохранку.

Очень важная дополнительная информация о загрузочной дискете!

Дискета по ссылке на загрузочную дискету от Хитрого Лиса имеет некоторые критичные отличия от стандартной дискеты, то есть, некоторые программы не будут работать. Поэтому важно ознакомиться с этими отличиями - читайте на этом сайте!

1) Программка для просмотра кода клавиши (нажимаем клаву и смотрим):

2) Программка для подачи импульса в IOX (параметр – число):

: PULSE DUP IOXSET 5 TICKS IOXRST ; / задержку ставим по желанию 3) Программка для просмотра содержимого памяти (параметры – начальной и конечный адрес):

4) Пеинт (движение – AWSD, Q – очистка экрана, space и tab – рисовать, backspace – стереть, ' (сверху tabа)- выход):

KEY DUP

8 = IF 20 EMIT 301 C@ 1 - 301 C! THEN 20 = IF A0 EMIT 301 C@ 1 - 301 C! THEN 51 = IF PAGE 5 301 C! 5 302 C! THEN 5) Программа для создания, рисования и сохранения символьных рисунков (16х16). Использована технология ООП. Для создания, редактирования и открытия рисунка нужно задавать его имя.

VARIABLE ITER

DECIMAL

257 ALLOT CONSTANT ;

E EMIT 10 0 DO CR 13 EMIT 11 301 C! B EMIT LOOP

CR D EMIT

10 0 DO 0 EMIT LOOP 1D EMIT 302 C@ 10 - 302 C! ;

: DRAW ITER !

BOUND 10 0 DO 1 301 C!

ITER @ I 10 * + 11 ACCEPT CR LOOP ;

: OPEN ITER ! HEX BOUND 10 0 DO 10 0 DO 1 301 C! ITER @ J 10 * I + + C@ DUP 0 = IF SPACE DROP

ELSE EMIT THEN

LOOP CR LOOP ;

Напоследок я выражу благодарности. Огромное спасибо Playermet за конструктивную критику. Без его помощи, эта книга была бы полным отстоем… Спасибо поставщику сырья - человеку под именем ХитрыйЛис. Он любезно согласился помочь в написании этой книги (переменные, константы, массивы, дискеты, ПУП).

Прокомментировать и прочитать комментарии Вы можете на сайте Minecrafting.ru Вам понравилась книга? Тогда вы можете материально отблагодарить автора. И сможете сделать это через WebMoney на такие кошельки:

Доллары: Z Рубли: R Гривна: U



Похожие работы:

«Министерство образования и науки Республики Татарстан Государственное автономное образовательное учреждение высшего профессионального образования Альметьевский государственный институт муниципальной службы ОУ ВПО АГИМС проф. Салахов И.Р. '^о^с/ 2013 г. ОСНОВНАЯ ПРОФЕССИОНАЛЬНАЯ ОБРАЗОВАТЕЛЬНАЯ ПРОГРАММА среднего профессионального образования Направление подготовки Экономический профиль подготовки Специальность 080118 Страховое дело Квалификация выпускника Специалист страхового дела...»

«Региональная Программа ТАСИС Европейского Союза Комплексное использование земель Евразийских степей Технический отчет: Мероприятие 1.1.4 d (Technical Report: Activity 1.1.4 d) Подходы к подготовки стратегий социальноэкономического развития сельских территорий (Social and economic development of rural areas: strategic approach) Этот проект финансируется Проект осуществляется компанией Euroconsult Mott MacDonald совместно с ICF Европейским Союзом Этот проект финансируется Проект осуществляется...»

«Муниципальное бюджетное общеобразовательное учреждение Разинская СОШ РАБОЧАЯ ПРОГРАММА по предмету География для 9 классов на 2014 - 2015 учебный год. Ступень основного общего образования, базовый уровень 68 часов (2 часа в неделю). Разработана на основе программы для средней (полной) школы (базовый уровень) А.И. Алексеева, Е.К. Липкиной, В.В. Николиной (М., Просвещение, 2009 г.). Учебник для 9 кл. (базовый уровень) А.И. Алексеева, География. Россия М., Просвещение, 2011 г., серии Полярная...»

«СЕТИ И БАЗЫ ДАННЫХ Программа: Бакалавриат по направлению Менеджмент Преподаватели: к.т.н., доцент Яблонский Сергей Александрович, [email protected]. Кафедра: Информационные технологии в менеджменте Статус дисциплины: По выбору Профиль: Международный менеджмент, Финансовый менеджмент, Маркетинг ий Курс 3 Семестр Осень – 2011 Трудоемкость: 3 ECTS, 30 часов лекций, 15 часов практических работ. Пререквизиты: Информационные технологии в менеджменте – 1, Информационные технологии в менеджменте – 2...»

«Муниципальное бюджетное образовательное учреждение Средняя общеобразовательная школа № 57 с углубленным изучением Английского языка г. Владивостока ПРИНЯТО СОГЛАСОВАННО Утверждаю МО учителей Зам.директора по УВР Директор МОУ СОШ №57 с углубленСОШ №57 с углубленным изучением МОУ СОШ№57 с углубленным изучени- ным изучением английского языка г. английского языка г. Владивостока ем английского языка г. Владивостока Владивостока Круглова Г.В. Протокол №_ Симакина О.Е. Приказ №160/10 от 31.08.2013г...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ ФГБОУ ВПО Уральский государственный лесотехнический университет Кафедра бухгалтерского учета, анализа и экономической безопасности Одобрена: Утверждаю: кафедрой менеджмента и ВЭД предприятия протокол № 8 от 5 апреля 2012 г. Декан ФЭУ В.П. Часовских Зав. Кафедрой _В.П. Часовских методической комиссией ФЭУ Протокол № 8 от 26 апреля 2012г. Председатель НМС ФЭУ_ Д.Ю. Захаров Программа учебной дисциплины Программа учебной дисциплины Б2.ДВ2 СТРАХОВОЕ ДЕЛО...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Кузбасский государственный технический университет имени Т.Ф. Горбачева Кафедра технологии переработки пластических масс УТВЕРЖДАЮ Начальник учебного управления _Е.Ю. Брель _2012г. ПРОГРАММА ПРОИЗВОДСТВЕННОЙ ПРАКТИКИ Направление 240100.68 Химическая технология Профиль подготовки 240111.68 Технология и переработка полимеров Трудоемкость...»

«г. Белгород Дайджест новостей 1. Последствия бегства капитала из России могут стать главной антироссийской санкцией. 3 2. Каждый крымчанин обойдется России в 100 тысяч в год 3. За русский Крым пострадают чиновники и госбизнесмены 4. Инвесторы избавляются от российских активов 5. Бюджет подрастерял профицит. Расходы госказны почти догнали ее доходы 6. Какие отрасли выиграли от девальвации рубля 7. Десять главных богачей России потеряли из-за Крыма $6,6 млрд 8. Ford может приостановить...»

«Министерство образования и науки РФ ФГБОУ ВПО Пензенский государственный университет Программа вступительного испытания на обучение по программам подготовки научно-педагогических кадров в аспирантуре ПГУ по направлению подготовки 41.06.01 Политические науки и регионоведение ПЕНЗА 2014 ПРОГРАММА вступительного экзамена по профилю направления подготовки 23.00.02 – Политические институты, процессы и технологии Тематика экзамена Основная тематика охватывает ключевые проблемы - общепрофессиональных...»

«Проект ЗАКОН ИРКУТСКОЙ ОБЛАСТИ О РЫБОЛОВСТВЕ И СОХРАНЕНИИ ВОДНЫХ БИОЛОГИЧЕСКИХ РЕСУРСОВ В ИРКУТСКОЙ ОБЛАСТИ Статья 1. Предмет регулирования настоящего Закона 1. Настоящий Закон в соответствии с Водным кодексом Российской Федерации, Федеральным законом О животном мире, Федеральным законом О рыболовстве и сохранении водных биологических ресурсов, Законом Иркутской области Об охране и использовании объектов животного мира в Иркутской области регулирует отношения, возникающие в сфере рыболовства и...»

«Муниципальное образовательное учреждение общеобразовательная Гимназия №2 Центральный район г. Красноярск 660049 г. Красноярск, ул. Марковского 36, тел.: 227-68-49, факс 227-68-49, е-mail:[email protected] СОГЛАСОВАНО УТВЕРЖДАЮ Председатель Директор МОУ ОУ Гимназии №2 Управляющего совета И.Г. Штейнберг _Б.В.Шевченко __2010г. __2010г. ПУБЛИЧНЫЙ ДОКЛАД ДИРЕКТОРА МОУ ОУ ГИМНАЗИИ №2 за 2009-2010 учебный год. Красноярск 2010 г. СОДЕРЖАНИЕ 1. Создание условий для освоения обучающимися гимназии № основной...»

«ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ МЭИ Виртуальный класс. Вебинары © НИУ МЭИ, 2012 Руководство слушателя вебинара Вебинар – это семинар, проводимый через Интернет. Предполагается, что общение между участниками вебинара осуществляется голосом, в текстовой форме (через чат), слушатели могут видеть преподавателя, слушать его голос, видеть в реальном времени, что происходит на экране...»

«1 СОДЕРЖАНИЕ 1. Общие положения 2. Характеристика профессиональной деятельности слушателя ОП профессиональной переподготовки Промышленная теплоэнергетика 3. Компетенции слушателя ОП профессиональной переподготовки, формируемые в результате освоения данной ОП профессиональной переподготовки 4. Документы, регламентирующие содержание и организацию образовательного процесса при реализации ОП профессиональной переподготовки Промышленная теплоэнергетика 5. Фактическое ресурсное обеспечение ОП...»

«ПОЯСНИТЕЛЬНАЯ ЗАПИСКА Рабочая программа курса История для учащихся 6 класса МБОУ Кощеевская СОШ составлена на основании: Федерального компонента государственного стандарта общего образования по истории и авторских программ: * В. А. Ведюшкин История средних веков// ПРОГРАМЫ ОБЩЕОБРАЗОВАТЕЛЬНЫХ УЧРЕЖДЕНИЙ. История. Обществознание 5-11 классы. М. Просвещение 2006 г. * А. А. Данилов, Л.Г. Косулина История России с древности до конца 16 в// ПРОГРАМЫ ОБЩЕОБРАЗОВАТЕЛЬНЫХ УЧРЕЖДЕНИЙ. История. 6...»

«Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Кемеровский государственный университет Кафедра социологических наук ПРОГРАММА кандидатского экзамена по специальности 22.00.08 –СОЦИОЛОГИЯ УПРАВЛЕНИЯ (социологические науки) форма обучения очная курс 1 зачетных единиц 1 всего часов 36 форма контроля кандидатский экзамен Кемерово 2012 Общая характеристика Кандидатский экзамен по социологии...»

«Государственное бюджетное образовательное учреждение средняя общеобразовательная школа №121 Рабочая программа по русскому языку 7 класс Разработчик: Грибакина Юлия Григорьевна г. Москва, 2013г. 2013-2014 учебный год Пояснительная записка Изучение русского языка в основной школе направлено на достижение следующих целей: • воспитание гражданственности и патриотизма, сознательного отношения к языку как явлению культуры, основному средству общения и получения знаний в разных сферах человеческой...»

«Пояснительная записка Рабочая программа по предмету Русский язык для 10 класса составлена на основе: 1. Образовательной программы среднего общего образования МОУ СОШ №15 с УИОП. 2. Авторской программы Н.Г. Гольцовой, И.В.Шамшина (М.: Просвещение, 2009). Программа предназначена для изучения русского языка в старших классах на базовом уровне и составлена из расчета 1 час в неделю, всего 34 часа Проверочных работ- 6 Тестов-6 К/р. -1 Программа детализирует и раскрывает содержание стандарта,...»

«ПРОГРАММА II Выездной конференции Центра дополнительного образования Снейл 21-22 июня 2014 года, Омская область ЦЕЛЬ КОНФЕРЕНЦИИ Обсуждение основных аспектов и перспектив работы ЦДО Снейл. МЕСТО ПРОВЕДЕНИЯ Омская область, д.п. Чернолученский, База отдыха Радуга РЕГЛАМЕНТ КОНФЕРЕНЦИИ Время Событие Место проведения 21 июня 2014 года Отъезд участников конференции ул. Фрунзе, 40 08.00-8.30 Регистрация участников Холл, 1 корпус Базы 09.30-10.00 отдыха Радуга Фотосессия. Групповое фото Беседка между...»

«Содержание рабочей программы: 1. Цель и задачи дисциплины, её место в учебном процессе. Цель преподавания дисциплины. 1.1. Цель курса Инфекционные болезни мелких домашних животных - дать студентам знания об эпизоотологических закономерностях возникновения, проявления и распространения инфекционных болезней собак, кошек и других мелких домашних животных, средствах и способах профилактики и борьбы с ними. Научить современным методам диагностики и лечения данных болезней. Задачи изучения...»

«СОДЕРЖАНИЕ Стр. 1. ОБЩИЕ ПОЛОЖЕНИЯ 4 Нормативные документы для разработки ОПОП по 1.1. 4 направлению подготовки Общая характеристика ОПОП 1.2. 5 Цели и задачи ОПОП СПО 1.3. 6 Требования к абитуриенту 1.4. 6 ХАРАКТЕРИСТИКА ПРОФЕССИОНАЛЬНОЙ 2. 6 ДЕЯТЕЛЬНОСТИ ВЫПУСКНИКА 2.1. Область профессиональной деятельности выпускника Объекты профессиональной деятельности выпускника 2.2. Виды профессиональной деятельности выпускника 2.3. Задачи профессиональной деятельности выпускника 2.4. КОМПЕТЕНЦИИ...»






 
2014 www.av.disus.ru - «Бесплатная электронная библиотека - Авторефераты, Диссертации, Монографии, Программы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.