Jump to content
tschak909

#FujiNet - a WIP SIO Network Adapter for the Atari 8-bit

Recommended Posts

30 minutes ago, mozzwald said:

Heh, whoops.. they shift the other direction, sorry :D

Thank goodness! Whew! :) 

 

30 minutes ago, mozzwald said:

the problem with swapping empty slots is that you would always have to swap 8 slots even if you only have 2 disk inserted. Lots of wasted button presses.

I agree with this 100%. For instance, if I’m playing a 2-disk Infocom adventure, I’ll put a 3rd ATR in D3: as a save disk. So if I’m playing the game, disk 2 of the set is generally rotated down to the D1: slot for the game to read data. When it’s time to save, one press of the A button will move the save disk to D1:, and disk 2 of the game back to the D3: slot. When the save is complete and it’s time to play again, it’s only two presses to move the game’s disk 2 back the D1: slot. It’s not at all desirable from my perspective to have to rotate through a bunch of empty slots and try to remember whether I’ve pressed the button 5 times or that 6th or 7th press registered correctly ...

 

If some WANTS to rotate through empty slots and comes up with a really good reason to do it that way, I’d suggest the CONFIG utility come with a way to turn unused, empty slots off before booting the Atari to avoid that behavior for those of us who don’t need or want to rotate through empty slots. 

Share this post


Link to post
Share on other sites

One of the reasons why I'm keen on patching multi-disk titles into single ATRs (with save areas where necc.)

  • Like 1

Share this post


Link to post
Share on other sites

Just tested: For Infocom games, the Atari ZIP seems to have an interesting bug. It does status  for drives and stops at the first one it doesn't find. It does this silently during boot.

 

If you try to e.g. load Deadline into D1 and D2, and put your save disk into D4, the game will gladly accept your user input for drive 4 (As it says, 1-8), but it will for some reason try to access SIO device $30 (D0: which does not exist), which of course, fails.

 

This seems to happen on every infocom disk I've tested. grrr...

 

Share this post


Link to post
Share on other sites

Yep, there's a mistake in the code as its AND'ing the selected drive with 3 when it should be 7 (edit: although that would excluded 8 as well :D)
So a patch could be to NOP that out

 

        LDX    #$11
        JSR    out_string    ; Insert SAVE disk,
        JSR    flush_buffer
        LDA    #$12
        STA    SaveMenuNum
        JSR    ShowSaveOption
        STA    DefaultSavePos
        JSR    char_to_buf
        LDA    #0
        STA    SaveMenuNum
        JSR    ShowSaveOption
        TAX    
        AND    #3
        STA    CurrentDrive
        TXA    
        STA    SelectedDrive
        JSR    char_to_buf
        JSR    flush_buffer
        LDA    #<str_PressReturn
        STA    ptr1
        LDA    #>str_PressReturn
        STA    ptr1+1
        LDX    #$18
        JSR    loc_0_23BB    ; Press    RETURN to continue

 

Edited by Wrathchild
  • Like 1

Share this post


Link to post
Share on other sites
2 hours ago, DrVenkman said:

I agree with this 100%. For instance, if I’m playing a 2-disk Infocom adventure, I’ll put a 3rd ATR in D3: as a save disk. So if I’m playing the game, disk 2 of the set is generally rotated down to the D1: slot for the game to read data. When it’s time to save, one press of the A button will move the save disk to D1:, and disk 2 of the game back to the D3: slot. When the save is complete and it’s time to play again, it’s only two presses to move the game’s disk 2 back the D1: slot. It’s not at all desirable from my perspective to have to rotate through a bunch of empty slots and try to remember whether I’ve pressed the button 5 times or that 6th or 7th press registered correctly

It's only an issue with one way rotation.

Having theoretically both left and right would allow to keep consistency and rotate full set to get very image to D1, not only ones left from the "gap" drive. 

There are two issues, yours and one I mentioned, which can't be addressed both with oneway rotation.

With A and B it would be logical to use for rotations, with printing function (or what it was) with both pressed or sth else. It's more natural to handle printing stuff via www than managing drives. 

In the end you need to enable PC to print it anyway. 

 

But I understand the authors have their own philosophy and sometimes it's hard to change it. 

FujiNet rocks in each case 🙂

Share this post


Link to post
Share on other sites
59 minutes ago, Wrathchild said:

Yep, there's a mistake in the code as its AND'ing the selected drive with 3 when it should be 7 (edit: although that would excluded 8 as well :D)
So a patch could be to NOP that out

 

        LDX    #$11
        JSR    out_string    ; Insert SAVE disk,
        JSR    flush_buffer
        LDA    #$12
        STA    SaveMenuNum
        JSR    ShowSaveOption
        STA    DefaultSavePos
        JSR    char_to_buf
        LDA    #0
        STA    SaveMenuNum
        JSR    ShowSaveOption
        TAX    
        AND    #3
        STA    CurrentDrive
        TXA    
        STA    SelectedDrive
        JSR    char_to_buf
        JSR    flush_buffer
        LDA    #<str_PressReturn
        STA    ptr1
        LDA    #>str_PressReturn
        STA    ptr1+1
        LDX    #$18
        JSR    loc_0_23BB    ; Press    RETURN to continue

 

Yup, once again bitten by legacy brain damage. Basically, it only works for drives 1-3.

-Thom

Share this post


Link to post
Share on other sites

and I think I actually need to make something very clear. (Don't worry, I'll repeat it, ad nauseum)

I have my opinions on how things should go in this project.

 

But it's not my project.

 

It belongs to all of us.

 

If anybody wants to passionately bring forth a point, do it. 

 

And if anybody contributes code, it meant you gave a shit about it enough to provide working code. We will fold it in.

 

There is no one true way in this project. It's why we built the damned thing so open ended. I have NO idea what other people will do with it; what they will come up with, nor should I _ever_ explicitly limit what can be done with it. Who am I to do so? I am one of you.

 

-Thom

  • Like 3
  • Thanks 1

Share this post


Link to post
Share on other sites

Since there is control of audio line, simply beep count the active drive number or have SAM say it.

 

Edited by Kyle22
clarity
  • Like 2

Share this post


Link to post
Share on other sites

 

4 minutes ago, Kyle22 said:

Since there is control of audio line, simply beep count the active drive number or have SAM say it.

 

....................................................... *blink*

dude

seriously

that

is

fucking

brilliant!

 

-Thom

  • Like 1

Share this post


Link to post
Share on other sites
1 minute ago, tschak909 said:

 

....................................................... *blink*

dude

seriously

that

is

fucking

brilliant!

 

-Thom

ThanQ

 

Share this post


Link to post
Share on other sites

Hello guys

 

Just a thought: You could either skip empty slots or skip the first empty slot in a row.

 

Skip empty slots:

 

D1, D2, D4 -> D2, D4, D1 -> D4, D1, D2 -> D1, D2, D4

 

Skip first empty slot in a row of empty slots:

 

D1, empty slot, D4, D5 -> empty slot, D4, D5, D1 -> D5, D1, empty slot, D4 -> D1, empty slot, D4, D5

 

I can't come up with a reason to do so, other than being able to rotate through all the assigned slots without going through all the slots.  But I have never used software that needed more than one drive at the same time either.

 

Sincerely

 

Mathy

 

  • Like 1

Share this post


Link to post
Share on other sites
1 minute ago, Mathy said:

Hello guys

 

Just a thought: You could either skip empty slots or skip the first empty slot in a row.

 

Skip empty slots:

 

D1, D2, D4 -> D2, D4, D1 -> D4, D1, D2 -> D1, D2, D4

 

Skip first empty slot in a row of empty slots:

 

D1, empty slot, D4, D5 -> empty slot, D4, D5, D1 -> D5, D1, empty slot, D4 -> D1, empty slot, D4, D5

 

I can't come up with a reason to do so, other than being able to rotate through all the assigned slots without going through all the slots.  But I have never used software that needed more than one drive at the same time either.

 

Sincerely

 

Mathy

 

I'm gonna let my brain chew on that. ;)

 

  • Like 2

Share this post


Link to post
Share on other sites
4 hours ago, Kyle22 said:

Since there is control of audio line, simply beep count the active drive number or have SAM say it.

 

#Atari8bit #FujiNet - I think we've come up with a rather novel solution to indicate which disk is active in D1: after a disk swap, what do you think? :) (special thanks to kyle22 for the idea)

 

  • Like 6

Share this post


Link to post
Share on other sites

Good idea! It would say respective number to the FujiNet's power-on state?

It would be nice to have that feature configurable (on/off) in the www admin. 

Share this post


Link to post
Share on other sites

Hello Thom

 

At the moment SAM says "2", which is pretty short.  How about "D2" or maybe even "Disk 2"?

 

Sincerely

 

Mathy

 

 

  • Like 5

Share this post


Link to post
Share on other sites

So, rather than try to scramble to try every little possibility, I've decided to take a different approach:

 

Community involvement! Anybody who wants to tweak and tune this? have at the code. I'll bend over backwards to help you set up so you can.

 

I have extended the function in the firmware to enable/disable SAM features, specifically phonetic mode, speed, and pitch, and allow access to internal values that normally nobody can touch, namely the mouth, and throat values which drastically change SAM's timbre:

https://github.com/FujiNetWIFI/fujinet-platformio/blob/master/lib/utils/utils.cpp#L446

 

And the relevant code which does the actual talking is here:

https://github.com/FujiNetWIFI/fujinet-platformio/blob/master/lib/sio/fuji.cpp#L372

 

If you e.g. want to set phonetic mode:

util_sam_say("<phonetic phrase>",true);

 

A good reference for the phonetic mode (including a large phonetic dictionary complete with numbers) is here:

https://github.com/FujiNetWIFI/fujinet-platformio/wiki/Using-SAM-(Voice-Synthesizer)

 

---

 

Now my thoughts on why I chose what I chose.

 

(1) It's currently in reciter mode, which sets some pretty bland values for things. I did this just to prove a point. Phonetic output would be better. e.g. a function that says the numbers 1-8 in the inflection we want.

 

(2) I deliberately chose the smallest piece of vocal information to impart as much as possible, given the context. "Which slot is now drive 1?" A common failing of voice interfaces is to repeat extra phrasings that are already implied by the context. If a user knows that he's pressing the disk swap button, does SAM really need to say, "Swapped disk to D1." "Swapped Disk to D2." "Swapped disk to D3." over and over? Each of those phrasings takes up to a second each, and they add up. Now, you could of course, time the phrasings and only say the extra bits if the button has been pressed within a certain amount of time, but these are the various things that one has to take into account when designing a voice interface (I have..a lot...of real world experience on this!)

 

Since this was literally a spur of the moment thing out of left field from a user suggestion, I deliberately reduced both the intended consequence and the amount of code needed to implement it to prove the point.

 

---

 

So yes, What I am TRYING to say here, is that it would be awesome if somebody jumped on this and really messed with it. 

  • Like 1

Share this post


Link to post
Share on other sites

I added some bits of code in fuji.cpp, the prompts are now processed phonetically.

/**
 * Say the numbers 1-8 using phonetic tweaks.
 * @param n The number to say.
 */
void say_number(unsigned char n)
{
    switch (n)
    {
    case 1:
        util_sam_say("WAH7NQ",true);
        break;
    case 2:
        util_sam_say("TUW7",true);
        break;
    case 3:
        util_sam_say("THRIY7Q",true);
        break;
    case 4:
        util_sam_say("FOH7R",true);
        break;
    case 5:
        util_sam_say("FAY7V",true);
        break;
    case 6:
        util_sam_say("SIH7KSQ",true);
        break;
    case 7:
        util_sam_say("SEH7VIXN",true);
        break;
    case 8:
        util_sam_say("EY7TQ",true);
        break;
    default:
        Debug_printf("say_number() - Uncaught number %d",n);
    }
}

And...

 

/**
 * Say swap label
 */
void say_swap_label()
{
    // DISK
    util_sam_say("DIH3SKQ ",true);
}

 

@Mr Robot had the great idea of using the Q glottal stop to enforce a slight pause.

 

Now sounds like: 

 

-Thom

  • Like 9
  • Thanks 2

Share this post


Link to post
Share on other sites

Much nicer 👍 . Way more understandable.

 

  • Like 2

Share this post


Link to post
Share on other sites

I tuned all the words in the end using a sam on my macsam.wav

For contrast, here is the mac's built in speech synth kate.wav

 

How far we have come!

 

  • Like 2

Share this post


Link to post
Share on other sites

It's amazing isn't it, really uncanny valley, you almost can't tell its fake any more, they are so close.

 

  • Like 1

Share this post


Link to post
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.

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...