--- /dev/null
+;-----------------------------------------------------------\r
+;\r
+; MXLL.ASM - Load latches\r
+; Copyright (c) 1993,1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN PRO\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC mxLoadLatches\r
+\r
+MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE'\r
+ ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+EXTRN mx_VideoSegment : WORD\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Loads the specified value into the VGA latches.\r
+;\r
+; Input:\r
+; BL = value to load into latches\r
+; Output:\r
+; none\r
+; Changes:\r
+; bit mask register to FFh;\r
+; function select register to "move";\r
+; write mode to 00h.\r
+; Note:\r
+; this is for internal use only.\r
+;\r
+mxLoadLatches PROC NEAR\r
+ ASSUME ds:NOTHING\r
+\r
+ .push ds, si\r
+ mov dx, GDC\r
+ mov ax, 0FF08h\r
+ out dx, ax ; Set bit mask to FFh\r
+ mov ax, 0003h\r
+ out dx, ax ; Set function to "move"\r
+ mov ax, 0005h\r
+ out dx, ax ; Set write mode\r
+ mov ax, [mx_VideoSegment]\r
+ mov ds, ax\r
+ mov si, 0FFFFh\r
+ mov bh, 8 ; BH = write plane mask\r
+ mov cx, 3 ; CX = count = read plane\r
+; Saves old values and force BL into latches\r
+@@SetLoop:\r
+ mov dx, GDC\r
+ mov al, 04h\r
+ mov ah, cl\r
+ out dx, ax ; Select read plane\r
+ mov dx, TS\r
+ mov al, 02h\r
+ mov ah, bh\r
+ out dx, ax ; Select write plane\r
+ mov al, ds:[si]\r
+ push ax\r
+ mov ds:[si], bl\r
+ mov al, ds:[di] ; Force value into latch\r
+ shr bh, 1 ; Next write plane\r
+ loop @@SetLoop\r
+; Restore previous values\r
+ mov cx, 3\r
+ mov bh, 8\r
+ mov dx, TS\r
+@@ResetLoop:\r
+ mov al, 02h\r
+ mov ah, bh\r
+ out dx, ax ; Select write plane\r
+ pop ax\r
+ mov ds:[si], al\r
+ shr bh, 1 ; Next write plane\r
+ loop @@ResetLoop\r
+; Exit\r
+ .pop ds, si\r
+ ret\r
+mxLoadLatches ENDP\r
+\r
+MX_TEXT ENDS\r
+END\r