  char *oldpal, *newpal;

void fadeout() {
  int i,ii;
  char *pal = (char *) malloc(64*3);
  char *palend = pal + 64*3;
  char *palptr = pal;
  asm {
    push di
    push es
    mov	dx, 3C7h
    mov	ax, 0
    out	dx, al
    mov cx, 64*3
    add dx, 2
    les di, palptr
    rep insb
    pop es
    pop di
  }
  for (ii = 0; ii < 64; ii++) {
    asm mov dx,3DAh
    l1:
    asm {
      in al,dx
      and al,08h
      jnz l1
    }
    l2:
    asm { 
      in al,dx
      and al,08h
      jz  l2
    }
    for (palptr = pal; palptr < palend; palptr++ ) 
      if (*palptr)
        (*palptr)--;
    palptr = pal;
    asm {
      push	si
      push	ds
      mov	dx, 3C8h
      sub 	al, al
      out	dx, al
      inc       dx
      mov  	cx, 64*3
      lds 	si, palptr
      rep 	outsb
      pop	ds
      pop	si
    }
  }
  free(pal);
}

void set_black() {
  int i; 
  oldpal = (char *) malloc(64*3);
  newpal = oldpal;
  asm {
    push di
    push es
    mov	dx, 3C7h
    mov	ax, 0
    out	dx, al
    mov cx, 64*3
    add dx, 2
    les di, newpal
    rep insb
    pop es
    pop di
  }
  asm mov cx, 64*3
  loopit:
    asm { 
      mov dx, 3c8h
      mov ax, cx
      out dx, al 
      inc dx
      sub al, al
      out dx, al
      out dx, al
      out dx, al
      loop loopit
    }
}

void fadein() {
  char *pal = (char *) malloc(64*3);
  char *palend = pal + 64*3;
  char *palptr;
  int ii;
  if (!oldpal) set_black();
  for (palptr = pal; palptr < palend; ) *(palptr++) = 0;
  for (ii = 0; ii < 64; ii++) {
    asm mov dx,3DAh
    l1:
    asm {
      in al,dx
      and al,08h
      jnz l1
    }
    l2:
    asm { 
      in al,dx
      and al,08h
      jz  l2
    }
    for (newpal = oldpal, palptr = pal; palptr < palend; palptr++) 
      if (*palptr < *(newpal++)) ++(*palptr);
    palptr = pal;
    asm {
      push	si
      push      ds
      mov	dx, 3C8h
      sub	ax, ax
      out	dx, al
      inc	dx
      lds	si, palptr
      mov	cx, 64*3
      rep       outsb
      pop       ds
      pop	si
    }
  }
  free(pal);
  free(oldpal);
}

