Annotation of coherent/d/PS2_KERNEL/i286/ldas.s, revision 1.1.1.1

1.1       root        1: / /usr/src/sys/i8086/src/ldas.s
                      2: / 
                      3: ////////
                      4: /
                      5: /      Loadable Driver Interface Routines.
                      6: /
                      7: /      Loadable drivers execute in separate code segments, and are unable
                      8: /      to directly call kernel service routines.
                      9: /      Loadable drivers call a kernel service stub within their code segment,
                     10: /      which has has the same name as the desired service routine.
                     11: /      The driver service stub performs a far call to one of these routines.
                     12: /      These routines perform a near call to the desired kernel routine,
                     13: /      and then perform a far return to the driver service stub routine.
                     14: /      The driver service stub routine then does a near return to the driver.
                     15: /
                     16: / 90/09/11  Hal Snyder
                     17: / Add ld_call()
                     18: /
                     19: / $Log:        ldas.s,v $
                     20: / Revision 1.1  92/07/17  15:21:30  bin
                     21: / Initial revision
                     22: /
                     23: / Revision 1.2 91/03/01  09:23:04      root
                     24: / Part of COHERENT 3.1.0 kernel
                     25: / 
                     26: / Revision 1.1 88/03/24  17:39:39      src
                     27: / Initial revision
                     28: / 
                     29: / 87/12/08     Allan Cornish   /usr/src/sys/i8086/src/ldas.s
                     30: / Block device interface added to loadable drivers.
                     31: / ldtimcall() function added to support timed functions in loadable drivers.
                     32: /
                     33: / 87/10/25     Allan Cornish   /usr/src/sys/i8086/src/ldas.s
                     34: / Initial version - interface to/from loadable driver processes.
                     35: /
                     36: ////////
                     37: 
                     38:        .globl  ld_xcall_
                     39:        .globl  ld_call_
                     40:        .globl  xcalled
                     41:        .globl  ldtimcall_
                     42:        .globl  ld_open_
                     43:        .globl  ld_close_
                     44:        .globl  ld_read_
                     45:        .globl  ld_write_
                     46:        .globl  ld_block_
                     47:        .globl  ld_ioctl_
                     48:        .globl  ld_power_
                     49:        .globl  ld_time_
                     50:        .globl  ld_poll_
                     51:        .globl  ldrvint_                / void  (*ldrvint[16])();
                     52: 
                     53: ////////
                     54: /
                     55: / Constants
                     56: /
                     57: ////////
                     58: 
                     59:        T_LDRV  = 12                    / Offset(tim,t_ldrv).
                     60:        B_FLAG  = 6                     / Offset(buf,b_flag).
                     61:        B_DEV   = 8                     / Offset(buf,b_dev ).
                     62:        BFERR   = 4                     / buf.b_flag bit set on I/O error.
                     63:        DRV_J   = 4                     / offset in driver of dispatcher
                     64: 
                     65: ////////
                     66: /
                     67: / External References
                     68: /
                     69: ////////
                     70: 
                     71:        .globl  nonedev_                / extern void    nonedev();
                     72:        .globl  ldrvcon_                / extern CON *   ldrvcon[NDRV];
                     73:        .globl  ldrvsel_                / extern saddr_t ldrvsel[NDRV];
                     74:        .globl  ldrvics_                / extern saddr_t ldrvics[16];
                     75:        .globl  ldrvipc_                / extern void  (*ldrvipc[16])();
                     76: 
                     77: ////////
                     78: /
                     79: / Shared Data
                     80: /
                     81: ////////
                     82:        .shrd
                     83: ldrvint_:                      / Loadable Driver Interrupt Entry Points.
                     84:        .word   ld_intr0
                     85:        .word   ld_intr1
                     86:        .word   ld_intr2
                     87:        .word   ld_intr3
                     88:        .word   ld_intr4
                     89:        .word   ld_intr5
                     90:        .word   ld_intr6
                     91:        .word   ld_intr7
                     92:        .word   ld_intr8
                     93:        .word   ld_intr9
                     94:        .word   ld_intr10
                     95:        .word   ld_intr11
                     96:        .word   ld_intr12
                     97:        .word   ld_intr13
                     98:        .word   ld_intr14
                     99:        .word   ld_intr15
                    100: 
                    101: ////////
                    102: /
                    103: / Private Data
                    104: /
                    105: ////////
                    106: 
                    107:        .prvd
                    108:        .shri
                    109: 
                    110: ////////
                    111: /
                    112: / Driver Configuration: Offsets to Function Pointers
                    113: /
                    114: ////////
                    115: 
                    116:        C_OPEN=4
                    117:        C_CLOSE=6
                    118:        C_BLOCK=8
                    119:        C_READ=10
                    120:        C_WRITE=12
                    121:        C_IOCTL=14
                    122:        C_POWER=16
                    123:        C_TIMER=18
                    124:        C_LOAD=20
                    125:        C_ULOAD=22
                    126:        C_POLL=24
                    127: 
                    128: ////////
                    129: /
                    130: / ld_xcall( fp )       - invoke far function.
                    131: / int (far *fp)();
                    132: /
                    133: ////////
                    134: 
                    135: ld_xcall_:
                    136:        cli
                    137:        push    bp
                    138:        mov     bp, sp
                    139:        xcall   4(bp)
                    140:        pop     bp
                    141:        ret
                    142: 
                    143: ////////
                    144: /
                    145: / call a driver function from the kernel
                    146: /   sel                - CS selector for the driver
                    147: /   fn         - offset in the driver of the function we want
                    148: /   arg[1-3]    - optional arguments
                    149: /
                    150: / ld_call(sel, fn, arg1, arg2, arg3)
                    151: / int sel;
                    152: / int (*fn)(void);
                    153: / int arg1, arg2, arg3;
                    154: /
                    155: ////////
                    156: 
                    157: / stack when ld_call() is called:
                    158: /      arg3
                    159: /      arg2
                    160: /      arg1
                    161: /      fn
                    162: /      sel
                    163: /      return IP
                    164: 
                    165: ld_call_:                      / PARAMETERS (arg[1-3]) MUST BE FOUND AT 4(BP).
                    166:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    167: /      lea     bp, 4(sp)       / this is what the next 2 instructions do
                    168:        mov     bp, sp
                    169:        add     bp, $4
                    170:                                /
                    171:        push    0(bp)           / Push sel to allow far call
                    172:        push    $DRV_J          /
                    173:                                /
                    174:        mov     ax, 2(bp)       / Push fn
                    175:                                /
                    176:        xcall   -8(bp)          / Invoke driver interface, which will
                    177:                                /       in turn invoke driver function.
                    178:                                /
                    179:        lea     sp, -4(bp)      /
                    180:        pop     bp              /
                    181:        ret                     /
                    182: 
                    183: ////////
                    184: /
                    185: /
                    186: / ldtimcall( arg, tp )  - service timed far function.
                    187: /
                    188: ////////
                    189: 
                    190: ldtimcall_:                            /
                    191:        push    bp                      /
                    192:        mov     bp, sp                  /
                    193:                                        /
                    194:        mov     bx, 6(bp)               /
                    195:        mov     ax, T_LDRV+2(bx)        /
                    196:        push    ax                      / Loadable driver code selector.
                    197:        push    $DRV_J                  / Loadable driver invocation offset.
                    198:        mov     ax, T_LDRV(bx)          / Desired far function.
                    199:                                        /
                    200:        xcall   -4(bp)                  /
                    201:                                        /
                    202:        mov     sp, bp                  /
                    203:        pop     bp                      /
                    204:        ret
                    205: 
                    206: ////////
                    207: /
                    208: / xcalled( f, args )
                    209: / int (*f)();
                    210: /
                    211: /      Input:  AX is pointer to kernel function to be invoked.
                    212: /
                    213: /      Action: Perform a near call to the specified kernel function,
                    214: /              passing 6 words as optional arguments.
                    215: /              Perform a far return.
                    216: /
                    217: /      Notes:  Invoked by far call from loadable device driver.
                    218: /
                    219: ////////
                    220: 
                    221: xcalled:                       / 6(bp) = grand-parent IP.
                    222:        push    bp              / 4(bp) = parent CS
                    223:        mov     bp, sp          / 2(bp) = parent IP
                    224:                                / AX    = destination function.
                    225:        push    20(bp)  / Arg 7 /
                    226:        push    18(bp)  / Arg 6 /
                    227:        push    16(bp)  / Arg 5 /
                    228:        push    14(bp)  / Arg 4 /
                    229:        push    12(bp)  / Arg 3 /
                    230:        push    10(bp)  / Arg 2 /
                    231:        push     8(bp)  / Arg 1 /
                    232:        icall   ax              /
                    233:                                /
                    234:        mov     sp, bp          / Return to loadable driver.
                    235:        pop     bp              /
                    236:        xret                    /
                    237: 
                    238: ////////
                    239: /
                    240: / ld_open( dev, mode )         - Open Routine.
                    241: / dev_t dev;
                    242: / int mode;
                    243: /
                    244: ////////
                    245: 
                    246: ld_open_:                      / PARAMETERS MUST REMAIN AT 4(BP).
                    247:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    248:        mov     bp, sp          /
                    249:                                /
                    250:        sub     bx, bx          / Calculate major device number * 2.
                    251:        movb    bl, 5(bp)       /
                    252:        shl     bx, $1          /
                    253:                                /
                    254:        mov     cx, ldrvsel_(bx)/ Prepare driver interface CS:IP.
                    255:        jcxz    0f              /
                    256:        push    cx              /
                    257:        push    $DRV_J          / Loadable driver invocation offset.
                    258:                                /
                    259:        mov     bx, ldrvcon_(bx)/ Identify driver configuration.
                    260:        or      bx, bx          /
                    261:        je      0f              /
                    262:                                /
                    263:        mov     ax, C_OPEN(bx)  / Identify driver function to be invoked.
                    264:        or      ax, ax          /
                    265:        je      0f              /
                    266:                                /
                    267:        xcall   -4(bp)          / Invoke driver interface, which will
                    268:                                /       in turn invoke driver function.
                    269:                                /
                    270:        mov     sp, bp          / Return to caller.
                    271:        pop     bp              /
                    272:        ret                     /
                    273: 
                    274: 0:     mov     sp, bp
                    275:        pop     bp
                    276:        jmp     nonedev_
                    277: 
                    278: ////////
                    279: /
                    280: / ld_close( dev )              - Close Routine.
                    281: / dev_t dev;
                    282: /
                    283: ////////
                    284: 
                    285: ld_close_:                     / PARAMETERS MUST REMAIN AT 4(BP).
                    286:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    287:        mov     bp, sp          /
                    288:                                /
                    289:        sub     bx, bx          / Calculate major device number * 2.
                    290:        movb    bl, 5(bp)       /
                    291:        shl     bx, $1          /
                    292:                                /
                    293:        mov     cx, ldrvsel_(bx)/ Prepare driver interface CS:IP.
                    294:        jcxz    0f              /
                    295:        push    cx              /
                    296:        push    $DRV_J          / Loadable driver invocation offset.
                    297:                                /
                    298:        mov     bx, ldrvcon_(bx)/ Identify driver configuration.
                    299:        or      bx, bx          /
                    300:        je      0f              /
                    301:                                /
                    302:        mov     ax, C_CLOSE(bx) / Identify driver function to be invoked.
                    303:        or      ax, ax          /
                    304:        je      0f              /
                    305:                                /
                    306:        xcall   -4(bp)          / Invoke driver interface, which will
                    307:                                /       in turn invoke driver function.
                    308:                                /
                    309:        mov     sp, bp          / Return to caller.
                    310:        pop     bp              /
                    311:        ret                     /
                    312: 
                    313: 0:     mov     sp, bp
                    314:        pop     bp
                    315:        jmp     nonedev_
                    316: 
                    317: ////////
                    318: /
                    319: / ld_read( dev, iop )          - Read Routine.
                    320: / dev_t dev;
                    321: / IO * iop;
                    322: /
                    323: ////////
                    324: 
                    325: ld_read_:                      / PARAMETERS MUST REMAIN AT 4(BP).
                    326:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    327:        mov     bp, sp          /
                    328:                                /
                    329:        sub     bx, bx          / Calculate major device number * 2.
                    330:        movb    bl, 5(bp)       /
                    331:        shl     bx, $1          /
                    332:                                /
                    333:        mov     cx, ldrvsel_(bx)/ Prepare driver interface CS:IP.
                    334:        jcxz    0f              /
                    335:        push    cx              /
                    336:        push    $DRV_J          / Loadable driver invocation offset.
                    337:                                /
                    338:        mov     bx, ldrvcon_(bx)/ Identify driver configuration.
                    339:        or      bx, bx          /
                    340:        je      0f              /
                    341:                                /
                    342:        mov     ax, C_READ(bx)  / Identify driver function to be invoked.
                    343:        or      ax, ax          /
                    344:        je      0f              /
                    345:                                /
                    346:        xcall   -4(bp)          / Invoke driver interface, which will
                    347:                                /       in turn invoke driver function.
                    348:                                /
                    349:        mov     sp, bp          / Return to caller.
                    350:        pop     bp              /
                    351:        ret                     /
                    352: 
                    353: 0:     mov     sp, bp
                    354:        pop     bp
                    355:        jmp     nonedev_
                    356: 
                    357: ///////
                    358: /
                    359: / ld_write( dev, iop )         - Write Routine.
                    360: / dev_t dev;
                    361: / IO * iop;
                    362: /
                    363: ////////
                    364: 
                    365: ld_write_:                     / PARAMETERS MUST REMAIN AT 4(BP).
                    366:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    367:        mov     bp, sp          /
                    368:                                /
                    369:        sub     bx, bx          / Calculate major device number * 2.
                    370:        movb    bl, 5(bp)       /
                    371:        shl     bx, $1          /
                    372:                                /
                    373:        mov     cx, ldrvsel_(bx)/ Prepare driver interface CS:IP.
                    374:        jcxz    0f              /
                    375:        push    cx              /
                    376:        push    $DRV_J          / Loadable driver invocation offset.
                    377:                                /
                    378:        mov     bx, ldrvcon_(bx)/ Identify driver configuration.
                    379:        or      bx, bx          /
                    380:        je      0f              /
                    381:                                /
                    382:        mov     ax, C_WRITE(bx) / Identify driver function to be invoked.
                    383:        or      ax, ax          /
                    384:        je      0f              /
                    385:                                /
                    386:        xcall   -4(bp)          / Invoke driver interface, which will
                    387:                                /       in turn invoke driver function.
                    388:                                /
                    389:        mov     sp, bp          / Return to caller.
                    390:        pop     bp              /
                    391:        ret                     /
                    392: 
                    393: 0:     mov     sp, bp
                    394:        pop     bp
                    395:        jmp     nonedev_
                    396: 
                    397: ///////
                    398: /
                    399: / ld_block( bp )               - Block Routine.
                    400: / BUF * bp;
                    401: /
                    402: ////////
                    403: 
                    404: ld_block_:                     / PARAMETERS MUST REMAIN AT 4(BP).
                    405:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    406:        mov     bp, sp          /
                    407:                                /
                    408:        mov     bx, 4(bp)       / Calculate major device number * 2.
                    409:        movb    bl, B_DEV+1(bx) /
                    410:        subb    bh, bh          /
                    411:        shl     bx, $1          /
                    412:                                /
                    413:        mov     cx, ldrvsel_(bx)/ Prepare driver interface CS:IP.
                    414:        jcxz    0f              /
                    415:        push    cx              /
                    416:        push    $DRV_J          / Loadable driver invocation offset.
                    417:                                /
                    418:        mov     bx, ldrvcon_(bx)/ Identify driver configuration.
                    419:        or      bx, bx          /
                    420:        je      0f              /
                    421:                                /
                    422:        mov     ax, C_BLOCK(bx) / Identify driver function to be invoked.
                    423:        or      ax, ax          /
                    424:        je      0f              /
                    425:                                /
                    426:        xcall   -4(bp)          / Invoke driver interface, which will
                    427:                                /       in turn invoke driver function.
                    428:                                /
                    429:        mov     sp, bp          / Return to caller.
                    430:        pop     bp              /
                    431:        ret                     /
                    432: 
                    433: 0:     mov     bx, 4(bp)       / bp->b_flag |= BFERR.
                    434:        or    B_FLAG(bx),$BFERR /
                    435:        mov     sp, bp          /
                    436:        pop     bp              /
                    437:        jmp     bdone_          / bdone(bp);
                    438: 
                    439: ////////
                    440: /
                    441: / ld_ioctl( dev, iop )         - Ioctl Routine.
                    442: / dev_t dev;
                    443: / IO * iop;
                    444: /
                    445: ////////
                    446: 
                    447: ld_ioctl_:                     / PARAMETERS MUST REMAIN AT 4(BP).
                    448:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    449:        mov     bp, sp          /
                    450:                                /
                    451:        sub     bx, bx          / Calculate major device number * 2.
                    452:        movb    bl, 5(bp)       /
                    453:        shl     bx, $1          /
                    454:                                /
                    455:        mov     cx, ldrvsel_(bx)/ Prepare driver interface CS:IP.
                    456:        jcxz    0f              /
                    457:        push    cx              /
                    458:        push    $DRV_J          / Loadable driver invocation offset.
                    459:                                /
                    460:        mov     bx, ldrvcon_(bx)/ Identify driver configuration.
                    461:        or      bx, bx          /
                    462:        je      0f              /
                    463:                                /
                    464:        mov     ax, C_IOCTL(bx) / Identify driver function to be invoked.
                    465:        or      ax, ax          /
                    466:        je      0f              /
                    467:                                /
                    468:        xcall   -4(bp)          / Invoke driver interface, which will
                    469:                                /       in turn invoke driver function.
                    470:                                /
                    471:        mov     sp, bp          / Return to caller.
                    472:        pop     bp              /
                    473:        ret                     /
                    474: 
                    475: 0:     mov     sp, bp
                    476:        pop     bp
                    477:        jmp     nonedev_
                    478: 
                    479: ////////
                    480: /
                    481: / ld_power( dev )              - Powerfail Routine.
                    482: / dev_t dev;
                    483: /
                    484: ////////
                    485: 
                    486: ld_power_:                     / PARAMETERS MUST REMAIN AT 4(BP).
                    487:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    488:        mov     bp, sp          /
                    489:                                /
                    490:        sub     bx, bx          / Calculate major device number * 2.
                    491:        movb    bl, 5(bp)       /
                    492:        shl     bx, $1          /
                    493:                                /
                    494:        mov     cx, ldrvsel_(bx)/ Prepare driver interface CS:IP.
                    495:        jcxz    0f              /
                    496:        push    cx              /
                    497:        push    $DRV_J          / Loadable driver invocation offset.
                    498:                                /
                    499:        mov     bx, ldrvcon_(bx)/ Identify driver configuration.
                    500:        or      bx, bx          /
                    501:        je      0f              /
                    502:                                /
                    503:        mov     ax, C_POWER(bx) / Identify driver function to be invoked.
                    504:        or      ax, ax          /
                    505:        je      0f              /
                    506:                                /
                    507:        xcall   -4(bp)          / Invoke driver interface, which will
                    508:                                /       in turn invoke driver function.
                    509:                                /
                    510:        mov     sp, bp          / Return to caller.
                    511:        pop     bp              /
                    512:        ret                     /
                    513: 
                    514: 0:     mov     sp, bp
                    515:        pop     bp
                    516:        jmp     nonedev_
                    517: 
                    518: ////////
                    519: /
                    520: / ld_time( dev )               - Timer Routine.
                    521: / dev_t dev;
                    522: /
                    523: ////////
                    524: 
                    525: ld_time_:                      / PARAMETERS MUST REMAIN AT 4(BP).
                    526:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    527:        mov     bp, sp          /
                    528:                                /
                    529:        sub     bx, bx          / Calculate major device number * 2.
                    530:        movb    bl, 5(bp)       /
                    531:        shl     bx, $1          /
                    532:                                /
                    533:        mov     cx, ldrvsel_(bx)/ Prepare driver interface CS:IP.
                    534:        jcxz    0f              /
                    535:        push    cx              /
                    536:        push    $DRV_J          / Loadable driver invocation offset.
                    537:                                /
                    538:        mov     bx, ldrvcon_(bx)/ Identify driver configuration.
                    539:        or      bx, bx          /
                    540:        je      0f              /
                    541:                                /
                    542:        mov     ax, C_TIMER(bx) / Identify driver function to be invoked.
                    543:        or      ax, ax          /
                    544:        je      0f              /
                    545:                                /
                    546:        xcall   -4(bp)          / Invoke driver interface, which will
                    547:                                /       in turn invoke driver function.
                    548:                                /
                    549:        mov     sp, bp          / Return to caller.
                    550:        pop     bp              /
                    551:        ret                     /
                    552: 
                    553: 0:     mov     sp, bp
                    554:        pop     bp
                    555:        jmp     nonedev_
                    556: 
                    557: ////////
                    558: /
                    559: / ld_poll( dev, ev, msec )     - Poll Routine.
                    560: / dev_t dev;
                    561: / int ev;
                    562: / int msec;
                    563: /
                    564: ////////
                    565: 
                    566: ld_poll_:                      / PARAMETERS MUST REMAIN AT 4(BP).
                    567:        push    bp              / DRIVER RESIDENT CODE RELIES ON THIS.
                    568:        mov     bp, sp          /
                    569:                                /
                    570:        sub     bx, bx          / Calculate major device number * 2.
                    571:        movb    bl, 5(bp)       /
                    572:        shl     bx, $1          /
                    573:                                /
                    574:        mov     cx, ldrvsel_(bx)/ Prepare driver interface CS:IP.
                    575:        jcxz    0f              /
                    576:        push    cx              /
                    577:        push    $DRV_J          / Loadable driver invocation offset.
                    578:                                /
                    579:        mov     bx, ldrvcon_(bx)/ Identify driver configuration.
                    580:        or      bx, bx          /
                    581:        je      0f              /
                    582:                                /
                    583:        mov     ax, C_POLL(bx)  / Identify driver function to be invoked.
                    584:        or      ax, ax          /
                    585:        je      0f              /
                    586:                                /
                    587:        xcall   -4(bp)          / Invoke driver interface, which will
                    588:                                /       in turn invoke driver function.
                    589:                                /
                    590:        mov     sp, bp          / Return to caller.
                    591:        pop     bp              /
                    592:        ret                     /
                    593: 
                    594: 0:     mov     sp, bp
                    595:        pop     bp
                    596:        jmp     nonedev_
                    597: 
                    598: ////////
                    599: /
                    600: / Loadable Driver Interrupt Entry Points.
                    601: /
                    602: /      Invoked by Coherent to service specific interrupt.
                    603: /      Identifies which loadable driver interrupt vector to be used.
                    604: /      Invokes interrupt handler which will do far call to loadable driver.
                    605: /
                    606: ////////
                    607: 
                    608: ld_intr0:
                    609:        mov     bx, $0          /
                    610:        jmp     ld_intr         /
                    611: 
                    612: ld_intr1:
                    613:        mov     bx, $2          /
                    614:        jmp     ld_intr         /
                    615: 
                    616: ld_intr2:
                    617:        mov     bx, $4          /
                    618:        jmp     ld_intr         /
                    619: 
                    620: ld_intr3:
                    621:        mov     bx, $6          /
                    622:        jmp     ld_intr         /
                    623: 
                    624: ld_intr4:
                    625:        mov     bx, $8          /
                    626:        jmp     ld_intr         /
                    627: 
                    628: ld_intr5:
                    629:        mov     bx, $10         /
                    630:        jmp     ld_intr         /
                    631: 
                    632: ld_intr6:
                    633:        mov     bx, $12         /
                    634:        jmp     ld_intr         /
                    635: 
                    636: ld_intr7:
                    637:        mov     bx, $14         /
                    638:        jmp     ld_intr         /
                    639: 
                    640: ld_intr8:
                    641:        mov     bx, $16         /
                    642:        jmp     ld_intr         /
                    643: 
                    644: ld_intr9:
                    645:        mov     bx, $18         /
                    646:        jmp     ld_intr         /
                    647: 
                    648: ld_intr10:
                    649:        mov     bx, $20         /
                    650:        jmp     ld_intr         /
                    651: 
                    652: ld_intr11:
                    653:        mov     bx, $22         /
                    654:        jmp     ld_intr         /
                    655: 
                    656: ld_intr12:
                    657:        mov     bx, $24         /
                    658:        jmp     ld_intr         /
                    659: 
                    660: ld_intr13:
                    661:        mov     bx, $26         /
                    662:        jmp     ld_intr         /
                    663: 
                    664: ld_intr14:
                    665:        mov     bx, $28         /
                    666:        jmp     ld_intr         /
                    667: 
                    668: ld_intr15:
                    669:        mov     bx, $30         /
                    670:        jmp     ld_intr         /
                    671: 
                    672: ////////
                    673: /
                    674: / Loadable driver interrupt handler.
                    675: /
                    676: /
                    677: /      Input:  bx = interrupt number * 2.
                    678: /
                    679: ////////
                    680: 
                    681: ld_intr:
                    682:        push    bp              /
                    683:        mov     bp, sp          /
                    684:                                /
                    685:        mov     cx,ldrvics_(bx) / Prepare driver interface CS:IP.
                    686:        jcxz    0f              /
                    687:        push    cx              /
                    688:        push    $DRV_J          / Loadable driver invocation offset.
                    689:                                /
                    690:        mov     ax,ldrvipc_(bx) / Identify interrupt handler to be invoked.
                    691:        or      ax, ax          /
                    692:        je      0f              /
                    693:                                /
                    694:        xcall   -4(bp)          / Invoke driver interface, which will
                    695:                                /       in turn invoke driver function.
                    696:                                /
                    697: 0:     mov     sp, bp          /
                    698:        pop     bp              /
                    699:        ret                     /

unix.superglobalmegacorp.com

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