Fixes & enhancements for WLL.COM Getting rid of blank screen at startup with RP & more
Posted 28 February 2008 - 01:23 PM
I'll point out the main issues that we wanna fix:
1. Get rid of the blank screen & halt at startup, when LOGO.SYS is missing or a different version found
2. Be able to load custom boot logos made by users, where the progressbar is placed at different coordinates
Now, the second issue may be much simpler to fix now, after the hint offered by Tihiy (thank you! ) regarding video organization by banks. However, the first one is stuck because of the lack of knowledge regarding filesize comparison in ASM, in DOS (16 bit) mode.
The discussion that took place in the Revolutions Pack thread should be moved here soon. Any help is welcome.
Posted 28 February 2008 - 03:20 PM
Just a small question: were you also planning on fixing the glitch where the loading screen stops moving and inverts colors whenever a DOS program (likely in Autoexec.bat) trys to display output text?
Posted 28 February 2008 - 03:59 PM
I'm afraid that'd be a little too much, at least for me. Let's hope some good people would pass by and lend a hand.
For now I managed to understand 95% of how the animation works, so the progressbar can now be placed at whatever position. Haven't yet checked the limits - if any - for progressbar size and animation width. There's a little quirk about the number 13 in the constants and I can't work it out for the life of me.
Next I'm trying to automate the calculation of the bank according to the user-given coordinates.
Then I'll try to find an empty space in the bitmap header for the specific coordinates. Only 8 bytes needed (4 WORDs).
After that, find a way to load the coordinates from the file into the constants (would they become variables?).
Most of the code regarding the checks if file exists and file size matching is in place, but the latter is still incomplete.
Posted 28 February 2008 - 04:25 PM
progrstep=8 progrmax=progrstart+8*13 progrbegin=progrstart-8*3 progrend=progrmax+8*3
progrstep=8 progrmax=progrstart+progrstep*13 progrbegin=progrstart-progrstep*3 progrend=progrmax+progrstep*3
Do you get it now?
I'm absolutely uninterested in this project unless it will fix bugs for me
Latest available source i've recovered from marxo is attached.
Number of downloads: 83
Posted 28 February 2008 - 06:21 PM
first at all sorry for entering so late... I tried to compile a WLL.COM and a SVGACOM.COM, but I had to learn how to use the compiler first.
Now you can see that I'm not the man to code any source in assembler. I don't understand assembler code, but I think I'm able to understand some logical coherences.
If I could help in this project, then it can be only something like brainstorming about some logical things and no coding instructions. Sorry.
But I'm happy that someone wants to help fix the issues in WLL.COM.
If you'll help us to resolve the problems with WLL.COM, you'll get your bugfixes...
So let's do it!
Posted 28 February 2008 - 08:07 PM
Anyway, the most important thing we still need to find is the file size check routine, which doesn't work.
I'll have a look at the new sources in the mean time... unless I fall asleep (been awake for 22 hours already )
Oh holli: welcome to the team!
[EDIT] I got to a result finally with the file compare routine, although it's not exactly that but just reading filesize from the bitmap itself and comparing with the known value. But it works, so...
That animation still gives me more headache than this tooth, but for now I'll let it be. What I wanna do now is find an elegant way of centering those strings on screen, 'coz now... ugh!
Enjoy the attached modified SVGACOM.ASM and the rest of the package. On with the work!
[EDIT 2] Today I just noticed a video memory corruption when running the previous version of SVGACOM.COM that was attached here, so I slightly modified it, saving the registries at startup and restoring them before exit - hopefully it will prevent such corruption in the future. That happened while testing under Windows, dunno the implications when run in pure DOS mode at Windows startup.
[EDIT] Link removed. File is available for download further on in the thread. [/EDIT]
P.S. Is there no moderator willing to move those posts here from the RP 7.x thread? Just to clean that one up, at least...
This post has been edited by Drugwash: 09 March 2008 - 05:48 AM
Posted 02 March 2008 - 02:36 PM
The file size check is now correct - no more reading the values in the header but actually calculating it.
[EDIT] I forgot to say that the error strings are now automatically centered on screen, so they can now be changed at will (within the 80 characters limit) and this may also leave room to translations, using an external text file. If this function is needed, tell me and I'll try to implement it.
The file would have to contain 2 strings of maximum 80 characters each, terminated with a dollar ($) sign.
I couldn't find an empty space in the logo header (still uncertain about 34 bytes that I have no description for), so I decided to load the data in the visible area. It will be 5 WORDs not 4 as I previously stated and will be more or less visible in the top-left corner of the screen, depending on the rest of the image.
I also managed to get the data from the image to program's buffer and I'm now working on integrating it with the program. Three more values need to be calculated (bank, progrstep and progrstart) and I'll be done with this part. I might need some help with the bank part, since I couldn't find any pertinent information on how to calculate each bank's boundary.
Still, TASM is complaining about a couple of lines so I won't be releasing anything until I find and fix the issues. Jeez, I'm shoving ASM into my brains with the bulldozer!
OK, here's the troublesome part - in this struct I pass the progressbar data read from LOGO.SYS:
PROGRES struc; User-defined data for progressbar posH dw 1 posV dw 1 progW dw 1 progH dw 1 progL dw 1 PROGRES ends parapro PROGRES <>
The compiler wouldn't let me use the parapro.xxx values directly in the instructions where they need to be, so I did this:
progrwidth equ parapro.progW progrheight equ parapro.progH
However, now I'm getting the error Need register in expression in two identical lines containing progrwidth, lines that I have not changed whatsoever:
Anybody can tell me why and how to fix this?
This post has been edited by Drugwash: 02 March 2008 - 02:41 PM
Posted 03 March 2008 - 04:39 PM
Hi Drugwash, the answer, why 13 "steps", is easy to know: If you replace the original "Windows 98" \LOGO.SYS with a screenshot of a "Windows XP" startup logo, you'll fast know, what I mean. The Progress bar of the Windows XP startup logo contains a progress bar witch have three blocks of 6 pixels spaced by 2 pixels (that's why "8"!). To move the three blocks of the progress bar from left (1 block shown) to the right (also only one block shown), you need 17 steps.
Have a look at the lines "progrbegin" and "progrend":
progrbegin = progrstart-8*3 progrend = progrmax+8*3
"progrbegin" starts three -8*3 steps before the visible animation, "progrend" stops three steps after the visible animation +8*3. progrmax = progrstart+8*13. So you have 13+3+3 = 19 steps, 17 visible and two steps where no block is shown.
You can get a 640 x 480px scaled WinXP startup logo by the google picture search. Mostly you have to move the Progress bar to the first position, but that's not that hard...
By the way both ("Windows 98" and WinXP) progress bar sizes are 22x9 px.
Thanks for your welcome. I hope, I can help...
Sorry that I don't try your source soon, but that's my second step after I downloaded a program to handle 7zip archives... *g*
Posted 03 March 2008 - 06:30 PM
Thanks to more help from PassingBy I should soon be able to fix the remaining issues with the values that need to be calculated. The issue with the parapro.xxx variables is already fixed.
If you try the version I attached above, please fix the animation values to match the correct ones, as I altered some that I shoudn't have. To check all its functionality you need to perform 3 checks:
1. Without any startup.bmp in the same folder
2. With any old-version LOGO.SYS renamed to startup.bmp
3. With the embedded startup.bmp
Please note that the version posted does not have the error messages centered, but the one I'm working on does.
Posted 04 March 2008 - 07:00 AM
I'm happy that programming needs a lot of mathematics, so I can help you without understanding some assembler code.
I made this XP startup logo (it really looks the same like the original - there's no difference!). And if I saw the progress bar, I noticed, how it works. Without the three blocks of the progss bar it is really hard to realize how it works.
I used your source and it's awesome! The animation runs on my laptop (the original source won't do this). You also created a nice logo. But there are a few things:
1. The size of the progress bar (14px) seems not optimal for animating. Try to think in three blocks spaced by 2px regarding the terms above, you should use 13px or 16px. If you use 13px progress bar, use progrstep=5 (3px block + 2px space) or progrstep=6 (4px block + 2 px space) for 16px progress bar. Then you need a progrmax=progrstart+progrstep*X where X = (lengh of animation + 2 px / progrstep) - 2.
To explain the formula: I used the XP \LOGO.SYS and figured out the relationship of the animated witdh, the animation width, the progrstep and the 13.
You can do your own brainstorm and you'll find the same formula.
So, I decided to enhancd the animated block with 2px and set "progrstep = 6" the animation lengh of the startup.bmp (180px) don't fit with this parameters, so I enhended it with 4px, so X = (184px + 2px / 6px) - 2 = (186px / 6px) -2 = (31) -2 = 29. The resulting "progrmax" line is:
progrmax = progrstart+progrstep*29
Please note: check out the parameters progrstep, progrwidth and X before you create your startup logo.
2. Threre is a visual glitch by moving the progress bar: on my notebook (ATI Rage 128 Pro graphics) the animated progress bar is a block of foreground color (magenta) , on my desktops the correct bar is moving, but the background color (black) switched to the foreground color (magenta) after redraw the progress bar.
Hope I was helpful for this progress bar stuff...
Edit: I checked out your error messages. But I don't like to press a key while starting up my system ('cuz I often turn the computer on and go to get a coffee... ;-). It is possible to put out an non centered massage in the first two lines like this:
Please wait until Windows starts."
The "XP" \LOGO.SYS seems so real! I shocked some people with using it as a screensaver under XP.
(If you also want to shock someone, take my attachment and store it into C:\WINDOWS of a Windows XP system. Then import the "screensaver.job" file into your scheduler (just drag and drop) and activate it. Every time, when the system is idle for more than 5 minutes, Windows XP "reboots". To stop rebooting and return to Windows XP press any key.... )
Number of downloads: 57
This post has been edited by holli: 04 March 2008 - 07:08 AM
Posted 04 March 2008 - 12:47 PM
THE FULLY BMP-DEPENDANT VERSION OF SVGACOM!
The package contains detailed instructions on how to calculate and add the parameters to your bitmap logos.
Please only test this on a non-critical machine as it may contain bugs.
I'll be waiting for feedback regarding (im)proper operation on different systems, with your own logos.
If everything goes well with this code, then we'll go to phase 2, which is integration with WLL.COM and hunting for any clashes with the existing WLL code.
[EDIT] Link removed. File is available for download further on in this thread. [/EDIT]
@ holli: I have intentionally left the 14px 'bullet' in the example bitmap so users can see what happens with miscalculated values. In the example animation, they will notice the 'bullet' is cut to the right by 1px, because of a bad length conception.
If you don't want the keypress in case of error (although I highly recommend it as it should be a one-time stop until the issue is fixed by restoring an appropriate LOGO.SYS), you may comment out the following 2 lines in the allset: subroutine:
mov ah,00h ; waits for a key to be pressed
Related to that, you may also modify the Preskey string at the end of the code with any other string you like - just make it less than 80 characters long and make sure it terminates with a dollar sign ( $ ).
This post has been edited by Drugwash: 09 March 2008 - 05:45 AM
Posted 04 March 2008 - 05:41 PM
nice work, I love it!
I took your source and made my "Windows XP" logo. But...uh, 5 ugly pixels in the top left corner! So I did a dirty thing. I searched a place in the header where I can put the neccessary information in. At offset 26h I find four 0000h blocks. The needed 5th block was 0001h. I was very bad and overwrote the 0001h. I can't notice any visible glitch. So I changed the source
readvalues: mov ax,4200h ; set move pointer mov bx,[Handle] mov dx,1078 xor cx,cx int 21hto
readvalues: mov ax,4200h ; set move pointer mov bx,[Handle] mov dx,38 xor cx,cx int 21hand it works fine.
At this point I've got a tiny question: why do you use 1078 instead 0436h for the offset? Or can both be used?
(Hm...don't I wrote some posts ago I cannot put any assembler code here?!? )
Thank you very much for your great documentation! A dummy like me can very easy work with it. But...only one tiny thing... *ggg*
tasm /t /x svgacom
tlink /t /x svgacom
Your're amazing! The shaft length in the picture is 118px wide (that's WinXP logo standard - I don't altered it). With your formula I must give a shaft size of 120px. If I don't, your code decreases the number of passes by 1. It's cool. But I must remember that if I build a new logo, otherwise I'll wonder why not the full shaft size is being used... ;-)
Thats all folx.
I hope, my explanations are use- and helpfull.
Edit: I commented out the keypress code and changed the row and col coordinates to display the text in the top left corner. But when the program terminates, the text was deleted. How can the program terminating without erasing the text?
I tried the program on my Compaq Armada 1750 laptop and the visual glitches of the animated bar are already present :-(
This post has been edited by holli: 04 March 2008 - 05:50 PM
Posted 04 March 2008 - 06:29 PM
What you did was hack into the palette and that is not at all recommended, as it will alter colors depending on bitmap content. For example, look at my startup.bmp and at offset 26h you'll find C4, 0E, 00, 00, C4, 0E, etc. That's part of the palette which is 256*4 bytes long.
There are still 34 bytes that I don't know anything about, but they're not empty (at least in my bitmap).
As for 1078... he-he... I confess I could never stand hexadecimal. Never ever. So as much as I can, I use decimal - it just feels easier, that's all. Not to mention the compiler kept complaining about a perfectly legit hex value, driving me up the walls, until I realized it was considering it as a label (the value started with a letter) so I had to add a zero in front of it. Well, decimal values don't give such headaches.
Darn, you're right about the commands in the readme - I did put the right ones in the batch but the readme just slipped me. Thanks for noticing, I just fixed them now.
Dunno what to say about the shaft... I noticed a small discrepancy myself, but I blamed it on bad calculation of starting point. I did mention about the 2 extra px in the readme though.
Hmmm... you bypassed the automatic string centering code? I wonder why... And that keypress - that's why I put it there: because the screen gets wiped out and the user has no possibility to acknowledge the error and thus attempt to fix it, which already defeats the purpose of error messages themselves.
Regaridng your laptop... I know OEMs are kinda naughty; it would be no wonder if Compaq did something to the videocard that prevents it from correctly switching banks or something along that line. But I can't say for sure, that's why I asked more people to test on different machines, to get some feedback whether the code is faulty or different hardware configurations can misbehave.
Latest news: I already compiled a version of the WLL using the latest sources offered by Tihiy but I have no guts to test it on my main machine and the test one doesn't have 98SE on it (yet). So... dunno what to say. I think I'll wait until tomorrow (heck, it's already tomorrow - 2:30 AM here).
This post has been edited by Drugwash: 04 March 2008 - 06:33 PM
Posted 05 March 2008 - 04:15 AM
Ah, now I know why my bytes are empty: The WinXP-Logo is original a 4bit picture, increasing the colors to 256 may let some colors be 0000 (black), so I can use the offset 26h...
Yeah, and here my idea: If vou create a new Logo, be sure to edite the first 6 colors of the palette to black, so you can put your information into the palette. Be sure that everything black in the picture uses the 6th color...
Hm... I write 01h (8bit) or 0001h (16bit) instead 1h by habit. Every digit of the hex are 4bit of the binary. So, if you have to read some BCD code (often in PLCs), every hex digit is a digit of the BCD. So 0123h is 0123BCD ;-)
It's also a habit...I like error messages when they displayed in "normal" reading order (top left). Why must the program blank the screen "after" it terminates? Cannot the program leave the screen how it is? WIN.COM needs some time before blanking the screen, thats time enough to read the error message. I tried to built in a delay of 2s, but I can't figure out where to find the time delay for progress bar moving and I don't know how it works.
What about a boot disk (WinXP is able to create a WME one)? You also can use a bootable USB stick, if your BIOS can use USB media as boot devices. Or try a W98-CD to boot from. But it can be that your new computer don't contain a floppy drive. That's the biggest bulls***. A computer without a floppy drive isn't a computer...
Return to topic: what's about a config file like logo.ini containing the neccesary information for the animation?
Posted 05 March 2008 - 05:22 AM
Here's a detailed explanation of the bitmap header content - if you can find a legit location for the 10 bytes...
Error message position on screen and persistance would have to be Tihiy's call, if he ever decides to use the modified WLL in RP. As for blanking the screen, after displaying the message, the routine goes to faileddrawing:, where int10h is called again with 02h in ax so it forces the screen to go in text mode again - I believe this may be the reason. You may try to bypass those 2 instructions, see if the message stays on screen.
My test machine is an ancient Pentium I @ 166MHz (not even MMX) and it does have a floppy but no possibility to boot off USB (I dont' have an USB stick anyway). I'll start messing with it soon - maybe I'll just try installing soporific's UBCD, should be an interesting additional experience. As for XP: you wouldn't honestly think I'd ever allow that thing on any of my machines, would you?!
Regarding ini files... argh, they're a pain. Of course it would be possible, but we should try to minimize the file number, make everything as compact as possible.
Otherwise, anything can be read in from a text/ini file: from settings to translated/localized error messages (as I mentioned in a previous post). But imagine: if someone forgot to copy LOGO.SYS to their drive, wouldn't they also forget about the ini too?
Dunno, this should also be Tihiy's call, if an ini should be used or not.
Posted 05 March 2008 - 04:14 PM
Yes, your're right, BUT...
...the palette (starting at offset 36h) gives you LOTS of free bytes. Exactly 256. Every color in the palette is stored in 4 bytes:
So that's why your first byte of the image (visible area) is at offset 0436h (1078):
Header data area: 54bytes
Fixed space reserved for color palette: 256 (colors) * 4 bytes = 1024bytes
54 + 1024 = 1078! Offset count starts with 00h, so the first byte of the visible area is at 1078.
O.k. a free block of 5 bytes is easier to handle, but why not use bytes at 39h, 49h, 59h 69h and 79h (this order is easier to keep in mind instead of 39h, 3Dh, 41h, 45h and 49h)
I'm worry I cannot change the source to use these bytes, so I cannot test it.
I'll check this out.
Edit: Yeah, I checked it out and you're right. Now the program exits whithout erasing the screen. To implement this was really not that hard... ...thanks!
This post has been edited by holli: 05 March 2008 - 04:37 PM
Posted 05 March 2008 - 05:00 PM
Moreover, the buffer is way too small (512 bytes) to fit an insanely large 'bullet' (progressbar).
Finally (or maybe not), badly chosen coordinates could place the bullet between video banks and there's no protection agains that either, nor any code to handle the situation correctly.
I will try to address these issues as well as I can.
The buffer, for one, can theoretically be enlarged to max. 65536 bytes (010000h). According to buffer size, there's a limited size that the bullet can take: progW*progH =< buffsize. For now, I'll limit progH to 102 (66h) to fit in a video bank and progW to 65536/102=642 (8202h) which is insane enough already. I will probably add an extra check so if the bullet position crosses the boundary between video banks, its height will be limited to fit in one of the banks. That's gonna be some nasty code and also useless if I manage to get the drawing routine to draw cross-banks. But that's just wishful thinking, for now.
One thing I might have nailed, accidentally, is the hang at startup. I'm not 100% sure of that because it happened to me only after I added in a call to a certain procedure, but for safety I protected the corrupt registry around both calls to the said procedure and hopefully this would fix the issue. Needs extensive testing though.
The current code won't be released until I put the protections in place, otherwise crashes might (and definitely would) happen, with wrong values. In the mean time I'd like to ask users of non-English Windows 95,98/SE and ME to attach here their IO.SYS and COMMAND.COM zipped, so I can analyze them for a related part of this project (if that's allowed, of course - don't wanna break the board rules). Don't forget to mention the language they're for.
@ holli: Sorry, I had the edit open already while you posted, didn't notice your post.
Header data area: 54bytes
Fixed space reserved for color palette: 256 (colors) * 4 bytes = 1024bytes
54 + 1024 = 1078! Offset count starts with 00h, so the first byte of the visible area is at 1078.
Then, to read the values in and store them would be a little more tedious. Right now it's: open file, move offset pointer at 1078, read 5 words, store them in struct, close file. What you suggest would be: open file, move offset pointer to first byte offset, read byte in AL, move pointer to second byte offset, read byte in AH, store AX to first struct WORD, increase struct pointer by 2, repeat all this times five, close file. Ugh!
This post has been edited by Drugwash: 05 March 2008 - 05:25 PM
Posted 06 March 2008 - 04:46 AM
I knew that, but I only wanna give some alternatives.
No, you're not right. RP7 replaces IO.SYS with a version that doesn't contain a logo file. If I used an old or none logo file, the error message appears correctly all the time until WIN.COM blankes the screen. That's what I want.
Hm... just an alternative: What's about a tool to store the animation information into the \LOGO.SYS? So you can check the parameters in this tool and you can keep the WLL.COM clean from it and the logo creator don't need to hexedit the bitmap. If possible, the logo creator can give this tool the logo name (a syntax like "logocfg <bitmapname>") and the tool stores it as \LOGO.SYS and backup an existing \LOGO.SYS as \LOGO.BAK (an old LOGO.BAK will be overwritten).
O.k. such a tool is a lot of work, but If you want an easy handling for the user - violá!
Posted 06 March 2008 - 05:41 AM
The idea is to make WLL a bit more wide-range, usable on Win95/98/98SE/ME - all language versions. For this, I need to patch the existing IO.SYS and COMMAND.COM in place, instead of relying on already patched (and English-only) versions of them.
And the original animation wouldn't be that bad, in case the new LOGO.SYS is missing. The error message would pop up, the user would acknowledge it but the start process would still have an animation - the old one, but better than a blank screen, IMHO.
For now I'm still working on protecting the code from insane values. Wasted a few hours because of a stubborn ROL instruction, that worked fine in the debugger but not at all in practice. Had to replace it with SHL. Argh!
This post has been edited by Drugwash: 06 March 2008 - 05:50 AM
Posted 06 March 2008 - 01:46 PM
Why wanna do the work twice? Please have a look into the uncompressed RP7 package. You'll find the folder "logo" in it. Open it and you'll see some subfolders like 1031 (english), 1033 (german), ... containing IO.SYS and COMMAND.COM for various languages.
Yes, but you don't see the error message or it disappears too fast for reading. If something wrong with the logo, it would be better none is displayed.
I'm happy about you like my idea. This tool don't have to be programmed in assembler. E.g. you an use C, C++, Turbo Pascal, Delphi or any other language you like. I'm worry about not being a programmer.
But please, give the unused bytes in the palette area a try...thanks for your work!
- ← Windows 98/ME skin for Opera 10.50/60/70 and 11
- Windows 9x Member Projects
- Hacked, Patched, Modded, Hexed, Tweaked etc....... →