home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 545b.lha / Fmon_v1.8 / src.lzh / load.a < prev    next >
Encoding:
Text File  |  1991-09-03  |  11.2 KB  |  411 lines

  1.  
  2. **********************************************************
  3. *                                                        *
  4. *    Fmon V1.8     -     load.a: the loader              *
  5. *                                                        *
  6. *    (c) 1991  Michael Schröder                          *
  7. *                                                        *
  8. *    This program is freely distributable as long as     *
  9. *    the above copyright message is left intact          *
  10. *                                                        *
  11. **********************************************************
  12.  
  13.  
  14.                xdef _load
  15.  
  16.                xref _DOSBase
  17.                xref @addax
  18.                xref @adds
  19.                xref @addd
  20.                xref app
  21.                xref @pril
  22.                xref _wrilc
  23.                xref _wril
  24.                xref _wric
  25.                xref _clearl
  26.                xref @cnopen
  27.  
  28. _LVOOpen       equ -30
  29. _LVORead       equ -42
  30. _LVOClose      equ -36
  31. _LVOAllocMem   equ -198
  32. _LVOFreeMem    equ -210
  33.  
  34.                csect text,0,,2,2
  35.  
  36.                xref _sp
  37.                xref _st
  38.                xref _clearl
  39.                xref _qual
  40.                xref _cl
  41.                xref _iins
  42.  
  43. AbsExecBase    equ 4
  44.  
  45. _load          movem.l d2-d7/a2-a6,-(a7)
  46.                move.l a7,d3
  47.                sub.l a2,a2
  48.                move.l 12+4*11(a7),d5
  49.                clr.l d4
  50.                move.l _DOSBase(a4),a6
  51.                move.l 8+4*11(a7),a3
  52.                clr.w _sp(a4)
  53.                moveq.l #'$',d0
  54.                jsr app(pc)
  55.                move.l a3,d0
  56.                jsr @addax(pc)
  57.                btst.l #0,d5
  58.                beq.s lnos
  59.                lea ls1(a4),a0
  60.                jsr @adds(pc)
  61.                move.l a3,d0
  62.                lsr.l #2,d0
  63.                jsr @addax(pc)
  64.                moveq.l #')',d0
  65.                jsr app(pc)
  66. lnos           lea ls2(a4),a0
  67.                jsr @adds(pc)
  68.                move.l 4+4*11(a7),d1
  69.                move.l #1005,d2
  70.                jsr _LVOOpen(a6)
  71.                move.l d1,d7
  72.                bne.s ll1
  73.                lea snotfound(a4),a0
  74.                jsr @pril(pc)
  75.                bra fin1
  76. ll1            bsr read
  77.                cmpi.l #1011,d0
  78.                beq.s ll3
  79.                lea snoobj(a4),a0
  80.                bra errout
  81. ll3            clr.l -(a7)
  82. l3             bsr read
  83.                move.l d0,d2
  84.                beq.s nolib
  85.                bsr alloc
  86.                move.l a2,a1
  87.                move.l d2,d0
  88.                bsr readd0a1
  89.                move.l a2,a1
  90.                clr.l d0
  91.                move.l a6,-(a7)
  92.                move.l AbsExecBase.w,a6
  93.                jsr -552(a6)
  94.                move.l (a7)+,a6
  95.                tst.l d0
  96.                bne.s ll2
  97.                move.l a2,a0
  98.                jsr @cnopen(pc)
  99.                bra fin
  100. ll2            move.l d0,-(a7)
  101.                bsr free
  102.                bra l3
  103. nolib          bsr read
  104.                move.l d0,d2
  105.                bsr alloc
  106.                move.l a2,a5
  107.                clr.l d4
  108. l5             move.l (a7)+,d0
  109.                beq.s l4
  110.                bsr adent
  111.                bra.s l5
  112. l4             bsr read
  113.                move.l d0,d1
  114. l7             cmp.l d4,d1
  115.                bcs error
  116.                beq.s l6
  117.                clr.l d0
  118.                bsr adent
  119.                bra.s l7
  120. l6             move.l a5,-(a7)
  121.                bsr read
  122.                sub.l d1,d0
  123.                bcs error
  124.                move.l d0,d1
  125.                move.l d0,d6
  126. l8             btst.l #0,d5
  127.                beq.s lll1
  128.                addq.l #4,a3
  129. lll1           move.l a3,d0
  130.                bsr adent
  131.                bsr read
  132.                lsl.l #2,d0
  133.                adda.l d0,a3
  134.                dbf d1,l8
  135.                move.l a3,d0
  136.                subq.l #1,d0
  137.                jsr @addax(pc)
  138.                jsr _wrilc(pc)
  139.                btst.l #2,d5
  140.                beq.s noinf
  141.                lea _iins(a4),a0
  142.                jsr @pril(pc)
  143.                moveq.l #0,d4
  144.                move.l (a7),a5
  145. iloop          jsr _clearl(pc)
  146.                addq.l #1,d4
  147.                move.l d4,d0
  148.                jsr @addd(pc)
  149.                move.b #'$',_st+4(a4)
  150.                move.w #5,_sp(a4)
  151.                move.l (a5)+,d0
  152.                jsr @addax(pc)
  153.                moveq.l #'-',d0
  154.                jsr app(pc)
  155.                moveq.l #'$',d0
  156.                jsr app(pc)
  157.                move.l a3,d0
  158.                cmp.l d4,d6
  159.                bcs.s notb
  160.                move.l (a5),d0
  161.                btst.l #0,d5
  162.                beq.s notb
  163.                subq.l #4,d0
  164. notb           move.l d0,-(a7)
  165.                subq.l #1,d0
  166.                jsr @addax(pc)
  167.                addq.w #1,_sp(a4)
  168.                moveq.l #'$',d0
  169.                jsr app(pc)
  170.                move.l (a7)+,d0
  171.                sub.l -4(a5),d0
  172.                jsr @addax(pc)
  173.                jsr _wril(pc)
  174. iwait          btst.b #2,_qual+1(a4)
  175.                bne.s iwait
  176.                jsr _wric(pc)
  177.                cmp.l d4,d6
  178.                bcc.b iloop
  179. noinf          move.l (a7)+,a5
  180.                sub.l a3,a3
  181. lll            bsr read
  182.                lsl.l #2,d0
  183.                lsr.l #2,d0
  184.                cmpi.l #1010,d0
  185.                bne.s l9
  186.                sub.l a3,a3
  187.                tst.l d6
  188.                bmi theend
  189.                bra.s lll
  190. l9             cmpi.l #1000,d0
  191.                beq.s l10
  192.                cmpi.l #1009,d0
  193.                bne.s l11
  194. l10            bsr read
  195.                lsl.l #2,d0
  196.                beq.s lll
  197.                move.l d0,d4
  198. l102           move.l d3,-(a7)
  199.                move.l d4,d3
  200.                cmpi.l #81,d3
  201.                bcs.s l101
  202.                moveq.l #80,d3
  203. l101           move.l d7,d1
  204.                lea _cl(a4),a0
  205.                move.l a0,d2
  206.                jsr _LVORead(a6)
  207.                move.l (a7)+,d3
  208.                tst.l d0
  209.                beq erruneof
  210.                bmi rerr
  211.                sub.l d0,d4
  212.                bne.s l102
  213.                bra.s lll
  214. l11            cmpi.l #1001,d0
  215.                beq.s l12
  216.                cmpi.l #1002,d0
  217.                bne.s l13
  218. l12            bsr readnext
  219.                bsr readd0a1
  220.                bra.s lll
  221. l13            cmpi.l #1003,d0
  222.                bne.s l14
  223.                bsr readnext
  224.                lsl.l #2,d0
  225.                bra.s l15
  226. l16            clr.b (a1)+
  227. l15            subq.l #1,d0
  228.                bcc.s l16
  229.                bra lll
  230. l14            cmpi.l #1004,d0
  231.                bne.s l17
  232.                move.l a3,d0
  233.                beq error
  234.                move.l d3,a0
  235.                move.l 16+4*11(a7),d4
  236. l20            bsr read
  237.                move.l d0,d1
  238.                beq lll
  239.                bsr read
  240.                lsl.l #2,d0
  241.                move.l 0(a2,d0.l),-(a7)
  242.                add.l d4,(a7)
  243.                bra.s l18
  244. l19            bsr read
  245.                lea 3(a3,d0.l),a0
  246.                lea 3(a7),a1
  247.                move.b (a1),d0
  248.                add.b d0,(a0)
  249.                addx.b -(a1),-(a0)
  250.                addx.b -(a1),-(a0)
  251.                addx.b -(a1),-(a0)
  252. l18            dbf d1,l19
  253.                addq.l #4,a7
  254.                bra.s l20
  255. l17            cmpi.l #1008,d0
  256.                bne l21
  257.                move.l a3,d0
  258.                beq error
  259. l28            jsr _clearl(pc)
  260.                move.b #'$',_st+1(a4)
  261.                move.b #':',_st+8(a4)
  262.                move.w #10,_sp(a4)
  263.                bsr read
  264.                move.l d0,d4
  265.                beq lll
  266.                bra.s l23
  267. l26            bsr read
  268.                moveq.l #3,d2
  269. l25            rol.l #8,d0
  270.                tst.b d0
  271.                beq.s l24
  272.                jsr app(pc)
  273. l24            dbf d2,l25
  274. l23            dbf d4,l26
  275.                bsr read
  276.                btst.l #1,d5
  277.                beq.s l28
  278.                add.l a3,d0
  279.                move.w _sp(a4),-(a7)
  280.                move.w #2,_sp(a4)
  281.                jsr @addax(pc)
  282.                move.w (a7)+,_sp(a4)
  283.                jsr _wril(pc)
  284. lw             btst.b #2,_qual+1(a4)
  285.                bne.s lw
  286.                jsr _wric(pc)
  287. l27            bra.s l28
  288. l21            move.l d0,-(a7)
  289.                clr.w _sp(a4)
  290.                lea sinvhunk(a4),a0
  291.                jsr @adds(pc)
  292.                move.l (a7)+,d0
  293.                jsr @addd(pc)
  294.                jsr _wrilc(pc)
  295.                bra.s fin
  296. theend         movem.l d1/d3,-(a7)
  297.                move.l d7,d1
  298.                move.l a7,d2
  299.                moveq.l #1,d3
  300.                jsr _LVORead(a6)
  301.                movem.l (a7)+,d1/d3
  302.                tst.l d0
  303.                bmi.s rerr
  304.                beq.s fin
  305.                lea stoolong(a4),a0
  306.                bra.s errout
  307. fin            bsr free
  308.                move.l d7,d1
  309.                jsr _LVOClose(a6)
  310. fin1           move.l d3,a7
  311.                movem.l (a7)+,d2-d7/a2-a6
  312.                rts
  313.  
  314. adent          subq.l #1,d2
  315.                bcs.s error
  316.                move.l d0,(a5)+
  317.                addq.l #1,d4
  318.                rts
  319. error          lea serror(a4),a0
  320. errout         jsr @pril(pc)
  321.                bra.s fin
  322.  
  323. rerr           lea srerr(a4),a0
  324.                bra.s errout
  325.  
  326. readnext       tst.l d6
  327.                bmi error
  328.                subq.l #1,d6
  329.                move.l (a5)+,a1
  330.                move.l a1,a3
  331.                btst.l #0,d5
  332.                beq.s read
  333.                move.l (a5),d0
  334.                beq.s llx1
  335.                lsr.l #2,d0
  336.                subq.l #1,d0
  337. llx1           move.l d0,-4(a1)
  338. read           movem.l d0/a1,-(a7)
  339.                move.l a7,a1
  340.                moveq.l #1,d0
  341.                bsr.s readd0a1
  342.                movem.l (a7)+,d0/a1
  343.                rts
  344.  
  345. readd0a1       lsl.l #2,d0
  346.                beq.s noth
  347.                movem.l d0-d2/d4/d5/a0,-(a7)
  348.                move.l a1,d4
  349.                move.l d0,d5
  350. rrl            move.l d4,d2
  351.                move.l d7,d1
  352.                move.l d3,-(a7)
  353.                move.l d5,d3
  354.                jsr _LVORead(a6)
  355.                move.l (a7)+,d3
  356.                tst.l d0
  357.                beq.s erruneof
  358.                bmi.s rerr
  359.                add.l d0,d4
  360.                sub.l d0,d5
  361.                bne.s rrl
  362.                move.l d4,a1
  363.                movem.l (a7)+,d0-d2/d4/d5/a0
  364. noth           rts
  365. erruneof       lea suneof(a4),a0
  366.                bra.s errout
  367.  
  368. alloc          addq.l #2,d0
  369.                lsl.l #2,d0
  370.                move.l d0,-(a7)
  371.                move.l #$10001,d1
  372.                move.l a6,-(a7)
  373.                move.l AbsExecBase.w,a6
  374.                jsr _LVOAllocMem(a6)
  375.                move.l (a7)+,a6
  376.                move.l d0,a2
  377.                tst.l d0
  378.                beq.s errnomem
  379.                move.l (a7)+,(a2)+
  380.                rts
  381. errnomem       lea snomem(a4),a0
  382.                bra errout
  383.  
  384. free           move.l a2,d0
  385.                beq.s freer
  386.                move.l a2,a1
  387.                move.l -(a1),d0
  388.                move.l a6,-(a7)
  389.                move.l AbsExecBase.w,a6
  390.                jsr _LVOFreeMem(a6)
  391.                move.l (a7)+,a6
  392.                sub.l a2,a2
  393. freer          rts
  394.  
  395.                csect data,1
  396.  
  397. serror         dc.b 'object module corrupt',0
  398. srerr          dc.b 'read error',0
  399. suneof         dc.b 'unexpected end of file',0
  400. snoobj         dc.b 'file is not an object module',0
  401. snotfound      dc.b 'file not found',0
  402. snomem         dc.b 'out of memory',0
  403. sinvhunk       dc.b 'invalid hunk type: ',0
  404. stoolong       dc.b 'warning: file is too long',0
  405.  
  406. ls1            dc.b ' ($',0
  407. ls2            dc.b ' - $',0
  408.  
  409.                end
  410.  
  411.