In agreement with with Adam I do this "blind commit" which means that I don't know if this code really works or even assembles. However a only slightly different code was successfully tested on an Apple2 - thanks to Glenn.
diff --git a/contiki-c64/uip/cs8900a.c b/contiki-c64/uip/cs8900a.c
index e1f6315..282ec2e 100644
--- a/contiki-c64/uip/cs8900a.c
+++ b/contiki-c64/uip/cs8900a.c
@@ -28,7 +28,7 @@
*
* This file is part of the C64 RealAudio server demo project.
*
- * $Id: cs8900a.c,v 1.7 2004/09/18 20:44:27 adamdunkels Exp $
+ * $Id: cs8900a.c,v 1.8 2005/02/02 22:34:18 oliverschmidt Exp $
*
*/
@@ -39,21 +39,14 @@
#include "uip.h"
#include "uip_arp.h"
-/*#define UIP_ETHADDR0 0x00
-#define UIP_ETHADDR1 0x00
-#define UIP_ETHADDR2 0x00
-#define UIP_ETHADDR3 0x64
-#define UIP_ETHADDR4 0x64
-#define UIP_ETHADDR5 0x64*/
-
extern u8_t *cs8900a_rxtxreg,
- *cs8900a_txcmd,
- *cs8900a_txlen,
- *cs8900a_packetpp,
- *cs8900a_ppdata;
+ *cs8900a_txcmd,
+ *cs8900a_txlen,
+ *cs8900a_packetpp,
+ *cs8900a_ppdata;
static u16_t len;
-static u8_t r;
+static u16_t cnt;
/*-----------------------------------------------------------------------------------*/
@@ -118,7 +111,6 @@
asm("sta %v", cs8900a_ppdata);
asm("lda %v+5", uip_ethaddr);
asm("sta %v+1", cs8900a_ppdata);
-
}
#pragma optimize(pop)
/*-----------------------------------------------------------------------------------*/
@@ -126,26 +118,17 @@
void
cs8900a_send(void)
{
- if(uip_len > UIP_BUFSIZE) {
- asm("inc $d020");
- return;
- }
-
/* Transmit command. */
asm("lda #$c0");
asm("sta %v", cs8900a_txcmd);
asm("lda #$00");
asm("sta %v+1", cs8900a_txcmd);
- asm("lda _uip_len");
+ asm("lda %v", uip_len);
asm("sta %v", cs8900a_txlen);
-#if UIP_BUFSIZE > 255
- asm("lda _uip_len+1");
-#else
- asm("lda #0");
-#endif
+ asm("lda %v+1", uip_len);
asm("sta %v+1", cs8900a_txlen);
- asm("ldx #8");
+ asm("ldy #8");
asm("tryagain:");
/* Check for avaliable buffer space. */
asm("lda #$38");
@@ -165,29 +148,23 @@
asm("ora #$40");
asm("sta %v", cs8900a_ppdata);
- asm("dex");
+ asm("dey");
asm("bne tryagain");
-
- asm("bailout:");
return;
/* Send the frame. */
asm("send:");
-
/* First, send 40+14=54 bytes of header. */
-
- asm("ldx #54");
asm("ldy #0");
asm("sendloop1:");
- asm("lda _uip_buf,y");
+ asm("lda %v,y", uip_buf);
asm("sta %v", cs8900a_rxtxreg);
- asm("lda _uip_buf+1,y");
+ asm("iny");
+ asm("lda %v,y", uip_buf);
asm("sta %v+1", cs8900a_rxtxreg);
asm("iny");
- asm("iny");
- asm("dex");
- asm("dex");
+ asm("cpy #54");
asm("bne sendloop1");
if(uip_len <= 54) {
@@ -195,51 +172,41 @@
}
/* Next, send rest of the packet. */
-
uip_len -= 54;
+ asm("lda %v", uip_len);
+ asm("lsr");
+ asm("bcc noinc");
+ asm("inc %v", uip_len);
+ asm("bne noinc");
+ asm("inc %v+1", uip_len);
+ asm("noinc:");
asm("lda ptr1");
asm("pha");
asm("lda ptr1+1");
asm("pha");
- asm("lda _uip_appdata");
+ asm("lda %v", uip_appdata);
asm("sta ptr1");
- asm("lda _uip_appdata+1");
+ asm("lda %v+1", uip_appdata);
asm("sta ptr1+1");
- asm("sendloop2:");
- asm("lda _uip_len");
- asm("tax");
- asm("and #1");
- asm("beq noinc");
- asm("inx");
- asm("noinc:");
-#if UIP_BUFSIZE > 255
- asm("lda _uip_len+1");
-#else
- asm("lda #0");
-#endif
- asm("beq nozero");
- asm("ldx #0");
- asm("nozero:");
asm("ldy #0");
- asm("sendloop:");
+ asm("sendloop2:");
asm("lda (ptr1),y");
asm("sta %v", cs8900a_rxtxreg);
asm("iny");
asm("lda (ptr1),y");
asm("sta %v+1", cs8900a_rxtxreg);
asm("iny");
- asm("dex");
- asm("dex");
- asm("bne sendloop");
+ asm("bne check");
asm("inc ptr1+1");
-#if UIP_BUFSIZE > 255
- asm("dec _uip_len+1");
+ asm("check:");
+ asm("cpy %v", uip_len);
+ asm("bne sendloop2");
+ asm("dec %v+1", uip_len);
asm("bpl sendloop2");
-#endif
asm("pla");
asm("sta ptr1+1");
@@ -265,7 +232,7 @@
#pragma optimize(pop)
/*-----------------------------------------------------------------------------------*/
#pragma optimize(push, off)
-u8_t
+u16_t
cs8900a_poll(void)
{
/* Check receiver event register to see if there are any valid
@@ -290,65 +257,43 @@
/* Process the incoming frame. */
/* Read receiver event and discard it. */
- /* dummy = RXTXREG; */
-
+ /* RXTXREG; */
asm("lda %v+1", cs8900a_rxtxreg);
- asm("sta _len+1");
asm("lda %v", cs8900a_rxtxreg);
- asm("sta _len");
/* Read frame length. */
- /* len = uip_len = RXTXREG; */
+ /* cnt = len = RXTXREG; */
asm("lda %v+1", cs8900a_rxtxreg);
- asm("sta _len+1");
- asm("sta _uip_len+1");
+ asm("sta %v+1", len);
+ asm("sta %v+1", cnt);
asm("lda %v", cs8900a_rxtxreg);
- asm("sta _len");
- asm("sta _uip_len");
+ asm("sta %v", len);
+ asm("sta %v", cnt);
-
- if(len > UIP_BUFSIZE) {
+ asm("lsr");
+ asm("bcc noinc");
+ asm("inc %v", cnt);
+ asm("bne noinc");
+ asm("inc %v+1", cnt);
+ asm("noinc:");
+
+ if(cnt > UIP_BUFSIZE) {
skip_frame();
return 0;
}
-
+
/* Read bytes into uip_buf. */
asm("lda ptr1");
asm("pha");
asm("lda ptr1+1");
asm("pha");
- asm("lda #<_uip_buf");
+ asm("lda #<%v", uip_buf);
asm("sta ptr1");
- asm("lda #>_uip_buf");
+ asm("lda #>%v", uip_buf);
asm("sta ptr1+1");
- asm("lda _len+1");
- asm("beq read256");
-
- /* Read first 256*n bytes. */
asm("ldy #0");
- asm("read256loop:");
- asm("lda %v", cs8900a_rxtxreg);
- asm("sta (ptr1),y");
- asm("iny");
- asm("lda %v+1", cs8900a_rxtxreg);
- asm("sta (ptr1),y");
- asm("iny");
- asm("bne read256loop");
- asm("inc ptr1+1");
-
- asm("dec _len+1");
- asm("bne read256loop");
-
- /* Read last 255 or less bytes. */
- asm("read256:");
- asm("lda _len");
- asm("lsr");
- asm("bcc noinc");
- asm("inc _len");
- asm("noinc:");
- asm("ldy #$0");
asm("readloop:");
asm("lda %v", cs8900a_rxtxreg);
asm("sta (ptr1),y");
@@ -356,8 +301,13 @@
asm("lda %v+1", cs8900a_rxtxreg);
asm("sta (ptr1),y");
asm("iny");
- asm("cpy _len");
+ asm("bne check");
+ asm("inc ptr1+1");
+ asm("check:");
+ asm("cpy %v", cnt);
asm("bne readloop");
+ asm("dec %v+1", cnt);
+ asm("bpl readloop");
asm("pla");
asm("sta ptr1+1");