home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Garbo
/
Garbo.cdr
/
pc
/
progrmng
/
xm.lzh
/
XMINIT.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-10-08
|
3KB
|
193 lines
.386
include xmhd.inc
include xmmac.mac
include xmmsg.def
;
_DATA segment para public USE16 'DATA'
extrn edata:sect, ebss:sect, ecode:sect
_DATA ends
;
_TEXT segment para public USE16 'CODE'
assume cs:_TEXT, ds:_DATA
extrn a20_on:near, a20_off:near
extrn pushtoexestack:near
public CopyVectors, setenvp
CopyVectors proc near
push ds
push es
sub ax, ax
mov ds, ax
mov es, ax
mov si, 4*8 ;copy vectors 8..f
mov di, 4*50h ;to 50..57
mov cx, 8 ;eight double words
rep movsd
pop es
pop ds
ret
CopyVectors endp
SetEnvP proc near
sub eax, eax
jmp PushToExeStack
SetEnvP endp
comment %
SetParm proc near
push es
push di
push cx
mov ax, _DATA
mov es, ax
lea di, PSPwork[129]
mov cx, 127
cld
.setpr04:
mov al, es:[di]
mov es:byte ptr[di],' '
inc di
dec cx
cmp al, ' '
jbe .setpr04
.setpr05:
mov al, es:[di]
cmp al, ' '
jbe .setpr01
mov es:byte ptr[di],' '
inc di
loop .setpr05
.setpr01:
mov al, es:[di]
cmp al, 0
jnz .setpr02
mov es:byte ptr[di], ' '
.setpr02:
inc di
loop .setpr01
pop cx
pop di
pop es
ret
SetParm endp
%
public memoryconfig, memscan, memmax
;
;
; Check memory configration by compairing lowest memory and just at 1MB area.
; return cf=1 if 8Kbytes data is match
; by cf=0, we assume that extended memory (above 1MByte) is valid.
;
MemoryConfig proc near
push ds
push es
push cx
IF FMR70
call a20_on
ENDIF
mov cx, 0
mov ds, cx
mov si, cx
;
mov cx, 0ffffh
mov es, cx
mov di, 10h
;
mov cx, 0fffh
cld
repz cmpsw
cmp cx, 0
je .MemNormal
IF FMR70
call a20_on
ENDIF
stc
.MemNormal:
cmc
pop cx
pop es
pop ds
ret
MemoryConfig endp
memscan proc near
IF FMR70
call a20_on
ENDIF
mov ax, es:word ptr[esi]
IF FMR70 and Testing
call a20_off
ENDIF
mov bx, ax
not ax
IF FMR70 and Testing
call a20_on
ENDIF
mov es: word ptr[esi], ax
cmp ax, es:word ptr[esi]
mov es:word ptr[esi], bx
IF FMR70 and Testing
call a20_off
ENDIF
jne .memscanx
add esi, edx
cmp esi, edi
jae .memscanx
loop memscan
.memscanx:
ret
memscan endp
MemMax proc near
;
; judge how much memory(above 1MB) is available
; set maxmem in EData.Hi and return in esi
;
push es
push ax
push bx
push edi
;
IF PCAT
call a20_on
mov ax,8800h ; extended memory in K bytes
int 15h
ENDIF
IF FMR70
mov ax,3072 ; 3MByte of memory at most
ENDIF
movzx edx, ax
shl edx, 10
mov esi, 1024 * 1024 ; at least
lea edi, [edx + esi] ; at most
;
mov ax, 0
mov es, ax
shr edx, 3
mov ecx, 11 ;
.exist:
push cx
mov cx, 8 ; 8M bytes at most
call memscan
sub esi, edx
pop cx
shr edx, 2
loopnz .exist
pop edi
pop bx
pop ax
pop es
mov EData.Hi, esi
mov EBSS.Hi, esi
ret
endp
_TEXT ends
end