home *** CD-ROM | disk | FTP | other *** search
- ; *** Imperium Hard Disk Loader V1.0
- ; *** Written by Jean-François Fabre 1999
-
-
- include "syslibs.i"
- include "jst.i"
-
- HD_PARAMS "",0,0
-
- loader:
- Mac_printf "Mystical HD Loader V1.0"
- Mac_printf "Coded by Jean-François Fabre © 1999"
-
- JSRABS UseHarryOSEmu
-
- TESTFILE MAINFILE
- tst.l d0
- bne FileErr
-
- JSRABS LoadFiles
-
- moveq.l #0,D0
- move.l #CACRF_CopyBack,D1
- JSRABS Degrade
-
-
- GO_SUPERVISOR
- SAVE_OSDATA $100000,#$5F
-
- ; **** boot stuff and patch
-
- MOVE.L $4.W,A6 ;OPEN DOSLIB FOR USE (THE EMU
- MOVEQ.L #0,D0 ;PROVIDES THE FUNCTIONS)
- LEA DOSNAM(PC),A1
- JSRLIB OpenLibrary(A6)
- LEA.L DOSP(PC),a4
- MOVE.L d0,(a4)
- MOVE.L D0,A6
-
- LEA.L MAINFILE(PC),A0 ;LOAD MAIN GAME
- MOVE.L A0,D1
- JSRLIB LoadSeg
-
- ;NO NEED TO STORE POINTER FOR LATER USE
-
- move.l 4,A6
- move.b #$32,($212,A6) ; the game expects PAL
-
- lea Trace(pc),A0
- JSRGEN SetTraceVector
-
- LSL.L #2,D0
- MOVE.L D0,A1
- ADDQ.L #4,A1
-
- RELOC_MOVEL A1,SegPtr
-
- ;; move.l #$C3FC,D0
- ;; JSRGEN StoreCopperPointer
- ;; SUB.L A0,A0
- ;; move.l #$5F,D0
- ;; JSRGEN SetIconifyKey
-
- SUB.L A0,A0
- MOVEQ.L #0,D0 ; no pointer on argumentline
-
- ; patch stuff
-
- STORE_REGS
-
- bsr Patch24Bit_new
- bsr Patch24Bit_l1
- bsr Patch24Bit_l2
- bsr Patch24Bit_l3
- bsr PatchProtect
- bsr PatchDisk
-
- ; 3 times
-
- bsr PatchBlitter
- bsr PatchBlitter
- bsr PatchBlitter
-
- RESTORE_REGS
-
- JSRGEN FlushCachesHard
-
- nop
- nop
- nop
- jsr (A1)
- nop
- nop
- nop
- exitgame:
- JSRGEN InGameExit
-
- PatchAdd:
- move.l A1,-(A7)
- move.l 4(A7),A1 ; return address
- RELOC_MOVEL A1,RETURN_ADDR
- move.l (A7)+,A1
-
- addq.w #1,A1
- addq.w #1,A2
-
- bsr StoreA0_MSB
- addq.l #4,a7 ; pops up the stack
- pea .PatchAddReturn(pc)
- move.l RETURN_ADDR(pc),-(A7)
- rts
- .PatchAddReturn
- bsr RestoreA0_MSB
- rts
-
- PatchAdd2:
- move.l A1,-(A7)
- move.l 4(A7),A1 ; return address
- RELOC_MOVEL A1,RETURN_ADDR_2
- move.l (A7)+,A1
-
- adda.w D7,A1
- adda.w D7,A2
-
- bsr StoreA0_MSB
- addq.l #4,a7 ; pops up the stack
- pea .PatchAddReturn(pc)
- move.l RETURN_ADDR_2(pc),-(A7)
- rts
- .PatchAddReturn:
- bsr RestoreA0_MSB
- rts
-
-
-
- Patch24Bit_l1:
- move.l #$5249524A,D0
- move.l #$3E0647D1,D1
- bsr Search8Bytes
- cmp.l #0,A1
- beq exitgame
- move.l #$4EB800CC,(A1)
- PATCHUSRJMP ($CC),PatchAdd
-
- move.l #$D2C7D4C7,D0
- move.l #$12901490,D1
- bsr Search8Bytes
- cmp.l #0,A1
- beq exitgame
- move.l #$4EB800D2,(A1)
- PATCHUSRJMP ($D2),PatchAdd2
- rts
-
- RestoreA0_MSB:
- movem.l D0/D1,-(A7)
- move.l MSB_A0(pc),D1
- move.l A0,D0
- or.l D1,D0
- move.l D0,A0
- movem.l (A7)+,D0/D1
- rts
-
-
- StoreA0_MSB:
- movem.l D3/D4,-(A7)
- move.l A0,D4
- move.l A0,D3
- lsl.l #8,D4
- lsr.l #8,D4
- move.l D4,A0
- sub.l D4,D3
- RELOC_MOVEL D3,MSB_A0
- movem.l (A7)+,D3/D4
- rts
-
- Patch24Bit_l2:
- move.l #$3018EE68,D0
- move.l #$38004644,D1
- bsr Search8Bytes
- cmp.l #0,A1
- beq exitgame
- move.l #$4EB800D8,(A1)
- PATCHUSRJMP ($D8).W,PatchMoveLsr
- rts
-
- Patch24Bit_l3:
- move.l SegPtr(pc),A0
- lea $80000,A1
- move.l #$4C980007,D0
- move.l #$4EB800DE,D1
- JSRGEN HexReplaceLong
- PATCHUSRJMP ($DE).W,CorrectA0_2
- move.l SegPtr(pc),A0
- lea $80000,A1
- move.l #$30183218,D0
- move.l #$4EB800E4,D1
- JSRGEN HexReplaceLong
- PATCHUSRJMP ($E4).W,CorrectA0_3
- rts
-
- PatchMoveLsr:
- movem.l D1/A0,-(A7)
- move.l A0,D1
- lsl.l #8,D1
- lsr.l #8,D1
- move.l D1,A0
- move.w (A0),D0
- movem.l (A7)+,D1/A0
- addq.l #2,A0
- lsr.w D7,D0
- rts
-
- Patch24Bit_new:
- move.l SegPtr(pc),A0
- lea $80000,A1
- move.l #$49D04BD1,D0
- move.l #$4EB800C0,D1
- JSRGEN HexReplaceLong
- move.l SegPtr(pc),A0
- lea $80000,A1
- move.l #$4C98000F,D0
- move.l #$4EB800C6,D1
- JSRGEN HexReplaceLong
- PATCHUSRJMP $C0.W,CorrectA4
- PATCHUSRJMP $C6.W,CorrectA0
- rts
-
- CorrectA0:
- movem.l D4/A0,-(A7)
- move.l A0,D4
- lsl.l #8,D4
- lsr.l #8,D4
- move.l D4,A0
- movem.w (A0),D0-D3
- movem.l (A7)+,D4/A0
- addq.l #8,A0
- rts
-
- CorrectA0_2:
- movem.l D4/A0,-(A7)
- move.l A0,D4
- lsl.l #8,D4
- lsr.l #8,D4
- move.l D4,A0
- movem.w (A0),D0-D2
- movem.l (A7)+,D4/A0
- addq.l #6,A0
- rts
-
- CorrectA0_3:
- movem.l D4/A0,-(A7)
- move.l A0,D4
- lsl.l #8,D4
- lsr.l #8,D4
- move.l D4,A0
- movem.w (A0),D0-D1
- movem.l (A7)+,D4/A0
- addq.l #4,A0
- rts
-
- CorrectA4:
- lea (A1),A5
- movem.l D0,-(A7)
- move.l A0,D0
- lsl.l #8,D0
- lsr.l #8,D0
- move.l D0,A4
- movem.l (A7)+,D0
- rts
-
-
- PatchBlit300F:
- JSRGEN WaitBlit
- move.w #$300F,$DFF058
- rts
-
- P24B_sub:
- move.l A0,D2
- movem.l D1,-(A7)
- move.l MSB_A0(pc),D1
- or.l D1,D2
- movem.l (A7)+,D1
- rol.l #8,D2
- rts
-
- ;$1B4AA
- Patch24Bit_1:
- bsr P24B_sub
- and.w #7,D2
- rts
-
- ;$1BA2C
- Patch24Bit_2:
- bsr P24B_sub
- and.l #7,D2
- rts
-
- Patch24Bit:
-
- ; 1: mask A0 and store MSB
-
- move.l #$2050D1C9,D0
- move.l #$225F4E75,D1
- bsr Search8Bytes
- cmp.l #0,A1
- beq exitgame
- PATCHUSRJMP (A1),Mask24Bit_1
-
- ; 2: restore A0 MSB in D2
-
- move.l #$2408E19A,D0
- move.l #$02420007,D1
- bsr Search8Bytes
- cmp.l #0,A1
- beq exitgame
- PATCHUSRJSR (A1),Patch24Bit_1
- PATCH_NOP (6,A1)
- PATCH_NOP (8,A1)
-
- ; 3: restore A0 MSB in D2
-
- move.l #$2408E19A,D0
- move.l #$02820000,D1
- bsr Search8Bytes
- cmp.l #0,A1
- beq exitgame
- PATCHUSRJSR (A1),Patch24Bit_2
-
- rts
-
- PatchDisk:
- ; remove disk check
-
- move.l #$4E756100,D0
- move.l #$F6664AB9,D1
- bsr Search8Bytes
- cmp.l #0,A1
- beq exitgame
- PATCH_RTS (2,A1)
- rts
-
- PatchProtect:
- move.l #$672C4C97,D0
- move.l #$00079079,D1
- bsr Search8Bytes
- cmp.l #0,A1
- beq exitgame
- move.w #$6022,(A1)
- rts
-
- PatchBlitter:
- move.l #$33FC300F,D0
- move.l #$00DFF058,D1
- bsr Search8Bytes
- cmp.l #0,A1
- beq exitgame
- PATCHUSRJSR (A1),PatchBlit300F
- PATCH_NOP 6(A1)
- rts
-
- Search8Bytes:
- move.l SegPtr(pc),A1
- .loop
- move.l (A1),D2
- cmp.l D0,D2
- bne .nomatch
- move.l (4,A1),D2
- cmp.l D1,D2
- bne .nomatch
-
- ;; found: patch
-
- .exit
- rts
- .nomatch:
- addq.l #2,A1
- cmp.l #$80000,A1
- beq.b .notfound ; not found!
- bra.b .loop
-
- .notfound:
- sub.l A1,A1
- bra.b .exit
-
- Mask24Bit_1:
- movem.l D0,-(A7)
- move.l (A0),D0
- RELOC_MOVEB (A0),MSB_A0 ; store MSB
- and.l #$FFFFFF,D0
- move.l D0,A0 ; masks A0
- movem.l (A7)+,D0
- add.l A1,A0
- move.l (A7)+,A1
- rts
-
- Trace:
- STORE_REGS
-
- move.l A5,D0
- and.l #$FF000000,D0
- cmp.l #$51000000,D0
- bne .ok
-
- JSRGEN EnterDebugger
- .ok
- RESTORE_REGS
- RTE
-
- FileErr:
- Mac_printf "File ",f
- lea MAINFILE(pc),A1
- JSRABS Display
- Mac_printf " missing!"
- JSRABS CloseAll
-
- MSB_A0:
- dc.l 0
- DOSP:
- dc.l 0
- SegPtr:
- dc.l 0
- RETURN_ADDR:
- dc.l 0
- RETURN_ADDR_2:
- dc.l 0
- DOSNAM:
- dc.b "dos.library",0
- MAINFILE:
- dc.b "game",0
-
-
-