Un kit autour du EF6809P
Modérateurs : Papy.G, fneck, Carl
Re: Un kit autour du EF6809P
J'ai oublié de parler d'une imprimante que j'ai confectionné de quelques pièces récupérées d'une imprimante réformée et qui sera la base de la conception d'une imprimante 3D ou d'une perceuse ou fraiseuse automatique.
Je posterai aussi queqlques vidéos...
Je posterai aussi queqlques vidéos...
Re: Un kit autour du EF6809P
Bonjour,
Voici le code de la première version de mon moniteur, que j'ai assemblé à partir des routines que j'avais créé et essayé une par une:
Le moniteur n'est pas très élégant en terme de lisibilité et d'optimisation mais son grand avantage c'est qu'il est fonctionnel à 100% et ne contient pas d'erreurs si on lui donne ce qu'il attends comme entrées.
Ce moniteur contient aussi une application de lecture et affichage en logs de quelques capteur analogique.
Voici le code de la première version de mon moniteur, que j'ai assemblé à partir des routines que j'avais créé et essayé une par une:
Code : Tout sélectionner
;************************************************************************************
;Global Equates
;************************************************************************************
S_RXD EQU $FC60
S_TXD EQU $FC20
GWAIT EQU $F800 ;Routine temporisation
DIS_MEM EQU $F406
RAM EQU $0000
EEPROM EQU $8000
EPROM EQU $F000
ACIA EQU $1000
PIA EQU $1400
;____________________________________________________________________________________
;************************************************************************************
;Variables and constants
;************************************************************************************
;Variables
TEMPCHAR EQU $01A0
TEMP2CHR EQU $01A1
TEMPADDR EQU $01A3
TEMPHEX1 EQU $01A5
TEMPHEX2 EQU $01A6
TEMPHEX3 EQU $01A7
TEMPHEX4 EQU $01A8
PRMPTCHR EQU $01A9
SAVSSTCK EQU $01AA
SAVUSTCK EQU $01AC
SAVXINDX EQU $01AE
;buffer
BUFFERST EQU $01B0
SPACECHR EQU $20
ORG $0200
;____________________________________________________________________________________
;************************************************************************************
;Initialisation variables et ACIA
;************************************************************************************
MONSILIC PSHS A ;sauvegarder regsitre utilisé A
LDA #$3E ;code hexadécimal du caractère ">"
STA PRMPTCHR ;initialiser varaiable dédiée par caractère Prompt ">"
BSR INITACIA ;initialisation ACIA
LBSR INPTCMND
PULS A ;sauvegarder regsitre utilisé A
DOLLARSG FCC "$", $00 ;chaine code signe Dollar avec zéro terminal
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Command Table
;************************************************************************************
CMNDTBSZ EQU $0F
CMNDTABL FCC "B"
FDB LOADPROG
FCC "E"
FDB EXECPROG
FCC "S"
FDB $0200 ;#SNGLSTEP
FCC "P"
FDB $0200 ;#BREAKPNT
FCC "V"
FDB VIEWMEMR
FCC "M"
FDB MDFYMEMR
FCC "C"
FDB COPYMEMR
FCB $00 ;fin table
;************************************************************************************
;Routine INITACIA Initialize ACIA for communication via serial port
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée: Aucune
;************************************************************************************
INITACIA PSHS A ;sauvegarder regsitre utilisé A
LDA #$03 ;master reset
STA $1000 ;envoi au Controle Register
LDA #$55 ;code binaire de configuration: 01010101
STA $1000 ;envoi au Controle Register
PULS A ;restaurer registre utilisé A
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine WAIT10MS Wait 10 milliseconds
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée: Aucune
;************************************************************************************
WAIT10MS PSHS X ;sauvegarder registre utilisé
LDX #$0000 ;initialisation compteur
LOOP LEAX 1,x ;incrémentation compteur
CMPX #$02C8 ;comparer compteur au nombre correspondant à 10ms
BNE LOOP ;si pas encore atteint reboucler
PULS X ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine INPTCHAR Input Character
;Entrée: Aucune
;Sorties: TEMPCHAR=Code Ascii du Caractère saisi
;Routines appelée: INITACIA, S_RXD
;************************************************************************************
INPTCHAR PSHS A ;sauvegarder registre utilisé
JSR S_RXD ;lecture caractère
STA TEMPCHAR ;le mettre dans varaible dédiée
PULS A ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine INPTHEX1 Input HEXADECIMAL CHARACTER
;Entrée: Aucune
;Sorties: TEMPHEX1=Code Hexadécimal du Caractère saisi
;Routines appelée: INITACIA, S_RXD, OUTSTRNG
;************************************************************************************
INPTHEX1 PSHS A ;sauvegarder les registres utilisés
TST10 JSR S_RXD ;lecture Caractère
JSR S_TXD ;affichage caractère reçu
;BSR INPTCHAR
;LBSR OUT1CHAR
CMPA #$30 ;comparer caractère saisi avec "0"
BLO AFERMES1 ;si inférieur à "O" aller traiter l'erreur
TSTHEX19 CMPA #$39 ;sinon comparer avec "9"
BGT TSTHEX1A
BRA ISHEXA1
TSTHEX1A CMPA #$41 ;"A"
BLO AFERMES1
TSTHEX1F CMPA #$46 ;"F"
BGT AFERMES1
ISHEXA1 STA TEMPHEX1
PULS A
RTS
ERRMES1 FCC "Pas hexadecimal!", $00 ;message d'erreur à afficher
AFERMES1 LDX #ERRMES1
LBSR OUTSTRNG
PULS A ;restaurer les registres utilisés
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine INPTHEX2 Input HEXADECIMAL CHARACTER
;Entrée: Aucune
;Sorties: TEMPHEX2=Code Hexadécimal du Caractère saisi
;Routines appelée: INITACIA, S_RXD, OUTSTRNG
;************************************************************************************
INPTHEX2 PSHS A ;sauvegarder les registres utilisés
TSTHEX20 JSR S_RXD ;lecture Caractère
JSR S_TXD ;affichage caractère reçu
CMPA #$30 ;comparer caractère saisi avec "0"
BLO AFERMES2 ;si inférieur à "O" aller traiter l'erreur
TSTHEX29 CMPA #$39 ;sinon comparer avec "9"
BGT TSTHEX2A
BRA ISHEXA2
TSTHEX2A CMPA #$41 ;"A"
BLO AFERMES2
TSTHEX2F CMPA #$46 ;"F"
BGT AFERMES2
ISHEXA2 STA TEMPHEX2
PULS A
RTS
ERRMES2 FCC "Pas hexadecimal!", $00 ;message d'erreur à afficher
AFERMES2 LDX #ERRMES2
LBSR OUTSTRNG
PULS A ;restaurer les registres utilisés
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine INPTHEX3 Input HEXADECIMAL CHARACTER
;Entrée: Aucune
;Sorties: TEMPHEX3=Code Hexadécimal du Caractère saisi
;Routines appelée: INITACIA, S_RXD, OUTSTRNG
;************************************************************************************
INPTHEX3 PSHS A ;sauvegarder les registres utilisés
TSTHEX30 JSR S_RXD ;lecture Caractère
JSR S_TXD ;affichage caractère reçu
CMPA #$30 ;comparer caractère saisi avec "0"
BLO AFERMES3 ;si inférieur à "O" aller traiter l'erreur
TSTHEX39 CMPA #$39 ;sinon comparer avec "9"
BGT TSTHEX3A
BRA ISHEXA3
TSTHEX3A CMPA #$41 ;"A"
BLO AFERMES3
TSTHEX3F CMPA #$46 ;"F"
BGT AFERMES3
ISHEXA3 STA TEMPHEX3
PULS A
RTS
ERRMES3 FCC "Pas hexadecimal!", $00 ;message d'erreur à afficher
AFERMES3 LDX #ERRMES3
LBSR OUTSTRNG
PULS A ;restaurer les registres utilisés
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine INPTHEX4 Input HEXADECIMAL CHARACTER
;Entrée: Aucune
;Sorties: TEMPHEX4=Code Hexadécimal du Caractère saisi
;Routines appelée: INITACIA, S_RXD, OUTSTRNG
;************************************************************************************
INPTHEX4 PSHS A ;sauvegarder les registres utilisés
TSTHEX40 JSR S_RXD ;lecture Caractère
JSR S_TXD ;affichage caractère reçu
CMPA #$30 ;comparer caractère saisi avec "0"
BLO AFERMES4 ;si < "O" aller traiter l'erreur
TSTHEX49 CMPA #$39 ;sinon comparer avec "9"
BGT TSTHEX4A ;si > "9" donc pas Hexa, aller tester si < "A"
BRA ISHEXA4 ;sinon (<= "9") c'est un caractère Hexadécimal
TSTHEX4A CMPA #$41 ;comparer caractère avec "A"
BLO AFERMES4 ;si < "A" (et déjà > "9") donc pas Hexa, traiter erreur
TSTHEX4F CMPA #$46 ;sinon (>= "A") le comparer avec "F"
BGT AFERMES4 ;si > "F" donc pas Hexa, aller traiter erruer
ISHEXA4 STA TEMPHEX4 ;sinon (<= "F") donc Hexa, le mettre dans variable dédiée
PULS A ;restaurer les registres utilisés
RTS ;revenir au programme appelant
ERRMES4 FCC "Pas hexadecimal!", $00 ;message d'erreur à afficher
AFERMES4 LDX #ERRMES4 ;mettre adresse message d'erreur dans X
LBSR OUTSTRNG ;pour l'afficher sur teminal série
PULS A ;restaurer les registres utilisés
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine OUT1CHAR Out Character
;Entrée: A=TEMPCHAR=Code Ascii du Caractère à afficher
;Sorties: Aucune
;Routines appelée: INITACIA, S_TXD
;************************************************************************************
OUT1CHAR PSHS A ;sauvegarder registre utilisé
LDA TEMPCHAR
JSR S_TXD
PULS A ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine OUT2CHAR Out Character
;Entrée: TEMP2CHR=Code Ascii du Caractère à afficher
;Sorties: Aucune
;Routines appelée: INITACIA, S_TXD
;************************************************************************************
OUT2CHAR PSHS A ;sauvegarder registre utilisé
LDA TEMP2CHR
JSR S_TXD
LBSR WAIT10MS
LDA TEMP2CHR+1
JSR S_TXD
PULS A ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine OUTHEXAW Out Hexadecimal number in 2 characters
;Entrée: TEMPCHAR=Code Ascii du Caractère à afficher en hexadécimal
;Sorties: TEMP2CHR=Nibble supérieur, TEMP2CHR+1=Nibble inférieur
;Routines appelée: Aucune
;************************************************************************************
OUTHEXAW PSHS A,B
LDA TEMPCHAR
TFR A,B
ANDA #$0F
ORA #$30
ASRB
ASRB
ASRB
ASRB
ANDB #$0F
ORB #$30
CMPB #$39
BGT CORRIGEB
AFFICHEB PSHS A
LDA #$01
JSR GWAIT
PULS A
STB TEMP2CHR
BRA TRAITEA
CORRIGEB ADDB #$07
BRA AFFICHEB
TRAITEA CMPA #$39
BGT CORRIGEA
AFFICHEA PSHS A
LDA #$01
JSR GWAIT
PULS A
STA TEMP2CHR+1
LBSR OUT2CHAR
PULS A,B
RTS
CORRIGEA ADDA #$07
BRA AFFICHEA
;____________________________________________________________________________________
;************************************************************************************
;Routine OUTHEXAD Out Hexadecimal number in 4 characters
;Entrée: TEMP2CHR=Code Ascii du 1er Caractère à afficher en hexadéc.
; TEMP2CHR+1=Code Ascii du 2eme Caractère à afficher en hexa
;Sorties: TEMPHEX1=Nibble inférieur du 1ere nombre hexadécimal
; TEMPHEX2=Nibble supérieur du 1ere nombre hexadécimal
; TEMPHEX3=Nibble inférieur du 2eme nombre hexadécimal
; TEMPHEX4=Nibble supérieur du 2eme nombre hexadécimal
;Routines appelée: Aucune
;************************************************************************************
OUTHEXAD PSHS A,B
LDA TEMP2CHR
TFR A,B
ANDA #$0F
ORA #$30
ASRB
ASRB
ASRB
ASRB
ANDB #$0F
ORB #$30
CMPB #$39
BGT CORRIGEB1
AFFICHEB1 PSHS A
LDA #$01
JSR GWAIT
PULS A
;STB TEMPHEX1
STB TEMPCHAR
LBSR OUT1CHAR ;affichage 2eme nibble du 1er caractère hexa
BRA TRAITEA1
CORRIGEB1 ADDB #$07
BRA AFFICHEB1
TRAITEA1 CMPA #$39
BGT CORRIGEA1
AFFICHEA1 PSHS A
LDA #$01
JSR GWAIT
PULS A
;STA TEMPHEX2
STA TEMPCHAR
LBSR OUT1CHAR ;affichage 2eme nibble du 1er caractère hexa
BRA DEUXNBRE
CORRIGEA1 ADDA #$07
BRA AFFICHEA1
;deuxième nombre hexadécimal
DEUXNBRE LDA TEMP2CHR+1
TFR A,B
ANDA #$0F
ORA #$30
ASRB
ASRB
ASRB
ASRB
ANDB #$0F
ORB #$30
CMPB #$39
BGT CORRIGEB2
AFFICHEB2 PSHS A
LDA #$01
JSR GWAIT
PULS A
;STB TEMPHEX3
STB TEMPCHAR
LBSR OUT1CHAR ;affichage premier nibble du 2eme caractère hexa
BRA TRAITEA2
CORRIGEB2 ADDB #$07
BRA AFFICHEB2
TRAITEA2 CMPA #$39
BGT CORRIGEA2
AFFICHEA2 PSHS A
LDA #$01
JSR GWAIT
PULS A
;STA TEMPHEX4
STA TEMPCHAR
LBSR OUT1CHAR ;affichage 2eme nibble du 2eme caractère hexa
PULS A,B
RTS
CORRIGEA2 ADDA #$07
BRA AFFICHEA2
;____________________________________________________________________________________
;************************************************************************************
;Routine OUTPRMPT Out Character
;Entrée: Aucune
;Sorties: TEMPCHAR=">"
;Routines appelée: OUT1CHAR
;************************************************************************************
OUTPRMPT PSHS A ;sauvegarder registre utilisé
LDA PRMPTCHR
STA TEMPCHAR
LBSR OUT1CHAR
PULS A ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine OUTSTRNG: Out String to serial port
;Entrée: X=Chaine de caractèrer à afficher, terminée par "0"
;Sorties: Aucune
;Routines appelée: INITACIA, S_TXD, DIS_MEM, WAIT10MS
;*******************************************************************
OUTSTRNG PSHS A ;sauvegarder registre utilisé
LDA ,X ;Charger A avec premier charactère de la chaine
OUTSTRN1 JSR S_TXD ;le transférer au terminal série
LBSR WAIT10MS ; attendre 10ms
LEAX 1,X ;incrémenter index chaine caractères
LDA ,X ;charger A avec caractère suivant
CMPA #$00 ;le comparer avec "0" terminal (caractère de fin de la chaine)
BNE OUTSTRN1 ;si fin chaine non encore atteinte, continuer en transférant au terminal
PULS A ;si fin de chaine restaurer registre A
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine OUTSPACE Out Space Character
;Entrée: Aucune
;Sorties: TEMPCHAR=" "
;Routines appelée: OUTCHAR
;************************************************************************************
OUTSPACE PSHS A ;sauvegarder registre utilisé
LDA #SPACECHR
STA TEMPCHAR
LBSR OUT1CHAR
PULS A ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine VIEWMEMR: Affiche une zone mémoire début pointée par X et fin pointée par Y
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée: GWAIT, DIS_MEM
;************************************************************************************
STRTADDR FCC "Entrez Adresse Debut: ", $00
ENDADDR FCC "Entrez Adresse Fin: ", $00
SIGNEHEX FCC "$", $00
VIEWMEMR PSHS A,X
LDX #STRTADDR
BSR OUTSTRNG
LDX #SIGNEHEX
BSR OUTSTRNG
LBSR INPTHEX1
LBSR INPTHEX2
LBSR INPTHEX3
LBSR INPTHEX4
LBSR BULDADDR
LDX TEMPADDR
PSHS X
LBSR OUTCRLF
LDX #ENDADDR
BSR OUTSTRNG
LDX #SIGNEHEX
BSR OUTSTRNG
LBSR INPTHEX1
LBSR INPTHEX2
LBSR INPTHEX3
LBSR INPTHEX4
LBSR BULDADDR
LBSR OUTCRLF
PULS X
CMPX TEMPADDR ;comparer adresse début avec adresse fin
BLE VIEWMEM1 ;si inférieure aller à VIEMEM1
STX TEMPADDR ;sinon (début > fin) mettre adresse début dans adresse fin
VIEWMEM1 STX TEMP2CHR ;mettre adresse début dans variable
;LDX #SIGNEHEX
;lBSR OUTSTRNG
LBSR OUTHEXAD ;afficher adresse en Hexadécimal
LBSR OUTSPACE
LDA ,X+
STA TEMPCHAR
;LDX #SIGNEHEX
;lBSR OUTSTRNG
LBSR OUTHEXAW ;afficher donnée en Hexadécimal
LBSR OUTCRLF
CMPX TEMPADDR
BLS VIEWMEM1
PULS A,X
RTS
;____________________________________________________________________________________
;************************************************************************************
;Routine MDFYMEMR: Modifie une case mémoire en saisissant son nouveau contenu
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée: GWAIT, DIS_MEM
;************************************************************************************
STRTADDM FCC "Entrez Adresse Debut: ", $00
ENDADDRM FCC "Entrez Adresse Fin: ", $00
MDFYMEMR PSHS A,X
LDX #STRTADDM
LBSR OUTSTRNG
LDX #SIGNEHEX
LBSR OUTSTRNG
LBSR INPTHEX1
LBSR INPTHEX2
LBSR INPTHEX3
LBSR INPTHEX4
LBSR BULDADDR
LDX TEMPADDR
PSHS X
LBSR OUTCRLF
LDX #ENDADDRM
LBSR OUTSTRNG
LDX #SIGNEHEX
LBSR OUTSTRNG
LBSR INPTHEX1
LBSR INPTHEX2
LBSR INPTHEX3
LBSR INPTHEX4
LBSR BULDADDR
LBSR OUTCRLF
PULS X
CMPX TEMPADDR ;comparer adresse début avec adresse fin
BLE MDFYMEM1 ;si inférieure aller à VIEMEM1
STX TEMPADDR ;sinon (début > fin) mettre adresse début dans adresse fin
MDFYMEM1 STX TEMP2CHR ;mettre adresse début dans variable
;LDX #SIGNEHEX
;lBSR OUTSTRNG
LBSR OUTHEXAD ;afficher adresse en Hexadécimal
LBSR OUTSPACE
LBSR INPTHEX1 ;entrer 1er caractère Hexa de la donnée
LBSR INPTHEX2 ;entrer 2eme caractère Hexa de la donnée
LBSR BULDDATA ;construire la donnée à partir des caractères hexa entrés
LDA TEMPCHAR ;sauvegarder donnée construire dans variable dédiée
LBSR OUTCRLF
STA ,X+ ;la transférer dans l'adresse désignée
CMPX TEMPADDR
BLS MDFYMEM1
PULS A,X
RTS
;____________________________________________________________________________________
;************************************************************************************
;Routine COPYMEMR: Copie une zone mémoire X de A groupes de B octets dans une autre zone Y
;Entrée: A=Nombre de groupes, B=Nombre d'octets par groupe, X=Adresse source, Y=Adresse cible
;Sorties: Aucune
;Routines appelée: GWAIT, DIS_MEM
;************************************************************************************
SRCEADDR FCC "Entrez Adresse Source: ", $00
TRGTADDR FCC "Entrez Adresse Cible: ", $00
NBRBYTES FCC "Entrez nombre octets / groupe: ", $00
NBREGRPS FCC "Entrez nombre Groupes octets: ", $00
COPYMEMR NOP
;demande adresse source
LDX #SRCEADDR
LBSR OUTSTRNG
LDX #DOLLARSG
LBSR OUTSTRNG
LBSR INPTHEX1
LBSR INPTHEX2
LBSR INPTHEX3
LBSR INPTHEX4
LBSR BULDADDR
LDX TEMPADDR
PSHS X ;sauvegarder X (adresse source)
BSR OUTCRLF
;demande adresse cible
LDX #TRGTADDR
LBSR OUTSTRNG
LDX #DOLLARSG
LBSR OUTSTRNG
LBSR INPTHEX1
LBSR INPTHEX2
LBSR INPTHEX3
LBSR INPTHEX4
LBSR BULDADDR
LDY TEMPADDR
BSR OUTCRLF ;retour à la ligne suivante
;demande nombre d'octets par groupes
LDX #NBRBYTES ;message entrée donnée
LBSR OUTSTRNG ;afficher message d'entrée d'adresse
LDX #DOLLARSG
LBSR OUTSTRNG
LBSR INPTHEX1 ;entrer 1er caractère Hexa de la donnée
LBSR INPTHEX2 ;entrer 2eme caractère Hexa de la donnée
LBSR BULDDATA ;construire la donnée à partir des caractères hexa entrés
LDB TEMPCHAR ;sauvegarder donnée construire dans variable dédiée
LBSR OUTCRLF ;retour à la ligne suivante
;demande nombre groupes d'octets
LDX #NBREGRPS ;message entrée donnée
LBSR OUTSTRNG ;afficher message d'entrée d'adresse
LDX #DOLLARSG
LBSR OUTSTRNG
LBSR INPTHEX1 ;entrer 1er caractère Hexa de la donnée
LBSR INPTHEX2 ;entrer 2eme caractère Hexa de la donnée
LBSR BULDDATA ;construire la donnée à partir des caractères hexa entrés
LDA TEMPCHAR ;sauvegarder donnée construire dans variable dédiée
PULS X ;restaurer X (adresse source) pour début de copie
LBSR OUTCRLF ;retour à la ligne suivante
;copie des données
DLOOPEX PSHS B ;Sauve B (Compteur d'octets)
PSHS A ;Sauve A (Compteur de groupes)
DLOOPIN LDA ,X ;Charge donnée de mémoire source dans A
STA ,Y ;Mémorise donnée lue en mémoire cible
LEAX 1,X ;Incrémente X (compteur adresse source)
LEAY 1,Y ;incrémente Y (compteur adresse cible)
DECB ;Décremente B (compteur octets de 64)
FLOOPIN BNE DLOOPIN ;Si <> 0, Réentrer en boucle de 64 octets
LDA #$08 ;8ms
JSR GWAIT ;Temporisation
JSR DIS_MEM ;Saut vers routine DIS_MEM (Affiche adresse et donnée envoyée)
PULS A ;Restaure A (Compteur de groupes)
DECA ;Décremente A (Compteur d'octets)
PULS B ;Restaure B pour le remettre au nombre d'octets initial
FLOOPEX BNE DLOOPEX ;Si <> 0, Réentrer en boucle de 32 groupes
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine OUTCRLF: Out Chariot Return & Line Feed
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée: INITACIA, S_TXD
;************************************************************************************
OUTCRLF PSHS A ;sauvegarder registre utilisé
LDA #$0D
JSR S_TXD
LBSR WAIT10MS
LDA #$0A
JSR S_TXD
PULS A ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine INPTCMND Input Command
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée: INPTCHAR, OUT1CHAR, EXECCMND
;************************************************************************************
INPTCMND PSHS A,X ;sauvegarder les registres utilisés
;LDX #PRMPTCHR ;charger caractère ">" (Prompt dans X
;LBSR OUTSTRNG ;et l'afficher comme Prompt pour l'attente de commande
LBSR OUTPRMPT ;afficher Prompt pour l'attente de commande
LDX #BUFFERST ;index X pointe sur zone mémoire BUFFERST
INPTCMD1 JSR S_RXD ;lecture Caractère
JSR S_TXD ;ecriture caractère reçu
;LBSR INPTCHAR
;LBSR OUT1CHAR
;LDA TEMPCHAR
CMPA #$0D ;caractère reçu = "Chariot Return"?
BEQ INPTCMD2 ;si oui aller à INPTCMND2: saisir et tester caractère suivant
STA ,X+ ;sinon (caractère normal) le charger dans BUFFERST
BRA INPTCMD1 ;aller lire caractère suivant
INPTCMD2 STA TEMPCHAR ;sauvegarder premier caractère (CR) pour utilisation ultérieure
JSR S_RXD ;lecture Caractère
JSR S_TXD ;ecriture caractère reçu
STA TEMP2CHR ;sauvegarder premier caractère (CR) pour utilisation ultérieure
;LBSR INPTCHAR
;LBSR OUT1CHAR
;LDA TEMPCHAR
CMPA #$0A ;caractère reçu = "Line Feed"?
BEQ INPTCMD3 ;si oui aller à INPTCMND3: charger caractère $00 dans BUFFERST
LDA TEMPCHAR ;sinon (caractère normal), charger caractère "CR"
STA ,X+ ;dans BUFFERST puisque caractère suivant est <> de "LF"
LDA TEMP2CHR ;charger caractère (normal) suivant le caractère "CR"
STA ,X+ ;dans BUFFERST puisque caractère suivant "CR" est <> de "LF"
BRA INPTCMD1 ;aller lire caractère suivant
INPTCMD3 LDA #$00 ;charger caractère $00 (caractère 0 terminal)
STA ,X ;dans BUFFERST
BSR EXECCMND ;executer commande saisie
BSR OUTCRLF ;retourner à la ligne suivante et
PULS A,X ;restaurer les registres utilisés
BRA INPTCMND
RTS ;Fin de sous routine et retour au programme appelant
;____________________________________________________________________________________
;************************************************************************************
;Routine EXECCMND Execute command
;Entrée: BUFFERST=Commande reçue par RS232
;Sorties:
;Routines appelée: OUTSTRNG
;************************************************************************************
ERCMDMES FCC "Commande non trouvee!", $00 ;si fin de table commandes atteint
CMDAEXEC FCC "Commande a executer: ", $00
EXECCMND PSHS A,B,X ;sauvegarder les registres utilisés
LDX #CMNDTABL ;charger X avec première entrée de la table commandes
CMPENTRY LDA ,X ;A<-entrée de table commandes
CMPA BUFFERST ;comparer commande saisie avec entrée de table commandes
BEQ EXECUTCMD ;si égale l'exécuter
LEAX 3,X ;sinon passer à l'entrée suivante de la table commandes
LDB #CMNDTBSZ ;offset adressage indéxé
CMPX B,X ;test fin de table commandes atteint
BNE CMPENTRY ;si non fin de table, aller comparer commande saisie avec entrée suivante
LDX #ERCMDMES
LBSR OUTSTRNG ;afficher message d'erreur "Commande non trouvée!"
BRA EXECCMND
PULS A,B,X ;restaurer les registres utilisés
RTS ;Fin de sous routine et retour au programme moniteur
EXECUTCMD LBSR OUTCRLF
LDX 1,X ;charger X avec adresse contenue dans X+1
JSR 0,X ;sauter à sous routine dont l'adresse est contenue dans X
PULS A,B,X ;restaurer les registres utilisés
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine BULDADDR Build Address
;Entrée: TEMPHEX1, TEMPHEX2, TEMPHEX3, TEMPHEX4 = 4 Hexa characters
;Sorties: TEMPADDR, TEMPADDR+1 = Address
;Routines appelée: Aucune
;************************************************************************************
BULDADDR PSHS A ;sauvegarder registre utilisé
;first hexa
LDA TEMPHEX1
CMPA #$41
BLO NUMERIC1
ALPHANM1 SUBA #$37
BRA BULDHEX1
NUMERIC1 SUBA #$30
BULDHEX1 ASLA
ASLA
ASLA
ASLA
STA TEMPADDR
;second hexa
LDA TEMPHEX2
CMPA #$41
BLO NUMERIC2
ALPHANM2 SUBA #$37
BRA BULDHEX2
NUMERIC2 SUBA #$30
BULDHEX2 ORA TEMPADDR
STA TEMPADDR
;third hexa
LDA TEMPHEX3
CMPA #$41
BLO NUMERIC3
ALPHANM3 SUBA #$37
BRA BULDHEX3
NUMERIC3 SUBA #$30
BULDHEX3 ASLA
ASLA
ASLA
ASLA
STA TEMPADDR+1
;fourth hexa
LDA TEMPHEX4
CMPA #$41
BLO NUMERIC4
ALPHANM4 SUBA #$37
BRA BULDHEX4
NUMERIC4 SUBA #$30
BULDHEX4 ORA TEMPADDR+1
STA TEMPADDR+1
PULS A ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine BULDDATA Build Data
;Entrée: TEMPHEX1, TEMPHEX2 = 2 Hexa characters
;Sorties: TEMPCHAR = Data
;Routines appelée: Aucune
;************************************************************************************
BULDDATA PSHS A ;sauvegarder registre utilisé
;first hexa
LDA TEMPHEX1
CMPA #$41
BLO NUMERIC5
ALPHANM5 SUBA #$37
BRA BULDHEX5
NUMERIC5 SUBA #$30
BULDHEX5 ASLA
ASLA
ASLA
ASLA
STA TEMPCHAR
;second hexa
LDA TEMPHEX2
CMPA #$41
BLO NUMERIC6
ALPHANM6 SUBA #$37
BRA BULDHEX6
NUMERIC6 SUBA #$30
BULDHEX6 ORA TEMPCHAR
STA TEMPCHAR
PULS A ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine LOADPROG: Load program into given adress (and execute it)
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée: OUTSTRNG, INPTHEX1, INPTHEX2, INPTHEX3, INPTHEX4
; BULDADDR, BULDDATA, EXECPROG
;************************************************************************************
MESSAGE1 FCC "Entrez adresse debut: ", $00
MESSAGE2 FCC "Entrez adresse fin: ", $00
MESSAGE3 FCC "Entrez donnee: ", $00
LOADPROG PSHS A,B,X ;sauvegarder les registres utilisés
LDX #MESSAGE1 ;message entrée adresse début
LBSR OUTSTRNG ;afficher message d'entrée d'adresse
LBSR INPTHEX1 ;entrer 1er caractère Hexa de l'adresse
LBSR INPTHEX2 ;entrer 2eme caractère Hexa de l'adresse
LBSR INPTHEX3 ;entrer 3eme caractère Hexa de l'adresse
LBSR INPTHEX4 ;entrer 4eme caractère Hexa de l'adresse
LBSR BULDADDR ;construire l'adresse à partir des caractères hexa entrés
LDX TEMPADDR ;sauvegarder adresse construire dans variable dédiée
STX SAVXINDX ;sauvegarder X (adresse début) dans variable dédiée
;LBSR OUTCRLF ;retour à la ligne suivante
;LDX #MESSAGE2 ;message entrée adresse fin
;LBSR OUTSTRNG ;afficher message d'entrée d'adresse
;LBSR OUTCRLF ;retour à la ligne suivante
;LBSR INPTHEX1 ;entrer 1er caractère Hexa de l'adresse
;LBSR INPTHEX2 ;entrer 2eme caractère Hexa de l'adresse
;LBSR INPTHEX3 ;entrer 3eme caractère Hexa de l'adresse
;LBSR INPTHEX4 ;entrer 4eme caractère Hexa de l'adresse
;LBSR BULDADDR ;construire l'adresse à partir des caractères hexa entrés
LBSR OUTCRLF ;retour à la ligne suivante
LDX #MESSAGE3 ;message entrée donnée
LBSR OUTSTRNG ;afficher message d'entrée d'adresse
LDX SAVXINDX ;restaurer X (adresse début) depuis variable dédiée
LDB #$00
INPUTHEX LBSR OUTCRLF
STX TEMP2CHR
LBSR OUTHEXAD
LBSR OUTSPACE
LBSR INPTHEX1 ;entrer 1er caractère Hexa de la donnée
LBSR INPTHEX2 ;entrer 2eme caractère Hexa de la donnée
LBSR BULDDATA ;construire la donnée à partir des caractères hexa entrés
LDA TEMPCHAR ;sauvegarder donnée construire dans variable dédiée
STA ,X+ ;la transférer dans l'adresse désignée
CMPA #$0D ;compare with CR
BNE TESTLF ;si non égal
LDB #$01
BRA INPUTHEX ;aller saisir une autre donnée
TESTLF CMPA #$0A ;compare with LF
BEQ TSTCARRY
LDB #$00
BRA INPUTHEX
TSTCARRY CMPB #$01
BEQ EXECUTPRG
BRA INPUTHEX
EXECUTPRG ;LDX SAVXINDX
;PSHS X
;PULS PC
PULS A,B,X ;restaurer les registres utilisés
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine EXECPROG Execute program in specified adress
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée: OUTSTRNG, INPTHEXA, BULDADDR
;************************************************************************************
ADDRMESS FCC "Entrez adresse Programme: ", $00
EXECPROG PSHS X ;sauvegarder registre utilisé
LDX #ADDRMESS
LBSR OUTSTRNG
LBSR INPTHEX1
LBSR INPTHEX2
LBSR INPTHEX3
LBSR INPTHEX4
LBSR BULDADDR
LDX TEMPADDR
LBSR OUTCRLF
JSR ,X
PULS X ;restaurer registre utilisé
RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;************************************************************************************
;Routine CNVHXBCD Convert Hexadecimal number to BCD number
;Entrée: A=Nombre en hexadécimal à convertir
;Sorties: TEMPCHAR=Unités, TEMP2CHR=Dizaines, TEMP2CHR+1=Centaines
;Routines appelée: Aucune
;************************************************************************************
CNVHXBCD PSHS B
LDB #$00
STB TEMPCHAR
STB TEMP2CHR
STB TEMP2CHR+1
CENTAINE CMPA #$64
BLO DIZAINES
SUBA #$64
INC TEMPCHAR
BRA CENTAINE
DIZAINES CMPA #$0A
BLO UNITES
SUBA #$0A
INC TEMP2CHR
BRA DIZAINES
UNITES STA TEMP2CHR+1
PULS B
RTS
;____________________________________________________________________________________
;************************************************************************************
;Routine READADC, Read Analog to Digital converter
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée:
;************************************************************************************
U_FIRQ EQU $00F4
D_AD0 EQU $1C00
D_AD1 EQU $1C01
D_AD2 EQU $1C02
T2 EQU $00E0
DIS_BYT EQU $F3E3
DIS_BAC EQU $F36F
G_WAIT EQU $F800
MESSADC0 FCC "Entree Analogique Luminosite: ", $00
MESSADC1 FCC "Entree Analogique Temperature: ", $00
MESSADC2 FCC "Entree Analogique Tension: ", $00
MESSDEGC FCC " Degr. C ", $00
MESSKLUX FCC " Kilo Lux ", $00
MESSVOLT FCC " Deci Volt ", $00
READADC PSHS A,X
LOOPCONV ;lecture entrée 0 du multiplexeur vers convertisseur A/D
STA D_AD0 ;début conversion
LDX #MESSADC0 ;message entrée adresse début
LBSR OUTSTRNG ;afficher message d'entrée d'adresse
LDA #30
JSR G_WAIT
LDA D_AD0 ;lit état provenant du convertisseur
LBSR CNVHXBCD
LDA TEMPCHAR
ADDA #$30
STA TEMPCHAR
LBSR OUT1CHAR
LDA TEMP2CHR
ADDA #$30
STA TEMP2CHR
LDA TEMP2CHR+1
ADDA #$30
STA TEMP2CHR+1
LBSR OUT2CHAR
LDX #MESSKLUX ;message Klux
LBSR OUTSTRNG ;afficher message KLux
LBSR OUTSPACE
LBSR OUTSPACE
LBSR OUTSPACE
;lecture entrée 1 du multiplexeur vers convertisseur A/D
STA D_AD1 ;début conversion
LDX #MESSADC1 ;message entrée adresse début
LBSR OUTSTRNG ;afficher message d'entrée d'adresse
LDA #30
JSR G_WAIT
LDA D_AD1 ;lit état provenant du convertisseur
SUBA #$AF
LBSR CNVHXBCD
LDA TEMPCHAR
ADDA #$30
STA TEMPCHAR
LBSR OUT1CHAR
LDA TEMP2CHR
ADDA #$30
STA TEMP2CHR
LDA TEMP2CHR+1
ADDA #$30
STA TEMP2CHR+1
LBSR OUT2CHAR
LDX #MESSDEGC ;message °C
LBSR OUTSTRNG ;afficher message °C
LBSR OUTSPACE
LBSR OUTSPACE
LBSR OUTSPACE
;lecture entrée 2 du multiplexeur vers convertisseur A/D
STA D_AD2 ;début conversion
LDX #MESSADC2 ;message entrée adresse début
LBSR OUTSTRNG ;afficher message d'entrée d'adresse
LDA #30
JSR G_WAIT
LDA D_AD2 ;lit état provenant du convertisseur
LBSR CNVHXBCD
LDA TEMPCHAR
ADDA #$30
STA TEMPCHAR
LBSR OUT1CHAR
LDA TEMP2CHR
ADDA #$30
STA TEMP2CHR
LDA TEMP2CHR+1
ADDA #$30
STA TEMP2CHR+1
LBSR OUT2CHAR
LDX #MESSVOLT ;message Volt
LBSR OUTSTRNG ;afficher message Volt
LBSR OUTSPACE
LBSR OUTSPACE
LBSR OUTSPACE
JMP LOOPCONV
PULS A,X
RTS
;autre version de READADC
LDY #U_FIRQ ;programme gestionnaire FIRQ
LDA #$7E ;instruction "saute, JMP"
STA 0,Y
LDX #AD_IN ;adresse routine interruption
STX 1,Y
ANDCC #%10111111 ;actionne FIRQ
STA D_AD2 ;envoie début conversion au convertisseur A/D
AD_CONV NOP
JMP AD_CONV
AD_IN LDX #T2 ;X indique cellule donnée
LDA 0,X ;lit ancienne donnée
JSR DIS_BYT
LDB #1
JSR DIS_BAC
LDA D_AD0 ;lit état provenant du convertisseur
LDX #T2 ;X indique cellule donnée
STA 0,X ;mémorise donnée
LDA #1
JSR G_WAIT
STA D_AD0 ;nouveau début conversion
RTI
;M_DATA DB 00 ;zone de sauvegarde des données
;____________________________________________________________________________________
Ce moniteur contient aussi une application de lecture et affichage en logs de quelques capteur analogique.
Re: Un kit autour du EF6809P
Vidéo de démonstration des routines du nouveau moniteur du kit:
https://www.youtube.com/watch?v=wUDwl6ZRYkA
https://www.youtube.com/watch?v=wUDwl6ZRYkA
Re: Un kit autour du EF6809P
Superbe réalisation
Félicitations
Félicitations
Re: Un kit autour du EF6809P
Je suis entrain de concevoir un mini assembleur.
L'idée de départ est simple: Peupler des tables contenant les instructions, les codes correspondants à ses instructions pour chaque mode d'adressage puis à chaque apparition d'une instruction avec ses paramètres, déterminer le mode d'adressage puis trouver la correspondance de l'instruction dans la table des codes correspondant à l'adressage voulu en utilisant les index. Les Post-bytes seront aussi ajouté selon le mode d'adressage indexé utilisé.
Les tables seront déposée en RAM de façon séquentielle en faisant attention à réserver des cases pour les codes des modes d'adressage non disponibles pour certaines instructions. Elle seront comme suit:
-Table des instructions normales plus les instructions de Saut inconditionnel JMP et JSR
-Table des Codes adressage Immédiat correspondants
-Table des Codes adressage Direct correspondants
-Table des Codes adressage Indexé correspondants
-Table des Codes adressage Étendu correspondants
-Table des Codes adressage Inhérent correspondants
-Table des Instructions de Branchement Inconditionnel et Branchement Inconditionnel Longs
-Table des Codes des Branchement Inconditionnel et Branchement Inconditionnel Long correspondants
-Table des Instructions Branchement Conditionnel
-Table des Codes Branchement Conditionnel correspondants
Les tables des Instructions et Codes de Branchement Conditionnel Long n'existerons pas (pour minimiser l'espace RAM occupé). Le traitement sera fait par une analyse syntaxique qui donnera l'instruction du Branchement Conditionnel correspondant, ce qui permettra de trouver le code du Branchement Conditionnels correspondant auquel on va ajouter "$10" au début.
-Table des paramètres des modes d'adressage Indexé
-Table des Codes des modes d'adressage Indexé correspondants
Il y aura aussi une tables pour les instructions (exceptionnels) à plus d'un octet comme CMPD, CMPS, CMPU, CMPY, LDS, LDY et LBRN qui permettra de les identifier afin de leur ajouter au début l'octet "$10" ou "$11" selon le cas.
En premier lieu, pour faire simple, le seul format des chiffres traité sera l'Hexadécimal.
Qu'en pensez-vous, ma méthode est bonne ou je fais fausse route quelque part?
L'idée de départ est simple: Peupler des tables contenant les instructions, les codes correspondants à ses instructions pour chaque mode d'adressage puis à chaque apparition d'une instruction avec ses paramètres, déterminer le mode d'adressage puis trouver la correspondance de l'instruction dans la table des codes correspondant à l'adressage voulu en utilisant les index. Les Post-bytes seront aussi ajouté selon le mode d'adressage indexé utilisé.
Les tables seront déposée en RAM de façon séquentielle en faisant attention à réserver des cases pour les codes des modes d'adressage non disponibles pour certaines instructions. Elle seront comme suit:
-Table des instructions normales plus les instructions de Saut inconditionnel JMP et JSR
-Table des Codes adressage Immédiat correspondants
-Table des Codes adressage Direct correspondants
-Table des Codes adressage Indexé correspondants
-Table des Codes adressage Étendu correspondants
-Table des Codes adressage Inhérent correspondants
-Table des Instructions de Branchement Inconditionnel et Branchement Inconditionnel Longs
-Table des Codes des Branchement Inconditionnel et Branchement Inconditionnel Long correspondants
-Table des Instructions Branchement Conditionnel
-Table des Codes Branchement Conditionnel correspondants
Les tables des Instructions et Codes de Branchement Conditionnel Long n'existerons pas (pour minimiser l'espace RAM occupé). Le traitement sera fait par une analyse syntaxique qui donnera l'instruction du Branchement Conditionnel correspondant, ce qui permettra de trouver le code du Branchement Conditionnels correspondant auquel on va ajouter "$10" au début.
-Table des paramètres des modes d'adressage Indexé
-Table des Codes des modes d'adressage Indexé correspondants
Il y aura aussi une tables pour les instructions (exceptionnels) à plus d'un octet comme CMPD, CMPS, CMPU, CMPY, LDS, LDY et LBRN qui permettra de les identifier afin de leur ajouter au début l'octet "$10" ou "$11" selon le cas.
En premier lieu, pour faire simple, le seul format des chiffres traité sera l'Hexadécimal.
Qu'en pensez-vous, ma méthode est bonne ou je fais fausse route quelque part?
Re: Un kit autour du EF6809P
Créer un assembleur est un excellent exercice, très enrichissant car il nécessite une connaissance parfaite de toutes les instructions. En partant de rien c'est long. Au cours du développement on découvre toujours des méthodes meilleures que celles envisagées au départ, et les perfectionnements sont toujours possibles. En définitive c'est un jeu passionnant et inépuisable.
Pour trouver des idées, il est peut-être utile de regarder comment font les "professionnels" (mais ce n'est pas une obligation). Ci-dessous le lien vers l'assembleur 6809 écrit par Microsoft pour les ordinateurs Thomson :
http://dcmoto.free.fr/programmes/assemb ... index.html
Pour trouver des idées, il est peut-être utile de regarder comment font les "professionnels" (mais ce n'est pas une obligation). Ci-dessous le lien vers l'assembleur 6809 écrit par Microsoft pour les ordinateurs Thomson :
http://dcmoto.free.fr/programmes/assemb ... index.html
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.
-
- Messages : 7987
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Un kit autour du EF6809P
Attention l'assembleur thomson fait 16ko, c'est peut être un peu trop gros pour le kit en question. On y trouve une gestion de fichier, un éditeur, un débuggeur pas à pas. C'est très riche. Je crois que siliconal veut juste se faire un micro assembleur résident qui tient à coté du moniteur. Je ne sais pas trop combien d'octets représente la partie assembleur pur, mais je serais surpris si ca faisait moins de 2ko.
Perso plus que de l 'assembleur, et suite aux sujets de Dominique sur le Forth, je me dit qu'un moniteur Forth serait en soi un sujet très intéressant sur le 6809. Après tout le jupiter ace, a une rom Forth. A noter: une fois le noyau Forth en place, il existe du code Forth qui défini les mnemoniques permettant de faire de l'assembleur 6809 nativement. Cette approche est éloigné de la problématique de siliconal, mais tout autant fascinante! http://www.bradrodriguez.com/papers/6809asm.txt, source: http://www.bradrodriguez.com/papers/6809asmlisting.txt
Perso plus que de l 'assembleur, et suite aux sujets de Dominique sur le Forth, je me dit qu'un moniteur Forth serait en soi un sujet très intéressant sur le 6809. Après tout le jupiter ace, a une rom Forth. A noter: une fois le noyau Forth en place, il existe du code Forth qui défini les mnemoniques permettant de faire de l'assembleur 6809 nativement. Cette approche est éloigné de la problématique de siliconal, mais tout autant fascinante! http://www.bradrodriguez.com/papers/6809asm.txt, source: http://www.bradrodriguez.com/papers/6809asmlisting.txt
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: Un kit autour du EF6809P
Dans les messages de Daniel et Sam, il y a beaucoup de choses et de techniques (Assembleur pour Thomson, Forth) qui sont toutes nouvelles pour moi.
Je dois prendre un peu de temps pour les étudier et évaluer leur intérêt pour mon projet et comparer leurs approches à la mienne et voir comment en tirer profit.
Pour l'espace RAM, c'est sûr que je doit l'augmenter dans le prochain kit car rien que pour les tables j'aurai besoin de presque 2 Ko, les 2 Ko restant contiendront le moniteur et l'assembleur (en version minimale) en attendant plus de RAM.
Je dois prendre un peu de temps pour les étudier et évaluer leur intérêt pour mon projet et comparer leurs approches à la mienne et voir comment en tirer profit.
Pour l'espace RAM, c'est sûr que je doit l'augmenter dans le prochain kit car rien que pour les tables j'aurai besoin de presque 2 Ko, les 2 Ko restant contiendront le moniteur et l'assembleur (en version minimale) en attendant plus de RAM.
Re: Un kit autour du EF6809P
Bonjour,
Comme prévu, j'ai commencé à développer mon propre assembleur par l'assembleur pur sans utiliser aucune bibliothèque externe.
Je suis parvenu à assembler les instructions de la première table comme suit:
-Table des instructions normales plus les instructions de Saut inconditionnel JMP et JSR
-Table des Codes adressage Immédiat correspondants
-Table des Codes adressage Direct correspondants
-Table des Codes adressage Indexé correspondants
-Table des Codes adressage Étendu correspondants
-Table des Codes adressage Inhérent correspondants
J'ai encore quelques bugs que je suis entrain de corriger grâce au mode BreakPoint qui j'ai pu executer grace à l'installation du PTM offer par Marc (que je remercie encore et encore pour son grand soutien). Mais j'ai pu extraire les codes de chaque instruction de cette table (sans ajouter les paramètres ni les Byte codes additionnels pour le moment.
A titre indicatif, voici le listing des routines de l'assembleur + la table citée en haut.
Les routines de l'assembleur sont basiques et n'ont subi aucune optimisation pour le moment (pour permettre un déboggage facile):
N.B.: Les routines appelées par ces routines et qui ne figurent pas sur ce listing sont dans le listing du moniteur posté auparavant.
Je posterai les vidéo des premiers test très prochainnement.
Comme prévu, j'ai commencé à développer mon propre assembleur par l'assembleur pur sans utiliser aucune bibliothèque externe.
Je suis parvenu à assembler les instructions de la première table comme suit:
-Table des instructions normales plus les instructions de Saut inconditionnel JMP et JSR
-Table des Codes adressage Immédiat correspondants
-Table des Codes adressage Direct correspondants
-Table des Codes adressage Indexé correspondants
-Table des Codes adressage Étendu correspondants
-Table des Codes adressage Inhérent correspondants
J'ai encore quelques bugs que je suis entrain de corriger grâce au mode BreakPoint qui j'ai pu executer grace à l'installation du PTM offer par Marc (que je remercie encore et encore pour son grand soutien). Mais j'ai pu extraire les codes de chaque instruction de cette table (sans ajouter les paramètres ni les Byte codes additionnels pour le moment.
A titre indicatif, voici le listing des routines de l'assembleur + la table citée en haut.
Les routines de l'assembleur sont basiques et n'ont subi aucune optimisation pour le moment (pour permettre un déboggage facile):
Code : Tout sélectionner
;************************************************************************************
;routines et programmes du nouveau assembleur ASSMSILIC et ses routines complémentaires
;************************************************************************************
;************************************************************************************
;Routine ASSEMBLE, Simple inline assembler for SILICONAL Kit
;Entrée: Aucune
;Sorties: Aucune
;Routines appelée:
;************************************************************************************
0987 496E737472756374696F6E206120617373656D626C65723A2000 INSAEXEC FCC "Instruction a assembler: ", $00
09A1 3412 ASSEMBLE PSHS A,X ;sauvegarder les registres utilisés
09A3 8E0987 LDX #INSAEXEC ;si fin de table atteinte, préparer message d'erreur
09A6 17FA25 LBSR OUTSTRNG ;afficher message d'erreur "Instruction non trouvée!"
09A9 17FA10 LBSR OUTCRLF
09AC 8E01B0 LDX #BUFFERST ;index X pointe sur zone mémoire BUFFERST
09AF BD027B ASSEMBLE1 JSR RECVACIA ;lecture Caractère
09B2 BD0262 JSR SENDACIA ;ecriture caractère reçu
09B5 810D CMPA #$0D ;caractère reçu = "Chariot Return"?
09B7 2704 BEQ ASSEMBLE2 ;si oui aller à INPTCMND2: saisir et tester caractère suivant
09B9 A780 STA ,X+ ;sinon (caractère normal) le charger dans BUFFERST
09BB 20F2 BRA ASSEMBLE1 ;aller lire caractère suivant
09BD B701A0 ASSEMBLE2 STA TEMPCHAR ;sauvegarder premier caractère (CR) pour utilisation ultérieure
09C0 BD027B JSR RECVACIA ;lecture Caractère
09C3 BD0262 JSR SENDACIA ;ecriture caractère reçu
09C6 B701A1 STA TEMP2CHR ;sauvegarder premier caractère (CR) pour utilisation ultérieure
09C9 810A CMPA #$0A ;caractère reçu = "Line Feed"?
09CB 270C BEQ ASSEMBLE3 ;si oui aller à INPTCMND3: charger caractère $00 dans BUFFERST
09CD B601A0 LDA TEMPCHAR ;sinon (caractère normal), charger caractère "CR"
09D0 A780 STA ,X+ ;dans BUFFERST puisque caractère suivant est <> de "LF"
09D2 B601A1 LDA TEMP2CHR ;charger caractère (normal) suivant le caractère "CR"
09D5 A780 STA ,X+ ;dans BUFFERST puisque caractère suivant "CR" est <> de "LF"
09D7 20D6 BRA ASSEMBLE1 ;aller lire caractère suivant
09D9 8600 ASSEMBLE3 LDA #$00 ;charger caractère $00 (caractère 0 terminal)
09DB A784 STA ,X ;dans BUFFERST
09DD 8D38 BSR CONVISNT ;convertir instruction saisie
09DF 17F9DA LBSR OUTCRLF ;retourner à la ligne suivante et
09E2 3512 PULS A,X ;restaurer les registres utilisés
09E4 39 RTS ;Fin de sous routine et retour au programme appelant
;************************************************************************************
;Routine CONVISNT Convert instruction to op. code
;Entrée: BUFFERST=Commande reçue par RS232
;Sorties:
;Routines appelée: OUTSTRNG
;************************************************************************************
09E5 496E737472756374696F6E206E6F6E2074726F757665652100 ERINSMES FCC "Instruction non trouvee!", $00 ;si fin de table commandes atteint
09FE 4D6F646520616472657373616765206E6F6E20646973702E00 ERRMDADD FCC "Mode adressage non disp.", $00 ;si mode adressage non disp.
0A17 3436 CONVISNT PSHS A,B,X,Y ;sauvegarder les registres utilisés
0A19 8E0B67 LDX #INSTTABL ;charger X avec première entrée de la table instructions
0A1C 108E0FF0 LDY #$0FF0 ;index table op. codes
0A20 A680 COMPINST LDA ,X+ ;A<-entrée de table instructions puis incrémenter index
0A22 B101B0 CMPA BUFFERST ;comparer première lettre instr. saisie avec entrée de table instr.
0A25 2711 BEQ COMP2NDL ;si égale, aller comparer seconde lettre
0A27 8100 CMPA #$00 ;si non égal, test fin de table instructions
0A29 2609 BNE CTRLBYT1 ;pas encore atteinte
0A2B 8E09E5 LDX #ERINSMES ;si fin de table atteinte, préparer message d'erreur
0A2E 17F99D LBSR OUTSTRNG ;afficher message d'erreur "Instruction non trouvée!"
0A31 160130 LBRA RSTREXIT ;aller restaurer registres et sortir
0A34 3003 CTRLBYT1 LEAX 3,X ;incrémenter index pour atteindre octet de contrôle modes adressage
0A36 2044 BRA NXTENTRY
0A38 A680 COMP2NDL LDA ,X+ ;A<-entrée de table instructions puis incrémenter index
0A3A B101B1 CMPA BUFFERST+1;comparer 2 eme lettre instr. avec entrée de table instr.
0A3D 2711 BEQ COMP3RDL ;si égale, aller comparer 3eme lettre
0A3F 8100 CMPA #$00 ;si non égal, test fin de table instructions
0A41 2609 BNE CTRLBYT2 ;pas encore atteinte
0A43 8E09E5 LDX #ERINSMES ;si fin de table atteinte, préparer message d'erreur
0A46 17F985 LBSR OUTSTRNG ;afficher message d'erreur "Instruction non trouvée!"
0A49 160118 LBRA RSTREXIT ;aller restaurer registres et sortir
0A4C 3002 CTRLBYT2 LEAX 2,X ;incrémenter index pour atteindre octet de contrôle modes adressage
0A4E 202C BRA NXTENTRY
0A50 A680 COMP3RDL LDA ,X+ ;A<-entrée de table instructions puis incrémenter index
0A52 B101B2 CMPA BUFFERST+2;comparer 3 eme lettre instr. avec entrée de table instr.
0A55 2711 BEQ COMP4THL
0A57 8100 CMPA #$00 ;si non égal, test fin de table instructions
0A59 2609 BNE CTRLBYT3 ;pas encore atteinte
0A5B 8E09E5 LDX #ERINSMES ;si fin de table atteinte, préparer message d'erreur
0A5E 17F96D LBSR OUTSTRNG ;afficher message d'erreur "Instruction non trouvée!"
0A61 160100 LBRA RSTREXIT ;aller restaurer registres et sortir
0A64 3001 CTRLBYT3 LEAX 1,X ;incrémenter index pour atteindre octet de contrôle modes adressage
0A66 2014 BRA NXTENTRY
0A68 A680 COMP4THL LDA ,X+ ;A<-entrée de table instructions puis incrémenter index
0A6A B101B3 CMPA BUFFERST+3;comparer 4 eme lettre instr. avec entrée de table instr.
0A6D 272B BEQ EXECCONV
0A6F 8100 CMPA #$00 ;si non égal, test fin de table instructions
0A71 2609 BNE NXTENTRY ;pas encore atteinte
0A73 8E09E5 LDX #ERINSMES ;si fin de table atteinte, préparer message d'erreur
0A76 17F955 LBSR OUTSTRNG ;afficher message d'erreur "Instruction non trouvée!"
0A79 1600E8 LBRA RSTREXIT ;aller restaurer registres et sortir
;calcul adresse nouvelle entrée instruction dans table instructions
0A7C 5F NXTENTRY CLRB ;mise à 0 du compteur de modes d'adressage disponibles
0A7D A680 LDA ,X+
0A7F 48 ASLA ;isolation indicateur mode adressage Immédiat
0A80 2401 BCC ADDRMOD1 ;si indicateur mode adressage Immédiat non actif
0A82 5C INCB ;incrémenter compteur modes d'adressage
0A83 48 ADDRMOD1 ASLA ;isolation indicateur mode adressage Direct
0A84 2401 BCC ADDRMOD2 ;si indicateur mode adressage Direct non actif
0A86 5C INCB ;incrémenter compteur modes d'adressage
0A87 48 ADDRMOD2 ASLA ;isolation indicateur mode adressage Indéxé
0A88 2401 BCC ADDRMOD3 ;si indicateur mode adressage Indéxé non actif
0A8A 5C INCB ;incrémenter compteur modes d'adressage
0A8B 48 ADDRMOD3 ASLA ;isolation indicateur mode adressage Etendu
0A8C 2401 BCC ADDNXTIN ;si indicateur mode adressage Etendu non actif
0A8E 5C INCB ;incrémenter compteur modes d'adressage
0A8F C100 ADDNXTIN CMPB #$00 ;test nombre modes d'adressage
0A91 2602 BNE MOVNXTIN ;si <> 0, donc continuer
0A93 C601 LDB #$01 ;si aucun mode d'adressage, donc mode Inhérent seul
0A95 3085 MOVNXTIN LEAX B,X ;X <- adresse prochaine entrée dans la table instructions
0A97 16FF86 LBRA COMPINST ;aller comparer l'instruction saisie avec cette entrée
0A9A B601B5 EXECCONV LDA BUFFERST+5
0A9D 5F CLRB ;mise à 0 d'un compteur de modes d'adressage indisponibles
;LDA ,X
;ASLA ;isolation indicateur mode adressage Immédiat
;BCS INCRMNTB ;si indicateur mode adressage Immédiat actif, Erreur mode indisp.
;ASLA ;isolation indicateur mode adressage Direct
;BCS INCRMNTB ;si indicateur mode adressage Immédiat actif, Erreur mode indisp.
;ASLA ;isolation indicateur mode adressage Indéxé
;BCS INCRMNTB ;si indicateur mode adressage Immédiat actif, Erreur mode indisp.
;ASLA ;isolation indicateur mode adressage Etendu, et incrémentation X
;BCS INCRMNTB ;si indicateur mode adressage Immédiat actif, Erreur mode indisp.
;INCRMNTB INCB ;incrémenter compteur de modes adressage indisponibles
0A9E 8123 CMPA #'# ;test caractère suivant l'espace si c'est "#"
0AA0 2710 BEQ IMMEDIAT ;donc mode adressage Immédiat
0AA2 8124 CMPA #'$ ;sinon le comparer avec "$"
0AA4 2723 BEQ TSTDRECT ;si égal donc aller tester si Direct ou Etendu
0AA6 812C CMPA #', ;si <> "$" comparer avec ","
0AA8 2745 BEQ INDEXNUL ;si égal donc mode adressage Indéxé déplacement nul
0AAA 8100 CMPA #$00 ;test caractère suivant l'espace si c'est $00
0AAC 10270091 LBEQ INHERENT ;donc mode adressage Inhérent
0AB0 2058 BRA INDXOFFS
0AB2 IMMEDIAT ;vérification si ce mode est disponible pour cette instruction
0AB2 A680 LDA ,X+
0AB4 48 ASLA ;isolation indicateur mode adressage Immédiat, et incrémentation X
0AB5 102400A5 LBCC ERRMODIM ;si indicateur mode adressage Immédiat non actif
0AB9 A684 LDA ,X ;si oui, copier le code dans zone mémoire Op Code
0ABB A7A0 STA ,Y+ ;indéxée par Y et incrémenter Y
0ABD B701A0 STA TEMPCHAR
0AC0 17F99C LBSR OUTHEXAW ;afficher code opération assemblé
0AC3 17F8F6 LBSR OUTCRLF ;et retourner à la ligne
0AC6 16009B LBRA RSTREXIT ;aller vers restauration registres et exit
0AC9 B601B8 TSTDRECT LDA BUFFERST+8
0ACC 8100 CMPA #$00
0ACE 10260053 LBNE EXTENDED
0AD2 DIRECT ;vérification si ce mode est disponible pour cette instruction
0AD2 A680 LDA ,X+ ;incrémentation pour tomber sur l'op. code Direct
0AD4 48 ASLA ;isolation indicateur mode adressage Immédiat
0AD5 48 ASLA ;isolation indicateur mode adressage Direct, et incrémentation X
0AD6 10240084 LBCC ERRMODIM ;si indicateur mode adressage Immédiat non actif
0ADA 3001 LEAX 1,X ;incrémentation pour tomber sur l'op. code Direct
0ADC 50 NEGB ;B <- (-B) (complémenter B)
0ADD 3085 LEAX B,X ;pour le diminuer de X
0ADF A684 LDA ,X ;si oui, copier le code dans zone mémoire Op Code
0AE1 A7A0 STA ,Y+ ;indéxée par Y et incrémenter Y
0AE3 B701A0 STA TEMPCHAR
0AE6 17F976 LBSR OUTHEXAW ;afficher code opération assemblé
0AE9 17F8D0 LBSR OUTCRLF ;et retourner à la ligne
0AEC 160075 LBRA RSTREXIT ;aller vers restauration registres et exit
0AEF INDEXNUL ;vérification si ce mode est disponible pour cette instruction
0AEF A680 LDA ,X+
0AF1 48 ASLA ;isolation indicateur mode adressage Immédiat
0AF2 48 ASLA ;isolation indicateur mode adressage Direct
0AF3 48 ASLA ;isolation indicateur mode adressage Indéxé, et incrémentation X
0AF4 2468 BCC ERRMODIM ;si indicateur mode adressage Immédiat non actif
0AF6 3002 LEAX 2,X ;2 incrémentations de X pour tomber sur l'op.code Indéxé
0AF8 50 NEGB ;B <- (-B) (complémenter B, compteur modes adressage indisponibles)
0AF9 3085 LEAX B,X ;pour le diminuer de X
0AFB A684 LDA ,X ;si oui, copier le code dans zone mémoire Op Code
0AFD A7A0 STA ,Y+ ;indéxée par Y et incrémenter Y
0AFF B701A0 STA TEMPCHAR
0B02 17F95A LBSR OUTHEXAW ;afficher code opération assemblé
0B05 17F8B4 LBSR OUTCRLF ;et retourner à la ligne
0B08 205A BRA RSTREXIT ;aller vers restauration registres et exit
0B0A INDXOFFS ;vérification si ce mode est disponible pour cette instruction
0B0A A680 LDA ,X+
0B0C 48 ASLA ;isolation indicateur mode adressage Immédiat
0B0D 48 ASLA ;isolation indicateur mode adressage Direct
0B0E 48 ASLA ;isolation indicateur mode adressage Indéxé, et incrémentation X
0B0F 244D BCC ERRMODIM ;si indicateur mode adressage Immédiat non actif
0B11 3002 LEAX 2,X ;2 incrémentations de X pour tomber sur l'op.code Indéxé
0B13 50 NEGB ;B <- (-B) (complémenter B, compteur modes adressage indisponibles)
0B14 3085 LEAX B,X ;pour le diminuer de X
0B16 A684 LDA ,X ;si oui, copier le code dans zone mémoire Op Code
0B18 A7A0 STA ,Y+ ;indéxée par Y et incrémenter Y
0B1A B701A0 STA TEMPCHAR
0B1D 17F93F LBSR OUTHEXAW ;afficher code opération assemblé
0B20 17F899 LBSR OUTCRLF ;et retourner à la ligne
0B23 203F BRA RSTREXIT ;aller vers restauration registres et exit
0B25 EXTENDED ;vérification si ce mode est disponible pour cette instruction
0B25 A680 LDA ,X+
0B27 48 ASLA ;isolation indicateur mode adressage Immédiat
0B28 48 ASLA ;isolation indicateur mode adressage Direct
0B29 48 ASLA ;isolation indicateur mode adressage Indéxé
0B2A 48 ASLA ;isolation indicateur mode adressage Etendu, et incrémentation X
0B2B 2431 BCC ERRMODIM ;si indicateur mode adressage Immédiat non actif
0B2D 3003 LEAX 3,X ;puis 2 autres incrémentation de X pour tomber sur l'op.code Etendu
0B2F 50 NEGB ;B <- (-B) (complémenter B, compteur modes adressage indisponibles)
0B30 3085 LEAX B,X ;pour le diminuer de X
0B32 A684 LDA ,X ;si oui, copier le code dans zone mémoire Op Code
0B34 A7A0 STA ,Y+ ;indéxée par Y et incrémenter Y
0B36 B701A0 STA TEMPCHAR
0B39 17F923 LBSR OUTHEXAW ;afficher code opération assemblé
0B3C 17F87D LBSR OUTCRLF ;et retourner à la ligne
0B3F 2023 BRA RSTREXIT ;aller vers restauration registres et exit
0B41 INHERENT ;vérification si ce mode est disponible pour cette instruction
0B41 A680 LDA ,X+
0B43 48 ASLA ;isolation indicateur mode adressage Immédiat
0B44 2518 BCS ERRMODIM ;si indicateur mode adressage Immédiat actif, Erreur mode indisp.
0B46 48 ASLA ;isolation indicateur mode adressage Direct
0B47 2515 BCS ERRMODIM ;si indicateur mode adressage Immédiat actif, Erreur mode indisp.
0B49 48 ASLA ;isolation indicateur mode adressage Indéxé
0B4A 2512 BCS ERRMODIM ;si indicateur mode adressage Immédiat actif, Erreur mode indisp.
0B4C 48 ASLA ;isolation indicateur mode adressage Etendu, et incrémentation X
0B4D 250F BCS ERRMODIM ;si indicateur mode adressage Immédiat actif, Erreur mode indisp.
0B4F A684 LDA ,X ;si oui, copier le code dans zone mémoire Op Code
0B51 A7A0 STA ,Y+ ;indéxée par Y et incrémenter Y
0B53 B701A0 STA TEMPCHAR
0B56 17F906 LBSR OUTHEXAW ;afficher code opération assemblé
0B59 17F860 LBSR OUTCRLF ;et retourner à la ligne
0B5C 2006 BRA RSTREXIT ;aller vers restauration registres et exit
0B5E 8E09FE ERRMODIM LDX #ERRMDADD ;sinon afficher message "Mode adressage non dispo."
0B61 17F86A LBSR OUTSTRNG ;afficher message d'erreur "Mode adressage non dispo."
0B64 3536 RSTREXIT PULS A,B,X,Y ;restaurer les registres utilisés
0B66 39 RTS ;Fin de sous routine et retour au programme moniteur
;____________________________________________________________________________________
;début exemple codage conversion instruction
;FCC "STA " ;instruction
;FCC %01110100 ;pattern adressage disp. nibble MSB: 1->disp. 0->indisp.
;bits: 7->Immediat, 6->Direct, 5->Indéxé, 4->Etendu
;mode Inhérent disponible si aucun autre mode n'est disp.
;nibble LSB: 3 bits MSB->nombre d'octets code operation
;dans cet exemple: modes d'adressage disponibles:
;Direct, Indéxé et Etendu. nombre d'octets Direct: 2
;FCC %10011000 ;ce bit est supplémentaire et ajouté en cas de besoin:
;si le nombre de modes d'adressage disponibles est > 1:
;bit 0 octet précédent + bits 7 et 6->nombre octets code
;operation adressage 1, bits 5 à 0-> par paquet de 3 bits
;->nombre octets code opération par même ordre que celui
;des bits de pattern des modes d'adressage
;dans cet exemple nombre d'octets Indéxé: 2, nombre d'octets
;Etendu: 3, les bits restant n'ont aucune signification
;puisqu'il n'y a que 3 modes d'adressage pour cette "STA"
;FCC $97 ;code operation par même ordre que celui des bits de
;FCC $A7 ;dans cet exemple: code opération mode Direct -> $97, code
;FCC $B7 ;pattern des modes d'adressage Immediat, Direct, Indéxé,
;Etendu puis Inhérent
;mode Indéxé -> $A7, code mode Etendu -> $B7
;fin exemple codage conversion instruction
0B67 41425820 INSTTABL FCC "ABX "
0B6B 02 FCC %00000010
0B6C 3A FCC $3A
0B6D 41444341 FCC "ADCA"
0B71 F4 FCC %11110100
;FCC %10010011
0B72 89 FCC $89
0B73 99 FCC $99
0B74 A9 FCC $A9
0B75 B9 FCC $B9
0B76 41444342 FCC "ADCB"
0B7A F4 FCC %11110100
;FCC %10010011
0B7B C9 FCC $C9
0B7C D9 FCC $D9
0B7D E9 FCC $E9
0B7E F9 FCC $F9
0B7F 41444441 FCC "ADDA"
0B83 F4 FCC %11110100
;FCC %10010011
0B84 8B FCC $8B
0B85 9B FCC $9B
0B86 AB FCC $AB
0B87 BB FCC $BB
0B88 41444442 FCC "ADDB"
0B8C F4 FCC %11110100
;FCC %10010011
0B8D CB FCC $CB
0B8E DB FCC $DB
0B8F EB FCC $EB
0B90 FB FCC $FB
0B91 41444444 FCC "ADDD"
0B95 F6 FCC %11110110
;FCC %10010011
0B96 C3 FCC $C3
0B97 D3 FCC $D3
0B98 E3 FCC $E3
0B99 F3 FCC $F3
0B9A 414E4441 FCC "ANDA"
0B9E F4 FCC %11110100
;FCC %10010011
0B9F 84 FCC $84
0BA0 94 FCC $94
0BA1 A4 FCC $A4
0BA2 B4 FCC $B4
0BA3 414E4442 FCC "ANDB"
0BA7 F4 FCC %11110100
;FCC %10010011
0BA8 C4 FCC $C4
0BA9 D4 FCC $D4
0BAA E4 FCC $E4
0BAB F4 FCC $F4
0BAC 414E4443 FCC "ANDC"
0BB0 84 FCC %10000100
0BB1 1C FCC $1C
0BB2 41534C41 FCC "ASLA"
0BB6 02 FCC %00000010
0BB7 48 FCC $48
0BB8 41534C42 FCC "ASLB"
0BBC 02 FCC %00000010
0BBD 58 FCC $58
0BBE 41534C20 FCC "ASL "
0BC2 74 FCC %01110100
;FCC %10011000
0BC3 08 FCC $08
0BC4 68 FCC $68
0BC5 78 FCC $78
0BC6 41535241 FCC "ASRA"
0BCA 02 FCC %00000010
0BCB 47 FCC $47
0BCC 41535242 FCC "ASRB"
0BD0 02 FCC %00000010
0BD1 57 FCC $57
0BD2 41535220 FCC "ASR "
0BD6 74 FCC %01110100
;FCC %10011000
0BD7 07 FCC $07
0BD8 67 FCC $67
0BD9 77 FCC $77
0BDA 42495441 FCC "BITA"
0BDE F4 FCC %11110100
;FCC %10010011
0BDF 85 FCC $85
0BE0 95 FCC $95
0BE1 A5 FCC $A5
0BE2 B5 FCC $B5
0BE3 42495442 FCC "BITB"
0BE7 F4 FCC %11110100
;FCC %10010011
0BE8 C5 FCC $C5
0BE9 D5 FCC $D5
0BEA E5 FCC $E5
0BEB F5 FCC $F5
0BEC 434C5241 FCC "CLRA"
0BF0 02 FCC %00000010
0BF1 4F FCC $4F
0BF2 434C5242 FCC "CLRB"
0BF6 02 FCC %00000010
0BF7 5F FCC $5F
0BF8 434C5220 FCC "CLR "
0BFC 74 FCC %01110100
;FCC %10011000
0BFD 0F FCC $0F
0BFE 6F FCC $6F
0BFF 7F FCC $7F
0C00 434D5041 FCC "CMPA"
0C04 F4 FCC %11110100
;FCC %10010011
0C05 81 FCC $81
0C06 91 FCC $91
0C07 A1 FCC $A1
0C08 B1 FCC $B1
0C09 434D5042 FCC "CMPB"
0C0D F4 FCC %11110100
;FCC %10010011
0C0E C1 FCC $C1
0C0F D1 FCC $D1
0C10 E1 FCC $E1
0C11 F1 FCC $F1
0C12 434D5044 FCC "CMPD"
0C16 F8 FCC %11111000
;FCC %11011100
0C17 83 FCC $1083
0C18 93 FCC $1093
0C19 A3 FCC $10A3
0C1A B3 FCC $10B3
0C1B 434D5053 FCC "CMPS"
0C1F F8 FCC %11111000
;FCC %11011100
0C20 8C FCC $118C
0C21 9C FCC $119C
0C22 AC FCC $11AC
0C23 BC FCC $11BC
0C24 434D5055 FCC "CMPU"
0C28 F8 FCC %11111000
;FCC %11011100
0C29 83 FCC $1183
0C2A 93 FCC $1193
0C2B A3 FCC $11A3
0C2C B3 FCC $11B3
0C2D 434D5058 FCC "CMPX"
0C31 F6 FCC %11110110
;FCC %10010011
0C32 8C FCC $8C
0C33 9C FCC $9C
0C34 AC FCC $AC
0C35 BC FCC $BC
0C36 434D5059 FCC "CMPY"
0C3A F8 FCC %11111000
;FCC %11011100
0C3B 8C FCC $108C
0C3C 9C FCC $109C
0C3D AC FCC $10AC
0C3E BC FCC $10BC
0C3F 434F4D41 FCC "COMA"
0C43 02 FCC %00000010
0C44 43 FCC $43
0C45 434F4D42 FCC "COMB"
0C49 02 FCC %00000010
0C4A 53 FCC $53
0C4B 434F4D20 FCC "COM "
0C4F 74 FCC %01110100
;FCC %10011000
0C50 03 FCC $03
0C51 63 FCC $63
0C52 73 FCC $73
0C53 43574149 FCC "CWAI"
0C57 84 FCC %10000100
0C58 3C FCC $3C
0C59 44414120 FCC "DAA "
0C5D 02 FCC %00000010
0C5E 19 FCC $19
0C5F 44454341 FCC "DECA"
0C63 02 FCC %00000010
0C64 4A FCC $4A
0C65 44454342 FCC "DECB"
0C69 02 FCC %00000010
0C6A 5A FCC $5A
0C6B 44454320 FCC "DEC "
0C6F 74 FCC %01110100
;FCC %10011000
0C70 0A FCC $0A
0C71 6A FCC $6A
0C72 7A FCC $7A
0C73 454F5241 FCC "EORA"
0C77 F4 FCC %11110100
;FCC %10010011
0C78 88 FCC $88
0C79 98 FCC $98
0C7A A8 FCC $A8
0C7B B8 FCC $B8
0C7C 454F5242 FCC "EORB"
0C80 F4 FCC %11110100
;FCC %10010011
0C81 C1 FCC $C1
0C82 D1 FCC $D1
0C83 E1 FCC $E1
0C84 F1 FCC $F1
0C85 45584720 FCC "EXG "
0C89 84 FCC %10000100
0C8A 1E FCC $1E
0C8B 494E4341 FCC "INCA"
0C8F 02 FCC %00000010
0C90 4C FCC $4C
0C91 494E4342 FCC "INCB"
0C95 02 FCC %00000010
0C96 5C FCC $5C
0C97 494E4320 FCC "INC "
0C9B 74 FCC %01110100
;FCC %10011000
0C9C 0C FCC $0C
0C9D 6C FCC $6C
0C9E 7C FCC $7C
0C9F 4A4D5020 FCC "JMP "
0CA3 74 FCC %01110100
;FCC %10011000
0CA4 0E FCC $0E
0CA5 6E FCC $6E
0CA6 7E FCC $7E
0CA7 4A535220 FCC "JSR "
0CAB 74 FCC %01110100
;FCC %10011000
0CAC 9D FCC $9D
0CAD AD FCC $AD
0CAE BD FCC $BD
0CAF 4C444120 FCC "LDA "
0CB3 F4 FCC %11110100
;FCC %10010011
0CB4 86 FCC $86
0CB5 96 FCC $96
0CB6 A6 FCC $A6
0CB7 B6 FCC $B6
0CB8 4C444220 FCC "LDB "
0CBC F4 FCC %11110100
;FCC %10010011
0CBD C6 FCC $C6
0CBE D6 FCC $D6
0CBF E6 FCC $E6
0CC0 F6 FCC $F6
0CC1 4C444420 FCC "LDD "
0CC5 F6 FCC %11110110
;FCC %10010011
0CC6 CC FCC $CC
0CC7 DC FCC $DC
0CC8 EC FCC $EC
0CC9 FC FCC $FC
0CCA 4C445320 FCC "LDS "
0CCE F8 FCC %11111000
;FCC %11011100
0CCF CE FCC $10CE
0CD0 DE FCC $10DE
0CD1 EE FCC $10EE
0CD2 FE FCC $10FE
0CD3 4C445520 FCC "LDU "
0CD7 F6 FCC %11110110
;FCC %10010011
0CD8 CE FCC $CE
0CD9 DE FCC $DE
0CDA EE FCC $EE
0CDB FE FCC $FE
0CDC 4C445820 FCC "LDX "
0CE0 F6 FCC %11110110
;FCC %10010011
0CE1 8E FCC $8E
0CE2 9E FCC $9E
0CE3 AE FCC $AE
0CE4 BE FCC $BE
0CE5 4C445920 FCC "LDY "
0CE9 F8 FCC %11111000
;FCC %11011100
0CEA 8E FCC $108E
0CEB 9E FCC $109E
0CEC AE FCC $10AE
0CED BE FCC $10BE
0CEE 4C454153 FCC "LEAS"
0CF2 24 FCC %00100100
0CF3 32 FCC $32
0CF4 4C454155 FCC "LEAU"
0CF8 24 FCC %00100100
0CF9 33 FCC $33
0CFA 4C454158 FCC "LEAX"
0CFE 24 FCC %00100100
0CFF 30 FCC $30
0D00 4C454159 FCC "LEAY"
0D04 24 FCC %00100100
0D05 31 FCC $31
0D06 4C534C41 FCC "LSLA"
0D0A 02 FCC %00000010
0D0B 48 FCC $48
0D0C 4C534C42 FCC "LSLB"
0D10 02 FCC %00000010
0D11 58 FCC $58
0D12 4C534C20 FCC "LSL "
0D16 74 FCC %01110100
;FCC %10011000
0D17 08 FCC $08
0D18 68 FCC $68
0D19 78 FCC $78
0D1A 4C535241 FCC "LSRA"
0D1E 02 FCC %00000010
0D1F 44 FCC $44
0D20 4C535242 FCC "LSRB"
0D24 02 FCC %00000010
0D25 54 FCC $54
0D26 4C535220 FCC "LSR "
0D2A 74 FCC %01110100
;FCC %10011000
0D2B 04 FCC $04
0D2C 64 FCC $64
0D2D 74 FCC $74
0D2E 4D554C20 FCC "MUL "
0D32 02 FCC %00000010
0D33 3D FCC $3D
0D34 4E454741 FCC "NEGA"
0D38 02 FCC %00000010
0D39 40 FCC $40
0D3A 4E454742 FCC "NEGB"
0D3E 02 FCC %00000010
0D3F 50 FCC $50
0D40 4E454720 FCC "NEG "
0D44 74 FCC %01110100
;FCC %10011000
0D45 00 FCC $00
0D46 60 FCC $60
0D47 70 FCC $70
0D48 4E4F5020 FCC "NOP "
0D4C 02 FCC %00000010
0D4D 12 FCC $12
0D4E 4F524120 FCC "ORA "
0D52 F4 FCC %11110100
;FCC %10010011
0D53 8A FCC $8A
0D54 9A FCC $9A
0D55 AA FCC $AA
0D56 BA FCC $BA
0D57 4F524220 FCC "ORB "
0D5B F4 FCC %11110100
;FCC %10010011
0D5C CA FCC $CA
0D5D DA FCC $DA
0D5E EA FCC $EA
0D5F FA FCC $FA
0D60 4F524343 FCC "ORCC"
0D64 84 FCC %10000100
0D65 1A FCC $1A
0D66 50534853 FCC "PSHS"
0D6A 84 FCC %10000100
0D6B 34 FCC $34
0D6C 50534855 FCC "PSHU"
0D70 84 FCC %10000100
0D71 36 FCC $36
0D72 50554C53 FCC "PULS"
0D76 84 FCC %10000100
0D77 35 FCC $35
0D78 50554C55 FCC "PULU"
0D7C 84 FCC %10000100
0D7D 37 FCC $37
0D7E 524F4C41 FCC "ROLA"
0D82 02 FCC %00000010
0D83 49 FCC $49
0D84 524F4C42 FCC "ROLB"
0D88 02 FCC %00000010
0D89 59 FCC $59
0D8A 524F4C20 FCC "ROL "
0D8E 74 FCC %01110100
;FCC %10011000
0D8F 09 FCC $09
0D90 69 FCC $69
0D91 79 FCC $79
0D92 524F5241 FCC "RORA"
0D96 02 FCC %00000010
0D97 46 FCC $46
0D98 524F5242 FCC "RORB"
0D9C 02 FCC %00000010
0D9D 56 FCC $56
0D9E 524F5220 FCC "ROR "
0DA2 74 FCC %01110100
;FCC %10011000
0DA3 06 FCC $06
0DA4 66 FCC $66
0DA5 76 FCC $76
0DA6 52544920 FCC "RTI "
0DAA 02 FCC %00000010
0DAB 3B FCC $3B
0DAC 52545320 FCC "RTS "
0DB0 02 FCC %00000010
0DB1 39 FCC $39
0DB2 53424341 FCC "SBCA"
0DB6 F4 FCC %11110100
;FCC %10010011
0DB7 82 FCC $82
0DB8 92 FCC $92
0DB9 A2 FCC $A2
0DBA B2 FCC $B2
0DBB 53424342 FCC "SBCB"
0DBF F4 FCC %11110100
;FCC %10010011
0DC0 C2 FCC $C2
0DC1 B2 FCC $B2
0DC2 E2 FCC $E2
0DC3 F2 FCC $F2
0DC4 53455820 FCC "SEX "
0DC8 02 FCC %00000010
0DC9 1D FCC $1D
0DCA 53544120 FCC "STA "
0DCE 74 FCC %01110100
;FCC %10011000
0DCF 97 FCC $97
0DD0 A7 FCC $A7
0DD1 B7 FCC $B7
0DD2 53544220 FCC "STB "
0DD6 74 FCC %01110100
;FCC %10011000
0DD7 D7 FCC $D7
0DD8 E7 FCC $E7
0DD9 F7 FCC $F7
0DDA 53544420 FCC "STD "
0DDE 74 FCC %01110100
;FCC %10011000
0DDF DD FCC $DD
0DE0 ED FCC $ED
0DE1 FD FCC $FD
0DE2 53545320 FCC "STS "
0DE6 76 FCC %01110110
;FCC %11100000
0DE7 DF FCC $10DF
0DE8 EF FCC $10EF
0DE9 FF FCC $10FF
0DEA 53545520 FCC "STU "
0DEE 74 FCC %01110100
;FCC %10011000
0DEF DF FCC $DF
0DF0 EF FCC $EF
0DF1 FF FCC $FF
0DF2 53545820 FCC "STX "
0DF6 74 FCC %01110100
;FCC %10011000
0DF7 9F FCC $9F
0DF8 AF FCC $AF
0DF9 BF FCC $BF
0DFA 53545920 FCC "STY "
0DFE 76 FCC %01110110
;FCC %11100000
0DFF 9F FCC $109F
0E00 AF FCC $10AF
0E01 BF FCC $10BF
0E02 53554241 FCC "SUBA"
0E06 F4 FCC %11110100
;FCC %10010011
0E07 80 FCC $80
0E08 90 FCC $90
0E09 A0 FCC $A0
0E0A B0 FCC $B0
0E0B 53554242 FCC "SUBB"
0E0F F4 FCC %11110100
;FCC %10010011
0E10 C0 FCC $C0
0E11 D0 FCC $D0
0E12 E0 FCC $E0
0E13 F0 FCC $F0
0E14 53554244 FCC "SUBD"
0E18 F6 FCC %11110110
;FCC %10010011
0E19 83 FCC $83
0E1A 93 FCC $93
0E1B A3 FCC $A3
0E1C B3 FCC $B3
0E1D 53574920 FCC "SWI "
0E21 02 FCC %00000010
0E22 3F FCC $3F
0E23 53574932 FCC "SWI2"
0E27 02 FCC %00000010
0E28 3F FCC $103F
0E29 53574933 FCC "SWI3"
0E2D 04 FCC %00000100
0E2E 3F FCC $113F
0E2F 53594E43 FCC "SYNC"
0E33 02 FCC %00000010
0E34 13 FCC $13
0E35 54465220 FCC "TFR "
0E39 84 FCC %10000100
0E3A 1F FCC $1F
0E3B 54535441 FCC "TSTA"
0E3F 02 FCC %00000010
0E40 4D FCC $4D
0E41 54535442 FCC "TSTB"
0E45 02 FCC %00000010
0E46 5D FCC $5D
0E47 54535420 FCC "TST "
0E4B 74 FCC %01110100
;FCC %10011000
0E4C 0D FCC $0D
0E4D 6D FCC $6D
0E4E 7D FCC $7D
0E4F 00 FCB $00 ;fin table INSTTABL
Je posterai les vidéo des premiers test très prochainnement.
Re: Un kit autour du EF6809P
Ouah superbe
C'est d'un très haut niveau, félicitations
C'est d'un très haut niveau, félicitations
Re: Un kit autour du EF6809P
Je ne suis pas parvenu à lire la doc. du site et j'ai pas pu trouver des lecteurs des fichiers DjVu.Daniel a écrit :(...)
Pour trouver des idées, il est peut-être utile de regarder comment font les "professionnels" (mais ce n'est pas une obligation). Ci-dessous le lien vers l'assembleur 6809 écrit par Microsoft pour les ordinateurs Thomson :
http://dcmoto.free.fr/programmes/assemb ... index.html
Donc s'il y a un autre moyen de les lire, merci de me le montrer.
Re: Un kit autour du EF6809P
J'ai un peu lu la doc. et il me parait que le Forth est pour l'assembleur Motorola ce qu'est l'assembleur Linux pour l'assembleur Intel.__sam__ a écrit :(...)
Perso plus que de l 'assembleur, et suite aux sujets de Dominique sur le Forth, je me dit qu'un moniteur Forth serait en soi un sujet très intéressant sur le 6809. Après tout le jupiter ace, a une rom Forth. A noter: une fois le noyau Forth en place, il existe du code Forth qui défini les mnemoniques permettant de faire de l'assembleur 6809 nativement. Cette approche est éloigné de la problématique de siliconal, mais tout autant fascinante! http://www.bradrodriguez.com/papers/6809asm.txt, source: http://www.bradrodriguez.com/papers/6809asmlisting.txt
C'est trop d'informations à acquérir pour quelque chose qui est très différente des syntaxes standard, donc pour le moment, pour mon projet, il vaut mieux éviter.
Re: Un kit autour du EF6809P
Merci, Ce n'est que le début d'une grande aventure avec cette bête entérée prématurément qu'est le 6809.6502man a écrit :C'est d'un très haut niveau, félicitations
-
- Messages : 7987
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Un kit autour du EF6809P
En fait pas trop. L'assembleur défini par ce forth est de syntaxe motorola, mais avec les arguments inversés "comme en forth".siliconal a écrit :J'ai un peu lu la doc. et il me parait que le Forth est pour l'assembleur Motorola ce qu'est l'assembleur Linux pour l'assembleur Intel.
Oui, je n'indiquais ce lien que pour mémoire. Ce n'est pas un must-have, loin de là. Déjà à l'époque l'assembleur 6809 en forth c'était je pense plus pour de l'esbroufe que vraiment un truc utilisé.C'est trop d'informations à acquérir pour quelque chose qui est très différente des syntaxes standard, donc pour le moment, pour mon projet, il vaut mieux éviter.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: Un kit autour du EF6809P
Bonjour,
Voici la vidéo des premiers tests de mon assembleur:
http://www.siliconcept.ma/6809/assmsilic.avi
Le décodage des instructions TFR et EXG n'est pas encore complété, mais toutes les instructions ont pu être assemblé convenablement dans tous les modes d'adressage + adressage indéxé déplacement nul.
Les autres modes d'adressage indéxés ainsi que les instructions TFR et EXG et les sauts seront les prochaines étapes de mon assembleur.
Voici la vidéo des premiers tests de mon assembleur:
http://www.siliconcept.ma/6809/assmsilic.avi
Le décodage des instructions TFR et EXG n'est pas encore complété, mais toutes les instructions ont pu être assemblé convenablement dans tous les modes d'adressage + adressage indéxé déplacement nul.
Les autres modes d'adressage indéxés ainsi que les instructions TFR et EXG et les sauts seront les prochaines étapes de mon assembleur.