home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / Games / JST / sources / src / loaders / Mystical / mysticalhd.asm < prev    next >
Encoding:
Assembly Source File  |  2001-03-19  |  6.0 KB  |  432 lines

  1. ; *** Imperium Hard Disk Loader V1.0
  2. ; *** Written by Jean-François Fabre 1999
  3.  
  4.  
  5.     include    "syslibs.i"
  6.     include    "jst.i"
  7.  
  8.     HD_PARAMS    "",0,0
  9.  
  10. loader:
  11.     Mac_printf    "Mystical HD Loader V1.0"
  12.     Mac_printf    "Coded by Jean-François Fabre © 1999"
  13.  
  14.     JSRABS    UseHarryOSEmu
  15.  
  16.     TESTFILE    MAINFILE
  17.     tst.l    d0
  18.     bne    FileErr
  19.  
  20.     JSRABS    LoadFiles
  21.  
  22.     moveq.l    #0,D0
  23.     move.l    #CACRF_CopyBack,D1
  24.     JSRABS    Degrade
  25.  
  26.  
  27.     GO_SUPERVISOR
  28.     SAVE_OSDATA    $100000,#$5F
  29.  
  30.     ; **** boot stuff and patch
  31.  
  32.     MOVE.L    $4.W,A6            ;OPEN DOSLIB FOR USE (THE EMU
  33.     MOVEQ.L    #0,D0            ;PROVIDES THE FUNCTIONS)
  34.     LEA    DOSNAM(PC),A1
  35.     JSRLIB    OpenLibrary(A6)
  36.     LEA.L    DOSP(PC),a4
  37.     MOVE.L    d0,(a4)
  38.     MOVE.L    D0,A6
  39.  
  40.     LEA.L    MAINFILE(PC),A0        ;LOAD MAIN GAME
  41.     MOVE.L    A0,D1
  42.     JSRLIB    LoadSeg
  43.  
  44.                     ;NO NEED TO STORE POINTER FOR LATER USE
  45.  
  46.     move.l    4,A6
  47.     move.b    #$32,($212,A6)        ; the game expects PAL
  48.  
  49.     lea    Trace(pc),A0
  50.     JSRGEN    SetTraceVector
  51.  
  52.     LSL.L    #2,D0
  53.     MOVE.L    D0,A1
  54.     ADDQ.L    #4,A1
  55.  
  56.     RELOC_MOVEL    A1,SegPtr
  57.  
  58. ;;    move.l    #$C3FC,D0
  59. ;;    JSRGEN    StoreCopperPointer
  60. ;;    SUB.L    A0,A0
  61. ;;    move.l    #$5F,D0
  62. ;;    JSRGEN    SetIconifyKey
  63.  
  64.     SUB.L    A0,A0
  65.     MOVEQ.L    #0,D0        ; no pointer on argumentline
  66.  
  67.     ; patch stuff
  68.  
  69.     STORE_REGS
  70.  
  71.     bsr    Patch24Bit_new
  72.     bsr    Patch24Bit_l1
  73.     bsr    Patch24Bit_l2
  74.     bsr    Patch24Bit_l3
  75.     bsr    PatchProtect
  76.     bsr    PatchDisk
  77.  
  78.     ; 3 times
  79.  
  80.     bsr    PatchBlitter
  81.     bsr    PatchBlitter
  82.     bsr    PatchBlitter
  83.  
  84.     RESTORE_REGS
  85.  
  86.     JSRGEN    FlushCachesHard
  87.  
  88.     nop
  89.     nop
  90.     nop
  91.     jsr    (A1)
  92.     nop
  93.     nop
  94.     nop
  95. exitgame:
  96.     JSRGEN    InGameExit
  97.  
  98. PatchAdd:
  99.     move.l    A1,-(A7)
  100.     move.l    4(A7),A1    ; return address    
  101.     RELOC_MOVEL    A1,RETURN_ADDR
  102.     move.l    (A7)+,A1
  103.  
  104.     addq.w    #1,A1
  105.     addq.w    #1,A2
  106.  
  107.     bsr    StoreA0_MSB
  108.     addq.l    #4,a7    ; pops up the stack
  109.     pea    .PatchAddReturn(pc)
  110.     move.l    RETURN_ADDR(pc),-(A7)
  111.     rts
  112. .PatchAddReturn
  113.     bsr    RestoreA0_MSB
  114.     rts
  115.  
  116. PatchAdd2:
  117.     move.l    A1,-(A7)
  118.     move.l    4(A7),A1    ; return address    
  119.     RELOC_MOVEL    A1,RETURN_ADDR_2
  120.     move.l    (A7)+,A1
  121.  
  122.     adda.w    D7,A1
  123.     adda.w    D7,A2
  124.  
  125.     bsr    StoreA0_MSB
  126.     addq.l    #4,a7    ; pops up the stack
  127.     pea    .PatchAddReturn(pc)
  128.     move.l    RETURN_ADDR_2(pc),-(A7)
  129.     rts
  130. .PatchAddReturn:
  131.     bsr    RestoreA0_MSB
  132.     rts
  133.  
  134.  
  135.  
  136. Patch24Bit_l1:
  137.     move.l    #$5249524A,D0
  138.     move.l    #$3E0647D1,D1
  139.     bsr    Search8Bytes
  140.     cmp.l    #0,A1
  141.     beq    exitgame
  142.     move.l    #$4EB800CC,(A1)
  143.     PATCHUSRJMP    ($CC),PatchAdd
  144.  
  145.     move.l    #$D2C7D4C7,D0
  146.     move.l    #$12901490,D1
  147.     bsr    Search8Bytes
  148.     cmp.l    #0,A1
  149.     beq    exitgame
  150.     move.l    #$4EB800D2,(A1)
  151.     PATCHUSRJMP    ($D2),PatchAdd2
  152.     rts
  153.  
  154. RestoreA0_MSB:
  155.     movem.l    D0/D1,-(A7)
  156.     move.l    MSB_A0(pc),D1
  157.     move.l    A0,D0
  158.     or.l    D1,D0
  159.     move.l    D0,A0
  160.     movem.l    (A7)+,D0/D1
  161.     rts
  162.  
  163.  
  164. StoreA0_MSB:
  165.     movem.l    D3/D4,-(A7)
  166.     move.l    A0,D4
  167.     move.l    A0,D3
  168.     lsl.l    #8,D4
  169.     lsr.l    #8,D4
  170.     move.l    D4,A0
  171.     sub.l    D4,D3
  172.     RELOC_MOVEL    D3,MSB_A0
  173.     movem.l    (A7)+,D3/D4
  174.     rts
  175.  
  176. Patch24Bit_l2:
  177.     move.l    #$3018EE68,D0
  178.     move.l    #$38004644,D1
  179.     bsr    Search8Bytes
  180.     cmp.l    #0,A1
  181.     beq    exitgame
  182.     move.l    #$4EB800D8,(A1)
  183.     PATCHUSRJMP    ($D8).W,PatchMoveLsr
  184.     rts
  185.  
  186. Patch24Bit_l3:
  187.     move.l    SegPtr(pc),A0
  188.     lea    $80000,A1
  189.     move.l    #$4C980007,D0
  190.     move.l    #$4EB800DE,D1
  191.     JSRGEN    HexReplaceLong
  192.     PATCHUSRJMP    ($DE).W,CorrectA0_2
  193.     move.l    SegPtr(pc),A0
  194.     lea    $80000,A1
  195.     move.l    #$30183218,D0
  196.     move.l    #$4EB800E4,D1
  197.     JSRGEN    HexReplaceLong
  198.     PATCHUSRJMP    ($E4).W,CorrectA0_3
  199.     rts
  200.  
  201. PatchMoveLsr:
  202.     movem.l    D1/A0,-(A7)
  203.     move.l    A0,D1
  204.     lsl.l    #8,D1
  205.     lsr.l    #8,D1
  206.     move.l    D1,A0
  207.     move.w    (A0),D0
  208.     movem.l    (A7)+,D1/A0
  209.     addq.l    #2,A0
  210.     lsr.w    D7,D0
  211.     rts
  212.  
  213. Patch24Bit_new:
  214.     move.l    SegPtr(pc),A0
  215.     lea    $80000,A1
  216.     move.l    #$49D04BD1,D0
  217.     move.l    #$4EB800C0,D1
  218.     JSRGEN    HexReplaceLong
  219.     move.l    SegPtr(pc),A0
  220.     lea    $80000,A1
  221.     move.l    #$4C98000F,D0
  222.     move.l    #$4EB800C6,D1
  223.     JSRGEN    HexReplaceLong
  224.     PATCHUSRJMP    $C0.W,CorrectA4
  225.     PATCHUSRJMP    $C6.W,CorrectA0
  226.     rts
  227.  
  228. CorrectA0:
  229.     movem.l    D4/A0,-(A7)
  230.     move.l    A0,D4
  231.     lsl.l    #8,D4
  232.     lsr.l    #8,D4
  233.     move.l    D4,A0
  234.     movem.w    (A0),D0-D3
  235.     movem.l    (A7)+,D4/A0
  236.     addq.l    #8,A0
  237.     rts
  238.     
  239. CorrectA0_2:
  240.     movem.l    D4/A0,-(A7)
  241.     move.l    A0,D4
  242.     lsl.l    #8,D4
  243.     lsr.l    #8,D4
  244.     move.l    D4,A0
  245.     movem.w    (A0),D0-D2
  246.     movem.l    (A7)+,D4/A0
  247.     addq.l    #6,A0
  248.     rts
  249.     
  250. CorrectA0_3:
  251.     movem.l    D4/A0,-(A7)
  252.     move.l    A0,D4
  253.     lsl.l    #8,D4
  254.     lsr.l    #8,D4
  255.     move.l    D4,A0
  256.     movem.w    (A0),D0-D1
  257.     movem.l    (A7)+,D4/A0
  258.     addq.l    #4,A0
  259.     rts
  260.     
  261. CorrectA4:
  262.     lea    (A1),A5
  263.     movem.l    D0,-(A7)
  264.     move.l    A0,D0
  265.     lsl.l    #8,D0
  266.     lsr.l    #8,D0
  267.     move.l    D0,A4
  268.     movem.l    (A7)+,D0
  269.     rts
  270.  
  271.     
  272. PatchBlit300F:
  273.     JSRGEN    WaitBlit
  274.     move.w    #$300F,$DFF058
  275.     rts
  276.  
  277. P24B_sub:
  278.     move.l    A0,D2
  279.     movem.l    D1,-(A7)
  280.     move.l    MSB_A0(pc),D1
  281.     or.l    D1,D2
  282.     movem.l    (A7)+,D1
  283.     rol.l    #8,D2
  284.     rts
  285.  
  286. ;$1B4AA
  287. Patch24Bit_1:
  288.     bsr    P24B_sub
  289.     and.w    #7,D2
  290.     rts
  291.  
  292. ;$1BA2C
  293. Patch24Bit_2:
  294.     bsr    P24B_sub
  295.     and.l    #7,D2
  296.     rts
  297.  
  298. Patch24Bit:
  299.  
  300.     ; 1: mask A0 and store MSB
  301.  
  302.     move.l    #$2050D1C9,D0
  303.     move.l    #$225F4E75,D1
  304.     bsr    Search8Bytes
  305.     cmp.l    #0,A1
  306.     beq    exitgame
  307.     PATCHUSRJMP    (A1),Mask24Bit_1    
  308.  
  309.     ; 2: restore A0 MSB in D2
  310.  
  311.     move.l    #$2408E19A,D0
  312.     move.l    #$02420007,D1
  313.     bsr    Search8Bytes
  314.     cmp.l    #0,A1
  315.     beq    exitgame
  316.     PATCHUSRJSR    (A1),Patch24Bit_1
  317.     PATCH_NOP    (6,A1)
  318.     PATCH_NOP    (8,A1)
  319.  
  320.     ; 3: restore A0 MSB in D2
  321.  
  322.     move.l    #$2408E19A,D0
  323.     move.l    #$02820000,D1
  324.     bsr    Search8Bytes
  325.     cmp.l    #0,A1
  326.     beq    exitgame
  327.     PATCHUSRJSR    (A1),Patch24Bit_2
  328.  
  329.     rts
  330.  
  331. PatchDisk:
  332.     ; remove disk check
  333.  
  334.     move.l    #$4E756100,D0
  335.     move.l    #$F6664AB9,D1
  336.     bsr    Search8Bytes
  337.     cmp.l    #0,A1
  338.     beq    exitgame
  339.     PATCH_RTS    (2,A1)
  340.     rts
  341.  
  342. PatchProtect:
  343.     move.l    #$672C4C97,D0
  344.     move.l    #$00079079,D1
  345.     bsr    Search8Bytes
  346.     cmp.l    #0,A1
  347.     beq    exitgame
  348.     move.w    #$6022,(A1)
  349.     rts
  350.  
  351. PatchBlitter:
  352.     move.l    #$33FC300F,D0
  353.     move.l    #$00DFF058,D1
  354.     bsr    Search8Bytes
  355.     cmp.l    #0,A1
  356.     beq    exitgame
  357.     PATCHUSRJSR    (A1),PatchBlit300F
  358.     PATCH_NOP    6(A1)
  359.     rts
  360.  
  361. Search8Bytes:
  362.     move.l    SegPtr(pc),A1
  363. .loop
  364.     move.l    (A1),D2
  365.     cmp.l    D0,D2
  366.     bne    .nomatch
  367.     move.l    (4,A1),D2
  368.     cmp.l    D1,D2
  369.     bne    .nomatch
  370.  
  371. ;; found: patch
  372.  
  373. .exit
  374.     rts
  375. .nomatch:
  376.     addq.l    #2,A1
  377.     cmp.l    #$80000,A1
  378.     beq.b    .notfound        ; not found!
  379.     bra.b    .loop
  380.  
  381. .notfound:
  382.     sub.l    A1,A1
  383.     bra.b    .exit
  384.  
  385. Mask24Bit_1:
  386.     movem.l    D0,-(A7)
  387.     move.l    (A0),D0
  388.     RELOC_MOVEB    (A0),MSB_A0    ; store MSB
  389.     and.l    #$FFFFFF,D0
  390.     move.l    D0,A0            ; masks A0
  391.     movem.l    (A7)+,D0
  392.     add.l    A1,A0
  393.     move.l    (A7)+,A1
  394.     rts
  395.  
  396. Trace:
  397.     STORE_REGS
  398.  
  399.     move.l    A5,D0
  400.     and.l    #$FF000000,D0
  401.     cmp.l    #$51000000,D0
  402.     bne    .ok
  403.  
  404.     JSRGEN    EnterDebugger
  405. .ok
  406.     RESTORE_REGS
  407.     RTE
  408.  
  409. FileErr:
  410.     Mac_printf    "File ",f
  411.     lea    MAINFILE(pc),A1
  412.     JSRABS    Display
  413.     Mac_printf     " missing!"
  414.     JSRABS    CloseAll
  415.  
  416. MSB_A0:
  417.     dc.l    0
  418. DOSP:
  419.     dc.l    0
  420. SegPtr:
  421.     dc.l    0
  422. RETURN_ADDR:
  423.     dc.l    0
  424. RETURN_ADDR_2:
  425.     dc.l    0
  426. DOSNAM:
  427.     dc.b    "dos.library",0
  428. MAINFILE:
  429.     dc.b    "game",0
  430.  
  431.  
  432.