home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / screen / split / split.txt < prev    next >
Text File  |  1990-08-13  |  30KB  |  823 lines

  1.  FH Nürnberg               Seite 1             Screen Splitting
  2. ───────────────────────────────────────────────────────────────
  3.  
  4.                                
  5.                    ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  6.                    ▌                      ▐
  7.                    ▌   Screen Splitting   ▐ 
  8.                    ▌                      ▐ 
  9.                    ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  10.                              von
  11.                      Norbert Raum-Deinzer
  12.                         Hersbruck 1990 
  13.  
  14.  
  15. Diese Kurzbeschreibung entstand aus einer Studiumsarbeit im
  16. Wahlpflichtfach "Systemnahes Programmieren" an der Fachhoch-
  17. schule Nürnberg.
  18.                                
  19.                                
  20.                                
  21.                       Inhaltsverzeichnis:
  22.  
  23.  
  24.  
  25. Zusammenfassung der schriftlichen Kurzfassung................2
  26.  
  27. 1.  Was bedeutet Screen Splitting............................3
  28.  
  29. 2.  Grundlagen für die Programmierung der EGA/VGA-Karte......3
  30.  
  31. 2.1 Der Bildschirmspeicher der Video-Karte...................3
  32.  
  33. 2.2 Interne Speicherung von Alphanumerischen Zeichen im Text-
  34.     Modus....................................................4
  35.  
  36. 2.3 Das EGA/VGA BIOS.........................................4
  37.  
  38. 2.4 Lesen des Zustandes der EGA/VGA Karte....................5
  39.  
  40. 2.5 Adressieren der EGA/VGA-Register.........................6
  41.  
  42. 3.  Funktionsprinzip Screen Splitting........................7
  43.  
  44. 4.  Benötigte Register.......................................9
  45.  
  46. 5.  Synchronisation.........................................10
  47.  
  48. 6.  Kurze Programmbeschreibung..............................11
  49.  
  50. 7.  Implementierungsdetails.................................11
  51.  
  52. 7.1 Installationsprozedur Install...........................12
  53.  
  54. 7.2 Tastatur-Interruptprozedur INT09h.......................12
  55.  
  56. 7.3 Zeitgeber-Interruptprozedur INT1Ch......................13
  57.  
  58. 8.  Einsatz- und Erweiterungsmöglichkeiten..................13
  59.  
  60. 9.  Literaturverzeichnis....................................14
  61.  
  62. Anhang:  Struktogramme
  63.  
  64. ───────────────────────────────────────────────────────────────
  65.  FB N-F                  Kurzfassung                      05/90
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  FH Nürnberg               Seite 2             Screen Splitting
  72. ───────────────────────────────────────────────────────────────
  73.  
  74. Zusammenfassung der schriftlichen Kurzfassung
  75.  
  76.  
  77. Die Kurzfassung erläutert die Grundlagen für die Programmierung
  78. einer EGA/VGA-Karte.  Hierbei werden  Punkte angesprochen,  wie
  79. Adressierung     des     Bildschirmspeichers,     Abspeicherung
  80. Alphanumerischer-Zeichen, Nutzung  des EGA/VGA-BIOS,  Lesen des
  81. Zustandes der  Grafikkarte und  Adressierung der  VGA-Register.
  82. Danach wird  erklärt, wie  Screen  Splitting  funktioniert  und
  83. welche  Register   benötigt  werden.  Nächster  Punkt  ist  die
  84. Synchronisation  der   Schreibvorgänge  mit  der  Bewegung  des
  85. Elektronenstrahls.  Nach    einer  kurzen  Programmbeschreibung
  86. folgen dann  die  Implementierungsdetails,  welche  anhand  von
  87. Struktogrammen  unterstützt   werden.   Am   Ende   steht   das
  88. Literaturverzeichnis.
  89. Das beschriebene  Programm stammt von Ingo Eickmann und ist aus
  90. dem Januar Heft 1990 der Zeitschrift mc entnommen.
  91.  
  92. ───────────────────────────────────────────────────────────────
  93.  FB N-F                  Kurzfassung                      05/90
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  FH Nürnberg               Seite 3             Screen Splitting
  100. ───────────────────────────────────────────────────────────────
  101.  
  102. 1. Was bedeutet Screen Splitting
  103.  
  104.  
  105. Auf einem  Bildschirm sollen zwei Bildschirmseiten gleichzeitig
  106. dargestellt werden.  Dabei werden  beide Seiten natürlich nicht
  107. ganz, sondern nur ausschnittsweise dargestellt.
  108.  
  109.  
  110.  
  111. 2. Grundlagen für die Programmierung der EGA/VGA-Karte
  112.  
  113.  
  114. "Screen   Splitting" kann  nur auf  einer  EGA  oder  VGA-Karte
  115. realisiert werden,  da  hierfür  besondere  Register  notwendig
  116. sind. Im  folgenden wird nur auf den Textmodus 03h eingegangen,
  117. außer es wird ausdrücklich auf einen anderen Modus hingewiesen.
  118.  
  119. Textmodus 03h:     80 Spalten  und  25 Zeilen
  120.                    640 x 350 (EGA)
  121.                    640 x 400 (VGA)
  122.  
  123.  
  124.  
  125. 2.1 Der Bildschirmspeicher der Video-Karte
  126.  
  127.  
  128. Der Bildschirmspeicher  beginnt, wie in Bild 1.0 zu erkennen an
  129. Adresse A0000h  und endet  an Adresse BFFFFh im Systemspeicher.
  130. Um Daten  in das  Video-RAM zu  übertragen, ist  also  nur  ein
  131. einfacher MOV-Befehl  erforderlich. Der Speicherbereich für die
  132. Video-Karte unterteilt sich noch in drei weitere Teilbereiche:
  133.  
  134.                -  EGA/VGA (Grafikmodus)
  135.                -  Monochrome Adapter (Hercules)
  136.                -  CGA (farbiger Textmodus EGA/VGA)
  137.  
  138. Wegen   der  Kompatibilität  zu den  ältere Bildschirmadaptern,
  139. beginnt der farbige Textmodus erst ab Adresse B8000h.
  140.  
  141.     00000h ───┬────────────────────────────────────────────┐
  142.               │                                            │
  143.               │              System  Speicher              │
  144.               │                                            │
  145.     A0000h ───┼────────────────────────────────────────────┤
  146.               │     EGA/VGA  Grafik Bildschirmspeicher     │
  147.     B0000h ───┼────────────────────────────────────────────┤
  148.               │        Monochromer Bildschirmspeicher      │
  149.     B8000h ───┼────────────────────────────────────────────┤
  150.               │  CGA + Text (farbig)  Bildschirmspeicher   │
  151.     C0000h ───┼────────────────────────────────────────────┤
  152.               │                                            │
  153.               │                    I/O ROM                 │
  154.               │                                            │
  155.     F0000h ───┼────────────────────────────────────────────┤
  156.               │                                            │
  157.               │                     BIOS                   │
  158.               │                                            │
  159.    100000h ───┼────────────────────────────────────────────┤
  160.  
  161.  
  162. ───────────────────────────────────────────────────────────────
  163.  FB N-F                  Kurzfassung                      05/90
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  FH Nürnberg               Seite 4             Screen Splitting
  170. ───────────────────────────────────────────────────────────────
  171.  
  172. 2.2 Interne Speicherung von Alphanumerischen Zeichen im
  173.    Text-Modus
  174.  
  175.  
  176. Im Textmodus 03h benötigt ein Buchstabe einen Speicherplatz von
  177. 2 Byte. Diese beiden Bytes bestehen aus:
  178.  
  179.              -  erweiterter ASCII-Code (8 bit)
  180.              -  Attributwert (8 bit)
  181.  
  182. Der Attributwert  gibt zum  Beispiel an, ob das Zeichen invers,
  183. unterstrichen, oder  in welcher  Farbe das  Zeichen dargestellt
  184. wird.
  185.  
  186. Die interne Abspeicherung eines Zeichens erfolgt in sogenannten
  187. "Planes". Dabei  wird in  Plane 1 der ASCII-Code und in Plane 2
  188. der Attributwert abgespeichert.
  189.  
  190.  
  191.         ASCII-Code               Attributwert
  192.      ┌───────────────┐        ┌───────────────┐
  193.      │               │        │               │
  194.      └───────────────┘        └───────────────┘
  195.              │                        │
  196.              │                        │
  197.              │             ┌──────────────────────────────┐
  198.              │             │  Plane 1                     │
  199.              │             │                              │
  200.         ┌──────────────────────────────┐                  │
  201.         │  Plane 0                     │                  │
  202.         │                              │                  │
  203.         │                              │                  │
  204.  
  205.  
  206. Um diese  Einteilung braucht  sich der  Programmierer nicht  zu
  207. kümmern. Er  schreibt einfach  an  einer  geraden  Adresse  den
  208. ASCII-Code und  an der ungeraden den dazugehörigen Attributwert
  209. ins Video-RAM.  Die Einteilung  in "Planes" erledigt die Video-
  210. Karte selbständig.
  211.  
  212.  
  213.  
  214.  
  215. 2.3 Das EGA/VGA BIOS
  216.  
  217.  
  218. Das EGA/VGA Basic Input Output System beginnt im Systemspeicher
  219. ab Adresse  C0000h und  endet bei  der Adresse  C3FFFh. Die vom
  220. BIOS  zur   Verfügung  gestellten   Routinen  werden  über  den
  221. Interrupt 10h aufgerufen.
  222.  
  223. Beispiel:  Einstellen der Grafikkarte in den Textmodus 3
  224.  
  225.       MOV AH,00h   ;00h in AH bedeutet: Bildschirmmodus
  226.                                         wird geändert
  227.       MOV AL,03h   ;Ins AL Register wird nun der
  228.                     entsprechende Modus geschrieben
  229.       INT 10h      ;Aufruf der entsprechenden Routine
  230.  
  231. ───────────────────────────────────────────────────────────────
  232.  FB N-F                  Kurzfassung                      05/90
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  FH Nürnberg               Seite 5             Screen Splitting
  239. ───────────────────────────────────────────────────────────────
  240.  
  241. 2.4 Lesen des Zustandes der EGA/VGA Karte
  242.  
  243.  
  244. Um  den   Zustand  der   Karte  zu   bestimmen,  gibt  es  zwei
  245. Möglichkeiten, wobei eine davon nur der VGA-Karte zur Verfügung
  246. steht.
  247.  
  248.  
  249. a) Bestimmung des Zustandes über den BIOS-Datenbereich
  250.  
  251. Ab Adresse  449h im  System-RAM bis  Adresse  469h  stehen  die
  252. Zustandsdaten der EGA/VGA-Karte (siehe Bild).
  253.  
  254.  
  255.                      BIOS - Datenbereich
  256.  
  257.      ┌─────────────────────────────────────────────────┐ 4FFh
  258.      │                   Reserviert                    │
  259.      │─────────────────────────────────────────────────│ 488h
  260.      │                  Status─Bytes                   │
  261.      │─────────────────────────────────────────────────│ 471h
  262.      │               Optionen und Timer                │
  263.      │─────────────────────────────────────────────────│ 469h
  264.      │                 VIDEO - Bereich                 │
  265.      │─────────────────────────────────────────────────│ 449h
  266.      │                      Disk                       │
  267.      │─────────────────────────────────────────────────│ 435h
  268.      │                    Tastatur                     │
  269.      │─────────────────────────────────────────────────│ 417h
  270.      │                    Hardware                     │
  271.      └─────────────────────────────────────────────────┘ 400h
  272.  
  273. Im Video-BIOS Datenbereich steht zum Beispiel:
  274.  
  275.         Adresse in Hex     Funktion
  276.  
  277.         0000:0449          Aktiver Bildschirmmodus
  278.         0000:044A          Anzahl Zeichen pro Spalte
  279.         0000:0436          Port-Adresse der CRTC-Register
  280.  
  281.  
  282. b) Lesen des Zustandes über einen BIOS-Aufrufs
  283.  
  284. Die VGA-Karte  bietet noch die Möglichkeit über den BIOS-Aufruf
  285. AH=1Bh den  Zustand direkt  in einem  vom  Benutzer  bestimmten
  286. Datenbereich zu schreiben.
  287.  
  288. ───────────────────────────────────────────────────────────────
  289.  FB N-F                  Kurzfassung                      05/90
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  FH Nürnberg               Seite 6             Screen Splitting
  296. ───────────────────────────────────────────────────────────────
  297.  
  298. 2.5 Adressieren der EGA/VGA-Register
  299.  
  300.  
  301. Die       Adressierung   erfolgt    hier   nicht    wie    beim
  302. Bildschirmspeicher über  den Systemspeicher,  sondern über  den
  303. Ein/Ausgabe-Kanal.
  304.  
  305.  
  306.                       IN/OUT - Adressen
  307.  
  308.      ┌─────────────────────────────────────────────────┐ 3F0h
  309.      │                                                 │
  310.      │                                                 │
  311.      │                                                 │
  312.      │─────────────────────────────────────────────────│ 3E0h
  313.      │   CGA           EGA/VGA                         │
  314.      │─────────────────────────────────────────────────│ 3D0h
  315.      │   EGA/VGA                                       │
  316.      │─────────────────────────────────────────────────│ 3C0h
  317.      │   MDA           EGA/VGA im Monochrom-Modus      │
  318.      │─────────────────────────────────────────────────│ 3B0h
  319.      │                                                 │
  320.      │                                                 │
  321.      │                                                 │
  322.  
  323.  
  324. Aus dem  Bild  kann  man  ablesen,  daß  die  EGA/VGA-Karte  im
  325. Grafikmodus höchstens  16 Register  haben darf,  da nicht  mehr
  326. Adressen vorhanden  sind. In  Wirklichkeit besitzt die EGA/VGA-
  327. Karte aber  über 50  Register. Um  alle Register  ansprechen zu
  328. können, wurde die indirekte Adressierung eingeführt.
  329.  
  330.  
  331. Funktionsprinzip der indirekten Adressierung:
  332.  
  333. Die EGA/VGA-Karte  besitzt ein INDEX und ein DATEN-Register. Um
  334. nun ein bestimmtes Register zu adressieren, schreibt man dessen
  335. Index ins  INDEX-Register. Danach werden die Daten, die für das
  336. Register bestimmt sind, ins Datenregister geschrieben.
  337.  
  338.  
  339. Beispiel zur Indexadressierung:
  340.  
  341.       INDEX-Register                       DATEN-Register
  342.   ┌────────────────────┐              ┌────────────────────┐
  343.   │       02h          │──┐           │        1Ah         │
  344.   └────────────────────┘  │           └────────────────────┘
  345.     Adresse: 3D4h         │             Adresse: 3D5h
  346.                           │
  347.                           │       ┌───────────────────────────┐
  348.                           │       │  Register mit Index 00h   │
  349.                           │       │───────────────────────────│
  350.                           │       │  Register mit Index 01h   │
  351.                           │       │───────────────────────────│
  352.                           └───── │  Register mit Index 02h   │
  353.                                   │───────────────────────────│
  354.                                   │                           │
  355.                                   │                           │
  356.  
  357. ───────────────────────────────────────────────────────────────
  358.  FB N-F                  Kurzfassung                      05/90
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  FH Nürnberg               Seite 7             Screen Splitting
  365. ───────────────────────────────────────────────────────────────
  366.  
  367.  
  368.  
  369. Ins Register mit dem Index 00h wird der Wert 1Ah geschrieben.
  370.  
  371. Das vorherige Beispiel schaut als Programm folgendermaßen aus:
  372.  
  373.              MOV dx,3D4h    ;Adresse des Index-Registers laden
  374.              MOV ax,02h     ;Register-Index laden
  375.              OUT dx,ax      ;Index ins Indexregister schreiben
  376.              INC dx         ;Adresse des DATEN-Registers laden
  377.              MOV ax,1Ah     ;Daten für Register laden
  378.              OUT dx,ax      ;Daten ins DATEN-Register schreiben
  379.  
  380.  
  381. Registergruppen:
  382.  
  383. Mehrere   Register    sind   zu   sogenannten   Registergruppen
  384. zusammengefaßt. Bis  auf wenige  Ausnahmen existiert  für  eine
  385. Registergruppe ein Index und ein DATEN-Register.
  386.  
  387. Register-Gruppen      │  I/O Port Adressen in Hex  │  Direkt
  388.                       │                            │  adress.
  389. ──────────────────────┼────────────────────────────┼───────────
  390. General oder External │    3BA oder 3DA, 3CA, 3C2, │     JA
  391.                       │             3CC            │
  392.                       │                            │
  393. Sequencer             │           3C4, 3C5         │    NEIN
  394.                       │                            │
  395. CRTC                  │    3B4, 3B5 oder 3D4, 3D5  │    NEIN
  396.                       │                            │
  397. Graphics              │          3CE, 3CF          │    NEIN
  398.                       │                            │
  399. Attribute             │          3C0, 3C1          │ 1 Register
  400.                       │                            │
  401.  
  402.  
  403.  
  404.  
  405. 3. Funktionsprinzip Screen Splitting
  406.  
  407.  
  408. Die Bildschirmdarstellung  beginnt ab  der Adresse,  welche  im
  409. Start-Adress-Register steht.  Ab dieser  Adresse  beginnt  auch
  410. der Zeilenzähler  zu zählen.  Ins Line-Compare-Register muß die
  411. Zeilenzahl geladen werden, ab der der Bildschirm geteilt werden
  412. soll. Erreicht  nämlich der Zeilenzähler den Wert, der im Line-
  413. Compare-Register steht, so wird die Bildschirmadresse auf 0000h
  414. zurückgesetzt. Das  heißt, ab jetzt wird das auf dem Bildschirm
  415. dargestellt, was  ab Adresse 0000h im Bildschirmspeicher steht.
  416. Die jetzige  Bildschirmseite wird  solange dargestellt  bis der
  417. Zeilenzähler die maximale Zeilenzahl erreicht.
  418.  
  419. ───────────────────────────────────────────────────────────────
  420.  FB N-F                  Kurzfassung                      05/90
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  FH Nürnberg               Seite 8             Screen Splitting
  427. ───────────────────────────────────────────────────────────────
  428.  
  429. Adresse, die im
  430. Start-Address-Register ╔══════════════════════════════════════╗
  431. steht ─────────────────╫─┬──────────────────────────────────┐ ║
  432.                        ║ │                                  │ ║
  433. Zeilenzähler gleich    ║ │        Bildschirmseite 2         │ ║
  434. Line-Compare-Register ─╫─┼▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄│ ║
  435.                      ┌─╫─┼─                                 │ ║
  436. Adresse 00h ─────────┘ ║ │                                  │ ║
  437.                        ║ │        Bildschirmseite 1         │ ║
  438.                        ║ │                                  │ ║
  439. Maximale Zeile ────────╫─┴──────────────────────────────────┘ ║
  440.                        ╚══════════════════════════════════════╝
  441.  
  442.  
  443. Im  Start-Adress-Register   steht  eigentlich  der  Offset  der
  444. Adresse.   Die    Segmentadresse   ist    nämlich   durch   den
  445. Bildschirmmodus   bereits vorgegeben. Alle  EGA/VGA-Grafikmoden
  446. beginnen   mit   der Segmentadresse  A0000h und  alle  farbigen
  447. Textmoden mit der Segmentadresse B8000h.
  448.  
  449.  
  450. Beispiel zu Screen Splitting:
  451.  
  452. Der Bildschirm  soll im Modus 03h (VGA) genau in der Hälfte des
  453. Bildschirms  geteilt   werden.  Es  sollen  dabei  zwei  völlig
  454. voneinander unabhängige Seiten dargestellt werden.
  455.  
  456.      a) Sicherstellung, daß sich die darzustellenden Seiten
  457.         nicht überlappen.
  458.         Ein Zeichen benötigt zwei Byte Speicherplatz.
  459.         Im Modus 03h werden 80 Zeichen pro Zeile und 25 Zeilen
  460.         dargestellt.
  461.         Insgesamt werden also 2000 Zeichen am Bildschirm darge-
  462.         stellt.
  463.         Daraus ergibt sich ein benötigter Speicherplatz von
  464.         FA0h.
  465.         Für den Beginn der zweiten Seite muß also ein Wert
  466.         größer oder gleich FA0h gewählt werden. Zum Beispiel
  467.         Beginn der zweiten Seite ab 1000h.
  468.  
  469.      b) Laden des Start-Address-Registers
  470.         Das Start-Address-Register wird mit 1000h geladen.
  471.  
  472.      c) Laden des Line-Compare-Registers
  473.         Da  der Bildschirminhalt genau ab der Hälfte gesplittet
  474.         werden soll, muß der Wert C8h (200 Dez.) geladen
  475.          werden.
  476.  
  477.  
  478. ACHTUNG: Die aktuelle Bildschirmseite ist in unseren Fall immer
  479.          die Seite 1, da diese ab Offset 00h beginnt.
  480.  
  481. ───────────────────────────────────────────────────────────────
  482.  FB N-F                  Kurzfassung                      05/90
  483.  
  484.  
  485.  
  486.  
  487.  
  488.  FH Nürnberg               Seite 9             Screen Splitting
  489. ───────────────────────────────────────────────────────────────
  490.  
  491. 4. Benötigte Register
  492.  
  493.  
  494. Start-Address-Register
  495.  
  496. Da für  eine Adresse  16 bit  erforderlich sind,  gibt es  zwei
  497. Start-Address-Register.
  498.  
  499.  
  500.    Start-Adress-High-Register
  501.  
  502.     ┌───────────────────────────────────────────────┐
  503.     │  7  │  6  │  5  │  4  │  3  │  2  │  1  │  0  │
  504.     │─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────│
  505.     │     │     │     │     │     │     │     │     │
  506.     └───────────────────────────────────────────────┘
  507.     Registergruppe: CRTC                   Index: 0Ch
  508.  
  509.  
  510.    Start-Adress-Low-Register
  511.  
  512.     ┌───────────────────────────────────────────────┐
  513.     │  7  │  6  │  5  │  4  │  3  │  2  │  1  │  0  │
  514.     │─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────│
  515.     │     │     │     │     │     │     │     │     │
  516.     └───────────────────────────────────────────────┘
  517.     Registergruppe: CRTC                   Index: 0Dh
  518.  
  519.  
  520. Line-Compare-Register
  521.  
  522. Da die  Anzahl der  Zeilen größer  ist als  256 (maximaler Wert
  523. eines 8  bit Registers),  mußte bei  EGA noch ein 9.bit und bei
  524. VGA sogar noch ein 10.bit hinzugefügt werden.
  525.  
  526.  
  527.    Line-Compare-Register (bit 1  bis  bit 8)
  528.  
  529.     ┌───────────────────────────────────────────────┐
  530.     │  7  │  6  │  5  │  4  │  3  │  2  │  1  │  0  │
  531.     │─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────│
  532.     │     │     │     │     │     │     │     │     │
  533.     └───────────────────────────────────────────────┘
  534.     Registergruppe: CRTC                   Index: 18h
  535.  
  536.  
  537.    Overflow-Register (bit 9)
  538.  
  539.     ┌───────────────────────────────────────────────┐
  540.     │  7  │  6  │  5  │  4  │  3  │  2  │  1  │  0  │
  541.     │─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────│
  542.     │     │     │     │  X  │     │     │     │     │
  543.     └───────────────────────────────────────────────┘ 
  544.    X entspricht dem 9.bit des Line-Compare-Registers
  545.  
  546. ───────────────────────────────────────────────────────────────
  547.  FB N-F                  Kurzfassung                      05/90
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  FH Nürnberg               Seite 10            Screen Splitting
  554. ───────────────────────────────────────────────────────────────
  555.  
  556.    Maximum-Scan-Line-Register (bit 10)
  557.  
  558.     ┌───────────────────────────────────────────────┐
  559.     │  7  │  6  │  5  │  4  │  3  │  2  │  1  │  0  │
  560.     │─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────│
  561.     │     │  X  │     │     │     │     │     │     │
  562.     └───────────────────────────────────────────────┘
  563.    X entspricht dem 10.bit des Line-Compare-Registers
  564.  
  565.  
  566. Um das  "Splitten" zu  beenden, muß der maximale Wert ins Line-
  567. Compare-Register  (9.   und  10.bit   in   anderen   Registern)
  568. geschrieben werden.  Bei VGA  (10 bit)  ist dies der Wert 3FFh.
  569. Bei EGA  (9   bit) ist  dies der Wert (1FFh). Der Wert, der ins
  570. Line-Compare-Register geschrieben  wird, sollte  zwischen  Null
  571. und der  maximalen Zeilenzahl (entsprechend  dem Modus) liegen.
  572. Außer beim  Aufheben des  Splitten, sollte  dieser Wert niemals
  573. größer sein als die maximale Zeilenzahl.
  574.  
  575.  
  576. Input-Status#1 Register
  577.  
  578.  
  579. Dieses   Register    wird   im   nächsten   Kapitel   bei   der
  580. Synchronisation verwendet.
  581.  
  582.     ┌───────────────────────────────────────────────┐
  583.     │  7  │  6  │  5  │  4  │  3  │  2  │  1  │  0  │
  584.     │─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────│
  585.     │     │     │     │     │  X  │     │     │     │
  586.     └───────────────────────────────────────────────┘
  587.     Registergruppe: External Register     Monochrome:    3BAh
  588.                                           Color Display: 3DAh
  589.    Bit 3:   0 :  Display Mode
  590.             1 :  Vertical Retrace
  591.  
  592.  
  593. 5. Synchronisation
  594.  
  595.  
  596. Das Schreiben  in das  Start-Address-Register und  in das Line-
  597. Compare-Register kann nur zu bestimmten Zeitpunkten erfolgen.
  598.  
  599.  
  600. Vertical Retrace:
  601.  
  602. Ist die  Rückführungsphase des Elektronenstrahls, in welcher er
  603. vom   rechten   unteren   Bildschirmeck   zum   linken   oberen
  604. Bildschirmeck bewegt wird.
  605.  
  606. Start-Address-Register:
  607.  
  608. Der Registerinhalt  wird während  des   Vertical-Retrace in den
  609. internen Adresszähler  übertragen. Ins Register sollte also nur
  610. geschrieben werden, wenn der Bildschirm aufgebaut wird (Display
  611. Mode).
  612.  
  613. ───────────────────────────────────────────────────────────────
  614.  FB N-F                  Kurzfassung                      05/90
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  FH Nürnberg               Seite 11            Screen Splitting
  621. ───────────────────────────────────────────────────────────────
  622.  
  623. Line-Compare-Register:
  624.  
  625. Der Registerinhalt  wird  während  des  Bildschirmaufbaus  nach
  626. jeder Rasterzeile zum Vergleich gelesen. Ins Register kann also
  627. nur während des Vertical-Retrace geschrieben werden.
  628.  
  629. Durch Lesen des Input-Status#1 Register (siehe voriges Kapitel)
  630. können die  Schreibvorgänge synchronisiert  werden. Dabei  wird
  631. auf die fallende, bzw. steigende Flanke von bit 3 gewartet.
  632.  
  633.  
  634.  
  635.  
  636. 6. Kurze Programmbeschreibung
  637.  
  638.  
  639. Das Programm  mit den  Namen SPLIT.COM ist resident und erlaubt
  640. das Abspeichern einer Bildschirmseite im Textmodus 03h. Ist der
  641. Bildschirminhalt   abgespeichert    worden,   so   kann   durch
  642. herabscrollen   der    aktuellen    Bildschirmseite    1    die
  643. Bildschirmseite  2   wieder  hervorgeholt   werden.  Ist  diese
  644. heruntergescrollt,   kann   sie   jederzeit   per   Tastendruck
  645. heraufgescrollt  werden.  Durch  mehrmaligen  Tastendruck  wird
  646. dabei das Scrollen beschleunigt.
  647.  
  648. Tastendefinitionen:
  649.  
  650.               ALT-S     Bildschirminhalt speichern
  651.               ALT-D     Aktuellen Bildschirm nach unten
  652.                          scrollen
  653.               ALT-U     Aktuellen Bildschirm nach oben scrollen
  654.  
  655. Das Programm  ist für  eine VGA-Karte  geschrieben,  kann  aber
  656. jederzeit     durch  Ändern   (steht  im  Programmlisting)  der
  657. entsprechenden Befehle an eine EGA-Karte angepaßt werden.
  658.  
  659. Das Programm ist in zwei Dateien aufgeteilt:
  660.  
  661.                    -  SPLIT.ASM
  662.                    -  SPLIT.MAC
  663.  
  664. Wie man  aus diesen  Dateien ein lauffähiges Programm erstellt,
  665. wird in der Datei READ.ME erklärt.
  666.  
  667.  
  668.  
  669.  
  670. 7. Implementierungsdetails
  671.  
  672.  
  673. In dieser  Kurzfassung sind die wichtigsten Punkte, die für die
  674. sinnvolle Programmierung einer EGA/VGA-Karte erforderlich sind,
  675. erläutert worden.  Auf die Programmteile für die residente Pro-
  676. grammierung wird dagegen nicht näher eingegangen.
  677.  
  678. ───────────────────────────────────────────────────────────────
  679.  FB N-F                  Kurzfassung                      05/90
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  FH Nürnberg               Seite 12            Screen Splitting
  686. ───────────────────────────────────────────────────────────────
  687.  
  688. Das Programm gliedert sich in drei Teile:
  689.  
  690.         -  Installationsprozedur
  691.            Installiert das Programm resident im
  692.            Hauptspeicher.
  693.            Prozedurname (Marke) im Assemblerlisting:  Install
  694.  
  695.         -  Tastatur-Interruptprozedur
  696.            Wird bei jeden Tastendruck aufgerufen und  über-
  697.            prüft, ob die entsprechende Taste gedrückt wurde.
  698.            Prozedurname:  INT09h
  699.  
  700.         -  Zeitgeber-Interruptprozedur
  701.            Wird regelmäßig durch den Timer-Interrupt
  702.            aufgerufen und sorgt dafür, daß die entsprechenden
  703.            Tastenfunktionen richtig ausgeführt werden.
  704.            Prozedurname:  INT1Ch
  705.  
  706.  
  707.  
  708. In der  Datei  SPLIT.MAC  befinden  sich  die  Makros  für  das
  709. Assemblerprogramm. Zu erwähnen ist hier, daß sich das Makro zum
  710. PUSH'en und  POP'en der  Register (Originalprogramm)  unter dem
  711. Turbo-Assembler nicht  assemblieren lies.  Das Makro wurde dann
  712. durch eine geringfügige Modifikation lauffähig gemacht.
  713.  
  714.  
  715.  
  716.  
  717. 7.1 Installationsprozedur Install
  718.  
  719.  
  720. Die  Installationsprozedur   installiert  die   Prozeduren  für
  721. Zeitgeber  und   Tastaturinterrupt,   indem   sie   die   alten
  722. Interruptvektoren  sichert   und  die  neuen  Interruptvektoren
  723. installiert. Danach  wird eine Copyright-Meldung ausgegeben. Da
  724. das    Programm     keinerlei     Sprünge     und     keinerlei
  725. Unterprogrammaufrufe enthält,  wurde von  der Erstellung  eines
  726. Struktogramms abgesehen.
  727.  
  728.  
  729.  
  730.  
  731. 7.2 Tastatur-Interruptprozedur INT09h
  732.  
  733.  
  734. In dieser  Prozedur wird  überprüft, ob  eine der Tasten ALT-S,
  735. ALT-U oder ALT-D gedrückt wurde. Zum Programm-Listing wurde ein
  736. Struktogramm erstellt,  welches im  Anhang auf Seite 1 und 2 zu
  737. finden ist.
  738. Die Überprüfung,  ob der  richtige Grafikmodus eingestellt ist,
  739. erfolgt durch  das Auslesen  der entsprechenden  Daten aus  dem
  740. BIOS-Datenbereich (siehe Kapitel 2.4).
  741. Die Speicherstelle  mit dem  Namen Add_word,  auch als Variable
  742. Add_word bezeichnet, hat die Aufgabe die Zeilenverschiebung (+1
  743. oder -1) für die Zeitgeber-Interruptprozedur zwischenzusichern.
  744.  
  745. ───────────────────────────────────────────────────────────────
  746.  FB N-F                  Kurzfassung                      05/90
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  FH Nürnberg               Seite 13            Screen Splitting
  753. ───────────────────────────────────────────────────────────────
  754.  
  755. 7.3 Zeitgeber-Interruptprozedur INT1Ch
  756.  
  757.  
  758. Die Zeitgeber-Interruptprozedur hat die Aufgaben:
  759.  
  760.        -  zu überprüfen, ob eine Verschiebung notwendig ist
  761.        -  die Verschiebung durchzuführen
  762.  
  763. Überprüft wird  dabei mit  der Variable Add_word. Zu Erinnerung
  764. sei nochmals daraufhingewiesen, daß das Bildschirm-Splitten mit
  765. dem maximalen  Wert für  das Line-Compare  Register  aufgehoben
  766. wird. Aufheben  des Splitten  heißt, daß  der Wert  fürs  Line-
  767. Compare Register  -1 ist.  Auch hier wurde zum Programm-Listing
  768. ein Struktogramm  erstellt, welches  im Anhang  auf Seite  3 zu
  769. finden ist. Split_Screen steht im Programm als Makro und ist in
  770. der Datei  SPLIT.MAC abgespeichert.  Im Struktogramm  wurde das
  771. ganze Makro  nur als  "Bildschirm splitten"  erwähnt, weil  der
  772. Programmablauf aus  dem  Programm-Listing  eindeutig  erkennbar
  773. ist. Im Makro wird die Adresse des CRTC-Registers aus dem BIOS-
  774. Datenbereich herausgelesen (siehe Kapitel 2.4).
  775.  
  776.  
  777.  
  778.  
  779. 8. Einsatz- und Erweiterungsmöglichkeiten
  780.  
  781.  
  782. Ein Einsatz  ist nur dann möglich, wenn eine EGA oder VGA-Karte
  783. installiert  ist.   Die  Verwendung   des  Splitting   für  die
  784. Darstellung von  zwei Fenstern  bietet sich geradeweg an. Wobei
  785. man aber  beachten muß,  daß  jedes  Fenster  immer  die  selbe
  786. Fensterbreite, nämlich  die  Breite  des  Bildschirms  besitzt.
  787. Solch eine  Fenster-Darstellung ist zum Beispiel unter WordStar
  788. 5.0 realisiert.  WordStar teilt  den Bildschirm  aber nicht mit
  789. der hier vorgestellten Methode.
  790. Im Moment  funktioniert das  Programm nur  im  Textmodus.  Eine
  791. sinnvolle Erweiterung  wäre, das  Teilen des Bilschirms auch im
  792. Grafikmodus zu realisieren. Hier ist aber zu beachten, daß dies
  793. nur funktioniert,  wenn ein  Bildschirmmodus gewählt  wird, der
  794. nicht  mehr   als  die   Hälfte  des  zur  Verfügung  stehenden
  795. Grafikkartenspeichers benötigt.  Zum Beispiel  ist das Splitten
  796. zu  zwei  unabhängigen  Bildschirmfenstern  im  VGA-Grafikmodus
  797. 640x480 in 16 Farben nicht mehr möglich.
  798.  
  799. ───────────────────────────────────────────────────────────────
  800.  FB N-F                  Kurzfassung                      05/90
  801.  
  802.  
  803.  
  804.  
  805.  
  806.  FH Nürnberg               Seite 14            Screen Splitting
  807. ───────────────────────────────────────────────────────────────
  808.  
  809. 9. Literaturverzeichnis
  810.  
  811.  
  812. Screen Splitting
  813. Ingo Eickmann
  814. mc Heft Januar 1990
  815.  
  816. Programmer's Guide to the EGA and VGA Cards
  817. Richard F. Ferraro
  818. Addison-Wesley Publishing Company
  819.  
  820. ───────────────────────────────────────────────────────────────
  821.  FB N-F                  Kurzfassung                      05/90
  822.    lagen für die Programmierung
  823. einer EGA/VGA-Karte.  Hierbei werd