# asmTMS-mode.tcl - mode for editing asmTMS code
# 
# modif :
# 07/09/95 (Maurice DIAMANTINI diam@ensta.fr) : création
# 05/02/97 (diam) refonte
# 18/02/97 (diam) : complement mots clés, ...(merci Philippe OZANSKI)
# 
###########################################################################

# stead:setDefault -- initialise une variable inexistante
# 
# SERA DEPLACER DANS LA LIBRAIRIE staed ou xtcl, ...
# 
proc stead:setDefault {varName value} {
   upvar #0 $varName var
   if {![info exists var]} {set var $value}
}

if {"x[info proc asmTMS_InitColors]" == "x"} {
  proc asmTMS_InitColors {} {
     global stead 
     
     # On peut personnaliser les couleur dans le fichier steadrc par
     # set stead(asmTMS,color,commentaire) green1
     stead:setDefault stead($stead(mode),color,instructions)   blue
     stead:setDefault stead($stead(mode),color,inst_config)    #00A
     stead:setDefault stead($stead(mode),color,branchement)    red
     stead:setDefault stead($stead(mode),color,label)          red
     stead:setDefault stead($stead(mode),color,directive)      DarkViolet
     stead:setDefault stead($stead(mode),color,registres)      DarkViolet
     stead:setDefault stead($stead(mode),color,numbHexPat)     #700
     stead:setDefault stead($stead(mode),color,commentaire)    green4
  
  }
}


proc asmTMSMain {} {

   global stead
   global EDITPREFS FILENAME
   global TE_MODE_SEARCH_STRING TE_MODE_NAVIG_SHOW_TEXT

###########################################################################
# rajout perso
# #    global couleur
   asmTMS_InitColors
# #    parray couleur
###########################################################################

   if [info exists FILENAME] {
       set stead(fileToCompile) $FILENAME
   } else {
       set stead(fileToCompile) ""
   }

   
   # Quelques préférences globales :
   set EDITPREFS(autobreak)     0
   set EDITPREFS(autoindent)    1          ;# Force l'auto indent
   set EDITPREFS(fillcolumn)    73    
   set EDITPREFS(textwidth)     77    
   
   # define the prefix for c mode
   set EDITPREFS(prefix) "; "
   
   # cette variable contient une liste de fichiers à éditer dans ce mode
   if ![info exists stead(modeASMTMS,sampleFiles)] {
       set stead(modeASMTMS,sampleFiles) {
          /insert/here/you/favorite/list/of
          /sourceFiles/modeles
          see_file_asmTMS-mode.tcl_in_stead_library
       }
   }
  
   # chaine de recherche (utilisé pour le générer le menu de navigation) :
   set t1 "\n\[-A-Za-z0-9_/\]+"
   set TE_MODE_SEARCH_STRING $t1
   
   set TE_MODE_NAVIG_SHOW_TEXT "labels" ;# nom de menu de navigation

   ########################################################################
   # Gestion des couleurs
   ########################################################################
   
   ########################################################################
   # La colorisation s'obtient en spécifiant globalement ce qu'on souhaite 
   # colorier par la définition d'une variable globale 
   # stead($stead(mode),colorSpec) qui contiendra une association entre 
   # une patterne, son type (simple pour un pattern reconnaissable sur une 
   # ligne, complexe pour un pattern reconnaissable sur plusieurs lignes), 
   # son nom symbolique, et enfin sa couleur.
   
   set stead($stead(mode),colorSpec) {}
   
   # Morceau de patterne définissant un séparateur de mots clés
   set stead(wordSeparatorPat) {[^a-zA-Z0-9_/\.]}
   set stead(wordPat)          {[a-zA-Z0-9_/\.]+}
   
   # Cette patternes représente un ou plusieurs espaces ou tabulations
   set ws "\[ \t,\]+"  ;#  write spaces 
   

   # Colorisation des instruction courantes :    
   set instructions {
     abs add add[chkst] adlk and andk cmpl lac lac[kt] lalk neg norm or
     ork ro[lr] sac sac[hl] sblk sf[lr] sub sub[bchkst] xor xork zac
     zal[hrs] adrk cmpr [lms]ar lark lrlk sbrk apac lph lt
     lt[adps] mac macd mpy mpy[aksu] pac spac sp[hl] sqr[as] 
   }
   set instrucPat [Regexp_DefinePatternFromList $stead(wordSeparatorPat) \
          $instructions]
   lappend stead($stead(mode),colorSpec) \
            [list simple  instruction   $instrucPat  \
            "-foreground $stead($stead(mode),color,instructions)" ] 
   

   # Colorisation des instructions speciales et de configuration du TMS320 :    
   set inst_config {
     bit bitt conf dint eint idle lst lst1 pop popd pshd push rc rhm
     rovm rpt rptk rsxm rtc sc shm sovm sst sst1 ssxm stc blk[dp] dmov
     fort in out [rs]fsm [rs]txm [rs]xf tbl[rw] spm larp ldpk ldp
   }
   set inst_configPat [Regexp_DefinePatternFromList \
          $stead(wordSeparatorPat) $inst_config]
   lappend stead($stead(mode),colorSpec) \
          [list simple  inst_config   $inst_configPat  \
          "-foreground $stead($stead(mode),color,inst_config)" ] 
   
   
   # Une directive est une instruction commencant par un "."
   set directive          {\\.[a-zA-Z0-9_/\.]+}
   set directivePat [Regexp_DefinePatternFromList \
          $stead(wordSeparatorPat) $directive]
   lappend stead($stead(mode),colorSpec) \
      [list simple  directive   $directivePat \
       "-foreground $stead($stead(mode),color,directive)" ] 
   

   # Colorisation des instruction de branchement et de ruptures 
   # de programmes :

   set branchement {
     B BANZ BGZ BGEZ BACC BBNZ BBZ B[CVZ] BN[CVZ] BIOZ BLZ call cala
     ret 
   }
   set branchPat [Regexp_DefinePatternFromList \
          $stead(wordSeparatorPat) $branchement]
   lappend stead($stead(mode),colorSpec) \
         [list simple  branchement   $branchPat  \
         "-foreground $stead([set stead(mode)],color,branchement)" ] 
   
   # Colorisation des labels : doit etre colorié apres les instructions
   set labelPat "(^\[-\A-Za-z0-9_/\]+)\[ \t\]*:*"  
   set labelPat "(^\[-\A-Za-z0-9_/\]+)"  
   lappend stead($stead(mode),colorSpec)  [list    \
               simple  \
               label   \
               $labelPat  \
               "-foreground $stead([set stead(mode)],color,label)" \
   ]   

   # Les nombres (hexa et décimaux)
   set numbHexPat "$ws-?(\[0-9\]\[0-9a-fA-F\]*h|\[0-9\]+)($ws|$)"
   lappend stead($stead(mode),colorSpec) \
         [list simple  numberHexa   $numbHexPat  \
         "-foreground $stead($stead(mode),color,numbHexPat)" ]   
   
   # Colorisation des registres ARi 
   set registres {
     AR[0-9]+
   }
   set registresPat [Regexp_DefinePatternFromList  \
          $stead(wordSeparatorPat) $registres]
   lappend stead($stead(mode),colorSpec) \
          [list simple  registres   $registresPat  \
          "-foreground $stead($stead(mode),color,registres)" ]   

   
   # Colorisation des commentaires
   # Un commentaire est une instruction commencant par "#"  
   # une instruction se termine par <return> ou ";" 
   set t1 {^\*.*}  ;# commentaire"*" en début du fichier
   set t2 ";.*"  ;# commentaire précédé par <return>
   set commentPat ($t1)|($t2) 
   lappend stead($stead(mode),colorSpec) \
           [list simple  comment  $commentPat  \
           "-foreground $stead($stead(mode),color,commentaire)" ]   
   
   asmTMSDefineAlias
   asmTMSBuildMenus

   # # # # # PAS PROPRE, MAIS PROVISOIRE (:-))) 
   # # # # set file [file join $stead(userlib) $stead(mode)-mode-user.tcl]
   # # # # if [file isfile $file] {
   # # # #     xtcl_source $file
   # # # # }
   
} ;# endproc asmTMSMain


