Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Convertir asm en c

misse, le jeudi 2 novembre 2006 à 15:08:30
salut
Conaissant pas le langage asm Quelqu'un pourrait convertir ce prog en c merci

************************************************************­*********
; Ce fichier est la base de départ pour la gestion d'une carte *
; répondant à la norme ISO7816. *
; *
;***********************************************************­***********
; *
; NOM: ISO7816 *
; Date: 10/03/2001 *
; Version: 1.0 *
; Circuit: Carte pour serrure codée *
; Auteur: Bigonoff *
; *
;***********************************************************­***********
; *
; Fichier requis: P16F84.inc *
; *
;***********************************************************­***********
; *
; - MCLR Commande de reset de la carte Entrée *
; - RB7 DATA - données mode série Bi-directionnel *
; *
;***********************************************************­***********


LIST p=16F84 ; Définition de processeur
#include ; Définitions des constantes

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

; Code protection OFF
; Timer reset sur power on en service
; Watch-dog hors service
; Oscillateur quartz grande vitesse

;*********************************************************************
; ASSIGNATIONS *
;*********************************************************************

OPTIONVAL EQU 0x08 ; Valeur registre option
; Résistance pull-up ON
; Préscaler timer à 1

;*********************************************************************
; DEFINE *
;*********************************************************************

#DEFINE SERIAL PORTB , 7 ; connection port série

;*********************************************************************
; MACRO *
;*********************************************************************

BANK0 macro
bcf STATUS , RP0 ; passer banque0
endm

BANK1 macro
bsf STATUS , RP0 ; passer banque1
endm

WRITEE macro addwrite ; la donnée se trouve dans W
movwf EEDATA ; placer data dans registre
movlw addwrite ; charger adresse d'écriture
movwf EEADR ; placer dans registre
bcf INTCON , GIE ; interdire interruptions
bsf STATUS , RP0 ; passer en banque1
bcf EECON1 , EEIF ; effacer flag de fin d'écriture
bsf EECON1 , WREN ; autoriser accès écriture
movlw 0x55 ; charger 0x55
movwf EECON2 ; envoyer commande
movlw 0xAA ; charger 0xAA
movwf EECON2 ; envoyer commande
bsf EECON1 , WR ; lancer cycle d'écriture
bcf EECON1 , WREN ; verrouiller prochaine écriture
bsf INTCON , GIE ; réautoriser interruptions
bcf STATUS , RP0 ; repasser en banque0
endm

;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************

CBLOCK 0x00C ; début de la zone variables
Ser_Ins ; instruction ISO7816
Ser_P1 ; paramètre 1 ISO7816
Ser_P2 ; paramètre 2 ISO7816
Ser_Len ; longueur data ISO7816
local1 : 1 ; variable locale 1
local2 : 1 ; variable locale 2
local3 : 1 ; variable locale 3
local4 : 1 ; variable locale 4

temp_sauvw : 1 ; sauvegarde de W pour temp
ENDC ; Fin de la zone

; routine ATR
; -----------
#DEFINE cmpt1 local1 ; compteur d'octets pour ATR

; sous-routine send et receive
; ----------------------------
#DEFINE caract local2 ; caractère à envoyer
#DEFINE parite local3 ; bit de parité
#DEFINE cmptbts local4 ; compteur de bits

; pour STATUS
; -----------
#DEFINE status2 local1 ; octet 2 du status

; pour instruction 25
; -------------------
#DEFINE cmpt2 local1 ; compteur d'octets

;*********************************************************************
; DECLARATIONS DE LA ZONE EEPROM *
;*********************************************************************
org 0x2100 ; adresse début zone eeprom

ATR DE 0x07 ; Réponse à l'ATR
DE 0xAB ; B7 01 BB AB 07
DE 0xBB
DE 0x01
DE 0xB7


;*********************************************************************
; INITIALISATIONS *
;*********************************************************************
org 0x000 ; Adresse de départ après reset
init
BANK1 ; passer banque1
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
BANK0 ; passer banque0

;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************

start
; on commence par attendre un peu
; -------------------------------

call temp_1bd ; attendre 1 bit et demi

;====================================================================


; ENVOI DE L'ATR


;=====================================================================
;---------------------------------------------------------------------
; Envoi d'un ATR fictif : l'ATR est dans les 5 octets de 0x04 à
; 0x00 de l'eeprom interne. L'ATR est écris en sens inverse
;---------------------------------------------------------------------

movlw 0x5 ; pour 5 octets
movwf cmpt1 ; dans compteur de boucles = adresse

ATR_loop
decf cmpt1 , w ; adresse à lire = compteur de boucles-1
call Rd_eeprom ; Lire un octet eeprom interne
call Send ; Envoyer sur le décodeur
decfsz cmpt1 , f ; décrémenter compteur
goto ATR_loop ; pas fini, suivant

