Metropoli BBS
VIEWER: c0pmc.asm MODE: TEXT (CP437)
; PMC v1.01 startup header by Tran (a.k.a. Thomas Pytel).

.386p
locals

PMODE_TEXT      segment para public use16 'CODE'
PMODE_TEXT      ends
_TEXS           segment para use32 'CODE'
_TEXS           ends
_TEXT           segment para public use32 'CODE'
_TEXT           ends
_DAT@           segment para use32 'DATA'
_DAT@           ends
_DATA           segment para public use32 'DATA'
_DATA           ends
_BSR            segment para use32 'BSS'
_BSR            ends
_BSS            segment para public use32 'BSS'
_BSS            ends
_BST            segment para use32 'BSS'
_BST            ends
_STACK          segment para stack use16 'STACK'
_STACK          ends

; Without that little _DAT@ segment there, TLINK refused to put the _DATA
; segment on a paragraph boundary. That put NULL at an address higher than
; zero. That made the C NULL string not very NULL at all.

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

extrn   _pm_info:far, _pm_init:far

extrn   _pm_pagetables:byte, _pm_selectors:word, _pm_rmstacklen:word
extrn   _pm_pmstacklen:word, _pm_rmstacks:byte, _pm_pmstacks:byte
extrn   _pm_callbacks:byte

PMODE_TEXT      segment para public use16 'CODE'
assume  cs:PMODE_TEXT, ds:PMODE_TEXT

;═════════════════════════════════════════════════════════════════════════════
dataseg         dw      _DATA

errmsgtbl       dw      errmsg0,errmsg1,errmsg2,errmsg3
                dw      errmsg4,errmsg5,errmsg6

errmsg0         db      'Not enough low memory!',13,10,36
errmsg1         db      '80386 or better not detected!',13,10,36
errmsg2         db      'System already in protected mode and no VCPI or DPMI found!',13,10,36
errmsg3         db      'DPMI host is not 32bit!',13,10,36
errmsg4         db      'Could not enable A20 gate!',13,10,36
errmsg5         db      'Could not enter DPMI 32bit protected mode!',13,10,36
errmsg6         db      'Could not allocate needed DPMI selectors!',13,10,36
errmsg7         db      'Not enough extended memory!',13,10,36
errmsg8         db      'DOS version too low!',13,10,36

;═════════════════════════════════════════════════════════════════════════════
start:
        push cs
        pop ds

        call _pm_info
        jc short @@startf1

        push es
        mov ebx,offset DGROUP:__PMpagetables
        call get32bitval
        mov _pm_pagetables,al
        mov ebx,offset DGROUP:__PMselectors
        call get32bitval
        inc ax
        mov _pm_selectors,ax
        mov ebx,offset DGROUP:__PMrmstacklen
        call get32bitval
        mov _pm_rmstacklen,ax
        mov ebx,offset DGROUP:__PMpmstacklen
        call get32bitval
        mov _pm_pmstacklen,ax
        mov ebx,offset DGROUP:__PMrmstacks
        call get32bitval
        mov _pm_rmstacks,al
        mov ebx,offset DGROUP:__PMpmstacks
        call get32bitval
        mov _pm_pmstacks,al
        mov ebx,offset DGROUP:__PMcallbacks
        call get32bitval
        mov _pm_callbacks,al
        pop es

        call _pm_info
        jnc short @@startf0

;-----------------------------------------------------------------------------
@@startf1:
        mov si,ax
        add si,ax
        mov dx,errmsgtbl[si]
        mov ah,9
        int 21h

        mov ax,4cffh
        int 21h

;-----------------------------------------------------------------------------
@@startf0:
        shrd ebp,ecx,16

        mov bp,ss
        mov cx,es:[2]
        sub cx,40h
        mov es,bp
        mov ss,cx

        add bp,bx
        xor ax,ax
        cmp bp,cx
        ja @@startf1

;-----------------------------------------------------------------------------
        call _pm_init
        jc @@startf1

;-----------------------------------------------------------------------------
        mov cx,1
        xor ax,ax
        int 31h

        mov bx,ax

        mov ax,cs
        lar cx,ax
        mov cl,ch
        mov ch,0c0h
        mov ax,9
        int 31h

        mov dx,0ffffh
        mov cx,dx
        mov ax,8
        int 31h

        mov edi,_TEXT
        shl edi,4
        mov dx,di
        shld ecx,edi,16
        mov ax,7
        int 31h

        push ebx
        db 66h,68h
        dd offset start32

;-----------------------------------------------------------------------------
        mov bx,ds

        mov ax,cs
        lar cx,ax
        mov cl,ch
        and cl,60h
        or cl,92h
        mov ch,0c0h
        mov ax,9
        int 31h

        mov dx,0ffffh
        mov cx,dx
        mov ax,8
        int 31h

        mov esi,_DATA
        shl esi,4
        mov dx,si
        shld ecx,esi,16
        mov ax,7
        int 31h

        mov ds,bx

;-----------------------------------------------------------------------------
assume  ds:DGROUP
        mov ax,0ah
        int 31h

        mov _zerosel,ax
        mov bx,ax
        xor dx,dx
        xor cx,cx
        mov ax,7
        int 31h

;-----------------------------------------------------------------------------
        db 66h
        retf

;─────────────────────────────────────────────────────────────────────────────
get32bitval:
        mov eax,DGROUP
        shl eax,4
        add eax,ebx
        and bx,0fh
        shr eax,4
        mov es,ax
        mov ax,es:[bx]
        ret

;═════════════════════════════════════════════════════════════════════════════
assume  ds:DGROUP
rmcpm0noregs:
        mov edi,offset rmapm0noregs

;-----------------------------------------------------------------------------
rmcpm0:
        mov ds,cs:dataseg
        mov bx,ss

;-----------------------------------------------------------------------------
rmcpm:
        xchg ebp,ebpbuf
        push ebp

        shl ebx,16
        mov bx,sp
        sub bx,8
        xchg ebx,ssespbuf
        push ebx

        mov ebx,_pmstacktop
        push ebx

        mov eax,ebx
        sub eax,_pmstacklen
        mov _pmstacktop,eax

        mov si,_codesel
        mov dx,_datasel
        mov cx,dx
        mov ax,dx
        jmp _rmswitch

;─────────────────────────────────────────────────────────────────────────────
rmcpm0regs:
        mov edi,offset rmapm0regs
        jmp rmcpm0

;─────────────────────────────────────────────────────────────────────────────
rmcpmi0noregs:
        mov edi,offset rmapmi0noregs
        jmp rmcpm0

;─────────────────────────────────────────────────────────────────────────────
rmcpmi0regs:
        mov edi,offset rmapmi0regs
        jmp rmcpm0

;-----------------------------------------------------------------------------
rmrpm0:
        pop _pmstacktop
        pop ssespbuf
        pop ebpbuf

        retf

;─────────────────────────────────────────────────────────────────────────────
rmcpm1noregs:
        mov esi,offset rmapm1noregs

;-----------------------------------------------------------------------------
rmcpm1:
        mov ds,cs:dataseg
        mov bx,ss
        mov es,bx
        sub sp,_statesize
        mov di,sp
        xor al,al
        call _rmstate

        mov edi,esi
        jmp rmcpm

;─────────────────────────────────────────────────────────────────────────────
rmcpm1regs:
        mov esi,offset rmapm1regs
        jmp rmcpm1

;─────────────────────────────────────────────────────────────────────────────
rmcpmi1noregs:
        mov esi,offset rmapmi1noregs
        jmp rmcpm1

;─────────────────────────────────────────────────────────────────────────────
rmcpmi1regs:
        mov esi,offset rmapmi1regs
        jmp rmcpm1

;-----------------------------------------------------------------------------
rmrpm1:
        pop _pmstacktop
        pop ssespbuf
        pop ebpbuf

        mov ax,ss
        mov es,ax
        mov di,sp
        mov al,1
        call _rmstate
        add sp,_statesize

        retf

;═════════════════════════════════════════════════════════════════════════════
pmarm0noregs:
        push large offset pmrrm0
        dw 6866h,pmarmnoregsr,PMODE_TEXT
        jmp ebpbuf

;─────────────────────────────────────────────────────────────────────────────
pmarm0regs:
        push large offset pmrrm0
        mov ax,word ptr _rs[32]

;-----------------------------------------------------------------------------
pmarmregs:
        dw 6866h,pmarmregsr,PMODE_TEXT
        push ebpbuf
        push ax
        popf
        mov edi,_rs[0]
        mov esi,_rs[4]
        mov ebp,_rs[8]
        mov ebx,_rs[16]
        mov edx,_rs[20]
        mov ecx,_rs[24]
        mov eax,_rs[28]
        mov fs,_rs[38]
        mov gs,_rs[40]
        mov ds,_rs[36]
        retf

;-----------------------------------------------------------------------------
pmarmregsr:
        push ds
        mov ds,cs:dataseg
        pushf
        pop word ptr _rs[32]
        mov _rs[0],edi
        mov _rs[4],esi
        mov _rs[8],ebp
        mov _rs[16],ebx
        mov _rs[20],edx
        mov _rs[24],ecx
        mov _rs[28],eax
        mov _rs[34],es
        mov _rs[38],fs
        mov _rs[40],gs
        pop word ptr _rs[36]

;-----------------------------------------------------------------------------
pmarmnoregsr:
        mov ds,cs:dataseg
        mov ax,_datasel
        mov dx,ax
        mov cx,ax
        mov ebx,ssespbuf
        mov si,_codesel
        pop edi
        jmp _rmswitch

;─────────────────────────────────────────────────────────────────────────────
pmarmi0noregs:
        push large offset pmrrm0
        pushf
        cli
        dw 6866h,pmarmnoregsr,PMODE_TEXT
        jmp ebpbuf

;─────────────────────────────────────────────────────────────────────────────
pmarmi0regs:
        push large offset pmrrm0
        mov ax,word ptr _rs[32]
        push ax
        and ah,0fch
        jmp pmarmregs

;─────────────────────────────────────────────────────────────────────────────
pmarm1noregs:
        push large offset pmrrm1
        dw 6866h,pmarmnoregsr,PMODE_TEXT
        jmp ebpbuf

;─────────────────────────────────────────────────────────────────────────────
pmarm1regs:
        push large offset pmrrm1
        mov ax,word ptr _rs[32]
        jmp pmarmregs

;─────────────────────────────────────────────────────────────────────────────
pmarmi1noregs:
        push large offset pmrrm1
        pushf
        cli
        dw 6866h,pmarmnoregsr,PMODE_TEXT
        jmp ebpbuf

;─────────────────────────────────────────────────────────────────────────────
pmarmi1regs:
        push large offset pmrrm1
        mov ax,word ptr _rs[32]
        push ax
        and ah,0fch
        jmp pmarmregs

PMODE_TEXT      ends

extrn   MBINIT:near
extrn   MBMALLOC:near
extrn   MBCORELEFT:near
extrn   MB_INFO:near
extrn   MB_ALLOC:near
extrn   MB_FREE:near

extrn   _PMmain:near

public  EXIT
public  DATASTACK
public  RESTORESTACK

_TEXT           segment para public use32 'CODE'
assume  cs:_TEXT, ds:DGROUP
org     0

;═════════════════════════════════════════════════════════════════════════════
start32:
        cld
        sti

        mov _codebase,edi
        mov _codesel,cs
        mov _database,esi
        mov _datasel,ds

        sub edi,esi
        mov _data_code,edi
        neg edi
        mov _code_data,edi

        neg esi
        mov _zeroptr,esi

        mov bx,es:[2ch]
        mov _envsel,bx
        mov ax,6
        int 31h
        mov word ptr _envbase[0],dx
        mov word ptr _envbase[2],cx
        shrd dx,cx,4
        mov _envseg,dx

        mov bx,es
        mov _pspsel,bx
        mov ax,6
        int 31h
        mov word ptr _pspbase[0],dx
        mov word ptr _pspbase[2],cx
        shrd dx,cx,4
        mov _pspseg,dx

        mov ax,cs
        lar ax,ax
        shr ah,5
        and ah,3
        mov _CPL,ah
        mov ax,3
        int 31h
        mov _selinc,ax
        shld eax,ebp,8
        mov _PMtype,al
        mov ax,400h
        int 31h
        mov _DPMIversion,ax
        mov _processor,cl
        mov _PICmaster,dh
        mov _PICslave,dl

        mov ax,305h
        int 31h
        mov _statesize,ax
        mov word ptr _rmstate[0],cx
        mov word ptr _rmstate[2],bx
        mov dword ptr _pmstate[0],edi
        mov word ptr _pmstate[4],si
        mov ax,306h
        int 31h
        mov word ptr _rmswitch[0],cx
        mov word ptr _rmswitch[2],bx
        mov dword ptr _pmswitch[0],edi
        mov word ptr _pmswitch[4],si

        mov ah,30h
        int 21h
        xchg al,ah
        mov _osversion,ax
        cmp ax,__minosversion
        jae short @@start32f0

        mov ax,offset errmsg8

;-----------------------------------------------------------------------------
@@start32f1:
        push ds
        pop es

        mov edi,offset DGROUP:_rs
        mov [edi+14h],ax
        mov word ptr [edi+24h],PMODE_TEXT
        mov byte ptr [edi+1ch+1],9
        xor cx,cx
        mov bx,21h
        mov ax,300h
        int 31h

        mov ax,4cffh
        int 21h

;-----------------------------------------------------------------------------
@@start32f0:
        movzx edi,word ptr es:[2]
        movzx esi,bp
        shl edi,4
        shl esi,4

        push ds
        pop es

        mov eax,__stklen
        add eax,0fh
        and al,0f0h

        add esi,eax
        mov ax,offset errmsg0
        sub edi,esi
        jc @@start32f1

        mov ebx,esi
        sub ebx,_database
        mov ax,ds
        mov ss,ax
        mov esp,ebx

;-----------------------------------------------------------------------------
        mov edx,edi
;       mov edi,offset DGROUP:BSSinitstart
;       mov ecx,offset DGROUP:BSSinitend
;       sub ecx,edi
;       shr ecx,2
        mov edi,_BSR
        mov ecx,_BST
        sub ecx,edi
        shl ecx,2
        sub edi,dword ptr __DATAseg
        shl edi,4
        xor eax,eax
        rep stosd
        mov edi,edx

;-----------------------------------------------------------------------------
        mov ebx,__lowheaplen
        add ebx,MBheadersize
        add ebx,3
        mov ax,offset errmsg0
        cmp edi,ebx
        jb @@start32f1

        mov _lowheapblock[0],esi
        mov _lowheapblock[4],edi

        push offset DGROUP:_lowheapblock
        call MBINIT

;-----------------------------------------------------------------------------
        movzx ecx,__lowbuflen
        jecxz short @@start32f4

        push offset DGROUP:_lowheapblock
        push ecx
        call MBMALLOC

        mov __lowbufptr,eax
        or eax,eax
        mov ax,offset errmsg0
        jz @@start32f1

;-----------------------------------------------------------------------------
@@start32f4:
        cmp _statesize,0
        je short @@start32f5

        mov _rmcpmnoregs,offset rmcpm1noregs
        mov _rmcpmregs,offset rmcpm1regs
        mov _rmcpminoregs,offset rmcpmi1noregs
        mov _rmcpmiregs,offset rmcpmi1regs
        mov _pmcrmnoregs,offset pmcrm1noregs
        mov _pmcrmregs,offset pmcrm1regs
        mov _pmcrminoregs,offset pmcrmi1noregs
        mov _pmcrmiregs,offset pmcrmi1regs

;-----------------------------------------------------------------------------
@@start32f5:
        movzx edi,__pmcrmstacks
        movzx eax,__pmcrmstacklen
        shl eax,4
        mov _rmstacklen,ax
        imul edi,eax

        movzx esi,__rmcpmstacks
        movzx eax,__rmcpmstacklen
        shl eax,4
        mov _pmstacklen,eax
        imul esi,eax

        lea eax,[esi+edi+0fh]
        push offset DGROUP:_lowheapblock
        push eax
        call MBMALLOC

        lea ebx,[eax+0fh]
        and bl,0f0h
        mov _pmstackbase,ebx
        add ebx,esi
        mov _pmstacktop,ebx
        add ebx,_database
        shr ebx,4
        mov _rmstackbase,bx
        shr edi,4
        add ebx,edi
        mov _rmstacktop,bx

        or eax,eax
        mov ax,offset errmsg0
        jz @@start32f1

