]> 4ch.mooo.com Git - 16.git/blob - 16/x_/mxvs.asm
^^ yay! i polished exmmtest and the memory reporter
[16.git] / 16 / x_ / mxvs.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXVS.ASM - Set/get virtual screen\r
4 ; Copyright (c) 1993,1994 by Alessandro Scotti\r
5 ;\r
6 ;-----------------------------------------------------------\r
7 WARN    PRO\r
8 NOWARN  RES\r
9 INCLUDE MODEX.DEF\r
10 \r
11 PUBLIC  mxSetVirtualScreen\r
12 PUBLIC  mxGetVirtualScreen\r
13 \r
14 EXTRN   mxRowAddress            : FAR\r
15 EXTRN   mxSetSysClipRegion      : FAR\r
16 \r
17 MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
18                 ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
19 \r
20 EXTRN   mx_BytesPerLine : WORD\r
21 EXTRN   mx_CodeSegment  : WORD\r
22 \r
23 mx_VirtualWidth         DW      ?       ; Virtual screen size\r
24 mx_VirtualHeight        DW      ?\r
25 \r
26 ;-----------------------------------------------------------\r
27 ;\r
28 ; Sets the virtual screen.\r
29 ;\r
30 ; Input:\r
31 ;       Width   = virtual screen width\r
32 ;       Height  = virtual screen height\r
33 ; Output:\r
34 ;       0 on success, else invalid parameters\r
35 ;\r
36 mxSetVirtualScreen      PROC    FAR\r
37         ARG     Height:WORD,            \\r
38                 Width:WORD              = ARG_SIZE\r
39         ASSUME  ds:NOTHING\r
40         .enter  0\r
41         .push   ds\r
42 \r
43 ; Set DS to code segment\r
44         mov     ds, [mx_CodeSegment]\r
45         ASSUME  ds:MX_TEXT\r
46 \r
47         mov     ax, 1                   ; Assume an error\r
48         cmp     [Width], 320            ; Check width\r
49         jb      @@Exit\r
50         push    ax                      ; Save return code\r
51         mov     dx, 0004h\r
52         xor     ax, ax                  ; DX:AX = 256K\r
53         div     [Width]                 ; Max height in AX\r
54         cmp     [Height], ax\r
55         pop     ax                      ; Restore return code\r
56         ja      @@Exit                  ; Exit if bad heigth\r
57 \r
58         mov     ax, [Width]\r
59         and     ax, 0FFF8h              ; Align to byte\r
60         mov     [mx_VirtualWidth], ax\r
61         shr     ax, 1\r
62         shr     ax, 1\r
63         mov     [mx_BytesPerLine], ax\r
64         shr     ax, 1\r
65         push    ax\r
66         call    mxRowAddress            ; Set row address\r
67         mov     ax, [Height]\r
68         mov     [mx_VirtualHeight], ax\r
69 \r
70         push    [Width]\r
71         push    [Height]\r
72         call    mxSetSysClipRegion\r
73         xor     ax, ax\r
74 \r
75 @@Exit:\r
76         .pop    ds\r
77         .leave  ARG_SIZE\r
78 mxSetVirtualScreen      ENDP\r
79 \r
80 ;-----------------------------------------------------------\r
81 ;\r
82 ; Returns the current virtual screen size.\r
83 ;\r
84 ; Input:\r
85 ;       Width   = pointer to virtual screen width\r
86 ;       Height  = pointer to virtual screen height\r
87 ; Output:\r
88 ;       none\r
89 ;\r
90 mxGetVirtualScreen      PROC    FAR\r
91         ARG     Height:DWORD,           \\r
92                 Width:DWORD             = ARG_SIZE\r
93         ASSUME  ds:NOTHING\r
94         .enter  0\r
95         .push   ds, si\r
96 \r
97         mov     ax, [mx_VirtualWidth]\r
98         lds     si, [Width]\r
99         mov     ds:[si], ax\r
100         mov     ax, [mx_VirtualHeight]\r
101         lds     si, [Height]\r
102         mov     ds:[si], ax\r
103 \r
104         xor     ax, ax\r
105         .pop    ds, si\r
106         .leave  ARG_SIZE\r
107 mxGetVirtualScreen      ENDP\r
108 \r
109 MX_TEXT         ENDS\r
110 END\r