;====================================================================


; ENVOI DU STATUS STANDARD


;=====================================================================
;---------------------------------------------------------------------
; Envoie le status standard, dans ce cas on a pris 0x80 0X00
;---------------------------------------------------------------------
Statstd
movlw 0x80 ; prendre 1er octet status
call Send ; l'envoyer
clrw ; effacer w
call Send ; envoyer 00
goto classe ; et traiter classe

;====================================================================


; ENVOI D'UN STATUS SPECIFIQUE


;=====================================================================
;---------------------------------------------------------------------
; Envoie d'abord l'octet contenu dans w, puis l'octet contenu dans
; status2
;---------------------------------------------------------------------
Statxx
call Send ; on envoie valeur
movf status2 , w ; charger byte à envoyer
call Send ; on envoie 2ème octet du status

;====================================================================


; LECTURE DE LA CLASSE


;=====================================================================
;---------------------------------------------------------------------
; on considère dans cet exemple qu'il n'y a qu'une seule classe
; valide. on attend l'arrivée de la classe et on ne la traite pas
;---------------------------------------------------------------------
classe
call Receive ; Lire le byte venant du maître

;====================================================================


; LECTURE DE INS,P1,P2,LEN


;=====================================================================
;---------------------------------------------------------------------
; INS sera placé dans la variable Ser_ins
; P1 sera placé dans Ser_P1 et P2 dans Ser_P2
; La longueur du champs de data sera dans Ser_len
;---------------------------------------------------------------------

movlw Ser_Ins ; pointer sur emplacement instruction
movwf FSR ; initialiser pointeur indirection
read_loop
call Receive ; Lire un octet
movwf INDF ; sauver dans emplacement prévu
incf FSR , f ; pointer sur suivant
btfss FSR , 0x4 ; Tester si adresse 0x10 atteinte
goto read_loop ; non, octet suivant

;====================================================================


; SWITCH SUIVANT INSTRUCTION RECUE


;=====================================================================
;---------------------------------------------------------------------
; Nous allons imaginer que nous allons réagir à une instruction 0x25
; Toute autre instruction sera considérée comme incorrecte
; Dans le cas d'une instruction incorrecte, nous reverrons un status
; 0x60 0x40
;---------------------------------------------------------------------

; tester instruction reçue
; ------------------------
movf Ser_Ins , w ; charger instruction reçue
sublw 0x25 ; comparer avec 0x25
btfsc STATUS , Z ; tester si identique
goto Ins25 ; oui, traiter instruction 25

; traiter instruction incorrecte
; ------------------------------
movlw 0x40 ; charger octet2 status à envoyer
movwf status2 ; placer dans variable
movlw 0x60 ; charger octet 1 status
goto Statxx ; envoyer status

;=====================================================================
; TRAITER INSTRUCTION 25
;=====================================================================
;---------------------------------------------------------------------
; On va traiter cette instruction bidon de la manière suivante :
; 1) Comme dans toute instruction, on renvoie la commande reçue
; 2) L'instruction renvoie la somme de P1 et de P2.
; 3) La trame d'envoi est complété par des 0xFF pour atteindre une
; longueur totale de data identique à Ser_Len
; 4) Ensuite le status standard est envoyé
;---------------------------------------------------------------------
Ins25
; envoyer écho de la commande
; ---------------------------
movf Ser_Ins , w ; charger commande reçue
call Send ; renvoyer en écho

; renvoyer P1 + P2
; ----------------
movf Ser_P1 , w ; charger P1
addwf Ser_P2 , w ; + P2
call Send ; envoyer résultat

; Tester longueur de la réponse
; -----------------------------
decf Ser_Len , f ; car déjà résultat envoyé
btfsc STATUS , Z ; tester si complet
goto Statstd ; oui, envoyer status standard

; compléter avec des 0xFF
; -----------------------
Insloop
movlw 0xFF ; valeur à envoyer
call Send ; envoyer 0xFF
decfsz Ser_Len , f ; décrémenter compteur de boucles
goto Insloop ; pas fini, suivant

; envoyer status standard
; -----------------------
goto Statstd ; envoyer status standard


;*********************************************************************
; TEMPORISATION *
;*********************************************************************
;---------------------------------------------------------------------
; temp_1bd: initialise tmr0 pour que la temporisation soit égale à
; l'équivalent d'un bit et demi, soit 46+93 incrémentations
; de tmr0 - le temps nécessaire pour arriver dans la routine
; temp_1b : Attend que l'écart entre la précédente tempo et la tempo
; actuelle soit de 1 bit, soit 93 instructions
;---------------------------------------------------------------------

temp_1bd
movlw -40 ; préparer valeur tmr0
movwf TMR0 ; initialiser tmr0
call temp_suite ; et attendre 1/2 bit