;-----------------------------------------------------------------------------
        push offset DGROUP:_lowheapblock
        call MBCORELEFT
        cmp eax,__lowheaplen
        mov ax,offset errmsg0
        jb @@start32f1

;-----------------------------------------------------------------------------
        mov edi,__extheapmax
        or edi,edi
        jz short @@start32f2

        add edi,MBheadersize
        add edi,3
        call MB_INFO

        cmp edi,eax
        jb short @@start32f3
        mov edi,eax

@@start32f3:
        mov edx,__extheapmin
        lea esi,[edx+3]
        add esi,MBheadersize

@@start32l0:
        mov ax,offset errmsg7
        cmp edi,esi
        ja short @@start32l0f1

        cmp edi,edx
        jb @@start32f1

        jmp short @@start32f2

@@start32l0f1:
        push offset DGROUP:_extheapblock
        push edi
        call MB_ALLOC

        sub edi,1024
        or eax,eax
        js @@start32l0

        push offset DGROUP:_extheapblock
        call MBINIT
@@start32f2:

;-----------------------------------------------------------------------------
        call _PMmain

        push eax
        push eax
EXIT:
        cmp _extheapblock[4],0
        je short @@exitf0

        push offset DGROUP:_extheapblock
        call MB_FREE

@@exitf0:
        mov al,[esp+4]
        mov ah,4ch
        int 21h

;═════════════════════════════════════════════════════════════════════════════
pmcrm0noregs:
        mov di,offset pmarm0noregs

;-----------------------------------------------------------------------------
pmcrm:
        xchg ebp,ebpbuf
        push ebp

        lea eax,[esp-6]
        xchg eax,ssespbuf
        push eax

        mov dx,_rmstacktop
        mov bx,_rmstacklen
        push dx

        sub dx,__pmcrmstacklen
        mov _rmstacktop,dx

        mov si,PMODE_TEXT
        mov cx,word ptr _rs[34]
        mov ax,_DATA

        jmp _pmswitch

;─────────────────────────────────────────────────────────────────────────────
pmcrm0regs:
        mov di,offset pmarm0regs
        jmp pmcrm
        
;─────────────────────────────────────────────────────────────────────────────
pmcrmi0noregs:
        mov di,offset pmarmi0noregs
        jmp pmcrm
        
;─────────────────────────────────────────────────────────────────────────────
pmcrmi0regs:
        mov di,offset pmarmi0regs
        jmp pmcrm
        
;-----------------------------------------------------------------------------
pmrrm0:
        pop _rmstacktop
        pop ssespbuf
        pop ebpbuf

        cld
        ret

;─────────────────────────────────────────────────────────────────────────────
pmcrm1noregs:
        mov si,offset pmarm1noregs

;-----------------------------------------------------------------------------
pmcrm1:
        sub esp,dword ptr _statesize
        mov edi,esp
        xor al,al
        call _pmstate

        mov edi,esi
        jmp pmcrm

;─────────────────────────────────────────────────────────────────────────────
pmcrm1regs:
        mov si,offset pmarm1regs
        jmp pmcrm1

;─────────────────────────────────────────────────────────────────────────────
pmcrmi1noregs:
        mov si,offset pmarmi1noregs
        jmp pmcrm1

;─────────────────────────────────────────────────────────────────────────────
pmcrmi1regs:
        mov si,offset pmarmi1regs
        jmp pmcrm1

;-----------------------------------------------------------------------------
pmrrm1:
        pop _rmstacktop
        pop ssespbuf
        pop ebpbuf

        mov edi,esp
        mov al,1
        call _pmstate
        add esp,dword ptr _statesize

        cld
        ret

;═════════════════════════════════════════════════════════════════════════════
rmapm0noregs:
        push offset rmrpm0
        push offset rmapmnoregsr
        cld
        jmp ebpbuf

;─────────────────────────────────────────────────────────────────────────────
rmapm0regs:
        push offset rmrpm0

