📄 final_target.a51
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; onhold version 0 (A Simple 8051 based ATAPI CDROM audio controller); Copyright (C) 2000 Jason Nunn <jsno@downunder.net.au>; August 2000;; This software comes under the GNU public license agreement. See the COPYING; file in this distribution.;; If you use this code (or parts) of it, then please credit me.;; This program is free software; you can redistribute it and/or modify; it under the terms of the GNU General Public License as published by; the Free Software Foundation; either version 2 of the License, or; (at your option) any later version.;; This program is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; Snail: 32 Rothdale Rd; Moil NT 0810; Australia;; WWW: jsno.downunder.net.au;; If you use this code (or parts) of it, then please credit me.;; coded to parse by LA51 assembler (ASM51); current target: DARMICON development board (SAB80C537 @ 12Mhz); (by Felino MOLINA & Howard PULLEN- www.ntu.edu.au);; ====================================================================;; designed for one device only (set to master);; design references:;; - ATA/ATAPI-5 (T13/1321D R3) (www.t10.org); - ATA packet interface for CDROM's (SFF-8020i) (fission.dt.wdc.com);; other references used:;; - linux 2.2.x source code (/usr/src/linux/drivers/ide*); (had to be referred to seens that the SFF-8020i spec is so shitty);; - ATAPI references & Black magic in ATA/ATAPI; by Constantine Sapuntzakis <csapuntz@stanford.edu>; http://www.stanford.edu/~csapuntz/ide.html; http://www.stanford.edu/~csapuntz/blackmagic.html;; - 8052 Basic project page (IDE logger section); by Sergey Zorin <zorinsn@rs-pribor.ru>; http://www.nomad.ee/micros/8052bas.html; (nb/ very very helpful);; - General ATAPI info (including some source code); Hale Landis's ATAPI pages http://www.ata-atapi.com; (a good introduction to it all, as i knew nothing when i first started; this project);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODE_BASE = 0000hSTACK_START = 3fh;ctrl bus;; 7 6 5 4 3 2 1 0;+DA2+DA1+DA0+CS1+CS0+---+---+---+;| X | X | X | X | X | | | |;+---+---+---+---+---+---+---+---+;ATA_ADDR data p2;ctrlATA_nDIOR bit p0.0 ;read strobeATA_nDIOW bit p0.1 ;write strobeATA_nRESET bit p0.2ATA_INTRQ bit p0.3 ;irq;data busATA_DATA_LS data p1ATA_DATA_MS data p3;LED flags;F_ERROR bit p0.4F_PLAYING bit p0.5; variable data;play_blink bit 0hpacket_size data 08hstart_track data 09htmp0 data 0ahtmp1 data 0bhtmp2 data 0chtmp3 data 0dhstart_M data 0ehstart_S data 0fhstart_F data 10hend_M data 11hend_S data 12hend_F data 13haudio_status data 14hpacket_tab idata 70hpacket_cmd data 70hpacket_1 data 71hpacket_2 data 72hpacket_3 data 73hpacket_4 data 74hpacket_5 data 75hpacket_6 data 76hpacket_7 data 77hpacket_8 data 78hpacket_9 data 79hpacket_10 data 7ahpacket_11 data 7bhpacket_12 data 7chpacket_13 data 7dhpacket_14 data 7ehpacket_15 data 7fhorg CODE_BASE ajmp start db 'Copyright (C) 2000 Jason Nunn <jsno@downunder.net.au>.';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; atomic routines;; Nb/ code assumes 1us clock cycle (12Mhz xtal clock);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;delay_100000us: mov r7,#0c8hdelay_100000us_l0: mov r6,#0f8hdelay_100000us_l1: djnz r6,delay_100000us_l1 nop djnz r7,delay_100000us_l0 ret;r5 = secondsdelay: acall delay_100000us acall delay_100000us acall delay_100000us acall delay_100000us acall delay_100000us acall delay_100000us acall delay_100000us acall delay_100000us acall delay_100000us acall delay_100000us djnz r5,delay retread_cycle: mov ATA_DATA_LS,#0ffh mov ATA_DATA_MS,#0ffh clr ATA_nDIOR mov a,ATA_DATA_LS mov b,ATA_DATA_MS setb ATA_nDIOR retread_cycle_ls: mov ATA_DATA_LS,#0ffh clr ATA_nDIOR mov a,ATA_DATA_LS setb ATA_nDIOR retwrite_cycle: mov ATA_DATA_LS,a mov ATA_DATA_MS,b clr ATA_nDIOW nop setb ATA_nDIOW retwrite_cycle_ls: mov ATA_DATA_LS,a clr ATA_nDIOW nop setb ATA_nDIOW retwait_irq: setb ATA_INTRQ jnb ATA_INTRQ,wait_irq ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cylinder register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;get_cyl_high_register: mov ATA_ADDR,#10110000b acall read_cycle_ls retget_cyl_low_register: mov ATA_ADDR,#10010000b acall read_cycle_ls retset_cyl_high_register: mov ATA_ADDR,#10110000b acall write_cycle_ls retset_cyl_low_register: mov ATA_ADDR,#10010000b acall write_cycle_ls ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; a = cmd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;set_cmd_register: mov ATA_ADDR,#11110000b acall write_cycle_ls ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; data register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ret: a = ls b = msget_data: mov ATA_ADDR,#00010000b acall read_cycle ret; a = ls b = msset_data: mov ATA_ADDR,#00010000b acall write_cycle ret; a = lsset_data_ls: mov ATA_ADDR,#00010000b acall write_cycle_ls ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; device/head register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;get_devhead_register: mov ATA_ADDR,#11010000b acall read_cycle_ls retset_devhead_register: mov ATA_ADDR,#11010000b acall write_cycle_ls ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; error register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ERROR_REG_AMNF bit acc.0ERROR_REG_TK0NF bit acc.1ERROR_REG_ABRT bit acc.2ERROR_REG_MCR bit acc.3ERROR_REG_IDNF bit acc.4ERROR_REG_MC bit acc.5ERROR_REG_UNC bit acc.6ERROR_REG_RES bit acc.7get_error_register: mov ATA_ADDR,#00110000b acall read_cycle_ls ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sector register's;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;get_sector_c_register: mov ATA_ADDR,#01010000b acall read_cycle_ls retget_sector_n_register: mov ATA_ADDR,#01110000b acall read_cycle_ls ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; status register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;STATUS_REG_ERR bit acc.0STATUS_REG_IDX bit acc.1STATUS_REG_CORR bit acc.2STATUS_REG_DRQ bit acc.3STATUS_REG_DSC bit acc.4STATUS_REG_DF bit acc.5STATUS_REG_DRDY bit acc.6STATUS_REG_BSY bit acc.7get_status_register: mov ATA_ADDR,#11110000b acall read_cycle_ls retbsy_wait: nop nop nop nop acall get_status_register jb STATUS_REG_BSY,bsy_wait retbsy_drdy_wait: nop nop nop nop acall delay_100000us acall get_status_register jb STATUS_REG_BSY,bsy_drdy_wait jnb STATUS_REG_DRDY,bsy_drdy_wait retdrq_wait: nop nop nop nop acall get_status_register jb STATUS_REG_BSY,drq_wait jnb STATUS_REG_DRQ,drq_wait retndrq_wait: nop nop nop nop acall get_status_register
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -