Annotation of coherent/d/conf/tboot/intcall.m, revision 1.1.1.1

1.1       root        1: //////////
                      2: / From MSDOS MWC86 system call interface.
                      3: / Interrupt simulation.
                      4: / Modified for use with tertiary boot code for COHERENT.
                      5: / 
                      6: / Modified September 1991 by La Monte H. Yarroll <[email protected]>
                      7: /
                      8: / DANGER!! THIS IS SELF MODIFYING CODE.  IT WILL ONLY WORK IN A STRICTLY
                      9: / SINGLE THREADED ENVIRONMENT.
                     10: //////////
                     11: 
                     12: #include "larges.h"
                     13: 
                     14: //////////
                     15: / void
                     16: / intcall(src, dest, intnum)
                     17: / struct reg *src;             /* All regs are loaded except flags */
                     18: / struct reg *dest;            /* All regs are stored here */
                     19: / int intnum;                  /* Int number */
                     20: //////////
                     21: 
                     22: src    =       6+RASIZE
                     23: dest   =       src+PTRSIZE
                     24: intnum =       dest+PTRSIZE
                     25: 
                     26:        .globl  intcall_
                     27: 
                     28: intcall_:
                     29:        push    si                      / Save register variables.
                     30:        push    di
                     31:        push    bp
                     32:        mov     bp, sp
                     33: 
                     34:        movb    al, intnum(bp)          / Get intnum in AL
                     35:        movb    cs:myint+1, al          / Modify the code
                     36: 
                     37:        Lds     si, src(bp)             / Load DS:SI with src pointer.
                     38:        mov     ax, (si)                / Set AX
                     39:        mov     bx, 2(si)               / and BX
                     40:        mov     cx, 4(si)               / and CX
                     41:        mov     dx, 6(si)               / and DX
                     42:        mov     di, 10(si)              / and DI,
                     43:        push    12(si)                  / save src DS,
                     44:        mov     es, 14(si)              / set ES
                     45:        mov     si, 8(si)               / and SI
                     46:        pop     ds                      / and DS.
                     47:                                        / Actually do the interrupt.
                     48: myint: int     0                       / This instruction gets modified.
                     49: 
                     50: / The interrupt handler preserves SS:SP.
                     51: / The iret to the handler pops the handler address and flags pushed above,
                     52: / the iret from the handler pops the retint address and flags.
                     53: retint:
                     54:        mov     bp, sp                  / Restore BP.
                     55:        pushf                           / Save result flags
                     56:        push    es                      / and ES
                     57:        push    ds                      / and DS
                     58:        push    si                      / and SI.
                     59: 
                     60: #if    !LARGEDATA
                     61:        mov     si, ss
                     62:        mov     ds, si                  / Restore DS
                     63:        mov     es, si                  / and ES.
                     64: #endif
                     65: 
                     66:        Lds     si, dest(bp)            / Get dest in DS:SI.
                     67:        mov     (si), ax                / Load dest with returned AX
                     68:        mov     2(si), bx               / and BX
                     69:        mov     4(si), cx               / and CX
                     70:        mov     6(si), dx               / and DX
                     71:        pop     8(si)                   / and SI
                     72:        mov     10(si), di              / and DI
                     73:        pop     12(si)                  / and DS
                     74:        pop     14(si)                  / and ES
                     75:        pop     16(si)                  / and flags.
                     76: 
                     77:        pop     bp
                     78:        pop     di
                     79:        pop     si
                     80:        Gret
                     81: 
                     82: / end of intcall.m

unix.superglobalmegacorp.com

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