;─────────────────────────────────────────────────────────────────────────────
rmapmregs:
        push offset rmapmregsr
        mov edi,_rs[0]
        mov esi,_rs[4]
        mov ebp,_rs[8]
        mov ebx,_rs[16]
        mov edx,_rs[20]
        mov ecx,_rs[24]
        mov eax,_rs[28]
        cld
        jmp ebpbuf

;-----------------------------------------------------------------------------
rmapmregsr:
        db 66h,9ch
        pop word ptr _rs[32]
        mov _rs[0],edi
        mov _rs[4],esi
        mov _rs[8],ebp
        mov _rs[16],ebx
        mov _rs[20],edx
        mov _rs[24],ecx
        mov _rs[28],eax

;-----------------------------------------------------------------------------
rmapmnoregsr:
        mov ax,_DATA
        mov bx,word ptr ssespbuf
        mov dx,word ptr ssespbuf[2]
        mov si,PMODE_TEXT
        pop edi
        jmp _pmswitch

;─────────────────────────────────────────────────────────────────────────────
rmapmi0noregs:
        push offset rmrpm0
        pushfd
        cli
        push cs
        push offset rmapmnoregsr
        cld
        jmp ebpbuf

;─────────────────────────────────────────────────────────────────────────────
rmapmi0regs:
        push offset rmrpm0
        pushfd
        cli
        push cs
        jmp rmapmregs

;─────────────────────────────────────────────────────────────────────────────
rmapm1noregs:
        push offset rmrpm1
        push offset rmapmnoregsr
        cld
        jmp ebpbuf

;─────────────────────────────────────────────────────────────────────────────
rmapm1regs:
        push offset rmrpm1
        jmp rmapmregs

;─────────────────────────────────────────────────────────────────────────────
rmapmi1noregs:
        push offset rmrpm1
        pushfd
        cli
        push cs
        push offset rmapmnoregsr
        cld
        jmp ebpbuf

;─────────────────────────────────────────────────────────────────────────────
rmapmi1regs:
        push offset rmrpm1
        pushfd
        cli
        push cs
        jmp rmapmregs

;═════════════════════════════════════════════════════════════════════════════
DATASTACK:
        mov eax,_pmstacktop
        mov ecx,eax
        sub ecx,_pmstacklen
        mov _pmstacktop,ecx
        pop ecx
        mov dx,ss
        mov ss,_datasel
        xchg esp,eax
        jmp ecx

;═════════════════════════════════════════════════════════════════════════════
RESTORESTACK:
        pop ecx
        mov ss,dx
        mov esp,eax
        mov eax,_pmstacklen
        add _pmstacktop,eax
        jmp ecx

_TEXT           ends

extrn   MBheadersize:dword

extrn   __PMpagetables:byte
extrn   __PMselectors:word
extrn   __PMrmstacklen:word
extrn   __PMpmstacklen:word
extrn   __PMrmstacks:byte
extrn   __PMpmstacks:byte
extrn   __PMcallbacks:byte
extrn   __pmcrmstacklen:word
extrn   __pmcrmstacks:byte
extrn   __rmcpmstacklen:word
extrn   __rmcpmstacks:byte

extrn   __stklen:dword
extrn   __lowheaplen:dword
extrn   __extheapmin:dword
extrn   __extheapmax:dword
extrn   __minosversion:word
extrn   __lowbufptr:dword
extrn   __lowbuflen:word

public  _codebase
public  _database
public  _pspbase
public  _envbase
public  _codesel
public  _datasel
public  _pspsel
public  _envsel
public  _zerosel
public  __TEXTseg
public  __DATAseg
public  __BSSseg
public  _pspseg
public  _envseg
public  _zeroptr
public  _data_code
public  _code_data

public  _osversion
public	_osminor
public	_osmajor
public	_DPMIversion
public	_DPMIminor
public	_DPMImajor

public	_CPL
public	_selinc
public	_PMtype
public	_processor
public  _PICtable
public  _PICmaster
public	_PICslave

public  _rmstate
public	_rmswitch
public	_pmstate
public	_pmswitch
public  _statesize

public  _pmcrmnoregs
public  _pmcrmregs
public  _pmcrminoregs
public  _pmcrmiregs
public  _rmcpmnoregs
public  _rmcpmregs
public  _rmcpminoregs
public  _rmcpmiregs

