本文为转载,原文地址为:http://www.cnblogs.com/hpunix/articles/1548776.html

 

在romInit.s中显示简单Shell的代码

 /*************************************************************************************
A~F          : 0x41 ~0x46
a~f          : 0x61 ~0x66
'-'          : 0x2d
'>'          : 0x3e
'!'          : 0x21
' '          : 0x20
':'          : 0x3a
**************************************************************************************/

/*************************************************************************************
MainCmdLoop  : global while cycle
InvalidateCMD: print "Invalidate Command!", and return display "->"
CmdContinue  : return display "->"
**************************************************************************************/

/*************************************************************************************
InvalidateCMD: print "Invalidate Command!", and return display "->"
CmdContinue  : return display "->"
**************************************************************************************/

/*************************************************************************************
Register Define:
r6, r7,r30   : worked as the temp register
r5           : work as the cmd field
r4           : address
r3/r31       : i,j
r8           : data
**************************************************************************************/

FUNC_BEGIN(CmdLoopCycle)
    nop
    nop
CmdLoopInternal:
    READADRB(r5,r7,MPC83XX_URBR1(CCSBAR))
/*>*************************************************************************
* >系统消息分发
**>*************************************************************************/ 
    cmpwi   r5,0x64                                    /* If it's 'd'  */       
    beq     DisPlayoperation
  
    cmpwi   r5,0x6d                                    /* If it's 'd'  */       
    beq     CmdModification

    cmpwi   r5,0xa                                     /* If it's 回车 */
    beq     CmdContinue
                            
    bne     InvalidateCMD                              /* Others symbols, enter into Invalidate

CMD*/

/*>******************************************************************************
* >修改内存内容部分  --- M
**>******************************************************************************/
CmdModification:
    li      r3,0                                    /*  r3 循环计数            */
    li      r4,0                                    /*  r4 代表输入地址,初始化*/
  
 li      r31,0                                 /* 临时变量 */
 li      r30,0                                   /* 临时变量 */  
 
CmdModificationInternal:
    READADRB(r5,r7,MPC83XX_URBR1(CCSBAR))
  
    cmpi    r5,0x0a                                 /* If it's 回车    */       
    beq     CmdDisModification

    cmpi    r5,0x20                                 /* If it's ' '    */        
    beq     CmdModificationInternal
      
/**************************************************************************
*    判断是否为数字(0~9)
***************************************************************************/
ismDigital:  
    cmpi    r5,0x30                                 /* <0             */        
    ble     ismLowerCharDig    
  
    cmpi    r5,0x39                                 /* >9             */        
    bgt     ismLowerCharDig  

    subfic  r5,r5,0x30
    or      r4,r4,r5
    rlwinm  r4,r4,4,0,27
    addi    r3,r3,1

    ba      ismFinished
  
/**************************************************************************
*    判断是否为小写字母(a~f)
***************************************************************************/
ismLowerCharDig:  
    cmpi    r5,0x61                                 /* <'a'           */        
    blt     ismHighCharDig     
  
    cmpi    r5,0x66                                 /* >'f'           */        
    bgt     ismHighCharDig   

    subfic  r5,r5,0x57
    or      r4,r4,r5
    rlwinm  r4,r4,4,0,27
    addi    r3,r3,1

    ba      ismFinished

/**************************************************************************
*    判断是否为大写字母(A~F)
***************************************************************************/
ismHighCharDig:
    cmpi    r5,0x41                                 /* <'A'           */        
    blt     InvalidateCMD     
  
    cmpi    r5,0x46                                 /* >'F'           */        
    bgt     InvalidateCMD  

    subfic  r5,r5,0x37
    or      r4,r4,r5
    rlwinm  r4,r4,4,0,27
    addi    r3,r3,1

/**************************************************************************
*    判断是否为大于8个字符
***************************************************************************/
ismFinished:
    cmpi    r3,0x8
    blt     CmdModificationInternal          

/**************************************************************************
*    显示修改界面
***************************************************************************/                     

                        
CmdDisModification:
    li      r3,0                                   /*  r3 循环计数            */
                                                   /*  r31 dataH, r30 dataL   */
