004
17.05.2026, 23:59 Uhr
kaiOr
|
Alles ein wenig zusammenstampfen geht doch immer.
| Quellcode: | ;; (lightly unflexible) Fletcher-16 checksum, mod 255 ;; ;; Input: ;; H = Data address / 100h ;; B = Data length / 100h ;; ;; Output: ;; DE = Fletcher-16 ;; HL,BC,AF are modified fletcher_255: ld a,b add a,h ld b,a ld l,0 ld c,l ; mobile Null ld d,c ; Start- ld e,c ; wert fletcher16_loop: ld a,e add a,(hl) adc a,c ld e,a add a,d adc a,c ld d,a inc l ;; 1x loop unrolling, no problem because L starts even ld a,e add a,(hl) adc a,c ld e,a add a,d adc a,c ld d,a inc l jp nz,fletcher16_loop inc h ld a,h cp b jp nz,fletcher16_loop
; d = d mod 255 dec l ld a,d cp l jr c,$+3 inc d ; e = e mod 255 ld a,e cp l jr c,$+3 inc e
ret |
ca. 186ms
EDIT2: Daten vom Stack holen geht noch einen Hauch schneller:
| Quellcode: | ;; (lightly unflexible) Fletcher-16 checksum, mod 255 ;; ;; Input: ;; H = Data address / 100h ;; B = Data length / 100h ;; ;; Output: ;; DE = Fletcher-16 ;; HL,BC,AF are modified spos equ 0B77Eh ; freier RAM cnt equ spos-1 fletcher_255: xor a ; clear CY ld c,a ; mobile Null ld a,b rra ld b,c jr nc,skip ; gerade? ld b,128 inc a skip ld (cnt),a ld l,c ld d,c ; Start- ld e,c ; wert di ld (spos),sp ld sp,hl fletcher16_loop: pop hl ld a,e add a,l adc a,c ld e,a add a,d adc a,c ld d,a ld a,e add a,h adc a,c ld e,a add a,d adc a,c ld d,a djnz fletcher16_loop ld hl,cnt dec (hl) jp nz,fletcher16_loop ld sp,(spos) ei
; d = d mod 255 dec b ld a,d cp b jr c,$+3 inc d ; e = e mod 255 ld a,e cp b jr c,$+3 inc e
ret |
ca. 183ms
Gruß, Kai Dieser Beitrag wurde am 18.05.2026 um 11:58 Uhr von kaiOr editiert. |