; ----------------------------------------------
;     GRDEMO.ASM
; ----------------------------------------------
;     Assemblieren mit MASM 5.x :
;            MASM grdemo;
;            LINK grdemo;
; ----------------------------------------------
;  Beispielprogramm zu GRSTRING.INC fur EGA/VGA.
;  Farbziffern werden normal und kursiv,
;  horizontal und vertikal um einzelne Pixel
;  versetzt ausgegeben.
; ----------------------------------------------

        PAGE   65,80
        TITLE  GRDEMO

Font8        equ  1123h  ; ax-Register fr
                         ; CGI (8x16-Matrix
Font14       equ  1122h  ; nur bei VGA)
Font16       equ  1124h
HorzOff      equ   100   ; horizontaler Offset
                         ; fr '(kursiv)'
Rows8        equ     3   ; bl-Register fr CGI
Rows14       equ     2   ; (8x16-Matrix nur
Rows16       equ     2   ; bei VGA)
VertOff      equ   175   ; Versatz fur untere
                         ; Bildh„lfte

        DOSSEG
        .MODEL SMALL     ; Standard Memory
                         ; Model
        .STACK 100h
        INCLUDE GRSTRING.INC
; ----------------------------------------------
        .DATA            ; Beginn des Daten-
                         ; Segments
Paras   dw 0             ; Zwischenspeicher fr
                         ; dh und dl
Str8    db '8x8 Matrix',0
                         ; String fr CGA-
                         ; Zeichenmatrix
Str14   db '8x14 Matrix',0
                         ; String fr EGA-
                         ; Zeichenmatrix
Str16   db '8x16 Matrix',0
                         ; String fr VGA-
                         ; Zeichenmatrix
StrKurs db '(kursiv)',0  ; String fr kursiv
StrZ    dw 0             ; Platzhalter fr
                         ; Ziffern
; ----------------------------------------------
        .CODE            ; Beginn des Code Seg-
                         ; ments
Start:
        mov ax,@DATA     ; Datensegment in DS
                         ; laden
        mov ds,ax
        mov es,ax        ; fr GRString auch ES
                         ; mit DS laden
        mov ax,0010h     ; Grafikmode 10h
                         ; (650x350, 16 colors)
        int 10h

        xor dl,dl        ; 1. Normal ausgeben
        xor bp,bp        ; 2. Kursiv (dl=1) mit
                         ; Versatz (bp)
Lop3:   mov cx,10h       ; Laufvariable fr 16
                         ; Farben
        push dx
        mov ax,Font8     ; 8x8-Matrix anw„hlen
        mov bl,Rows8     ; maximal 43 Zeilen zu-
                         ; lassen
        int 10h
        pop dx
Lop1:   push cx          ; Farbe retten
        mov ax,cx        ; X- und Y-Grafik-
        mov bx,cx        ; koordinate berechnen
        dec cx           ; Farbnummer ermitteln
        mov dh,cl
        add cl,'0'       ; in ASCII umwandeln
        cmp cl,'9'
        jle Lop2
        add cl,'A'-'9'-1 ; Farben 0Ah bis 0Fh
                         ; bercksichtigen
Lop2:  mov byte ptr [StrZ],cl
                         ; Farbnummer als String
                         ; ablegen
       mov si,offset StrZ
                         ; Zeiger ES:SI auf den
                         ; String richten
       mov cl,3
       shl ax,cl         ; X-Koordinate fr
                         ; horizontale Reihe
       push ax           ; Parameter fr 2. Auf-
                         ; ruf speichern
       push bx
       add bx,bp         ; vertikalen Versatz
                         ; addieren
       push dx
       push si
       call GRString    ; Farbnummer in horiz.
                        ; Reihe ausgeben
       pop si           ; Parameter fr 2. Auf-
                        ; ruf neu laden
       pop dx
       pop ax           ; X- und Y-Koordinate
                        ; vertauschen
       pop bx
       add bx,bp        ; vertikalen Versatz
                        ; addieren
       push dx
       call GRString    ; Farbnummer in vertik.
                        ; Reihe ausgeben
       pop dx
       pop cx
       loop Lop1        ; n„chster Farbwert

       mov dh,7         ; Pixelfarbe weiá
       mov [Paras],dx
       IRP n,<8,14>     ; Bei VGA: <8,14,16>
          mov ax,Font&n
          mov bl,Rows&n
          int 10h       ; Font fr Matrix an-
                        ; w„hlen
          mov ax,160    ; Grafikkoordinaten fr
          mov bx,10 * &n; die Strings berechnen
          add bx,bp     ; vertikalen Versatz
                        ; addieren
          mov dx,[Paras]
          cmp dl,1      ; kursive Ausgabe ?
          jnz Norm&n    ; NEIN => nur normaler
                        ; String
          push ax       ; JA  => '(kursiv)'
                        ; ausgeben
          push bx
          add ax,HorzOff;horizontalen Offset
                        ; addieren
          mov si,offset StrKurs
          call GRString ; String ausgeben
          pop bx
          pop ax
          mov dx,[Paras]
Norm&n:   mov si,offset Str&n
                        ; ES:SI auf String
                        ; richten
          call GRString ; String ausgeben
       endm

       mov bp,VertOff   ; Versatz fr 2. Durch-
                        ; lauf
       mov dx,[Paras]
       inc dl           ; Funktionsparameter
                        ; erh”hen
       cmp dl,1         ; noch kursiv ?
       jg DOS           ; NEIN => Ende Ausgabe
       jmp Lop3         ; JA   => Anfang der
                        ; Ausgabe
DOS:   mov ah,0         ; auf Tastatureingabe
                        ; warten
       int 16h
       mov ax,0003      ; Textmode 3 (80x25,
                        ; 16 colors)
       int 10h
       mov ax,4C00h     ; Programmende und
                        ; Rcksprung ins DOS
       int 21h

       END Start        ; Ende von GRDemo.ASM