Befehlssatz
Die gelb unterlegten Bereiche sind die Erweiterungen meiner ATTiny_TPS und der Arduino_TPS Version. In eckigen Klammern stehen jeweils die entsprechenden Mnemonics des SPS Assemblers.
<html> <table width=„100%“ cellspacing=„0“ border=„1“ style=„page-break-inside: avoid“>
<thead> <tr valign="TOP"> <th width="3%"> </th> <th width="10%">0</th> <th width="10%">1</th> <th width="10%">2</th> <th width="12%">3</th> <th width="10%">4</th> <th width="14%">5</th> <th width="10%">6</th> <th width="18%">7</th> </tr> </thead> <tbody> <tr valign="TOP"> <td> </td> <td>n.n.</td> <td>Port<br/>[DOUT]</td> <td>Delay<br/>[WAIT]</td> <td>Jump back relative<br/>[RJMP]</td> <td>A=#<br/>[LDA]</td> <td>=A</td> <td>A=</td> <td>A=Ausdruck</td> </tr> <tr valign="TOP"> <td>0</td> <td bgcolor="#ffff00">NOP [NOP]</td> <td>aus</td> <td>1ms</td> <td>0</td> <td>0</td> <td bgcolor="#ffff00">A<->B [SWAP]</td> <td> </td> <td> </td> </tr> <tr valign="TOP"> <td>1</td> <td> </td> <td>1</td> <td>2ms</td> <td>1</td> <td>1</td> <td>B=A [MOV]</td> <td>A=B [MOV]</td> <td>A=A + 1 [INC]</td> </tr> <tr valign="TOP"> <td>2</td> <td> </td> <td>2</td> <td>5ms</td> <td>2</td> <td>2</td> <td>C=A [MOV]</td> <td>A=C [MOV]</td> <td>A=A - 1 [DEC]</td> </tr> <tr valign="TOP"> <td>3</td> <td> </td> <td>3</td> <td>10ms</td> <td>3</td> <td>3</td> <td>D=A [MOV]</td> <td>A=D [MOV]</td> <td>A=A + B [ADD]</td> </tr> <tr valign="TOP"> <td>4</td> <td> </td> <td>4</td> <td>20ms</td> <td>4</td> <td>4</td> <td>Dout=A [STA]</td> <td>Din [LDA]</td> <td>A=A - B [SUB]</td> </tr> <tr valign="TOP"> <td>5</td> <td> </td> <td>5</td> <td>50ms</td> <td>5</td> <td>5</td> <td>Dout.1=A.1 [STA]</td> <td>Din.1 [LDA]</td> <td>A=A * B [MUL]</td> </tr> <tr valign="TOP"> <td>6</td> <td> </td> <td>6</td> <td>100ms</td> <td>6</td> <td>6</td> <td>Dout.2=A.1 [STA]</td> <td>Din.2 [LDA]</td> <td>A=A / B [DIV]</td> </tr> <tr valign="TOP"> <td>7</td> <td> </td> <td>7</td> <td>200ms</td> <td>7</td> <td>7</td> <td>Dout.3=A.1 [STA]</td> <td>Din.3 [LDA]</td> <td>A=A and B [AND]</td> </tr> <tr valign="TOP"> <td>8</td> <td> </td> <td>8</td> <td>500ms</td> <td>8</td> <td>8</td> <td>Dout.4=A.1 [STA]</td> <td>Din.4 [LDA]</td> <td>A=A or B [OR]</td> </tr> <tr valign="TOP"> <td>9</td> <td> </td> <td>9</td> <td>1s</td> <td>9</td> <td>9</td> <td>PWM.1=A [STA]</td> <td>ADC.1 [LDA]</td> <td>A=A xor B [XOR]</td> </tr> <tr valign="TOP"> <td>a</td> <td> </td> <td>10</td> <td>2s</td> <td>10</td> <td>10</td> <td>PWM.2=A [STA]</td> <td>ADC.2 [LDA]</td> <td>A= not A [NOT]</td> </tr> <tr valign="TOP"> <td>b</td> <td> </td> <td>11</td> <td>5s</td> <td>11</td> <td>11</td> <td bgcolor="#ff8000">Servo.1=A [STA]</td> <td bgcolor="#ffff00">RCin.1 [LDA]</td> <td bgcolor="#ffff00">A= A % B (Rest) [MOD]</td> </tr> <tr valign="TOP"> <td>c</td> <td> </td> <td>12</td> <td>10s</td> <td>12</td> <td>12</td> <td bgcolor="#ff8000">Servo.2=A [STA]</td> <td bgcolor="#ffff00">RCin.2 [LDA]</td> <td bgcolor="#ffff00">A= A + 16 * B [BYTE]</td> </tr> <tr valign="TOP"> <td>d</td> <td> </td> <td>13</td> <td>20s</td> <td>13</td> <td>13</td> <td bgcolor="#ffff00">E=A [MOV]</td> <td bgcolor="#ffff00">A=E [MOV]</td> <td bgcolor="#ffff00">A= B - A[BSUBA]</td> </tr> <tr valign="TOP"> <td>e</td> <td> </td> <td>14</td> <td>30s</td> <td>14</td> <td>14</td> <td bgcolor="#ffff00">F=A [MOV]</td> <td bgcolor="#ffff00">A=F [MOV]</td> <td bgcolor="#ffff00">A=A SHR 1 [SHR]<br/> ab V 11</td> </tr> <tr valign="TOP"> <td>f</td> <td> </td> <td>15</td> <td>60s</td> <td>15</td> <td>15</td> <td bgcolor="#ffff00">Push A [PUSH]</td> <td bgcolor="#ffff00">Pop A [POP]</td> <td bgcolor="#ffff00">A=A SHL 1 [SHL]<br/> ab V 11</td> </tr> </tbody>
</table> </html> Zus. Features in der Arduino_TPS Version:
- Es gibt 2 zus. Register (E und F)
- und es gibt einen Kellerstapel mit den 2 Methoden push (auflegen) und pop (runter nehmen). In dem Stapel haben 16 Werte Platz.
- Weiterhin gibt es 2 neue Berechnungen, einmal den Rest einer Division (A= A % B) und einmal eine 8-Bit umwandlung. A = A + 16 * B
- Ab Version 0.6 ist auch noch der Swap Befehl hinzugekommen, der A und B Register vertauscht.
- Und eine neue Berechnung A = B - A. Gerade wenn man sich im 8-Bit Raum aufhält ist es manchmal recht umständlich, diese Operation auszuführen.
- ab Version 11 gibt es nun auch Shift Operationen. Diese verschieben den Inhalt des Registers A entwedernahc links SHL (was eine Multiplikation mit 2 entspricht) oder nach rechts (SHR). Das wäre dann eine Division durch 2. Achtung: zwar befinden wir uns hier im 4Bit Raum, diese Operationen sind aber 8 Bit fähig.
<html> <table width=„100%“ cellspacing=„0“ border=„1“ style=„page-break-inside: avoid“>
<thead> <tr valign="TOP"> <th width="3%"> </th> <th width="8%">8</th> <th width="12%">9</th> <th width="17%">a</th> <th width="17%">b</th> <th width="13%">c</th> <th width="16%">d</th> <th width="10%">e</th> <th width="4%">f</th> </tr> </thead> <tbody> <tr valign="TOP"> <td> </td> <td>Page [PAGE]</td> <td>Jump absolut (#+16*page)<br/>[JMP]</td> <td>C* C>0: C=C-1;<br/> Jump # + (16*page)<br/>[LOOPC]</td> <td>D* D>0:D=D-1;<br/> Jump # + (16*page)<br/>[LOOPC]</td> <td>Skip if</td> <td>Call # + (16*Page)<br/>[Call]</td> <td>Callsub/Ret</td> <td>Byte Befehle</td> </tr> <tr valign="TOP"> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td bgcolor="#ffff00">A==0 [SKIP0]</td> <td>0</td> <td>ret [RTR]</td> <td bgcolor="#ffff00">A=ADC.1 [BLDA]</td> </tr> <tr valign="TOP"> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>A>B [AGTB]</td> <td>1</td> <td bgcolor="#ffff00">Call 1 [CASB]</td> <td bgcolor="#ffff00">A=ADC.2 [BLDA]</td> </tr> <tr valign="TOP"> <td>2</td> <td>2</td> <td>2</td> <td>2</td> <td>2</td> <td>A<B [ALTB]</td> <td>2</td> <td bgcolor="#ffff00">2 [CASB]</td> <td bgcolor="#ffff00">A=RCin.1 [BLDA]</td> </tr> <tr valign="TOP"> <td>3</td> <td>3</td> <td>3</td> <td>3</td> <td>3</td> <td>A==B [AEQB]</td> <td>3</td> <td bgcolor="#ffff00">3 [CASB]</td> <td bgcolor="#ffff00">A=RCin.2 [BLDA]</td> </tr> <tr valign="TOP"> <td>4</td> <td>4</td> <td>4</td> <td>4</td> <td>4</td> <td>Din.1==1 [DEQ1 1]</td> <td>4</td> <td bgcolor="#ffff00">4 [CASB]</td> <td bgcolor="#ffff00">PWM.1=A [BSTA]</td> </tr> <tr valign="TOP"> <td>5</td> <td>5</td> <td>5</td> <td>5</td> <td>5</td> <td>Din.2==1 [DEQ1 2]</td> <td>5</td> <td bgcolor="#ffff00">5 [CASB]</td> <td bgcolor="#ffff00">PWM.2=A [BSTA]</td> </tr> <tr valign="TOP"> <td>6</td> <td>6</td> <td>6</td> <td>6</td> <td>6</td> <td>Din.3==1 [DEQ1 3]</td> <td>6</td> <td bgcolor="#ffff00">6 [CASB]</td> <td bgcolor="#ff8000">Servo.1=A [BSTA]</td> </tr> <tr valign="TOP"> <td>7</td> <td>7</td> <td>7</td> <td>7</td> <td>7</td> <td>Din.4==1 [DEQ1 4]</td> <td>7</td> <td> </td> <td bgcolor="#ff8000">Servo.2=A [BSTA]</td> </tr> <tr valign="TOP"> <td>8</td> <td bgcolor="#ffff00">8</td> <td>8</td> <td>8</td> <td>8</td> <td>Din.1==0 [DEQ0 1]</td> <td>8</td> <td bgcolor="#ffff00">Def 1 [DFSB]</td> <td bgcolor="#ff8000">Tone=A [TONE]</td> </tr> <tr valign="TOP"> <td>9</td> <td bgcolor="#ffff00">9</td> <td>9</td> <td>9</td> <td>9</td> <td>Din.2==0 [DEQ0 2]</td> <td>9</td> <td bgcolor="#ffff00">2 [DFSB]</td> <td> </td> </tr> <tr valign="TOP"> <td>a</td> <td bgcolor="#ffff00">10</td> <td>10</td> <td>10</td> <td>10</td> <td>Din.3==0 [DEQ0 3]</td> <td>10</td> <td bgcolor="#ffff00">3 [DFSB]</td> <td> </td> </tr> <tr valign="TOP"> <td>b</td> <td bgcolor="#ffff00">11</td> <td>11</td> <td>11</td> <td>11</td> <td>Din.4==0 [DEQ0 4]</td> <td>11</td> <td bgcolor="#ffff00">4 [DFSB]</td> <td> </td> </tr> <tr valign="TOP"> <td>c</td> <td bgcolor="#ffff00">12</td> <td>12</td> <td>12</td> <td>12</td> <td>S_PRG==0 [PRG0]</td> <td>12</td> <td bgcolor="#ffff00">5 [DFSB]</td> <td> </td> </tr> <tr valign="TOP"> <td>d</td> <td bgcolor="#ffff00">13</td> <td>13</td> <td>13</td> <td>13</td> <td>S_SEL==0 [SEL0]</td> <td>13</td> <td bgcolor="#ffff00">6 [DFSB]</td> <td bgcolor="#ffff00">int. LED on</td> </tr> <tr valign="TOP"> <td>e</td> <td bgcolor="#ffff00">14</td> <td>14</td> <td>14</td> <td>14</td> <td>S_PRG==1 [PRG1]</td> <td>14</td> <td> </td> <td bgcolor="#ffff00">int. LED off</td> </tr> <tr valign="TOP"> <td>f</td> <td bgcolor="#ffff00">15</td> <td>15</td> <td>15</td> <td>15</td> <td>S_SEL==1 [SEL1]</td> <td>15</td> <td bgcolor="#ffff00">restart [REST]</td> <td bgcolor="#ffff00">PrgEnd [PEND]</td> </tr> </tbody>
</table> </html> Zus. Features in der Arduino_TPS Version:
- Weil wir genug EEPROM haben ist der Page Bereich auf 16 Seiten ausgedehnt. Macht also ins. 256 Bytes
- Beim Skip gibt’s noch den A=0 Befehl.
- Über die E Befehle können nun auch 6 echte Unterprogramme angelegt werden. Diese werden über den Befehl Def# angelegt. Mit Call# wird die Routine angesprungen. Mit Return kommt man zurück. Die Def# dürfen auch oberhalb der 256 Bytes im EEPROM liegen. Also auch ausserhalb der Reichtweite der Sprungbefehle.
- Neu ist auch der Restartbefehl, mit dem der ganze Controller neu gestartet wird.
- Im Bereich F sind Befehle hinterlegt, die mit 8 Bit Auflösung arbeiten.
- FF bedeutet Programmende. → automatischer Sprung nach 0.
- NEU Tone Befehl: gibt einen Ton aus. Basis sind die Midinoten. Es werden die Midi Noten von 36 (C2) bis 108 (C8) unterstützt. Ausgang ist der PWM 2. Basis ist das A-Register als 8 Bit Wert.