public _bcmp ; compare two blocks of memory ; BCMP(src, dst, len) _bcmp: move.l 4(sp),A0 move.l 8(sp),A1 move.l 12(sp),D0 beq .bcsucc cmp.w D0,D0 ; set Z bit. bra .bc2 .bc1 cmpm.b (A0)+,(A1)+ .bc2 dbne D0,.bc1 bne .bcfail sub.l #$10000,D0 bcc .bc1 .bcsucc moveq.l #1,D0 rts .bcfail moveq.l #0,D0 rts ; OLD BCMP HAD BUGS ... alignment problems. ; ; move.w D0,D1 ;longword align address ; neg.w D1 ; and.w #3,D1 ; cmp.w D0,D0 ;force Z bit ; bra .bc2 ;.bc1 cmpm.b (A0)+,(A1)+ ;.bc2 dbne D1,.bc1 ; bne .bcfail ; move.l D0,D1 ; lsr.l #2,D1 ;# of longwords to compare ; cmp.w D0,D0 ;force Z bit ; bra .bc11 ;.bc10 cmpm.l (A0)+,(A1)+ ;.bc11 dbne D1,.bc10 ; bne .bcfail ; sub.l #$10000,D0 ; bcc .bc10 ; and.w #3,D0 ;remaining bytes to compare ; cmp.w D0,D0 ;force Z bit ; bra .bc21 ;.bc20 cmpm.b (A0)+,(A1)+ ;.bc21 dbne D0,.bc20 ; bne .bcfail ; moveq.l #1,D0 ;success! ; rts ;.bcfail moveq.l #0,D0 ;failure! ; rts