temp_1b
movlw -93 ; écart entre 2 bits
addwf TMR0 , f ; ajouter à la valeur actuelle

temp_suite
bcf INTCON , T0IF ; effacer flag
temp_wait
btfss INTCON , T0IF ; attendre débordement timer
goto temp_wait ; pas fini, attendre
return ; et sortir

;*********************************************************************
; Lecture d'un octet en eeprom interne *
;*********************************************************************
;---------------------------------------------------------------------
; Lecture d'un octet de l'eeprom interne. L'adresse est passée dans w
; l'octet lu est retourné dans W
;---------------------------------------------------------------------
Rd_eeprom
movwf EEADR ; adresse à lire dans registre EEADR
bsf STATUS , RP0 ; passer en banque1
bsf EECON1 , RD ; lancer la lecture EEPROM
bcf STATUS , RP0 ; repasser en banque0
movf EEDATA , w ; charger valeur lue dans W
return ; retour

;*********************************************************************
; Envoi d'un octet vers le lecteur de carte *
;*********************************************************************
;---------------------------------------------------------------------
; envoie l'octet contenu dans le registre w vers le lecteur de carte
;---------------------------------------------------------------------
Send
movwf caract ; Sauver caractère à envoyer
call temp_1bd ; attendre 1 bit et demi
BANK1 ; passer banque1
bcf SERIAL ; port série en sortie
BANK0 ; repasser banque0

; envoyer start-bit
; -----------------
bcf SERIAL ; envoyer 0 : start-bit
clrf parite ; effacer bit de parité

movlw 8 ; pour 8 bits à envoyer
movwf cmptbts ; dans compteur de bits
call temp_1b ; attente entre 2 bits


; envoyer 8 bits de data
; ----------------------
Send_loop
rrf caract , f ; décaler caractère, b0 dans carry
rrf caract , w ; carry dans b7 de w
andlw 0x80 ; garder bit à envoyer en position b7
xorwf parite , f ; positionner parité
xorwf PORTB , w ; Garder 1 si changement sur SERIAL
xorwf PORTB , f ; si oui, inverser RB7
call temp_1b ; attente entre 2 bits
decfsz cmptbts , f ; décrémenter compteur de bits
goto Send_loop ; pas dernier, suivant

; envoyer parité
; --------------
movf parite , w ; charger parité paire ca lculée
xorwf PORTB , w ; Si serial différent de bit à envoyer
xorwf PORTB , f ; alors inverser RB7
call temp_1b ; attendre fin de parité

; envoyer 2 stop-bits
; -------------------
BANK1 ; passer banque1
bsf SERIAL ; repasser en entrée (et niveau haut)
BANK0 ; passer banque0
call temp_1b ; attendre temps entre 2 bits
call temp_1b ; attendre temps entre 2 bits
return ; et retour

;*********************************************************************
; Réception d'un octet provenant du maitre *
;*********************************************************************
;---------------------------------------------------------------------
; Caractère lu dans W. La parité pas n'est pas vérifiée
;---------------------------------------------------------------------
Receive
; attendre début start-bit
; ------------------------

btfsc SERIAL ; Tester si start bit arrivé
goto Receive ; non, attendre

; se positionner sur le milieu du 1er bit utile
; ---------------------------------------------

call temp_1bd ; attendre 1bit et demi

; réception du caractère
; ----------------------

movlw 0x8 ; pour 8 bits
movwf cmptbts ; dans compteur de bits

Recloop
bcf STATUS , C ; Carry = 0
btfsc SERIAL ; tester si bit = 0
bsf STATUS , C ; Carry = bit reçu
rrf caract , f ; faire entrer le bit par la gauche
call temp_1b ; attendre milieu caractère suivant
decfsz cmptbts , f ; décrémenter compteur de bits
goto Recloop ; pas dernier, suivant


; on pointe maintenant sur moitié du bit de parité
; reste donc à attendre au moins 1.5 bits
; ------------------------------------------------

call temp_1bd ; Attendre 1,5 bit
movf caract , w ; charger caractère lu
return ; et retour


END ; directive fin de programme
Répondre à misse  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le vendredi 3 novembre 2006 à 00:05:39
...Tu ne te rends pas compte du boulot que ça demande j'ai l'impression...
..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...
Répondre à kilian

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
ap369, le lundi 14 avril 2008 à 11:49:15
il me faux une semaine pour tout ca !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Répondre à ap369

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 emixam, le mardi 15 avril 2008 à 15:43:00
pfff et moi qui est un programme de 65 pages a convertir...... -_-" combien de temps je vais mettre o_O

1 semaine? t'en fait 2h par soir? parce qu'il a pas bien l'air compliquer non plus, bigonoff il fait des codes assez simples qui constitus des supports pour les cours d'assembleurs qu'il met a disposition sur le web. enfin apres je debut en assembleur donc bon....
Répondre à emixam