########################################################################
# Cette procédure recolorise l'ensemble du fichier
proc refresh_colors {} {
   
   global stead
   # On commence par effacer les couleur existantes
   cancel_colors
   # on colorise l'ecran...
   te:cmd:coloriseStruct  -nocase .main.t $stead($stead(mode),colorSpec) screen
   # On colorise tout le fichier...
   te:cmd:coloriseStruct  -nocase .main.t $stead($stead(mode),colorSpec) all
   
} ;# endproc refresh_colors


########################################################################
# Cette procédure supprime les couleurs
proc cancel_colors {} {
   global stead
   foreach pat $stead($stead(mode),colorSpec) {
      te:colours:clear_foregroundStruct .main.t all [lindex $pat 1]
   }
} ;# endproc cancel_colors

########################################################################
# la procedure suivante permet de colorier la ligne précérente apres 
# chaque appuie sur return.
# 
proc stead:returnkey_post_hook {{text .main.t}} {
    global stead
    te:cmd:coloriseStruct -nocase $text $stead($stead(mode),colorSpec) previousLine
     
}
########################################################################
# la procedure suivante permet de colorier la ligne courante a chaque
# appuie sur espace.
proc stead:spacebar_post_hook {{text .main.t}} {
    global stead
    te:cmd:coloriseStruct -nocase $text $stead($stead(mode),colorSpec) currentLine 
}
########################################################################

##############################################################################
#  what is executed after the file is read (colorization)
proc stead:read_post_hook {filename text} {
   .main.t yview 1.0
   refresh_colors
}
###########################################################################
# aide sur le mode ASMTMS :
###########################################################################

