Actions

Editing MIPS

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
 
[[Category:MIPS Programming]]
 
[[Category:MIPS Programming]]
 
=MIPS scripting language for IC10 housings / chips=
 
=MIPS scripting language for IC10 housings / chips=
MIPS is [[Stationeers]]' inspiration for the in-game scripting language called IC10. It runs on [[Integrated Circuit (IC10)|IC10 chips]] crafted at the [[Electronics Printer]].  
+
MIPS is [[Stationeers]]' in-game scripting language. It runs on [[Integrated Circuit (IC10)|IC10 chips]] crafted at the [[Electronics Printer]].  
  
 
==Registers==
 
==Registers==
Line 25: Line 25:
 
Note, the IC is completely unaware where d? is actually connected to. So if you get a logicType error, check d? number, or check if the screw has been set opn the socket. An alias is only convenient to convey what is expected to be set on the d? screw, it does not actually set or program the screq.
 
Note, the IC is completely unaware where d? is actually connected to. So if you get a logicType error, check d? number, or check if the screw has been set opn the socket. An alias is only convenient to convey what is expected to be set on the d? screw, it does not actually set or program the screq.
  
* Read from device (load) <code>l r? d? logicType</code>: Reads logicType, like Pressure from a [[Sensors|gas sensor]], from device d? to register r?. Values can be read from connected devices and put into the register using the '''l''' (load) command. For example, if you want to load the state of a door. <br> Example: <code>l r0 Door Open</code> reads the 'Open' field of an object named 'Door', that would be connected to the IC housing of the chip.
+
* Read from device (load) <code>l d? logicType r?</code>: Reads logicType, like Pressure from a [[Sensors|gas sensor]], from device d? to register r?. Values can be read from connected devices and put into the register using the '''l''' (load) command. For example, if you want to load the state of a door. <br> Example: <code>l r0 Door Open</code> reads the 'Open' field of an object named 'Door', that would be connected to the IC housing of the chip.
 
* Write to a device (set) <code>s d? logicType r?</code>: Write a value from a register back to a device using the command <code>s d? logicType r?</code>. For example, if d0 is set to a door using the screwdriver, <code>s d0 Open 0</code> sets the 'Open' status of the d0 (a door) to 0, effectively closing the door.
 
* Write to a device (set) <code>s d? logicType r?</code>: Write a value from a register back to a device using the command <code>s d? logicType r?</code>. For example, if d0 is set to a door using the screwdriver, <code>s d0 Open 0</code> sets the 'Open' status of the d0 (a door) to 0, effectively closing the door.
  
Line 44: Line 44:
 
This code will load the average temperature of all gas sensors on the network named "Sensor 1" onto register '''r0'''
 
This code will load the average temperature of all gas sensors on the network named "Sensor 1" onto register '''r0'''
  
If the batch read (lb/lbn) is done on a network without any matching devices the results will be as specified in the table:
 
{| class="wikitable"
 
|+ Batch read with no devices
 
|-
 
! Batch Mode !! Result
 
|-
 
| Average (0) || nan
 
|-
 
| Sum (1) || 0
 
|-
 
| Minimum (2) || 0
 
|-
 
| Maximum (3) || ninf
 
|}
 
 
=== Examples ===
 
  
 
Here are some examples demonstrating all three operations:
 
Here are some examples demonstrating all three operations:
Line 80: Line 64:
  
 
==Stack Memory==
 
==Stack Memory==
;push r?: adds the value '''r?''' and increments the '''sp''' by 1.
+
;push r?: adds the value of register '''r?''' to the stack memory at index '''sp''' and increments the '''sp''' by 1.
 
;pop r?: loads the value in the stack memory at index <code>sp-1</code> into register '''r?''' and decrements the '''sp''' by 1.
 
;pop r?: loads the value in the stack memory at index <code>sp-1</code> into register '''r?''' and decrements the '''sp''' by 1.
 
;peek r?: loads the value in the stack memory at index <code>sp-1</code> into register '''r?'''.
 
;peek r?: loads the value in the stack memory at index <code>sp-1</code> into register '''r?'''.
;get r? d? address(r?|num): loads the value in the stack memory at index <code>address</code> on provided device into register '''r?'''.
 
;getd r? id(r?|num) address(r?|num): loads the value in the stack memory at index <code>address</code> on provided device id into register '''r?'''.
 
;put d? address(r?|num) value(r?|num): adds the value to the stack memory off the provided device at index <code>address</code>.
 
;putd id(r?|num) address(r?|num) value(r?|num) : adds the value to the stack memory off the provided device id at index <code>address</code>.
 
  
 
As mentioned previously, '''sp''' can be both written to and read from any time. When reading ('''peek''' or '''pop'''), '''sp''' must be between 1 and 512, inclusive. While writing ('''push'''), '''sp''' must be between 0 and 511, inclusive.
 
As mentioned previously, '''sp''' can be both written to and read from any time. When reading ('''peek''' or '''pop'''), '''sp''' must be between 1 and 512, inclusive. While writing ('''push'''), '''sp''' must be between 0 and 511, inclusive.
Line 97: Line 77:
  
 
Traversing the stack can be done similarly to how an array would be traversed in some other languages:
 
Traversing the stack can be done similarly to how an array would be traversed in some other languages:
{{MIPSCode|
+
<blockquote>
#this will traverse indices {min value} through {max value}-1
+
<nowiki />#this will traverse indices {min value} through {max value} - 1
 +
 
 
move sp {min value}
 
move sp {min value}
 +
 +
 
loop:
 
loop:
 +
 
add sp sp 1
 
add sp sp 1
 +
 
peek r0
 
peek r0
 +
<nowiki />#do something here with your stack values (loaded into r0)
  
#do something here with your stack values (loaded into r0)
+
blt sp {max value} loop
  
blt sp {max value} loop
 
  
#continue on
+
<nowiki />#continue on
}}
+
 
 +
</blockquote>
  
 
Alternatively, you can use the pop function's decrementing to make a more efficient loop:
 
Alternatively, you can use the pop function's decrementing to make a more efficient loop:
{{MIPSCode|
+
 
 +
<blockquote>
 
move sp {max value}
 
move sp {max value}
 +
 
add sp sp 1
 
add sp sp 1
 +
 +
 
loop:
 
loop:
 +
 
pop r0
 
pop r0
  
#do something here with your stack values (loaded into r0)
+
<nowiki />#do something here with your stack values (loaded into r0)
  
 
bgt sp {min value} loop
 
bgt sp {min value} loop
  
#continue on
 
  
}}
+
<nowiki />#continue on
 +
 
 +
</blockquote>
  
 
==Device Ports==
 
==Device Ports==
Line 132: Line 124:
  
 
The '''l''' (load) or '''s''' (set) instructions you have to read or set these values to your device. Examples:
 
The '''l''' (load) or '''s''' (set) instructions you have to read or set these values to your device. Examples:
{{MIPSCode|
+
 
#Reads the 'Temperature' from an atmosphere sensor
+
<code>l r0 d0 Temperature</code> #Reads the '''Temperature''' from an atmosphere sensor at device port '''d0''' into register '''r0'''.
# at device port 'd0' into register 'r0'.
+
 
l r0 d0 Temperature
+
<code>s d1 Setting r0 </code> # Writes the value of the register '''r0''' to the device on port '''d1''' into the variable '''Setting'''.
}}
 
{{MIPSCode|
 
# Writes the value of the register 'r0' to the
 
# device on port 'd1' into the variable 'Setting'.
 
s d1 Setting r0
 
}}
 
  
 
==Labels==
 
==Labels==
 
Labels are used to make it easier to jump between lines in the script. The label will have a numerical value that is the same as its line number. Even though it's possible to use a labels value for calculations, doing so is a bad idea since any changes to the code can change the line numbers of the labels.
 
Labels are used to make it easier to jump between lines in the script. The label will have a numerical value that is the same as its line number. Even though it's possible to use a labels value for calculations, doing so is a bad idea since any changes to the code can change the line numbers of the labels.
{{MIPSCode|
+
 
main: # define a jump mark with label 'main'
+
<br><code>main:</code> # define a jump mark with label '''main'''
j main # jumps back to 'main'
+
<br><code>j main</code> # jumps back to '''main'''
}}
+
 
 
==Constants==
 
==Constants==
 
Instead of using a register to store a fixed value, a constant can be made. Using this name will refer to the assigned value. With the help of Constants you can save register places.
 
