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