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