Bisher gab es nur einen einfachen Rücksprung
(Befehl 3), der maximal 15 Adressen zurück reichte. Nun kommt ein
absoluter Sprung hinzu. Da das Sprungziel nur mit 4 Bit angegeben
werden kann, gibt es einen zusätzlichen Befehl, der die
4-Bit-Seite, also das High-Nibble der Adresse festlegt. Damit hat man
den Adressraum 0...255. Das dürfte für die meisten
Anwendungen ausreichen.
Zwei Zählschleifen mit den
Variablen C und D führen ebenfalls absolute Sprünge aus,
wobei zuvor das High-Nibble der Adresse geladen werden kann.
Die
bedingten Sprünge lehnen sich an die Skip-Befehle in AVR-Assembler
an. Wenn die jeweilige Bedingung wahr ist, wird eine Adresse
übersprungen. Dort könnte z.B. ein Sprungbefehl oder ein
Unterprogrammaufruf stehen. Als Bedingungen stehen Vergleiche zwischen
A und B sowie direkte Bit-Abfragen des Eingangsports zur Verfügung.
Außerdem
gibt es noch einen Unterprogramm-Aufruf und den dazu gehörenden
Return-Befehl. Es werden zwar mehrere Unterprogramme erlaubt, aber aus
einem Unterprogramm darf kein weiteres Unterprogramm aufgerufen werden,
weil der Interpreter sich immer nur eine Rücksprungadresse merkt.
8: Adr-high = 0...15
9: Direkter Sprung auf Adr-high, Adr-low (0..15)
10: Zählschleife C-mal Adr-high, Adr-low (0..15)
11: Zählschleife D-mal Adr-high, Adr-low (0..15)
12: Bedingte Sprünge: If (Bedingung 1...11) then Adr = Adr + 1
(A > B, A > B, A = B, Din.0 = 1, Din.1 = 1, Din.2 = 1, Din.3 = 1,
Din.0 = 0, Din.1 = 0, Din.2 = 0, Din.3 = 0)
13: Unterprogrammaufruf Adr-high, Adr-low (0..15)
14: Return
Damit
ist die Programmiersprache erst mal vollständig. Erweiterungen
sind aber möglich, denn zwei mögliche Befehle (0 und 15) sind
noch nicht definiert. Und einige Befehle wie z.B. der Befehl 12
schöpfen noch nicht den möglichen Umfang ihrer Parameter aus.
So könnte z.B. der bedingte Sprungbefehl (12) noch einige weitere
Bedingungen bekommen. Ähnliches gilt für die Befehle 5, 6 und
7. Man könnte da noch weitere Rechenschritte, mehr AD-Kanäle
und einen zweiten PWM-Ausgang definieren.
Beispiele
'Test: Zählschleife
'Dat
= &H45 : Writeeeprom Dat ,
0
'A=5
'Dat = &H52 : Writeeeprom Dat ,
1
'C=A
'Dat = &H11 : Writeeeprom Dat ,
2
'Port=1
'Dat = &H27 : Writeeeprom Dat ,
3
'200 ms
'Dat = &H10 : Writeeeprom Dat ,
4
'Port=0
'Dat = &H27 : Writeeeprom Dat ,
5
'200 ms
'Dat = &HA2 : Writeeeprom Dat ,
6
'C-mal jmp 2
'Dat = &H30 : Writeeeprom Dat ,
7
'Ende
'Test: Unterprogramm
'Dat = &H4F : Writeeeprom
Dat ,
0
'A=15
'Dat = &H52 : Writeeeprom Dat ,
1
'C=A
'Dat = &H82 : Writeeeprom Dat ,
2
'Adr 32...
'Dat = &HD0 : Writeeeprom Dat ,
3
'Call 32+0
'Dat = &H80 : Writeeeprom Dat ,
4
'Adr 00...
'Dat = &HA2 : Writeeeprom Dat ,
5
'C-mal jmp 2
'Dat = &H30 : Writeeeprom Dat ,
6
'Ende
'Unterprogramm ab Adresse 32
'Dat = &H11 : Writeeeprom
Dat ,
32
'Port=1
'Dat = &H27 : Writeeeprom Dat ,
33
'200 ms
'Dat = &H10 : Writeeeprom Dat ,
34
'Port=0
'Dat = &H27 : Writeeeprom Dat ,
35
'200 ms
'Dat = &H27 : Writeeeprom Dat ,
35
'200 ms
'Dat = &HE0 : Writeeeprom Dat ,
36
'Return
'Test: Verzweigung, Blinken wenn ADC < 7
Dat
=
&H47 : Writeeeprom Dat ,
0
'A=7
Dat = &H51 : Writeeeprom Dat ,
1
'B=A
Dat = &H69 : Writeeeprom Dat ,
2
'A=ADC
Dat = &H82 : Writeeeprom Dat ,
3
'Adr 32...
Dat = &HC2 : Writeeeprom Dat ,
4
'if A<B then Adr=Adr+1
Dat = &HD0 : Writeeeprom Dat ,
5
'Call 32+0
Dat = &H80 : Writeeeprom Dat ,
6
'Adr 00...
Dat = &H90 : Writeeeprom Dat ,
7
'Jump 00
'Unterprogramm ab Adresse 32
Dat = &H11 :
Writeeeprom Dat ,
32
'Port=1
Dat = &H27 : Writeeeprom Dat ,
33
'200 ms
Dat = &H10 : Writeeeprom Dat ,
34
'Port=0
Dat = &H27 : Writeeeprom Dat ,
35
'200 ms
Dat = &H27 : Writeeeprom Dat ,
35
'200 ms
Dat = &HE0 : Writeeeprom Dat ,
36
'Return
Download: TPS4
'--------------------------------------------------------------
' Tasten-programmierbare Steuerung TPS
' Test 4: Sprünge und Verzweigungen
'--------------------------------------------------------------
$regfile = "m168def.dat"
$crystal = 11059200
$hwstack = 32
$swstack = 64
$framesize = 64
Dim Adr As Byte
Dim Eebyte As Byte
Dim Dat As Byte
Dim Kom As Byte
Dim Adrhi As Byte
Dim Adrlo As Byte
Dim Adrret As Byte
Dim Prog As Byte
Dim Dd As Word
Waitms 200
If S2 = 0 Then
Goto Programmieren
Else
Ausfuehren:
Adr = 0
Do
Readeeprom Eebyte , Adr
Adr = Adr + 1
Dat = Eebyte And 15
Kom = Eebyte / 16
...
If Kom = 8 Then
Adrhi = Dat 'Oberes Nibble der Adresse
End If
If Kom = 9 Then
Adr = Adrhi * 16 'Springe absolut 0...255
Adr = Adr + Dat
End If
If Kom = 10 Then
C = C - 1
C = C And 15
If C > 0 Then 'C-mal
Adr = Adrhi * 16 'Springe absolut 0...255
Adr = Adr + Dat
End If
End If
If Kom = 11 Then
D = D - 1
D = D And 15
If D > 0 Then 'D-mal
Adr = Adrhi * 16 'Springe absolut 0...255
Adr = Adr + Dat
End If
End If
If Kom = 12 Then
If Dat = 1 Then
If A > B Then Adr = Adr + 1
End If
If Dat = 2 Then
If A < B Then Adr = Adr + 1
End If
If Dat = 3 Then
If A = B Then Adr = Adr + 1
End If
If Dat = 4 Then
If Pinc.0 = 1 Then Adr = Adr + 1
End If
If Dat = 5 Then
If Pinc.1 = 1 Then Adr = Adr + 1
End If
If Dat = 6 Then
If Pinc.2 = 1 Then Adr = Adr + 1
End If
If Dat = 7 Then
If Pinc.3 = 1 Then Adr = Adr + 1
End If
If Dat = 8 Then
If Pinc.0 = 0 Then Adr = Adr + 1
End If
If Dat = 9 Then
If Pinc.1 = 0 Then Adr = Adr + 1
End If
If Dat = 10 Then
If Pinc.2 = 0 Then Adr = Adr + 1
End If
If Dat = 11 Then
If Pinc.3 = 0 Then Adr = Adr + 1
End If
End If
If Kom = 13 Then
Adrret = Adr
Adr = Adrhi * 16 'Call Unterprogramm absolut 0...255
Adr = Adr + Dat
End If
If Kom = 14 Then
Adr = Adrret 'Return
End If
Loop
End If