home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CASM.ARJ / FARPTR.ASM < prev    next >
Assembly Source File  |  1988-07-07  |  2KB  |  97 lines

  1. ;_ farptr.asm   Thu Jul  7 1988   Modified by: Walter Bright */
  2. ; Copyright (C) 1985-1988 by Northwest Software
  3. ; All Rights Reserved
  4.  
  5. ; Far pointer arithmetic routines
  6.  
  7. include    macros.asm
  8.  
  9.     begcode    farptr
  10.  
  11. ;;;;;;;;;;;;;;;;;;;;;
  12. ; Normalize a far pointer. That is, adjust
  13. ; the segment and offset so that the offset is < 16.
  14. ;    void far *_farptr_norm(void far *);
  15. ; Example:
  16. ;    _farptr_norm((void far *)0x11002678) returns 0x13670008
  17.  
  18.     c_public    _farptr_norm
  19. func    _farptr_norm
  20.     push    BP
  21.     mov    BP,SP
  22.     mov    AX,P[BP]
  23.     mov    DX,P+2[BP]
  24.     pop    BP
  25.  
  26.     mov    CX,AX
  27.     and    AX,0Fh
  28.     shr    CX,1
  29.     shr    CX,1
  30.     shr    CX,1
  31.     shr    CX,1
  32.     add    DX,CX
  33.     ret
  34. c_endp    _farptr_norm
  35.  
  36. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  37. ; Convert from long to a normalized far pointer.
  38. ; The long is taken to be a linear address from 0.
  39. ;    void far *_farptr_fromlong(long);
  40. ; Example:
  41. ;    _farptr_fromlong(0xB7543) returns 0xB7540003
  42.  
  43.     c_public _farptr_fromlong
  44. func    _farptr_fromlong
  45.     push    BP
  46.     mov    BP,SP
  47.     mov    AX,P[BP]
  48.     mov    DX,P+2[BP]
  49.     pop    BP
  50.  
  51.     mov    CH,AL        ;low 4 bits of AX will form offset
  52.     mov    DH,DL        ;upper 4 bits of segment
  53.     shl    DH,1
  54.     shl    DH,1
  55.     shl    DH,1
  56.     shl    DH,1
  57.     shr    AX,1
  58.     shr    AX,1
  59.     shr    AX,1
  60.     shr    AX,1
  61.     clr    DL
  62.     or    DX,AX
  63.     mov    AL,CH        ;restore AL
  64.     and    AX,0Fh
  65.     ret
  66. c_endp    _farptr_fromlong
  67.  
  68. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  69. ; Convert from a far pointer to long.
  70. ;    long _farptr_tolong(void far *);
  71. ; Example:
  72. ;    _farptr_tolong((void far *) 0xB7540013) returns 0xB7553
  73.  
  74.     c_public _farptr_tolong
  75. func    _farptr_tolong
  76.     push    BP
  77.     mov    BP,SP
  78.     mov    AX,P[BP]
  79.     mov    DX,P+2[BP]
  80.     pop    BP
  81.  
  82.     rol    DX,1
  83.     rol    DX,1
  84.     rol    DX,1
  85.     rol    DX,1
  86.     mov    CX,DX
  87.     and    DX,0Fh        ;clear top 12 bits of DX
  88.     xor    CX,DX        ;clear bottom 4 bits of CX
  89.     add    AX,CX
  90.     adc    DL,DH        ;add carry into DX (DH is 0)
  91.     ret
  92. c_endp    _farptr_tolong
  93.  
  94.     endcode    farptr
  95.  
  96.     end
  97.