For anyone who is building the firmware:

Can you:

(1) make sure you've upgraded to latest ESP-IDF
(2) make sure you've fixed dirent.h as here: https://gist.github.com/tschak909/1ad20 … fde9dac2c3
(3) delete your copy of the sdkdefaults.fujinet-v1
(4) pull the latest fujinet-platformio
(5) clean
(6) build

and make sure that the fujinet completely initializes?

I had to make a change to sdkdefaults to tweak static memory allocation parameters, with the latest ESP-IDF framework, and would like a few more pairs of eyes to see if things are still ok after the latest change.

https://github.com/FujiNetWIFI/fujinet- … 595de011a1

52

(893 odpowiedzi, napisanych Scena - 8bit)

FujiNet connected demos :)

we're trying to find ways to make it more useful, without vastly increasing the memory footprint.

Gibstov will put it up on GitHub shortly, so hopefully everybody will run with it, but for now, you can load it on #FujiNet by connecting to atari-apps.irata.online and mounting neon.atr in the Networking folder :)

-Thom

Pin napisał/a:
bocianu napisał/a:

Więc w zasadzie mamy pierwszy internetowy browser na Atari ;) Można go zobaczyć w akcji tutaj:

Po pierwsze drugi (po Contiki), a po drugie to jeśli to jest na Fujinet i dalej na UDP i SIO to będzie słabo bo notorycznie wali to błędami, więc można to potraktować co najwyżej w kategorii egzotycznej ciekawostki.

@Bocianu - tak zapytam, bo widzę na fujinet.pl wsad do Floba - flasher sprawdza odczytywane dane, czy zapisuje karta "pa pałę"? :)

Somebody is not paying attention. :)

Neon itself has NO networking or FujiNet code inside it at all. It relies entirely on CIO, so the N: handler provides the networking. Any protocol that N: can handle, Neon can handle.

But go ahead, and keep blabbing about Contiki, something that has had next to zero growth in the last 20 years, and is literally a dead end. :)

-Thom

I am currently working on a set of commands to put the FujiNet into a UDP streaming mode, so that programs and games that need to constantly send and receive data without waiting for the SIO routines can work.

But I need some help on the Atari side:

So basically, when it goes into stream mode, it takes over the entire SIO bus, and an input routine would need to be provided to read the data from the fujinet.

Of course, we have the PROCEED line to tell us when new data comes across.

Does somebody want to put together a set of asm routines that:

(1) Initializes the pokey to the appropriate baud rate (divisor), and installs:
(2) a VPRCED interrupt routine to know when something is ready for receipt
(3) a SERIN interrupt routine to grab the resulting data
(4) a shutdown routine that puts everything back

while I work on the firmware side of things?

-Thom

How about a multi-player version of Scorched Earth? ;) https://www.youtube.com/watch?v=c4hEARQW9C4

57

(2 odpowiedzi, napisanych Sprzęt - 8bit)

xxl napisał/a:

Fujinet sie rozpedza :-)

https://atariage.com/forums/topic/31729 … yone-care/


obsluga filesystemu przeniesiona na urzadzenie, koniec z probelmami roznych FSow Sparty, Dos2, Fatow, koniec z przeladowanymi sterownikami D:

czy opor userow przywiazanych do pewnego dosa wystapi? zobaczymy ;-)

#Atari8bit #FujiNet shown here is an example of what an IMAP adapter for N: would look like, and how it would function, to deal with e-mail boxes at the OS level. https://atariage.com/forums/topic/32000 … nt=4816568

Naprawdę muszę przedstawić argumenty za NOS, i dlaczego byłby to ogromny krok naprzód:

W skrócie, stworzyłoby to ścieżkę, w której można nie tylko zrobić menedżera plików, który działa całkowicie przez sieć, ale może wykorzystać pełną moc ESP32 do abstrakcji operacji systemu plików.

Każdy adapter protokołu dla N: działa całkowicie na samym ESP32 i może być dowolny. Dla systemów plików będą to :

* FTP
* SMB
* HTTP
* TNFS
* NFS
* SCP/SFTP

etc.

Ale można też stworzyć inne adaptery systemu plików, np. adapter DISK, który mógłby być wskazany pośrednio przez slot urządzenia, lub bezpośrednio przez ścieżkę, do (np.) obrazu dysku ATR. Samo ESP32 wykonywałoby całą abstrakcję odczytu i zapisu do ATR; łącznie z zajmowaniem się wszystkimi aspektami systemu plików.

Ta abstrakcja jest krytyczna, ponieważ oznacza, że nie tylko te metody dostępu do systemu plików nie muszą być przykręcone do kodu Atari (co skutkuje znacznie mniejszym MEMLO!), ale oznacza to, że ta abstrakcja zapewnia ścieżkę do odczytu i zapisu z dowolnie sformatowanego obrazu dysku, niezależnie od tego, jaki FMS może być uruchomiony na Atari.

Tak więc są tu dwa zwycięstwa:

(1) NOS, z niskim memlo, który może czytać i pisać do czegokolwiek.
(2) możliwość transparentnego odczytu i zapisu do czegokolwiek, pliku lub obrazu, z dowolnego innego DOSu.

Dlatego właśnie staram się zainteresować ludzi używaniem lub pracą na N:, wiele możliwości nagle otwiera się z tą abstrakcją, dzięki ESP32.

-Thom

59

(0 odpowiedzi, napisanych Programowanie - 8 bit)

Another example of using the #FujiNet from Forth is to do things like view the host or disk slots currently in use. This example focuses on the FLH word, which will display the available host slots.

We start with a set of constants that map to memory locations that SIO uses. These make the code easier to read, and are used by all of the words in the FUJINET vocabulary in Forth:

```forth
SCR # 1
  0 ( #FN SIO CONSTANTS 1 )
  1
  2 BASE @ HEX
  3
  4 VOCABULARY FUJINET
  5
  6 0300 CONSTANT DDEVIC                  0301 CONSTANT DUNIT
  7 0302 CONSTANT DCOMND                  0303 CONSTANT DSTATS
  8 0304 CONSTANT DBUF                    0306 CONSTANT DTIMLO
  9 0307 CONSTANT DRESVD                  0308 CONSTANT DBYT
10 030A CONSTANT DAUX1                   030B CONSTANT DAUX2
11 030A CONSTANT DAUX
12
13 E459 CONSTANT SIOV
14
15 -->
```

We also need screen 3, which provides the (DO-SIOV) word that actually tells the Atari to perform the SIO operation.

```forth
SCR # 3
  0 ( SIOV )
  1
  2 CODE (DO-SIOV)
  3
  4 XSAVE STX,                            ( SAVE X REGISTER )
  5 SIOV JSR,
  6 XSAVE LDX,                            ( REST X REGISTER )
  7 NEXT JMP,                             ( RET TO INTERPRET )
  8
  9
10
11
12
13
14
15 -->
```

We need a place in memory to store the results of our host list, as well as a way to easily retrieve each host slot from this memory. We can do this by specifying a word that gives us these properties, HOST-ARRAY. HOST-ARRAY allocates a 256 byte area of memory, when we create it, and when we use it, it will return the offset for the host slot for which we ask. This is possible because Forth can define words that do one thing when being created, and another while being used. This is a concept called meta-programming. The <BUILDS word allows the programmer to specify what words are to be executed when the definition is compiled, or "built", and DOES> allows the programmer to specify what words are executed when the word is encountered.

```forth
SCR # 70
  0 ( FLH - Data Structures )
  1
  2 : HOST-ARRAY ( 8 entries 32 bytes )
  3       <BUILDS 256 ALLOT      ( 256 Bytes )
  4       DOES>   SWAP 32 * + ;  ( each entry 32 bytes )
  5
  6 ( Create a HOST-ARRAY called FLHBUF )
  7
  8 HOST-ARRAY FLHBUF
  9
10
11
12
13
14
15 -->
```

HOST-ARRAY is defined as a compiler word, and it is immediately used to create a HOST-ARRAY called FLHBUF, which is where the host list will be stored.

the <BUILDS section is straightforward enough, it creates a 256 byte area in which data can be stored. This divides into 8 slots, each holding 32 characters.

The DOES> section, is a bit more involved, as DOES> puts an address which corresponds to the first available byte of data onto the stack, and we then swap the stack around slightly (because it is currently backwards) so that we can multiply that address by (32 * n) with n being the parameter passed in.

This creates a data type that works like this:

```forth
0 FLHBUF . 16304  ( the address in memory of the first host slot )
1 FLHBUF . 16336  ( the address in memory of the second host slot )
2 FLHBUF . 16368  ( the third entry ... and so on )
```

So we have a data type that does all the heavy lifting for us when we want to start reading it.

With this, we can now create a word, (FLH) that reads the host list into our newly created buffer.

```
SCR # 71
  0 ( FLH - Get Host List )
  1
  2 BASE @   HEX
  3
  4 : (FLH)      ( -- )
  5         70 DDEVIC C!
  6         01 DUNIT  C!
  7         F4 DCOMND C!
  8         40 DSTATS C!
  9   0 FLHBUF DBUF   !
10         0F DTIMLO C!
11       0100 DBYT   !
12       0000 DAUX   !
13        (DO-SIOV) ;
14
15 BASE ! -->
```

(FLH) uses the FN SIO constants defined above to make the code easier to read, putting all of the values we need into the device control block (DCB) table in memory.

* DDEVIC is set to $70, which is the SIO device ID for the #FujiNet control device
* DUNIT is set to $01, because we want to refer specifically to device $70
* DCOMND is set to $F4, which is the Get Host Slot List command defined here: ( https://github.com/FujiNetWIFI/fujinet- … Host-Slots )
* DSTATS is $40, which specifies that the Atari is expected to get a payload of data from the FujiNet.
* DBUF is set to the address of the very top of FLHBUF. Since all of the host slots in FLHBUF are contiguous, we just need to specify the top of the buffer, and we can read them all in at once.
* DTIMLO is set to $0F, a standard value meaning to wait 15 seconds for an answer.
* DBYT is set to $0100, which is 256 in hex, meaning we are expecting a payload of 256 bytes from the FujiNet.
* DAUX is set to $0000. It isn't used.

Once these values are set, the (DO-SIOV) word is used to perform the SIO operation.

The (FLH) word does nothing to the stack and outputs nothing. It is purely a procedural word that is needed to get the host list and put it into our buffer.

If we were to peek into the buffer we would see something like this:

```forth
0 FLHBUF 256 CDUMP

3000 SD--------------
3010 ----------------
3020 irata.online----
3030 ----------------
3040 fujinet.online--
3050 ----------------
3060 fujinet.pl------
3070 ----------------
3080 ----------------
3090 ----------------
30A0 ----------------
30B0 ----------------
30C0 ----------------
30D0 ----------------
30E0 ----------------
30F0 ----------------
```

the dashes here represent the null character, and on the Atari they would be represented by the heart character. Since the FujiNet firmware is implemented in C, the strings are null terminated, and the most straightforward way to display the data is to simply not display the null character. We can do this via a conditional that only uses the EMIT word to display the character if it is not null. Here we make a word HEMIT, that does just that:

```forth
SCR # 72
  0 ( FLH - HEMIT word )
  1
  2
  3
  4 ( EMIT, but ignore null chars )
  5
  6 : HEMIT      ( n -- )
  7     DUP      ( because 0= consumes it )
  8     0= IF    ( is char a null? )
  9        DROP  ( yes, drop it. )
10     ELSE     ( otherwise ... )
11        EMIT  ( Display it. )
12     THEN ;   ( Done.)
13
14
15 -->
```

HEMIT, like EMIT expects a single byte number. If that number is 0, nothing is displayed.

```forth
HEMIT 65 Aok
HEMIT 66 Bok
HEMIT 0 ok
```

Upon entering HEMIT, we immediately DUPlicate the number coming in, because 0= will consume it and replace it with a 1 if it matches, or a 0 if it doesn't. IF will consume the 0 or the 1. If the value is 1, then we were passed in a NULL, and the number we previously duplicated is DROPped (if you make a mess, clean it up.), otherwise, we pass that duplicated number to EMIT, which displays it.

With the HEMIT word in hand, we now have everything we need to create a word, .FLH" that will display the name of one host slot. It takes one parameter, the host slot number we wish to display.

```forth
SCR # 73
  0 ( FLH - Display Host slot n )
  1
  2 0 VARIABLE HOSTSLOT   ( Temporary variable for slot )
  3
  4
  5 : .FLH"    ( n -- )
  6     HOSTSLOT C!           ( save n )
  7     32 0 DO
  8        HOSTSLOT C@ FLHBUF ( Beginning of Hostslot )
  9         I +               ( next character )
10         C@                ( Get Character )
11         HEMIT             ( And display it.)
12     LOOP ;                ( Done. )
13
14
15 -->
```

To make this code easier to read (and not have to resort to return stack juggling), a variable called HOSTSLOT is defined, and is set to the parameter passed in. We then set up a loop that first gets the address of the host slot, adds the loop index to it, gets the byte number at that address, and then passes it to HEMIT for printing, then looping back until all 32 characters are printed.

This produces a word that acts like the following:

```forth
(FLH) ok
0 .FLH" SD ok
1 .FLH" irata.online ok
2 .FLH" fujinet.online ok
```

...and so on.

It then becomes a trivial matter to write a simple word that does this for all 8 slots:

```forth
SCR # 74
  0 ( FLH - Display all Host Slots )
  1
  2
  3
  4 : FLH         ( -- )
  5   CR          ( start on new line )
  6   (FLH)       ( Get host slots )
  7   8 0 DO      ( 0 to 7 )
  8       I U. ." : "  ( show slot # )
  9       I .FLH" ( Display host slot I )
10       CR      ( CR )
11   LOOP ;      ( done. )
12
13
14
15 ;S
```

The FLH word starts by using the CR word to make sure that output starts on the next line, otherwise the output would immediately start on the same line as FLH.  The (FLH) word is called to fetch the host list, and a new loop of 8 iterations is done. Inside this loop, the I index variable is used by the U. word to display the current slot number, followed by an inline ." : " to print a colon afterwards. I is then also used as the input for .FLH" to display the value of that host slot. We then make sure to use the CR word again, to move the cursor to the next line, and terminate the loop.

The result looks like this:

```forth
FLH
0 : SD
1 : fujinet.online
2 : atari-apps.irata.online
3 : fujinet.pl
4 : TMA-2
5 : RASPBERRYPI
6 :
7 :
ok
```

At the end of the day we have a word, FLH, built on previous words to output a host list. But this is more than a command, this is a word that is now part of the language. This means it can not only be used interactively, but it can be used from within other words:

```forth
: MYHOSTLIST ." This is my host list: " CR FLH ;
```

And even the individual words that make up FLH can be used in other words. In essence, the language is extended with a set of words that can do meaningful things with the FujiNet.

In the same way, other words can be added, extending the capabilities of the environment. This is part of what attracted some people to Forth, its unique ability to solve problems by extending the language.

-Thom

#Atari8bit #FujiNet FNC-TOOLS został zaktualizowany o obsługę symboli wieloznacznych dla NCOPY, a także o poprawki dla FLS. Zaktualizowano także katalog DOS i ROM-y Ultimate1MB. Wszystko jest na TNFS atari-apps.irata.online w /.

61

(8 odpowiedzi, napisanych Fabryka - 8bit)

Please, somebody attempt making a cartridge version. Why do people WAIT for others to do it?

-Thom

it occurs to me that it should be possible to modify this game for fujinet:

http://www.atarimania.com/game-atari-40 … g_888.html

There is a file version in the homesoft collection that could be used as a starting point.

Basically it would need four things:

(0) a screen to connect to host or listen on port 6502.

(1) send the maze data from player 1 to player 2 (no translation or anything needed, just SIO WRITE the buffer, the other side just SIO READs it into the same place.)

(2) only send joystick changes

(3) automatically select 2 player, and have player 1 select invader or defender.

If I'm right, the result should be highly playable. :)

Thoughts?
-Thom

#Atari8bit to conclude this two part video series, we make the Light Cycles game that we created in part 1, able to be played across the network on another Atari with a #FujiNet. https://youtu.be/D0JIOcIzUL8

#Atari8bit In this video, I show how to write the core logic for a light cycle game. The result is a simple racing against opponent barrier game that is controlled by two joysticks, and will be modified for network in part 2.
https://youtube.com/watch?v=fc289lLSPGI

#Atari8bit My 7yo daughter and I finish playing a game of Othello over #FujiNet. Her #Atari #XEGS is upstairs, and my 1200XL is downstairs. Video is from my 1200XL. https://youtu.be/R5L8MqW_BYY

Wrzuciłem kopię reversi.atr do fujinet.pl. Ładuje ona automatycznie grę. Jeśli grasz jako słuchacz (gracz 1) upewnij się, że przekazałeś port TCP 6502.

#Atari8bit W tym filmie, pokazuję jak wziąć istniejącą grę, "Roman Checkers" (Sears, 1979), jedną z najwcześniejszych gier BASIC, i przekonwertować ją do gry przez #FujiNet używając N: handler i standardowych oświadczeń I/O.

https://youtube.com/watch?v=ROxa8N8SE_o

#Atari8bit Teraz, gdy obsługa i kod sieciowy działają na tyle dobrze, że można ich używać do tworzenia gier, musimy spróbować przekonwertować istniejącą grę turową na #FujiNet. Oto potencjalna, konkurencyjna gra turowa oparta na wierceniu szybów naftowych.
https://youtube.com/watch?v=oeImwNKp-yY

#Atari8bit Jakiś programista montażowy? Ktoś chce pomóc w obsłudze CIO #FujiNet'a?

Są trzy kwestie, z którymi potrzebuję pomocy, ponieważ pracuję po stronie firmware'u (ESP32).

Dodaj obsługę Binary Load File
https://github.com/FujiNetWIFI/fujinet- … r/issues/1

Dodaj notatkę/punkt obsługi
https://github.com/FujiNetWIFI/fujinet- … r/issues/2

Spraw, by kod mógł być ponownie przeniesiony.
https://github.com/FujiNetWIFI/fujinet- … r/issues/3

Dodaj tryb Burst Mode I/O
https://github.com/FujiNetWIFI/fujinet- … r/issues/4

70

(226 odpowiedzi, napisanych Fabryka - 8bit)

#FujiNet @jeffpiep is checking in the last of the #Atari 822 printing emulation, which provides graphics support! The secret? Using SIO command 'P' instead of the usual 'W', which causes the printer to accept 1 bit per pixel monochrome bitmap data in the same format as a GRAPHICS 8 screen. This was previously undocumented.

---

#FujiNet @jeffpiep sprawdza w ostatniej emulacji druku #Atari 822, która zapewnia wsparcie graficzne! Tajemnica? Użycie polecenia SIO 'P' zamiast zwykłego 'W', które powoduje, że drukarka akceptuje 1 bit na piksel monochromatycznych danych bitmapy w tym samym formacie co ekran GRAPHICS 8. To było wcześniej nieudokumentowane.

https://i.imgur.com/oa9P4Y2.png

71

(226 odpowiedzi, napisanych Fabryka - 8bit)

2020-03-26 Sprawozdanie o stanie prac:

do programistów swędzących o projekt lub sposób na pomoc: Naprawdę przydałaby mi się pomoc przy próbie zaimplementowania wsparcia dla ATX-a, ponieważ jestem zajęty próbą podparcia innych części kodu.

Ostatni tydzień spędziłem pracując nad kodem TNFS:

* Usuń kod recachingowy, bo to był buggy, w przygotowaniu do refactora.
* Poprawić logikę refactora, żeby zduplikowane pakiety nie powodowały problemów, są ignorowane.
* Refaktor poprawnie obsługuje timeouty i zawiedzie tylko wtedy, gdy wszystkie próby ponownej analizy zakończą się niepowodzeniem.
* Zaimplementować komendę SIO dla polecenia Napisz z weryfikacją (już nie tylko alias dla P).
* Implementuj optymalizację wyszukiwania, poszukuj tylko wtedy, gdy jest to konieczne, zmniejszając w ten sposób znacznie liczbę pakietów uruchomień UDP w trybie round trip dla odczytów liniowych.

Rick Lopez pracował nad kodem R:, rozbierając go na części, aby go zrozumieć, i wprowadzając ulepszenia. Jego obecny zestaw eksperymentów wykorzystuje Altirra R: handler i osadza go w firmware #FujiNet, który jest przekazywany przez sondę typu 1. (Mamy pozwolenie od @phaeron)
Usprawnienia w zakresie buforowania są również starane zrekompensować charakterystycznie małe bufory RX określone przez Atari w trybie równoległym przez większość programów MODEM, starając się uzyskać większość programów modemowych, aby móc pracować z większą prędkością.
Pomysł, który tutaj zaproponowałem, to modyfikacja R: handler, aby wyemitować dodatkową komendę przed komendą STREAM, która zwraca rozmiar żądanej długości bufora IOCB. Może to być użyte jako dodatkowy bufor, wypełniany tylko po opróżnieniu, aby zdławić połączenie nawet przy większych szybkościach transmisji, gdy bufor jest o wiele za mały, aby obsłużyć większe szybkości transmisji.

Przechodzimy dalej przez błoto. :)

72

(226 odpowiedzi, napisanych Fabryka - 8bit)

For anyone who wants to contribute, another easy enhancement is needed to improve TNFS network performance when the cache is off (e.g. during development):

An enhancement ticket:

https://github.com/FujiNetWIFI/atariwifi/issues/165

Given a sector number coming into sio_read():
https://github.com/FujiNetWIFI/atariwif … sk.cpp#L44

Determine if the sector to be read is the very next sector. If yes, DO NOT SEEK, otherwise perform a seek.

Sector size needs to be taken into account, as well (first three sectors 128 bytes, we do not currently account for 256 byte or 512 byte sectors).

For TNFS, this will remove one round trip communication, and speed up network access.

73

(226 odpowiedzi, napisanych Fabryka - 8bit)

#FujiNet używa TNFS, który głównie komunikuje się poprzez UDP. Oznacza to, że oprogramowanie firmware musi być w stanie obsługiwać sieci w mniej niż idealnych warunkach, które mogą powodować timeouty, porzucone pakiety, a nawet duplikaty pakietów.

Ostatni tydzień spędziłem na refaktoringu kodu TNFS, aby go uprościć i zapewnić jedną ścieżkę kodu do wysyłania pakietów, odbierania odpowiedzi i obsługi timeoutów. Pozwoliło mi to lepiej zobaczyć co się dzieje i zmienić logikę retry w ciągu ostatniego półtora dnia, aby uczynić ją bardziej solidną, używając sieci testowej hojnie dostarczonej przez użytkownika, który zbudował swój własny #FujiNet!

Wkrótce pojawi się więcej raportów o stanie!
https://www.youtube.com/watch?v=ULk2Vig7Gts

74

(226 odpowiedzi, napisanych Fabryka - 8bit)

What constraints would you like to know?
-Thom

75

(226 odpowiedzi, napisanych Fabryka - 8bit)

Jeśli ktoś chce pomóc w dostrojeniu wydajności pamięci podręcznej read cache na #FujiNet, spójrz na ten problem:

https://github.com/FujiNetWIFI/atariwifi/issues/162

Wierzę, że odczytywany cache może być bardziej inteligentnie wdrażany jako bufor pierścieniowy, który może być konsekwentnie dołączany w miarę wypychania sektorów. Szczegóły w bilecie, w tym link do kodu źródłowego aktualnej implementacji.