Jump to content
IGNORED

Introducing APEDSK99: 3x DS/SD, 32K, FTP, NTP


JJB

Recommended Posts

WiFi would be great as it saves a cable snaking over your desk. I did look at WiFi at some stage but the (standard) library was rather large and the resulting sketch didn't fit into memory. Like for FTP and NTP, there may be a smaller WiFi library available somewhere. Speaking of cables, if I really had thought a little bit longer about the design I made sure the Ethernet, power and USB connectors would be at the back of the unit 🙂 I did integrate an APEDSK99 unit into a speech synthesizer case and made some converter cables to do exactly that.

  • Like 2
Link to comment
Share on other sites

Here are some pictures on how I modify the Ethernet shield; I have found this the easiest and quickest way. The final piece of heat shrink tubing on the ICSP connector is important to keep the wires from sliding out the connector over time (as they will be upside down). 

connect-1.png

connect-2.png

connect-3.png

wire.png

  • Like 3
Link to comment
Share on other sites

Looks great! The only slightly tricky thing with programming is using the right version of certain libraries; my Github page has some of the required ones but with every new Arduino IDE version some standard libs seem to bloat and could cause the sketch not to fit. 

 

Happy to provide a more detailed list of lib versions if you run into that trouble. 

 

Awesome you built one. 

  • Like 1
Link to comment
Share on other sites

@JJB

I am getting this error when trying to compile and program the sketch in the Arduino IDE 1.8.19, what do I need to do to resolve this? What am I missing?

 

"Arduino: 1.8.19 (Windows 10), TD: 1.58, Board: "Arduino Uno"

C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino: In function 'void disable_controlbus()':
APEDSK99_012s-B-HAL:52:3: error: 'pinAsInput' was not declared in this scope
   pinAsInput(CE);
   ^~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino: In function 'void enable_controlbus()':
APEDSK99_012s-B-HAL:58:3: error: 'pinAsOutput' was not declared in this scope
   pinAsOutput(CE);
   ^~~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino: In function 'void set_addressbus(unsigned int)':
APEDSK99_012s-B-HAL:79:3: error: 'digitalLow' was not declared in this scope
   digitalLow(LATCH);                                                                                        //disable latch line
   ^~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:79:3: note: suggested alternative: 'digitalRead'
   digitalLow(LATCH);                                                                                        //disable latch line
   ^~~~~~~~~~
   digitalRead
APEDSK99_012s-B-HAL:87:44: error: 'digitalHigh' was not declared in this scope
   PORTC |= ( (address >> 10) & B00100000); digitalHigh(CLOCK); digitalLow(DS); //A15
                                            ^~~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:87:44: note: suggested alternative: 'digitalRead'
   PORTC |= ( (address >> 10) & B00100000); digitalHigh(CLOCK); digitalLow(DS); //A15
                                            ^~~~~~~~~~~
                                            digitalRead
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino: In function 'byte read_DSRAM(unsigned int)':
APEDSK99_012s-B-HAL:128:3: error: 'digitalLow' was not declared in this scope
   digitalLow(CE);                                                                                           //enable RAM chip select
   ^~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:128:3: note: suggested alternative: 'digitalRead'
   digitalLow(CE);                                                                                           //enable RAM chip select
   ^~~~~~~~~~
   digitalRead
APEDSK99_012s-B-HAL:130:3: error: 'digitalHigh' was not declared in this scope
   digitalHigh(CE);                                                                                          //disable RAM chip select
   ^~~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:130:3: note: suggested alternative: 'digitalRead'
   digitalHigh(CE);                                                                                          //disable RAM chip select
   ^~~~~~~~~~~
   digitalRead
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino: In function 'void write_DSRAM(unsigned int, byte)':
APEDSK99_012s-B-HAL:139:3: error: 'digitalLow' was not declared in this scope
   digitalLow(CE);                                                                                           //enable RAM chip select
   ^~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:139:3: note: suggested alternative: 'digitalRead'
   digitalLow(CE);                                                                                           //enable RAM chip select
   ^~~~~~~~~~
   digitalRead
APEDSK99_012s-B-HAL:142:3: error: 'digitalHigh' was not declared in this scope
   digitalHigh(WE);                                                                                          //disable write
   ^~~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:142:3: note: suggested alternative: 'digitalRead'
   digitalHigh(WE);                                                                                          //disable write
   ^~~~~~~~~~~
   digitalRead
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino: In function 'void TIstop()':
APEDSK99_012s-B-HAL:152:3: error: 'digitalLow' was not declared in this scope
   digitalLow(TI_READY);                                                                                     //halts TI and enables 74HC595 shift registers
   ^~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:152:3: note: suggested alternative: 'digitalRead'
   digitalLow(TI_READY);                                                                                     //halts TI and enables 74HC595 shift registers
   ^~~~~~~~~~
   digitalRead
