]> 4ch.mooo.com Git - 16.git/blob - 16/x_/mxss.asm
code miraculously works on real hardware
[16.git] / 16 / x_ / mxss.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXSS.ASM - Split screen function\r
4 ; Copyright (c) 1993,1994 by Alessandro Scotti\r
5 ;\r
6 ;-----------------------------------------------------------\r
7 WARN    PRO\r
8 INCLUDE MODEX.DEF\r
9 \r
10 PUBLIC  mxSplitScreen\r
11 \r
12 MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
13                 ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
14 \r
15 ;-----------------------------------------------------------\r
16 ;\r
17 ; Splits the screen.\r
18 ;\r
19 ; Input:\r
20 ;       Line    = scan line at which screen has to be splitted\r
21 ; Output:\r
22 ;       none\r
23 ;\r
24 mxSplitScreen   PROC    FAR\r
25         ARG     Line:WORD       = ARG_SIZE\r
26         ASSUME  ds:NOTHING\r
27         .enter  0\r
28 \r
29 ; Modify the line compare value: bits 0-7 are in the Line Compare\r
30 ; register (CRTC #18), bit 8 is in the Overflow Low register (CRTC #7)\r
31 ; and bit 9 is in the Maximum Row Address register (CRTC #9)\r
32         mov     ax, [Line]\r
33         shl     ax, 1                   ; Adjust line for mode "X"\r
34         mov     bh, ah\r
35         mov     bl, ah\r
36         and     bx, 0201h\r
37         mov     cl, 4\r
38         shl     bx, cl\r
39         shl     bh, 1\r
40         mov     dx, CRTC\r
41 ; Write bits 0-7 to line compare register\r
42         mov     ah, al\r
43         mov     al, 18h\r
44         out     dx, ax\r
45 ; Write bit 8 to overflow register\r
46         mov     al, 07h\r
47         out     dx, al\r
48         inc     dx\r
49         in      al, dx\r
50         dec     dx\r
51         mov     ah, al\r
52         and     ah, 11101111b\r
53         or      ah, bl\r
54         mov     al, 07h\r
55         out     dx, ax\r
56 ; Write bit 9 to maximum row address register\r
57         mov     al, 09h\r
58         out     dx, al\r
59         inc     dx\r
60         in      al, dx\r
61         dec     dx\r
62         mov     ah, al\r
63         and     ah, 10111111b\r
64         or      ah, bh\r
65         mov     al, 09h\r
66         out     dx, ax\r
67 \r
68         .leave  ARG_SIZE\r
69 mxSplitScreen   ENDP\r
70 \r
71 MX_TEXT         ENDS\r
72 END\r