readfl.asm

来自「DOS下基于28f512的小型文件系统 format.asm/list.asm」· 汇编 代码 · 共 134 行

ASM
134
字号
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 + =
减小字号Ctrl + -
显示快捷键?