Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.sys.apple2.programmer > #3260
| Newsgroups | comp.sys.apple2.programmer |
|---|---|
| Date | 2017-02-06 17:20 -0800 |
| References | <878838ba-6367-4afb-b045-0b6bdb53ec65@googlegroups.com> <o79j3j$dsm$1@news.albasani.net> |
| Message-ID | <52456f9a-dfac-4c2b-adbf-e459915ededd@googlegroups.com> (permalink) |
| Subject | Re: Uthernet II manual - sample code |
| From | Chris Torrence <gorthmog@gmail.com> |
Okay, so I made the code even smaller by just letting the W5100 handle the wraparound automatically. It worked like a charm. I'll paste in my sample code here, and also email it to DF in case you want to include some of it in the next manual update. Thanks for the help!
-Chris
1 * TCP SOCKET DEMO FOR W5100/UTHERNET II
2 * BY D. FINNIGAN
3 * OCTOBER 2015
4 *
5 * UPDATE 09 JAN 2016
6 *
7 * UPDATE 05 FEB 2017, C. TORRENCE
8 * -REMOVED SEPARATE PATH FOR WRAP, ADD DEBUG PRINT
9 *
10 *
11 * SLOT 3 I/O ADDRESSES FOR THE W5100
12 *
13 WMODE EQU $C0B4
14 WADRH EQU $C0B5
15 WADRL EQU $C0B6
16 WDATA EQU $C0B7
17 *
18 *
19 * W5100 LOCATIONS
20 *
21 MACADDR EQU $0009 ; MAC ADDRESS
22 SRCIP EQU $000F ; SOURCE IP ADDRESS
23 RMSR EQU $001A ; RECEIVE BUFFER SIZE
24 *
25 * SOCKET 0 LOCATIONS
26 *
27 S0MR EQU $0400 ; SOCKET 0 MODE REGISTER
28 S0CR EQU $0401 ; COMMAND REGISTER
29 S0IR EQU $0402 ; INTERRUPT REGISTER
30 S0SR EQU $0403 ; STATUS REGISTER
31 S0LOCALPORT EQU $0404 ; LOCAL PORT
32 S0FORADDR EQU $040C ; FOREIGN ADDRESS
33 S0FORPORT EQU $0410 ; FOREIGN PORT
34 S0MSS EQU $0412 ; MAX SEGMENT SIZE
35 S0PROTO EQU $0414 ; IP PROTOCOL
36 S0TOS EQU $0415 ; DS/ECN (FORMER TOS)
37 S0TTL EQU $0416 ; IP TIME TO LIVE
38 S0TXFSR EQU $0420 ; TX FREE SIZE REGISTER
39 S0TXRR EQU $0422 ; TX READ POINTER REGISTER
40 S0TXWR EQU $0424 ; TX WRITE POINTER REGISTER
41 S0RXRSR EQU $0426 ; RX RECEIVED SIZE REGISTER
42 S0RXRD EQU $0428 ; RX READ POINTER REGISTER
43 *
44 * SOCKET 0 PARAMETERS
45 *
46 RXBASE EQU $6000 ; SOCKET 0 RX BASE ADDR
47 RXMASK EQU $1FFF ; SOCKET 0 8KB ADDRESS MASK
48 TXBASE EQU $4000 ; SOCKET 0 TX BASE ADDR
49 TXMASK EQU RXMASK ; SOCKET 0 TX MASK
50 *
51 *
52 * SOCKET COMMANDS
53 *
54 SCOPEN EQU $01 ; OPEN
55 SCLISTEN EQU $02 ; LISTEN
56 SCCONNECT EQU $04 ; CONNECT
57 SCDISCON EQU $08 ; DISCONNECT
58 SCCLOSE EQU $10 ; CLOSE
59 SCSEND EQU $20 ; SEND
60 SCSENDMAC EQU $21 ; SEND MAC
61 SCSENDKEEP EQU $22 ; SEND KEEP ALIVE
62 SCRECV EQU $40 ; RECV
63 *
64 * SOCKET STATUS
65 *
66 STCLOSED EQU $00
67 STINIT EQU $13
68 STLISTEN EQU $14
69 STESTABLISHED EQU $17
70 STCLOSEWAIT EQU $1C
71 STUDP EQU $22
72 STIPRAW EQU $32
73 STMAXRAW EQU $42
74 STPPOE EQU $5F
75 *
76 * MONITOR SUBROUTINES
77 *
78 KBD EQU $C000
79 KBDSTRB EQU $C010
80 COUT EQU $FDED
81 PRBYTE EQU $FDDA
82 PRNTAX EQU $F941
83 *
84 * ZERO-PAGE STORAGE
85 *
86 PTR EQU $06 ; 2 BYTES FOR APPLE BUFFER
87 GETSIZE EQU $08 ; 2 BYTES FOR RX_RSR
88 GETOFFSET EQU $0A ; 2 BYTES FOR OFFSET ADDR
89 GETSTARTADR EQU $0C ; 2 BYTES FOR PHYSICAL ADDR
90 *
91 *
92 * RESET AND CONFIGURE W5100
93 *
94 *
8000: A9 06 95 LDA #6
8002: 85 06 96 STA PTR ; RETRIES
97 RESET
8004: A9 80 98 LDA #$80 ; RESET
8006: 8D B4 C0 99 STA WMODE
8009: A9 03 100 LDA #3 ; CONFIGURE WITH AUTO-INCREMENT
800B: 8D B4 C0 101 STA WMODE
102 *
103 * ASSIGN MAC ADDRESS
104 *
800E: A9 00 105 LDA #>MACADDR
8010: 8D B5 C0 106 STA WADRH
8013: A9 09 107 LDA #<MACADDR
8015: 8D B6 C0 108 STA WADRL
8018: A2 00 109 LDX #0
801A: BD 28 80 110 :L LDA MAC,X
801D: 8D B7 C0 111 STA WDATA ; USING AUTO-INCREMENT
8020: E8 112 INX
8021: E0 06 113 CPX #6 ; COMPLETED?
8023: D0 F5 114 BNE :L
8025: 4C 2E 80 115 JMP SETSRCADDR
116 *
8028: 00 08 DC 117 MAC HEX 0008DC010203 ; MAC ADDRESS
802B: 01 02 03
118 *
119 *
120 * ASSIGN A SOURCE IP ADDRESS
121 *
122 SETSRCADDR
802E: A9 0F 123 LDA #<SRCIP
8030: 8D B6 C0 124 STA WADRL
8033: A2 00 125 LDX #0
8035: BD 43 80 126 :L LDA SRCADDR,X
8038: 8D B7 C0 127 STA WDATA
803B: E8 128 INX
803C: E0 04 129 CPX #4
803E: D0 F5 130 BNE :L
8040: 4C 47 80 131 JMP SETBUFFERS
132 *
8043: 0A 00 01 133 SRCADDR HEX 0A0001FC ; 10.0.1.252
8046: FC
134 *
135 *
136 * CONFIGURE BUFFER SIZES
137 *
138 SETBUFFERS
8047: A9 1A 139 LDA #<RMSR
8049: 8D B6 C0 140 STA WADRL
804C: A9 03 141 LDA #3 ; 8KB TO SOCKET 0
804E: 8D B7 C0 142 STA WDATA ; SET RECEIVE BUFFER
8051: 8D B7 C0 143 STA WDATA ; SET TRANSMIT BUFFER
144 *
145 * CONFIGURE SOCKET 0 FOR TCP
146 *
8054: A9 04 147 LDA #>S0MR
8056: 8D B5 C0 148 STA WADRH
8059: A9 00 149 LDA #<S0MR
805B: 8D B6 C0 150 STA WADRL
805E: A9 01 151 LDA #1 ; TCP MODE
8060: 8D B7 C0 152 STA WDATA
153 *
154 * SET LOCAL PORT NUMBER
155 *
8063: A9 04 156 LDA #<S0LOCALPORT
8065: 8D B6 C0 157 STA WADRL
8068: A9 C0 158 LDA #$C0 ; HIGH BYTE OF LOCAL PORT
806A: 8D B7 C0 159 STA WDATA
806D: A9 00 160 LDA #0 ; LOW BYTE
806F: 8D B7 C0 161 STA WDATA
162 *
163 * SET FOREIGN ADDRESS
164 *
8072: A9 0C 165 LDA #<S0FORADDR
8074: 8D B6 C0 166 STA WADRL
8077: A2 00 167 LDX #0
8079: BD 87 80 168 :L2 LDA FADDR,X
807C: 8D B7 C0 169 STA WDATA
807F: E8 170 INX
8080: E0 04 171 CPX #4
8082: D0 F5 172 BNE :L2
8084: 4C 8B 80 173 JMP SETFORPORT
174 *
8087: 0A 00 01 175 FADDR HEX 0A000111 ; 10.0.1.17
808A: 11
176 *
177 *
178 * SET FOREIGN PORT
179 *
180 SETFORPORT
808B: A9 4E 181 LDA #$4E ; HIGH BYTE OF FOREIGN PORT
808D: 8D B7 C0 182 STA WDATA ; ADDR PTR IS AT FOREIGN PORT
8090: A9 20 183 LDA #$20 ; LOW BYTE OF PORT
8092: 8D B7 C0 184 STA WDATA
185 *
186 * OPEN SOCKET
187 *
8095: A9 01 188 LDA #<S0CR
8097: 8D B6 C0 189 STA WADRL
809A: A9 01 190 LDA #SCOPEN ; OPEN COMMAND
809C: 8D B7 C0 191 STA WDATA
192 *
193 * CHECK STATUS REGISTER TO SEE IF SUCCEEDED
194 *
809F: A9 03 195 LDA #<S0SR
80A1: 8D B6 C0 196 STA WADRL
80A4: AD B7 C0 197 LDA WDATA
80A7: C9 13 198 CMP #STINIT ; IS IT SOCK_INIT?
80A9: F0 33 199 BEQ OPENED
80AB: A0 00 200 LDY #0
80AD: B9 B9 80 201 :L LDA :SOCKERR,Y
80B0: F0 06 202 BEQ :LDONE
80B2: 20 ED FD 203 JSR COUT
80B5: C8 204 INY
80B6: D0 F5 205 BNE :L
80B8: 00 206 :LDONE BRK
80B9: D5 D4 C8 207 :SOCKERR ASC "UTHERNET II: COULD NOT OPEN SOCKET!"
80BC: C5 D2 CE C5
80C0: D4 A0 C9 C9
80C4: BA A0 C3 CF
80C8: D5 CC C4 A0
80CC: CE CF D4 A0
80D0: CF D0 C5 CE
80D4: A0 D3 CF C3
80D8: CB C5 D4 A1
80DC: 8D 00 208 HEX 8D00 ; CR+NULL
209 *
210 * TCP SOCKET WAITING FOR NEXT COMMAND
211 *
212 OPENED
80DE: A9 01 213 LDA #<S0CR
80E0: 8D B6 C0 214 STA WADRL
80E3: A9 04 215 LDA #SCCONNECT
80E5: 8D B7 C0 216 STA WDATA
217 *
218 * WAIT FOR TCP TO CONNECT AND BECOME ESTABLISHED
219 *
220 CHECKTEST
80E8: A9 03 221 LDA #<S0SR
80EA: 8D B6 C0 222 STA WADRL
80ED: AD B7 C0 223 LDA WDATA ; GET SOCKET STATUS
80F0: F0 06 224 BEQ FAILED ; 0 = SOCKET CLOSED, ERROR
80F2: C9 17 225 CMP #STESTABLISHED
80F4: F0 4A 226 BEQ CHECKRECV ; SUCCESS
80F6: D0 F0 227 BNE CHECKTEST
228 *
229 FAILED
80F8: C6 06 230 DEC PTR
80FA: F0 08 231 BEQ ERRDONE ; TOO MANY FAILURES
80FC: A9 AE 232 LDA #"."
80FE: 20 ED FD 233 JSR COUT
8101: 4C 04 80 234 JMP RESET ; TRY AGAIN
235 *
236 ERRDONE
8104: A0 00 237 LDY #0
8106: B9 12 81 238 :L LDA ERRMSG,Y
8109: F0 06 239 BEQ :DONE
810B: 20 ED FD 240 JSR COUT
810E: C8 241 INY
810F: D0 F5 242 BNE :L
8111: 00 243 :DONE BRK
244 *
8112: D3 CF C3 245 ERRMSG ASC "SOCKET COULD NOT CONNECT - CHECK REMOTE HOST"
8115: CB C5 D4 A0
8119: C3 CF D5 CC
811D: C4 A0 CE CF
8121: D4 A0 C3 CF
8125: CE CE C5 C3
8129: D4 A0 AD A0
812D: C3 C8 C5 C3
8131: CB A0 D2 C5
8135: CD CF D4 C5
8139: A0 C8 CF D3
813D: D4
813E: 8D 00 246 HEX 8D00
247 *
248 *
249 * CHECK FOR ANY RECEIVED DATA
250 *
251 CHECKRECV
8140: 2C 00 C0 252 BIT KBD ; KEYPRESS?
8143: 10 06 253 BPL :NEXT
8145: AD 10 C0 254 LDA KBDSTRB
8148: 4C FB 81 255 JMP CLOSECONN ; CLOSE CONNECTION
256 :NEXT
814B: A9 26 257 LDA #<S0RXRSR ; S0 RECEIVED SIZE REGISTER
814D: 8D B6 C0 258 STA WADRL
8150: AD B7 C0 259 LDA WDATA ; HIGH BYTE OF RECEIVED SIZE
8153: 0D B7 C0 260 ORA WDATA ; LOW BYTE
8156: F0 03 261 BEQ NORECV ; NO DATA TO READ
8158: 4C 60 81 262 JMP RECV ; THERE IS DATA
263 *
264 NORECV
815B: EA 265 NOP ; LITTLE DELAY...
815C: EA 266 NOP
815D: 4C 40 81 267 JMP CHECKRECV ; CHECK AGAIN
268 *
269 * THERE IS DATA TO READ - COMPUTE THE PHYSICAL ADDRESS
270 *
271 RECV
8160: A9 26 272 LDA #<S0RXRSR ; GET RECEIVED SIZE AGAIN
8162: 8D B6 C0 273 STA WADRL
8165: AD B7 C0 274 LDA WDATA
8168: 85 09 275 STA GETSIZE+1 ; HIGH BYTE
816A: AD B7 C0 276 LDA WDATA
816D: 85 08 277 STA GETSIZE ; LOW BYTE
278 *
279 * CALCULATE OFFSET ADDRESS USING READ POINTER AND RX MASK
280 *
816F: A9 28 281 LDA #<S0RXRD
8171: 8D B6 C0 282 STA WADRL
8174: AD B7 C0 283 LDA WDATA ; HIGH BYTE
8177: 29 1F 284 AND #>RXMASK
8179: 85 0B 285 STA GETOFFSET+1
817B: AD B7 C0 286 LDA WDATA ; LOW BYTE
817E: 29 FF 287 AND #<RXMASK
8180: 85 0A 288 STA GETOFFSET
289 *
290 * CALCULATE PHYSICAL ADDRESS WITHIN W5100 RX BUFFER
291 *
8182: 18 292 CLC
8183: A5 0A 293 LDA GETOFFSET
8185: 69 00 294 ADC #<RXBASE
8187: 85 0C 295 STA GETSTARTADR
8189: A5 0B 296 LDA GETOFFSET+1
818B: 69 60 297 ADC #>RXBASE
818D: 85 0D 298 STA GETSTARTADR+1
299 *
300 * SET BUFFER ADDRESS ON APPLE
301 *
818F: A9 00 302 LDA #0 ; LOW BYTE OF BUFFER
8191: 85 06 303 STA PTR
8193: A9 50 304 LDA #$50 ; HIGH BYTE
8195: 85 07 305 STA PTR+1
306 *
307 * SET BUFFER ADDRESS ON W5100
308 *
309 * JSR DEBUG ; UNCOMMENT FOR W5100 DEBUG INFO
8197: A5 0D 310 LDA GETSTARTADR+1 ; HIGH BYTE FIRST
8199: 8D B5 C0 311 STA WADRH
819C: A5 0C 312 LDA GETSTARTADR
819E: 8D B6 C0 313 STA WADRL
314 *
315 * BEGIN COPY
316 *
81A1: A0 00 317 LDY #0
81A3: A6 09 318 LDX GETSIZE+1
81A5: F0 10 319 BEQ :LAST ; LESS THAN 256 BYTES
81A7: AD B7 C0 320 :L LDA WDATA
81AA: 91 06 321 STA (PTR),Y
322 *
81AC: 20 1D 82 323 JSR CLEANOUT ; DEBUG PRINT
324 *
81AF: C8 325 INY
81B0: D0 F5 326 BNE :L
81B2: E6 07 327 INC PTR+1 ; Y WRAPPED TO 0, GO TO NEXT PAGE
81B4: CA 328 DEX
81B5: D0 F0 329 BNE :L
330 :LAST
81B7: A6 08 331 LDX GETSIZE
81B9: AD B7 C0 332 :L2 LDA WDATA
81BC: 91 06 333 STA (PTR),Y
334 *
81BE: 20 1D 82 335 JSR CLEANOUT ; DEBUG PRINT
336 *
81C1: C8 337 INY
81C2: CA 338 DEX
81C3: D0 F4 339 BNE :L2
340 *
81C5: A9 8D 341 LDA #$8D ; <CR>
81C7: 20 ED FD 342 JSR COUT ; DEBUG PRINT
343 *
344 *
345 * UPDATE RXRD TO REFLECT DATA WE JUST READ
346 *
347 UPDATERXRD
81CA: 18 348 CLC
81CB: A9 04 349 LDA #>S0RXRD ; NEED HIGH BYTE HERE
81CD: 8D B5 C0 350 STA WADRH
81D0: A9 28 351 LDA #<S0RXRD
81D2: 8D B6 C0 352 STA WADRL
81D5: AD B7 C0 353 LDA WDATA ; HIGH BYTE
81D8: A8 354 TAY ; SAVE
81D9: AD B7 C0 355 LDA WDATA ; LOW BYTE
81DC: 65 08 356 ADC GETSIZE ; ADD LOW BYTE OF RECEIVED SIZE
81DE: AA 357 TAX ; SAVE
81DF: 98 358 TYA ; GET HIGH BYTE BACK
81E0: 65 09 359 ADC GETSIZE+1 ; ADD HIGH BYTE OF RECEIVED SIZE _
81E2: A8 360 TAY ; SAVE
81E3: A9 28 361 LDA #<S0RXRD
81E5: 8D B6 C0 362 STA WADRL
81E8: 8C B7 C0 363 STY WDATA ; SEND HIGH BYTE
81EB: 8E B7 C0 364 STX WDATA ; SEND LOW BYTE
365 *
366 * SEND THE RECV COMMAND
367 *
81EE: A9 01 368 LDA #<S0CR
81F0: 8D B6 C0 369 STA WADRL
81F3: A9 40 370 LDA #SCRECV
81F5: 8D B7 C0 371 STA WDATA
372 *
373 *
374 *
81F8: 4C 40 81 375 JMP CHECKRECV
376 *
377 *
378 * CLOSE TCP CONNECTION
379 *
380 CLOSECONN
81FB: A9 04 381 LDA #>S0CR ; HIGH BYTE NEEDED
81FD: 8D B5 C0 382 STA WADRH
8200: A9 01 383 LDA #<S0CR
8202: 8D B6 C0 384 STA WADRL
8205: A9 08 385 LDA #SCDISCON ; DISCONNECT
8207: 8D B7 C0 386 STA WDATA ; SEND COMMAND
387 *
388 * CHECK FOR CLOSED STATUS
389 *
390 CHECKCLOSED
820A: A2 00 391 LDX #0
820C: A9 03 392 :L LDA #<S0SR
820E: 8D B6 C0 393 STA WADRL
8211: AD B7 C0 394 LDA WDATA
8214: F0 06 395 BEQ ISCLOSED
8216: EA 396 NOP
8217: EA 397 NOP
8218: EA 398 NOP
8219: E8 399 INX
821A: D0 F0 400 BNE :L ; DON'T WAIT FOREVER
401 ISCLOSED
821C: 60 402 RTS ; SOCKET IS CLOSED
403 *
404 *
405 * SUPPORT SUBROUTINE: CLEANOUT
406 * "CLEANS UP" OUTPUT FOR THE APPLE BY
407 * SETTING THE HIGH BIT AND DOING SOME SUBSTITUTIONS
408 CLEANOUT
821D: 09 80 409 ORA #%10000000 ; SET HIGH BIT
821F: C9 8A 410 CMP #$8A ; NEWLINE?
8221: D0 02 411 BNE :OUT
8223: A9 8D 412 LDA #$8D ; CONVERT TO <CR>
413 :OUT
8225: 4C ED FD 414 JMP COUT ; THIS WILL DO THE RTS
415 *
416 * DEBUG - PRINT W5100 STARTADR AND SIZE
417 *
418 DEBUG
8228: A9 A0 419 LDA #" "
822A: 20 ED FD 420 JSR COUT
822D: A9 A4 421 LDA #"$"
822F: 20 ED FD 422 JSR COUT
8232: A5 0D 423 LDA GETSTARTADR+1
8234: A6 0C 424 LDX GETSTARTADR
8236: 20 41 F9 425 JSR PRNTAX
8239: A9 A0 426 LDA #" "
823B: 20 ED FD 427 JSR COUT
823E: A9 A4 428 LDA #"$"
8240: 20 ED FD 429 JSR COUT
8243: A5 09 430 LDA GETSIZE+1
8245: A6 08 431 LDX GETSIZE
8247: 20 41 F9 432 JSR PRNTAX
824A: A9 8D 433 LDA #$8D
824C: 4C ED FD 434 JMP COUT ; THIS WILL DO THE RTS
435 *
--End assembly, 591 bytes, Errors: 0
Back to comp.sys.apple2.programmer | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Uthernet II manual - sample code Chris Torrence <gorthmog@gmail.com> - 2017-02-05 14:16 -0800
Re: Uthernet II manual - sample code D Finnigan <dog_cow@macgui.com> - 2017-02-06 03:41 +0000
Re: Uthernet II manual - sample code Oliver Schmidt <ol.sc@web.de> - 2017-02-06 10:20 +0000
Re: Uthernet II manual - sample code Oliver Schmidt <ol.sc@web.de> - 2017-02-06 10:28 +0000
Re: Uthernet II manual - sample code Chris Torrence <gorthmog@gmail.com> - 2017-02-06 17:20 -0800
Re: Uthernet II manual - sample code D Finnigan <dog_cow@macgui.com> - 2017-02-07 02:59 +0000
Re: Uthernet II manual - sample code "Mark D. Overholser" <marko@markoverholser.com> - 2017-02-07 10:33 -0800
Re: Uthernet II manual - sample code D Finnigan <dog_cow@macgui.com> - 2017-02-07 21:42 +0000
Re: Uthernet II manual - sample code D Finnigan <dog_cow@macgui.com> - 2017-02-12 20:49 +0000
Re: Uthernet II manual - sample code D Finnigan <dog_cow@macgui.com> - 2017-02-25 23:29 +0000
Re: Uthernet II manual - sample code "Mark D. Overholser" <marko@markoverholser.com> - 2017-02-25 21:12 -0800
Re: Uthernet II manual - sample code D Finnigan <dog_cow@macgui.com> - 2017-02-26 20:03 +0000
Re: Uthernet II manual - sample code "Mark D. Overholser" <marko@markoverholser.com> - 2017-02-26 16:26 -0800
Re: Uthernet II manual - sample code D Finnigan <dog_cow@macgui.com> - 2017-02-27 01:38 +0000
Re: Uthernet II manual - sample code "Mark D. Overholser" <marko@markoverholser.com> - 2017-02-27 09:58 -0800
csiph-web