📄 cdpaul.txt
字号:
CALL LCD_DELAY
MOV DPTR,#LMESS7 ; Close
MOV A,#1
CALL LCD_PRINT
MOV DPTR,#LMESS8 ;
MOV A,#2
CALL LCD_PRINT
acall do_packet_cmd
mov packet_cmd,#11011b
mov packet_4,#03h
mov packet_8,#00h
acall send_packet
jmp Reading_CD
Open_Tray:
MOV R5,#10
CALL LCD_DELAY
MOV DPTR,#LMESS11 ; Open
MOV A,#1
CALL LCD_PRINT
MOV DPTR,#LMESS12 ; Wait....
MOV A,#2
CALL LCD_PRINT
acall do_packet_cmd
mov packet_cmd,#11011b
mov packet_4,#02h
mov packet_8,#00h
acall send_packet
mov next_track,#1
jmp wait_for_ready_state
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; read sub channel cmd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
read_subchan_cmd:
mov a,#0ffh ;set byte counter register
acall set_cyl_low_register ;(set it to full on.. it doesn't matter coz
acall set_cyl_high_register ;DRQ controls the feed)
acall do_packet_cmd
mov packet_cmd,#42h
mov packet_1,#00000010b ;MSF=1
mov packet_2,#01000000b ;SubQ=1
mov packet_3,#01h ;format=01 (current position)
mov packet_7,#0ffh ;allocation length
mov packet_8,#0ffh ;(set it to full on)
acall send_packet
jb STATUS_REG_ERR,read_subchan_cmd_e
jb STATUS_REG_DRQ,read_subchan_cmd_r
ret
read_subchan_cmd_e:
mov audio_status,#0ffh
ret
;
;read sub-channel header
;
read_subchan_cmd_r:
acall get_data ;get audio status
mov audio_status,b
acall get_data ;sub channel data length (will be zero).. ignore
acall get_data ;format code, ADR, cntl (ignore)
acall get_data
mov current_track,a
read_cmd:
cjne a,end_track,calc_next_track_1
sjmp calc_next_track_2
calc_next_track_1:
jc calc_next_track_2
mov a,start_track
calc_next_track_2:
mov next_track,a
; MOV R5,#10
; CALL LCD_DELAY
; MOV DPTR,#LMESS13 ; Playing Track
; MOV A,#1
; CALL LCD_PRINT
mov a,current_track
MOV POSITION,#14
CALL SHOW_DIG1
; skip absolute address pos
acall get_MSF_field
; CALL LCD_PRINT
MOV A,#0C0H
CALL WCOM
; acall lcd_home2
acall get_MSF_field
acall print_MSF_field_lcd
acall skip_rest_of_packet
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Table of Contents command
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
read_toc_cmd:
CALL CLR_SCREEN
; MOV R5,#10
; CALL LCD_DELAY
; MOV DPTR,#LMESS15 ; Reading TOC
; MOV A,#1
; CALL LCD_PRINT
mov a,#0ffh ;set byte counter register
acall set_cyl_low_register ;(set it to full on.. it doesn't matter coz
acall set_cyl_high_register ;DRQ controls the feed)
acall do_packet_cmd
mov packet_cmd,#43h
mov packet_1,#00000010b ;MSF=1
mov packet_7,#0ffh ;allocation length
mov packet_8,#0ffh ;(again, set it to full on)
acall send_packet
jb STATUS_REG_ERR,read_toc_cmd_e
jb STATUS_REG_DRQ,read_toc_cmd_r
setb c
ret
read_toc_cmd_e:
clr c
ret
; read header
;
read_toc_cmd_r:
acall get_data ;data length
acall get_data ;get track limits
mov start_track,a
mov end_track,b
MOV R5,#10
CALL LCD_DELAY
MOV DPTR,#LMESS14 ; Track Range
MOV A,#1
CALL LCD_PRINT
MOV DPTR,#LMESS14A ; Total Time
MOV A,#2
CALL LCD_PRINT
mov a,start_track
MOV POSITION,#11
CALL SHOW_DIG1
mov a,end_track
MOV POSITION,#14
CALL SHOW_DIG1
MOV a,end_track ;
inc a ; Save Last Track & Plus One
mov over_track,a ;
;
; read track descriptors
;
read_toc_cmd_l2:
acall get_data ;skip ADR and control fields
acall get_data ;get track number
mov toc_track,a
acall get_MSF_field
;
mov a,toc_m ; Display Total Min
MOV POSITION,#11
CALL SHOW_DIG2
mov a,toc_S ; Display Total Sec
MOV POSITION,#14
CALL SHOW_DIG2
; if start track, then record start position
;
mov a,toc_track
cjne a,start_track,read_toc_cmd_i0
mov start_M,toc_M
mov start_S,toc_S
mov start_F,toc_F
read_toc_cmd_i0:
;if the last track, then record as end position
;
cjne a,#0aah,read_toc_cmd_i1
mov end_M,toc_M
mov end_S,toc_S
mov end_F,toc_F
read_toc_cmd_i1:
;if next track, then record next position
;
cjne a,next_track,read_toc_cmd_i2
mov next_M,toc_M
mov next_S,toc_S
mov next_F,toc_F
read_toc_cmd_i2:
acall bsy_wait
jb STATUS_REG_DRQ,read_toc_cmd_l2
setb c
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; stop/play command
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
stop_play_cmd:
acall do_packet_cmd
mov packet_cmd,#4eh
acall send_packet
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; play MSF cd cmd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
play_entire_cd_cmd:
; call CLR_SCREEN
MOV R5,#10
CALL LCD_DELAY
MOV DPTR,#LMESS13 ; Playing Track
MOV A,#1
CALL LCD_PRINT
mov a,next_track
MOV POSITION,#14
CALL SHOW_DIG1
MOV DPTR,#LMESS5 ; Time
MOV A,#2
CALL LCD_PRINT
acall do_packet_cmd
mov packet_cmd,#47h
mov packet_3,start_M
mov packet_4,start_S
mov packet_5,start_F
mov packet_6,end_M
mov packet_7,end_S
mov packet_8,end_F
acall send_packet
jnb STATUS_REG_ERR,play_audio_cmd_d
clr c
ret
play_audio_cmd_d:
setb c
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; program entry point
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start:
mov sp,#STACK_START
CLR LCD_EN
mov next_track,#1
mov toc_M_next,#0
mov toc_S_next,#0
mov toc_F_next,#0
acall set_LCD ; Init & Set LCD to 4bit
start_over:
acall init_ata_device
acall identify_packet_device
mov r5,#1
acall delay
main_loop:
acall wait_for_ready_state
acall read_toc_cmd
jnc main_loop
play_cd:
jnb PLAY_KEY,main_play
jnb EJECT_Key,unload_cd
jmp play_cd
main_play:
CALL CLR_SCREEN
acall play_entire_cd_cmd ;orignal play cd
jnc main_loop
mov r5,#1
acall delay
play_loop:
acall read_subchan_cmd
mov a,audio_status
cjne a,#11h,play_stopped ;if at end then loop
mov a,toc_M
cjne a,toc_M_next,play_loop_end_cmp
mov a,toc_S
cjne a,toc_S_next,play_loop_end_cmp
mov a,toc_F
cjne a,toc_F_next,play_loop_end_cmp
sjmp play_stopped
play_loop_end_cmp:
mov toc_M_next,toc_M
mov toc_S_next,toc_S
mov toc_F_next,toc_F
acall delay_100000us
;
jnb NEXT_TRK,play_next_track ;
jnb EJECT_Key,unload_cd ;
jnb Pause_key,Pause_cd
jnb STOP_KEY,stop_cd
jnb PREVIOUS_TRK,play_previous_track ;
sjmp play_loop
stop_cd:
acall stop_play_cmd
mov next_track,#1
sjmp main_loop
play_stopped:
mov next_track,#1
sjmp play_normal
play_previous_track:
mov a,next_track
dec a
cjne a,#0,play_track_a
mov next_track,end_track
sjmp play_normal
play_normal:
acall stop_play_cmd
acall read_toc_cmd
jnc main_loop
mov start_M,next_M
mov start_S,next_S
mov start_F,next_F
sjmp main_play
play_track_a:
mov next_track,a
sjmp play_normal
play_next_track:
mov a,next_track
inc a
cjne a,over_track,play_track_a
mov next_track,#1
sjmp play_normal
unload_cd:
acall stop_play_cmd
MOV R5,#10
CALL LCD_DELAY
MOV DPTR,#LMESS11 ; Open Door
MOV A,#1
CALL LCD_PRINT
MOV DPTR,#LMESS12 ; Wait....
MOV A,#2
CALL LCD_PRINT
acall do_packet_cmd
mov packet_cmd,#11011b
mov packet_4,#02h
acall send_packet
mov next_track,#1
jmp main_loop
Pause_cd:
mov r5,#10
CALL LCD_DELAY
MOV DPTR,#LMESS13A ; Pause CD
MOV A,#1
CALL LCD_PRINT
mov a,next_track
MOV POSITION,#12
CALL SHOW_DIG1
acall do_packet_cmd
mov packet_cmd,#4bh
mov packet_8,#00h
acall send_packet
acall delay_100000us
acall delay_100000us
acall delay_100000us
Pause_Loop:
jnb Stop_Key,Stop_cd
jnb Pause_key,resume_cd
jnb Eject_key,unload_cd
acall delay_100000us
jmp Pause_loop
Resume_cd:
mov r5,#10
CALL LCD_DELAY
MOV DPTR,#LMESS13 ; Playing Track
MOV A,#1
CALL LCD_PRINT
acall delay_100000us
acall delay_100000us
acall delay_100000us
acall do_packet_cmd
mov packet_cmd,#4bh
mov packet_8,#01h
acall send_packet
jmp Play_loop_end_cmp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; mode sense cmd;CD-ROM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mode_sense_cmd:
mov a,#16h ;set byte counter register
call set_cyl_low_register ;= 16 bytes
call set_cyl_high_register ;
call do_packet_cmd
mov packet_cmd,#5ah
mov packet_1,#00H ;
mov packet_2,#01H ;PC and page Code
mov packet_7,#0ffh ;allocation length
mov packet_8,#0ffh ;allocation length
call send_packet
jb STATUS_REG_DRQ,mode_sense_cmd_r
mode_sense_cmd_e:
jmp mode_sense_cmd
ret
mode_sense_cmd_r:
call get_data ;mode Data length
call get_data ;Medium Type
mov mediatype,a
call skip_rest_of_packet
ret
; 0123456789012345
LMESS1: DB " CD-Rom Player ",0
LMESS2: DB " Version 5.1 ",0
;
LMESS3: DB "Initing ",0
LMESS4: DB " ",0
;
LMESS5: DB "Time ",0
;
LMESS6: DB " Identifying ",0
;
LMESS7: DB " Close Door ",0
LMESS8: DB " Waiting... ",0
;
LMESS9: DB " Reading CD ",0
LMESS10: DB " Waiting... ",0
;
LMESS11: DB " Open Door ",0
LMESS12: DB " Waiting... ",0
;
LMESS13: DB "Playing Track ",0
;
LMESS13A: DB "Pause Track ",0
;
LMESS14: DB "TrackRange - ",0
LMESS14A: Db "Total Time : ",0
;
LMESS15: DB "Reading TOC ",0
;
LMESS16: DB " Please Insert ",0
LMESS17: DB " Audio CD ",0
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -