home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d9xx / d903 / mice.lha / MICE / Brushes / ADonBi < prev    next >
Text File  |  1993-08-26  |  17KB  |  1,134 lines

  1. upgadget:        * attend l'addresse du gadget en a0
  2.  
  3.     movea.l    a0,a3
  4.  
  5.     andi.w    #SELECTED,gg_Flags(a0)
  6.     movea.l    MiceHandle,a1
  7.     suba.l    a2,a2    
  8.     moveq    #1,d0
  9.     CALLINT        RefreshGList
  10.  
  11.     movea.l    a3,a0
  12.  
  13.     andi.w    #~SELECTED,gg_Flags(a0)
  14.     movea.l    MiceHandle,a1
  15.     suba.l    a2,a2    
  16.     moveq    #1,d0
  17.     CALLINT        RefreshGList
  18.  
  19.     rts
  20.  
  21.  
  22. ItoA:            * convert integer to ascii. attend la valeur en d0
  23.             * return :
  24.             * a0 : codes ascii
  25.             * d6 : rang a/c a0 du 1° ascii non nul (<>$30)
  26.  
  27.     lea    ItoA_Result,a0        chaine à ecrire en a0.
  28.     lea    ItoA_Offs,a1        table des 10^n à oter de d0.
  29.     moveq    #3,d1            compteur : 4 valeurs
  30.  
  31. .rang    move.w    (a1)+,d3
  32.     moveq    #$D0,d2            d2=-$30 
  33. .soust    sub.w    d3,d0            on soustrait 10^n de d0 jusquà ce
  34.     dbmi    d2,.soust        que le result soit negatif.
  35.     neg.b    d2            puis représentatn >0 de l' ascii
  36.     move.b    d2,(a0)+        qu'on stocke.
  37.     add.w    d3,d0            on a fait une soust de trop.
  38.     dbra    d1,.rang        exit qd on a les 4 chiffres
  39.  
  40.     rts
  41.  
  42.  
  43. ascii:        * range les valeurs exprimes en ascii a l'addr en a0
  44.             * et leur longueur a l'addr en a1
  45.  
  46.     lea    ItoA_Result,a2
  47.     clr.l    d0
  48.  
  49. 1$    cmpi.b    #$30,(a2,d0)
  50.     bne    2$
  51.     addq    #1,d0
  52.     bra    1$
  53.  
  54. 2$    move.w    d0,d5
  55.     neg.w    d5
  56.     addq.w    #4,d5
  57.     move.w    d5,(a1)
  58.     subq.w    #1,d5
  59.  
  60. 3$    move.b    (a2,d0.w),(a0)+
  61.     addq.w    #1,d0
  62.     dbra    d5,3$
  63.  
  64.     rts
  65.  
  66.  
  67. get_wh_ascii:
  68.  
  69.     move.w    PicWidth,d0
  70.     bsr    ItoA
  71.  
  72.     lea    AscPicWidth,a0
  73.     lea    AscPicWidthLength,a1
  74.     bsr    ascii
  75.  
  76.     move.w    PicHeight,d0
  77.     bsr    ItoA
  78.  
  79.     lea    AscPicHeight,a0
  80.     lea    AscPicHeightLength,a1
  81.     bsr    ascii
  82.  
  83.     rts
  84.  
  85.  
  86. test_1st_chr:        * attend filename en a1
  87.  
  88.     cmpi.b    #'A',(a1)
  89.     bmi    bad_1st_chr
  90.  
  91.     cmpi.b    #'z',(a1)
  92.     bpl    bad_1st_chr
  93.  
  94.     cmpi.b    #'[',(a1)
  95.     beq    bad_1st_chr
  96.  
  97.     cmpi.b    #'\',(a1)
  98.     beq    bad_1st_chr
  99.  
  100.     cmpi.b    #']',(a1)
  101.     beq    bad_1st_chr
  102.  
  103.     cmpi.b    #'^',(a1)
  104.     beq    bad_1st_chr
  105.  
  106.     cmpi.b    #'`',(a1)
  107.     beq    bad_1st_chr
  108.  
  109.     rts
  110.  
  111.  
  112. bad_1st_chr:
  113.  
  114.     tst.l    mrq_ExtendedSelect
  115.     beq    25$
  116.  
  117.     move.w    #1,es_Pad(a5)
  118.  
  119.     lea    File,a0
  120.  
  121.     bsr    copy_string
  122.  
  123. 25$    lea    File,a1
  124.     lea    Error_14,a0
  125. 30$    cmpi.b    #0,(a1)
  126.     beq    35$
  127.     move.b    (a1)+,(a0)+
  128.     bra    30$
  129. 35$    move.b    #39,(a0)+        #39 = chr '
  130.     move.b    #' ',(a0)+
  131.     move.b    #':',(a0)+
  132.     lea    Error_17,a1
  133.     move.w    #Error_17_Length-1,d5
  134. 40$    move.b    (a1)+,(a0)+
  135.     dbra    d5,40$
  136.     move.b    #0,(a0)
  137.  
  138.     move.l    #Error_10,mtr_Text
  139.     move.l    #ok,mtr_MiddleText
  140.  
  141.     lea    MiceTRStructure,a0
  142.     CALLREQ        TextRequest
  143.  
  144.     bset    #MBADFIRSTCHRB,d7
  145.  
  146.     clr.l    mtr_MiddleText
  147.  
  148.     rts
  149.  
  150.  
  151. copy_FileName:
  152.  
  153.     lea    File,a3            filename
  154.     cmpi.b    #'a',(a3)        commence par une majuscule ?
  155.     bmi    7$
  156.     cmpi.b    #'z',(a3)
  157.     bpl    7$
  158.     subi.b    #$20,(a3)
  159. 7$    move.w    FileNameLength,d5
  160.     subi.w    #1,d5
  161. 10$    move.b    (a3)+,(a4)+
  162.     dbra    d5,10$
  163.  
  164.     rts
  165.  
  166.  
  167. copy_to_PathName:
  168.  
  169.     lea    PathName,a0
  170.     lea    Dir,a1
  171.  
  172. 5$    cmpi.b    #0,(a1)
  173.     beq    10$
  174.     move.b    (a1)+,(a0)+
  175.     bra    5$
  176.  
  177. 10$    move.b    #'/',(a0)+
  178.  
  179.     movea.l    a5,a1
  180.     adda.l    #es_SIZEOF,a1
  181.  
  182. 15$    cmpi.b    #0,(a1)
  183.     beq    20$
  184.     move.b    (a1)+,(a0)+
  185.     bra    15$
  186.  
  187. 20$    move.b    #0,(a0)
  188.  
  189.     rts
  190.  
  191.  
  192. copy_to_File:
  193.  
  194.     movea.l    a5,a1
  195.     adda.l    #es_SIZEOF,a1
  196.  
  197.     lea    File,a0            copy filename to File for coding
  198.  
  199. copy_string:
  200.  
  201. 15$    cmpi.b    #0,(a1)
  202.     beq    20$
  203.     move.b    (a1)+,(a0)+
  204.     bra    15$
  205.  
  206. 20$    move.b    #0,(a0)
  207.  
  208.     rts
  209.  
  210.  
  211. chr_count:        *** calculage du nbre de lettres du fichier
  212. chr_count1:
  213.  
  214.     lea    File,a3
  215.     clr.l    d6
  216.  
  217. chr    addq.w    #1,d6
  218.  
  219.     cmpi.b    #'0',(a3,d6)
  220.     bmi    end_chr
  221.  
  222.     cmpi.b    #'z',(a3,d6)
  223.     bpl    end_chr
  224.  
  225.     cmpi.b    #':',(a3,d6)
  226.     beq    end_chr
  227.  
  228.     cmpi.b    #';',(a3,d6)
  229.     beq    end_chr
  230.  
  231.     cmpi.b    #'<',(a3,d6)
  232.     beq    end_chr
  233.  
  234.     cmpi.b    #'=',(a3,d6)
  235.     beq    end_chr
  236.  
  237.     cmpi.b    #'>',(a3,d6)
  238.     beq    end_chr
  239.  
  240.     cmpi.b    #'?',(a3,d6)
  241.     beq    end_chr
  242.  
  243.     cmpi.b    #'@',(a3,d6)
  244.     beq    end_chr
  245.  
  246.     cmpi.b    #'[',(a3,d6)
  247.     beq    end_chr
  248.  
  249.     cmpi.b    #'\',(a3,d6)
  250.     beq    end_chr
  251.  
  252.     cmpi.b    #']',(a3,d6)
  253.     beq    end_chr
  254.  
  255.     cmpi.b    #'^',(a3,d6)
  256.     beq    end_chr
  257.  
  258.     cmpi.b    #'`',(a3,d6)
  259.     beq    end_chr
  260.  
  261.     bra    chr
  262.  
  263.  
  264. end_chr    move.w    d6,FileNameLength
  265.  
  266.     rts
  267.  
  268.  
  269. test_IFF:
  270.  
  271.     move.l    #PathName,d1            filename en d1
  272.     moveq    #ACCESS_READ,d2            acces lecture
  273.     CALLDOS        Lock            on obtient le lock
  274.     move.l    d0,Lock
  275.     bne    5$
  276.  
  277.     bsr    no_open_file
  278.  
  279.     rts
  280.  
  281. 5$    move.l    #PathName,d1            ouverture fichier a charger
  282.     move.l    #MODE_OLDFILE,d2
  283.     CALLDOS        Open
  284.     move.l    d0,IFFFileHandle
  285.     bne    10$
  286.  
  287.     bsr    no_open_file
  288.  
  289.     bra    55$                libere le lock
  290.  
  291. 10$    move.l    IFFFileHandle,d1        filehandle en d1
  292.     move.l    #TestFile,d2            la ou il doit etre ecrit
  293.     moveq    #12,d3                nb octets a ecrire
  294.     CALLDOS        Read
  295.  
  296.     lea    TestFile,a0
  297.  
  298.     cmpi.l    #'FORM',(a0)
  299.     beq    40$
  300.  
  301.     bsr    no_IFF
  302.  
  303.     bra    50$
  304.  
  305. 40$    cmpi.l    #'ILBM',8(a0)
  306.     beq    50$
  307.  
  308.     bsr    no_ILBM
  309.  
  310. 50$    move.l    IFFFileHandle,d1        filehandle en d1
  311.     CALLDOS        Close            cloture
  312.  
  313. 55$    move.l    Lock,d1                liberation du lock
  314.     CALLDOS    UnLock
  315.  
  316.     rts
  317.  
  318.  
  319. open_IFF:        * ouvrage du fichier iff
  320.  
  321.     move.l    #fib_SIZEOF,d0            mem pr FileInfoBlock
  322.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  323.     CALLEXEC    AllocMem
  324.     move.l    d0,FIB
  325.     bne    3$
  326.  
  327.     bsr    no_open_file
  328.  
  329.     rts
  330.  
  331. 3$    move.l    #PathName,d1            filename en d1
  332.     moveq    #ACCESS_READ,d2            acces lecture
  333.     CALLDOS        Lock            on obtient le lock
  334.     move.l    d0,Lock
  335.     bne    5$
  336.  
  337.     bsr    no_open_file
  338.  
  339.     bra    20$
  340.  
  341. 5$    move.l    Lock,d1                lock en d1
  342.     move.l    FIB,d2                FIB en d2
  343.     CALLDOS        Examine
  344.  
  345.     movea.l    FIB,a0
  346.     move.l    fib_Size(a0),IFFSize        taille IFFFile en IFFSize
  347.  
  348.     move.l    IFFSize,d0            mem pour fichier a charger
  349.     moveq    #MEMF_PUBLIC,d1
  350.     CALLEXEC    AllocMem
  351.     move.l    d0,IFFFile            adresse en IFFFile
  352.     bne    7$
  353.  
  354.     bsr    no_open_file
  355.  
  356.     bra    15$
  357.  
  358. 7$    move.l    #PathName,d1            ouverture fichier a charger
  359.     move.l    #MODE_OLDFILE,d2
  360.     CALLDOS        Open
  361.     move.l    d0,IFFFileHandle        ***    filehandle en d5
  362.     bne    10$
  363.  
  364.     bsr    no_open_file
  365.  
  366.     bra    15$
  367.  
  368. 10$    move.l    IFFFileHandle,d1        filehandle en d1
  369.     move.l    IFFFile,d2            la ou il doit etre ecrit
  370.     move.l    IFFSize,d3            nb octets a ecrire
  371.     CALLDOS        Read
  372.  
  373.     move.l    IFFFileHandle,d1        filehandle en d1
  374.     CALLDOS        Close            cloture
  375.  
  376. 15$    move.l    Lock,d1                liberation du lock
  377.     CALLDOS    UnLock
  378.  
  379. 20$    movea.l    FIB,a1                liberation mem FIB
  380.     move.l    #fib_SIZEOF,d0
  381.     CALLEXEC    FreeMem
  382.  
  383.     rts
  384.  
  385.  
  386. getCHUNKS:        * obtenage des chunks BODY, BMHD, CMAP, DEST
  387.  
  388.     move.l    a4,-(sp)
  389.  
  390.     movea.l    IFFFile,a5
  391.     movea.l    a5,a4
  392.     adda.l    IFFSize,a4        fin IFF en a4.
  393.     adda.l    #12,a5            apres 'FORM XXXX ILBM'.
  394.  
  395.  
  396. 0$    cmpi.l    #'BODY',(a5)        cherchage du BODY
  397.     beq    10$
  398.  
  399.     adda.l    #2,a5            recherche aux addr paires.
  400.     cmpa.l    a5,a4            fin IFF ?
  401.     bge    0$
  402.  
  403.     bsr    no_BODY
  404.  
  405.     bra    70$
  406.  
  407. 10$    adda.l    #8,a5
  408.     move.l    a5,_BODY
  409.     movea.l    a5,a4            fin des chunks en a4
  410.  
  411.  
  412.     movea.l    IFFFile,a5
  413.     adda.l    #12,a5            apres 'FORM XXXX ILBM'.
  414.  
  415. 20$    cmpi.l    #'BMHD',(a5)        cherchage du BMHD
  416.     beq    30$
  417.  
  418.     adda.l    #2,a5
  419.     cmpa.l    a5,a4
  420.     bge    20$
  421.  
  422.     bsr    no_BMHD
  423.  
  424.     bra    70$
  425.  
  426. 30$    adda.l    #8,a5
  427.     move.l    a5,_BMHD
  428.     move.w    bmhd_Width(a5),PicWidth
  429.     move.w    bmhd_Height(a5),PicHeight
  430.     move.b    bmhd_nPlanes(a5),PicDepth
  431.     move.b    bmhd_Compression(a5),Compress
  432.  
  433.     move.w    bmhd_Width(a5),d6
  434.     addi.w    #15,d6
  435.     lsr.w    #4,d6            (w+15)/16=nbre de mots/ligne
  436.     move.w    d6,WordsPerLine
  437.  
  438.  
  439.     movea.l    IFFFile,a5
  440.     adda.l    #12,a5            apres 'FORM XXXX ILBM'.
  441.  
  442. 40$    cmpi.l    #'CMAP',(a5)        cherchage du CMAP
  443.     beq    50$
  444.  
  445.     adda.l    #2,a5
  446.     cmpa.l    a5,a4
  447.     bge    40$
  448.  
  449.     bset    #MNOCMAPB,d7
  450.     bra    55$
  451.  
  452. 50$    adda.l    #4,a5            mot long juste après 'CMAP'
  453.     move.l    a5,_CMAP        pour nbre de couleurs
  454.  
  455.  
  456. 55$    movea.l    IFFFile,a5
  457.     adda.l    #12,a5            apres 'FORM XXXX ILBM'.
  458.  
  459. 60$    cmpi.l    #'DEST',(a5)        cherchage du DEST
  460.     beq    65$
  461.  
  462.     adda.l    #2,a5
  463.     cmpa.l    a5,a4
  464.     bge    60$
  465.  
  466.     bra    70$
  467.  
  468. 65$    adda.l    #8,a5
  469.     move.l    a5,_DEST
  470.  
  471.  
  472. 70$    move.l    (sp)+,a4
  473.  
  474.     rts
  475.  
  476.  
  477. getplanepick:        *** definit le planepick d'une picture
  478.  
  479.     move.w    d4,-(sp)
  480.  
  481.     tst.l    _DEST
  482.     beq    10$
  483.  
  484.     movea.l    _DEST,a1
  485.     move.w    dest_planePick(a1),d2
  486.  
  487.     bra    79$
  488.  
  489. 10$    movea.l    _BODY,a1
  490.     clr.w    d0
  491.     move.b    PicDepth,d0
  492.     subq.w    #1,d0
  493.     clr.w    d5
  494. 15$    bset    d0,d5            d5 contiendra le planepick
  495.     dbra    d0,15$
  496.  
  497.  
  498.     tst.b    Compress
  499.     beq    71$
  500.  
  501.     bset    #MYETDECRUNCHEDB,d7
  502.  
  503.     bsr    byterun
  504.  
  505. 71$    movea.l    a1,a5            addr debut en a5 (body ou pseudrast)
  506.  
  507.     clr.l    d0
  508.     clr.l    d4            d4=cpteur de bitplanes
  509.     clr.w    d2            d2=cpteur de mots par ligne IFF
  510.     clr.w    d1            d1=cpteur de lignes
  511.  
  512.     move.b    PicDepth,d4
  513.     subq.b    #1,d4
  514.  
  515. 72$    move.w    PicHeight,d1
  516.     subq.w    #1,d1
  517.  
  518. 74$    move.w    WordsPerLine,d2
  519.     subq.w    #1,d2
  520.  
  521. 76$    lsl.w    #1,d2
  522.     tst.w    (a1,d2)
  523.     bne    78$
  524.     lsr.w    #1,d2
  525.  
  526.     dbra    d2,76$            cpteur de mots par ligne
  527.  
  528.     clr.w    d0
  529.     move.b    PicDepth,d0
  530.     mulu    WordsPerLine,d0
  531.     lsl.w    #1,d0
  532.     adda.w    d0,a1            on "saute" une ligne
  533.  
  534.     dbra    d1,74$            cpteur de lignes
  535.  
  536.     neg.w    d4            si il n'y a que des zeros
  537.     add.b    PicDepth,d4        on clear le bit correspondant
  538.     subq.b    #1,d4
  539.     bclr    d4,d5            a ce plan dans d5
  540.     addq.b    #1,d4
  541.     sub.b    PicDepth,d4
  542.     neg.w    d4
  543.  
  544. 78$    clr.w    d0
  545.     movea.l    a5,a1            restore addr debut (body ou dest)
  546.     move.b    PicDepth,d0
  547.     sub.b    d4,d0
  548.     mulu    WordsPerLine,d0
  549.     lsl.w    #1,d0
  550.     adda.l    d0,a1            on "saute" un bitplane
  551.  
  552.     dbra    d4,72$            cpteur de bitplanes
  553.  
  554.     move.b    d5,PlanePick
  555.  
  556. 79$    move.w    (sp)+,d4
  557.  
  558.     rts
  559.  
  560.  
  561. pickonoff:    *decode planePick & PlaneOnOff
  562.         * attend la valeur en d2
  563.  
  564.     move.w    d2,d0
  565.     lsr.w    #4,d0            XY -> 0X
  566.     cmpi.w    #$A,d0
  567.     blt    76$
  568.     addq.w    #$7,d0
  569. 76$    addi.w    #$30,d0
  570.     move.b    d0,(a4)+
  571.  
  572.     move.w    d2,d0
  573.     andi.w    #$000F,d0        XY -> 0Y
  574.     cmpi.w    #$A,d0
  575.     blt    77$
  576.     addq.w    #$7,d0
  577. 77$    addi.w    #$30,d0
  578.     move.b    d0,(a4)+
  579.  
  580.  
  581.     rts
  582.  
  583.  
  584. byterun:    * decode l'iff crunchee dans le pseudoraster
  585.  
  586.     move.w    d5,-(sp)
  587.  
  588. .crunch    clr.l    d0
  589.     move.b    PicDepth,d0
  590.     mulu    WordsPerLine,d0
  591.     lsl.w    #1,d0
  592.     mulu    PicHeight,d0        pseudo raster dest pour decrunch
  593.     move.l    d0,PseudoRasterLength
  594.     move.l    #MEMF_PUBLIC,d1
  595.     CALLEXEC    AllocMem    
  596.     move.l    d0,PseudoRaster
  597.     movea.l    d0,a2            pseudoraster en a2
  598.     movea.l    a2,a3
  599.     adda.l    PseudoRasterLength,a3        fin du pseudoraster en a3
  600.  
  601.     movea.l    _BODY,a1
  602.  
  603. .decr    clr.w    d6
  604.     clr.w    d5
  605.     move.b    (a1)+,d6
  606.     bge    .pos
  607.  
  608. .neg    cmpi.b    #$80,d6            d6=-128 ?
  609.     beq    .decr
  610.  
  611.     ext.w    d6
  612.     neg.w    d6
  613.     move.b    (a1)+,d5        d6<0 : on prend son oppose,
  614. 15$    move.b    d5,(a2)+        on copie n+1 fois l'octet
  615.     dbra    d6,15$            suivant dans la dest.
  616.  
  617.     cmpa.l    a2,a3            fin du pseudoraster ?
  618.     bgt    .decr
  619.  
  620.     bra    16$
  621.  
  622. .pos    move.b    (a1)+,(a2)+
  623.     dbra    d6,.pos
  624.  
  625.     cmpa.l    a2,a3            fin du pseudoraster ?
  626.     bgt    .decr
  627.  
  628. 16$    movea.l    PseudoRaster,a1
  629.  
  630.     move.w    (sp)+,d5
  631.  
  632.     rts
  633.  
  634.  
  635. decodeiff:
  636.  
  637.     movea.l    IFFFile,a5
  638.  
  639.     cmpi.l    #'FORM',(a5)+        verifier si IFF
  640. ;    bne    IFFerr
  641.  
  642.     move.l    (a5)+,d0
  643.     add.l    a5,d0
  644.     move.l    d0,FormEnd        sauver la taille du chunk form
  645.  
  646.     cmpi.l    #'ILBM',(a5)+        verifie si ILBM
  647. ;    bne    IFFerr
  648.  
  649.  
  650. do    move.l    (a5)+,d7        on va etudier le FORM mot a mot
  651.     move.l    (a5)+,d6
  652.  
  653.  
  654. cBMHD    cmpi.l    #'BMHD',d7
  655.     bne    cCMAP
  656.  
  657.     clr.l    d0
  658.     move.w    bmhd_Width(a5),d0
  659.     addi.w    #15,d0
  660.     divu    #16,d0
  661.     andi.l    #$0000FFFF,d0
  662.     mulu    #16,d0
  663.     move.w    d0,msc_W            initialise la struct
  664.     move.w    bmhd_Height(a5),msc_H        NewScreen
  665.     move.b    bmhd_nPlanes(a5),msc_D+1
  666.  
  667.     tst.b    bmhd_Compression(a5)    tst le bit de compression
  668.     sne    Compress        si =1, poser le flag compress
  669.  
  670.     bra    loop            et on va decompresser
  671.  
  672.  
  673. cCMAP    cmpi.l    #'CMAP',d7
  674.     bne    cCAMG
  675.  
  676.     move.w    d6,d7            longueur du chunk en d7
  677.     ext.l    d7        chaque coul ayant ses param RGB
  678.     divu    #3,d7        on div par 3 pr avoir le nb de coul
  679.  
  680.     cmpi.w    #32,d7
  681.     ble    coulok
  682.  
  683.     moveq    #32,d7
  684.  
  685. coulok    move.w    d7,ColorCount
  686.  
  687.     lea    Palette,a2
  688.     moveq    #0,d5
  689.     subq    #1,d7
  690.  
  691. coloop    move.b    (a5)+,d5        recopie la palette du fichier dans
  692.  
  693.     lsl.w    #4,d5            notre palette
  694.     or.b    (a5)+,d5
  695.  
  696.     lsl.w    #4,d5
  697.     or.b    (a5)+,d5
  698.  
  699.     lsr.w    #4,d5
  700.     move.w    d5,(a2)+
  701.  
  702.     dbra    d7,coloop
  703.  
  704.     moveq    #0,d6            annule d6
  705.  
  706.     bra    loop
  707.  
  708.  
  709. cCAMG    cmpi.l    #'CAMG',d7
  710.     bne    cBODY
  711.  
  712.     move.l    (a5),d0
  713.     andi.l    #CAMGMASK,d0
  714.     move.w    d0,msc_VM        ViewModes
  715.  
  716.     bra    loop
  717.  
  718.  
  719. cBODY    cmpi.l    #'BODY',d7
  720.     bne    loop
  721.  
  722.     lea    MiceScreenStructure,a0
  723.     CALLINT        OpenScreen
  724.     tst.l    d0
  725.     bne    1$
  726.  
  727.     bsr    no_Screen
  728.  
  729.     rts
  730.  
  731. 1$    movea.l    d0,a4            screenhandle en a4
  732.  
  733.     move.l    d0,a0
  734.     lea    sc_ViewPort(a0),a0
  735.     lea    Palette,a1
  736.     move.w    ColorCount,d0
  737.     ext.l    d0
  738.     CALLGRAF    LoadRGB4    chargement palette
  739.  
  740.     move.w    msc_W,d5        largeur ecran en d5
  741.     lsr.w    #3,d5            /8 pour avoir en octet
  742.  
  743.     moveq    #0,d0            d0 compteur de lignes
  744.  
  745. lignes    move.l    a4,a3
  746.     lea    sc_BitMap+bm_Planes(a3),a3    adr bitplanes en a3
  747.     move.w    msc_D,d1
  748.     subq.w    #1,d1                depth-1 en d1
  749.  
  750. planes    move.l    (a3)+,a0        plan de bit en a0
  751.     move.w    d0,d2            d0 compteur de lignes
  752.     mulu    d5,d2            octet/ligne * n°ligne
  753.     lea    (a0,d2.l),a0        adr de la ligne en a0
  754.     moveq    #0,d2
  755.     tst.b    Compress
  756.     beq    normal
  757.  
  758. comp    moveq    #0,d3
  759.     move.b    (a5)+,d3        octet suivant en d3
  760.     bmi    crunch            si<0, compression
  761.  
  762.     ext.w    d3            extension du signe +
  763.     add.w    d3,d2
  764.     addq.w    #1,d2            rang de l'octet sur la ligne
  765.  
  766. compl    move.b    (a5)+,(a0)+        on copie n+1 octet
  767.     dbra    d3,compl
  768.  
  769.     bra    nextbyte
  770.  
  771. crunch    cmpi.b    #$80,d3            n=-128 ?
  772.     beq    nextbyte
  773.  
  774.     neg.b    d3            on met d3 positif
  775.     ext.w    d3            etend son signe +
  776.     add.w    d3,d2
  777.     addq.w    #1,d2            rang sur la ligne
  778.     move.b    (a5)+,d4        on met l'octet concerne en d4
  779.  
  780. crunchl    move.b    d4,(a0)+        et on le copie 'd3' fois
  781.     dbra    d3,crunchl
  782.  
  783. nextbyte
  784.     cmp.w    d5,d2            est on a la fin de la ligne
  785.     blt    comp            (longueur en d5)
  786.  
  787.     bra    nextl
  788.  
  789. normal    move.w    d5,d4            si non compresse, longueur ligne
  790.     subq.w    #1,d4            en d4
  791.  
  792. nloop    move.b    (a5)+,(a0)+        et copier les octets
  793.     dbra    d4,nloop
  794.  
  795. nextl    dbra    d1,planes        meme operation plan par plan
  796.  
  797.     addq.w    #1,d0            incremente le compteur de lignes
  798.     cmp.w    msc_H,d0        compare avec largeur ecran
  799.     blt    lignes
  800.  
  801.     moveq    #0,d6
  802.  
  803. loop    adda.l    d6,a5            ajoute la longeur du chunk
  804.     move.l    a5,d6            au "iffpc"
  805.     andi.b    #1,d6
  806.     beq    pair
  807.     addq.l    #1,a5            rendre pair si besoin
  808.  
  809. pair    cmpa.l    FormEnd,a5        fin de "FORM" ?
  810.     blt    do
  811.  
  812.     rts
  813.  
  814.  
  815. endiff:            * attend 1 click, libere IFFFile, ferme l'ecran
  816.  
  817. 1$    CALLGRAF    WaitTOF
  818.  
  819.     btst    #6,$BFE001
  820.     bne    1$
  821.  
  822.     movea.l    a4,a0
  823.     CALLINT        CloseScreen
  824.  
  825. endiff1
  826.  
  827.     movea.l    IFFFile,a1
  828.     move.l    IFFSize,d0
  829.     CALLEXEC    FreeMem
  830.  
  831.     rts
  832.  
  833.  
  834. free_PseudoRaster:
  835.  
  836.     tst.l    PseudoRaster
  837.     beq    1$
  838.  
  839.     movea.l    PseudoRaster,a1
  840.     move.l    PseudoRasterLength,d0
  841.     CALLEXEC    FreeMem
  842.     clr.l    PseudoRaster
  843.  
  844.  
  845. 1$    rts
  846.  
  847.  
  848. dcb:
  849.  
  850.     lea    dcbPattern,a3        "dc.b..."
  851.     move.w    #dcbPatternLength-1,d5
  852. 0$    move.b    (a3)+,(a4)+
  853.     dbra    d5,0$
  854.  
  855.     rts
  856.  
  857.  
  858. dcw:
  859.  
  860.     lea    dcwPattern,a3        "dc.w..."
  861.     move.w    #dcwPatternLength-1,d5
  862. 0$    move.b    (a3)+,(a4)+
  863.     dbra    d5,0$
  864.  
  865.     rts
  866.  
  867.  
  868. write_close_free:
  869.  
  870.     move.l    SourceCodeHandle,d1
  871.     move.l    SourceFile,d2
  872.     move.l    ReqMem,d3
  873.     CALLDOS        Write
  874.  
  875.     move.l    SourceCodeHandle,d1
  876.     CALLDOS        Close
  877.  
  878.     move.l    ReqMem,d0
  879.     movea.l    SourceFile,a1
  880.     CALLEXEC    FreeMem
  881.  
  882.     rts
  883.  
  884.  
  885. dcl:
  886.  
  887.     lea    dclPattern,a3        "dc.l..."
  888.     move.w    #dclPatternLength-1,d5
  889. 0$    move.b    (a3)+,(a4)+
  890.     dbra    d5,0$
  891.  
  892.     rts
  893.  
  894.  
  895. alloc_ReqMem:
  896.  
  897.     move.l    ReqMem,d0
  898.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  899.     CALLEXEC    AllocMem
  900.     move.l    d0,SourceFile
  901.  
  902.     rts
  903.  
  904.  
  905. init_loop_1f:
  906.  
  907.     movea.l    IFFFiles,a5
  908.     move.l    a5,IFFFilePtr
  909.     move.l    (a5),IFFFile
  910.     movea.l    IFFSizes,a5
  911.     move.l    a5,IFFSizePtr
  912.     move.l    (a5),IFFSize
  913.     movea.l    ListOfFNLength,a5
  914.     move.l    a5,FNLengthPtr
  915.     move.w    (a5),FileNameLength
  916.  
  917.     rts
  918.  
  919.  
  920. inc_loop_1f:
  921.  
  922.     movea.l    IFFFilePtr,a5
  923.     addq.l    #4,a5
  924.     move.l    a5,IFFFilePtr
  925.     move.l    (a5),IFFFile
  926.     movea.l    IFFSizePtr,a5
  927.     addq.l    #4,a5
  928.     move.l    a5,IFFSizePtr
  929.     move.l    (a5),IFFSize
  930.     movea.l    FNLengthPtr,a5
  931.     addq.l    #2,a5
  932.     move.l    a5,FNLengthPtr
  933.     move.w    (a5),FileNameLength
  934.  
  935.     rts
  936.  
  937.  
  938. save_code:
  939.  
  940.     bsr    free_PseudoRaster
  941.  
  942.     move.l    #SourceCodeName,d1
  943.     move.l    #MODE_NEWFILE,d2
  944.     CALLDOS        Open
  945.     move.l    d0,SourceCodeHandle
  946.  
  947.     bsr    write_close_free
  948.  
  949.     rts
  950.  
  951.  
  952. seek_code:
  953.  
  954.     bsr    free_PseudoRaster
  955.  
  956.     move.l    #SourceCodeName,d1
  957.     move.l    #MODE_OLDFILE,d2
  958.     CALLDOS        Open
  959.     move.l    d0,SourceCodeHandle
  960.  
  961.     move.l    d0,d1
  962.     clr.l    d2
  963.     moveq    #OFFSET_END,d3
  964.     CALLDOS        Seek
  965.  
  966.     bsr    write_close_free
  967.  
  968.     rts
  969.  
  970.  
  971. no_open_file:
  972.  
  973. 25$    lea    File,a1
  974.     lea    Error_24,a0
  975. 30$    cmpi.b    #0,(a1)
  976.     beq    35$
  977.     move.b    (a1)+,(a0)+
  978.     bra    30$
  979. 35$    move.b    #39,(a0)+        #39 = chr '
  980.     move.b    #0,(a0)
  981.  
  982.     move.l    #Error_20,mtr_Text
  983.     move.l    #ok,mtr_MiddleText
  984.  
  985.     lea    MiceTRStructure,a0
  986.     CALLREQ        TextRequest
  987.  
  988.     bset    #MNOLOADB,d7
  989.  
  990.     clr.l    mtr_MiddleText
  991.  
  992.     rts
  993.  
  994.  
  995. no_IFF:
  996.  
  997. 25$    lea    File,a1
  998.     lea    Error_34,a0
  999. 30$    cmpi.b    #0,(a1)
  1000.     beq    35$
  1001.     move.b    (a1)+,(a0)+
  1002.     bra    30$
  1003. 35$    move.b    #39,(a0)+        #39 = chr '
  1004.     lea    Error_37,a1
  1005.     move.w    #Error_37_Length-1,d5
  1006. 40$    move.b    (a1)+,(a0)+
  1007.     dbra    d5,40$
  1008.     move.b    #0,(a0)
  1009.  
  1010.     move.l    #Error_30,mtr_Text
  1011.     move.l    #ok,mtr_MiddleText
  1012.  
  1013.     lea    MiceTRStructure,a0
  1014.     CALLREQ        TextRequest
  1015.  
  1016.     bset    #MNOIFFB,d7
  1017.  
  1018.     clr.l    mtr_MiddleText
  1019.  
  1020.     rts
  1021.  
  1022.  
  1023. no_ILBM:
  1024.  
  1025. 25$    lea    File,a1
  1026.     lea    Error_44,a0
  1027. 30$    cmpi.b    #0,(a1)
  1028.     beq    35$
  1029.     move.b    (a1)+,(a0)+
  1030.     bra    30$
  1031. 35$    move.b    #39,(a0)+        #39 = chr '
  1032.     lea    Error_47,a1
  1033.     move.w    #Error_47_Length-1,d5
  1034. 40$    move.b    (a1)+,(a0)+
  1035.     dbra    d5,40$
  1036.     move.b    #0,(a0)
  1037.  
  1038.     move.l    #Error_40,mtr_Text
  1039.     move.l    #ok,mtr_MiddleText
  1040.  
  1041.     lea    MiceTRStructure,a0
  1042.     CALLREQ        TextRequest
  1043.  
  1044.     bset    #MNOILBMB,d7
  1045.  
  1046.     clr.l    mtr_MiddleText
  1047.  
  1048.     rts
  1049.  
  1050.  
  1051. no_BODY:
  1052.  
  1053. 25$    lea    File,a1
  1054.     lea    Error_54,a0
  1055. 30$    cmpi.b    #0,(a1)
  1056.     beq    35$
  1057.     move.b    (a1)+,(a0)+
  1058.     bra    30$
  1059. 35$    move.b    #39,(a0)+        #39 = chr '
  1060.     move.b    #0,(a0)
  1061.  
  1062.     move.l    #Error_50,mtr_Text
  1063.     move.l    #ok,mtr_MiddleText
  1064.  
  1065.     lea    MiceTRStructure,a0
  1066.     CALLREQ        TextRequest
  1067.  
  1068.     bset    #MNOBODYB,d7
  1069.  
  1070.     clr.l    mtr_MiddleText
  1071.  
  1072.     rts
  1073.  
  1074.  
  1075. no_BMHD:
  1076.  
  1077. 25$    lea    File,a1
  1078.     lea    Error_64,a0
  1079. 30$    cmpi.b    #0,(a1)
  1080.     beq    35$
  1081.     move.b    (a1)+,(a0)+
  1082.     bra    30$
  1083. 35$    move.b    #39,(a0)+        #39 = chr '
  1084.     move.b    #0,(a0)
  1085.  
  1086.     move.l    #Error_60,mtr_Text
  1087.     move.l    #ok,mtr_MiddleText
  1088.  
  1089.     lea    MiceTRStructure,a0
  1090.     CALLREQ        TextRequest
  1091.  
  1092.     bset    #MNOBMHDB,d7
  1093.  
  1094.     clr.l    mtr_MiddleText
  1095.  
  1096.     rts
  1097.  
  1098.  
  1099. no_CMAP:
  1100.  
  1101. 25$    lea    File,a1
  1102.     lea    Error_74,a0
  1103. 30$    cmpi.b    #0,(a1)
  1104.     beq    35$
  1105.     move.b    (a1)+,(a0)+
  1106.     bra    30$
  1107. 35$    move.b    #39,(a0)+        #39 = chr '
  1108.     move.b    #0,(a0)
  1109.  
  1110.     move.l    #Error_70,mtr_Text
  1111.     move.l    #ok,mtr_MiddleText
  1112.  
  1113.     lea    MiceTRStructure,a0
  1114.     CALLREQ        TextRequest
  1115.  
  1116.     clr.l    mtr_MiddleText
  1117.  
  1118.     rts
  1119.  
  1120.  
  1121. no_Screen:
  1122.  
  1123.     move.l    #Error_80,mtr_Text
  1124.     move.l    #ok,mtr_MiddleText
  1125.  
  1126.     lea    MiceTRStructure,a0
  1127.     CALLREQ        TextRequest
  1128.  
  1129.     bset    #MNOSCREENB,d7
  1130.  
  1131.     clr.l    mtr_MiddleText
  1132.  
  1133.     rts
  1134.