home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / PURE_B / PBMAG22A.MSA / MINT095S.ZIP / SRC / ASM / INTR.S < prev    next >
Text File  |  1987-04-22  |  7KB  |  277 lines

  1. ;
  2. ; interrupt wrapping routines; these should just save registers and call
  3. ; the appropriate C handlers, unless speed is a major problem
  4. ;
  5. ; $Log: intr.s,v $
  6. ; Revision 1.5  1992/04/18  10:57:18  AGK
  7. ; More +8s for 0.94
  8. ;
  9. ; Revision 1.4  1992/04/04  16:05:54  AGK
  10. ; Added some missing +8s in the vector pushes to allow for XBRA support
  11. ;
  12. ; Revision 1.3  1992/03/31  14:02:08  AGK
  13. ; Fixed for real Motorola syntax (many thanks to ERS for keeping these
  14. ; files in step with the GAS ones).
  15. ;
  16. ; Revision 1.2  1992/03/31  13:55:28  AGK
  17. ; Checked in MiNT 0.93 sources
  18. ;
  19. ; Revision 1.1  1991/05/30  17:22:18  AGK
  20. ; Initial revision
  21. ;
  22.     SECTION    TEXT
  23. ;
  24. ; first, utilities for setting processor status level
  25. ;
  26.     XDEF    _spl7,_spl
  27. _spl7:
  28.     move.w    sr,d0
  29.     ori.w    #$0700,sr
  30.     rts
  31. _spl:
  32.     move.w    4(sp),d0
  33.     move.w    d0,sr
  34.     rts
  35.  
  36.     XDEF    _mint_5ms
  37.     XDEF    _mint_timer
  38.     XDEF    _mint_vbl
  39.     XREF    _timeout    ; C time routine
  40.     XREF    _old_timer    ; old GEMDOS time vector
  41.     XREF    _old_vbl    ; old GEMDOS vbl vector
  42.     XREF    _old_5ms
  43.     XREF    _build_context
  44.     XREF    _restore_context
  45.     XREF    _proc_clock        ; controls process' allocation of CPU time
  46.     XREF    _curproc
  47.     XREF    _enter_kernel
  48.     XREF    _leave_kernel
  49.     XREF    _preempt
  50.     XREF    _in_kernel
  51.  
  52. ; AKP: this code is hit once every 5ms; it updates the time fields of curproc.
  53. _mint_5ms:
  54.     move.l    a0,-(sp)
  55.     move.l    _curproc,a0
  56.     add.w    #$364,a0        ; $364 is offset to curproc->systime;
  57.     tst.w    _in_kernel
  58.     bne    L_5a            ; usrtime is the branch-not-taken case
  59.     addq.l    #4,a0
  60. L_5a:    addq.l    #5,(a0)
  61.     move.l    (sp)+,a0
  62.     move.l    _old_5ms+8,-(sp)
  63.     rts
  64.  
  65. _mint_timer:
  66.     movem.l    d0-d2/a0-a2,-(sp)    ; save C registers
  67.     jsr    _timeout
  68.     movem.l    (sp)+,d0-d2/a0-a2
  69.     move.l    _old_timer+8,-(sp)    ; jump to GEMDOS time vector
  70.     rts
  71.  
  72. _mint_vbl:
  73.     tst.w    ($59e).w        ; test longframe (AKP)
  74.     beq.s    L_short1
  75.     clr.w    -(sp)            ; yes, long frames: push a frame word
  76. L_short1:
  77.     pea    L_comeback        ; push fake PC
  78.     move.w    sr,-(sp)        ; push status register
  79.     move.l    _old_vbl+8,-(sp)    ; go service the interrupt
  80.     rts
  81.  
  82. L_comeback:
  83.     tst.w    _proc_clock        ; has time expired yet?
  84.     beq.s    L_expired        ; yes -- maybe go switch processes
  85. L_out:
  86.     rte                ; no -- just return
  87.  
  88. L_expired:
  89.     btst    #13,(sp)        ; user mode?
  90.     bne.s    L_out            ; no -- switching is not possible
  91. L_switch:
  92.     move.l    _curproc,-(sp)
  93.     addq.l    #4,(sp)            ; to get &curproc->ctxt[SYSCALL]
  94.     jsr    _build_context        ; build context
  95.     move.l    _curproc,a0
  96.     move.l    (a0),sp            ; use curproc->sysstack
  97.     jsr    _enter_kernel        ; enter kernel
  98.     jsr    _preempt        ; yield processor
  99.     ori.w    #$700,sr        ; spl7()
  100.     jsr    _leave_kernel        ; restore vectors
  101.     move.l    _curproc,a0
  102.     pea    4(a0)
  103.     jsr    _restore_context    ; back to user
  104.  
  105. ;
  106. ; reset routine -- called on a warm boot. Note that TOS sends the
  107. ; address to which we should return in register a6. Also note that
  108. ; the stack pointer is in an unknown state, so we set up our own
  109. ;
  110.     XDEF    _reset
  111.     XREF    _tmpstack        ; see main.c
  112.     XREF    _restr_intr
  113.  
  114. _reset:
  115.     move.w    #$2700,sr        ; avoid interruption here
  116.     move.l    sp,_tmpstack        ; save A7
  117.     lea    _tmpstack,sp        ; set up temporary stack
  118.     lea    256(sp),sp
  119.     movem.l    d0-d2/a0-a2,-(sp)    ; save C registers
  120.     jsr    _restr_intr        ; restore interrupts
  121.     movem.l    (sp)+,d0-d2/a0-a2    ; restore registers
  122.     move.l    _tmpstack,sp
  123.     jmp    (a6)            ; reset again
  124.  
  125. ;
  126. ; routine for doing a reboot
  127. ;
  128.     XDEF    _reboot
  129. _reboot:
  130.     move.w    #$2700,sr        ; avoid interrupts
  131.     move.l    (0).w,sp        ; get sp after reboot
  132.     move.l    (4).w,a6        ; get new reboot address
  133.     jmp    _reset
  134.  
  135. ;
  136. ; routine for mouse packet handling
  137. ;
  138.     XDEF    _newmvec
  139.     XREF    _mouse_handler
  140.  
  141. _newmvec:
  142.     move.l    a0,-(sp)
  143.     jsr    _mouse_handler
  144.     move.l    (sp)+,a0
  145.     rts
  146.  
  147. ;
  148. ; new ikbd keyboard interrupt vector
  149. ; kintr is a global variable that should be non-zero if a keyboard
  150. ; event occured
  151. ;
  152.     XDEF    _new_ikbd
  153.     XREF    _old_ikbd
  154.     XREF    _kintr
  155.  
  156. _new_ikbd:
  157.     move.w    #1,_kintr
  158.     move.l    _old_ikbd+8,-(sp)
  159.     rts            ; jump to system interrupt routine
  160.  
  161. ;
  162. ; simple signal handlers
  163. ; global variables referenced:
  164. ; in_kernel: (main.c): flag to indicate that we're in the MiNT kernel
  165. ; sig_routine: (signal.c): pointer to which signal catching routine to
  166. ;          call (e.g. for SIGBUS, or whatever)
  167. ;
  168.     XDEF    _new_bus,_new_addr,_new_ill,_new_divzero,_new_priv
  169.     XDEF    _new_trace
  170.     XREF    _in_kernel,_sig_routine
  171.     XREF    _sigbus,_sigaddr,_sigill,_sigfpe,_sigpriv,_sigtrap
  172.  
  173. _new_bus:
  174.     move.l    #_sigbus,_sig_routine
  175. Do_sig:
  176.     tst.w    _in_kernel        ; are we already in the kernel?
  177.     bne.s    Kernel            ; yes
  178.     move.l    _curproc,-(sp)
  179.     add.l    #4,(sp)            ; push offset of save area
  180.     jsr    _build_context
  181.     move.l    _curproc,a4
  182.     move.l    (a4),sp            ; put us in the system stack
  183.     jsr    _enter_kernel        ; set up kernel vectors
  184.     move.l    _sig_routine,a1        ; get signal handling routine
  185.     jsr    (a1)            ; go do it
  186.     ori.w    #$0700,sr        ; spl7()
  187.     jsr    _leave_kernel        ; leave kernel
  188.     lea    4(a4),a4        ; get context save area address
  189.     move.l    a4,-(sp)        ; push it
  190.     jsr    _restore_context    ; restore the context
  191. ;
  192. ; here's what we do if we already were in the kernel
  193. ;
  194. Kernel:
  195.     movem.l    d0-d2/a0-a2,-(sp)    ; save reggies
  196.     move.l    _sig_routine,a1        ; get handler
  197.     jsr    (a1)            ; go do it
  198.     movem.l    (sp)+,d0-d2/a0-a2
  199.     rte    
  200. _new_addr:
  201.     move.l    #_sigaddr,_sig_routine
  202.     bra.s    Do_sig
  203. _new_ill:
  204.     move.l    #_sigill,_sig_routine
  205.     bra.s    Do_sig
  206. _new_divzero:
  207.     move.l    #_sigfpe,_sig_routine
  208.     bra.s    Do_sig
  209. _new_priv:
  210.     move.l    #_sigpriv,_sig_routine
  211.     bra    Do_sig
  212. _new_trace:
  213.     move.l    #_sigtrap,_sig_routine
  214.     bra    Do_sig
  215.  
  216. ;
  217. ; BIOS disk vectors for pseudo-disks like U: and X:; these are present
  218. ; just in case some program (foolishly) attempts to access these drives
  219. ; directly and gets horribly confused
  220. ;
  221.     XREF    _old_getbpb    ; old Getbpb vector
  222.     XREF    _old_mediach    ; old Mediach vector
  223.     XREF    _old_rwabs    ; old Rwabs vector
  224.     XDEF    _new_getbpb
  225.     XDEF    _new_mediach
  226.     XDEF    _new_rwabs
  227.  
  228. _new_getbpb:
  229.     move.w    4(sp),d0    ; check the drive
  230.     cmp.w    #$10,d0        ; drive Q:?
  231.     beq.s    nobpb        ; yes, no BPB available
  232.     cmp.w    #$14,d0        ; drive U:?
  233.     beq.s    nobpb        ; yes, no BPB available
  234.     cmp.w    #$15,d0        ; drive V:?
  235.     beq.s    nobpb
  236.     cmp.w    #$17,d0        ; drive X:?
  237.     beq.s    nobpb
  238.     move.l    _old_getbpb+8,a0    ; not our drive
  239.     jmp    (a0)        ; call the old vector for it
  240. nobpb:
  241.     moveq.l    #0,d0        ; 0 means "no BPB read"
  242.     rts
  243.  
  244. _new_mediach:
  245.     move.w    4(sp),d0    ; check the drive
  246.     cmp.w    #$10,d0        ; drive Q:?
  247.     beq.s    nochng        ; yes, no change
  248.     cmp.w    #$14,d0        ; drive U:?
  249.     beq.s    nochng        ; yes, no change
  250.     cmp.w    #$15,d0        ; drive V:?
  251.     beq.s    nochng
  252.     cmp.w    #$17,d0        ; drive X:?
  253.     beq.s    nochng
  254.     move.l    _old_mediach+8,a0    ; not our drive
  255.     jmp    (a0)        ; call the old vector for it
  256. nochng:
  257.     moveq.l    #0,d0        ; 0 means "definitely no change"
  258.     rts
  259.  
  260. _new_rwabs:
  261.     move.w    $e(sp),d0    ; check the drive
  262.     cmp.w    #$10,d0        ; drive Q:?
  263.     beq.s    rwdone        ; yes, fake a successful I/O operation
  264.     cmp.w    #$14,d0        ; drive U:?
  265.     beq.s    rwdone        ; yes, fake it
  266.     cmp.w    #$15,d0        ; drive V:?
  267.     beq.s    rwdone
  268.     cmp.w    #$17,d0        ; drive X:?
  269.     beq.s    rwdone
  270.     move.l    _old_rwabs+8,a0    ; not our drive
  271.     jmp    (a0)        ; call the old vector for it
  272. rwdone:
  273.     moveq.l    #0,d0        ; 0 means "successful operation"
  274.     rts
  275.  
  276.     END
  277.