home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Garbo
/
Garbo.cdr
/
pc
/
progrmng
/
xm.lzh
/
XMFILE.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-10-08
|
4KB
|
256 lines
.386
O_APPEND equ 8
O_CREAT equ 100h
O_TRUNC equ 200h
O_EXCL equ 400h
include xmhd.inc
include xmmac.mac
include termio.inc
include stat.inc
include exp.inc
include xmmsg.def
_DATA segment para public USE16 'DATA'
extrn EData:byte, EBSS:byte
extrn ECode:byte
extrn Param:dword
extrn DosWorkI: byte, DosWorkO: byte
extrn PSPWork: dword
public fhdr
;FileName db MAXFILENAME+2 dup (0)
fhdr filehdr <>
comment %
ahdr aouthdr <>
shdr scnhdr <>
%
NotSupported db 'This format is not supported',13,10,0
Default_ext db '.exp',0
public Handle
Handle dw ?
_DATA ends
;
_TEXT segment para public USE16 'CODE'
assume cs:_TEXT, ds:_DATA
;
public ReadFOHdr, ReadSHdr
public OpenExe, AddExtention
extrn OSExit: near
IF FMR70
extrn a20_off: near, a20_on:near
ENDIF
ReadFOHdr proc near ; read file header
IF FMR70
call a20_off
ENDIF
mov bx, Handle
mov ah, 3fh
mov dx, offset fhdr
mov cx, (size fhdr)
int 21h
jc Error
cmp ax, cx
jc Error
mov ax, fhdr.f_magic
cmp ax, EXPMAGIC
je read_fh_ok
cmp ax, AoutMagic
je read_fh_ok
jne Error
read_fh_ok:
ret
ReadFOHdr endp
ReadSHdr proc near ; read section headers
mov bx, offset fhdr
cmp [bx].f_magic, EXPMAGIC
jne read_aout
read_exp:
mov dx, [bx].f_nhdr
shl dx, 4
mov cx, 0
mov bx, Handle
mov ah, 42h ; skip header parts
mov al, 0 ; seek from top of file
int 21h ;
jc Error
;read code
movzx ebx, Handle
mov Param[0], ebx
mov eax, ECode.Base
mov Param[4],eax ; code area to load in
push eax
movzx eax, fhdr.f_npage
shl eax, 9
movzx ebx, fhdr.f_nbyte
add eax, ebx
movzx ebx, fhdr.f_nhdr
shl ebx, 4
sub eax, ebx
mov Param[8], eax ; bytes to readin
mov si, psp_mem_min
mov dword ptr PSPwork[si], eax
mov ECode.Hi, eax
;
push eax
neg eax
add eax, EData.Hi
; sub eax, EData.Base
mov si, psp_mem_bss
mov dword ptr PSPwork[si], eax
mov eax, EData.Hi
; sub eax, EData.Base
mov si, psp_mem_max
;
; allocate communication buffer
;
sub eax, 1000h
mov dword ptr PSPwork[si], eax
mov EBSS.Hi, eax
pop eax
;
pop ebx
add eax, ebx ; start + size
; mov ECode.Hi, eax
inc eax
mov EBSS.Lo, eax
xor eax,eax
; mov ECode.Lo, eax
; mov EData.Lo, eax
; setup transfer addres in es:edi
;
push es
mov ax, ds
mov es, ax
movzx eax, ax
shl eax, 4
mov edi, ECode.Base ;48bit pointer
sub edi, eax
cld
;
; read file into inner buffer
.readloop:
IF FMR70
call a20_off
ENDIF
mov cx, PageSize
lea dx, DosWorkI ;PageBuffer
mov ah, 3fh
mov bx, Handle
int 21h
jc Error
;
mov cx, ax
jcxz .done
IF FMR70
call a20_on
ENDIF
lea esi, DosWorkI ;PageBuffer
prefix32
rep movsb
jmp .readloop
.done:
pop es
ret
ReadSHdr endp
AddExtention proc near
push di
push si
push cx
push ax
mov di, offset fileName
mov al, 0
mov cx, MAXFILENAME
cld
repne scasb
cmp cx, 0
je .add_no
dec di
mov si, offset default_ext
mov cx, 5 ; '.xxx'+EOS
rep movsb
.add_no:
pop ax
pop cx
pop si
pop di
ret
AddExtention endp
OpenExe proc near
IF FMR70
call a20_off
ENDIF
mov al, byte ptr FileName
cmp al, 0
je .file_not_found
mov dx, offset FileName
mov ax, 3d00h ;open for reading
je .file_not_found
int 21h
mov Handle, ax
jnc OEDone
call AddExtention
; file not found error
mov dx, offset FileName
mov ax, 3d00h
int 21h
mov Handle, ax
jnc OEDone
; file does not exist
.file_not_found:
mov dx, offset XNameS
call Msg
mov dx, offset FileName
call Msg
mov dx, offset NFS
call Msg
jmp OSExit
OEDone: ret
OpenExe endp
model small
read_aout proc near
cmp [bx].a_magic, AoutMagic
jne Error
cmp [bx].a_CPU, AoutI386
jne Error
mov dx, offset NotSupported
call Msg
mov ax, [bx].a_CPU
shl eax, 16
mov ax, [bx].a_magic
;
endp
Error proc near
push ax
call hex32
mov dx, offset ErrorS
mov ax, _DATA
mov ds, ax
pop ax
call Msg
jmp OSExit
Error endp
_TEXT ends
end