--- /dev/null
+;-----------------------------------------------------------\r
+;\r
+; MXIT.ASM - Initialization/termination functions\r
+; Copyright (c) 1993,1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN PRO\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC mxInit\r
+PUBLIC mxTerm\r
+\r
+PUBLIC mx_VideoSegment\r
+PUBLIC mx_CodeSegment\r
+\r
+MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE'\r
+ ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+DB 'MODEX library - Copyright (c) 1992-1994 Alessandro Scotti'\r
+\r
+mx_VideoSegment DW 0A000h\r
+mx_CodeSegment DW SEG MX_TEXT\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Initialization.\r
+;\r
+; Input:\r
+; none\r
+; Output:\r
+; AX = 0 on success\r
+;\r
+mxInit PROC FAR\r
+ LOCAL Result:WORD, \\r
+ VideoSeg:WORD, \\r
+ CStoDSalias:WORD = AUTO_SIZE\r
+ ASSUME ds:NOTHING\r
+ .enter AUTO_SIZE\r
+ .push ds, si, es, di\r
+\r
+ mov [Result], -1 ; Assume an error\r
+ mov [VideoSeg], 0A000h ; Real mode video segment\r
+ mov [CStoDSalias], cs ; Real mode data alias for CS\r
+\r
+; Check if running in protected mode under DPMI\r
+ mov ax, 1686h\r
+ int 2Fh\r
+ or ax, ax\r
+ jnz @@1 ; DPMI not found, continue in real mode\r
+\r
+; Get a data alias for CS\r
+ mov ax, 000Ah ; DMPI: create data alias\r
+ mov bx, cs\r
+ int 31h\r
+ jc @@Exit ; Exit if service failed\r
+ mov [CStoDSalias], ax ; Save data alias for CS\r
+; Get a protected-mode selector for the video segment\r
+ mov ax, 0002h\r
+ mov bx, 0A000h ; Real mode segment of video\r
+ int 31h ; DPMI: get segment selector\r
+ jc @@Exit ; Exit if service failed\r
+ mov [VideoSeg], ax ; Save protected mode video selector\r
+\r
+; Initialize variables\r
+@@1:\r
+ mov ds, [CStoDSalias]\r
+ ASSUME ds:MX_TEXT\r
+ mov [mx_CodeSegment], ds\r
+ mov ax, [VideoSeg]\r
+ mov [mx_VideoSegment], ax\r
+\r
+; Don't bother with VGA check for now...\r
+\r
+ mov [Result], 0\r
+\r
+@@Exit:\r
+ mov ax, [Result]\r
+ .pop ds, si, es, di\r
+ .leave\r
+mxInit ENDP\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Termination.\r
+;\r
+; Input:\r
+; none\r
+; Output:\r
+; always 0.\r
+;\r
+mxTerm PROC FAR\r
+ ASSUME ds:NOTHING\r
+ xor ax, ax\r
+ ret\r
+mxTerm ENDP\r
+\r
+MX_TEXT ENDS\r
+END\r