home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 03 / tricks / hpademo.asm < prev    next >
Encoding:
Assembly Source File  |  1990-12-10  |  10.2 KB  |  313 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                    HPADEMO.ASM                          *
  3. ;*   Attribut- und Bildseitendemo für die Hercules-Karte   *
  4. ;*           (c) 1990 Andreas Riel & TOOLBOX               *
  5. ;* ------------------------------------------------------- *
  6. ;*   assemblieren:    TASM HPADemo                         *
  7. ;*               bzw. MASM HPADemo                         *
  8. ;*         linken:    TLINK /t HPADemo                     *
  9. ;*               bzw. LINK HPADemo                         *
  10. ;*                    EXE2BIN HPADemo HPADemo.COM          *
  11. ;* ------------------------------------------------------- *
  12.  
  13. ;* --- Programmierung des 6845-Steuerregisters
  14.  
  15. SetStatReg  MACRO Mode
  16.       mov  dx, 03b8h  ; Portaddresse Steuerregister nach DX
  17.       mov  al, Mode   ; Modus nach al
  18.       out  dx, al     ; Video-Controller programmieren
  19.     ENDM
  20.  
  21. ;* --- Programmierung des 6845-Indexregisters
  22.  
  23. SetCRTC  MACRO
  24.       mov  dx, 03b4h  ; Portadresse Indexregister nach DX
  25.       out  dx, ax     ; Video-Controler programmieren
  26.     ENDM
  27.  
  28. ;* --- Einschalten der Videodarstellung
  29.  
  30. VideoOn  MACRO
  31.       or   StatReg, 00001000b  ; Bit 3 setzen
  32.       SetStatReg StatReg
  33.     ENDM
  34.  
  35. ;* --- Ausschalten der Videodarstellung
  36.  
  37. VideoOff  MACRO
  38.       and  StatReg, 11110111b  ; Bit 3 löschen
  39.       SetStatReg StatReg
  40.     ENDM
  41.  
  42. ;* --- Setzen des Blink-Bits
  43.  
  44. Blink  MACRO
  45.       or   StatReg, 00100000b  ; Bit 5 setzen
  46.       SetStatReg StatReg
  47.     ENDM
  48.  
  49. ;* --- Löschen des Blink-Bits
  50.  
  51. LightInverse  MACRO
  52.       and  StatReg, 11011111b  ; Bit 5 löschen
  53.       SetStatReg StatReg
  54.     ENDM
  55.  
  56. ;*  Laden des ES-Reg. mit der Segmentadresse des Video-
  57. ;*  RAM für Bildschirmausgabe
  58.  
  59. InitScrOut  MACRO
  60.       push es
  61.       push dx
  62.       call ConvOffset  ; Bildschirmposition in Offset zum
  63.                        ; Videosegment umrechnen
  64.       mov  dx, 0b000h  ; Videosegment zuerst nach DX
  65.       mov  es, dx      ; ...dann nach ES
  66.  
  67.       cld              ; bei String-Befehlen aufwärts zählen
  68.     ENDM
  69.  
  70. ;* --- Warten auf Tastendruck
  71.  
  72. WaitKey  MACRO
  73.       xor  ah, ah
  74.       int  16h
  75.     ENDM
  76.  
  77. CODE  SEGMENT Para
  78.       ASSUME cs: CODE, ds: CODE, ss: NOTHING, es: NOTHING
  79.  
  80.  
  81.       Org  100h            ; es soll ein COM-Programm werden
  82.  
  83. Start:
  84.       jmp Demo
  85.  
  86. ;* --- Daten --------------------------------------------- *
  87. ;
  88. M_NormInv  db " normal invers ", 0
  89. M_LBInv    db "hell invers oder invers blinkend", 0
  90. M_Keys     db "<Enter> Attribut, <Space> Bildseite, "
  91.            db "<o> Bildschirm aus/ein, <ESC> Ende", 0
  92. M_TX       db "HGC-Attribut- und Bildseitendemo - (c)"
  93.            db " 1991 TOOLBOX", 0
  94. TextTab    db 61h, 50h, 52h, 0fh, 19h, 06h, 19h, 19h
  95.            db 02h, 0dh, 0bh, 0ch
  96. StatReg    db  ?
  97. LnSpace    dw 25 dup (?)
  98.  
  99. ;* --- Demoprogramm -------------------------------------- *
  100.  
  101.   ;* Ausgabe dreier Textleisten mit wechselbaren Attributen;
  102.   ;* Umschaltung zwischen USER- und DOS-Bildschirm
  103.  
  104. Demo  PROC Near
  105.       call TextMode       ;Textmodus initialisieren
  106.       xor  bp, bp         ;auf Bildseite 0 zugreifen
  107.       call ClrScr         ;Bildschirm löschen
  108.       call ShowHGCPage    ;Bildseite 0 anzeigen
  109.       mov  bl, 23         ;Ausgabezeile laden
  110.  
  111. WriteText:
  112.       lea  si, M_NormInv
  113.       mov  bh, 33         ;Ausgabesp. der mittleren Leiste
  114.       mov  ah, 01110000b  ;Attribut "normal invers"
  115.       call WriteVideo     ;Text ausgeben
  116.       lea  si, M_LBInv    ;Offset der 2. Meldung nach SI
  117.       Blink               ;Blink-Bit setzen
  118.       mov  bh, 1          ;Ausgabespalte der linken Leiste
  119.       mov  ah, 11110000b  ;Attribut "invers blinkend"
  120.       call WriteVideo     ;Text ausgeben
  121.       mov  bh, 48         ;Ausgabespalte der rechten Leiste
  122.       call WriteVideo     ;Text ausgeben
  123.       dec  bl             ;Ausgabezeile um Eins vermindern
  124.       cmp  bl, 2          ;ist sie schon gleich 2?
  125.       jne  WriteText      ;nein, dann vorige Zeile
  126.       mov  bx, 5 Shl 8 + 25  ;ja, Anweisungszeile ausgeben
  127.       lea  si, M_Keys
  128.       mov  ah, 00001110b  ;Attribut "hell auf schwarz"
  129.       call WriteVideo     ;Text wieder ausgeben
  130.       mov  bx, 13 Shl 8 + 1  ;Ausgabesp. und -z. für Titel
  131.       lea  si, M_TX
  132.       mov  ah, 00001001b  ;Attribut "hell unterstrichen"
  133.       call WriteVideo     ;und das letzte Mal...
  134. Taste:
  135.       WaitKey
  136.       cmp  al, 32         ;wurde <Space> gedrückt?
  137.       jne  TestEnter      ;nein, dann vielleicht <Enter>?
  138.       not  bp             ;ja, dann wechsle Bildseite
  139.       call ShowHGCPage    ;und zeige sie an
  140.       jmp  Taste          ;zurück zur Tastaturabfrage
  141. TestEnter:
  142.       cmp  al, 13         ;wurde <Enter> gedrückt?
  143.       jne  TestO          ;nein, dann etwa <o>?
  144.       test StatReg, 20h   ;ja, frage Blink-Bit über Status-
  145.                           ;byte ab, da das Statusregister
  146.                           ;des 6845 sich nicht auslesen läßt
  147.       je   DoBlink        ;nicht gesetzt, also setze es
  148.       LightInverse        ;gesetzt, also lösche es
  149.       jmp  Taste          ;und zurück zur Tastaturabfrage
  150. DoBlink:
  151.       Blink
  152. TestO:
  153.       cmp  al, 111        ;wurde <o> gedrückt?
  154.       jne  TestESC        ;nein, dann eventuell <ESC>?
  155.       test StatReg, 08h   ;ja, dann mache dasselbe mit dem
  156.                           ;Video-Bit des Statusregisters
  157.                           ;wie bei Bedarf mit dem Blink-Bit
  158.       je   SwitchOn
  159.       VideoOff
  160.       jmp  Taste
  161. SwitchOn:
  162.       VideoOn
  163.       jmp  Taste
  164. TestESC:
  165.       cmp  al, 27         ;<ESC> als letzte Rettung?
  166.       jne  Taste          ;nein, also wirklich zurück
  167.       mov  bp, 1          ;ja, also alles zurücksetzen...
  168.       call ShowHGCPage
  169.       Blink
  170.       VideoOn
  171. EndDemo:
  172.       mov  ax, 4c00h      ;...und auf Wiedersehen!
  173.       int  21h
  174. Demo  ENDP
  175.  
  176. ;* --- die eigentlichen Prozeduren ----------------------- *
  177.  
  178. ;* - Initialisierung des Textmodus der HGC, Ermittlung der
  179. ;* - Zeilenoffsets
  180. ;* - Eingabe:    keine
  181. ;* - Ausgabe:    keine
  182. ;* - Register:   sämtliche Reg. verändert
  183.  
  184. TextMode  PROC Near
  185.       mov  dx, 03bfh      ;HGC-Konfigurationsregister
  186.       mov  al, 10b        ;Grafik aus & 2. Bildschirms. ein
  187.       out  dx, al         ;HGC konfigurieren
  188.       push cs             ;DS initialisieren
  189.       pop  ds
  190.       lea  si, TextTab    ;Offset der Tabelle mit den
  191.                           ;CRTC-Registerwerten nach SI
  192.       xor  bl, bl         ;Seite 0, Textmodus, Video aus
  193.       SetStatReg bl       ;Modus setzen
  194.       mov  cx, 0ch        ;12 Register werden gesetzt
  195.       xor  bh, bh
  196. VCp:  lodsb
  197.       mov  ah, al         ;Registerwert  nach ah
  198.       mov  al, bh         ;und Registernummer nach al
  199.       SetCRTC             ;Indexregister programmieren
  200.       inc  bh             ;nächstes Register
  201.       loop VCp            ;Schleife schließen
  202.       mov  StatReg, bl    ;Modusbyte initialisieren
  203.       VideoOn             ;Videodarstellung einschalten
  204.       mov  bl, 80         ;Ermittlung der Zeilenoffsets
  205.       xor  bh, bh         ;es gibt 80 Textspalten
  206.       mov  cl, 25         ;und 25 Textzeilen
  207.       xor  ch, ch
  208.       shl  bx, 1          ;Spalten verdoppeln
  209.       push ds             ;ES auf DS
  210.       pop  es
  211.       lea  di, LnSpace    ;ES:DI auf Anfang der Tabelle
  212.       xor  ax, ax
  213.       stosw               ;Offset 0 entspr. Zeile 0 und 1
  214. Schleife:
  215.       stosw
  216.       add  ax, bx         ;doppelte Spaltenanz. addieren
  217.       loop Schleife       ;Schleife schließen
  218.       ret
  219. TextMode  ENDP
  220.  
  221. ;* - Darstellung einer Bildschirmseite
  222. ;* - Eingabe:    BP = Nummer der Seite
  223. ;* - Ausgabe:    keine
  224. ;* - Register:   DX, AX und Flags verändert
  225.  
  226. ShowHGCPage  PROC Near
  227.       or   bp, bp         ;Seite 0?
  228.       je   Page1          ;ja, einschalten
  229.       and  StatReg, 01111111b  ;nein, ausschalten
  230.       jmp  SM
  231. Page1:
  232.       or   StatReg, 10000000b
  233. SM:   SetStatReg StatReg  ;neuen Modus setzen
  234.       ret
  235. ShowHGCPage   ENDP
  236.  
  237. ;* - Löschen des Bildschirms
  238. ;* - Eingabe:    keine
  239. ;* - Ausgabe:    keine
  240. ;* - Register:   AX, CX und Flags verändert
  241.  
  242. ClrScr  PROC Near
  243.           push bx
  244.           mov  bx, 1 Shl 8 + 1  ;linke obere Ecke
  245.           InitScrOut      ;Segmentadresse des V-RAMs
  246.           mov  cx, 2000   ;Größe des V-RAMs in Words
  247.           mov  ax, 32     ;Spaces mit Attribut "schwarz"
  248.           rep  stosw      ;hinein ins V-RAM
  249.           pop  dx
  250.           pop  es
  251.           pop  bx
  252.           ret
  253. ClrScr  ENDP
  254.  
  255. ;* - Schreiben in den Bildschirmspeicher jener Seite, die
  256. ;* - durch BP festgelegt ist; Ende-Code des Strings ist NUL
  257. ;* - Eingabe:    AH = Attribut
  258. ;* -             BL = Ausgabezeile
  259. ;* -             BH = Ausgabespalte
  260. ;* -             SI = String-Offset
  261. ;* - Ausgabe:    keine
  262. ;* - Register:   AL und Flags verändert
  263.  
  264. WriteVideo  PROC Near
  265.       push si
  266.       InitScrOut          ;Segmentadresse des V-RAMs holen
  267. Write0:
  268.       lodsb               ;Zeichen aus String lesen
  269.       or   al, al         ;NUL-Marke?
  270.       je   WriteEnd       ;ja, also fertig
  271.       stosw               ;nein, hinein ins V-RAM
  272.       jmp  Write0         ;und Vorgang wiederholen
  273. WriteEnd:
  274.       pop  dx
  275.       pop  es
  276.       pop  si
  277.       ret
  278. WriteVideo  ENDP
  279.  
  280. ;* - Umrechnung einer Bildschirmposition in die ent-
  281. ;* - sprechende Offset-Adresse im Video-RAM
  282. ;* - Eingabe:  BL = Zeile
  283. ;             BH = Spalte
  284. ;             BP = Nummer der Bildseite
  285. ;* - Ausgabe:  DI = Offset-Adresse
  286. ;* - Register: DI und Flags verändert
  287.  
  288. ConvOffset  PROC Near
  289.       push ax
  290.       push bx
  291.       dec  bh;            ;Spalte 0 = Spalte 1
  292.       shl  bx, 1          ;Zeile und Spalte verdoppeln
  293.       mov  al, bh         ;Spalte nach AL
  294.       xor  bh, bh
  295.       mov  di, [LnSpace + bx]  ;Zeilen-Offset nach DI
  296.       xor  ah, ah         ;AH für 16-Bit Addition löschen
  297.       add  di, ax         ;und Spalten zum Offset addieren
  298.       or   bp, bp         ;Seite 0?
  299.       jne  COEnd          ;nein, dann alles fertig
  300.       add  di, 8000h      ;ja, dann Verschiebung um 32kB
  301.                           ;zum Offset addieren
  302. COEnd:
  303.       pop  bx
  304.       pop  ax
  305.       ret
  306. ConvOffset  ENDP
  307.  
  308. CODE          ENDS
  309.               END    Start
  310. ;* ------------------------------------------------------- *
  311. ;*                 Ende von HPADEMO.ASM                    *
  312.  
  313.