Annotation of MiNT/src/intr.spp, revision 1.1

1.1     ! root        1: %include "magic.i"
        !             2: 
        !             3: ;
        !             4: 
        !             5: ; interrupt wrapping routines; these should just save registers and call
        !             6: 
        !             7: ; the appropriate C handlers, unless speed is a major problem
        !             8: 
        !             9: ;
        !            10: 
        !            11:        TEXT
        !            12: 
        !            13: ;
        !            14: 
        !            15: ; first, utilities for setting processor status level
        !            16: 
        !            17: ;
        !            18: 
        !            19:        XDEF    _spl7,_spl
        !            20: 
        !            21: _spl7:
        !            22: 
        !            23:        move.w  sr,d0
        !            24: 
        !            25:        ori.w   #$0700,sr
        !            26: 
        !            27:        rts
        !            28: 
        !            29: _spl:
        !            30: 
        !            31:        move.w  4(sp),d0
        !            32: 
        !            33:        move.w  d0,sr
        !            34: 
        !            35:        rts
        !            36: 
        !            37: 
        !            38: 
        !            39:        XDEF    _mint_5ms
        !            40: 
        !            41:        XDEF    _mint_timer
        !            42: 
        !            43:        XDEF    _mint_vbl
        !            44: 
        !            45:        XREF    _timeout        ; C time routine
        !            46: 
        !            47:        XREF    _old_timer      ; old GEMDOS time vector
        !            48: 
        !            49:        XREF    _old_vbl        ; old GEMDOS vbl vector
        !            50: 
        !            51:        XREF    _old_5ms
        !            52: 
        !            53:        XREF    _build_context
        !            54: 
        !            55:        XREF    _restore_context
        !            56: 
        !            57:        XREF    _proc_clock             ; controls process' allocation of CPU time
        !            58: 
        !            59:        XREF    _curproc
        !            60: 
        !            61:        XREF    _enter_kernel
        !            62: 
        !            63:        XREF    _leave_kernel
        !            64: 
        !            65:        XREF    _preempt
        !            66: 
        !            67:        XREF    _in_kernel
        !            68: 
        !            69: 
        !            70: 
        !            71: ; AKP: this code is hit once every 5ms; it updates the time fields of curproc.
        !            72: 
        !            73: _mint_5ms:
        !            74: 
        !            75:        move.l  a0,-(sp)
        !            76: 
        !            77:        move.l  _curproc,a0
        !            78: 
        !            79:        tst.w   _in_kernel
        !            80: 
        !            81:        bne.s   L_systime
        !            82: 
        !            83:        lea     P_USRTIME(a0),a0        ; get offset to curproc->usrtime
        !            84: 
        !            85:        addq.l  #5,(a0)                 ; update the time
        !            86: 
        !            87:        move.l  (sp)+,a0
        !            88: 
        !            89:        move.l  _old_5ms+8,-(sp)        ; branch to old vector
        !            90: 
        !            91:        rts
        !            92: 
        !            93: L_systime:
        !            94: 
        !            95:        lea     P_SYSTIME(a0),a0        ; get offset to curproc->systime
        !            96: 
        !            97:        addq.l  #5,(a0)
        !            98: 
        !            99:        move.l  (sp)+,a0
        !           100: 
        !           101:        move.l  _old_5ms+8,-(sp)
        !           102: 
        !           103:        rts
        !           104: 
        !           105: 
        !           106: 
        !           107: _mint_timer:
        !           108: 
        !           109:        movem.l d0-d2/a0-a2,-(sp)       ; save C registers
        !           110: 
        !           111:        jsr     _timeout
        !           112: 
        !           113:        movem.l (sp)+,d0-d2/a0-a2
        !           114: 
        !           115:        move.l  _old_timer+8,-(sp)      ; jump to GEMDOS time vector
        !           116: 
        !           117:        rts
        !           118: 
        !           119: 
        !           120: 
        !           121: _mint_vbl:
        !           122: 
        !           123:        tst.w   ($59e).w                ; test longframe (AKP)
        !           124: 
        !           125:        beq.s   L_short1
        !           126: 
        !           127:        clr.w   -(sp)                   ; yes, long frames: push a frame word
        !           128: 
        !           129: L_short1:
        !           130: 
        !           131:        pea     L_comeback              ; push fake PC
        !           132: 
        !           133:        move.w  sr,-(sp)                ; push status register
        !           134: 
        !           135:        move.l  _old_vbl+8,-(sp)        ; go service the interrupt
        !           136: 
        !           137:        rts
        !           138: 
        !           139: 
        !           140: 
        !           141: L_comeback:
        !           142: 
        !           143:        tst.w   _proc_clock             ; has time expired yet?
        !           144: 
        !           145:        beq.s   L_expired               ; yes -- maybe go switch processes
        !           146: 
        !           147: L_out:
        !           148: 
        !           149:        rte                             ; no -- just return
        !           150: 
        !           151: 
        !           152: 
        !           153: L_expired:
        !           154: 
        !           155:        btst    #5,(sp)                 ; user mode?
        !           156: 
        !           157:        bne.s   L_out                   ; no -- switching is not possible
        !           158: 
        !           159:        tst.w   ($43e).w                ; test floppy disk lock variable
        !           160: 
        !           161:        bne.s   L_out                   ; if locked, can't switch
        !           162: 
        !           163:        tst.w   _in_kernel              ; are we doing a kernel operation?
        !           164: 
        !           165:        bne.s   L_out
        !           166: 
        !           167: L_switch:
        !           168: 
        !           169:        clr.w   -(sp)                   ; no frame format needed
        !           170: 
        !           171:        move.l  _curproc,-(sp)
        !           172: 
        !           173:        addq.l  #4,(sp)                 ; to get &curproc->ctxt[SYSCALL]
        !           174: 
        !           175:        jsr     _build_context          ; build context
        !           176: 
        !           177:        move.l  _curproc,a0
        !           178: 
        !           179:        move.l  (a0),sp                 ; use curproc->sysstack
        !           180: 
        !           181:        jsr     _enter_kernel           ; enter kernel
        !           182: 
        !           183:        jsr     _preempt                ; yield processor
        !           184: 
        !           185:        ori.w   #$700,sr                ; spl7()
        !           186: 
        !           187:        jsr     _leave_kernel           ; restore vectors
        !           188: 
        !           189:        move.l  _curproc,a0
        !           190: 
        !           191:        pea     4(a0)
        !           192: 
        !           193:        jsr     _restore_context        ; back to user
        !           194: 
        !           195: 
        !           196: 
        !           197: ;
        !           198: 
        !           199: ; reset routine -- called on a warm boot. Note that TOS sends the
        !           200: 
        !           201: ; address to which we should return in register a6. Also note that
        !           202: 
        !           203: ; the stack pointer is in an unknown state, so we set up our own
        !           204: 
        !           205: ;
        !           206: 
        !           207:        XDEF    _reset
        !           208: 
        !           209:        XREF    _tmpstack               ; see main.c
        !           210: 
        !           211:        XREF    _restr_intr
        !           212: 
        !           213: 
        !           214: 
        !           215: _reset:
        !           216: 
        !           217:        move.w  #$2700,sr               ; avoid interruption here
        !           218: 
        !           219:        move.l  sp,_tmpstack            ; save A7
        !           220: 
        !           221:        lea     _tmpstack,sp            ; set up temporary stack
        !           222: 
        !           223:        lea     256(sp),sp
        !           224: 
        !           225:        movem.l d0-d2/a0-a2,-(sp)       ; save C registers
        !           226: 
        !           227:        jsr     _restr_intr             ; restore interrupts
        !           228: 
        !           229:        movem.l (sp)+,d0-d2/a0-a2       ; restore registers
        !           230: 
        !           231:        move.l  _tmpstack,sp
        !           232: 
        !           233:        jmp     (a6)                    ; reset again
        !           234: 
        !           235: 
        !           236: 
        !           237: ;
        !           238: 
        !           239: ; routine for doing a reboot
        !           240: 
        !           241: ;
        !           242: 
        !           243:        XDEF    _reboot
        !           244: 
        !           245: _reboot:
        !           246: 
        !           247:        move.w  #$2700,sr               ; avoid interrupts
        !           248: 
        !           249:        move.l  (0).w,sp                ; get sp after reboot
        !           250: 
        !           251:        move.l  (4).w,a6                ; get new reboot address
        !           252: 
        !           253:        jmp     _reset
        !           254: 
        !           255: 
        !           256: 
        !           257: ;
        !           258: 
        !           259: ; routine for mouse packet handling
        !           260: 
        !           261: ;
        !           262: 
        !           263:        XDEF    _newmvec
        !           264: 
        !           265:        XDEF    _newjvec
        !           266: 
        !           267:        XREF    _mouse_handler
        !           268: 
        !           269: ; Experimental three button mouse support (by [email protected],
        !           270: 
        !           271: ; August 4, 1992
        !           272: 
        !           273: ;
        !           274: 
        !           275: ; Should work with the mice shipped with Atari's ASV or
        !           276: 
        !           277: ; compatible ones (like Golden Image GI-6000). Might not work
        !           278: 
        !           279: ; on ST/STE systems with older IKBD's or keyboards. The middle mouse
        !           280: 
        !           281: ; button is wired to one of the joystick directions on joystick one.
        !           282: 
        !           283: ;
        !           284: 
        !           285: ; _newmvec is the same as before with two exceptions:
        !           286: 
        !           287: ; 1. the first byte of the packet is saved for the joystick handler
        !           288: 
        !           289: ; 2. the bit for the middle mouse button is ored in
        !           290: 
        !           291: ;
        !           292: 
        !           293: ; _newjvec hooks into the joystick vector and chains to the normal
        !           294: 
        !           295: ; handler. The middle mouse button state is saved in a special
        !           296: 
        !           297: ; register for _newmvec, and a 'fake' mouse packet is set up
        !           298: 
        !           299: ; (by merging the last mouse packet header, or-ing in the
        !           300: 
        !           301: ; middle button state and using 0/0 for the x/y increment).
        !           302: 
        !           303: ;
        !           304: 
        !           305: ; the faked_packet and third_button variables are declared at the
        !           306: 
        !           307: ; end of this file
        !           308: 
        !           309: 
        !           310: 
        !           311: _newmvec:
        !           312: 
        !           313:        move.l  a0,-(sp)
        !           314: 
        !           315:        move.b  (a0),d0
        !           316: 
        !           317:        move.b  d0,faked_packet
        !           318: 
        !           319:        or.b    third_button,d0
        !           320: 
        !           321:        move.b  d0,(a0)
        !           322: 
        !           323:        jsr     _mouse_handler
        !           324: 
        !           325:        move.l  (sp)+,a0
        !           326: 
        !           327:        rts
        !           328: 
        !           329: ;
        !           330: 
        !           331: ; routine for joystick packet handling (used for three button mice)
        !           332: 
        !           333: ;
        !           334: 
        !           335:        XDEF    _newjvec
        !           336: 
        !           337:        XREF    _oldjvec
        !           338: 
        !           339: 
        !           340: 
        !           341: _newjvec:
        !           342: 
        !           343:        move.l  a0,-(sp)        ; save a0 on the stack
        !           344: 
        !           345:        move.b  2(a0),d0        ; joystick direction
        !           346: 
        !           347:        and.b   #1,d0           ; middle mouse button in lowest bit
        !           348: 
        !           349:        add.b   d0,d0           ; times 4
        !           350: 
        !           351:        add.b   d0,d0
        !           352: 
        !           353:        move.b  d0,third_button ; save it for use in newmvec
        !           354: 
        !           355: 
        !           356: 
        !           357:        lea     faked_packet,a0 ; 'our' faked mouse event
        !           358: 
        !           359:        move.b  (a0),d0
        !           360: 
        !           361:        and.b   #$3,d0          ; unmask our mouse button
        !           362: 
        !           363:        or.b    #$F8,d0         ; or in correct header
        !           364: 
        !           365:        or.b    third_button,d0 ; or in the current status
        !           366: 
        !           367:        move.b  d0,(a0)         ; write it back
        !           368: 
        !           369: 
        !           370: 
        !           371:        move.l  a0,-(sp)        ; pass pointer to fake packet
        !           372: 
        !           373:        jsr     _mouse_handler  ; to \dev\mouse handler
        !           374: 
        !           375:        addq.l  #4,sp           ; pop parameter
        !           376: 
        !           377:        move.l  (sp)+,a0        ; restore original a0 value
        !           378: 
        !           379:        move.l  _oldjvec,-(sp)  ; jump to original joystick handler
        !           380: 
        !           381:        rts
        !           382: 
        !           383: ;
        !           384: 
        !           385: ; new ikbd keyboard interrupt vector
        !           386: 
        !           387: ; kintr is a global variable that should be non-zero if a keyboard
        !           388: 
        !           389: ; event occured
        !           390: 
        !           391: ;
        !           392: 
        !           393:        XDEF    _new_ikbd
        !           394: 
        !           395:        XREF    _old_ikbd
        !           396: 
        !           397:        XREF    _kintr
        !           398: 
        !           399: 
        !           400: 
        !           401: _new_ikbd:
        !           402: 
        !           403:        move.w  #1,_kintr
        !           404: 
        !           405:        move.l  _old_ikbd+8,-(sp)
        !           406: 
        !           407:        rts                     ; jump to system interrupt routine
        !           408: 
        !           409: 
        !           410: 
        !           411: ;
        !           412: 
        !           413: ; simple signal handlers
        !           414: 
        !           415: ; global variables referenced:
        !           416: 
        !           417: ; in_kernel: (main.c): flag to indicate that we're in the MiNT kernel
        !           418: 
        !           419: ; sig_routine: (signal.c): pointer to which signal catching routine to
        !           420: 
        !           421: ;          call (e.g. for SIGBUS, or whatever)
        !           422: 
        !           423: ;
        !           424: 
        !           425:        XDEF    _new_bus,_new_addr,_new_ill,_new_divzero,_new_priv,_new_linef
        !           426: 
        !           427:        XDEF    _new_trace,_new_chk,_new_trapv,_new_fpcp,_new_mmu,_new_pmmuacc
        !           428: 
        !           429:        XDEF    _new_uninit,_new_spurious,_new_format,_new_cpv
        !           430: 
        !           431:        XREF    _in_kernel,_sig_routine
        !           432: 
        !           433:        XREF    _sigbus,_sigaddr,_sigill,_sigfpe,_sigpriv,_sigtrap
        !           434: 
        !           435:        XREF    _haltformat,_haltcpv
        !           436: 
        !           437:        XREF    _sig_exc
        !           438: 
        !           439:        
        !           440: 
        !           441: _new_bus:
        !           442: 
        !           443:        move.w  #$8,_sig_exc
        !           444: 
        !           445:        move.l  #_sigbus,_sig_routine
        !           446: 
        !           447: Do_sig:
        !           448: 
        !           449:        tst.w   _in_kernel              ; are we already in the kernel?
        !           450: 
        !           451:        bne.s   Kernel                  ; yes
        !           452: 
        !           453:        move.w  _sig_exc,-(sp)
        !           454: 
        !           455:        move.l  _curproc,-(sp)
        !           456: 
        !           457:        addq.l  #4,(sp)                 ; push offset of save area
        !           458: 
        !           459:        jsr     _build_context
        !           460: 
        !           461:        move.l  _curproc,a4
        !           462: 
        !           463:        move.l  (a4),sp                 ; put us in the system stack
        !           464: 
        !           465:        jsr     _enter_kernel           ; set up kernel vectors
        !           466: 
        !           467:        move.l  _sig_routine,a1         ; get signal handling routine
        !           468: 
        !           469:        jsr     (a1)                    ; go do it
        !           470: 
        !           471:        ori.w   #$0700,sr               ; spl7()
        !           472: 
        !           473:        jsr     _leave_kernel           ; leave kernel
        !           474: 
        !           475:        addq.w  #4,a4                   ; get context save area address
        !           476: 
        !           477:        move.l  a4,-(sp)                ; push it
        !           478: 
        !           479:        jsr     _restore_context        ; restore the context
        !           480: 
        !           481: ;
        !           482: 
        !           483: ; here's what we do if we already were in the kernel
        !           484: 
        !           485: ;
        !           486: 
        !           487: Kernel:
        !           488: 
        !           489:        movem.l d0-d2/a0-a2,-(sp)       ; save reggies
        !           490: 
        !           491:        move.l  _sig_routine,a1         ; get handler
        !           492: 
        !           493:        jsr     (a1)                    ; go do it
        !           494: 
        !           495:        movem.l (sp)+,d0-d2/a0-a2
        !           496: 
        !           497:        rte
        !           498: 
        !           499: _new_addr:
        !           500: 
        !           501:        move.w  #$c,_sig_exc
        !           502: 
        !           503:        move.l  #_sigaddr,_sig_routine
        !           504: 
        !           505:        bra.s   Do_sig
        !           506: 
        !           507: _new_ill:
        !           508: 
        !           509:        move.w  #$10,_sig_exc
        !           510: 
        !           511:        move.l  #_sigill,_sig_routine
        !           512: 
        !           513:        bra.s   Do_sig                  ; ASM pre-5.52.3 barfs on this :-(
        !           514: 
        !           515: _new_divzero:
        !           516: 
        !           517:        move.w  #$14,_sig_exc
        !           518: 
        !           519:        move.l  #_sigfpe,_sig_routine
        !           520: 
        !           521:        bra     Do_sig
        !           522: 
        !           523: _new_linef:
        !           524: 
        !           525:        move.w  #$2c,_sig_exc
        !           526: 
        !           527:        move.l  #_sigill,_sig_routine
        !           528: 
        !           529:        bra     Do_sig
        !           530: 
        !           531: _new_chk:
        !           532: 
        !           533:        move.w  #$18,_sig_exc
        !           534: 
        !           535:        move.l  #_sigfpe,_sig_routine
        !           536: 
        !           537:        bra     Do_sig
        !           538: 
        !           539: _new_trapv:
        !           540: 
        !           541:        move.w  #$1c,_sig_exc
        !           542: 
        !           543:        move.l  #_sigfpe,_sig_routine
        !           544: 
        !           545:        bra     Do_sig
        !           546: 
        !           547: _new_fpcp:
        !           548: 
        !           549: ; don't set _sig_exc - only needed for 68000 vectors
        !           550: 
        !           551:        move.l  #_sigfpe,_sig_routine
        !           552: 
        !           553:        bra     Do_sig
        !           554: 
        !           555: _new_mmu:
        !           556: 
        !           557: ; don't set _sig_exc - only needed for 68000 vectors
        !           558: 
        !           559:        move.l  #_sigill,_sig_routine
        !           560: 
        !           561:        bra     Do_sig
        !           562: 
        !           563: _new_pmmuacc:
        !           564: 
        !           565: ; don't set _sig_exc - only needed for 68000 vectors
        !           566: 
        !           567:        move.l  #_sigbus,_sig_routine
        !           568: 
        !           569:        bra     Do_sig
        !           570: 
        !           571: _new_uninit:
        !           572: 
        !           573:        move.w  #$3c,_sig_exc
        !           574: 
        !           575:        move.l  #_sigbus,_sig_routine
        !           576: 
        !           577:        bra     Do_sig
        !           578: 
        !           579: _new_spurious:
        !           580: 
        !           581:        move.w  #$60,_sig_exc
        !           582: 
        !           583:        move.l  #_sigbus,_sig_routine
        !           584: 
        !           585:        bra     Do_sig
        !           586: 
        !           587: _new_format:
        !           588: 
        !           589:        move.l  #_haltformat,_sig_routine
        !           590: 
        !           591:        bra     Do_sig
        !           592: 
        !           593: _new_cpv:
        !           594: 
        !           595:        move.l  #_haltcpv,_sig_routine
        !           596: 
        !           597:        bra     Do_sig
        !           598: 
        !           599: 
        !           600: 
        !           601:        XREF    _old_priv               ; old privilege violation vector
        !           602: 
        !           603: _new_priv:
        !           604: 
        !           605:        move.w  #$20,_sig_exc
        !           606: 
        !           607:        move.l  #_sigpriv,_sig_routine
        !           608: 
        !           609:        tst.w   ($59e).w                ; 68000s always get SIGPRIV
        !           610: 
        !           611:        beq     Do_sig
        !           612: 
        !           613:        movem.l d0/a0,-(a7)
        !           614: 
        !           615:        move.l  10(a7),a0               ; fetch exception address
        !           616: 
        !           617:        move.w  (a0),d0
        !           618: 
        !           619:        and.w   #$ffc0,d0               ; partially decode move sr,...
        !           620: 
        !           621:        cmp.w   #$40c0,d0               ; and test it
        !           622: 
        !           623:        movem.l (a7)+,d0/a0             ; preserves the flags
        !           624: 
        !           625:        bne     Do_sig                  ; doesn't look like sr,...
        !           626: 
        !           627:        move.l  _old_priv+8,-(sp)       ; let our parent handle it
        !           628: 
        !           629:        rts
        !           630: 
        !           631: 
        !           632: 
        !           633: ; XBRA vectors from main.c
        !           634: 
        !           635:        XREF    _old_dos,_old_bios,_old_xbios
        !           636: 
        !           637:        XREF    _old_divzero,_old_chk,_old_trapv
        !           638: 
        !           639: 
        !           640: 
        !           641: _new_trace:
        !           642: 
        !           643:        btst    #5,(a7)                 ; only check when called from supervisor mode
        !           644: 
        !           645:        beq.s   S_1
        !           646: 
        !           647:        cmp.l   #_old_dos+12,2(a7)      ; lets not trace the kernel !
        !           648: 
        !           649:        beq.s   S_2
        !           650: 
        !           651:        cmp.l   #_old_xbios+12,2(a7)
        !           652: 
        !           653:        beq.s   S_2
        !           654: 
        !           655:        cmp.l   #_old_bios+12,2(a7)
        !           656: 
        !           657:        beq.s   S_2
        !           658: 
        !           659:        cmp.l   #_old_divzero+12,2(a7)
        !           660: 
        !           661:        beq.s   S_2
        !           662: 
        !           663:        cmp.l   #_old_trapv+12,2(a7)
        !           664: 
        !           665:        beq.s   S_2
        !           666: 
        !           667:        cmp.l   #_old_chk+12,2(a7)
        !           668: 
        !           669:        beq.s   S_2
        !           670: 
        !           671: ; add any other non-traceable entities here...
        !           672: 
        !           673: 
        !           674: 
        !           675: S_1:   move.w  #$24,_sig_exc
        !           676: 
        !           677:        move.l  #_sigtrap,_sig_routine
        !           678: 
        !           679:        bra     Do_sig
        !           680: 
        !           681: 
        !           682: 
        !           683: S_2:   and.w   #$3fff,(a7)             ; clear both trace bits
        !           684: 
        !           685:        rte                             ; and re-start the handler
        !           686: 
        !           687: 
        !           688: 
        !           689: ;
        !           690: 
        !           691: ; BIOS disk vectors for pseudo-disks like U: and X:; these are present
        !           692: 
        !           693: ; just in case some program (foolishly) attempts to access these drives
        !           694: 
        !           695: ; directly and gets horribly confused
        !           696: 
        !           697: ;
        !           698: 
        !           699:        XREF    _old_getbpb     ; old Getbpb vector
        !           700: 
        !           701:        XREF    _old_mediach    ; old Mediach vector
        !           702: 
        !           703:        XREF    _old_rwabs      ; old Rwabs vector
        !           704: 
        !           705:        XREF    _aliasdrv       ; array of drive aliases
        !           706: 
        !           707:        XDEF    _new_getbpb
        !           708: 
        !           709:        XDEF    _new_mediach
        !           710: 
        !           711:        XDEF    _new_rwabs
        !           712: 
        !           713: 
        !           714: 
        !           715: _new_getbpb:
        !           716: 
        !           717:        move.w  4(sp),d0        ; check the drive
        !           718: 
        !           719:        move.w  d0,d1           ; get index
        !           720: 
        !           721:        add.w   d0,d1           ; convert to index
        !           722: 
        !           723:        lea     _aliasdrv,a0
        !           724: 
        !           725:        move.w  0(a0,d1.w),d1   ; alias drive?
        !           726: 
        !           727:        beq.s   noalias0
        !           728: 
        !           729:        move.w  d1,d0
        !           730: 
        !           731:        subq.w  #1,d0           ; adjust for aliasdrv base of '@'
        !           732: 
        !           733: noalias0:
        !           734: 
        !           735:        cmp.w   #$1f,d0         ; is this a legal drive?
        !           736: 
        !           737:        bhi.s   nobpb           ; no -- ignore it
        !           738: 
        !           739:        cmp.w   #$14,d0         ; drive U:?
        !           740: 
        !           741:        beq.s   nobpb           ; yes, no BPB available
        !           742: 
        !           743:        move.l  _old_getbpb+8,a0        ; not our drive
        !           744: 
        !           745:        jmp     (a0)            ; call the old vector for it
        !           746: 
        !           747: nobpb:
        !           748: 
        !           749:        moveq.l #0,d0           ; 0 means "no BPB read"
        !           750: 
        !           751:        rts
        !           752: 
        !           753: 
        !           754: 
        !           755: _new_mediach:
        !           756: 
        !           757:        move.w  4(sp),d0        ; check the drive
        !           758: 
        !           759:        move.w  d0,d1           ; get index
        !           760: 
        !           761:        add.w   d0,d1           ; convert to index
        !           762: 
        !           763:        lea     _aliasdrv,a0
        !           764: 
        !           765:        move.w  0(a0,d1.w),d1   ; alias drive?
        !           766: 
        !           767:        beq.s   noalias1
        !           768: 
        !           769:        move.w  d1,d0
        !           770: 
        !           771:        subq.w  #1,d0           ; adjust for aliasdrv base
        !           772: 
        !           773: noalias1:
        !           774: 
        !           775:        cmp.w   #$1f,d0         ; legal drive?
        !           776: 
        !           777:        bhi.s   nobpb           ; no -- ignore it
        !           778: 
        !           779:        cmp.w   #$14,d0         ; drive U:?
        !           780: 
        !           781:        beq.s   nochng          ; yes, no change
        !           782: 
        !           783:        move.l  _old_mediach+8,a0       ; not our drive
        !           784: 
        !           785:        jmp     (a0)            ; call the old vector for it
        !           786: 
        !           787: nochng:
        !           788: 
        !           789:        moveq.l #0,d0           ; 0 means "definitely no change"
        !           790: 
        !           791:        rts
        !           792: 
        !           793: 
        !           794: 
        !           795: _new_rwabs:
        !           796: 
        !           797:        move.w  $e(sp),d0       ; check the drive
        !           798: 
        !           799:        move.w  d0,d1           ; get index
        !           800: 
        !           801:        add.w   d0,d1           ; convert to index
        !           802: 
        !           803:        lea     _aliasdrv,a0
        !           804: 
        !           805:        move.w  0(a0,d1.w),d1   ; alias drive?
        !           806: 
        !           807:        beq.s   noalias2
        !           808: 
        !           809:        move.w  d1,d0
        !           810: 
        !           811:        subq.w  #1,d0           ; adjust for aliasdrv base
        !           812: 
        !           813: noalias2:
        !           814: 
        !           815:        cmp.w   #$1f,d0         ; legal drive?
        !           816: 
        !           817:        bhi.s   nobpb           ; no -- ignore it
        !           818: 
        !           819:        cmp.w   #$14,d0         ; drive U:?
        !           820: 
        !           821:        beq.s   rwdone          ; yes, fake it
        !           822: 
        !           823:        move.l  _old_rwabs+8,a0 ; not our drive
        !           824: 
        !           825:        jmp     (a0)            ; call the old vector for it
        !           826: 
        !           827: rwdone:
        !           828: 
        !           829:        moveq.l #0,d0           ; 0 means "successful operation"
        !           830: 
        !           831:        rts
        !           832: 
        !           833: 
        !           834: 
        !           835:        DATA
        !           836: 
        !           837: ; buffer for faked mouse packet (actually only 3 bytes)
        !           838: 
        !           839: 
        !           840: 
        !           841: faked_packet:
        !           842: 
        !           843:        dc.l    0
        !           844: 
        !           845: 
        !           846: 
        !           847: ; here we store the additional button state
        !           848: 
        !           849: third_button:
        !           850: 
        !           851:        dc.w    0
        !           852: 
        !           853: 
        !           854: 
        !           855:        END
        !           856: 

unix.superglobalmegacorp.com

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