6 ;;; Z80 architecture-depend uip module
7 ;;; for calculating checksums
10 ;;; Takahide Matsutsuka <markn@markn.org>
16 .globl _uip_arch_chksum
29 ;; ---------------------------------
30 ;; void uip_add32(u8_t *op32, u16_t op16);
31 ;; Stack; retl reth op32l op32h op16l op16h
34 ;; _uip_acc32 = op32 + op16
35 ;; ---------------------------------
57 ;; DE = #_uip_acc32 + 3
58 ld de, #_uip_acc32 + 3
60 ;; uip_acc32[3] = op32[3] + op16l;
65 ;; uip_acc32[2] = op32[2] + op16h + carry;
71 jr nc, _uip_add32_nocarry1
79 jr nz, _uip_add32_nocarry0
104 ;; ---------------------------------
105 ;; static u16_t chksum(u16_t sum, const u8_t *data, u16_t len)
106 ;; Stack; retl reth suml sumh datal datah lenl lenh
109 ;; ---------------------------------
110 _uip_arch_chksum_start::
123 ;; (lenl, lenh) <- dataptr + len - 1 (last address)
124 ;; (len) + DE - 1 -> (len)
132 _uip_arch_chksum_loop:
133 ;; compare HL(last address) and DE(dataptr)
135 ;; if (HL < DE) C,NZ else if (HL = DE) NC,Z=1 otherwise NC,NZ
136 ;; HL = last address, DE = current pointer
142 jr nz, _uip_arch_chksum_compared
145 ;; if (last address == dataptr) _uip_arch_chksum_loop_exit_add_trailing
146 jr z, _uip_arch_chksum_loop_exit_add_trailing
147 _uip_arch_chksum_compared:
148 ;; if (last address > dataptr) _uip_arch_chksum_loop_exit
149 jr c, _uip_arch_chksum_loop_exit
150 ;; bc = dataptr[0],dataptr[1] + bc
164 ;; if (sumBC < tHL) sum++
167 jr nz, _uip_arch_chksum_compared_t
170 _uip_arch_chksum_compared_t:
171 jr nc, _uip_arch_chksum_nocarry_t
173 _uip_arch_chksum_nocarry_t:
174 jr _uip_arch_chksum_loop
175 _uip_arch_chksum_loop_exit_add_trailing:
177 ;; bc = bc + (last address)<<8
181 jr nc, _uip_arch_chksum_loop_exit
183 _uip_arch_chksum_loop_exit:
188 _uip_arch_chksum_end::
190 ;; ---------------------------------
191 ;; u16_t uip_chksum(void);
192 ;; Stack; retl reth datal datah lenl lenh
195 ;; return htons(chksum(0, (u8_t *)data, len));
196 ;; ---------------------------------
201 ;; HL indicates #_lenh
209 djnz _uip_chksum_loop
212 call _uip_arch_chksum
216 ;; convert to BIG ENDIAN (htons)