mDisplayDchar:
 add     r4,r3,r4
 lbz     r5,0(r4)
  
    rlwinm  r31,r5,28,28,31
    clrlwi  r30,r5,28
  
    //Hi bits
    cmpi    r31,0x9                                 /* >9             */                
    bgt     isdDisplayCharHi
  
    addi    r31,r31,0x61
    WRITEADRBREG(r6,MPC83XX_UTHR1(CCSBAR),r31)    /* output 'v' */
    ba      isdDisplayLow
  
ismDisplayCharHi:
    addi    r31,r31,0x30
    WRITEADRBREG(r6,MPC83XX_UTHR1(CCSBAR),r31)    /* output 'v' */       

ismDisplayLow:
    //Lo bits
    cmpi    r30,0x9                                 /* >9             */                
    bgt     isdDisplayCharLo
  
    addi    r30,r30,0x61
    WRITEADRBREG(r6,MPC83XX_UTHR1(CCSBAR),r30)    /* output 'v' */
    ba      isdDisplayBreak
  
ismDisplayCharLo:
    addi    r30,r30,0x30
    WRITEADRBREG(r6,MPC83XX_UTHR1(CCSBAR),r30)    /* output 'v' */       

ismDisplayBreak:
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x58)    /* output ':' */

 li      r31,0                                 /* r31用作 J, 先前的值被抹掉        */
 li      r30,0                                   /* r30用作 输出Data, 先前的值被抹掉 */
 
modGetOneByte:
    READADRB(r5,r7,MPC83XX_URBR1(CCSBAR))
  
    cmpi    r5,0x0a                                 /* If it's 回车    */       
    beq     modUpdateOneByte

    cmpi    r5,0x20                                 /* If it's ' '    */        
    beq     modGetOneByte

    cmpi    r5,0x2e                                 /* If it's '.'    */        
    beq     CmdContinue                             /* 跳出修改部分   */

/**************************************************************************
*    判断是否为数字(0~9)
***************************************************************************/
ismuDigital:  
    cmpi    r5,0x30                                 /* <0             */        
    ble     ismuLowerCharDig    
  
    cmpi    r5,0x39                                 /* >9             */        
    bgt     ismuLowerCharDig  

    subfic  r5,r5,0x30                            
    or      r30,r30,r5
    rlwinm  r30,r30,4,0,27
    addi    r31,r31,1

    ba      ismuFinished
  
/**************************************************************************
*    判断是否为小写字母(a~f)
***************************************************************************/
ismuLowerCharDig:  
    cmpi    r5,0x61                                 /* <'a'           */        
    blt     ismuHighCharDig     
  
    cmpi    r5,0x66                                 /* >'f'           */        
    bgt     ismuHighCharDig   

    subfic  r5,r5,0x57
    or      r30,r30,r5
    rlwinm  r30,r30,4,0,27
    addi    r31,r31,1

    ba      ismuFinished

/**************************************************************************
*    判断是否为大写字母(A~F)
***************************************************************************/
ismuHighCharDig:
    cmpi    r5,0x41                                 /* <'A'           */        
    blt     InvalidateCMD     
  
    cmpi    r5,0x46                                 /* >'F'           */        
    bgt     InvalidateCMD  

    subfic  r5,r5,0x37
    or      r30,r30,r5
    rlwinm  r30,r30,4,0,27
    addi    r31,r31,1


ismuFinished:
    addi    r31,r31,1
    cmpi    r31,0x2
    bne     modGetOneByte
/*******************************************************************************
 * 结束字符显示
 *******************************************************************************/
 
/**************************Next modification lines******************************/
modUpdateOneByte:
 add     r6,r4,r3
    stb     r30,0(r6)
  
    addi    r3,r3,1
    cmpi    r3,0x4
    bne     mDisplayDchar
       
    ba      CmdContinue
    nop
    nop

/*>****************************************************************************
* >显示内存内容部分 D
**>****************************************************************************/
DisPlayoperation:
    li      r3,0                                    /*  r3 循环计数            */
    li      r4,0                                    /*  r4 代表输入地址,初始化*/

 li      r31,0                                 /* 临时变量 */
 li      r30,0                                   /* 临时变量 */  

DisPlayopeInternal:
    READADRB(r5,r7,MPC83XX_URBR1(CCSBAR))
  
    cmpi    r5,0x0a                                 /* If it's 回车    */       
    beq     DisplayDisplay

    cmpi    r5,0x20                                 /* If it's ' '    */        
    beq     DisPlayopeInternal
      
