; @@@M Modulo GemCore 1.21 ;*******************************************;**************************** ; @@@F FFGCR121StartCom - inizio comunicazione col reader su porta seriale ; @@@D ; @@@P numero della porta COM cui il reader e' attaccato (da 1 a 4) ; @@@R 0 = OK \\ ; 1 = la porta seriale non si apre ; @@@E ;*******************************************; FFGCR121StartComm PROC PARM_1:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; PUSH PARM_1 ; POP EAX ;# porta COM (da 1 a 4) ;===========================================;PRELIMINARI SULLA PORTA COM ADD AL,30H ;make it ASCII LEA ESI,portName MOV [ESI+3],AL ;-------------------------------------------;apre la porta seriale INVOKE CreateFile, OFFSET portName, GENERIC_READ + GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 CMP EAX,0FFFFFFFFh JZ GCR121ERR_1 MOV hCom,EAX ;salva l'handle della porta ;-------------------------------------------; INVOKE SetupComm, hCom, 512, 512 INVOKE BuildCommDCB, OFFSET dcbString, OFFSET dcb INVOKE SetCommState, hCom, OFFSET dcb ;-------------------------------------------; MOV cto . ReadIntervalTimeout, 100 MOV cto . ReadTotalTimeoutMultiplier, 100 MOV cto . ReadTotalTimeoutConstant, 500 MOV cto . WriteTotalTimeoutMultiplier, 0 MOV cto . WriteTotalTimeoutConstant, 0 INVOKE SetCommTimeouts, hCom, OFFSET cto ;===========================================; GCR121ERR_OK: MOV EAX,0 JMP GCR121END ;===========================================; GCR121ERR_1: MOV EAX,1 JMP GCR121END ;===========================================; GCR121END: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGCR121StartComm ENDP ;*******************************************;**************************** ; @@@F FFGCR121StopCom - fine comunicazione col reader su porta seriale ; @@@D ; @@@E ;*******************************************; FFGCR121StopComm PROC ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; INVOKE CloseHandle, hCom ;===========================================; POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGCR121StopComm ENDP ;*******************************************;**************************** FlipSequenceBit PROC ;===========================================; PUSH EAX ; MOV AL,GBP_SequenceBit XOR AL,0FFH AND AL,01000000B MOV GBP_SequenceBit,AL POP EAX ; RET FlipSequenceBit ENDP ;*******************************************;**************************** ; @@@F FFGCR121Reset - reset del GemCore 1.21 based reader ; @@@D ; @@@R 0 = il reader e' stato resettato \\ ; 1 = il reader non risponde ; @@@E ;*******************************************; FFGCR121Reset PROC ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================;CHECK PRESENCE AT COMx MOV RESET_TEMPTATIVES,0 MOV GBP_SequenceBit,0 GCR121ResetLBL_1: LEA ESI,GCR121Restart INC RESET_TEMPTATIVES MOV GBP_LEN,4 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GCR121ResetLBL_2 CMP RESET_TEMPTATIVES,5 JA GCR121ResetNOK CALL FlipSequenceBit JMP GCR121ResetLBL_1 ;===========================================;SOMETHING RESPONDED AT COMx ; Now check that the responding device is actually the reader. ; If the responder is actually the reader the response should be one ; of the following: 0x24,0x82,0x00,0xA6 or 0x24,0x92,0x00,0xB6 (the ; first byte has been already checked by RECV_GBP_RESPONSE, now we ; just check a couple of things more) ;-------------------------------------------;CHECK LEN ; The LEN should be zero (no data returned by the reader) GCR121ResetLBL_2: CMP GBP__LEN,0 JNZ GCR121ResetNOK ;-------------------------------------------;CHECK ERROR ; A reset with a sequence bit of 1 causes an error CMP GBP__Error,0 ;0 = no error JZ GCR121ResetNOK ;===========================================;THE READER IS PRESENT, ;NOW RESET IT GCR121RstRepeat2: LEA ESI,GCR121Restart MOV GBP_LEN,4 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,2 ;did not respond (resetted) JZ GCR121ResetOK JMP GCR121ResetNOK ;anything else (impossible) ;===========================================;OK GCR121ResetOK: CALL FlipSequenceBit;necessary to start operations MOV EAX,0 JMP GCR121ResetEnd ;...........................................;NOK ; NOK means reader not present, or broken, or not connected to the ; proper COM port GCR121ResetNOK: MOV EAX,1 JMP GCR121ResetEnd ;===========================================;END GCR121ResetEnd: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGCR121Reset ENDP ;*******************************************;**************************** PREP_GBP_COMMAND PROC ; input: ESI = command string address ; GPB_LEN = length of command string ; output: GBP_Command = GBP formatted command ; GBP_LEN = length of GBP formatted command ;===========================================; CALL FlipSequenceBit ;-------------------------------------------; LEA EDI,GBP_Command ;...........................................;NAD MOV AL,GBP_NAD ;042h MOV [EDI],AL INC EDI ;...........................................;PCB (only contains seq. bit) MOV AL,GBP_SequenceBit MOV [EDI],AL INC EDI ;...........................................;LEN MOV EAX,GBP_LEN MOV [EDI],AL INC EDI ;...........................................;DAT MOV ECX,GBP_LEN COMPLETE_DAT: MOV AL,[ESI] INC ESI MOV [EDI],AL INC EDI LOOP COMPLETE_DAT ;...........................................;update GBP_LEN INC GBP_LEN ;one for NAD INC GBP_LEN ;one for PCB INC GBP_LEN ;one for LEN ;-------------------------------------------;EDC MOV DL,0 ;contains EDC LEA ESI,GBP_Command MOV ECX,GBP_LEN ;...........................................; COMPLETE_EDC: MOV AL,[ESI] INC ESI XOR DL,AL LOOP COMPLETE_EDC ;...........................................;write EDC MOV [EDI],DL ;-------------------------------------------;update GBP_LEN INC GBP_LEN ;one for EDC ;===========================================; RET PREP_GBP_COMMAND ENDP ;*******************************************;**************************** SEND_GBP_COMMAND PROC ; input: GBP_Command = sequence of bytes ; GBP_LEN = # of bytes (GBP_Command length) ;===========================================; INVOKE WriteFile, hCom, OFFSET GBP_Command, GBP_LEN, OFFSET iBytesWritten, 0 ; INVOKE FlushFileBuffers, hCom ;===========================================; RET SEND_GBP_COMMAND ENDP ;*******************************************;**************************** RECV_GBP_RESPONSE PROC ; output: ; ECX = 0 -> OK, GBP__LEN and GBP__Response properly filled ; ECX = 1 -> wrong EDC ; ECX = 2 -> reader not responding ;===========================================;NAD MOV GBP_Temptatives,24 WAIT_NAD: INVOKE Sleep, 100 DEC GBP_Temptatives CMP GBP_Temptatives,0 JZ RECV_GBP_RESP_NOK INVOKE ClearCommError, hCom, OFFSET GBP_Error, OFFSET comstat CMP EAX, 0 JZ RECV_GBP_RESP_NOK CMP comstat . cbInQue, 0 JZ WAIT_NAD INVOKE ReadFile, hCom, OFFSET GBP__NAD, 1, OFFSET iBytesRead, 0 MOV AL,GBP__NAD CMP AL,024H ;the reader is the origin JNZ RECV_GBP_RESP_NOK ;...........................................;start calculating EDC MOV GBP__CalcEDC,AL ;-------------------------------------------;PCB MOV GBP_Temptatives,24 WAIT_PCB: INVOKE Sleep, 100 DEC GBP_Temptatives CMP GBP_Temptatives,0 JZ RECV_GBP_RESP_NOK INVOKE ClearCommError, hCom, OFFSET GBP_Error, OFFSET comstat CMP EAX, 0 JZ RECV_GBP_RESP_NOK CMP comstat . cbInQue, 0 JZ WAIT_PCB INVOKE ReadFile, hCom, OFFSET GBP__PCB, 1, OFFSET iBytesRead, 0 MOV AL,GBP__PCB XOR GBP__CalcEDC,AL;continue calculating EDC AND AL,01000000b ;mask the sequence bit MOV GBP__SequenceBit,AL ;-------------------------------------------;CHECK SEQUENCE BIT ;-------------------------------------------;CHECK ERRORS MOV EAX,0 MOV AL,GBP__PCB AND AL,10010011B MOV GBP__Error,EAX ;-------------------------------------------; MOV GBP_Temptatives,24 WAIT_LEN: INVOKE Sleep, 100 DEC GBP_Temptatives CMP GBP_Temptatives,0 JZ RECV_GBP_RESP_NOK INVOKE ClearCommError, hCom, OFFSET GBP_Error, OFFSET comstat CMP EAX, 0 JZ RECV_GBP_RESP_NOK CMP comstat . cbInQue, 0 JZ WAIT_LEN INVOKE ReadFile, hCom, OFFSET GBP__Response, 1, OFFSET iBytesRead, 0 MOV EAX,0 MOV AL,GBP__Response MOV GBP__LEN,EAX XOR GBP__CalcEDC,AL;continue calculating EDC ;-------------------------------------------;# OF BYTES TO READ CMP GBP__LEN,0 JZ READ_EDC ;jump if no bytes to read ;-------------------------------------------; LEA EDI,GBP__Response MOV ECX,GBP__LEN RECV_LOOP: PUSH ECX ;...........................................; MOV GBP_Temptatives,24 WAIT_DAT: INVOKE Sleep, 100 DEC GBP_Temptatives CMP GBP_Temptatives,0 JNZ RECV_GBP_LBL_1 POP ECX JMP RECV_GBP_RESP_NOK RECV_GBP_LBL_1: INVOKE ClearCommError, hCom, OFFSET GBP_Error, OFFSET comstat CMP EAX, 0 JNZ RECV_GBP_LBL_2 POP ECX JMP RECV_GBP_RESP_NOK RECV_GBP_LBL_2: CMP comstat . cbInQue, 0 JZ WAIT_DAT INVOKE ReadFile, hCom, EDI, 1, OFFSET iBytesRead, 0 MOV AL,[EDI] XOR GBP__CalcEDC,AL;continue calculating EDC INC EDI ;...........................................; POP ECX LOOP RECV_LOOP ;-------------------------------------------; READ_EDC: MOV GBP_Temptatives,24 WAIT_EDC: INVOKE Sleep, 100 DEC GBP_Temptatives CMP GBP_Temptatives,0 JZ RECV_GBP_RESP_NOK INVOKE ClearCommError, hCom, OFFSET GBP_Error, OFFSET comstat CMP EAX, 0 JZ RECV_GBP_RESP_NOK CMP comstat . cbInQue, 0 JZ WAIT_EDC INVOKE ReadFile, hCom, OFFSET GBP__EDC, 1, OFFSET iBytesRead, 0 ;-------------------------------------------; MOV AL,GBP__CalcEDC CMP AL,GBP__EDC JNZ RECV_GBP_EDC_ERR ;===========================================; RECV_GBP_RESP_OK: MOV EAX,0 JMP RECV_GBP_RESP_END RECV_GBP_EDC_ERR: MOV EAX,1 JMP RECV_GBP_RESP_END RECV_GBP_RESP_NOK: MOV EAX,2 JMP RECV_GBP_RESP_END RECV_GBP_RESP_END: RET RECV_GBP_RESPONSE ENDP ;*******************************************;**************************** ; @@@F FFGCR121FirmVers - read firmware version ; @@@D ; @@@R Puntatore alla stringa ASCIIZ che contiene la descrizione. ; @@@E ;*******************************************; FFGCR121FirmVers PROC ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; GCR121FirmRepeat: LEA ESI,GCR121ReadFirmVers MOV GBP_LEN,5 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GCR121FirmProceed CMP EAX,1 ;responded, but wrong EDC JZ GCR121FirmRepeat JMP GCR121FirmNOK ;===========================================; GCR121FirmProceed: MOV EAX,GBP__Error CMP AL,0 JNZ GCR121FirmNOK MOV EAX,GBP__LEN CMP EAX,0 ;no data ? JZ GCR121FirmNOK LEA EDI,GBP__Response MOV BL,0 MOV [EDI + EAX],BL ;===========================================; GCR121FirmOK: LEA EAX,GBP__Response INC EAX ;skip S JMP GCR121FirmEnd GCR121FirmNOK: MOV EAX,-1 JMP GCR121FirmEnd ;===========================================; GCR121FirmEnd: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGCR121FirmVers ENDP ;*******************************************;**************************** ; @@@F FFGCR121DisRosComp - disable ROS compatibility ; @@@D Unuseful ; @@@R S ; @@@E ;*******************************************; FFGCR121DisRosComp PROC ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; GCR121_DRC_1: LEA ESI,GCR121DisRosComp MOV GBP_LEN,3 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GCR121_DRC_2 CMP EAX,1 ;responded, but wrong EDC JZ GCR121_DRC_1 JMP GCR121_DRC_NOK ;===========================================; GCR121_DRC_2: MOV EAX,GBP__Error CMP AL,0 JNZ GCR121_DRC_NOK MOV EAX,GBP__LEN CMP AL,0 JZ GCR121_DRC_NOK LEA ESI,GBP__Response MOV EAX,0 MOV AL,[ESI] ;AL = S ;===========================================; GCR121_DRC_OK: ;EAX=S JMP GCR121_DRC_END GCR121_DRC_NOK: MOV EAX,-1 JMP GCR121_DRC_END ;===========================================; GCR121_DRC_END: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGCR121DisRosComp ENDP ;*******************************************;**************************** ; @@@M Modulo GemPC 410 ;*******************************************;**************************** ; @@@F FFGPC410Led - gestione LED del reader ; @@@D ; @@@P 0 = off \\ ; 1 = on \\ ; 2 = blink ; @@@R ; @@@E ;*******************************************; FFGPC410Led PROC PARM_1:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; PUSH PARM_1 ; POP EAX ; ;===========================================; LEA EDI,GPC410Led INC EDI MOV [EDI],AL ;put parameter in command ;===========================================; GPC410LedRepeat: LEA ESI,GPC410Led MOV GBP_LEN,2 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GPC410LedProceed CMP EAX,1 ;responded, but wrong EDC JZ GPC410LedRepeat JMP GPC410LedNOK ;===========================================; GPC410LedProceed: MOV EAX,GBP__Error CMP AL,0 JNZ GPC410LedNOK MOV EAX,GBP__LEN CMP AL,0 ;should be 1 byte of S JZ GPC410LedNOK LEA ESI,GBP__Response MOV EAX,0 MOV AL,[ESI] ;===========================================; GPC410LedOK: JMP GPC410LedEnd GPC410LedNOK: MOV EAX,-1 JMP GPC410LedEnd ;===========================================; GPC410LedEnd: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGPC410Led ENDP ;*******************************************;**************************** ; @@@M Modulo GPM2K ;*******************************************;**************************** ; @@@F FFGPM2KCardType - set card type ; @@@D ; @@@R S ; @@@E ;*******************************************; FFGPM2KSetCardType PROC ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; GPM2K_SCT_1: LEA ESI,GPM2KSetCardType MOV GBP_LEN,2 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GPM2K_SCT_2 CMP EAX,1 ;responded, but wrong EDC JZ GPM2K_SCT_1 JMP GPM2K_SCT_NOK ;===========================================; GPM2K_SCT_2: MOV EAX,GBP__Error CMP AL,0 JNZ GPM2K_SCT_NOK MOV EAX,GBP__LEN CMP AL,0 JZ GPM2K_SCT_NOK LEA ESI,GBP__Response MOV EAX,0 MOV AL,[ESI] ;AL = S ;===========================================; GPM2K_SCT_OK: ;EAX=S JMP GPM2K_SCT_END GPM2K_SCT_NOK: MOV EAX,-1 JMP GPM2K_SCT_END ;===========================================; GPM2K_SCT_END: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGPM2KSetCardType ENDP ;*******************************************;**************************** ; @@@F FFGPM2KCardPowerUp - card power up ; @@@D ; @@@R 0 = OK \\ ; 251 = no smart card into reader ; @@@E ;*******************************************; FFGPM2KCardPowerUp PROC ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; GPM2K_CPU_1: LEA ESI,GPM2KCardPowerUp MOV GBP_LEN,1 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GPM2K_CPU_2 CMP EAX,1 ;responded, but wrong EDC JZ GPM2K_CPU_1 JMP GPM2K_CPU_NOK ;===========================================; GPM2K_CPU_2: MOV EAX,GBP__Error CMP AL,0 JNZ GPM2K_CPU_NOK MOV EAX,GBP__LEN CMP AL,0 JZ GPM2K_CPU_NOK LEA ESI,GBP__Response MOV EAX,0 MOV AL,[ESI] ;AL = S ;===========================================; GPM2K_CPU_OK: ;EAX=S JMP GPM2K_CPU_END GPM2K_CPU_NOK: MOV EAX,-1 JMP GPM2K_CPU_END ;===========================================; GPM2K_CPU_END: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGPM2KCardPowerUp ENDP ;*******************************************;**************************** ; @@@F FFGPM2KCardPowerDn - card power down ; @@@D ; @@@R S ; @@@E ;*******************************************; FFGPM2KCardPowerDn PROC ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; GPM2K_CPD_1: LEA ESI,GPM2KCardPowerDn MOV GBP_LEN,1 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GPM2K_CPD_2 CMP EAX,1 ;responded, but wrong EDC JZ GPM2K_CPD_1 JMP GPM2K_CPD_NOK ;===========================================; GPM2K_CPD_2: MOV EAX,GBP__Error CMP AL,0 JNZ GPM2K_CPD_NOK MOV EAX,GBP__LEN CMP AL,0 JZ GPM2K_CPD_NOK LEA ESI,GBP__Response MOV EAX,0 MOV AL,[ESI] ;AL = S ;===========================================; GPM2K_CPD_OK: ;EAX=S JMP GPM2K_CPD_END GPM2K_CPD_NOK: MOV EAX,-1 JMP GPM2K_CPD_END ;===========================================; GPM2K_CPD_END: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGPM2KCardPowerDn ENDP ;*******************************************;**************************** ; @@@F FFGPM2KChkSecrCode - check secret code ; @@@D ; @@@P Secret code (3 byte string) ; @@@R S ; @@@E ;*******************************************; FFGPM2KChkSecrCode PROC PARM_1:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================;PARAMETER (3 BYTES) PUSH PARM_1 ; POP ESI LEA EDI,GPM2KChkSecrCode ADD EDI,6 MOV ECX,3 GPM2K_CSC_LOOP: MOV AL,[ESI] INC ESI MOV [EDI],AL INC EDI LOOP GPM2K_CSC_LOOP ;===========================================; GPM2K_CSC_1: LEA ESI,GPM2KChkSecrCode MOV GBP_LEN,9 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GPM2K_CSC_2 CMP EAX,1 ;responded, but wrong EDC JZ GPM2K_CSC_1 JMP GPM2K_CSC_NOK ;===========================================; GPM2K_CSC_2: MOV EAX,GBP__Error CMP AL,0 JNZ GPM2K_CSC_NOK MOV EAX,GBP__LEN CMP AL,0 JZ GPM2K_CSC_NOK LEA ESI,GBP__Response MOV EAX,0 MOV AL,[ESI] ;AL = S = 0 INC ESI CMP AL,0 JNZ GPM2K_CSC_NOK MOV AL,[ESI] ;AL = 90H INC ESI CMP AL,090H JNZ GPM2K_CSC_NOK MOV AL,[ESI] ;AL = 0 CMP AL,0 JNZ GPM2K_CSC_NOK ;===========================================; GPM2K_CSC_OK: ;EAX=S JMP GPM2K_CSC_END GPM2K_CSC_NOK: MOV EAX,-1 JMP GPM2K_CSC_END ;===========================================; GPM2K_CSC_END: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGPM2KChkSecrCode ENDP ;*******************************************;**************************** ; @@@F FFGPM2KSetSecrCode - set secret code ; @@@D ; @@@P Secret code (3 byte string) ; @@@R S ; @@@E ;*******************************************; FFGPM2KSetSecrCode PROC PARM_1:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================;PARAMETER (3 BYTES) PUSH PARM_1 POP ESI LEA EDI,GPM2KSetSecrCode ADD EDI,6 MOV ECX,3 GPM2K_SSC_LOOP: MOV AL,[ESI] INC ESI MOV [EDI],AL INC EDI LOOP GPM2K_SSC_LOOP ;===========================================; GPM2K_SSC_1: LEA ESI,GPM2KSetSecrCode MOV GBP_LEN,9 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GPM2K_SSC_2 CMP EAX,1 ;responded, but wrong EDC JZ GPM2K_SSC_1 JMP GPM2K_SSC_NOK ;===========================================; GPM2K_SSC_2: MOV EAX,GBP__Error CMP AL,0 JNZ GPM2K_SSC_NOK MOV EAX,GBP__LEN CMP AL,0 JZ GPM2K_SSC_NOK LEA ESI,GBP__Response MOV EAX,0 MOV AL,[ESI] ;AL = S = 0 INC ESI CMP AL,0 JNZ GPM2K_SSC_NOK MOV AL,[ESI] ;AL = 90H INC ESI CMP AL,090H JNZ GPM2K_SSC_NOK MOV AL,[ESI] ;AL = 0 CMP AL,0 JNZ GPM2K_SSC_NOK ;===========================================; GPM2K_SSC_OK: JMP GPM2K_SSC_END GPM2K_SSC_NOK: MOV EAX,-1 JMP GPM2K_SSC_END ;===========================================; GPM2K_SSC_END: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGPM2KSetSecrCode ENDP ;*******************************************;**************************** ; @@@F FFGPM2KRead - read GPM2K memory ; @@@D ; @@@P ADR = address of the 1st byte to read ; @@@i LN = number of bytes to read ; @@@R pointer to a sequence of as many bytes as the second parameter ; @@@E ;*******************************************; FFGPM2KRead PROC PARM_1:DWORD, PARM_2:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; PUSH PARM_1 POP EAX PUSH PARM_2 POP EBX ;...........................................; LEA EDI,GPM2KRead ADD EDI,4 MOV [EDI],AL INC EDI MOV [EDI],BL ;===========================================; GPM2K_READ_1: LEA ESI,GPM2KRead MOV GBP_LEN,6 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GPM2K_READ_2 CMP EAX,1 ;responded, but wrong EDC JZ GPM2K_READ_1 JMP GPM2K_READ_NOK ;===========================================; GPM2K_READ_2: MOV EAX,GBP__Error CMP AL,0 JNZ GPM2K_READ_NOK MOV EAX,GBP__LEN CMP AL,0 JZ GPM2K_READ_NOK LEA ESI,GBP__Response MOV AL,[ESI] ;AL = S = 0 CMP AL,0 JNZ GPM2K_READ_NOK ;===========================================; GPM2K_READ_OK: LEA EAX,GBP__Response INC EAX ;skip S JMP GPM2K_READ_END GPM2K_READ_NOK: MOV EAX,-1 JMP GPM2K_READ_END ;===========================================; GPM2K_READ_END: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGPM2KRead ENDP ;*******************************************;**************************** ; @@@F FFGPM2KWrite - write GPM2K memory ; @@@D ; @@@P ADR = address of the 1st byte to write ; @@@i LN = number of bytes to write ; @@@i DAT = stringa di bytes da scrivere ; @@@R S ; @@@E ;*******************************************; FFGPM2KWrite PROC PARM_1:DWORD, PARM_2:DWORD, PARM_3:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; PUSH PARM_1 POP EAX PUSH PARM_2 POP ECX PUSH PARM_3 POP ESI ;...........................................; MOV GBP_LEN,ECX ;...........................................; LEA EDI,GPM2KWrite ADD EDI,4 MOV [EDI],AL INC EDI MOV [EDI],CL INC EDI GPM2K_WRITE_LOOP: MOV AL,[ESI] INC ESI MOV [EDI],AL INC EDI LOOP GPM2K_WRITE_LOOP ;===========================================; GPM2K_WRITE_1: LEA ESI,GPM2KWrite ADD GBP_LEN,6 CALL PREP_GBP_COMMAND CALL SEND_GBP_COMMAND CALL RECV_GBP_RESPONSE CMP EAX,0 ;responded JZ GPM2K_WRITE_2 CMP EAX,1 ;responded, but wrong EDC JZ GPM2K_WRITE_1 JMP GPM2K_WRITE_NOK ;===========================================; GPM2K_WRITE_2: MOV EAX,GBP__Error CMP AL,0 JNZ GPM2K_WRITE_NOK MOV EAX,GBP__LEN CMP AL,0 JZ GPM2K_WRITE_NOK LEA ESI,GBP__Response MOV EAX,0 MOV AL,[ESI] ;AL = S ;===========================================; GPM2K_WRITE_OK: ;EAX contains S JMP GPM2K_WRITE_END GPM2K_WRITE_NOK: MOV EAX,-1 JMP GPM2K_WRITE_END ;===========================================; GPM2K_WRITE_END: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFGPM2KWrite ENDP ;*******************************************;****************************