home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* HPADEMO.ASM *
- ;* Attribut- und Bildseitendemo für die Hercules-Karte *
- ;* (c) 1990 Andreas Riel & TOOLBOX *
- ;* ------------------------------------------------------- *
- ;* assemblieren: TASM HPADemo *
- ;* bzw. MASM HPADemo *
- ;* linken: TLINK /t HPADemo *
- ;* bzw. LINK HPADemo *
- ;* EXE2BIN HPADemo HPADemo.COM *
- ;* ------------------------------------------------------- *
-
- ;* --- Programmierung des 6845-Steuerregisters
-
- SetStatReg MACRO Mode
- mov dx, 03b8h ; Portaddresse Steuerregister nach DX
- mov al, Mode ; Modus nach al
- out dx, al ; Video-Controller programmieren
- ENDM
-
- ;* --- Programmierung des 6845-Indexregisters
-
- SetCRTC MACRO
- mov dx, 03b4h ; Portadresse Indexregister nach DX
- out dx, ax ; Video-Controler programmieren
- ENDM
-
- ;* --- Einschalten der Videodarstellung
-
- VideoOn MACRO
- or StatReg, 00001000b ; Bit 3 setzen
- SetStatReg StatReg
- ENDM
-
- ;* --- Ausschalten der Videodarstellung
-
- VideoOff MACRO
- and StatReg, 11110111b ; Bit 3 löschen
- SetStatReg StatReg
- ENDM
-
- ;* --- Setzen des Blink-Bits
-
- Blink MACRO
- or StatReg, 00100000b ; Bit 5 setzen
- SetStatReg StatReg
- ENDM
-
- ;* --- Löschen des Blink-Bits
-
- LightInverse MACRO
- and StatReg, 11011111b ; Bit 5 löschen
- SetStatReg StatReg
- ENDM
-
- ;* Laden des ES-Reg. mit der Segmentadresse des Video-
- ;* RAM für Bildschirmausgabe
-
- InitScrOut MACRO
- push es
- push dx
- call ConvOffset ; Bildschirmposition in Offset zum
- ; Videosegment umrechnen
- mov dx, 0b000h ; Videosegment zuerst nach DX
- mov es, dx ; ...dann nach ES
-
- cld ; bei String-Befehlen aufwärts zählen
- ENDM
-
- ;* --- Warten auf Tastendruck
-
- WaitKey MACRO
- xor ah, ah
- int 16h
- ENDM
-
- CODE SEGMENT Para
- ASSUME cs: CODE, ds: CODE, ss: NOTHING, es: NOTHING
-
-
- Org 100h ; es soll ein COM-Programm werden
-
- Start:
- jmp Demo
-
- ;* --- Daten --------------------------------------------- *
- ;
- M_NormInv db " normal invers ", 0
- M_LBInv db "hell invers oder invers blinkend", 0
- M_Keys db "<Enter> Attribut, <Space> Bildseite, "
- db "<o> Bildschirm aus/ein, <ESC> Ende", 0
- M_TX db "HGC-Attribut- und Bildseitendemo - (c)"
- db " 1991 TOOLBOX", 0
- TextTab db 61h, 50h, 52h, 0fh, 19h, 06h, 19h, 19h
- db 02h, 0dh, 0bh, 0ch
- StatReg db ?
- LnSpace dw 25 dup (?)
-
- ;* --- Demoprogramm -------------------------------------- *
-
- ;* Ausgabe dreier Textleisten mit wechselbaren Attributen;
- ;* Umschaltung zwischen USER- und DOS-Bildschirm
-
- Demo PROC Near
- call TextMode ;Textmodus initialisieren
- xor bp, bp ;auf Bildseite 0 zugreifen
- call ClrScr ;Bildschirm löschen
- call ShowHGCPage ;Bildseite 0 anzeigen
- mov bl, 23 ;Ausgabezeile laden
-
- WriteText:
- lea si, M_NormInv
- mov bh, 33 ;Ausgabesp. der mittleren Leiste
- mov ah, 01110000b ;Attribut "normal invers"
- call WriteVideo ;Text ausgeben
- lea si, M_LBInv ;Offset der 2. Meldung nach SI
- Blink ;Blink-Bit setzen
- mov bh, 1 ;Ausgabespalte der linken Leiste
- mov ah, 11110000b ;Attribut "invers blinkend"
- call WriteVideo ;Text ausgeben
- mov bh, 48 ;Ausgabespalte der rechten Leiste
- call WriteVideo ;Text ausgeben
- dec bl ;Ausgabezeile um Eins vermindern
- cmp bl, 2 ;ist sie schon gleich 2?
- jne WriteText ;nein, dann vorige Zeile
- mov bx, 5 Shl 8 + 25 ;ja, Anweisungszeile ausgeben
- lea si, M_Keys
- mov ah, 00001110b ;Attribut "hell auf schwarz"
- call WriteVideo ;Text wieder ausgeben
- mov bx, 13 Shl 8 + 1 ;Ausgabesp. und -z. für Titel
- lea si, M_TX
- mov ah, 00001001b ;Attribut "hell unterstrichen"
- call WriteVideo ;und das letzte Mal...
- Taste:
- WaitKey
- cmp al, 32 ;wurde <Space> gedrückt?
- jne TestEnter ;nein, dann vielleicht <Enter>?
- not bp ;ja, dann wechsle Bildseite
- call ShowHGCPage ;und zeige sie an
- jmp Taste ;zurück zur Tastaturabfrage
- TestEnter:
- cmp al, 13 ;wurde <Enter> gedrückt?
- jne TestO ;nein, dann etwa <o>?
- test StatReg, 20h ;ja, frage Blink-Bit über Status-
- ;byte ab, da das Statusregister
- ;des 6845 sich nicht auslesen läßt
- je DoBlink ;nicht gesetzt, also setze es
- LightInverse ;gesetzt, also lösche es
- jmp Taste ;und zurück zur Tastaturabfrage
- DoBlink:
- Blink
- TestO:
- cmp al, 111 ;wurde <o> gedrückt?
- jne TestESC ;nein, dann eventuell <ESC>?
- test StatReg, 08h ;ja, dann mache dasselbe mit dem
- ;Video-Bit des Statusregisters
- ;wie bei Bedarf mit dem Blink-Bit
- je SwitchOn
- VideoOff
- jmp Taste
- SwitchOn:
- VideoOn
- jmp Taste
- TestESC:
- cmp al, 27 ;<ESC> als letzte Rettung?
- jne Taste ;nein, also wirklich zurück
- mov bp, 1 ;ja, also alles zurücksetzen...
- call ShowHGCPage
- Blink
- VideoOn
- EndDemo:
- mov ax, 4c00h ;...und auf Wiedersehen!
- int 21h
- Demo ENDP
-
- ;* --- die eigentlichen Prozeduren ----------------------- *
-
- ;* - Initialisierung des Textmodus der HGC, Ermittlung der
- ;* - Zeilenoffsets
- ;* - Eingabe: keine
- ;* - Ausgabe: keine
- ;* - Register: sämtliche Reg. verändert
-
- TextMode PROC Near
- mov dx, 03bfh ;HGC-Konfigurationsregister
- mov al, 10b ;Grafik aus & 2. Bildschirms. ein
- out dx, al ;HGC konfigurieren
- push cs ;DS initialisieren
- pop ds
- lea si, TextTab ;Offset der Tabelle mit den
- ;CRTC-Registerwerten nach SI
- xor bl, bl ;Seite 0, Textmodus, Video aus
- SetStatReg bl ;Modus setzen
- mov cx, 0ch ;12 Register werden gesetzt
- xor bh, bh
- VCp: lodsb
- mov ah, al ;Registerwert nach ah
- mov al, bh ;und Registernummer nach al
- SetCRTC ;Indexregister programmieren
- inc bh ;nächstes Register
- loop VCp ;Schleife schließen
- mov StatReg, bl ;Modusbyte initialisieren
- VideoOn ;Videodarstellung einschalten
- mov bl, 80 ;Ermittlung der Zeilenoffsets
- xor bh, bh ;es gibt 80 Textspalten
- mov cl, 25 ;und 25 Textzeilen
- xor ch, ch
- shl bx, 1 ;Spalten verdoppeln
- push ds ;ES auf DS
- pop es
- lea di, LnSpace ;ES:DI auf Anfang der Tabelle
- xor ax, ax
- stosw ;Offset 0 entspr. Zeile 0 und 1
- Schleife:
- stosw
- add ax, bx ;doppelte Spaltenanz. addieren
- loop Schleife ;Schleife schließen
- ret
- TextMode ENDP
-
- ;* - Darstellung einer Bildschirmseite
- ;* - Eingabe: BP = Nummer der Seite
- ;* - Ausgabe: keine
- ;* - Register: DX, AX und Flags verändert
-
- ShowHGCPage PROC Near
- or bp, bp ;Seite 0?
- je Page1 ;ja, einschalten
- and StatReg, 01111111b ;nein, ausschalten
- jmp SM
- Page1:
- or StatReg, 10000000b
- SM: SetStatReg StatReg ;neuen Modus setzen
- ret
- ShowHGCPage ENDP
-
- ;* - Löschen des Bildschirms
- ;* - Eingabe: keine
- ;* - Ausgabe: keine
- ;* - Register: AX, CX und Flags verändert
-
- ClrScr PROC Near
- push bx
- mov bx, 1 Shl 8 + 1 ;linke obere Ecke
- InitScrOut ;Segmentadresse des V-RAMs
- mov cx, 2000 ;Größe des V-RAMs in Words
- mov ax, 32 ;Spaces mit Attribut "schwarz"
- rep stosw ;hinein ins V-RAM
- pop dx
- pop es
- pop bx
- ret
- ClrScr ENDP
-
- ;* - Schreiben in den Bildschirmspeicher jener Seite, die
- ;* - durch BP festgelegt ist; Ende-Code des Strings ist NUL
- ;* - Eingabe: AH = Attribut
- ;* - BL = Ausgabezeile
- ;* - BH = Ausgabespalte
- ;* - SI = String-Offset
- ;* - Ausgabe: keine
- ;* - Register: AL und Flags verändert
-
- WriteVideo PROC Near
- push si
- InitScrOut ;Segmentadresse des V-RAMs holen
- Write0:
- lodsb ;Zeichen aus String lesen
- or al, al ;NUL-Marke?
- je WriteEnd ;ja, also fertig
- stosw ;nein, hinein ins V-RAM
- jmp Write0 ;und Vorgang wiederholen
- WriteEnd:
- pop dx
- pop es
- pop si
- ret
- WriteVideo ENDP
-
- ;* - Umrechnung einer Bildschirmposition in die ent-
- ;* - sprechende Offset-Adresse im Video-RAM
- ;* - Eingabe: BL = Zeile
- ; BH = Spalte
- ; BP = Nummer der Bildseite
- ;* - Ausgabe: DI = Offset-Adresse
- ;* - Register: DI und Flags verändert
-
- ConvOffset PROC Near
- push ax
- push bx
- dec bh; ;Spalte 0 = Spalte 1
- shl bx, 1 ;Zeile und Spalte verdoppeln
- mov al, bh ;Spalte nach AL
- xor bh, bh
- mov di, [LnSpace + bx] ;Zeilen-Offset nach DI
- xor ah, ah ;AH für 16-Bit Addition löschen
- add di, ax ;und Spalten zum Offset addieren
- or bp, bp ;Seite 0?
- jne COEnd ;nein, dann alles fertig
- add di, 8000h ;ja, dann Verschiebung um 32kB
- ;zum Offset addieren
- COEnd:
- pop bx
- pop ax
- ret
- ConvOffset ENDP
-
- CODE ENDS
- END Start
- ;* ------------------------------------------------------- *
- ;* Ende von HPADEMO.ASM *
-
-