CASE OFF STRING ASIS SEG 'Main' INCLUDE 'Traps.a' INCLUDE 'SysEqu.a' INCLUDE 'SysErr.a' Main PROC EXPORT IMPORT ShowInit negZcbFreeErr EQU 33 ; zcbFree has gone negative tagBC24 EQU 0 ; Tag and Byte Count field [long] vResetPC EQU $0000 ; Reset PC vector (why?) vResetSP EQU $0004 ; Reset SP vector (why?) vBusError EQU $0008 ; Bus error exception vector ; EQU $017B ; [byte] bit 0 = shift key ; EQU $04B8 ; [ProcPtr] ; EQU $06E8 ; [ProcPtr] ; EQU $06EC ; [ProcPtr] ; EQU $0B73 ; [byte] Memory Manager flags? ; EQU $1E00 ; 24-bit vector table vNoPrologue EQU $1EE0 ; ??? prologue vPPrologue EQU $1EE4 ; Pointer prologue vPrologue EQU $1EE8 ; ??? prologue vHPrologue EQU $1EEC ; Handle prologue ; EQU $1EF4 ; [long] ??? ; EQU $1EFC ; [byte] MMgr flags (bit 0 = 32-bit) ; EQU $1F00 ; 32-bit vector table vRHPrologue EQU $1FE0 ; RecoverHandle prologue vMMPrologue EQU $1FE4 ; MoreMasters prologue vEpilogue EQU $1FE8 ; Standard epilogue vNoErrEpilogue EQU $1FEC ; Epilogue that doesn't set MemErr Start MOVEA.L ROMBase,A0 ; Get address of ROM base MOVE.W $0008(A0),D0 ; Get ROM version ID CMPI.W #$067C,D0 ; Is it the Mac IIci series? BNE.B @fail ; Exit if not TST.B MBState ; Is the mouse button down? BPL.B @fail ; Exit if so BTST #0,$017B ; Is the shift key down? BNE.B @fail ; Exit if so LEA Start(PC),A0 ; Start of this block _RecoverHandle ; Get the handle _GetHandleSize ; Get the size LEA MemMgrResident(PC),A0 ; Start of resident code LEA Start(PC),A1 ; Start of this block SUBA.L A1,A0 ; Compute non-resident size SUB.L A0,D0 ; Subtract from block size MOVE.L D0,D2 ; Save it for _BlockMove _NewPtr sys ; Create heap block for resident code TST.W D0 BNE.B @fail MOVEA.L A0,A2 ; Save address of new pointer LEA MemMgrResident(PC),A0 ; Source = start of resident code MOVEA.L A2,A1 ; Dest = New pointer MOVE.L D2,D0 ; Size = resident code size _BlockMove ; Copy code into system heap LEA MemMgrStart(PC),A1 ; Load offset for MMVecTable LEA MemMgrResident(PC),A0 ; Start of resident code SUBA.L A0,A1 ADDA.L A2,A1 MOVEA.L A1,A2 JSR InitMemVect(PC) ; Set up the new vector tables MOVE.W #128,-(A7) ; Show icon 128 BRA.B @exit @fail MOVE.W #129,-(A7) ; Show icon 129 @exit MOVE.W #-1,-(A7) ; Use default offset BSR.W ShowInit ; Call ShowInit RTS ; Exit the INIT MemMgrStart InitMemVect: MOVEM.L A0-A2/D0/D1,-(A7) ; Save regs MOVE.L A2,D0 LEA MemMgrStart(PC),A1 SUBA.L D0,A1 LEA A24RecoverHandle(PC),A0 SUBA.L A1,A0 MOVE.L A0,$1E6C LEA A32RecoverHandle(PC),A0 SUBA.L A1,A0 MOVE.L A0,$1F6C LEA A24HLock(PC),A0 SUBA.L A1,A0 MOVE.L A0,$1E78 LEA A32HLock(PC),A0 SUBA.L A1,A0 MOVE.L A0,$1F78 LEA MMPPrologue(PC),A0 SUBA.L A1,A0 MOVE.L A0,vPPrologue LEA MMPrologue(PC),A0 SUBA.L A1,A0 MOVE.L A0,vPrologue LEA MMHPrologue(PC),A0 SUBA.L A1,A0 MOVE.L A0,vHPrologue LEA MMRHPrologue(PC),A0 SUBA.L A1,A0 MOVE.L A0,vRHPrologue L044C MOVEM.L (A7)+,D0/D1/A0-A2 RTS MemMgrResident A24HLock: BEQ.B L000CD4 BSET #7,(A1) BRA.B A32HLock_1 A32HLock: BEQ.B L000CD4 BSET #7,-$000B(A0) A32HLock_1: CMPI.B #$04,CPUFlag BNE.B @1 ; JSR ([$06F4]) DC.W $4EB0,$81E1,$06F4 @1 MOVEQ #noErr,D0 BRA.B L000CD6 L000CD4 MOVEQ #nilHandleErr,D0 L000CD6 MOVE.L vEpilogue,-(A7) RTS A24RecoverHandle: MOVE.L Lo3Bytes,D2 BRA.B L02D152 A32RecoverHandle: L02D150 MOVEQ #-1,D2 L02D152 MOVEA.L vBusError,A2 LEA RHBusErrHandler030(PC),A3 CMPI.B #$04,CPUFlag BNE.B @1 LEA RHBusErrHandler040(PC),A3 @1 MOVE.L A3,vBusError MOVEA.L -$0004(A0),A1 MOVE.L A2,vBusError ADDA.L A6,A1 MOVE.L A0,D1 AND.L D2,D1 AND.L (A1),D2 SUB.L D1,D2 BEQ.B L02D184 MOVEA.L A6,A3 MOVEA.L ROMMapHndl,A6 MOVEA.L (A6),A2 SUBA.L -$0004(A2),A6 CMPA.L A3,A6 BNE.B L02D150 MOVEQ #memBCErr,D2 L02D184 MOVE.W D2,MemErr MOVEA.L A1,A0 MOVE.L vNoErrEpilogue,-(A7) RTS RHBusErrHandler030: ANDI.W #$FEFF,$000A(A7) MOVE.L ROMBase,$002C(A7) RTE RHBusErrHandler040: MOVEA.L ROMBase,A0 ADDQ.L #4,$0002(A7) RTE ZCBusErrHandler030: ANDI.W #$FEFF,$000A(A7) CLR.L $002C(A7) RTE ZCBusErrHandler040: SUB.L D0,D0 ADDQ.L #4,$0002(A7) RTE DHBusErrHandler030: ANDI.W #$FEFF,$000A(A7) MOVEQ #-1,D0 MOVE.L D0,$002C(A7) RTE DHBusErrHandler040: MOVEQ #-1,D0 MOVEA.L D0,A0 ADDQ.L #2,$0002(A7) RTE L001190 MOVEA.L vBusError,A2 LEA DHBusErrHandler030(PC),A3 CMPI.B #$04,CPUFlag BNE.B @1 LEA DHBusErrHandler040(PC),A3 ; Bus error handler @1 MOVE.L A3,vBusError BTST #0,$1EFC BNE.B L0011B2 MOVE.L A0,D0 AND.L Lo3Bytes,D0 MOVEA.L D0,A0 MOVEA.L D0,A1 BEQ.B L0011BA BRA.B L0011B8 L0011B2 MOVE.L A0,D0 MOVEA.L D0,A1 BEQ.B L0011BA L0011B8 MOVEA.L (A1),A0 L0011BA MOVE.L A2,vBusError MOVE.L A0,D0 RTS L0011C2 BTST #0,$1EFC BNE.B L0011F6 MOVE.L A0,D0 AND.L Lo3Bytes,D0 MOVEA.L D0,A0 SUBQ.L #8,A0 TST.B (A0) BEQ.B L0011F2 BMI.B L0011E6 BTST #6,(A0) BEQ.B L0011F2 MOVEA.L $0004(A0),A6 BRA.B L0011EC L0011E6 MOVEA.L A1,A6 SUBA.L $0004(A0),A6 L0011EC BSR.B L00121E L0011EE ADDQ.L #8,A0 RTS L0011F2 MOVEQ #memWZErr,D0 BRA.B L0011EE L0011F6 SUBA.W #$000C,A0 TST.B (A0) BEQ.B L00121A BMI.B L00120C BTST #6,(A0) BEQ.B L00121A MOVEA.L $0008(A0),A6 BRA.B L001212 L00120C MOVEA.L A1,A6 SUBA.L $0008(A0),A6 L001212 BSR.B L00121E L001214 ADDA.W #$000C,A0 RTS L00121A MOVEQ #memWZErr,D0 BRA.B L001214 L00121E MOVEA.L vBusError,A2 LEA ZCBusErrHandler030(PC),A3 CMPI.B #$04,CPUFlag BNE.B @1 LEA ZCBusErrHandler040(PC),A3 ; Bus error handler @1 MOVE.L A3,vBusError BTST #0,$1EFC BEQ.B L001238 MOVE.L $003C(A6),D0 BRA.B L001248 L001238 MOVE.L A6,D0 AND.L Lo3Bytes,D0 MOVEA.L D0,A6 MOVE.L $0038(A6),D0 AND.L Lo3Bytes,D0 L001248 MOVE.L A2,vBusError SUB.L A6,D0 BEQ.B L001252 MOVEQ #memAZErr,D0 L001252 RTS MMPPrologue: MOVEA.L (A7)+,A1 MOVEM.L A2-A6/D3-D7,-(A7) MOVE.B $1EFC,-(A7) MOVEA.L A1,A4 CLR.W -(A7) MOVE.L D0,D2 L001264 SUBA.L A1,A1 BSR.W L0011C2 BMI.B L001282 ADDQ.L #2,A7 MOVE.L D2,D0 MOVE.L $0020(A6),D3 BNE.B L00127C MOVE.L #$00001E00,D3 L00127C ADDA.L D3,A4 MOVE.L (A4),-(A7) RTS L001282 TST.W (A7)+ BNE.W L001306 BCHG #0,$1EFC MOVE.W #1,-(A7) BRA.B L001264 MMHPrologue: MOVEA.L (A7)+,A1 MOVEM.L A2-A6/D3-D7,-(A7) MOVE.B $1EFC,-(A7) MOVEA.L A1,A4 MOVE.W #1,-(A7) ; was 0 MOVE.L D0,D2 L0012A4 MOVEA.L TheZone,A6 BSR.W L001190 BEQ.B L0012D2 CMP.L MinusOne,D0 BEQ.B L0012F4 BSR.W L0011C2 L0012B8 BMI.B L0012F4 ADDQ.L #2,A7 MOVE.L D2,D0 MOVE.L $0020(A6),D3 BNE.B L0012CA MOVE.L #$00001E00,D3 L0012CA ADDA.L D3,A4 MOVE.L (A4),-(A7) MOVE.L A0,D7 RTS L0012D2 MOVE.L A1,D0 BEQ.B L0012EE CMPA.L ApplZone,A6 BEQ.B L0012E6 CMPA.L SysZone,A6 BNE.B L0012EE MOVEA.L ApplZone,A6 L0012E6 CMP.L A6,D0 BHI.B L0012EE MOVEA.L SysZone,A6 L0012EE BSR.W L00121E BRA.B L0012B8 L0012F4 TST.W (A7)+ BNE.B L001306 MOVEA.L A1,A0 BCHG #0,$1EFC MOVE.W #1,-(A7) BRA.B L0012A4 L001306 MOVE.W D0,MemErr MMNoErrEpilogue: MOVE.B (A7)+,$1EFC MOVEM.L (A7)+,D3-D7/A2-A6 RTS MMPrologue: MOVEA.L (A7)+,A1 MOVEM.L A2-A6/D3-D7,-(A7) MOVE.B $1EFC,-(A7) MOVEA.L A1,A4 CLR.W -(A7) MOVE.L D0,D2 L001354 MOVEA.L TheZone,A6 BTST #10,D1 BEQ.B L001362 MOVEA.L SysZone,A6 L001362 BSR.W L00121E BMI.B L00137E ADDQ.L #2,A7 MOVE.L D2,D0 MOVE.L $0020(A6),D3 BNE.B L001378 MOVE.L #$00001E00,D3 L001378 ADDA.L D3,A4 MOVE.L (A4),-(A7) RTS L00137E TST.W (A7)+ BNE.B L001306 BCHG #0,$1EFC MOVE.W #1,-(A7) BRA.B L001354 MMRHPrologue: MOVEA.L (A7)+,A1 MOVEM.L A2-A6/D3-D7,-(A7) MOVE.B $1EFC,-(A7) MOVEA.L A1,A4 CLR.W -(A7) MOVE.L D0,D2 L00139E MOVEA.L TheZone,A6 BTST #10,D1 BNE.B L0013B4 CMPA.L SysZone,A6 BEQ.B L0013B8 CMPA.L ApplZone,A6 BNE.B L0013D0 L0013B4 MOVEA.L SysZone,A6 L0013B8 MOVE.L A0,D0 BTST #0,$1EFC BNE.B L0013C6 AND.L Lo3Bytes,D0 L0013C6 CMP.L ApplZone,D0 BLS.B L0013D0 MOVEA.L ApplZone,A6 L0013D0 BSR.W L00121E BMI.B L0013EC ADDQ.L #2,A7 MOVE.L D2,D0 MOVE.L $0020(A6),D3 BNE.B L0013E6 MOVE.L #$00001E00,D3 L0013E6 ADDA.L D3,A4 MOVE.L (A4),-(A7) RTS L0013EC TST.W (A7)+ BNE.W L001306 BCHG #0,$1EFC MOVE.W #1,-(A7) BRA.B L00139E MemMgrEnd END