📄 fileio.asm
字号:
;
; GRDP
;
; Copyright(c) LADsoft
;
; David Lindauer, camille@bluegrass.net
;
;
; FILEIO.ASM
;
; Function: Handle File read/wrote commands
;
;MASM MODE
.MODEL SMALL
.386
include eprints.inc
include einput.inc
include emtrap.inc
include ebreaks.inc
include eloader.inc
include edos.inc
include eexec.inc
PUBLIC dofileread, dofilewrite, FileLoadErr
.data
EXEfileFlag db 0 ;if EXE file, can't write it
writelen dd 0 ;length to write
writeseg dw 0 ;segment and
writeofs dw 0 ; offset to write
newaddr db 0 ;if @addr used
writeFileName db 256 DUP (0) ;name of file to write
.CODE
;
; read from file
;
doFileRead PROC
movzx ax,[lastexe] ; use state of last load if no params
xor al,1
push ax
call WadeSpace
jz PureReadFile ; branch if reloading same program
pop ax ; else assume anything goes
push 0
cmp byte ptr [si],'@' ; else see if the load-exe-as-com flag set
jnz comonly ; branch if so
inc si ; else anything goes
pop ax ; com only!!!
push 1
comonly:
cmp byte ptr [si],'-' ; see if they want to unload
jnz newfile
pop ax ; clear stack
call UnLoadProgram ; yes do it
clc
ret
newfile:
call WadeSpace ; if no prog, go read the old one again
jz PureReadFile
call ParseProgName
PureReadFile:
pop ax ; com/exe flag
call LoadProgram ; call the com/exe loader
call FileLoadErr
ret
doFileRead ENDP
FileLoadErr PROC
jc lperr ; handle errors
PRINT_MESSAGE <10,13,"Size: ">
mov eax,FileLen
call Printdword
clc
ret
lperr:
PRINT_MESSAGE <10,13,"Read error">
clc
ret
FileLoadErr ENDP
;
; file write subroutine
;
WriteProgram PROC
mov ax,3c00h ; Open the file
mov dx,offset writeFileName
sub cx,cx
int 21h
mov bx,ax
jc failure
mov ecx,[writelen]
mov si,[writeseg]
mov dx,[writeofs]
push ds
wdlp:
push ecx
mov ds,si
mov ax,4000h ; Read the file
cmp ecx,8000h
jc cursize
mov cx,8000h
cursize:
int 21h
jc failure2
pop ecx
add si,800h
sub ecx,8000h
jnc wdlp
clc
failure2:
pop ds
failure:
pushf
mov ax,3e00H
int 21h
popf
ret
WriteProgram ENDP
;
; file write command
;
doFileWrite PROC
push si
mov [newaddr],0
mov si,offset loadfile ; move the original file name
mov di,offset writeFileName
fnl_lp:
lodsb
stosb
or al,al
jnz fnl_lp
mov al,[exeflag] ; set default params
mov [EXEfileFlag],al ; can't write EXE
mov eax,[filelen]
mov [writelen],eax
mov ax,[userbasepsp]
add ax,10H
mov [writeseg],ax
mov [writeofs],0
pop si
call WadeSpace ; if no args go to write routine
jz dowrite
cmp al,'@' ; see if address
jnz gname
mov [EXEfileFlag],0 ; yes update params
mov [writelen],0
mov [writeFileName],0
mov [newaddr],1
inc si
call ReadAddress
jc wn_err
call defDS ; get DS
mov eax,ebx
shr eax,4
add edx,eax
and ebx,15
mov [writeofs],bx
mov [writeseg],dx
test edx,0FFF00000H
jnz wn_err
gname:
call WadeSpace ; now see if there is a name
jz dowrite
cmp al,',' ; noname, get a length
jz getnum
mov [EXEfileFlag],0 ; else get name
mov di,offset writeFileName
fclp:
mov byte ptr [di],0
lodsb
cmp al,13
jz dowrite
cmp al,' '
jz getnum
cmp al,','
jz getnum
stosb
jmp fclp
getnum:
call WadeSpace ; now see if len
jz dowrite
mov [EXEfileFlag],0
call ReadNumber
jc wn_err
mov ebx,eax
call WadeSpace
jnz wn_err
mov [WriteLen],ebx
dowrite:
test [EXEfileFlag],0FFH ; all params got, see if exe
jnz noexewrite ; yes, can't write
test [writelen],0FFFFFFFFH ; see if anything
jz wn_err ; no,err
movzx eax,[writeseg]
shl eax,4
add eax,[writelen]
add eax,0FH
test eax,0FFF00000H ; 1 MB limit
jnz wn_err
call WriteProgram ; write prog
jnc nowriterr
PRINT_MESSAGE <10,13,"Write error">
nowriterr:
test [newaddr],1 ; update params
jnz nochange
mov eax,[writelen]
mov [FileLen],eax
mov al,[EXEfileFlag]
mov [exeflag],al
mov si,offset writeFileName
mov di,offset loadfile
fnl_lp1:
lodsb
stosb
or al,al
jnz fnl_lp1
nochange:
clc
ret
noexewrite:
PRINT_MESSAGE <10,13,"Can't write back an EXE file">
clc
ret
wn_err:
stc
ret
doFileWrite ENDP
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -