📄 mpc_comm.asm
字号:
;--------------------------------------;
; Receive a line from HOST
;
; Call: non
; Ret: LineBuf
read_line:
ldiw Y,LineBuf
ldi r19,0
rl_lp: rcall receive
st Y,r16
cpi r16,0x0d ; CR
brne PC+2
rjmp xmit
cpi r16,0x08 ; BS
brne PC+7
cpi r19,0
breq rl_lp
rcall xmit
sbiw YL,1
dec r19
rjmp rl_lp
cpi r16,' ' ; SP
brcs rl_lp
cpi r19,15
breq rl_lp
rcall xmit
adiw YL,1
inc r19
rjmp rl_lp
caps:
cpi r19,'a' ; CAPS
brcs PC+2 ;
subi r19,0x20 ; /
ret
;--------------------------------------;
; Display ROM string
;
; Call: Z = top of the string
; Ret: Z = next string
dp_str: lpm
adiw ZL,1
tst r0
brne PC+2
ret
mov r16,r0
rcall xmit
rjmp PC-7
;--------------------------------------;
; Display decimal string
;
; Call: r18:r16 = 24bit value for display
; r19 = 0:auto len, 1..:fixed len
; Ret: r1-r2,r16-r20 = broken
dp_dec1a:clr r19
dp_dec1:clr r17
dp_dec2:clr r18
dp_dec3:clr r1
mov r2,r19
inc r1
ldi r19,0 ; r18:r16 /= 10
ldi r20,24 ; r19 = r18:r16 % 10
lsl r16 ;
rol r17 ;
rol r18 ; 算法 高位有十的倍数-10
rol r19
;
cpi r19,10 ; r19存余数 在r16中存结果
brcs PC+3 ;
subi r19,10 ;
ori r16,1 ;
dec r20 ;
brne PC-9 ; /循环 余数*2 +低位 结果*2
addi r19,'0'
push r19 ;堆栈中存数
mov r20,r16
or r20,r17
or r20,r18 ;直到r18:r16=0
brne PC-18
cp r1,r2 ; Adjust length
brcc PC+5 ;
inc r1 ;
ldi r16,' ' ;
push r16 ;
rjmp PC-5 ; /
pop r16 ; Transmit string
rcall xmit ;
dec r1 ;
brne PC-3 ; /
ret
;--------------------------------------;
; Display HEX string
;
; Call: r16 = byte data for display
; Ret: r16 = broken
dp_byte:
swap r16
rcall PC+2
swap r16
push r16
andi r16,0x0f
cpi r16,10
brcs PC+2
subi r16,-7 ;加7是为了调正ACSELL码吗?
subi r16,-0x30
rcall xmit
pop r16
ret
;--------------------------------------;
; Get hexdecimal value
;
; Call: Y = string pointer
; Ret: Y = updated
; C=1: error
; Z=1: eol, val=0
; else: r18:r16 = 24bit value
get_valh:
clr r18
clr r17
clr r16
ld r19,Y+
cpi r19,' '
brcs gv_n
breq PC-3
rjmp PC+2
gv_l: ld r19,Y+
rcall caps
cpi r19,' '+1
brcs gv_e
subi r19,'0'
brcs gv_x
cpi r19,10
brcs PC+4 ;?error brcc
subi r19,7
cpi r19,10
brcs gv_x
cpi r19,16
brcc gv_x
swap r19
ori r19,0x0f
lsl r19
rol r16
rol r17
rol r18
cpi r19,0xf0
brne PC-5
rjmp gv_l
gv_x: sec
sez
ret
gv_e: sbiw YL,1
clc
clz
ret
gv_n: sbiw YL,1
clc
sez
ret
;--------------------------------------;
; Get decimal value
;
; Call: Y = string pointer
; Ret: Y = updated
; C=1: error
; Z=1: eol, val=0
; else: r16 = 8bit value
get_vald:
clr r16
ld r19,Y+
cpi r19,' '
brcs gv_n
breq PC-3
rjmp PC+2
gvd_l: ld r19,Y+
cpi r19,' '+1
brcs gv_e
subi r19,'0'
brcs gv_x
cpi r19,10
brcc gv_x
lsl r16
mov r17,r16
lsl r16
lsl r16
add r16,r17
add r16,r19
rjmp gvd_l
;--------------------------------------;
; Convert a byte value into packed decimal
;
; Call: r16 = value for converted
; Ret: r16 = packed decimal value
cv_dec:
push r17
ldi r17,-0x10
subi r17,-0x10
subi r16,10
brcc PC-2
subi r16,-10
add r16,r17
pop r17
ret
;--------------------------------------;
; Diaplay a space
space:
ldi r16,' '
; must be followed by transmit routine
;--------------------------------------;
; Software UART using ISP cable
.equ BPS = 33 ; 38.4kbps @4MHz
xmit: ; Transmit r16.
push r16
push r17
push r18
in _SrgTmp2,SREG ; Stop Interupts
cli ; /
com r16 ;
sec ; Start bit
ldi r18,10 ; bit count
ldi r17,BPS-1 ; Wait for full bit time
dec r17 ;
brne PC-1 ; /
brcs PC+2 ; MISO = bit for send
cbi PORTB,MISO ;
brcc PC+2 ;
sbi PORTB,MISO ; /
lsr r16 ; next bit
dec r18 ; All sent ?
brne PC-9 ; no, coutinue
out SREG,_SrgTmp2 ; Restart Intrerupts
pop r18
pop r17
pop r16
ret
receive:; Receive into r16.
push r17
ldi r16,0x80 ; Shift register for receive
sbic PINB,MOSI ; Wait for rise edge of MOSI
rjmp PC-1 ;
sbis PINB,MOSI ;
rjmp PC-1 ; /
ldi r17,BPS/2 ; Wait for half bit time
dec r17 ;
brne PC-1 ; /
ldi r17,BPS ; Wait for full bit time
dec r17 ;
brne PC-1 ; /
lsr r16 ; Next bit
sbis PINB,MOSI ; Read MOSI into r16.7
ori r16,0x80 ; /
brcc PC-6 ; All bits received? no, continue
pop r17 ; yes, end
ret ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -