📄 gfat16_p.asm
字号:
MOV AX,WORD PTR [BP+16]
MOV WORD PTR [BP+26],AX ;CS
MOV AX,WORD PTR [BP+14]
MOV WORD PTR [BP+24],AX ;IP
MOV AX,WORD PTR [BP]
MOV WORD PTR [BP+22],AX ;OLD BP
;str1-->str2
STRNCPY1:
MOV AL,DS:[SI]
MOV ES:[DI],AL
INC SI
INC DI
LOOP STRNCPY1
POP CX ;OLD BP
POP CX
POP AX
POP DI
POP SI
POP ES
POP DS
MOV SP,BP
MOV BP,WORD PTR [BP+22] ;OLD BP
ADD SP,24
RET
STRNCPY ENDP
STRDISP PROC FAR
; input ds:dx string address 0-->'$'
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DI
PUSH DS
;
MOV AX,DS
MOV ES,AX
MOV DI,DX
STRDISP0: MOV AL,0
MOV DX,DI
MOV CX,4096
CLD
STRDISP1: SCASB
LOOPNZ STRDISP1
JNZ STRDISP2 ;<>0 AT 4095
MOV AL,0
;dec di
JMP STRDISP3
STRDISP2:
MOV AL,ES:[DI]
STRDISP3:
PUSH AX
PUSH DI
PUSH ES
PUSH DS
MOV AL,24H
MOV ES:[DI],AL
MOV AL,0
MOV AH,09H
INT 21H
POP DS
POP ES
POP DI
POP AX
CMP AL,0
JE STRDISP_END
MOV ES:[DI],AL
JMP STRDISP0
STRDISP_END:
POP DS
POP DI
POP CX
POP BX
POP AX
POP ES
RET
STRDISP ENDP
STRCPY PROC FAR
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH AX
PUSH CX
PUSH BP ;7
MOV BP,SP
MOV DI,WORD PTR [BP+24] ;4 PARAMETER
MOV ES,WORD PTR [BP+22]
MOV SI,WORD PTR [BP+20]
MOV DS,WORD PTR [BP+18]
MOV AX,WORD PTR [BP+16]
MOV WORD PTR [BP+24],AX ;CS
MOV AX,WORD PTR [BP+14]
MOV WORD PTR [BP+22],AX ;IP
MOV AX,WORD PTR [BP]
MOV WORD PTR [BP+20],AX ;OLD BP
;str1-->str2
MOV CX,0FFFFH
STRCPY1:
MOV AL,DS:[SI]
MOV ES:[DI],AL
CMP AL,0
JLE STRCPY2
INC SI
INC DI
LOOP STRCPY1
STRCPY2:
POP CX ;OLD BP
POP CX
POP AX
POP DI
POP SI
POP ES
POP DS
MOV SP,BP
MOV BP,WORD PTR [BP+20] ;OLD BP
ADD SP,22
RET
STRCPY ENDP
STRCMP PROC FAR
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH AX
PUSH CX
PUSH BP ;7
MOV BP,SP
MOV DI,WORD PTR [BP+24] ;4 PARAMETER
MOV ES,WORD PTR [BP+22]
MOV SI,WORD PTR [BP+20]
MOV DS,WORD PTR [BP+18]
MOV AX,WORD PTR [BP+16]
MOV WORD PTR [BP+24],AX ;CS
MOV AX,WORD PTR [BP+14]
MOV WORD PTR [BP+22],AX ;IP
MOV AX,WORD PTR [BP]
MOV WORD PTR [BP+20],AX ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;str1-->str2
MOV CX,0FFFFH
STRCMP1:
MOV AL,DS:[SI]
MOV AH,ES:[DI]
CMP AL,AH
JE STRCMP2
JL STRCMP22
MOV AL,2
JMP STRCMP3
STRCMP2:
CMP AL,0
JE STRCMP3
INC SI
INC DI
LOOP STRCMP1
STRCMP22: MOV AL,1
STRCMP3: MOV WORD PTR [BP+4],AX ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
POP CX ;OLD BP
POP CX
POP AX
POP DI
POP SI
POP ES
POP DS
MOV SP,BP
MOV BP,WORD PTR [BP+20] ;OLD BP
ADD SP,22
RET
STRCMP ENDP
STRICMP PROC FAR
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH AX
PUSH CX
PUSH BP ;7
MOV BP,SP
MOV DI,WORD PTR [BP+24] ;4 PARAMETER
MOV ES,WORD PTR [BP+22]
MOV SI,WORD PTR [BP+20]
MOV DS,WORD PTR [BP+18]
MOV AX,WORD PTR [BP+16]
MOV WORD PTR [BP+24],AX ;CS
MOV AX,WORD PTR [BP+14]
MOV WORD PTR [BP+22],AX ;IP
MOV AX,WORD PTR [BP]
MOV WORD PTR [BP+20],AX ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;str1-->str2
MOV CX,0FFFFH
STRICMP1:
MOV AL,DS:[SI]
MOV AH,ES:[DI]
; upper/lower
CMP AL,61H
JL STRICMP11
CMP AL,7AH
JA STRICMP11
SUB AL,20H
STRICMP11:
CMP AH,61H
JL STRICMP12
CMP AH,7AH
JA STRICMP12
SUB AH,20H
; upper/lower
STRICMP12:
CMP AL,AH
JE STRICMP2
JL STRICMP22
MOV AL,2
JMP STRICMP3
STRICMP2:
CMP AL,0
JE STRICMP3
INC SI
INC DI
LOOP STRICMP1
STRICMP22: MOV AL,1
STRICMP3: MOV WORD PTR [BP+4],AX ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
POP CX ;OLD BP
POP CX
POP AX
POP DI
POP SI
POP ES
POP DS
MOV SP,BP
MOV BP,WORD PTR [BP+20] ;OLD BP
ADD SP,22
RET
STRICMP ENDP
LSECTOR_NO_ADDR PROC FAR
; in: DS:DX=DOSBOOT or extdosboot EAX=logic sector_no
; out ch:cylinder,cl:sector,dh:head
PUSH EBX
PUSH ESI
PUSH EDI
INC EAX
MOV SI,DX ;OFFSET DOSBOOT
MOV EBX,DS:[SI+1CH] ;hidden sector_count
ADD EAX,EBX
MOV EBX,DS:HIDDEN_SECTOR
ADD EAX,EBX
PUSH EAX ;logic sector_no+1+hidden sector_count
MOV AX,DS:[SI+1AH] ;head_count_per cylinder
MOV BX,DS:[SI+18H] ;sector_count per head
XOR DX,DX
MUL BX ;DX:AX head_count * sector_count
MOVZX EAX,AX
MOVZX EDX,DX
SHL EDX,16
ADD EAX,EDX ;EAX=head_count * sector_count
MOV EDI,EAX ;EDI=head_count * sector_count ---OK
POP EAX
PUSH EAX
XOR EDX,EDX
DIV EDI ;EAX=cylinder_NO
MOV EBX,EAX ;EBX=cylinder_NO -----OK
XOR EDX,EDX
MUL EDI
MOV ECX,EAX ;ECX=cylinder_NO * head_count * sector_count
POP EAX
SUB EAX,ECX
PUSH EAX ;logic sector_no+1+hidden sector_count -
; cylinder_NO * head_count * sector_count
MOV CX,DS:[SI+18H] ;sectors per sector
MOVZX ECX,CX
XOR EDX,EDX
DIV ECX
MOV ESI,EAX ;ESI=EAX=head_ON ----OK
XOR EDX,EDX
MUL ECX
MOV EDI,EAX ;EDI=head_ON * sectorS per head
POP EAX
SUB EAX,EDI ;AX=sector_ON --OK
MOV CL,AL ;CL=sector_ON --OK
MOV DX,SI ;DL=head_ON
MOV DH,DL ;DH=head_ON
MOV CH,BL ;CH=low 8 bit cylinder
SHL BH,6
AND CL,3FH
ADD CL,BH
POP EDI
POP ESI
POP EBX
RET
LSECTOR_NO_ADDR ENDP
DO_DIR PROC FAR
MOV AX,V_TOS_DATA_SEL
MOV ES,AX
MOV DS,AX
;;;;; next for FAT16 file system
MOV EAX,0
MOV DS:HIDDEN_SECTOR,EAX
MOV DS:TTDB,AL ;subs directory
MOV DS:TTDD1,EAX ;used bytes
MOV DS:TTDD2,EAX ;free bytes
MOV DS:TTDD3,EAX ;files_count
MOV DS:TTDD4,EAX ;directory_count
;;;;; disk free bytes
MOV BX,OFFSET DOSBOOT
XOR EAX,EAX
MOV EAX,DS:[BX+20H]
CMP EAX,0
JA DO_DIR00
MOV AX,DS:[BX+13H]
DO_DIR00: DEC EAX ;toatl sectors -1
MOV DX,DS:[BX+16H] ;sectors per FAT
MOVZX EDX,DX
SUB EAX,EDX
SUB EAX,EDX
MOV DS:TTDD2,EAX ;toatl sectors - 1 -2*FAT_sectors
;;;;; disk free bytes
;;;;;;;;;;;;;;;;;;;; display head line 1
; read cursor
MOV AH,03H
MOV BH,0
INT 80H
; set cursor
MOV AH,02H
MOV BH,0
INC DH
MOV DL,0
INT 80H
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV DX,OFFSET T_DIR1
CALL STRDISP
;;;;;;;;;;;;;;;; display volume_serial_number
;display volume_serial_number part 1
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV BX,OFFSET DOSBOOT
ADD BX,27H
MOV AL,DS:[BX+2]
MOV AH,DS:[BX+3]
CALL DISP_AX
;display '-'
MOV BH,0
MOV AL,'-'
MOV BL,07
MOV CX,1
MOV AH,9
INT 80H
; read cursor
MOV AH,03H
MOV BH,0
INT 80H
; set cursor
MOV AH,02H
MOV BH,0
INC DL
INT 80H
;display volume_serial_number part 2
MOV BX,OFFSET DOSBOOT
ADD BX,27H
MOV AL,DS:[BX]
MOV AH,DS:[BX+1]
CALL DISP_AX
;;;;;;;;;;; display volume_serial_number
;display head line 2
; read cursor
MOV AH,03H
MOV BH,0
INT 80H
; set cursor
MOV AH,02H
MOV BH,0
INC DH
MOV DL,0
INT 80H
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV DX,OFFSET T_DIR2
CALL STRDISP
;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;; first sector_no of root dir
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV AL,0
MOVZX EAX,AL
MOV DS:HIDDEN_SECTOR,EAX
MOV BX,OFFSET DOSBOOT
MOV AX,DS:[BX+16H] ;sectors per FAT
MOV CX,DS:[BX+10H] ;FAT count
MUL CX
INC AX
ADC DX,0 ;DX:AX =first sector_no of root dir
MOVZX ECX,AX
MOVZX EAX,DX
SHL EAX,16
ADD EAX,ECX
MOV DS:ROOTDIR_FS_NO,EAX ; first sector_no of root dir
;;;;;;;;;;;;;;;;;;; sectors in root dir
MOV AX,DS:[BX+11H]
MOV CX,32
MUL CX ;DX:AX bytes in root dir
MOV CX,DS:[BX+0BH] ; bytes oer sector
DIV CX ;AX= sectors in root dir
;;;;;;;;;;;;;;;;;;; last sector_no of root dir
MOVZX EAX,AX ; EAX= sectors in root dir
;; disk free
PUSH EAX
MOV EBX,EAX
MOV EAX,DS:TTDD2
SUB EAX,EBX
MOV DS:TTDD2,EAX ;sectors in file area
MOV DX,OFFSET DOSBOOT
CALL DISK_FREE
MOV DS:TTDD2,EAX ;disk free
POP EAX
;; disk free
MOV EBX,DS:ROOTDIR_FS_NO ; EBX= first sector_no of root dir
ADD EAX,EBX
DEC EAX
MOV DS:ROOTDIR_LS_NO,EAX ; last sector_no of root dir
;;;;;;;;;;;;;;;;;; loop read root_dir sector
MOV EAX,DS:ROOTDIR_FS_NO
MOV DS:TTSECTOR_NO,EAX ; first sector_no of root dir
DO_DIR_1:
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV EAX,DS:TTSECTOR_NO
CMP EAX,DS:ROOTDIR_LS_NO
JA DO_DIR_END
INC EAX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -