--- /dev/null
+/*
+ * XMODEM.c
+ *
+ * Created on: 2011/02/27
+ * Author: mizu
+ */
+
+#include "3069f_sci.h"
+#include "XMODEM.h"
+#include "stdio.h"
+
+
+#define ACK 0x06
+#define NAK 0x15
+#define EOT 0x04
+
+void (*xwrite)(char c);
+char (*xread)(void);
+char (*xread_pol)(void);
+
+#define XMODEM_DBG 0
+
+// \92Ê\90M\82ª\8aJ\8en\82³\82ê\82é\82Æ\8aÖ\90\94\82ð\94²\82¯\82Ü\82·
+static int xmodem_start_nak()
+{
+ unsigned long cnt = 0;
+
+ // \89½\82©\92l\82ª\93ü\82é\82Ü\82Å\88ê\92è\8aÔ\8au\82²\82Æ\82ÉNAK\82ð\91\97\90M
+ while (!(xread_pol()))
+ {
+ if (cnt++ > 400000)
+ {
+ xwrite(XMODEM_NAK);
+ cnt = 0;
+ }
+ }
+ return 0;
+}
+
+
+// XMODEM 1\83u\83\8d\83b\83N\8eó\90M
+static int xmodem_read_block(unsigned char block_num_now, char* buff)
+{
+ unsigned char c, block_num_rec, check_sum = 0;
+// char c;
+ int i;
+
+ // \83u\83\8d\83b\83N\94Ô\8d\86\8am\94F
+ block_num_rec = xread();
+ if(block_num_now != block_num_rec)
+ return 1;
+
+ // \83r\83b\83g\94½\93]\82Ì\83u\83\8d\83b\83N\94Ô\8d\86\8am\94F
+ c = block_num_rec;
+ block_num_rec = xread();
+ block_num_rec ^= c;
+ if(block_num_rec != 0xFF)
+ return 1;
+
+ // 128byte\82Ì\83f\81[\83^\8eó\90M
+ for(i = 0; i < XMODEM_BLOCK_SIZE; i++)
+ {
+ c = xread();
+ *(buff++) = c;
+ check_sum += c;
+ }
+
+ // \83`\83F\83b\83N\83T\83\80\8am\94F
+ c = xread();
+ check_sum ^= c;
+ if(check_sum)
+ return 1;
+
+ // \90³\8fí\8fI\97¹
+ return 0;
+
+}
+
+// \93]\91\97\82ª\8a®\97¹\82·\82é\82Æ\93]\91\97\82µ\82½\83u\83\8d\83b\83N\90\94\81B \8e¸\94s\81E\92\86\92f\82·\82é\82Æ0\82ð\95Ô\82·
+int xmodem_start(char* buf)
+{
+ unsigned char block_num_now = 1;
+ char c;
+ int i;
+// int starting = 0;
+
+ printf("-------- xmodem_start --------\n");
+
+ xmodem_start_nak();
+
+ while(1)
+ {
+ c = sci_read_byte(SCI_NO_1);
+
+ if(c == XMODEM_SOH)
+ {
+ sci_read_byte(SCI_NO_1); // \83u\83\8d\83b\83N
+ sci_read_byte(SCI_NO_1); // \83u\83\8d\83b\83N\94½\93]
+ for(i = 0; i < 128; i++)
+ {
+ buf[i] = sci_read_byte(SCI_NO_1);
+// i++;
+ }
+ buf += 128;
+ block_num_now++;
+ sci_read_byte(SCI_NO_1); // \83`\83F\83b\83N\83T\83\80
+ sci_write(SCI_NO_1, XMODEM_ACK);
+ }
+
+ if(c == XMODEM_EOT)
+ {
+ sci_write(SCI_NO_1, XMODEM_ACK);
+ break;
+ }
+ }
+
+ return block_num_now;
+
+}
+
+
+
+
+
+
+// while(1)
+// {
+//
+//// printf("recv header\n");
+// c = xread(); // \83w\83b\83_\8eó\90M
+//
+// switch(c)
+// {
+// case XMODEM_SOH: // \92Ê\90M\8aJ\8en\81I
+
+// if(xmodem_read_block(block_num_now, buf))
+// {
+// xwrite(XMODEM_NAK); // \8e¸\94s\82ð\92Ê\92m
+// }
+// else
+// {
+// block_num_now++;
+// buf += XMODEM_BLOCK_SIZE; // \83o\83b\83t\83@\82Ì\83|\83C\83\93\83^\82ð1\83u\83\8d\83b\83N\90i\82ß\82é
+// xwrite(XMODEM_ACK); // \90¬\8c÷\82ð\92Ê\92m \81¨ \8e\9f\82Ì\83u\83\8d\83b\83N\91\97\90M\8aJ\8en
+// }
+// break;
+//
+// case XMODEM_EOT: // \93]\91\97\8a®\97¹
+//// printf("XMODEM_EOT\n");
+// xwrite(XMODEM_ACK);
+// return block_num_now;
+//
+// case XMODEM_CAN: // \92\86\92f
+// return 0;
+//
+// case XMODEM_EOF:
+// return 0;
+//
+//// default:
+//
+// }
+//
+// }
+//}
+
+
+void xmodem_init(void (*io_write)(char c), char (*io_read)(void), char (*io_read_pol)(void))
+{
+ xwrite = io_write;
+ xread = io_read;
+ xread_pol = io_read_pol;
+}
+
+