Metropoli BBS
VIEWER: scbstub.asm MODE: TEXT (ASCII)
.386p
locals

_TEXT           segment byte public use32 'CODE'
_TEXT           ends
_DATA           segment dword public use32 'DATA'
_DATA           ends
_BSS            segment dword public use32 'BSS'
_BSS            ends

DGROUP          group   _DATA, _BSS
assume  cs:_TEXT, ds:DGROUP

extrn   _code_data:dword
extrn   _pmstacktop:dword
extrn   _pmstacklen:dword

public  SETCBSTUB

_TEXT           segment byte public use32 'CODE'
assume  cs:_TEXT, ds:DGROUP

SETCBSTUB:
        push esi edi
        cld

        mov edi,[esp+4+8+04h]
        mov esi,offset cbstub

        mov ecx,CBSTUBLEN / 4
        rep movsd
        mov cl,CBSTUBLEN and 3
        rep movsb

        mov eax,[esp+4+8+00h]
        sub eax,_code_data
        sub eax,edi
        add eax,CBSTUBLEN-CBSTUBM1OFF-4
        mov [edi-CBSTUBLEN+CBSTUBM1OFF],eax
        mov [edi-CBSTUBLEN+CBSTUBM0OFF-2],ds

        pop edi esi
        ret 08h

_TEXT           ends

_DATA           segment dword public use32 'DATA'
assume  cs:_DATA, ds:DGROUP

cbstub:
        cld

        mov cx,2beah
CBSTUBM0OFF     = $ - cbstub
        mov ds,cx

        mov eax,_pmstacktop
        mov edx,eax
        sub edx,_pmstacklen
        mov _pmstacktop,edx
        mov dx,ss
        mov ss,cx
        xchg esp,eax
        push eax edx

        push edi
                db 0e8h
CBSTUBM1OFF     = $ - cbstub
                dd 2beaddedh
        mov edi,eax

        pop edx eax
        mov ss,dx
        mov esp,eax
        mov eax,_pmstacklen
        add _pmstacktop,eax

        iretd

CBSTUBLEN       = $ - cbstub

_DATA           ends
end

[ RETURN TO DIRECTORY ]