Awhile back I asked if anyone was working on this, and realized that apparently nobody was. So here's my take. The demo program just supports ARP and PING, which demonstrates the full functionality of the ENC28J60. I will soon add UDP for my own purposes but that requires nonstandard software to test, and if I ever do TCP/IP I will probably take a different approach than Harrison since we have much more memory to work with.
I would appreciate it if the P2 experts could look over the way I implemented the SPI interface and make sure I didn't miss a better way to do things. I wanted to use inline asm for outh/outl etc. to avoid the outa/outb goat rodeo, but I also wanted to make pin assignments dynamic. The solution I came up with lets the four pin assignments to be moved to local variables with a minimum of overhead. I wanted to try using setd to modify the actual inline asm code just once but I couldn't figure out a way to get an asm label address into a local variable.
UPDATE: The new demo adds ARP-query, ARP-reply handling, and UDP as both server and client. This is a fully usable lightweight framework for communicating over a network or even the Internet.