.286
code segment
assume cs:code,ds:code
org 100h

start:
  jmp main                      ;Sprung zum Hauptprogramm

;residente Prozeduren:

print proc near                 ;gibt ASCIIZ-String an Pos ds:si auf LPT1 aus
print_loop:
  xor ah,ah                     ;Funktion 0
  lodsb                         ;Zeichen holen
  or al,al                      ;fertig, wenn 0 als Abschlu
  je fertig
  xor dx,dx                     ;auf LPT1 ausgeben
  int 17h
  jmp print_loop                ;nchstes Zeichen
fertig:
  ret
print endp

handler5 proc far               ;Handler fr Interrupt 5
  push es                       ;alle benutzten Register sichern
  push ds
  pusha

  mov ax,cs                     ;es mit PSP-Segment laden
  mov es,ax
  mov ds,ax                     ;auch Datensegment in Codesegment

  mov di,80h                    ;Parameterblock als Puffer
  mov ah,1bh                    ;Funktion 1bh
  xor bx,bx
  int 10h                       ;Video-Status ermitteln

  cli

  mov al,byte ptr cs:[80h+22h]  ;Anzahl Bildschirmzeilen holen
  cmp al,25d
  jbe normal                    ;wenn 25 Bildschirmzeilen, normale Routine

  lea si,klein_Schrift          ;auf 6-Punkt Schrift umschalten
  call print                    ;Code an Drucker
  jmp ausgabe

normal:
  lea si,Gro_Schrift           ;auf 12-Punkt Schrift umschalten
  call print                    ;Code an Drucker

ausgabe:
  sti
  pushf
  call dword ptr [oldint5]      ;normale Ausgabe aktivieren

  popa
  pop ds
  pop es
  iret
handler5 endp

oldint5: dd 0                   ;Original-Vektor
klein_Schrift:  db 1bh,'(s6V'   ;6 Punkte Hhe
                db 1bh,'&l12D'  ;12 Zeilen pro Inch
                db 1bh,'(s12H'  ;12 Zeichen pro Inch
                db 0
gro_schrift:    db 1bh,'(s12V' ;12 Punkt Hhe
                db 1bh,'&l6D'   ;6 Zeilen pro Inch
                db 1bh,'(s10H'  ;10 Zeichen pro Inch
                db 0

letzte:

main proc near
  mov ax,3505h                  ;Interrupt 5 auslesen
  int 21h
  mov di,bx                     ;es:di zeigt auf installierten Handler
  mov si,bx                     ;ds:si zeigt auf Handler dieses Programmes
  mov cx,4                      ;8 Bytes vergleichen
  repe cmpsw
  jcxz deinstallieren           ;gleich ?, dann deinstallieren

installieren:
  mov word ptr oldint5,bx       ;alten Vektor sichern
  mov word ptr oldint5 + 2,es

  mov ax,2505h                  ;Interrupt 5 umleiten
  lea dx,handler5               ;Offset laden, Segment bereits in ds
  int 21h

  mov ax,ds:[2ch]               ;Environment-Segment laden
  mov es,ax                     ;nach es
  mov ah,49h                    ;und freigeben
  int 21h

  mov ah,9                      ;Installationsmeldung ausgeben
  lea dx,installiert
  int 21h
  lea dx,letzte                 ;bis Label letzte resident bleiben
  inc dx
  int 27h

deinstallieren:
  mov ah,9                      ;Deinstallationsmeldung ausgeben
  lea dx,deinstalliert
  int 21h

  push ds
  lds dx,dword ptr es:[oldint5] ;ds:dx mit altem Vektor laden
  mov ax,2505h                  ;diesen setzen
  int 21h
  pop ds

  mov ah,49h                    ;residenten Speicher freigeben
  int 21h
  int 20h                       ;und beenden
main endp


Installiert:    db 'Neue Print-Screen Funktion installiert',0dh,0ah,'$'
Deinstalliert:  db 'Print-Screen deinstalliert',0dh,0ah,'$'

code ends
end start