Instead of using a register to store a fixed value, a constant can be made. Using this name will refer to the assigned value. With the help of Constants you can save register places.
{{MIPSCode|
+
<br><code>define pi 3.14159</code> # defines a Constant with name '''pi''' and set it's value to 3.14159
# defines a Constant with name 'pi'
 
# and set its value to 3.14159
 
define pi 3.14159
 
}}
 
  
 
You can use these constants like any other variables (see: alias in section [[MIPS#Instructions|Instructions]]). Example:
 
You can use these constants like any other variables (see: alias in section [[MIPS#Instructions|Instructions]]). Example:
{{MIPSCode|
+
<br><code>move r0 pi</code> # set the value of register '''r0''' to the value of constant named '''pi'''.
# set the value of register 'r0' to the value of constant named 'pi'.
 
move r0 pi
 
}}
 
  
 
==Indirect referencing==
 
==Indirect referencing==
 
This is a way of accessing a register by using another register as a pointer. Adding an additional r in front of the register turns on this behaviour. The value stored in the register being used as the pointer must be between 0 to 15, this will then point to a register from r0 to r15, higher or lower values will cause an error.
 
This is a way of accessing a register by using another register as a pointer. Adding an additional r in front of the register turns on this behaviour. The value stored in the register being used as the pointer must be between 0 to 15, this will then point to a register from r0 to r15, higher or lower values will cause an error.
{{MIPSCode|
+
 
move r0 5 # stores the value 5 in r0
+
<code>move r0 5</code> stores the value 5 in r0
move rr0 10  
+
<br><code>move rr0 10</code> is now the same as <code>move r5 10</code> since r0 has the value 5, rr0 points at the register r5
# is now the same as 'move r5 10'
 
# since r0 has the value 5, rr0 points at the register r5
 
}}
 
  
 
Additional r's can be added to do indirect referencing multiple times in a row.
 
Additional r's can be added to do indirect referencing multiple times in a row.
{{MIPSCode|
+
<br><code>move r1 2</code>
move r1 2
+
<br><code>move r2 3</code>
move r2 3
+
<br><code>move rrr1 4</code> is now the same as <code>move r3 4</code> since r1 points at r2 which points at r3
move rrr1 4
 
# is now the same as 'move r3 4'
 
# since r1 points at r2 which points at r3
 
}}
 
  
 
This also works with devices
 
This also works with devices
{{MIPSCode|
+
<br><code>move r0 2</code> stores the value 2 in r0
move r0 2 # stores the value 2 in r0
+
<br><code>s dr0 On 1</code> is now the same as <code>s d2 On 1</code>, r0 has the value 2 so dr0 points at d2
s dr0 On 1  
 
# is now the same as 's d2 On 1'
 
# r0 has the value 2 so dr0 points at d2
 
}}
 
 
 
==Network Referencing / Channels==
 
 
 
All cable networks have 8 Channels which can have data loaded from/stored to via a device and connection reference. Connections for each supported device are listed in the stationpedia. All 'connections' a device can make are a connection (pipe, chute, cable), but only cable networks have channels.
 
 
 
The 8 channels (Channel0 to Channel7) are however volatile, in that data is destroyed if any part of the cable network is changed, removed, or added to, and also whenever the world is exited. All these channels default to NaN. Strictly speaking, they default to what we would call "quiet NaN", in that its not an error it simply means its not a number yet. Recommend you use these channels for reading and writing between networks, rather than as a data store. This effectively means an IC can read all the networks for all devices to connected to it, so not just their own local network, but any networks any device they can reference is connected to.
 
{{MIPSCode|
 
# d0 is device zero, and the :0 refers
 
# to that device's 0 connection
 
l r0 d0:0 Channel0}}
 
 
 
For example: on an IC Housing, the 0 connection is the data port and 1 is power, so you could write out r0 to Channel0 of the power network of the Housing using <code>s db:1 Channel0 r0</code>
 
  
 
==Comments==
 
==Comments==
 
Comments can be placed using a '''#''' symbol. All comments are ignored by the game when it reads commands. Below is an example of valid code with two comments.
 
Comments can be placed using a '''#''' symbol. All comments are ignored by the game when it reads commands. Below is an example of valid code with two comments.
{{MIPSCode|
+
 
alias MyAlias r0 # Text after the hash tag will be ignored to the end of the line.
+
<code> alias MyAlias r0 # Text after the hash tag will be ignored to the end of the line. </code> <br>
# You can also write comments on their own lines, like this.
+
<code> # You can also write comments on their own lines, like this. </code>
}}
 
  
 
==Debugging advices==
 
==Debugging advices==
Line 285: Line 240:
 
----
 
----
  
See [[MIPS/instructions]]
+
<div id="alias"></div>
 +
;alias
 +
:alias str r? d? # labels register or device reference with name.  When alias is applied to a device, it will affect what shows on the screws in the IC base.  (housing)
 +
<code>alias vTemperature r0</code>
 +
<br>
 +
<code>alias dAutoHydro1 d0</code>
 +
 
 +
<div id="move"></div>
 +
;move   
 +
:d s    # stores the value of s in d
 +
<code>move r0 42 # Store 42 in register 0</code>
 +
 
 +
<div id="l"></div>
 +
<div id="load"></div>
 +
;l (load)
 +
:l r# d# parameter
 +
Reads from a device (d#) and stores the value in a register (r#)
 +
 
 +
<code>l r0 d0 Setting</code><br>Read from the device on d0 into register 0
 +
 
 +
<code>l r1 d5 Pressure</code><br>Read the pressure from a sensor
 +
 
 +
This also works with aliases. For example:<br/>
 +
<code>
 +
alias Sensor d0 <br/>
 +
l r0 Sensor Temperature
 +
</code>
 +
 
 +
<div id="ls"></div>
 +
<div id="load slot"></div>
 +
;ls (load slot)
 +
:ls r# d# slotNum parameter
 +
Reads from a slot (slotNum) of a device (d#)  and stores the value in a register (r#)
 +
 
 +
<code>ls r0 d0 2 Occupied</code><br>Read from the second slot of device on d0, stores 1 in r0 if it's occupied, 0 otherwise.
 +
 
 +
And here is the code to read the charge of an AIMeE:<br/>
 +
<code>
 +
alias robot d0 <br/>
 +
alias charge r0 <br/>
 +
ls charge robot 0 Charge
 +
</code>
 +
 
 +
 
 +
<div id="s"></div>
 +
<div id="set"></div>
 +
;s (set)
 +
:s d# parameter r#
 +
Writes a setting to a device.
 +
 
 +
<code>s d0 Setting r0</code>
 +
 
 +
 
 +
<div id="add"></div>
 +
;add   
 +
:d s t  # calculates s + t and stores the result in d
 +
<code>add r0 r1 1 # add 1 to r1 and store the result as r0</code>
 +
<br>
 +
<code>add r0 r0 1 # increment r0 by one</code>
 +
<div id="sub"></div>
 +
;sub   
 +
:d s t  # calculates s - t and stores the result in d
 +
<div id="mul"></div>
 +
;mul   
 +
:d s t  # calculates s * t and stores the result in d
 +
<div id="div"></div>
 +
;div   
 +
:d s t  # calculates s / t and stores the result in d
 +
<div id="mod"></div>
 +
;mod   
 +
:d s t 
 +
::# calculates s mod t and stores the result in d. Note this
 +
::# doesn't behave like the % operator - the result will be
 +
::# positive even if the either of the operands are negative
 +
 
 +
<div id="slt"></div>
 +
;slt   
 +
:d s t  # stores 1 in d if s < t, 0 otherwise
 +
 
 +
<div id="sqrt"></div>
 +
;sqrt   
 +
:d s    # calculates sqrt(s) and stores the result in d
 +
<div id="round"></div>
 +
;round 
 +
:d s    # finds the rounded value of s and stores the result in d
 +
<div id="trunc"></div>
 +
;trunc 
 +
:d s    # finds the truncated value of s and stores the result in d
 +
<div id="ceil"></div>
 +
;ceil 
 +
: d s    # calculates the ceiling of s and stores the result in d
 +
<div id="floor"></div>
 +
;floor 
 +
: d s    # calculates the floor of s and stores the result in d
 +
 
 +
<div id="max"></div>
 +
;max   
 +
: d s t  # calculates the maximum of s and t and stores the result in d
 +
<div id="min"></div>
 +
;min   
 +
: d s t  # calculates the minimum of s and t and stores the result in d
 +
<div id="abs"></div>
 +
;abs   
 +
: d s    # calculates the absolute value of s and stores the result in d
 +
<div id="log"></div>
 +
;log   
 +
: d s    # calculates the natural logarithm of s and stores the result
 +
::# in d
 +
<div id="exp"></div>
 +
;exp   
 +
: d s    # calculates the exponential of s and stores the result in d
 +
<div id="rand"></div>
 +
;rand 
 +
: d      # selects a random number uniformly at random between 0 and 1
 +
::# inclusive and stores the result in d
 +
 
 +
::# boolean arithmetic uses the C convention that 0 is false and any non-zero
 +
::# value is true.
 +
<div id="and"></div>
 +
;and   
 +
: d s t  # stores 1 in d if both s and t have non-zero values,
 +
::# 0 otherwise
 +
<div id="or"></div>
 +
;or   
 +
: d s t  # stores 1 in d if either s or t have non-zero values,
 +
::# 0 otherwise
 +
<div id="xor"></div>
 +
;xor   
 +
: d s t  # stores 1 in d if exactly one of s and t are non-zero,
 +
::# 0 otherwise
 +
<div id="nor"></div>
 +
;nor
 +
:    d s t  # stores 1 in d if both s and t equal zero, 0 otherwise
 +
::# Lines are numbered starting at zero
 +
<div id="j"></div>
 +
;j
 +
:            a # jumps to line a.
 +
<div id="bltz"></div>
 +
;bltz
 +
:      s  a # jumps to line a if s <  0
 +
<div id="blez"></div>
 +
;blez
 +
:    s  a # jumps to line a if s <= 0
 +
 
 +
<div id="bgez"></div>
 +
;bgez
 +
:    s  a # jumps to line a if s >= 0
 +
<div id="bgtz"></div>
 +
;bgtz
 +
:      s  a # jumps to line a if s >  0
 +
<div id="beq"></div>
 +
;beq
 +
:      s t a # jumps to line a if s == t
 +
<div id="bne"></div>
 +
;bne
 +
:      s t a # jumps to line a if s != t
 +
<div id="bdseal"></div>
 +
;bdseal
 +
:    d? a(r?|num) # Jump execution to line a and store current line number if device d? is set.
 +
<code>bdseal d0 32 #Store line number and jump to line 32 if d0 is assigned.</code>
 +
<BR>
 +
<code>bdseal dThisVictim HarvestCrop #Store line in ra and jump to sub HarvestCrop if device dThisVictim is assigned.</code>
 +
 
 +
<div id="yield"></div>
 +
;yield         
 +
: # ceases code execution for this power tick
 +
 
 +
<div id="lb"></div>
 +
;lb
 +
:      r? deviceHash logicType batchMode # Loads LogicType from all output network devices with the provided type hash using the provided batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number. The result is stored into r?.
 +
 
 +
<div id="sb"></div>
 +
;sb
 +
:      deviceHash logicType r? # Stores the register value to LogicType on all output network devices with the provided type hash.
 +
 
 +
<div id="lbn"></div>
 +
;lbn
 +
:      r? deviceHash nameHash logicType batchMode # Loads LogicType from all output network devices with the provided type and name hashes using provided batch mode. Average(0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number. The result is stored into r?.
 +
 
 +
<div id="sbn"></div>
 +
;sbn
 +
:      deviceHash nameHash logicType r? # Stores the register value to LogicType on all output network devices with the provided type and name hashes.
  
{{:MIPS/instructions}}
+
<div id="#"></div>
 +
; #
 +
:     # The following text will be ignored during compiling; use this to create comments.
  
 
[https://www.cs.tufts.edu/comp/140/lectures/Day_3/mips_summary.pdf Other examples]
 
[https://www.cs.tufts.edu/comp/140/lectures/Day_3/mips_summary.pdf Other examples]
Line 323: Line 461:
 
|-
 
|-
 
| -nez || if a != 0 || bnez || bnezal || brnez || snez
 
| -nez || if a != 0 || bnez || bnezal || brnez || snez
|-
 
| -nan || if a == NaN || bnan ||  || brnan || snan
 
|-
 
| -nan || if a != NaN ||  ||  || || snanz
 
 
|-
 
|-
 
| -dns || if device d is not set          || bdns || bdnsal || brdns || sdns
 
| -dns || if device d is not set          || bdns || bdnsal || brdns || sdns
Line 385: Line 519:
 
<div id="Color"></div>
 
<div id="Color"></div>
 
;Color
 
;Color
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#212AA5;"></div>&nbsp;0 (or lower) = Blue
+
:    <span style="color:blue;">▇▇▇</span>&nbsp; 0 (or lower) = Blue
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#7B7B7B;"></div>&nbsp;1 = Grey  
+
:    <span style="color:grey;">▇▇▇</span>&nbsp;1 = Grey  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#3F9B39;"></div>&nbsp;2 = Green  
+
:    <span style="color:green;">▇▇▇</span>&nbsp;2 = Green  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#FF662B;"></div>&nbsp;3 = Orange  
+
:    <span style="color:orange;">▇▇▇</span>&nbsp;3 = Orange  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#E70200;"></div>&nbsp;4 = Red  
+
:    <span style="color:red;">▇▇▇</span>&nbsp;4 = Red  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#FFBC1B;"></div>&nbsp;5 = Yellow  
+
:    <span style="color:yellow;">▇▇▇</span>&nbsp;5 = Yellow  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#E7E7E7;"></div>&nbsp;6 = White  
+
:    <span style="color:white;">▇▇▇</span>&nbsp;6 = White  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#080908;"></div>&nbsp;7 = Black  
+
:    <span style="color:black;">▇▇▇</span>&nbsp;7 = Black  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#633C2B;"></div>&nbsp;8 = Brown  
+
:    <span style="color:brown;">▇▇▇</span>&nbsp;8 = Brown  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#63633F;"></div>&nbsp;9 = Khaki  
+
:    <span style="color:khaki;">▇▇▇</span>&nbsp;9 = Khaki  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#E41C99;"></div>&nbsp;10 = Pink  
+
:    <span style="color:pink;">▇▇▇</span>&nbsp;10 = Pink  
:    <div style="display: inline-block; height: 20px; width: 20px; border: 1px solid black; margin-right: 5px; background-color:#732CA7;"></div>&nbsp;11 (or higher) = Purple  
+
:    <span style="color:purple;">▇▇▇</span>&nbsp;11 (or higher) = Purple  
 
<div id="CompletionRatio"></div>
 
<div id="CompletionRatio"></div>
 
;CompletionRatio
 
;CompletionRatio
Line 490: Line 624:
 
;RecipeHash
 
;RecipeHash
 
<div id="RequestHash"></div>
 
<div id="RequestHash"></div>
;ReferenceId
 
:    Unique Identifier of a Device, this value is different for every device in a save.
 
<div id="ReferenceId"></div>
 
 
;RequestHash
 
;RequestHash
 
<div id="RequiredPower"></div>
 
<div id="RequiredPower"></div>
Line 572: Line 703:
 
:<code>ls r0 d0 0 Mature # Store 1 in r0 if d0 has a mature crop</code>
 
:<code>ls r0 d0 0 Mature # Store 1 in r0 if d0 has a mature crop</code>
 
:<code>ls vMature dThisVictim 0 Mature # Store 1 in vMature if dThisVictim has a mature crop</code>
 
:<code>ls vMature dThisVictim 0 Mature # Store 1 in vMature if dThisVictim has a mature crop</code>
;ReferenceId
+
 
:    Unique Identifier of a Device, this value is different for every device in a save.
 
<div id="ReferenceId"></div>
 
 
----
 
----
  
Line 585: Line 714:
  
 
<div class="mw-collapsible mw-collapsed" data-expandtext="{{int:Expand, Automated Harvie Script}}" data-collapsetext="{{int:Collapse, Automated Harvie Script}}">
 
<div class="mw-collapsible mw-collapsed" data-expandtext="{{int:Expand, Automated Harvie Script}}" data-collapsetext="{{int:Collapse, Automated Harvie Script}}">
{{MIPSCode|
+
<pre>
 
alias dHarvie d0
 
alias dHarvie d0
 
alias dTray d1
 
alias dTray d1
Line 596: Line 725:
 
main:
 
main:
 
yield
 
yield
#read plant data from the Tray
+
#read plant data from the Tray
 
ls r0 dTray 0 Mature
 
ls r0 dTray 0 Mature
#harvestable plants return 1, young plants return 0
+
#harvestable plants return 1, young plants return 0
#nothing planted returns -1
+
#nothing planted returns -1
 
beq r0 -1 plantCrop
 
beq r0 -1 plantCrop
 
beq r0 1 harvestCrop
 
beq r0 1 harvestCrop
 
ls r0 dTray 0 Seeding
 
ls r0 dTray 0 Seeding
#seeds available returns 1, all seeds picked returns 0
+
#seeds available returns 1, all seeds picked returns 0
#plants too young or old for seeds returns -1
+
#plants too young or old for seeds returns -1
 
beq r0 1 harvestCrop
 
beq r0 1 harvestCrop
 
j main
 
j main
  
 
plantCrop:
 
plantCrop:
#stop the planting if no seeds available
+
#stop the planting if no seeds available
#otherwise it will plant nothing repeatedly
+
#otherwise it will plant nothing repeatedly
 
ls r0 dHarvie 0 Occupied
 
ls r0 dHarvie 0 Occupied
 
beq r0 0 main
 
beq r0 0 main
Line 622: Line 751:
 
### End Script ###
 
### End Script ###
  
}}
+
</pre>
 
</div>
 
</div>
 
<br>
 
<br>
Line 628: Line 757:
  
 
===Solar Panel 2-axis tracking===
 
===Solar Panel 2-axis tracking===
 +
This script was copied from the [[Solar_Logic_Circuits_Guide]] (code provided by bti, comments and readability changes by Fudd79)
 
<div class="mw-collapsible mw-collapsed" data-expandtext="{{int:Expand, Solar Panel 2-axis tracking}}" data-collapsetext="{{int:Collapse, Solar Panel 2-axis tracking}}">
 
<div class="mw-collapsible mw-collapsed" data-expandtext="{{int:Expand, Solar Panel 2-axis tracking}}" data-collapsetext="{{int:Collapse, Solar Panel 2-axis tracking}}">
{{MIPSCode|
+
<pre>
#2 Axis Solar Tracking adapted from CowsAreEvil.
+
# This code assumes the following:
#Place all panels in uniform manner.
+
# Daylight Sensor data-port points north
#Set one to 15 Vertical(Min value). 0 Horizontal.
+
# Solar Panel data-port points east
#Take note direction panel faces.
 
#Place daylight sensor flat pointing in the direction
 
#the panel now faces. (Cable port facing opposite)
 
  
#Alias the sensor to d0
 
 
alias sensor d0
 
alias sensor d0
 +
alias v_angle r0
 +
alias h_angle r1
 +
alias sun_up r2
  
# define the Panel variants
+
define solar_panel_hash -539224550
define Heavy -934345724
+
define heavy_solar_panel_hash -1545574413
define HeavyDual -1545574413
 
define Solar -2045627372
 
define SolarDual -539224550
 
  
 
start:
 
start:
 +
# Check to see if sun is up
 +
l sun_up sensor Activate
 +
# Go to reset if it's not
 +
beqz sun_up reset
 +
 +
# Calculate vertical angle
 +
l v_angle sensor Vertical
 +
div v_angle v_angle 1.5
 +
sub v_angle 50 v_angle
 +
 +
# Write vertical angle to all solar panels
 +
sb solar_panel_hash Vertical v_angle
 +
sb heavy_solar_panel_hash Vertical v_angle
 +
 +
# Obtain horizontal angle
 +
l h_angle sensor Horizontal
 +
 +
# Write horizontal angle to all solar panels
 +
sb solar_panel_hash Horizontal h_angle
 +
sb heavy_solar_panel_hash Horizontal h_angle
 +
 +
# Go to start again
 
yield
 
yield
#Check for daylight.
 
l r0 sensor Activate
 
beqz r0 reset
 
#Read the Horizontal data.
 
l r0 sensor Horizontal
 
#Set batch to the panels.
 
sb Heavy Horizontal r0
 
sb HeavyDual Horizontal r0
 
sb Solar Horizontal r0
 
sb SolarDual Horizontal r0
 
#Read the Vertical data and subtract 90
 
l r0 sensor Vertical
 
sub r0 90 r0
 
#Set batch to the panels.
 
sb Heavy Vertical r0
 
sb HeavyDual Vertical r0
 
sb Solar Vertical r0
 
sb SolarDual Vertical r0
 
 
j start
 
j start
  
 
reset:
 
reset:
yield
+
# Park solar panels vertically facing sunrise
sb Heavy Horizontal 270 #Edit this to face sunrise.
+
sb solar_panel_hash Vertical 0
sb HeavyDual Horizontal 270 #Edit this
+
sb heavy_solar_panel_hash Vertical 0
sb Solar Horizontal 270 #Edit this
+
# Park solar panels horizontally facing sunrise
sb SolarDual Horizontal 270 #Edit this
+
sb solar_panel_hash Horizontal -90
sb Heavy Vertical 0
+
sb heavy_solar_panel_hash Horizontal -90
sb HeavyDual Vertical 0
+
# Wait 10 seconds
sb Solar Vertical 0
 
sb SolarDual Vertical 0
 
 
sleep 10
 
sleep 10
 +
# Go to start again
 
j start
 
j start
}}
+
 
 +
### End Script ###
 +
 
 +
</pre>
 
</div>
 
</div>
 
<br>
 
<br>
Line 687: Line 819:
 
===Example experiment: how many lines of code are executed each tick?===
 
===Example experiment: how many lines of code are executed each tick?===
 
To determine this, a script without <code>yield</code> will be used. It should have as few lines as possible (so no labels are used, but a reset value at the top will be needed) and count the number of lines, the IC Housing will be used to display the result.
 
To determine this, a script without <code>yield</code> will be used. It should have as few lines as possible (so no labels are used, but a reset value at the top will be needed) and count the number of lines, the IC Housing will be used to display the result.
{{MIPSCode|
+
 
 +
<pre>
 
move r0 1  #the first line has number 0
 
move r0 1  #the first line has number 0
 
add r0 r0 3
 
add r0 r0 3
 
s db Setting r0
 
s db Setting r0
 
j 1
 
j 1
}}
+
</pre>
  
  
Line 711: Line 844:
 
=Links=
 
=Links=
 
----
 
----
* Stationeers online IC10 Emulators so you can develop your code without repeatedly dying in game
+
* [https://stationeering.com/tools/ic] Stationeering.com offers a programmable circuits simulator so you can develop your code without repeatedly dying in game!
** [https://ic10.dev/] Stationeers Code Simulator
 
** [https://ic10emu.dev] Stationeers IC10 Editor & Emulator - A feature packed code editor for Stationeers IC10 code, paired with a robust debugger and emulator. Edit, test, and share code.
 
** [https://stationeering.com/tools/ic] Stationeering provides a simulation of the IC10 chip inside Stationeers. IDE with error checking, full visibility of stack and registers.
 
 
* [http://www.easy68k.com/] EASy68K is a 68000 Structured Assembly Language IDE.
 
* [http://www.easy68k.com/] EASy68K is a 68000 Structured Assembly Language IDE.
 
* [https://marketplace.visualstudio.com/items?itemName=Traineratwot.stationeers-ic10] syntax highlighting for IC10 MIPS for Visual Studio Code (updated Feb 10th 2022)
 
* [https://marketplace.visualstudio.com/items?itemName=Traineratwot.stationeers-ic10] syntax highlighting for IC10 MIPS for Visual Studio Code (updated Feb 10th 2022)
 
* [https://pastebin.com/6Uw1KSRN] syntax highlighting for IC10 MIPS for KDE kwrite/kate text editor
 
* [https://pastebin.com/6Uw1KSRN] syntax highlighting for IC10 MIPS for KDE kwrite/kate text editor
 
* [https://drive.google.com/file/d/1yEsJ-u94OkuMQ8K6fY7Ja1HNpLcAdjo_/view] syntax highlighting for IC10 MIPS for Notepad++
 
* [https://drive.google.com/file/d/1yEsJ-u94OkuMQ8K6fY7Ja1HNpLcAdjo_/view] syntax highlighting for IC10 MIPS for Notepad++
 +
* [https://pastebin.com/3kmGy0NN] syntax highlighting for IC10 MIPS for Notepad++ (updated: 05/05/2021)
 
* [https://drive.google.com/file/d/1Xrv5U0ZI5jDcPv7yX7EAAxaGk5hKP0xO/view?usp=sharing] syntax highlighting for IC10 MIPS for Notepad++ (updated: 11/08/2022)
 
* [https://drive.google.com/file/d/1Xrv5U0ZI5jDcPv7yX7EAAxaGk5hKP0xO/view?usp=sharing] syntax highlighting for IC10 MIPS for Notepad++ (updated: 11/08/2022)
* [https://pastebin.com/3kmGy0NN] syntax highlighting for IC10 MIPS for Notepad++ (updated: 23/03/2024)
 
  
 
----
 
----

Please note that all contributions to Unofficial Stationeers Wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Unofficial Stationeers Wiki:Copyrights for details). Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel | Editing help (opens in new window)