'
'calculate CRC for Psion PLP protocol
'
'Organiser II only, does not work on SIBO or EPOC machines!
'
'returns CRC in a 2-byte string
'
'Autor: Boris Cornet, 2001
'       boris@psion2.org

Private crcTbl(255) As Long

'------------------------------------------------------------------
Public Function plp_crc(theString As String) as String
    Dim crc As Long, x As Integer

    init_crc
    crc = crcTbl(Asc(theString))
    For x = 2 To Len(theString)
        crc = crcTbl(Asc(Mid(theString, x, 1)) Xor Int(crc / 256)) Xor ((crc And 255) * 256)
    Next
    plp_crc = Chr(Int(crc / 256)) + Chr(crc And 255)

End Function

'------------------------------------------------------------------
Private Sub init_crc()
    Static done As Boolean

    If done Then Exit Sub

    'table derived from standard CRC16 by reversing high & low bytes
    crcTbl(0) = 0
    crcTbl(1) = &HC1C0&
    crcTbl(2) = &H81C1&
    crcTbl(3) = &H4001&
    crcTbl(4) = &H01C3&
    crcTbl(5) = &HC003&
    crcTbl(6) = &H8002&
    crcTbl(7) = &H41C2&
    crcTbl(8) = &H01C6&
    crcTbl(9) = &HC006&
    crcTbl(10) = &H8007&
    crcTbl(11) = &H41C7&
    crcTbl(12) = &H0005&
    crcTbl(13) = &HC1C5&
    crcTbl(14) = &H81C4&
    crcTbl(15) = &H4004&
    crcTbl(16) = &H01CC&
    crcTbl(17) = &HC00C&
    crcTbl(18) = &H800D&
    crcTbl(19) = &H41CD&
    crcTbl(20) = &H000F&
    crcTbl(21) = &HC1CF&
    crcTbl(22) = &H81CE&
    crcTbl(23) = &H400E&
    crcTbl(24) = &H000A&
    crcTbl(25) = &HC1CA&
    crcTbl(26) = &H81CB&
    crcTbl(27) = &H400B&
    crcTbl(28) = &H01C9&
    crcTbl(29) = &HC009&
    crcTbl(30) = &H8008&
    crcTbl(31) = &H41C8&
    crcTbl(32) = &H01D8&
    crcTbl(33) = &HC018&
    crcTbl(34) = &H8019&
    crcTbl(35) = &H41D9&
    crcTbl(36) = &H001B&
    crcTbl(37) = &HC1DB&
    crcTbl(38) = &H81DA&
    crcTbl(39) = &H401A&
    crcTbl(40) = &H001E&
    crcTbl(41) = &HC1DE&
    crcTbl(42) = &H81DF&
    crcTbl(43) = &H401F&
    crcTbl(44) = &H01DD&
    crcTbl(45) = &HC01D&
    crcTbl(46) = &H801C&
    crcTbl(47) = &H41DC&
    crcTbl(48) = &H0014&
    crcTbl(49) = &HC1D4&
    crcTbl(50) = &H81D5&
    crcTbl(51) = &H4015&
    crcTbl(52) = &H01D7&
    crcTbl(53) = &HC017&
    crcTbl(54) = &H8016&
    crcTbl(55) = &H41D6&
    crcTbl(56) = &H01D2&
    crcTbl(57) = &HC012&
    crcTbl(58) = &H8013&
    crcTbl(59) = &H41D3&
    crcTbl(60) = &H0011&
    crcTbl(61) = &HC1D1&
    crcTbl(62) = &H81D0&
    crcTbl(63) = &H4010&
    crcTbl(64) = &H01F0&
    crcTbl(65) = &HC030&
    crcTbl(66) = &H8031&
    crcTbl(67) = &H41F1&
    crcTbl(68) = &H0033&
    crcTbl(69) = &HC1F3&
    crcTbl(70) = &H81F2&
    crcTbl(71) = &H4032&
    crcTbl(72) = &H0036&
    crcTbl(73) = &HC1F6&
    crcTbl(74) = &H81F7&
    crcTbl(75) = &H4037&
    crcTbl(76) = &H01F5&
    crcTbl(77) = &HC035&
    crcTbl(78) = &H8034&
    crcTbl(79) = &H41F4&
    crcTbl(80) = &H003C&
    crcTbl(81) = &HC1FC&
    crcTbl(82) = &H81FD&
    crcTbl(83) = &H403D&
    crcTbl(84) = &H01FF&
    crcTbl(85) = &HC03F&
    crcTbl(86) = &H803E&
    crcTbl(87) = &H41FE&
    crcTbl(88) = &H01FA&
    crcTbl(89) = &HC03A&
    crcTbl(90) = &H803B&
    crcTbl(91) = &H41FB&
    crcTbl(92) = &H0039&
    crcTbl(93) = &HC1F9&
    crcTbl(94) = &H81F8&
    crcTbl(95) = &H4038&
    crcTbl(96) = &H0028&
    crcTbl(97) = &HC1E8&
    crcTbl(98) = &H81E9&
    crcTbl(99) = &H4029&
    crcTbl(100) = &H01EB&
    crcTbl(101) = &HC02B&
    crcTbl(102) = &H802A&
    crcTbl(103) = &H41EA&
    crcTbl(104) = &H01EE&
    crcTbl(105) = &HC02E&
    crcTbl(106) = &H802F&
    crcTbl(107) = &H41EF&
    crcTbl(108) = &H002D&
    crcTbl(109) = &HC1ED&
    crcTbl(110) = &H81EC&
    crcTbl(111) = &H402C&
    crcTbl(112) = &H01E4&
    crcTbl(113) = &HC024&
    crcTbl(114) = &H8025&
    crcTbl(115) = &H41E5&
    crcTbl(116) = &H0027&
    crcTbl(117) = &HC1E7&
    crcTbl(118) = &H81E6&
    crcTbl(119) = &H4026&
    crcTbl(120) = &H0022&
    crcTbl(121) = &HC1E2&
    crcTbl(122) = &H81E3&
    crcTbl(123) = &H4023&
    crcTbl(124) = &H01E1&
    crcTbl(125) = &HC021&
    crcTbl(126) = &H8020&
    crcTbl(127) = &H41E0&
    crcTbl(128) = &H01A0&
    crcTbl(129) = &HC060&
    crcTbl(130) = &H8061&
    crcTbl(131) = &H41A1&
    crcTbl(132) = &H0063&
    crcTbl(133) = &HC1A3&
    crcTbl(134) = &H81A2&
    crcTbl(135) = &H4062&
    crcTbl(136) = &H0066&
    crcTbl(137) = &HC1A6&
    crcTbl(138) = &H81A7&
    crcTbl(139) = &H4067&
    crcTbl(140) = &H01A5&
    crcTbl(141) = &HC065&
    crcTbl(142) = &H8064&
    crcTbl(143) = &H41A4&
    crcTbl(144) = &H006C&
    crcTbl(145) = &HC1AC&
    crcTbl(146) = &H81AD&
    crcTbl(147) = &H406D&
    crcTbl(148) = &H01AF&
    crcTbl(149) = &HC06F&
    crcTbl(150) = &H806E&
    crcTbl(151) = &H41AE&
    crcTbl(152) = &H01AA&
    crcTbl(153) = &HC06A&
    crcTbl(154) = &H806B&
    crcTbl(155) = &H41AB&
    crcTbl(156) = &H0069&
    crcTbl(157) = &HC1A9&
    crcTbl(158) = &H81A8&
    crcTbl(159) = &H4068&
    crcTbl(160) = &H0078&
    crcTbl(161) = &HC1B8&
    crcTbl(162) = &H81B9&
    crcTbl(163) = &H4079&
    crcTbl(164) = &H01BB&
    crcTbl(165) = &HC07B&
    crcTbl(166) = &H807A&
    crcTbl(167) = &H41BA&
    crcTbl(168) = &H01BE&
    crcTbl(169) = &HC07E&
    crcTbl(170) = &H807F&
    crcTbl(171) = &H41BF&
    crcTbl(172) = &H007D&
    crcTbl(173) = &HC1BD&
    crcTbl(174) = &H81BC&
    crcTbl(175) = &H407C&
    crcTbl(176) = &H01B4&
    crcTbl(177) = &HC074&
    crcTbl(178) = &H8075&
    crcTbl(179) = &H41B5&
    crcTbl(180) = &H0077&
    crcTbl(181) = &HC1B7&
    crcTbl(182) = &H81B6&
    crcTbl(183) = &H4076&
    crcTbl(184) = &H0072&
    crcTbl(185) = &HC1B2&
    crcTbl(186) = &H81B3&
    crcTbl(187) = &H4073&
    crcTbl(188) = &H01B1&
    crcTbl(189) = &HC071&
    crcTbl(190) = &H8070&
    crcTbl(191) = &H41B0&
    crcTbl(192) = &H0050&
    crcTbl(193) = &HC190&
    crcTbl(194) = &H8191&
    crcTbl(195) = &H4051&
    crcTbl(196) = &H0193&
    crcTbl(197) = &HC053&
    crcTbl(198) = &H8052&
    crcTbl(199) = &H4192&
    crcTbl(200) = &H0196&
    crcTbl(201) = &HC056&
    crcTbl(202) = &H8057&
    crcTbl(203) = &H4197&
    crcTbl(204) = &H0055&
    crcTbl(205) = &HC195&
    crcTbl(206) = &H8194&
    crcTbl(207) = &H4054&
    crcTbl(208) = &H019C&
    crcTbl(209) = &HC05C&
    crcTbl(210) = &H805D&
    crcTbl(211) = &H419D&
    crcTbl(212) = &H005F&
    crcTbl(213) = &HC19F&
    crcTbl(214) = &H819E&
    crcTbl(215) = &H405E&
    crcTbl(216) = &H005A&
    crcTbl(217) = &HC19A&
    crcTbl(218) = &H819B&
    crcTbl(219) = &H405B&
    crcTbl(220) = &H0199&
    crcTbl(221) = &HC059&
    crcTbl(222) = &H8058&
    crcTbl(223) = &H4198&
    crcTbl(224) = &H0188&
    crcTbl(225) = &HC048&
    crcTbl(226) = &H8049&
    crcTbl(227) = &H4189&
    crcTbl(228) = &H004B&
    crcTbl(229) = &HC18B&
    crcTbl(230) = &H818A&
    crcTbl(231) = &H404A&
    crcTbl(232) = &H004E&
    crcTbl(233) = &HC18E&
    crcTbl(234) = &H818F&
    crcTbl(235) = &H404F&
    crcTbl(236) = &H018D&
    crcTbl(237) = &HC04D&
    crcTbl(238) = &H804C&
    crcTbl(239) = &H418C&
    crcTbl(240) = &H0044&
    crcTbl(241) = &HC184&
    crcTbl(242) = &H8185&
    crcTbl(243) = &H4045&
    crcTbl(244) = &H0187&
    crcTbl(245) = &HC047&
    crcTbl(246) = &H8046&
    crcTbl(247) = &H4186&
    crcTbl(248) = &H0182&
    crcTbl(249) = &HC042&
    crcTbl(250) = &H8043&
    crcTbl(251) = &H4183&
    crcTbl(252) = &H0041&
    crcTbl(253) = &HC181&
    crcTbl(254) = &H8180&
    crcTbl(255) = &H4040&
    done = True
End Sub