📄 readfl.asm
字号:
port_a equ 0c800h
port_b equ 0c801h
port_d equ 0c803h
port_ce equ 0c810h
DATA SEGMENT
buffer db 0fC00h dup(?)
STRING1 DB 'NUMBER OF FILE TO READ:','$'
STRING2 DB 0DH,0AH,'PATH&NAME TO SAVE:','$'
STRING3 DB 0DH,0AH,'CAN NOT MAKE FILE ON DISK!!','$'
PATH DB 50 DUP(0)
HANDLE DW ?
FILELEN DW ?
CHOICE DB ?
FILESTA DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA ;PROMPT
MOV DS,AX
LEA DX,STRING1
MOV AH,9
INT 21H
MOV AH,1 ;GET NUMBER
INT 21H
AND AL,0FH
MOV BL,AL
MOV AH,1
INT 21H
CMP AL,0DH
JZ GOON
AND AL,0FH
ADD BL,AL
goon: MOV CHOICE,BL
LEA DX,STRING2 ;GET FILE PATH
MOV AH,9
INT 21H
LEA SI,PATH
NEXT_I: MOV AH,1
INT 21H
CMP AL,0DH
JZ GOO
MOV [SI],AL
INC SI
JMP NEXT_I
GOO: mov dx,port_d ;control word
mov al,80h
out dx,al
mov dx,port_ce ;read cmd
mov al,00h
out dx,al
MOV AL,CHOICE
MOV BL,20H
MUL BL
MOV BX,AX
ADD BX,0e0H
CALL READ
CMP AL,0FFH ;CHECK FILE NAME
JZ START
ADD BX,10H ;READ FILE BEGIN
CALL READ
MOV CL,AL
INC BX
CALL READ
MOV CH,AL
MOV FILESTA,CX
ADD BX,7 ;READ FILE LENGTH
CALL READ
MOV CL,AL
INC BX
CALL READ
MOV CH,AL
MOV FILELEN,CX
MOV BX,FILESTA ; READ FILE TO BUFFER
LEA SI,BUFFER
NEXT_R:CALL READ
MOV [SI],AL
INC SI
INC BX
LOOP NEXT_R
CALL MAKE ;MAKE FILE ON DISK
CMP CX,1
JZ EXIT
CALL WRITE ; WRITE BUFFER TO FILE
EXIT: MOV AH,4CH
INT 21H
READ PROC ;READ A BYTE FROM FLASH
mov dx,port_b ;addressh
mov al,BH
out dx,al
mov dx,port_a ;addressl
mov al,bl
out dx,al
mov dx,port_ce ;read
in al,dx
RET
READ ENDP
MAKE PROC ;MAKE FILE ON DISK
MOV AH,3CH
MOV CX,0
LEA DX,PATH
INT 21H
JC ERR_M
MOV HANDLE,AX ;SAVE FILE HANDLE
RET
ERR_M: LEA DX, STRING3
MOV AH,9
INT 21H
MOV CX,1
RET
MAKE ENDP
WRITE PROC ;WRITE BUFFER TO FILE
MOV AH,40H
MOV BX,HANDLE
LEA DX,BUFFER
MOV CX,FILELEN
INT 21H
JNC EXIT_W
LEA DX, STRING3
MOV AH,9
INT 21H
EXIT_W:MOV AH,3EH
MOV BX,HANDLE
INT 21H
RET
WRITE ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -