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

unix.superglobalmegacorp.com

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