home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / LANGUAGS / XLISP / XLISP11.ARK / SETJMP.ASM < prev    next >
Assembly Source File  |  1986-10-12  |  2KB  |  94 lines

  1. ;setjmp/longjmp support for Aztec C
  2. ;Mark E. Mallett 830127
  3. ;
  4.  
  5.     public    setjmp_
  6.     public    longjmp_
  7.  
  8.  
  9. ;
  10. ; setjmp            i = setjmp(env)
  11. ;
  12. ;        returns 0 if setting
  13. ;            val if longjmping
  14. ;
  15.  
  16. setjmp_:
  17.     DB    0EDH,073H    ; LD (nn),SP
  18.     DW    osp        ;   nn..
  19.     pop    h        ; Get return address
  20.     shld    raddr        ; Save it
  21.     pop    h        ; get address of env buffer
  22.     shld    envadr        ; Save it
  23.  
  24.     DB    011H        ; ld de,nn   .. Find the end of the jmp buffer
  25.      DW    10        ;       nn
  26.     DB    019H        ; ADD HL,DE
  27.     shld    nsp        ; Save so I can pick it up...
  28.     DB    0EDH,07BH    ; ... here   ( ld sp,(nn)  )
  29.     DW    nsp        ;                    ..NN..
  30.  
  31.     push    b        ; save things in jmp buffer
  32.     db    0DDH,0E5H    ; push ix
  33.     db    0FDH,0E5H    ; push iy
  34.     lhld    raddr        ; save return address
  35.     push    h
  36.     lhld    osp        ; save original stack pointer
  37.     push    h
  38.  
  39.     lxi    h,0        ; set return value to 0
  40.     shld    val
  41.     jp    ljret        ; go return as if from longjump
  42.  
  43.  
  44.  
  45. ; longjmp            longjmp (env,val)
  46. ;            returns val to where setjmp was called
  47. ;
  48.  
  49. longjmp_:
  50.     lxi    h,2        ; Find addr of env
  51.     dad    sp        ;     .
  52.     mov    e,m        ; get it in de
  53.     inx    h
  54.     mov    d,m
  55.     inx    h
  56.     DB    0EDH,053H    ; ld (nn),de
  57.     DW    envadr
  58.     mov    e,m        ; get value
  59.     inx    h
  60.     mov    d,m
  61.     DB    0EDH,053H    ; LD (nn),de
  62.     DW    val        ;   NN
  63.  
  64. ; Here to return from setjmp/longjmp
  65.  
  66. ljret:
  67.     DB    0EDH,07BH    ; LD SP,(NN)... Get jmp buffer address
  68.     DW    envadr        ;      ..NN..
  69.     pop    h        ; Get old stack pointer value
  70.     shld    osp        ; Save it
  71.     pop    d        ; Get old return address
  72.     mov    m,e        ; Put it on the old stack
  73.     inx    h
  74.     mov    m,d
  75.  
  76.     db    0FDH,0E1H    ; pop iy
  77.     db    0DDH,0E1H    ; pop ix
  78.     pop    b
  79.  
  80.     lhld    val        ; Get value to return
  81.     DB    0EDH,07BH    ; LD sp,(nn)
  82.      DW    osp        ;       NN
  83.  
  84.     ret            ; Return to setjmp caller
  85.  
  86.  
  87.  
  88. envadr:    ds    2        ; Address of jmp buffer
  89. nsp:    ds    2        ; New stack pointer
  90. osp:    ds    2        ; Old stack pointer
  91. raddr:    ds    2        ; Return address
  92. val:    ds    2        ; Value to return
  93.     end
  94.