/*************************************************************************************
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)
浙公网安备 33010602011771号