.model compact, C
.286
.data
oldpal db 768 dup (0)
pal    db 768 dup (0)
.code
	public fadeout
fadeout proc C
  push  ds
  mov 	ax, @data
  mov   ds, ax
  mov 	es, ax

  mov	dx, 3C7h
  sub   al, al
  out	dx, al
  mov 	cx, 256*3
  add 	dx, 2
  mov 	di, offset pal
  rep	insb
  mov   cx, 64
@Out@BigLoop:
  push cx
  mov dx,3DAh
@Out@VS1:
  in al,dx
  and al,08h
  jnz @Out@VS1
@Out@VS2:
  in al,dx
  and al,08h
  jz  @Out@VS2
  mov	bx, offset pal
  mov   ax, offset pal+768
@Out@DecLoop:
  cmp byte ptr [bx], 0
  je  @Out@NoChangePal
  dec byte ptr [bx] 
@Out@NoChangePal:
  inc bx
  cmp bx, ax
  jl  @Out@DecLoop
  mov	dx, 3C8h
  sub 	al, al
  out	dx, al
  inc   dx
  mov  	cx, 256*3
  mov 	si, offset pal
  rep 	outsb
  pop   cx
  loop	@Out@BigLoop
  pop   ds
  ret
fadeout ENDP

  public set_black
set_black proc C
  push  ds
  mov   ax, @data
  mov   es, ax
  mov   ds, ax
  mov	dx, 3C7h
  sub	al, al
  out	dx, al
  mov 	di, offset oldpal
  mov	cx, 256*3
  add	dx, 2
  rep 	insb
  mov 	dx, 3c8h
  sub	al, al
  out 	dx, al 
  mov 	cx, 256
  inc 	dx
@Black@loopit:
  out dx, al
  out dx, al
  out dx, al
  loop @Black@loopit
  pop ds
  ret
set_black ENDP

  public fadein
fadein proc C
  push ds
  mov ax, @data
  mov es, ax
  mov ds, ax
  mov cx, 768
  mov di, offset pal
  sub al, al
  rep stosb
  mov cx, 64
@fadein@BigLoop:
  push cx
  mov dx,3DAh
@fadein@l1:
  in al,dx
  and al,08h
  jnz @fadein@l1
@fadein@l2:
  in al,dx
  and al,08h
  jz  @fadein@l2
  mov dx, offset oldpal
  mov cx, offset pal
@fadein@littleloop:
  mov bx, dx
  mov al, [bx]
  mov bx, cx
  cmp al, [bx]
  jle @fadein@noch
  mov bx, cx
  inc byte ptr [bx]
@fadein@noch:
  inc cx
  inc dx
  cmp cx, offset pal+768
  jl  @fadein@littleloop
  mov	dx, 3C8h
  sub	al, al
  out	dx, al
  inc	dx
  mov	si, offset pal
  mov	cx, 768
  rep   outsb
  pop 	cx
  loop @fadein@BigLoop
  pop ds
  ret
fadein ENDP
END