proc asmTMS_GetHelp {} {
  set help {
    aide du mode asmTMS :
    
    Les electric alias sont des raccourcis qu'on peut lancer en tapant 
    l'abbreviation suivie de <Meta-Space>
    La liste complète de ces abbréviation est définie dans le sous-menu 
    "alias" du menu Template.
    
    Quelques exemples d'alias prédéfinis :
      clean          "clean: ... /bin/rm *.o"
    
    Le menu "Template" propose quelques macros prédéfinies. Vous pouvez
    en rajouter d'autres dans le fichier de mode utilisateur (voir menu
    "Help/xxx") 
    
    
    Le menu "Labels" permet d'accéder rapidement au etiquettes  
    du fichier.
    
    raccourci clavier      résultat
    ^^^^^^^^^^^^^^^^^      ^^^^^^^^
    <meta-1>               insertion d'un séparateur "*****..."
    <Control-c>            refrechit les couleurs
    
  }
  return $help
}

########################################################################
# asmTMSDefineAlias --
# Aliases for ASMTMS mode
# 
proc asmTMSDefineAlias {} {

   global stead 
   
   # # # # globale pour simplifier l'ecriture des electric-alias :
   # # # upvar #0  EA_8bit_mark   M ;# Marque la position du point d'insertion
   # # # upvar #0  EA_8bit_begin  B ;# début de postcommande 
   # # # upvar #0  EA_8bit_end    E ;# fin de postcommande
   # # # upvar #0  EA_8bit_var    V ;# Inclusion d'une variable TCL dans l'alias
   
   # Pour simplifier l'écriture des electricAlias : on déclare
   # les variables M, B, E et V au niveau local pour 
   # 
   #      M :  Marque temporaire
   #      B :  début de postcommande 
   #      E :  fin de postcommande
   #      V :  Inclusion d'une variable TCL
   # 
   electricAlias-use8bitsCars


   electricAlias-def ${M}$stead(mode) ${M}$stead(mode) ${M}$stead(mode)
   
   electricAlias-var $stead(mode) bb "\{" ;# Begin Bloc
   electricAlias-var $stead(mode) eb "\}" ;# End Bloc
   electricAlias-def ${M}$stead(mode) \{  "$V{bb}\n${B}i${E}$M\n$V{eb}$M"
   electricAlias-def ${M}$stead(mode) do  \
        "do $V{bb}\n${B}i${E}$M\n$V{eb} while ($M);$M"
  
   electricAlias-def ${M}$stead(mode) clean  "clean:\n\t/bin/rm *.o"

}
######################################################################
# define the asmTMS menu:
proc asmTMSBuildMenus {} {
global stead 

  te:mode:make_menu $stead(mode)
  
  
  .menu.$stead(mode).m add command -label {Refresh Colors} \
     -command {refresh_colors} \
     -accelerator {<Control-c>}
  .menu.$stead(mode).m add command -label {Cancel Colors} \
     -command {cancel_colors}
  .menu.$stead(mode).m add separator

  .menu.$stead(mode).m add separator
  .menu.$stead(mode).m add command -label "Aide du mode $stead(mode)"  \
     -command {stead -r 1 -text [asmTMS_GetHelp] }  
  
  # Edition des fichier d'exemple
  .menu.$stead(mode).m add cascade -label {Files sample}  \
     -menu ".menu.$stead(mode).m.files"
  menu .menu.$stead(mode).m.files
  # foreach {file} $stead(modeASMTMS,sampleFiles) {
  #    .menu.$stead(mode).m.files add command -label $file \
  #       -command "exec $stead(exe) $file &"
  # } ;# endforeach



  ###########################################################################
  # Création et remplissage de menu template
  ###########################################################################
  
  te:mode:make_menu {templates}
  
  #####################################################################
  # Remplissage de menu template
  #####################################################################
  
  .menu.templates.m add command \
         -label "Insérer un separateur" \
         -command {separator 1}
         
  .menu.templates.m add separator
  
  .menu.templates.m add command \
          -label {clean macro} \
          -command {electricAlias-wrap clean}
  
  .menu.templates.m add separator
                                  
  
  .menu.templates.m add cascade \
          -label Alias \
          -menu .menu.templates.m.alias
  menu .menu.templates.m.alias
  foreach alias [electricAlias-softNames] {
     .menu.templates.m.alias add command -label $alias \
     -command "electricAlias-insert $stead(text) [te:no_interp $alias]"
  }
}

###########################################################################
# proc separator {{NbLines 1}}
# Insère "Nblines" lignes (défaut : 1) correspondant au separateur 
# souhaité ;
# Cette procédure est automatiquement liée à <Meta-1>
#
proc separator {{NbLines 1} } {
   
   insert_fill_lines ";" $NbLines 

} ;# endproc separator

# ###########################################################################
# # tri des procedures pour la navigation par ordre alphabetique
# #
# proc te:mode:navig_sort_hook {l} {
#   return [lsort -command te:mode:sort_command $l]
# }
# 
###########################################################################

######################################################################
# cleanup for asmTMS mode
######################################################################

proc stead:modeCleanup {} {
  global stead
  te:mode:destroy_menu $stead(mode)
  te:mode:destroy_menu templates
}


asmTMSMain

# ./


