📄 mpc_mon.asm
字号:
;--------------------------------------;
; MPC system monitor
monitor:
cli ; Stop interrupts
ldiw Z,m_start*2 ; Display start up message
rcall dp_str ; /
ldiw Z,m_sminfo*2 ; Display SM info
ldiw X,SmSign ;
rcall dp_str ; Mfr=xx
ld r16,X+ ;
rcall dp_byte ; /
rcall dp_str ; Dev=xx
ld r16,X+ ;
rcall dp_byte ; /
sbrc _Err,0 ; if unknown device, error
rjmp sm_err ; /
rcall dp_str ; Size
ld r16,X+ ;
ld r17,X+ ;
ldi r18,3 ;
lsr r17 ;
ror r16 ;
dec r18 ;
brne PC-3 ;
rcall dp_dec1a ;
rcall dp_str ; /
sbrs _Err,1 ; Display format status
rjmp PC+4 ;
ldiw Z,m_unfmt*2 ;
rcall dp_str ; /
rcall clr_page ; Clear variables
mon_loop:
ldiw Z,m_prompt*2 ; Display prompt
rcall dp_str ; /
rcall read_line ; Input command line
ldiw Y,LineBuf ; Load command
ld r19,Y+ ; /
rcall caps
cpi r19,0x0d ; Null line ?
breq mon_loop ; yes, returen
cpi r19,'R' ; Read SM ?
rjeq do_read ; yes, do
cpi r19,'F' ; Fromat ?
rjeq do_format ; yes, do
cpi r19,'D' ; Delete ?
rjeq do_delete ; yes, do
cpi r19,'L' ; Track list ?
rjeq do_list ; yes, do
cpi r19,'P' ; Play Track ?
breq do_play ; yes, do
cpi r19,'M' ; Swap ?
breq do_move ; yes, do
cpi r19,'W' ; Xfer ?
rjeq do_xfer ; yes, do
cmd_err:ldiw Z,m_help*2 ; Syntax error
rcall dp_str ; /
rjmp mon_loop
uf_err: ldi r16,0x0a ; Unformatted
rcall xmit ;
ldiw Z,m_unfmt*2 ;
rcall dp_str ; /
rjmp mon_loop
sm_err: ldiw Z,m_unknown*2 ; Unknown Medium
rcall dp_str ;
rjmp power_off ; /
;--------------------------------------;
; Play Track
do_play:
rcall get_vald ; Get track #
breq cmd_err ; /
lds r18,Tracks
cp r16,r18
brcc mon_loop
rcall ready_play ; Start to play
sei ;
stsi FtmMr,MTMR ; /
sbrc _PbStat,2 ; Wait for user break or EOT
rjmp PC+3 ;
sbis PINB,MOSI ;
rjmp PC-3 ; /
rcall dac_off ; Muting
cbi PORTD,WSEN ; Stop DSP
sbi PORTC,CE ; CE="H"
cli
rjmp mon_loop
;--------------------------------------;
; Change track order
do_move:
sbrc _Err,1 ; Unformatted ?
rjmp uf_err ; yes, error
rcall get_vald ; Get track# for move
rjeq cmd_err ;
mov r1,r16 ; /
rcall get_vald ; Get destination track#
rjeq cmd_err ;
mov r2,r16 ; /
rcall move_track ; Change track order
rjmp mon_loop
;--------------------------------------;
; Track List
do_list:
sbrc _Err,1 ; Unformatted ?
rjmp uf_err ; yes, error
ldiw Z,m_tracks*2 ; Title line
rcall dp_str ; /
ldi _LoopH,0 ; _LoopH = track#
clr r23 ; Clear total time reg.
clr r24 ; /
dl_lp: lds r16,Tracks ; End of TOC ?
cp _LoopH,r16 ; yes, exit
breq dl_tm ; /
ldiw Z,m_crlf*2 ; CRLF
rcall dp_str ; /
mov r16,_LoopH ; Track#
rcall cv_dec ;
rcall dp_byte ;
rcall space ; /
mov r16,_LoopH ; Track Size
rcall get_trkpar ;
rcall dp_size ; /
push _LoopH ; MPEG info
rcall dl_mpi ;
pop _LoopH ; /
mov r16,_LoopH ; ID3 Tag
push _LoopH ;
rcall disp_id3 ;
pop _LoopH ; /
inc _LoopH ; Page#++
rjmp dl_lp ; continue track
dl_tm:
ldiw Z,m_left*2 ; Number of tracks, total time and free space
rcall dp_str ;
lds r16,Tracks ; Tracks
ldi r19,2 ;
rcall dp_dec1 ;
rcall space ; /
rcall get_total ; Total size
rcall dp_size ; /
mov r6,r23 ; Total time
mov _CntL,r24 ;
clr _CntM ;
clr _CntH ;
rcall dp_time ; /
rcall dp_str ;
rcall get_left ; Left size
rcall dp_size ; /
rcall dp_str ;
rjmp mon_loop
dl_mpf:
ldi r17,18 ; Display 18 chars of space
rcall space ;
dec r17 ;
brne PC-2 ;
ret ; /
dl_mpi:
rcall sm_rd_page ; Check MPEG Heder
rcall sm_read ; if not L3, blank
cpi r16,0xff ;
brne dl_mpf ;
rcall sm_read ;
mov r3,r16 ;
andi r16,0xf6 ;
cpi r16,0xf2 ;
brne dl_mpf ; /
rcall sm_read ; Get BR,SR field
push r16 ; /
andi r16,0xf0 ; Get bit rate
swap r16 ;
ldiw Z,t_bri*2 ;
sbrs r3,3 ;
addi r16,16 ;
add ZL,r16 ;
adc ZH,_0 ;
lpm ; /
mov r16,r0 ; Time(sec) = Pages * 512 / BR(kbps) / 125
clr r6 ;
lsl _CntL ;
rol _CntM ;
rol _CntH ;
rcall dldiv ;
ldi r16,125 ;
rcall dldiv ; /
add r23,r6 ; Add to total time.
adc r24,_CntL ; /
rcall dp_time ; Time "MMM:SS"
mov r16,r0 ; BR(kpbs) "####"
ldi r19,4 ;
rcall dp_dec1 ; /
pop r16 ; SR(kHz) "###"
andi r16,0x0c ;
lsr r16 ;
lsr r16 ;
ldiw Z,t_sri*2 ;
sbrs r3,3 ;
addi r16,3 ;
add ZL,r16 ;
adc ZH,_0 ;
lpm ;
mov r16,r0 ;
ldi r19,3 ;
rcall dp_dec1 ; /
rcall sm_read ; CM(channel mode) " $$"
andi r16,0xc0 ;
swap r16 ;
ldiw Z,t_mdi*2 ;
add ZL,r16 ;
adc ZH,_0 ;
rcall dp_str ; /
rcall space ; " "
rjmp space ; /
dldiv: clr r17 ; r17 = _CntX:r6 % r16;
ldi _Loop,32 ; _CntX:r6 /= r16;
lsl r6 ;
rol _CntL ;
rol _CntM ;
rol _CntH ;
rol r17 ;
brcs PC+3 ;
cp r17,r16 ;
brcs PC+3 ;
sub r17,r16 ;
inc r6 ;
dec _Loop ;
brne PC-11 ;
ret
dp_size: ; Display size in "#####K"
mov r16,_CntL ;
mov r17,_CntM ;
mov r18,_CntH ;
lsr r18 ; pages /2 = KB
ror r17 ;
ror r16 ;
ldi r19,5 ;
rcall dp_dec3 ;
ldi r16,'K' ; "K"
rjmp xmit ; /
dp_time: ; Display time in "MMM:SS".
ldi r16,60 ; MM = time / 60, SS = time % 60
rcall dldiv ; /
push r17 ; "MMM"
mov r16,r6 ;
ldi r19,3 ;
rcall dp_dec1 ; /
ldi r16,':' ; ":"
rcall xmit ; /
pop r16 ; "SS"
rcall cv_dec ;
rjmp dp_byte ; /
;--------------------------------------;
; Write a track in sync xfer
do_xfer:
sbrc _Err,1 ; Unformatted ?
rjmp uf_err ; yes, error
lds r16,Tracks ; If track full, exit
cpi r16,NTRK ;
rjcc mon_loop ; /
ldiw Z,m_send*2 ; Display data request message
rcall dp_str ;
sbic PINB,SCK ; Wait until SCK goes low
rjmp PC-1 ; /
rcall xfer_track ; Write a track
sbis PINB,SCK ; Wait until SCK goes high
rjmp PC-1 ; /
rjmp mon_loop
;--------------------------------------;
; Delete track(s)
do_delete:
sbrc _Err,1 ; Unformatted ?
rjmp uf_err ; yes, error
ld r19,Y ; DA command ?
rcall caps ; yes, delete all
cpi r19,'A' ;
brne PC+3 ;
rcall del_alltrk ;
rjmp mon_loop ; /
rcall get_vald ; Get track#
rjeq cmd_err ; /
rcall del_track ; Delete Track
rjmp mon_loop
;--------------------------------------;
; Format a medium
do_format:
ld r19,Y+ ; FM ? if not, error
rcall caps ;
cpi r19,'M' ;
rjne cmd_err ; /
ldi r16,0x0a ; LF
rcall xmit ; /
ldiw Y,Bbt ; Clear BBT
ldi r17,2*NBBT ;
ldi r16,0xff ;
st Y+,r16 ;
dec r17 ;
brne PC-2 ; /
rcall clr_page ; PageX = 0
ldi _Loop,0 ; BB count
ldiw Y,Bbt
df_lp: push _Loop ; Check current block
rcall sm_chk_blk ;
pop _Loop ; /
ldi r16,'_' ;
brcc PC+2 ;
ldi r16,'x' ;
mov r17,r16 ;
rcall xmit ; Show progress indicater
cpi r17,'x' ;
brne PC+7 ;
inc _Loop ; BB number ++
cpi _Loop,NBBT ; If BB number is avobe NBBT,
brcc df_err ; abort format.
rcall get_block ; Store BB into BBT
st Y+,r16 ;
st Y+,r17 ; /
rcall next_block ; Next Block
lds r16,SmPages ; End of SM ?
lds r17,SmPages+1 ; no, continue
cp _PageM,r16 ;
cpc _PageH,r17 ;
brcs df_lp ; /
ldi r16,0xff ; Put end mark
st Y+,r16 ;
st Y+,r16 ; /
push _Loop ;
rcall save_bbt ;
rcall load_toc ;
pop _Loop ;
ldiw Z,m_bbt1*2 ; Show format status
rcall dp_str ;
mov r16,_Loop ;
rcall dp_dec1a ;
rcall dp_str ; /
sbi PORTC,CE ; CE="H"
clr _Err ; Clear error status
rjmp mon_loop
df_err: ldiw Z,m_bbt2*2 ; Show error message
rcall dp_str ;
sbi PORTC,CE ; CE="H"
rjmp mon_loop
;--------------------------------------;
; Read and Display SM page
do_read:
rcall get_valh ; Get page number.
rjcs cmd_err ; /
breq PC+4 ; default is current page
mov _PageL,r16 ;
mov _PageM,r17 ;
mov _PageH,r18 ; /
ldiw Z,m_pghd*2 ; Display page header
rcall dp_str ;
mov r16,_PageH ;
rcall dp_byte ;
mov r16,_PageM ;
rcall dp_byte ;
mov r16,_PageL ;
rcall dp_byte ; /
rcall sm_rd_page ; Read current page
ldi _PgPtL,0 ; Offset address
ldi _PgPtH,0 ; /
ldiw Z,m_crlf*2 ;---- Line loop
rcall dp_str ;
mov r16,_PgPtH ; Lihe Header (offset in the page)
rcall dp_byte ;
mov r16,_PgPtL ;
rcall dp_byte ; /
rcall space ; SP
ldi r17,1 ;
rcall space ;---- Byte loop
rcall sm_read ;
rcall dp_byte ;
add _PgPtL,r17 ;
brhc PC-4 ; /
adc _PgPtH,_0 ;
ldi r16,high(528) ; Continue until end of page (512+16 bytes)
cpi _PgPtL,low(528) ;
cpc _PgPtH,r16 ;
brcs PC-18 ; /
sbi PORTC,CE ; CE="H"
rcall next_page ; Page# ++
rjmp mon_loop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -