&&
------------------------------------------------------------------------------
                  CURSUS ASSEMBLER  -  WERKEN MET WINDOWS 4
------------------------------------------------------------------------------

In het vierde stuk wil ik teksten in een window printen. Dat gaat niet zo
eenvoudig als in een DOS-window omdat we het window geopend hebben via de
intuition-routines.

Om tekst af te drukken in een intuition-window moeten we een tabel met infor-
matie over de tekst aanmaken en de intuition-routine PrintIText aanroepen.

Het programma dat het window aanmaakt blijft weer gelijk. Ik zet daar ook weer
geen kommentaar bij, u kunt dat nalezen in het vorige nummer.

  ;
  ; VARIABELEN DEFINIEREN
  ;
  ExecBase=     4
  OpenLibrary=  -$228
  CloseLibrary= -$19E
  Open=         -$1E
  Close=        -$24
  Delay=        -$C6
  OpenWindow=   -$CC
  CloseWindow=  -$48
  WaitPort=     -$0180
  PrintIText=   -$D8              ; Een offset in de intuition.library.
&&
  ;
  ; HET HOOFDPROGRAMMA. HIER ROEPEN WE ALLE ROUTINES AAN.
  ;
  MOVEM.L  D0-D7/A0-A6,-(A7)
  JSR      OpenDos
  CMP.L    #0,D0
  BEQ      Einde
  MOVE.L   D0,DosBase
  JSR      OpenIntuition
  CMP.L    #0,D0
  BEQ      CloseDos
  MOVE.L   D0,IntuiBase
  JSR      OpenWin
  CMP.L    #0,D0
  BEQ      CloseIntui
  MOVE.L   D0,WinHandle
  JSR      Printen                ; Hier roepen we de printroutine aan.
  JSR      Wachten
  JMP      CloseWin

  ;
  ; OPENEN VAN DE DOS.LIBRARY
  ;
  OpenDos:
  MOVE.L   ExecBase,A6
  MOVE.L   #DosNaam,A1
  MOVE.L   #0,D0
&&
  JSR      OpenLibrary(A6)
  RTS

  ;
  ; OPENEN VAN DE INTUITION.LIBRARY
  ;
  OpenIntuition:
  MOVE.L   ExecBase,A6
  MOVE.L   #IntuiNaam,A1
  MOVE.L   #0,D0
  JSR      OpenLibrary(A6)
  RTS
  ;
  ; OPEN VAN HET WINDOW
  ;
  OpenWin:
  MOVE.L   IntuiBase,A6
  LEA      NewWindow,A0
  JSR      OpenWindow(A6)
  RTS

  ;
  ; SLUITEN VAN HET WINDOW
  ;
  CloseWin:
  MOVE.L   IntuiBase,A6
  MOVE.L   WinHandle,A0
&&
  JSR      CloseWindow(A6)

  ;
  ; SLUITEN VAN DE INTUITION.LIBRARY
  ;
  CloseIntui:
  MOVE.L   ExecBase,A6
  MOVE.L   IntuiBase,A1
  JSR      CloseLibrary(A6)

  ;
  ; SLUITEN VAN DE DOS.LIBRARY
  ;
  CloseDos:
  MOVE.L   ExecBase,A6
  MOVE.L   DosBase,A1
  JSR      CloseLibrary(A6)

  ;
  ; HET EINDE VAN HET PROGRAMMA
  ;
  Einde:
  MOVEM.L  (SP)+,D0-D7/A0-A6
  RTS
&&
  ;
  ; DE WACHTLUS
  ;
  Wachten:
  MOVE.L   WinHandle,A0
  MOVE.L   86(A0),A0
  MOVE.L   ExecBase,A6
  JSR      WaitPort(A6)
  MOVE.L   D0,A1
  MOVE.L   20(A1),D1
  RTS

Nu komt de nieuwe routine, de routine die de tekst afdrukt :

  ;
  ; PRINTEN VAN EEN TEKST
  ;
  Printen:
  MOVE.L   IntuiBase,A6           ; Pointer naar de intuition.library.
  MOVE.L   WinHandle,A0           ; Pointer naar de window-tabel.
  MOVE.L   50(A0),A0              ; De plaats van de Rastport in de window-
                                  ;    tabel.
  LEA      WindowText,A1          ; Adres van de tekst-tabel.
  MOVE.L   #20,D0                 ; De X-offset in pixels.
  MOVE.L   #20,D1                 ; De Y-offset in pixels.
  JSR      PrintIText(A6)         ; De tekst afdrukken.
  RTS                             ; Einde van de routine.
&&
Deze routine heeft een paar gegevens nodig. Als eerste wordt een funktie uit
de intuition.library gebruikt en moet dus het adres van die library bekend
zijn. Deze moet in A6 staan om straks de routine PrintIText aan te roepen.

Dan is de plaats van de Rastport nodig. Daar wordt immers geprint. Om die
plaats te vinden moeten we eerst de plaats van de window-tabel pakken. Die
staat in WinHandle. 50 Bytes verder staat het adres van de Rastport.

Als laatste is bij printen natuurlijk de plaats belangrijk. De X- en Y-coor-
dinaat moet gegeven worden, in D0 en D1. Dat maakt deze routine meteen een
stuk aantrekkelijker dan een normale printroutine omdat de plaats vrij gekozen
kan worden en niet gebonden is aan regels en kolommen.

De computer moet als laatste de tekst natuurlijk hebben. Die tekst staat in
een tekststructuur waar een aantal dingen over de tekst in staan :

  ;
  ; DE TEKSTSTRUCTUUR
  ;
  EVEN
  WindowText:
  DC.B     1                      ; De kleur van de tekst.
  DC.B     2                      ; De kleur van de achtergrond.
  DC.B     0                      ; De teken-mode, hier normaal.
  EVEN
  DC.W     20                     ; De X-positie.
  DC.W     20                     ; De Y-positie.
&&
  DC.L     0                      ; Standaard karakterset.
  DC.L     TekstBuffer            ; Het adres van de tekst.
  DC.L     0                      ; Niet meer teksten.

U ziet hier weer de X- en Y-positie. Deze werd ook al gevraagd in de print-
routine. Het is echter toeval dat hier dezelfde waarden staan. De computer
pakt beide getallen en telt deze bij elkaar op. De werkelijke positie staat
in de tekststructuur, de print-offset wordt erbij geteld.

  ;
  ; GEHEUGENRESERVERING VOOR DE WINDOW-STRUKTUUR
  ;
  EVEN
  NewWindow:
  DC.W     10               ; X.
  DC.W     10               ; Y.
  DC.W     600              ; Breedte.
  DC.W     200              ; Hoogte.
  DC.B     1                ; Letterkleur 1.
  DC.B     3                ; Achtergrondkleur 3.
  DC.L     $200             ; 
  DC.L     $1000!1!2!4!8    ; Window-mogelijkheden.
  DC.L     0                ; Gadgets.
  DC.L     0                ; Grafisch.
  DC.L     WindowTitel      ; Adres van de titel van het window.
  DC.L     0                ; Adres van het screen (0=WorkBench).
  DC.L     0                ; Adres van de bitmap (geen).
&&
  DC.W     20               ; Breedte minimaal.
  DC.W     20               ; Hoogte minimaal.
  DC.W     629              ; Breedte maximaal.
  DC.W     246              ; Hoogte maximaal.
  DC.W     1                ; Scherm-type WorkBench.

  ;
  ; VARIABELEN
  ;
  DosBase:
  DC.L     0

  IntuiBase:
  DC.L     0

  WinHandle:
  DC.L     0

  DosNaam:
  DC.B     'dos.library',0

  IntuiNaam:
  DC.B     'intuition.library',0

  WindowTitel:
  DC.B     'Intuition-Venster',0
&&
  TekstBuffer:
  DC.B     'Een tekst in een intuition-window.',0

De laatste regel is de te printen tekst, afgesloten door een 0.


het programma staat op de diskette. U kunt het vanuit de CLI starten met het
volgende kommando :

Assembler/Window1

De source staat in de sub-directory Assembler.














- EINDE ----------------------------------------------------------------------
&&
