Annotation of MiNT/src/intr.spp, revision 1.1.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.