SHENZHEN I/O

SHENZHEN I/O

185 ratings
SHENZHEN I/O basics for dummies. [Основы SHENZHEN I/O для чайников]
By Insane Tengu
This guide provides simple explanation for commands, registers, inputs, outputs and other stuff.
   
Award
Favorite
Favorited
Unfavorite
Preface [Предисловие]
(en)
This game is not only about programming, but also about Reading The F. Manual first.
You will have to read it eventually, but you can start with this guide.
(rus)
Это игра не только о программировании, но и о чтении инструкций перед этим.
Инструкцию все равно придется читать, но можно начать с гайда.

(1) First task - Fake camera
(en)
Lets take a look at our first task.
We have to make an LED on a fake camera blink correctly.
There are two of them: "network" and "active". We only need "network" one.
First we have to add MC4000 microcontroller (from top rigt corner) to our scheme and connect "p0" pin to "network" output.


Open "Verification" tab below.
You can see two lines and an image of a fake camera.
We are supposed to make our microcontroller draw the same line as a line on the bottom. We can do that by sending signals trough "p0" pin.
Put a mouse over the line to see expected level of signal.


As you can see we expected to send signal with level 0 or 100.
When level of signal is 100 - LED lights up and when it is 0 - it does not.
Now lets take a closer look at the line.

It is separated by time units.
In this task we have to do the following:
  1. Send signal with level 0 for 4 time units.
  2. Send signal with level 100 for 2 time units.
  3. Send signal with level 0 for 1 time unit.
  4. Send signal with level 100 for 1 time unit.
Don't pay attention to the rest of the line. Later i will explain why.

Now click on microcontroller to start writing code.
To send signal through "p0" pin we have to write some value into "p0" register, like this:
mov 0 p0
This line writes number 0 into "p0" register. (see "MOV" section for details)
From now on our microcontroller is sending signal with level 0 through "p0" pin.
We want it to remain for 4 time untis, so we have to make our microcontroller "sleep" for 4 time untis. To do that we should use "slp" command.
slp 4
This line makes microcontroller "sleep" for 4 time untis. (see "SLP" section for details)

Do the same for 3 other steps. In the end you should have the following code:
mov 0 p0
slp 4
mov 100 p0
slp 2
mov 0 p0
slp 1
mov 100 p0
slp 1


Launch an execution of the program by pressing "Simulate". As you can see it repeats over and over so you dont have to repeat your code for the rest of the "output line".
Now you just have to wait until test runs are completed.

Registers
(en)
You can write a value to the register, you can read a value from the register. Thats what they are for.
Default value of any register is 0.
Min. value of any register is -999.
Max. value of any register is 999.
There are 3 types of registers:
  • acc
    This register is present in all microcontrollers.
    If you write a value in it, this value will remain until you write another one.
    This register is used in all arithmetic operations.
  • dat
    This register is present only in some microcontrollers.
    If you write a value in it, this value will remain until you write another one.
    This register is used only as a data storage.
  • pin registers
    These registers are present in all microcontrollers.
    They are used to connect microcontroller to inputs/outputs and other microcontrollers.
    These registers do not store any data. If you write a value in such register it simply determines output value.
    There are two types of pin registers:
    1. Simple I/O (p0,p1...)
      Used to connect to simpe inputs/outputs.
    2. XBbus (x0,x1...)
      Used to connect to other microcontrollers or complex I/O such as keyboard or numeric display.
      When you try to read from such register, execution is blocked until data is avaliable.
      When you try to write a data to such register, then execution will be blocked until this data is read on the other side.
MOV [EN]
This command simply moves (copies) a value from one place to another.
It goes like this:

mov [number/register] [register]


Examples:
mov 0 acc
puts number 0 into "acc" register
mov 100 p1
puts number 100 into "p1" register
mov p0 p1
reads value from "p0" input and puts it into "p1" register
mov p0 acc
reads value from "p0" input and puts it into "acc" register

JMP [EN]
This command allows execution to jump to specifically marked line.
It goes like this:

jmp [name of the mark]

Examples:

mov 0 acc
jmp flag
mul 2
mov acc p1
flag: slp 1

# jump to line marked as "flag"
# this line is skipped
# this line is skipped
# line marked as "flag"

You can also jump to any previous line.

slx x0
flag: mov 0 acc
mul 2
mov acc p1
slp 1
jmp flag

# line marked as "flag"



# jump to line marked as "flag"

SLP [EN]
This command makes microcontroller "sleep" for specified number of time units.
All values of registers and outputs do not change while microcontroller is "sleeping".
You have to use this command or SLX command in every program.
It goes like this:

slp [number/register/input]

Examples:
slp 6
sleep for 6 time units
slp acc
sleep for number of time untis that stored in "acc" register
slp p0
sleep for number of time untis that read from "p0" input
Secret commands and flags
There a re couple of secret commands that could be useful.
Thanks to Brick for that information.

GEN
It goes like this:
gen [register] [sleep time 1] [sleep time 2]

Executing gen is equals to executing following commands:

mov 100 [register]
slp [sleep time 1]
mov 0 [register]
slp [sleep time 2]


So gen p0 2 3 would be equal to following set of commands:

mov 100 p0
slp 2
mov 0 p0
slp 3

_________________________________________________________________

@
Any command marked by this flag will be executed only once.
It goes like this:

@ [any command]

For example:
@ slp 1
slp 1
mov 0 p0
slp 1 p0
mov 100 p0
this command executed only once an will not be repeated
this command exectued every time
this command exectued every time
this command exectued every time
this command exectued every time
(1) Первое задание - Фальшивая камера
(ru)
Давайте взглянем на первое задание.
Нам нужно сделать так, чтобы диоды на фальшивой камере правильно мигали.
Их всего два: "сеть" ("network") и "активен" ("active"). Диод "активен" уже сделан до нас, так что нам остается только сделать "сеть".
Для начала нам нужно перетащить микроконтроллер MC4000 (из правого верхнего угла) на схему и подключить выход "p0" к выходу "Network".


Откройте вкладку "Verification" внизу экрана.
В ней отображены две линии и изображение фальшивой камеры.
Мы должны заставить наш микроконтроллер нарисовать такую же линию, как и линия внизу. Это можно сделать посылая сигналы через выход "p0".
Наведите мышь на линию, чтобы увидеть требуемый уровень сигнала.

Как вы можете видеть, ожидается что мы будем посылать сигналы с уровнем 0 и 100.
Когда уровень сигнала равен 100 - диод загорается, а когда он равен 0 - диод гаснет.
Откройте вкладку "Verification" внизу экрана.

Присмотрится поближе к этой линии.

Она поделена на временные отрезки. (временные единицы)
В данном задании мы должны сделать следующее.
  1. Посылать сигнал с уровнем 0 на протяжении 4 временных единиц.
  2. Посылать сигнал с уровнем 100 на протяжении 2 временных единиц.
  3. Посылать сигнал с уровнем 0 на протяжении 1 временной единицы.
  4. Посылать сигнал с уровнем 100 на протяжении 1 временной единицы.
Не обращайте внимание на остальную линию. Позже я объясню почему.

Теперь кликните на микроконтроллер чтобы начать писать код.
Чтобы послать сигнал через выход "p0", мы должны записать число в регистр "p0", вот так:
mov 0 p0
Эта строка записывает число 0 в регистр "p0". (см. подробности в разделе "MOV" )
С этого момента наш микроконтроллер посылает сигнал с нулевым уровнем на выход "p0".
Мы хотим чтобы это продолжалось в течении 4 временных единиц, поэтому мы должны заставить наш контроллер "спать" на протяжении 4 временных единиц. Для этого мы используем команду "slp".
slp 4
Эта строка заставляет микроконтроллер "заснуть" на 4 временных единицы. (см. подробности в разделе "SLP")

Сделайте тоже самое для трех оставшихся шагов, в конце у вас должен получиться следующий код:
mov 0 p0
slp 4
mov 100 p0
slp 2
mov 0 p0
slp 1
mov 100 p0
slp 1


Запустите выполнение программы, нажав на кнопку "Simulate". Программа будет постоянно повторяться, поэтому нам не нужно повторять комманды на протяжении всей линии.
Теперь остается только ждать пока пройдут все тестовые запуски ( test runs).
Регистры
(ru)
Можно записывать значение в регистр, можно прочитать значение из регистра.
Значение по-умолчанию для каждого регистра = 0.
Минимальное значение регистра = -999
Максиальное значение регистра = 999.
Есть три типа регистров.
  • acc
    Этот регистр присутствует во всех микроконтроллерах.
    Если записать в него значение, оно сохранится пока не будет записано другое.
    Этот регистр используется по всех арифметических операциях.
  • dat
    Этот регистр присутствует только в некоторых микроконтроллерах.
    Если записать в него значение, оно сохранится пока не будет записано другое.
    Этот регистр используется для хранения значений.
  • регистры выходов (pin registers)
    Эти регистры присутствуют во всех микроконтроллерах.
    Они используются для соединения микрокнтроллера с входами/выходами а также другими микроконтроллерами.
    Эти регистры не сохраняют никаких данных. Засписанное значение определяет уровень сигнала на соответствующем выходе.
    Есть два типа регистров выхода:
    1. Simple I/O (p0,p1...)
      Используется для соединения с простыми входами/выходами.
    2. XBbus (x0,x1...)
      Используется для соединения с другими микроконтроллерами, а также слодными выходами, как например у клавиатуры или цифрового дисплея.
      При попытке прочитать данные из такого регистра исполнение блокируется пока данные не поступят на соответствующий вход.
      При попытке записи в такой регистр исполнение блокируется пока данные не прочитаются на другом конце.
