diff --git a/.gitignore b/.gitignore index 0d6d309..13590d9 100644 --- a/.gitignore +++ b/.gitignore @@ -221,3 +221,5 @@ VHDL/AppleIISd\.tim VHDL/AppleIISd\.jed Firmware/AppleIISd.bin + +Software/Flasher.bin diff --git a/Software/AppleCommander-ac-1.5.0.jar b/Binary/AppleCommander-ac-1.5.0.jar similarity index 100% rename from Software/AppleCommander-ac-1.5.0.jar rename to Binary/AppleCommander-ac-1.5.0.jar diff --git a/Binary/Flasher.bin b/Binary/Flasher.bin index 6b5fcb9..349b548 100644 Binary files a/Binary/Flasher.bin and b/Binary/Flasher.bin differ diff --git a/Binary/Flasher.dsk b/Binary/Flasher.dsk index 9a20d26..0cd6399 100644 Binary files a/Binary/Flasher.dsk and b/Binary/Flasher.dsk differ diff --git a/ProFile.zip b/Binary/ProFile.zip similarity index 100% rename from ProFile.zip rename to Binary/ProFile.zip diff --git a/Firmware/AppleIISd.vcxproj b/Firmware/AppleIISd.vcxproj index d0bd28e..8668b62 100644 --- a/Firmware/AppleIISd.vcxproj +++ b/Firmware/AppleIISd.vcxproj @@ -11,8 +11,8 @@ - + diff --git a/Firmware/AppleIISd.vcxproj.filters b/Firmware/AppleIISd.vcxproj.filters index 8986c9d..f299116 100644 --- a/Firmware/AppleIISd.vcxproj.filters +++ b/Firmware/AppleIISd.vcxproj.filters @@ -23,7 +23,7 @@ - + diff --git a/Firmware/make_image.sh b/Firmware/make_image.sh new file mode 100755 index 0000000..57ec6b5 --- /dev/null +++ b/Firmware/make_image.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +make clean +make OPTIONS=mapfile,listing +java -jar ../Binary/AppleCommander-ac-1.5.0.jar -d ../Binary/Flasher.dsk appleiisd.bin +java -jar ../Binary/AppleCommander-ac-1.5.0.jar -p ../Binary/Flasher.dsk appleiisd.bin $00 < AppleIISd.bin +cp AppleIISd.bin ../Binary/ diff --git a/Software/make_image.sh b/Software/make_image.sh new file mode 100755 index 0000000..c727e25 --- /dev/null +++ b/Software/make_image.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +make clean +make +java -jar ../Binary/AppleCommander-ac-1.5.0.jar -d ../Binary/Flasher.dsk flasher +java -jar ../Binary/AppleCommander-ac-1.5.0.jar -as ../Binary/Flasher.dsk flasher < Flasher.bin +cp Flasher.bin ../Binary/ diff --git a/Software/src/AppleIISd.h b/Software/src/AppleIISd.h index 50e5fe8..31a0025 100644 --- a/Software/src/AppleIISd.h +++ b/Software/src/AppleIISd.h @@ -6,16 +6,20 @@ typedef unsigned short uint16; typedef unsigned long uint32; typedef unsigned char boolean; +#ifndef TRUE #define TRUE 1 +#endif +#ifndef FALSE #define FALSE 0 +#endif -#define SLOT_IO_START (uint8*)0xC080 -#define SLOT_ROM_START (uint8*)0xC000 -#define EXT_ROM_START (uint8*)0xC800 +#define SLOT_IO_START (volatile uint8*)0xC080 +#define SLOT_ROM_START (volatile uint8*)0xC000 +#define EXT_ROM_START (volatile uint8*)0xC800 -#define CFFF (uint8*)0xCFFF +#define CFFF (volatile uint8*)0xCFFF -typedef struct +typedef volatile struct { // data register // +0 @@ -40,12 +44,9 @@ typedef struct uint8 status; } status; - // clock divisor register + // clock divisor register, unused // +2 - union - { - unsigned clkDiv : 2; - }; + uint8 clkDiv; // slave select and card state register // +3 @@ -56,8 +57,8 @@ typedef struct unsigned slaveSel : 1; unsigned : 3; unsigned sdhc : 1; - unsigned wp : 1; - unsigned card : 1; + const unsigned wp : 1; + const unsigned card : 1; unsigned inited : 1; }; diff --git a/Software/src/Flasher.c b/Software/src/Flasher.c index 8db7569..6692760 100644 --- a/Software/src/Flasher.c +++ b/Software/src/Flasher.c @@ -1,10 +1,14 @@ #include "AppleIISd.h" +#include #include #include #include +#include #include +// Binary can't be larger than 2k +#define BUFFER_SIZE 2048 #define BIN_FILE_NAME "AppleIISd.bin" typedef enum @@ -14,33 +18,33 @@ typedef enum STATE_2, // hyphen STATE_3, // backslash - STATE_LAST // don't use + STATE_LAST // don't use } STATE_CURSOR_T; const char state_char[STATE_LAST] = { '|', '/', '-', '\\' }; +static uint8 buffer[BUFFER_SIZE]; - -boolean writeChip(const uint8* pSource, uint8* pDest, uint16 length); -void printStatus(uint8 percentage); - -// Binary can't be larger than 2k -uint8 buffer[2048] = { 0 }; +static void writeChip(const uint8* pSource, volatile uint8* pDest, uint16 length); +static boolean verifyChip(const uint8* pSource, volatile uint8* pDest, uint16 length); +static void printStatus(uint8 percentage); int main() { - int retval = 0; + int retval = 1; FILE* pFile; char slotNum; + boolean erase = FALSE; + uint16 fileSize = 0; APPLE_II_SD_T* pAIISD = (APPLE_II_SD_T*)SLOT_IO_START; - uint8* pSlotRom = SLOT_ROM_START; - uint8* pExtRom = EXT_ROM_START; + volatile uint8* pSlotRom = SLOT_ROM_START; + volatile uint8 dummy; videomode(VIDEOMODE_40COL); clrscr(); - cprintf("AppleIISd firmware flasher\r\n"); - cprintf("(c) 2019 Florian Reitz\r\n\r\n"); - + cprintf("AppleIISd firmware flasher V1.2\r\n"); + cprintf("(c) 2019-2020 Florian Reitz\r\n\r\n"); + // ask for slot cursor(1); // enable blinking cursor cprintf("Slot number (1-7): "); @@ -48,6 +52,18 @@ int main() slotNum -= 0x30; cursor(0); // disable blinking cursor + if(slotNum == 0) + { + // erase device + erase = TRUE; + // ask for slot + cursor(1); // enable blinking cursor + cprintf("Erase device in slot number (1-7): "); + cscanf("%c", &slotNum); + slotNum -= 0x30; + cursor(0); // disable blinking cursor + } + // check if slot is valid if((slotNum < 1) || (slotNum > 7)) { @@ -59,94 +75,114 @@ int main() ((uint8*)pAIISD) += slotNum << 4; pSlotRom += slotNum << 8; - // open file - pFile = fopen(BIN_FILE_NAME, "rb"); - if(pFile) + if(erase) { - // read buffer - uint16 fileSize = fread(buffer, 1, sizeof(buffer), pFile); - fclose(pFile); - pFile = NULL; - - if(fileSize == 2048) - { - // enable write - pAIISD->status.pgmen = 1; - - // clear 0xCFFF - *CFFF = 0; - - // write to SLOTROM - cprintf("\r\n\r\nFlashing SLOTROM: "); - if(writeChip(buffer, pSlotRom, 256)) - { - // write to EXTROM - cprintf("\r\nFlashing EXTROM: "); - if(writeChip(buffer + 256, pExtRom, fileSize - 256)) - { - cprintf("\r\n\r\nFlashing finished!\n"); - } - else - { - retval = 1; - } - } - else - { - retval = 1; - } - - // disable write - pAIISD->status.pgmen = 0; - } - else - { - cprintf("\r\nWrong file size: %d\r\n", fileSize); - retval = 1; - } + fileSize = BUFFER_SIZE; + memset(buffer, 0, sizeof(buffer)); } else { - cprintf("\r\nCan't open %s file\r\n", BIN_FILE_NAME); - retval = 1; + // open file + pFile = fopen(BIN_FILE_NAME, "rb"); + if(pFile) + { + // read buffer + fileSize = fread(buffer, 1, sizeof(buffer), pFile); + fclose(pFile); + pFile = NULL; + + if(fileSize != BUFFER_SIZE) + { + cprintf("\r\nWrong file size: %d\r\n", fileSize); + } + } + else + { + cprintf("\r\nCan't open %s file\r\n", BIN_FILE_NAME); + fileSize = 0; + } + } + + if(fileSize == BUFFER_SIZE) + { + // enable write + pAIISD->status.pgmen = 1; + + // write to SLOTROM + cprintf("\r\n\r\nFlashing SLOTROM: "); + writeChip(buffer, pSlotRom, 256); + + cprintf("\r\nVerifying SLOTROM: "); + if(verifyChip(buffer, pSlotRom, 256)) + { + // write to EXT_ROM + cprintf("\r\n\r\nFlashing EXTROM: "); + + // clear CFFF and dummy read to enable correct EXT_ROM + dummy = *CFFF; + dummy = *pSlotRom; + + writeChip(buffer + 256, EXT_ROM_START, fileSize - 256); + cprintf("\r\nVerifying EXTROM: "); + + dummy = *CFFF; + dummy = *pSlotRom; + + if(verifyChip(buffer + 256, EXT_ROM_START, fileSize - 256)) + { + cprintf("\r\n\r\nFlashing finished!\n"); + retval = 0; + } + } + + // disable write + pAIISD->status.pgmen = 0; } cgetc(); return retval; } -boolean writeChip(const uint8* pSource, uint8* pDest, uint16 length) +static void writeChip(const uint8* pSource, volatile uint8* pDest, uint16 length) { uint32 i; - uint8 data = 0; + volatile uint8 readData; for(i=0; i