📄 code16.asm
字号:
MOV DX,OFFSET VERS
MOV AH,09H
INT 21H
MOV DX,OFFSET HELPMSG
MOV AH,09H
INT 21H
POP DS
RET
HELPUSER ENDP
FREESPACE PROC NEAR
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
MOV AX,0FEFEH
INT 21H ;get TSR PSP
CMP AH,0FEH
JZ CANENOTINMEM
MOV DX,AX ;PSP
MOV AX,0FEFFH
INT 21H ;back to real
MOV AX,CS
MOV DS,AX
MOV AH,52H
INT 21H
SUB BX,2
MOV AX,ES:[BX] ;seg of MB
MOV ES,AX
SPACELOOP:
MOV AL,ES:[0] ;FLAG
CMP AL,5AH
JZ FINDISOVER ;IS LAST
CMP WORD PTR ES:[1],DX
JZ FINDCANE ;IS EQUAL
FREENEXT:
MOV AX,WORD PTR ES:[3]
MOV BX,ES
ADD AX,BX
INC AX
MOV ES,AX
JMP SPACELOOP
FINDCANE:
PUSH ES
MOV AX,ES
INC AX
MOV ES,AX
MOV AH,49H
INT 21H
POP ES
JMP FREENEXT
FINDISOVER:
MOV DX,OFFSET RIGHTFREE
CALL SHOWSTRING
MOV AX,0
JMP EXITSPACE
CANENOTINMEM:
MOV DX,OFFSET NOTINMEM
CALL SHOWSTRING
MOV AX,1
EXITSPACE:
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
RET
FREESPACE ENDP
SHOWSTRING PROC NEAR
PUSH DS
PUSH CS
POP DS
MOV AH,09H
INT 21H
POP DS
RET
SHOWSTRING ENDP
WRITEDATAFILE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH ES
PUSH DS
PUSH CS
POP DS
MOV DX,OFFSET FILENAME
MOV CX,0
MOV AH,3CH
INT 21H ;CREAT FILE
JC CREATERROR
MOV CS:_HANDLE,AX ;HANDLE
MOV AX,0FEFDH
INT 21H ;get buffer address
CMP AH,0FEH
JZ CANENOTINMEM2
MOV CS:_EXTENDADDR,ECX ;buffer address
MOV AX,CS
MOVZX EAX,AX
SHL EAX,4
MOV BX,OFFSET RWBUFFER
MOVZX EBX,BX
ADD EBX,EAX
MOV EAX,ECX
MOV ECX,0400H
CALL TRANSMITDATA ;to base memory
MOV EAX,DWORD PTR RWBUFFER[2] ;length
ADD EAX,6
MOV CS:_EXTENDLEN,EAX
MOV CS:_WRITECOUNTER,0
NEXTFILEBLOCK:
MOV ECX,CS:_EXTENDLEN
MOV EAX,CS:_WRITECOUNTER
SUB ECX,EAX
CMP ECX,400H
JB ISLASTBLOCK
MOV ECX,400H
ISLASTBLOCK:
MOV EAX,CS:_WRITECOUNTER
ADD EAX,ECX
MOV CS:_WRITECOUNTER,EAX
MOV DX,OFFSET RWBUFFER
MOV BX,CS:_HANDLE ;handle
MOV AH,40H
INT 21H
MOV EAX,CS:_WRITECOUNTER
CMP EAX,CS:_EXTENDLEN
JAE CLOSEFILE
MOV AX,CS
MOVZX EAX,AX
SHL EAX,4
MOV BX,OFFSET RWBUFFER
MOVZX EBX,BX
ADD EBX,EAX
MOV EAX,CS:_EXTENDADDR
MOV ECX,CS:_WRITECOUNTER
ADD EAX,ECX
MOV ECX,0400H
CALL TRANSMITDATA ;to base memory
JMP NEXTFILEBLOCK
CANENOTINMEM2:
MOV DX,OFFSET NOTINMEM
CALL SHOWSTRING
CLOSEFILE:
MOV BX,CS:_HANDLE
MOV AH,3EH
INT 21H ;CLOSE FILE
CREATERROR:
POP DS
POP ES
POP DX
POP CX
POP BX
POP AX
RET
WRITEDATAFILE ENDP
READDATAFILE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH ES
PUSH DS
PUSH CS
POP DS
MOV DX,OFFSET FILENAME
MOV AL,0
MOV AH,3DH
INT 21H ;OPEN FILE
JC FILEERROR
MOV CS:_HANDLE,AX ;HANDLE
MOV DX,OFFSET RWBUFFER
MOV CX,6
MOV BX,CS:_HANDLE
MOV AH,3FH
INT 21H
JC FILEERROR
CMP AX,6
JNZ FILEERROR
MOVZX ECX,AX ;transmit counter
MOV CS:_READCOUNTER,0
MOV EAX,DWORD PTR RWBUFFER[2]
ADD EAX,6
MOV CS:_EXTENDLEN,EAX
MOV BX,CS:_EXTSIZE
MOVZX EBX,BX
SHL EBX,10
SUB EBX,EAX
ADD EBX,100000H
MOV CS:_EXTENDADDR,EBX ;the start address
CMP EBX,100000H
JB MEMNOTENOUGH
MOV AX,0FEFCH
INT 21H
CMP AH,0FEH
JZ CANENOTINMEM3
TRANSMITNEXTBLOCK:
MOV AX,CS
MOVZX EAX,AX
SHL EAX,4
MOV BX,OFFSET RWBUFFER
MOVZX EBX,BX
ADD EAX,EBX ;EAX SRC ADDRESS
PUSH EAX
MOV EAX,CS:_READCOUNTER
MOV EBX,CS:_EXTENDADDR
ADD EBX,EAX ;EBX DESC ADDRESS
MOV EAX,CS:_READCOUNTER
ADD EAX,ECX
MOV CS:_READCOUNTER,EAX ;READ BYTE NUMBER
POP EAX
CALL TRANSMITDATA
MOV EAX,CS:_READCOUNTER
CMP EAX,CS:_EXTENDLEN
JAE CLOSEREADFILE
MOV ECX,CS:_EXTENDLEN
MOV EAX,CS:_READCOUNTER
SUB ECX,EAX
CMP ECX,400H
JB NOTLASTBLOCK2
MOV ECX,400H ;READCOUNTER
NOTLASTBLOCK2:
MOV DX,OFFSET RWBUFFER
MOV BX,CS:_HANDLE
MOV AH,3FH
INT 21H
JC FILEERROR
MOVZX ECX,AX
JMP TRANSMITNEXTBLOCK
CLOSEREADFILE:
MOV BX,CS:_HANDLE
MOV AH,3EH
INT 21H ;CLOSE FILE
CLC
EXITREADDATA:
POP DS
POP ES
POP DX
POP CX
POP BX
POP AX
RET
FILEERROR:
CMP CS:_HANDLE,0
JZ NOTCLOSEFILE1
MOV BX,CS:_HANDLE
MOV AH,3EH
INT 21H
NOTCLOSEFILE1:
MOV DX,OFFSET DATAERROR
CALL SHOWSTRING
STC
JMP EXITREADDATA
MEMNOTENOUGH:
MOV BX,CS:_HANDLE
MOV AH,3EH
INT 21H
MOV DX,OFFSET MEMORYLACK
CALL SHOWSTRING
STC
JMP EXITREADDATA
CANENOTINMEM3:
MOV BX,CS:_HANDLE
MOV AH,3EH
INT 21H
MOV DX,OFFSET NOTINMEM
CALL SHOWSTRING
STC
JMP EXITREADDATA
READDATAFILE ENDP
;****************************************************************************
;* Transmit data between extend memory and base memory *
;* EAX - source address EBX - destinate address ECX - counter *
;****************************************************************************
TRANSMITDATA PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
MOV DX,SEG GDTAREA
MOV ES,DX
MOV SI,OFFSET GDTAREA
MOV WORD PTR ES:[SI+12H],AX ;source
SHR EAX,16
MOV BYTE PTR ES:[SI+14H],AL
MOV WORD PTR ES:[SI+1AH],BX ;destinate
SHR EBX,16
MOV BYTE PTR ES:[SI+1CH],BL
SHR CX,1 ;the number of word
MOV AH,87H
INT 15H
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
TRANSMITDATA ENDP
CHECKEXT PROC NEAR
PUSH AX
MOV AH,88H
INT 15H
MOV CS:_EXTSIZE,AX
POP AX
RET
CHECKEXT ENDP
SETPARALLEL PROC NEAR
PUSH ES
PUSH FS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,0
MOV ES,AX
MOV AX,SEG _IOPORT
MOV FS,AX
MOV BX,OFFSET _IOPORT
MOV AX,ES:[408H]
SHR AX,3
ADD BX,AX
MOV CX,ES:[408H]
AND CX,07H
MOV AX,1
SHL AX,CL
MOV CL,AL
MOV AX,FS:[BX]
OR AX,CX
SHL CX,1
OR AX,CX
SHL CX,1
OR AX,CX
MOV FS:[BX],AX
MOV CX,3
CHANGEFILENAME:
MOV AX,ES:[408H]
SHR AX,CL
SHR AX,CL
SHR AX,CL
SHR AX,CL
AND AX,0FH
CMP AX,09H
JBE ISDIGIT1
ADD AX,7H
ISDIGIT1:
ADD AX,30H
MOV BX,3
SUB BX,CX
MOV CS:FILENAME[BX+4],AL
CMP CX,0
JZ CHANGEFILEOVER
DEC CX
JMP CHANGEFILENAME
CHANGEFILEOVER:
POP DX
POP CX
POP BX
POP AX
POP FS
POP ES
RET
SETPARALLEL ENDP
LAST16 EQU $
CSEG ENDS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -