Jump to content

AtariGeezer

Members
  • Content Count

    3,127
  • Joined

  • Last visited

Posts posted by AtariGeezer


  1. 45 minutes ago, skr said:

    Do I understand correctly, that all I need is an ESPxx connected to the SIO support and your software? That´ll be cool, as this would be a very simple and inexpensive solution.

    I´m already testing my ESP with Mr. Atari´s LiteDos, which in general works, but I need to make a better SIO-plug for it. Right now I´ve just loosely soldered four wires directly to the SIO-port... ;)

    I think this is the latest diagram for the Esp32.

     

    AtariWiFi GPIO Table - ESP32.pdf


  2. I've already beaten that horse to death in this thread and the other about the talking points.

     

    Let's just move forward on this :)

     

    Two things I haven't mentioned is that while connected to a BBS, you can go back into command mode by temporarily pressing the Flash/Program Button. The Blue LED will indicate this :)

     

    Also in the works is accessing a WiFi Enabled Printer ;)

     

    • Like 1

  3. This is the latest project for the Atari that I've Been working on.

    The Atari Wifi Modem (or #AtaWiModem for short).

    Currently supports Full 850 Emulation with internal Booter and Handler code.


    Works with many terminal programs such as Amodem, BobTerm and the Express! Cart
     (Which I highly recommend).  The Express! Cart can handle 9600 Baud rather reliably
    where other terminal programs can not do.

     

    After booting the Fuji Board, press <Return> and you'll be shown a "->" Prompt.
    From here you can type "HELP" or "AT?" (Without Quotes) to display two different menus.

    The "SCAN" command will show you a list of nearby WiFi Access Points,  this list will
    show you the [Channel], (Signal Level), SSID and either an asterisk "*" if the connection
    is Secure or "!" if it is Open.

     

    You can then type "NET# (Number on List)" followed by an <optional> Password depending upon
    the AP having a Secure or Open connection.  You can also just type "PASS (Your Password) to
    store the Password temporarily.

     

    #AtaWiModem also has a PhoneBook to store your favorite BBS #'s that can be displayed by
    the "ATL" command.

     

    As shown in the pictures below, you can see some of the screens that are used.

     

    For the 850 Emulation, the next thing I'll be testing is File Transfers and then Add and Test
    BBS Support from AMIS, Express, Express Pro, FoReM and FoReM XEP.  This should cover most
    types of BBS's used on the Atari 8-Bits.

     

    After the 850 Emulation is fully tested,  I'll finish the Client side of TNFS.

     

    One feature I'll be adding soon is #IRC Chat 🙂

     

    Other protocols that can be easily added would be POP3, IMAP and SMTP email support.
    (I already have these coded on Windows using the WinSock API's...)

     

    Jay

     

    AtaWiModem0.jpg

    AtaWiModem0a.jpg

    AtaWiModem1.jpg

    AtaWiModem2.jpg

    AtaWiModem3.jpg

    AtaWiModem.ino.esp32.bin AtaWiModem.ino.esp32thing.bin

    • Like 11

  4. On 12/25/2019 at 11:59 AM, tschak909 said:

    Part of the work I am planning to do outside of the "D:" emulation, focuses on the following aspects:

     

    * Creating a new N: device for TCP and UDP communication

    * Creating an R: device that actually implements a proper device, instead of just dumping into R-Verter mode.

     

    -Thom

     

    I'll post my source code after you do this :)


  5. Guys, Here's a bit of code to wet your appetite :)  This will help you in getting rid of that state machine...

     

    
    void Handle_SIO() {
      byte nDev   = 0;
      byte nCmd   = 0;
      byte Aux1   = 0;
      byte Aux2   = 0;
      byte ChkSum = 0;
      int  nRtn   = 0;
    
      if (SerSIO.available() > 0) {
        nRtn = SerSIO.readBytes(&SIO_CmdFrame, 5);
        if (nRtn == 5) {
          long time = micros();
    
          // Wait For COMMAND to go HIGH
          while ((digitalRead(CMD_PIN) == LOW) && ((micros() - time) < 600)) {
            yield();
          }
          SIO_CmdLineLow = false;
    
          //InvertBuffer(&SIO_CmdFrame, 4)
          ChkSum = Calc_SIO_Checksum(SIO_CmdFrame, 4);
          if (ChkSum != SIO_CmdFrame[4]) {
            return;
          }
    
          nDev = SIO_CmdFrame[0];
          nCmd = SIO_CmdFrame[1];
          Aux1 = SIO_CmdFrame[2];
          Aux2 = SIO_CmdFrame[3];
          SerBUG.print("SIO_CmdFrame -> ");
          SerBUG.print(nDev, HEX);
          SerBUG.print(",");
          SerBUG.print(nCmd, HEX);
          SerBUG.print(",");
          SerBUG.print(Aux1, HEX);
          SerBUG.print(",");
          SerBUG.print(Aux2, HEX);
          SerBUG.print(",");
          SerBUG.print(R_Dev.BootFlg, HEX);
          SerBUG.print(",");
          SerBUG.println(R_Dev.PollCnt, HEX);
    
          if (nCmd == '?') { // POLL COMMAND?
            Process_RDev_GetBootParms(Aux1, Aux2); // (Type 1/2 Poll command)
          } else {
            R_Dev.PollCnt = 26;
    
            if ((R_Dev.BootFlg != 0xFF) && (nDev == 0x31)) {
              //SerBUG.println("DDev");
              switch (nCmd) {
                case 'S': // $53 Get PSEUDO DISK STATUS
                  Process_DDev_Status(Aux1, Aux2);
                  break;
                case 'R': // $52 Get Byte(s)
                  Process_DDev_Read(Aux1, Aux2);
                  break;
                default:
                  R_Dev.BootFlg = 0;   // Set Boot Flag Minus
                  Send_SIO_Response(NAK); // Issue a (N)ak Response
                  break;
              }
              return;
            }
          }
    
          switch (nDev) {
            case 0x50: // R1:
            case 0x51: // R2:
            case 0x52: // R3:
            case 0x53: // R4:
              Process_R_Dev(nDev, nCmd, Aux1, Aux2);
              break;
            case 0x58: // W1: WiFi Modem
              Process_W_Dev(nDev, nCmd, Aux1, Aux2);
              break;
            case 0x70: // N1: Network Device (TNFS)
              Process_N_Dev(nDev, nCmd, Aux1, Aux2);
              break;
            default:
              break;
          }
        } else {  // Error Occured
          if (nRtn < 1) {
            // Serial Error
          } else {
            // Less Than 5 Bytes Received
          }
        }
      } else {
        if (R_Dev.Concurrent) {     // Drop Out of Concurrent Mode
          R_Dev.Concurrent = false;
        }
      }
    }

     

    • Like 1

  6. On 12/27/2019 at 7:41 PM, Kyle22 said:

    Nice! How about high speed R: and N: Handler?

     

    Last night I was able to use the Express cart to call your BBS using the fujunet board, but at 19200 baud it looses data, not sure if a ring / circular buffer would help or not.  One solution might be an accellerated E: handler?

     

    Also, can you update my account on your BBS? Guess I haven't called enough :)

     


  7. 4 hours ago, tschak909 said:

    Part of the work I am planning to do outside of the "D:" emulation, focuses on the following aspects:

     

    * Creating a new N: device for TCP and UDP communication

    * Creating an R: device that actually implements a proper device, instead of just dumping into R-Verter mode.

     

    -Thom

     

    My sketch that has 850 Emulation and the TNFS Client now compiles and the 850 Emulation now loads the Booter and R: Handler perfectly :)

    Shouldn't be too much longer before I call Kyle's BBS soon 😃

    • Like 1

  8. TLS 1.2 is currently supported in the SSL libs that also works on the NodeMCU boards.

     

    Soon after I finish the Full TNFS Client (should just be on the Atari side with the N: Handler and demo program),  my next objective is to make a TNFS Server that could be ran on the FujiiNet Board with the built-in SD Card.  So it shouldn't be much of a problem adding a SSL wrapper on that :)

     

    The Great and Powerful mOZz has graciously sent one of his boards my way too :)

    • Like 5

  9. This is what I'm using for TNFS:

    void Process_N_Dev(byte nDev, byte nCmd, byte Aux1, byte Aux2) {
    
      switch (nDev) {
        case 0x70:
          switch (nCmd) {
            case 'S': // 
              Process_NDev_Status(Aux1, Aux2);
              break;
            case 'M': // 
              Process_NDev_Mount(Aux1, Aux2);
              break;
            case 'U': // 
              Process_NDev_UnMount(Aux1, Aux2);
              break;
            case 'O': // 
              Process_NDev_OpenDir(Aux1, Aux2);
              break;
            case 'R': // 
              Process_NDev_ReadDir(Aux1, Aux2);
              break;
            case 'C': // 
              Process_NDev_CloseDir(Aux1, Aux2);
              break;
            case 'K': // 
              Process_NDev_MakeDir(Aux1, Aux2);
              break;
            case 'V': // 
              Process_NDev_RemoveDir(Aux1, Aux2);
              break;
            case 'o': // 
              Process_NDev_Open(Aux1, Aux2);
              break;
            case 'r': // 
              Process_NDev_Read(Aux1, Aux2);
              break;
            case 'w': // 
              Process_NDev_Write(Aux1, Aux2);
              break;
            case 'c': // 
              Process_NDev_Close(Aux1, Aux2);
              break;
            case 's': // 
              Process_NDev_Stat(Aux1, Aux2);
              break;
            case 'l': // 
              Process_NDev_LSeek(Aux1, Aux2);
              break;
            case 'd': // 
              Process_NDev_UnLink(Aux1, Aux2);
              break;
            case 'm': // 
              Process_NDev_ChgMode(Aux1, Aux2);
              break;
            case 'n': // 
              Process_NDev_Rename(Aux1, Aux2);
              break;
            case 'Z': // 
              Process_NDev_Size(Aux1, Aux2);
              break;
            case 'F': // 
              Process_NDev_Free(Aux1, Aux2);
              break;
          }
          break;
      }
    }

     

    • Like 1

  10. void _cio_open(void)
    {
      char *p=(char *)OS.ziocb.buffer;
    
      // remove EOL
      p[OS.ziocb.buflen-1]=0x00;
    
      // Scoot buffer past the N:
      p+=2;
    
      // Copy into packet
      strcpy(packet,p);
      
      // I am ignoring the aux1/aux2 for this test, and simply assuming the open parameters.
    
      OS.dcb.ddevic=0x70; // Network card
      OS.dcb.dunit=1;     // device unit 1
      OS.dcb.dcomnd='c';  // Do a connect
      OS.dcb.dstats=0x80; // Write connect request to peripheral.
      OS.dcb.dbuf=&packet; // Packet
      OS.dcb.dbyt=256;     // packet size
      OS.dcb.dtimlo=0x1F; // Timeout
      OS.dcb.daux=0;      // no aux byte
      siov();
    
      // Clear buffer
      memset(&packet,0x00,sizeof(packet));
      
      ret=err=OS.dcb.dstats;
    }

    The code above is what would be used from the user side of opening a device, not useful in the Handler...

    Think I posted some code of the SX-212 handler in the Sio2wifi thread...

    • Like 1

  11. 6 hours ago, mytek said:

    Everyone benefits when there is an open dialogue and people share what they've discovered. I believe that AtariGeezer has benefited by the open nature of my 1088XEL project, and how I've 'shared' all aspects of such. Maybe it's time to pay it forward :) .

     

    Just to be clear,  I have helped him out here and there pointing out errors in his code and when he asked for help on SIO Timings,  I posted the notes that I took from the Atari Hardware Manual.  I won't give him code he doesn't understand and I won't be posting code for every little function or procedure that I create along the way.  I will however post code for my project when it's working the way I intend it to.

     

    You've heard the old adage: "Give a man a fish and he'll eat for a day,  Teach a man to fish and he'll eat for life". 

    He needs to start fishing...

    • Thanks 1
×
×
  • Create New...