CDSEG SEGMENT 'CODE'
      ASSUME CS:CDSEG,DS:CDSEG
; Neue Fassung vom 23.06.2003

HP    PROC
      PUSH CS              ; DS := CS
      POP  DS
      MOV  AH,35h          ; Interruptvektor 0 lesen
      MOV  AL,00h
      INT  21h
      PUSH BX              ; Interruptvektor 0 merken
      PUSH ES
      MOV  DX,OFFSET INT0  ; Interruptvektor 0 setzen
      MOV  AH,25h
      MOV  AL,00h
      INT  21h
      MOV  AX,0            ; Divisionsueberlauf ausloesen
      MOV  BX,0
      MOV  DX,0
      DIV  BX
      MOV  AH,09h          ; Meldung ausgeben
      MOV  DX,OFFSET GOON
      INT  21h
      POP  DS              ; Interruptvektor 0 zuruecksetzen
      POP  DX
      MOV  AH,25h
      MOV  AL,00h
      INT  21h
      MOV  AX,4C00h
      INT  21h
HP    ENDP

INT0  PROC FAR
      STI
      MOV  AH,09h          ; Meldung ausgeben
      MOV  DX,OFFSET DIV0
      INT  21h
      POP  BX              ; urspruengliche Ruecksprungadresse
      ADD  BX,2            ; hinter DIV-Befehl setzen
                           ; (IP zeigt bei INT-Aufruf noch auf DIV-Befehl)
      PUSH BX              ; korrigierte Ruecksprungadresse
      IRET
INT0  ENDP

DIV0  DB   "Divisionsueberlauf",13,10,'$'
GOON  DB   "Programm laeuft noch ...",13,10,'$'

CDSEG ENDS

SSEG  SEGMENT STACK
      DW 1024 DUP (?)
SSEG  ENDS

      END HP