嵌入天地

----->>>>>嵌入式 文学 管理 米国 卡通 以及其他

公益广告:你可知道,看帖回复和评论是一种美德!

另,兄弟姐妹们,假如有技术问题交流,请直接发送到我的信箱!

博客园 首页 新随笔 联系 订阅 管理

 /*************************************************************************************
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)


 

posted on 2009-08-18 12:55  嵌入专栏  阅读(519)  评论(1)    收藏  举报