--- /dev/null
+;-----------------------------------------------------------\r
+;\r
+; MXSS.ASM - Split screen function\r
+; Copyright (c) 1993,1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN PRO\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC mxSplitScreen\r
+\r
+MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE'\r
+ ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Splits the screen.\r
+;\r
+; Input:\r
+; Line = scan line at which screen has to be splitted\r
+; Output:\r
+; none\r
+;\r
+mxSplitScreen PROC FAR\r
+ ARG Line:WORD = ARG_SIZE\r
+ ASSUME ds:NOTHING\r
+ .enter 0\r
+\r
+; Modify the line compare value: bits 0-7 are in the Line Compare\r
+; register (CRTC #18), bit 8 is in the Overflow Low register (CRTC #7)\r
+; and bit 9 is in the Maximum Row Address register (CRTC #9)\r
+ mov ax, [Line]\r
+ shl ax, 1 ; Adjust line for mode "X"\r
+ mov bh, ah\r
+ mov bl, ah\r
+ and bx, 0201h\r
+ mov cl, 4\r
+ shl bx, cl\r
+ shl bh, 1\r
+ mov dx, CRTC\r
+; Write bits 0-7 to line compare register\r
+ mov ah, al\r
+ mov al, 18h\r
+ out dx, ax\r
+; Write bit 8 to overflow register\r
+ mov al, 07h\r
+ out dx, al\r
+ inc dx\r
+ in al, dx\r
+ dec dx\r
+ mov ah, al\r
+ and ah, 11101111b\r
+ or ah, bl\r
+ mov al, 07h\r
+ out dx, ax\r
+; Write bit 9 to maximum row address register\r
+ mov al, 09h\r
+ out dx, al\r
+ inc dx\r
+ in al, dx\r
+ dec dx\r
+ mov ah, al\r
+ and ah, 10111111b\r
+ or ah, bh\r
+ mov al, 09h\r
+ out dx, ax\r
+\r
+ .leave ARG_SIZE\r
+mxSplitScreen ENDP\r
+\r
+MX_TEXT ENDS\r
+END\r