8:40 Whoa! That's my old Web site (from back when my ISP would host them itself)! I never thought I'd ever find out about someone actually reading it (albeit through the Wayback Machine), but I'm glad you found the information useful. Just out of curiosity, where did you find the link to it?
It's trippy when that happens. A few years ago I stumbled across a youtube video that discussed some old retro sega genesis rom hacking and it featured an little bit on an antiquated graphical editor I'd made back in 2001 for editing the uncompressed/compressed art inside genesis roms. Lol.
Once upon a time on /., I posted a Sidewinder gamepad mapping I made for UltraHLE which gave you three different ways to configure your gamepad which would make it feel more like an N64 controller based on how most N64 games were made. Years later I found a site which was actively pushing it as the defacto way to emulate that experience as closely as possible and it made me chuckle. It was something I whipped together quickly just so that I had some solution I could use. I have no idea how many people really used it but it was strange to see that it had spread beyond my original post.
Hello, 86Box lead developer here - both Award and AMI BIOS'es at the time used the EGA 8x14 mode for the POST screen precisely so they could display the logo without having to worry about the character padding to 9 pixels.
Where can I find out about how the BIOS interacts with the mmu? My goal is to modify your system or create a driver that allows one to use Isa visa or PCI cards, or external bus like ide or SCSI *_AS RAM_* That is , make usable and report to the OS , some arbitrarily huge amount of RAM (up to the max of whatever bit system will be installed,16,32,64) The problem is I want more available RAM then there is room in real hardware ram for the page table, making paging impossible , not just impractical due to thrashing. How would I redirect memory access at the BIOS level? Just for proof of concept I would start by using a dedicated hard drive as RAM, and then the actual ram as an l2 cache. Then if I can get that to work, I would design a card containing dram to serve the same function. I understand the bus speed limitations would make memory access a thousand times slower at least, but when you compare that to having 95% of your memory paged out and constantly thrashing to a slow hard drive, It's actually an improvement. For such a cluge to work it would likely have to be implemented at the BIOS level. Direct addressing of the mmu at the very least. Can I pick your brain and where can I learn more about how to do this?
@@alexloktionoff6833 IIRC, you can do this by writing to the video card registers directly, but there is no standard support for doing that via the BIOS INT 10h call. (Note: Configuring the VGA card registers directly yourself is _entirely standard and proper_ for a DOS program to do (and was common practice for lots of programs that wanted to do more than very simple text/graphics displays). It just doesn't have a convenient helper function in the BIOS to make it easy for you, so you need to do more work, is all.) I think some old BIOSes may have had nonstandard video mode values you could use to switch to some of these alternate modes, but they were never "official", and could vary from one BIOS to another (and would probably not be supported by most emulators)...
It's been a very long time, but there are two common text modes: a 640x350 EGA mode with an 8x14 font, and a 720x400 VGA mode with a 9x16 font. If I recall, the 9x16 font is really an 8x16 font with the left-most pixel always blank, and those are your ugly lines. You need to get into that 8x14 character size mode if you want it to display correctly.
It's the rightmost pixel, and it is always blank... except in the characters from the range 0xB0 through 0xDF, the line/box drawing and filled block characters. In those, the ninth column is a double of the eighth column. So if you can create the Energy Star logo out of those characters, you can have it without the lines.
@@bitwize I assume you mean with still changing the font. Although it would avoid the gaps, that wouldn't mean it's displayed correctly. It would still be the same aspect ratio, but with every eighth column doubled, so it would look like a very unevenly scaled version. That hack is definitely not suitable for most graphics. If you mean drawing a logo with the actual box drawing characters, that's an interesting idea, although I think it would be quite challenging to approximate that logo.
Nice to know though, I didn't know about this exception for 0xB0-0xDF characters. I recall it puzzled me when I played with font editor as a teenager circa 30 years ago. Mistery solved, finally! :) Thanks, @bitwize
I loved your video. I was an 18 year old kid who had access to almost nothing, but I loved poking around in interrupts and memory areas. I used Turbo Pascal with a bit of assembly.
I was scrolling through the comments and everyone talking about the 8x14 font size and I'm like, if you know that, help the guy out with getting into it and you're like the first post I noticed that did it. I was about to dig through all my old references. I remembered vaguely what he needed to do, but couldn't remember the video mode. And 10 mode 10 go!
Es posible realizar las graficas inclusive en Modo texto. Las aplicaciones MSDOS como Norton Disk Doctor hacian eso. Inclusive lo he hecho para hacer graficas en modo texto. Simplemente se asignan(W/8) * (H/16) caracteres ASCII y se les cambia el mapa de bits de dichos caracteres y se los presenta en pantalla.
Hey, cool video. As for the issue with the gaps. Some people already noted, it is connected to your VGA adapter using 9 pixel wide glyphs (as for 720 internal surface the VGA uses). The last bit is usually set to zero, so there's your black lines coming from. Except the range 0xc0 to 0xdf, the default fonts use this range as block characters, therefore the VGA will extend bit 8 to bit 9 so the block is filling the whole 9 bits and don't suffer the black gap (you can actually see this in your video as well, parts of the star as well as the horizontal line seem to be properly filled, except they arent really). If you run the program on an EGA or CGA adapter (try configuring the machine of your DoxBox) you'll see the logo is displayed perfectly fine. Thats probably not the fix you are looking for though. 🙂 So, on the VGA you can set 8/9 dot mode flag to 1, so 8 bit wide characters are used: outport(0x3C4, 0x0101). Then your logo will hopefully shine in all its glory. Two more things: - the glyph foreground and background info are also in the epa file. You even loaded the data in your colourmap, but didn't use it somehow later. - instead of using putchar for the logo it would be probably more natural to write the logo (or the whole screen even) directly to text memory at 8B00:0000. Cheers
I still remember the first time I got a motherboard with that Energy Star logo on it's boot screen... after many motherboards with text only (in those days it was almost "hey, it's been a couple of months... Time for a new motherboard ) suddenly it has this cool graphic on it too.... even though I thought it was SO cool, I never got around to finding out how it was done... I'm actually quite excited to see how you do it.
Award BIOS screen is EGA, supporting both graphics and redefinable characters. As I was into BIOS modding I know for a fact that the Energy Star logo is a bitmap picture in the ROM. BIOS has a pure text fallback for CGA and MDA if EGA is not available.
@@AnnaVahtera Well let's add a missing one for you, I have started with Pascal 6 on a Hercules Graphics Card (HGC). A somewhat weird mix from MDA and CGA, but still monochrome.
@@retinaquester Ooh, I had a Hercules card in a.. 286? I think. I owned it only a short while before I got an EGA card. I also owned the weirdest CGA(-ish) graphics card that I've ever heard. It had support for 8 colors and had four times the memory CGA cards normally had. I never found any programs that actually supported it. (The PC was from a company that used it to draw plans for oil drilling rigs and they apparently needed all that graphics power back then.)
Maybe I remember it wrong, but I believe the logo faded out after some time and it was probably done by bitmap + palette rotation like it was done for Win95 loading screen
Hi NCOT, The reason there's vertical gaps in your "large" Energy Star logo in the top right corner is that in VGA mode you have an 8px horizontal character grid, but a 9px screen grid. The 8th - "last" - pixel of every line in a character is always duplicated to the 9th pixel. This way you have the possibility to make certain characters (box-drawing characters from the ASCII table's 2nd half, but also the plain old underscore "_") be horizontally continuous. You need to find a BIOS video mode where the horizontal pixels per source character matches the pixels per screen character, i.e. no pixel duplication. AFAIR the Energy Star logo does NOT use these duplicated pixels. It would be very obvious otherwise.
EDITED: Not necesarily. 9th pixel duplication was enabled in the range of characters C0h-DFh when the flag "Line Graphics Enable" was enabled in the Attribute Mode Control Register (Index 10h). I remember being parametrizable in some EGA/VGA clones. When setting a video mode, those came preselected for the graphic characters (the box drawing characters). You can either remap the box drawing characters themselves, or use the registers to add your own characters to the range if you use an emulator that emulates compatible hardware (I think S3 did do it, but I don't know how good is S3 text mode emulation is in dosbox). That's why after this screen, the BIOS would clear the screen again resetting to a standard mode, and print the second part of the BIOS with the box detailing the CPU model, RAM, etc, resetting the font so it could print the box and then chainload to DOS, which may change the codepage (redefining the font again) without clearing the screen.
@@RubenMartinezCabello Wow. I never knew this was configurable! I need to dig out my MS-DOS LiveCD again, and play with that a bit. Do you believe this INT 10h stuff works just as "back in the day" when subjected to "modern hardware"? (I once wrote a hotkey-bound screen-blanking TSR in machine code. With dos DEBUG iirc 🙃; some of that knowledge is still there...)
I did things backwards. I learned MS-DOS programming by starting with ASM. I mean I tried C...but the thing I wanted to do tossed me off the low-level cliff and I wound up writing a bunch of assembly.
15:18 Award started using graphics mode from 4.51 or later onwards. Before that, they used text mode with custom characters. Noticed this myself when working with older computers. You'll notice this by the cursor characteristics. To fix your issue, just use the characterspaces where the lines are going trough the right side of the character! The characters in VGA Textmode are 9x16. (or 9x14 depending on your mode). On some characters, if the rightmost bit is set, there'll be another bit added in the 9th column! Should be characters #192-223 afair. Edit: There are also textmodes with 8x14/8x16 characters. You can use one of them.
2:28 oh , that brings me memories from my childhood, I was 10 and learning to program from quickbasic, I made one of those simulations of the PC booting.
Seconded. I was around 10 when most of this was being phased out. Now that I'm 37, I kind of want to know how my first PC actually worked given that my parents made me touch grass when I spent too much time on it. Discord is too impermanent, and weirdly not anonymous at the same time. I could care less about custom stickers and video chat. The archived wisdom is what people want.
Me after finishing dinner: let me just finish some stuff up before going to bed. *This video shows up in my feed* God damn it. Now I need to know how this works.
In the early 2000s some motherboards, like SiS started putting a 4Mb nvram chip as the bios, and you could patch your linux kernel, compile it and use a util to write it into that nvram chip, so when you turned on your computer there was none of that stuff, as it powered on it just said Loading Linux.... and started booting, there was no bios or bootloader.
I had a lot of fun with demo stuff back in the day. The simplest demo effect to get your head around is probably colour cycling, such as the "wormhole" from Future Crew's "Unreal". You just need a static image, and the challenge is setting the palette using port I/O rather than BIOS calls, and syncing with the frame rate. Both of these things are important for most demo effects, because one of the things about "real" demos is that effects often fade in and out, and that's all done with palette manipulation in VGA. The next simplest effect is scrolling credits. You don't often think of this as an effect, but it uses a clever technique that's important to know about. Essentially, you use video memory as a circular buffer, and the "scrolling" is done by telling the VGA hardware where to start drawing from. The next simplest after that is probably vector dots, such as the "tunnel" from Second Reality. It can be done in VGA mode 13h, although Mode X is more common because the pixels are actually square. The main things that you need to know from the logic side are working with 32-bit fixed point arithmetic (typically 16 bits of integer and 16 bits of fraction), and precomputing sin/cos tables. On the graphics side, addressing VGA video memory (especially planar memory in the case of Mode X) is a little tricky, and using the memory latches effectively is part of the art of getting your demo effects to be performant. Eventually, you will work out for yourself why DOOM runs so damn fast: it draws all of the walls and sprites vertically.
Not only demos, games in the VGA DOS times used that extensively, even if you where a bedroom hobby coder and "just" coded a little game in QBasic it was a nice way of getting some animation going without using much CPU cycles. For example id Tech 1, aka the Doom engine, used it for different brightness levels in the different sectors for example, you really only have eight brightness levels and the game runs on a palette of 32 colors in different brightness levels, with stuff like the invulnerability sphere or the brightness googles just using a different palette.
You just re-aligned so many memory regions in my old brain, that I was actually granted access again :D Would love to see a video about the EMM386 hacks (Not sure anymore but I think it was called EMM286 if I'm not mistaken here, way too long ago^^) that made some extended memory apps work on 286 as well, I was never really able to wrap my head around it back then. awesome vid and a new sub
Re: the lines between each character, this is something you can toggle with text mode - I don't recall if it adds extra lines or changes the resolution. I'd find the PDF of PC Intern as it covers this (it was a 90s era book and came with its own PDF). There are different editions, mine had C, pascal and maybe even basic.
Thanks for bringing back my memories. During my college years (93-96), I used this BIOS interrupt to customize the character set particularly to display a box on the screen with borders similar to Windows 3.11 or Norton Utilities 7.0 in text mode only. I only used extended ASCII box-drawing characters with no vertical gap when displayed.
Did you know that modern CPUs can't start up? AMD uses their security processor to start it, and Intel uses their management engine processor. The RAM and PCIe don't work at power up, they don't have the calibration programmed in to deskew and set up the impedance adjustments. If you go back a little further, there are CPUs that only use their cache at startup, and it is enough to get through the memory and PCIe lane training.
Growing up with DOS, I saw a few dozen text mode apps that rewrote the font for custom graphics... and hundreds that did not. It was really rare. I think my favourite was this file manager that had radio buttons for settings, and the circles were taller than 1 character, so there was a character with the very top of a circle, and one with the very bottom. It looked great! The app had a bunch of subtle graphics effects like that, was cool. I never learned how to rewrite the in-memory text mode font, but always thought it was way under-utilised. Would have been awesome for a roguelike game, you could have 150 or so custom sprites, along with letters. More if you only used uppercase letters. Combine that with 16 colours and you could do pretty impressive things in "text mode"!
It was a real pleasure to hear mention of machines like the BBC Micro and especially the ZX Spectrum - these were the very machines where it all began for many of us. To be honest, I never even considered before that UDG might exist on the x86 platform at all, although I did do a bit of programming under DOS before, using int10h and VGA.
@@AureliusR UDG = User Defined Graphics, custom data instead of some specific character(-s) or custom font completely. In docs it mentioned as "user specified patterns". What I mean is shown somewhere at 10:06 :)
Boy does this bring back memories indeed. I remember using the VESA Bios Extension (VBE) in protected mode to access a Linear FrameBuffer (LFB) of the graphical display memory. There was a program called UniVBE/Scitech Display Doctor that you could run on graphics cards where the bios did not yet support that yet.
Yeah... learning by doing is the best way... learning by doing an actual task too... some of my mates love "coding katas" but it's so much better to have a sort-of realistic goal.... Great stuff!
Interesting video. Brought back a funny memory from high school. My dad set a BIOS password on our home PC, and only told it to my older sisters, who were only allowed to enter it for us if we had homework to do on the PC. So while I was doing my homework on the PC, I wrote an approximation of the BIOS screen in QBasic, then told my sister the PC had crashed, and asked her to type the password again. My program then saved her input to a text file, and voila, I now knew the password.
PC Intern was a great book for this era of programming, and has some examples for changing the characters in VGA text mode. You could load two character sets (maybe this is what BH in the load function points to). The second set would be used if the high bit of the colour byte was set. In this way you can have a whole 256 characters for drawing at the same time as an ordinary one (if you also tell it that the high bit shouldn't make the characters blink).
If I recall some Norton tools used a similar technique to make the DOS block mouse into a smooth "windows like" arrow that was moving pixel by pixel on the text screen modes.
I remember reading that when I was a teenager and coding a bunch of DOS stuff and thinking, oh my god that sounds so cool I should implement this... dear god.. That was a week.
AFAIK, the EPA BIOS Screen was EGA 640x350 and 80x25 using 8x14 Charset thus resulting in a slightly larger font. Maybe you selected the VGA 640x480 mode with 9x16 Charset, which would also explain the blank lines between each individual character…
I still remember using assembler to use in and out commands to put data in a000 (vga video memory) to put pixels on screen. And pallette swap/cycles to give it an animation feeling. I called int 21 also a lot for all the DOS functions.
A few bits about the comparison you did to a real Award BIOS near the end. You can force 86Box to run in 4:3 from the View menu, this will probably make it look more like you'd expect it to look on a real screen. EGA was 640x350 if I recall, so would look vertically stretched on a 4:3 screen. I wouldn't be too concerned about the font because it was very specific to the video card manufacturer. The one in your 86Box VM looks somewhat like an S3 card. ATI had a different one, and Cirrus Logic used a different one that's very similar to what Nvidia used. It's also possible to change the font in DOS by using MODE to change the codepage, the font in your version looks very like the one from the EGA.CPI file.
A tiny pacman animation for the command prompt using 8*3=24 user character starting with extended ASCII number 128. The body starts inside of two character and each step it moves one pixel to the right side into a third character while open and close the mouth. And then it starts again one location(8 bit) to the right side. It save to executable. The first with all bytes and the second with the animation routine only. The cls command of DosBox reset all character to default. -a 072D:0100 mov ax,1110 072D:0103 mov bp,170 ; offset of character font (DOS com files start with DS=ES=CS=SS) 072D:0106 mov cx,18 ; 24 character 072D:0109 mov dx,80 ; start with ASCII number 128 072D:010C xor bl,bl ; block 0 = override the existing character 072D:010E mov bh,10 ; 16 bytes for one character 072D:0110 int 10 072D:0112 mov bx,8 ; row 072D:0115 mov dx,18 ; collumn 072D:0118 mov bp,bx 072D:011A shl bx,7 072D:011D shl dx,1 072D:011F shl bp,5 072D:0122 add bx,dx 072D:0124 add bp,bx 072D:0126 mov ax,b800 072D:0129 mov es,ax 072D:012B cld 072D:012C mov ah,e ; color attribut 072D:012E mov ch,18 072D:0130 mov di,bp 072D:0132 mov al,80 ; start with ASCII number 128 072D:0134 mov cl,8 072D:0136 stosw 072D:0137 inc al 072D:0139 stosw 072D:013A inc al 072D:013C stosw 072D:013D inc al 072D:013F sub di,6 072D:0142 mov bl,al 072D:0144 mov dx,3DA 072D:0147 mov si,7000 ; delay 072D:014A in al,dx 072D:014B test al,8 072D:014D jnz 014A 072D:014F dec si 072D:0150 jnz 014A 072D:0152 mov al,bl 072D:0154 dec cl 072D:0156 jnz 0136 072D:0158 mov byte ptr es:[bp],20 ; space 072D:015D add bp,2 072D:0160 dec ch 072D:0162 jnz 0130 072D:0164 ret 072D:0165 org 0170 072D:0170 DB 0,3,7,1e,3e,3f,7f,ff,ff,7f,3f,3f,1f,7,3,0 072D:0180 DB 0,c0,e0,78,60,c0,80,0,0,80,c0,e0,f8,e0,c0,0 072D:0190 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 072D:01A0 DB 0,1,3,f,1f,1f,3f,7f,7f,3f,1f,1f,f,3,1,0 072D:01B0 DB 0,e0,f0,38,3c,f8,f0,c0,c0,f0,f8,fc,fc,f0,e0,0 072D:01C0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 072D:01D0 DB 0,0,1,7,f,f,1f,3f,3f,1f,f,f,7,1,0,0 072D:01E0 DB 0,f0,f8,9e,9f,ff,fc,e0,e0,fc,ff,fe,fc,f8,f0,0 072D:01F0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 072D:0200 DB 0,0,0,3,7,7,f,1f,1f,f,7,7,3,0,0,0 072D:0210 DB 0,78,fc,cf,cf,ff,ff,fe,fe,ff,ff,ff,ff,fc,78,0 072D:0220 DB 0,0,0,0,80,80,c0,0,0,c0,80,0,0,0,0,0 072D:0230 DB 0,0,0,1,3,3,7,f,f,7,3,3,1,0,0,0 072D:0240 DB 0,3c,7e,e7,e7,ff,ff,ff,ff,ff,ff,ff,ff,7e,3c,0 072D:0250 DB 0,0,0,80,c0,c0,e0,f0,f0,e0,c0,80,80,0,0,0 072D:0260 DB 0,0,0,0,1,1,3,7,7,3,1,1,0,0,0,0 072D:0270 DB 0,1e,3f,f3,f3,ff,ff,fc,fc,ff,ff,ff,ff,3f,1e,0 072D:0280 DB 0,0,0,c0,e0,e0,80,0,0,80,e0,c0,80,0,0,0 072D:0290 DB 0,0,0,0,0,0,1,3,3,1,0,0,0,0,0,0 072D:02A0 DB 0,f,1f,e9,f9,ff,ff,fe,fe,ff,ff,ff,7f,1f,f,0 072D:02B0 DB 0,0,80,e0,f0,c0,80,0,0,0,e0,e0,c0,80,0,0 072D:02C0 DB 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 072D:02D0 DB 0,7,f,3c,7c,7f,ff,ff,ff,ff,7f,7f,3f,f,7,0 072D:02E0 DB 0,80,c0,e0,f0,e0,c0,0,0,c0,e0,f0,f0,c0,80,0 072D:02F0 -n PACMAN.COM -rcx CX 0000 :1F0 -wcs:100 Writing 01F0 bytes -n PAC.COM -rcx CX 01F0 :53 -wcs:112 Writing 0053 bytes -q
I always thought the EnergyStar EPA logo was some sort of graphical trick. I should have known they were simply replacing the extended ASCII characters.
7:45 “Because this is a mid-90’s PC, it’s barely capable of doing anything when you first turn it on.“ I am a mid-90’s child and this is now becoming true for me too.
Would also love to know if there are good resources for demo techniques like plasmas, text scrolls and such! If you find them, I'd love to watch you work through them on the channel :)
Great work! I tried my approach but with assembly and firing code directly, without any OS. Must say, that's a struggle. Anyway, even poking through something as ancient as DOS in C must be a head ache today and quite demanding learning curve. Yo did a nice work! 👍
Early PC BIOSes were just like a ROM for an 8-bit computer, a hand-written set of routines written in an assembler and burned into a mask ROM. It would later become an EEPROM so that it could be updated, and by the time of the "Award Modular BIOS", it was pretty much that: Modular, composed of many assembly files and a few others as well. Some computers had full-screen boot graphics. Just substitute that module for the one that did the normal Award boot screen. Some had SCSI hard drive interfaces instead of or addition to IDE, Just drop in the different pieces. Int 10h wasn't the main BIOS chip on the motherboard as you know, but the BIOS chip on your video card. As long as it provided a proper int 10h video BIOS interface, it didn't matter what the card did internally as far as DOS was concerned. Of course if it didn't do things the way MDA/CGA/EGA/VGA/VESA did them, lots of software would fail, so those became the baselines. But because everyone implemented those standards, it was easy to write to the VGA memory and registers directly. If you wanted to play with the segmented architecture and work in DOS real mode, you might try to see if you can pick up a copy of Borland C++ 3.1 or Turbo C++ 3.1 (the former is the same thing with extra stuff included…) A later Borland C++ compiler was eventually made free software I think, but not the older Turbo C++. Still, you can find it on winworld and … the fact that Borland C++ 4.5 was made free software sort of suggests that nobody gives a crap if you yarr matey the old version at this point. Back then it was real handy to be able to set VGA 80x25 by simply: _asm { mov ax, 0x03 int 0x10 } The gcc way of doing even that much … is kinda gross. But at least djgpp gives you a nice C++-like way to make BIOS calls from DPMI which is all you needed for most programs on any system DJGPP is likely to be used on (probably 486+…) I miss this era of programming. You could, and if you were serious you would, learn exactly how the hardware you were coding on behaved. A decade earlier, it would've been literally down to the ICs on the board, buy at this point it was still done by understanding each memory mode, CPU and hardware registers, I/O ports and IRQs, and yeah, a bit still about how the underlying chips performed. I don't even know modern amd64 assembly. What's the point? The mnemonics are getting kind of ridiculous, we're up from the better part of a dozen addressing modes to that plus instruction and data modes, you _can't_ access the hardware directly and are supposed to treat it like a black box with a limited and defined ABI, and it's "wrong" to depend on a given baseline of features because this year's hardware may or may not have all of the things last year's had. It's all handled by the compiler now to use or not use features if they are detected at runtime, without you worrying about it. This means you can use nice pretty-looking source code high level languages like Python and Ruby and Lua and treat them like serious development tools because they are … but it means you don't really learn how anything works anymore.
From graphic mode into text mode mov ax,3 int 10 From 80x25 to 80x50 with 8x8 character size like norton commander: xor bx,bx mov ax, 1112 int 10 From 80x50 to 80x25 with 8x16 character size: xor bx,bx mov ax, 1114 Int 10
@myne00 those people don't make very clever devs. The ones who want to understand the clever tricks that make computers work are the ones who will write clever code that uses the hardware well.
Back in the 8-Bit days, I was very fond of self-modifying code to get around memory limitations for program size. Instead of having to store all the code in memory, the program itself would generate the code on the fly and just having memory what it needed to run at the time. It's been so long since systems have "allowed" me to do that and between age and having two strokes I I'm not sure I could still do that if given the opportunity. Still, I don't like being told you can't, and I'm still fond of trying to make the impossible possible. Do you think in a modern system one might be able to write a low-level driver to modify mmu access so to allow use of addresses that are not allowed? Do you know where I could find more about accessing the memory management unit, both as a driver as well as modified bios?
Ive still got a vga reference manual with the register codes for each different card. Its massive and takes up a huge chunk of my bookshelf. The interrupt manual was even bigger - i don't know what became of my copy.
As I remember my school age (end of 1990-th) this issue with separated symbols came when I tried some videomodes with int10h. My theory is that there is some modes, where 1 bit of font is ignored (i.e. from 8x14 symbol only taken 7x14 pixels). Or in some modes one additional pixel is added between symbols. Also I saw that spaces when some residential apps like ciryllic font driver changed video mode. So just try other modes with int10h - there are some of them beyond standard values, described in manuals.
There's two modes - 8 bits per character clock and the other one that extends to 9 by inserting a blank bit on every line or, for a handful of characters, a copy of the 8th bit (to allow for the box drawing characters to function properly). The Award BIOS uses the former, in EGA mode with 14 lines per character.
The "original PC" was not in EGA, but CGA. EGA was introduced with the PC/AT. However, by the time the EPA logos appeared on the POST screen, everybody had (S)VGA. The standard VGA text screen just doesn't lend itself very well for those pseudo-graphics, because of the 8/9 column thing.
I used custom fonts to show graphic thumbnails in the MS-DOS version of the World Book Encyclopedia. It was very cool to have graphics mixed in with the article text and have it scroll at full speed.
what IDE is that? First I thought it was just Borland C++ with custom settings for using gcc instead of bcc, but then I noticed the forward slashes in the file names in the window titles, which is not something Borland did. It must be a newer IDE (DOS tools never used forward slashes), so now I'm curious :)
I always thought the Energy logo is some kind of graphics trickery. I've recreated that POST screen for fun, however I did this by implementing a method to output text in graphics mode using the VGA font.
Quick basic has those text and graphics modes built in, I used to mess around with them all the time as a kid. Perhaps you could compile a stub that just cycles through the screen modes and take a look at the disassembly.
My initial guess is: a custom font or characters (it was possible to set on a BIOS level), which got swapped to regular ones before the OS started booting. EDIT: Yup, that's it. I've learned that when I was learning programming back in the 90. As for the gaps, you probably just need to choose a different video mode - one that has the same font size, the logo characters have. As you stated in the video: one was EGA, the other was VGA. I woudn't be surprised if the font was designed for a specific video mode. Also, demo programming? I really miss the demoscene. :)
The reason is, in the hardware, it extends the 8th pixel into the 9th, only for a certain range of characters, the so-called "box-drawing" characters. For all other characters, the 9th pixel is transparent. Using an 8 pixel per character mode would fix it (EGA).
The fact that you cleared the screen(memory) when you set the screen mode I believe is evidence that you infact changed video mode... I believe you might be looking for mode 0 at system boot; and if you set the video mode to 0 from mode 0 the screen shouldn't clear. I suppose you could change modes and change back to clear the screen, but I think the fastest way to do it is to just write blank characters(/0 or a space) to the bytes that represent unused characters in video memory.
I just found your channel, good stuff! I found a book in the library back in the early 90s that also came with a disk (As they often did back then). The book and software were for making fractals, and the software had tons of non-standard graphics modes that seemed to all work. I found a long out of print second edition, so I don't know if it's the one I remember from the library, but my copy only has the CD and is missing the disk. "Fractal Creations" by "The Waite Group" with Tim Wegner and Bert Tyler as the authors. I'm sure the software and the source code is easy to find, but this second edition book doesn't have nearly the detail I remember keeping me busy for months.
That's a way of filling in the 9th pixel with either a column of foreground pixels or background pixels. It won't help here. He needs a text mode with 8 pixels wide characters.
It is 35 year old memory, but as far as I remember, we had to set the graphic mode to get the fonts changed. I had to use an integer number while setting the graphic mode and that gave me different VGA, EGA modes with different text size screens yet I could draw over it. BTW I am guessing you are using Turbo C. If you are then its help is amazing and I learned it all from the HELP menu. You will find this information in the HELP. Look for graphic modes.
The ROM doesn't contain any CPU microcode in it at all. The CPU microcode is what tells the CPU what functions to perform when the instruction says MOV AX, [BP - 27] for example. That's a lot for the CPU to do in one cycle, so the microcode breaks that down into a few very simple steps.
Don't know if it helps, or, whether this is RUclipss algo serendipity, however, Dave's Garage has just put up a demo on how to program a matrix screensaver from scratch. Not watched it yet, but, it might have some useful info to cherry pick from?
I used to do BASIC programming in DOS when I was a kid, and always wondered how computer can draw graphics on a screen mode that is obviously text mode,hence dos BASIC didn't allow you to draw graphics in text mode because DOS didn't allow BASIC to do it and again because BIOS routines were written that way😅. I learned many years later ( from Bits und Bolts) that the graphics are acrually custom ASCII charachter blocks.
I seem to recall that the specific font would be in the ROM somewhere on the graphics card so when in text mode the specific features of the font were dependent on that but in DOS you could load other characters if you wanted which would be used instead. I think my first machine came with utilities for this. The resolution in text mode isn't the same as in graphics mode which would explain why there were different proportions, I recall that the typefaces in graphics mode always looked a bit odd compared with the text mode ones.
at 2:51 you start compiling an say "this will take ages", but you appear to be running Turbo C++, the fastest compiler at the time. Then I noticed that the compiler is gcc, so what is your toolchain?
you know something went horribly wrong when you need a dos extender to clear the screen. or when you ended up in protected mode for something as trivial as displaying some text in the first place.
You know something has gone fantastically well when you realize that, despite certain difficulties, you have direct access to your computer hardware, which is well documented and published without restrictions. The same cannot be said for much of today's obscure and restrictive hardware.
nothing went wrong, sometimes you just want to have fun with DOS without having to learn about stupid segmented memory. protected mode makes things super simple when programming in C
Before starting my last DOS video I did briefly wonder if I should just stick to Turbo C++ and real mode. Then I figured if I was going to emulate a fancy 486 I might as well use the chip "properly". I'll go play with real mode (and become a Real Programmer I guess...) when I get around to assembly.
There was a trick when VGA mode started using 9-column characters. Wiki says: "In Line Graphics Enable mode, which causes code points 0xC0 to 0xDF inclusive[6] to have the 8th column repeated as the 9th.". I recall the repeating part, because I fiddled with redefining characters, but not that the repeating was restricted only to certain character codes. Maybe this feature could be switched off on demand using some registers.
I recall you could avoid the pixel gap when using the box drawing characters somehow. Or maybe that character range is a special case on vga, in which case could you map the custom chars to the box line char numbers?
Don't forget the palette adjusting for fading at the end :) (yes, it's again a graphics mode thing and still have no idea how did they carry out in text mode)
I used to use a game "engine" called megazeux that had a text mode that would work on _some_ video cards that would allow for 4 colors per tile, and each would be reduced to 4x14. Very weird, very difficult to work with. I believe it mostly worked with late 90s/early 2000s nvidia and ATI graphics cards but maybe some others.
15:58 "I'm not good at learning a bunch of theory in advance then work it out how to apply it" I am somewhat the same, although my brain also loves random trivia, so I also enjoy when I manage to make practical use of that too. Drawing Mandelbrot is not hard at all, and it's very interesting to optimize because it gets out hand fast.
I suppose if you want to have some period correct type of forum, you'd set up a text mode BBS accessible from Telnet or SSH. I don't know what was popular in the UK, but I spent countless hours accessing bulletin boards using telephone lines. I suspect this is considerably more of a pain than a forum or discord server, so I'm not sure I'm recommending that particular rabbit hole. Really enjoying the videos!
I would visit a forum and/or discord. In fact, I am always on the lookout for these niche communities. The internet looks like it's ruled by giant social networks, but those places suck. I love all the smaller communities I'm a part of. I get much more value out of them.
Fun stuff, mucking about trying to "faithfully" recreating it. The other option is to simply fake it, which would mean just setting the right screen mode and writing your own "raw drawing" parts, essentially recreating that part of the BIOS. Which, to be honest, is what you'll want to do for "demo like" stuff. Many of the "funkier" old school methods were a sort of necessity give HW limitations, but NOT fun bar the "abusing the system" part. If just wanting to do some "cool stuff", given any (half) decent CPU you're better off just using a memory buffer, raw dogging it and then simply copying some "viewport" to the screen memory every frame. But... and there's always a but isn't there... easier doesn't mean easy peasy. You have to write ALL the part you need. Text rendering? That's going to need a bitmap font and some blit'ting routines. So on and so forth. The nice part is that since you're just raw dogging a memory buffer from one place to another, you can write (and test) your "cool part" in a more friendly environment and then move it to the "real environment" pretty much "as is". Sine scrolling "text" is pretty iconic and simple to do for example, you just change the y coord of your base drawing point for every new column, shift the whole block to the left/right and draw the next column. Easy peasy. Unless you have it on top of other stuff. Then you need to do in on a separate buffer and blit it with masking. Ah, there we go ;) Background could be a star field or warp effect, which would be another two iconic ones, each with thousands of variations and challenges.
It's been ages, but I believe it is a MODE call. The font could be CGA/EGA mode due to MGA. Maybe using a monochrome (into EGA) mode may fix the issue? It has to be within the same MODE so it can display the image no matter what display is used. So, a font, that can be used in MGA and EGA modes without the overlap. (8x14?) I am not sure.
VGA text mode adds a 9th column to fonts for spacing. Wikipedia discusses this in better detail on their VGA text mode page. It can be toggled on and off, though I don't recall the specifics. I have a .COM program to turn it off somewhere.
In ancient video modes (cga/mda days) scrolling was as easy as changing 2 words of CRT controller chip configuration. For other modes with non-linear frame buffer I am not sure how difficult might be. That's another deep and cozy rabbit hole 😉
Function ax= hex 1100 or ax= hex 1110 of int hex 10 is for user character. On VGA text mode we start with 80x25 collumn and rows and 8x16 character size, so each character have 16 bytes.
How precisely did you know which ASCII chars output/loop over though? Like, at 14:11 how did you arrive at "the blue guy must be 0xE6-0xEA? EDIT: oh, you're loading them yourself from file into those slots. Okay, so then the glyphs were just stored in that "epa" file, and the only thing you need to know/"guess" is the width in characters of each logo... Alright, got it :)
Just a thought, but have you tried using dosemu2 instead of DOSBox for DOS/DJGPP development? I's quite nice in that it's like running a modern version of DOS on your native hardware but with quality of life VM features.
Some CRT monitor have an "out of range" message, if no input signal is aviable. I don’t know if a monitor can get special information from the bios, but we can get the EDID data from the monitor with the prefered resolution and the highest refreshrate using 16 bit mode of the CPU.
I could clearly remember that with CRT this mode was noticeable different from normal text mode so my guess was it just graphical mode with using fonts from text mode to make impression of text mode
No, it really is text mode. Specifically, it is 640x400 text mode with an 8x16 font. I don't recall if there is a VGA BIOS call for setting this particular mode, or if it needs to be "tweaked" from a standard mode; but there's more to it than just turning off the ninth bit of the character cell -- the two modes have different pixel clocks. If a tweak is required, it will be the same tweak that transforms (256 colour) 320x200 into 360x200, or (16 colour) 640x480 into 720x480
You've set the screen mode to VGA, but then you're trying to set the font mode to EGA which doesn't make sense. You need to set the screen mode to the correct EGA mode instead of just switching into the screen mode that DOS is already in (where you clear your screen). Just make sure to switch back right before you exit :)
Your text mode is 720 x 400, but 80 characters wide. 80 characters by 8 bits wide needs 640 pixels, so it uses a single pixel space between each character. Try text mode 10h (which is true VGA 640 x 350 with 8 x 14 fonts). The obvious question is, is it not possible to create 16 bit binaries any more? Switching between 32 bit and 16 bit modes with memory thunking has got to be the hard way of doing this.
Well a list of (modern and classic) tools that emit 16-bit code has been eaten by RUclips's machine. You're apparently on your own but the list is extensive.
I wanted to modify the logo on a socket 7 motherboard I have, following BuB's tutorial, but the indexed bmp thing was way too complex to manually do it. This video might have prompted me to do a bmp to epa (with auto color indexing), which the tool provided on that tutorial can't do. Excellent video, I have subscribed!
8:40 Whoa! That's my old Web site (from back when my ISP would host them itself)! I never thought I'd ever find out about someone actually reading it (albeit through the Wayback Machine), but I'm glad you found the information useful. Just out of curiosity, where did you find the link to it?
What are the chances heh
Ha that's cool. I think I just typed something like "award bios format" or something into Google. And yeah it was useful, so thanks!
It's trippy when that happens. A few years ago I stumbled across a youtube video that discussed some old retro sega genesis rom hacking and it featured an little bit on an antiquated graphical editor I'd made back in 2001 for editing the uncompressed/compressed art inside genesis roms. Lol.
Once upon a time on /., I posted a Sidewinder gamepad mapping I made for UltraHLE which gave you three different ways to configure your gamepad which would make it feel more like an N64 controller based on how most N64 games were made. Years later I found a site which was actively pushing it as the defacto way to emulate that experience as closely as possible and it made me chuckle. It was something I whipped together quickly just so that I had some solution I could use. I have no idea how many people really used it but it was strange to see that it had spread beyond my original post.
I found it weird when RUclips showed me recent reviews of obscure PlayStation games I made in the year 2000.
Hello, 86Box lead developer here - both Award and AMI BIOS'es at the time used the EGA 8x14 mode for the POST screen precisely so they could display the logo without having to worry about the character padding to 9 pixels.
I know it's possible to 'tweak' VGA to use 8 pixels for font. But is there a 'standard/proper' way to switch VGA into 640x350 EGA text mode?
@@alexloktionoff6833 VESA modeset .. (should work on 99.9% of video cards)
Where can I find out about how the BIOS interacts with the mmu? My goal is to modify your system or create a driver that allows one to use Isa visa or PCI cards, or external bus like ide or SCSI
*_AS RAM_*
That is , make usable and report to the OS , some arbitrarily huge amount of RAM (up to the max of whatever bit system will be installed,16,32,64)
The problem is I want more available RAM then there is room in real hardware ram for the page table, making paging impossible , not just impractical due to thrashing.
How would I redirect memory access at the BIOS level?
Just for proof of concept I would start by using a dedicated hard drive as RAM, and then the actual ram as an l2 cache. Then if I can get that to work, I would design a card containing dram to serve the same function. I understand the bus speed limitations would make memory access a thousand times slower at least, but when you compare that to having 95% of your memory paged out and constantly thrashing to a slow hard drive, It's actually an improvement.
For such a cluge to work it would likely have to be implemented at the BIOS level. Direct addressing of the mmu at the very least.
Can I pick your brain and where can I learn more about how to do this?
@@alexloktionoff6833 IIRC, you can do this by writing to the video card registers directly, but there is no standard support for doing that via the BIOS INT 10h call. (Note: Configuring the VGA card registers directly yourself is _entirely standard and proper_ for a DOS program to do (and was common practice for lots of programs that wanted to do more than very simple text/graphics displays). It just doesn't have a convenient helper function in the BIOS to make it easy for you, so you need to do more work, is all.)
I think some old BIOSes may have had nonstandard video mode values you could use to switch to some of these alternate modes, but they were never "official", and could vary from one BIOS to another (and would probably not be supported by most emulators)...
PCem still is a better option :)
It's been a very long time, but there are two common text modes: a 640x350 EGA mode with an 8x14 font, and a 720x400 VGA mode with a 9x16 font. If I recall, the 9x16 font is really an 8x16 font with the left-most pixel always blank, and those are your ugly lines. You need to get into that 8x14 character size mode if you want it to display correctly.
It's the rightmost pixel, and it is always blank... except in the characters from the range 0xB0 through 0xDF, the line/box drawing and filled block characters. In those, the ninth column is a double of the eighth column. So if you can create the Energy Star logo out of those characters, you can have it without the lines.
@@bitwize I assume you mean with still changing the font. Although it would avoid the gaps, that wouldn't mean it's displayed correctly. It would still be the same aspect ratio, but with every eighth column doubled, so it would look like a very unevenly scaled version. That hack is definitely not suitable for most graphics.
If you mean drawing a logo with the actual box drawing characters, that's an interesting idea, although I think it would be quite challenging to approximate that logo.
@@bitwize it still would not create a smooth curve
Correct, don't mess with the VGA mode, switch to EGA mode, the aspect ratio and font will look correct.
Nice to know though, I didn't know about this exception for 0xB0-0xDF characters. I recall it puzzled me when I played with font editor as a teenager circa 30 years ago. Mistery solved, finally! :)
Thanks, @bitwize
I loved your video. I was an 18 year old kid who had access to almost nothing, but I loved poking around in interrupts and memory areas. I used Turbo Pascal with a bit of assembly.
Still using 'borland' products
Yep a small book of assembly listing the x86 instructions was my bible
You need text mode 10h instead of 03h:
10h = G 80x25 8x14 640x350 4 2 A000 64k EGA
= G . . 640x350 16 . A000 256k EGA,VGA
I was scrolling through the comments and everyone talking about the 8x14 font size and I'm like, if you know that, help the guy out with getting into it and you're like the first post I noticed that did it. I was about to dig through all my old references. I remembered vaguely what he needed to do, but couldn't remember the video mode. And 10 mode 10 go!
10h is not a text mode. It is a *graphics mode* (that's why it says "G" instead of "T" in that row). Won't work the same way at all...
Es posible realizar las graficas inclusive en Modo texto. Las aplicaciones MSDOS como Norton Disk Doctor hacian eso. Inclusive lo he hecho para hacer graficas en modo texto. Simplemente se asignan(W/8) * (H/16) caracteres ASCII y se les cambia el mapa de bits de dichos caracteres y se los presenta en pantalla.
It is Graphics (G) mode not Text (T) mode, blinking cursor usually only available for T mode.
Hey, cool video.
As for the issue with the gaps. Some people already noted, it is connected to your VGA adapter using 9 pixel wide glyphs (as for 720 internal surface the VGA uses). The last bit is usually set to zero, so there's your black lines coming from. Except the range 0xc0 to 0xdf, the default fonts use this range as block characters, therefore the VGA will extend bit 8 to bit 9 so the block is filling the whole 9 bits and don't suffer the black gap (you can actually see this in your video as well, parts of the star as well as the horizontal line seem to be properly filled, except they arent really).
If you run the program on an EGA or CGA adapter (try configuring the machine of your DoxBox) you'll see the logo is displayed perfectly fine. Thats probably not the fix you are looking for though. 🙂
So, on the VGA you can set 8/9 dot mode flag to 1, so 8 bit wide characters are used: outport(0x3C4, 0x0101).
Then your logo will hopefully shine in all its glory.
Two more things:
- the glyph foreground and background info are also in the epa file. You even loaded the data in your colourmap, but didn't use it somehow later.
- instead of using putchar for the logo it would be probably more natural to write the logo (or the whole screen even) directly to text memory at 8B00:0000.
Cheers
*B800:0000. ♥
I still remember the first time I got a motherboard with that Energy Star logo on it's boot screen... after many motherboards with text only (in those days it was almost "hey, it's been a couple of months... Time for a new motherboard ) suddenly it has this cool graphic on it too.... even though I thought it was SO cool, I never got around to finding out how it was done... I'm actually quite excited to see how you do it.
Basically same here
Award BIOS screen is EGA, supporting both graphics and redefinable characters. As I was into BIOS modding I know for a fact that the Energy Star logo is a bitmap picture in the ROM.
BIOS has a pure text fallback for CGA and MDA if EGA is not available.
MDA was not the abbreviation I expected to see on RUclips today, but here we are. That brings up some lost memories.
@@AnnaVahtera Well let's add a missing one for you, I have started with Pascal 6 on a Hercules Graphics Card (HGC).
A somewhat weird mix from MDA and CGA, but still monochrome.
@@retinaquester Ooh, I had a Hercules card in a.. 286? I think. I owned it only a short while before I got an EGA card.
I also owned the weirdest CGA(-ish) graphics card that I've ever heard. It had support for 8 colors and had four times the memory CGA cards normally had. I never found any programs that actually supported it. (The PC was from a company that used it to draw plans for oil drilling rigs and they apparently needed all that graphics power back then.)
Award BIOS switched to EGA after 4.50 or 4.51. The earlier ones where VGA textmode. You see that in the behavior of the cursor.
you can actually try out the monochrome fallback in 86box
Maybe I remember it wrong, but I believe the logo faded out after some time and it was probably done by bitmap + palette rotation like it was done for Win95 loading screen
Hi NCOT,
The reason there's vertical gaps in your "large" Energy Star logo in the top right corner is that in VGA mode you have an 8px horizontal character grid, but a 9px screen grid. The 8th - "last" - pixel of every line in a character is always duplicated to the 9th pixel. This way you have the possibility to make certain characters (box-drawing characters from the ASCII table's 2nd half, but also the plain old underscore "_") be horizontally continuous. You need to find a BIOS video mode where the horizontal pixels per source character matches the pixels per screen character, i.e. no pixel duplication. AFAIR the Energy Star logo does NOT use these duplicated pixels. It would be very obvious otherwise.
EDITED: Not necesarily. 9th pixel duplication was enabled in the range of characters C0h-DFh when the flag "Line Graphics Enable" was enabled in the Attribute Mode Control Register (Index 10h). I remember being parametrizable in some EGA/VGA clones. When setting a video mode, those came preselected for the graphic characters (the box drawing characters). You can either remap the box drawing characters themselves, or use the registers to add your own characters to the range if you use an emulator that emulates compatible hardware (I think S3 did do it, but I don't know how good is S3 text mode emulation is in dosbox).
That's why after this screen, the BIOS would clear the screen again resetting to a standard mode, and print the second part of the BIOS with the box detailing the CPU model, RAM, etc, resetting the font so it could print the box and then chainload to DOS, which may change the codepage (redefining the font again) without clearing the screen.
@@RubenMartinezCabello Wow. I never knew this was configurable! I need to dig out my MS-DOS LiveCD again, and play with that a bit. Do you believe this INT 10h stuff works just as "back in the day" when subjected to "modern hardware"?
(I once wrote a hotkey-bound screen-blanking TSR in machine code. With dos DEBUG iirc 🙃; some of that knowledge is still there...)
I did things backwards. I learned MS-DOS programming by starting with ASM. I mean I tried C...but the thing I wanted to do tossed me off the low-level cliff and I wound up writing a bunch of assembly.
15:18 Award started using graphics mode from 4.51 or later onwards. Before that, they used text mode with custom characters.
Noticed this myself when working with older computers.
You'll notice this by the cursor characteristics.
To fix your issue, just use the characterspaces where the lines are going trough the right side of the character!
The characters in VGA Textmode are 9x16. (or 9x14 depending on your mode).
On some characters, if the rightmost bit is set, there'll be another bit added in the 9th column!
Should be characters #192-223 afair.
Edit: There are also textmodes with 8x14/8x16 characters. You can use one of them.
2:28 oh , that brings me memories from my childhood, I was 10 and learning to program from quickbasic, I made one of those simulations of the PC booting.
Same here. It was on an XT, so still no EPA logo at the time and the bios vendor was different: American Megatrends...😢😢😢
I love the idea of a forum. Love your videos, thanks so much!
Seconded. I was around 10 when most of this was being phased out. Now that I'm 37, I kind of want to know how my first PC actually worked given that my parents made me touch grass when I spent too much time on it. Discord is too impermanent, and weirdly not anonymous at the same time. I could care less about custom stickers and video chat. The archived wisdom is what people want.
Me after finishing dinner: let me just finish some stuff up before going to bed.
*This video shows up in my feed*
God damn it. Now I need to know how this works.
In the early 2000s some motherboards, like SiS started putting a 4Mb nvram chip as the bios, and you could patch your linux kernel, compile it and use a util to write it into that nvram chip, so when you turned on your computer there was none of that stuff, as it powered on it just said Loading Linux.... and started booting, there was no bios or bootloader.
I had a lot of fun with demo stuff back in the day.
The simplest demo effect to get your head around is probably colour cycling, such as the "wormhole" from Future Crew's "Unreal". You just need a static image, and the challenge is setting the palette using port I/O rather than BIOS calls, and syncing with the frame rate.
Both of these things are important for most demo effects, because one of the things about "real" demos is that effects often fade in and out, and that's all done with palette manipulation in VGA.
The next simplest effect is scrolling credits. You don't often think of this as an effect, but it uses a clever technique that's important to know about. Essentially, you use video memory as a circular buffer, and the "scrolling" is done by telling the VGA hardware where to start drawing from.
The next simplest after that is probably vector dots, such as the "tunnel" from Second Reality. It can be done in VGA mode 13h, although Mode X is more common because the pixels are actually square. The main things that you need to know from the logic side are working with 32-bit fixed point arithmetic (typically 16 bits of integer and 16 bits of fraction), and precomputing sin/cos tables.
On the graphics side, addressing VGA video memory (especially planar memory in the case of Mode X) is a little tricky, and using the memory latches effectively is part of the art of getting your demo effects to be performant. Eventually, you will work out for yourself why DOOM runs so damn fast: it draws all of the walls and sprites vertically.
Not only demos, games in the VGA DOS times used that extensively, even if you where a bedroom hobby coder and "just" coded a little game in QBasic it was a nice way of getting some animation going without using much CPU cycles.
For example id Tech 1, aka the Doom engine, used it for different brightness levels in the different sectors for example, you really only have eight brightness levels and the game runs on a palette of 32 colors in different brightness levels, with stuff like the invulnerability sphere or the brightness googles just using a different palette.
Dave Brackeen's "256-Color VGA Programming in C" web tutorial is a good start for fast VGA under DOS.
You just re-aligned so many memory regions in my old brain, that I was actually granted access again :D
Would love to see a video about the EMM386 hacks (Not sure anymore but I think it was called EMM286 if I'm not mistaken here, way too long ago^^) that made some extended memory apps work on 286 as well, I was never really able to wrap my head around it back then.
awesome vid and a new sub
Re: the lines between each character, this is something you can toggle with text mode - I don't recall if it adds extra lines or changes the resolution.
I'd find the PDF of PC Intern as it covers this (it was a 90s era book and came with its own PDF).
There are different editions, mine had C, pascal and maybe even basic.
Yes, this was also a revelation for me. Even we have 21 century all VGA monitors must support de-facto standard 640x350@70Hz
Thanks for bringing back my memories. During my college years (93-96), I used this BIOS interrupt to customize the character set particularly to display a box on the screen with borders similar to Windows 3.11 or Norton Utilities 7.0 in text mode only. I only used extended ASCII box-drawing characters with no vertical gap when displayed.
wow, DJGPP sure brought back some memories - that's what I used when I first learned to code in C++ in grade 10, back in 1998!!!
BIOS has microcode in it??! How have I not known that for the last 40 years. Very interesting video
Did you know that modern CPUs can't start up? AMD uses their security processor to start it, and Intel uses their management engine processor. The RAM and PCIe don't work at power up, they don't have the calibration programmed in to deskew and set up the impedance adjustments. If you go back a little further, there are CPUs that only use their cache at startup, and it is enough to get through the memory and PCIe lane training.
Growing up with DOS, I saw a few dozen text mode apps that rewrote the font for custom graphics... and hundreds that did not. It was really rare. I think my favourite was this file manager that had radio buttons for settings, and the circles were taller than 1 character, so there was a character with the very top of a circle, and one with the very bottom. It looked great! The app had a bunch of subtle graphics effects like that, was cool.
I never learned how to rewrite the in-memory text mode font, but always thought it was way under-utilised. Would have been awesome for a roguelike game, you could have 150 or so custom sprites, along with letters. More if you only used uppercase letters. Combine that with 16 colours and you could do pretty impressive things in "text mode"!
It was a real pleasure to hear mention of machines like the BBC Micro and especially the ZX Spectrum - these were the very machines where it all began for many of us. To be honest, I never even considered before that UDG might exist on the x86 platform at all, although I did do a bit of programming under DOS before, using int10h and VGA.
UDG?
@@AureliusR UDG = User Defined Graphics, custom data instead of some specific character(-s) or custom font completely. In docs it mentioned as "user specified patterns". What I mean is shown somewhere at 10:06 :)
@@k0va1 Oh, I just hadn't heard that acronym before. I had to create a similar thing for a C64 program I've been slowly building
Boy does this bring back memories indeed. I remember using the VESA Bios Extension (VBE) in protected mode to access a Linear FrameBuffer (LFB) of the graphical display memory. There was a program called UniVBE/Scitech Display Doctor that you could run on graphics cards where the bios did not yet support that yet.
Yeah... learning by doing is the best way... learning by doing an actual task too... some of my mates love "coding katas" but it's so much better to have a sort-of realistic goal.... Great stuff!
Hmm at 11:14; when you called int 10 you put a divergent value compared to the documentation in AX (1110 vs 1100).
What’s the difference?
Interesting video. Brought back a funny memory from high school. My dad set a BIOS password on our home PC, and only told it to my older sisters, who were only allowed to enter it for us if we had homework to do on the PC. So while I was doing my homework on the PC, I wrote an approximation of the BIOS screen in QBasic, then told my sister the PC had crashed, and asked her to type the password again. My program then saved her input to a text file, and voila, I now knew the password.
I was waiting this video weeks ago!!! I have been searching about this task also sinceb you told it on the last video. I love this kind of challenge!!
PC Intern was a great book for this era of programming, and has some examples for changing the characters in VGA text mode.
You could load two character sets (maybe this is what BH in the load function points to).
The second set would be used if the high bit of the colour byte was set.
In this way you can have a whole 256 characters for drawing at the same time as an ordinary one (if you also tell it that the high bit shouldn't make the characters blink).
If I recall some Norton tools used a similar technique to make the DOS block mouse into a smooth "windows like" arrow that was moving pixel by pixel on the text screen modes.
I remember reading that when I was a teenager and coding a bunch of DOS stuff and thinking, oh my god that sounds so cool I should implement this... dear god.. That was a week.
AFAIK, the EPA BIOS Screen was EGA 640x350 and 80x25 using 8x14 Charset thus resulting in a slightly larger font. Maybe you selected the VGA 640x480 mode with 9x16 Charset, which would also explain the blank lines between each individual character…
I still remember using assembler to use in and out commands to put data in a000 (vga video memory) to put pixels on screen. And pallette swap/cycles to give it an animation feeling. I called int 21 also a lot for all the DOS functions.
A few bits about the comparison you did to a real Award BIOS near the end. You can force 86Box to run in 4:3 from the View menu, this will probably make it look more like you'd expect it to look on a real screen. EGA was 640x350 if I recall, so would look vertically stretched on a 4:3 screen. I wouldn't be too concerned about the font because it was very specific to the video card manufacturer. The one in your 86Box VM looks somewhat like an S3 card. ATI had a different one, and Cirrus Logic used a different one that's very similar to what Nvidia used. It's also possible to change the font in DOS by using MODE to change the codepage, the font in your version looks very like the one from the EGA.CPI file.
A tiny pacman animation for the command prompt using 8*3=24 user character starting with extended ASCII number 128.
The body starts inside of two character and each step it moves one pixel to the right side into a third character while open and close the mouth. And then it starts again one location(8 bit) to the right side.
It save to executable. The first with all bytes and the second with the animation routine only. The cls command of DosBox reset all character to default.
-a
072D:0100 mov ax,1110
072D:0103 mov bp,170 ; offset of character font (DOS com files start with DS=ES=CS=SS)
072D:0106 mov cx,18 ; 24 character
072D:0109 mov dx,80 ; start with ASCII number 128
072D:010C xor bl,bl ; block 0 = override the existing character
072D:010E mov bh,10 ; 16 bytes for one character
072D:0110 int 10
072D:0112 mov bx,8 ; row
072D:0115 mov dx,18 ; collumn
072D:0118 mov bp,bx
072D:011A shl bx,7
072D:011D shl dx,1
072D:011F shl bp,5
072D:0122 add bx,dx
072D:0124 add bp,bx
072D:0126 mov ax,b800
072D:0129 mov es,ax
072D:012B cld
072D:012C mov ah,e ; color attribut
072D:012E mov ch,18
072D:0130 mov di,bp
072D:0132 mov al,80 ; start with ASCII number 128
072D:0134 mov cl,8
072D:0136 stosw
072D:0137 inc al
072D:0139 stosw
072D:013A inc al
072D:013C stosw
072D:013D inc al
072D:013F sub di,6
072D:0142 mov bl,al
072D:0144 mov dx,3DA
072D:0147 mov si,7000 ; delay
072D:014A in al,dx
072D:014B test al,8
072D:014D jnz 014A
072D:014F dec si
072D:0150 jnz 014A
072D:0152 mov al,bl
072D:0154 dec cl
072D:0156 jnz 0136
072D:0158 mov byte ptr es:[bp],20 ; space
072D:015D add bp,2
072D:0160 dec ch
072D:0162 jnz 0130
072D:0164 ret
072D:0165 org 0170
072D:0170 DB 0,3,7,1e,3e,3f,7f,ff,ff,7f,3f,3f,1f,7,3,0
072D:0180 DB 0,c0,e0,78,60,c0,80,0,0,80,c0,e0,f8,e0,c0,0
072D:0190 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
072D:01A0 DB 0,1,3,f,1f,1f,3f,7f,7f,3f,1f,1f,f,3,1,0
072D:01B0 DB 0,e0,f0,38,3c,f8,f0,c0,c0,f0,f8,fc,fc,f0,e0,0
072D:01C0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
072D:01D0 DB 0,0,1,7,f,f,1f,3f,3f,1f,f,f,7,1,0,0
072D:01E0 DB 0,f0,f8,9e,9f,ff,fc,e0,e0,fc,ff,fe,fc,f8,f0,0
072D:01F0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
072D:0200 DB 0,0,0,3,7,7,f,1f,1f,f,7,7,3,0,0,0
072D:0210 DB 0,78,fc,cf,cf,ff,ff,fe,fe,ff,ff,ff,ff,fc,78,0
072D:0220 DB 0,0,0,0,80,80,c0,0,0,c0,80,0,0,0,0,0
072D:0230 DB 0,0,0,1,3,3,7,f,f,7,3,3,1,0,0,0
072D:0240 DB 0,3c,7e,e7,e7,ff,ff,ff,ff,ff,ff,ff,ff,7e,3c,0
072D:0250 DB 0,0,0,80,c0,c0,e0,f0,f0,e0,c0,80,80,0,0,0
072D:0260 DB 0,0,0,0,1,1,3,7,7,3,1,1,0,0,0,0
072D:0270 DB 0,1e,3f,f3,f3,ff,ff,fc,fc,ff,ff,ff,ff,3f,1e,0
072D:0280 DB 0,0,0,c0,e0,e0,80,0,0,80,e0,c0,80,0,0,0
072D:0290 DB 0,0,0,0,0,0,1,3,3,1,0,0,0,0,0,0
072D:02A0 DB 0,f,1f,e9,f9,ff,ff,fe,fe,ff,ff,ff,7f,1f,f,0
072D:02B0 DB 0,0,80,e0,f0,c0,80,0,0,0,e0,e0,c0,80,0,0
072D:02C0 DB 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0
072D:02D0 DB 0,7,f,3c,7c,7f,ff,ff,ff,ff,7f,7f,3f,f,7,0
072D:02E0 DB 0,80,c0,e0,f0,e0,c0,0,0,c0,e0,f0,f0,c0,80,0
072D:02F0
-n PACMAN.COM
-rcx
CX 0000 :1F0
-wcs:100
Writing 01F0 bytes
-n PAC.COM
-rcx
CX 01F0 :53
-wcs:112
Writing 0053 bytes
-q
I always thought the EnergyStar EPA logo was some sort of graphical trick. I should have known they were simply replacing the extended ASCII characters.
7:45 “Because this is a mid-90’s PC, it’s barely capable of doing anything when you first turn it on.“ I am a mid-90’s child and this is now becoming true for me too.
Would also love to know if there are good resources for demo techniques like plasmas, text scrolls and such! If you find them, I'd love to watch you work through them on the channel :)
Great work! I tried my approach but with assembly and firing code directly, without any OS. Must say, that's a struggle. Anyway, even poking through something as ancient as DOS in C must be a head ache today and quite demanding learning curve. Yo did a nice work! 👍
Early PC BIOSes were just like a ROM for an 8-bit computer, a hand-written set of routines written in an assembler and burned into a mask ROM. It would later become an EEPROM so that it could be updated, and by the time of the "Award Modular BIOS", it was pretty much that: Modular, composed of many assembly files and a few others as well. Some computers had full-screen boot graphics. Just substitute that module for the one that did the normal Award boot screen. Some had SCSI hard drive interfaces instead of or addition to IDE, Just drop in the different pieces.
Int 10h wasn't the main BIOS chip on the motherboard as you know, but the BIOS chip on your video card. As long as it provided a proper int 10h video BIOS interface, it didn't matter what the card did internally as far as DOS was concerned. Of course if it didn't do things the way MDA/CGA/EGA/VGA/VESA did them, lots of software would fail, so those became the baselines. But because everyone implemented those standards, it was easy to write to the VGA memory and registers directly.
If you wanted to play with the segmented architecture and work in DOS real mode, you might try to see if you can pick up a copy of Borland C++ 3.1 or Turbo C++ 3.1 (the former is the same thing with extra stuff included…) A later Borland C++ compiler was eventually made free software I think, but not the older Turbo C++. Still, you can find it on winworld and … the fact that Borland C++ 4.5 was made free software sort of suggests that nobody gives a crap if you yarr matey the old version at this point.
Back then it was real handy to be able to set VGA 80x25 by simply:
_asm {
mov ax, 0x03
int 0x10
}
The gcc way of doing even that much … is kinda gross. But at least djgpp gives you a nice C++-like way to make BIOS calls from DPMI which is all you needed for most programs on any system DJGPP is likely to be used on (probably 486+…)
I miss this era of programming. You could, and if you were serious you would, learn exactly how the hardware you were coding on behaved. A decade earlier, it would've been literally down to the ICs on the board, buy at this point it was still done by understanding each memory mode, CPU and hardware registers, I/O ports and IRQs, and yeah, a bit still about how the underlying chips performed.
I don't even know modern amd64 assembly. What's the point? The mnemonics are getting kind of ridiculous, we're up from the better part of a dozen addressing modes to that plus instruction and data modes, you _can't_ access the hardware directly and are supposed to treat it like a black box with a limited and defined ABI, and it's "wrong" to depend on a given baseline of features because this year's hardware may or may not have all of the things last year's had. It's all handled by the compiler now to use or not use features if they are detected at runtime, without you worrying about it.
This means you can use nice pretty-looking source code high level languages like Python and Ruby and Lua and treat them like serious development tools because they are … but it means you don't really learn how anything works anymore.
Most people don't care how anything works, only that it does.
From graphic mode into text mode
mov ax,3
int 10
From 80x25 to 80x50 with 8x8 character size like norton commander:
xor bx,bx
mov ax, 1112
int 10
From 80x50 to 80x25 with 8x16 character size:
xor bx,bx
mov ax, 1114
Int 10
@myne00 those people don't make very clever devs. The ones who want to understand the clever tricks that make computers work are the ones who will write clever code that uses the hardware well.
Back in the 8-Bit days, I was very fond of self-modifying code to get around memory limitations for program size. Instead of having to store all the code in memory, the program itself would generate the code on the fly and just having memory what it needed to run at the time. It's been so long since systems have "allowed" me to do that and between age and having two strokes I I'm not sure I could still do that if given the opportunity.
Still, I don't like being told you can't, and I'm still fond of trying to make the impossible possible.
Do you think in a modern system one might be able to write a low-level driver to modify mmu access so to allow use of addresses that are not allowed? Do you know where I could find more about accessing the memory management unit, both as a driver as well as modified bios?
I miss old computers. I wish this could run on MacOS
Ive still got a vga reference manual with the register codes for each different card. Its massive and takes up a huge chunk of my bookshelf. The interrupt manual was even bigger - i don't know what became of my copy.
As I remember my school age (end of 1990-th) this issue with separated symbols came when I tried some videomodes with int10h. My theory is that there is some modes, where 1 bit of font is ignored (i.e. from 8x14 symbol only taken 7x14 pixels). Or in some modes one additional pixel is added between symbols. Also I saw that spaces when some residential apps like ciryllic font driver changed video mode. So just try other modes with int10h - there are some of them beyond standard values, described in manuals.
There's two modes - 8 bits per character clock and the other one that extends to 9 by inserting a blank bit on every line or, for a handful of characters, a copy of the 8th bit (to allow for the box drawing characters to function properly). The Award BIOS uses the former, in EGA mode with 14 lines per character.
Nice work on this! Great BIOS memories.
The "original PC" was not in EGA, but CGA. EGA was introduced with the PC/AT. However, by the time the EPA logos appeared on the POST screen, everybody had (S)VGA. The standard VGA text screen just doesn't lend itself very well for those pseudo-graphics, because of the 8/9 column thing.
I used custom fonts to show graphic thumbnails in the MS-DOS version of the World Book Encyclopedia. It was very cool to have graphics mixed in with the article text and have it scroll at full speed.
what IDE is that? First I thought it was just Borland C++ with custom settings for using gcc instead of bcc, but then I noticed the forward slashes in the file names in the window titles, which is not something Borland did. It must be a newer IDE (DOS tools never used forward slashes), so now I'm curious :)
I think it's DJGPP.
I always thought the Energy logo is some kind of graphics trickery. I've recreated that POST screen for fun, however I did this by implementing a method to output text in graphics mode using the VGA font.
Quick basic has those text and graphics modes built in, I used to mess around with them all the time as a kid.
Perhaps you could compile a stub that just cycles through the screen modes and take a look at the disassembly.
My initial guess is: a custom font or characters (it was possible to set on a BIOS level), which got swapped to regular ones before the OS started booting.
EDIT: Yup, that's it. I've learned that when I was learning programming back in the 90. As for the gaps, you probably just need to choose a different video mode - one that has the same font size, the logo characters have. As you stated in the video: one was EGA, the other was VGA. I woudn't be surprised if the font was designed for a specific video mode.
Also, demo programming? I really miss the demoscene. :)
The reason is, in the hardware, it extends the 8th pixel into the 9th, only for a certain range of characters, the so-called "box-drawing" characters. For all other characters, the 9th pixel is transparent. Using an 8 pixel per character mode would fix it (EGA).
The fact that you cleared the screen(memory) when you set the screen mode I believe is evidence that you infact changed video mode... I believe you might be looking for mode 0 at system boot; and if you set the video mode to 0 from mode 0 the screen shouldn't clear. I suppose you could change modes and change back to clear the screen, but I think the fastest way to do it is to just write blank characters(/0 or a space) to the bytes that represent unused characters in video memory.
This was all bread and butter for me in the 90s :). Brings back memories...
This is excellent- great way to tackle this stuff
I just found your channel, good stuff! I found a book in the library back in the early 90s that also came with a disk (As they often did back then). The book and software were for making fractals, and the software had tons of non-standard graphics modes that seemed to all work. I found a long out of print second edition, so I don't know if it's the one I remember from the library, but my copy only has the CD and is missing the disk. "Fractal Creations" by "The Waite Group" with Tim Wegner and Bert Tyler as the authors. I'm sure the software and the source code is easy to find, but this second edition book doesn't have nearly the detail I remember keeping me busy for months.
The magic word your most likely are looking for is called : Line Graphics Enable (haven't played with it myself, but seems correct). Good luck!
That's a way of filling in the 9th pixel with either a column of foreground pixels or background pixels. It won't help here. He needs a text mode with 8 pixels wide characters.
a staircase will be the result.
It is 35 year old memory, but as far as I remember, we had to set the graphic mode to get the fonts changed. I had to use an integer number while setting the graphic mode and that gave me different VGA, EGA modes with different text size screens yet I could draw over it. BTW I am guessing you are using Turbo C. If you are then its help is amazing and I learned it all from the HELP menu. You will find this information in the HELP. Look for graphic modes.
Very nice to see this example.
Good explanation i never knew that it were actually ascii characters
The ROM doesn't contain any CPU microcode in it at all. The CPU microcode is what tells the CPU what functions to perform when the instruction says MOV AX, [BP - 27] for example. That's a lot for the CPU to do in one cycle, so the microcode breaks that down into a few very simple steps.
quality
keep it up
you already have this, king 👑
Don't know if it helps, or, whether this is RUclipss algo serendipity, however, Dave's Garage has just put up a demo on how to program a matrix screensaver from scratch.
Not watched it yet, but, it might have some useful info to cherry pick from?
CPU twice faster then mine 😀
Awesome retro, thank you. Beautiful memories, start programming, first enter in protected mode. What a thrill 😛
I used to do BASIC programming in DOS when I was a kid, and always wondered how computer can draw graphics on a screen mode that is obviously text mode,hence dos BASIC didn't allow you to draw graphics in text mode because DOS didn't allow BASIC to do it and again because BIOS routines were written that way😅. I learned many years later ( from Bits und Bolts) that the graphics are acrually custom ASCII charachter blocks.
I seem to recall that the specific font would be in the ROM somewhere on the graphics card so when in text mode the specific features of the font were dependent on that but in DOS you could load other characters if you wanted which would be used instead. I think my first machine came with utilities for this. The resolution in text mode isn't the same as in graphics mode which would explain why there were different proportions, I recall that the typefaces in graphics mode always looked a bit odd compared with the text mode ones.
That's how all games are done on the Commodore 64. We move text around and directly manipulate the font in memory.
at 2:51 you start compiling an say "this will take ages", but you appear to
be running Turbo C++, the fastest compiler at the time. Then I noticed that the
compiler is gcc, so what is your toolchain?
DJGPP - This is a very old version of GCC that was ported to the DOS and ran in extended mode with its own DOS extender.
you know something went horribly wrong when you need a dos extender to clear the screen. or when you ended up in protected mode for something as trivial as displaying some text in the first place.
You know something has gone fantastically well when you realize that, despite certain difficulties, you have direct access to your computer hardware, which is well documented and published without restrictions. The same cannot be said for much of today's obscure and restrictive hardware.
nothing went wrong, sometimes you just want to have fun with DOS without having to learn about stupid segmented memory. protected mode makes things super simple when programming in C
Before starting my last DOS video I did briefly wonder if I should just stick to Turbo C++ and real mode. Then I figured if I was going to emulate a fancy 486 I might as well use the chip "properly". I'll go play with real mode (and become a Real Programmer I guess...) when I get around to assembly.
@frankiejcr YWONABH
There was a trick when VGA mode started using 9-column characters. Wiki says: "In Line Graphics Enable mode, which causes code points 0xC0 to 0xDF inclusive[6] to have the 8th column repeated as the 9th.". I recall the repeating part, because I fiddled with redefining characters, but not that the repeating was restricted only to certain character codes. Maybe this feature could be switched off on demand using some registers.
I think there's some VGA register that needs to be dinked to set the character cell width from 9 to 8.
I recall you could avoid the pixel gap when using the box drawing characters somehow. Or maybe that character range is a special case on vga, in which case could you map the custom chars to the box line char numbers?
I think the special case might actually go all the way back to MDA.
Don't forget the palette adjusting for fading at the end :) (yes, it's again a graphics mode thing and still have no idea how did they carry out in text mode)
It is made with user character in text mode and each location have one foreground color.
@@maxmuster7003 that part is clear. for the fading I assume that the palette can be set in text mode as well.
@eaty7dhu Yes hex port 3c8 color and hex port 3c9 with three values for R, G, B each from 0 to 63.
I used to use a game "engine" called megazeux that had a text mode that would work on _some_ video cards that would allow for 4 colors per tile, and each would be reduced to 4x14. Very weird, very difficult to work with. I believe it mostly worked with late 90s/early 2000s nvidia and ATI graphics cards but maybe some others.
How did you change the rendering of ascii characters from how it was at 15:35 to how it was in 15:22?
15:58 "I'm not good at learning a bunch of theory in advance then work it out how to apply it"
I am somewhat the same, although my brain also loves random trivia, so I also enjoy when I manage to make practical use of that too.
Drawing Mandelbrot is not hard at all, and it's very interesting to optimize because it gets out hand fast.
I suppose if you want to have some period correct type of forum, you'd set up a text mode BBS accessible from Telnet or SSH. I don't know what was popular in the UK, but I spent countless hours accessing bulletin boards using telephone lines. I suspect this is considerably more of a pain than a forum or discord server, so I'm not sure I'm recommending that particular rabbit hole.
Really enjoying the videos!
Pain is what drives us. Good idea.
I would visit a forum and/or discord. In fact, I am always on the lookout for these niche communities. The internet looks like it's ruled by giant social networks, but those places suck. I love all the smaller communities I'm a part of. I get much more value out of them.
i always wondered how the picture got printed on the screen, thanks for this
That BIOS start screen is the times of computers!
Fun stuff, mucking about trying to "faithfully" recreating it. The other option is to simply fake it, which would mean just setting the right screen mode and writing your own "raw drawing" parts, essentially recreating that part of the BIOS. Which, to be honest, is what you'll want to do for "demo like" stuff. Many of the "funkier" old school methods were a sort of necessity give HW limitations, but NOT fun bar the "abusing the system" part. If just wanting to do some "cool stuff", given any (half) decent CPU you're better off just using a memory buffer, raw dogging it and then simply copying some "viewport" to the screen memory every frame. But... and there's always a but isn't there... easier doesn't mean easy peasy. You have to write ALL the part you need. Text rendering? That's going to need a bitmap font and some blit'ting routines. So on and so forth. The nice part is that since you're just raw dogging a memory buffer from one place to another, you can write (and test) your "cool part" in a more friendly environment and then move it to the "real environment" pretty much "as is".
Sine scrolling "text" is pretty iconic and simple to do for example, you just change the y coord of your base drawing point for every new column, shift the whole block to the left/right and draw the next column. Easy peasy. Unless you have it on top of other stuff. Then you need to do in on a separate buffer and blit it with masking. Ah, there we go ;) Background could be a star field or warp effect, which would be another two iconic ones, each with thousands of variations and challenges.
It's been ages, but I believe it is a MODE call. The font could be CGA/EGA mode due to MGA. Maybe using a monochrome (into EGA) mode may fix the issue?
It has to be within the same MODE so it can display the image no matter what display is used.
So, a font, that can be used in MGA and EGA modes without the overlap. (8x14?) I am not sure.
VGA text mode adds a 9th column to fonts for spacing. Wikipedia discusses this in better detail on their VGA text mode page. It can be toggled on and off, though I don't recall the specifics. I have a .COM program to turn it off somewhere.
In ancient video modes (cga/mda days) scrolling was as easy as changing 2 words of CRT controller chip configuration. For other modes with non-linear frame buffer I am not sure how difficult might be. That's another deep and cozy rabbit hole 😉
The book "zen of Graphics Programming" by mark abrash is a good resource as well.
Function ax= hex 1100 or ax= hex 1110 of int hex 10 is for user character. On VGA text mode we start with 80x25 collumn and rows and 8x16 character size, so each character have 16 bytes.
How precisely did you know which ASCII chars output/loop over though? Like, at 14:11 how did you arrive at "the blue guy must be 0xE6-0xEA? EDIT: oh, you're loading them yourself from file into those slots. Okay, so then the glyphs were just stored in that "epa" file, and the only thing you need to know/"guess" is the width in characters of each logo... Alright, got it :)
Just a thought, but have you tried using dosemu2 instead of DOSBox for DOS/DJGPP development? I's quite nice in that it's like running a modern version of DOS on your native hardware but with quality of life VM features.
This brings back memories. Have you tried mode 3 instead of 7?
Edit: I'm an idiot, I can see you do use mode 3
I allways thought this was something the monitor itself would display when it detected the PC turning on.
Some CRT monitor have an "out of range" message, if no input signal is aviable. I don’t know if a monitor can get special information from the bios, but we can get the EDID data from the monitor with the prefered resolution and the highest refreshrate using 16 bit mode of the CPU.
I could clearly remember that with CRT this mode was noticeable different from normal text mode so my guess was it just graphical mode with using fonts from text mode to make impression of text mode
No, it really is text mode. Specifically, it is 640x400 text mode with an 8x16 font.
I don't recall if there is a VGA BIOS call for setting this particular mode, or if it needs to be "tweaked" from a standard mode; but there's more to it than just turning off the ninth bit of the character cell -- the two modes have different pixel clocks.
If a tweak is required, it will be the same tweak that transforms (256 colour) 320x200 into 360x200, or (16 colour) 640x480 into 720x480
You've set the screen mode to VGA, but then you're trying to set the font mode to EGA which doesn't make sense. You need to set the screen mode to the correct EGA mode instead of just switching into the screen mode that DOS is already in (where you clear your screen). Just make sure to switch back right before you exit :)
Cuda core programming ya might like, pretty wild
11:13 instruction says that AX should be 1100 but code sets it to 0x1110, not 0x1100. is this a typo or am i missing something?
Both function do near the same.
This is so interesting. Thank you for sharing.
Your text mode is 720 x 400, but 80 characters wide. 80 characters by 8 bits wide needs 640 pixels, so it uses a single pixel space between each character. Try text mode 10h (which is true VGA 640 x 350 with 8 x 14 fonts).
The obvious question is, is it not possible to create 16 bit binaries any more? Switching between 32 bit and 16 bit modes with memory thunking has got to be the hard way of doing this.
Well a list of (modern and classic) tools that emit 16-bit code has been eaten by RUclips's machine. You're apparently on your own but the list is extensive.
Fantastisch video! I recognized “Hacking: the art of exploitation” by Jon Ericsson om your shelf. Fantastic book and great to see it
By the way check root42 for retro dos programming VGA tricks
Wouldn't it make more sense to make it a real-mode application without the Dos extention?I know OpenWatcom at least supports compiling those.
Ahh, those days… Roger Wilton's “Programming Guide to PC Video Systems”, I/O ports' level of programming, 80×30 VGA text mode and such. 😉
I wanted to modify the logo on a socket 7 motherboard I have, following BuB's tutorial, but the indexed bmp thing was way too complex to manually do it. This video might have prompted me to do a bmp to epa (with auto color indexing), which the tool provided on that tutorial can't do. Excellent video, I have subscribed!