📄 51与ide硬盘.asm
字号:
;该程序用来测试89C51与IDE硬盘的接口
ADD1 EQU 0BEFFH
ADD2 EQU 7EFFH
ADD3 EQU 0BAFFH
C_PORT EQU 0BFFFH
D_PORT EQU 0B8FFH
ORG 0000H
DB 00H
AJMP START
ORG 0003H
AJMP SINT0 ;中断入口地址
ORG 0030H
START:CLR P3.1
ACALL DETL
ACALL DETL
SETB P3.1
ACALL INIT
SETB EA
SETB EX0
; AJMP PLAY
;(33H,32H,31H,30H)<--SIZE OF FAT TABLE
BEGIN:ACALL DBR
ACALL RD1S
R_DBR:CLR P3.0
MOV P1,#0FFH
MOV R0,#30H
RD256:MOV DPTR,#D_PORT
MOV R7,#00H
RDP: MOVX A,@DPTR
MOV B,P1
CJNE R7,#0EEH,N1
MOV @R0,A
INC R0
MOV @R0,B
INC R0
CJNE R0,#34H,RDP
DEC R7
N1: DJNZ R7,RDP
SETB P3.0
;(34H,35H)<--FIRST CLUST
ACALL FDT
ACALL RD1S
R_FDT:CLR P3.0
MOV P1,#0FFH
RD255:MOV DPTR,#D_PORT
MOV R7,#00H
RDP1: MOVX A,@DPTR
MOV B,P1
CJNE R7,#0F3H,N2
MOV @R0,A
INC R0
MOV @R0,B
INC R0
CJNE R0,#3AH,RDP1
DEC R7
DEC R7
N2: DJNZ R7,RDP1
SETB P3.0
ACALL A_F
ACALL S_F
PLAY: SETB 7FH
MOV DPTR,#ADD1 ;1写驱动器/磁头寄存器
MOV A,#0a0H
MOVX @DPTR,A
MOV DPTR,#ADD2 ;2 读辅助状态寄存器
W1: MOVX A,@DPTR
JB ACC.7,W1
mov DPTR,#ADD3 ;3 写扇区数寄存器
MOV A,#08h
MOVX @DPTR,A
INC DPH ;4 写起始扇区地址寄存器
MOV A,40H
MOVX @DPTR,A
INC DPH ;5 写柱面0寄存器
mov A,41h
MOVX @DPTR,A
INC DPH ;6 写柱面1寄存器
MOV A,42H
MOVX @DPTR,A
MOV DPTR,#ADD1 ;7 写磁头/驱动寄存器
MOV A,#0e0H
MOVX @DPTR,A
mov DPTR,#ADD2 ;8 读辅助状态寄存器
W2: movX A,@DPTR
JB ACC.7,W2
mov DPTR,#C_PORT ;9 写命令寄存器
mov A,#0c8h
MOVX @DPTR,A
;P1.5 DMARQ------P1.6 DMACK#
jnb p3.4,$
MOV P2,#0B8H
;acall det
clr p3.5
JB 7FH,$ ;wait
MOV A,47H
JNZ R_P
MOV A,46H
JNZ R_P
MOV A,45H
JNZ R_P
MOV A,44H
JNZ R_P
Ajmp BEGIN
R_P: AJMP PLAY
SINT0:CLR EX0 ;清8031中断
JB 00H,SINT02
SETB P3.5 ;DMACK#=1
mov DPTR,#C_PORT ;读主状态寄存器(清IDE中断)
MOVX A,@DPTR
CLR 7FH
MOV A,40H
ADDC A,#08H
MOV 40H,A
MOV A,41H
ADDC A,#00H
MOV 41H,A
MOV A,42H
ADDC A,#00H
MOV 42H,A
;CHANGE SIZE OF CLUSTER
CLR C
MOV A,44H
SUBB A,#01H
MOV 44H,A
MOV A,45H
SUBB A,#00H
MOV 45H,A
MOV A,46H
SUBB A,#00H
MOV 46H,A
MOV A,47H
SUBB A,#00H
MOV 47H,A
SETB EX0
RETI
SINT02:MOV DPTR,#C_PORT
MOVX A,@DPTR
SETB 7EH
SETB EX0
RETI
INIT: MOV R0,#20H
MOV R7,#5FH
CLR A
RE1: MOV @R0,A
INC R0
DJNZ R7,RE1
mov 40h,#92H
mov 41h,#0A4h
mov 42h,#04h
mov 43h,#00h
mov 44H,#0E4H
MOV 45H,#30H
MOV 46H,#00H
MOV 47H,#00H
RET
DET: MOV R7,#01H
DE0: MOV R6,#01FH
DJNZ R6,$
DJNZ R7,DE0
RET
DETL:MOV R5,#0FFH
DETL1:ACALL DET
DJNZ R5,DETL1
RET
FDT: CLR C
MOV A,30H
RLC A
MOV 30H,A
MOV A,31H
RLC A
MOV 31H,A
MOV A,32H
RLC A
MOV 32H,A
MOV A,33H
RLC A
MOV 33H,A
MOV A,30H
ADD A,#5FH
MOV 40H,A
MOV A,31H
ADDC A,#00H
MOV 41H,A
MOV A,32H
ADDC A,#00H
MOV 42H,A
MOV A,33H
ADDC A,#00H
MOV 43H,A
SETB 00H
RET
DBR: MOV 40H,#3FH
MOV 41H,#00H
MOV 42H,#00H
SETB 00H
RET
A_F: MOV A,40H
ADD A,#08H
MOV 40H,A
MOV A,41H
ADDC A,#00H
MOV 41H,A
MOV A,42H
ADDC A,#00H
MOV 42H,A
MOV A,43H
ADDC A,#00H
MOV 43H,A
RET
S_F: MOV R7,#04H
SFRP: CLR C
MOV A,39H
RRC A
MOV 39H,A
MOV A,38H
RRC A
MOV 38H,A
MOV A,37H
RRC A
MOV 37H,A
DJNZ R7,SFRP
MOV 44H,37H
MOV 45H,38H
MOV 46H,39H
RET
RD1s: MOV DPTR,#ADD1 ;1写驱动器/磁头寄存器
MOV A,#0a0H
MOVX @DPTR,A
MOV DPTR,#ADD2 ;2 读辅助状态寄存器
W3: MOVX A,@DPTR
JB ACC.7,W3
mov DPTR,#ADD3 ;3 写扇区数寄存器
MOV A,#01h
MOVX @DPTR,A
INC DPH ;4 写起始扇区地址寄存器
MOV A,40H
MOVX @DPTR,A
INC DPH ;5 写柱面0寄存器
mov A,41h
MOVX @DPTR,A
INC DPH ;6 写柱面1寄存器
MOV A,42H
MOVX @DPTR,A
MOV DPTR,#ADD1 ;7 写磁头/驱动寄存器
MOV A,#0e0H
MOVX @DPTR,A
mov DPTR,#ADD2 ;8 读辅助状态寄存器
W4: movX A,@DPTR
JB ACC.7,W4
mov DPTR,#C_PORT ;9 写命令寄存器
mov A,#20h
MOVX @DPTR,A
JNB 7EH,$
CLR 00H
CLR 7EH
RET
END
;本程序2月17日通过。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -