bmw-advanced-tools/app/EDIABAS/Bin/B2BMW.LIB

5009 lines
228 KiB
Plaintext
Raw Normal View History

2021-09-18 17:45:57 +02:00
;**************************************************************
;
;
; @(#)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