www.pudn.com > kpe42s.zip > EMS.ASM
code segment
assume cs:code,ds:code
.286
start proc near
jmp next
db 0007h dup (0)
emshead db 'EMMXXXX0',00h
db 000dh dup (0)
db '................'
pgframe db 'FRAME=X800......'
db '................'
db '................'
db '................'
db '................'
xmsdrv dw 0000h,0000h
emsframe dw 0000h
ipx_1 dw 0000h
ipx_2 dw 0000h
ipx_3 dw 0000h
ipx_4 dw 0000h,0000h
ipx_5 dw 0000h,0000h
int15tab db 0080h dup (0)
pgadds1 dw 0000h,0000h ;分頁表所在位址
pgadds2 dw 0000h,0000h ;pgbuffer 所在位址
pgbuffer db 0040h dup (0) ;頁對應用
pgpush db 0042h dup (0)
oopstack dw 0000h
int67tab dw offset function_40 ;取得記憶體管理程式狀態
dw offset function_41 ;取得頁框
dw offset function_42 ;取得頁的數目
dw offset function_43 ;配置記憶體
dw offset function_44 ;對應記憶體
dw offset function_45 ;釋還記憶體
dw offset function_46 ;取得 EMS 版本號碼
dw offset function_47 ;儲存頁對映
dw offset function_48 ;還原頁對映
dw offset function_49 ;
dw offset function_4a ;
dw offset function_4b ;
dw offset function_4c ;取得檔案頭銜代表頁的數目
dw offset function_4d ;
dw offset function_4e ;頁對映資訊 AL=0.1.2
new_67 :
sub ah,40h
cmp ah,0eh
jbe L100
add ah,40h
iret
L100 :
push ax
push bx
mov bh,00h
mov bl,ah
shl bx,01h
mov ax,cs:[bx+offset int67tab]
mov cs:oopstack,ax
pop bx
pop ax
add ah,40h
pusha
push ds
push es
call cs:oopstack
pop es
pop ds
popa
iret
function_40 : ;取得記憶體管理程式狀態
mov bp,sp
mov byte ptr ss:[bp+15h],00h ;AH
ret
function_41 : ;取得頁框
mov bp,sp
mov byte ptr ss:[bp+15h],00 ;AH
mov ax,cs:emsframe
mov ss:[bp+0eh],ax ;BX
ret
function_42 : ;取得頁的數目
mov ah,08h
call dword ptr cs:xmsdrv
mov ax,dx
cmp ax,0040h
jb L111
sub ax,0040h
L110 :
mov bx,0010h
xor dx,dx
div bx
mov bp,sp
mov ss:[bp+0eh],ax ;BX
mov ax,0200h
mov ss:[bp+10h],ax ;DX
mov byte ptr ss:[bp+15h],00h ;AH
ret
L111 :
mov bp,sp
mov byte ptr ss:[bp+0eh],0000h
mov word ptr ss:[bp+10h],0000h
mov byte ptr ss:[bp+15h],00h
ret
function_43 : ;配置記憶體
mov ax,bx
mov bx,0010h
xor dx,dx
mul bx
or dx,dx
jnz L125
mov dx,ax
add dx,0008h
mov ah,09h
call dword ptr cs:xmsdrv
cmp ax,0001h
jnz L125
mov bp,sp
mov ss:[bp+10h],dx
mov byte ptr ss:[bp+15h],00h
ret
L125 :
mov bp,sp
mov byte ptr ss:[bp+15h],01h
ret
function_44 : ;對應記憶體
mov cs:ipx_1,ax
mov cs:ipx_2,bx
mov cs:ipx_3,dx
mov ah,0ch
mov dx,cs:ipx_3
call dword ptr cs:xmsdrv
mov cs:ipx_4,bx
mov cs:ipx_4+02h,dx
mov ah,0dh
mov dx,cs:ipx_3
call dword ptr cs:xmsdrv
mov ax,cs:ipx_2
mov bx,4000h
xor dx,dx
mul bx
mov cs:ipx_5,ax
mov cs:ipx_5+02h,dx
mov ax,cs:ipx_4
mov dx,cs:ipx_4+02h
and ax,0f000h
add ax,1000h
adc dx,cs:ipx_5+02h
add ax,cs:ipx_5
adc dx,0000h
mov bx,cs:ipx_1
cmp bl,00h
jz L130
cmp bl,01h
jz L131
cmp bl,02h
jz L132
cmp bl,03h
jz L133
jmp L138
L130 :
mov bx,offset pgbuffer
jmp L135
L131 :
mov bx,offset pgbuffer+10h
jmp l135
L132 :
mov bx,offset pgbuffer+20h
jmp L135
L133 :
mov bx,offset pgbuffer+30h
jmp L135
L135 :
mov cx,0004h
L136 :
mov cs:[bx+01h],ah
mov cs:[bx+02h],dx
add ah,10h
adc dx,0000h
add bx,04h
loop L136
call swap_mem
mov bp,sp
mov byte ptr ss:[bp+15h],00h
ret
L138 :
mov bp,sp
mov byte ptr ss:[bp+15h],01h
ret
function_45 : ;釋還記憶體
mov ah,0ah
call dword ptr cs:xmsdrv
cmp ax,0001h
jnz L138
mov bp,sp
mov byte ptr ss:[bp+15h],00h
ret
function_46 : ;取得 EMS 版本號碼
mov bp,sp
mov word ptr ss:[bp+14h],0031h
ret
function_47 : ;儲存頁對映
push cs
pop ds
push cs
pop es
mov si,offset pgbuffer
mov di,offset pgpush
mov ds:[di],dx
add di,02h
mov cx,0040h
cld
repz movsb
mov bp,sp
mov byte ptr ss:[bp+15h],00h
ret
function_48 : ;還原頁對映
push cs
pop ds
push cs
pop es
mov si,offset pgpush
mov di,offset pgbuffer
cmp dx,ds:[si]
jnz L150
add si,02h
mov cx,0040h
cld
repz movsb
call swap_mem
mov bp,sp
mov byte ptr ss:[bp+15h],00h
ret
L150 :
mov bp,sp
mov byte ptr ss:[bp+15h],01h
ret
function_49 : ;
function_4a : ;
function_4b : ;
function_4c : ;取得檔案頭銜代表頁的數目
function_4d : ;
mov bp,sp
mov byte ptr ss:[bp+15h],01h
ret
function_4e : ;頁對映資訊 AL=0.1.2
cmp al,00h
jz L160
cmp al,01h
jz L162
cmp al,02h
jz L164
cmp al,03h
jz L166
jmp L169
L160 :
mov si,offset pgbuffer
push cs
pop ds
mov cx,0040h
cld
repz movsb
jmp L168
L162 :
push cs
pop es
mov di,offset pgbuffer
mov cx,0040h
cld
repz movsb
call swap_mem
jmp L168
L164 :
push si
push ds
push cs
pop ds
mov si,offset pgbuffer
mov cx,0040h
cld
repz movsb
pop ds
pop si
push cs
pop es
mov di,offset pgbuffer
mov cx,0040h
cld
repz movsb
call swap_mem
jmp L168
L166 :
mov bp,sp
mov word ptr ss:[bp+14h],4000h
ret
L168 :
mov bp,sp
mov byte ptr ss:[bp+15h],00h
ret
L169 :
mov bp,sp
mov byte ptr ss:[bp+15h],01h
ret
swap_mem :
push cs
pop es
mov ah,87h
mov cx,0020h
mov si,offset int15tab
int 15h
ret
tsrlong db 00h
;--------------------------------------------------------------------
; 配置 EMS
;--------------------------------------------------------------------
.386p
msg_1 db 'EMS Drive already install !',0dh,0ah,'$'
msg_2 db 'XMS Driver not found !',0dh,0ah,'$'
msg_3 db 'No EMS Frame found !',0dh,0ah,'$'
msg_4 db 'EMS frame = XX00',0dh,0ah,'$'
msg_5 db 'Page Engine not found !',0dh,0ah,'$'
number db '0123456789ABCDEF',00h
buffer1 dw 0000h,0000h
chg_data :
mov dx,0000h
mov bx,offset number
mov cx,0010h
L900 :
cmp al,cs:[bx]
jz L901
inc bx
inc dx
loop L900
mov dx,0000h
L901 :
ret
err_end :
push cs
pop ds
mov ah,09h
int 21h
mov ax,4cffh
int 21h
next :
mov ax,3567h
int 21h
mov di,000ah
mov ax,cs
mov ds,ax
mov si,offset emshead
mov cx,0008h
cld
repz cmpsb
jnz L800
mov dx,offset msg_1
; jmp err_end
L800 :
mov ax,4300h
int 2fh
cmp al,80h
jz L801
mov dx,offset msg_2
jmp err_end
L801 :
mov ax,4310h
int 2fh
mov cs:xmsdrv,bx
mov cs:xmsdrv+02h,es
NOP
mov eax,cr0
test eax,80000000h
jz L802
test eax,00000001h
jz L802
jmp L803
L802 :
mov dx,offset msg_5
jmp err_end
L803 :
NOP
mov si,offset pgframe+06h
cmp byte ptr ds:[si],'X'
jnz L818
mov ax,0c000h
L810 :
mov es,ax
mov bx,0000h
mov cx,0000h
L811 :
cmp byte ptr es:[bx],0ffh
jnz L812
inc bx
loop L811
jmp L815
L812 :
cmp ax,0e000h
jz L813
add ax,0100h
jmp L810
L813 :
mov dx,offset msg_3
jmp err_end
L815 :
mov si,offset pgframe+06h
mov cx,0004h
L816 :
rol ax,04h
mov bx,ax
and bx,000fh
mov dl,cs:[bx+offset number]
mov cs:[si],dl
inc si
loop L816
L818 :
nop
mov ax,cs
mov ds,ax
mov es,ax
mov si,offset pgframe+06h
mov al,ds:[si]
call chg_data
push dx
mov al,ds:[si+01h]
call chg_data
pop ax
mov dh,al
rol dl,04h
rol dx,04h
mov dl,00h
mov cs:emsframe,dx
NOP
mov eax,cr3
mov bx,offset int15tab+10h
mov word ptr cs:[bx],0ffffh
and eax,00ffffffh
or eax,93000000h
mov cs:[bx+02h],eax
mov word ptr cs:[bx+08h],0ffffh
xor eax,eax
xor ebx,ebx
mov ax,cs
shl eax,04h
mov bx,offset buffer1
add eax,ebx
and eax,00ffffffh
or eax,93000000h
mov bx,offset int15tab+10h
mov cs:[bx+0ah],eax
mov ah,87h
mov cx,0002h
mov si,offset int15tab
int 15h
nop
mov ax,cs:emsframe
shr ax,08h
mov bx,0004h
xor dx,dx
mul bx
xor ebx,ebx
mov bx,ax
mov edi,ebx
nop
mov bx,offset buffer1
mov eax,cs:[bx]
mov bx,offset int15tab+10h
and eax,00fff000h
add eax,edi ;PageUnit Address
or eax,93000000h
mov cs:[bx+02h],eax
mov bx,offset pgadds1 ;PageUnit Address
mov cs:[bx],eax ;PageUnit Address
xor eax,eax
xor ebx,ebx
mov ax,cs
shl eax,04h
mov bx,offset pgbuffer
add eax,ebx
and eax,00ffffffh
or eax,93000000h
mov bx,offset int15tab+10h
mov cs:[bx+0ah],eax
mov ah,87h
mov cx,0020h
mov si,offset int15tab
int 15h
NOP
mov si,offset int15tab+10h
mov eax,cs:[si+02h]
mov ebx,cs:[si+0ah]
mov cs:[si+02h],ebx
mov cs:[si+0ah],eax
NOP
mov si,offset pgframe+06h
mov di,offset msg_4+0ch
mov cx,0004h
cld
repz movsb
mov ah,09h
mov dx,offset msg_4
int 21h
NOP
push cs
pop ds
mov ax,2567h
mov dx,offset new_67
int 21h
mov dx,offset tsrlong
add dx,0200h
int 27h
start endp
code ends
end start