Jump to content
IGNORED

Michtron v3.0 BBS Software?


DarkLord

Recommended Posts

Also, since there was an error in the reminder... the clarification is that the BBS Community Zoom chat is TONIGHT, March 15th at 8pm eastern.

 

(The www.ataribbs.com/zoomchat link is always the best official source)

 

The meetings are always the 1st Sunday of the month at 3pm eastern and the 3rd Friday of the month at 8pm eastern.  While we do sometimes have some off-schedule working sessions we've done a pretty good job of making sure to always have the regular ones as scheduled.

 

Link to comment
Share on other sites

@Techman Maybe I need to look a bit further or in the morning with a fresh pair of eyes but I got a strange thing going on .
Maybe you have an aha moment when I describe it

 

From the mainmenu I do a gosub FileXfer

 

FileXfer:;

    else if(k == 'U')
        {
        print("Upload\n");
        if(user_var1 == 0)                  /*   Fantastic ASCII        */
          {
             list("\\bbs\\upload.msg");
          }
        if(user_var1 == 1)             /*   Atari ST VT52     */
          {
             execute("UPLDV52.MCL");
          }        
        uploadmenu();
        }

When the user_var1 == 1 (user selected VT52) , I jump to execute UPLDV52.MCL
which basically contain print statements with embedded VT52 coloring sequences.
at the end of this MCL file I have a return;

However it seems to jump back to the Main menu loop instead of staying in the while (1) FileXfer loop ?
Is there a different proper way to return from an executed MCL ?

 

Link to comment
Share on other sites

Does the language use a "return" statement?

 

With BBS Express! ST, any GOSUB command I issue has to have an accompanying RETURN statement as well.

 

For example:

 

INPUT GAME_CHOICE 2 NORETURN
   IF GAME_CHOICE = 1
      GAME_TO_PLAY = 'MORIA - ST!'
      GOSUB GAME_LOG
      EXECUTE 'C:\BBS\MORIA\MORIA.COM'

 

GAME_LOG:
OPEN ('[LOG_FILE]', APPEND)
FPRINTE '           At &23, &01 played [GAME_TO_PLAY]'
CLOSE
RETURN

 

Link to comment
Share on other sites

Yes it does and I have a return; statement at the end of my MCL script.

To clarify the nested structure in the MAIN.M file
 

MainMenu:;            /* define a main label */
while(1)            /* while forever */
{  

    k = prompt("Main Menu:",p$);
    if(k == 'W')
          {
        /* show welcome msg */
        print("welcome\n");
        list("\\bbs\\welcome.msg");
        } 
    else if(k == 'F')
        {
        /* call file transfer subroutine */
        print("File transfer\n");
        gosub FileXfer;
        }
}

 

As such a bit further in the MAIN.M there is the FileXfer subroutine

 

* FileXfer Menu this is how we interact with the file xfer system.
*/


FileXfer:;            /* define a label */
while(1)            /* loop forever */
{
    k = prompt("File Transfer:",p$);
    if(k == 'L')
        {
        /* list download */
        print("Listing of files\n");
        listdownload();
        }
    else if(k == 'U')
        {
        print("Upload\n");
        if(user_var1 == 0)              
          {
             list("\\bbs\\upload.msg");
          }
        if(user_var1 == 1)       
          {
             execute("UPLDV52.MCL");
             print("After executing UPLDV52.MCL \n");
          }        
        uploadmenu();
        }
    else if(k == 'M')
        {
/*
here is the return from this routine the "return" command returns to
the place of the last gosub command. I.e. called from the above loop.
and the whole thing starts again.
*/
        print("Main menu\n");
        return;
        }
}


If thus in the File menu, the user presses U and user_var1 is set at 1 this means the user has selected VT52 and thus I execute a seperate MCL file containing the print statements with VT52 escape sequences embedded

 

print(r$,i$,"    :                                                               : ",n$,b$,"\n");
uploadmenu();
print("After uploadmenu\n");
return;
print("After return in UPLDV51.MCL \n");


2 behaviours I have noticed

    else if(k == 'U')
        {
        print("Upload\n");
        if(user_var1 == 0)                  /*   Fantastic ASCII        */
          {
             list("\\bbs\\upload.msg");
          }
        if(user_var1 == 1)             /*   Atari ST VT52     */
          {
             execute("UPLDV52.MCL");
             print("After executing UPLDV52.MCL \n"); WHEN USER_VAR=1 this line is never printed
          }        
        uploadmenu(); THIS GETS ONLY EXECUTED WHEN USER_VAR1=0
        }

As such I have included it into the MCL file

print(r$,i$,"    :                                                               : ",n$,b$,"\n");
uploadmenu();
print("After uploadmenu\n"); THIS LINE GETS PRINTED
return;
print("After return in UPLDV51.MCL \n"); THIS LINE DOESN'T GET PRINTED

 

