Code:
'------------------------------------------------------------------------------
'          Unit: pointer2.pbl
'         Zweck: Adressumwandlungen, Interruptvektor-Funktionen
'         Autor: M.Hoffmann
'       Sprache: PowerBASIC 3.5
' 1.00 19.12.94: erste Version POINTER1.
' 1.10 07.05.98: Interne Optimierungen; ACHTUNG: wegen BYVAL-Aufruf geänderte
'                Deklarationen im Hauptprogramm erforderlich, daher als
'                POINTER2 weiterentwickelt!
' 1.20 05.07.98: Optimierungen.
'------------------------------------------------------------------------------
' c: pointer1.pbu      1858   5.04.98  14:42 v1.00 POINTER1 (PB)
' c: pointer2.pbu      1350   7.05.98  18:58 v1.10 POINTER2 (ASM)
' c: pointer2.pbu      1133   5.07.98  13:48 v1.20

$compile  unit
$cpu      80386
$debug    map-,pbdebug-,path-,unit-
$dim      all
$error    bounds-,numeric-,overflow-,stack-
$event    off
$optimize size
$option   cntlbreak-,gosub-,signed-
$static

'
' --- Wandelt Segment- und Offset-Teil einer Adresse in einen Pointer um
'

function farptr (byval segm as word, byval offs as word) local public as dword
   ! mov ax, segm
   ! mov function[2], ax
   ! mov ax, offs
   ! mov function[0], ax
end function

'
' --- Ermittelt den Segment-Teil eines Pointers (DWORDs)
'

function segment (byval farp as dword) local public as word
   ! mov ax, word farp[2]
   ! mov function, ax
end function

'
' --- Ermittelt den Offset-Teil eines Pointers (DWORDs)
'

function offset (byval farp as dword) local public as word
   ! mov ax, word farp[0]
   ! mov function, ax
end function

'
' --- Gibt einen Interruptvektor als Pointer zurück (&hffffffff = Fehler)
'

function getintvec (byval intnr as byte) local public as dword
   ! pushf
   ! mov function, &hffffffff
   ! mov ah, &h35
   ! mov al, intnr
   ! int &h21
   ! jc getintvecX
   ! mov function[0],bx
   ! mov function[2],es
getintvecX:
   ! popf
end function

'
' --- Setzt einen Interruptvektor auf die als Pointer übergebene Adresse
'        Anmerkung: gibt 0 oder Fehlercode vom DOS zurück.
'

function setintvec (byval intnr as byte, byval farp as dword) local public as integer
   ! pushf
   ! push ds
   ! mov ah, &h25
   ! mov al, intnr
   ! mov ds, word farp[2]
   ! mov dx, word farp[0]
   ! int &h21
   ! jc setintvecX
   ! xor ax,ax
setintvecX:
   ! pop ds
   ! popf
   ! mov function,ax
end function

'===============================================================================
------------------