zjiori
級別: 正式會員
|
接口: 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 |
---|---|
|