Перейти к содержанию

Гайд по RedPower. Low-level №2. Ускорение заводов.


Alleksh

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

Если Вы не читали прошлую часть - рекомендую её к прочтению. Без неё многое тут может быть непонятно.
Вторая часть:

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

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

Взаимодействие проходит таким образом:
На Вашем устройстве кусок памяти 0x300-0x3FF это 0x400-0x4FF на другом. И наоборот.
То есть, изменяя байт 0x300 мы изменяем 0x400 на другом.
Не нужно использовать во время диалога, т.к. любое отображение ставит в RBP! номер терминала, который указан в TERMADDR.

 

Вот моя сеть:
image.png.8175d1132a912585f140e32a8e8419ff.png
Попробуем написать команду, которая отправит данные другому устройству:
: SEND CR ." ENTER MESSAGE: "

400 100 ACCEPT DROP RBP!

400 300 OVER STRLEN MOVE ;

На 0x100 находится TIB буфер(для строк), мы не пишем сразу в  0x300 т.к. сейчас мы подключены к матрице, следовательно будем изменять её.
Попробуем отправить устройству с ID 15 нашу строку:
image.thumb.png.39bc66000fb7fa5aaf429d18465ff01d.png
И вот, о чудо, мы получили нашу строку:
image.thumb.png.fe11278f3c9622a9c2aed80324018bc1.png

И так, вернёмся к периферии.

Во первых, таблица(взято с http://minecrafting.ru/topic/6612/ ) :
Курсор:
0x01: столбец x
0x02: строка y
0x03: режим (0: спрятан, 1: сплошной, 2: мигающий)
Буфер ввода с клавиатуры (16 байт, FIFO):
0x04: Указатель начала очереди
0x05: Указатель конца очереди
0x06: Значение клавиши в начале очереди
Действия с областями:
0x07: Команда (1: заполнить, 2: выделить(инверсия цвета); 3: копировать)
Координаты левого верхнего угла:
0x08: x координата области источника / Значение для заполнения
0x09: y (необходимо только для копирования)
0x0A: х координата области, требуемой для изменения
0x0B: y координата области, требуемой для изменения
0x0C: Ширина области
0x0D: Высота области
Доступ к видеопамяти:
0x00: Номер строки для чтения/изменения
0x10-0x60: Содержимое строки

Это - память терминала (чтобы править, нужно использовать 0x300+addr).

Зная всё это, мы можем понять, что, например, с монитором не всё так просто.
Воспользуемся командой DECOMPILE, чтобы просмотреть, как работает EMIT:
image.png.3915d7c2d1ff20400b4ba2702e9df2b5.png
Давайте разбирать.
1) 0xF08-0xF12 Берёт из адрес терминала из TERMADDR и переключает устройство на него.
2) 0xF14-0XF18 В 0x300 записывается наш символ.
Далее идёт смена координат, это не столь важно.

А не так и сложно, как показалось с первого взгляда, верно?