Résultats pour Convertir asm en c

Les réseaux sociaux précurseurs Friendster hi5 hi5, du spam ? Plaxo Bebo Orkut Copains d’Avant aSmallWord Contrairement aux jeux vidéo, les MySpace et autres Facebook ne sont pas des univers virtuels, mais des réseaux sociaux en ligne où notre implication est... www.commentcamarche.net/faq/sujet-14398-les-reseaux-sociaux-precurseurs
Interfacer du code assembleur et du C Interfacer du code assembleur et du C Introduction Appeler du code assembleur écrit dans un fichier source externe Avec Nasm (x86 uniquement) Compilation/Execution sous Linux Avec Gcc (multiplateforme) Introduction Si, à tout hasard,... www.commentcamarche.net/faq/sujet-8257-interfacer-du-code-assembleur-et-du-c
Cours assembleur 8086 (Résolu) Bonjour, je voudrais avoir un lien où je pouurais trouver un cours d'assembleur 8086 pour debutants on a comencer le cours en classe et je n'y comprend rien du tout! www.commentcamarche.net/forum/affich-4180565-cours-assembleur-8086

Résultats pour Convertir asm en c

Liens utiles assembleur x86Voici quelques liens utiles pour l'assembleur x86. Le but étant de compiler des documents pertinents autant pour ceux qui débutent que pour ceux qui sont à l'aise dans ce domaine. Tutoriels Références complètes Assembleur sous... www.commentcamarche.net/faq/sujet-9899-liens-utiles-assembleur-x86
[PDF] Convertir des PDF en images (JPEG, BMP, GIF, etc...)Si vous avez des documents PDF et que vous voulez les convertir en images (JPEG, GIF, BMP, ou n'importe quel format), de manière à les exploiter, par exemple dans un logiciel d'OCR ou de retouche/création d'images : Note : Cet article présente une... www.commentcamarche.net/faq/sujet-1036-pdf-convertir-des-pdf-en-images-jpeg-bmp-gif-etc
[Audio] Conversion d'un fichier au format WMA en MP3Pour convertir un fichier audio au format WMA en MP3, il suffit d'utiliser un logiciel de conversion tel que l'un des suivants : Free Mp3 Wma Converter dBpower-AMP Music Converter (DMC) MediaCoder GX::Transcoder Par ailleurs, il est à... www.commentcamarche.net/faq/sujet-2450-audio-conversion-d-un-fichier-au-format-wma-en-mp3

Résultats pour Convertir asm en c

[HTML] caractères spéciaux (Résolu)Bonjour à tous. Je suis en train d'écrire des page html perso mais je rencontre un problème avec les caractère spéciaux au accentués. Le problème est que mon hébergeur ne me propose pas de serveur php ni asp bref rien! je voudrais savoir si il y... www.commentcamarche.net/forum/affich-3150275-html-caracteres-speciaux
XP fichier manquant (Résolu)Bonjour à tous, Au demarrage XPfamilal, celui ci annonce que le fichier system32\DRIVER PCI.sys manquant ou détérioré. Il propose inserer le CD et taper R pour reparer le systeme. Et je bloque quand il me demande le code administrateur, parce que je... www.commentcamarche.net/forum/affich-2196198-xp-fichier-manquant

Résultats pour Convertir asm en c

Télécharger Free Mp3 Wma ConverterFree Mp3 Wma Converter permet de convertir tout vos fichiers Mp3, Wma, Ogg, AAC, m4a, mp4, Ape, flac, Wav : Vous pourrez convertir les fichiers audio d'Itunes (format m4a) gratuitement en mp3, wma, ogg... ! www.commentcamarche.net/telecharger/telecharger-34055077-free-mp3-wma-converter
Télécharger AMV Convert ToolLe package MP3 Player Utilities contient notamment un lecteur permettant de lire les fichiers au format AMV ainsi qu'un convertisseur vidéo vers le format AMV acceptant les formats d'entrée suivants : AVI, MPEG, DAT, WMV, WMA, ASF, RM, RAM, RMVB,... www.commentcamarche.net/telecharger/telecharger-270-amv-convert-tool
Télécharger Mobile 3GP ConverterLe programme "Mobile 3GP Converter" permet de convertir des fichiers au format 3GP (extension *.3gp ou *.3g2) vers un format AVI non compressé. www.commentcamarche.net/telecharger/telecharger-273-mobile-3gp-converter

Résultats pour Convertir asm en c

Les procédures en assembleurLa notion de procédure En langage assembleur, on appelle procédure un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la procédure. Cette notion de sous-programme est généralement appelée fonction dans d'autres... www.commentcamarche.net/contents/asm/procedure.php3