⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpc_mon.asm

📁 8051 mp3 very good for using
💻 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 + -