BBS: Inland Empire Archive Date: 08-15-92 (00:32) Number: 154 From: MATT PRITCHARD @ 930/21 Refer#: NONE To: CURTIS STRATMAN Recvd: NO Subj: Text in graphics mode 1/2 Conf: (2) Quik_Bas
MP> I have one and text printing routines for it for mode 13h
MP> (320 X 200 X 256)
CS>Could you post your routine.
Here you go. This assembly routine takes and 8 byte by 8
bit image and draws it in mode 13h (quick basic mode 13 (no
hex)). It assumes the characters are stored in an array of
8 byte elements. (128 characters per array) followed by a
couple scratch bytes...
------------------------------------------------------------- ;Assumes
Character set of 128 x 8 Bytes ; Character Set has a 16
byte Scratch Buffer at end.... ; ;GPRINTC (CharSet,
CharNum, Xpos, Ypos, ColorF, ColorB) ; ; in "C" ;void
GPRINTC(far char* SetData, int CharNum, int Xpos, ;
int Ypos, int Color_Fg, int Color_Bg) ; ; in "BASIC" ;
;TYPE CharSET ; BitMaps AS STRING * 1024 ; Scratch AS
STRING * 16 ;END TYPE ; ;DIM SetData AS CharSET ; ;DECLARE
SUB GPRINTC(SEG SetData AS ANY, BYVAL CharNum%, BYVAL
Xpos%, _ ; BYVAL Ypos%, BYVAL ColorF%,
BYVAL ColorB%) ; ; ;Draws Text Character (8x8) in Graphics
Mode 13 at Pixel (Xpos,Ypos) ;In Color: COLORF with
background of COLORB ;
.MODEL Medium
.CODE
SCRATCH_OFS EQU 1024+2 ;Character Set Working Area
Offset VGA_SEGMENT EQU 0A000H ;Vga Memory Segment
SCREEN_WIDTH EQU 320 ;Width of screen in
Pixels/Bytes
GPC_STACK STRUC
DW ? ;DI
DW ? ;SI
DW ? ;DS
DW ? ;BP
DD ? ;Caller
GPC_COLORB DB ?,? ;Background Color
GPC_COLORF DB ?,? ;Forground Color
GPC_YPOS DW ? ;Y position
GPC_XPOS DW ? ;X position
GPC_CHAR_NUM DB ?,? ;Character #
GPC_SET_OFS DW ? ;Offset of Set Data
GPC_SET_SEG DW ? ;Segment of Set
Data GPC_STACK ENDS
PUBLIC GPRINTC
GPRINTC PROC FAR
PUSH BP
PUSH DS ;Save Data Seg
PUSH SI ;BC7 - Save Si,DI, Dir Flag
PUSH DI
MOV BP,SP ;Set to address of bp
;Compute Screen Addr to Write to in ES:DI
MOV AX,[BP].GPC_YPOS ;Get Value of Ypos (mult * 320)
MOV DH,AL ;Save 256*Y
MOV CL,6 ;mult * 2^6 (Y * 64)
SHL AX,CL ;Shift Left
ADD AH,DH ;Add in 256 * Ypos
ADD AX,[BP].GPC_XPOS ;Add X position to addr
MOV DI,AX ;Save in DI
;Get Source ADDR of Character Bit Map in DS:SI
;But first, save colors in lookup table
MOV BX,[BP].GPC_SET_OFS ;Get OFFSET of Character Set
MOV SI,BX ;Save in SI for now..
;Get colors
MOV AX,[BP].GPC_SET_SEG ;Segment of Charset
MOV ES,AX ;Use ES to point to it...
MOV AL,[BP].GPC_COLORB ;Get Backgorund color
MOV ES:[SI+SCRATCH_OFS],AL ;Save in Table at Pos (0)
MOV AL,[BP].GPC_COLORF ;Forground Color (1)
MOV ES:[SI+SCRATCH_OFS+1],AL ;Save in Table
;Get addr of character map
MOV AL,[BP].GPC_CHAR_NUM ;Get Character #
AND AX,007FH ;Valid #'s are 0..127
SHL AX,1 ;* 2
SHL AX,1 ;* 4
SHL AX,1 ;* 8
MOV BX,SI ;BX = Start of Char Set
ADD BX,SCRATCH_OFS ;BX points to lookup table
ADD SI,AX ;Add Start of Character Set
;Get segment of character map
MOV DS,[BP].GPC_SET_SEG ;Get Segment of Character Set
;Cant use DS (DGROUP) anymore
MOV AX,VGA_SEGMENT ;VGA Graphics Segment
MOV ES,AX
CLD ;Forwards....
MOV CX,8 ;8 Bytes to Decode
DECODE_CHAR_BYTE:
LODSB ;Get Byte to decode in DS:SI
MOV DL,AL ;Save in DL
XOR DH,DH ;Clear DH
SHL DX,1 ;Get Bit #1
MOV AL,DH ;Put in AL
XLAT AL ;Translate into DAC value
STOSB ;Write to Video Buffer
XOR DH,DH ;Clear DH
SHL DX,1 ;Get Bit #2
MOV AL,DH ;put in AL
XLAT AL ;Translate into DAC value
STOSB ;Write to Video Buffer
>>> Continued to next message
===
* SLMR 2.1a * My reality check just bounced.
--- InterPCB 1.50
# Origin: CENTRAL BBS -Texas' BEST BBS! 214-393-7090 HST 3+GIGs (8:930/21)
* Origin: Gateway System to/from RBBS-NET (RBBS-PC 1:10/8)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET