
                        Karakterek tdefinilsa
                        

 Amikor a VGA szveges mdban van, a kpernyn lev karakterek s szneik
a B800:0h-as cmen troldnak. A betk pedig az A000:0-s cmen tallhatak
meg, egyms utn, sorban, betnknt 32 byte helyet foglalnak el, de
tulajdonkppen a 32-bl csak 16 byte hasznos, mivel a font 8(9)x16-os.

A betk a szokott formban vannak letrolva, teht pl. egy A bet:
bit 7 6 5 4 3 2 1 0
   Ŀ
      X     =  16
     XXX    =  56
    XX XX   = 108
   XX   XX  = 198
   XX   XX  = 198
   XXXXXXX  = 254
   XX   XX  = 198
   XX   XX  = 198
   XX   XX  = 198
   . . . . . . . . .   ...

 A : { 16, 56, 108, 198, 198, 254, 198, 198, 198, ... }, ez 8x16 v. 9x16-os
font esetn 16 byte, gy a maradk 16 a 32-bl nyugodtan lehet 0.
 Az A000:0h cmre alapllapotban nem tudunk rni, ezt kln engedlyzetetni
kell a VGA portjain keresztl. Erre valak a kvetkez funkcik, a CGenModeSet
engedlyezi a cm elrst, a CGenModeClear pedig letiltja.

A funkcik deklarlsa Borland C++ all:
----------------------------------------
extern "C" void CGenModeSet(void);
extern "C" void CGenModeClear(void);

Hasznlatuk:
------------
 ...
 CGenModeSet(); // engedlyezi az rst
 ...
itt mr tudunk rni az A000:0-ra, s
 ...
 CGenModeClear(); // letiltja az rst
 ...

;
; Name:         CGenModeSet
;
;               Direct access to EGA and VGA alphanumeric character generator RAM
;
; Caller:       Microsoft C:
;
;                       void CGenModeSet();
;

DGROUP          GROUP   _DATA

_TEXT           SEGMENT byte public 'CODE'
                ASSUME  cs:_TEXT,ds:DGROUP

                PUBLIC  _CGenModeSet
_CGenModeSet    PROC    near

                push    bp              ; preserve caller registers
                mov     bp,sp
                push    si

; Program the Sequencer

                cli                     ; disable interrupts
                mov     dx,3C4h         ; Sequencer port address
                mov     si,offset DGROUP:SeqParms
                mov     cx,4

L01:            lodsw                   ; AH := value for Sequencer register
                                        ; AL := register number
                out     dx,ax           ; program the register
                loop    L01
                sti                     ; enable interrupts

; Program the Graphics Controller

                mov     dl,0CEh         ; DX := 3CEH (Graphics Controller port
                                        ;               address)
                mov     si,offset DGROUP:GCParms
                mov     cx,3
L02:            lodsw                   ; program the Graphics Controller
                out     dx,ax
                loop    L02

                pop     si
                pop     bp
                ret

_CGenModeSet    ENDP

_TEXT           ENDS


_DATA           SEGMENT word public 'DATA'

; Format of the parameters is:  Lo-order byte:  Register number
;                               Hi-order byte:  Value for reg

SeqParms        DW      0100h           ; synchronous reset
                DW      0402h           ; CPU writes only to map 2
                DW      0704h           ; sequential addressing
                DW      0300h           ; clear synchronous reset

GCParms         DW      0204h           ; select map 2 for CPU reads
                DW      0005h           ; disable odd-even addressing
                DW      0006h           ; map starts at A000:0000

_DATA           ENDS

                END

;
; Name:         CGenModeClear
;
;               Restore EGA or VGA alphanumeric mode after accessing
;                character generator RAM
;
; Caller:       Microsoft C:
;
;                       void CGenModeClear();
;


DGROUP          GROUP   _DATA

_TEXT           SEGMENT byte public 'CODE'
                ASSUME  cs:_TEXT,ds:DGROUP
                PUBLIC  _CGenModeClear
_CGenModeClear  PROC    near

                push    bp              ; preserve caller registers
                mov     bp,sp
                push    si

; Program the Sequencer

                cli                     ; disable interrupts
                mov     dx,3C4h         ; Sequencer port address
                mov     si,offset DGROUP:SeqParms
                mov     cx,4

L01:            lodsw                   ; AH := value for Sequencer register
                                        ; AL := register number
                out     dx,ax           ; program the register
                loop    L01
                sti                     ; enable interrupts

; Program the Graphics Controller

                mov     dl,0CEh         ; DX := 3CEH (Graphics Controller port
                                        ;               address)
                mov     si,offset DGROUP:GCParms
                mov     cx,3

L02:            lodsw                   ; program the Graphics Controller
                out     dx,ax
                loop    L02

                mov     ah,0Fh          ; AH := INT 10H function number
                int     10h             ; get video mode

                cmp     al,7
                jne     L03             ; jump if not monochrome mode

                mov     ax,0806h        ; program Graphics Controller
                out     dx,ax           ;  to start map at B000:0000

L03:            pop     si
                pop     bp
                ret

_CGenModeClear  ENDP

_TEXT           ENDS


_DATA           SEGMENT word public 'DATA'

; Format of the parameters is:  Lo-order byte:  Register number
;                               Hi-order byte:  Value for reg

SeqParms        DW      0100h           ; synchronous reset
                DW      0302h           ; CPU writes to maps 0 and 1
                DW      0304h           ; odd-even addressing
                DW      0300h           ; clear synchronous reset

GCParms         DW      0004h           ; select map 0 for CPU reads
                DW      1005h           ; enable odd-even addressing
                DW      0E06h           ; map starts at B800:0000

_DATA           ENDS

                END

 Source: VideoSys.ZIP
