Tillek Posted March 15 Share Posted March 15 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. Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 16 Share Posted March 16 @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 ? Quote Link to comment Share on other sites More sharing options...
+DarkLord Posted March 16 Author Share Posted March 16 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 Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 17 Share Posted March 17 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 Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 17 Share Posted March 17 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. Quote Link to comment Share on other sites More sharing options...
+DarkLord Posted March 17 Author Share Posted March 17 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. Quote Link to comment Share on other sites More sharing options...
Techman Posted March 18 Share Posted March 18 (edited) 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 March 18 by Techman Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 18 Share Posted March 18 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. 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 🤣 Quote Link to comment Share on other sites More sharing options...
Techman Posted March 18 Share Posted March 18 Replace the \e in your file with character 27 (0x1b), if your editor can’t do that then post process it. Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 18 Share Posted March 18 (edited) 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 March 18 by Lastic Quote Link to comment Share on other sites More sharing options...
+DarkLord Posted March 18 Author Share Posted March 18 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 Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 18 Share Posted March 18 Another argument for splitting into seperate files, my MAIN.M was 739 lines long and MCL complained at line 736 Program too long 😂 Quote Link to comment Share on other sites More sharing options...
Techman Posted March 19 Share Posted March 19 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. Quote Link to comment Share on other sites More sharing options...
Techman Posted March 19 Share Posted March 19 Yes, if you exit out of an MCL file, it will reload main.mcl -Tim Quote Link to comment Share on other sites More sharing options...
+DarkLord Posted March 19 Author Share Posted March 19 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. Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 19 Share Posted March 19 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 Quote Link to comment Share on other sites More sharing options...
+DarkLord Posted March 19 Author Share Posted March 19 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: Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 19 Share Posted March 19 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. Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 19 Share Posted March 19 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. Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 19 Share Posted March 19 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 . Quote Link to comment Share on other sites More sharing options...
+DarkLord Posted March 20 Author Share Posted March 20 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 1 Quote Link to comment Share on other sites More sharing options...
Techman Posted March 20 Share Posted March 20 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. 1 Quote Link to comment Share on other sites More sharing options...
Lastic Posted March 20 Share Posted March 20 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 ? Quote Link to comment Share on other sites More sharing options...
Techman Posted March 20 Share Posted March 20 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. Quote Link to comment Share on other sites More sharing options...
Techman Posted March 20 Share Posted March 20 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. 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.