MOV [RU]
Это команда просто перемещает (копирует) значение из одного места в другое.
Она пишется так:

mov [число/регистр] [регистр]

Примеры:
mov 0 acc
помещает число 0 в регистр "acc"
mov 100 p1
помещает число 100 в регистр "p1"
mov p0 p1
читает значение из входа "p0" и записывает его в регистр "p1"
mov p0 acc
читает значение из входа "p0" и записывает его в регистр "acc"
JMP [RU]
Это команда позволяет перепрыгивать на помеченную строку.
Она пишется так:

jmp [имя метки]

Пример:

mov 0 acc
jmp flag
mul 2
mov acc p1
flag: slp 1

# перепрыгнуть на строку помеченную как "flag"
# эта строка пропускается
# эта строка пропускается
# строка помеченная как "flag"

Также можно перепрыгнуть на любую предыдущую строку.

slx x0
flag: mov 0 acc
mul 2
mov acc p1
slp 1
jmp flag

# строка помеченная как "flag"



# перепрыгнуть на строку помеченную как "flag"
SLP [RU]
Эта комнда заставляет микроконтроллер "заснуть" на указанное количетсво временных единиц.
Все значения записанные в регистры и выходы сохраняются во время "сна".
Вы должны использовать эту комманду, или комманду SLX в любой программе.
Она пишется так:

slp [число/регистр/вход]


Примеры:
slp 6
заснуть на 6 временных единиц
slp acc
заснуть на количество временых единиц записанных в регистре "acc"
slp p0
заснуть на количество временых единиц прочитанных из входа "p0"
Секретные команды и флаги
Есть пара секретных команд, которые могут быть вам полезны.
Спасибо товарищу Brick за предоставленную информацию.

GEN
Она пишется так:
gen [регистр] [время сна 1] [время сна 2]

Выполнение gen эквивалентно выполнению следующих команд:

mov 100 [регистр]
slp [время сна 1]
mov 0 [регистр]
slp [время сна 2]


Например, команда gen p0 2 3 будет равна следующим командам:

mov 100 p0
slp 2
mov 0 p0
slp 3

_________________________________________________________________

@
Любая команда отмеченная этим флагом будет исполнена только один раз.
Она пишется так:

@ [любая команда]

Например:
@ slp 1
slp 1
mov 0 p0
slp 1 p0
mov 100 p0
эта команда выполняется только один раз и не повторяется
эта команда выполняется каждый раз
эта команда выполняется каждый раз
эта команда выполняется каждый раз
эта команда выполняется каждый раз
34 Comments
ProtoGrim Jan 13, 2024 @ 3:46pm 
Thank you so much for the hidden commands, saved so much time!
sswskalicia Oct 25, 2022 @ 7:38am 
I love to be your student.I will pay my tuition fee full if You will be my kind of instructor.
Two Gun Bob Aug 4, 2020 @ 6:14pm 
Horror Show my good man! Horror Show! Just what I needed.

Insane Tengu  [author] Sep 28, 2018 @ 11:52pm 
Молоко Феникса, в этом гайде только самые основы, поэтому и нет. Я хотел позже описать все что в мануале есть, но к сожалению времени на это так и не нашлось.

OMSKk рад помочь.
Лазерный Лыцарь Sep 27, 2018 @ 11:10am 
<большое спасибо за русский мануал!
Молоко Феникса Nov 23, 2017 @ 8:27pm 
А как же комманда MUL?
В задании, где надо усилить сигнал, нужно положить ввод в регистр 'acc' и умножить его вдвое коммандой 'mul 2'
twitch.tv/gunlinux Aug 29, 2017 @ 7:17am 
Not hidden, rtfm common
Awen Jan 4, 2017 @ 8:38am 
Well done. I did not know about the "hidden" commands.
YukoValis Dec 19, 2016 @ 2:32pm 
anytime. Thank you for the guide by the way. It was very helpful in learning just what the heck was going on. :)
Insane Tengu  [author] Dec 19, 2016 @ 11:36am 
YukoValis good idea. Separated Russian and English sections.