Code:
On me:*:Disconnect: exempt save
On *:Exit: exempt save
On *:Start: {
  hmake exempt 10
  if ($isfile(exempt.hsh)) hload -i exempt $qt($mircdirsys\exempt.hsh)
}

alias isexempt { return $iif($hget(exempt,$1),$true,$false) }
alias exempt {
  if (!$isdir(sys)) mkdir Sys
  if (!$hget(exempt)) hmake exempt 10
  if ($1 == -r) {
    if (!$2) echo 2 * /exempt: insufficient parameters
    elseif (!$hget(exempt,$2)) echo 3 * /exempt: $2 not in list
    else { hdel exempt $2 | echo 3 * Removed $2 from exempt list }
  }
  elseif ($1 == -l) {
    if ($hget(exempt,0).item < 1) echo 2 * Exempt list empty
    else {
      echo 2 * Exempt list:
      var %x = 1
      while (%x <= $hget(exempt,0).item) {
        echo 3 $hget(exempt,%x).item
        inc %x
      }
    }
  }
  elseif ($1 == save) hsave -i exempt $qt($mircdirsys\exempt.hsh)
  else {
    if (!$hget(exempt,$1)) { hadd exempt $1 $1 | echo 3 * Added $1 to exempt list }
    else { echo 3 * /exempt: $1 is already in list }
  }
  hsave -i exempt $qt($mircdirsys\exempt.hsh)
}

raw 319:*:{
  if (%drone != off) && (%options.exempt != on) && ($nick(#chat,$me,~&@%)) {
    if $numtok($3-,32) > 12 {
      if ($wildtok($3-,#*,$numtok($3-,32),32)) && (!$isexempt($2)) ban -ku3600 #chat $2 2 14Drone Bot - Excess Channels
    }
  }
} 


I think the only reason you got that error is because On Start also works the same way On Load does.

From the help file:

The on START event uses the same format, and triggers the first time a script is loaded and every time after that when mIRC is run.

I hope this sorts out the save problem.