gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ; --------------------------------------------------------------------------- 00002 ; PIC18F452 + 3COM 3C509b ISA network card ; 00003 ; --------------------------------------------------------------------------- 00004 ; 00005 ; Written by : 00006 ; 00007 ; Jan Wagemakers : Donated to the Public Domain 00008 ; 00009 ; --------------------------------------------------------------------------- 00010 ; 00011 ; STATUS : 00012 ; ARP : OK 00013 ; ICMP (ping) : OK (ping -s 1472 192.168.1.99) 00014 ; HTTP (webserver) : OK 00015 ; 00016 ; --------------------------------------------------------------------------- 00017 ; 00018 ; Met dank aan Gerard voor zijn bijdrage aan de broncode van dit programma! 00019 ; 00020 ; --------------------------------------------------------------------------- 00021 00022 LIST P=PIC18F452, F=INHX32 00023 #INCLUDE 00001 LIST 00002 ; P18F452.INC Standard Header File, Version 1.4 Microchip Technology, Inc. 00983 LIST 00024 00025 ; - remove ";" below for LCD-routines 00026 ; - Verwijder ";" hieronder voor de LCD-routines 00027 #define LCD 1 00028 00029 ; - define the IP-address here 00030 ; - stel hier het IP adres in 00031 #define IP0 D'192' 00032 #define IP1 D'168' 00033 #define IP2 D'001' 00034 #define IP3 D'099' 00035 00036 ; - define the MAC-address here 00037 ; - stel hier het MAC-adres in 00038 #define MAC0 H'3C' 00039 #define MAC1 H'50' 00040 #define MAC2 H'9B' 00041 #define MAC3 H'18' 00042 #define MAC4 H'F4' 00043 #define MAC5 H'52' 00044 00045 ;-) --- Definieer de poorten. 00046 00047 #DEFINE RS PORTE, 0 ; RE0 = RS LCD 00048 #DEFINE E PORTE, 1 ; RE1 = E LCD 00049 00050 #define a0 PORTD,0 ; adres-lijnen 3COM 00051 #define a1 PORTD,1 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00052 #define a2 PORTD,2 00053 #define a3 PORTD,3 00054 #define a9 PORTD,4 00055 ; 00056 ; a19 a18 a17 a16 a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 00057 ; 0 0 0 0 0 0 0 0 0 0 x 1 0 0 0 0 y y y y 00058 ; 00059 ; x = 1 --> 110000yyyy --> 0x300 - 0x30F 00060 ; x = 0 --> 010000yyyy --> 0x100 - 0x10F 00061 00062 #define ior PORTD,5 00063 #define iow PORTD,7 00064 #define reset PORTD,6 00065 00066 ;-) --- PIC configuratie 00067 300000 F9FF 00068 __CONFIG _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H 00069 __CONFIG _CONFIG2L, _BOR_OFF_2L & _BORV_20_2L & _PWRT_ON_2L 300002 FEFC 00070 __CONFIG _CONFIG2H, _WDT_OFF_2H 300006 FFFA 00071 __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L 00072 00073 ; __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L 00074 ; __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H 00075 ; __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L 00076 ; __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H 00077 ; __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L 00078 ; __CONFIG _CONFIG7H, _EBTRB_OFF_7H 00079 00080 ;-) --- Variabelen 00081 00082 cblock 0x00 ; Start RAM 00083 ; 00084 delay ; gebruikt in vertragings-routine en .... 00085 delay2 ; .... als hulpvariable 00086 Hchecksum ; gebruikt in checksum-routine en .... 00087 Lchecksum ; .... als hulpvariable 00088 ; 00089 texthtml ; Geeft aan dat het huidige bestand een html-bestand is 00090 ; 00091 getfileH 00092 getfileL ; GET /bestandnaam 00093 ; ; ^--------------getfileH:getfileL 00094 ; 00095 Llow ; Lengte van het pakket + hulp-variabele 00096 Lhigh 00097 endc 00098 00099 IFDEF LCD 00100 cblock ; 00101 Temp ; Enkel gebruikt in LCD-routine 00102 hundreds ; BCD hundreds result 00103 tens_and_ones ; BCD tens and ones result 00104 bin ; binary number to be converted to BCD 00105 ; gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00106 endc 00107 ENDIF 00108 00109 cblock ; 00110 RAM ; Start van het nog VRIJE RAM geheugen 00111 ; Hier niets plaatsen! 00112 endc 00113 00114 ;-) --- Macro's 00115 00116 EStrobe MACRO ; Strobe the "E" Bit 00117 bsf E 00118 bcf E 00119 ENDM 00120 00121 INCa0123 MACRO 00122 incf PORTD,f 00123 ENDM 00124 00125 DECa0123 MACRO 00126 decf PORTD,f 00127 ENDM 00128 00129 a0123 MACRO a 00130 IF a==H'0' 00131 call CLEARa0123 00132 ENDIF 00133 IF a==H'1' 00134 ERROR "a0123 ERROR" 00135 ENDIF 00136 IF a==H'2' 00137 ERROR "a0123 ERROR" 00138 ENDIF 00139 IF a==H'3' 00140 ERROR "a0123 ERROR" 00141 ENDIF 00142 IF a==H'4' 00143 call CLEARa0123 00144 bsf a2 00145 ENDIF 00146 IF a==H'5' 00147 ERROR "a0123 ERROR" 00148 ENDIF 00149 IF a==H'6' 00150 ERROR "a0123 ERROR" 00151 ENDIF 00152 IF a==H'7' 00153 ERROR "a0123 ERROR" 00154 ENDIF 00155 IF a==H'8' 00156 call CLEARa0123 00157 bsf a3 00158 ENDIF 00159 IF a==H'9' gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 4 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00160 ERROR "a0123 ERROR" 00161 ENDIF 00162 IF a==H'A' 00163 bcf a0 00164 bcf a2 00165 bsf a3 00166 bsf a1 00167 ENDIF 00168 IF a==H'B' 00169 bsf a0 00170 bcf a2 00171 bsf a3 00172 bsf a1 00173 ENDIF 00174 IF a==H'C' 00175 ERROR "a0123 ERROR" 00176 ENDIF 00177 IF a==H'D' 00178 ERROR "a0123 ERROR" 00179 ENDIF 00180 IF a==H'E' 00181 call MOVL_E_a0123 00182 ENDIF 00183 IF a==H'f' 00184 ERROR "a0123 ERROR" 00185 ENDIF 00186 ENDM 00187 00188 ;-) --- Ok, laten we eindelijk eens serieus beginnen. 00189 0000 00190 org 0x0000 ; Reset vector 0000 EFB6 F000 00191 goto start 00192 0008 00193 org 0x0008 ; Lhigh priority interrupt vector 0008 EF04 F000 00194 goto $ ; Trap 00195 0018 00196 org 0x0018 ; Llow priority interrupt vector 0018 EF0C F000 00197 goto $ ; Trap 00198 00199 ;-) --- Init het LCD-scherm 00200 00201 IFDEF LCD 00202 001C 00203 initlcd: 001C EC9C F000 00204 call wacht40ms 0020 9084 00205 bcf RS ; send an 8 bit instruction 0022 0E03 00206 movlw 0x03 ; Reset Command 0024 EC46 F000 00207 call NybbleOut ; Send the Nybble 0028 EC99 F000 00208 call wacht5ms 00209 EStrobe 002C 8284 M bsf E 002E 9284 M bcf E 0030 EC90 F000 00210 call wacht160us 00211 EStrobe gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 5 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0034 8284 M bsf E 0036 9284 M bcf E 0038 EC90 F000 00212 call wacht160us 003C 9084 00213 bcf RS ; send an 8 bit instruction 003E 0E02 00214 movlw 0x02 ; Set 4 Bit Mode 0040 EC46 F000 00215 call NybbleOut 0044 EC90 F000 00216 call wacht160us 0048 0E28 00217 movlw 0x028 ; 4 bit, 2 Line, 5x7 font 004A EC4C F000 00218 call SendINS 004E 0E10 00219 movlw 0x010 ; display shift off 0050 EC4C F000 00220 call SendINS 0054 0E06 00221 movlw 0x006 ; increment cursor 0056 EC4C F000 00222 call SendINS 005A 0E0C 00223 movlw 0x00C ; display on cursor off 005C EC4C F000 00224 call SendINS 0060 00225 cls: 0060 0E01 00226 movlw 0x001 ; Clear the Display RAM 0062 EC4C F000 00227 call SendINS 0066 EC99 F000 00228 call wacht5ms 006A 0012 00229 return 00230 00231 ;-) --- LCD goto lijn 00232 006C 00233 goto1: 006C 0E80 00234 movlw H'80' ; we gaan naar lijn 2 006E EC4C F000 00235 call SendINS 0072 0012 00236 Return 00237 0074 00238 goto2: 0074 0EC0 00239 movlw H'C0' ; we gaan naar lijn 2 0076 EC4C F000 00240 call SendINS 007A 0012 00241 Return 00242 007C 00243 goto3: 007C 0E94 00244 movlw H'94' ; we gaan naar lijn 3 007E EC4C F000 00245 call SendINS 0082 0012 00246 Return 00247 0084 00248 goto4: 0084 0ED4 00249 movlw H'D4' ; we gaan naar lijn 4 0086 EC4C F000 00250 call SendINS 008A 0012 00251 Return 00252 008C 00253 NybbleOut: ; Send a Nybble to the LCD 008C 6E80 00254 movwf PORTA 00255 EStrobe ; Strobe out the LCD Data 008E 8284 M bsf E 0090 9284 M bcf E 0092 EC90 F000 00256 call wacht160us 0096 0012 00257 return 00258 0098 00259 SendINS: ; Send the Instruction to the LCD 0098 6E09 00260 movwf Temp ; Save the Temporary Value 009A 3809 00261 swapf Temp, w ; Send the Lhigh Nybble gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 6 LOC OBJECT CODE LINE SOURCE TEXT VALUE 009C 9084 00262 bcf RS ; RS = 0 009E EC46 F000 00263 call NybbleOut 00A2 5009 00264 movf Temp, w ; Send the Llow Nybble 00A4 9084 00265 bcf RS 00A6 EC46 F000 00266 call NybbleOut 00AA 0012 00267 return 00268 00AC 00269 SendASCII 00AC 0F30 00270 addlw '0' ; Send nbr as ASCII character 00AE 00271 SendCHAR ; Send the Character to the LCD 00AE 6E09 00272 movwf Temp ; Save the Temporary Value 00B0 3809 00273 swapf Temp, w ; Send the Lhigh Nybble 00B2 8084 00274 bsf RS ; RS = 1 00B4 EC46 F000 00275 call NybbleOut 00B8 5009 00276 movf Temp, w ; Send the Llow Nybble 00BA 8084 00277 bsf RS 00BC EC46 F000 00278 call NybbleOut 00C0 0012 00279 return 00280 00C2 00281 DispDec: 00C2 6E0C 00282 movwf bin 00C4 EC70 F000 00283 call binary_to_bcd 00C8 500A 00284 movf hundreds, W 00CA EC56 F000 00285 call SendASCII 00CE 380B 00286 swapf tens_and_ones, W 00D0 0B0F 00287 andlw H'F' 00D2 EC56 F000 00288 call SendASCII 00D6 500B 00289 movf tens_and_ones, W 00D8 0B0F 00290 andlw H'F' 00DA EC56 F000 00291 call SendASCII 00DE 0012 00292 return 00293 00E0 00294 binary_to_bcd: ; by Scott Dattalo 00E0 6A0A 00295 clrf hundreds 00E2 380C 00296 swapf bin, W 00E4 240C 00297 addwf bin, W 00E6 0B0F 00298 andlw B'00001111' 00E8 B2D8 00299 BTFSC STATUS,DC 00EA 0F16 00300 addlw 0x16 00EC B2D8 00301 BTFSC STATUS,DC 00EE 0F06 00302 addlw 0x06 00F0 0F06 00303 addlw 0x06 00F2 A2D8 00304 BTFSS STATUS,DC 00F4 0FFA 00305 addlw -0x06 00F6 B80C 00306 btfsc bin,4 00F8 0F1B 00307 addlw 0x16 - 1 + 0x6 00FA A2D8 00308 BTFSS STATUS,DC 00FC 0FFA 00309 addlw -0x06 00FE BA0C 00310 btfsc bin,5 0100 0F30 00311 addlw 0x30 0102 BC0C 00312 btfsc bin, 6 0104 0F60 00313 addlw 0x60 0106 BE0C 00314 btfsc bin,7 0108 0F20 00315 addlw 0x20 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 7 LOC OBJECT CODE LINE SOURCE TEXT VALUE 010A 0F60 00316 addlw 0x60 010C 360A 00317 rlcf hundreds, f 010E A00A 00318 btfss hundreds, 0 0110 0FA0 00319 addlw -0x60 0112 6E0B 00320 movwf tens_and_ones 0114 BE0C 00321 btfsc bin,7 0116 2A0A 00322 incf hundreds, f 0118 0012 00323 return 00324 00325 ENDIF 00326 00327 ;-) --- Delay routines - klokfrekwentie = 4Mhz 00328 ; - de 160us routine is berekend via 00329 ; - de 250us is hetzelfde als 160us, maar gebruikt 250 klokpulsen 00330 ; - de xxx ms routines roepen 4 * de 250us routine aan om aan de ms timing te komen. 00331 00332 ; Bij een andere klok dient dus de 160us en 250us aangepast te worden. 00333 011A 00334 wacht250us: 00335 ;250 cycles 011A 0E53 00336 movlw 0x53 011C EF91 F000 00337 goto wachtxxxus 0120 00338 wacht160us: 00339 ; Delay = 160 instruction cycles 00340 ; Clock frequency = 4 MHz 00341 00342 ; Actual delay = 0.00016 seconds = 160 cycles 00343 ; Error = 0 % 00344 00345 ;160 cycles 0120 0E35 00346 movlw 0x35 ; Merk op dat 0x20 ook nog werkt en snellere pings teruggeeft 0122 00347 wachtxxxus: 0122 6E00 00348 movwf delay 0124 00349 Delay_0 0124 2E00 00350 decfsz delay, f 0126 EF92 F000 00351 goto Delay_0 012A 0012 00352 return 00353 012C 00354 wacht250ms: 012C 0EFA 00355 movlw D'250' 012E EF9D F000 00356 goto wachtxxxms 0132 00357 wacht5ms: 0132 0E05 00358 movlw D'5' 0134 EF9D F000 00359 goto wachtxxxms 0138 00360 wacht40ms: 0138 0E28 00361 movlw D'40' 013A 00362 wachtxxxms: 013A 6E01 00363 movwf delay2 013C 00364 w2: 013C ECA4 F000 00365 call wacht1ms 0140 2E01 00366 decfsz delay2, F 0142 EF9E F000 00367 goto w2 0146 0012 00368 return 00369 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 8 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0148 00370 wacht1ms: 0148 EC8D F000 00371 call wacht250us 014C EC8D F000 00372 call wacht250us 0150 EC8D F000 00373 call wacht250us 0154 EC8D F000 00374 call wacht250us 0158 0012 00375 return 00376 015A 00377 wacht1s: 015A EC96 F000 00378 call wacht250ms 015E EC96 F000 00379 call wacht250ms 0162 EC96 F000 00380 call wacht250ms 0166 EC96 F000 00381 call wacht250ms 016A 0012 00382 return 00383 00384 ;-) --- Start --------------------------------------------------------------- 00385 016C 00386 start: 00387 00388 ; --- INIT pic ------------------------------------------------------ 00389 ; ; 016C 68C1 00390 setf ADCON1 ; 00391 ; ; 016E 6AF2 00392 clrf INTCON ; 00393 ; ; 0170 6A92 00394 clrf TRISA ; Zet alles op OUTPUT ; 0172 6A93 00395 clrf TRISB ; 0174 6A94 00396 clrf TRISC ; 0176 6A95 00397 clrf TRISD ; 0178 6A96 00398 clrf TRISE ; 00399 ; ; 00400 ; ------------------------------------------------------------------- 00401 00402 IFDEF LCD 017A EC0E F000 00403 call initlcd 00404 ENDIF 00405 00406 017E 9C83 00407 bcf reset 0180 8C83 00408 bsf reset ; RESET 3COM 0182 ECAD F000 00409 call wacht1s 0186 9C83 00410 bcf reset 0188 EC96 F000 00411 call wacht250ms 00412 018C 8A83 00413 bsf ior ; Initialisatie 018E 8E83 00414 bsf iow 00415 0190 9883 00416 bcf a9 ; Zet 0x100 op adres-bus : A0, A1, A2, A3, A9 = 0 00417 a0123 0 M IF a==H'0' 0192 ECEF F003 M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 9 LOC OBJECT CODE LINE SOURCE TEXT VALUE M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 00418 00419 ; ------------------------------------------------------------------- 00420 ; ; 00421 ; We gaan nu de PDF volgen op blz 66/67/68 ; gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 10 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00422 ; Schrijf eerst 2 * 0 naar de ISA-kaart om de aandacht te trekken. ; 00423 ; ; 0196 ECE2 F003 00424 call ISAout0 ; 019A ECE2 F003 00425 call ISAout0 ; 00426 ; ; 00427 ; Schrijf dan een bepaalde 'code' naar de kaart om hem wakker te ; 00428 ; maken. ; 00429 ; ; 019E 680D 00430 setf RAM ; 01A0 680E 00431 setf RAM+1 ; 01A2 00432 Seq1: ; 01A2 500E 00433 movf RAM+1,w ; 01A4 ECE3 F003 00434 call ISAout ; 01A8 90D8 00435 bcf STATUS,C ; 01AA 360E 00436 rlcf RAM+1,f ; 01AC E302 00437 bnc Seq2 ; 01AE 0ECF 00438 movlw 0xcf ; 01B0 1A0E 00439 xorwf RAM+1,f ; 01B2 00440 Seq2: ; 01B2 2E0D 00441 decfsz RAM,f ; 01B4 EFD1 F000 00442 goto Seq1 ; 00443 ; ; 00444 ; ------------------------------------------------------------------- 00445 00446 IFDEF LCD 01B8 EC36 F000 00447 call goto1 01BC 0E00 00448 movlw D'000' 01BE EC61 F000 00449 call DispDec 01C2 ECAD F000 00450 call wacht1s 00451 ENDIF 00452 00453 ; ------------------------------------------------------------------- 00454 ; ; 00455 ; Nu de kaart wakker is, lees voldoende gegevens om hem wakker te ; 00456 ; houden. En nu we toch bezig zijn, kunnen we hier dus ineens ; 00457 ; nuttige informatie opvragen. ; 00458 ; ; 00459 ; We lezen van 0x87 en 0x98 en gaan na of we 0x6D50 binnenkrijgen. ; 00460 ; Indien niet dan is er iets mis. Kaart niet aanwezig, draadbreuk, ; 00461 ; geen 3COM ISA-kaart, ... ; 00462 ; ; 01C6 0E87 00463 movlw H'87' ; Start met 0x87 ; 01C8 00464 ee1: ; 01C8 6E10 00465 movwf RAM+3 ; Om straks te weten of we H'87' ... ; 01CA DAFD 00466 rcall ISAout ; ... of H'98' hebben gedaan. ; 01CC 6A07 00467 clrf Llow ; 01CE 6A08 00468 clrf Lhigh ; 01D0 0E10 00469 movlw D'16' ; Lees gegevens uit de EEprom. ; 00470 ; ; De gevens worden bit per bit doorgestuurd ; 00471 ; ; 16 keer lezen en tot een 'woord' ... ; 00472 ; ; ... samenvoegen. ; 01D2 6E0E 00473 movwf RAM+1 ; 01D4 00474 ee2: ; 01D4 DAFD 00475 rcall ISAin ; gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 11 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01D6 6E11 00476 movwf RAM+4 ; zet ingelezen waarde op RAM+4 ; 01D8 3011 00477 rrcf RAM+4,w ; C = bit0 van RAM+4 ; 01DA 3607 00478 rlcf Llow,f ; schuif 1 plaatsje naar links op met C ; 01DC 3608 00479 rlcf Lhigh,f ; 01DE 2E0E 00480 decfsz RAM+1,f ; alle 16bits gedaan? ; 01E0 D7F9 00481 bra ee2 ; nee, doe dan voort ; 00482 ; ; 01E2 0E6D 00483 movlw H'6D' ; vergelijk met 6D50 ; 01E4 6208 00484 cpfseq Lhigh ; 01E6 D7C2 00485 bra start ; 01E8 0E50 00486 movlw H'50' ; 01EA 6207 00487 cpfseq Llow ; 01EC D7BF 00488 bra start ; geen 6D50, ga terug naar start... ; 00489 ; ; 01EE 0E98 00490 movlw H'98' ; Herhaal nogmaals met 0x98 ; 01F0 6210 00491 cpfseq RAM+3 ; 01F2 D7EA 00492 bra ee1 ; 00493 ; ; 00494 ; ------------------------------------------------------------------- 00495 00496 IFDEF LCD 01F4 EC36 F000 00497 call goto1 01F8 0E01 00498 movlw D'001' 01FA EC61 F000 00499 call DispDec 01FE ECAD F000 00500 call wacht1s 00501 ENDIF 00502 00503 ; ------------------------------------------------------------------- 00504 ; ; 00505 ; Nu de kaart wakker is, moeten we hem nog aktief maken. ; 00506 ; ; 0202 0EF0 00507 movlw 0xf0 ; activate adapter IO = 0x300 ; 0204 ECE3 F003 00508 call ISAout ; 00509 ; ; 00510 ; ------------------------------------------------------------------- 00511 00512 ; ------------------------------------------------------------------- 00513 ; ; 00514 ; Nu de kaart aktief is kunnen we adreslijn A9 hoog maken zodat we ; 00515 ; via IO 0x300 kunnen kommuniceren. ; 00516 ; ; 0208 8883 00517 bsf a9 ; 00518 ; ; 00519 ; ------------------------------------------------------------------- 00520 00521 00522 00523 ;-) --- ; OK, zover zijn we al. Voor het verdere verloop raadplegen we de 00524 ; PDF A-3 : Driver Routine Flowchart 00525 00526 00527 00528 ; ------------------------------------------------------------------- 00529 ; ; gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 12 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00530 ; We moeten de kaart nu eerst nog enablen voordat we hem echt ; 00531 ; kunnen gaan gebruiken. ; 00532 ; ; 00533 a0123 4 ; Configuration Control Register ... ; M IF a==H'0' M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' 020A ECEF F003 M call CLEARa0123 020E 8483 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 13 LOC OBJECT CODE LINE SOURCE TEXT VALUE M IF a==H'E' M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 00534 ; ; ... (Read/Write - Offset 4) ; 0210 0E01 00535 movlw B'00000001' ; 0212 ECE3 F003 00536 call ISAout ; Schrijf een 1 naar dit register ENA --> 1 ; 00537 ; ; adapter is nu ge-enabled ; 00538 INCa0123 ; adres + 1 (WORD) ; 0216 2A83 M incf PORTD,f 0218 ECE2 F003 00539 call ISAout0 ; 00540 ; ; 00541 ; ------------------------------------------------------------------- 00542 021C 00543 TXreset: 00544 00545 ; ------------------------------------------------------------------- 00546 ; ; 00547 ; Reset transmitter door naar het Command register (offset 0e) ; 00548 ; het tx-reset commando te sturen (zie pdf blz 38) ; 00549 ; ; 00550 a0123 H'E' ; M IF a==H'0' M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 14 LOC OBJECT CODE LINE SOURCE TEXT VALUE M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' 021C ECF2 F003 M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 0220 ECE2 F003 00551 call ISAout0 ; 00552 INCa0123 ; 0224 2A83 M incf PORTD,f 0226 0E58 00553 movlw B'01011000' ; 0228 ECE3 F003 00554 call ISAout ; 00555 ; ; 00556 ; ------------------------------------------------------------------- 00557 00558 ; ------------------------------------------------------------------- 00559 ; ; 00560 ; Reset receiver door naar het Command register (offset 0e) het ; 00561 ; rx-reset commando te sturen (zie pdf blz 37) ; 00562 ; ; 00563 DECa0123 ; 022C 0683 M decf PORTD,f 022E ECE2 F003 00564 call ISAout0 ; 00565 INCa0123 ; 0232 2A83 M incf PORTD,f 0234 0E28 00566 movlw B'00101000' ; 0236 ECE3 F003 00567 call ISAout ; 00568 ; ; 00569 ; ------------------------------------------------------------------- 00570 00571 ; ------------------------------------------------------------------- 00572 ; ; 00573 ; rx-filter instellen : zie pdf blz 41 ; 00574 ; ; 00575 DECa0123 ; gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 15 LOC OBJECT CODE LINE SOURCE TEXT VALUE 023A 0683 M decf PORTD,f 023C 0E05 00576 movlw B'00000101' ; 0001 Individual address ; 00577 ; ; 0010 Group (multicast) addresses ; 00578 ; ; 0100 Broadcast address ; 00579 ; ; 1000 All addresses (promiscuous mode) ; 023E ECE3 F003 00580 call ISAout ; 00581 INCa0123 ; 0242 2A83 M incf PORTD,f 0244 0E80 00582 movlw B'10000000' ; 0246 ECE3 F003 00583 call ISAout ; 00584 ; ; 00585 ; ------------------------------------------------------------------- 00586 00587 ; ------------------------------------------------------------------- 00588 ; ; 00589 ; Nu moeten we het MAC-adres nog instellen. ; 00590 ; naar WINDOW 2 , zie blz 28 pdf ; 00591 ; ; 00592 ; Kies eerst WINDOW 2 (zie pdf blz 36) ; 00593 ; ; 00594 DECa0123 ; 024A 0683 M decf PORTD,f 024C 0E02 00595 movlw 0x02 ; 024E ECE3 F003 00596 call ISAout ; 00597 INCa0123 ; 0252 2A83 M incf PORTD,f 0254 0E08 00598 movlw 0x08 ; 0256 ECE3 F003 00599 call ISAout ; 00600 ; ; 00601 ; Nu we in WINDOW2 zitten kunnen we het MAC-adres schrijven. ; 00602 ; ; 00603 a0123 0 ; M IF a==H'0' 025A ECEF F003 M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 16 LOC OBJECT CODE LINE SOURCE TEXT VALUE M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 025E 0E3C 00604 movlw MAC0 ; 0260 ECE3 F003 00605 call ISAout ; 00606 INCa0123 ; 0264 2A83 M incf PORTD,f 0266 0E50 00607 movlw MAC1 ; 0268 ECE3 F003 00608 call ISAout ; 00609 INCa0123 ; 026C 2A83 M incf PORTD,f 026E 0E9B 00610 movlw MAC2 ; 0270 ECE3 F003 00611 call ISAout ; 00612 INCa0123 ; 0274 2A83 M incf PORTD,f 0276 0E18 00613 movlw MAC3 ; 0278 ECE3 F003 00614 call ISAout ; 00615 INCa0123 ; 027C 2A83 M incf PORTD,f 027E 0EF4 00616 movlw MAC4 ; 0280 ECE3 F003 00617 call ISAout ; 00618 INCa0123 ; 0284 2A83 M incf PORTD,f gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 17 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0286 0E52 00619 movlw MAC5 ; 0288 ECE3 F003 00620 call ISAout ; 00621 ; ; 00622 ; ------------------------------------------------------------------- 00623 00624 ; ------------------------------------------------------------------- 00625 ; ; 00626 ; We gaan 10BASE-T gebruiken, dus moeten we nu : ; 00627 ; ; 00628 ; Set Link Beat and Jabber enable bits ; 00629 ; in Media Type and Status register ; 00630 ; Stop transceiver ; 00631 ; ; 00632 ; Hiervoor zijn we in Window 4 nodig ; 00633 ; ; 00634 ; Kies eerst WINDOW 4 ; 00635 ; ; 00636 a0123 H'E' ; M IF a==H'0' M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 18 LOC OBJECT CODE LINE SOURCE TEXT VALUE M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' 028C ECF2 F003 M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 0290 0E04 00637 movlw 0x04 ; 0292 ECE3 F003 00638 call ISAout ; 00639 INCa0123 ; 0296 2A83 M incf PORTD,f 0298 0E08 00640 movlw 0x08 ; 029A ECE3 F003 00641 call ISAout ; 00642 ; ; 00643 ; Set Link Beat and Jabber enable bits ; 00644 ; zie pdf blz 58 ; 00645 ; Bit 7 1 = Link beat enabled (writable). Defaults to 0 ; 00646 ; (disabled). Must be set by software only if the ; 00647 ; internal TP transceiver is in use. Link beat must be ; 00648 ; disabled in ENDEC loopback mode. ; 00649 ; Bit 6 1 = Jabber enabled (writable). Defaults to 0 (disabled). ; 00650 ; Must be set by software only if the internal TP ; 00651 ; transceiver is in use. This also enables the Polarity ; 00652 ; Reversal state machine. ; 00653 ; ; 00654 a0123 H'A' ; M IF a==H'0' M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 19 LOC OBJECT CODE LINE SOURCE TEXT VALUE M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' 029E 9083 M bcf a0 02A0 9483 M bcf a2 02A2 8683 M bsf a3 02A4 8283 M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 02A6 0EC0 00655 movlw B'11000000' ; 02A8 ECE3 F003 00656 call ISAout ; 00657 INCa0123 ; 02AC 2A83 M incf PORTD,f 02AE ECE2 F003 00658 call ISAout0 ; 00659 ; ; 00660 ; ------------------------------------------------------------------- 00661 00662 ; ------------------------------------------------------------------- 00663 ; ; 00664 ; Nu moeten we rx_enable en tx_enable uitvoeren. ; 00665 ; zie pdf blz. blz 36 en 38 ; 00666 ; ; gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 20 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00667 a0123 H'E' ; M IF a==H'0' M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' 02B2 ECF2 F003 M call MOVL_E_a0123 M ENDIF gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 21 LOC OBJECT CODE LINE SOURCE TEXT VALUE M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 02B6 ECE2 F003 00668 call ISAout0 ; 00669 INCa0123 ; 02BA 2A83 M incf PORTD,f 02BC 0E20 00670 movlw 0x20 ; 02BE ECE3 F003 00671 call ISAout ; 00672 DECa0123 ; 02C2 0683 M decf PORTD,f 02C4 ECE2 F003 00673 call ISAout0 ; 00674 INCa0123 ; 02C8 2A83 M incf PORTD,f 02CA 0E48 00675 movlw 0x48 ; 02CC ECE3 F003 00676 call ISAout ; 00677 ; ; 00678 ; Kies Window 1 ; 00679 ; ; 00680 DECa0123 ; 02D0 0683 M decf PORTD,f 02D2 0E01 00681 movlw 0x01 ; 02D4 ECE3 F003 00682 call ISAout ; 00683 INCa0123 ; 02D8 2A83 M incf PORTD,f 02DA 0E08 00684 movlw 0x08 ; 02DC ECE3 F003 00685 call ISAout ; 00686 ; ; 00687 ; ------------------------------------------------------------------- 00688 00689 00690 00691 00692 00693 ;-) --- ; OK, de kaart is nu ingesteld. Nu gaan we over naar de lus waarin 00694 ; we pakketjes gaan ontvangen, analyseren en versturen. 00695 00696 00697 00698 02E0 00699 De_Lus: 00700 00701 ; Vraag de TX Status op (PDF blz 50) 00702 a0123 H'0b' M IF a==H'0' M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 22 LOC OBJECT CODE LINE SOURCE TEXT VALUE M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'B' 02E0 8083 M bsf a0 02E2 9483 M bcf a2 02E4 8683 M bsf a3 02E6 8283 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 02E8 DA73 00703 rcall ISAin ; w = TXstatus 00704 ; Bit 7 Complete (1 = TX is complete) 00705 ; Bit 6 Interrupt on Successful Transmission Completion Requested 00706 ; Bit 5 Jabber Error (TP only: TX Reset required) 00707 ; Bit 4 Underrun --> Network TX Reset and FIFO TX Reset required 00708 ; Bit 3 Maximum Collisions 00709 ; Bit 2 TX Status Overflow 00710 ; Bit 1 Undefined 00711 ; Bit 0 Undefined gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 23 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00712 02EA 0B38 00713 andlw B'00111000' ; Hou enkel rekening met deze bits 02EC 0900 00714 iorlw D'0' 02EE B4D8 00715 btfsc STATUS, Z 02F0 D001 00716 bra TXstatusOK ; TXstatus = 0 --> OK, ga verder 02F2 D794 00717 bra TXreset 00718 02F4 00719 TXstatusOK: 00720 00721 ; ------------------------------------------------------------------- 00722 ; ; 00723 ; Vraag de RX Status op (PDF blz 48) ; 00724 a0123 8 ; M IF a==H'0' M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' 02F4 ECEF F003 M call CLEARa0123 02F8 8683 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 24 LOC OBJECT CODE LINE SOURCE TEXT VALUE M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 02FA DA6A 00725 rcall ISAin ; 02FC 6E07 00726 movwf Llow ; 00727 INCa0123 ; 02FE 2A83 M incf PORTD,f 0300 DA67 00728 rcall ISAin ; 0302 6E08 00729 movwf Lhigh ; 00730 ; ; 0304 BE08 00731 btfsc Lhigh,7 ; Bit 15 hoog --> geen of onvolledig pakket ; 0306 D7EC 00732 bra De_Lus ; --> geen pakket -> lus ; 0308 BC08 00733 btfsc Lhigh,6 ; Bit 14 hoog --> fouten in pakket! ; 030A EFDA F003 00734 goto weg_ermee ; 030E 0E07 00735 movlw B'00000111' ; 0310 1608 00736 andwf Lhigh, f ; Bit 10...0 = Lengte van pakket ; 00737 ; ; 00738 ; ------------------------------------------------------------------- 00739 00740 ; Er staat een geldig pakket klaar! Doe er nu iets mee. 00741 00742 ; ------------------------------------------------------------------- 00743 ; ; 00744 ; We gaan nu het pakket inlezen en in het RAM-geheugen plaatsen. ; 00745 ; ; 0312 EE10 F00D 00746 lfsr 1, RAM ; Start RAM geheugen dat we gaan gebruiken ; 00747 ; ; 0316 C008 FFDA 00748 movff Lhigh, FSR2H ; 031A C007 FFD9 00749 movff Llow, FSR2L ; gebruik FSR2L en FSR2H als teller ; 00750 ; ; 031E 00751 Lees: ; 00752 a0123 0 ; M IF a==H'0' 031E ECEF F003 M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 25 LOC OBJECT CODE LINE SOURCE TEXT VALUE M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 0322 DA56 00753 rcall ISAin ; 0324 6EE6 00754 movwf POSTINC1 ; 00755 ; ; 0326 52DD 00756 movf POSTDEC2, f ; teller FSR2H:FSR2L -1 ; 0328 66D9 00757 tstfsz FSR2L ; 032A D7F9 00758 bra Lees ; 032C 66DA 00759 tstfsz FSR2H ; 032E D7F7 00760 bra Lees ; Blijf lezen tot teller = 0 ; gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 26 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00761 ; ; 00762 ; ------------------------------------------------------------------- 00763 00764 ; Het pakket zit nu in het RAM-geheugen. 00765 00766 ; We onderzoeken nu de ethernet-header | 00767 ; ----------------------------------------+ 00768 ; Byte 0 ... 5 : Destination MAC Address | 00769 ; Byte 6 ... B : Source MAC Address | 00770 ; Byte C D : Type | 00771 ; ----------------------------------------+ 00772 #define ETH_MAC_to RAM + H'0' 00773 #define ETH_MAC_from RAM + H'6' 00774 #define ETH_type RAM + H'C' 00775 00776 ; ------------------------------------------------------------------- 00777 ; ; 0330 EE10 F019 00778 lfsr 1, ETH_type ; C = Type ; 00779 ; ; 00780 IFDEF LCD ; 0334 EC30 F000 00781 call cls ; 0338 EC36 F000 00782 call goto1 ; 033C 50E7 00783 movf INDF1, w ; 033E EC61 F000 00784 call DispDec ; 00785 ENDIF ; 00786 ; ; 0342 0E08 00787 movlw D'008' ; 0344 62E6 00788 cpfseq POSTINC1 ; Vergelijk met RAM (FSR1H FSR1L) ... ; 0346 D236 00789 bra weg_ermee ; ... en verhoog adres met 1 ; 00790 ; ; 00791 IFDEF LCD ; 0348 50E7 00792 movf INDF1, w ; 034A EC61 F000 00793 call DispDec ; 00794 ENDIF ; 00795 ; ; 00796 ; Type moet met 008 beginnen, anders is het geen geldig pakket. ; 00797 ; ; 00798 ; Als Type = 008 006 dan wil dit zeggen dat na de ethernet-header ; 00799 ; er een ARP-header volgt. ; 034E 0E00 00800 movlw D'000' ; 0350 64E7 00801 cpfsgt INDF1 ; 0352 D004 00802 bra IP ; Als Type = 008 000 dan gaat het om IP ; 00803 ; ; 0354 0E06 00804 movlw D'006' ; 0356 62E7 00805 cpfseq INDF1 ; Vergelijk met RAM (FSR1H FSR1L) ; 0358 D22D 00806 bra weg_ermee ; Als Type 008 006 is, dan gaat het om ARP ; 035A D1C6 00807 bra ARP ; Stuur een gepast ARP-reply terug ; 00808 ; ; 00809 ; ------------------------------------------------------------------- 00810 00811 00812 035C 00813 IP: 00814 ; IP-Header | Voorbeeld | Bytes | Offset t.o.v. RAM | gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 27 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00815 ; ----------------------+-------------------------+---------+-------------------+ 00816 ; version/headerlength | 0100(*) 0101 | 1 | 0E | 00817 ; type of service | 000 | 1 | 0F | 00818 ; Total length: | 000 084 | 2 | 10 | 00819 ; Indentification: | 000 000 | 2 | 12 | 00820 ; 3-bit flags + | | | | 00821 ; 13-bit fragm.offset | | 2 | 14 | 00822 ; time to live TTL | 064 | 1 | 16 | 00823 ; protocol | 1 = ICMP | 1 | 17 | 00824 ; checksum | | 2 | 18 | 00825 ; Source IP address: | 192.168.2.2 | 4 | 1a | 00826 ; Destinati IP address: | 192.168.2.11 | 4 | 1e | 00827 ; options/data | | | | 00828 ; ----------------------+-------------------------+---------+-------------------+ 00829 ; (*) version = 4 = IP, Internet Protocol. 00830 00831 #define IP_start RAM + H'0E' 00832 #define IP_id RAM + H'12' 00833 #define IP_protocol RAM + H'17' 00834 #define IP_from RAM + H'1A' 00835 #define IP_to RAM + H'1E' 00836 #define IP_checksum RAM + H'18' 00837 #define IP_length RAM + H'10' 00838 00839 IFDEF LCD 035C EC3E F000 00840 call goto3 0360 EE10 F027 00841 lfsr 1, IP_from 0364 50E6 00842 movf POSTINC1, w 0366 EC61 F000 00843 call DispDec 036A 0E2E 00844 movlw "." 036C EC57 F000 00845 call SendCHAR 0370 50E6 00846 movf POSTINC1, w 0372 EC61 F000 00847 call DispDec 0376 0E2E 00848 movlw "." 0378 EC57 F000 00849 call SendCHAR 037C 50E6 00850 movf POSTINC1, w 037E EC61 F000 00851 call DispDec 0382 0E2E 00852 movlw "." 0384 EC57 F000 00853 call SendCHAR 0388 50E6 00854 movf POSTINC1, w 038A EC61 F000 00855 call DispDec 038E EC3A F000 00856 call goto2 0392 50E6 00857 movf POSTINC1, w 0394 EC61 F000 00858 call DispDec 0398 0E2E 00859 movlw "." 039A EC57 F000 00860 call SendCHAR 039E 50E6 00861 movf POSTINC1, w 03A0 EC61 F000 00862 call DispDec 03A4 0E2E 00863 movlw "." 03A6 EC57 F000 00864 call SendCHAR 03AA 50E6 00865 movf POSTINC1, w 03AC EC61 F000 00866 call DispDec 03B0 0E2E 00867 movlw "." 03B2 EC57 F000 00868 call SendCHAR gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 28 LOC OBJECT CODE LINE SOURCE TEXT VALUE 03B6 50E6 00869 movf POSTINC1, w 03B8 EC61 F000 00870 call DispDec 00871 ENDIF 00872 03BC EE10 F024 00873 lfsr 1, IP_protocol 00874 03C0 0E01 00875 movlw D'1' 03C2 62E7 00876 cpfseq INDF1 ; Vergelijk met RAM (FSR1H FSR1L) 03C4 D001 00877 bra geenICMP 03C6 D17F 00878 bra ICMP ; Als protocol = 1, dan gaat het om ICMP 03C8 00879 geenICMP: 03C8 0E06 00880 movlw D'6' 03CA 62E7 00881 cpfseq INDF1 03CC D1F3 00882 bra weg_ermee ; Als protocol = 6, dan gaat het om TCP 03CE 00883 TCP: ; TCP afhandelen 00884 ; TCP-Header | Voorbeeld | Bytes | Offset t.o.v. RAM | 00885 ; ----------------------+-------------------------+---------+-------------------+ 00886 ; Source Port | | 2 | 22 | 00887 ; Destination Port | | 2 | 24 | 00888 ; Sequence Number | | 4 | 26 | 00889 ; Acknowledgment Number | | 4 | 2A | 00890 ; Data Offset | | 1 | 2E | 00891 ; ECN + Control Bits | | 1 | 2F | 00892 ; Window | | 2 | 30 | 00893 ; checksum | | 2 | 32 | 00894 ; Urgent Pointer | | 4 | 34 | 00895 ; Options and padding | | 0...44 | 38 | 00896 ; Data | | | | 00897 ; ----------------------+-------------------------+---------+-------------------+ 00898 00899 #define TCP_start RAM + H'22' 00900 #define TCP_from RAM + H'22' 00901 #define TCP_to RAM + H'24' 00902 #define TCP_control RAM + H'2F' 00903 #define TCP_checksum RAM + H'32' 00904 #define TCP_seqnum RAM + H'26' 00905 #define TCP_acknum RAM + H'2A' 00906 #define TCP_data_offset RAM + H'2E' 00907 00908 ; TODO 00909 ; 00910 ; Control bits testen : 00911 ; - als enkel SYN = 1 dan reply op deze SYN versturen. 00912 ; | 00913 ; +--> = SYN + ACK versturen 00914 ; - als enkel ACK = 1 dan .... ? 00915 03CE 0E00 00916 movlw D'000' 03D0 6231 00917 cpfseq TCP_to 03D2 D1F0 00918 bra weg_ermee 03D4 0E50 00919 movlw D'080' ; PORT 80 www? 03D6 6232 00920 cpfseq TCP_to+1 03D8 D1ED 00921 bra weg_ermee ; alles wat niet PORT 80 is negeren. 00922 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 29 LOC OBJECT CODE LINE SOURCE TEXT VALUE 03DA A03C 00923 btfss TCP_control, D'0' ; Is FIN-bit = 1 03DC D015 00924 bra FIN0 03DE 00925 FIN1: 00926 ; Wissel Source en Desti.ports om : 00927 03DE EE00 F000 00928 lfsr 0, delay ; delay + delay2 ff als hulpvar gebruiken. 03E2 EE10 F031 00929 lfsr 1, TCP_to 03E6 EC30 F004 00930 call MOVFF_POSTINC1_POSTINC0_2X 00931 00932 ; delay, delay2 = to 00933 03EA EE10 F02F 00934 lfsr 1, TCP_from 03EE EE00 F031 00935 lfsr 0, TCP_to 00936 03F2 EC30 F004 00937 call MOVFF_POSTINC1_POSTINC0_2X 00938 00939 ; TCP_to = from 00940 03F6 EE10 F000 00941 lfsr 1, delay 03FA EE00 F02F 00942 lfsr 0, TCP_from 00943 03FE EC30 F004 00944 call MOVFF_POSTINC1_POSTINC0_2X 00945 00946 ; TCP_from = to 00947 00948 ; OK, Source en Desti.ports zijn omgewisseld. 00949 00950 ; normaal moeten we nu testen of dat de HTTP-port wordt aangesproken. 00951 ; voor lopig vergeten 00952 00953 ; ZET ACK-Flag 00954 0402 883C 00955 bsf TCP_control, D'4' 00956 00957 ; CLEAR de FIN-Flag 00958 0404 903C 00959 bcf TCP_control, D'0' 00960 0406 D015 00961 bra SYNFIN ; Spring naar SYN-gedeelte dat ook 00962 ; bruikbaar is voor FIN-routine. Dit is slordig, later een mooiere oplossing 00963 ; zoeken 00964 0408 00965 FIN0: 0408 A23C 00966 btfss TCP_control, D'1' ; Is SYN-bit = 1 040A D033 00967 bra SYNis0 040C 00968 SYN1: 00969 ; Wissel Source en Desti.ports om : 00970 040C EE00 F000 00971 lfsr 0, delay ; delay + delay2 ff als hulpvar gebruiken. 0410 EE10 F031 00972 lfsr 1, TCP_to 0414 EC30 F004 00973 call MOVFF_POSTINC1_POSTINC0_2X 00974 00975 ; delay, delay2 = to 00976 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 30 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0418 EE10 F02F 00977 lfsr 1, TCP_from 041C EE00 F031 00978 lfsr 0, TCP_to 00979 0420 EC30 F004 00980 call MOVFF_POSTINC1_POSTINC0_2X 00981 00982 ; TCP_to = from 00983 0424 EE10 F000 00984 lfsr 1, delay 0428 EE00 F02F 00985 lfsr 0, TCP_from 00986 042C EC30 F004 00987 call MOVFF_POSTINC1_POSTINC0_2X 00988 00989 ; TCP_from = to 00990 00991 ; OK, Source en Desti.ports zijn omgewisseld. 00992 00993 ; normaal moeten we nu testen of dat de HTTP-port wordt aangesproken. 00994 ; voor lopig vergeten 00995 00996 ; ZET ACK-Flag 00997 0430 883C 00998 bsf TCP_control, D'4' 0432 00999 SYNFIN: 01000 ; We moeten het ack-nummer nog mee sturen. 01001 ; ack-nummer = seqnummer + 1 01002 0432 EE10 F033 01003 lfsr 1, TCP_seqnum ; TCP_seqnum --> TCP_acknum 0436 EE00 F037 01004 lfsr 0, TCP_acknum 043A EC2C F004 01005 call MOVFF_POSTINC1_POSTINC0_4X 01006 043E 2A3A 01007 incf TCP_acknum+3,f ; TCP_acknum = TCP_acknum + 1 0440 0E00 01008 movlw D'000' 0442 2239 01009 addwfc TCP_acknum+2,f 0444 2238 01010 addwfc TCP_acknum+1,f 0446 2237 01011 addwfc TCP_acknum,f 01012 01013 ; En gebruik een nieuw SEQ-nummer - pseudo random 01014 0448 3633 01015 rlcf TCP_seqnum, f 044A 3234 01016 rrcf TCP_seqnum+1, f 044C 3A35 01017 swapf TCP_seqnum+2, f 044E 3633 01018 rlcf TCP_seqnum, f 01019 01020 ; En we moeten in de ip-header het id op nul zetten. 01021 0450 6A1F 01022 clrf IP_id 0452 6A20 01023 clrf IP_id+1 01024 0454 EC35 F004 01025 call ip_set_to_from ; Zet From To in IP-header goed 01026 01027 ; Geen options versturen, timestamp e.d. gebruiken wij niet! 0458 0E0F 01028 movlw B'00001111' 045A 163B 01029 andwf TCP_data_offset, f ; 4 hoogste bits = TCP_data_offset : reset 045C 0E50 01030 movlw B'01010000' gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 31 LOC OBJECT CODE LINE SOURCE TEXT VALUE 045E 123B 01031 iorwf TCP_data_offset, f ; TCP_data_offset = 5 (5 32bitswords = 20 bytes) 01032 ; Lengte pakket naar 54 brengen (Ethernet-header 14 + tcp-header 40) 0460 6A08 01033 clrf Lhigh 0462 6A1D 01034 clrf IP_length 0464 0E36 01035 movlw D'54' 0466 6E07 01036 movwf Llow 0468 0E28 01037 movlw D'40' ; IP-lengte = 40 (lengte zonder Ethernet-header (14)) 046A 6E1E 01038 movwf IP_length+1 01039 ; 01040 046C EC54 F004 01041 call TCPIP_checksum ; checksums berekenen 01042 0470 D19F 01043 bra verzenden ; alles klaar, versturen... 01044 0472 01045 SYNis0: 0472 A83C 01046 btfss TCP_control, D'4' ; Is ACK-bit = 1 0474 D19F 01047 bra weg_ermee 0476 01048 ACK1: 01049 ; Zet de ACK en FIN bit ; Door FIN te zetten zeggen we ineens 01050 ; dat de verbinding verbroken moet 01051 ; worden. Dit werkt dus enkel als de 01052 ; data die verstuurd moet worden niet 01053 ; al te groot is! 01054 0476 883C 01055 bsf TCP_control, D'4' 0478 803C 01056 bsf TCP_control, D'0' 047A 923C 01057 bcf TCP_control, D'1' 047C 943C 01058 bcf TCP_control, D'2' 047E 963C 01059 bcf TCP_control, D'3' 01060 ; bsf TCP_control, D'3' ; Zet PUSH flag 0480 9A3C 01061 bcf TCP_control, D'5' 01062 01063 ; ACK en FIN vlag zijn gezet, al de rest is clear 01064 01065 ; nu gaan we testen of dit packet wel data bevatte. 01066 0482 0E00 01067 movlw D'000' 0484 621D 01068 cpfseq IP_length 0486 D004 01069 bra With_Data 0488 0E28 01070 movlw D'040' 048A 621E 01071 cpfseq IP_length+1 048C D001 01072 bra With_Data 048E D192 01073 bra weg_ermee 0490 01074 With_Data: 01075 01076 ; Was het een GET aanvraag? 01077 01078 ; TCP_data_offset bevat de lengte van de TCP-Header. 01079 ; Hiermee kunnen we dus ontdekken waar de DATA zich bevind. 01080 0490 383B 01081 swapf TCP_data_offset, w ; de hoogste 4 bits zijn van tel 0492 0B0F 01082 andlw B'00001111' 0494 0D04 01083 mullw 4 ; PRODH:PRODL bevat nu de lengte in bytes 01084 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 32 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0496 EE20 F02F 01085 lfsr 2, TCP_start 01086 049A 50F3 01087 movf PRODL, w 049C 26D9 01088 addwf FSR2L, f 049E 50F4 01089 movf PRODH, w 04A0 22DA 01090 addwfc FSR2H, f ; FSRH:FSRL = TCP_start + header-lengte 01091 01092 ; Vergelijk FSR2H:FSR2L met "GET /", smijt het pakket weg als het geen GET is. 04A2 0E00 01093 movlw LOW (GET) 04A4 6EF6 01094 movwf TBLPTRL 04A6 0E0A 01095 movlw HIGH (GET) 04A8 6EF7 01096 movwf TBLPTRH 04AA 0E00 01097 movlw UPPER (GET) 04AC 6EF8 01098 movwf TBLPTRU ; TBLPTR --> "GET /" 04AE 01099 g1: 04AE 0009 01100 tblrd*+ ; Lees van adres TBLPTR in TABLAT / TBLPTR++ 04B0 50F5 01101 movf TABLAT, w ; w = het ingelezen karakter 04B2 0900 01102 iorlw D'0' ; End Of Text? ASCII 0 04B4 B4D8 01103 btfsc STATUS, Z ; Als ASCII 0 dan ... 04B6 D003 01104 bra g2 ; ... stop. 04B8 62DE 01105 cpfseq POSTINC2 04BA D17C 01106 bra weg_ermee ; Geen "GET /" --> weg ermee 04BC D7F8 01107 bra g1 04BE 01108 g2: 04BE 0E20 01109 movlw " " 04C0 62DF 01110 cpfseq INDF2 ; Gaat het om "GET / "? 04C2 D00D 01111 bra g3 01112 ; Als het gaat om "GET / " moeten we zorgen dat index.html getoond wordt 04C4 0E26 01113 movlw LOW (index) 04C6 6EF6 01114 movwf TBLPTRL 04C8 0E09 01115 movlw HIGH (index) 04CA 6EF7 01116 movwf TBLPTRH 04CC 0E00 01117 movlw UPPER (index) 04CE 6EF8 01118 movwf TBLPTRU ; TBLPTR --> "index.html" 04D0 01119 index1: 04D0 0009 01120 tblrd*+ ; "GET / " --> "GET /index.html " 04D2 50F5 01121 movf TABLAT, w 04D4 0900 01122 iorlw D'0' 04D6 B4D8 01123 btfsc STATUS, Z 04D8 D7DB 01124 bra With_Data 04DA 6EDE 01125 movwf POSTINC2 04DC D7F9 01126 bra index1 04DE 01127 g3: 04DE CFDA F005 01128 movff FSR2H, getfileH 04E2 CFD9 F006 01129 movff FSR2L, getfileL ; getfileH:getfileL --> filename 01130 01131 ; Wissel Source en Desti.ports om : 01132 04E6 EE00 F000 01133 lfsr 0, delay ; delay + delay2 ff als hulpvar gebruiken. 04EA EE10 F031 01134 lfsr 1, TCP_to 04EE EC30 F004 01135 call MOVFF_POSTINC1_POSTINC0_2X 01136 01137 ; delay, delay2 = to 01138 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 33 LOC OBJECT CODE LINE SOURCE TEXT VALUE 04F2 EE10 F02F 01139 lfsr 1, TCP_from 04F6 EE00 F031 01140 lfsr 0, TCP_to 01141 04FA EC30 F004 01142 call MOVFF_POSTINC1_POSTINC0_2X 01143 01144 ; TCP_to = from 01145 04FE EE10 F000 01146 lfsr 1, delay 0502 EE00 F02F 01147 lfsr 0, TCP_from 01148 0506 EC30 F004 01149 call MOVFF_POSTINC1_POSTINC0_2X 01150 01151 ; TCP_from = to 01152 01153 ; OK, Source en Desti.ports zijn omgewisseld. 01154 01155 ; We moeten het ack-nummer nog mee sturen. 01156 ; ack-nummer = seqnummer + TCP-lengte van ontvangen pakket 01157 050A EE10 F033 01158 lfsr 1, TCP_seqnum ; TCP_seqnum --> delay 050E EE00 F000 01159 lfsr 0, delay 0512 EC2C F004 01160 call MOVFF_POSTINC1_POSTINC0_4X 01161 01162 ; O ja, het Seq-nummer van dit pakket is het oude ack-nummer. 01163 0516 EE00 F033 01164 lfsr 0, TCP_seqnum ; TCP_acknum --> TCP_seqnum 051A EE10 F037 01165 lfsr 1, TCP_acknum 051E EC2C F004 01166 call MOVFF_POSTINC1_POSTINC0_4X 01167 01168 ; ga verder met aanpassen acknum 01169 0522 EE10 F000 01170 lfsr 1, delay ; delay (orig TCP_seqnum) --> TCP_acknum 0526 EE00 F037 01171 lfsr 0, TCP_acknum 052A EC2C F004 01172 call MOVFF_POSTINC1_POSTINC0_4X 01173 052E C01D F000 01174 movff IP_length, delay ; High 0532 C01E F001 01175 movff IP_length+1, delay+1 ; Low 01176 0536 0E28 01177 movlw D'40' 0538 5E01 01178 subwf delay+1, f 053A 0E00 01179 movlw D'0' 053C 5A00 01180 subwfb delay, f ; IP-lengte - 40 = TCP-lengte (meestal toch ;-) 01181 053E 5001 01182 movf delay+1,w 0540 263A 01183 addwf TCP_acknum+3,f ; TCP_acknum = TCP_acknum + TCP-lengte 0542 5000 01184 movf delay,w 0544 2239 01185 addwfc TCP_acknum+2,f 0546 0E00 01186 movlw D'000' ; Carry's er bij-tellen 0548 2238 01187 addwfc TCP_acknum+1,f 054A 2237 01188 addwfc TCP_acknum,f 01189 01190 IFDEF LCD 054C EC30 F000 01191 call cls 0550 EC36 F000 01192 call goto1 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 34 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0554 EE10 F000 01193 lfsr 1, delay 0558 50E6 01194 movf POSTINC1, w 055A EC61 F000 01195 call DispDec 055E 50E6 01196 movf POSTINC1, w 0560 EC61 F000 01197 call DispDec 01198 ENDIF 01199 01200 ; Dataveld aanpassen : Webpagina in dataveld plaatsen 01201 0564 EE10 F043 01202 lfsr 1, TCP_start + D'20' ; TCP-header = 20 01203 0568 0E0F 01204 movlw B'00001111' 056A 163B 01205 andwf TCP_data_offset, f ; 4 hoogste bits = TCP_data_offset : reset 056C 0E50 01206 movlw B'01010000' 056E 123B 01207 iorwf TCP_data_offset, f ; TCP_data_offset = 5 (5 32bitswords = 20 bytes) 01208 01209 ; Pseudo file system routine 0570 0E06 01210 movlw LOW (web) 0572 6EF6 01211 movwf TBLPTRL 0574 0E0A 01212 movlw HIGH (web) 0576 6EF7 01213 movwf TBLPTRH 0578 0E00 01214 movlw UPPER (web) 057A 6EF8 01215 movwf TBLPTRU ; TBLPTR --> web 057C 01216 searchfile: 057C C005 FFDA 01217 movff getfileH, FSR2H 0580 C006 FFD9 01218 movff getfileL, FSR2L 01219 0584 0009 01220 tblrd*+ 0586 CFF5 F000 01221 movff TABLAT, delay ; delay = lengte string 058A 6600 01222 tstfsz delay ; is delay = 0? 058C D00D 01223 bra search 058E 01224 e404: 01225 ; Bestand niet gevonden, geef een 404 fout 058E 0E64 01226 movlw LOW (htmlerr) 0590 6E00 01227 movwf delay 0592 0E09 01228 movlw HIGH (htmlerr) 0594 6E01 01229 movwf delay2 0596 0E00 01230 movlw UPPER (htmlerr) 0598 6E02 01231 movwf Hchecksum ; HTML error 404 01232 059A 0E32 01233 movlw LOW (err) 059C 6EF6 01234 movwf TBLPTRL 059E 0E09 01235 movlw HIGH (err) 05A0 6EF7 01236 movwf TBLPTRH 05A2 0E00 01237 movlw UPPER (err) 05A4 6EF8 01238 movwf TBLPTRU ; TBLPTR --> error 05A6 D02C 01239 bra header_lus 05A8 01240 search: 05A8 0009 01241 tblrd*+ 05AA 50F5 01242 movf TABLAT, w 05AC 62DE 01243 cpfseq POSTINC2 05AE D007 01244 bra next 05B0 2E00 01245 decfsz delay, f 05B2 D7FA 01246 bra search gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 35 LOC OBJECT CODE LINE SOURCE TEXT VALUE 05B4 0E20 01247 movlw " " 05B6 62DE 01248 cpfseq POSTINC2 ; test of er na de bestandsnaam een spatie komt, 01249 ; om te vermijden dat bv. index.htmlblabla 01250 ; index.html zou weergeven. 05B8 D001 01251 bra incnext 05BA D016 01252 bra gevonden 05BC 01253 incnext: 05BC 2A00 01254 incf delay, f ; Terug bijtellen wat er reeds afgetrokken was 05BE 01255 next: 05BE 0400 01256 decf delay, w 05C0 26F6 01257 addwf TBLPTRL, f 05C2 0E00 01258 movlw D'0' 05C4 22F7 01259 addwfc TBLPTRH, f ; Tel het aantal niet gelezen chars bij TBLPTR 01260 05C6 CFF6 F000 01261 movff TBLPTRL, delay 05CA CFF7 F001 01262 movff TBLPTRH, delay2 01263 05CE 0009 01264 tblrd*+ 05D0 50F5 01265 movf TABLAT, w 05D2 2600 01266 addwf delay, f 05D4 0009 01267 tblrd*+ 05D6 50F5 01268 movf TABLAT, w 05D8 2201 01269 addwfc delay2, f 05DA C000 FFF6 01270 movff delay, TBLPTRL 05DE C001 FFF7 01271 movff delay2, TBLPTRH 05E2 0009 01272 tblrd*+ 05E4 0009 01273 tblrd*+ ; SKIP dit bestand en ga klaar staan op de volgende bestandsnaam 01274 05E6 D7CA 01275 bra searchfile 05E8 01276 gevonden: 05E8 CFF6 F000 01277 movff TBLPTRL, delay ; TBLPTR wijst naar inhoud 'bestand' , onthouden 05EC CFF7 F001 01278 movff TBLPTRH, delay2 05F0 CFF8 F002 01279 movff TBLPTRU, Hchecksum 01280 01281 ; Plaats eerst de HTML-header in het geheugen 05F4 0EC0 01282 movlw LOW (header) 05F6 6EF6 01283 movwf TBLPTRL 05F8 0E09 01284 movlw HIGH (header) 05FA 6EF7 01285 movwf TBLPTRH 05FC 0E00 01286 movlw UPPER (header) 05FE 6EF8 01287 movwf TBLPTRU ; TBLPTR --> header 0600 01288 header_lus 0600 0009 01289 tblrd*+ ; Lees van adres TBLPTR in TABLAT / TBLPTR++ 0602 50F5 01290 movf TABLAT, w ; w = het ingelezen karakter 0604 0900 01291 iorlw D'0' ; End Of Text? ASCII 0 0606 B4D8 01292 btfsc STATUS, Z ; Als ASCII 0 dan ... 0608 D002 01293 bra header_OK ; ... stop. 060A 6EE6 01294 movwf POSTINC1 ; kopieer karakter naar TCP_DATA / FSR1++ 060C D7F9 01295 bra header_lus 060E 01296 header_OK: 01297 060E C000 FFF6 01298 movff delay, TBLPTRL ; Terughalen TBLPTR = inhoud 'bestand' 0612 C001 FFF7 01299 movff delay2, TBLPTRH 0616 C002 FFF8 01300 movff Hchecksum, TBLPTRU gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 36 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01301 01302 061A 0009 01303 tblrd*+ 061C CFF5 F000 01304 movff TABLAT, delay 0620 0009 01305 tblrd*+ 0622 CFF5 F001 01306 movff TABLAT, delay2 ; delay2:delay = lengte van de inhoud 'bestand' 01307 0626 0008 01308 tblrd* ; tblptr --> Content-Type 0628 CFF5 F004 01309 movff TABLAT, texthtml ; texthtml = t (maybe rewrite this to check for text/html?) 062C 01310 t1: 062C 0009 01311 tblrd*+ ; Lees van adres TBLPTR in TABLAT / TBLPTR++ 062E 0E74 01312 movlw "t" 0630 6204 01313 cpfseq texthtml ; Is dit bestand een HTML-bestand? 0632 D024 01314 bra notHTML 0634 0E3C 01315 movlw "<" ; JA! Check for instructions chars 0636 62F5 01316 cpfseq TABLAT 0638 D021 01317 bra notHTML 063A 0009 01318 tblrd*+ 063C 0E3F 01319 movlw "?" 063E 62F5 01320 cpfseq TABLAT 0640 D001 01321 bra undo 0642 D004 01322 bra PICinstruction 0644 01323 undo: 0644 000A 01324 tblrd*- 0646 0E3C 01325 movlw "<" 0648 6EF5 01326 movwf TABLAT 064A D018 01327 bra notHTML 064C 01328 PICinstruction: ; Special character combination " ascii-->number conversion 065E 14F5 01338 andwf TABLAT, w 0660 6E03 01339 movwf Lchecksum ; gebruik Lchecksum als teller 0662 2A03 01340 incf Lchecksum, f 0664 CFEF FFF5 01341 movff INDF0, TABLAT ; TABLAT = READ(PORTx) 0668 01342 getBIT: 0668 32F5 01343 rrcf TABLAT, f 066A 2E03 01344 decfsz Lchecksum, f 066C D7FD 01345 bra getBIT 066E 6AF5 01346 clrf TABLAT ; TABLAT = 0 0670 0E30 01347 movlw "0" ; W = ASCII(0) 0672 22F5 01348 addwfc TABLAT, f ; if c = 0 then TABLAT = ASCII(0) else TABLAT = ASCII(1) 01349 0674 0E03 01350 movlw D'3' 0676 5E00 01351 subwf delay, f 0678 0E00 01352 movlw D'0' 067A 5A01 01353 subwfb delay2, f ; Teller aanpassen, we hebben nl. extra chars gelezen. 01354 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 37 LOC OBJECT CODE LINE SOURCE TEXT VALUE 067C 01355 notHTML: 067C CFF5 FFE6 01356 movff TABLAT, POSTINC1 0680 0600 01357 decf delay, f 0682 0E00 01358 movlw D'0' 0684 5A01 01359 subwfb delay2 , f ; Teller = Teller - 1 01360 0686 6600 01361 tstfsz delay 0688 D7D1 01362 bra t1 068A 6601 01363 tstfsz delay2 068C D7CF 01364 bra t1 ; If teller <> 0 then goto t1 01365 068E 6AE7 01366 clrf INDF1 ; Afsluiten met een 0, nodig indien het gaat om een 01367 ; oneven aantal bytes die verstuurd worden. 01368 ; zie : (*TCP_cheksum padding) in "call TCPIP_checksum" 01369 ; FSR1H:FSR1L = einde data 01370 0690 EE20 F043 01371 lfsr 2, TCP_start + D'20' ; Wij versturen altijd een TCP-header van 20 bytes. 01372 0694 50D9 01373 movf FSR2L, w 0696 5EE1 01374 subwf FSR1L, f 0698 50DA 01375 movf FSR2H, w 069A 5AE2 01376 subwfb FSR1H, f 01377 01378 ; FSR1H:FSR1L = Lengte van de data. 01379 069C 0E28 01380 movlw D'40' 069E 26E1 01381 addwf FSR1L, f 06A0 0E00 01382 movlw D'00' 06A2 22E2 01383 addwfc FSR1H, f 01384 01385 ; FSR1H:FSR1L = Lengte data + 40 (TCP/IP-Header) 01386 06A4 CFE2 F01D 01387 movff FSR1H, IP_length 06A8 CFE1 F01E 01388 movff FSR1L, IP_length+1 01389 06AC 0E0E 01390 movlw D'14' 06AE 26E1 01391 addwf FSR1L, f 06B0 0E00 01392 movlw D'00' 06B2 22E2 01393 addwfc FSR1H, f 01394 01395 ; FSR1H:FSR1L = Lengte data + 40 (TCP/IP-Header) + 14 (Ethernet-Header) 01396 06B4 CFE2 F008 01397 movff FSR1H, Lhigh 06B8 CFE1 F007 01398 movff FSR1L, Llow 01399 06BC EC35 F004 01400 call ip_set_to_from ; Zet From To in IP-header goed 06C0 EC54 F004 01401 call TCPIP_checksum ; checksums berekenen 06C4 D075 01402 bra verzenden ; alles klaar, versturen... 01403 01404 01405 06C6 01406 ICMP: ; ICMP afhandelen 01407 ; ICMP-Header Bytes Offset RAM 01408 ; gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 38 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01409 ; Type 1 22 01410 ; Code 1 23 01411 ; Checksum 2 24 01412 ; 01413 01414 #define ICMP_type RAM + H'22' 01415 #define ICMP_checksum RAM + H'24' 01416 06C6 EE10 F02F 01417 lfsr 1, ICMP_type 01418 06CA 0E08 01419 movlw D'8' 06CC 62E7 01420 cpfseq INDF1 ; Vergelijk met RAM (FSR1H FSR1L) 06CE D072 01421 bra weg_ermee ; Als type = 8, dan gaat het om een ECHO-request 06D0 01422 ECHO: ; ECHO afhandelen 01423 ; bsf LED1 ; ICMP echo 06D0 EE10 F02F 01424 lfsr 1, ICMP_type 06D4 6AE6 01425 clrf POSTINC1 ; Type = 0 = Echo Reply 01426 06D6 EC35 F004 01427 call ip_set_to_from ; Zet From To in IP-header goed 01428 01429 ; checksum herberekenen, nou ja, doe er gewoon 8 bij op 01430 ; 01431 ; Dank aan Gerard voor dit stukje code! :-) 01432 ; 06DA 0E08 01433 movlw 8 06DC 2631 01434 addwf ICMP_checksum,F 06DE B0D8 01435 btfsc STATUS,C 06E0 2A32 01436 incf ICMP_checksum + 1,F ; checksum_hi 06E2 B4D8 01437 btfsc STATUS,Z 06E4 2A31 01438 incf ICMP_checksum,F 01439 06E6 D064 01440 bra verzenden ; en ECHO terugsturen 06E8 01441 ARP: 01442 ; We hebben dus een ARP-pakket ontvangen. 01443 ; 01444 ; Als uit het IP-adres blijkt dat dit pakket voor ons bedoeld 01445 ; was, dienen we dus een ARP-Reply te versturen om de PC die het 01446 ; ARP-pakketje verstuurde te vertellen welk HWadres we hebben. 01447 01448 ; ARP-Header | Voorbeeld | Bytes | Offset t.o.v. RAM | 01449 ; ----------------------+-------------------------+---------+-------------------+ 01450 ; Hardware type: | 0x1 (Ethernet) | 2 | 0E | 01451 ; Protocol type: | 0x800 (IP) | 2 | 10 | 01452 ; Hardware length: | 6 | 1 | 12 | 01453 ; Protocol length: | 4 | 1 | 13 | 01454 ; Opcode: | 1 (request) 2 (reply) | 2 | 14 | 01455 ; Sender Ether address: | 07:00:00:00:00:00 | 6 | 16 | 01456 ; Sender IP address: | 192.168.2.1 | 4 | 1C | 01457 ; Target Ether address: | 00:00:00:00:00:00 | 6 | 20 | 01458 ; Target IP address: | 192.168.2.2 | 4 | 26 | 01459 ; ----------------------+-------------------------+---------+-------------------+ 01460 01461 #define ARP_opcode RAM + H'14' 01462 #define ARP_MAC_from RAM + H'16' gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 39 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01463 #define ARP_IP_from RAM + H'1C' 01464 #define ARP_MAC_to RAM + H'20' 01465 #define ARP_IP_to RAM + H'26' 01466 01467 IFDEF LCD 06E8 EC3E F000 01468 call goto3 06EC EE10 F029 01469 lfsr 1, ARP_IP_from 06F0 50E6 01470 movf POSTINC1, w 06F2 EC61 F000 01471 call DispDec 06F6 0E2E 01472 movlw "." 06F8 EC57 F000 01473 call SendCHAR 06FC 50E6 01474 movf POSTINC1, w 06FE EC61 F000 01475 call DispDec 0702 0E2E 01476 movlw "." 0704 EC57 F000 01477 call SendCHAR 0708 50E6 01478 movf POSTINC1, w 070A EC61 F000 01479 call DispDec 070E 0E2E 01480 movlw "." 0710 EC57 F000 01481 call SendCHAR 0714 50E6 01482 movf POSTINC1, w 0716 EC61 F000 01483 call DispDec 071A EC3A F000 01484 call goto2 071E EE10 F033 01485 lfsr 1, ARP_IP_to 0722 50E6 01486 movf POSTINC1, w 0724 EC61 F000 01487 call DispDec 0728 0E2E 01488 movlw "." 072A EC57 F000 01489 call SendCHAR 072E 50E6 01490 movf POSTINC1, w 0730 EC61 F000 01491 call DispDec 0734 0E2E 01492 movlw "." 0736 EC57 F000 01493 call SendCHAR 073A 50E6 01494 movf POSTINC1, w 073C EC61 F000 01495 call DispDec 0740 0E2E 01496 movlw "." 0742 EC57 F000 01497 call SendCHAR 0746 50E6 01498 movf POSTINC1, w 0748 EC61 F000 01499 call DispDec 01500 ENDIF 01501 074C EE10 F021 01502 lfsr 1, ARP_opcode ; Wat geeft Opcode ? 01503 0750 0E00 01504 movlw D'0' 0752 62E6 01505 cpfseq POSTINC1 0754 D02F 01506 bra weg_ermee 0756 0E01 01507 movlw D'1' 0758 62E6 01508 cpfseq POSTINC1 075A D02C 01509 bra weg_ermee ; 00 01 = Request : Smijt pakket weg als het 01510 ; iets anders is. 01511 01512 ; Komt het "Target IP address" overeen met het ingestelde adres? 01513 075C EE10 F033 01514 lfsr 1, ARP_IP_to 0760 0EC0 01515 movlw IP0 0762 62E6 01516 cpfseq POSTINC1 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 40 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0764 D027 01517 bra weg_ermee 0766 0EA8 01518 movlw IP1 0768 62E6 01519 cpfseq POSTINC1 076A D024 01520 bra weg_ermee 076C 0E01 01521 movlw IP2 076E 62E6 01522 cpfseq POSTINC1 ; Smijt alles wat geen juist bestemmings- 0770 D021 01523 bra weg_ermee ; IP-adres heeft weg 0772 0E63 01524 movlw IP3 0774 62E6 01525 cpfseq POSTINC1 0776 D01E 01526 bra weg_ermee 01527 01528 ; Ok, nu we weten dat dit pakket voor ons was bestemd, kunnen we 01529 ; een antwoord terugsturen. Dit terugsturen doen we door de 01530 ; ontvangen header aan te passen en dan te verzenden. 01531 01532 ; Pas Opcode ARP aan 01533 0778 EE10 F021 01534 lfsr 1, ARP_opcode 01535 077C 6AE6 01536 clrf POSTINC1 077E 0E02 01537 movlw D'2' 0780 6EE6 01538 movwf POSTINC1 ; 00 02 = Reply 01539 01540 ; Sender Ether address --> Target Ether address 01541 ; Opm FSR1H:FSR1L staat reeds goed voor Sender Ether address 01542 0782 EE00 F02D 01543 lfsr 0, ARP_MAC_to 0786 EC28 F004 01544 call MOVFF_POSTINC1_POSTINC0_6X 01545 01546 ; Sender IP address --> Target IP address 078A EC2C F004 01547 call MOVFF_POSTINC1_POSTINC0_4X 01548 01549 ; Steek het MAC-adres in Sender Ether Address 01550 078E EE00 F023 01551 lfsr 0, ARP_MAC_from 0792 EC12 F004 01552 call MOV_MAC_POSTINC0 01553 01554 ; Steek het IP-adres in Sender IP Address 01555 ; Opm FSR0H:FSR0L staat reeds goed voor Target IP address 0796 EC1F F004 01556 call MOV_IP_POSTINC0 01557 01558 ; Niet alleen de ARP-header moeten we aanpassen, maar ook de 01559 ; Ethernetheader 01560 079A EE00 F00D 01561 lfsr 0, ETH_MAC_to 079E EE10 F013 01562 lfsr 1, ETH_MAC_from 07A2 EC28 F004 01563 call MOVFF_POSTINC1_POSTINC0_6X 07A6 EC12 F004 01564 call MOV_MAC_POSTINC0 01565 01566 ; Lengte van pakket instellen op 42. 01567 ; Waarom 42? 01568 ; Ethernet-header = 6 + 6 + 2 bytes (Source MAC + Destination MAC + type) 01569 ; ARP-header = 2 + 2 + 1 + 1 + 2 + 6 + 4 + 6 + 4 ( zie boven ) 01570 ; + -------------------------------------------------------------------- gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 41 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01571 ; = 42 bytes 01572 07AA 0E2A 01573 movlw D'42' 07AC 6E07 01574 movwf Llow 07AE 6A08 01575 clrf Lhigh 01576 07B0 01577 verzenden: 07B0 ECF6 F003 01578 call verzend 07B4 01579 weg_ermee: ; Smijt een ontvangen pakket weg en keer terug naar begin van lus 01580 a0123 H'E' M IF a==H'0' M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 42 LOC OBJECT CODE LINE SOURCE TEXT VALUE M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' 07B4 ECF2 F003 M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 07B8 D805 01581 rcall ISAout0 01582 INCa0123 07BA 2A83 M incf PORTD,f 07BC 0E40 01583 movlw 0x40 07BE D803 01584 rcall ISAout 07C0 EF70 F001 01585 goto De_Lus 01586 01587 01588 ;-) --- ; De subroutines i.v.m. ethernet. 01589 07C4 01590 ISAout0: 07C4 0E00 01591 movlw 0 ; ISAout waarbij w = 0 07C6 01592 ISAout: 01593 ; Schrijf een byte naar de ISA-kaart : 01594 ; PORT B staat standaard op OUTPUT 07C6 6E81 01595 movwf PORTB 07C8 9E83 01596 bcf iow 07CA DCAA 01597 rcall wacht160us 07CC 8E83 01598 bsf iow 07CE 0012 01599 return 01600 07D0 01601 ISAin: 01602 ; Lees een byte van de ISA-kaart : 01603 ; Zet PORT B eerst op INPUT 01604 07D0 6893 01605 setf TRISB 01606 07D2 9A83 01607 bcf ior 07D4 DCA5 01608 rcall wacht160us 07D6 5081 01609 movf PORTB, w 07D8 8A83 01610 bsf ior 01611 01612 ; Zet PORT B terug op OUTPUT 07DA 6A93 01613 clrf TRISB 07DC 0012 01614 return 01615 01616 07DE 01617 CLEARa0123: 01618 ; Zet a0,a1,a2,a3 naar 0 01619 ; 01620 ; a0 = PORTD,0 01621 ; a1 = PORTD,1 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 43 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01622 ; a2 = PORTD,2 01623 ; a3 = PORTD,3 01624 ; 07DE 0EF0 01625 movlw B'11110000' 07E0 1683 01626 andwf PORTD, f 07E2 0012 01627 return 01628 07E4 01629 MOVL_E_a0123: 01630 ; Zet a0,a1,a2,a3 naar 0x0E 01631 ; 07E4 0E0F 01632 movlw B'00001111' 07E6 1283 01633 iorwf PORTD, f 07E8 9083 01634 bcf a0 07EA 0012 01635 return 01636 07EC 01637 verzend: 01638 a0123 0 M IF a==H'0' 07EC ECEF F003 M call CLEARa0123 M ENDIF M IF a==H'1' M ERROR "a0123 ERROR" M ENDIF M IF a==H'2' M ERROR "a0123 ERROR" M ENDIF M IF a==H'3' M ERROR "a0123 ERROR" M ENDIF M IF a==H'4' M call CLEARa0123 M bsf a2 M ENDIF M IF a==H'5' M ERROR "a0123 ERROR" M ENDIF M IF a==H'6' M ERROR "a0123 ERROR" M ENDIF M IF a==H'7' M ERROR "a0123 ERROR" M ENDIF M IF a==H'8' M call CLEARa0123 M bsf a3 M ENDIF M IF a==H'9' M ERROR "a0123 ERROR" M ENDIF M IF a==H'A' M bcf a0 M bcf a2 M bsf a3 M bsf a1 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 44 LOC OBJECT CODE LINE SOURCE TEXT VALUE M ENDIF M IF a==H'B' M bsf a0 M bcf a2 M bsf a3 M bsf a1 M ENDIF M IF a==H'C' M ERROR "a0123 ERROR" M ENDIF M IF a==H'D' M ERROR "a0123 ERROR" M ENDIF M IF a==H'E' M call MOVL_E_a0123 M ENDIF M IF a==H'f' M ERROR "a0123 ERROR" M ENDIF 07F0 5007 01639 movf Llow, w ; Pakket-lengte 07F2 DFE9 01640 rcall ISAout 07F4 5008 01641 movf Lhigh, w 07F6 DFE7 01642 rcall ISAout 01643 07F8 DFE5 01644 rcall ISAout0 07FA DFE4 01645 rcall ISAout0 01646 07FC EE10 F00D 01647 lfsr 1, RAM ; Start RAM geheugen dat we gebruiken 01648 0800 C008 FFDA 01649 movff Lhigh, FSR2H 0804 C007 FFD9 01650 movff Llow, FSR2L ; gebruik FSR2L en FSR2H als teller 01651 0808 01652 Schrijf: 0808 50E6 01653 movf POSTINC1, W 080A DFDD 01654 rcall ISAout 01655 080C 52DD 01656 movf POSTDEC2, f ; teller FSR2H:FSR2L -1 080E 66D9 01657 tstfsz FSR2L 0810 D7FB 01658 bra Schrijf 0812 66DA 01659 tstfsz FSR2H 0814 D7F9 01660 bra Schrijf ; Blijf schrijven tot teller = 0 01661 01662 ; versturen van padding data 0816 01663 pad: 0816 0E03 01664 movlw B'00000011' 0818 1407 01665 andwf Llow, w 081A E101 01666 bnz Schrijf_pad 081C 0012 01667 return 01668 081E 01669 Schrijf_pad: 081E DFD2 01670 rcall ISAout0 0820 2A07 01671 incf Llow, f 0822 D7F9 01672 bra pad 01673 gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 45 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0824 01674 MOV_MAC_POSTINC0: 0824 0E3C 01675 movlw MAC0 0826 6EEE 01676 movwf POSTINC0 0828 0E50 01677 movlw MAC1 082A 6EEE 01678 movwf POSTINC0 082C 0E9B 01679 movlw MAC2 082E 6EEE 01680 movwf POSTINC0 0830 0E18 01681 movlw MAC3 0832 6EEE 01682 movwf POSTINC0 0834 0EF4 01683 movlw MAC4 0836 6EEE 01684 movwf POSTINC0 0838 0E52 01685 movlw MAC5 083A 6EEE 01686 movwf POSTINC0 083C 0012 01687 return 01688 083E 01689 MOV_IP_POSTINC0: 083E 0EC0 01690 movlw IP0 0840 6EEE 01691 movwf POSTINC0 0842 0EA8 01692 movlw IP1 0844 6EEE 01693 movwf POSTINC0 0846 0E01 01694 movlw IP2 0848 6EEE 01695 movwf POSTINC0 084A 0E63 01696 movlw IP3 084C 6EEE 01697 movwf POSTINC0 084E 0012 01698 return 01699 0850 01700 MOVFF_POSTINC1_POSTINC0_6X: 0850 CFE6 FFEE 01701 movff POSTINC1, POSTINC0 0854 CFE6 FFEE 01702 movff POSTINC1, POSTINC0 0858 01703 MOVFF_POSTINC1_POSTINC0_4X: 0858 CFE6 FFEE 01704 movff POSTINC1, POSTINC0 085C CFE6 FFEE 01705 movff POSTINC1, POSTINC0 0860 01706 MOVFF_POSTINC1_POSTINC0_2X: 0860 CFE6 FFEE 01707 movff POSTINC1, POSTINC0 0864 CFE6 FFEE 01708 movff POSTINC1, POSTINC0 0868 0012 01709 return 01710 086A 01711 ip_set_to_from: 086A EE00 F00D 01712 lfsr 0, ETH_MAC_to 086E EE10 F013 01713 lfsr 1, ETH_MAC_from 0872 DFEE 01714 rcall MOVFF_POSTINC1_POSTINC0_6X 0874 DFD7 01715 rcall MOV_MAC_POSTINC0 01716 0876 EE00 F02B 01717 lfsr 0, IP_to 087A EE10 F027 01718 lfsr 1, IP_from 087E DFEC 01719 rcall MOVFF_POSTINC1_POSTINC0_4X 01720 01721 ; Steek ons IP in Source IP 0880 EE00 F027 01722 lfsr 0, IP_from 0884 DFDC 01723 rcall MOV_IP_POSTINC0 0886 0012 01724 return 01725 0888 01726 Checksum: 01727 ; ------------------------------------------------------------------- gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 46 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01728 ; Berekenen van "16-bit one's complement of the one's complement sum" 01729 ; Voor het aanroep, zet : 01730 ; ----------------------- 01731 ; FSR2H:FSR2l = lengte in bytes 01732 ; clear old checksum 01733 ; lfsr 1 = START RAM 01734 ; clrf Hchecksum, Lchecksum indien nodig 01735 ; Na de aanroep, bevat : 01736 ; ---------------------- 01737 ; Hchecksum,Lchecksum = checksum waarop comf nog moet worden 01738 ; uitgevoerd. 01739 ; ------------------------------------------------------------------- 01740 0888 90D8 01741 bcf STATUS, C ; Lengte is uitgedrukt in bytes, maar... 088A 32DA 01742 rrcf FSR2H, f ; ...het berekenen van de checksum gaat... 088C 32D9 01743 rrcf FSR2L, f ; per 16Bits, dus lengte/2 01744 088E 90D8 01745 bcf STATUS, C ; reset C-flag 0890 01746 CLus: 0890 50E6 01747 movf POSTINC1, w 0892 2202 01748 addwfc Hchecksum, f 0894 50E6 01749 movf POSTINC1, w 0896 2203 01750 addwfc Lchecksum, f 01751 0898 50DD 01752 movf POSTDEC2, w ; teller FSR2H:FSR2L -1 089A 66D9 01753 tstfsz FSR2L 089C D7F9 01754 bra CLus 089E 66DA 01755 tstfsz FSR2H 08A0 D7F7 01756 bra CLus ; Blijf rekenen tot teller = 0 01757 08A2 0E00 01758 movlw D'000' 08A4 2202 01759 addwfc Hchecksum, f ; Tel evt. carry van laatste optelling hierbij 01760 08A6 0012 01761 return 01762 01763 08A8 01764 TCPIP_checksum: 01765 ; ------------------------------------------------------------------- 01766 ; Berekenen van checksum voor de IP-header en de TCP-header 01767 ; ------------------------------------------------------------------- 01768 01769 ; De TCP-checksum bestaat uit one compledingens van een pseudoheader en 01770 ; de one compledingens van de tcp-header + data. Voor de tcp-header 01771 ; + data kunnen we de normale Checksum routine gebruiken, omdat deze 01772 ; data mooi in het geheugen zit. De pseudo header is her en der 01773 ; verspreid, dus reken we eerst de pseudo-header uit en voegen er dan 01774 ; het deel van tcp-header+data aan toe. 01775 08A8 6A02 01776 clrf Hchecksum ; checksum = 0 08AA 6A03 01777 clrf Lchecksum 01778 08AC EE10 F027 01779 lfsr 1, IP_from 08B0 6ADA 01780 clrf FSR2H 08B2 0E08 01781 movlw D'8' gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 47 LOC OBJECT CODE LINE SOURCE TEXT VALUE 08B4 6ED9 01782 movwf FSR2L ; FSR2H:FSR2L = 8 = lengte in bytes 08B6 EC44 F004 01783 call Checksum ; calculate checksum for IP_from and IP_to 01784 01785 ; movlw D'0' ; Normaal moeten we hier nul bijtellen, 01786 ; addwfc Hchecksum, f ; maar dit heeft toch geen effekt. 08BA 5024 01787 movf IP_protocol, w 08BC 2203 01788 addwfc Lchecksum, f ; add checksum IP_protocol 08BE 0E00 01789 movlw D'0' 08C0 2202 01790 addwfc Hchecksum, f ; carry van hierboven overdragen 01791 08C2 C01D F000 01792 movff IP_length, delay 08C6 C01E F001 01793 movff IP_length+1, delay2 ; delay, delay2 gebruiken als hulpvar 01794 08CA 0E14 01795 movlw D'20' 08CC 5E01 01796 subwf delay2, f 08CE 0E00 01797 movlw D'0' 08D0 5A00 01798 subwfb delay,f ; Wij hebben lengte - 20 nodig 01799 08D2 EE10 F000 01800 lfsr 1, delay 08D6 6ADA 01801 clrf FSR2H 08D8 0E02 01802 movlw D'2' 08DA 6ED9 01803 movwf FSR2L ; FSR2H:FSR2L = 2 = lengte in bytes 08DC EC44 F004 01804 call Checksum ; calculate checksum for IP_length 01805 01806 ; Hchecksum:Lchecksum bevat nu de checksum van de speudo-header. 01807 ; TCP-Header bijtellen. 01808 08E0 EE10 F02F 01809 lfsr 1, TCP_start 01810 08E4 C000 FFDA 01811 movff delay , FSR2H ; Lengte van TCP-header + DATA 08E8 C001 FFD9 01812 movff delay2, FSR2L ; gebruik FSR2L en FSR2H als teller 01813 ; (*TCP_cheksum padding) 08EC 2AD9 01814 incf FSR2L, f ; Verhoog de lengte met 1 01815 ; In call Cheksum wordt FSR2L / 2 01816 ; Dus als FSR2L even was doet dit niets ( even + 1 ) / 2 = even / 2 01817 ; bv ( 2 + 1 ) / 2 = 2 / 2 = 1 01818 ; Maar als FSR2L oneven was wordt er een extra padding byte bijgevoegd. 01819 08EE 6A3F 01820 clrf TCP_checksum 08F0 6A40 01821 clrf TCP_checksum+1 ; clear TCP_checksum 08F2 EC44 F004 01822 call Checksum ; Voeg checksum TCP-header+data toe 01823 01824 ; comf nog uitvoeren op deze checksum 01825 08F6 1E03 01826 comf Lchecksum, f 08F8 1E02 01827 comf Hchecksum, f ; one complemet 01828 01829 ; en dan de checksum kopieren naar de gepaste lokatie 01830 08FA C002 F03F 01831 movff Hchecksum, TCP_checksum 08FE C003 F040 01832 movff Lchecksum, TCP_checksum+1 01833 01834 ; Checksum IP berekenen, nodig, want we hebben aanpassingen aan de 01835 ; ip-header gemaakt. gpasm-0.13.1 beta old.14.05.2005..3C50918F452.asm5-16-2005 15:34:21 PAGE 48 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01836 0902 6A02 01837 clrf Hchecksum 0904 6A03 01838 clrf Lchecksum 01839 0906 6ADA 01840 clrf FSR2H ; Lengte van IP-header 0908 0E14 01841 movlw D'20' 090A 6ED9 01842 movwf FSR2L ; gebruik FSR2L en FSR2H als teller 01843 090C 6A25 01844 clrf IP_checksum ; Oude checksum wissen 090E 6A26 01845 clrf IP_checksum+1 01846 0910 EE10 F01B 01847 lfsr 1, IP_start 01848 0914 EC44 F004 01849 call Checksum 01850 01851 ; comf nog uitvoeren op deze checksum 01852 0918 1E03 01853 comf Lchecksum, f 091A 1E02 01854 comf Hchecksum, f 01855 01856 ; en dan de checksum kopieren naar de gepaste lokatie 01857 091C C002 F025 01858 movff Hchecksum, IP_checksum 0920 C003 F026 01859 movff Lchecksum, IP_checksum+1 0924 0012 01860 return 01861 01862 ;-) --- ; text -------------------------------------------------------------- 01863 01864 ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 01865 ; 01866 ; ! Lees Dit / Read This ! 01867 ; ------------------------ 01868 ; 01869 ; Wanneer db een oneven aantal karakters bevat wordt er automatisch een 01870 ; zero-padding byte toegevoegd. Zorg dat waar dit een rol speelt de regels 01871 ; uit een even aantal karakters bestaan. 01872 ; 01873 ; When db contains an odd number of expressions, a zero-padding byte will 01874 ; be added. So, where necessary, use a even number of characters to avoid 01875 ; problems. 01876 ; 01877 ; 5.13 DB � Declare Data of One Byte 01878 ; 01879 ; 5.13.1 Syntax 01880 ; 01881 ; [