--- /dev/null
+;-----------------------------------------------------------\r
+;\r
+; MXVS.ASM - Set/get virtual screen\r
+; Copyright (c) 1993,1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN PRO\r
+NOWARN RES\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC mxSetVirtualScreen\r
+PUBLIC mxGetVirtualScreen\r
+\r
+EXTRN mxRowAddress : FAR\r
+EXTRN mxSetSysClipRegion : FAR\r
+\r
+MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE'\r
+ ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+EXTRN mx_BytesPerLine : WORD\r
+EXTRN mx_CodeSegment : WORD\r
+\r
+mx_VirtualWidth DW ? ; Virtual screen size\r
+mx_VirtualHeight DW ?\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Sets the virtual screen.\r
+;\r
+; Input:\r
+; Width = virtual screen width\r
+; Height = virtual screen height\r
+; Output:\r
+; 0 on success, else invalid parameters\r
+;\r
+mxSetVirtualScreen PROC FAR\r
+ ARG Height:WORD, \\r
+ Width:WORD = ARG_SIZE\r
+ ASSUME ds:NOTHING\r
+ .enter 0\r
+ .push ds\r
+\r
+; Set DS to code segment\r
+ mov ds, [mx_CodeSegment]\r
+ ASSUME ds:MX_TEXT\r
+\r
+ mov ax, 1 ; Assume an error\r
+ cmp [Width], 320 ; Check width\r
+ jb @@Exit\r
+ push ax ; Save return code\r
+ mov dx, 0004h\r
+ xor ax, ax ; DX:AX = 256K\r
+ div [Width] ; Max height in AX\r
+ cmp [Height], ax\r
+ pop ax ; Restore return code\r
+ ja @@Exit ; Exit if bad heigth\r
+\r
+ mov ax, [Width]\r
+ and ax, 0FFF8h ; Align to byte\r
+ mov [mx_VirtualWidth], ax\r
+ shr ax, 1\r
+ shr ax, 1\r
+ mov [mx_BytesPerLine], ax\r
+ shr ax, 1\r
+ push ax\r
+ call mxRowAddress ; Set row address\r
+ mov ax, [Height]\r
+ mov [mx_VirtualHeight], ax\r
+\r
+ push [Width]\r
+ push [Height]\r
+ call mxSetSysClipRegion\r
+ xor ax, ax\r
+\r
+@@Exit:\r
+ .pop ds\r
+ .leave ARG_SIZE\r
+mxSetVirtualScreen ENDP\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Returns the current virtual screen size.\r
+;\r
+; Input:\r
+; Width = pointer to virtual screen width\r
+; Height = pointer to virtual screen height\r
+; Output:\r
+; none\r
+;\r
+mxGetVirtualScreen PROC FAR\r
+ ARG Height:DWORD, \\r
+ Width:DWORD = ARG_SIZE\r
+ ASSUME ds:NOTHING\r
+ .enter 0\r
+ .push ds, si\r
+\r
+ mov ax, [mx_VirtualWidth]\r
+ lds si, [Width]\r
+ mov ds:[si], ax\r
+ mov ax, [mx_VirtualHeight]\r
+ lds si, [Height]\r
+ mov ds:[si], ax\r
+\r
+ xor ax, ax\r
+ .pop ds, si\r
+ .leave ARG_SIZE\r
+mxGetVirtualScreen ENDP\r
+\r
+MX_TEXT ENDS\r
+END\r