|
|
; ; spcemm.asm, ; ; 10-Dec-1992 Jonle , adapted from em_drvr.asm from Insignia solutions ; ; This code serves as a stub device driver for emm memory manager. ; Its sole purpose is for apps to be able to identify that an emm driver is ; loaded and that LIM services are available. This code is linked into the ; device driver chain contains a strategy, interrupt and device header ; ; The driver should only be loaded if emm memory is available ; from NTVDM. ;
BOP MACRO callid db 0c4h, 0c4h, callid endm
; ; Request Header, for initialization ; REQHEAD STRUC ReqLen DB ? ; Length in bytes of request block ReqUnit DB ? ; Block Device unit number ReqFunc DB ? ; Type of request ReqStat DW ? ; Status Word REQHEAD ENDS
; ; Segment definitions for ntio.sys, ; include biosseg.inc include vint.inc
SpcEmmSeg segment
assume cs:SpcEmmSeg,ds:nothing,es:nothing
; ; SpcEmmBeg - SpcEmmEnd ; ; Marks the resident code, anything outside of these markers ; is discarded after intialization ; 11-Dec-1992 Jonle ;
public SpcEmmBeg
SpcEmmBeg label byte
; ; character device Header ; must be first in the .sys file ; dd -1 ;pointer to next device driver dw 8000H ;attribute (plain character device) dw offset STRATEGY ;pointer to device "strategy" routine dw offset Interrupt ;pointer to device "interrupt" routine db 'EMMXXXX0' ;8 byte name DO NOT CHANGE THE NAME
; ; Request Header address, saved here by strategy routine ; pReqHdr dd ?
; ; Device "strategy" entry point, save request header address ; Strategy proc far mov word ptr cs:pReqHdr, bx mov word ptr cs:pReqHdr+2, es ret Strategy endp
; EmmIsr - int 67h isr ; EmmIsr: ; LIM Isr bop 67h emmiret: FIRET
; ret trap for em function 'alter page map & call' EmmRet: bop 68h jmp emmiret
;---------------------------------------------------------------------- ; Device "interrupt" entry point ;---------------------------------------------------------------------- Interrupt PROC FAR
push es push di
les di, cs:pReqHdr ; check for valid commands cmp es:[di.ReqFunc], 0ah je validcmd cmp es:[di.ReqFunc], 0 je validcmd
mov ax, 8003h ; we don't handle anything else jmp short irptexit
validcmd: xor ax,ax
irptexit: or ax, 0100h ;tell em we finished mov es:[di.ReqStat],AX ;store status in request header
pop di pop es ret
Interrupt ENDP
public SpcEmmEnd SpcEmmEnd label byte
public InitSpcEmm ; ; InitSpcEmm Initializes Spc 32 bit memory manager ; returns ax=0 for success ; ; Inputs: ds is expected seg for drv code, cs is temporary sysinitseg ; Outputs: ax zero for success ; InitSpcEmm proc near
; BOP 66 - initialize LIM memory ; pass the address of bop 68 to the em manager ; in ds:dx and to return the number of em pages in BX ; ; NOTE: All EMM options come from pif file ; There are NO command line options xor bx, bx mov dx, offset EmmRet bop 66h cmp bx, 0ffffh ;ffff means incorrect config (eg no 64K gap) je fail cmp bx, 0 ;check expanded memory is available je fail
; set up IVT for INT 67h FCLI xor ax, ax mov es, ax mov bx, offset EmmIsr mov word ptr es:[67h*4], bx mov word ptr es:[(67h*4)+2], ds FSTI
ret fail: mov ax, 0ffffh ret
InitSpcEmm endp
SpcEmmSeg ends end
|