home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaDemoCD2.iso / ASCII / TEXTE / DOCS / DOCS&CHAETSVolume1.dms / in.adf / HDSOURCE / Loader.Exe.S < prev   
Encoding:
Text File  |  1980-01-07  |  4.0 KB  |  239 lines

  1. ; Loader.Exe.S: Source for loading data from Disk Images.
  2. ;   Before calling 'LoadBytes', setup the registers as follows:
  3. ;    D0=Offset into file
  4. ;    D1=Length to read
  5. ;    D2=Disk number (1-to-NumDisks)
  6. ;    A0=Address to load to
  7. ;
  8. ;                                Mars Bar
  9.  
  10.     Section    "LoaderCode",Code_F
  11.     Opt    C-
  12.  
  13. Execbase    =    4
  14. OpenLibrary    =    -408
  15. CloseLibrary    =    -414
  16.  
  17. Open        =    -30
  18. Close        =    -36
  19. Seek        =    -66
  20. Read        =    -42
  21.  
  22. Start:    Bsr    OpenDos
  23.     Bsr    SaveProperVBase
  24.     
  25.     Lea    FileNames,A4
  26.     Bsr    OpenFiles
  27.     
  28. ; ---------------------------------------------- Start Of Patching ---------
  29.  
  30.     Move.L    #0,D4
  31.     Move.L    #$CE400/$200,D1
  32.     Move.L    #$B000/$200,D2
  33.     Move.L    #$4C000,A0
  34.     Bsr    Loader1
  35.     Jsr    $4C020
  36.     
  37.     Move.L    #$400/$200,D1
  38.     Move.L    #$1200/$200,D2
  39.     Move.L    #$C0000,A0
  40.     Move.L    #0,D4
  41.     Bsr    Loader1
  42.  
  43.     Lea    $C0000,A0
  44.     Move.L    #$100000,-4(A0)
  45.     Move.W    #$4EF9,$c01c0
  46.     Move.L    #Loader,$C01c2
  47.     Jmp    $C0000
  48.  
  49. Loader:    Movem.L    D0-D7/A0-A6,-(Sp)
  50.     Mulu    #$200,D1
  51.     Mulu    #$200,D2
  52.     Move.L    D1,D0
  53.     Move.L    D2,D1
  54.     Move.L    D4,D2
  55.     Add.L    #1,D2
  56.     Bsr    LoadBytes
  57.     Movem.L    (Sp)+,D0-D7/A0-A6
  58.     Movem.L    (Sp)+,D2-D7/A0-A6
  59.     Clr.L    D0
  60.     Tst.L    D0
  61.     Rts
  62.  
  63. Loader1:Movem.L    D0-D7/A0-A6,-(Sp)
  64.     Mulu    #$200,D1
  65.     Mulu    #$200,D2
  66.     Move.L    D1,D0
  67.     Move.L    D2,D1
  68.     Move.L    D4,D2
  69.     Add.L    #1,D2
  70.     Bsr    LoadBytes
  71.     Movem.L    (Sp)+,D0-D7/A0-A6
  72.     Clr.L    D0
  73.     Tst.L    D0
  74.     Rts
  75.  
  76. ; ------ End Of Patching ---------------------------------------------------
  77.     
  78. OpenFiles:                ; A4=List of filename pointers (0=End)
  79.     Lea    FilePointers,A5
  80. .AnotherFile:
  81.     Move.L    (A4)+,FileNamePointer
  82.     Tst.L    FileNamePointer
  83.     Beq.S    .NoMoreFiles
  84.     Bsr    OpenFile
  85.     Move.L    FileBCPL,(A5)+
  86.     Bra.S    .AnotherFile
  87. .NoMoreFiles:
  88.     Rts
  89.  
  90. OpenDos:Move.L    ExecBase,A6
  91.     Lea    Dosname,A1
  92.     Moveq.L    #0,D0
  93.     Jsr    OpenLibrary(A6)
  94.     Move.L    D0,DosBase
  95.     Rts
  96.  
  97. OpenFile:Move.L    DosBase,A6
  98.     Move.L    FileNamePointer,D1
  99.     Move.L    #1005,D2
  100.     Jsr    Open(A6)
  101.     Move.L    D0,FileBcpl
  102.     Rts
  103.  
  104. LoadBytes:
  105.     Move.l    D0,d4        ; Offset
  106.     Move.l    d1,d5        ; Length
  107.     Move.l    a0,a4        ; Address To Load To
  108.  
  109.     Subq.l    #1,d2        ; Disk Number
  110.     Mulu    #4,d2
  111.     Lea    FilePointers,a2
  112.     Move.l    (a2,d2.l),d6    ; File BCPL
  113.  
  114.     Bsr    removeinterrupts
  115.     Bsr    loaddata    
  116.     Bsr    restoreinterrupts
  117.     Rts
  118.  
  119. RemoveInterrupts:
  120.     Movem.l    d0-d7/a0-a6,-(sp)
  121.     Move.W    #$8000,D0
  122.     Move.w    $dff01c,OldInts
  123.     Move.w    $dff01e,OldIntr
  124.     Move.w    $dff010,OldDsk
  125.     Or.W    D0,OldDsk
  126.     Or.W    D0,OldInts
  127.     Or.W    D0,OldIntr
  128.     Move.w    #$7fff,$dff09a
  129.     Move.w    #$7fff,$dff09c
  130.     Move.w    #$7fff,$dff09e
  131.     Bsr    savecurrentvbase
  132.     Bsr    restorepropervbase
  133.     Move.w    #$C008,$dff09a
  134.     Movem.l    (sp)+,d0-d7/a0-a6
  135.     Rts
  136.  
  137. RestoreInterrupts:
  138.     Movem.l    d0-d7/a0-a6,-(sp)
  139.     Move.w    #$7fff,$dff09a
  140.     Move.w    #$7fff,$dff09c
  141.     Move.w    #$7fff,$dff09e
  142.     Bsr    restorecurrentvbase
  143.     Move.w    oldints,$dff09a
  144.     Move.w    oldintr,$dff09c
  145.     Move.w    olddsk,$dff09e
  146.     Movem.l    (sp)+,d0-d7/a0-a6
  147.     Rts
  148.  
  149. LoadData:
  150.     Movem.l    d0-d7/a0-a6,-(sp)    
  151.     Move.l    DosBase,a6
  152.     Move.l    d6,d1
  153.     Move.l    d4,d2
  154.     Move.l    #-1,d3
  155.     Jsr    -66(a6)
  156.     Move.l    d6,d1
  157.     Move.l    a4,d2
  158.     Move.l    d5,d3
  159.     Jsr    -42(a6)
  160.     Movem.l    (sp)+,d0-d7/a0-a6
  161.     Rts
  162.  
  163. SaveProperVbase:
  164.     Movem.L    D0/A0-A1,-(Sp)
  165.     Lea    $0.L,A0
  166.     Lea    VBasePropDat,A1
  167.     Move.L    #$BF,D0
  168. .Loop:    Move.B    (A0)+,(A1)+
  169.     Dbra.W    D0,.Loop
  170.     Movem.L    (Sp)+,D0/A0-A1
  171.     Rts
  172.  
  173. RestoreProperVBase:
  174.     Movem.L    D0/A0-A1,-(Sp)
  175.     Lea    $0.L,A0
  176.     Lea    VbasePropDat,A1
  177.     Move.L    #$BF,D0
  178. .Loop:    Move.B    (A1)+,(A0)+
  179.     Dbra.W    D0,.Loop
  180.     Movem.L    (Sp)+,D0/A0-A1
  181.     Rts
  182.  
  183. SaveCurrentVbase:
  184.     Movem.L    D0/A0-A1,-(Sp)
  185.     Lea    $0.L,A0
  186.     Lea    VbasePresDat,A1
  187.     Move.L    #$BF,D0
  188. .Loop:    Move.B    (A0)+,(A1)+
  189.     Dbra.W    D0,.Loop
  190.     Movem.L    (Sp)+,D0/A0-A1
  191.     Rts
  192.  
  193. RestoreCurrentVbase:
  194.     Movem.L    D0/A0-A1,-(Sp)
  195.     Lea    $0.L,A0
  196.     Lea    VbasePresDat,A1
  197.     Move.L    #$BF,D0
  198. .Loop:    Move.B    (A1)+,(A0)+
  199.     Dbra.W    D0,.Loop
  200.     Movem.L    (Sp)+,D0/A0-A1
  201.     Rts
  202.  
  203. DosName:Dc.B    'dos.library',0
  204.     Even
  205. DosBase:Dc.L    0
  206.  
  207. FileNamePointer:Dc.L    0
  208. FileBCPL:    Dc.L    0
  209.  
  210. FilePointers:
  211. Disk1BCPL:Dc.L    0
  212. Disk2BCPL:Dc.L    0
  213. Disk3BCPL:Dc.L    0
  214. Disk4BCPL:Dc.L    0
  215. Disk5BCPL:Dc.L    0
  216. Disk6BCPL:Dc.L    0
  217. Disk7BCPL:Dc.L    0
  218. Disk8BCPL:Dc.L    0
  219. Disk9BCPL:Dc.L    0
  220. Disk10BCPL:Dc.L    0
  221.  
  222. OldInts:Dc.W    0
  223. OldIntr:Dc.W    0
  224. OldDsk:Dc.W    0
  225.  
  226. FileNames:
  227.     Dc.L    Disk1Name,Disk2Name,Disk3Name
  228.     Dc.L    0
  229. Disk1Name:Dc.b    'Disk1',0
  230.     Even
  231. Disk2Name:Dc.b    'Disk2',0
  232.     Even
  233. Disk3Name:Dc.b    'Disk3',0
  234.     Even
  235.  
  236.     Section    "BssData",BSS_F
  237. VBasePropDat:Ds.b    $C0
  238. VBasePresDat:Ds.b    $C0
  239.