Annotation of coherent/b/lib/libc/gen/i8086/setjmp.m, revision 1.1.1.1

1.1       root        1: //////////
                      2: / MWC86 runtime.
                      3: / Nonlocal goto.
                      4: //////////
                      5: 
                      6: #include <larges.h>
                      7: 
                      8: ////////
                      9: / #include <setjmp.h>
                     10: /
                     11: / int
                     12: / setjmp(env);
                     13: / jmp_buf env;
                     14: /
                     15: / The header <setjmp.h> defines jmp_buf, an array of int used to save
                     16: / the current frame pointer, stack pointer and return address.
                     17: / setjmp(env) saves BP, SP and RA in env and returns 0.
                     18: ////////
                     19: 
                     20: env    =       0
                     21: savebp =       0                       / offset of saved BP in environment
                     22: savesp =       2                       / offset of saved SP
                     23: savera =       4                       / offset of saved return address
                     24: saveseg        =       6                       / offset of saved ra segment (LARGE model)
                     25: 
                     26:        .globl  setjmp_
                     27: 
                     28: setjmp_:
                     29:        pop     ax                      / Return address offset to AX
                     30: #if    LARGECODE
                     31:        pop     dx                      / and segment to DX.
                     32: #endif
                     33:        mov     bx, sp
                     34: 
                     35:        Lds     bx, Pss env(bx)         / Environment pointer to DS:BX.
                     36:        mov     savebp(bx), bp          / Save frame.
                     37:        mov     savesp(bx), sp          / Save SP with return address popped.
                     38:        mov     savera(bx), ax          / Save return address offset
                     39: #if    LARGECODE
                     40:        mov     saveseg(bx), dx         / and segment.
                     41: #endif
                     42: 
                     43:        sub     ax, ax
                     44:        Gijmp   savera(bx)              / Return 0.
                     45: 
                     46: ////////
                     47: / int
                     48: / longjmp(env, value);
                     49: / jmp_buf env;
                     50: / int value;
                     51: /
                     52: / longjmp(env, value) restores the environment saved in "env" and
                     53: / causes the setjmp() call to return again, this time returning "value".
                     54: ////////
                     55: 
                     56: env    =       RASIZE
                     57: value  =       env+PTRSIZE
                     58: 
                     59:        .globl  longjmp_
                     60: 
                     61: longjmp_:
                     62:        mov     bx, sp
                     63:        mov     ax, Pss value(bx)       / Return value to AX.
                     64:        Lds     bx, Pss env(bx)         / Environment pointer to DS:BX.
                     65:        mov     cx, savebp(bx)          / Desired BP to CX.
                     66: 
                     67: L0:    cmp     cx, 0(bp)               / Is the current frame correct?
                     68:        je      L1                      / Yes.
                     69:        mov     bp, 0(bp)               / Unwind a frame.
                     70:        or      bp, bp                  / Have we hit the top frame?
                     71:        jne     L0                      / No, unwind another.
                     72: 
                     73:        mov     bp, cx                  / We hit the top, just take a stab at
                     74:        jmp     L2                      / restoring the frame.
                     75: 
                     76: L1:    mov     sp, bp                  / Reset stack to correct place
                     77:        pop     bp                      / and restore frame
                     78:        pop     di                      / and the two
                     79:        pop     si                      / register variables.
                     80: 
                     81: L2:    mov     sp, savesp(bx)          / Restore SP and
                     82:        Gijmp   savera(bx)              / return from the setjmp.
                     83: 
                     84: / end of setjmp.m

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.