5009 lines
228 KiB
Plaintext
5009 lines
228 KiB
Plaintext
|
;**************************************************************
|
|||
|
;
|
|||
|
;
|
|||
|
; @(#)BEST2 BMW LIB Version 2.25 (2007) BMW AG@(#)
|
|||
|
;
|
|||
|
;
|
|||
|
; each Library entry has the following Format
|
|||
|
; functionname: parmater declaration
|
|||
|
; opcode [[<nr of parameter>|CONSTANT ] [,<nr of parameter>|CONSTANT ]]]
|
|||
|
; ;end
|
|||
|
;
|
|||
|
; each library function may use: L0,L1, F0,F1 and S1
|
|||
|
; each library function must push a long value on the stack
|
|||
|
; each non string Parameter is a long value
|
|||
|
;
|
|||
|
; parameter description:
|
|||
|
; ##
|
|||
|
; |^
|
|||
|
; ||
|
|||
|
; |+--> access:
|
|||
|
; | W = write access (variable)
|
|||
|
; | R = read access (variable)
|
|||
|
; | X = read access (constant value or variable)
|
|||
|
; | E = result access (constant value or variable)
|
|||
|
; |
|
|||
|
; +---> data type:
|
|||
|
; V = char, int or long
|
|||
|
; A = string
|
|||
|
; F = real
|
|||
|
;
|
|||
|
;***************************************************************
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
rtoi_round: FR
|
|||
|
move <1>,F0
|
|||
|
a2flt F1,"4294967295.5"
|
|||
|
fcomp F0,F1 ; F0 >= ?
|
|||
|
jge %4 ; ja -> goto %4
|
|||
|
a2flt F1,"-2147483648.5"
|
|||
|
fcomp F0,F1 ; F0 <= ?
|
|||
|
jle %4 ; ja -> goto %4
|
|||
|
fix2flt F1,#0.l
|
|||
|
fcomp F0,F1 ; F0 >= 0
|
|||
|
jge %1 ; ja -> goto %1
|
|||
|
a2flt F1,"0.5"
|
|||
|
fsub F0,F1 ; realsubb(F0,F1)
|
|||
|
jump %2
|
|||
|
|
|||
|
%1: a2flt F1,"0.5" ; ator(F1,"0.5")
|
|||
|
fadd F0,F1 ; realadd(F0,F1)
|
|||
|
a2flt F1,"2147483648"
|
|||
|
fcomp F0,F1 ; F0 < ?
|
|||
|
jle %2 ; ja -> goto %2
|
|||
|
a2flt F1,"4294967297"
|
|||
|
fsub F0,F1 ; realsubb(F0,F1)
|
|||
|
|
|||
|
%2: fix2flt F1,#$7FFFFFFF.l ; itor(F1,2147483647)
|
|||
|
fcomp F0,F1 ; F0 < 2147483647 ?
|
|||
|
jl %3 ; ja -> goto %3
|
|||
|
fix2flt F0,#$7FFFFFFF.l
|
|||
|
|
|||
|
%3: fix2flt F1,#$80000000.l ; itor(F1,-2147483648)
|
|||
|
fcomp F0,F1 ; F0 > -2147483648 ?
|
|||
|
jg %4 ; ja -> goto %4
|
|||
|
fix2flt F0,#$80000000.l
|
|||
|
|
|||
|
%4: flt2fix L0,F0
|
|||
|
push L0
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
aitor: FW AR
|
|||
|
move S1,<2>
|
|||
|
comp S1[#0],#'0' ; beginnt mit '0' ?
|
|||
|
jnz %3 ; nein -> goto %3
|
|||
|
comp S1[#1],#'x' ; gefolgt von 'x' ?
|
|||
|
jz %1 ; ja -> goto %1
|
|||
|
comp S1[#1],#'X' ; gefolgt von 'X' ?
|
|||
|
jz %1 ; ja -> goto %1
|
|||
|
jump %3
|
|||
|
|
|||
|
%1: a2fix L0,S1 ; L0=atoi(S1)
|
|||
|
fix2flt F0,L0 ; itor(F0,L0)
|
|||
|
fix2flt F1,#0 ; itor(F1,0)
|
|||
|
fcomp F0,F1 ; F0 < 0 ?
|
|||
|
jge %2 ; nein -> goto %2
|
|||
|
a2flt F1,"4294967296" ; ator(F1,4294967296)
|
|||
|
fadd F0,F1 ; realadd(F0,F1)
|
|||
|
|
|||
|
%2: move <1>,F0
|
|||
|
jump %4
|
|||
|
|
|||
|
%3: a2flt <1>,S1 ; ator(<1>,S1)
|
|||
|
%4: push L0
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
var_result_unsigned_long: AE VX
|
|||
|
move l0,<2>
|
|||
|
ergd <1>,l0
|
|||
|
push #1.L
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
getk2idblock: AX VW VX AW VW
|
|||
|
clear <4>
|
|||
|
move s1,<1>
|
|||
|
move l0,<2> ;lade ...
|
|||
|
move b7,b0 ;statusbyte in B7
|
|||
|
move l0,<3> ;lade ...
|
|||
|
move b6,b0 ;blocknumber in B6
|
|||
|
|
|||
|
clear l0
|
|||
|
move i0,#4 ;Blockzeiger
|
|||
|
move b5,#1 ;Blockzaehler
|
|||
|
|
|||
|
%1: comp s1[i0,#2],b7 ;Abfrage auf statusbyte
|
|||
|
jnz %2 ;Sprung wenn falsches statusbyte
|
|||
|
move b2,s1[i0] ;i1 (b2,b3) : Blocklaenge
|
|||
|
comp b5,b6
|
|||
|
jz %3
|
|||
|
|
|||
|
adds b5,#1 ;Blockzaehler++
|
|||
|
adds i0,i1
|
|||
|
adds i0,#1 ;da Keybytedaten mit ETX
|
|||
|
jump %1
|
|||
|
|
|||
|
%2: move <5>,#0
|
|||
|
clear l1
|
|||
|
move b4,s1[i0,#2]
|
|||
|
move <2>,l1 ;nicht korrektes Statusbyte
|
|||
|
push #0.l
|
|||
|
jump %4
|
|||
|
|
|||
|
%3: adds i0,#3
|
|||
|
subb b2,#3
|
|||
|
move <4>,s1[i0]i1
|
|||
|
clear l1
|
|||
|
move b4,b2
|
|||
|
move <5>,l1
|
|||
|
push #1.l
|
|||
|
%4:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
getk2block: AX VW VX AW VW
|
|||
|
clear <4>
|
|||
|
move s1,<1>
|
|||
|
move l0,<2> ;lade ...
|
|||
|
move b7,b0 ;statusbyte in B7
|
|||
|
move l0,<3> ;lade ...
|
|||
|
move b6,b0 ;blocknumber in B6
|
|||
|
|
|||
|
clear l0
|
|||
|
move i0,#0 ;Blockzeiger
|
|||
|
move b5,#1 ;Blockzaehler
|
|||
|
|
|||
|
%1: comp s1[i0,#2],b7 ;Abfrage auf statusbyte
|
|||
|
jnz %2 ;Sprung wenn falsches statusbyte
|
|||
|
move b2,s1[i0] ;i1 (b2,b3) : Blocklaenge
|
|||
|
comp b5,b6
|
|||
|
jz %3
|
|||
|
|
|||
|
adds b5,#1 ;Blockzaehler++
|
|||
|
adds i0,i1
|
|||
|
jump %1
|
|||
|
|
|||
|
%2: move <5>,#0
|
|||
|
clear l1
|
|||
|
move b4,s1[i0,#2]
|
|||
|
move <2>,l1 ;nicht korrektes Statusbyte
|
|||
|
push #0.l
|
|||
|
jump %4
|
|||
|
|
|||
|
%3: adds i0,#3
|
|||
|
subb b2,#3
|
|||
|
move <4>,s1[i0]i1
|
|||
|
clear l1
|
|||
|
move b4,b2
|
|||
|
move <5>,l1
|
|||
|
push #1.l
|
|||
|
%4:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
getanalog: AX VX VX VW AW
|
|||
|
clear l1
|
|||
|
clear s1
|
|||
|
move s1,<1>
|
|||
|
tabseek "SNAME",s1
|
|||
|
jz %3
|
|||
|
tabget <5>,"EINH"
|
|||
|
move l0,<2> ;Highbyte des Status
|
|||
|
move b5,b0
|
|||
|
move l0,<3> ;Lowbyte des Status
|
|||
|
move b4,b0
|
|||
|
tabget s1,"TYP"
|
|||
|
a2fix i0,s1
|
|||
|
comp i0,#1 ;wenn Typ ungleich 1 dann...
|
|||
|
jnz %1 ;Umrechnung ueber Tabelle
|
|||
|
tabget s1,"FAKT_A"
|
|||
|
a2fix l0,s1
|
|||
|
mult l1,l0
|
|||
|
tabget s1,"FAKT_B"
|
|||
|
a2fix l0,s1
|
|||
|
adds l1,l0
|
|||
|
move <4>,l1
|
|||
|
jump %2
|
|||
|
%1: move <4>,#1234
|
|||
|
%2: push #1.L
|
|||
|
jump %4
|
|||
|
%3: push #0.L
|
|||
|
%4:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
betriebswlesen: AX AW FW AW
|
|||
|
|
|||
|
; <1> Betriebswertname IN
|
|||
|
; <2> Empfangstelegramm OUT
|
|||
|
; <3> Ergebnis OUT
|
|||
|
; <4> Einheit OUT
|
|||
|
|
|||
|
; Arbeitsregisterbelegung:
|
|||
|
; s1 <1>, Sendetelegramm, BYTE (Tab), DATA_TYPE (Tab), COMPU_TYPE (Tab), Umrechnungstabelle,
|
|||
|
; Ergebnis als Hex-String, Ergebnis aus Umrechnungstabelle, FAKT_A aus Tabelle,
|
|||
|
; FAKT_B aus Tabelle
|
|||
|
|
|||
|
; l0
|
|||
|
; i0 Position der Adresse, Position des Ergebnisses
|
|||
|
; i1 L<>nge der Adresse,
|
|||
|
|
|||
|
; l1
|
|||
|
; i2
|
|||
|
; b4 Temp. Puffer, Adresse, Ergebnis
|
|||
|
; b5 Temp. Puffer, Adresse, Ergebnis
|
|||
|
; i3
|
|||
|
; b6 Temp. Puffer, Adresse
|
|||
|
|
|||
|
; f0 float-Ergebnis
|
|||
|
|
|||
|
; Betriebswert in Tabelle suchen
|
|||
|
clear s1
|
|||
|
move s1,<1>
|
|||
|
tabset "BetriebswTab" ; Tabelle: BetriebswTab
|
|||
|
tabseek "NAME", s1
|
|||
|
jz %endnio ; Tabelleneintrag nicht gefunden
|
|||
|
|
|||
|
; Sendetelegramm aufbauen
|
|||
|
clear <2>
|
|||
|
clear s1
|
|||
|
tabget <2>,"TELEGRAM" ; Basistelegramm aus Tabelle
|
|||
|
|
|||
|
; z.B. "123456" -> 0x12,0x34,0x56
|
|||
|
clear l0 ; i0 is position in destination
|
|||
|
; i1 is position in source
|
|||
|
|
|||
|
%1: move b4,<2>[i1] ;test, if char is in range
|
|||
|
comp b4,#0
|
|||
|
jz %10
|
|||
|
comp b4,#$61
|
|||
|
jae %2
|
|||
|
comp b4,#$41
|
|||
|
jae %3
|
|||
|
comp b4,#$30
|
|||
|
jae %4
|
|||
|
jump %endnio
|
|||
|
|
|||
|
%2: comp b4,#$66
|
|||
|
jbe %5
|
|||
|
jump %endnio
|
|||
|
%3: comp b4,#$46
|
|||
|
jbe %6
|
|||
|
jump %endnio
|
|||
|
%4: comp b4,#$39
|
|||
|
jbe %7
|
|||
|
jump %endnio
|
|||
|
|
|||
|
%5: subb b4,#$57
|
|||
|
jump %8
|
|||
|
%6: subb b4,#$37
|
|||
|
jump %8
|
|||
|
%7: subb b4,#$30
|
|||
|
|
|||
|
%8: test i1,#$01
|
|||
|
jnz %9
|
|||
|
|
|||
|
move b6,b4
|
|||
|
adds i1,#1
|
|||
|
jump %1
|
|||
|
|
|||
|
%9: move b5,b4
|
|||
|
adds i1,#1
|
|||
|
|
|||
|
lsl b6,#4 ; higher nibble
|
|||
|
move s1[i0],b6
|
|||
|
adds s1[i0],b5
|
|||
|
adds i0,#1
|
|||
|
jump %1
|
|||
|
|
|||
|
%10: clear l0
|
|||
|
clear l1
|
|||
|
|
|||
|
tabget <2>,"POS_ADR" ; Position der Adresse aus der Tabelle
|
|||
|
a2fix i0,<2> ; Position speichern in i0
|
|||
|
|
|||
|
tabget <2>,"LEN_ADR" ; Laenge der Adresse aus der Tabelle
|
|||
|
a2fix i1,<2> ; Laenge speichern in i1
|
|||
|
|
|||
|
tabget <2>,"ADR" ; Adresse aus der Tabelle
|
|||
|
a2fix l1,<2> ; Adresse speichern in l1
|
|||
|
|
|||
|
%len3: comp i1,#3
|
|||
|
jnz %len2
|
|||
|
move s1[i0],b6 ; Adr High
|
|||
|
subc i1,#1
|
|||
|
addc i0,#1
|
|||
|
|
|||
|
%len2: comp i1,#2
|
|||
|
jnz %len1
|
|||
|
move s1[i0],b5 ; Adr Middle
|
|||
|
subc i1,#1
|
|||
|
addc i0,#1
|
|||
|
|
|||
|
%len1: comp i1,#1
|
|||
|
jnz %len0
|
|||
|
move s1[i0],b4 ; Adr Low
|
|||
|
subc i1,#1
|
|||
|
|
|||
|
%len0: comp i1,#0
|
|||
|
jnz %endnio
|
|||
|
|
|||
|
|
|||
|
; Telegramm senden und Antwort empfangen
|
|||
|
clear <2> ; Puffer f<>r Empfangstelegramm loeschen
|
|||
|
xsend <2>,s1 ; senden und empfangen
|
|||
|
|
|||
|
%meas: tabget <4>,"MEAS" ; Einheit aus Tabelle
|
|||
|
|
|||
|
; Ergebnis aus dem Antworttelegramm herausholen
|
|||
|
%ausw: tabget s1,"BYTE" ; Position des Ergebnisses aus Tabelle
|
|||
|
a2fix i0,s1 ; Position speichern in i0
|
|||
|
|
|||
|
tabget s1,"DATA_TYPE" ; Datentyp aus Tabelle
|
|||
|
%tbit: scmp s1,"1" ; Bitwert
|
|||
|
jnz %tbyteu
|
|||
|
move b4,<2>[i0]
|
|||
|
move b5,#0
|
|||
|
jump %bittest
|
|||
|
|
|||
|
%tbyteu: scmp s1,"2" ; Unsigned-Byte-Wert
|
|||
|
jnz %tbytes
|
|||
|
move b4,<2>[i0]
|
|||
|
move b5,#0
|
|||
|
jump %cmpbu
|
|||
|
|
|||
|
%tbytes: scmp s1,"3" ; Signed-Byte-Wert
|
|||
|
jnz %tintlohiu
|
|||
|
move b4,<2>[i0]
|
|||
|
move b5,#0
|
|||
|
jump %cmpbs
|
|||
|
|
|||
|
%tintlohiu: scmp s1,"4" ; Unsigned-Int-Wert low-high
|
|||
|
jnz %tinthilou
|
|||
|
move b4,<2>[i0]
|
|||
|
addc i0,#1
|
|||
|
move b5,<2>[i0]
|
|||
|
jump %cmpiu
|
|||
|
|
|||
|
%tinthilou: scmp s1,"5" ; Unsigned-Int-Wert high-low
|
|||
|
jnz %tintlohis
|
|||
|
move b5,<2>[i0]
|
|||
|
addc i0,#1
|
|||
|
move b4,<2>[i0]
|
|||
|
jump %cmpiu
|
|||
|
|
|||
|
%tintlohis: scmp s1,"6" ; Signed-Int-Wert low-high
|
|||
|
jnz %tinthilos
|
|||
|
move b4,<2>[i0]
|
|||
|
addc i0,#1
|
|||
|
move b5,<2>[i0]
|
|||
|
jump %cmpis
|
|||
|
|
|||
|
%tinthilos: scmp s1,"7" ; Signed-Int-Wert high-low
|
|||
|
jnz %endnio
|
|||
|
move b5,<2>[i0]
|
|||
|
addc i0,#1
|
|||
|
move b4,<2>[i0]
|
|||
|
jump %cmpis
|
|||
|
|
|||
|
; Umrechnung Unsigned-Byte
|
|||
|
%cmpbu: fix2flt <3>,i2 ; Wert als float
|
|||
|
jump %compu
|
|||
|
|
|||
|
; Umrechnung Signed-Byte
|
|||
|
%cmpbs: fix2flt <3>,b4 ; Wert als float
|
|||
|
jump %compu
|
|||
|
|
|||
|
; Umrechnung Unsigned-Int
|
|||
|
%cmpiu: clear i3
|
|||
|
fix2flt <3>,l1 ; Wert als float
|
|||
|
jump %compu
|
|||
|
|
|||
|
; Umrechnung Signed-Int
|
|||
|
%cmpis: fix2flt <3>,i2 ; Wert als float
|
|||
|
jump %compu
|
|||
|
|
|||
|
; Umrechnung
|
|||
|
%compu: tabget s1,"COMPU_TYPE" ; Umrechnungsart wird ausgewaehlt
|
|||
|
scmp s1,"--"
|
|||
|
jz %axbu ; -> Ax+B
|
|||
|
jump %tab ; -> mit Unrechnungstabelle
|
|||
|
|
|||
|
%axbu: tabget s1,"FACT_A" ; s1 :Multiplikant
|
|||
|
a2flt f0,s1 ;
|
|||
|
fmul <3>,f0 ; A*x
|
|||
|
tabget s1,"FACT_B" ; s1 :Summant
|
|||
|
a2flt f0,s1 ;
|
|||
|
fadd <3>,f0 ; +B
|
|||
|
jump %endio
|
|||
|
|
|||
|
%tab: tabset s1
|
|||
|
fix2hex s1,i2
|
|||
|
tabseek "WERT",s1
|
|||
|
tabget s1,"ERGEBNIS" ; s1 :ERGEBNIS
|
|||
|
a2flt <3>,s1
|
|||
|
jump %endio
|
|||
|
|
|||
|
%bittest:
|
|||
|
tabget s1,"MASK" ;hole die maske
|
|||
|
a2fix i0,s1 ;in i0
|
|||
|
move b3,b0 ;nach b3
|
|||
|
tabget s1,"VALUE" ;hole den Sollwert
|
|||
|
a2fix i0,s1 ;in i0
|
|||
|
and b4,b3 ;mask the bits wanted
|
|||
|
xor b4,b0 ;xor with value
|
|||
|
|
|||
|
jnz %bt1 ;not true
|
|||
|
a2flt <3>,"1.0" ;
|
|||
|
jump %endio ;to end
|
|||
|
%bt1: a2flt <3>,"0.0" ;
|
|||
|
jump %endio ;to end
|
|||
|
|
|||
|
%endio: push #1.L
|
|||
|
jump %end
|
|||
|
%endnio: push #0.L
|
|||
|
jump %end
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
betriebswlesenK2: AX AW FW AW
|
|||
|
xawlen {1.i,0.i} ;1 Antwortblock
|
|||
|
clear l0
|
|||
|
clear l1
|
|||
|
clear s1
|
|||
|
move s1,<1>
|
|||
|
tabset "BetriebswMatrix" ;Tabelle: BetriebswMatrix
|
|||
|
tabseek "NAME", s1
|
|||
|
jz %19 ;Tabelleneintrag nicht gefunden
|
|||
|
|
|||
|
;die richtigen Telegramme werden ausgewaehlt
|
|||
|
tabget s1,"QUELLE"
|
|||
|
scmp s1,"RAM"
|
|||
|
jz %1
|
|||
|
scmp s1,"ROM"
|
|||
|
jz %2
|
|||
|
scmp s1,"ADC"
|
|||
|
jz %3
|
|||
|
jump %19 ;Eintrag nicht gefunden
|
|||
|
|
|||
|
%1: clear s1
|
|||
|
clear <2>
|
|||
|
move s1,{6,0,1,2,0,0}
|
|||
|
|
|||
|
;die richtigen Speicherzellen (Kanaele) werden eingetragen
|
|||
|
tabget <2>,"ZELLE"
|
|||
|
a2fix i0,<2>
|
|||
|
clear <2>
|
|||
|
move s1[#5],b0 ;Adr Hi
|
|||
|
move s1[#4],b1 ;Adr Lo
|
|||
|
jump %4
|
|||
|
|
|||
|
%2: clear s1
|
|||
|
clear <2>
|
|||
|
move s1,{6,0,3,2,0,0}
|
|||
|
tabget <2>,"ZELLE"
|
|||
|
a2fix i0,<2>
|
|||
|
clear <2>
|
|||
|
move s1[#5],b0 ;Adr Hi
|
|||
|
move s1[#4],b1 ;Adr Lo
|
|||
|
jump %4
|
|||
|
|
|||
|
%3: clear s1
|
|||
|
clear <2>
|
|||
|
move s1,{4,0,8,0}
|
|||
|
tabget <2>,"ZELLE"
|
|||
|
a2fix i0,<2>
|
|||
|
clear <2>
|
|||
|
move s1[#3],b0 ;ADC-Kanalnummer
|
|||
|
|
|||
|
;die zwei Antwortbytes werden nach i0 kopiert
|
|||
|
%4: xsend <2>,s1
|
|||
|
comp <2>[#2],#251
|
|||
|
jz %11
|
|||
|
comp <2>[#2],#253
|
|||
|
jz %11
|
|||
|
comp <2>[#2],#254
|
|||
|
jz %11
|
|||
|
jump %19
|
|||
|
%11: tabget s1,"ORD" ;2 Antwortbytes werden nach i0 kopiert
|
|||
|
scmp s1,"--"
|
|||
|
jnz %12
|
|||
|
move b0,<2>[#3]
|
|||
|
move b1,#0
|
|||
|
jump %15
|
|||
|
%12: scmp s1,"LH"
|
|||
|
jnz %13
|
|||
|
move b0,<2>[#3]
|
|||
|
move b1,<2>[#4]
|
|||
|
jump %15
|
|||
|
%13: scmp s1,"HL"
|
|||
|
jnz %19 ;Eintrag nicht gefunden
|
|||
|
move b0,<2>[#4]
|
|||
|
move b1,<2>[#3]
|
|||
|
%15: tabget <4>,"EINH" ;Ausgabe der Einheit
|
|||
|
tabget s1,"TYP" ;Umrechnungsart wird ausgewaehlt
|
|||
|
scmp s1,"1"
|
|||
|
jz %16 ;-> Ax+B
|
|||
|
scmp s1,"2"
|
|||
|
jz %17 ;-> Tabelle
|
|||
|
jump %19 ;Eintrag nicht gefunden
|
|||
|
%16: fix2flt <3>,i0 ;Wert als float
|
|||
|
tabget s1,"FAKT_A" ;s1 :FAKT_A
|
|||
|
a2flt f0,s1 ;
|
|||
|
fmul <3>,f0 ;Ax
|
|||
|
tabget s1,"FAKT_B" ;s1 :FAKT_B
|
|||
|
a2flt f0,s1 ;
|
|||
|
fadd <3>,f0 ;+B
|
|||
|
jump %18 ;->Ready
|
|||
|
%17: tabget s1,"FAKT_A" ;s1 :Tabelle
|
|||
|
tabset s1
|
|||
|
fix2hex s1,i0
|
|||
|
tabseek "WERT",s1
|
|||
|
tabget s1,"ERGEBNIS" ;s1 :ERGEBNIS
|
|||
|
a2flt <3>,s1 ;->Ready
|
|||
|
%18: push #1.L
|
|||
|
jump %20
|
|||
|
%19: push #0.L
|
|||
|
jump %20
|
|||
|
%20:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
betriebswlesenDS2: AX AW FW AW VX
|
|||
|
xawlen {-1.i,0.i} ;1 Antwortblock
|
|||
|
clear l0
|
|||
|
clear l1
|
|||
|
clear s1
|
|||
|
move s1,<1>
|
|||
|
tabset "BetriebswMatrix" ;Tabelle: BetriebswMatrix
|
|||
|
tabseek "NAME", s1
|
|||
|
jz %13 ;Tabelleneintrag nicht gefunden
|
|||
|
clear <2> ;Telegramme werden ausgewaehlt
|
|||
|
tabget s1,"QUELLE"
|
|||
|
scmp s1,"RAM1I"
|
|||
|
jnz %1
|
|||
|
move s1,{0,9,6,4,0,0,0,2}
|
|||
|
jump %9
|
|||
|
%1: scmp s1,"RAM1E"
|
|||
|
jnz %2
|
|||
|
move s1,{0,9,6,5,0,0,0,2}
|
|||
|
jump %9
|
|||
|
%2: scmp s1,"RAM2I"
|
|||
|
jnz %3
|
|||
|
move s1,{0,9,6,11,0,0,0,2}
|
|||
|
jump %9
|
|||
|
%3: scmp s1,"RAM2E"
|
|||
|
jnz %4
|
|||
|
move s1,{0,9,6,12,0,0,0,2}
|
|||
|
jump %9
|
|||
|
%4: scmp s1,"EPROM1"
|
|||
|
jnz %5
|
|||
|
move s1,{0,9,6,2,0,0,0,2}
|
|||
|
jump %9
|
|||
|
%5: scmp s1,"EEPROM1"
|
|||
|
jnz %6
|
|||
|
move s1,{0,9,6,3,0,0,0,2}
|
|||
|
jump %9
|
|||
|
%6: scmp s1,"EPROM2"
|
|||
|
jnz %7
|
|||
|
move s1,{0,9,6,9,0,0,0,2}
|
|||
|
jump %9
|
|||
|
%7: scmp s1,"EEPROM2"
|
|||
|
jnz %77
|
|||
|
move s1,{0,9,6,10,0,0,0,2}
|
|||
|
jump %9
|
|||
|
%77: scmp s1,"LINRAM"
|
|||
|
jnz %8
|
|||
|
move s1,{0,9,6,0,0,0,0,2}
|
|||
|
jump %9
|
|||
|
%8: scmp s1,"ADC"
|
|||
|
jnz %19 ;->Eintrag nicht gefunden
|
|||
|
move s1,{0,6,11,2,0} ; hier nur ADC-Lesen
|
|||
|
tabget <2>,"ZELLE"
|
|||
|
a2fix i0,<2>
|
|||
|
move s1[#4],b0 ; ADC-Kanalnummer
|
|||
|
jump %10
|
|||
|
|
|||
|
%9: tabget <2>,"ZELLE" ; hier RAM/ROM/EPROM Daten lesen
|
|||
|
a2fix l0,<2>
|
|||
|
move s1[#4],b2 ;Adr High
|
|||
|
move s1[#5],b1 ;Adr Middle
|
|||
|
move s1[#6],b0 ;Adr Low
|
|||
|
jump %10
|
|||
|
|
|||
|
%10: clear <2>
|
|||
|
move l0,<5>
|
|||
|
move s1[#0],b0 ;SG Adresse eintrage
|
|||
|
xsend <2>,s1
|
|||
|
comp <2>[#2],#$A0
|
|||
|
jz %11
|
|||
|
jump %19
|
|||
|
%11: tabget s1,"ORD" ;2 Antwortbytes werden nach i0 kopiert
|
|||
|
scmp s1,"--"
|
|||
|
jnz %12
|
|||
|
move b0,<2>[#3]
|
|||
|
move b1,#0
|
|||
|
jump %15
|
|||
|
%12: scmp s1,"LH"
|
|||
|
jnz %13
|
|||
|
move b0,<2>[#3]
|
|||
|
move b1,<2>[#4]
|
|||
|
jump %15
|
|||
|
%13: scmp s1,"HL"
|
|||
|
jnz %19 ;Eintrag nicht gefunden
|
|||
|
move b0,<2>[#4]
|
|||
|
move b1,<2>[#3]
|
|||
|
%15: tabget <4>,"EINH" ;Ausgabe der Einheit
|
|||
|
tabget s1,"TYP" ;Umrechnungsart wird ausgewaehlt
|
|||
|
scmp s1,"1"
|
|||
|
jz %16 ;-> Ax+B
|
|||
|
scmp s1,"2"
|
|||
|
jz %17 ;-> Tabelle
|
|||
|
jump %19 ;Eintrag nicht gefunden
|
|||
|
%16: fix2flt <3>,i0 ;Wert als float
|
|||
|
tabget s1,"FAKT_A" ;s1 :FAKT_A
|
|||
|
a2flt f0,s1 ;
|
|||
|
fmul <3>,f0 ;Ax
|
|||
|
tabget s1,"FAKT_B" ;s1 :FAKT_B
|
|||
|
a2flt f0,s1 ;
|
|||
|
fadd <3>,f0 ;+B
|
|||
|
jump %18 ;->Ready
|
|||
|
%17: tabget s1,"FAKT_A" ;s1 :Tabelle
|
|||
|
tabset s1
|
|||
|
fix2hex s1,i0
|
|||
|
tabseek "WERT",s1
|
|||
|
tabget s1,"ERGEBNIS" ;s1 :ERGEBNIS
|
|||
|
a2flt <3>,s1 ;->Ready
|
|||
|
%18: push #1.L
|
|||
|
jump %20
|
|||
|
%19: push #0.L
|
|||
|
jump %20
|
|||
|
%20:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
standard_ident: VX AW
|
|||
|
move l0,<1> ;standard_ident
|
|||
|
xawlen {-1.i,0.i} ;1 Antwortblock
|
|||
|
clear s1
|
|||
|
move s1,{$00,$04,$00}
|
|||
|
move s1[#0],b0
|
|||
|
xsend <2>,s1
|
|||
|
|
|||
|
tabset "JobResult" ;Jobstatus auswerten
|
|||
|
fix2hex s1,<2>[#2]
|
|||
|
tabseek "SB", s1
|
|||
|
tabget s1,"STATUS_TEXT"
|
|||
|
ergs "JOB_STATUS",s1
|
|||
|
|
|||
|
scmp s1,"OKAY" ;Im Fehlerfall eoj
|
|||
|
jz %1
|
|||
|
clear s1
|
|||
|
jump %15
|
|||
|
|
|||
|
%1: etag %6,"ID_BMW_NR"
|
|||
|
clear s1
|
|||
|
move i1,#0 ; i1 is write pos
|
|||
|
move i2,#3 ; i2 is position
|
|||
|
move i3,#4 ; i3 is count
|
|||
|
jump %4 ; erstes Nibble ueberspringen
|
|||
|
%2: move b0,<2>[i2] ;
|
|||
|
lsr b0,#4 ; higher nibble
|
|||
|
or b0,#48 ; to bcd
|
|||
|
comp b0,#58 ;
|
|||
|
jb %3 ;
|
|||
|
move b0,#42 ; correct '*'
|
|||
|
%3: move s1[i1],b0 ; write hexbyte
|
|||
|
adds i1,#1 ; inc write pos
|
|||
|
%4: move b0,<2>[i2] ;
|
|||
|
and b0,#$0f ; lower nibble
|
|||
|
or b0,#48 ; to bcd
|
|||
|
comp b0,#58 ;
|
|||
|
jb %5 ;
|
|||
|
move b0,#42 ; correct '*'
|
|||
|
%5: move s1[i1],b0 ; write hexbyte
|
|||
|
adds i1,#1 ; inc write pos
|
|||
|
adds i2,#1 ; readpos++
|
|||
|
subb i3,#1 ; count--
|
|||
|
jnz %2 ;
|
|||
|
scat s1,"" ; add \0
|
|||
|
ergs "ID_BMW_NR",s1
|
|||
|
|
|||
|
%6: etag %7,"ID_HW_NR"
|
|||
|
move b0,<2>[#7]
|
|||
|
move b1,<2>[#7]
|
|||
|
lsr b0,#4
|
|||
|
and b0,#$0f
|
|||
|
and b1,#$0f
|
|||
|
mult b0,#10
|
|||
|
adds b0,b1
|
|||
|
clear b1
|
|||
|
ergw "ID_HW_NR",i0
|
|||
|
|
|||
|
%7: etag %8,"ID_COD_INDEX"
|
|||
|
move b0,<2>[#8]
|
|||
|
move b1,<2>[#8]
|
|||
|
lsr b0,#4
|
|||
|
and b0,#$0f
|
|||
|
and b1,#$0f
|
|||
|
mult b0,#10
|
|||
|
adds b0,b1
|
|||
|
clear b1
|
|||
|
ergw "ID_COD_INDEX",i0
|
|||
|
|
|||
|
%8: etag %9,"ID_DIAG_INDEX"
|
|||
|
move b0,<2>[#9]
|
|||
|
move b1,<2>[#9]
|
|||
|
lsr b0,#4
|
|||
|
and b0,#$0f
|
|||
|
and b1,#$0f
|
|||
|
mult b0,#10
|
|||
|
adds b0,b1
|
|||
|
clear b1
|
|||
|
ergw "ID_DIAG_INDEX",i0
|
|||
|
|
|||
|
%9: etag %10,"ID_BUS_INDEX"
|
|||
|
move b0,<2>[#10]
|
|||
|
move b1,<2>[#10]
|
|||
|
lsr b0,#4
|
|||
|
and b0,#$0f
|
|||
|
and b1,#$0f
|
|||
|
mult b0,#10
|
|||
|
adds b0,b1
|
|||
|
clear b1
|
|||
|
ergw "ID_BUS_INDEX",i0
|
|||
|
|
|||
|
%10: etag %11,"ID_DATUM_KW"
|
|||
|
move b0,<2>[#11]
|
|||
|
move b1,<2>[#11]
|
|||
|
lsr b0,#4
|
|||
|
and b0,#$0f
|
|||
|
and b1,#$0f
|
|||
|
mult b0,#10
|
|||
|
adds b0,b1
|
|||
|
clear b1
|
|||
|
ergw "ID_DATUM_KW",i0
|
|||
|
|
|||
|
%11: etag %12,"ID_DATUM_JAHR"
|
|||
|
move b0,<2>[#12]
|
|||
|
move b1,<2>[#12]
|
|||
|
lsr b0,#4
|
|||
|
and b0,#$0f
|
|||
|
and b1,#$0f
|
|||
|
mult b0,#10
|
|||
|
adds b0,b1
|
|||
|
clear b1
|
|||
|
ergw "ID_DATUM_JAHR",i0
|
|||
|
|
|||
|
%12: etag %13,"ID_LIEF_NR"
|
|||
|
move b0,<2>[#13]
|
|||
|
move b1,<2>[#13]
|
|||
|
lsr b0,#4
|
|||
|
and b0,#$0f
|
|||
|
and b1,#$0f
|
|||
|
mult b0,#10
|
|||
|
adds b0,b1
|
|||
|
clear b1
|
|||
|
ergw "ID_LIEF_NR",i0
|
|||
|
|
|||
|
%13: etag %14,"ID_LIEF_TEXT"
|
|||
|
tabset "Lieferanten"
|
|||
|
fix2hex s1,<2>[#13]
|
|||
|
tabseek "LIEF_NR",s1
|
|||
|
tabget s1,"LIEF_TEXT"
|
|||
|
ergs "ID_LIEF_TEXT",s1
|
|||
|
|
|||
|
%14: etag %15,"ID_SW_NR"
|
|||
|
move b0,<2>[#14]
|
|||
|
move b1,<2>[#14]
|
|||
|
lsr b0,#4
|
|||
|
and b0,#$0f
|
|||
|
and b1,#$0f
|
|||
|
mult b0,#10
|
|||
|
adds b0,b1
|
|||
|
clear b1
|
|||
|
ergw "ID_SW_NR",i0
|
|||
|
%15: push #1.L
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
ax_plus_b: AX FW VW AX AX
|
|||
|
fix2flt f1,<3> ; ax_plus_b
|
|||
|
a2flt f0,<4>
|
|||
|
fmul f1,f0
|
|||
|
a2flt f0,<5>
|
|||
|
fadd f1,f0
|
|||
|
move <2>,f1 ; Ergebnis zuweisen
|
|||
|
clear s1
|
|||
|
move s1,<1>
|
|||
|
comp s1[#0],#0
|
|||
|
jz %1
|
|||
|
ergr <1>,f1
|
|||
|
%1: push #1.L
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
write_global_data: AX
|
|||
|
shmset "",<1> ;write global data
|
|||
|
push #1.L
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
read_global_data: AW
|
|||
|
shmget <1>,"" ;read global data
|
|||
|
push #1.L
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
carbSource: AW AX VX
|
|||
|
move l1,#1
|
|||
|
tabset "CARBSOURCE" ;set table to bytefield
|
|||
|
move s1,<2>
|
|||
|
move b0,s1[#2]
|
|||
|
fix2hex s1,b0
|
|||
|
tabseek "ADRESS",s1
|
|||
|
pushf
|
|||
|
tabget <1>,"ECU"
|
|||
|
popf
|
|||
|
jnz %1
|
|||
|
move l1,<3>
|
|||
|
move b0,s1[#2]
|
|||
|
move <1>[l1],b0
|
|||
|
move b0,s1[#3]
|
|||
|
adds l1,#1
|
|||
|
move <1>[l1],b0
|
|||
|
move l1,#0
|
|||
|
%1: push l1
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
carbChecksum: AW
|
|||
|
clear i0
|
|||
|
move i1,#0 ;Checksum
|
|||
|
move i2,#0 ;Index
|
|||
|
slen i3,<1> ;Maximum
|
|||
|
%1: move b0,<1>[i2] ;Get Byte
|
|||
|
adds i1,i0 ;add Checksum
|
|||
|
adds i2,#1 ;inc Index
|
|||
|
comp i2,i3 ;Last Byte ?
|
|||
|
jnz %1 ;no
|
|||
|
move <1>[i3],b2
|
|||
|
move i0,i1
|
|||
|
clear i1
|
|||
|
push l0
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; check_digital_argument(Argumentname, Argumentnummer, Ergebnis, Mode)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L0 Temp
|
|||
|
; L6 trapmask
|
|||
|
; S1 Puffer
|
|||
|
check_digital_argument: AE VX VW VX
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
pars S1,<2> ; Puffer = Argument <2>
|
|||
|
jnz %1 ; if (exist(ARGUMENT)) %1
|
|||
|
|
|||
|
move L0,<4> ; Temp = mode
|
|||
|
test L0,#2 ; Temp & 2
|
|||
|
jnz %endnio ; if ((Temp & 2)==0
|
|||
|
and L0,#1 ; Temp = Temp & 1
|
|||
|
move <3>,L0 ; Ergebnis = Temp
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%1: move L0,#0 ; Temp = 0
|
|||
|
%2: comp S1[L0],#0 ; Puffer[Temp] == 0
|
|||
|
jz %3 ; Stringende erreicht ?
|
|||
|
or S1[L0],#$20 ; Puffer[i] = Puffer[i] | 0x20 --> Kleinbuchstabe
|
|||
|
adds L0,#1 ; i++
|
|||
|
jump %2 ; goto %2
|
|||
|
|
|||
|
%3: tabset "DigitalArgument" ; tabset("DigitalArgument")
|
|||
|
jt %nio_table,#10 ; Tabelle nicht gefunden ?
|
|||
|
tabseek "TEXT",S1 ; tabseek("TEXT", Puffer)
|
|||
|
jz %endnio ; nicht gefunden ?
|
|||
|
tabget S1,"WERT" ; tabget(Puffer, "WERT")
|
|||
|
a2fix <3>,S1 ; Ergebnis = atoi(Puffer);
|
|||
|
; jump %endio
|
|||
|
|
|||
|
%endio: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_table: push #0.L ; FALSE
|
|||
|
ergs "JOB_MESSAGE","Table DigitalArgument not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
jump %end
|
|||
|
|
|||
|
%endnio: push #0.L ; FALSE
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: clrt ; Trapregister l<>schen
|
|||
|
settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; check_multiple_argument(Argumentname, Argumentnummer, Ergebnis, Tablename)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx
|
|||
|
;
|
|||
|
; L6 trapmask
|
|||
|
; S1 Puffer
|
|||
|
check_multiple_argument: AE VX VW AX
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
pars S1,<2> ; Puffer = Argument <2>
|
|||
|
jz %endnio ; if (!exist(ARGUMENT)) %endnio
|
|||
|
|
|||
|
tabset <4> ; tabset(Tablename)
|
|||
|
jt %nio_table,#10 ; Tabelle nicht gefunden ?
|
|||
|
tabseek "TEXT",S1 ; tabseek("TEXT", Puffer)
|
|||
|
jz %endnio ; nicht gefunden ?
|
|||
|
tabget S1,"WERT" ; tabget(Puffer, "WERT")
|
|||
|
a2fix <3>,S1 ; Ergebnis = atoi(Puffer);
|
|||
|
; jump %endio
|
|||
|
|
|||
|
%endio: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_table: push #0.L ; FALSE
|
|||
|
ergs "JOB_MESSAGE","Table not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
jump %end
|
|||
|
|
|||
|
%endnio: push #0.L ; FALSE
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: clrt ; Trapregister l<>schen
|
|||
|
settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; send_and_receive_uds(SA_request, TA_request, TA_TYPE_request, Data_request, SA_response, TA_response, Data_response, Result_Name, repeat_counter)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx <--- 5 ---> <--- 6 ---> <--- 7 ---> xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; B0 (L0) temp
|
|||
|
; L0 temp2
|
|||
|
; I2 (L1) len antwort
|
|||
|
; I3 (L1) datalen_auftrag
|
|||
|
; L2 <2>
|
|||
|
; L3 <5>
|
|||
|
; L4 <6>
|
|||
|
; IA (L5) datalen_antwort
|
|||
|
; IB (L5) len_check
|
|||
|
; L6 trapmask
|
|||
|
; IE (L7) BusyCount
|
|||
|
; AE (L7) offset antwort
|
|||
|
; S1 Puffer
|
|||
|
send_and_receive_uds: VX VX VX AX VW VW AW AE VX
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
move AD,#0 ; BusyCount = 0 ( high )
|
|||
|
move AC,<9> ; BusyCount = Wiederholzaehler
|
|||
|
adds IE,#1 ; BusyCount = BusyCount + 1
|
|||
|
|
|||
|
%1a: clear <7> ; response loeschen
|
|||
|
clear S1 ; dataclear(S1)
|
|||
|
slen I3,<4> ; datalen_auftrag = datalen(request)
|
|||
|
comp I3,#0 ; datalen_auftrag == 0 ?
|
|||
|
jz %1f ; ja -> senden
|
|||
|
move S1,<4> ; Puffer = request
|
|||
|
comp I3,#63 ; datalen_auftrag <= 63 ?
|
|||
|
jle %1b ; ja -> kurzer header dazu
|
|||
|
comp I3,#255 ; datalen_auftrag <= 255 ?
|
|||
|
jle %1c ; ja -> header dazu
|
|||
|
jump %1d
|
|||
|
|
|||
|
%1b: spaste S1[#0],{$80.B,$0.B,$0.B} ; FMT TGT SRC
|
|||
|
adds S1[#0],B6
|
|||
|
jump %1e
|
|||
|
|
|||
|
%1c: spaste S1[#0],{$80.B,$0.B,$0.B,$0.B} ; FMT TGT SRC LEN
|
|||
|
move S1[#3],B6
|
|||
|
jump %1e
|
|||
|
|
|||
|
%1d: spaste S1[#0],{$80.B,$0.B,$0.B,$0.B,$0.B,$0.B} ; FMT TGT SRC LEN LENHigh LENLow
|
|||
|
move S1[#4],B7
|
|||
|
move S1[#5],B6
|
|||
|
jump %1e
|
|||
|
|
|||
|
%1e: move L0,<2> ; temp2 = TA_request
|
|||
|
move S1[#1],B0 ; Puffer[1]=TA_request
|
|||
|
move B0,<1> ; temp = SA_request
|
|||
|
move S1[#2],B0 ; Puffer[2]=SA_request
|
|||
|
move B0,<3> ; temp = TA_TYPE_request
|
|||
|
comp B0,#0 ; TA_TYPE_request == 0 ?
|
|||
|
jz %1f ; ja -> physikalisch
|
|||
|
adds S1[#0],#$40 ; Functional
|
|||
|
|
|||
|
%1f: xsend <7>,S1 ; senden
|
|||
|
slen IA,<7> ; datalen_antwort = datalen(antwort)
|
|||
|
comp IA,#0 ; datalen_antwort == 0 ?
|
|||
|
jz %nio_resp ; ja -> Fehler
|
|||
|
|
|||
|
move AE,#3 ; offset = 3
|
|||
|
move I2,<7>[#0] ; len = antwort[0]
|
|||
|
and I2,#$3F ; len = len & 0x3F
|
|||
|
comp I2,#0 ; len == 0 ?
|
|||
|
jnz %3 ; nein -> goto %3
|
|||
|
move AE,#4 ; offset = 4
|
|||
|
move I2,<7>[#3] ; len = antwort[3]
|
|||
|
and I2,#$FF ; len = len & 0xFF
|
|||
|
comp I2,#0 ; len == 0 ?
|
|||
|
jnz %3 ; nein -> goto %3
|
|||
|
move AE,#6 ; offset = 6
|
|||
|
move B5,<7>[#4] ; lenh= antwort[4]
|
|||
|
move B4,<7>[#5] ; lenl= antwort[5]
|
|||
|
|
|||
|
%3: move IB,#1 ; len_check = 1 ( Checksumme )
|
|||
|
adds A6,AE ; len_check = len_check + offset
|
|||
|
adds IB,I2 ; len_check = len_check + len
|
|||
|
comp IB,IA ; len_check == datalen_antwort ?
|
|||
|
jz %3a ; ja -> goto %3a
|
|||
|
jump %nio_len ; Fehler
|
|||
|
|
|||
|
%3a: move <5>,<7>[#2] ; SA_response = antwort[2]
|
|||
|
and <5>,#$FF.L ; nur Low Byte
|
|||
|
move <6>,<7>[#1] ; TA_response = antwort[1]
|
|||
|
and <6>,#$FF.L ; nur Low Byte
|
|||
|
|
|||
|
%3b: serase <7>[#0],AE ; dataerase(response,0,offset) Header entfernt
|
|||
|
serase <7>[I2],#1 ; dataerase(response,len,1) Checksumme entfernt
|
|||
|
clear S1
|
|||
|
move S1,<8>
|
|||
|
scmp S1,"" ; RESULT <8> == "" ?
|
|||
|
jz %3c ; ja -> goto %3c
|
|||
|
etag %3c,<8> ; wenn RESULT <8> angefordert
|
|||
|
ergy <8>,<7> ; response nach RESULT <8>
|
|||
|
|
|||
|
%3c: settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "JobResult" ; tabset("JobResult")
|
|||
|
jt %nio_table,#10 ; Tabelle nicht gefunden ?
|
|||
|
comp <7>[#0],#$7F ; response[0] == 0x7F ?
|
|||
|
jnz %5 ; nein -> goto %5
|
|||
|
|
|||
|
comp I3,#0 ; datalen_auftrag == 0 ?
|
|||
|
jz %4a ; ja -> goto %4a
|
|||
|
|
|||
|
move B0,<3> ; temp = TA_TYPE_request
|
|||
|
comp B0,#0 ; TA_TYPE_request == 0 ?
|
|||
|
jnz %4a ; nein -> goto %4a
|
|||
|
|
|||
|
comp <7>[#2],#$21 ; NegResponseCode == BusyRepeatRequest ?
|
|||
|
jz %4c ; ja -> goto %4c
|
|||
|
jump %4a ; goto %4a
|
|||
|
|
|||
|
%4c: comp IE,#1 ; BusyCount == 1 ?
|
|||
|
jz %4b ; ja -> goto %4b
|
|||
|
wait #1 ; wait (1)
|
|||
|
|
|||
|
%4b: subb IE,#1 ; BusyCount --
|
|||
|
jnz %1a ; BusyCount > 0 -> goto %1a
|
|||
|
|
|||
|
%4a: fix2hex S1,<7>[#2] ;
|
|||
|
tabseek "SB",S1 ; tab_suche_index("SB",response[2])
|
|||
|
tabget S1,"STATUS_TEXT" ;
|
|||
|
ergs "JOB_STATUS",S1 ;
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%5: comp I3,#0 ; datalen_auftrag == 0 ?
|
|||
|
jz %8 ; ja -> goto %8
|
|||
|
|
|||
|
move B0,<4>[#0] ; temp = request[0]
|
|||
|
adds B0,#$40 ; temp = temp+ 0x40
|
|||
|
comp <7>[#0],B0 ; response[0] == SID ?
|
|||
|
jz %6 ; ja -> goto %6
|
|||
|
jump %nio_id ; Fehler
|
|||
|
|
|||
|
%6: comp <6>,<1> ; TA_response = SA_request
|
|||
|
jz %7 ; ja -> goto %7
|
|||
|
jump %nio_TA_SA ; Fehler
|
|||
|
|
|||
|
%7: move B0,<3> ; temp = TA_TYPE_request
|
|||
|
comp B0,#0 ; TA_TYPE_request == TA_TYPE_PHYSICAL
|
|||
|
jnz %8 ; nein -> functional
|
|||
|
comp <5>,<2> ; SA_response = TA_request
|
|||
|
jz %8 ; ja -> goto %8
|
|||
|
jump %nio_SA_TA ; Fehler
|
|||
|
|
|||
|
%8: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_resp: ergs "JOB_STATUS","ERROR_ECU_NO_RESPONSE"
|
|||
|
jump %endnio
|
|||
|
|
|||
|
%nio_len: ergs "JOB_STATUS","ERROR_ECU_INCORRECT_LEN"
|
|||
|
jump %endnio
|
|||
|
|
|||
|
%nio_id: ergs "JOB_STATUS","ERROR_ECU_INCORRECT_RESPONSE_ID"
|
|||
|
jump %endnio
|
|||
|
|
|||
|
%nio_ta_sa: ergs "JOB_STATUS","ERROR_ECU_TA_RESPONSE_NOT_SA_REQUEST"
|
|||
|
jump %endnio
|
|||
|
|
|||
|
%nio_sa_ta: ergs "JOB_STATUS","ERROR_ECU_SA_RESPONSE_NOT_TA_REQUEST"
|
|||
|
jump %endnio
|
|||
|
|
|||
|
%nio_table: ergs "JOB_MESSAGE","Table JobResult not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %endnio
|
|||
|
|
|||
|
%endnio: push #0.L ; FALSE
|
|||
|
%end: settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; send_and_receive_kwp2000(Antwort, Auftrag, Daten, ResultName, Wiederholzaehler)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; B0 (L0) temp
|
|||
|
; B1 (L0) SID
|
|||
|
; B2 (L0) offset antwort
|
|||
|
; B3 (L0) PosSID auftrag
|
|||
|
; I2 (L1) len antwort
|
|||
|
; I3 (L1) datalen_auftrag
|
|||
|
; I4 (L2) datalen_antwort
|
|||
|
; I5 (L2) len_check
|
|||
|
; I6 (L3) BusyCount
|
|||
|
; BE (L3) temp2
|
|||
|
; L6 trapmask
|
|||
|
; S1 Puffer
|
|||
|
send_and_receive_kwp2000: AW AW AW AE VX
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
move BD,#0 ; BusyCount = 0 ( high )
|
|||
|
move BC,<5> ; BusyCount = Wiederholzaehler
|
|||
|
adds I6,#1 ; BusyCount = BusyCount + 1
|
|||
|
%1a: clear <1> ; antwort loeschen
|
|||
|
clear <3> ; daten loeschen
|
|||
|
xsend <1>,<2> ; senden
|
|||
|
slen I3,<2> ; datalen_auftrag = datalen(auftrag)
|
|||
|
slen I4,<1> ; datalen_antwort = datalen(antwort)
|
|||
|
comp I4,#0 ; datalen_antwort == 0 ?
|
|||
|
jz %endnio ; ja -> Fehler
|
|||
|
|
|||
|
move S1,<4>
|
|||
|
scmp S1,"" ; RESULT <4> == "" ?
|
|||
|
jz %1 ; ja -> goto %1
|
|||
|
etag %1,<4> ; wenn RESULT <4> angefordert
|
|||
|
ergy <4>,<1> ; antwort nach RESULT <4>
|
|||
|
|
|||
|
%1: move B2,#3 ; offset = 3
|
|||
|
move B0,<1>[#0] ; temp = antwort[0]
|
|||
|
and B0,#$C0 ; temp = temp & 0xC0
|
|||
|
comp B0,#0 ; temp == 0 ?
|
|||
|
jnz %2 ; nein -> goto %2
|
|||
|
move B2,#1 ; offset = 1
|
|||
|
|
|||
|
%2: move I2,<1>[#0] ; len = antwort[0]
|
|||
|
and I2,#$3F ; len = len & 0x3F
|
|||
|
comp I2,#0 ; len == 0 ?
|
|||
|
jnz %3 ; nein -> goto %3
|
|||
|
move I2,<1>[B2] ; len = antwort[offset]
|
|||
|
and I2,#$FF ; len = len & 0xFF
|
|||
|
adds B2,#1 ; offset = offset + 1
|
|||
|
|
|||
|
%3: move I5,#1 ; len_check = 1 ( Checksumme )
|
|||
|
adds BA,B2 ; len_check = len_check + offset
|
|||
|
adds I5,I2 ; len_check = len_check + len
|
|||
|
comp I5,I4 ; len_check == datalen_antwort ?
|
|||
|
jz %4 ; ja -> goto %4
|
|||
|
ergs "JOB_STATUS","ERROR_ECU_INCORRECT_LEN"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%4: move <3>,<1>[B2]I2 ; daten=antwort[offset] len
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "JobResult" ; tabset("JobResult")
|
|||
|
jt %nio_table,#10 ; Tabelle nicht gefunden ?
|
|||
|
comp <1>[B2],#$7F ; antwort[offset] == 0x7F ?
|
|||
|
jnz %5 ; nein -> goto %5
|
|||
|
|
|||
|
move B0,B2 ; temp = offset ( antwort )
|
|||
|
adds B0,#2 ; temp = temp + 2
|
|||
|
|
|||
|
comp I3,#0 ; datalen_auftrag == 0 ?
|
|||
|
jz %4a ; ja -> goto %4a
|
|||
|
|
|||
|
move BE,<2>[#0] ; temp2 = auftrag[0]
|
|||
|
and BE,#$C0 ; temp2 = temp2 & 0xC0
|
|||
|
comp BE,#$C0 ; temp2 == 0xC0 ?
|
|||
|
jz %4a ; ja -> goto %4a
|
|||
|
|
|||
|
comp <1>[B0],#$21 ; NegResponseCode == BusyRepeatRequest ?
|
|||
|
jz %4c ; ja -> goto %4c
|
|||
|
comp <1>[B0],#$23 ; NegResponseCode == RoutineNotComplete ?
|
|||
|
jz %4c ; ja -> goto %4c
|
|||
|
jump %4a ; goto %4a
|
|||
|
|
|||
|
%4c: comp I6,#1 ; BusyCount == 1 ?
|
|||
|
jz %4b ; ja -> goto %4b
|
|||
|
wait #1 ; wait (1)
|
|||
|
|
|||
|
%4b: subb I6,#1 ; BusyCount --
|
|||
|
jnz %1a ; BusyCount > 0 -> goto %1a
|
|||
|
|
|||
|
%4a: fix2hex S1,<1>[B0] ;
|
|||
|
tabseek "SB",S1 ; tab_suche_index("SB",antwort[offset+2])
|
|||
|
tabget S1,"STATUS_TEXT" ;
|
|||
|
ergs "JOB_STATUS",S1 ;
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%5: comp I3,#0 ; datalen_auftrag == 0 ?
|
|||
|
jz %8 ; ja -> goto %8
|
|||
|
|
|||
|
move B3,#3 ; PosSID = 3
|
|||
|
move B0,<2>[#0] ; temp = auftrag[0]
|
|||
|
and B0,#$C0 ; temp = temp & 0xC0
|
|||
|
comp B0,#0 ; temp == 0 ?
|
|||
|
jnz %6 ; nein -> goto %6
|
|||
|
move B3,#1 ; PosSID = 1
|
|||
|
|
|||
|
%6: move B0,<2>[#0] ; temp = auftrag[0]
|
|||
|
and B0,#$3F ; temp = temp & 0x3F
|
|||
|
comp B0,#0 ; temp == 0 ?
|
|||
|
jnz %7 ; nein -> goto %7
|
|||
|
adds B3,#1 ; PosSID = PosSID + 1
|
|||
|
|
|||
|
%7: move B1,<2>[B3] ; SID = auftrag[PosSID]
|
|||
|
adds B1,#$40 ; SID = SID + 0x40
|
|||
|
comp <1>[B2],B1 ; antwort[offset] == SID ?
|
|||
|
jz %8 ; ja -> goto %8
|
|||
|
ergs "JOB_STATUS","ERROR_ECU_INCORRECT_RESPONSE_ID"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%8: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_table: push #0.L ; FALSE
|
|||
|
ergs "JOB_MESSAGE","Table JobResult not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %end
|
|||
|
|
|||
|
%endnio: push #0.L ; FALSE
|
|||
|
%end: settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; send_and_receive_kwp2000_star(Antwort, Auftrag, Daten, ResultName, Wiederholzaehler)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; B0 (L0) temp
|
|||
|
; B1 (L0) SID
|
|||
|
; B2 (L0) offset antwort
|
|||
|
; B3 (L0) PosSID auftrag
|
|||
|
; I2 (L1) len antwort
|
|||
|
; I3 (L1) datalen_auftrag
|
|||
|
; I4 (L2) datalen_antwort
|
|||
|
; I5 (L2) len_check
|
|||
|
; I6 (L3) BusyCount
|
|||
|
; BE (L3) temp2
|
|||
|
; L6 trapmask
|
|||
|
; S1 Puffer
|
|||
|
send_and_receive_kwp2000_star: AW AW AW AE VX
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
move BD,#0 ; BusyCount = 0 ( high )
|
|||
|
move BC,<5> ; BusyCount = Wiederholzaehler
|
|||
|
adds I6,#1 ; BusyCount = BusyCount + 1
|
|||
|
%1a: clear <1> ; antwort loeschen
|
|||
|
clear <3> ; daten loeschen
|
|||
|
xsend <1>,<2> ; senden
|
|||
|
slen I3,<2> ; datalen_auftrag = datalen(auftrag)
|
|||
|
slen I4,<1> ; datalen_antwort = datalen(antwort)
|
|||
|
comp I4,#0 ; datalen_antwort == 0 ?
|
|||
|
jz %endnio ; ja -> Fehler
|
|||
|
|
|||
|
move S1,<4>
|
|||
|
scmp S1,"" ; RESULT <4> == "" ?
|
|||
|
jz %1 ; ja -> goto %1
|
|||
|
etag %1,<4> ; wenn RESULT <4> angefordert
|
|||
|
ergy <4>,<1> ; antwort nach RESULT <4>
|
|||
|
|
|||
|
%1: move B2,#3 ; offset = 3
|
|||
|
; move B0,<1>[#0] ; temp = antwort[0]
|
|||
|
; and B0,#$C0 ; temp = temp & 0xC0
|
|||
|
; comp B0,#0 ; temp == 0 ?
|
|||
|
; jnz %2 ; nein -> goto %2
|
|||
|
; move B2,#1 ; offset = 1
|
|||
|
|
|||
|
;%2: move I2,<1>[#0] ; len = antwort[0]
|
|||
|
; and I2,#$3F ; len = len & 0x3F
|
|||
|
; comp I2,#0 ; len == 0 ?
|
|||
|
; jnz %3 ; nein -> goto %3
|
|||
|
move I2,<1>[B2] ; len = antwort[offset]
|
|||
|
and I2,#$FF ; len = len & 0xFF
|
|||
|
adds B2,#1 ; offset = offset + 1
|
|||
|
|
|||
|
%3: move I5,#1 ; len_check = 1 ( Checksumme )
|
|||
|
adds BA,B2 ; len_check = len_check + offset
|
|||
|
adds I5,I2 ; len_check = len_check + len
|
|||
|
comp I5,I4 ; len_check == datalen_antwort ?
|
|||
|
jz %4 ; ja -> goto %4
|
|||
|
ergs "JOB_STATUS","ERROR_ECU_INCORRECT_LEN"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%4: move <3>,<1>[B2]I2 ; daten=antwort[offset] len
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "JobResult" ; tabset("JobResult")
|
|||
|
jt %nio_table,#10 ; Tabelle nicht gefunden ?
|
|||
|
comp <1>[B2],#$7F ; antwort[offset] == 0x7F ?
|
|||
|
jnz %5 ; nein -> goto %5
|
|||
|
|
|||
|
move B0,B2 ; temp = offset ( antwort )
|
|||
|
adds B0,#2 ; temp = temp + 2
|
|||
|
|
|||
|
comp I3,#0 ; datalen_auftrag == 0 ?
|
|||
|
jz %4a ; ja -> goto %4a
|
|||
|
|
|||
|
; move BE,<2>[#0] ; temp2 = auftrag[0]
|
|||
|
; and BE,#$C0 ; temp2 = temp2 & 0xC0
|
|||
|
; comp BE,#$C0 ; temp2 == 0xC0 ?
|
|||
|
; jz %4a ; ja -> goto %4a
|
|||
|
|
|||
|
comp <1>[B0],#$21 ; NegResponseCode == BusyRepeatRequest ?
|
|||
|
jz %4c ; ja -> goto %4c
|
|||
|
comp <1>[B0],#$23 ; NegResponseCode == RoutineNotComplete ?
|
|||
|
jz %4c ; ja -> goto %4c
|
|||
|
jump %4a ; goto %4a
|
|||
|
|
|||
|
%4c: comp I6,#1 ; BusyCount == 1 ?
|
|||
|
jz %4b ; ja -> goto %4b
|
|||
|
wait #1 ; wait (1)
|
|||
|
|
|||
|
%4b: subb I6,#1 ; BusyCount --
|
|||
|
jnz %1a ; BusyCount > 0 -> goto %1a
|
|||
|
|
|||
|
%4a: fix2hex S1,<1>[B0] ;
|
|||
|
tabseek "SB",S1 ; tab_suche_index("SB",antwort[offset+2])
|
|||
|
tabget S1,"STATUS_TEXT" ;
|
|||
|
ergs "JOB_STATUS",S1 ;
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%5: comp I3,#0 ; datalen_auftrag == 0 ?
|
|||
|
jz %8 ; ja -> goto %8
|
|||
|
|
|||
|
move B3,#3 ; PosSID = 3
|
|||
|
; move B0,<2>[#0] ; temp = auftrag[0]
|
|||
|
; and B0,#$C0 ; temp = temp & 0xC0
|
|||
|
; comp B0,#0 ; temp == 0 ?
|
|||
|
; jnz %6 ; nein -> goto %6
|
|||
|
; move B3,#1 ; PosSID = 1
|
|||
|
|
|||
|
;%6: move B0,<2>[#0] ; temp = auftrag[0]
|
|||
|
; and B0,#$3F ; temp = temp & 0x3F
|
|||
|
; comp B0,#0 ; temp == 0 ?
|
|||
|
; jnz %7 ; nein -> goto %7
|
|||
|
adds B3,#1 ; PosSID = PosSID + 1
|
|||
|
|
|||
|
%7: move B1,<2>[B3] ; SID = auftrag[PosSID]
|
|||
|
adds B1,#$40 ; SID = SID + 0x40
|
|||
|
comp <1>[B2],B1 ; antwort[offset] == SID ?
|
|||
|
jz %8 ; ja -> goto %8
|
|||
|
ergs "JOB_STATUS","ERROR_ECU_INCORRECT_RESPONSE_ID"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%8: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_table: push #0.L ; FALSE
|
|||
|
ergs "JOB_MESSAGE","Table JobResult not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %end
|
|||
|
|
|||
|
%endnio: push #0.L ; FALSE
|
|||
|
%end: settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; send_and_receive_ds2(Antwort, Auftrag, Daten, ResultName, Wiederholzaehler)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; I2 (L1) len antwort
|
|||
|
; I3 (L1) datalen_auftrag
|
|||
|
; I4 (L2) datalen_antwort
|
|||
|
; I6 (L3) BusyCount
|
|||
|
; I7 (L3) temp
|
|||
|
; L6 trapmask
|
|||
|
; S1 Puffer
|
|||
|
send_and_receive_ds2: AW AW AW AE VX
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
move BD,#0 ; BusyCount = 0 ( high )
|
|||
|
move BC,<5> ; BusyCount = Wiederholzaehler
|
|||
|
adds I6,#1 ; BusyCount = BusyCount + 1
|
|||
|
%1: clear <1> ; antwort loeschen
|
|||
|
clear <3> ; daten loeschen
|
|||
|
xsend <1>,<2> ; senden
|
|||
|
slen I3,<2> ; datalen_auftrag = datalen(auftrag)
|
|||
|
slen I4,<1> ; datalen_antwort = datalen(antwort)
|
|||
|
comp I4,#0 ; datalen_antwort == 0 ?
|
|||
|
jz %endnio ; ja -> Fehler
|
|||
|
|
|||
|
move S1,<4>
|
|||
|
scmp S1,"" ; RESULT <4> == "" ?
|
|||
|
jz %2 ; ja -> goto %2
|
|||
|
etag %2,<4> ; wenn RESULT <4> angefordert
|
|||
|
ergy <4>,<1> ; antwort nach RESULT <4>
|
|||
|
|
|||
|
%2: move I2,<1>[#1] ; len = antwort[1]
|
|||
|
and I2,#$FF ; len = len & 0xFF
|
|||
|
comp I2,I4 ; len == datalen_antwort ?
|
|||
|
jz %3 ; ja -> goto %3
|
|||
|
ergs "JOB_STATUS","ERROR_ECU_INCORRECT_LEN"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%3: comp I2,#4 ; len >= 4 ?
|
|||
|
jge %4 ; ja -> goto %4
|
|||
|
ergs "JOB_STATUS","ERROR_ECU_INCORRECT_LEN"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%4: move I7,I2 ; temp=datalen_antwort
|
|||
|
subb I7,#4 ; temp=temp-4
|
|||
|
move <3>,<1>[#3]I7 ; daten=antwort[3] len-4
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "JobResult" ; tabset("JobResult")
|
|||
|
jt %nio_table,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
comp <1>[#2],#$A0 ; antwort[2] == Acknowledge ?
|
|||
|
jz %5 ; ja -> goto %5
|
|||
|
|
|||
|
comp I3,#0 ; datalen_auftrag == 0 ?
|
|||
|
jz %4a ; ja -> goto %4a
|
|||
|
|
|||
|
comp <1>[#2],#$A1 ; NegResponseCode == Busy ?
|
|||
|
jz %4c ; ja -> goto %4c
|
|||
|
jump %4a ; goto %4a
|
|||
|
|
|||
|
%4c: comp I6,#1 ; BusyCount == 1 ?
|
|||
|
jz %4b ; ja -> goto %4b
|
|||
|
wait #1 ; wait (1)
|
|||
|
|
|||
|
%4b: subb I6,#1 ; BusyCount --
|
|||
|
jnz %1 ; BusyCount > 0 -> goto %1
|
|||
|
|
|||
|
%4a: fix2hex S1,<1>[#2] ;
|
|||
|
tabseek "SB",S1 ; tab_suche_index("SB",antwort[2])
|
|||
|
tabget S1,"STATUS_TEXT" ;
|
|||
|
ergs "JOB_STATUS",S1 ;
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%5: comp I3,#0 ; datalen_auftrag == 0 ?
|
|||
|
push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_table: push #0.L ; FALSE
|
|||
|
ergs "JOB_MESSAGE","Table JobResult not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %end
|
|||
|
|
|||
|
%endnio: push #0.L ; FALSE
|
|||
|
%end: settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; decode_error_memory_kwp2000(Daten, FehlerIndex, AnzahlBytesProFehler)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L6 , IC , A8 Temp
|
|||
|
; I9 , A2 Fart
|
|||
|
; I8 Fcode
|
|||
|
; L5 trapmask
|
|||
|
; L7 FehlerIndex * AnzahlBytesProFehler + 2
|
|||
|
; S1 Puffer
|
|||
|
decode_error_memory_kwp2000: AX VX VX
|
|||
|
gettmr L5 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
move L6,<3> ; Anzahl nach Temp
|
|||
|
move L7,<2>
|
|||
|
mult L7,L6 ; Index = Fehlerindex * Anzahl Bytes Pro Fehler
|
|||
|
adds L7,#2.L ; Index = Index + 2
|
|||
|
|
|||
|
move L6,L7 ; Temp = Index
|
|||
|
move A1,<1>[L6] ; FCode (High) = daten(2 + Index)
|
|||
|
adds L6,#1.L ; Temp = Temp + 1
|
|||
|
move A0,<1>[L6] ; FCode (Low ) = daten(3 + Index)
|
|||
|
adds L6,#1.L ; Temp = Temp + 1
|
|||
|
move I9,#0 ; Fart = 0
|
|||
|
move A2,<1>[L6] ; Fart = daten(4 + Index)
|
|||
|
|
|||
|
etag %1,"F_HEX_CODE" ; if (F_HEX_CODE)
|
|||
|
clear S1 ; dataclear ( Puffer )
|
|||
|
move S1,<1>[L7]<3> ; Puffer = daten[2 +Index] len
|
|||
|
ergy "F_HEX_CODE",S1 ; F_HEX_CODE=Puffer
|
|||
|
|
|||
|
%1: etag %2,"F_ORT_NR" ; if (F_ORT_NR)
|
|||
|
move L6,#0 ; Temp = 0
|
|||
|
move IC,I8 ; Temp = FCode
|
|||
|
ergl "F_ORT_NR",L6 ; F_ORT_NR = Temp
|
|||
|
|
|||
|
%2: etag %3,"F_ORT_TEXT" ; if (F_ORT_TEXT)
|
|||
|
tabset "FOrtTexte" ; tabset("FOrtTexte")
|
|||
|
jt %nio_1,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
fix2hex S1,I8 ; itoax(Puffer,Fcode) --> 0x1234
|
|||
|
tabseek "ORT",S1 ; tabseek("ORT",Puffer)
|
|||
|
tabget S1,"ORTTEXT" ; tabget(Puffer,"ORTTEXT")
|
|||
|
ergs "F_ORT_TEXT",S1 ; F_ORT_TEXT=Puffer
|
|||
|
|
|||
|
%3: etag %3a,"F_SYMPTOM_NR" ; if (F_SYMPTOM_NR)
|
|||
|
jump %3b ; Weiter
|
|||
|
%3a: etag %6,"F_SYMPTOM_TEXT" ; if (F_SYMPTOM_TEXT)
|
|||
|
|
|||
|
%3b: tabset "FDetailStruktur" ; tabset("FDetailStruktur")
|
|||
|
jt %4 ; Tabelle nicht gefunden ? Weiter mit normaler Interpretation
|
|||
|
; jt %nio_3,#10 ; Tabelle nicht gefunden ? Fehlermeldung
|
|||
|
|
|||
|
move S1, "F_ART_IND"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_ART_IND")
|
|||
|
jz %4 ; nicht gefunden ?
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6A ; Puffer[0] = 'j'=6A
|
|||
|
jz %5a ; Wenn 'j'
|
|||
|
comp S1[#0],#$79 ; Puffer[0] = 'y'=79
|
|||
|
jz %5a ; Wenn 'y'
|
|||
|
jump %4 ; Weiter mit normaler Interpretation
|
|||
|
|
|||
|
%5a: tabset "FArtTyp" ; tabset("FArtTyp")
|
|||
|
jt %nio_4,#10 ; Tabelle nicht gefunden ?
|
|||
|
fix2hex S1,I8 ; itoax(Puffer,Fcode) --> 0x1234
|
|||
|
tabseek "ORT",S1 ; tabseek("ORT",Puffer)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
and IC,#$F ; Temp =Temp & 0x0F
|
|||
|
|
|||
|
comp IC,#$00 ; Bit gesetzt
|
|||
|
jnz %5b ; Wenn nicht gleich
|
|||
|
move S1, "0x0000" ; Wenn keine Spalte zuordenbar und Wert 0
|
|||
|
jump %5g ; Weiter
|
|||
|
|
|||
|
%5b: comp IC,#$01 ; Bit gesetzt ?
|
|||
|
jnz %5c ; Wenn nicht gleich
|
|||
|
tabget S1, "MAX" ; tabget(Puffer,"MAX")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5c: comp IC,#$02 ; Bit gesetzt ?
|
|||
|
jnz %5d ; Wenn nicht gleich
|
|||
|
tabget S1, "MIN" ; tabget(Puffer,"MIN")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5d: comp IC,#$04 ; Bit gesetzt ?
|
|||
|
jnz %5e ; Wenn nicht gleich
|
|||
|
tabget S1, "SIG" ; tabget(Puffer,"SIG")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5e: comp IC,#$08 ; Bit gesetzt ?
|
|||
|
jnz %5f ; Wenn nicht gleich
|
|||
|
tabget S1, "PLAUS" ; tabget(Puffer,"PLAUS")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5f: move S1, "0xFFFF" ; Wenn keine Spalte zuordenbar und Wert nicht g<>ltig
|
|||
|
jump %5g ; Weiter
|
|||
|
|
|||
|
%5g: etag %5h,"F_SYMPTOM_NR" ; if (F_SYMPTOM_NR)
|
|||
|
a2fix IC,S1 ; atoi(Puffer)
|
|||
|
ergw "F_SYMPTOM_NR",IC ; F_SYMPTOM_NR=Temp
|
|||
|
|
|||
|
%5h: etag %6,"F_SYMPTOM_TEXT" ; if (F_SYMPTOM_TEXT)
|
|||
|
|
|||
|
tabset "FArtTexteIndividuell" ; tabset("FArtTexteIndividuell")
|
|||
|
jt %nio_5,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_SYMPTOM_TEXT",S1 ; F_SYMPTOM_TEXT=Puffer
|
|||
|
jump %6 ; weiter mit readyness
|
|||
|
|
|||
|
%4: clrt ; Trapregister l<>schen
|
|||
|
tabset "FArtTexte" ; tabset("FArtTexte")
|
|||
|
jt %nio_2,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
etag %5,"F_SYMPTOM_NR" ; if (F_SYMPTOM_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
and IC,#$F ; Temp =Temp & 0x0F
|
|||
|
ergw "F_SYMPTOM_NR",IC ; F_SYMPTOM_NR=Temp
|
|||
|
|
|||
|
%5: etag %6,"F_SYMPTOM_TEXT" ; if (F_SYMPTOM_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
and IC,#$F ; Temp =Temp & 0x0F
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_SYMPTOM_TEXT",S1 ; F_SYMPTOM_TEXT=Puffer
|
|||
|
|
|||
|
%6: tabset "FArtTexte" ; tabset("FArtTexte")
|
|||
|
jt %nio_2,#10 ; Tabelle nicht gefunden ?
|
|||
|
etag %7,"F_READY_NR" ; if (F_READY_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#4 ; Temp = Temp >> 4
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$10 ; Temp = Temp + 0x10
|
|||
|
ergi "F_READY_NR",IC ; F_READY_NR=Temp
|
|||
|
|
|||
|
%7: etag %8,"F_READY_TEXT" ; if (F_READY_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#4 ; Temp = Temp >> 4
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$10 ; Temp = Temp + 0x10
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_READY_TEXT",S1 ; F_READY_TEXT=Puffer
|
|||
|
|
|||
|
%8: etag %9,"F_VORHANDEN_NR" ; if (F_VORHANDEN_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#5 ; Temp = Temp >> 5
|
|||
|
and IC,#3 ; Temp = Temp & 0x03
|
|||
|
adds IC,#$20 ; Temp = Temp + 0x20
|
|||
|
ergi "F_VORHANDEN_NR",IC ; F_VORHANDEN_NR=Temp
|
|||
|
|
|||
|
%9: etag %10,"F_VORHANDEN_TEXT" ; if (F_VORHANDEN_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#5 ; Temp = Temp >> 5
|
|||
|
and IC,#3 ; Temp = Temp & 0x03
|
|||
|
adds IC,#$20 ; Temp = Temp + 0x20
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_VORHANDEN_TEXT",S1 ; F_VORHANDEN_TEXT=Puffer
|
|||
|
|
|||
|
%10: etag %11,"F_WARNUNG_NR" ; if (F_WARNUNG_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#7 ; Temp = Temp >> 7
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$30 ; Temp = Temp + 0x30
|
|||
|
ergi "F_WARNUNG_NR",IC ; F_WARNUNG_NR=Temp
|
|||
|
|
|||
|
%11: etag %12,"F_WARNUNG_TEXT" ; if (F_WARNUNG_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#7 ; Temp = Temp >> 7
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$30 ; Temp = Temp + 0x30
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_WARNUNG_TEXT",S1 ; F_WARNUNG_TEXT=Puffer
|
|||
|
|
|||
|
%12: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_1: ergs "JOB_MESSAGE","Table FOrtTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_2: ergs "JOB_MESSAGE","Table FArtTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_3: ergs "JOB_MESSAGE","Table FDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_4: ergs "JOB_MESSAGE","Table FArtTyp not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_5: ergs "JOB_MESSAGE","Table FArtTexteIndividuell not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_table: ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: clrt ; Trapregister l<>schen
|
|||
|
settmr L5 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; decode_shadow_memory_kwp2000(Daten, Position, AnzahlBytesProFehler)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L6 , IC , A8 Temp
|
|||
|
; I9 , A2 Fart
|
|||
|
; I8 Fcode
|
|||
|
; L5 trapmask
|
|||
|
; L7 position
|
|||
|
; S1 Puffer
|
|||
|
decode_shadow_memory_kwp2000: AX VX VX
|
|||
|
gettmr L5 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
move L7,<2> ; position = Position
|
|||
|
|
|||
|
move L6,L7 ; Temp = position
|
|||
|
move A1,<1>[L6] ; FCode (High) = daten(position)
|
|||
|
adds L6,#1.L ; Temp = Temp + 1
|
|||
|
move A0,<1>[L6] ; FCode (Low ) = daten(position+1)
|
|||
|
adds L6,#1.L ; Temp = Temp + 1
|
|||
|
move I9,#0 ; Fart = 0
|
|||
|
move A2,<1>[L6] ; Fart = daten(position+1)
|
|||
|
|
|||
|
etag %1,"F_HEX_CODE" ; if (F_HEX_CODE)
|
|||
|
clear S1 ; dataclear ( Puffer )
|
|||
|
move S1,<1>[L7]<3> ; Puffer = daten[Position] len
|
|||
|
ergy "F_HEX_CODE",S1 ; F_HEX_CODE=Puffer
|
|||
|
|
|||
|
%1: etag %2,"F_ORT_NR" ; if (F_ORT_NR)
|
|||
|
move L6,#0 ; Temp = 0
|
|||
|
move IC,I8 ; Temp = FCode
|
|||
|
ergl "F_ORT_NR",L6 ; F_ORT_NR = Temp
|
|||
|
|
|||
|
%2: etag %3,"F_ORT_TEXT" ; if (F_ORT_TEXT)
|
|||
|
tabset "IOrtTexte" ; tabset("IOrtTexte")
|
|||
|
jt %nio_1,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
fix2hex S1,I8 ; itoax(Puffer,Fcode) --> 0x1234
|
|||
|
tabseek "ORT",S1 ; tabseek("ORT",Puffer)
|
|||
|
tabget S1,"ORTTEXT" ; tabget(Puffer,"ORTTEXT")
|
|||
|
ergs "F_ORT_TEXT",S1 ; F_ORT_TEXT=Puffer
|
|||
|
|
|||
|
%3: etag %3a,"F_SYMPTOM_NR" ; if (F_SYMPTOM_NR)
|
|||
|
jump %3b ; Weiter
|
|||
|
%3a: etag %6,"F_SYMPTOM_TEXT" ; if (F_SYMPTOM_TEXT)
|
|||
|
|
|||
|
%3b: tabset "IDetailStruktur" ; tabset("IDetailStruktur")
|
|||
|
jt %4 ; Tabelle nicht gefunden ? Weiter mit normaler Interpretation
|
|||
|
; jt %nio_3,#10 ; Tabelle nicht gefunden ? Fehlermeldung
|
|||
|
|
|||
|
move S1, "F_ART_IND"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_ART_IND")
|
|||
|
jz %4 ; nicht gefunden ?
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6A ; Puffer[0] = 'j'=6A
|
|||
|
jz %5a ; Wenn 'j'
|
|||
|
comp S1[#0],#$79 ; Puffer[0] = 'y'=79
|
|||
|
jz %5a ; Wenn 'y'
|
|||
|
jump %4 ; Weiter mit normaler Interpretation
|
|||
|
|
|||
|
%5a: tabset "IArtTyp" ; tabset("IArtTyp")
|
|||
|
jt %nio_4,#10 ; Tabelle nicht gefunden ?
|
|||
|
fix2hex S1,I8 ; itoax(Puffer,Fcode) --> 0x1234
|
|||
|
tabseek "ORT",S1 ; tabseek("ORT",Puffer)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
and IC,#$F ; Temp =Temp & 0x0F
|
|||
|
|
|||
|
comp IC,#$00 ; Bit gesetzt
|
|||
|
jnz %5b ; Wenn nicht gleich
|
|||
|
move S1, "0x0000" ; Wenn keine Spalte zuordenbar und Wert 0
|
|||
|
jump %5g ; Weiter
|
|||
|
|
|||
|
%5b: comp IC,#$01 ; Bit gesetzt ?
|
|||
|
jnz %5c ; Wenn nicht gleich
|
|||
|
tabget S1, "MAX" ; tabget(Puffer,"MAX")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5c: comp IC,#$02 ; Bit gesetzt ?
|
|||
|
jnz %5d ; Wenn nicht gleich
|
|||
|
tabget S1, "MIN" ; tabget(Puffer,"MIN")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5d: comp IC,#$04 ; Bit gesetzt ?
|
|||
|
jnz %5e ; Wenn nicht gleich
|
|||
|
tabget S1, "SIG" ; tabget(Puffer,"SIG")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5e: comp IC,#$08 ; Bit gesetzt ?
|
|||
|
jnz %5f ; Wenn nicht gleich
|
|||
|
tabget S1, "PLAUS" ; tabget(Puffer,"PLAUS")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5f: move S1, "0xFFFF" ; Wenn keine Spalte zuordenbar und Wert nicht g<>ltig
|
|||
|
jump %5g ; Weiter
|
|||
|
|
|||
|
%5g: etag %5h,"F_SYMPTOM_NR" ; if (F_SYMPTOM_NR)
|
|||
|
a2fix IC,S1 ; atoi(Puffer)
|
|||
|
ergw "F_SYMPTOM_NR",IC ; F_SYMPTOM_NR=Temp
|
|||
|
|
|||
|
%5h: etag %6,"F_SYMPTOM_TEXT" ; if (F_SYMPTOM_TEXT)
|
|||
|
|
|||
|
tabset "IArtTexteIndividuell" ; tabset("IArtTexteIndividuell")
|
|||
|
jt %nio_5,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_SYMPTOM_TEXT",S1 ; F_SYMPTOM_TEXT=Puffer
|
|||
|
jump %6 ; weiter mit readyness
|
|||
|
|
|||
|
%4: clrt ; Trapregister l<>schen
|
|||
|
tabset "IArtTexte" ; tabset("IArtTexte")
|
|||
|
jt %nio_2,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
etag %5,"F_SYMPTOM_NR" ; if (F_SYMPTOM_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
and IC,#$F ; Temp =Temp & 0x0F
|
|||
|
ergw "F_SYMPTOM_NR",IC ; F_SYMPTOM_NR=Temp
|
|||
|
|
|||
|
%5: etag %6,"F_SYMPTOM_TEXT" ; if (F_SYMPTOM_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
and IC,#$F ; Temp =Temp & 0x0F
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_SYMPTOM_TEXT",S1 ; F_SYMPTOM_TEXT=Puffer
|
|||
|
|
|||
|
%6: tabset "IArtTexte" ; tabset("IArtTexte")
|
|||
|
jt %nio_2,#10 ; Tabelle nicht gefunden ?
|
|||
|
etag %7,"F_READY_NR" ; if (F_READY_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#4 ; Temp = Temp >> 4
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$10 ; Temp = Temp + 0x10
|
|||
|
ergi "F_READY_NR",IC ; F_READY_NR=Temp
|
|||
|
|
|||
|
%7: etag %8,"F_READY_TEXT" ; if (F_READY_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#4 ; Temp = Temp >> 4
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$10 ; Temp = Temp + 0x10
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_READY_TEXT",S1 ; F_READY_TEXT=Puffer
|
|||
|
|
|||
|
%8: etag %9,"F_VORHANDEN_NR" ; if (F_VORHANDEN_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#5 ; Temp = Temp >> 5
|
|||
|
and IC,#3 ; Temp = Temp & 0x03
|
|||
|
adds IC,#$20 ; Temp = Temp + 0x20
|
|||
|
ergi "F_VORHANDEN_NR",IC ; F_VORHANDEN_NR=Temp
|
|||
|
|
|||
|
%9: etag %10,"F_VORHANDEN_TEXT" ; if (F_VORHANDEN_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#5 ; Temp = Temp >> 5
|
|||
|
and IC,#3 ; Temp = Temp & 0x03
|
|||
|
adds IC,#$20 ; Temp = Temp + 0x20
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_VORHANDEN_TEXT",S1 ; F_VORHANDEN_TEXT=Puffer
|
|||
|
|
|||
|
%10: etag %11,"F_WARNUNG_NR" ; if (F_WARNUNG_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#7 ; Temp = Temp >> 7
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$30 ; Temp = Temp + 0x30
|
|||
|
ergi "F_WARNUNG_NR",IC ; F_WARNUNG_NR=Temp
|
|||
|
|
|||
|
%11: etag %12,"F_WARNUNG_TEXT" ; if (F_WARNUNG_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#7 ; Temp = Temp >> 7
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$30 ; Temp = Temp + 0x30
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_WARNUNG_TEXT",S1 ; F_WARNUNG_TEXT=Puffer
|
|||
|
|
|||
|
%12: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_1: ergs "JOB_MESSAGE","Table IOrtTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_2: ergs "JOB_MESSAGE","Table IArtTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_3: ergs "JOB_MESSAGE","Table IDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_4: ergs "JOB_MESSAGE","Table IArtTyp not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_5: ergs "JOB_MESSAGE","Table IArtTexteIndividuell not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_table: ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: clrt ; Trapregister l<>schen
|
|||
|
settmr L5 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; decode_history_memory_kwp2000(Daten, Position, AnzahlBytesProFehler)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L6 , IC , A8 Temp
|
|||
|
; I9 , A2 Fart
|
|||
|
; I8 Fcode
|
|||
|
; L5 trapmask
|
|||
|
; L7 position
|
|||
|
; S1 Puffer
|
|||
|
decode_history_memory_kwp2000: AX VX VX
|
|||
|
gettmr L5 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
move L7,<2> ; position = Position
|
|||
|
|
|||
|
move L6,L7 ; Temp = position
|
|||
|
move A1,<1>[L6] ; FCode (High) = daten(position)
|
|||
|
adds L6,#1.L ; Temp = Temp + 1
|
|||
|
move A0,<1>[L6] ; FCode (Low ) = daten(position+1)
|
|||
|
adds L6,#1.L ; Temp = Temp + 1
|
|||
|
move I9,#0 ; Fart = 0
|
|||
|
move A2,<1>[L6] ; Fart = daten(position+1)
|
|||
|
|
|||
|
etag %1,"F_HEX_CODE" ; if (F_HEX_CODE)
|
|||
|
clear S1 ; dataclear ( Puffer )
|
|||
|
move S1,<1>[L7]<3> ; Puffer = daten[Position] len
|
|||
|
ergy "F_HEX_CODE",S1 ; F_HEX_CODE=Puffer
|
|||
|
|
|||
|
%1: etag %2,"F_ORT_NR" ; if (F_ORT_NR)
|
|||
|
move L6,#0 ; Temp = 0
|
|||
|
move IC,I8 ; Temp = FCode
|
|||
|
ergl "F_ORT_NR",L6 ; F_ORT_NR = Temp
|
|||
|
|
|||
|
%2: etag %3,"F_ORT_TEXT" ; if (F_ORT_TEXT)
|
|||
|
tabset "HOrtTexte" ; tabset("HOrtTexte")
|
|||
|
jt %nio_1,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
fix2hex S1,I8 ; itoax(Puffer,Fcode) --> 0x1234
|
|||
|
tabseek "ORT",S1 ; tabseek("ORT",Puffer)
|
|||
|
tabget S1,"ORTTEXT" ; tabget(Puffer,"ORTTEXT")
|
|||
|
ergs "F_ORT_TEXT",S1 ; F_ORT_TEXT=Puffer
|
|||
|
|
|||
|
%3: etag %3a,"F_SYMPTOM_NR" ; if (F_SYMPTOM_NR)
|
|||
|
jump %3b ; Weiter
|
|||
|
%3a: etag %6,"F_SYMPTOM_TEXT" ; if (F_SYMPTOM_TEXT)
|
|||
|
|
|||
|
%3b: tabset "HDetailStruktur" ; tabset("HDetailStruktur")
|
|||
|
jt %4 ; Tabelle nicht gefunden ? Weiter mit normaler Interpretation
|
|||
|
; jt %nio_3,#10 ; Tabelle nicht gefunden ? Fehlermeldung
|
|||
|
|
|||
|
move S1, "F_ART_IND"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_ART_IND")
|
|||
|
jz %4 ; nicht gefunden ?
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6A ; Puffer[0] = 'j'=6A
|
|||
|
jz %5a ; Wenn 'j'
|
|||
|
comp S1[#0],#$79 ; Puffer[0] = 'y'=79
|
|||
|
jz %5a ; Wenn 'y'
|
|||
|
jump %4 ; Weiter mit normaler Interpretation
|
|||
|
|
|||
|
%5a: tabset "HArtTyp" ; tabset("HArtTyp")
|
|||
|
jt %nio_4,#10 ; Tabelle nicht gefunden ?
|
|||
|
fix2hex S1,I8 ; itoax(Puffer,Fcode) --> 0x1234
|
|||
|
tabseek "ORT",S1 ; tabseek("ORT",Puffer)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
and IC,#$F ; Temp =Temp & 0x0F
|
|||
|
|
|||
|
comp IC,#$00 ; Bit gesetzt
|
|||
|
jnz %5b ; Wenn nicht gleich
|
|||
|
move S1, "0x0000" ; Wenn keine Spalte zuordenbar und Wert 0
|
|||
|
jump %5g ; Weiter
|
|||
|
|
|||
|
%5b: comp IC,#$01 ; Bit gesetzt ?
|
|||
|
jnz %5c ; Wenn nicht gleich
|
|||
|
tabget S1, "MAX" ; tabget(Puffer,"MAX")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5c: comp IC,#$02 ; Bit gesetzt ?
|
|||
|
jnz %5d ; Wenn nicht gleich
|
|||
|
tabget S1, "MIN" ; tabget(Puffer,"MIN")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5d: comp IC,#$04 ; Bit gesetzt ?
|
|||
|
jnz %5e ; Wenn nicht gleich
|
|||
|
tabget S1, "SIG" ; tabget(Puffer,"SIG")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5e: comp IC,#$08 ; Bit gesetzt ?
|
|||
|
jnz %5f ; Wenn nicht gleich
|
|||
|
tabget S1, "PLAUS" ; tabget(Puffer,"PLAUS")
|
|||
|
jump %5g ; Tabellenspalte gefunden
|
|||
|
|
|||
|
%5f: move S1, "0xFFFF" ; Wenn keine Spalte zuordenbar und Wert nicht g<>ltig
|
|||
|
jump %5g ; Weiter
|
|||
|
|
|||
|
%5g: etag %5h,"F_SYMPTOM_NR" ; if (F_SYMPTOM_NR)
|
|||
|
a2fix IC,S1 ; atoi(Puffer)
|
|||
|
ergw "F_SYMPTOM_NR",IC ; F_SYMPTOM_NR=Temp
|
|||
|
|
|||
|
%5h: etag %6,"F_SYMPTOM_TEXT" ; if (F_SYMPTOM_TEXT)
|
|||
|
|
|||
|
tabset "HArtTexteIndividuell" ; tabset("HArtTexteIndividuell")
|
|||
|
jt %nio_5,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_SYMPTOM_TEXT",S1 ; F_SYMPTOM_TEXT=Puffer
|
|||
|
jump %6 ; weiter mit readyness
|
|||
|
|
|||
|
%4: clrt ; Trapregister l<>schen
|
|||
|
tabset "HArtTexte" ; tabset("HArtTexte")
|
|||
|
jt %nio_2,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
etag %5,"F_SYMPTOM_NR" ; if (F_SYMPTOM_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
and IC,#$F ; Temp =Temp & 0x0F
|
|||
|
ergw "F_SYMPTOM_NR",IC ; F_SYMPTOM_NR=Temp
|
|||
|
|
|||
|
%5: etag %6,"F_SYMPTOM_TEXT" ; if (F_SYMPTOM_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
and IC,#$F ; Temp =Temp & 0x0F
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_SYMPTOM_TEXT",S1 ; F_SYMPTOM_TEXT=Puffer
|
|||
|
|
|||
|
%6: tabset "HArtTexte" ; tabset("HArtTexte")
|
|||
|
jt %nio_2,#10 ; Tabelle nicht gefunden ?
|
|||
|
etag %7,"F_READY_NR" ; if (F_READY_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#4 ; Temp = Temp >> 4
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$10 ; Temp = Temp + 0x10
|
|||
|
ergi "F_READY_NR",IC ; F_READY_NR=Temp
|
|||
|
|
|||
|
%7: etag %8,"F_READY_TEXT" ; if (F_READY_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#4 ; Temp = Temp >> 4
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$10 ; Temp = Temp + 0x10
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_READY_TEXT",S1 ; F_READY_TEXT=Puffer
|
|||
|
|
|||
|
%8: etag %9,"F_VORHANDEN_NR" ; if (F_VORHANDEN_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#5 ; Temp = Temp >> 5
|
|||
|
and IC,#3 ; Temp = Temp & 0x03
|
|||
|
adds IC,#$20 ; Temp = Temp + 0x20
|
|||
|
ergi "F_VORHANDEN_NR",IC ; F_VORHANDEN_NR=Temp
|
|||
|
|
|||
|
%9: etag %10,"F_VORHANDEN_TEXT" ; if (F_VORHANDEN_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#5 ; Temp = Temp >> 5
|
|||
|
and IC,#3 ; Temp = Temp & 0x03
|
|||
|
adds IC,#$20 ; Temp = Temp + 0x20
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_VORHANDEN_TEXT",S1 ; F_VORHANDEN_TEXT=Puffer
|
|||
|
|
|||
|
%10: etag %11,"F_WARNUNG_NR" ; if (F_WARNUNG_NR)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#7 ; Temp = Temp >> 7
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$30 ; Temp = Temp + 0x30
|
|||
|
ergi "F_WARNUNG_NR",IC ; F_WARNUNG_NR=Temp
|
|||
|
|
|||
|
%11: etag %12,"F_WARNUNG_TEXT" ; if (F_WARNUNG_TEXT)
|
|||
|
move IC,I9 ; Temp = Fart
|
|||
|
lsr IC,#7 ; Temp = Temp >> 7
|
|||
|
and IC,#1 ; Temp = Temp & 0x01
|
|||
|
adds IC,#$30 ; Temp = Temp + 0x30
|
|||
|
fix2hex S1,A8 ; itoax(Puffer,Temp) --> 0x12
|
|||
|
tabseek "ARTNR",S1 ; tabseek("ARTNR",Puffer)
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer,"ARTTEXT")
|
|||
|
ergs "F_WARNUNG_TEXT",S1 ; F_WARNUNG_TEXT=Puffer
|
|||
|
|
|||
|
%12: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_1: ergs "JOB_MESSAGE","Table HOrtTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_2: ergs "JOB_MESSAGE","Table HArtTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_3: ergs "JOB_MESSAGE","Table HDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_4: ergs "JOB_MESSAGE","Table HArtTyp not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_5: ergs "JOB_MESSAGE","Table HArtTexteIndividuell not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_table: ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: clrt ; Trapregister l<>schen
|
|||
|
settmr L5 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; decode_error_memory_kwp2000_detail(Daten, Offset, UW_Erw, Max_UW_Satz)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L0 temp
|
|||
|
; L1 max_uw_satz
|
|||
|
; L2 datenlaenge
|
|||
|
; IA (L5) i
|
|||
|
; A6 (L5) n
|
|||
|
; A7 (L5) f_art_anz
|
|||
|
; L6 trapmask
|
|||
|
; L7 offset
|
|||
|
; S1 puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
decode_error_memory_kwp2000_detail: AX VW VW VW
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "FDetailStruktur"
|
|||
|
jt %nio_1,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
move L1,#3.L ; max_uw_satz = 3
|
|||
|
move L7,#5.L ; offset = 5
|
|||
|
slen L2,<1> ; datenlaenge = datalen(daten)
|
|||
|
move S1, "F_ART_ERW"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_ART_ERW")
|
|||
|
jz %nio_2 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %11 ; Wenn nicht 'n'
|
|||
|
|
|||
|
etag %21,"F_ART_ANZ" ; if (F_ART_ANZ)
|
|||
|
ergi "F_ART_ANZ",#0.I ; F_ART_ANZ=0
|
|||
|
jump %21 ; weiter mit F_P_CODE
|
|||
|
|
|||
|
%11: etag %19,"F_ART_ANZ" ; if (F_ART_ANZ)
|
|||
|
comp S1[#0],#$6A ; Puffer[0] = 'j'=6A
|
|||
|
jz %18 ; Wenn 'j'
|
|||
|
comp S1[#0],#$79 ; Puffer[0] = 'y'=79
|
|||
|
jz %18 ; Wenn 'y'
|
|||
|
|
|||
|
strlen L0,S1
|
|||
|
comp L0,#8 ; strlen(puffer)=8
|
|||
|
jnz %nio_3 ; Wenn nicht 8
|
|||
|
|
|||
|
move A7,#$30 ; f_art_anz='0'
|
|||
|
move IA,#0 ; i=0
|
|||
|
|
|||
|
%12: comp IA,#8 ; while
|
|||
|
jz %14
|
|||
|
|
|||
|
comp S1[IA],#$30 ; Puffer[i] = '0'=30
|
|||
|
jl %nio_3 ; Wenn kleiner '0'
|
|||
|
comp S1[IA],#$38 ; Puffer[i] = '8'=38
|
|||
|
jg %nio_3 ; Wenn groesser '8'
|
|||
|
|
|||
|
comp S1[IA],A7 ; Puffer[i] = Fart_anz
|
|||
|
jle %13 ; Fart_anz kleiner als Puffer
|
|||
|
move A7,S1[IA] ; Fart_anz = Puffer
|
|||
|
|
|||
|
%13: adds IA,#1.I ; i++
|
|||
|
jump %12 ; end while
|
|||
|
|
|||
|
%14: move I0,#0 ; temp=0
|
|||
|
move B0,A7 ; temp=f_art_anz
|
|||
|
subb B0,#$30 ; temp=temp-'0'
|
|||
|
ergi "F_ART_ANZ",I0 ; F_ART_ANZ=temp
|
|||
|
|
|||
|
move S1[#1000],S1[#0]#9 ; Maske nach hinten schieben
|
|||
|
|
|||
|
tabset "FArtTexteErweitert"
|
|||
|
jt %nio_4,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
move A6,#$31 ; n='1'
|
|||
|
%15: comp A6,A7 ; while
|
|||
|
jg %19
|
|||
|
|
|||
|
move S1,"xxxxxxxx" ; Puffer="xxxxxxxx"
|
|||
|
move IA,#0 ; i=0
|
|||
|
|
|||
|
%16: comp IA,#8 ; while
|
|||
|
jz %17
|
|||
|
|
|||
|
move I0,#1000 ; temp=1000 (Maskenoffset)
|
|||
|
adds I0,IA ; temp=temp+i
|
|||
|
comp S1[I0],A6 ; Puffer[temp]=n
|
|||
|
jnz %16a ; wenn nicht n
|
|||
|
|
|||
|
move I0,#7 ; temp=7
|
|||
|
subb I0,IA ; temp=temp-i
|
|||
|
|
|||
|
move B2,<1>[L7] ; temp2 = daten[offset]
|
|||
|
lsr B2,I0 ; temp2 >> temp
|
|||
|
and B2,#1 ; temp2 & 01
|
|||
|
adds B2,#$30 ; temp2 + '0'
|
|||
|
|
|||
|
move S1[IA],B2 ; Puffer[i]=temp2
|
|||
|
|
|||
|
%16a: adds IA,#1.I ; i++
|
|||
|
jump %16 ; end while
|
|||
|
|
|||
|
%17: tabseek "ARTMASKE",S1 ; tabseek("ARTMASKE",text)
|
|||
|
tabget S1,"ARTNR" ; tabget(Puffer, "ARTNR")
|
|||
|
a2fix L0,S1 ; temp=atoi(Puffer)
|
|||
|
move S1,"F_ARTi_NR" ; text="F_ARTi_NR"
|
|||
|
move S1[#5],A6 ; text[5]=temp
|
|||
|
ergl S1,L0 ; F_ARTi_NR=temp
|
|||
|
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer, "ARTTEXT")
|
|||
|
|
|||
|
strlen L0,S1 ; temp=strlen(S1)
|
|||
|
adds L0,#1 ; temp++
|
|||
|
comp L0,#500
|
|||
|
jg %nio_5 ; string zu lang ?
|
|||
|
|
|||
|
move S1[#500],S1[#0]L0 ; Arttext nach hinten schieben
|
|||
|
move S1,"F_ARTi_TEXT" ; text="F_ARTi_TEXT"
|
|||
|
move S1[#5],A6 ; text[5]=n
|
|||
|
ergs S1,S1[#500]L0 ; F_ARTi_TEXT=Puffer(L0)
|
|||
|
|
|||
|
adds A6,#1 ; n++
|
|||
|
jump %15 ; end while
|
|||
|
|
|||
|
%18: ergi "F_ART_ANZ",#1.I ; F_ART_ANZ=1
|
|||
|
move L0,#0 ; temp=0
|
|||
|
move B0,<1>[L7] ; Lowbyte = daten[offset]
|
|||
|
ergl "F_ART1_NR",L0 ; F_ART1_NR=temp
|
|||
|
ergs "F_ART1_TEXT","--"
|
|||
|
; jump %19
|
|||
|
|
|||
|
%19: adds L7,#1.L ; offset ++
|
|||
|
; jump %21 ; weiter mit F_P_CODE
|
|||
|
|
|||
|
%21: tabset "FDetailStruktur"
|
|||
|
move S1, "F_PCODE"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_PCODE")
|
|||
|
jz %21i ; nicht gefunden ?
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %21f ; Wenn nicht 'n'
|
|||
|
|
|||
|
%21i: etag %21h,"F_PCODE" ; if (F_PCODE)
|
|||
|
ergw "F_PCODE",#0.I ; F_PCODE = 0
|
|||
|
%21h: etag %21g,"F_PCODE_STRING" ; if (F_PCODE_STRING)
|
|||
|
ergs "F_PCODE_STRING","--" ; F_PCODE_STRING = "--"
|
|||
|
%21g: etag %210,"F_PCODE_TEXT" ; if (F_PCODE_TEXT)
|
|||
|
ergs "F_PCODE_TEXT","" ; F_PCODE_TEXT = ""
|
|||
|
jump %210 ; weiter mit F_PCODE7
|
|||
|
|
|||
|
%21f: move I1,<1>[L7] ; temp = daten[offset]
|
|||
|
move B0,B3 ; Tausche Highbyte-Lowbyte
|
|||
|
move B1,B2 ;
|
|||
|
|
|||
|
etag %21e,"F_PCODE" ; if (F_PCODE)
|
|||
|
ergw "F_PCODE",I0 ; F_PCODE = daten[offset]
|
|||
|
|
|||
|
%21e: etag %21d,"F_PCODE_STRING" ; if (F_PCODE_STRING)
|
|||
|
jump %21c ; ja
|
|||
|
%21d: etag %21b,"F_PCODE_TEXT" ; if (F_PCODE_TEXT)
|
|||
|
; jump %21c ; ja
|
|||
|
|
|||
|
%21c: tabsetex "PCodeTexte","T_PCOD" ; PCode Tabelle laden
|
|||
|
jt %nio_12,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
fix2hex S1,I0 ; itoax(Puffer,daten[offset]) --> 0x1234
|
|||
|
tabseek "PCODE",S1 ; tabseek("PCODE",Puffer)
|
|||
|
|
|||
|
etag %21b2,"F_PCODE_STRING" ; if (F_PCODE_STRING)
|
|||
|
tabget S1,"STRING" ; tabget(Puffer,"STRING")
|
|||
|
ergs "F_PCODE_STRING",S1 ; F_PCODE_STRING=Puffer
|
|||
|
|
|||
|
%21b2: etag %21b1,"F_PCODE_TEXT" ; if (F_PCODE_TEXT)
|
|||
|
tabget S1,"TEXT" ; tabget(Puffer,"TEXT")
|
|||
|
ergs "F_PCODE_TEXT",S1 ; F_PCODE_TEXT=Puffer
|
|||
|
|
|||
|
%21b1: tabset "FDetailStruktur" ; wieder zurueck
|
|||
|
|
|||
|
%21b: adds L7,#2.L ; offset = offset + 2
|
|||
|
; jump %210 ; weiter mit F_PCODE7
|
|||
|
|
|||
|
%210: tabset "FDetailStruktur"
|
|||
|
move S1, "F_PCODE7"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_PCODE7")
|
|||
|
jz %210i ; nicht gefunden ?
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %210f ; Wenn nicht 'n'
|
|||
|
|
|||
|
%210i: etag %210h,"F_PCODE7" ; if (F_PCODE7)
|
|||
|
ergw "F_PCODE7",#0.I ; F_PCODE7 = 0
|
|||
|
%210h: etag %210g,"F_PCODE7_STRING"; if (F_PCODE_STRING7)
|
|||
|
ergs "F_PCODE7_STRING","--" ; F_PCODE7_STRING = "--"
|
|||
|
%210g: etag %21a,"F_PCODE7_TEXT" ; if (F_PCODE7_TEXT)
|
|||
|
ergs "F_PCODE7_TEXT","" ; F_PCODE7_TEXT = ""
|
|||
|
jump %21a ; weiter mit F_HFK
|
|||
|
|
|||
|
%210f: move I1,<1>[L7] ; temp = daten[offset]
|
|||
|
move B0,B3 ; Tausche Highbyte-Lowbyte
|
|||
|
move B1,B2 ;
|
|||
|
|
|||
|
etag %210e,"F_PCODE7" ; if (F_PCODE)
|
|||
|
ergw "F_PCODE7",I0 ; F_PCODE7 = daten[offset]
|
|||
|
|
|||
|
%210e: etag %210d,"F_PCODE7_STRING"; if (F_PCODE7_STRING)
|
|||
|
jump %210c ; ja
|
|||
|
%210d: etag %210b,"F_PCODE7_TEXT" ; if (F_PCODE7_TEXT)
|
|||
|
; jump %210c ; ja
|
|||
|
|
|||
|
%210c: tabsetex "PCodeTexte","T_PCOD" ; PCode Tabelle laden
|
|||
|
jt %nio_12,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
fix2hex S1,I0 ; itoax(Puffer,daten[offset]) --> 0x1234
|
|||
|
tabseek "PCODE",S1 ; tabseek("PCODE",Puffer)
|
|||
|
|
|||
|
etag %210b2,"F_PCODE7_STRING" ; if (F_PCODE7_STRING)
|
|||
|
tabget S1,"STRING" ; tabget(Puffer,"STRING")
|
|||
|
ergs "F_PCODE7_STRING",S1 ; F_PCODE7_STRING=Puffer
|
|||
|
|
|||
|
%210b2: etag %210b1,"F_PCODE7_TEXT" ; if (F_PCODE7_TEXT)
|
|||
|
tabget S1,"TEXT" ; tabget(Puffer,"TEXT")
|
|||
|
ergs "F_PCODE7_TEXT",S1 ; F_PCODE7_TEXT=Puffer
|
|||
|
|
|||
|
%210b1: tabset "FDetailStruktur" ; wieder zurueck
|
|||
|
|
|||
|
%210b: adds L7,#2.L ; offset = offset + 2
|
|||
|
; jump %21a ; weiter mit F_HFK
|
|||
|
|
|||
|
%21a: move S1, "F_HFK"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_HFK")
|
|||
|
jz %nio_6 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %22 ; Wenn nicht 'n'
|
|||
|
etag %31,"F_HFK" ; if (F_HFK)
|
|||
|
ergi "F_HFK",#$FFFF.I ; F_HFK=-1
|
|||
|
jump %31 ; weiter mit F_LZ
|
|||
|
|
|||
|
%22: move B0,<1>[L7] ; Lowbyte = daten[offset]
|
|||
|
move B1,#0 ; Highbyte= 0
|
|||
|
comp B0,#1 ; F_HFK == 1 ?
|
|||
|
jnz %23 ; Wenn nicht 1
|
|||
|
move L1,#1.L ; max_uw_satz = 1
|
|||
|
%23: comp B0,#2 ; F_HFK == 2 ?
|
|||
|
jnz %24 ; Wenn nicht 2
|
|||
|
move L1,#2.L ; max_uw_satz = 2
|
|||
|
%24: etag %25,"F_HFK" ; if (F_HFK)
|
|||
|
ergi "F_HFK",I0 ; F_HFK=daten[offset]
|
|||
|
%25: adds L7,#1.L ; offset ++
|
|||
|
; jump %31 ; weiter mit F_LZ
|
|||
|
|
|||
|
%31: move S1, "F_LZ"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_LZ")
|
|||
|
jz %nio_7 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %32 ; Wenn nicht 'n'
|
|||
|
etag %41,"F_LZ" ; if (F_LZ)
|
|||
|
ergi "F_LZ",#$FFFF.I ; F_LZ=-1
|
|||
|
jump %41 ; weiter mit F_UWB_ERW
|
|||
|
|
|||
|
%32: etag %33,"F_LZ" ; if (F_LZ)
|
|||
|
move B0,<1>[L7] ; Lowbyte = daten[offset]
|
|||
|
move B1,#0 ; Highbyte= 0
|
|||
|
ergi "F_LZ",I0 ; F_LZ=daten[offset]
|
|||
|
%33: adds L7,#1.L ; offset ++
|
|||
|
; jump %41 ; weiter mit F_UWB_ERW
|
|||
|
|
|||
|
%41: move S1, "F_UWB_ERW"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_UWB_ERW")
|
|||
|
jz %nio_8 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %44 ; Wenn nicht 'n'
|
|||
|
|
|||
|
move IA,#0 ; i=0
|
|||
|
%42a: etag %42b,"F_UW_ANZ" ; if (F_UW_ANZ)
|
|||
|
ergi "F_UW_ANZ",#0.I ; F_UW_ANZ=0
|
|||
|
%42b: etag %43,"F_UW_KM" ; if (F_UW_KM)
|
|||
|
move I1,<1>[L7] ; temp = daten[offset]
|
|||
|
move B0,B3 ; Tausche Highbyte-Lowbyte
|
|||
|
move B1,B2 ;
|
|||
|
move I1,#0.I ; Setze Highword=0
|
|||
|
asl L0,#3.B ; 3 nach links schieben (*8)
|
|||
|
ergl "F_UW_KM",L0 ; F_UW_KM = daten[offset]
|
|||
|
|
|||
|
%43: move L0,L7 ; temp = offset
|
|||
|
adds L0,#2.L ; temp = temp +2 ( km )
|
|||
|
comp L2,L0 ; datenlaenge == temp
|
|||
|
jz %43a ; Wenn gleich dann fertig
|
|||
|
comp L2,L0 ; datenlaenge == temp
|
|||
|
jl %nio_11 ; Wenn kleiner dann Fehler
|
|||
|
|
|||
|
move L7,L0 ; offset = temp
|
|||
|
adds IA,#1 ; i = i + 1
|
|||
|
comp IA,#3 ; i == 3
|
|||
|
jge %nio_11 ; Fehler
|
|||
|
|
|||
|
enewset ; new_set_of_results()
|
|||
|
jump %42a ; naechster
|
|||
|
|
|||
|
%43a: enewset ; new_set_of_results()
|
|||
|
move <3>,#0.L ; UW_Erw = FALSE
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%44: move L0,L7 ; temp = offset
|
|||
|
adds L0,#2.L ; temp = temp +2 ( km )
|
|||
|
comp L2,L0 ; datenlaenge == temp
|
|||
|
jl %nio_11 ; Wenn kleiner
|
|||
|
|
|||
|
etag %45,"F_UW_KM" ; if (F_UW_KM)
|
|||
|
move <3>,#1.L ; UW_Erw = TRUE
|
|||
|
tabset "FUmweltMatrix"
|
|||
|
jt %nio_9,#10 ; Tabelle nicht gefunden ?
|
|||
|
tabset "FUmweltTexte"
|
|||
|
jt %nio_10,#10 ; Tabelle nicht gefunden ?
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%45: etag %46,"F_UW_ANZ" ; if (F_UW_ANZ)
|
|||
|
move <3>,#1.L ; UW_Erw = TRUE
|
|||
|
tabset "FUmweltMatrix"
|
|||
|
jt %nio_9,#10 ; Tabelle nicht gefunden ?
|
|||
|
tabset "FUmweltTexte"
|
|||
|
jt %nio_10,#10 ; Tabelle nicht gefunden ?
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%46: move <3>,#0.L ; UW_Erw = FALSE
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%endio: move <2>,L7 ; Offset = offset
|
|||
|
move <4>,L1 ; Max_UW_Satz = max_uw_satz
|
|||
|
push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_1: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table FDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_2: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_ART_ERW in table FDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_3: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_ART_ERW in table FDetailStruktur wrong format"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_4: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table FArtTexteErweitert not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_5: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","ARTTEXT in table FArtTexteErweitert string to long"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_6: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_HFK in table FDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_7: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_LZ in table FDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_8: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_UWB_ERW in table FDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_9: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table FUmweltMatrix not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_10: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table FUmweltTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_11: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Datalen not valid"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_12: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table PCodeTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_table: ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: clrt ; Trapregister l<>schen
|
|||
|
settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; decode_shadow_memory_kwp2000_detail(Daten, Offset, UW_Erw, Max_UW_Satz)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L0 temp
|
|||
|
; L1 max_uw_satz
|
|||
|
; L2 datenlaenge
|
|||
|
; IA (L5) i
|
|||
|
; A6 (L5) n
|
|||
|
; A7 (L5) f_art_anz
|
|||
|
; L6 trapmask
|
|||
|
; L7 offset
|
|||
|
; S1 puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
decode_shadow_memory_kwp2000_detail: AX VW VW VW
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "IDetailStruktur"
|
|||
|
jt %nio_1,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
move L1,#3.L ; max_uw_satz = 3
|
|||
|
move L7,<2> ; offset = Offset
|
|||
|
slen L2,<1> ; datenlaenge = datalen(daten)
|
|||
|
move S1, "F_ART_ERW"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_ART_ERW")
|
|||
|
jz %nio_2 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %11 ; Wenn nicht 'n'
|
|||
|
|
|||
|
etag %21,"F_ART_ANZ" ; if (F_ART_ANZ)
|
|||
|
ergi "F_ART_ANZ",#0.I ; F_ART_ANZ=0
|
|||
|
jump %21 ; weiter mit F_P_CODE
|
|||
|
|
|||
|
%11: etag %19,"F_ART_ANZ" ; if (F_ART_ANZ)
|
|||
|
comp S1[#0],#$6A ; Puffer[0] = 'j'=6A
|
|||
|
jz %18 ; Wenn 'j'
|
|||
|
comp S1[#0],#$79 ; Puffer[0] = 'y'=79
|
|||
|
jz %18 ; Wenn 'y'
|
|||
|
|
|||
|
strlen L0,S1
|
|||
|
comp L0,#8 ; strlen(puffer)=8
|
|||
|
jnz %nio_3 ; Wenn nicht 8
|
|||
|
|
|||
|
move A7,#$30 ; f_art_anz='0'
|
|||
|
move IA,#0 ; i=0
|
|||
|
|
|||
|
%12: comp IA,#8 ; while
|
|||
|
jz %14
|
|||
|
|
|||
|
comp S1[IA],#$30 ; Puffer[i] = '0'=30
|
|||
|
jl %nio_3 ; Wenn kleiner '0'
|
|||
|
comp S1[IA],#$38 ; Puffer[i] = '8'=38
|
|||
|
jg %nio_3 ; Wenn groesser '8'
|
|||
|
|
|||
|
comp S1[IA],A7 ; Puffer[i] = Fart_anz
|
|||
|
jle %13 ; Fart_anz kleiner als Puffer
|
|||
|
move A7,S1[IA] ; Fart_anz = Puffer
|
|||
|
|
|||
|
%13: adds IA,#1.I ; i++
|
|||
|
jump %12 ; end while
|
|||
|
|
|||
|
%14: move I0,#0 ; temp=0
|
|||
|
move B0,A7 ; temp=f_art_anz
|
|||
|
subb B0,#$30 ; temp=temp-'0'
|
|||
|
ergi "F_ART_ANZ",I0 ; F_ART_ANZ=temp
|
|||
|
|
|||
|
move S1[#1000],S1[#0]#9 ; Maske nach hinten schieben
|
|||
|
|
|||
|
tabset "IArtTexteErweitert"
|
|||
|
jt %nio_4,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
move A6,#$31 ; n='1'
|
|||
|
%15: comp A6,A7 ; while
|
|||
|
jg %19
|
|||
|
|
|||
|
move S1,"xxxxxxxx" ; Puffer="xxxxxxxx"
|
|||
|
move IA,#0 ; i=0
|
|||
|
|
|||
|
%16: comp IA,#8 ; while
|
|||
|
jz %17
|
|||
|
|
|||
|
move I0,#1000 ; temp=1000 (Maskenoffset)
|
|||
|
adds I0,IA ; temp=temp+i
|
|||
|
comp S1[I0],A6 ; Puffer[temp]=n
|
|||
|
jnz %16a ; wenn nicht n
|
|||
|
|
|||
|
move I0,#7 ; temp=7
|
|||
|
subb I0,IA ; temp=temp-i
|
|||
|
|
|||
|
move B2,<1>[L7] ; temp2 = daten[offset]
|
|||
|
lsr B2,I0 ; temp2 >> temp
|
|||
|
and B2,#1 ; temp2 & 01
|
|||
|
adds B2,#$30 ; temp2 + '0'
|
|||
|
|
|||
|
move S1[IA],B2 ; Puffer[i]=temp2
|
|||
|
|
|||
|
%16a: adds IA,#1.I ; i++
|
|||
|
jump %16 ; end while
|
|||
|
|
|||
|
%17: tabseek "ARTMASKE",S1 ; tabseek("ARTMASKE",text)
|
|||
|
tabget S1,"ARTNR" ; tabget(Puffer, "ARTNR")
|
|||
|
a2fix L0,S1 ; temp=atoi(Puffer)
|
|||
|
move S1,"F_ARTi_NR" ; text="F_ARTi_NR"
|
|||
|
move S1[#5],A6 ; text[5]=temp
|
|||
|
ergl S1,L0 ; F_ARTi_NR=temp
|
|||
|
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer, "ARTTEXT")
|
|||
|
|
|||
|
strlen L0,S1 ; temp=strlen(S1)
|
|||
|
adds L0,#1 ; temp++
|
|||
|
comp L0,#500
|
|||
|
jg %nio_5 ; string zu lang ?
|
|||
|
|
|||
|
move S1[#500],S1[#0]L0 ; Arttext nach hinten schieben
|
|||
|
move S1,"F_ARTi_TEXT" ; text="F_ARTi_TEXT"
|
|||
|
move S1[#5],A6 ; text[5]=n
|
|||
|
ergs S1,S1[#500]L0 ; F_ARTi_TEXT=Puffer(L0)
|
|||
|
|
|||
|
adds A6,#1 ; n++
|
|||
|
jump %15 ; end while
|
|||
|
|
|||
|
%18: ergi "F_ART_ANZ",#1.I ; F_ART_ANZ=1
|
|||
|
move L0,#0 ; temp=0
|
|||
|
move B0,<1>[L7] ; Lowbyte = daten[offset]
|
|||
|
ergl "F_ART1_NR",L0 ; F_ART1_NR=temp
|
|||
|
ergs "F_ART1_TEXT","--"
|
|||
|
; jump %19
|
|||
|
|
|||
|
%19: adds L7,#1.L ; offset ++
|
|||
|
; jump %21 ; weiter mit F_P_CODE
|
|||
|
|
|||
|
%21: tabset "IDetailStruktur"
|
|||
|
move S1, "F_PCODE"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_PCODE")
|
|||
|
jz %21i ; nicht gefunden ?
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %21f ; Wenn nicht 'n'
|
|||
|
|
|||
|
%21i: etag %21h,"F_PCODE" ; if (F_PCODE)
|
|||
|
ergw "F_PCODE",#0.I ; F_PCODE = 0
|
|||
|
%21h: etag %21g,"F_PCODE_STRING" ; if (F_PCODE_STRING)
|
|||
|
ergs "F_PCODE_STRING","--" ; F_PCODE_STRING = "--"
|
|||
|
%21g: etag %210,"F_PCODE_TEXT" ; if (F_PCODE_TEXT)
|
|||
|
ergs "F_PCODE_TEXT","" ; F_PCODE_TEXT = ""
|
|||
|
jump %210 ; weiter mit F_PCODE7
|
|||
|
|
|||
|
%21f: move I1,<1>[L7] ; temp = daten[offset]
|
|||
|
move B0,B3 ; Tausche Highbyte-Lowbyte
|
|||
|
move B1,B2 ;
|
|||
|
|
|||
|
etag %21e,"F_PCODE" ; if (F_PCODE)
|
|||
|
ergw "F_PCODE",I0 ; F_PCODE = daten[offset]
|
|||
|
|
|||
|
%21e: etag %21d,"F_PCODE_STRING" ; if (F_PCODE_STRING)
|
|||
|
jump %21c ; ja
|
|||
|
%21d: etag %21b,"F_PCODE_TEXT" ; if (F_PCODE_TEXT)
|
|||
|
; jump %21c ; ja
|
|||
|
|
|||
|
%21c: tabsetex "PCodeTexte","T_PCOD" ; PCode Tabelle laden
|
|||
|
jt %nio_12,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
fix2hex S1,I0 ; itoax(Puffer,daten[offset]) --> 0x1234
|
|||
|
tabseek "PCODE",S1 ; tabseek("PCODE",Puffer)
|
|||
|
|
|||
|
etag %21b2,"F_PCODE_STRING" ; if (F_PCODE_STRING)
|
|||
|
tabget S1,"STRING" ; tabget(Puffer,"STRING")
|
|||
|
ergs "F_PCODE_STRING",S1 ; F_PCODE_STRING=Puffer
|
|||
|
|
|||
|
%21b2: etag %21b1,"F_PCODE_TEXT" ; if (F_PCODE_TEXT)
|
|||
|
tabget S1,"TEXT" ; tabget(Puffer,"TEXT")
|
|||
|
ergs "F_PCODE_TEXT",S1 ; F_PCODE_TEXT=Puffer
|
|||
|
|
|||
|
%21b1: tabset "IDetailStruktur" ; wieder zurueck
|
|||
|
|
|||
|
%21b: adds L7,#2.L ; offset = offset + 2
|
|||
|
; jump %210 ; weiter mit F_PCODE7
|
|||
|
|
|||
|
%210: tabset "IDetailStruktur"
|
|||
|
move S1, "F_PCODE7"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_PCODE7")
|
|||
|
jz %210i ; nicht gefunden ?
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %210f ; Wenn nicht 'n'
|
|||
|
|
|||
|
%210i: etag %210h,"F_PCODE7" ; if (F_PCODE7)
|
|||
|
ergw "F_PCODE7",#0.I ; F_PCODE7 = 0
|
|||
|
%210h: etag %210g,"F_PCODE7_STRING"; if (F_PCODE_STRING7)
|
|||
|
ergs "F_PCODE7_STRING","--" ; F_PCODE7_STRING = "--"
|
|||
|
%210g: etag %21a,"F_PCODE7_TEXT" ; if (F_PCODE7_TEXT)
|
|||
|
ergs "F_PCODE7_TEXT","" ; F_PCODE7_TEXT = ""
|
|||
|
jump %21a ; weiter mit F_HFK
|
|||
|
|
|||
|
%210f: move I1,<1>[L7] ; temp = daten[offset]
|
|||
|
move B0,B3 ; Tausche Highbyte-Lowbyte
|
|||
|
move B1,B2 ;
|
|||
|
|
|||
|
etag %210e,"F_PCODE7" ; if (F_PCODE)
|
|||
|
ergw "F_PCODE7",I0 ; F_PCODE7 = daten[offset]
|
|||
|
|
|||
|
%210e: etag %210d,"F_PCODE7_STRING"; if (F_PCODE7_STRING)
|
|||
|
jump %210c ; ja
|
|||
|
%210d: etag %210b,"F_PCODE7_TEXT" ; if (F_PCODE7_TEXT)
|
|||
|
; jump %210c ; ja
|
|||
|
|
|||
|
%210c: tabsetex "PCodeTexte","T_PCOD" ; PCode Tabelle laden
|
|||
|
jt %nio_12,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
fix2hex S1,I0 ; itoax(Puffer,daten[offset]) --> 0x1234
|
|||
|
tabseek "PCODE",S1 ; tabseek("PCODE",Puffer)
|
|||
|
|
|||
|
etag %210b2,"F_PCODE7_STRING" ; if (F_PCODE7_STRING)
|
|||
|
tabget S1,"STRING" ; tabget(Puffer,"STRING")
|
|||
|
ergs "F_PCODE7_STRING",S1 ; F_PCODE7_STRING=Puffer
|
|||
|
|
|||
|
%210b2: etag %210b1,"F_PCODE7_TEXT" ; if (F_PCODE7_TEXT)
|
|||
|
tabget S1,"TEXT" ; tabget(Puffer,"TEXT")
|
|||
|
ergs "F_PCODE7_TEXT",S1 ; F_PCODE7_TEXT=Puffer
|
|||
|
|
|||
|
%210b1: tabset "IDetailStruktur" ; wieder zurueck
|
|||
|
|
|||
|
%210b: adds L7,#2.L ; offset = offset + 2
|
|||
|
; jump %21a ; weiter mit F_HFK
|
|||
|
|
|||
|
%21a: move S1, "F_HFK"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_HFK")
|
|||
|
jz %nio_6 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %22 ; Wenn nicht 'n'
|
|||
|
etag %31,"F_HFK" ; if (F_HFK)
|
|||
|
ergi "F_HFK",#$FFFF.I ; F_HFK=-1
|
|||
|
jump %31 ; weiter mit F_LZ
|
|||
|
|
|||
|
%22: move B0,<1>[L7] ; Lowbyte = daten[offset]
|
|||
|
move B1,#0 ; Highbyte= 0
|
|||
|
comp B0,#1 ; F_HFK == 1 ?
|
|||
|
jnz %23 ; Wenn nicht 1
|
|||
|
move L1,#1.L ; max_uw_satz = 1
|
|||
|
%23: comp B0,#2 ; F_HFK == 2 ?
|
|||
|
jnz %24 ; Wenn nicht 2
|
|||
|
move L1,#2.L ; max_uw_satz = 2
|
|||
|
%24: etag %25,"F_HFK" ; if (F_HFK)
|
|||
|
ergi "F_HFK",I0 ; F_HFK=daten[offset]
|
|||
|
%25: adds L7,#1.L ; offset ++
|
|||
|
; jump %31 ; weiter mit F_LZ
|
|||
|
|
|||
|
%31: move S1, "F_LZ"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_LZ")
|
|||
|
jz %nio_7 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %32 ; Wenn nicht 'n'
|
|||
|
etag %41,"F_LZ" ; if (F_LZ)
|
|||
|
ergi "F_LZ",#$FFFF.I ; F_LZ=-1
|
|||
|
jump %41 ; weiter mit F_UWB_ERW
|
|||
|
|
|||
|
%32: etag %33,"F_LZ" ; if (F_LZ)
|
|||
|
move B0,<1>[L7] ; Lowbyte = daten[offset]
|
|||
|
move B1,#0 ; Highbyte= 0
|
|||
|
ergi "F_LZ",I0 ; F_LZ=daten[offset]
|
|||
|
%33: adds L7,#1.L ; offset ++
|
|||
|
; jump %41 ; weiter mit F_UWB_ERW
|
|||
|
|
|||
|
%41: move S1, "F_UWB_ERW"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_UWB_ERW")
|
|||
|
jz %nio_8 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %44 ; Wenn nicht 'n'
|
|||
|
|
|||
|
move IA,#0 ; i=0
|
|||
|
%42a: etag %42b,"F_UW_ANZ" ; if (F_UW_ANZ)
|
|||
|
ergi "F_UW_ANZ",#0.I ; F_UW_ANZ=0
|
|||
|
%42b: etag %43,"F_UW_KM" ; if (F_UW_KM)
|
|||
|
move I1,<1>[L7] ; temp = daten[offset]
|
|||
|
move B0,B3 ; Tausche Highbyte-Lowbyte
|
|||
|
move B1,B2 ;
|
|||
|
move I1,#0.I ; Setze Highword=0
|
|||
|
asl L0,#3.B ; 3 nach links schieben (*8)
|
|||
|
ergl "F_UW_KM",L0 ; F_UW_KM = daten[offset]
|
|||
|
|
|||
|
%43: move L0,L7 ; temp = offset
|
|||
|
adds L0,#2.L ; temp = temp +2 ( km )
|
|||
|
comp L2,L0 ; datenlaenge == temp
|
|||
|
jz %43a ; Wenn gleich dann fertig
|
|||
|
comp L2,L0 ; datenlaenge == temp
|
|||
|
jl %nio_11 ; Wenn kleiner dann Fehler
|
|||
|
|
|||
|
move L7,L0 ; offset = temp
|
|||
|
adds IA,#1 ; i = i + 1
|
|||
|
comp IA,#3 ; i == 3
|
|||
|
jge %nio_11 ; Fehler
|
|||
|
|
|||
|
enewset ; new_set_of_results()
|
|||
|
jump %42a ; naechster
|
|||
|
|
|||
|
%43a: enewset ; new_set_of_results()
|
|||
|
move <3>,#0.L ; UW_Erw = FALSE
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%44: move L0,L7 ; temp = offset
|
|||
|
adds L0,#2.L ; temp = temp +2 ( km )
|
|||
|
comp L2,L0 ; datenlaenge == temp
|
|||
|
jl %nio_11 ; Wenn kleiner
|
|||
|
|
|||
|
etag %45,"F_UW_KM" ; if (F_UW_KM)
|
|||
|
move <3>,#1.L ; UW_Erw = TRUE
|
|||
|
tabset "IUmweltMatrix"
|
|||
|
jt %nio_9,#10 ; Tabelle nicht gefunden ?
|
|||
|
tabset "IUmweltTexte"
|
|||
|
jt %nio_10,#10 ; Tabelle nicht gefunden ?
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%45: etag %46,"F_UW_ANZ" ; if (F_UW_ANZ)
|
|||
|
move <3>,#1.L ; UW_Erw = TRUE
|
|||
|
tabset "IUmweltMatrix"
|
|||
|
jt %nio_9,#10 ; Tabelle nicht gefunden ?
|
|||
|
tabset "IUmweltTexte"
|
|||
|
jt %nio_10,#10 ; Tabelle nicht gefunden ?
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%46: move <3>,#0.L ; UW_Erw = FALSE
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%endio: move <2>,L7 ; Offset = offset
|
|||
|
move <4>,L1 ; Max_UW_Satz = max_uw_satz
|
|||
|
push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_1: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table IDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_2: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_ART_ERW in table IDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_3: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_ART_ERW in table IDetailStruktur wrong format"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_4: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table IArtTexteErweitert not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_5: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","ARTTEXT in table IArtTexteErweitert string to long"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_6: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_HFK in table IDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_7: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_LZ in table IDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_8: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_UWB_ERW in table IDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_9: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table IUmweltMatrix not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_10: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table IUmweltTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_11: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Datalen not valid"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_12: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table PCodeTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_table: ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: clrt ; Trapregister l<>schen
|
|||
|
settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; decode_history_memory_kwp2000_detail(Daten, Offset, UW_Erw, Max_UW_Satz)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L0 temp
|
|||
|
; L1 max_uw_satz
|
|||
|
; L2 datenlaenge
|
|||
|
; IA (L5) i
|
|||
|
; A6 (L5) n
|
|||
|
; A7 (L5) f_art_anz
|
|||
|
; L6 trapmask
|
|||
|
; L7 offset
|
|||
|
; S1 puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
decode_history_memory_kwp2000_detail: AX VW VW VW
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "HDetailStruktur"
|
|||
|
jt %nio_1,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
move L1,#3.L ; max_uw_satz = 3
|
|||
|
move L7,<2> ; offset = Offset
|
|||
|
slen L2,<1> ; datenlaenge = datalen(daten)
|
|||
|
move S1, "F_ART_ERW"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_ART_ERW")
|
|||
|
jz %nio_2 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %11 ; Wenn nicht 'n'
|
|||
|
|
|||
|
etag %21,"F_ART_ANZ" ; if (F_ART_ANZ)
|
|||
|
ergi "F_ART_ANZ",#0.I ; F_ART_ANZ=0
|
|||
|
jump %21 ; weiter mit F_P_CODE
|
|||
|
|
|||
|
%11: etag %19,"F_ART_ANZ" ; if (F_ART_ANZ)
|
|||
|
comp S1[#0],#$6A ; Puffer[0] = 'j'=6A
|
|||
|
jz %18 ; Wenn 'j'
|
|||
|
comp S1[#0],#$79 ; Puffer[0] = 'y'=79
|
|||
|
jz %18 ; Wenn 'y'
|
|||
|
|
|||
|
strlen L0,S1
|
|||
|
comp L0,#8 ; strlen(puffer)=8
|
|||
|
jnz %nio_3 ; Wenn nicht 8
|
|||
|
|
|||
|
move A7,#$30 ; f_art_anz='0'
|
|||
|
move IA,#0 ; i=0
|
|||
|
|
|||
|
%12: comp IA,#8 ; while
|
|||
|
jz %14
|
|||
|
|
|||
|
comp S1[IA],#$30 ; Puffer[i] = '0'=30
|
|||
|
jl %nio_3 ; Wenn kleiner '0'
|
|||
|
comp S1[IA],#$38 ; Puffer[i] = '8'=38
|
|||
|
jg %nio_3 ; Wenn groesser '8'
|
|||
|
|
|||
|
comp S1[IA],A7 ; Puffer[i] = Fart_anz
|
|||
|
jle %13 ; Fart_anz kleiner als Puffer
|
|||
|
move A7,S1[IA] ; Fart_anz = Puffer
|
|||
|
|
|||
|
%13: adds IA,#1.I ; i++
|
|||
|
jump %12 ; end while
|
|||
|
|
|||
|
%14: move I0,#0 ; temp=0
|
|||
|
move B0,A7 ; temp=f_art_anz
|
|||
|
subb B0,#$30 ; temp=temp-'0'
|
|||
|
ergi "F_ART_ANZ",I0 ; F_ART_ANZ=temp
|
|||
|
|
|||
|
move S1[#1000],S1[#0]#9 ; Maske nach hinten schieben
|
|||
|
|
|||
|
tabset "HArtTexteErweitert"
|
|||
|
jt %nio_4,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
move A6,#$31 ; n='1'
|
|||
|
%15: comp A6,A7 ; while
|
|||
|
jg %19
|
|||
|
|
|||
|
move S1,"xxxxxxxx" ; Puffer="xxxxxxxx"
|
|||
|
move IA,#0 ; i=0
|
|||
|
|
|||
|
%16: comp IA,#8 ; while
|
|||
|
jz %17
|
|||
|
|
|||
|
move I0,#1000 ; temp=1000 (Maskenoffset)
|
|||
|
adds I0,IA ; temp=temp+i
|
|||
|
comp S1[I0],A6 ; Puffer[temp]=n
|
|||
|
jnz %16a ; wenn nicht n
|
|||
|
|
|||
|
move I0,#7 ; temp=7
|
|||
|
subb I0,IA ; temp=temp-i
|
|||
|
|
|||
|
move B2,<1>[L7] ; temp2 = daten[offset]
|
|||
|
lsr B2,I0 ; temp2 >> temp
|
|||
|
and B2,#1 ; temp2 & 01
|
|||
|
adds B2,#$30 ; temp2 + '0'
|
|||
|
|
|||
|
move S1[IA],B2 ; Puffer[i]=temp2
|
|||
|
|
|||
|
%16a: adds IA,#1.I ; i++
|
|||
|
jump %16 ; end while
|
|||
|
|
|||
|
%17: tabseek "ARTMASKE",S1 ; tabseek("ARTMASKE",text)
|
|||
|
tabget S1,"ARTNR" ; tabget(Puffer, "ARTNR")
|
|||
|
a2fix L0,S1 ; temp=atoi(Puffer)
|
|||
|
move S1,"F_ARTi_NR" ; text="F_ARTi_NR"
|
|||
|
move S1[#5],A6 ; text[5]=temp
|
|||
|
ergl S1,L0 ; F_ARTi_NR=temp
|
|||
|
|
|||
|
tabget S1,"ARTTEXT" ; tabget(Puffer, "ARTTEXT")
|
|||
|
|
|||
|
strlen L0,S1 ; temp=strlen(S1)
|
|||
|
adds L0,#1 ; temp++
|
|||
|
comp L0,#500
|
|||
|
jg %nio_5 ; string zu lang ?
|
|||
|
|
|||
|
move S1[#500],S1[#0]L0 ; Arttext nach hinten schieben
|
|||
|
move S1,"F_ARTi_TEXT" ; text="F_ARTi_TEXT"
|
|||
|
move S1[#5],A6 ; text[5]=n
|
|||
|
ergs S1,S1[#500]L0 ; F_ARTi_TEXT=Puffer(L0)
|
|||
|
|
|||
|
adds A6,#1 ; n++
|
|||
|
jump %15 ; end while
|
|||
|
|
|||
|
%18: ergi "F_ART_ANZ",#1.I ; F_ART_ANZ=1
|
|||
|
move L0,#0 ; temp=0
|
|||
|
move B0,<1>[L7] ; Lowbyte = daten[offset]
|
|||
|
ergl "F_ART1_NR",L0 ; F_ART1_NR=temp
|
|||
|
ergs "F_ART1_TEXT","--"
|
|||
|
; jump %19
|
|||
|
|
|||
|
%19: adds L7,#1.L ; offset ++
|
|||
|
; jump %21 ; weiter mit F_P_CODE
|
|||
|
|
|||
|
%21: tabset "HDetailStruktur"
|
|||
|
move S1, "F_PCODE"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_PCODE")
|
|||
|
jz %21i ; nicht gefunden ?
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %21f ; Wenn nicht 'n'
|
|||
|
|
|||
|
%21i: etag %21h,"F_PCODE" ; if (F_PCODE)
|
|||
|
ergw "F_PCODE",#0.I ; F_PCODE = 0
|
|||
|
%21h: etag %21g,"F_PCODE_STRING" ; if (F_PCODE_STRING)
|
|||
|
ergs "F_PCODE_STRING","--" ; F_PCODE_STRING = "--"
|
|||
|
%21g: etag %210,"F_PCODE_TEXT" ; if (F_PCODE_TEXT)
|
|||
|
ergs "F_PCODE_TEXT","" ; F_PCODE_TEXT = ""
|
|||
|
jump %210 ; weiter mit F_PCODE7
|
|||
|
|
|||
|
%21f: move I1,<1>[L7] ; temp = daten[offset]
|
|||
|
move B0,B3 ; Tausche Highbyte-Lowbyte
|
|||
|
move B1,B2 ;
|
|||
|
|
|||
|
etag %21e,"F_PCODE" ; if (F_PCODE)
|
|||
|
ergw "F_PCODE",I0 ; F_PCODE = daten[offset]
|
|||
|
|
|||
|
%21e: etag %21d,"F_PCODE_STRING" ; if (F_PCODE_STRING)
|
|||
|
jump %21c ; ja
|
|||
|
%21d: etag %21b,"F_PCODE_TEXT" ; if (F_PCODE_TEXT)
|
|||
|
; jump %21c ; ja
|
|||
|
|
|||
|
%21c: tabsetex "PCodeTexte","T_PCOD" ; PCode Tabelle laden
|
|||
|
jt %nio_12,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
fix2hex S1,I0 ; itoax(Puffer,daten[offset]) --> 0x1234
|
|||
|
tabseek "PCODE",S1 ; tabseek("PCODE",Puffer)
|
|||
|
|
|||
|
etag %21b2,"F_PCODE_STRING" ; if (F_PCODE_STRING)
|
|||
|
tabget S1,"STRING" ; tabget(Puffer,"STRING")
|
|||
|
ergs "F_PCODE_STRING",S1 ; F_PCODE_STRING=Puffer
|
|||
|
|
|||
|
%21b2: etag %21b1,"F_PCODE_TEXT" ; if (F_PCODE_TEXT)
|
|||
|
tabget S1,"TEXT" ; tabget(Puffer,"TEXT")
|
|||
|
ergs "F_PCODE_TEXT",S1 ; F_PCODE_TEXT=Puffer
|
|||
|
|
|||
|
%21b1: tabset "HDetailStruktur" ; wieder zurueck
|
|||
|
|
|||
|
%21b: adds L7,#2.L ; offset = offset + 2
|
|||
|
; jump %210 ; weiter mit F_PCODE7
|
|||
|
|
|||
|
%210: tabset "HDetailStruktur"
|
|||
|
move S1, "F_PCODE7"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_PCODE7")
|
|||
|
jz %210i ; nicht gefunden ?
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %210f ; Wenn nicht 'n'
|
|||
|
|
|||
|
%210i: etag %210h,"F_PCODE7" ; if (F_PCODE7)
|
|||
|
ergw "F_PCODE7",#0.I ; F_PCODE7 = 0
|
|||
|
%210h: etag %210g,"F_PCODE7_STRING"; if (F_PCODE_STRING7)
|
|||
|
ergs "F_PCODE7_STRING","--" ; F_PCODE7_STRING = "--"
|
|||
|
%210g: etag %21a,"F_PCODE7_TEXT" ; if (F_PCODE7_TEXT)
|
|||
|
ergs "F_PCODE7_TEXT","" ; F_PCODE7_TEXT = ""
|
|||
|
jump %21a ; weiter mit F_HFK
|
|||
|
|
|||
|
%210f: move I1,<1>[L7] ; temp = daten[offset]
|
|||
|
move B0,B3 ; Tausche Highbyte-Lowbyte
|
|||
|
move B1,B2 ;
|
|||
|
|
|||
|
etag %210e,"F_PCODE7" ; if (F_PCODE)
|
|||
|
ergw "F_PCODE7",I0 ; F_PCODE7 = daten[offset]
|
|||
|
|
|||
|
%210e: etag %210d,"F_PCODE7_STRING"; if (F_PCODE7_STRING)
|
|||
|
jump %210c ; ja
|
|||
|
%210d: etag %210b,"F_PCODE7_TEXT" ; if (F_PCODE7_TEXT)
|
|||
|
; jump %210c ; ja
|
|||
|
|
|||
|
%210c: tabsetex "PCodeTexte","T_PCOD" ; PCode Tabelle laden
|
|||
|
jt %nio_12,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
fix2hex S1,I0 ; itoax(Puffer,daten[offset]) --> 0x1234
|
|||
|
tabseek "PCODE",S1 ; tabseek("PCODE",Puffer)
|
|||
|
|
|||
|
etag %210b2,"F_PCODE7_STRING" ; if (F_PCODE7_STRING)
|
|||
|
tabget S1,"STRING" ; tabget(Puffer,"STRING")
|
|||
|
ergs "F_PCODE7_STRING",S1 ; F_PCODE7_STRING=Puffer
|
|||
|
|
|||
|
%210b2: etag %210b1,"F_PCODE7_TEXT" ; if (F_PCODE7_TEXT)
|
|||
|
tabget S1,"TEXT" ; tabget(Puffer,"TEXT")
|
|||
|
ergs "F_PCODE7_TEXT",S1 ; F_PCODE7_TEXT=Puffer
|
|||
|
|
|||
|
%210b1: tabset "HDetailStruktur" ; wieder zurueck
|
|||
|
|
|||
|
%210b: adds L7,#2.L ; offset = offset + 2
|
|||
|
; jump %21a ; weiter mit F_HFK
|
|||
|
|
|||
|
%21a: move S1, "F_HFK"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_HFK")
|
|||
|
jz %nio_6 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %22 ; Wenn nicht 'n'
|
|||
|
etag %31,"F_HFK" ; if (F_HFK)
|
|||
|
ergi "F_HFK",#$FFFF.I ; F_HFK=-1
|
|||
|
jump %31 ; weiter mit F_LZ
|
|||
|
|
|||
|
%22: move B0,<1>[L7] ; Lowbyte = daten[offset]
|
|||
|
move B1,#0 ; Highbyte= 0
|
|||
|
comp B0,#1 ; F_HFK == 1 ?
|
|||
|
jnz %23 ; Wenn nicht 1
|
|||
|
move L1,#1.L ; max_uw_satz = 1
|
|||
|
%23: comp B0,#2 ; F_HFK == 2 ?
|
|||
|
jnz %24 ; Wenn nicht 2
|
|||
|
move L1,#2.L ; max_uw_satz = 2
|
|||
|
%24: etag %25,"F_HFK" ; if (F_HFK)
|
|||
|
ergi "F_HFK",I0 ; F_HFK=daten[offset]
|
|||
|
%25: adds L7,#1.L ; offset ++
|
|||
|
; jump %31 ; weiter mit F_LZ
|
|||
|
|
|||
|
%31: move S1, "F_LZ"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_LZ")
|
|||
|
jz %nio_7 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %32 ; Wenn nicht 'n'
|
|||
|
etag %41,"F_LZ" ; if (F_LZ)
|
|||
|
ergi "F_LZ",#$FFFF.I ; F_LZ=-1
|
|||
|
jump %41 ; weiter mit F_UWB_ERW
|
|||
|
|
|||
|
%32: etag %33,"F_LZ" ; if (F_LZ)
|
|||
|
move B0,<1>[L7] ; Lowbyte = daten[offset]
|
|||
|
move B1,#0 ; Highbyte= 0
|
|||
|
ergi "F_LZ",I0 ; F_LZ=daten[offset]
|
|||
|
%33: adds L7,#1.L ; offset ++
|
|||
|
; jump %41 ; weiter mit F_UWB_ERW
|
|||
|
|
|||
|
%41: move S1, "F_UWB_ERW"
|
|||
|
tabseek "NAME",S1 ; tabseek("NAME","F_UWB_ERW")
|
|||
|
jz %nio_8 ; nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"TYP" ; tabget(puffer, "TYP");
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#$6E ; Puffer[0] = 'n'=6E
|
|||
|
jnz %44 ; Wenn nicht 'n'
|
|||
|
|
|||
|
move IA,#0 ; i=0
|
|||
|
%42a: etag %42b,"F_UW_ANZ" ; if (F_UW_ANZ)
|
|||
|
ergi "F_UW_ANZ",#0.I ; F_UW_ANZ=0
|
|||
|
%42b: etag %43,"F_UW_KM" ; if (F_UW_KM)
|
|||
|
move I1,<1>[L7] ; temp = daten[offset]
|
|||
|
move B0,B3 ; Tausche Highbyte-Lowbyte
|
|||
|
move B1,B2 ;
|
|||
|
move I1,#0.I ; Setze Highword=0
|
|||
|
asl L0,#3.B ; 3 nach links schieben (*8)
|
|||
|
ergl "F_UW_KM",L0 ; F_UW_KM = daten[offset]
|
|||
|
|
|||
|
%43: move L0,L7 ; temp = offset
|
|||
|
adds L0,#2.L ; temp = temp +2 ( km )
|
|||
|
comp L2,L0 ; datenlaenge == temp
|
|||
|
jz %43a ; Wenn gleich dann fertig
|
|||
|
comp L2,L0 ; datenlaenge == temp
|
|||
|
jl %nio_11 ; Wenn kleiner dann Fehler
|
|||
|
|
|||
|
move L7,L0 ; offset = temp
|
|||
|
adds IA,#1 ; i = i + 1
|
|||
|
comp IA,#3 ; i == 3
|
|||
|
jge %nio_11 ; Fehler
|
|||
|
|
|||
|
enewset ; new_set_of_results()
|
|||
|
jump %42a ; naechster
|
|||
|
|
|||
|
%43a: enewset ; new_set_of_results()
|
|||
|
move <3>,#0.L ; UW_Erw = FALSE
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%44: move L0,L7 ; temp = offset
|
|||
|
adds L0,#2.L ; temp = temp +2 ( km )
|
|||
|
comp L2,L0 ; datenlaenge == temp
|
|||
|
jl %nio_11 ; Wenn kleiner
|
|||
|
|
|||
|
etag %45,"F_UW_KM" ; if (F_UW_KM)
|
|||
|
move <3>,#1.L ; UW_Erw = TRUE
|
|||
|
tabset "HUmweltMatrix"
|
|||
|
jt %nio_9,#10 ; Tabelle nicht gefunden ?
|
|||
|
tabset "HUmweltTexte"
|
|||
|
jt %nio_10,#10 ; Tabelle nicht gefunden ?
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%45: etag %46,"F_UW_ANZ" ; if (F_UW_ANZ)
|
|||
|
move <3>,#1.L ; UW_Erw = TRUE
|
|||
|
tabset "HUmweltMatrix"
|
|||
|
jt %nio_9,#10 ; Tabelle nicht gefunden ?
|
|||
|
tabset "HUmweltTexte"
|
|||
|
jt %nio_10,#10 ; Tabelle nicht gefunden ?
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%46: move <3>,#0.L ; UW_Erw = FALSE
|
|||
|
jump %endio ; Okay
|
|||
|
|
|||
|
%endio: move <2>,L7 ; Offset = offset
|
|||
|
move <4>,L1 ; Max_UW_Satz = max_uw_satz
|
|||
|
push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_1: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table HDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_2: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_ART_ERW in table HDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_3: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_ART_ERW in table HDetailStruktur wrong format"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_4: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table HArtTexteErweitert not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_5: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","ARTTEXT in table HArtTexteErweitert string to long"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_6: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_HFK in table HDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_7: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_LZ in table HDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_8: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","F_UWB_ERW in table HDetailStruktur not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_9: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table HUmweltMatrix not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_10: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table HUmweltTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_11: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Datalen not valid"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_12: enewset ; new_set_of_results()
|
|||
|
ergs "JOB_MESSAGE","Table PCodeTexte not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_table: ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: clrt ; Trapregister l<>schen
|
|||
|
settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; return_with_message(ErrorMessage, HelpMessage, Antwort, ResultName, NewSetFlag)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L0 temp
|
|||
|
; L6 trapmask
|
|||
|
; S1 puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
return_with_message: AX AX AX AE VX
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
move L0,<5> ; temp = NewSetFlag
|
|||
|
comp L0,#0 ; temp = 0 ?
|
|||
|
jz %1 ; Wenn 0
|
|||
|
enewset ; new_set_of_results()
|
|||
|
%1: tabset "JobResultExtended"
|
|||
|
jt %2,#10 ; Tabelle nicht gefunden ?
|
|||
|
move S1,<1> ; S1 = ErrorMessage
|
|||
|
tabseek "SB",S1 ; tabseek("SB",S1)
|
|||
|
jz %2 ; nicht gefunden ?
|
|||
|
jump %3
|
|||
|
|
|||
|
%2: clrt ; Trapregister l<>schen
|
|||
|
tabset "JobResult"
|
|||
|
jt %nio_1,#10 ; Tabelle nicht gefunden ?
|
|||
|
move S1,<1> ; S1 = ErrorMessage
|
|||
|
tabseek "SB",S1 ; tabseek("SB",S1)
|
|||
|
jz %nio_2 ; Eintrag nicht gefunden ?
|
|||
|
|
|||
|
%3: tabget S1,"STATUS_TEXT" ; tabget(puffer, "STATUS_TEXT");
|
|||
|
ergs "JOB_STATUS",S1 ; JOB_STATUS = S1
|
|||
|
|
|||
|
move S1,<2> ; S1 = HelpMessage
|
|||
|
comp S1[#0],#0 ; Puffer[0] = '\0'
|
|||
|
jz %4 ; Wenn '\0'
|
|||
|
ergs "JOB_MESSAGE",S1 ; JOB_MESSAGE = S1
|
|||
|
|
|||
|
%4: move S1,<4> ; S1 = ResultName
|
|||
|
comp S1[#0],#0 ; Puffer[0] = '\0'
|
|||
|
jz %5 ; Wenn '\0'
|
|||
|
etag %5,<4> ; wenn RESULT <4> angefordert
|
|||
|
ergy <4>,<3> ; antwort nach RESULT <4>
|
|||
|
|
|||
|
%5: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_1: ergs "JOB_MESSAGE","Table JobResultExtended and JobResult not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_2: ergs "JOB_MESSAGE","Text in Table JobResultExtended and JobResult not found"
|
|||
|
jump %nio_table
|
|||
|
|
|||
|
%nio_table: ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: clrt ; Trapregister l<>schen
|
|||
|
settmr L6 ; set_trap_mask(trapmask)
|
|||
|
eoj ; Jobende ( return )
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; make2of3(Ergebnis, Daten, Offset, Count)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L0 temp
|
|||
|
; L2 datenlaenge
|
|||
|
; I6 start1
|
|||
|
; I7 start2
|
|||
|
; I8 start3
|
|||
|
; I9 anz
|
|||
|
;---------------------------------------------------------------
|
|||
|
make2of3: AW AX VX VX
|
|||
|
clear <1> ; Ergebnis loeschen
|
|||
|
move L0,<3> ; temp = Offset
|
|||
|
comp L0,#0 ;
|
|||
|
jl %nio_1 ; Wenn < 0
|
|||
|
move I6,I0 ; start1 = offset;
|
|||
|
adds L0,<4> ; temp = temp + Count
|
|||
|
move I7,I0 ; start2 = offset + Count;
|
|||
|
adds L0,<4> ; temp = temp + Count
|
|||
|
move I8,I0 ; start3 = offset + Count + Count;
|
|||
|
adds L0,<4> ; temp = temp + Count
|
|||
|
slen L2,<2> ; datenlaenge = datalen(Daten)
|
|||
|
comp L0,L2
|
|||
|
jg %nio_2 ; Wenn > datenlaenge
|
|||
|
move L0,<4> ; temp = Count
|
|||
|
move I9,I0 ; anz = Count;
|
|||
|
|
|||
|
move IA,I6 ; pos1 = start1
|
|||
|
move IB,I7 ; pos2 = start2
|
|||
|
move IC,#0 ; i = 0
|
|||
|
|
|||
|
%1: comp <2>[IA],<2>[IB] ; daten[pos1] == daten[pos2] ?
|
|||
|
jnz %2 ; Wenn !=
|
|||
|
adds IA,#1 ; pos1 ++
|
|||
|
adds IB,#1 ; pos2 ++
|
|||
|
adds IC,#1 ; pos2 ++
|
|||
|
comp IC,I9 ; i == anz ?
|
|||
|
jl %1 ; Wenn i < anz
|
|||
|
move <1>,<2>[I6]I9 ; Ergebnis = daten[start1],anzahl
|
|||
|
jump %io ; fertig
|
|||
|
|
|||
|
%2: move IA,I6 ; pos1 = start1
|
|||
|
move IB,I8 ; pos2 = start3
|
|||
|
move IC,#0 ; i = 0
|
|||
|
|
|||
|
%3: comp <2>[IA],<2>[IB] ; daten[pos1] == daten[pos2] ?
|
|||
|
jnz %4 ; Wenn !=
|
|||
|
adds IA,#1 ; pos1 ++
|
|||
|
adds IB,#1 ; pos2 ++
|
|||
|
adds IC,#1 ; pos2 ++
|
|||
|
comp IC,I9 ; i == anz ?
|
|||
|
jl %3 ; Wenn i < anz
|
|||
|
move <1>,<2>[I6]I9 ; Ergebnis = daten[start1],anzahl
|
|||
|
jump %io ; fertig
|
|||
|
|
|||
|
%4: move IA,I7 ; pos1 = start2
|
|||
|
move IB,I8 ; pos2 = start3
|
|||
|
move IC,#0 ; i = 0
|
|||
|
|
|||
|
%5: comp <2>[IA],<2>[IB] ; daten[pos1] == daten[pos2] ?
|
|||
|
jnz %nio ; Wenn !=
|
|||
|
adds IA,#1 ; pos1 ++
|
|||
|
adds IB,#1 ; pos2 ++
|
|||
|
adds IC,#1 ; pos2 ++
|
|||
|
comp IC,I9 ; i == anz ?
|
|||
|
jl %5 ; Wenn i < anz
|
|||
|
move <1>,<2>[I7]I9 ; Ergebnis = daten[start2],anzahl
|
|||
|
; jump %io ; fertig
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_1: ergs "JOB_MESSAGE","Invalid Offset"
|
|||
|
jump %nio
|
|||
|
|
|||
|
%nio_2: ergs "JOB_MESSAGE","Invalid Count"
|
|||
|
jump %nio
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; BRstandard(Ergebnis, Daten)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx
|
|||
|
;
|
|||
|
; B0 temp
|
|||
|
; L2 datenlaenge
|
|||
|
; S1 puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
BRstandard: AW AX
|
|||
|
clear <1> ; Ergebnis loeschen
|
|||
|
slen L2,<2> ; datenlaenge = datalen(Daten)
|
|||
|
comp L2,#6
|
|||
|
jnz %nio_1 ; Wenn ungleich 6
|
|||
|
move B0,<2>[#0] ; 1. Byte nach temp
|
|||
|
comp B0,#0.B ; Wenn ungleich 0
|
|||
|
jz %1 ; BMW Format
|
|||
|
|
|||
|
y2bcd <1>,<2>[#3]#3 ; Drei Byte BCD nach ASCII
|
|||
|
spaste <1>[#0],<2>[#0]#3 ; Drei Zeichen ASCII davor
|
|||
|
jump %io ; fertig
|
|||
|
|
|||
|
%1: y2bcd <1>,<2>[#0]#6 ; BCD nach ASCII
|
|||
|
serase <1>[#0],#5 ; Fuehrende Nullen loeschen
|
|||
|
; jump %io ; fertig
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_1: ergs "JOB_MESSAGE","Invalid Len"
|
|||
|
jump %nio
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; gettimerticks()
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; L0 temp
|
|||
|
; L0 Stunde, Tag
|
|||
|
; L1 Minute, Monat
|
|||
|
; L2 Sekunde, Jahr
|
|||
|
; L3 Ergebnis
|
|||
|
; S1 puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
gettimerticks:
|
|||
|
time S1 ; Zeit holen
|
|||
|
move L0,#0 ; Std = 0
|
|||
|
move B0,S1[#0] ; Std belegen
|
|||
|
mult L0,#3600 ; Std in [s]
|
|||
|
|
|||
|
move L1,#0 ; Min = 0
|
|||
|
move B4,S1[#1] ; Min belegen
|
|||
|
mult L1,#60 ; Min in [s]
|
|||
|
|
|||
|
move L2,#0 ; Sek = 0
|
|||
|
move B8,S1[#2] ; Sek belegen
|
|||
|
|
|||
|
move L3,L2 ; Erg = Sek
|
|||
|
adds L3,L1 ; Erg = Erg + Min
|
|||
|
adds L3,L0 ; Erg = Erg + Std
|
|||
|
|
|||
|
date S1 ; Datum holen
|
|||
|
move L0,#0 ; Tag = 0
|
|||
|
move B0,S1[#0] ; Tag belegen
|
|||
|
|
|||
|
move L1,#0 ; Mon = 0
|
|||
|
comp S1[#1],#1 ; Januar
|
|||
|
jnz %2 ; wenn nicht
|
|||
|
move L1,#0 ; Mon in [d]
|
|||
|
jump %20
|
|||
|
%2: comp S1[#1],#2 ; Februar
|
|||
|
jnz %3
|
|||
|
move L1,#31
|
|||
|
jump %20
|
|||
|
%3: comp S1[#1],#3 ; Maerz
|
|||
|
jnz %4
|
|||
|
move L1,#59
|
|||
|
jump %20
|
|||
|
%4: comp S1[#1],#4 ; April
|
|||
|
jnz %5
|
|||
|
move L1,#90
|
|||
|
jump %20
|
|||
|
%5: comp S1[#1],#5 ; Mai
|
|||
|
jnz %6
|
|||
|
move L1,#120
|
|||
|
jump %20
|
|||
|
%6: comp S1[#1],#6 ; Juni
|
|||
|
jnz %7
|
|||
|
move L1,#151
|
|||
|
jump %20
|
|||
|
%7: comp S1[#1],#7 ; Juli
|
|||
|
jnz %8
|
|||
|
move L1,#181
|
|||
|
jump %20
|
|||
|
%8: comp S1[#1],#8 ; August
|
|||
|
jnz %9
|
|||
|
move L1,#212
|
|||
|
jump %20
|
|||
|
%9: comp S1[#1],#9 ; September
|
|||
|
jnz %10
|
|||
|
move L1,#243
|
|||
|
jump %20
|
|||
|
%10: comp S1[#1],#10 ; Oktober
|
|||
|
jnz %11
|
|||
|
move L1,#273
|
|||
|
jump %20
|
|||
|
%11: comp S1[#1],#11 ; November
|
|||
|
jnz %12
|
|||
|
move L1,#304
|
|||
|
jump %20
|
|||
|
%12: comp S1[#1],#12 ; Dezember
|
|||
|
jnz %20
|
|||
|
move L1,#334
|
|||
|
jump %20
|
|||
|
|
|||
|
%20: move L2,#0 ; Jah = 0
|
|||
|
move B8,S1[#2] ; Jah belegen
|
|||
|
and B8,#$0F ; !! Ueberlauf alle 16 Jahre
|
|||
|
move A0,B8 ; temp = Jah
|
|||
|
mult L2,#365 ; Joh in [d]
|
|||
|
|
|||
|
comp A0,#0 ; Schaltjahr ?
|
|||
|
jz %21
|
|||
|
comp A0,#4 ; Schaltjahr ?
|
|||
|
jz %21
|
|||
|
comp A0,#8 ; Schaltjahr ?
|
|||
|
jz %21
|
|||
|
comp A0,#12 ; Schaltjahr ?
|
|||
|
jz %21
|
|||
|
jump %22
|
|||
|
%21: adds L2,#1 ; Schaltjahr
|
|||
|
|
|||
|
%22: move L4,L0 ; temp = Tag
|
|||
|
adds L4,L1 ; temp = temp + Mon
|
|||
|
adds L4,L2 ; temp = temp + Jah
|
|||
|
mult L4,#86400 ; Tag in [s]
|
|||
|
|
|||
|
adds L3,L4 ; Erg = Erg + Tag
|
|||
|
|
|||
|
push L3
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; is_char_numeric(Wert)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx
|
|||
|
;
|
|||
|
; L0 temp
|
|||
|
;---------------------------------------------------------------
|
|||
|
is_char_numeric: VX
|
|||
|
move L0,<1> ; temp = Wert
|
|||
|
comp B0,#$30
|
|||
|
jl %nio ; < '0'
|
|||
|
comp B0,#$39
|
|||
|
jg %nio ; > '9'
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; is_char_upper(Wert)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx
|
|||
|
;
|
|||
|
; L0 temp
|
|||
|
;---------------------------------------------------------------
|
|||
|
is_char_upper: VX
|
|||
|
move L0,<1> ; temp = Wert
|
|||
|
comp B0,#$41
|
|||
|
jl %nio ; < 'A'
|
|||
|
comp B0,#$5A
|
|||
|
jg %nio ; > 'Z'
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; is_char_lower(Wert)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx
|
|||
|
;
|
|||
|
; L0 temp
|
|||
|
;---------------------------------------------------------------
|
|||
|
is_char_lower: VX
|
|||
|
move L0,<1> ; temp = Wert
|
|||
|
comp B0,#$61
|
|||
|
jl %nio ; < 'a'
|
|||
|
comp B0,#$7A
|
|||
|
jg %nio ; > 'z'
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; strupper(String)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx
|
|||
|
;
|
|||
|
; I0 i
|
|||
|
; I1 len
|
|||
|
;---------------------------------------------------------------
|
|||
|
strupper: AW
|
|||
|
strlen I1,<1> ; len = strlen(String)
|
|||
|
move I0,#0.I ; i=0
|
|||
|
%1: comp I0,I1 ; while
|
|||
|
jz %io
|
|||
|
comp <1>[I0],#$61
|
|||
|
jl %2 ; < 'a'
|
|||
|
comp <1>[I0],#$7A
|
|||
|
jg %2 ; > 'z'
|
|||
|
subb <1>[I0],#$20
|
|||
|
|
|||
|
%2: adds I0,#1.I ; i++
|
|||
|
jump %1 ; end while
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; strlower(String)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx
|
|||
|
;
|
|||
|
; I0 i
|
|||
|
; I1 len
|
|||
|
;---------------------------------------------------------------
|
|||
|
strlower: AW
|
|||
|
strlen I1,<1> ; len = strlen(String)
|
|||
|
move I0,#0.I ; i=0
|
|||
|
%1: comp I0,I1 ; while
|
|||
|
jz %io
|
|||
|
comp <1>[I0],#$41
|
|||
|
jl %2 ; < 'A'
|
|||
|
comp <1>[I0],#$5A
|
|||
|
jg %2 ; > 'Z'
|
|||
|
adds <1>[I0],#$20
|
|||
|
|
|||
|
%2: adds I0,#1.I ; i++
|
|||
|
jump %1 ; end while
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; get_argument(Argument,Nr)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
;
|
|||
|
;---------------------------------------------------------------
|
|||
|
get_argument: AW VX
|
|||
|
pars <1>,<2>
|
|||
|
jz %nio
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; convert_kwp2000_to_kwp2000_star(Auftrag)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx
|
|||
|
;
|
|||
|
; B0 (L0) temp
|
|||
|
; I0 (L0) temp
|
|||
|
; S1 Puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
convert_kwp2000_to_kwp2000_star: AW
|
|||
|
slen I0,<1> ; temp = datalen(Auftrag)
|
|||
|
comp I0,#0 ; temp == 0 ?
|
|||
|
jz %nio ; ja -> Fehler
|
|||
|
|
|||
|
move B0,<1>[#0] ; temp = Auftrag[0]
|
|||
|
and B0,#$3F ; temp = temp & 0x3F
|
|||
|
comp B0,#0 ; temp == 0 ?
|
|||
|
jz %1 ; ja -> goto %1
|
|||
|
|
|||
|
clear S1 ; Puffer loeschen
|
|||
|
move S1[#0],B0 ; Puffer[0] = temp
|
|||
|
spaste <1>[#3],s1 ; datainsert(Auftrag,Puffer,3);
|
|||
|
|
|||
|
%1: move <1>[#0],#$B8.B ; Auftrag[0] = 0xB8
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; convert_kwp2000_to_lin_kwp2000(SLAVE_ADRESSE,Auftrag)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx
|
|||
|
;
|
|||
|
; B0 (L0) temp
|
|||
|
; I0 (L0) temp
|
|||
|
; S1 Puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
convert_kwp2000_to_lin_kwp2000: VX AW
|
|||
|
slen I0,<2> ; temp = datalen(Auftrag)
|
|||
|
comp I0,#0 ; temp == 0 ?
|
|||
|
jz %nio ; ja -> Fehler
|
|||
|
|
|||
|
move B0,<2>[#0] ; temp = Auftrag[0]
|
|||
|
and B0,#$3F ; temp = temp & 0x3F
|
|||
|
comp B0,#0 ; temp == 0 ?
|
|||
|
jz %nio ; ja -> Fehler
|
|||
|
comp B0,#60 ; temp > 60 ?
|
|||
|
jg %nio ; ja -> Fehler
|
|||
|
|
|||
|
clear S1 ; Puffer loeschen
|
|||
|
move S1[#0],#$A6 ; Puffer[0] = 0xA6
|
|||
|
move S1[#1],<1> ; Puffer[1] = SLAVE_ADRESSE
|
|||
|
move S1[#2],B0 ; Puffer[2] = temp
|
|||
|
spaste <2>[#3],s1 ; datainsert(Auftrag,Puffer,3);
|
|||
|
adds <2>[#0],#3 ; Auftrag[0] = Auftrag[0] + 3
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
ergs "JOB_STATUS","ERROR_TELEGRAM_LEN_OUT_OFF_RANGE"
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; generate_data_lin_kwp2000_to_kwp2000(Daten,Auftrag)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; B0 (L0) temp
|
|||
|
; I0 (L0) temp
|
|||
|
; B2 (L0) SID
|
|||
|
; I2 (L1) datalen_daten
|
|||
|
; L6 trapmask
|
|||
|
; S1 Puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
generate_data_lin_kwp2000_to_kwp2000: AW AW
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
slen I2,<1> ; datalen_daten = datalen(daten)
|
|||
|
comp I2,#0 ; datalen_daten = 0 ?
|
|||
|
jz %io ; ja -> iO
|
|||
|
comp I2,#4 ; datalen_daten < 4 ?
|
|||
|
jl %nio_1 ; ja -> Fehler
|
|||
|
|
|||
|
move I0,#0 ; temp = 0
|
|||
|
move B0,<1>[#2] ; temp = LLEN
|
|||
|
adds B0,#3 ; temp = temp + 3
|
|||
|
comp I0,I2 ; temp <> datalen_daten ?
|
|||
|
jnz %nio_1 ; ja -> Fehler
|
|||
|
|
|||
|
serase <1>[#0],#3 ; Erste 3 Byte l<>schen
|
|||
|
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "JobResult" ; tabset("JobResult")
|
|||
|
jt %nio_table,#10 ; Tabelle nicht gefunden ?
|
|||
|
comp <1>[#0],#$7F ; daten[0] == 0x7F ?
|
|||
|
jnz %1 ; nein -> goto %1
|
|||
|
|
|||
|
fix2hex S1,<1>[#2] ;
|
|||
|
tabseek "SB",S1 ; tab_suche_index("SB",daten[2])
|
|||
|
tabget S1,"STATUS_TEXT" ;
|
|||
|
ergs "JOB_STATUS",S1 ;
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%1: slen I0,<2> ; temp = datalen(auftrag)
|
|||
|
comp I0,#0 ; temp = 0 ?
|
|||
|
jz %io ; ja -> Keine SID <20>berpr<70>fung
|
|||
|
comp <2>[#0],#$B8 ; auftrag[0] == 0xB8 ?
|
|||
|
jz %2 ; ja -> goto %2
|
|||
|
|
|||
|
comp I0,#7 ; temp < 7 ?
|
|||
|
jl %io ; ja -> Keine SID <20>berpr<70>fung
|
|||
|
move B2,<2>[#6] ; SID = auftrag[6]
|
|||
|
adds B2,#$40 ; SID = SID + 0x40
|
|||
|
comp <1>[#0],B2 ; daten[0] <> SID ?
|
|||
|
jnz %nio_2 ; ja -> Fehler
|
|||
|
jump %io ; io
|
|||
|
|
|||
|
%2: comp I0,#8 ; temp < 8 ?
|
|||
|
jl %io ; ja -> Keine SID <20>berpr<70>fung
|
|||
|
move B2,<2>[#7] ; SID = auftrag[7]
|
|||
|
adds B2,#$40 ; SID = SID + 0x40
|
|||
|
comp <1>[#0],B2 ; daten[0] <> SID ?
|
|||
|
jnz %nio_2 ; ja -> Fehler
|
|||
|
; jump %io ; io
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_table: ergs "JOB_MESSAGE","Table JobResult not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_1: ergs "JOB_STATUS","ERROR_ECU_INCORRECT_LIN_LEN"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_2: ergs "JOB_STATUS","ERROR_ECU_INCORRECT_LIN_RESPONSE_ID"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%endnio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; generate_dynamically_data_from_arguments(buffer, argumentspalte)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; B0 (L0) i
|
|||
|
; B1 (L0) n
|
|||
|
; I1 (L0) size
|
|||
|
; I2 (L1) id
|
|||
|
; I3 (L1) k
|
|||
|
; I4 (L2) anzahl
|
|||
|
; L6 trapmask
|
|||
|
; S1 Puffer
|
|||
|
;---------------------------------------------------------------
|
|||
|
generate_dynamically_data_from_arguments: AW AX
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
clear <1> ; dataclear(buffer)
|
|||
|
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "MesswerteTab" ; tabset("MesswerteTab")
|
|||
|
jt %nio_table,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
move B0,#2 ; i = 2
|
|||
|
move I3,#0.I ; k = 0
|
|||
|
move I4,#1.I ; anzahl = 1
|
|||
|
%1: pars S1,B0 ; Puffer = Argument(i)
|
|||
|
jz %io ; if (!exist(Argument) %io
|
|||
|
|
|||
|
strcmp S1,"-" ; Argument(i) = "-"
|
|||
|
jnz %nio_arg5 ; Argument nicht g<>ltig ?
|
|||
|
tabseek <2>,S1 ; tabseek(argumentspalte,Argument(i))
|
|||
|
jt %nio_table1,#10 ; Tabellenspalte nicht gefunden ?
|
|||
|
jz %nio_arg2 ; Argument nicht gefunden ?
|
|||
|
|
|||
|
move <1>[I3],#2.B ; buffer[k] = 2
|
|||
|
move <1>[I3,#1],B8 ; buffer[k+1] = anzahl
|
|||
|
|
|||
|
; Datentyp size ermitteln
|
|||
|
tabget S1,"DATENTYP" ; tabget(Puffer, "DATENTYP");
|
|||
|
move B1,#0 ; n = 0
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
move I1,#0.I ; size = 0
|
|||
|
|
|||
|
comp S1[B1],#'u' ; Puffer[n] = 'u'nsigned
|
|||
|
jnz %2 ; nein -> goto %2
|
|||
|
move B1,#9 ; n = 9
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %5
|
|||
|
|
|||
|
%2: comp S1[B1],#'s' ; Puffer[n] = 's'igned
|
|||
|
jnz %21 ; nein -> goto %21
|
|||
|
move B1,#7 ; n = 7
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %5
|
|||
|
|
|||
|
%21: comp S1[B1],#'m' ; Puffer[n] = 'm'otorola
|
|||
|
jnz %22 ; nein -> goto %22
|
|||
|
move B1,#9 ; n = 9
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %3
|
|||
|
|
|||
|
%22: comp S1[B1],#'i' ; Puffer[n] = 'i'ntel oder 'i'nteger
|
|||
|
jnz %3 ; nein -> goto %3
|
|||
|
move B1,#4 ; n = 4
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[B1],#'l' ; Puffer[n] = inte'l'
|
|||
|
jnz %61 ; nein -> goto %61 (integer)
|
|||
|
move B1,#6 ; n = 6
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %3
|
|||
|
|
|||
|
%3: comp S1[B1],#'f' ; Puffer[n] = 'f'loat
|
|||
|
jnz %4 ; nein -> goto %4
|
|||
|
move I1,#4.I ; size = 4
|
|||
|
jump %typ_ok
|
|||
|
|
|||
|
%4: comp S1[B1],#'d' ; Puffer[n] = 'd'ouble
|
|||
|
jnz %5 ; nein -> goto %5
|
|||
|
move I1,#8.I ; size = 8
|
|||
|
jump %typ_ok
|
|||
|
|
|||
|
%5: comp S1[B1],#'c' ; Puffer[n] = 'c'har
|
|||
|
jnz %6 ; nein -> goto %6
|
|||
|
move I1,#1.I ; size = 1
|
|||
|
jump %typ_ok
|
|||
|
|
|||
|
%6: comp S1[B1],#'i' ; Puffer[n] = 'i'nteger
|
|||
|
jnz %7 ; nein -> goto %7
|
|||
|
%61: move I1,#2.I ; size = 2
|
|||
|
jump %typ_ok
|
|||
|
|
|||
|
%7: comp S1[B1],#'l' ; Puffer[n] = 'l'ong
|
|||
|
jnz %nio_arg3 ; nein -> goto %nio_arg3
|
|||
|
move I1,#4.I ; size = 4
|
|||
|
jump %typ_ok
|
|||
|
|
|||
|
%typ_ok: move <1>[I3,#2],I1 ; buffer[k+2] = size
|
|||
|
adds I4,I1 ; anzahl = anzahl + size
|
|||
|
comp I4,#$100 ;
|
|||
|
jg %nio_arg4 ; anzahl <20>berlauf
|
|||
|
|
|||
|
; ID ermitteln
|
|||
|
tabget S1,"ID" ; tabget(Puffer, "ID");
|
|||
|
a2fix I2,S1 ; id = atoi(Puffer);
|
|||
|
move <1>[I3,#3],B5 ; buffer[k+3] = id(high)
|
|||
|
move <1>[I3,#4],B4 ; buffer[k+4] = id(Low)
|
|||
|
|
|||
|
move <1>[I3,#5],#1.B ; buffer[k+5] = 1
|
|||
|
adds I3,#6 ; k = k + 6
|
|||
|
|
|||
|
adds B0,#1 ; i = i + 1
|
|||
|
comp B0,#43 ; Maximal 1..43 Argumente
|
|||
|
jle %1 ; Wenn kleiner gleich 43
|
|||
|
|
|||
|
pars S1,B0 ; Puffer = Argument(i)
|
|||
|
jz %io ; if (!exist(Argument) %io
|
|||
|
jump %nio_arg1 ; Zu viele Argumente
|
|||
|
|
|||
|
%nio_arg1: ergs "JOB_MESSAGE","Too much arguments"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg2: ergs "JOB_MESSAGE","Argument not found"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg3: ergs "JOB_MESSAGE","Datatype not found"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg4: ergs "JOB_MESSAGE","Size overflow"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg5: ergs "JOB_MESSAGE","Argument not valid"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_table: ergs "JOB_MESSAGE","Table MesswerteTab not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_table1:ergs "JOB_MESSAGE","Table MesswerteTab column not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%endnio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; create_dynamically_results_from_data(daten, argumentspalte)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
|||
|
;
|
|||
|
; B0 (L0) i
|
|||
|
; B1 (L0) n
|
|||
|
; I1 (L0) size
|
|||
|
; I2 (L1) id
|
|||
|
; I3 (L1) datalen_daten
|
|||
|
; I4 (L2) pos
|
|||
|
; I5 (L2) itemp
|
|||
|
; I6 (L3) strlen_einheit
|
|||
|
; BE (L3) datentyp
|
|||
|
; I8 (L4) strlen_text
|
|||
|
; I9 (L4) strlen_info
|
|||
|
; L6 trapmask
|
|||
|
; L7 temp
|
|||
|
; S1 Puffer
|
|||
|
; ab [#400] Zwischenpuffer Float, Double
|
|||
|
; ab [#500] Zwischenpuffer Einheit
|
|||
|
; ab [#600] Zwischenpuffer Hex String
|
|||
|
; ab [#600] Zwischenpuffer Resultname
|
|||
|
; ab [#700] Zwischenpuffer Diskreter Text
|
|||
|
; ab [#800] Zwischenpuffer Info Text
|
|||
|
; F0 r
|
|||
|
; F1 rtemp
|
|||
|
;---------------------------------------------------------------
|
|||
|
create_dynamically_results_from_data: AW AX
|
|||
|
gettmr L6 ; trapmask=get_trap_mask()
|
|||
|
settmr #$400.L ; set_trap_mask(0x400)
|
|||
|
tabset "MesswerteTab" ; tabset("MesswerteTab")
|
|||
|
jt %nio_table,#10 ; Tabelle nicht gefunden ?
|
|||
|
|
|||
|
move B0,#2 ; i = 2
|
|||
|
move I4,#0.I ; pos = 0
|
|||
|
slen I3,<1> ; datalen_daten = datalen(daten)
|
|||
|
|
|||
|
%0001: pars S1,B0 ; Puffer = Argument(i)
|
|||
|
jz %9002 ; if (!exist(Argument) %9002
|
|||
|
|
|||
|
strcmp S1,"-" ; Argument(i) = "-"
|
|||
|
jnz %nio_arg7 ; Argument nicht g<>ltig ?
|
|||
|
tabseek <2>,S1 ; tabseek(argumentspalte,Argument(i))
|
|||
|
jt %nio_table1,#10 ; Tabellenspalte nicht gefunden ?
|
|||
|
jz %nio_arg2 ; Argument nicht gefunden ?
|
|||
|
|
|||
|
tabget S1,"INFO" ; tabget(Puffer, "INFO");
|
|||
|
jt %0002,#10 ; Spalte nicht gefunden ?
|
|||
|
strlen I9,S1 ; strlen_einheit = strlen(EINHEIT)
|
|||
|
adds I9,#1 ; '\0' noch dazu
|
|||
|
move S1[#800],S1[#0]I9; Info nach hinten schieben
|
|||
|
jump %0003
|
|||
|
|
|||
|
%0002: clrt ; Trapregister l<>schen
|
|||
|
move S1[#800],#'-' ; wenn nicht gefunden dann "-"
|
|||
|
move S1[#801],#0
|
|||
|
move I9,#1
|
|||
|
|
|||
|
%0003: tabget S1,"EINHEIT" ; tabget(Puffer, "EINHEIT");
|
|||
|
strlen I6,S1 ; strlen_einheit = strlen(EINHEIT)
|
|||
|
adds I6,#1 ; '\0' noch dazu
|
|||
|
move S1[#500],S1[#0]I6; Einheit nach hinten schieben
|
|||
|
or S1[#0],#$20 ; Puffer[0] = Puffer[0] | 0x20 --> Kleinbuchstabe
|
|||
|
or S1[#1],#$20 ; Puffer[1] = Puffer[1] | 0x20 --> Kleinbuchstabe
|
|||
|
or S1[#2],#$20 ; Puffer[2] = Puffer[2] | 0x20 --> Kleinbuchstabe
|
|||
|
strcmp S1,"0/1" ; Digitaler Wert
|
|||
|
jz %3001 ; nein -> goto %3001
|
|||
|
; Digitaler Wert
|
|||
|
; Datentyp size ermitteln
|
|||
|
tabget S1,"DATENTYP" ; tabget(Puffer, "DATENTYP");
|
|||
|
move L7,#0.L ; temp = 0
|
|||
|
move B1,#0 ; n = 0
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
move I1,#0.I ; size = 0
|
|||
|
|
|||
|
comp S1[B1],#'u' ; Puffer[n] = 'u'nsigned
|
|||
|
jnz %4002 ; nein -> goto %4002
|
|||
|
move B1,#9 ; n = 9
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %4003
|
|||
|
|
|||
|
%4002: comp S1[B1],#'s' ; Puffer[n] = 's'igned
|
|||
|
jnz %4003 ; nein -> goto %4003
|
|||
|
move B1,#7 ; n = 7
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %4003
|
|||
|
|
|||
|
%4003: comp S1[B1],#'c' ; Puffer[n] = 'c'har
|
|||
|
jnz %4004 ; nein -> goto %4004
|
|||
|
move I1,#1.I ; size = 1
|
|||
|
move L7,#0.L
|
|||
|
move AC,<1>[I4]
|
|||
|
jump %typ_ok4
|
|||
|
|
|||
|
%4004: comp S1[B1],#'i' ; Puffer[n] = 'i'ntel oder 'i'nteger
|
|||
|
jnz %4007 ; nein -> goto %4007
|
|||
|
move B1,#4 ; n = 4
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[B1],#'l' ; Puffer[n] = inte'l'
|
|||
|
jz %nio_arg3 ; ja -> goto %nio_arg3
|
|||
|
move I1,#2.I ; size = 2
|
|||
|
move L7,#0.L
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %4005 ; nein -> goto %4005
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
jump %typ_ok4
|
|||
|
%4005: move AC,<1>[I4,#1]
|
|||
|
move AD,<1>[I4]
|
|||
|
jump %typ_ok4
|
|||
|
|
|||
|
%4007: comp S1[B1],#'l' ; Puffer[n] = 'l'ong
|
|||
|
jnz %nio_arg3 ; nein -> goto %nio_arg3
|
|||
|
move I1,#4.I ; size = 4
|
|||
|
move L7,#0.L
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %4008 ; nein -> goto %4008
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
move AE,<1>[I4,#2]
|
|||
|
move AF,<1>[I4,#3]
|
|||
|
jump %typ_ok4
|
|||
|
%4008: move AC,<1>[I4,#3]
|
|||
|
move AD,<1>[I4,#2]
|
|||
|
move AE,<1>[I4,#1]
|
|||
|
move AF,<1>[I4]
|
|||
|
; jump %typ_ok4
|
|||
|
|
|||
|
%typ_ok4: tabget S1,"RESULTNAME"
|
|||
|
ergd S1,L7
|
|||
|
|
|||
|
strlen I5,S1 ; itemp = strlen(RESULTNAME)
|
|||
|
comp I5,#63 ; itemp == 63
|
|||
|
jg %nio_res ; nein -> goto %nio_res
|
|||
|
subb I5,#4 ; zur<75>ck auf ..._'WERT'
|
|||
|
comp I5,#0 ; itemp == 0
|
|||
|
jl %4101 ; nein -> goto %4101
|
|||
|
or S1[I5],#$20 ; Puffer[itemp] = Puffer[itemp] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5],#'w'
|
|||
|
jnz %4101 ; nein -> goto %4101
|
|||
|
or S1[I5,#1],#$20 ; Puffer[itemp+1] = Puffer[itemp+1] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5,#1],#'e'
|
|||
|
jnz %4101 ; nein -> goto %4101
|
|||
|
or S1[I5,#2],#$20 ; Puffer[itemp+2] = Puffer[itemp+2] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5,#2],#'r'
|
|||
|
jnz %4101 ; nein -> goto %4101
|
|||
|
or S1[I5,#3],#$20 ; Puffer[itemp+3] = Puffer[itemp+3] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5,#3],#'t'
|
|||
|
jnz %4101 ; nein -> goto %4101
|
|||
|
jump %nio_res ; nein -> goto %nio_res
|
|||
|
|
|||
|
%4101: tabget S1,"RESULTNAME"
|
|||
|
strlen I5,S1 ; itemp = strlen(RESULTNAME)
|
|||
|
comp I5,#58 ; itemp == 63-5
|
|||
|
jg %nio_res ; nein -> goto %nio_res
|
|||
|
move S1[I5],#'_'
|
|||
|
move S1[I5,#1],#'I'
|
|||
|
move S1[I5,#2],#'N'
|
|||
|
move S1[I5,#3],#'F'
|
|||
|
move S1[I5,#4],#'O'
|
|||
|
move S1[I5,#5],#0 ; Puffer[itemp] = ..."_INFO"
|
|||
|
ergs S1,S1[#800]I9 ; RESULT_INFO = INFO
|
|||
|
|
|||
|
ergl "Wert",L7
|
|||
|
|
|||
|
comp L7,#0.L ; temp = 0
|
|||
|
jz %mk_pos ; ja -> goto %mk_pos
|
|||
|
comp L7,#1.L ; temp = 1
|
|||
|
jz %mk_pos ; ja -> goto %mk_pos
|
|||
|
ergs "JOB_MESSAGE","Warning: Digital value not valid"
|
|||
|
jump %mk_pos ; ja -> goto %mk_pos
|
|||
|
; jump %nio_dig ; nein -> goto %nio_dig
|
|||
|
; fertig
|
|||
|
|
|||
|
%3001: strcmp S1,"0-n" ; Diskreter Wert
|
|||
|
jz %2001 ; nein -> goto %2001
|
|||
|
; Diskreter Wert
|
|||
|
; Datentyp size ermitteln
|
|||
|
tabget S1,"DATENTYP" ; tabget(Puffer, "DATENTYP");
|
|||
|
move L7,#0.L ; temp = 0
|
|||
|
move B1,#0 ; n = 0
|
|||
|
move BE,#0 ; datentyp = 0
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
move I1,#0.I ; size = 0
|
|||
|
comp S1[B1],#'u' ; Puffer[n] = 'u'nsigned
|
|||
|
jnz %3002 ; nein -> goto %3002
|
|||
|
move B1,#9 ; n = 9
|
|||
|
move BE,#4 ; datentyp = 4
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %3003
|
|||
|
|
|||
|
%3002: comp S1[B1],#'s' ; Puffer[n] = 's'igned
|
|||
|
jnz %3003 ; nein -> goto %3003
|
|||
|
move B1,#7 ; n = 7
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %3003
|
|||
|
|
|||
|
%3003: comp S1[B1],#'c' ; Puffer[n] = 'c'har
|
|||
|
jnz %3004 ; nein -> goto %3004
|
|||
|
move I1,#1.I ; size = 1
|
|||
|
move L7,#0.L
|
|||
|
move AC,<1>[I4]
|
|||
|
jump %typ_ok3
|
|||
|
|
|||
|
%3004: comp S1[B1],#'i' ; Puffer[n] = 'i'ntel oder 'i'nteger
|
|||
|
jnz %3007 ; nein -> goto %3007
|
|||
|
move B1,#4 ; n = 4
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[B1],#'l' ; Puffer[n] = inte'l'
|
|||
|
jz %nio_arg3 ; ja -> goto %nio_arg3
|
|||
|
move I1,#2.I ; size = 2
|
|||
|
adds BE,#1.B ; datentyp = datentyp + 1
|
|||
|
move L7,#0.L
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %3005 ; nein -> goto %3005
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
jump %typ_ok3
|
|||
|
%3005: move AC,<1>[I4,#1]
|
|||
|
move AD,<1>[I4]
|
|||
|
jump %typ_ok3
|
|||
|
|
|||
|
%3007: comp S1[B1],#'l' ; Puffer[n] = 'l'ong
|
|||
|
jnz %nio_arg3 ; nein -> goto %nio_arg3
|
|||
|
move I1,#4.I ; size = 4
|
|||
|
adds BE,#2.B ; datentyp = datentyp + 2
|
|||
|
move L7,#0.L
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %3008 ; nein -> goto %3008
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
move AE,<1>[I4,#2]
|
|||
|
move AF,<1>[I4,#3]
|
|||
|
jump %typ_ok3
|
|||
|
%3008: move AC,<1>[I4,#3]
|
|||
|
move AD,<1>[I4,#2]
|
|||
|
move AE,<1>[I4,#1]
|
|||
|
move AF,<1>[I4]
|
|||
|
; jump %typ_ok3
|
|||
|
|
|||
|
%typ_ok3: tabget S1,"RESULTNAME"
|
|||
|
; Ergebnisse zuweisen
|
|||
|
|
|||
|
comp BE,#6 ; datentyp -> unsigned long
|
|||
|
jnz %3101 ; nein -> goto %3101
|
|||
|
ergd S1,L7
|
|||
|
jump %3106
|
|||
|
|
|||
|
%3101: comp BE,#2 ; datentyp -> signed long
|
|||
|
jnz %3102 ; nein -> goto %3102
|
|||
|
ergl S1,L7
|
|||
|
jump %3106
|
|||
|
|
|||
|
%3102: comp BE,#5 ; datentyp -> unsigned int
|
|||
|
jnz %3103 ; nein -> goto %3103
|
|||
|
ergw S1,IE
|
|||
|
jump %3106
|
|||
|
|
|||
|
%3103: comp BE,#1 ; datentyp -> signed int
|
|||
|
jnz %3104 ; nein -> goto %3104
|
|||
|
ergi S1,IE
|
|||
|
jump %3106
|
|||
|
|
|||
|
%3104: comp BE,#4 ; datentyp -> unsigned char
|
|||
|
jnz %3105 ; nein -> goto %3105
|
|||
|
ergb S1,AC
|
|||
|
jump %3106
|
|||
|
|
|||
|
%3105: ergc S1,AC ; datentyp -> signed char
|
|||
|
; jump %3106
|
|||
|
|
|||
|
%3106: strlen I5,S1 ; itemp = strlen(RESULTNAME)
|
|||
|
comp I5,#63 ; itemp == 63
|
|||
|
jg %nio_res ; nein -> goto %nio_res
|
|||
|
subb I5,#4 ; zur<75>ck auf ..._'WERT'
|
|||
|
comp I5,#0 ; itemp == 0
|
|||
|
jl %nio_res ; nein -> goto %nio_res
|
|||
|
or S1[I5],#$20 ; Puffer[itemp] = Puffer[itemp] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5],#'w'
|
|||
|
jnz %nio_res ; nein -> goto %nio_res
|
|||
|
or S1[I5,#1],#$20 ; Puffer[itemp+1] = Puffer[itemp+1] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5,#1],#'e'
|
|||
|
jnz %nio_res ; nein -> goto %nio_res
|
|||
|
or S1[I5,#2],#$20 ; Puffer[itemp+2] = Puffer[itemp+2] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5,#2],#'r'
|
|||
|
jnz %nio_res ; nein -> goto %nio_res
|
|||
|
or S1[I5,#3],#$20 ; Puffer[itemp+3] = Puffer[itemp+3] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5,#3],#'t'
|
|||
|
jnz %nio_res ; nein -> goto %nio_res
|
|||
|
|
|||
|
move S1[I5],#'E'
|
|||
|
move S1[I5,#1],#'I'
|
|||
|
move S1[I5,#2],#'N'
|
|||
|
move S1[I5,#3],#'H' ; Puffer[itemp] = ..._"EINH"
|
|||
|
ergs S1,S1[#500]I6 ; RESULT_EINH = EINHEIT
|
|||
|
|
|||
|
move S1[I5],#'I'
|
|||
|
move S1[I5,#1],#'N'
|
|||
|
move S1[I5,#2],#'F'
|
|||
|
move S1[I5,#3],#'O' ; Puffer[itemp] = ..._"INFO"
|
|||
|
ergs S1,S1[#800]I9 ; RESULT_INFO = INFO
|
|||
|
|
|||
|
adds I5,#5 ; wieder ans Ende + '\0' noch dazu
|
|||
|
move S1[#600],S1[#0]I5; Resultname nach hinten schieben
|
|||
|
|
|||
|
tabget S1,"NAME" ; tabget(Puffer, "Name");
|
|||
|
strcmp S1,"-" ; Puffer == "-"
|
|||
|
jnz %mk_pos ; Keine Tabelle fertig
|
|||
|
|
|||
|
tabset S1 ; tabset(Name)
|
|||
|
jt %nio_table2,#10 ; Tabelle nicht gefunden ?
|
|||
|
tabseeku "WERT",L7 ; tab_suche_unsigned("WERT")
|
|||
|
; jz %nio_arg6 ; nicht gefunden ?
|
|||
|
tabget S1,"TEXT" ; tabget(Puffer, "TEXT");
|
|||
|
tabset "MesswerteTab" ; wieder zur Tabelle "MesswerteTab" zur<75>ck
|
|||
|
|
|||
|
strlen I8,S1 ; strlen_text = strlen(TEXT)
|
|||
|
adds I8,#1 ; '\0' noch dazu
|
|||
|
move S1[#700],S1[#0]I8; Text nach hinten schieben
|
|||
|
|
|||
|
move S1[#0],S1[#600]I5; Resultname wieder nach unten schieben
|
|||
|
subb I5,#5 ; zur<75>ck auf ..._'WERT'
|
|||
|
move S1[I5],#'T'
|
|||
|
move S1[I5,#1],#'E'
|
|||
|
move S1[I5,#2],#'X'
|
|||
|
move S1[I5,#3],#'T' ; Puffer[itemp] = ..._"TEXT"
|
|||
|
ergs S1,S1[#700]I8 ; RESULT_TEXT = TEXT
|
|||
|
jump %mk_pos ; fertig
|
|||
|
|
|||
|
%2001: strcmp S1,"hex" ; Hex String
|
|||
|
jz %1001 ; nein -> goto %1001
|
|||
|
; Hex String
|
|||
|
; Datentyp size ermitteln
|
|||
|
tabget S1,"DATENTYP" ; tabget(Puffer, "DATENTYP");
|
|||
|
move L7,#0.L ; temp = 0
|
|||
|
move B1,#0 ; n = 0
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
move I1,#0.I ; size = 0
|
|||
|
|
|||
|
comp S1[B1],#'u' ; Puffer[n] = 'u'nsigned
|
|||
|
jnz %2002 ; nein -> goto %2002
|
|||
|
move B1,#9 ; n = 9
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %2003
|
|||
|
|
|||
|
%2002: comp S1[B1],#'s' ; Puffer[n] = 's'igned
|
|||
|
jnz %2003 ; nein -> goto %2003
|
|||
|
move B1,#7 ; n = 7
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
; jump %2003
|
|||
|
|
|||
|
%2003: comp S1[B1],#'c' ; Puffer[n] = 'c'har
|
|||
|
jnz %2004 ; nein -> goto %2004
|
|||
|
move I1,#1.I ; size = 1
|
|||
|
move AC,<1>[I4]
|
|||
|
fix2hex S1,AC
|
|||
|
move S1[#600],S1[#2]#3; Hex String ohne 0x nach hinten schieben
|
|||
|
jump %typ_ok2
|
|||
|
|
|||
|
%2004: comp S1[B1],#'i' ; Puffer[n] = 'i'ntel oder 'i'nteger
|
|||
|
jnz %2007 ; nein -> goto %2007
|
|||
|
move B1,#4 ; n = 4
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[B1],#'l' ; Puffer[n] = inte'l'
|
|||
|
jz %nio_arg3 ; ja -> goto %nio_arg3
|
|||
|
move I1,#2.I ; size = 2
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %2005 ; nein -> goto %2005
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
jump %2006
|
|||
|
%2005: move AC,<1>[I4,#1]
|
|||
|
move AD,<1>[I4]
|
|||
|
%2006: fix2hex S1,IE
|
|||
|
move S1[#600],S1[#2]#5; Hex String ohne 0x nach hinten schieben
|
|||
|
jump %typ_ok2
|
|||
|
|
|||
|
%2007: comp S1[B1],#'l' ; Puffer[n] = 'l'ong
|
|||
|
jnz %nio_arg3 ; nein -> goto %nio_arg3
|
|||
|
move I1,#4.I ; size = 4
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %2008 ; nein -> goto %2008
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
move AE,<1>[I4,#2]
|
|||
|
move AF,<1>[I4,#3]
|
|||
|
jump %2009
|
|||
|
%2008: move AC,<1>[I4,#3]
|
|||
|
move AD,<1>[I4,#2]
|
|||
|
move AE,<1>[I4,#1]
|
|||
|
move AF,<1>[I4]
|
|||
|
%2009: fix2hex S1,L7
|
|||
|
move S1[#600],S1[#2]#9; Hex String ohne 0x nach hinten schieben
|
|||
|
jump %typ_ok2
|
|||
|
|
|||
|
%typ_ok2: tabget S1,"RESULTNAME"
|
|||
|
ergs S1,S1[#600]#9
|
|||
|
jump %mk_einh ; fertig
|
|||
|
|
|||
|
; Analogwerte
|
|||
|
; Datentyp size ermitteln
|
|||
|
%1001: tabget S1,"DATENTYP" ; tabget(Puffer, "DATENTYP");
|
|||
|
move L7,#0.L ; temp = 0
|
|||
|
move B1,#0 ; n = 0
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
move I1,#0.I ; size = 0
|
|||
|
|
|||
|
comp S1[B1],#'u' ; Puffer[n] = 'u'nsigned
|
|||
|
jnz %1009 ; nein -> goto %1009
|
|||
|
move B1,#9 ; n = 9
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
|
|||
|
comp S1[B1],#'c' ; Puffer[n] = 'c'har
|
|||
|
jnz %1002 ; nein -> goto %1002
|
|||
|
move I1,#1.I ; size = 1
|
|||
|
move AC,<1>[I4]
|
|||
|
fix2flt F0,L7 ; r=daten[pos]size
|
|||
|
jump %typ_ok1
|
|||
|
|
|||
|
%1002: comp S1[B1],#'i' ; Puffer[n] = 'i'nteger
|
|||
|
jnz %1005 ; nein -> goto %1005
|
|||
|
move I1,#2.I ; size = 2
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %1003 ; nein -> goto %1003
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
jump %1004
|
|||
|
%1003: move AC,<1>[I4,#1]
|
|||
|
move AD,<1>[I4]
|
|||
|
%1004: fix2flt F0,L7 ; r=daten[pos]size
|
|||
|
jump %typ_ok1
|
|||
|
|
|||
|
%1005: comp S1[B1],#'l' ; Puffer[n] = 'l'ong
|
|||
|
jnz %nio_arg3 ; nein -> goto %nio_arg3
|
|||
|
move I1,#4.I ; size = 4
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %1006 ; nein -> goto %1006
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
move AE,<1>[I4,#2]
|
|||
|
move AF,<1>[I4,#3]
|
|||
|
jump %1007
|
|||
|
%1006: move AC,<1>[I4,#3]
|
|||
|
move AD,<1>[I4,#2]
|
|||
|
move AE,<1>[I4,#1]
|
|||
|
move AF,<1>[I4]
|
|||
|
%1007: fix2flt F0,L7 ; r=daten[pos]size
|
|||
|
comp L7,#0 ; temp == 0
|
|||
|
jge %1008 ; ja -> goto %1008
|
|||
|
a2flt F1,"4294967296" ; rtemp = 0x100000000
|
|||
|
fadd F0,F1 ; r = r + rtemp
|
|||
|
%1008: jump %typ_ok1
|
|||
|
|
|||
|
%1009: comp S1[B1],#'s' ; Puffer[n] = 's'igned
|
|||
|
jnz %1010 ; nein -> goto %1010
|
|||
|
move B1,#7 ; n = 7
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %1015
|
|||
|
|
|||
|
%1010: comp S1[B1],#'m' ; Puffer[n] = 'm'otorola
|
|||
|
jnz %1012 ; nein -> goto %1012
|
|||
|
move B1,#9 ; n = 9
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
|
|||
|
comp S1[B1],#'f' ; Puffer[n] = 'f'loat
|
|||
|
jnz %1011 ; nein -> goto %1011
|
|||
|
move I1,#4.I ; size = 4
|
|||
|
move S1[#400],<1>[I4]#4 ; Puffer[400] = daten[pos]
|
|||
|
swap S1[#400]#4 ; Motorola-Format
|
|||
|
y42flt F0,S1[#400] ; r = Puffer[400]
|
|||
|
jump %typ_ok1
|
|||
|
|
|||
|
%1011: comp S1[B1],#'d' ; Puffer[n] = 'd'ouble
|
|||
|
jnz %nio_arg3 ; nein -> goto %nio_arg3
|
|||
|
move I1,#8.I ; size = 8
|
|||
|
move S1[#400],<1>[I4]#8 ; Puffer[400] = daten[pos]
|
|||
|
swap S1[#400]#8 ; Motorola-Format
|
|||
|
y82flt F0,S1[#400] ; r = Puffer[400]
|
|||
|
jump %typ_ok1
|
|||
|
|
|||
|
%1012: comp S1[B1],#'i' ; Puffer[n] = 'i'ntel oder 'i'nteger
|
|||
|
jnz %1013 ; nein -> goto %1013
|
|||
|
move B1,#4 ; n = 4
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[B1],#'l' ; Puffer[n] = inte'l'
|
|||
|
jnz %1018 ; nein -> goto %1018 (integer)
|
|||
|
move B1,#6 ; n = 6
|
|||
|
or S1[B1],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
jump %1013
|
|||
|
|
|||
|
%1013: comp S1[B1],#'f' ; Puffer[n] = 'f'loat
|
|||
|
jnz %1014 ; nein -> goto %1014
|
|||
|
move I1,#4.I ; size = 4
|
|||
|
y42flt F0,<1>[I4] ; r = daten[pos]
|
|||
|
jump %typ_ok1
|
|||
|
|
|||
|
%1014: comp S1[B1],#'d' ; Puffer[n] = 'd'ouble
|
|||
|
jnz %1015 ; nein -> goto %1015
|
|||
|
move I1,#8.I ; size = 8
|
|||
|
y82flt F0,<1>[I4] ; r = daten[pos]
|
|||
|
jump %typ_ok1
|
|||
|
|
|||
|
%1015: comp S1[B1],#'c' ; Puffer[n] = 'c'har
|
|||
|
jnz %1017 ; nein -> goto %1017
|
|||
|
move I1,#1.I ; size = 1
|
|||
|
move AC,<1>[I4]
|
|||
|
comp L7,#$7F ; temp == 127
|
|||
|
jle %1016 ; nein -> goto %1016
|
|||
|
subb L7,#$100 ; temp = temp - 256
|
|||
|
%1016: fix2flt F0,L7 ; r=daten[pos]size
|
|||
|
jump %typ_ok1
|
|||
|
|
|||
|
%1017: comp S1[B1],#'i' ; Puffer[n] = 'i'nteger
|
|||
|
jnz %1022 ; nein -> goto %1022
|
|||
|
%1018: move I1,#2.I ; size = 2
|
|||
|
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %1019 ; nein -> goto %1019
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
jump %1020
|
|||
|
%1019: move AC,<1>[I4,#1]
|
|||
|
move AD,<1>[I4]
|
|||
|
%1020: comp L7,#$7FFF ; temp == 32767
|
|||
|
jle %1021 ; nein -> goto %1021
|
|||
|
subb L7,#$10000 ; temp = temp - 65536
|
|||
|
%1021: fix2flt F0,L7 ; r=daten[pos]size
|
|||
|
jump %typ_ok1
|
|||
|
|
|||
|
%1022: comp S1[B1],#'l' ; Puffer[n] = 'l'ong
|
|||
|
jnz %nio_arg3 ; nein -> goto %nio_arg3
|
|||
|
move I1,#4.I ; size = 4
|
|||
|
tabget S1,"L/H" ; tabget(Puffer, "L/H");
|
|||
|
or S1[#0],#$20 ; Puffer[n] = Puffer[n] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[#0],#'l' ; Puffer[n] = 'l'
|
|||
|
jnz %1023 ; nein -> goto %1023
|
|||
|
move AC,<1>[I4]
|
|||
|
move AD,<1>[I4,#1]
|
|||
|
move AE,<1>[I4,#2]
|
|||
|
move AF,<1>[I4,#3]
|
|||
|
jump %1024
|
|||
|
%1023: move AC,<1>[I4,#3]
|
|||
|
move AD,<1>[I4,#2]
|
|||
|
move AE,<1>[I4,#1]
|
|||
|
move AF,<1>[I4]
|
|||
|
%1024: fix2flt F0,L7 ; r=daten[pos]size
|
|||
|
jump %typ_ok1
|
|||
|
|
|||
|
%typ_ok1: tabget S1,"MUL"
|
|||
|
strcmp S1,"-" ; Puffer == "-"
|
|||
|
jnz %1101 ; ja -> goto %1101
|
|||
|
a2flt F1,S1 ; rtemp = ator(Puffer)
|
|||
|
fmul F0,F1 ; r = r * rtemp
|
|||
|
|
|||
|
%1101: tabget S1,"DIV"
|
|||
|
strcmp S1,"-" ; Puffer == "-"
|
|||
|
jnz %1102 ; ja -> goto %1102
|
|||
|
a2flt F1,S1 ; rtemp = ator(Puffer)
|
|||
|
a2flt F2,"0" ; rtemp2 = 0
|
|||
|
fcomp F1,F2 ; F1 = 0
|
|||
|
jz %nio_div ; ja -> goto %nio_div
|
|||
|
fdiv F0,F1 ; r = r / rtemp
|
|||
|
|
|||
|
%1102: tabget S1,"ADD"
|
|||
|
strcmp S1,"-" ; Puffer == "-"
|
|||
|
jnz %mk_real ; ja -> goto %mk_real
|
|||
|
a2flt F1,S1 ; rtemp = ator(Puffer)
|
|||
|
fadd F0,F1 ; r = r + rtemp
|
|||
|
|
|||
|
%mk_real: tabget S1,"RESULTNAME"
|
|||
|
ergr S1,F0
|
|||
|
|
|||
|
%mk_einh: strlen I5,S1 ; itemp = strlen(RESULTNAME)
|
|||
|
comp I5,#63 ; itemp == 63
|
|||
|
jg %nio_res ; nein -> goto %nio_res
|
|||
|
subb I5,#4 ; zur<75>ck auf ..._'WERT'
|
|||
|
comp I5,#0 ; itemp == 0
|
|||
|
jl %nio_res ; nein -> goto %nio_res
|
|||
|
or S1[I5],#$20 ; Puffer[itemp] = Puffer[itemp] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5],#'w'
|
|||
|
jnz %nio_res ; nein -> goto %nio_res
|
|||
|
or S1[I5,#1],#$20 ; Puffer[itemp+1] = Puffer[itemp+1] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5,#1],#'e'
|
|||
|
jnz %nio_res ; nein -> goto %nio_res
|
|||
|
or S1[I5,#2],#$20 ; Puffer[itemp+2] = Puffer[itemp+2] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5,#2],#'r'
|
|||
|
jnz %nio_res ; nein -> goto %nio_res
|
|||
|
or S1[I5,#3],#$20 ; Puffer[itemp+3] = Puffer[itemp+3] | 0x20 --> Kleinbuchstabe
|
|||
|
comp S1[I5,#3],#'t'
|
|||
|
jnz %nio_res ; nein -> goto %nio_res
|
|||
|
|
|||
|
move S1[I5],#'E'
|
|||
|
move S1[I5,#1],#'I'
|
|||
|
move S1[I5,#2],#'N'
|
|||
|
move S1[I5,#3],#'H' ; Puffer[itemp] = ..._"EINH"
|
|||
|
ergs S1,S1[#500]I6 ; RESULT_EINH = EINHEIT
|
|||
|
|
|||
|
move S1[I5],#'I'
|
|||
|
move S1[I5,#1],#'N'
|
|||
|
move S1[I5,#2],#'F'
|
|||
|
move S1[I5,#3],#'O' ; Puffer[itemp] = ..._"INFO"
|
|||
|
ergs S1,S1[#800]I9 ; RESULT_INFO = INFO
|
|||
|
|
|||
|
; jump %mk_pos ; fertig
|
|||
|
|
|||
|
%mk_pos: adds I4,I1 ; pos = pos + size
|
|||
|
comp I4,I3 ; pos == datalen_daten ?
|
|||
|
jg %nio_arg4 ; Zu wenig Daten
|
|||
|
|
|||
|
adds B0,#1 ; i = i + 1
|
|||
|
comp B0,#43 ; Maximal 1..43 Argumente
|
|||
|
jle %0001 ; Wenn kleiner gleich 43
|
|||
|
|
|||
|
pars S1,B0 ; Puffer = Argument(i)
|
|||
|
jz %9002 ; if (!exist(Argument) %9002
|
|||
|
jump %nio_arg1 ; Zu viele Argumente
|
|||
|
|
|||
|
%9002: comp I4,I3 ; pos == datalen_daten ?
|
|||
|
jl %nio_arg5 ; Zu viele Daten
|
|||
|
jump %io ; komplett fertig
|
|||
|
|
|||
|
%nio_dig: ergs "JOB_MESSAGE","Digital value not valid"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_res: ergs "JOB_MESSAGE","Resultname not valid"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_div: ergs "JOB_MESSAGE","Division by zero"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg1: ergs "JOB_MESSAGE","Too much arguments"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg2: ergs "JOB_MESSAGE","Argument not found"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg3: ergs "JOB_MESSAGE","Datatype not found"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg4: ergs "JOB_MESSAGE","Too less data"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg5: ergs "JOB_MESSAGE","Too much data"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg6: ergs "JOB_MESSAGE","Discrete value not found"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_arg7: ergs "JOB_MESSAGE","Argument not valid"
|
|||
|
ergs "JOB_STATUS","ERROR_ARGUMENT"
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio_table: ergs "JOB_MESSAGE","Table MesswerteTab not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_table1:ergs "JOB_MESSAGE","Table MesswerteTab column not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%nio_table2:ergs "JOB_MESSAGE","Discrete value table not found"
|
|||
|
ergs "JOB_STATUS","ERROR_TABLE"
|
|||
|
clrt ; Trapregister l<>schen
|
|||
|
jump %endnio ; Fehler !
|
|||
|
|
|||
|
%endnio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end: settmr L6 ; set_trap_mask(trapmask)
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; is_unsigned_string(String)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx
|
|||
|
;
|
|||
|
; B0 (L0) index
|
|||
|
; B1 (L0) maxlen
|
|||
|
;---------------------------------------------------------------
|
|||
|
is_unsigned_string: AX
|
|||
|
move B0,#0 ; index = 0
|
|||
|
move B1,#10 ; maxlen = 10
|
|||
|
comp S1[B0],#0 ; Leerstring ?
|
|||
|
jz %nio ; ja -> goto %nio
|
|||
|
|
|||
|
comp S1[B0],#'+'
|
|||
|
jnz %0001 ; nein -> goto %0001
|
|||
|
adds B1,#1 ; maxlen++
|
|||
|
adds B0,#1 ; index++
|
|||
|
comp S1[B0],#0 ; Stringende ?
|
|||
|
jz %nio ; ja -> goto %nio
|
|||
|
; jump %0001
|
|||
|
|
|||
|
%0001: comp S1[B0],#$30
|
|||
|
jl %nio ; < '0'
|
|||
|
comp S1[B0],#$39
|
|||
|
jg %nio ; > '9'
|
|||
|
adds B0,#1 ; index++
|
|||
|
comp S1[B0],#0 ; Stringende ?
|
|||
|
jz %io ; ja -> goto %io
|
|||
|
comp B0,B1 ; mehr als maxlen Stellen ?
|
|||
|
jge %nio ; ja -> goto %nio
|
|||
|
jump %0001
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; is_signed_string(String)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx
|
|||
|
;
|
|||
|
; B0 (L0) index
|
|||
|
; B1 (L0) maxlen
|
|||
|
;---------------------------------------------------------------
|
|||
|
is_signed_string: AX
|
|||
|
move B0,#0 ; index = 0
|
|||
|
move B1,#10 ; maxlen = 10
|
|||
|
comp S1[B0],#0 ; Leerstring ?
|
|||
|
jz %nio ; ja -> goto %nio
|
|||
|
|
|||
|
comp S1[B0],#'-'
|
|||
|
jnz %0001 ; nein -> goto %0001
|
|||
|
adds B1,#1 ; maxlen++
|
|||
|
adds B0,#1 ; index++
|
|||
|
comp S1[B0],#0 ; Stringende ?
|
|||
|
jz %nio ; ja -> goto %nio
|
|||
|
jump %0002
|
|||
|
|
|||
|
%0001: comp S1[B0],#'+'
|
|||
|
jnz %0002 ; nein -> goto %0002
|
|||
|
adds B1,#1 ; maxlen++
|
|||
|
adds B0,#1 ; index++
|
|||
|
comp S1[B0],#0 ; Stringende ?
|
|||
|
jz %nio ; ja -> goto %nio
|
|||
|
; jump %0002
|
|||
|
|
|||
|
%0002: comp S1[B0],#$30
|
|||
|
jl %nio ; < '0'
|
|||
|
comp S1[B0],#$39
|
|||
|
jg %nio ; > '9'
|
|||
|
adds B0,#1 ; index++
|
|||
|
comp S1[B0],#0 ; Stringende ?
|
|||
|
jz %io ; ja -> goto %io
|
|||
|
comp B0,B1 ; mehr als maxlen Stellen ?
|
|||
|
jge %nio ; ja -> goto %nio
|
|||
|
jump %0002
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
|
|||
|
;---------------------------------------------------------------
|
|||
|
; is_hex_string(String)
|
|||
|
;
|
|||
|
; B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
|
|||
|
; -I0 - -I1 - -I2 - -I3 - -I4 - -I5 - -I6 - -I7 - -I8 - -I9 - -IA - -IB - -IC - -ID - -IE - -IF -
|
|||
|
; - L0 - - L1 - - L2 - - L3 - - L4 - - L5 - - L6 - - L7 -
|
|||
|
; xx xx
|
|||
|
;
|
|||
|
; B0 (L0) index
|
|||
|
; B1 (L0) maxlen
|
|||
|
;---------------------------------------------------------------
|
|||
|
is_hex_string: AX
|
|||
|
move B0,#0 ; index = 0
|
|||
|
move B1,#10 ; maxlen = 10
|
|||
|
comp S1[B0],#0 ; Leerstring ?
|
|||
|
jz %nio ; ja -> goto %nio
|
|||
|
|
|||
|
comp S1[B0],#'0'
|
|||
|
jnz %nio ; nein -> goto %nio
|
|||
|
adds B0,#1 ; index++
|
|||
|
comp S1[B0],#0 ; Stringende ?
|
|||
|
jz %nio ; ja -> goto %nio
|
|||
|
|
|||
|
comp S1[B0],#'x'
|
|||
|
jz %0001 ; ja -> goto %0001
|
|||
|
comp S1[B0],#'X'
|
|||
|
jz %0001 ; ja -> goto %0001
|
|||
|
jump %nio
|
|||
|
|
|||
|
%0001: adds B0,#1 ; index++
|
|||
|
comp S1[B0],#0 ; Stringende ?
|
|||
|
jz %nio ; ja -> goto %nio
|
|||
|
%0002: comp S1[B0],#$30
|
|||
|
jl %nio ; < '0'
|
|||
|
comp S1[B0],#$39
|
|||
|
jg %0003 ; > '9'
|
|||
|
jump %0005
|
|||
|
|
|||
|
%0003: comp S1[B0],#$41
|
|||
|
jl %nio ; < 'A'
|
|||
|
comp S1[B0],#$46
|
|||
|
jg %0004 ; > 'F'
|
|||
|
jump %0005
|
|||
|
|
|||
|
%0004: comp S1[B0],#$61
|
|||
|
jl %nio ; < 'a'
|
|||
|
comp S1[B0],#$66
|
|||
|
jg %nio ; > 'f'
|
|||
|
; jump %0005
|
|||
|
|
|||
|
%0005: adds B0,#1 ; index++
|
|||
|
comp S1[B0],#0 ; Stringende ?
|
|||
|
jz %io ; ja -> goto %io
|
|||
|
comp B0,B1 ; mehr als maxlen Stellen ?
|
|||
|
jge %nio ; ja -> goto %nio
|
|||
|
jump %0002
|
|||
|
|
|||
|
%io: push #1.L ; TRUE
|
|||
|
jump %end
|
|||
|
|
|||
|
%nio: push #0.L ; FALSE
|
|||
|
; jump %end
|
|||
|
|
|||
|
%end:
|
|||
|
;end
|
|||
|
;eof
|