public  _pmstacklen
public  _pmstackbase
public  _pmstacktop
public  _rmstacklen
public  _rmstackbase
public  _rmstacktop

public  _lowheapblock
public  _extheapblock
public  _rs

_DATA           segment para public use32 'DATA'
org     0
NULL            dd      0

_codebase       dd      ?               ; linear base of 32bit code segment
_database       dd      ?               ; linear base of 32bit data segment
_pspbase        dd      ?               ; linear base of PSP
_envbase        dd      ?               ; linear base of environment
_codesel        dw      ?, 0            ; 32bit code selector
_datasel        dw      ?, 0            ; 32bit data selector
_pspsel         dw      ?, 0            ; PSP selector
_envsel         dw      ?, 0            ; environment selector
_zerosel        dw      ?, 0            ; zero base selector
__TEXTseg       dw      _TEXT, 0
__DATAseg       dw      _DATA, 0
__BSSseg        dw      _BSS, 0
_pspseg         dw      ?, 0
_envseg         dw      ?, 0
_zeroptr        dd      ?               ; realative ptr to 0
_data_code      dd      ?               ; _codebase - _database
_code_data      dd      ?               ; _database - _codebase

_osversion      label   word            ; full DOS version                   |
_osminor        db      ?               ; minor version of DOS               |
_osmajor        db      ?               ; major version of DOS               |
                dw      0
_DPMIversion    label   word            ; full DPMI version                  |
_DPMIminor      db      ?               ; minor version of DPMI              |
_DPMImajor      db      ?               ; major version of DPMI              |
                dw      0

_rmstate        dd      ?               ; real mode state save seg:off
_rmswitch       dd      ?               ; real mode mode switch seg:off
_pmstate        df      ?               ; protected mode state save sel:off
_pmswitch       df      ?               ; protected mode mode switch sel:off
_statesize      dw      ?, 0            ; size of state buffer
_rmcpmnoregs    dw      rmcpm0noregs    ; call protected mode, no regs       |
                dw      PMODE_TEXT      ;                                    |
_rmcpmregs      dw      rmcpm0regs      ; call protected mode, regs         |
                dw      PMODE_TEXT      ;                                   |
_rmcpminoregs   dw      rmcpmi0noregs   ; call protected mode iret, no regs  |
                dw      PMODE_TEXT      ;                                    |
_rmcpmiregs     dw      rmcpmi0regs     ; call protected mode iret, regs    |
                dw      PMODE_TEXT      ;                                   |
_pmstacklen     dd      ?
_pmstackbase    dd      ?
_pmstacktop     dd      ?
_pmcrmnoregs    dd      pmcrm0noregs    ; call real mode, no regs
_pmcrmregs      dd      pmcrm0regs      ; call real mode, pass regs
_pmcrminoregs   dd      pmcrmi0noregs   ; call real mode iret, no regs
_pmcrmiregs     dd      pmcrmi0regs     ; call real mode iret, pass regs
_rmstacklen     dw      ?, 0
_rmstackbase    dw      ?, 0
_rmstacktop     dw      ?, 0

ssespbuf        dd      ?
ebpbuf          dd      ?               ; QDPMI bug forces use of this

_selinc         dw      ?, 0            ; selector increment value
_CPL            db      ?, 0,0,0        ; task CPL
_PMtype         db      ?, 0,0,0        ; protected mode type (from PMODE)
_processor      db      ?, 0,0,0        ; processor type
_PICtable       label   byte            ;                                    |
_PICmaster      db      ?               ; base interrupt of master PIC       |
_PICslave       db      ?               ; base interrupt of slave PIC        |
                db      ?,?             ; for alignment

_lowheapblock   dd      0,0,0           ; low memory heap info block
_extheapblock   dd      0,0,0           ; extended memory heap info block

_rs             label   dword           ; register data structure
                db      32h dup(0)

_DATA           ends

_BSR            segment para use32 'BSS'
BSSinitstart    label   byte
_BSR            ends

_BST            segment para use32 'BSS'
BSSinitend      label   byte
_BST            ends

_STACK          segment para stack use16 'STACK'
                db      400h dup(?)
_STACK          ends

end     start

[ RETURN TO DIRECTORY ]