。对于经常调用的过程,通常都用汇编语言编写,例如:从IDE接口寄存器中的读写(Read-Data-Reg,Write-Data-Reg,Read-Status-Reg,Write-CMD-pkt,Write-Task-Ide)等。而针对ATAPI的大多命令,都用C51编写,例如:mode-select(),read-10(ad),write-10(ad),tray-out(),send-cue-sheet()等。
部分执行程序的示例如下:
IDE接口地址定义部分 ;;IDE Interface Address
例如:IDE_STATUS EQU 81F7H
……
_Read_Status_Reg: ;;读IDE驱动器设备状态子程序
lcall _Drive_Select;选择光驱
……
mov p1,#IDE_Lmode
mov DPTR,#IDE_STATUS
movx @DPTR,a ;DIOR valid
……
mov p1,#Sram64_Lmode
movx A,@DPTR
mov R7,A ;返回状态到r7寄存器
ret
Write_Cmd_Pkt: nop ;写6字命令包子程序
;写6字事先已存入内空间
cmd_buffer
mov R0,#cmd_buffer
mov R1,#06H ;//6 words to write
send_pkt:
mov A,@R0
mov pl,#Sram64_Lmode
mov DPTR,#IDE_DATA_REG
movx @DPTR,A ;//write low byte
inc R0
;//类似的写高字节到16位SRAM
……
;再将16bit从16位SRAM中一次写入IDE设备
mov pl,#IDE_WMode ;select IDE device
mov DPTR,#IDE_DATA_REG
;//16bit packet command write
movx a,@DPTR ;DIOW valid
……
inc R0
djnz R1,send_pkt
ret
void send_cue_sh(USI par_len)
{//ATAPI CD-WO Command,10字节 //命令字节初始化设备
……
do {
status=Read_Status_Reg(drv);
}while(status0x80); //不忙时才可写入
nonDMA_xfer_data 1(); //non DMA(PIO模式)
P1=SRAM32;
status=Read_Status_Reg(drv); //读取返回的状态
if(status0x01) {
rqsense(); //ATAPI Command
}
}/*End of send_cue_sh */
基于非IDE专用接口芯片的自主型光盘复制机是对目前光盘复制市场的有益补充。其设计要求有较高的单片机、DMA传输以及CPLD等硬件知识和对CD、CDWO格式以及对ATAPI整个命令的了解。
|