--- /dev/null
+;-----------------------------------------------------------\r
+;\r
+; MXLN.ASM - Start line function\r
+; Copyright (c) 1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN PRO\r
+NOWARN RES\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC mxStartLine\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
+\r
+;-----------------------------------------------------------\r
+;\r
+; Changes the video start address to the specified line.\r
+;\r
+; Input:\r
+; Line = new start line\r
+; Output:\r
+; none\r
+;\r
+mxStartLine PROC FAR\r
+ ARG Line:WORD = ARG_SIZE\r
+ .enter 0\r
+ ASSUME ds:NOTHING\r
+\r
+ mov ax, [Line] ; Get video offset\r
+ mul [mx_BytesPerLine]\r
+ xchg ax, bx ; Copy it into BX\r
+\r
+; Wait display\r
+ mov dx, STATUS\r
+@@1: in al, dx\r
+ test al, 08h\r
+ jnz @@1\r
+\r
+; Set starting address\r
+ mov dx, CRTC\r
+ mov al, 0Ch ; Linear Starting Address high\r
+ mov ah, bh\r
+ cli\r
+ out dx, ax\r
+ mov al, 0Dh ; Linear Starting Address low\r
+ mov ah, bl\r
+ out dx, ax\r
+ sti\r
+\r
+; Wait retrace\r
+ mov dx, STATUS\r
+@@2: in al,dx\r
+ test al, 08h\r
+ jz @@2\r
+\r
+ xor ax, ax\r
+ .leave ARG_SIZE\r
+MX_TEXT ENDS\r
+END\r