Add explicit queuebuf and packetbuf to build
[contiki-2.x.git] / cpu / z80 / uip_arch-asm.S
blob0f9decbc16ddf43649e66421fa86745b0afaf819
1 ;;; 
2 ;;; 
3 ;;; uip_arch-asm.S
4 ;;; 
5 ;;; \file
6 ;;;     Z80 architecture-depend uip module
7 ;;;     for calculating checksums
8 ;;; 
9 ;;; \author
10 ;;;     Takahide Matsutsuka <markn@markn.org>
11 ;;; 
12         .module uip_arch-asm
14         ;; export symbols
15         .globl _uip_add32
16         .globl _uip_arch_chksum
17         .globl _uip_chksum
18         
19         ;; import symbols
20         .globl _uip_acc32
21         .globl _uip_buf
23         .area   _DATA   
25         .area   _GSINIT
26         
27         .area   _CODE
29         ;; ---------------------------------
30         ;; void uip_add32(u8_t *op32, u16_t op16);
31         ;; Stack; retl reth op32l op32h op16l op16h
32         ;; ABCDEHL____
33         ;; return void
34         ;; _uip_acc32 = op32 + op16
35         ;; ---------------------------------
36 _uip_add32_start::
37 _uip_add32:
38         ;; HL = #_op32l
39         ld      hl, #2
40         add     hl, sp
42         ;; DE = #(_op32)
43         ld      e, (hl)
44         inc     hl
45         ld      d, (hl)
46         inc     hl
48         ;; BC = op16
49         ld      c, (hl)
50         inc     hl
51         ld      b, (hl)
53         ;; HL = #(_op32) + 3
54         ld      hl, #3  
55         add     hl, de
56         
57         ;; DE = #_uip_acc32 + 3
58         ld      de, #_uip_acc32 + 3
60         ;; uip_acc32[3] = op32[3] + op16l;
61         ld      a, (hl)
62         add     a, c
63         ld      (de), a
64         
65         ;; uip_acc32[2] = op32[2] + op16h + carry;
66         dec     hl
67         dec     de
68         ld      a, (hl)
69         adc     a, b
70         ld      (de), a
71         jr      nc, _uip_add32_nocarry1
73         ;; uip_acc32[1]
74         dec     hl
75         dec     de
76         ld      a, (hl)
77         inc     a
78         ld      (de), a
79         jr      nz, _uip_add32_nocarry0
81         ;; uip_acc32[0]
82         dec     hl
83         dec     de
84         ld      a, (hl)
85         inc     a
86         ld      (de), a
87         ret
88 _uip_add32_nocarry1:
89         ;; uip_acc32[1]
90         dec     hl
91         dec     de
92         ld      a, (hl)
93         ld      (de), a
95 _uip_add32_nocarry0:
96         ;; uip_acc32[0]
97         dec     hl
98         dec     de
99         ld      a, (hl)
100         ld      (de), a
101         ret                     
102 _uip_add32_end::                
103         
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
107         ;; ABCDEHL____
108         ;; return HL
109         ;; ---------------------------------
110 _uip_arch_chksum_start::        
111 _uip_arch_chksum:
112         push    ix
113         ;; IX = #_suml
114         ld      ix, #4
115         add     ix, sp
116         ;; BC = sum
117         ld      c, 0(ix)
118         ld      b, 1(ix)
119         ;; DE = #data
120         ld      e, 2(ix)
121         ld      d, 3(ix)
122         
123         ;; (lenl, lenh) <- dataptr + len - 1 (last address)
124         ;; (len) + DE - 1 -> (len)
125         ld      l, 4(ix)
126         ld      h, 5(ix)
127         add     hl, de
128         dec     hl
129         ld      4(ix), l
130         ld      5(ix), h
132 _uip_arch_chksum_loop:
133         ;; compare HL(last address) and DE(dataptr)
134         ;; HL - DE
135         ;; if (HL < DE) C,NZ else if (HL = DE) NC,Z=1 otherwise NC,NZ
136         ;;  HL = last address, DE = current pointer
137         ld      l, 4(ix)
138         ld      h, 5(ix)
139         
140         ld      a, h
141         sub     d
142         jr      nz, _uip_arch_chksum_compared
143         ld      a, l
144         sub     e
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
151         ld      a, (de)
152         ld      h, a
153         inc     de
154         ld      a, (de)
155         ld      l, a
156         push    hl
157         add     hl, bc
158         inc     de
159         ld      b, h
160         ld      c, l
161         ;; HL = t
162         pop     hl
163         ;; BC - HL
164         ;; if (sumBC < tHL) sum++
165         ld      a, b
166         sub     h
167         jr      nz, _uip_arch_chksum_compared_t
168         ld      a, c
169         sub     l
170 _uip_arch_chksum_compared_t:
171         jr      nc, _uip_arch_chksum_nocarry_t
172         inc     bc
173 _uip_arch_chksum_nocarry_t:
174         jr      _uip_arch_chksum_loop
175 _uip_arch_chksum_loop_exit_add_trailing:
176         ;; HL = last address
177         ;; bc = bc + (last address)<<8
178         ld      a, b
179         add     a, (hl)
180         ld      b, a
181         jr      nc, _uip_arch_chksum_loop_exit
182         inc     bc
183 _uip_arch_chksum_loop_exit:
184         ld      l, c
185         ld      h, b
186         pop     ix
187         ret
188 _uip_arch_chksum_end::  
189         
190         ;; ---------------------------------
191         ;; u16_t uip_chksum(void);
192         ;; Stack; retl reth datal datah lenl lenh
193         ;; ABCDEHL____
194         ;; return HL
195         ;; return htons(chksum(0, (u8_t *)data, len));
196         ;; ---------------------------------
197 _uip_chksum_start::
198 _uip_chksum:
199         ld      hl, #5
200         add     hl, sp
201         ;; HL indicates #_lenh
202         ld      b, #2
203 _uip_chksum_loop:
204         ld      d, (hl)
205         dec     hl
206         ld      e, (hl)
207         dec     hl
208         push    de
209         djnz    _uip_chksum_loop
210         ld      bc, #0
211         push    bc
212         call    _uip_arch_chksum
213         pop     af
214         pop     af
215         pop     af
216         ;; convert to BIG ENDIAN (htons)
217         ld      a, l
218         ld      l, h
219         ld      h, a
220         ret
221 _uip_chksum_end::