+ } else if (data[1] == USBASP_FUNC_DISCONNECT) {
+ ispDisconnect();
+ ledRedOff();
+
+ } else if (data[1] == USBASP_FUNC_TRANSMIT) {
+ replyBuffer[0] = ispTransmit(data[2]);
+ replyBuffer[1] = ispTransmit(data[3]);
+ replyBuffer[2] = ispTransmit(data[4]);
+ replyBuffer[3] = ispTransmit(data[5]);
+ len = 4;
+
+ } else if (data[1] == USBASP_FUNC_READFLASH) {
+
+ if (!prog_address_newmode)
+ prog_address = (data[3] << 8) | data[2];
+
+ prog_nbytes = (data[7] << 8) | data[6];
+ prog_state = PROG_STATE_READFLASH;
+ len = 0xff; /* multiple in */
+
+ } else if (data[1] == USBASP_FUNC_READEEPROM) {
+
+ if (!prog_address_newmode)
+ prog_address = (data[3] << 8) | data[2];
+
+ prog_nbytes = (data[7] << 8) | data[6];
+ prog_state = PROG_STATE_READEEPROM;
+ len = 0xff; /* multiple in */
+
+ } else if (data[1] == USBASP_FUNC_ENABLEPROG) {
+ replyBuffer[0] = ispEnterProgrammingMode();
+ len = 1;
+
+ } else if (data[1] == USBASP_FUNC_WRITEFLASH) {
+
+ if (!prog_address_newmode)
+ prog_address = (data[3] << 8) | data[2];
+
+ prog_pagesize = data[4];
+ prog_blockflags = data[5] & 0x0F;
+ prog_pagesize += (((unsigned int) data[5] & 0xF0) << 4);
+ if (prog_blockflags & PROG_BLOCKFLAG_FIRST) {
+ prog_pagecounter = prog_pagesize;
+ }
+ prog_nbytes = (data[7] << 8) | data[6];
+ prog_state = PROG_STATE_WRITEFLASH;
+ len = 0xff; /* multiple out */
+
+ } else if (data[1] == USBASP_FUNC_WRITEEEPROM) {
+
+ if (!prog_address_newmode)
+ prog_address = (data[3] << 8) | data[2];
+
+ prog_pagesize = 0;
+ prog_blockflags = 0;
+ prog_nbytes = (data[7] << 8) | data[6];
+ prog_state = PROG_STATE_WRITEEEPROM;
+ len = 0xff; /* multiple out */
+
+ } else if (data[1] == USBASP_FUNC_SETLONGADDRESS) {
+
+ /* set new mode of address delivering (ignore address delivered in commands) */
+ prog_address_newmode = 1;
+ /* set new address */
+ prog_address = *((unsigned long*) &data[2]);
+
+ } else if (data[1] == USBASP_FUNC_SETISPSCK) {
+
+ /* set sck option */
+ prog_sck = data[2];
+ replyBuffer[0] = 0;
+ len = 1;
+
+ } else if (data[1] == USBASP_FUNC_TPI_CONNECT) {
+ tpi_dly_cnt = data[2] | (data[3] << 8);
+
+ /* RST high */
+ ISP_OUT |= (1 << ISP_RST);
+ ISP_DDR |= (1 << ISP_RST);
+
+ clockWait(3);
+
+ /* RST low */
+ ISP_OUT &= ~(1 << ISP_RST);
+ ledRedOn();