1 | * ------------------------------------------------------------------------------
|
---|
2 | * mtfpu.s -- Multi-Tasker null FPU second level interrupt handler
|
---|
3 | * Version 3 -- 1988-04-13 -- D.N. Lynx Crowe
|
---|
4 | * Initially, resvec3 points at nullfpu. MIDAS can change it with a BIOS trap.
|
---|
5 | * ------------------------------------------------------------------------------
|
---|
6 | *
|
---|
7 | .text
|
---|
8 | *
|
---|
9 | .xdef __MTInt2 * FPU Second Level Interrupt Handler
|
---|
10 | .xdef nullfpu * FPU null Third Level Interrupt Handler
|
---|
11 | *
|
---|
12 | .xref SM_Wait * Sempahore wait function
|
---|
13 | *
|
---|
14 | .xref MT_ISEM2 * FPU interrupt semaphore
|
---|
15 | .xref resvec3 * FPU interrupt vector
|
---|
16 | *
|
---|
17 | FPUBASE .equ $180000 * FPU base address
|
---|
18 | *
|
---|
19 | * FPU address offsets and misc. values
|
---|
20 | *
|
---|
21 | FPU_CTL .equ $4000 * FPU control offset
|
---|
22 | *
|
---|
23 | FPU_IN .equ $4000 * FPU input address
|
---|
24 | FPU_CLR .equ $6000 * FPU interrupt reset address
|
---|
25 | *
|
---|
26 | FPU_RST .equ $0015 * FPU reset value
|
---|
27 | *
|
---|
28 | .page
|
---|
29 | *
|
---|
30 | * __MTInt2 -- FPU Second Level Interrupt Handler
|
---|
31 | * -------- ----------------------------------
|
---|
32 | __MTInt2: move.l #MT_ISEM2,-(a7) * Wait on interrupt semaphore
|
---|
33 | jsr SM_Wait * ...
|
---|
34 | tst.l (a7)+ *
|
---|
35 | movea.l resvec3,a0 * (*resvec3)()
|
---|
36 | jsr (a0) * ...
|
---|
37 | bra __MTInt2 * do it again
|
---|
38 | *
|
---|
39 | * ------------------------------------------------------------------------------
|
---|
40 | *
|
---|
41 | * nullfpu -- FPU null Third Level Interrupt Handler
|
---|
42 | * ------- --------------------------------------
|
---|
43 | nullfpu: movem.l d0-d0/a0-a0,-(a7) * Save registers
|
---|
44 | movea.l #FPUBASE,a0 * Setup FPU base address in a0
|
---|
45 | move.w FPU_IN(a0),d0 * Read FPU interrupt port
|
---|
46 | andi.l #$000000FF,d0 * Mask for voice & parameter
|
---|
47 | lsl.l #5,d0 * Shift for word offset
|
---|
48 | addi.l #FPU_CTL,d0 * Add FPU control offset
|
---|
49 | move.w #FPU_RST,0(a0,d0.L) * Reset the function
|
---|
50 | clr.w FPU_CLR(a0) * Clear the interrupt
|
---|
51 | movem.l (a7)+,d0-d0/a0-a0 * Restore registers
|
---|
52 | rts * Return to interrupted code
|
---|
53 | *
|
---|
54 | .end
|
---|