uchar usbFunctionSetup(uchar data[8]) { uchar len = 0; #ifdef UART_DEBUG TransmitHex(data[1]); #endif if (data[1] == USBASP_FUNC_CONNECT) { #if 0 /* set SCK speed */ if ((PINC & (1 << PC2)) == 0) { ispSetSCKOption(USBASP_ISP_SCK_8); } else { ispSetSCKOption(prog_sck); } #endif /* set compatibility mode of address delivering */ prog_address_newmode = 0; ledRedOn(); ispConnect(); } else if (data[1] == USBASP_FUNC_DISCONNECT) { ispDisconnect(); ledRedOff(); } else if (data[1] == USBASP_FUNC_TRANSMIT) { // debug - print out contents of message #ifdef UART_DEBUG TransmitHex(data[2]); TransmitHex(data[3]); TransmitHex(data[4]); TransmitHex(data[5]); #endif replyBuffer[0] = 0; replyBuffer[1] = 0; replyBuffer[2] = 0; replyBuffer[3] = interpretSPICommand(&data[2]); 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; #if 0 } 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(); clockWait(16); tpi_init(); } else if (data[1] == USBASP_FUNC_TPI_DISCONNECT) { tpi_send_byte(TPI_OP_SSTCS(TPISR)); tpi_send_byte(0); clockWait(10); /* pulse RST */ ISP_OUT |= (1 << ISP_RST); clockWait(5); ISP_OUT &= ~(1 << ISP_RST); clockWait(5); /* set all ISP pins inputs */ ISP_DDR &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI)); /* switch pullups off */ ISP_OUT &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI)); ledRedOff(); } else if (data[1] == USBASP_FUNC_TPI_RAWREAD) { replyBuffer[0] = tpi_recv_byte(); len = 1; } else if (data[1] == USBASP_FUNC_TPI_RAWWRITE) { tpi_send_byte(data[2]); } else if (data[1] == USBASP_FUNC_TPI_READBLOCK) { prog_address = (data[3] << 8) | data[2]; prog_nbytes = (data[7] << 8) | data[6]; prog_state = PROG_STATE_TPI_READ; len = 0xff; /* multiple in */ } else if (data[1] == USBASP_FUNC_TPI_WRITEBLOCK) { prog_address = (data[3] << 8) | data[2]; prog_nbytes = (data[7] << 8) | data[6]; prog_state = PROG_STATE_TPI_WRITE; len = 0xff; /* multiple out */ #endif } else if (data[1] == USBASP_FUNC_GETCAPABILITIES) { replyBuffer[0] = USBASP_CAP_0_TPI; replyBuffer[1] = 0; replyBuffer[2] = 0; replyBuffer[3] = 0; len = 4; } usbMsgPtr = replyBuffer; #ifdef UART_DEBUG TransmitString("\r\n"); #endif return len; }
uchar usbFunctionSetup(uchar data[8]) { uchar len = 0; if (data[1] == USBASP_FUNC_CONNECT) { /* set SCK speed */ if ((PINC & (1 << PC2)) == 0) { ispSetSCKOption(USBASP_ISP_SCK_8); } else { ispSetSCKOption(prog_sck); } /* set compatibility mode of address delivering */ prog_address_newmode = 0; ledRedOn(); ispConnect(); } else if (data[1] == USBASP_FUNC_DISCONNECT) { ispDisconnect(); ledRedOff(); } else if (data[1] == USBASP_FUNC_TRANSMIT) { if(chip==ATM){ replyBuffer[0] = ispTransmit(data[2]); replyBuffer[1] = ispTransmit(data[3]); replyBuffer[2] = ispTransmit(data[4]); replyBuffer[3] = ispTransmit(data[5]); } else { if(data[2]==0x24) { // read lock bits replyBuffer[0] = ispTransmit(data[2]); replyBuffer[1] = ispTransmit(data[3]); replyBuffer[2] = ispTransmit(data[4]); switch(ispTransmit(data[5])&0x1C) { case(0x00):replyBuffer[3]=0xE0;break; case(0x04):replyBuffer[3]=0xE5;break; case(0x0C):replyBuffer[3]=0xEE;break; case(0x1C):replyBuffer[3]=0xFF;break; } } else if(data[2]==0x30) { // read signature replyBuffer[0] = ispTransmit(0x28); replyBuffer[1] = ispTransmit(data[3]); replyBuffer[2] = ispTransmit(data[4]); replyBuffer[3] = ispTransmit(data[5]); } else { 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(); replyBuffer[0] = ispEnterProgrammingMode_jarodlau();//代码修改成自动降速,jarodlau 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(); clockWait(16); tpi_init(); } else if (data[1] == USBASP_FUNC_TPI_DISCONNECT) { tpi_send_byte(TPI_OP_SSTCS(TPISR)); tpi_send_byte(0); clockWait(10); /* pulse RST */ ISP_OUT |= (1 << ISP_RST); clockWait(5); ISP_OUT &= ~(1 << ISP_RST); clockWait(5); /* set all ISP pins inputs */ ISP_DDR &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI)); /* switch pullups off */ ISP_OUT &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI)); ledRedOff(); } else if (data[1] == USBASP_FUNC_TPI_RAWREAD) { replyBuffer[0] = tpi_recv_byte(); len = 1; } else if (data[1] == USBASP_FUNC_TPI_RAWWRITE) { tpi_send_byte(data[2]); } else if (data[1] == USBASP_FUNC_TPI_READBLOCK) { prog_address = (data[3] << 8) | data[2]; prog_nbytes = (data[7] << 8) | data[6]; prog_state = PROG_STATE_TPI_READ; len = 0xff; /* multiple in */ } else if (data[1] == USBASP_FUNC_TPI_WRITEBLOCK) { prog_address = (data[3] << 8) | data[2]; prog_nbytes = (data[7] << 8) | data[6]; prog_state = PROG_STATE_TPI_WRITE; len = 0xff; /* multiple out */ } else if (data[1] == USBASP_FUNC_GETCAPABILITIES) { replyBuffer[0] = USBASP_CAP_0_TPI; replyBuffer[1] = 0; replyBuffer[2] = 0; replyBuffer[3] = 0; len = 4; } usbMsgPtr = replyBuffer; return len; }
/* C64-specific initialization. */ int machine_specific_init(void) { c64_log = log_open("C64"); if (mem_load() < 0) return -1; if (vsid_mode) { psid_init_driver(); } if (!vsid_mode) { /* Setup trap handling. */ traps_init(); /* Initialize serial traps. */ if (serial_init(c64_serial_traps) < 0) return -1; serial_trap_init(0xa4); serial_iec_bus_init(); /* Initialize RS232 handler. */ rs232drv_init(); c64_rsuser_init(); /* Initialize print devices. */ printer_init(); /* Initialize the tape emulation. */ tape_init(&tapeinit); /* Initialize the datasette emulation. */ datasette_init(); /* Fire up the hardware-level drive emulation. */ drive_init(); /* Initialize autostart. */ autostart_init((CLOCK)(3 * C64_PAL_RFSH_PER_SEC * C64_PAL_CYCLES_PER_RFSH), 1, 0xcc, 0xd1, 0xd3, 0xd5); } if (vicii_init(VICII_STANDARD) == NULL && !console_mode && !vsid_mode) return -1; c64_mem_init(); cia1_init(machine_context.cia1); cia2_init(machine_context.cia2); if (!vsid_mode) { tpi_init(machine_context.tpi1); acia1_init(); #ifndef COMMON_KBD /* Initialize the keyboard. */ if (c64_kbd_init() < 0) return -1; #endif c64keyboard_init(); } c64_monitor_init(); /* Initialize vsync and register our hook function. */ vsync_init(machine_vsync_hook); vsync_set_machine_parameter(machine_timing.rfsh_per_sec, machine_timing.cycles_per_sec); /* Initialize sound. Notice that this does not really open the audio device yet. */ sound_init(machine_timing.cycles_per_sec, machine_timing.cycles_per_rfsh); /* Initialize keyboard buffer. */ kbdbuf_init(631, 198, 10, (CLOCK)(machine_timing.rfsh_per_sec * machine_timing.cycles_per_rfsh)); /* Initialize the C64-specific part of the UI. */ if (!console_mode) { if (vsid_mode) vsid_ui_init(); else c64ui_init(); } if (!vsid_mode) { /* Initialize the REU. */ reu_init(); /* Initialize the GEORAM. */ georam_init(); /* Initialize the RAMCART. */ ramcart_init(); /* Initialize the +60K. */ plus60k_init(); /* Initialize the +256K. */ plus256k_init(); /* Initialize the C64 256K. */ c64_256k_init(); /* Initialize the MMC64. */ mmc64_init(); #ifdef HAVE_TFE /* Initialize the TFE. */ tfe_init(); #endif #ifdef HAVE_MOUSE /* Initialize mouse support (if present). */ mouse_init(); #endif c64iec_init(); c64fastiec_init(); cartridge_init(); } machine_drive_stub(); return 0; }