/**************************************************************************
*    判断是否为数字(0~9)
***************************************************************************/
isdDigital:  
    cmpi    r5,0x30                                 /* <0             */        
    ble     isdLowerCharDig    
  
    cmpi    r5,0x39                                 /* >9             */        
    bgt     isdLowerCharDig  

    subfic  r5,r5,0x30
    or      r4,r4,r5
    rlwinm  r4,r4,4,0,27
    addi    r3,r3,1

    ba      isdFinished
  
/**************************************************************************
*    判断是否为小写字母(a~f)
***************************************************************************/
isdLowerCharDig:  
    cmpi    r5,0x61                                 /* <'a'           */        
    blt     isdHighCharDig     
  
    cmpi    r5,0x66                                 /* >'f'           */        
    bgt     isdHighCharDig   

    subfic  r5,r5,0x57
    or      r4,r4,r5
    rlwinm  r4,r4,4,0,27
    addi    r3,r3,1

    ba      isdFinished

/**************************************************************************
*    判断是否为大写字母(A~F)
***************************************************************************/
isdHighCharDig:
    cmpi    r5,0x41                                 /* <'A'           */        
    blt     InvalidateCMD     
  
    cmpi    r5,0x46                                 /* >'F'           */        
    bgt     InvalidateCMD  

    subfic  r5,r5,0x37
    or      r4,r4,r5
    rlwinm  r4,r4,4,0,27
    addi    r3,r3,1

/**************************************************************************
*    判断是否为大于8个字符
***************************************************************************/
isdFinished:
    cmpi    r3,0x8
    blt     DisPlayopeInternal          
                      
DisplayDisplay:
    li      r3,0
  
DisplayDchar:
 add     r4,r3,r4
 lbz     r5,0(r4)
  
    rlwinm  r31,r5,28,28,31
    clrlwi  r30,r5,28
  
    //Hi bits
    cmpi    r31,0x9                                 /* >9             */                
    bgt     isdDisplayCharHi
  
    addi    r31,r31,0x61
    WRITEADRBREG(r6,MPC83XX_UTHR1(CCSBAR),r31)   /* output 'v' */
    ba      isdDisplayLow
  
isdDisplayCharHi:
    addi    r31,r31,0x30
    WRITEADRBREG(r6,MPC83XX_UTHR1(CCSBAR),r31)   /* output 'v' */       

isdDisplayLow:
    //Lo bits
    cmpi    r30,0x9                                 /* >9             */                
    bgt     isdDisplayCharLo
  
    addi    r30,r30,0x61
    WRITEADRBREG(r6,MPC83XX_UTHR1(CCSBAR),r30)   /* output 'v' */
    ba      isdDisplayBreak
  
isdDisplayCharLo:
    addi    r30,r30,0x30
    WRITEADRBREG(r6,MPC83XX_UTHR1(CCSBAR),r30)   /* output 'v' */       

isdDisplayBreak:
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x20)   /* output ' ' */

    addi    r3,r3,1
    cmpi    r3,0x10
    bne     DisplayDchar
/*******************************************************************************
 * 结束字符显示
 *******************************************************************************/

    ba  CmdContinue
    nop
    nop   

InvalidateCMD:
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x0a)   /* output 回车 */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x0d)   /* output 换行 */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x49)   /* output 'I' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x6e)   /* output 'n' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x76)   /* output 'v' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x61)   /* output 'a' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x6c)   /* output 'l' */    
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x69)   /* output 'i' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x64)   /* output 'd' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x61)   /* output 'a' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x74)   /* output 't' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x65)   /* output 'e' */    

    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x20)   /* output ' ' */
  
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x43)   /* output 'C' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x6f)   /* output 'o' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x6d)   /* output 'm' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x6d)   /* output 'm' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x61)   /* output 'a' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x6e)   /* output 'n' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x64)   /* output 'd' */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x21)   /* output '!' */
                  
    ba  CmdContinue
    nop
    nop
      
CmdContinue:
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x0a)   /* output 回车 */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x0d)   /* output 换行 */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x2d)   /* output '-'  */
    WRITEADRB(r6,r7,MPC83XX_UTHR1(CCSBAR),0x3e)   /* output '>'  */

    ba  CmdLoopInternal   

    nop
    nop

CmdLoopReturn:            
    blr   
      
FUNC_END(CmdLoopCycle)