; ====================================================================== ; VMPatch.a © 1988 by Apple Computer Inc ; by Chris Derossi 4/10/89 ; ====================================================================== PrNonPortable EQU 1 ; We're building System SW. This is ok. PRINT OFF INCLUDE 'Traps.a' INCLUDE 'SysEqu.a' INCLUDE 'ToolEqu.a' INCLUDE 'Private.a' INCLUDE 'quickequ.a' INCLUDE 'colorequ.a' INCLUDE 'VMCalls.a' PRINT ON ; ====================================================================== ; Header to main init code. ; ====================================================================== MACHINE MC68020 VMPatch PROC EXPORT ; During a page fault exception, MacVM continues to service the cursor interrupt. Now that ; the cursor code is not in ROM, and not in the System heap, it must not get paged out. ; Otherwise, nested page faults could occur, and this is bad. ; ; This patch tells MacVM to keep the cursor code in memory at all times. This patch does ; nothing if MacVM isn't around. ; ; Note: This patch knows that the cursor code is pointed to by JCrsrTask, and ends at the ; location pointed to by JScrnAddr. Unimplemented EQU $A89F ; the Unimplemented trap number MemoryDispatch EQU $A05C ; trap number for MacVM Dispatcher ; Does the MacVM dispatch trap exist? MOVE.W #MemoryDispatch, D0 ; MacVM Trap number _GetTrapAddress ,NewOS ; get the address of _MemoryDispatch MOVEA.L A0, A1 ; Hold it for a sec MOVE.W #Unimplemented, D0 ; get address of Unimplemented trap _GetTrapAddress CMPA.L A0,A1 ; see if MacVM is around BEQ.S @0 ; if not, we're done MOVE.L jCrsrTask, A0 ; Point to cursor code MOVE.L jScrnAddr, A1 ; Get end of code SUBA.L jCrsrTask, A1 ; Calculate length of cursor code _HoldMemory ; Tell VM to keep it around @0 RTS END