In the 8086-era DOS environment, text display typically relied on the BIOS and the graphics adapter’s built-in character generator. The fonts were firmly tied toIn the 8086-era DOS environment, text display typically relied on the BIOS and the graphics adapter’s built-in character generator. The fonts were firmly tied to

Redefining ‘A’ in VGA Mode 03h

In the 8086-era DOS environment, text display typically relied on the BIOS and the graphics adapter’s built-in character generator rather than any sophisticated font rendering system. The fonts were firmly tied to specific text modes implemented by adapters such as CGA, EGA, or VGA. One of the most common modes was text mode 03h, which presented an 80×25 text grid.

In one of our previous deep dives, we explored the infamous VGA-Mode 13h and how to integrate hardware timers to produce simple beeps with the PC-Speaker. This time, we’ll change the appearance of an ASCII character ( in this case 'A' ) by redefining its pixel data. In our next part you will also understand where this is actually heading for.

ASCII and the DOS Character Set

ASCII (American Standard Code for Information Interchange) is originally a 7-bit code that defines characters (letters, digits, punctuation) in the range 0–127. In DOS, the standard extended ASCII set (often called Code Page 437) added an additional 128 characters (128–255), including box-drawing characters, symbols, and other glyphs used frequently in the DOS world.

Text Mode 03h (80×25)

One of the typical display modes used in 8086 DOS for text output is Mode 03h. In Mode 03h, the screen is divided into 80 columns and 25 rows of text characters. Each position on the screen is one text cell which holds one character plus attributes (like foreground and background colors, blinking, etc.).

  • With the earliest CGA (Color Graphics Adapter), each text cell was typically an 8×8 pixel matrix (though some adapters might effectively use 8×14 or 9×14 for EGA, and 9×16 for VGA).

  • For standard VGA in 80×25 text mode, each character cell is often 9 pixels wide and 16 pixels tall (though the actual glyph itself might only occupy 8 pixels in width, with the 9th column used for spacing or other features).

If you consider the typical VGA text mode of 9×16 character cells in 80×25, the total screen resolution in terms of raw pixels is 720×400 (80 columns × 9 pixels wide, 25 rows × 16 pixels tall). In Mode 03h, each character is stored in video RAM (at ES:DI B800h:0000h) with a Byte for the character Index (00h - FFh) and another byte for defining foreground color and background color (0-F for the Background and 0-F for the Foreground).

How to?

There are times you might want to go beyond the default text-mode look. Maybe you want to display your own symbols, or get creative with ASCII graphics. In DOS and other low-level environments, you have an awesome ability to poke the BIOS or VGA memory directly to define what each character’s pixels look like. We will use the BIOS' interrupt 10h with AL = 11h to load our custom font. Let's break it down step by step:

Step By Step

First let's clone our startup environment again so that you can follow along:

git clone git@github.com:MilesTails01/i8086_boilercode.git

After downloading you need to unpack DOSBOX.zip and TOOLS.zip

cd \bin tar -xf TOOLS.zip tar -xf DOSBOX.zip build.bat // Compile, Link and Start the source debug.bat // Starts AFDEBUG and loads the compiled exe start.bat // Start the program without rebuilding it

Remove anything that is not needed. Keep the code simple and start with the minimum

; ################################# ; # ASCII.ASM # ; ################################# ; ################################# ; # STACK # ; ################################# STACK SEGMENT PARA STACK db 256 dup(0) STACK ENDS ; ################################# ; # DATA # ; ################################# DATA SEGMENT PARA 'DATA' DATA ENDS ; ################################# ; # CODE # ; ################################# CODE SEGMENT PARA 'CODE' ASSUME cs:CODE, ds:DATA, ss:STACK mov ax, DATA mov ds, ax mov ax, STACK mov ss, ax mov sp, 256 CODE ENDS

Step 1

Let's define our character pixel data first. 0 will become the background color and 1 will become the foreground color. Keep in mind in normal 80x25 Mode the dimension for a character are 9x16. We will define 14 rows each row containing 8bit cause (keep in mind to make the 9th bit 0 cause db is limited to 1 byte). This character will be striped block if you wonder what it will look like later.

CHAR_DATA db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b

Step 2

Let's define a print function to fill the whole screen with the character A

PRINT PROC NEAR mov ax, 0B800h ; VGA text mode memory segment mov es, ax mov di, 0 ; Start at the top-left of the screen mov cx, 2000 ; 80x25 screen = 2000 characters mov al, 'A' ; ASCII code for 'A' mov ah, 19h ; Attribute byte (blue on white) rep stosw ; Fill screen with 'A' ret PRINT ENDP

Step 3

Now the important part: We will use interrupt 10h (Bios Interrupt) with AH set to 11h. I wrote the definition of the parameter for AX, BX, CX, DX and BP in the comments.

REPLACE_ASCII PROC NEAR ; mov ax, 03h ; Set video mode to text mode (80x25, color) ; int 10h ; 9x16 font size ; ; mov ax, 1112h ; Force 8x8 font size for character cells ; xor bl, bl ; RAM block ; int 10h ; Change text mode character (int 10h) ; AH = 11h ; BH = Number of bytes per character ; CX = Number of characters to change ; DX = Starting character to change ; ES:BP = Offset of character data push ds pop es ; make sure es = ds lea bp, CHAR_DATA ; Pointer to custom font data mov ax, 1100h ; Load user-defined font mov bh, 0Eh ; Number of bytes per character xor bl,bl ; RAM block mov cx, 01h ; Number of characters to replace = 1 for now mov dx, 41h ; Starting character to change (41h = 'A' in ASCII) int 10h ; Call BIOS to load the font ret REPLACE_ASCII ENDP

Step 4

Optional: If you like you can print the current ASCII table in the middle of the screen ;)

ASCIIPRINT PROC NEAR mov ax, 0B800h ; VGA text mode memory segment mov es, ax xor di, di ; Reset offset mov cx, 5 ; Total number of characters (0-255) mov ah, 4Fh ; Attribute byte (red on white) mov dl, 10 ; Padding on the left (adjust as needed) mov dh, 60 ; Total width of the centered line (adjust as needed) mov di, 1620 ; Row (10 x 80 + padding) * 2, starting with left padding PrintLoop: stosw ; Store the character (AL) and attribute (AH) inc al ; Move to the next ASCII character dec dh ; Decrement width counter jnz PrintLoop ; Continue until row width is filled add di, 40 ; Move to the next row with padding ((80 - 60) * 2) mov dh, 60 ; Reset row width loop PrintLoop ; Repeat for all 256 characters ret ASCIIPRINT ENDP

Result

Every character of A got replaced with the new striped block. This Glyph will come in very handy in a later article.

Complete Code

; ################################# ; # ASCII.ASM # ; ################################# ; ################################# ; # STACK # ; ################################# STACK SEGMENT PARA STACK db 256 dup(0) STACK ENDS ; ################################# ; # DATA # ; ################################# DATA SEGMENT PARA 'DATA' CHAR_DATA db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b db 010101010b DATA ENDS ; ################################# ; # CODE # ; ################################# CODE SEGMENT PARA 'CODE' ASSUME cs:CODE, ds:DATA, ss:STACK mov ax, DATA mov ds, ax mov ax, STACK mov ss, ax mov sp, 256 ; ################################# ; # MAIN # ; ################################# call REPLACE_ASCII call PRINT call ASCIIPRINT ret ; ============================= ; | FUNCTIONS | ; ============================= PUBLIC REPLACE_ASCII REPLACE_ASCII PROC NEAR ; mov ax, 03h ; Set video mode to text mode (80x25, color) ; int 10h ; 9x16 font size ; ; mov ax, 1112h ; Force 8x8 font size for character cells ; xor bl, bl ; RAM block ; int 10h ; Change text mode character (int 10h) ; AH = 11h ; BH = Number of bytes per character ; CX = Number of characters to change ; DX = Starting character to change ; ES:BP = Offset of character data push ds pop es ; make sure es = ds lea bp, CHAR_DATA ; Pointer to custom font data mov ax, 1100h ; Load user-defined font mov bh, 0Eh ; Number of bytes per character xor bl,bl ; RAM block mov cx, 01h ; Number of characters to replace = 1 for now mov dx, 41h ; Starting character to change (41h = 'A' in ASCII) int 10h ; Call BIOS to load the font ret REPLACE_ASCII ENDP PRINT PROC NEAR mov ax, 0B800h ; VGA text mode memory segment mov es, ax mov di, 0 ; Start at the top-left of the screen mov cx, 2000 ; 80x25 screen = 2000 characters mov al, 'A' ; ASCII code for 'A' mov ah, 19h ; Attribute byte (blue on white) rep stosw ; Fill screen with 'A' ret PRINT ENDP ASCIIPRINT PROC NEAR mov ax, 0B800h ; VGA text mode memory segment mov es, ax xor di, di ; Reset offset mov cx, 5 ; Total number of characters (0-255) mov ah, 4Fh ; Attribute byte (red on white) mov dl, 10 ; Padding on the left (adjust as needed) mov dh, 60 ; Total width of the centered line (adjust as needed) mov di, 1620 ; Row (10 x 80 + padding) * 2, starting with left padding PrintLoop: stosw ; Store the character (AL) and attribute (AH) inc al ; Move to the next ASCII character dec dh ; Decrement width counter jnz PrintLoop ; Continue until row width is filled add di, 40 ; Move to the next row with padding ((80 - 60) * 2) mov dh, 60 ; Reset row width loop PrintLoop ; Repeat for all 256 characters ret ASCIIPRINT ENDP CODE ENDS END

\

Market Opportunity
Mode Network Logo
Mode Network Price(MODE)
$0.0004373
$0.0004373$0.0004373
-2.69%
USD
Mode Network (MODE) Live Price Chart
Disclaimer: The articles reposted on this site are sourced from public platforms and are provided for informational purposes only. They do not necessarily reflect the views of MEXC. All rights remain with the original authors. If you believe any content infringes on third-party rights, please contact service@support.mexc.com for removal. MEXC makes no guarantees regarding the accuracy, completeness, or timeliness of the content and is not responsible for any actions taken based on the information provided. The content does not constitute financial, legal, or other professional advice, nor should it be considered a recommendation or endorsement by MEXC.

You May Also Like

Shocking OpenVPP Partnership Claim Draws Urgent Scrutiny

Shocking OpenVPP Partnership Claim Draws Urgent Scrutiny

The post Shocking OpenVPP Partnership Claim Draws Urgent Scrutiny appeared on BitcoinEthereumNews.com. The cryptocurrency world is buzzing with a recent controversy surrounding a bold OpenVPP partnership claim. This week, OpenVPP (OVPP) announced what it presented as a significant collaboration with the U.S. government in the innovative field of energy tokenization. However, this claim quickly drew the sharp eye of on-chain analyst ZachXBT, who highlighted a swift and official rebuttal that has sent ripples through the digital asset community. What Sparked the OpenVPP Partnership Claim Controversy? The core of the issue revolves around OpenVPP’s assertion of a U.S. government partnership. This kind of collaboration would typically be a monumental endorsement for any private cryptocurrency project, especially given the current regulatory climate. Such a partnership could signify a new era of mainstream adoption and legitimacy for energy tokenization initiatives. OpenVPP initially claimed cooperation with the U.S. government. This alleged partnership was said to be in the domain of energy tokenization. The announcement generated considerable interest and discussion online. ZachXBT, known for his diligent on-chain investigations, was quick to flag the development. He brought attention to the fact that U.S. Securities and Exchange Commission (SEC) Commissioner Hester Peirce had directly addressed the OpenVPP partnership claim. Her response, delivered within hours, was unequivocal and starkly contradicted OpenVPP’s narrative. How Did Regulatory Authorities Respond to the OpenVPP Partnership Claim? Commissioner Hester Peirce’s statement was a crucial turning point in this unfolding story. She clearly stated that the SEC, as an agency, does not engage in partnerships with private cryptocurrency projects. This response effectively dismantled the credibility of OpenVPP’s initial announcement regarding their supposed government collaboration. Peirce’s swift clarification underscores a fundamental principle of regulatory bodies: maintaining impartiality and avoiding endorsements of private entities. Her statement serves as a vital reminder to the crypto community about the official stance of government agencies concerning private ventures. Moreover, ZachXBT’s analysis…
Share
BitcoinEthereumNews2025/09/18 02:13
Bitcoin Has Taken Gold’s Role In Today’s World, Eric Trump Says

Bitcoin Has Taken Gold’s Role In Today’s World, Eric Trump Says

Eric Trump on Tuesday described Bitcoin as a “modern-day gold,” calling it a liquid store of value that can act as a hedge to real estate and other assets. Related Reading: XRP’s Biggest Rally Yet? Analyst Projects $20+ In October 2025 According to reports, the remark came during a TV appearance on CNBC’s Squawk Box, tied to the launch of American Bitcoin, the mining and treasury firm he helped start. Company Holdings And Strategy Based on public filings and company summaries, American Bitcoin has accumulated 2,443 BTC on its balance sheet. That stash has been valued in the low hundreds of millions of dollars at recent spot prices. The firm mixes large-scale mining with the goal of holding Bitcoin as a strategic reserve, which it says will help it grow both production and asset holdings over time. Eric Trump’s comments were direct. He told viewers that institutions are treating Bitcoin more like a store of value than a fringe idea, and he warned firms that resist blockchain adoption. The tone was strong at times, and the line about Bitcoin being a modern equivalent of gold was used to frame American Bitcoin’s role as both miner and holder.   Eric Trump has said: bitcoin is modern-day gold — unusual_whales (@unusual_whales) September 16, 2025 How The Company Went Public American Bitcoin moved toward a public listing via an all-stock merger with Gryphon Digital Mining earlier this year, a deal that kept most of the original shareholders in control and positioned the new entity for a Nasdaq debut. Reports show that mining partner Hut 8 holds a large ownership stake, leaving the Trump family and other backers with a minority share. The listing brought fresh attention and capital to the firm as it began trading under the ticker ABTC. Market watchers say the firm’s public debut highlights two trends: mining companies are trying to grow by both producing and holding Bitcoin, and political ties are bringing more headlines to crypto firms. Some analysts point out that holding large amounts of Bitcoin on the balance sheet exposes a company to price swings, while supporters argue it aligns incentives between miners and investors. Related Reading: Ethereum Bulls Target $8,500 With Big Money Backing The Move – Details Reaction And Possible Risks Based on coverage of the launch, investors have reacted with both enthusiasm and caution. Supporters praise the prospect of a US-based miner that aims to be transparent and aggressive about building a reserve. Critics point to governance questions, possible conflicts tied to high-profile backers, and the usual risks of a volatile asset being held on corporate balance sheets. Eric Trump’s remark that Bitcoin has taken gold’s role in today’s world reflects both his belief in its value and American Bitcoin’s strategy of mining and holding. Whether that view sticks will depend on how investors and institutions respond in the months ahead. Featured image from Meta, chart from TradingView
Share
NewsBTC2025/09/18 06:00
XRP Holds $1.88 Fibonacci Support as 3-Day Chart Signals Bullish Continuation

XRP Holds $1.88 Fibonacci Support as 3-Day Chart Signals Bullish Continuation

XRP is once again drawing attention on higher timeframes as its 3-day chart begins to mirror past bullish phases. Market observers are closely watching how the
Share
Tronweekly2026/01/11 21:30