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

  1. ;_ jmp.asm   Thu Aug 11 1988   Modified by: Walter Bright */
  2. ; Copyright (C) 1985-1988 by Northwest Software
  3. ; All Rights Reserved
  4. ; Written by Walter Bright
  5.  
  6.     include    macros.asm
  7.  
  8.     begcode    jmp
  9.  
  10.     c_public    setjmp,longjmp
  11.  
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  13. ; Locations in jmp_buf[]:
  14.  
  15. _IP    equ    0
  16. _CS    equ    2
  17. _BP    equ    4
  18. _SP    equ    6
  19. _SS    equ    8
  20. _SI    equ    10
  21. _DI    equ    12
  22. _ES    equ    14
  23. _DS    equ    16
  24.  
  25. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  26. ; Use:
  27. ;    setjmp(jmp_buf env);
  28.  
  29. func    setjmp
  30.     mov    AX,BP        ;caller's BP
  31.     push    BP
  32.     mov    BP,SP
  33.     if SPTR
  34.     mov    BX,P[BP]
  35.     mov    _SP[BX],SP    ;save old SP
  36.     mov    _BP[BX],AX    ;save old BP
  37.     mov    _SI[BX],SI
  38.     mov    _DI[BX],DI
  39.     mov    _SS[BX],SS
  40.     mov    _ES[BX],ES
  41.     mov    _DS[BX],DS
  42.     mov    AX,2[BP]
  43.     mov    _IP[BX],AX    ;save return address offset
  44.       if LCODE
  45.     mov    AX,4[BP]
  46.     mov    _CS[BX],AX    ;save return address segment
  47.       else
  48.     mov    _CS[BX],CS
  49.       endif
  50.     else
  51.     mov    CX,ES
  52.     les    BX,P[BP]    ;get pointer to array in ES:BX
  53.     mov    ES:_SP[BX],SP    ;save SP
  54.     mov    ES:_BP[BX],AX    ;save old BP
  55.     mov    ES:_SI[BX],SI
  56.     mov    ES:_DI[BX],DI
  57.     mov    ES:_SS[BX],SS
  58.     mov    ES:_ES[BX],CX
  59.     mov    ES:_DS[BX],DS
  60.     mov    AX,2[BP]
  61.     mov    ES:_IP[BX],AX    ;save return address
  62.       if LCODE
  63.     mov    AX,4[BP]
  64.     mov    ES:_CS[BX],AX    ;return address segment
  65.       else
  66.     mov    ES:_CS[BX],CS
  67.       endif
  68.     endif
  69.     clr    AX        ;always returns 0
  70.     pop    BP
  71.     ret
  72. c_endp    setjmp
  73.  
  74. ;;;;;;;;;;;;;;;;;;;;;;;;;
  75. ; Use:
  76. ;    longjmp(jmp_buf env,val)
  77.  
  78. func    longjmp
  79.     if LCODE
  80.     add    SP,4        ;throw away return address
  81.     else
  82.         pop    AX        ;throw away return address
  83.     endif
  84.     if SPTR
  85.     pop    BX        ;get env
  86.     pop    AX        ;AX = val
  87.     tst    AX
  88.     jnz    L1
  89.     inc    AX        ;don't allow val == 0
  90. L1:
  91.     mov    SS,_SS[BX]
  92.     mov    SP,_SP[BX]    ;restore environment
  93.     add    SP,P        ;compensate for not popping BP and ret addr
  94.     mov    BP,_BP[BX]
  95.     mov    SI,_SI[BX]
  96.     mov    DI,_DI[BX]
  97.     mov    ES,_ES[BX]
  98.     push    _CS[BX]
  99.     push    _IP[BX]
  100.     mov    DS,_DS[BX]
  101.     retf
  102.     else ;LPTR
  103.     pop    BX        ;get env
  104.     pop    ES
  105.     pop    AX        ;AX = val
  106.     tst    AX
  107.     jnz    L1
  108.     inc    AX        ;don't allow val == 0
  109. L1:
  110.     mov    SS,ES:_SS[BX]
  111.     mov    SP,ES:_SP[BX]    ;restore environment
  112.     add    SP,P        ;compensate for not popping BP and ret addr
  113.     mov    BP,ES:_BP[BX]
  114.     mov    SI,ES:_SI[BX]
  115.     mov    DI,ES:_DI[BX]
  116.     push    ES:_CS[BX]
  117.     push    ES:_IP[BX]
  118.     push    ES:_ES[BX]
  119.     mov    DS,ES:_DS[BX]
  120.     pop    ES
  121.     retf
  122.     endif
  123. c_endp    longjmp
  124.  
  125.     endcode    jmp
  126.     end
  127.