APEDSK99_012s-B-HAL:153:3: error: 'digitalHigh' was not declared in this scope
   digitalHigh(TI_BUFFERS);                                                                                  //disables 74HCT541 address buffers and GAL outputs
   ^~~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:153:3: note: suggested alternative: 'digitalRead'
   digitalHigh(TI_BUFFERS);                                                                                  //disables 74HCT541 address buffers and GAL outputs
   ^~~~~~~~~~~
   digitalRead
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino: In function 'void TIgo()':
APEDSK99_012s-B-HAL:164:3: error: 'digitalLow' was not declared in this scope
   digitalLow(TI_BUFFERS);                                                                                   //enables 74HCT541 address buffers and GAL outputs
   ^~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:164:3: note: suggested alternative: 'digitalRead'
   digitalLow(TI_BUFFERS);                                                                                   //enables 74HCT541 address buffers and GAL outputs
   ^~~~~~~~~~
   digitalRead
APEDSK99_012s-B-HAL:165:3: error: 'digitalHigh' was not declared in this scope
   digitalHigh(TI_READY);                                                                                    //disables 74HC595 shift registers and wakes up TI
   ^~~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:165:3: note: suggested alternative: 'digitalRead'
   digitalHigh(TI_READY);                                                                                    //disables 74HC595 shift registers and wakes up TI
   ^~~~~~~~~~~
   digitalRead
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino: In function 'void APEDSK99reset()':
APEDSK99_012s-B-HAL:170:3: error: 'wdt_disable' was not declared in this scope
   wdt_disable();                                                                                      //disable Watchdog (just to be sure)
   ^~~~~~~~~~~
APEDSK99_012s-B-HAL:171:14: error: 'WDTO_15MS' was not declared in this scope
   wdt_enable(WDTO_15MS);                                                                              //enable it and set delay to 15ms
              ^~~~~~~~~
APEDSK99_012s-B-HAL:171:3: error: 'wdt_enable' was not declared in this scope
   wdt_enable(WDTO_15MS);                                                                              //enable it and set delay to 15ms
   ^~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:171:3: note: suggested alternative: 'mutable'
   wdt_enable(WDTO_15MS);                                                                              //enable it and set delay to 15ms
   ^~~~~~~~~~
   mutable
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino: In function 'void Flasher(byte)':
APEDSK99_012s-B-HAL:182:3: error: 'digitalHigh' was not declared in this scope
   digitalHigh(TI_READY);                                                                              //... but let user enjoy vanilla console
   ^~~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:182:3: note: suggested alternative: 'digitalRead'
   digitalHigh(TI_READY);                                                                              //... but let user enjoy vanilla console
   ^~~~~~~~~~~
   digitalRead
APEDSK99_012s-B-HAL:186:7: error: 'digitalLow' was not declared in this scope
       digitalLow(CE);                                                                                 //set RAM CE* LOW, turns on LED
       ^~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-B-HAL.ino:186:7: note: suggested alternative: 'digitalRead'
       digitalLow(CE);                                                                                 //set RAM CE* LOW, turns on LED
       ^~~~~~~~~~
       digitalRead
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-C-global_suppfnc.ino: In function 'void EtherStart()':
APEDSK99_012s-C-global_suppfnc:54:16: error: 'ETH_CS' was not declared in this scope
   pinAsOutput( ETH_CS );                                                                              //enable EthernetShield CS (shared with TI_INT)
                ^~~~~~
APEDSK99_012s-C-global_suppfnc:54:3: error: 'pinAsOutput' was not declared in this scope
   pinAsOutput( ETH_CS );                                                                              //enable EthernetShield CS (shared with TI_INT)
   ^~~~~~~~~~~
APEDSK99_012s-C-global_suppfnc:56:19: error: 'MAC' was not declared in this scope
   Ethernet.begin( MAC, ACFG.ipaddress );                                                              //... with set MAC address and IP address
                   ^~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-C-global_suppfnc.ino: In function 'void EtherStop()':
APEDSK99_012s-C-global_suppfnc:60:3: error: 'client' was not declared in this scope
   client.stop();                                                                                      //stop Ethernet client
   ^~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-C-global_suppfnc.ino:60:3: note: suggested alternative: 'Client'
   client.stop();                                                                                      //stop Ethernet client
   ^~~~~~
   Client
APEDSK99_012s-C-global_suppfnc:61:3: error: 'pinAsInput' was not declared in this scope
   pinAsInput(TI_INT);                                                                                 //disable EthernetShield SS / enable TI_INT
   ^~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-C-global_suppfnc.ino: In function 'boolean prepDSK()':
APEDSK99_012s-C-global_suppfnc:106:23: error: 'SD' was not declared in this scope
   boolean existDOAD = SD.exists( DOADfullpath );
                       ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-C-global_suppfnc.ino:106:23: note: suggested alternative: 'SDA'
   boolean existDOAD = SD.exists( DOADfullpath );
                       ^~
                       SDA
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-C-global_suppfnc.ino: In function 'void CALLstatus(byte)':
APEDSK99_012s-C-global_suppfnc:129:12: error: 'SD' was not declared in this scope
     DSKx = SD.open( "/CALLerr.txt", FILE_READ );                                                      //open error text file
            ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-C-global_suppfnc.ino:129:12: note: suggested alternative: 'SDA'
     DSKx = SD.open( "/CALLerr.txt", FILE_READ );                                                      //open error text file
            ^~
            SDA
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-C-global_suppfnc.ino: In function 'byte getNTPdt()':
APEDSK99_012s-C-global_suppfnc:157:3: error: 'ntp' was not declared in this scope
   ntp.begin();                                                                                        //start NTP client
   ^~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-E-init.ino: In function 'void setup()':
APEDSK99_012s-E-init:1:6: error: redefinition of 'void setup()'
 void setup() {
      ^~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\sketch_apr21a.ino:19:6: note: 'void setup()' previously defined here
 void setup() {
      ^~~~~
APEDSK99_012s-E-init:3:3: error: 'pinAsOutput' was not declared in this scope
   pinAsOutput(TI_BUFFERS);                                              //enable* or disable 74HCT541 address buffers and GAL outputs
   ^~~~~~~~~~~
APEDSK99_012s-E-init:8:15: error: 'ETHSD_SS' was not declared in this scope
   pinAsOutput(ETHSD_SS);                                                //initialise shield SS pin
               ^~~~~~~~
APEDSK99_012s-E-init:9:3: error: 'digitalHigh' was not declared in this scope
   digitalHigh(ETHSD_SS);                                                //without this SPI subsystem won't work
   ^~~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-E-init.ino:9:3: note: suggested alternative: 'digitalRead'
   digitalHigh(ETHSD_SS);                                                //without this SPI subsystem won't work
   ^~~~~~~~~~~
   digitalRead
APEDSK99_012s-E-init:11:9: error: 'SD' was not declared in this scope
   if ( !SD.begin(SPI_CS) ) {                                            //SD card present and can be initialized?
         ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-E-init.ino:11:9: note: suggested alternative: 'SDA'
   if ( !SD.begin(SPI_CS) ) {                                            //SD card present and can be initialized?
         ^~
         SDA
APEDSK99_012s-E-init:11:18: error: 'SPI_CS' was not declared in this scope
   if ( !SD.begin(SPI_CS) ) {                                            //SD card present and can be initialized?
                  ^~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-E-init.ino:11:18: note: suggested alternative: 'SPI'
   if ( !SD.begin(SPI_CS) ) {                                            //SD card present and can be initialized?
                  ^~~~~~
                  SPI
APEDSK99_012s-E-init:21:8: error: 'EEPROM' was not declared in this scope
   if ( EEPROM.read(EEPROM_DSR) == 0xFF ) {                              //invalid DSR (i.e. virgin Uno EEPROM or invalid DSR filename)?
        ^~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-E-init.ino:21:8: note: suggested alternative: 'EEPROM_h'
   if ( EEPROM.read(EEPROM_DSR) == 0xFF ) {                              //invalid DSR (i.e. virgin Uno EEPROM or invalid DSR filename)?
        ^~~~~~
        EEPROM_h
APEDSK99_012s-E-init:25:3: error: 'EEPROM' was not declared in this scope
   EEPROM.get( EEPROM_DSR, DSRtoload );                                  //get DSR filename from EEPROM
   ^~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-E-init.ino:25:3: note: suggested alternative: 'EEPROM_h'
   EEPROM.get( EEPROM_DSR, DSRtoload );                                  //get DSR filename from EEPROM
   ^~~~~~
   EEPROM_h
APEDSK99_012s-E-init:26:8: error: 'SD' was not declared in this scope
   if ( SD.exists(DSRtoload) ) {                                         //does it exist? ...
        ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-E-init.ino:26:8: note: suggested alternative: 'SDA'
   if ( SD.exists(DSRtoload) ) {                                         //does it exist? ...
        ^~
        SDA
APEDSK99_012s-E-init:44:10: error: 'SD' was not declared in this scope
     if ( SD.exists( nameDSK[ii] ) ) {                                   //does DOAD exist?
          ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-E-init.ino:44:10: note: suggested alternative: 'SDA'
     if ( SD.exists( nameDSK[ii] ) ) {                                   //does DOAD exist?
          ^~
          SDA
APEDSK99_012s-E-init:64:3: error: 'pinAsInputPullUp' was not declared in this scope
   pinAsInputPullUp(TI_INT);                                             //from Ethernet SS to detecting TI Interrupts
   ^~~~~~~~~~~~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-F-FD1771cmd.ino: In function 'void loop()':
APEDSK99_012s-F-FD1771cmd:1:6: error: redefinition of 'void loop()'
 void loop() {
      ^~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\sketch_apr21a.ino:24:6: note: 'void loop()' previously defined here
 void loop() {
      ^~~~
APEDSK99_012s-F-FD1771cmd:8:11: error: 'isHigh' was not declared in this scope
   while ( isHigh(TI_INT) ) {                                                          //... concentrate on GAL "write to DSR RAM" signal
           ^~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-F-FD1771cmd.ino:8:11: note: suggested alternative: 'isDigit'
   while ( isHigh(TI_INT) ) {                                                          //... concentrate on GAL "write to DSR RAM" signal
           ^~~~~~
           isDigit
APEDSK99_012s-F-FD1771cmd:27:16: error: 'SD' was not declared in this scope
         DSKx = SD.open( nameDSK[currentDSK], FILE_WRITE );                            //open SD DOAD file
                ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-F-FD1771cmd.ino:27:16: note: suggested alternative: 'SDA'
         DSKx = SD.open( nameDSK[currentDSK], FILE_WRITE );                            //open SD DOAD file
                ^~
                SDA
APEDSK99_012s-G-AD99cmd:22:20: error: 'SD' was not declared in this scope
             DSKx = SD.open( nameDSK[currentDSK], FILE_WRITE);                                             //open DOAD file to change write protect status
                    ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:22:20: note: suggested alternative: 'SDA'
             DSKx = SD.open( nameDSK[currentDSK], FILE_WRITE);                                             //open DOAD file to change write protect status
                    ^~
                    SDA
APEDSK99_012s-G-AD99cmd:37:22: error: 'SD' was not declared in this scope
               DSKx = SD.open( nameDSK[currentDSK], FILE_READ );                                           //yes; prep DOAD
                      ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:37:22: note: suggested alternative: 'SDA'
               DSKx = SD.open( nameDSK[currentDSK], FILE_READ );                                           //yes; prep DOAD
                      ^~
                      SDA
APEDSK99_012s-G-AD99cmd:113:24: error: 'SD' was not declared in this scope
                 DSKx = SD.open( nameDSK[currentDSK], FILE_WRITE );                                        //yes; safe to rename
                        ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:113:24: note: suggested alternative: 'SDA'
                 DSKx = SD.open( nameDSK[currentDSK], FILE_WRITE );                                        //yes; safe to rename
                        ^~
                        SDA
APEDSK99_012s-G-AD99cmd:149:15: error: 'SD' was not declared in this scope
               SD.remove( DOADfullpath );                                                                  //yes; delete DOAD from SD card
               ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:149:15: note: suggested alternative: 'SDA'
               SD.remove( DOADfullpath );                                                                  //yes; delete DOAD from SD card
               ^~
               SDA
APEDSK99_012s-G-AD99cmd:165:17: error: 'ftp' was not declared in this scope
           if ( !ftp.connect(ACFG.ftpserver, ACFG.ftpuser, ACFG.ftpass) ) {                                //if we can't connect to FTP server ...
                 ^~~
APEDSK99_012s-G-AD99cmd:175:15: error: 'ftp' was not declared in this scope
               ftp.store( DOADfilename, DSKx );                                                            //send DOAD to ftp server
               ^~~
APEDSK99_012s-G-AD99cmd:184:22: error: 'SD' was not declared in this scope
               DSKx = SD.open( "/_FT", FILE_WRITE );                                                       //... as we are opening a temporary FTP file
                      ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:184:22: note: suggested alternative: 'SDA'
               DSKx = SD.open( "/_FT", FILE_WRITE );                                                       //... as we are opening a temporary FTP file
                      ^~
                      SDA
APEDSK99_012s-G-AD99cmd:185:15: error: 'ftp' was not declared in this scope
               ftp.retrieve( DOADfilename, DSKx );                                                         //get DOAD from FTP server
               ^~~
APEDSK99_012s-G-AD99cmd:206:16: error: 'SD' was not declared in this scope
           if ( SD.exists(DOADfilename) ) {                                                                //does new DSR exist?
                ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:206:16: note: suggested alternative: 'SDA'
           if ( SD.exists(DOADfilename) ) {                                                                //does new DSR exist?
                ^~
                SDA
APEDSK99_012s-G-AD99cmd:207:13: error: 'EEPROM' was not declared in this scope
             EEPROM.put( EEPROM_DSR, DOADfilename );                                                       //yes; update DSR info in EEPROM ...
             ^~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:207:13: note: suggested alternative: 'EEPROM_h'
             EEPROM.put( EEPROM_DSR, DOADfilename );                                                       //yes; update DSR info in EEPROM ...
             ^~~~~~
             EEPROM_h
APEDSK99_012s-G-AD99cmd:240:16: error: 'SD' was not declared in this scope
           if ( SD.exists( DOADfilename ) ) {                                                              //does folder exist? ...
                ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:240:16: note: suggested alternative: 'SDA'
           if ( SD.exists( DOADfilename ) ) {                                                              //does folder exist? ...
                ^~
                SDA
APEDSK99_012s-G-AD99cmd:268:24: error: 'SD' was not declared in this scope
                 DSKx = SD.open( nameDSK[currentDSK], FILE_READ );                                         //open DOAD
                        ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:268:24: note: suggested alternative: 'SDA'
                 DSKx = SD.open( nameDSK[currentDSK], FILE_READ );                                         //open DOAD
                        ^~
                        SDA
APEDSK99_012s-G-AD99cmd:322:23: error: 'SD' was not declared in this scope
               SDdir = SD.open( "/" );                                                                     //... openening root folder
                       ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:322:23: note: suggested alternative: 'SDA'
               SDdir = SD.open( "/" );                                                                     //... openening root folder
                       ^~
                       SDA
APEDSK99_012s-G-AD99cmd:362:21: error: 'SD' was not declared in this scope
             SDdir = SD.open( DSKfolder );                                                                 //yes; open directory
                     ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:362:21: note: suggested alternative: 'SDA'
             SDdir = SD.open( DSKfolder );                                                                 //yes; open directory
                     ^~
                     SDA
APEDSK99_012s-G-AD99cmd:399:20: error: 'SD' was not declared in this scope
             DSKx = SD.open( "/CALLhlp.txt", FILE_READ );                                                  //first run, open help file
                    ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:399:20: note: suggested alternative: 'SDA'
             DSKx = SD.open( "/CALLhlp.txt", FILE_READ );                                                  //first run, open help file
                    ^~
                    SDA
APEDSK99_012s-G-AD99cmd:416:20: error: 'SD' was not declared in this scope
             DSKx = SD.open( "/tilcchar.bin", FILE_READ );                                                 //first run, open definition file
                    ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:416:20: note: suggested alternative: 'SDA'
             DSKx = SD.open( "/tilcchar.bin", FILE_READ );                                                 //first run, open definition file
                    ^~
                    SDA
APEDSK99_012s-G-AD99cmd:445:22: error: 'SD' was not declared in this scope
               DSKx = SD.open( nameDSK[currentDSK], FILE_WRITE );
                      ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:445:22: note: suggested alternative: 'SDA'
               DSKx = SD.open( nameDSK[currentDSK], FILE_WRITE );
                      ^~
                      SDA
APEDSK99_012s-G-AD99cmd:457:18: error: 'SD' was not declared in this scope
           DSKx = SD.open( nameDSK[0], FILE_READ );                                                        //expect ACFG.DSK mapped to DSK1
                  ^~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:457:18: note: suggested alternative: 'SDA'
           DSKx = SD.open( nameDSK[0], FILE_READ );                                                        //expect ACFG.DSK mapped to DSK1
                  ^~
                  SDA
APEDSK99_012s-G-AD99cmd:506:11: error: 'EEPROM' was not declared in this scope
           EEPROM.put( EEPROM_CFG,  ACFG );                                                                //save configuration struct to EEPROM
           ^~~~~~
C:\Users\Ricky\Documents\Arduino\sketch_apr21a\APEDSK99_012s-G-AD99cmd.ino:506:11: note: suggested alternative: 'EEPROM_h'
           EEPROM.put( EEPROM_CFG,  ACFG );                                                                //save configuration struct to EEPROM
           ^~~~~~
           EEPROM_h
exit status 1
'pinAsInput' was not declared in this scope


This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
"

Link to comment
Share on other sites

That was weird I was working on adding this and the whole atariage went down giving me a  503 service error.

 

@JJBOkay I had to move around your library files and delete some already installed libraries and got it to show different errors now and found that you had already created the sketch, I was creating a new sketch as I'm not all that familiar with programming controllers. Maybe I on the wrong Arduino IDE for this build? I did try uploading what I had but all that worked was the 32k.

 

"

Arduino: 1.8.19 (Windows 10), TD: 1.58, Board: "Arduino Uno WiFi"

C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-C-global_suppfnc.ino: In function 'boolean prepDSK()':
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-C-global_suppfnc.ino:103:56: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
   Acatpy( DOADfilename, sizeof(DOADfilename), ".DSK", 4);                                             //stick default file extension at the back
                                                        ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-C-global_suppfnc.ino: In function 'void CALLstatus(byte)':
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-C-global_suppfnc.ino:132:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
     writeCBuffer( 2, 18, "\0", 0, true, false, '\0' );
                                                     ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-C-global_suppfnc.ino: In function 'byte readFATts()':
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-C-global_suppfnc.ino:233:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-F-FD1771cmd.ino: In function 'void loop()':
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-F-FD1771cmd.ino:19:23: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if ( newFD1771cmd = ( currentFD1771cmd != lastFD1771cmd ) ) {                     //new or continue previous FD1771 command?
          ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:6:22: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
       if ( newA99cmd = (currentA99cmd != lastA99cmd) ) {                                                  //new or continue previous APEDSK99 command?
            ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:48:63: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
               writeCBuffer( 1, 11, "\0", 0, true, false, '\0' );                                          //read/save filename characters in CALL buffer
                                                               ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:64:70: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
                 writeCBuffer( 12, 15, "PRG", -12, false, false, '\0' );                                   //must be "PRG"; write to CALL buffer
                                                                      ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:204:64: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
           Acatpy( DOADfilename, sizeof(DOADfilename), ".DSR", 4);                                         //stick extension at the back
                                                                ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:270:66: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
                 writeCBuffer( 18, 28, "\0", 0, true, false, '\0' );                                       //read/save DSK name characters in CALL buffer
                                                                  ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:279:73: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
                 writeCBuffer( 3, 12, "<no map>", -3, false, false, '\0' );                                //DSK not mapped
                                                                         ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:304:76: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
                 writeCBuffer( 18, 27, "t=     f=", -18, false, false, '\0' );
                                                                            ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:338:60: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
                     if ( !Acomp(DOADfilename, 9, "SYSTEM~1") ) {                                          //skip SD system folder
                                                            ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:374:64: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
               writeCBuffer( 11, 21, "\0", 0, true, false, '\0' );                                         //write TI DSK name to CALL buffer
                                                                ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:382:70: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
               writeCBuffer( 23, 28, "S/ D/", -23, false, false, '\0' );
                                                                      ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:404:61: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
             writeCBuffer( 1, 30, "\0", 0, true, false, '\0' );
                                                             ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:421:61: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
             writeCBuffer( 0, 32, "\0", 0, true, false, '\0' );                                            //... yes, write next chunk of 32 definition bytes to CALL buffer
                                                             ^
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:206:11: warning: this statement may fall through [-Wimplicit-fallthrough=]
           if ( SD.exists(DOADfilename) ) {                                                                //does new DSR exist?
           ^~
C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s-G-AD99cmd.ino:216:9: note: here
         case 104:                                                                                         //reset current DSR ( ADSR(), ARST() )
         ^~~~
In file included from C:\Users\Ricky\Downloads\APEDSK99-APEDSK99_current\Arduino\APEDSK99_012s\APEDSK99_012s.ino:3:0:
C:\Users\Ricky\Documents\Arduino\libraries\SdFat\src/FreeStack.h: At global scope:
C:\Users\Ricky\Documents\Arduino\libraries\SdFat\src/FreeStack.h:39:12: warning: 'int FreeStack()' defined but not used [-Wunused-function]
 static int FreeStack() {
            ^~~~~~~~~
C:\Users\Ricky\Documents\Arduino\libraries\arduino-NTP\src\NTP.cpp: In member function 'bool NTP::begin()':
C:\Users\Ricky\Documents\Arduino\libraries\arduino-NTP\src\NTP.cpp:32:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
C:\Users\Ricky\Documents\Arduino\libraries\arduino-FTP\FTP.cpp: In member function 'uint16_t FTP::waitServerCode(char*)':
C:\Users\Ricky\Documents\Arduino\libraries\arduino-FTP\FTP.cpp:274:33: warning: invalid conversion from 'char*' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
    buffLen += cClient.read(buff + buffLen, len);
                            ~~~~~^~~~~~~~~
In file included from C:\Users\Ricky\Documents\Arduino\libraries\arduino-FTP\FTP.h:5:0,
                 from C:\Users\Ricky\Documents\Arduino\libraries\arduino-FTP\FTP.cpp:18:
C:\Users\Ricky\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Client.h:35:15: note:   initializing argument 1 of 'virtual int Client::read(uint8_t*, size_t)'
   virtual int read(uint8_t *buf, size_t size) = 0;
               ^~~~
C:\Users\Ricky\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\new.cpp: In function 'void* operator new(std::size_t, std::nothrow_t)':
C:\Users\Ricky\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\new.cpp:59:60: warning: unused parameter 'tag' [-Wunused-parameter]
 void * operator new(std::size_t size, const std::nothrow_t tag) noexcept {
                                                            ^~~
C:\Users\Ricky\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\new.cpp: In function 'void* operator new [](std::size_t, const std::nothrow_t&)':
C:\Users\Ricky\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\new.cpp:68:63: warning: unused parameter 'tag' [-Wunused-parameter]
 void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept {
                                                               ^~~
C:\Users\Ricky\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\new.cpp: In function 'void operator delete(void*, const std::nothrow_t&)':
C:\Users\Ricky\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\new.cpp:103:55: warning: unused parameter 'tag' [-Wunused-parameter]
 void operator delete(void* ptr, const std::nothrow_t& tag) noexcept {
                                                       ^~~
C:\Users\Ricky\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\new.cpp: In function 'void operator delete [](void*, const std::nothrow_t&)':
C:\Users\Ricky\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\new.cpp:106:57: warning: unused parameter 'tag' [-Wunused-parameter]
 void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept {
                                                         ^~~
Sketch uses 29850 bytes (92%) of program storage space. Maximum is 32256 bytes.
Global variables use 1449 bytes (70%) of dynamic memory, leaving 599 bytes for local variables. Maximum is 2048 bytes.
An error occurred while uploading the sketch


This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
"

Edited by RickyDean
added content
Link to comment
Share on other sites

Those warnings shouldn't prevent uploading the sketch and the amount of program and dynamic memory left is similar with what I get:

 

Sketch uses 29248 bytes (90%) of program storage space. Maximum is 32256 bytes.
Global variables use 1435 bytes (70%) of dynamic memory, leaving 613 bytes for local variables. Maximum is 2048 bytes.

 

That seems to indicate you are using the right version of libraries.

 

But I do see "An error occurred while uploading the sketch" which could be a comms problem. Have you tried a to upload an example sketch (Files / Examples) to see if the upload mechanism works?

 

Also, would you be able to send me a link with info on the type of Arduino you are using?

 


 

Link to comment
Share on other sites

21 hours ago, JJB said:

But I do see "An error occurred while uploading the sketch" which could be a comms problem. Have you tried a to upload an example sketch (Files / Examples) to see if the upload mechanism works?

 

Also, would you be able to send me a link with info on the type of Arduino you are using?

 


 

Here are some scans of the UNO and package it came in from China. No I have only tried to load this sketch as I'm not that familiar with programming these devices. Usually if I don't have explicit instructions, I find it difficult to program them correctly, UNO, teensy, STM32, Beagle Bone, Pico, etc.

 

Here's where I got it from.

https://www.aliexpress.us/item/3256802811531752.html?spm=a2g0o.order_list.order_list_main.5.21ef1802jSY3o1&gatewayAdapt=glo2usa

 

 

scan0001.jpg

scan.jpg

Uno.jpg

Edited by RickyDean
Link to comment
Share on other sites

I noticed your board is set to "Arduino UNO WiFi" in the IDE but I'm pretty sure the board you purchased is a vanilla R3 without WiFi. I reckon that if you change the board to "Arduino Uno" (see below) you should be good to go:

image.thumb.png.c7ef2ae00f6ce91dd70ccebfdd2bd72d.png

 

 

 

Link to comment
Share on other sites

@JJB I took and restarted the IDE and tried to load and program, still got the error. I then closed the sketch, quit the IDE, and unzipped the Apedsk99 stuff over the other files. I then tried to upload and program and still got the error. I then tried just to upload the sketch and it did so. Then leaving it connected to my laptop I walked into the computer room and hooked the APEDSK up to the TI, went into TI Basic and typed in the CALL AHLP and I got the correct response with your info. So it is working, it just won't let me upload and program it to the ATMega328P AVR.

 

How do I set up the IDE to correctly load and program the booloader and files to the AVR. I did, after compiling, save the compiled binary, and both hex files, bootloader and the other are in the folder with your sketch files?

Link to comment
Share on other sites

Just was going to ask if you have anything selected there; mine has no selection:

image.thumb.png.ec519f4c6164a24ed687536cc3d9e6d5.png

But I don't think it will make a difference as long as you use the "Upload" option. From the Arduino Wiki:

 

The programmer selection is not used when:

  • Compiling your sketch (for example, when clicking Verify button Verify).
  • Uploading without a programmer, by clicking the Upload button Upload button.

But you said "So it is working, it just won't let me upload and program it to the ATMega328P AVR." In other words when you use "Upload" it works but when you use "Upload using programmer" it doesn't? The whole idea behind "Upload" is to use the resident bootloader to act as a programmer and make it simple for anyone to program a device. The bootloader does use space so with an external programmer you can remove the bootloader and have more space for your code but the whole process is a bit more complex for novices.

 

 

Link to comment
Share on other sites

5 hours ago, JJB said:

Just was going to ask if you have anything selected there; mine has no selection:

image.thumb.png.ec519f4c6164a24ed687536cc3d9e6d5.png

But I don't think it will make a difference as long as you use the "Upload" option. From the Arduino Wiki:

 

The programmer selection is not used when:

  • Compiling your sketch (for example, when clicking Verify button Verify).
  • Uploading without a programmer, by clicking the Upload button Upload button.

But you said "So it is working, it just won't let me upload and program it to the ATMega328P AVR." In other words when you use "Upload" it works but when you use "Upload using programmer" it doesn't? The whole idea behind "Upload" is to use the resident bootloader to act as a programmer and make it simple for anyone to program a device. The bootloader does use space so with an external programmer you can remove the bootloader and have more space for your code but the whole process is a bit more complex for novices.

 

 

That may be where I have an issue then. I'm was assuming that I needed to program this sketch into the machine, so I've played around with the programmer, because upload for me wasn't persistent, at least I thought it wasn't, for after the pulling it from the laptop, it wouldn't run from just the Apedsk. I may have overwritten the boatloader. From the sketch menu after I verified and compiled the sketch I saved the compiled part to the sketch, one is called a bootloader and smaller and one called larger which must be the rest of the code. Can I take my TL866 Minipro and burn that bootloader, if so at which address should I start it. Then what address should be the start address to burn the other larger .hex file.

hexfiles.jpg

Edited by RickyDean
Link to comment
Share on other sites

I only programmed an Arduino bootloader using another Arduino (some excellent online tutorials for this). You should be able to use your TL866 as well but I haven't tried that. 

Link to comment
Share on other sites

Well getting there slowly, the first part came in to build this unit: The Uno board

Sadly, the 64K ram chip, most likely will not arrive until the first week of June from China.

The rest of the parts should come in by tomorrow (the shield board) and monday/tuesday (the sockets, 74 logic chips, caps, resistors)

 

 

PXL_20240425_173323727.jpg

  • Like 4
Link to comment
Share on other sites

Well, I got everything in to build my APEDSK99 unit up, except for the 64k ram chip, but at least I going to solder everything together and I should be able to program the UNO and setup the sdcard at least and do the modding needed on the Shield part, as I wait for someday the ram chip to come from china which might be in a month or so from now.

 

But the soldering on Shield is crap, some leftover flux, and one of header pins got bent as it was NOT packaged well at all, just in a thin bubble wrap no foam or box. @RickyDean and @JJB let me know any tips or suggestions before I start assembling this beast.

 

PXL_20240426_202740871.jpg

PXL_20240426_214047026.jpg

PXL_20240426_214055331.jpg

PXL_20240426_214102719.jpg

PXL_20240426_214108141.jpg

Edited by Gary from OPA
photos and more text
  • Like 2
Link to comment
Share on other sites

The biggest things I would suggest, place and solder the edge card connector first, then when you are reaqplace the wires from the edge connector to the pin holes, that you do the odd side pins 1-43 first and then be sure on the even side, that the odd side wires are down low to the board. Then place a length of shrink wrap, cut lengthwise and about 4mm wide, along the top of those wire solder points, then strap it down with 3 or 4 of the even side wires before you set down in earnest on soldering the even side. This will retain the cover over the odd wire solder points, preventing short possibilities and you can get a clean look.. Do this before placing the sockets and risers or anything else.

 

If you look at mine you see the bottom looks pretty good but on the top it was harder to maneuver my soldering iron, making for a un even soldering experience. Other than that enjoy!!

Edited by RickyDean
added content
  • Like 4
  • Thanks 1
Link to comment
Share on other sites

In addition to my assembling instructions on GitHub:

 

I initially used a fixture to get those riser connectors straight but I found that by eyeballing it, tagging 1 pin in place and if necessary correct slightly by wiggling and heating the solder on that pin the (straight) results are similar. Once you get it straight tack a couple of others and then solder the rest properly. The reason to tack (quickly solder) is to prevent the riser to float and lift from the board when the solder makes its way through the via. The final step would be to properly re-solder the tacked pins.

 

Yes those Ethernet shields are not the greatest quality unfortunately but I guess the price makes up for it. Once cleaned up a bit and assembled they work fine.

Link to comment
Share on other sites

  • 4 weeks later...

I finally had a chance today, to get some TI99 retro work done and was able to complete the soldering and assembly for the APEDSK99 project.

 

Next step is to test it out and see what can be improved in the software to make it more useful for other 99ers.

PXL_20240528_193449441.jpg

PXL_20240528_193454713.jpg

PXL_20240528_193516017.jpg

  • Like 3
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...