1419 lines
43 KiB
Plaintext
Executable File
1419 lines
43 KiB
Plaintext
Executable File
;**************************************************************
|
||
;
|
||
;
|
||
; @(#)BEST2 RUNTIME LIB Version 2.14 (2006) Softing 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
|
||
;
|
||
;***************************************************************
|
||
|
||
;---------------------------------------------------------------
|
||
open_communication:
|
||
xconnect
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
close_communication:
|
||
xhangup
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
set_communication_pars: AX
|
||
xsetpar <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
set_answer_length: AX
|
||
xawlen <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
send_and_receive: AW AX
|
||
clear <1>
|
||
xsend <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
recv_keybytes: AW
|
||
xkeyb <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
send_frequent: AX
|
||
xsendf <1>
|
||
push #1.L
|
||
;end
|
||
|
||
|
||
;---------------------------------------------------------------
|
||
recv_frequent: AW
|
||
clear <1>
|
||
xrequf <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
stop_frequent:
|
||
xstopf
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
set_repeat_counter: VX
|
||
xreps <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
get_battery_voltage:
|
||
xbatt L0
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
get_ignition_voltage:
|
||
xignit L0
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
set_program_voltage: VX
|
||
move l0,<1>
|
||
xprog i0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifboot:
|
||
xboot
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifreset:
|
||
xreset
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifgetport: VX
|
||
xgetport L0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifsetport: VX VX
|
||
move l0,<1>
|
||
move l1,<2>
|
||
xsetport l0,l1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifloopt:
|
||
move L0,#0.L
|
||
xloopt I0
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifrequeststate: AW
|
||
xstate <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifsireset: VX
|
||
move l0,<1>
|
||
xsireset i0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
iftype: AW
|
||
xtype <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifvers:
|
||
move L0,#0
|
||
xvers I0
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifrawmode: AW AX
|
||
xraw <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifsend: AX
|
||
xsendr <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ifrecv: AW VX
|
||
xrecv <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
new_set_of_results:
|
||
enewset
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
parcount:
|
||
parn L0
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
strcat: AW AX
|
||
strcat <1>,<2> ;strcat
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
strcut: AW VX
|
||
clear s1 ;strcut
|
||
strcat s1,<1>
|
||
move l0,<2>
|
||
adds l0,#1
|
||
scut s1,l0
|
||
slen l0,s1
|
||
move s1[l0],#0
|
||
clear <1>
|
||
move <1>,s1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
strcmp: AW AX
|
||
move l0,#1 ;strcmp
|
||
strcmp <1>,<2>
|
||
jz %1
|
||
move l0,#0 ;identical
|
||
%1: push l0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
strcpy: AW AX
|
||
clear <1> ;strcpy
|
||
strcat <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
strncpy: AW AX VX
|
||
move s1,<2> ;strncpy
|
||
move l0,<3>
|
||
move <1>,s1[#0]l0
|
||
move s1,<1>
|
||
clear <1>
|
||
strcat <1>,s1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
strlen: AX
|
||
clear s1 ;strlen
|
||
move s1,<1>
|
||
strlen l0,s1
|
||
push l0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
strerase: AW VX VX
|
||
clear s1 ;strerase
|
||
move s1,<1>
|
||
move l0,<3>
|
||
serase s1[<2>],l0
|
||
clear <1>
|
||
strcat <1>,s1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
strinsert: AW AX VX
|
||
clear s1 ;strinsert
|
||
strcat s1,<2>
|
||
scut s1,#1
|
||
spaste <1>[<3>],s1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
get_token: AW AX AX VX
|
||
setspc <3>,<4> ;get_token
|
||
stoken <1>,<2>
|
||
jz %1
|
||
push #1.L
|
||
jump %2
|
||
%1: push #0.L
|
||
clear <1>
|
||
%2:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
strrevers: AW
|
||
clear s1 ;strrevers
|
||
move s1,""
|
||
strcat s1,<1>
|
||
scut s1,#1
|
||
srevrs s1
|
||
scat s1,""
|
||
move <1>,s1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
atoi: AX
|
||
a2fix L0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
bcd2ascii: AW AX VX VX
|
||
move s1,<2> ; source
|
||
move l0,<3> ; l0 is position
|
||
move l1,<4> ; l1 is count
|
||
clear <1>
|
||
y2bcd <1>,s1[l0]l1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
hex2ascii: AW AX VX VX
|
||
move s1,<2> ; source
|
||
move l0,<3> ; l0 is position
|
||
move l1,<4> ; l1 is count
|
||
clear <1>
|
||
y2hex <1>,s1[l0]l1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ascii2hex: AW AX VX
|
||
move l0,<3> ; l0 is destination position
|
||
move l1,#1.L ; l1 is return value
|
||
hex2y s1,<2>
|
||
jnc %1
|
||
move l1,#0.L ; error !
|
||
%1: move <1>[l0],s1 ; move always
|
||
push l1
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
itoad: AW VX
|
||
move L0,<2>
|
||
fix2dez <1>,L0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
uitoad: AW VX
|
||
move L0,<2>
|
||
ufix2dez <1>,L0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
itoax: AW VX
|
||
move L0,<2>
|
||
fix2hex <1>,L0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
itor: FW VR
|
||
move L0,<2>
|
||
fix2flt <1>,L0
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ator: FW AR
|
||
move S1,<2>
|
||
a2flt <1>,S1
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
rtoa: AW FW VX
|
||
setflt <3>
|
||
flt2a <1>,<2>
|
||
slen L0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
atoy: AW AX
|
||
a2y <1>,<2>
|
||
slen L0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
isSimulation:
|
||
clear L0
|
||
cfgig I0,"SIMULATION"
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
isDebugLevel:
|
||
clear L0
|
||
cfgig I0,"BIPDEBUGLEVEL"
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
getCfgString: AW AX
|
||
clear <1>
|
||
cfgsg <1>,<2>
|
||
slen L0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
getCfgInt: AX
|
||
clear L0
|
||
cfgig I0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
enableIfhTrace: VX
|
||
move L0,<1>
|
||
cfgis "IFHTRACE",I0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
enableUBattHandling: VX
|
||
move L0,<1>
|
||
cfgis "UBATTHANDLING",I0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
enableIgnitionHandling: VX
|
||
move L0,<1>
|
||
cfgis "IGNITIONHANDLING",I0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
enableClampHandling: VX
|
||
move L0,<1>
|
||
cfgis "CLAMPHANDLING",I0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
realadd: FW FR
|
||
fadd <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
realsub: FW FR
|
||
fsub <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
realmul: FW FR
|
||
fmul <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
realdiv: FW FR
|
||
fdiv <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
realresult: AE VX VX
|
||
move l0,<2>
|
||
fix2flt f0,l0
|
||
move l0,<3>
|
||
fix2flt f1,l0
|
||
fdiv f0,f1
|
||
ergr <1>,f0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
var_result_long: AE VX
|
||
move l0,<2>
|
||
ergl <1>,l0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
var_result_real: AE FW
|
||
ergr <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
var_result_string: AE AX
|
||
ergs <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
var_result_data: AE AX
|
||
ergy <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
set_variable_result: AE VX VX FW AX AX
|
||
move l0,<2>
|
||
comp l0,#1
|
||
jnz %1
|
||
move l0,<3>
|
||
ergd <1>,l0
|
||
jump %4
|
||
%1: comp i0,#2
|
||
jnz %2
|
||
ergr <1>,<4>
|
||
jump %4
|
||
%2: comp i0,#3
|
||
jnz %3
|
||
ergs <1>,<5>
|
||
jump %4
|
||
%3: comp i0,#4
|
||
jnz %5
|
||
ergy <1>,<6>
|
||
%4: push #1.L
|
||
jump %6
|
||
%5: push #0.L
|
||
%6:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
dataclear: AW
|
||
clear <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
datacmp: AW AX
|
||
scmp <1>,<2>
|
||
jnz %1
|
||
push #0.L
|
||
jump %2
|
||
%1: push #1.L
|
||
%2:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
datacopy: AW AX VX VX
|
||
move s1,<2>
|
||
move l0,<3>
|
||
move l1,<4>
|
||
move <1>,s1[l0]l1
|
||
slen l0,<1>
|
||
push l0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
datalen: AX
|
||
slen l0,<1> ;datalen
|
||
push l0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
datarevers: AW
|
||
srevrs <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
dataset: AW VX VX
|
||
move l0,<3>
|
||
move l1,<2>
|
||
move i1,#0
|
||
%2: move <1>[i1],b4
|
||
adds i1,#1
|
||
comp i1,i0
|
||
jz %1
|
||
comp i1,#1024
|
||
jnz %2
|
||
%1: push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
datacat: AW AX
|
||
scat <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
datainsert: AW AX VX
|
||
move s1,<2>
|
||
spaste <1>[<3>],s1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
dataerase: AW VX VX
|
||
move L0,<3> ;dataerase
|
||
serase <1>[<2>],L0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
fopen: AX
|
||
clear L0
|
||
fopen B0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
fclose: VW
|
||
move L0,<1>
|
||
fclose B0
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
fread: VW
|
||
move L1,<1>
|
||
clear L0
|
||
fread B0,B4
|
||
jnc %1
|
||
move L0,#-1
|
||
%1: push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
freadln: AW VW
|
||
clear <1>
|
||
move L1,<2>
|
||
freadln <1>,B4
|
||
jc %1
|
||
slen L0,<1>
|
||
jump %2
|
||
%1: clear <1>
|
||
move L0,#-1
|
||
%2: push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
fseek: VX VW
|
||
move L1,<2>
|
||
fseek B4,<1>
|
||
move L0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
fseekln: VX VW
|
||
move L1,<2>
|
||
fseekln B4,<1>
|
||
move L0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ftell: VW
|
||
move L1,<1>
|
||
ftell L0,B4
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ftellln: VW
|
||
move L1,<1>
|
||
ftellln L0,B4
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
get_error: VX
|
||
move l1,#1
|
||
move l0,<1>
|
||
jz %1
|
||
jt %2,l0
|
||
jump %3
|
||
%1: jt %2
|
||
%3: move l1,#0
|
||
%2: clrt
|
||
push l1
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
get_error2:
|
||
move l0,#0
|
||
%1: adds l0,#1
|
||
comp l0,#30
|
||
jz %3
|
||
jt %2,l0
|
||
jump %1
|
||
%2: clrt
|
||
push l0
|
||
jump %4
|
||
%3: push #0.L
|
||
%4:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
clear_error:
|
||
clrt
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
make_error: VX
|
||
sett <1> ;make_error
|
||
eerr
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
set_trap_mask: VX
|
||
move l0,<1>
|
||
gettmr l1
|
||
settmr l0
|
||
push l1
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
get_trap_mask:
|
||
gettmr l0
|
||
push l0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
generateRunError: VX
|
||
generr <1> ;generateRunError
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
gettime: AW
|
||
time <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
getdate: AW
|
||
date <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
getasciitime: AW
|
||
clear <1>
|
||
time s1
|
||
move l0,s1[#0]
|
||
fix2dez s1,b0
|
||
move b0,s1[#1]
|
||
jnz %1
|
||
strcat <1>,"0"
|
||
%1: strcat <1>,s1
|
||
strcat <1>,":"
|
||
fix2dez s1,b1
|
||
move b1,s1[#1]
|
||
jnz %2
|
||
strcat <1>,"0"
|
||
%2: strcat <1>,s1
|
||
strcat <1>,":"
|
||
fix2dez s1,b2
|
||
move b2,s1[#1]
|
||
jnz %3
|
||
strcat <1>,"0"
|
||
%3: strcat <1>,s1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
getasciidate: AW
|
||
clear <1>
|
||
date s1
|
||
move l0,s1[#0]
|
||
move l1,s1[#4]
|
||
%W1: comp b4,#1
|
||
jnz %W2
|
||
strcat <1>,"MO "
|
||
%W2: comp b4,#2
|
||
jnz %W3
|
||
strcat <1>,"DI "
|
||
%W3: comp b4,#3
|
||
jnz %W4
|
||
strcat <1>,"MI "
|
||
%W4: comp b4,#4
|
||
jnz %W5
|
||
strcat <1>,"DO "
|
||
%W5: comp b4,#5
|
||
jnz %W6
|
||
strcat <1>,"FR "
|
||
%W6: comp b4,#6
|
||
jnz %W7
|
||
strcat <1>,"SA "
|
||
%W7: comp b4,#7
|
||
jnz %W8
|
||
strcat <1>,"SO "
|
||
%W8: fix2dez s1,b0
|
||
move b0,s1[#1]
|
||
jnz %1
|
||
strcat <1>,"0"
|
||
%1: strcat <1>,s1
|
||
strcat <1>,"."
|
||
fix2dez s1,b1
|
||
move b1,s1[#1]
|
||
jnz %2
|
||
strcat <1>,"0"
|
||
%2: strcat <1>,s1
|
||
strcat <1>,"."
|
||
fix2dez s1,b2
|
||
move b2,s1[#1]
|
||
jnz %3
|
||
strcat <1>,"0"
|
||
%3: strcat <1>,s1
|
||
strcat <1>," KW:"
|
||
fix2dez s1,b3
|
||
move b3,s1[#1]
|
||
jnz %4
|
||
strcat <1>,"0"
|
||
%4: strcat <1>,s1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
wait: VX
|
||
move l0,<1>
|
||
wait i0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tabset: AX
|
||
tabset <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tabsetext: AX AX
|
||
tabsetex <2>,<1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tabseek: AX AX
|
||
move s1,<2>
|
||
tabseek <1>,s1
|
||
jz %1
|
||
push #1.L
|
||
jump %2
|
||
%1: push #0.L
|
||
%2:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tabline: VX
|
||
move L0,<1>
|
||
tabline L0
|
||
jz %1
|
||
push #1.L
|
||
jump %2
|
||
%1: push #0.L
|
||
%2:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tab_suche_index: AX VX
|
||
move l0,<2>
|
||
fix2hex s1,b0
|
||
tabseek <1>,s1
|
||
jz %1
|
||
push #1.L
|
||
jump %2
|
||
%1: push #0.L
|
||
%2:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tabget: AW AX
|
||
tabget <1>,<2>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tab2fix: VW AX
|
||
tabget s1,<2>
|
||
a2fix l0,s1
|
||
move <1>,l0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
bittest: AX AX VW
|
||
move s1,<1> ;
|
||
move <3>,#0.l ;result is false
|
||
tabseek "NAME",s1 ;suche nach dem namen
|
||
jz %4 ;nicht gefunden
|
||
tabget s1,"BYTE" ;hole das byte
|
||
a2fix l0,s1 ;in l0
|
||
move s1,<2> ;hole das telegramm nach s1
|
||
clear l1
|
||
move b4,s1[l0] ;hole das byte nach b4
|
||
tabget s1,"MASK" ;hole die maske
|
||
a2fix l0,s1 ;in l0
|
||
move b5,b0 ;nach b5
|
||
tabget s1,"VALUE" ;hole den sollwert
|
||
a2fix l0,s1 ;in l0
|
||
and b4,b5 ;mask the bits wanted
|
||
xor b4,b0 ;xor with value
|
||
jnz %3 ;not treu
|
||
move <3>,#1.l ;result is true
|
||
%3: push #1.L ;NO ERROR
|
||
jump %5 ;to end
|
||
%4: push #0.L ;ERROR
|
||
%5:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
bytetest: AX AX VW VW
|
||
tabset "BYTES" ;set table to bytefield
|
||
move s1,<1> ;
|
||
tabseek "NAME",s1 ;suche nach dem namen
|
||
jz %4 ;nicht gefunden
|
||
tabget s1,"BYTE" ;hole das byte
|
||
a2fix l0,s1 ;in l0
|
||
move s1,<2> ;hole das telegramm nach s1
|
||
clear l1
|
||
move b4,s1[l0] ;hole das byte nach b4
|
||
tabget s1,"DIV" ;hole den teiler
|
||
a2fix l0,s1 ;in l0
|
||
move <4>,l0 ;
|
||
tabget s1,"MIN" ;hole das minimum
|
||
a2fix l0,s1 ;in l0
|
||
comp b4,b0 ;vergleiche wert mit minimum
|
||
jae %1 ;<3B>ber minimum
|
||
tabget s1,"MINDEF" ;hole den default min wert
|
||
a2fix l0,s1 ;in l0
|
||
move <3>,l0 ;
|
||
push #-1.L ; -1 signs under
|
||
jump %3
|
||
|
||
%1: tabget s1,"MAX" ;hole das maximum
|
||
a2fix l0,s1 ;in l0
|
||
comp b4,b0 ;vergleiche wert mit maximum
|
||
jbe %2 ;unter maximum
|
||
tabget s1,"MAXDEF" ;hole den default min wert
|
||
a2fix l0,s1 ;in l0
|
||
move <3>,l0 ;
|
||
push #1.L ; 1 signs over
|
||
jump %3
|
||
|
||
%2: push #0.L ; 0 signs in range
|
||
tabget s1,"A" ;hole den multiplikator
|
||
a2fix l0,s1 ;in l0
|
||
mult l1,l0 ; wert * A -> l1
|
||
tabget s1,"B" ;hole die Konstante
|
||
a2fix l0,s1 ;in l0
|
||
adds l1,l0 ; wert * A + B -> l1
|
||
move <3>,l1
|
||
jump %3
|
||
|
||
%4: push #0.L
|
||
move <3>,#-1.L
|
||
move <4>,#-1.L
|
||
jump %3
|
||
|
||
%3:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
getETXblock: 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
|
||
adds i0,#1 ;da Block 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
|
||
|
||
;---------------------------------------------------------------
|
||
userbreak:
|
||
break; ;userbreak
|
||
;push nicht notwendig
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
shdataset: AX AX
|
||
shmset <1>,<2> ;set shared data
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
shdataget: AX AW
|
||
shmget <2>,<1> ;get shared data
|
||
jc %1
|
||
push #1.L ;shared data found and copied
|
||
jump %2
|
||
%1: push #0.L ;shared data not found
|
||
%2:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
doNewInit:
|
||
ergsysi "!INITIALISIERUNG",#1
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
rtoi: FR
|
||
flt2fix L0,<1>
|
||
push L0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
updateInfo: AX
|
||
iupdate <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
setProgressRange: VX
|
||
move L0,<1>
|
||
irange L0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
incProgressPos: VX
|
||
move L0,<1>
|
||
iincpos L0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
ascii2ascii: AX AW
|
||
clear l0 ;ascii2ascii
|
||
clear l1
|
||
move s1,<1>
|
||
slen i0,<2>
|
||
jz %2
|
||
%1: subb i0,#1
|
||
move b2,<2>[i0]
|
||
move b4,s1[i1]
|
||
move <2>[i0],b4
|
||
comp i0,#0
|
||
jnz %1
|
||
%2: push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tab_suche_unsigned: AX VX
|
||
tabseeku <1>,<2>
|
||
jz %1
|
||
push #1.L
|
||
jump %2
|
||
%1: push #0.L
|
||
%2:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
data_to_real: FW AW VX VX VX
|
||
clear s1
|
||
move l0,<4>
|
||
jnz %2 ; double ?
|
||
|
||
; float
|
||
move s1,<2>[<3>]#4
|
||
move l0,<5>
|
||
jz %1 ; little endian ?
|
||
swap s1[#0]#4 ; big endian
|
||
%1: y42flt <1>,s1[#0]
|
||
jump %4
|
||
|
||
%2: ; double
|
||
move s1,<2>[<3>]#8
|
||
move l0,<5>
|
||
jz %3 ; little endian ?
|
||
swap s1[#0]#8 ; big endian
|
||
%3: y82flt <1>,s1[#0]
|
||
|
||
%4: push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
real_to_data: AW FR VX VX VX
|
||
clear s1
|
||
move l0,<4>
|
||
jnz %2 ; double ?
|
||
|
||
; float
|
||
flt2y4 s1[#0],<2>
|
||
move l0,<5>
|
||
jz %1 ; little endian ?
|
||
swap s1[#0]#4 ; big endian
|
||
%1: move <1>[<3>],s1[#0]#4
|
||
jump %4
|
||
|
||
%2: ; double
|
||
flt2y8 s1[#0],<2>
|
||
move l0,<5>
|
||
jz %3 ; little endian ?
|
||
swap s1[#0]#8 ; big endian
|
||
%3: move <1>[<3>],s1[#0]#8
|
||
|
||
%4: push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
GetKWP2000Block: VW AW VW VW VW VW AW
|
||
;GetKWP2000Block
|
||
clear <7> ;L<>schen des Datenpuffers
|
||
;Vorbelegung von Index auf Response org (i4)
|
||
move i5,i4 ;Vorbelegung von Index auf Response (i5)
|
||
move l3,#0 ;Vorbelegung von Format (bc)
|
||
;Vorbelegung von Target 1. Tel (bd)
|
||
;Vorbelegung von Source 1. Tel (be)
|
||
;Vorbelegung von SID 1. Tel (bf)
|
||
slen i8,<2> ;Vorbelegung von Pufferl<72>nge (i8)
|
||
|
||
%1: comp i4,i8 ;Funktion beenden, wenn der Index
|
||
jz %10 ;am Telegrammende+1
|
||
jnc %9 ;Fehler wenn der Index hinter dem
|
||
;Telegrammende+1
|
||
move b0,<2>[i5] ;Formatinfo+Headerlaenge
|
||
move bc,b0
|
||
and bc,#$C0
|
||
|
||
comp bc,#$40 ;***** OBDII *****************************
|
||
jz %9 ;wird hier nicht unterst<73>tzt -> Fehler
|
||
|
||
comp bc,#$C0 ;***** FUNCTIONAL ADDRESSING *************
|
||
jz %9 ;wird hier nicht unterst<73>tzt -> Fehler
|
||
|
||
comp bc,#$00 ;***** 1 oder 2 BYTE HEADER **************
|
||
jnz %4
|
||
clear b1
|
||
and b0,#$3F ;Pr<50>fen der Laengenangabe im Formatbyte
|
||
jnz %2
|
||
;***** 2 BYTE HEADER
|
||
adds i5,#1 ;Index + 1 (f<>r Laengenbyte)
|
||
move b0,<2>[i5] ;Laengenbyte (b0 (i0))
|
||
|
||
%2: ;***** 1 BYTE HEADER
|
||
move bd,#0 ;Target 1. Telegramm
|
||
move be,#0 ;Source 1. Telegramm
|
||
move b2,#0 ;Source aktuelles Telegramm
|
||
comp bf,#0 ;SID des 1. Telegramms nur beim
|
||
jnz %3 ;ersten Durchlauf belegen
|
||
move bf,<2>[i5,#1] ;SID 1. Telegramm
|
||
move <7>[#0],bf ;erste SID in den Datenpuffer kopieren
|
||
%3: move b3,<2>[i5,#1] ;SID aktuelles Telegramm
|
||
adds i5,#2 ;Index + 1 (f<>r Headerlaenge u. SID)
|
||
jump %8 ;Sprung zum Vergleich von Source und SID
|
||
|
||
%4: ;*** 3 oder 4 BYTE HEADER ****************
|
||
clear b1
|
||
and b0,#$3F ;Pr<50>fen der Laengenangabe im Formatbyte
|
||
jnz %6
|
||
;***** 4 BYTE HEADER
|
||
move b0,<2>[i5,#3] ;Laengenbyte (b0 (i0))
|
||
comp bf,#0 ;Source, Target u. SID des 1. Telegramms
|
||
jnz %5 ;nur beim ersten Durchlauf belegen
|
||
move bd,<2>[i5,#1] ;Target 1. Telegramm
|
||
move be,<2>[i5,#2] ;Source 1. Telegramm
|
||
move bf,<2>[i5,#4] ;SID 1. Telegramm
|
||
move <7>[#0],bf ;erste SID in den Datenpuffer kopieren
|
||
%5: move b2,<2>[i5,#2] ;Source aktuelles Telegramm
|
||
move b3,<2>[i5,#4] ;SID aktuelles Telegramm
|
||
adds i5,#5 ;Index + 5 (f<>r Headerlaenge u. SID)
|
||
jump %8
|
||
|
||
%6: ;***** 3 BYTE HEADER
|
||
comp bf,#0 ;Source, Target u. SID des 1. Telegramms
|
||
jnz %7 ;nur beim ersten Durchlauf belegen
|
||
move bd,<2>[i5,#1] ;Target 1. Telegramm
|
||
move be,<2>[i5,#2] ;Source 1. Telegramm
|
||
move bf,<2>[i5,#3] ;SID 1. Telegramm
|
||
move <7>[#0],bf ;erste SID in den Datenpuffer kopieren
|
||
%7: move b2,<2>[i5,#2] ;Source aktuelles Telegramm
|
||
move b3,<2>[i5,#3] ;SID aktuelles Telegramm
|
||
adds i5,#4 ;Index + 4 (f<>r Headerlaenge u. SID)
|
||
|
||
%8: comp b0,#0 ;Die Datenl<6E>nge darf NIE 0 sein!!
|
||
jz %9 ;=> Fehler
|
||
|
||
comp b2,be ;Vergleich, ob das aktuelle Telegramm noch
|
||
jnz %10 ;zum Block geh<65>rt?
|
||
comp b3,bf ;Wenn nicht, wird die Schleife verlassen
|
||
jnz %10
|
||
|
||
subb i0,#1 ;Daten ohne SID
|
||
scat <7>,<2>[i5]I0 ;kopieren
|
||
adds i5,i0 ;Index + Datenl<6E>nge - 1
|
||
adds i5,#1 ;Index + 1 (f<>r Chksum)
|
||
move i4,i5 ;der Index f<>r das Ergebnis wird aktualisiert
|
||
jump %1 ;Schleife zum n<>chsten Telegramm
|
||
|
||
%9: push #0.L ;Fehler
|
||
clear <7> ;Datenpuffer l<>schen
|
||
jump %11
|
||
%10: push #1.L ;Fertig
|
||
%11: clear i5 ;Index (L2) Wiederherstellen
|
||
clear l0
|
||
move b0,bd ;Target (L4)
|
||
move <4>,l0
|
||
move b0,be ;Source (L5)
|
||
move <5>,l0
|
||
move b0,bc ;Format (L3)
|
||
move <3>,l0
|
||
slen <6>,<7> ;Length
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
AdjustKWP2000TesterPrStartComm: AW
|
||
;AdjustKWP2000TesterPrStartComm
|
||
move b0,<1>[#5] ;B0 enthaellt SG Adresse
|
||
|
||
;********** TesterPresent
|
||
|
||
move b3,<1>[#47] ;B3 enthaellt Telegrammlaenge aus Parameter
|
||
move b2,<1>[#49] ;B2 enthaellt Formatbyte
|
||
|
||
test b2,#$80
|
||
jz %2
|
||
|
||
%1: ;3/4-Byte Header
|
||
move <1>[#50],b0 ;Adresse in TesterPresent einfuegen
|
||
jump %2
|
||
|
||
%2: move b4,#50 ;Position im Telegramm
|
||
subb b3,#2 ;Schleifenzaehler
|
||
move b1,<1>[#49] ;Startwert
|
||
%3: adds b1,<1>[b4]
|
||
adds b4,#1
|
||
subb b3,#1
|
||
jnz %3
|
||
move <1>[b4],b1
|
||
|
||
;********** StartCommunication
|
||
|
||
move b3,<1>[#64] ;B3 enthaellt Telegrammlaenge aus Parameter
|
||
|
||
move <1>[#67],b0 ;Adresse in StartCommunication einfuegen
|
||
|
||
move b4,#67 ;Position im Telegramm
|
||
subb b3,#2 ;Schleifenzaehler
|
||
move b1,<1>[#66] ;Startwert
|
||
%4: adds b1,<1>[b4]
|
||
adds b4,#1
|
||
subb b3,#1
|
||
jnz %4
|
||
move <1>[b4],b1
|
||
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
realcomp: FW AX FW
|
||
; realcomp
|
||
clear s1
|
||
move s1,<2>
|
||
strlen l0,s1
|
||
comp l0,#1 ;1 byte operator ?
|
||
jz %1
|
||
comp l0,#2 ;2 byte operator ?
|
||
jz %4
|
||
jump %9 ;unknown operator
|
||
|
||
%1: move b0,s1[#0] ;1 byte operator: <,>
|
||
comp b0,#60
|
||
jz %2
|
||
comp b0,#62
|
||
jz %3
|
||
jump %9 ;unknown operator
|
||
|
||
%2: fcomp <1>,<3> ;"<"
|
||
jl %10 ;TRUE
|
||
jump %9 ;FALSE
|
||
|
||
%3: fcomp <1>,<3> ;">"
|
||
jg %10 ;TRUE
|
||
jump %9 ;FALSE
|
||
|
||
%4: move b0,s1[#1] ;2 byte operator: <=,>=,==,!=
|
||
comp b0,#61 ;byte 2 = '=' ?
|
||
jnz %9 ;unknown operator ?
|
||
move b0,s1[#0]
|
||
comp b0,#60 ;"<=" ?
|
||
jz %5
|
||
comp b0,#62 ;">=" ?
|
||
jz %6
|
||
comp b0,#61 ;"==" ?
|
||
jz %7
|
||
comp b0,#33 ;"!=" ?
|
||
jz %8
|
||
jump %9 ;unknown operator
|
||
|
||
%5: fcomp <1>,<3> ;"<="
|
||
jle %10 ;TRUE
|
||
jump %9 ;FALSE
|
||
|
||
%6: fcomp <1>,<3> ;">="
|
||
jge %10 ;TRUE
|
||
jump %9 ;FALSE
|
||
|
||
%7: fcomp <1>,<3> ;"=="
|
||
jz %10 ;TRUE
|
||
jump %9 ;FALSE
|
||
|
||
%8: fcomp <1>,<3> ;"!="
|
||
jnz %10 ;TRUE
|
||
jump %9 ;FALSE
|
||
|
||
%9: push #0.L ;FALSE
|
||
jump %11
|
||
|
||
%10: push #1.L ;TRUE
|
||
|
||
%11:
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
gettickcount:
|
||
ticks l0
|
||
push l0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
waitex: VX
|
||
move l0,<1>
|
||
waitex l0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
open_channel: VX
|
||
move l0,<1>
|
||
jz %1
|
||
clear l0
|
||
xswitch l0 ;Default channel
|
||
jump %2
|
||
%1:
|
||
xopen l0 ;New channel
|
||
%2:
|
||
push l0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
close_channel:
|
||
xclose
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
closeall_channel:
|
||
xcloseex
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
switch_channel: VR
|
||
move l0,<1>
|
||
xswitch l0
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
send: AX
|
||
xsendex <1>
|
||
push #1.L
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
receive: AW
|
||
clear l0
|
||
xrecvex <1>
|
||
slen l0,<1>
|
||
push l0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tabcolumns:
|
||
tabcols l0
|
||
push l0
|
||
;end
|
||
|
||
;---------------------------------------------------------------
|
||
tabrows:
|
||
tabrows l0
|
||
push l0
|
||
;end
|