201 lines
5.2 KiB
NASM
201 lines
5.2 KiB
NASM
|
title Special Export call locations for DS == SS conversion.
|
|||
|
|
|||
|
; Windows Write, Copyright 1985-1992 Microsoft Corporation
|
|||
|
|
|||
|
?DF = 1 ; Dont generate default segment definitions
|
|||
|
?PLM = 1
|
|||
|
.XLIST
|
|||
|
include cmacros.inc
|
|||
|
.LIST
|
|||
|
|
|||
|
subttl Define Windows Groups
|
|||
|
page
|
|||
|
|
|||
|
MGROUP group HEADER,EXPORTS,IMPORTS,IMPORTEND,ENDHEADER
|
|||
|
IGROUP group _TEXT,_INITTEXT,_ENDTEXT
|
|||
|
DGROUP group _DATA,DATA,CDATA,CONST,_BSS,c_common,_INITDATA,_ENDDATA,STACK
|
|||
|
HEADER segment para 'MODULE'
|
|||
|
HEADER ENDS
|
|||
|
EXPORTS segment byte 'MODULE'
|
|||
|
EXPORTS ENDS
|
|||
|
IMPORTS segment byte public 'MODULE'
|
|||
|
IMPORTS ENDS
|
|||
|
IMPORTEND segment byte 'MODULE'
|
|||
|
IMPORTEND ENDS
|
|||
|
ENDHEADER segment para 'MODULE'
|
|||
|
ENDHEADER ENDS
|
|||
|
_TEXT segment byte public 'CODE'
|
|||
|
_TEXT ENDS
|
|||
|
_INITTEXT segment para public 'CODE'
|
|||
|
_INITTEXT ends
|
|||
|
_ENDTEXT segment para 'CODE'
|
|||
|
_ENDTEXT ends
|
|||
|
|
|||
|
_DATA segment para public 'DATA'
|
|||
|
|
|||
|
STACKSIZE = 2048
|
|||
|
|
|||
|
$$STACK dw STACKSIZE dup (?)
|
|||
|
$$STACKTOP label word
|
|||
|
dw 0
|
|||
|
|
|||
|
_DATA ends
|
|||
|
|
|||
|
DATA segment para public 'DATA'
|
|||
|
DATA ends
|
|||
|
CDATA segment word common 'DATA' ; C globals end up here
|
|||
|
CDATA ends
|
|||
|
CONST segment word public 'CONST'
|
|||
|
CONST ends
|
|||
|
_BSS segment para public 'BSS'
|
|||
|
_BSS ends
|
|||
|
c_common segment para common 'BSS' ; C globals end up here
|
|||
|
c_common ends
|
|||
|
_INITDATA segment para public 'BSS'
|
|||
|
_INITDATA ends
|
|||
|
_ENDDATA segment para 'BSS'
|
|||
|
_ENDDATA ends
|
|||
|
|
|||
|
STACK segment para stack 'STACK'
|
|||
|
DB 0 ; Force link to write entire DGROUP
|
|||
|
STACK ends
|
|||
|
|
|||
|
subttl ENTRYPOINT definition
|
|||
|
page
|
|||
|
|
|||
|
ENTRYPOINT MACRO name, cwArgs
|
|||
|
extrn x&name:far
|
|||
|
public name
|
|||
|
name proc far
|
|||
|
mov ax,ds ; we have to include all this code
|
|||
|
nop ; or exe2mod chokes
|
|||
|
inc bp
|
|||
|
push bp
|
|||
|
mov bp,sp
|
|||
|
push ds
|
|||
|
mov ds,ax
|
|||
|
|
|||
|
mov cx,cwArgs * 2
|
|||
|
mov dx,offset igroup:x&name
|
|||
|
jmp SetLocStack
|
|||
|
name endp
|
|||
|
|
|||
|
ENDM
|
|||
|
|
|||
|
subttl external->local stack switcher
|
|||
|
page
|
|||
|
|
|||
|
_TEXT segment byte public 'CODE'
|
|||
|
assume cs:igroup, ds:dgroup, es:dgroup, ss:nothing
|
|||
|
|
|||
|
;
|
|||
|
; SetLocStack
|
|||
|
;
|
|||
|
; Purpose: To switch to a seperate stack located in the
|
|||
|
; Modules Data Segment.
|
|||
|
;
|
|||
|
; Inputs: AX = module's DS
|
|||
|
; SS, SP, BP = caller's stack stuff
|
|||
|
; DS = "true" entry point addr
|
|||
|
; cx = no. of bytes of parameters on caller's stack
|
|||
|
;
|
|||
|
SetLocStack proc near
|
|||
|
mov bx,ss ; get copy of current segment
|
|||
|
cmp ax,bx ; see if we're already in local stack
|
|||
|
je inlocal ; we are - fall into existing code
|
|||
|
|
|||
|
mov cs:SESPat,cx ; save arg byte count for return
|
|||
|
|
|||
|
mov ss,ax
|
|||
|
mov sp,offset dgroup:$$STACKTOP
|
|||
|
|
|||
|
push bx ; save old ss
|
|||
|
sub bp,2 ; point at the pushed ds
|
|||
|
push bp ; and old sp
|
|||
|
push si ; save si
|
|||
|
|
|||
|
jcxz argdone
|
|||
|
|
|||
|
mov ds,bx
|
|||
|
lea si,[bp + 8 - 2] ; point past ds, bp, far addr to args
|
|||
|
add si,cx ; point at top of args for backward move
|
|||
|
|
|||
|
std
|
|||
|
shr cx,1 ; divide byte count by two
|
|||
|
jcxz argdone
|
|||
|
argloop:
|
|||
|
lodsw
|
|||
|
push ax
|
|||
|
loop argloop
|
|||
|
cld
|
|||
|
|
|||
|
argdone:
|
|||
|
push cs
|
|||
|
mov ax,offset igroup:SetExtStack ; push setextstack return addr
|
|||
|
push ax
|
|||
|
|
|||
|
mov ax,ss ; get new ds into ds and ax
|
|||
|
mov ds,ax
|
|||
|
|
|||
|
push dx ; jump to true entry point via RET
|
|||
|
ret
|
|||
|
|
|||
|
inlocal:
|
|||
|
add dx,10 ; point past prolog code
|
|||
|
push dx ; jump into middle of prolog code
|
|||
|
ret
|
|||
|
|
|||
|
SetLocStack endp
|
|||
|
|
|||
|
SetExtStack proc near
|
|||
|
pop si ; get back saved si
|
|||
|
pop bp ; get old sp
|
|||
|
pop bx ; and old ss
|
|||
|
|
|||
|
mov ss,bx
|
|||
|
mov sp,bp ; now set them up
|
|||
|
|
|||
|
pop ds ; standard epilog stuff
|
|||
|
pop bp
|
|||
|
dec bp
|
|||
|
|
|||
|
db 0cah ;RETF n instruction
|
|||
|
SESPat dw 0
|
|||
|
|
|||
|
SetExtStack endp
|
|||
|
|
|||
|
subttl Entry point definitions
|
|||
|
page
|
|||
|
;
|
|||
|
; mp module entry points
|
|||
|
;
|
|||
|
ENTRYPOINT MMpNew, 3
|
|||
|
ENTRYPOINT MMpLoad, 2
|
|||
|
ENTRYPOINT MMpFree, 2
|
|||
|
;
|
|||
|
; routines called by interface module
|
|||
|
;
|
|||
|
ENTRYPOINT MRgchVal, 6
|
|||
|
ENTRYPOINT Mdecode, 2
|
|||
|
ENTRYPOINT MEnter, 1
|
|||
|
ENTRYPOINT Fill, 1
|
|||
|
ENTRYPOINT Clear, 0
|
|||
|
ENTRYPOINT Format, 1
|
|||
|
ENTRYPOINT MCellsContract, 0
|
|||
|
ENTRYPOINT MInsertBents, 8
|
|||
|
ENTRYPOINT MSheetCut, 0
|
|||
|
ENTRYPOINT MSheetCopy, 0
|
|||
|
ENTRYPOINT MSheetPaste, 1
|
|||
|
ENTRYPOINT MExeCut, 0
|
|||
|
ENTRYPOINT MExePaste, 0
|
|||
|
ENTRYPOINT CheckRecalc, 0
|
|||
|
ENTRYPOINT recalc, 1
|
|||
|
ENTRYPOINT MLoadSheet, 2
|
|||
|
ENTRYPOINT MSaveSheet, 3
|
|||
|
ENTRYPOINT MSortDialog, 4
|
|||
|
|
|||
|
|
|||
|
_TEXT ENDS
|
|||
|
|
|||
|
end
|
|||
|
|