Воспользуемся таблицей(взято с http://minecrafting.ru/topic/6612/ ) :
0x00-0x7F: Буфер дисковода, размером в 1 сектор (128 байт).
0x80-0x81: Номер сектора
0x82: Команда для дисковода: (далее значения этого байта)
0: Ничего или удачное завершение предыдущей команды
1: Прочитать имя дискеты
2: Записать имя дискеты
3: Прочитать ID дискеты (серийный номер)
4: Прочитать сектор дискеты
5: Записать сектор дискеты
0xFF: Неудачное завершение предыдущей команды

Давайте  посмотрим, как работают функции взаимодействия с дисководом(про запись/чтение на дискеты, кстати, поговорим в следующих частях).
image.png.d6fc046a8f89ed26100265b11bd9844b.png
SAVE" записывает на диск всё от 0x500 до HERE.
Во первых, она использует слово DISKNAME". Давайте декомпилируем и его:
image.png.54308a4df2ed85c8daf1518e8da3d8c5.png

Не так уж и сложно, записывает данные на 0x300-0x380 и записывает номер команды в 0x382.
Вернёмся к SAVE".
Далее идёт подготовка к запуску цикла, цикл записывает каждые 128 байт от 500 до HERE используя DISKWS.
Давайте посмотрим и на него:
image.png.67b85e5f9c24ede67e27f0fb3443052f.png
И снова, не всё так уж и сложно. Приблизительно то же, что и в случае DISKNAME".

Всё просто, не правда ли?

Давайте перейдём к самому вкусному - сортроны. 
Таблица:
0x00: микрокоманда
1: Определить размер инвентаря
2: Прочитать содержимое слота
3: Извлечь
4: Фильтр
0x01: Количество предметов
0x02: Номер слота
0x04: Идентификатор предмета (4 байта!)
0x08: Повреждённость предмета
0x0A: Предел прочности предмета
0x0C: Исходящий цвет
0x0D: Входящий цвет

Разберём команду SORTPULL:
image.png.a43d093d1ebe431a0299702279c6b9ae.png
И снова, запись адреса в RBP, запись номера слота в 0x302, кол-ва предметов в 0x301.
Использует SORTCMD.
Давайте проанализируем и его:
image.png.abb9389279d32c3b384481050b487538.png
Во первых, что мы можем увидеть - снова запись адреса в RBP.
Ожидание исполнения команды.
Проверка на то, не случилось ли каких-либо ошибок при работе.
Если случились - выводим Sorter Error и выполняем QUIT.

Вы все ещё можете спросить, как это позволит нам ускорить свои заводы?
А всё просто:
Во первых, Вы можете убрать из SORTPULL последних две команды, если они вам, очевидно, не нужны.
И две первых, если Вы все еще работаете с сортроном, к которому подключены.

Давайте теперь попробуем написать очень быструю команду извлечения ВСЕХ предметов из сундука.
Заменим SORTCMD, уберём проверку на ошибки и переключение SORTADDR.
Оставим ожидание выполнения.
HEX
: BETTER_SORTCMD
DUP 300 C! 300 C@ = 5 TICKS ;
: GET_ALL_ITEMS
SORTADDR @ RBP!
1 BETTER_SORTCMD 302 @
0 DO

40 301 C! I 302 !
3 BETTER_SORTCMD LOOP ;


Вторая функция, использует стандартные методы:
: GET_ALL_ITEMS2 SORTSLOTS 0 DO 64 I SORTPULL DROP LOOP ;
Вот, мы убрали переключение на SORTADDR, убрали проверки каждый раз в SORTCMD.

Давайте теперь сравним две функции:
Наша GET_ALL_ITEMS справилась за 4.2  секунды.
GET_ALL_ITEMS2 справилась за 6.9 секунд.

Этот пример НЕ СОВЕРШЕНЕН, можно ещё сильнее ускорить.
ВАЖНО:
Оставляйте проверку на ошибки в конце функции.
Почему?
Требование международных стандартов.
Просто если что-то пойдёт не так, сортрон зависнет например, или шину разорвёт на стыке чанков.

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

Первая часть: https://f.simpleminecraft.ru/index.php?/topic/5936-redpower-компьютеры/
Вторая часть: https://f.simpleminecraft.ru/index.php?/topic/5941-redpower-компьютеры-вторая-часть-понимание-системы/

Третья часть: https://f.simpleminecraft.ru/index.php?/topic/5951-redpower-компьютеры-третья-часть-еще-глубже-ускорение-заводов/

Четвертая часть: https://f.simpleminecraft.ru/index.php?/topic/5965-redpower-компьютеры-четвёртая-часть-собственные-структуры-данных/

Пятая часть: https://f.simpleminecraft.ru/index.php?/topic/5989-гайд-по-redpower-компьютеры-пятая-часть-работа-с-сетью-дисками-чат/

 

 

Изменено пользователем Alleksh
  • Нравится 5
  • Рейтинг 1
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...