接口: IN: DB_NO INT DB number
LEN INT Length of source area
OUT:RETVAL INT RETVAL
TEMP:w_db_no Word DB number
w_bcc_value Word actual BCC value
w_temp_val Word temporary value
d_loop_akt DWord actual value of the loop counter
d_loop DWord loop counter
L #LEN // load length
L 2 // decrement length by 2
-I // last 2 bytes are reserved for BCC
SLD 3 // calculate bit offset
T #d_loop // save the last bit address
L #DB_NO // load DB number
T #w_db_no
OPN DB [#w_db_no] // and open DBs
L 0
T #d_loop_akt // initialize loop counter
T #w_bcc_value // initialize the BCC
// loop for calculating the BCC for (LEN - 2) bytes
// abort if d_loop_akt = d_loop
LOOP: L DBB [#d_loop_akt] // load byte from DB
L #w_bcc_value // load actual BCC
XOW // EXOR
T #w_bcc_value // and save
L 8 // increment the bit address by 8
L #d_loop_akt // to address the next byte
+D
T #d_loop_akt
L #d_loop
<I
JC LOOP
// load the actual BCC
// and compare with the last two bytes of the source DB
// example: #LEN 22
// 0..19 data bytes
// 20,21 BCC-HI, BCC-LO
L #w_bcc_value // load BCC
AW W#16#F0 //separate the most significant nibble
SLW 4 // shift the least significant nibble to the highbyte
OW W#16#3000 // OR 30h to Highbyte to receive ASCII character
T #w_temp_val // and save temporary
L #w_bcc_value // load BCC
AW W#16#F //separate the least significant nibble
OW W#16#30 // OR 30h to Lowbyte to receive ASCII character
L #w_temp_val
OW
L DBW [#d_loop_akt] // Load BCC from DB
==I // and compare
L 0 // value of RETVAL, if comparison ok
JC ENDE
L -1 // value of RETVAL, if comparison not ok
ENDE: T #RETVAL
BE