Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.
|
Forum Index : Microcontroller and PC projects : DOS MMBasic 4.0 bug?
Author | Message | ||||
James_From_Canb Senior Member Joined: 19/06/2011 Location: AustraliaPosts: 265 |
I think I've found a bug in DOS MMBasic 4.0. The description for the Input$ command says it should return the carriage return and line feed as separate characters. It looks like it only returns the line feed character (ACSII 10, Hex 0A). It skips over carriage return characters (ASCII 13, Hex 0D) until it finds the next returnable character. If I'm right, it will muck up any programs that read binary data from files, as well as ignoring the line feed in text files. I've written a small data file and edited it with a hex editor so there are various combinations of CR and LF characters at the end of lines. ShowBug.bas reads the bytes from the data file one at a time and identifies any <CR> and <LF> characters. Have I made any obvious mistakes? If it's a bug, has it already been reported? I don't recall seeing anything about it on the forum. 2012-10-10_075635_ShowBug.zip Thanks James My mind is aglow with whirling, transient nodes of thought careening through a cosmic vapor of invention. Hedley Lamarr, Blazing Saddles (1974) |
||||
TassyJim Guru Joined: 07/08/2011 Location: AustraliaPosts: 6098 |
This is not a new feature. MMbasic will stop reading when it finds a ^Z (26 decimal) which is the old end of file marker. There may be other control codes that have undesirable outcomes if you are hoping for binary input. Being able to handle the various line endings and treating them the same can be very handy but I would like to have BINARY file IO as a mode on its own. Jim VK7JH MMedit MMBasic Help |
||||
James_From_Canb Senior Member Joined: 19/06/2011 Location: AustraliaPosts: 265 |
I agree Jim. Binary file IO would be really useful. However, these aren't binary files. I'm helping another member read text files that I suspect originated on a Linux system that only used LF as a line delimiter. The files were then edited in a Windows environment and CR LF pairs were added - sometimes before the LF, sometimes after. The member's DOS MMBasic program reads from these text files and processes each line. The mish-mash of control characters stopped the program working properly, so with a bit of help he wrote another program to correct the control characters. It only identified the LF characters. The DOS MMBasic language Manual says of the INPUT$ function: "Will return a string composed of "nbr" characters read from a file previously opened for INPUT with the file number "fnbr". This function will read all characters including carriage return and new line without translation." (My bolding) Given that it identified the Line Feed (aka new line) character, either MMBasic has a bug, or the manual is wrong. I'll put in a bug report. James My mind is aglow with whirling, transient nodes of thought careening through a cosmic vapor of invention. Hedley Lamarr, Blazing Saddles (1974) |
||||
TassyJim Guru Joined: 07/08/2011 Location: AustraliaPosts: 6098 |
I think its only the DOS MMBasic that has the problem. The DOS version also won't recognise the enter key on my numeric keypad. Not a big problem once you know... Jim VK7JH MMedit MMBasic Help |
||||
panky Guru Joined: 02/10/2012 Location: AustraliaPosts: 1101 |
Hi James, Interesting issue. I ran a series of tests on Duinomite Mega and Maximite SM1 (the original Dontronics one) and DOS MMBasic, all running MMBasic 4. With the data file DATA.TXT, 58 bytes long, loaded on an SD card, SHOWBUG.BAS correctly loads all the characters including 0D's and 0A's without any changes (ie. the full 58 bytes) on both the Duinomite Mega and the Maximite SM1. However, as you have allready discovered, MMBasic drops all the 0D's but keeps all the 0A's. I suspect that this is an issue for Windows/DOS rather than MMbasic but Geof may know more. In my testing, I threw up a few more anomolies: When you XMODEM a file into the Duinomite/Maximite, 1A's are padded onto the end of the file up to the next 128 byte boundary. Don't know if this is TerraTerm XMODEM send or MMBasic XMODEM receive? It gets even more interesting: When I LOAD "DATA.TXT" then SAVE "DATA_1.TXT" on both DM and MM, the resulting file DATA_1.TXT has all 0D's on their own to a 0D0A pair, all 0D0A pairs are left alone and all 0A's on their own are converted to a 0D0A pair! I think I have all the above correct - just keeping track of where a file is and where it came from was a challenge;-) Lastly, just a note, moving files between Windows/DOS and Linux often throws up some unexpected transformations. BTW, I have written a hexdump program to display any file in hex format in 16 hex bytes per line - copy below (still a bit to do on it - it pads out to a full screen with 0's but it may be useful in any testing you do). Cheers, Doug. ' Program to dump a text file to the screen as hex ' - 80 characters per line and pausing each screen ' at 35 lines Start: Line Input "Enter file name to be displayed ? ",FileName$ Option Error Continue Open FileName$ For Input As #1 FExists=0 If MM.ERRNO = 6 Then Print "File does not exist" Option Error Abort Goto Start EndIf Option Error Abort ChrCnt = 0 Do While NOT EOF(#1) For ScreenLines = 1 to 35 ChrCnt$ = Format$(ChrCnt,"%04.0f") Print ChrCnt$ + " "; For CharInLineCount = 1 to 16 InputChar$ = Input$(1,#1) ChrCnt = ChrCnt + 1 InputChar = Asc(InputChar$) HexChar$ = Hex$(Asc(InputChar$)) If Len(HexChar$) = 1 Then hexChar$ = "0" + HexChar$ EndIf If CharInLineCount = 9 Then Print " "; EndIf Print HexChar$ + " "; Next CharInLineCount Next ScreenLines Line Input "Press any key to continue - ",Junk$ Loop End ... almost all of the Maximites, the MicromMites, the MM Extremes, the ArmMites, the PicoMite and loving it! |
||||
panky Guru Joined: 02/10/2012 Location: AustraliaPosts: 1101 |
Jim, I embedded a &H1A (decimal 26) inside a file then tried loading it as per previously above - in the DM, this loads up to the physical ? (logical ?) end of the file, including the 1A previously embedded so it does not appear to filter &H1A's, at least in the DM. I am going to do a bit more testing to se what characters are not accepted. Regards, Doug. ... almost all of the Maximites, the MicromMites, the MM Extremes, the ArmMites, the PicoMite and loving it! |
||||
panky Guru Joined: 02/10/2012 Location: AustraliaPosts: 1101 |
Sorry Guys, I'm a bit like a dog with a bone on this - I'm in a caravan in SA on my way around the world (Oz) with nothing better to do - the missus is in bed and I'm sitting here playing!!! The code below generates a file with 256 bytes, values from &H00 to &HFF. Using my hexdump program above, I read all 256 bytes in correctly, no changes and no skips! This is on a DM running MMBasic 4. Cheers, Doug. ' Program to create a text file with all byte values from 0 to 255 Start: Line Input "Enter file name to be created ? ",FileName$ Option Error Continue Open FileName$ For Output As #1 FExists=0 If MM.Errno = 6 Then Print "File does not exist" Option Error Abort GoTo Start EndIf Option Error Abort For byte_in = 0 To 255 Print #1,chr$(byte_in); Next byte_in Close #1 Error "Data file created" ' no error just the end. ... almost all of the Maximites, the MicromMites, the MM Extremes, the ArmMites, the PicoMite and loving it! |
||||
panky Guru Joined: 02/10/2012 Location: AustraliaPosts: 1101 |
Last post guys honest! When writing a file from DOS MMBasic using PRINT File_number, CHR$(value_0_thru_255)all values from 0 to 255 are written correct EXCEPT &H0A which is translated into the &H0D0A pair (ie. two bytes are written. When reading a file in DOS MMBasic using INPUT$(nbr_chars,file_number), &H0D is dropped (ie. ignored) and &H1A is translated into &H0000 (a pair of nulls). Note that there is no End of File character as such, at least not in the range 0 thru 255. Cheers, Doug. ... almost all of the Maximites, the MicromMites, the MM Extremes, the ArmMites, the PicoMite and loving it! |
||||
TassyJim Guru Joined: 07/08/2011 Location: AustraliaPosts: 6098 |
XMODEM first: "In my testing, I threw up a few more anomolies: When you XMODEM a file into the Duinomite/Maximite, 1A's are padded onto the end of the file up to the next 128 byte boundary. Don't know if this is TerraTerm XMODEM send or MMBasic XMODEM receive?" XMODEM only works in 128 byte blocks and it has no way of knowing the size of the file so it has to pad the end with something. In MMedit XMODEM pads with zeros, not 1A but either seems to be acceptable from my research. In MMEdit I cheated and read the file size from the Maximite and truncate the pad characters off when transferring from the MM to the PC. I was not able to do it the other way (PC to MM) On my W7 64bit PC DOS MMBasic definitely stops at 1A characters when reading using the original test program. Different Windows versions may behave differently which will make fixing it even more fun! Jim VK7JH MMedit MMBasic Help |
||||
panky Guru Joined: 02/10/2012 Location: AustraliaPosts: 1101 |
"On my W7 64bit PC DOS MMBasic definitely stops at 1A characters when reading using the original test program. Different Windows versions may behave differently which will make fixing it even more fun! " Thanks Jim, Same here. I have led myself astray with poor programming! In my little hexdump program, the logic is wrong in that I continue to read characters after an EOF character is received to complete the number of lines of dump to 35. I have confirmed this is also true on the DM. My only consolation is that I believe I have proved the DM does not drop the <LF> &H0D character using the input$ function as happens in DOS MMBasic. Cheers, Doug. PS. I love MMBasic and am in awe of the job Geoff has done but DOS MMBasic is extremely frustrating - no edit and many other weird things different to the MM version - the joys of trying to work with Redmond's product I guess! ... almost all of the Maximites, the MicromMites, the MM Extremes, the ArmMites, the PicoMite and loving it! |
||||
shoebuckle Senior Member Joined: 21/01/2012 Location: AustraliaPosts: 189 |
Panky, May I add your hex dump program to the MM library as others may find it useful? I would also like to offer a small mod which prints the text to the right of the hex codes, replacing any non-display characters with a full stop, in time honoured fashion. |
||||
shoebuckle Senior Member Joined: 21/01/2012 Location: AustraliaPosts: 189 |
Panky, May I add your hex dump program to the MM Library as others may find it useful? I would also like to add a small mod which prints the text to the right of the dump, replacing any non-printable codes with a full stop, in time-honoured fashion. Cheers, Hugh ' Program to dump a text file to the screen as hex
' - 80 characters per line and pausing each screen ' at 35 lines ' Author Panky from The Back Shed forum Oct 2012 Start: Line Input "Enter file name to be displayed ? ",FileName$ Option Error Continue Open FileName$ For Input As #1 If MM.Errno = 6 Then Print "File does not exist" Option Error Abort GoTo Start EndIf Option Error Abort ChrCnt = 0 Do While Not Eof(#1) For ScreenLines = 1 To 35 Text$="" ChrCnt$ = Format$(ChrCnt,"%04.0f") Print ChrCnt$ + " "; For CharInLineCount = 1 To 16 InputChar$ = Input$(1,#1) If Asc(InputChar$) < 32 Then Text$ = Text$ + "." Else Text$ = Text$ + InputChar$ EndIf ChrCnt = ChrCnt + 1 InputChar = Asc(InputChar$) HexChar$ = Hex$(Asc(InputChar$)) If Len(HexChar$) = 1 Then hexChar$ = "0" + HexChar$ EndIf If CharInLineCount = 9 Then Print " "; EndIf Print HexChar$ + " "; Next CharInLineCount Print Text$ Next ScreenLines Line Input "Press any key to continue - ",Junk$ Loop End |
||||
paceman Guru Joined: 07/10/2011 Location: AustraliaPosts: 1329 |
Hi Jim/Panky/James, I confess - I'm the culprit that James has been helping with this issue. I've (actually "we've") written a program to read plain song lyric text (.txt) files, or folders of files, and turn them into time-stamped lyric text (.lrc) files that are readable on my TViX media player - some other players too. The media player can then display synchronised lyrics a line at a time on the TV or monitor so you can sing-along! To get the time-stamping you have to play the song on your PC and hit a key as each line finishes - the MMBasic "timer" function keeps track of time. It's considerably more complicated than that but you get the drift. I'm using DOS MMBasic because all the music and lyrics and places you can download lyrics and the media player, are on my Windows PC and network. It's great being able to use MMBasic with the "System" command on my Windows system because now I can "program" things there in a language I can use. I'm no expert at programming but I'm having fun and I can improve my MMBasic skills for the hardware project things I'm also doing with the standard MMBasic. My PC system is still using Win XP Home (SP2) - (my wife has claimed our new Win 7 gear) - and the issue is there with this, so it's common to 7 & XP apparently. I'm not sure about the 1A "substitute" character but the issue with CR & LF as James described it is certainly there. It's good having some proper programming brains on this - it's gotten a smidge beyond me. BTW I'll be happy to post the code when it's a proper "goer" - it sort of is already actually but only on some .txt files. Greg |
||||
brucepython Regular Member Joined: 19/06/2011 Location: AustraliaPosts: 64 |
I just know that program is going to get me out of trouble one day! Thanks for the effort that went into getting it done. Can I suggest changing the third-last line to the following, purely to allow that legendary "ANY" key to be used. Print "Press any key to continue." : Do While Inkey$="" : Loop Bruce |
||||
rodent59 Newbie Joined: 02/03/2012 Location: AustraliaPosts: 7 |
Hugh, TEXTLOOK.bas, already in the library, does a similar job. Rod. |
||||
shoebuckle Senior Member Joined: 21/01/2012 Location: AustraliaPosts: 189 |
Yes it does, but some may prefer Panky's format. There is just a small addition I would make to Bruce's change... Print "Press any key to continue.";: Do while Inkey$="": Loop
Without the semicolon and subsequent Print, the top line of the next page is lost. Cheers, Hugh |
||||
panky Guru Joined: 02/10/2012 Location: AustraliaPosts: 1101 |
Hugh, Happy to have the program listed although as I said earlier, it still needs a bit of work regarding end of file. It appears possible to write a file with an embedded hex 1A with additional data following that but when read back, terminates at the 1A. As Jim said earlier, it would be nice to have a real byte or binary i/o capability to do away with manipulating string characters with the constraints that offers. I will keep plugging away at improvements and forward them to you as soon as I can. Cheers, Doug. ... almost all of the Maximites, the MicromMites, the MM Extremes, the ArmMites, the PicoMite and loving it! |
||||
shoebuckle Senior Member Joined: 21/01/2012 Location: AustraliaPosts: 189 |
Doug, it will be in the next library update. Hugh |
||||
panky Guru Joined: 02/10/2012 Location: AustraliaPosts: 1101 |
Off the original topic a bit but James has sent in some mods to my hexdump program that improve it considerably - thanks James (PS. Your inbox is full so I couldn't reply direct to your message ;-) ) For Hugh, updated hexdump below. Cheers, Doug. 2012-10-13_015642_hexdump.zip ... almost all of the Maximites, the MicromMites, the MM Extremes, the ArmMites, the PicoMite and loving it! |
||||
shoebuckle Senior Member Joined: 21/01/2012 Location: AustraliaPosts: 189 |
Thanks Doug. Geoff is away so it will be about a month until the library gets updated with this and your CVanBM. In the meantime, if you have any other thoughts, please feel free to post them on The Back Shed or email to mmlib@geoffg.net . Cheers, Hugh |
||||
Print this page |