]> 4ch.mooo.com Git - 16.git/blobdiff - 16/x_/mxvs.asm
refresh wwww
[16.git] / 16 / x_ / mxvs.asm
diff --git a/16/x_/mxvs.asm b/16/x_/mxvs.asm
new file mode 100755 (executable)
index 0000000..992eaba
--- /dev/null
@@ -0,0 +1,110 @@
+;-----------------------------------------------------------\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