Link to comment
Share on other sites

No matter what I put after the execute MCL it never gets LOL "executed"

        if(user_var1 == 1)             /*   Atari ST VT52     */
          {
             execute("UPLDV52.MCL");
             no matter which statement I put here it never is reached
          } 

 

From what I gather from the manual and the VAN_NEST examples and things I tried

goto FileXfer doesn't work since I am already inside the FileXfer subroutine
return does what the manual says and return right to the point after the last gosub,in other words since the last gosub to FileXfer was inside the Main subroutine, it will jump back to the Main and not stay in the loop of FileXfer
break is not applicable since I'm inside an IF statement

so looks like I will need to follow the VAN_NEST example and create a seperate MCL for the FileXfer which then executes MAIN.M when wanting to exit the FileXfer MCL.
But that is an overhaul I'm not going to do today.

So currently choosing upload or download in the File area menu will jump back to the Main menu after completion.

Link to comment
Share on other sites

Programming languages are so different, it amazes me sometimes.  :)

 

Here, I can't do multiple "IF" commands, it has to be an initial "IF",

then each following command has to be "EF".

 

This all has to be completed with an "ENDIF" command or it fails.

 

I wish I could help you more but I'm laser focused into BBS Express! ST's language

and have little to no experience outside of it.

 

Link to comment
Share on other sites

17 hours ago, Lastic said:

No matter what I put after the execute MCL it never gets LOL "executed"

        if(user_var1 == 1)             /*   Atari ST VT52     */
          {
             execute("UPLDV52.MCL");
             no matter which statement I put here it never is reached
          } 

 

From what I gather from the manual and the VAN_NEST examples and things I tried

goto FileXfer doesn't work since I am already inside the FileXfer subroutine
return does what the manual says and return right to the point after the last gosub,in other words since the last gosub to FileXfer was inside the Main subroutine, it will jump back to the Main and not stay in the loop of FileXfer
break is not applicable since I'm inside an IF statement

so looks like I will need to follow the VAN_NEST example and create a seperate MCL for the FileXfer which then executes MAIN.M when wanting to exit the FileXfer MCL.
But that is an overhaul I'm not going to do today.

So currently choosing upload or download in the File area menu will jump back to the Main menu after completion.

 

Execute, overlays the current MCL program, so control moves to the new MCL and never returns.

 

What you can do, is use one of the variables to tell the module what to do.

 

/* in main */

z = 10

execute(“new.mcl”)

 

if(z == 10)

{

  /* do 10 stuff */

  execute(“menu.mcl”)

}

else if(z == 11)

{

  /* do 11 stuff */

  execute(“menu.mcl”)

}

else

{

  /* do default stuff */

}

 

 

However looking at what you are doing, does the list(“filewithvt52.txt”) not work?

 

 

 

 

Edited by Techman
Link to comment
Share on other sites

3 hours ago, Techman said:

 

Execute, overlays the current MCL program, so control moves to the new MCL and never returns.

 

What you can do, is use one of the variables to tell the module what to do.

 

/* in main */

z = 10

execute(“new.mcl”)

 

if(z == 10)

{

  /* do 10 stuff */

  execute(“menu.mcl”)

}

else if(z == 11)

{

  /* do 11 stuff */

  execute(“menu.mcl”)

}

else

{

  /* do default stuff */

}

 

 

However looking at what you are doing, does the list(“filewithvt52.txt”) not work?

 

 

 

 

There lies the issue, currently I'm jumping in MAIN.M via a gosub to FileXfer which has it's own while(true) loop .
I guess in the long-run it would be better to put all menu items into a seperate MCL and execute them from MAIN.M and have an execute MAIN.MCL in them to return to the Main menu MCL.

 

It's also a bit more logic on the practical side, if you want to make changes to a menu item , it sits in it's own MCL and hence can be modified/compiled independently from the MAIN.MCL
If I'm correct you could then whilst the BBS is running force a reload of MAIN.MCL and tadaah instant changes whilst remaining online.
Off course currently I have to stop the BBS, start UIP , do a transfer of my changed source-files, compile them and restart the BBS.

(if I want to check the results on something other than the console)


the somethingVT52.M uses variables which are assigned to the corresponding escape sequence.
for ex Foreground color red r$ = \eb2.
These are then used in a print statement to color the text.
I picked this up from the VAN NEST example on the Demo disk.

As such when viewing them in a VT52 capable terminal emulator , they will display the color.


When I put the \e sequences into a txt file and use the list function it won't translate them just put them on the screen literally.

list_VT52_TXT.thumb.png.639cb777d5461098dd9da9e3bc43731b.png

These is no easy way around it, I have outgrown the MAIN.M demo example and will need to make seperate MCL files.

It is what you do in every programming language , instead of having a huge main program and jumping around inside it to go to subroutines, put the subroutines into seperate files.
And it will make my MAIN.M also a bit more readable 🤣

Link to comment
Share on other sites

1 hour ago, Techman said:

Replace the \e in your file with character 27 (0x1b), if your editor can’t do that then post process it.

Super that works, that might be actually the solution to the question I just asked in my Birth of a BBS topic also .

In my editor , Sublime, I need to use a special character (non visible in normal view) <01xb> , but I could "borrow" from an ANS file .

Edited by Lastic
Link to comment
Share on other sites

13 hours ago, Lastic said:

I guess in the long-run it would be better to put all menu items into a seperate MCL and execute them from MAIN.M and have an execute MAIN.MCL in them to return to the Main menu MCL.

 

That's exactly what I do with DarkForce!. When a user is at the Main Menu and chooses a selection, it leaves MAINMENU.COM and executes a separate script.

 

Afterwards, when the user is done with that choice, it's script will execute MAINMENU.COM again.

 

MAINMENU.COM itself has no code to launch the separate scripts for each choice, but rather Express assigns them to keypresses in the SYSEDIT program.

 

EOF:
CLOSE
DEFAULT_PATH
EXECUTE ('C:\BBS\MENUS_80\MAINMENU.COM')
EXIT

 

Link to comment
Share on other sites

3 hours ago, Lastic said:

Another argument for splitting into seperate files, my MAIN.M was 739 lines long and MCL complained at line 736 Program too long 😂

LOL that’s getting up there. It’s not so much the lines. It’s the amount of code.

 

I think a return of exit out of an MCL file loads MAIN.MCL, let me check that. I don’t remember.

Link to comment
Share on other sites

5 hours ago, Lastic said:

Another argument for splitting into seperate files, my MAIN.M was 739 lines long and MCL complained at line 736 Program too long 😂

 

My CDROM.COM script here is pretty big. Actually, it's -3- files. You enter all 3 script filenames into the compiler at once. It compiles, passing

all variables from the 1st script to the rest. Express's MUSTER.XES file, which activates the first hour after 12am, is a maintenance script (jobs

like file backups, running files like "Today in History", "Who's called" etc) is huge. I have daily, weekly, and monthly jobs in it.

 

It's 584 lines. The CDROM script for the Crawly Crypt Archives holds the high place of honor here though - it's 767 lines. Ugh.  :)

 

Does Michtron's MCL language have a variable limit? Express is limited to 100 variables and even though it seems unlikely, I have at least

a couple of scripts that I have to juggle variables in because it kept running out. Nasty that.

 

Link to comment
Share on other sites

Regarding Maintenance I have been thinking about that also.

I have a Nano Pi running a script to check if the Public IP has changed and that sends me a text message to my mobile.

I was actually thinking of doing a similar thing for backups and maintenance and knowing when a new user has logged on.

Have the Nano Pi run a script that telnets into the BBS as a Sysop/Maintenance user and download the important files.

It's a bit of a shame that the BlueSCSI's raspberry Pico Pi W does not allow for some kind of remote access.
Otherwise I could remote copy over the entire hda file and have a full backup of the entire disk by copying one file.


Now off course I could lift the harddisk cover (it's not screwed down) and pull the SD card out, it's hot-swappable so ...
Put it into a PC , copy the file done but yeah a script off course means I don't have to remember to do that on a routine basis.

Now if a new user logs on he/she will stay into Unregistered status until I notice it and manually bump the status to Registered.

ACTIVITY.BBS is a text logfile so I could

telnet into the BBS and download the file regurarely
scrape it for new users with a Bash/Python script
and have a notification send to me via text message or e-mail if a user needs to be validated

That's what I currently have in mind for maintenance/backups/etc

Link to comment
Share on other sites

I'm running software from dyndns.org that updates if there's an IP change. I rarely have those though.

 

I've got it running on my Linux box. It's a "daemon" that just polls the IP address every 5 minutes IIRC,

and then notifies dyndns.org.

 

I've got the Lightning ST mod (USB, hot swappable), so whenever I need to do backups I just stick an

SD-card into a reader, plug it into the USB port/cable that comes out of the ST and use Kobold for some

really fast file backups. I keep the backups on a dedicated SD-card, a folder in my Win10 box and finally,

in a folder on my Kubuntu Linux laptop. I supposed, for even better security I should keep an updated

archive stored off-site.  :)

 

I really love Kobold. I mean, I back up my entire C drive, which is just under 512megs in size, with a few

hundred folders and literally around 5-6000 files. Drag 'n drop with regular TOS is very slow compared

to Kobold's amazing speed.

 

Express, from it's status screen (sitting idle with no caller) puts up a flag/message whenever there is a

new user, but yeah - you have to turn the monitor on to see it.

 

About your Mega STe removable hard drive bay cover, there's a 3d printable replacement that is setup for

dual SD-card slots for an internal Ultrasatan. I've got it in mine. I need to redo it with a closer color but

I like it.

 

Here's a picture:

 

MegaSTe-Dell27InchMonitor.thumb.JPG.5e0f2e40929d88dd7489031763bb77a8.JPG

 

 

Link to comment
Share on other sites

I actually inherited a 3D printer from a friend this weekend, still needs a bit of love since it has been standing still for a few years.

If you recall where you found the 3D design for that cover , I would be interested, could tune it to house the BlueSCSI and have the SD-card sticking out also.

Link to comment
Share on other sites

On another note @Techman how is reviving your ST going ?
Looks like you got your hands on a lot of new hardware recently, still hope you are able to recover your original data from your harddisk.
And off course also hope you get to enjoy the real machine again.

Link to comment
Share on other sites

14 hours ago, Lastic said:

Regarding Maintenance I have been thinking about that also.

I have a Nano Pi running a script to check if the Public IP has changed and that sends me a text message to my mobile.

I was actually thinking of doing a similar thing for backups and maintenance and knowing when a new user has logged on.

Have the Nano Pi run a script that telnets into the BBS as a Sysop/Maintenance user and download the important files.

It's a bit of a shame that the BlueSCSI's raspberry Pico Pi W does not allow for some kind of remote access.
Otherwise I could remote copy over the entire hda file and have a full backup of the entire disk by copying one file.


Now off course I could lift the harddisk cover (it's not screwed down) and pull the SD card out, it's hot-swappable so ...
Put it into a PC , copy the file done but yeah a script off course means I don't have to remember to do that on a routine basis.

Now if a new user logs on he/she will stay into Unregistered status until I notice it and manually bump the status to Registered.

ACTIVITY.BBS is a text logfile so I could

telnet into the BBS and download the file regurarely
scrape it for new users with a Bash/Python script
and have a notification send to me via text message or e-mail if a user needs to be validated

That's what I currently have in mind for maintenance/backups/etc

I just had an Eureka moment when smoking my cigarette on my terrace (bad habit but good for Eureka moments)

If I create a maintenance user with a specific userflag, I could have him telnet into the BBS and skip all the logon screens, wall etc ...
At work we use telnet scripts which rely on the returned prompt of the network device , I could do exactly the same to navigate through the menus , get into a Sysop shell and start a download of the ACTIVITY.BBS file.

And from there on the file sits on a Linux machine and I can grep away as much as I want to search for the strings

New user registered: Guest
New user (just looking) Random

and have the Linux script send me some sort of notification, thus even when I'm not sitting behind the console , I will get some sort of notification.

And I could use this for other purposes also .

Link to comment
Share on other sites

18 hours ago, Lastic said:

I actually inherited a 3D printer from a friend this weekend, still needs a bit of love since it has been standing still for a few years.

If you recall where you found the 3D design for that cover , I would be interested, could tune it to house the BlueSCSI and have the SD-card sticking out also.

 

Pretty sure this is the one I used:

 

https://www.thingiverse.com/thing:5179717

 

  • Thanks 1
Link to comment
Share on other sites

7 hours ago, Lastic said:

On another note @Techman how is reviving your ST going ?
Looks like you got your hands on a lot of new hardware recently, still hope you are able to recover your original data from your harddisk.
And off course also hope you get to enjoy the real machine again.

Machine is working, the hard drive is dead, but I am not too worried about it. I have a ATSCSI to SD board with a bootable SD with stuff on it, and then I am building the BBS on the MB and then copying to the ST.            

  • Like 1
Link to comment
Share on other sites

Thought of the morning whilst waiting on my work-meeting to start ...

Is there a way to launch .TOS .PRG files from within Michtron BBS ?
or launch the MCL.TTP from within Michtron BBS ?

And unrelated to the BBS, Michtron (DOS) Shell , does anybody have a copy of it ?

Link to comment
Share on other sites

11 hours ago, Lastic said:

Thought of the morning whilst waiting on my work-meeting to start ...

Is there a way to launch .TOS .PRG files from within Michtron BBS ?
or launch the MCL.TTP from within Michtron BBS ?

And unrelated to the BBS, Michtron (DOS) Shell , does anybody have a copy of it ?

 

No, because of the multi-tasking layer, we never added the ability to exec .prog/.tos files from inside.

 

 

Link to comment
Share on other sites

Not MBBS related, but I am blown away by greaseweazle, I have recovered a dozen floppies that were not readable on the native machines. What was really impressive is that I was able to I image amiga disks and mount the image in a Linux box. And another thing, was I had an 800K (10 sector) disk, read it with atarist mode, corrupt data, used ibm mode and _everything was there (different sector sequencing).

 

Impressed.

  • Like 1
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...