📄 pro_fun.prg
字号:
XM = BINDEC(SUBSTR(KMB,6,3))
XL = BINDEC(SUBSTR(KLB,6,3))
IF XH <> 0
NHBR = SUBSTR(NHB,1,8 - XH)
NHBL = SUBSTR(NHB,9 - XH)
NHB = NHBL + NHBR
ENDIF
IF XM <> 0
NMBR = SUBSTR(NMB,1,8 - XM)
NMBL = SUBSTR(NMB,9 - XM)
NMB = NMBL + NMBR
ENDIF
IF XL <> 0
NLBR = SUBSTR(NLB,1,8 - XL)
NLBL = SUBSTR(NLB,9 - XL)
NLB = NLBL + NLBR
ENDIF
MHB = XOR(NHB,KHB)
MMB = XOR(NMB,KMB)
MLB = XOR(NLB,KLB)
MB = MHB + MMB + MLB
MH = BINHEX(MB)
MH = SWAP(MH)
RETURN MH
ENDPROC
*------
PROCEDURE lockkey
PRIVATE KEYFH , KEYFM , KEYFL , KEYH , KEYM , KEYL , KEY , ERR
KEYF = REPLICATE('F',54)
ERR = RD_ASC(0,5,27,@KEYF)
IF ERR <> 0
RETURN ERR
ENDIF
KEYFH = ;
SUBSTR(KEYF,11,2) + SUBSTR(KEYF,17,2) + SUBSTR(KEYF,47,2) + SUBSTR(KEYF,53,2)
KEYFM = ;
SUBSTR(KEYF,9,2) + SUBSTR(KEYF,15,2) + SUBSTR(KEYF,45,2) + SUBSTR(KEYF,51,2)
KEYFL = ;
SUBSTR(KEYF,1,2) + SUBSTR(KEYF,7,2) + SUBSTR(KEYF,13,2) + SUBSTR(KEYF,49,2)
KEYH = CHECK(KEYFH)
KEYM = CHECK(KEYFM)
KEYL = CHECK(KEYFL)
KEY = KEYH + KEYM + KEYL
RETURN KEY
ENDPROC
*------
PROCEDURE fchk_sc
PARAMETER KEY
PRIVATE A , KEY , TIMES , I , M.ZHZI , KFLH , A , MSC
KEY = ALLTRIM(KEY)
TIMES = REPLICATE('F',8)
ERR = RD_SM(@TIMES)
IF ERR <> 0
RETURN ERR
ENDIF
TIMES = SUBSTR(TIMES,1,2)
DO CASE
CASE TIMES == '00'
ERR = 14
YESNO = ALERT(ERR)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN 9999
ENDIF
CASE TIMES == '04'
ERR = 99
YESNO = ALERT(ERR)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN 9999
ENDIF
CASE TIMES == '06'
ERR = 98
YESNO = ALERT(ERR)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN 9999
ENDIF
ENDCASE
R_DATA = REPLICATE('f',64)
RE_ERR = RD_ASC(0,0,32,@R_DATA)
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN RE_ERR
ENDIF
LOOP
ENDIF
SELECT MSC
NEWF = SUBSTR(R_DATA,17,26) + SUBSTR(R_DATA,55,10)
IF NEWF = REPLICATE('F',36)
LOCATE FOR ALLTRIM(CONT) == 'skmm'
MSC = ALLTRIM(DATA)
ELSE
KFLH = REPLICATE('F',8)
ERR = RD_ASC(0,28,4,@KFLH)
IF ERR <> 0
RETURN ERR
ENDIF
IF KFLH == REPLICATE('0',8)
M.ZHZI = 'FFFFFF'
ELSE
LOCATE FOR CONT = 'zhzi'
M.ZHZI = ALLTRIM(DATA)
ENDIF
MSC = LOCKDA(M.ZHZI,KEY)
ENDIF
ERR = CHK_SC(0,3,@MSC)
IF ERR = 11 .OR. ERR = 14
DO CASE
CASE TIMES == '00'
ERR = 14
CASE TIMES == '04'
ERR = 99
CASE TIMES == '06'
ERR = 98
CASE TIMES == '07' AND ERR = 11
ERR = 98
ENDCASE
ENDIF
RETURN ERR
ENDPROC
*------
PROCEDURE r_card32
PARAMETER COM , ADDRESS , UNLOCK
PRIVATE ADDRESS , RE_ERR , COM , LOOPBZ , YESNO , R_DATA , KEYF , I , DATAM , DA , R_NEW , ;
K_NEW , NEW , NEWB , UNLOCK , DATAF , INDATA , IN_DATA , W_DATA , ;
WDATA
DO SURE32WC
RE_ERR = INIT_COM(COM)
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
RETURN RE_ERR
ENDIF
ENDIF
LOOPBZ = .T.
DO WHILE LOOPBZ = .T.
RE_ERR = POWER_ON()
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
= CLOSE_COM()
RETURN RE_ERR
ENDIF
LOOP
ENDIF
= SELE_CARD(42)
R_DATA = REPLICATE('F',64)
RE_ERR = RD_ASC(0,32 * ADDRESS,32,@R_DATA)
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN RE_ERR
ENDIF
LOOP
ENDIF
IF UNLOCK = 1
KEYF = LOCKKEY()
IF .NOT. (TYPE('keyf') == 'C')
YESNO = ALERT(KEYF)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN KEYF
ENDIF
LOOP
ENDIF
DATAM = ''
DATAF = SUBSTR(R_DATA,3,60)
FOR I = 1 TO 56 STEP 6
DA = SUBSTR(DATAF,I,6)
DA = UNLOCKDA(DA,KEYF)
DATAM = ALLTRIM(DATAM + DA)
ENDFOR
R_DATA = STUFF(R_DATA,3,60,DATAM)
ENDIF
LOOPBZ = .F.
ENDDO
= POWER_OFF()
= CLOSE_COM()
RETURN R_DATA
ENDPROC
*------
PROCEDURE r_card192
PARAMETER COM , UNLOCK
PRIVATE RE_ERR , COM , LOOPBZ , YESNO , R_DATA , KEYF , I , DATAM , DA , R_NEW , K_NEW , ;
NEW , NEWB , UNLOCK , DATAF
DO SURE32WC
RE_ERR = INIT_COM(COM)
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
RETURN RE_ERR
ENDIF
ENDIF
LOOPBZ = .T.
DO WHILE LOOPBZ = .T.
RE_ERR = POWER_ON()
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
= CLOSE_COM()
RETURN RE_ERR
ENDIF
LOOP
ENDIF
= SELE_CARD(42)
R_DATA = REPLICATE('F',384)
RE_ERR = RD_ASC(0,64,192,@R_DATA)
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN RE_ERR
ENDIF
LOOP
ENDIF
IF UNLOCK = 1
KEYF = LOCKKEY()
IF .NOT. (TYPE('keyf') == 'C')
YESNO = ALERT(KEYF)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN KEYF
ENDIF
LOOP
ENDIF
DATAM = ''
FOR I = 1 TO 383 STEP 6
DA = SUBSTR(R_DATA,I,6)
DA = UNLOCKDA(DA,KEYF)
DATAM = ALLTRIM(DATAM + DA)
ENDFOR
R_DATA = DATAM
ENDIF
LOOPBZ = .F.
ENDDO
= POWER_OFF()
= CLOSE_COM()
RETURN R_DATA
ENDPROC
*------
PROCEDURE w_card32
PARAMETER COM , DATAF , KFLH , ADDRESS , LOCK , CHANGESC
PRIVATE ADDRESS , DATAF , RE_ERR , COM , KFLH , LOOPBZ , CHKSC , YESNO , WDATA , RDATA , ;
KEYF , DATAM , DA , CHK , CHKF , DATA1 , DATA2 , LOCK
DATAF = ALLTRIM(DATAF)
KFLH = ALLTRIM(KFLH)
DO SURE32WC
RE_ERR = INIT_COM(COM)
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
RETURN RE_ERR
ENDIF
ENDIF
LOOPBZ = .T.
DO WHILE LOOPBZ = .T.
RE_ERR = POWER_ON()
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
= CLOSE_COM()
RETURN RE_ERR
ENDIF
LOOP
ENDIF
= SELE_CARD(42)
KEYF = LOCKKEY()
IF .NOT. (TYPE('keyf') == 'C')
YESNO = ALERT(KEYF)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN KEYF
ENDIF
LOOP
ENDIF
CHKF = FCHK_SC(KEYF)
IF CHKF <> 0
IF CHKF = 9999
RETURN CHKF
ENDIF
YESNO = ALERT(CHKF)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN CHKF
ENDIF
IF .NOT. CHKF = 98 AND .NOT. CHKF = 99
LOOP
ENDIF
ENDIF
CHK = CHECK(KFLH + DATAF)
IF LOCK = 1
DATAM = ''
FOR I = 1 TO 58 STEP 6
DA = SUBSTR(DATAF,I,6)
DA = LOCKDA(DA,KEYF)
DATAM = ALLTRIM(DATAM + DA)
ENDFOR
DATAF = DATAM
ENDIF
IF ADDRESS = 0
WDATA = DATAF
DATA1 = SUBSTR(DATAF,1,30)
DATA2 = SUBSTR(DATAF,43,22)
ELSE
WDATA = ALLTRIM(KFLH + DATAF + CHK)
ENDIF
RDATA = WR_ASC(0,32 * ADDRESS,32,@WDATA)
IF RDATA <> 0
YESNO = ALERT(RDATA)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN RDATA
ENDIF
LOOP
ENDIF
IF CHANGESC = 1
KEYF = LOCKKEY()
IF .NOT. (TYPE('keyf') == 'C')
YESNO = ALERT(KEYF)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN KEYF
ENDIF
LOOP
ENDIF
KFLH = REPLICATE('F',8)
ERR = RD_ASC(0,28,4,@KFLH)
IF ERR <> 0
YESNO = ALERT(ERR)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN ERR
ENDIF
LOOP
ENDIF
IF KFLH == REPLICATE('0',8)
M.ZHZI = 'FFFFFF'
ELSE
SELECT MSC
LOCATE FOR CONT = 'zhzi'
M.ZHZI = ALLTRIM(DATA)
ENDIF
MSC = LOCKDA(M.ZHZI,KEYF)
ERR = WR_SC(@MSC)
IF ERR <> 0
YESNO = ALERT(ERR)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN ERR
ENDIF
LOOP
ENDIF
ENDIF
LOOPBZ = .F.
ENDDO
= POWER_OFF()
= CLOSE_COM()
RETURN 0
ENDPROC
*------
PROCEDURE w_card192
PARAMETER COM , DATAF
PRIVATE DATAF , RE_ERR , COM , LOOPBZ , CHKSC , YESNO , RDATA , KEYF , DATAM , DA , CHK , ;
CHKF , LOCK , CHANGESC
DATAF = ALLTRIM(DATAF)
DO SURE32WC
RE_ERR = INIT_COM(COM)
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
RETURN RE_ERR
ENDIF
ENDIF
LOOPBZ = .T.
DO WHILE LOOPBZ = .T.
RE_ERR = POWER_ON()
IF RE_ERR <> 0
YESNO = ALERT(RE_ERR)
IF YESNO = 2
= CLOSE_COM()
RETURN RE_ERR
ENDIF
LOOP
ENDIF
= SELE_CARD(42)
KEYF = LOCKKEY()
IF .NOT. (TYPE('keyf') == 'C')
YESNO = ALERT(KEYF)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN KEYF
ENDIF
LOOP
ENDIF
CHKF = FCHK_SC(KEYF)
IF CHKF <> 0
IF CHKF = 9999
RETURN CHKF
ENDIF
YESNO = ALERT(CHKF)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN CHKF
ENDIF
IF .NOT. CHKF = 98 AND .NOT. CHKF = 99
LOOP
ENDIF
ENDIF
DATAM = ''
FOR I = 1 TO 383 STEP 6
DA = SUBSTR(DATAF,I,6)
DA = LOCKDA(DA,KEYF)
DATAM = ALLTRIM(DATAM + DA)
ENDFOR
RDATA = WR_ASC(0,64,192,@DATAM)
IF RDATA <> 0
YESNO = ALERT(RDATA)
IF YESNO = 2
= POWER_OFF()
= CLOSE_COM()
RETURN RDATA
ENDIF
LOOP
ENDIF
LOOPBZ = .F.
ENDDO
= POWER_OFF()
= CLOSE_COM()
RETURN 0
ENDPROC
*------
PROCEDURE wr_time
PARAMETER COM_TIME
PRIVATE FZF , XSF , RQF , YFF , NFF , TIMEF , K_WDATA1 , OUT_WDATA , COM_TIEM
FZF = ALLTRIM(STR(MINUTE(DATETIME())))
IF LEN(FZF) < 2
FZF = '0' + FZF
ENDIF
XSF = ALLTRIM(STR(HOUR(DATETIME())))
IF LEN(XSF) < 2
XSF = '0' + XSF
ENDIF
RQF = ALLTRIM(STR(DAY(DATETIME())))
IF LEN(RQF) < 2
RQF = '0' + RQF
ENDIF
YFF = ALLTRIM(STR(MONTH(DATETIME())))
IF LEN(YFF) < 2
YFF = '0' + YFF
ENDIF
NFF = ALLTRIM(STR(YEAR(DATETIME())))
NFF = RIGHT(NFF,2)
TIMEF = FZF + XSF + RQF + YFF + NFF
K_WDATA1 = R_CARD32(COM_TIME,1,1)
IF .NOT. (TYPE('k_wdata1') == 'C')
RETURN K_WDATA1
ENDIF
K_WDATA1 = SUBSTR(K_WDATA1,3,60)
K_WDATA1 = STUFF(K_WDATA1,35,10,TIMEF)
OUT_WDATA = W_CARD32(COM_TIME,K_WDATA1,'00',1,1,0)
IF OUT_WDATA <> 0
RETURN OUT_WDATA
ELSE
RETURN 0
ENDIF
ENDPROC
*------
PROCEDURE key
RETURN
ENDPROC
*------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -