I hated crows in CV1. Not because of their annoying flight pattern (fly straight toward you, then swoop up or down toward you, then repeat, then fly off the screen), but because of the fact that they flew straight at you unnaturally. Well, I was reading the code and that is exactly what the code tells it to do.
...Except that wasn't what the code intended crows to do.
//Check if crow has flown horizontally past Belmont
$886E:A9 08 LDA #$08
$8870:BC F8 04 LDY $04F8,X @ $0501 = #$01
$8873:F0 0B BEQ $8880
$8875:49 FF EOR #$FF
$8877:6D 8C 03 ADC $038C = #$80
$887A:DD 8C 03 CMP $038C,X @ $0395 = #$77
$887D:B0 09 BCS $8888
//Find out if Belmont is above or below the crow
$8888:20 9A 87 JSR $879A
$879A:A0 00 LDY #$00
$879C:AD 54 03 LDA $0354 = #$4C
$879F:DD 54 03 CMP $0354,X @ $035D = #$75
$87A2:B0 01 BCS $87A5
$87A4:C8 INY
$87A5:98 TYA
$87A6:9D DC 04 STA $04DC,X @ $04E5 = #$01
$87A9:60 RTS
//Set the HORIZONTAL speed to 1/2
$888B:A9 00 LDA #$00
$888D:A0 80 LDY #$80
$888F:20 DF EC JSR $ECDF
$ECDF:9D FC 03 STA $03FC,X @ $0405 = #$01
$ECE2:98 TYA
$ECE3:9D 18 04 STA $0418,X @ $0421 = #$98
See that second half? The crow checks its vertical relation to Belmont and then sets its horizontal speed. The programmers called the wrong subroutine! At this point in the code, the horizontal speed had already been set, hence the check if the crow had flown past Belmont yet.
If you want to see how the game was meant to run, open up the Japanese ROM of CV1 (addressing may be different in the US or PAL versions), jump to address 0148A0 which should be set to DF and change it to 57. Then set address 0148A1 which should be set to EC to ED.'
It will still fly straight toward you, but now it won't just fly backwards off the screen. It will swoop much more often, even if its pattern is still seemingly erratic.
UPDATE In the US version of Castlevania, you only need to change 0148A0 which should be 4E by default to C6 (if I read it correctly).