Alleksh Опубликовано 4 января, 2019 Поделиться Опубликовано 4 января, 2019 (изменено) Если Вы не читали прошлую часть - рекомендую её к прочтению. Без неё многое тут может быть непонятно. Вторая часть: Сейчас мы поговорим о том, как можно ускорять свои заводы, используя меньшее кол-во команд. Для начала Вам необходимо кое-что знать: Для того, чтобы подключиться к устройству - необходимо использовать команду " RBP! ", ID устройства должен находится в стеке. Взаимодействие проходит таким образом: На Вашем устройстве кусок памяти 0x300-0x3FF это 0x400-0x4FF на другом. И наоборот. То есть, изменяя байт 0x300 мы изменяем 0x400 на другом. Не нужно использовать во время диалога, т.к. любое отображение ставит в RBP! номер терминала, который указан в TERMADDR. Вот моя сеть: Попробуем написать команду, которая отправит данные другому устройству:: SEND CR ." ENTER MESSAGE: " 400 100 ACCEPT DROP RBP! 400 300 OVER STRLEN MOVE ; На 0x100 находится TIB буфер(для строк), мы не пишем сразу в 0x300 т.к. сейчас мы подключены к матрице, следовательно будем изменять её. Попробуем отправить устройству с ID 15 нашу строку: И вот, о чудо, мы получили нашу строку: И так, вернёмся к периферии. Во первых, таблица(взято с http://minecrafting.ru/topic/6612/ ) :Курсор:0x01: столбец x0x02: строка y0x03: режим (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: Давайте разбирать. 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: Неудачное завершение предыдущей команды Давайте посмотрим, как работают функции взаимодействия с дисководом(про запись/чтение на дискеты, кстати, поговорим в следующих частях). SAVE" записывает на диск всё от 0x500 до HERE. Во первых, она использует слово DISKNAME". Давайте декомпилируем и его: Не так уж и сложно, записывает данные на 0x300-0x380 и записывает номер команды в 0x382. Вернёмся к SAVE". Далее идёт подготовка к запуску цикла, цикл записывает каждые 128 байт от 500 до HERE используя DISKWS. Давайте посмотрим и на него: И снова, не всё так уж и сложно. Приблизительно то же, что и в случае DISKNAME". Всё просто, не правда ли? Давайте перейдём к самому вкусному - сортроны. Таблица:0x00: микрокоманда 1: Определить размер инвентаря 2: Прочитать содержимое слота 3: Извлечь 4: Фильтр 0x01: Количество предметов 0x02: Номер слота 0x04: Идентификатор предмета (4 байта!) 0x08: Повреждённость предмета 0x0A: Предел прочности предмета 0x0C: Исходящий цвет 0x0D: Входящий цвет Разберём команду SORTPULL: И снова, запись адреса в RBP, запись номера слота в 0x302, кол-ва предметов в 0x301. Использует SORTCMD. Давайте проанализируем и его: Во первых, что мы можем увидеть - снова запись адреса в 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-компьютеры-пятая-часть-работа-с-сетью-дисками-чат/ Изменено 5 января, 2019 пользователем Alleksh 5 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
BAPBAP Опубликовано 4 января, 2019 Поделиться Опубликовано 4 января, 2019 Гайд огонь - все очень внятно разложено и познавательно,я доволен. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти