home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / gfx / conv / charmap / charmap.asm < prev    next >
Assembly Source File  |  1994-04-09  |  22KB  |  1,069 lines

  1. DEBUGBOOL    =    0    ; (TRUE = debugging)
  2.  
  3. ;;    *********************************************************
  4.     *    Programm:    CharMap V1.0            *
  5.     *            (converts single-plane ILBM-pic    *
  6.     *             into ASCII-File, optionally    *
  7.     *             using ESC[7m ANSI-Command    *
  8.     *    Copyright:    Freeware (C)opyright by Hanns    *
  9.     *            Holger Rutz            *
  10.     *    Date:        14.-16.01.1994            *
  11.     *            09.05.94 - fixed a usage "bug"    *
  12.     *    Assembler:    AsmOne V1.02            *
  13.     *********************************************************
  14.  
  15. ;;-- Includes ---------------------------------------------
  16.  
  17.         incdir    'work:pax/asm/inc/'
  18.         include    'dos/dosasl.i'
  19.         include    'dos/dosextens.i'
  20.         include    'exec/memory.i'
  21.         include    'graphics/displayinfo.i'
  22.         include    'graphics/text.i'
  23.         include    'intuition/intuition.i'
  24.         include    'libraries/iffparse.i'
  25.         include    'private/diskfont_lib.i'
  26.         include    'private/dos_lib.i'
  27.         include    'private/gfx_lib.i'
  28.         include    'private/iffparse_lib.i'
  29.         include    'private/intuition_lib.i'
  30.         include    'private/macros.i'
  31.  
  32. ;;-- Konstanten -------------------------------------------
  33.  
  34. cmpNone        =    0
  35. cmpByteRun1    =    1
  36.  
  37.     STRUCTURE BitMapHeader,0
  38.     UWORD     bmh_Width;        ; Width in pixels
  39.     UWORD     bmh_Height        ; Height in pixels
  40.     WORD     bmh_Left        ; Left position
  41.     WORD     bmh_Top        ; Top position
  42.     UBYTE     bmh_Depth        ; Number of planes
  43.     UBYTE     bmh_Masking        ; Masking type
  44.     UBYTE     bmh_Compression    ; Compression type
  45.     UBYTE     bmh_Pad
  46.     UWORD     bmh_Transparent    ; Transparent color
  47.     UBYTE     bmh_XAspect
  48.     UBYTE     bmh_YAspect
  49.     WORD     bmh_PageWidth
  50.     WORD     bmh_PageHeight
  51.     LABEL BitMapHeader_SIZEOF
  52.  
  53. ID_ILBM        =    'ILBM'
  54. ID_BMHD        =    'BMHD'
  55. ID_BODY        =    'BODY'
  56. ID_CAMG        =    'CAMG'
  57.  
  58.         rsreset
  59. gl_LibBases    rs.b    0
  60. gl_DOSBase    rs.l    1
  61. gl_DiskFontBase    rs.l    1
  62. gl_GfxBase    rs.l    1
  63. gl_IFFParseBase    rs.l    1
  64. gl_IntuiBase    rs.l    1
  65. gl_PAD         rs.b    0
  66. NumLibs        =    (gl_PAD-gl_LibBases)/4
  67. gl_RDArgs    rs.l    1
  68. gl_ArgArray    rs.b    0
  69. gl_aFrom     rs.l    1
  70. gl_aTo         rs.l    1
  71. gl_aFont     rs.l    1
  72. gl_aSize     rs.l    1
  73. gl_aANSI     rs.l    1
  74. gl_ViewMode    rs.l    1
  75. gl_Image    rs.b    ig_SIZEOF
  76. gl_TextFont    rs.l    1
  77. gl_Screen    rs.l    1
  78. gl_Window    rs.l    1
  79. gl_OldWin    rs.l    1
  80. gl_RPort    rs.l    1
  81. gl_Process    rs.l    1
  82. gl_Result2    rs.l    1
  83. gl_Return    rs.b    1
  84.         rsword
  85. gl_SIZEOF    rs.b    0
  86.  
  87. ;;-- Code-Start -------------------------------------------
  88.  
  89.         section    Text,code
  90.  
  91. _Start
  92. _NextSeg    =    _Start-4
  93.         moveq.l    #gl_SIZEOF/2-1,d0
  94. .ClearLoop    clr.w    -(sp)
  95.         dbra    d0,.ClearLoop
  96.         movea.l    sp,gl
  97.         move.b    #RETURN_FAIL,gl_Return(gl)
  98.         exec    a0
  99.         move.l    ThisTask(a0),gl_Process(gl)
  100.  
  101.         bsr.w    _OpenLibs
  102.         beq.b    _CleanUp
  103.         IF DEBUGBOOL
  104.             move.l    #.DEBUGFROM,gl_aFrom(gl)
  105.             move.l    #.DEBUGTO,gl_aTo(gl)
  106.             move.l    #.DEBUGFONT,gl_aFont(gl)
  107.             move.l    #.DEBUGSIZE,gl_aSize(gl)
  108.             move.l    #.DEBUGANSI,gl_aANSI(gl)
  109.             bra.b    .DEBUGCONT
  110. .DEBUGFROM        dc.b    'Work:Gfx/Pix/Test',0
  111. .DEBUGTO        dc.b    'RAM:Test',0
  112. .DEBUGFONT        dc.b    'topaz.font',0
  113.             even
  114. .DEBUGSIZE        dc.l    8
  115. .DEBUGANSI        =    -1
  116. .DEBUGCONT
  117.         ELSE
  118.             bsr.w    _GetArgs
  119.             beq.b    _CleanUp
  120.         ENDC
  121.         bsr.w    _LoadILBM
  122.         beq.b    _CleanUp
  123.         bsr.w    _LoadFont
  124.         beq.b    _CleanUp
  125.  
  126. ;;-- Main stuff goin' on ----------------------------------
  127.  
  128. _Main        bsr.w    _OpenDisplay
  129.         beq.b    _CleanUp
  130.  
  131.         slib    Intui
  132.         movea.l    gl_Window(gl),a0
  133.         movea.l    _NextSeg(pc),a1
  134.         adda.l    a1,a1
  135.         adda.l    a1,a1
  136.         addq.l    #4,a1
  137.         moveq.l    #16,d0
  138.         moveq.l    #16,d1
  139.         moveq.l    #-6,d2
  140.         moveq.l    #0,d3
  141.         fjsr    SetPointer
  142.  
  143.         bsr.w    _CreateText
  144.         beq.b    _CleanUp
  145.         bgt.b    .Break
  146.  
  147.         clr.b    gl_Return(gl)
  148.         slib    Intui
  149.         movea.l    gl_Window(gl),a0
  150.         fjsr    ClearPointer
  151.         movea.l    gl_Window(gl),a0
  152.         movea.l    wd_UserPort(a0),a0
  153.         move.l    #SIGBREAKF_CTRL_C,d0
  154.         move.b    MP_SIGBIT(a0),d1
  155.         bset.l    d1,d0
  156.         exec
  157.         fjsr    Wait
  158.         bra.b    _CleanUp
  159.  
  160. .Break        move.b    #RETURN_WARN,gl_Return(gl)
  161.         ;||
  162. ;;-- Aufräumen --------------------------------------------
  163.  
  164. _CleanUp    bsr.w    _FreeAll
  165.         moveq.l    #0,d0
  166.         move.b    gl_Return(gl),d0
  167.         beq.b    .Quit
  168.         movea.l    gl_Process(gl),a0
  169.         move.l    gl_Result2(gl),pr_Result2(a0)
  170. .Quit        lea.l    gl_SIZEOF(sp),sp
  171.         rts
  172.  
  173.         dc.b    '$VER: CharMap 1.0 (16-Jan-94)',0
  174.         even
  175.  
  176. ;;-- Libraries öffnen -------------------------------------
  177. ;  Out: cc=eq, wenn Fehler
  178.  
  179. _OpenLibs    push    d0-d2/a0-a3/lb
  180.  
  181.         lea.l    gl_LibBases(gl),a2
  182.         moveq.l    #NumLibs,d2
  183.         lea.l    .LibNames(pc),a3
  184.         exec
  185. .Loop        subq.w    #1,d2
  186.         blt.b    .DoneIt
  187.         movea.l    a3,a1
  188.         moveq.l    #36,d0
  189.         fjsr    OpenLibrary
  190.         move.l    d0,(a2)+
  191.         beq.b    .Error
  192. .NextLoop    tst.b    (a3)+
  193.         bne.b    .NextLoop
  194.         bra.b    .Loop
  195.  
  196. .DoneIt        moveq.l    #-1,d0
  197. .Exit        pull    d0-d2/a0-a3/lb
  198.         rts
  199.  
  200. .Error        slib    DOS,d0
  201.         beq.b    .ErrCont
  202.         movea.l    d0,lb
  203.         lea.l    .ErrTxt(pc),a0
  204.         move.l    a0,d1
  205.         move.l    a3,-(sp)
  206.         move.l    sp,d2
  207.         fjsr    VPrintf
  208.         addq.l    #4,sp
  209. .ErrCont    moveq.l    #ERROR_INVALID_RESIDENT_LIBRARY,d0
  210.         move.l    d0,gl_Result2(gl)
  211.         clr.b    d0
  212.         bra.b    .Exit
  213.  
  214. .ErrTxt        dc.b    'Unable to open "%s" V36+!',$0A,0
  215. .LibNames    dc.b    'dos.library',0
  216.         dc.b    'diskfont.library',0
  217.         dc.b    'graphics.library',0
  218.         dc.b    'iffparse.library',0
  219.         dc.b    'intuition.library',0
  220.         even
  221.  
  222. ;;-- Alles freigeben --------------------------------------
  223.  
  224. _FreeAll    push    d0-d2/a0-a2/lb
  225.  
  226.         move.l    gl_Window(gl),d2
  227.         beq.b    .WindowCont
  228.         movea.l    gl_Process(gl),a0
  229.         move.l    gl_OldWin(gl),pr_WindowPtr(a0)
  230.         movea.l    d2,a0
  231.         slib    Intui
  232.         fjsr    ClearPointer
  233.         movea.l    d2,a0
  234.         fjsr    CloseWindow
  235. .WindowCont
  236.         move.l    gl_Screen(gl),d0
  237.         beq.b    .ScreenCont
  238.         movea.l    d0,a0
  239.         slib    Intui
  240.         fjsr    CloseScreen
  241. .ScreenCont
  242.         move.l    gl_TextFont(gl),d0
  243.         beq.b    .FontCont
  244.         movea.l    d0,a1
  245.         slib    Gfx
  246.         fjsr    CloseFont
  247. .FontCont
  248.         move.l    gl_Image+ig_ImageData(gl),d0
  249.         beq.b    .PlaneCont
  250.         movea.l    d0,a1
  251.         exec
  252.         fjsr    FreeVec
  253. .PlaneCont
  254.         move.l    gl_RDArgs(gl),d1
  255.         beq.b    .ArgsCont
  256.         slib    DOS
  257.         fjsr    FreeArgs
  258. .ArgsCont
  259.         moveq.l    #NumLibs,d2
  260.         lea.l    gl_LibBases(gl),a2
  261.         exec
  262. .LibLoop    subq.w    #1,d2
  263.         blt.b    .LibCont
  264.         move.l    (a2)+,d0
  265.         beq.b    .LibLoop
  266.         movea.l    d0,a1
  267.         fjsr    CloseLibrary
  268.         bra.b    .LibLoop
  269. .LibCont
  270.         pull    d0-d2/a0-a2/lb
  271.         rts
  272.  
  273. ;;-- Shell-Args readen ------------------------------------
  274. ;  Out: cc=eq, wenn Fehler
  275.  
  276. _GetArgs    push    d0-d3/a0-a2/lb
  277.  
  278.         lea.l    .FontName(pc),a0
  279.         move.l    a0,gl_aFont(gl)
  280.         lea.l    .FontSize(pc),a0
  281.         move.l    a0,gl_aSize(gl)
  282.  
  283.         slib    DOS
  284.         lea.l    .Template(pc),a0
  285.         move.l    a0,d1
  286.         lea.l    gl_ArgArray(gl),a0
  287.         move.l    a0,d2
  288.         moveq.l    #0,d3
  289.         fjsr    ReadArgs
  290.         move.l    d0,gl_RDArgs(gl)
  291.         beq.b    .Error
  292.  
  293. .Exit        pull    d0-d3/a0-a2/lb
  294.         rts
  295.  
  296. .Error        fjsr    IoErr
  297.         move.l    d0,gl_Result2(gl)
  298.         fjsr    Cli
  299.         movea.l    d0,a0
  300.         move.w    .FontSize+2(pc),-(sp)
  301.         pea.l    .FontName(pc)
  302.         move.l    cli_CommandName(a0),-(sp)
  303.         move.l    sp,d2
  304.         lea.l    .UsageTxt(pc),a0
  305.         move.l    a0,d1
  306.         fjsr    VPrintf
  307.         lea.l    10(sp),sp
  308.         clr.b    d0
  309.         bra.b    .Exit
  310.  
  311. .FontSize    dc.l    8
  312. .FontName    dc.b    'topaz.font',0
  313. .Template    dc.b    'FROM/A,TO/A,FONT,SIZE/K/N,ANSI/S',0
  314. .UsageTxt    dc.b    'Usage:  %b <ILBM> <Target> [<Font> SIZE <Height>] [AN'
  315.         dc.b    'SI]',$0A,$0A
  316.         dc.b    '        <ILBM>                Picturefile, must be IF'
  317.         dc.b    'F/ILBM with 2 colors.',$0A
  318.         dc.b    '        <Target>              Textfile that shall be '
  319.         dc.b    'created.',$0A
  320.         dc.b    '        <Font> SIZE <Height>  Fixed-width font to use'
  321.         dc.b    ', defaults to',$0A
  322.         dc.b    '                              "%s" (height %d).'
  323.         dc.b    $0A
  324.         dc.b    '        ANSI                  Allow CharMap to use AN'
  325.         dc.b    "SI's reverse command.",$0A,$0A,0
  326.         even
  327.  
  328. ;;-- ILBM-Bild laden ------------------------------------------------
  329. ;  Out: cc=eq, wenn Fehler
  330.  
  331. _LoadILBM    push    d0-d7/a0-a3/lb
  332.         clr.l    -(sp)
  333.         movea.l    sp,a3
  334.         ;moveq.l #0,d4
  335.         moveq.l    #0,d5
  336.     moveq.l    #0,d7
  337.  
  338.         slib    DOS
  339.         move.l    gl_aFrom(gl),d1
  340.         move.l    #MODE_OLDFILE,d2
  341.         fjsr    Open
  342.         move.l    d0,d4
  343.         beq.w    .DOSErr
  344.  
  345.         slib    IFFParse
  346.         fjsr    AllocIFF
  347.         move.l    d0,d5
  348.         beq.w    .IFFErr
  349.         movea.l    d5,a0
  350.         fjsr    InitIFFasDOS
  351.         movea.l    d5,a0
  352.         move.l    d4,iff_Stream(a0)
  353.         moveq.l    #IFFF_READ,d0
  354.         fjsr    OpenIFF
  355.         tst.l    d0
  356.         bne.w    .IFFErr
  357.     moveq.l    #1,d7
  358.  
  359.         movea.l    d5,a0
  360.         lea.l    .Chunx(pc),a1
  361.         moveq.l    #(.ChunkEnd-.Chunx)/8,d0
  362.         fjsr    PropChunks
  363.         tst.l    d0
  364.         bne.w    .IFFErr
  365.         movea.l    d5,a0
  366.         move.l    #ID_ILBM,d0
  367.         move.l    #ID_BODY,d1
  368.         fjsr    StopChunk
  369.         tst.l    d0
  370.         bne.w    .IFFErr
  371.         movea.l    d5,a0
  372.         moveq.l    #IFFPARSE_SCAN,d0
  373.         fjsr    ParseIFF
  374.         tst.l    d0
  375.         beq.b    .ParseOk
  376.         cmpi.l    #IFFERR_EOF,d0
  377.         bne.w    .IFFErr
  378. .ParseOk
  379.         movea.l    d5,a0
  380.         move.l    #ID_ILBM,d0
  381.         move.l    #ID_CAMG,d1
  382.         fjsr    FindProp
  383.         tst.l    d0
  384.         beq.b    .NoCAMG
  385.         movea.l    d0,a0
  386.         movea.l    spr_Data(a0),a0
  387.         move.l    (a0),gl_ViewMode(gl)
  388. .NoCAMG
  389.         movea.l    d5,a0
  390.         move.l    #ID_ILBM,d0
  391.         move.l    #ID_BMHD,d1
  392.         fjsr    FindProp
  393.         tst.l    d0
  394.         beq.w    .NoBMHD
  395.         movea.l    d0,a0
  396.         movea.l    spr_Data(a0),a0
  397.         cmpi.b    #1,bmh_Depth(a0)
  398.         bne.w    .WrongDepth
  399.         move.b    bmh_Compression(a0),d6
  400.         cmpi.b    #cmpByteRun1,d6
  401.         bhi.w    .UnknownComp
  402.         move.w    bmh_Width(a0),gl_Image+ig_Width(gl)
  403.         move.w    bmh_Height(a0),gl_Image+ig_Height(gl)
  404.  
  405.         exec
  406.         move.w    gl_Image+ig_Width(gl),d2
  407.         addi.w    #15,d2
  408.         lsr.w    #4,d2
  409.         add.w    d2,d2
  410.         mulu.w    gl_Image+ig_Height(gl),d2
  411.         move.l    d2,d0
  412.         moveq.l    #MEMF_CHIP,d1
  413.         fjsr    AllocVec
  414.         move.l    d0,gl_Image+ig_ImageData(gl)
  415.         beq.w    .NoPlane
  416.         movea.l    d0,a2
  417.  
  418.         slib    IFFParse
  419.         movea.l    d5,a0
  420.         fjsr    CurrentChunk
  421.         tst.l    d0
  422.         beq.w    .NoBODY
  423.         movea.l    d0,a0
  424.         cmpi.l    #ID_BODY,cn_ID(a0)
  425.         bne.w    .NoBODY
  426.         move.l    cn_Size(a0),d3
  427.         tst.b    d6
  428.         beq.w    .cmpNone
  429.  
  430. ; IF BIT7 SET, CRUNCH=ON  -> NUMBER =-BYTE+1
  431. ;     ELSE, CRUNCH=OFF -> NUMBER = BYTE+1
  432. .cmpByteRun1    tst.l    d3
  433.         beq.w    .BODYDone
  434.         movea.l    d5,a0
  435.         movea.l    a3,a1
  436.         moveq.l    #1,d0
  437.         fjsr    ReadChunkBytes
  438.         tst.l    d0
  439.         blt.w    .IFFErr
  440.         subq.l    #1,d0
  441.         bne.w    .InvalidBODY
  442.         moveq.l    #0,d0
  443.         move.b    (a3),d0
  444.         blt.b    .cmpBR1Pack
  445.         addq.l    #1,d0
  446.         subq.l    #1,d3
  447.         sub.l    d0,d3
  448.         blt.w    .InvalidBODY
  449.         sub.l    d0,d2
  450.         blt.w    .InvalidBODY
  451.         movea.l    d5,a0
  452.         movea.l    a2,a1
  453.         move.l    d0,-(sp)
  454.         fjsr    ReadChunkBytes
  455.         move.l    (sp)+,d1
  456.         tst.l    d0
  457.         blt.w    .IFFErr
  458.         cmp.l    d1,d0
  459.         bne.w    .InvalidBODY
  460.         adda.l    d0,a2
  461.         bra.b    .cmpByteRun1
  462.  
  463. .cmpBR1Pack    neg.b    d0
  464.         subq.l    #2,d3
  465.         blt.w    .InvalidBODY
  466.         subq.l    #1,d2
  467.         sub.l    d0,d2
  468.         blt.w    .InvalidBODY
  469.         movea.l    d5,a0
  470.         movea.l    a3,a1
  471.         move.l    d0,-(sp)
  472.         moveq.l    #1,d0
  473.         fjsr    ReadChunkBytes
  474.         move.l    (sp)+,d1
  475.         tst.l    d0
  476.         blt.w    .IFFErr
  477.         subq.l    #1,d0
  478.         bne.w    .InvalidBODY
  479.         move.b    (a3),d0
  480. .cmpBR1PackL    move.b    d0,(a2)+
  481.         dbra    d1,.cmpBR1PackL
  482.         bra.w    .cmpByteRun1
  483.  
  484. .cmpNone    cmp.l    d2,d3
  485.         bne.w    .InvalidBODY
  486.         movea.l    d5,a0
  487.         movea.l    a2,a1
  488.         move.l    d2,d0
  489.         fjsr    ReadChunkBytes
  490.         tst.l    d0
  491.         blt.b    .IFFErr
  492.         sub.l    d0,d2
  493.         sub.l    d0,d3
  494.         adda.l    d0,a2
  495.         ;||
  496. .BODYDone    tst.l    d2
  497.         bne.w    .InvalidBODY
  498.  
  499.         moveq.l    #1,d0
  500.         move.w    d0,gl_Image+ig_Depth(gl)
  501.         move.b    d0,gl_Image+ig_PlanePick(gl)
  502.         moveq.l    #-1,d7
  503.         ;||
  504. ; In: d7 = Code (0 = Err, >0, Err but IFF opened, <0 = Ok)
  505. .CleanUp    tst.l    d7
  506.         beq.b    .CUCont
  507.         blt.b    .CUCont4
  508.         moveq.l    #0,d7
  509. .CUCont4    movea.l    d5,a0
  510.         slib    IFFParse
  511.         fjsr    CloseIFF
  512. .CUCont
  513.         tst.l    d4
  514.         beq.b    .CUCont2
  515.         move.l    d4,d1
  516.         slib    DOS
  517.         fjsr    Close
  518. .CUCont2
  519.         tst.l    d5
  520.         beq.b    .CUCont3
  521.         movea.l    d5,a0
  522.         slib    IFFParse
  523.         fjsr    FreeIFF
  524. .CUCont3
  525.         tst.l    d7
  526.         addq.l    #4,sp
  527.         pull    d0-d7/a0-a3/lb
  528.         rts
  529.  
  530. .DOSErr        slib    DOS
  531.         fjsr    IoErr
  532.         move.l    d0,gl_Result2(gl)
  533.         lea.l    .ErrorTxt(pc),a0
  534.         move.l    a0,d1
  535.         lea.l    gl_aFrom(gl),a0
  536.         move.l    a0,d2
  537.         fjsr    VPrintf
  538.         move.l    gl_Result2(gl),d1
  539.         lea.l    .ErrorTxt3(pc),a0
  540.         move.l    a0,d2
  541.         fjsr    PrintFault
  542.         bra.b    .CleanUp
  543.  
  544. .IFFErr        cmpi.l    #IFFERR_NOSCOPE,d0
  545.         beq.b    .IFFErr_NoScope
  546.         cmpi.l    #IFFERR_NOMEM,d0
  547.         beq.w    .NoMem
  548.         cmpi.l    #IFFERR_READ,d0
  549.         beq.b    .IFFErr_Read
  550.         cmpi.l    #IFFERR_SEEK,d0
  551.         beq.b    .IFFErr_Seek
  552.         cmpi.l    #IFFERR_MANGLED,d0
  553.         beq.b    .IFFErr_Mangled
  554.         cmpi.l    #IFFERR_SYNTAX,d0
  555.         beq.b    .IFFErr_Syntax
  556.         cmpi.l    #IFFERR_NOTIFF,d0
  557.         beq.b    .IFFErr_NotIFF
  558.         lea.l    .GenericTxt(pc),a0
  559. ; In: a0 = &ReasonTxt, d0 = IoErr
  560. .GetPrintErr    move.l    a0,-(sp)
  561.         slib    DOS
  562.         fjsr    IoErr
  563.         movea.l    (sp)+,a0
  564. ; In: a0 = &ReasonTxt, d0 = IoErr
  565. .PrintErr    move.l    d0,gl_Result2(gl)
  566.         move.l    a0,-(sp)
  567.         slib    DOS
  568.         lea.l    .ErrorTxt(pc),a0
  569.         move.l    a0,d1
  570.         lea.l    gl_aFrom(gl),a0
  571.         move.l    a0,d2
  572.         fjsr    VPrintf
  573.         lea.l    .ErrorTxt2(pc),a0
  574.         move.l    a0,d1
  575.         move.l    sp,d2
  576.         fjsr    VPrintf
  577.         addq.l    #4,sp
  578.         bra.w    .CleanUp
  579.  
  580. .IFFErr_NoScope    lea.l    .NoScopeTxt(pc),a0
  581.         bra.b    .GetPrintErr
  582. .IFFErr_Read    lea.l    .ReadTxt(pc),a0
  583.         bra.b    .GetPrintErr
  584. .IFFErr_Seek    lea.l    .SeekTxt(pc),a0
  585.         bra.b    .GetPrintErr
  586. .IFFErr_Mangled    lea.l    .MangledTxt(pc),a0
  587.         bra.b    .GetPrintErr
  588. .IFFErr_Syntax    lea.l    .SyntaxTxt(pc),a0
  589.         bra.b    .GetPrintErr
  590. .IFFErr_NotIFF    lea.l    .NotIFFTxt(pc),a0
  591.         bra.b    .GetPrintErr
  592. .NoMem        lea.l    .NoMemTxt(pc),a0
  593.         bra.b    .GetPrintErr
  594. .NoPlane    moveq.l    #ERROR_NO_FREE_STORE,d0
  595.         lea.l    .NoMemTxt(pc),a0
  596.         bra.b    .PrintErr
  597. .NoBMHD        moveq.l    #ERROR_REQUIRED_ARG_MISSING,d0
  598.         lea.l    .NoBMHDTxt(pc),a0
  599.         bra.b    .PrintErr
  600. .NoBODY        moveq.l    #ERROR_REQUIRED_ARG_MISSING,d0
  601.         lea.l    .NoBODYTxt(pc),a0
  602.         bra.b    .PrintErr
  603. .WrongDepth    moveq.l    #ERROR_BAD_NUMBER,d0
  604.         lea.l    .DepthTxt(pc),a0
  605.         bra.b    .PrintErr
  606. .UnknownComp    move.l    #ERROR_NOT_IMPLEMENTED,d0
  607.         lea.l    .CompTxt(pc),a0
  608.         bra.w    .PrintErr
  609. .InvalidBODY    move.l    #ERROR_BAD_HUNK,d0
  610.         lea.l    .InvalidBODYTxt(pc),a0
  611.         bra.w    .PrintErr
  612.  
  613. .Chunx        dc.l    ID_ILBM, ID_BMHD
  614.         dc.l    ID_ILBM, ID_CAMG
  615.         dc.l    ID_ILBM, ID_BODY
  616. .ChunkEnd
  617. .ErrorTxt    dc.b    'Error with "%s"',0
  618. .ErrorTxt2    dc.b    ': %s',$0A        ; \
  619. .ErrorTxt3    dc.b    0            ; /
  620. .NoScopeTxt    dc.b    'No scope',0
  621. .NoMemTxt    dc.b    'Not enough free memory',0
  622. .ReadTxt    dc.b    'Reading failed',0
  623. .SeekTxt    dc.b    'Seeking failed',0
  624. .MangledTxt    dc.b    'Data in file is corrupt',0
  625. .SyntaxTxt    dc.b    'Invalid IFF syntax',0
  626. .NotIFFTxt    dc.b    'No IFF file',0
  627. .NoBMHDTxt    dc.b    'Missing BMHD chunk',0
  628. .NoBODYTxt    dc.b    'Missing BODY chunk',0
  629. .DepthTxt    dc.b    'Picture must have 2 colors',0
  630. .CompTxt    dc.b    'Unknown compression-type',0
  631. .InvalidBODYTxt    dc.b    'BODY chunk is corrupt',0
  632. .GenericTxt    dc.b    'Unknown reason, sorry',0
  633.         even
  634.  
  635. ;;-- Font laden -------------------------------------------
  636. ;  Out: cc=eq, wenn Fehler
  637.  
  638. _LoadFont    push    d0-d2/a0/a1/lb
  639.         clr.w    -(sp)
  640.         move.l    gl_aSize(gl),a0
  641.         move.w    2(a0),-(sp)
  642.         move.l    gl_aFont(gl),-(sp)
  643.  
  644.         slib    DiskFont
  645.         movea.l    sp,a0
  646.         fjsr    OpenDiskFont
  647.         move.l    d0,gl_TextFont(gl)
  648.         beq.b    .OpenErr
  649.         movea.l    d0,a0
  650.         btst.b    #FPB_PROPORTIONAL,tf_Flags(a0)
  651.         bne.b    .TypeErr
  652.         moveq.l    #-1,d0
  653.  
  654. .Exit        addq.l    #ta_SIZEOF,sp
  655.         pull    d0-d2/a0/a1/lb
  656.         rts
  657.  
  658. .OpenErr    slib    DOS
  659.         fjsr    IoErr
  660.         move.l    d0,gl_Result2(gl)
  661.         lea.l    .OpenErrTxt(pc),a0
  662.         move.l    a0,d1
  663.         move.l    sp,d2
  664.         fjsr    VPrintf
  665.         clr.b    d0
  666.         bra.b    .Exit
  667.  
  668. .TypeErr    move.l    #ERROR_OBJECT_WRONG_TYPE,gl_Result2(gl)
  669.         slib    DOS
  670.         lea.l    .TypeErrTxt(pc),a0
  671.         move.l    a0,d1
  672.         fjsr    PutStr
  673.         clr.b    d0
  674.         bra.b    .Exit
  675.  
  676. .OpenErrTxt    dc.b    'Unable to open "%s" (height %d)!',$0A,0
  677. .TypeErrTxt    dc.b    'Font has to be fixed-width!',$0A,0
  678.         even
  679.  
  680. ;;-- Screen + Window öffnen etc. ---------------------------------
  681. ;  Out: cc=eq, wenn Fehler
  682.  
  683. _OpenDisplay    push    d0/d1/a0-a3/lb
  684.         movea.l    sp,a3
  685.  
  686.         slib    Intui
  687.         pea.l    .ScrTags(pc)
  688.         move.l    #TAG_MORE,-(sp)
  689.         move.l    gl_ViewMode(gl),d1
  690.         moveq.l    #LORES_KEY,d0
  691.         btst.l    #15,d1
  692.         beq.b    .VModeCont
  693.         move.l    #HIRES_KEY,d0
  694. .VModeCont    btst.l    #5,d1
  695.         beq.b    .VModeCont2
  696.         move.l    #SUPER_KEY,d0
  697. .VModeCont2    btst.l    #2,d1
  698.         beq.b    .VModeCont3
  699.         addq.l    #LORESLACE_KEY,d0
  700. .VModeCont3    move.l    d0,-(sp)
  701.         move.l    #SA_DisplayID,-(sp)
  702.         move.w    gl_Image+ig_Height(gl),-(sp)
  703.         clr.w    -(sp)
  704.         move.l    #SA_Height,-(sp)
  705.         move.w    gl_Image+ig_Width(gl),-(sp)
  706.         clr.w    -(sp)
  707.         move.l    #SA_Width,-(sp)
  708.         suba.l    a0,a0
  709.         movea.l    sp,a1
  710.         fjsr    OpenScreenTagList
  711.         move.l    d0,gl_Screen(gl)
  712.         beq.w    .ScrErr
  713.         movea.l    d0,a2
  714.         lea.l    sc_RastPort(a2),a2
  715.         move.l    a2,gl_RPort(gl)
  716.  
  717.         movea.l    a3,sp
  718.         pea.l    .WinTags(pc)
  719.         move.l    #TAG_MORE,-(sp)
  720.         move.l    d0,-(sp)
  721.         move.l    #WA_CustomScreen,-(sp)
  722.         move.w    gl_Image+ig_Height(gl),-(sp)
  723.         clr.w    -(sp)
  724.         move.l    #WA_Height,-(sp)
  725.         move.w    gl_Image+ig_Width(gl),-(sp)
  726.         clr.w    -(sp)
  727.         move.l    #WA_Width,-(sp)
  728.         suba.l    a0,a0
  729.         movea.l    sp,a1
  730.         fjsr    OpenWindowTagList
  731.         move.l    d0,gl_Window(gl)
  732.         beq.b    .WinErr
  733.         movea.l    gl_Process(gl),a0
  734.         move.l    pr_WindowPtr(a0),gl_OldWin(gl)
  735.         move.l    d0,pr_WindowPtr(a0)
  736.  
  737.         movea.l    a2,a0
  738.         lea.l    gl_Image(gl),a1
  739.         moveq.l    #0,d0
  740.         moveq.l    #0,d1
  741.         fjsr    DrawImage
  742.         exec
  743.         movea.l    gl_Image+ig_ImageData(gl),a1
  744.         fjsr    FreeVec
  745.         clr.l    gl_Image+ig_ImageData(gl)
  746.         slib    Gfx
  747.         movea.l    a2,a1
  748.         movea.l    gl_TextFont(gl),a0
  749.         fjsr    SetFont
  750.         moveq.l    #-1,d0
  751.  
  752. .Exit        movea.l    a3,sp
  753.         pull    d0/d1/a0-a3/lb
  754.         rts
  755.  
  756. .ScrErr        lea.l    .ScrErrTxt(pc),a0
  757. .PrintErr    slib    DOS
  758.         move.l    a0,d1
  759.         fjsr    PutStr
  760.         clr.b    d0
  761.         bra.b    .Exit
  762.  
  763. .WinErr        lea.l    .WinErrTxt(pc),a0
  764.         bra.b    .PrintErr
  765.  
  766. .ScrTags    dc.l    SA_Depth, 1
  767.         dc.l    SA_Type, CUSTOMSCREEN
  768.         dc.l    SA_ShowTitle, 0
  769.         dc.l    SA_Quiet, -1
  770.         dc.l    SA_Overscan, OSCAN_TEXT
  771.         dc.l    SA_AutoScroll, -1
  772.         dc.l    TAG_DONE, 0
  773.  
  774. .WinTags    dc.l    WA_Left, 0
  775.         dc.l    WA_Top, 0
  776.         dc.l    WA_Activate, -1
  777.         dc.l    WA_Backdrop, -1
  778.         dc.l    WA_Borderless, -1
  779.         dc.l    WA_RMBTrap, -1
  780.         dc.l    WA_SmartRefresh, -1
  781.         dc.l    WA_IDCMP, IDCMP_MOUSEBUTTONS
  782.         dc.l    TAG_DONE, 0
  783.  
  784. .ScrErrTxt    dc.b    'Failed to open screen!',$0A,0
  785. .WinErrTxt    dc.b    'Failed to open window!',$0A,0
  786.         even
  787.  
  788. ;;-- Text-File erzeugen -----------------------------------
  789. ;  Out: cc=eq, wenn Fehler, cc=gt, wenn Break
  790.  
  791.         rsreset
  792. lo_FH        rs.l    1
  793. lo_Left        rs.w    1
  794. lo_Top        rs.w    1
  795. lo_NumChars    rs.w    1
  796. lo_OldRev    rs.b    1
  797. lo_Reverse    rs.b    1
  798. lo_Char        rs.b    1
  799. lo_BestChar    rs.b    1
  800.         rsword
  801. lo_BestNum    rs.l    1
  802. lo_MaxNum    rs.l    1
  803. lo_SIZEOF    rs.b    0
  804.  
  805. _CreateText    push    d0-d5/a0-a3/lb
  806.         moveq.l    #lo_SIZEOF/2-1,d0
  807. .ClearLoop    clr.w    -(sp)
  808.         dbra    d0,.ClearLoop
  809.         movea.l    sp,lo
  810.         move.b    #-1,lo_Reverse(lo)
  811.         movea.l    gl_RPort(gl),a2
  812.  
  813.         move.l    gl_TextFont(gl),a3
  814.         moveq.l    #0,d0
  815.         move.b    tf_HiChar(a3),d0
  816.         sub.b    tf_LoChar(a3),d0
  817.         move.w    d0,lo_NumChars(lo)
  818.         move.w    tf_XSize(a3),d0
  819.         mulu.w    tf_YSize(a3),d0
  820.         move.l    d0,lo_MaxNum(lo)
  821.  
  822.         slib    DOS
  823.         movea.l    gl_aTo(gl),d1
  824.         move.l    #MODE_NEWFILE,d2
  825.         fjsr    Open
  826.         move.l    d0,lo_FH(lo)
  827.         beq.w    .DOSErr
  828.  
  829. .WholeLoop    exec
  830. .BreakLoop    movea.l    gl_Window(gl),a0
  831.         movea.l    wd_UserPort(a0),a0
  832.         fjsr    GetMsg
  833.         tst.l    d0
  834.         beq.b    .BreakCont
  835.         movea.l    d0,a1
  836.         move.l    im_Class(a1),d2
  837.         move.w    im_Code(a1),d3
  838.         fjsr    ReplyMsg
  839.         cmpi.l    #IDCMP_MOUSEBUTTONS,d2
  840.         bne.b    .BreakLoop
  841.         btst.l    #0,d3            ; MENU-Button
  842.         beq.b    .BreakLoop
  843.         bra.w    .Break
  844. .BreakCont    slib    DOS
  845.         move.l    #SIGBREAKF_CTRL_C,d1
  846.         fjsr    CheckSignal
  847.         tst.l    d0
  848.         bne.w    .Break
  849.  
  850.         move.b    lo_Reverse(lo),lo_OldRev(lo)
  851.         move.w    tf_XSize(a3),d0
  852.         add.w    lo_Left(lo),d0
  853.         cmp.w    gl_Image+ig_Width(gl),d0
  854.         ble.b    .WidthCont
  855.  
  856.         tst.l    gl_aANSI(gl)
  857.         beq.b    .LFNoANSI
  858.         tst.b    lo_OldRev(lo)
  859.         ble.b    .LFNoANSI
  860.         move.l    lo_FH(lo),d1
  861.         lea.l    .RevOffTxt(pc),a0
  862.         move.l    a0,d2
  863.         fjsr    FPuts
  864.         tst.l    d0
  865.         blt.w    .DOSErr
  866. .LFNoANSI    move.l    lo_FH(lo),d1
  867.         moveq.l    #$0A,d2
  868.         fjsr    FPutC
  869.         tst.l    d0
  870.         blt.w    .DOSErr
  871.         move.b    #-1,lo_OldRev(lo)
  872.         clr.w    lo_Left(lo)
  873.         move.w    tf_YSize(a3),d0
  874.         add.w    d0,lo_Top(lo)
  875. .WidthCont
  876.         move.w    tf_YSize(a3),d0
  877.         add.w    lo_Top(lo),d0
  878.         cmp.w    gl_Image+ig_Height(gl),d0
  879.         bgt.w    .Finished
  880.  
  881.         slib    Gfx
  882.         movea.l    a2,a1
  883.         moveq.l    #RP_COMPLEMENT,d0
  884.         fjsr    SetDrMd
  885.         clr.l    lo_BestNum(lo)
  886.         clr.b    d2
  887.  
  888. .CharLoop    cmp.b    lo_NumChars+1(lo),d2
  889.         bhs.w    .CharDone
  890.         move.w    lo_Left(lo),d0
  891.         move.w    lo_Top(lo),d1
  892.         add.w    tf_Baseline(a3),d1
  893.         movea.l    a2,a1
  894.         fjsr    Move
  895.         lea.l    lo_Char(lo),a0
  896.         move.b    d2,(a0)
  897.         move.b    tf_LoChar(a3),d0
  898.         add.b    d0,(a0)
  899.         moveq.l    #1,d0
  900.         movea.l    a2,a1
  901.         fjsr    Text
  902.  
  903.         moveq.l    #0,d3
  904.         move.w    tf_YSize(a3),d5
  905.         bra.b    .CountStrt
  906. .CountLoop    move.w    lo_Left(lo),d0
  907.         add.w    d4,d0
  908.         move.w    lo_Top(lo),d1
  909.         add.w    d5,d1
  910.         movea.l    a2,a1
  911.         fjsr    ReadPixel
  912.         tst.b    d0
  913.         bne.b    .CountStrt2
  914.         addq.l    #1,d3
  915. .CountStrt2    dbra    d4,.CountLoop
  916. .CountStrt    move.w    tf_XSize(a3),d4
  917.         dbra    d5,.CountStrt2
  918.  
  919.         move.w    lo_Left(lo),d0
  920.         move.w    lo_Top(lo),d1
  921.         add.w    tf_Baseline(a3),d1
  922.         movea.l    a2,a1
  923.         fjsr    Move
  924.         lea.l    lo_Char(lo),a0
  925.         moveq.l    #1,d0
  926.         movea.l    a2,a1
  927.         fjsr    Text
  928.  
  929.         cmp.l    lo_BestNum(lo),d3
  930.         ble.b    .CharCont
  931.         move.l    d3,lo_BestNum(lo)
  932.         move.b    lo_Char(lo),lo_BestChar(lo)
  933.         clr.b    lo_Reverse(lo)
  934.         cmp.l    lo_MaxNum(lo),d3
  935.         beq.b    .CharDone
  936. .CharCont    tst.l    gl_aANSI(gl)
  937.         beq.b    .CharCont2
  938.         neg.l    d3
  939.         add.l    lo_MaxNum(lo),d3
  940.         cmp.l    lo_BestNum(lo),d3
  941.         ble.b    .CharCont2
  942.         move.l    d3,lo_BestNum(lo)
  943.         move.b    lo_Char(lo),lo_BestChar(lo)
  944.         move.b    #1,lo_Reverse(lo)
  945.         cmp.l    lo_MaxNum(lo),d3
  946.         beq.b    .CharDone
  947. .CharCont2    addq.b    #1,d2
  948.         bra.w    .CharLoop
  949. .CharDone
  950.         moveq.l    #RP_JAM2,d0
  951.         tst.b    lo_Reverse(lo)
  952.         ble.b    .PrintCont
  953.         moveq.l    #RP_JAM2!RP_INVERSVID,d0
  954. .PrintCont    movea.l    a2,a1
  955.         fjsr    SetDrMd
  956.         move.w    lo_Left(lo),d0
  957.         move.w    lo_Top(lo),d1
  958.         add.w    tf_Baseline(a3),d1
  959.         movea.l    a2,a1
  960.         fjsr    Move
  961.         lea.l    lo_BestChar(lo),a0
  962.         moveq.l    #1,d0
  963.         movea.l    a2,a1
  964.         fjsr    Text
  965.  
  966.         slib    DOS
  967.         tst.l    gl_aANSI(gl)
  968.         beq.b    .WriteCont
  969.         move.b    lo_Reverse(lo),d0
  970.         cmp.b    lo_OldRev(lo),d0
  971.         beq.b    .WriteCont
  972.         lea.l    .RevOnTxt(pc),a0
  973.         move.l    a0,d2
  974.         tst.b    d0
  975.         bgt.b    .WriteCont2
  976.         addq.l    #4,d2
  977. .WriteCont2    move.l    lo_FH(lo),d1
  978.         fjsr    FPuts
  979.         tst.l    d0
  980.         blt.b    .DOSErr
  981. .WriteCont    move.l    lo_FH(lo),d1
  982.         move.b    lo_BestChar(lo),d2
  983.         fjsr    FPutC
  984.         tst.l    d0
  985.         blt.b    .DOSErr
  986.  
  987.         move.w    tf_XSize(a3),d0
  988.         add.w    d0,lo_Left(lo)
  989.         bra.w    .WholeLoop
  990.  
  991. .Finished    moveq.l    #-1,d3
  992.         ;||
  993. ; In: d3.b = ReturnCode
  994. .CleanUp    move.l    lo_FH(lo),d1
  995.         beq.b    .CUCont
  996.         slib    DOS
  997.         fjsr    Close
  998.         tst.b    d3
  999.         blt.b    .CUCont2
  1000.         move.l    gl_aTo(gl),d1
  1001.         fjsr    DeleteFile
  1002.         tst.w    d0
  1003.         beq.b    .CUCont
  1004.         lea.l    .DeleteTxt(pc),a0
  1005.         move.l    a0,d1
  1006.         fjsr    PutStr
  1007.         bra.b    .CUCont
  1008. .CUCont2
  1009.         tst.w    d0
  1010.         beq.b    .DOSErr            ; Close() failed
  1011. .CUCont
  1012.         tst.b    d3
  1013.         lea.l    lo_SIZEOF(sp),sp
  1014.         pull    d0-d5/a0-a3/lb
  1015.         rts
  1016.  
  1017. .DOSErr        slib    DOS
  1018.         fjsr    IoErr
  1019.         move.l    d0,gl_Result2(gl)
  1020.         lea.l    .ErrorTxt(pc),a0
  1021.         move.l    a0,d1
  1022.         lea.l    gl_aTo(gl),a0
  1023.         move.l    a0,d2
  1024.         fjsr    VPrintf
  1025.         move.l    gl_Result2(gl),d1
  1026.         lea.l    .ErrorTxt2(pc),a0
  1027.         move.l    a0,d2
  1028.         fjsr    PrintFault
  1029.         clr.b    d3
  1030.         bra.b    .CleanUp
  1031.  
  1032. .Break        move.l    #ERROR_BREAK,d1
  1033.         move.l    d1,gl_Result2(gl)
  1034.         moveq.l    #0,d2
  1035.         slib    DOS
  1036.         fjsr    PrintFault
  1037.         moveq.l    #1,d3
  1038.         bra.b    .CleanUp
  1039.  
  1040. .RevOnTxt    dc.b    $9B,'7m',0        ; \
  1041. .RevOffTxt    dc.b    $9B,'27m',0        ; /
  1042. .ErrorTxt    dc.b    'Error with "%s"'    ; \
  1043. .ErrorTxt2    dc.b    0            ; /
  1044. .DeleteTxt    dc.b    'Destination file removed.',$0A,0
  1045.         even
  1046.  
  1047. ;;-- ChipMem Daten (WaitPtr) ------------------------------
  1048.  
  1049.         section    Daten,data_c
  1050.  
  1051. _ChipPtr    dc.w    0,0
  1052.         dc.w    %0000010000000000,%0000011111000000
  1053.         dc.w    %0000000000000000,%0000011111000000
  1054.         dc.w    %0000000100000000,%0000001110000000
  1055.         dc.w    %0000000000000000,%0000011111100000
  1056.         dc.w    %0000011111000000,%0001111111111000
  1057.         dc.w    %0001111111110000,%0011111111101100
  1058.         dc.w    %0011111111111000,%0111111111011110
  1059.         dc.w    %0011111111111000,%0111111110111110
  1060.         dc.w    %0111111111111100,%1111111101111111
  1061.         dc.w    %0111111011111100,%1111111111111111
  1062.         dc.w    %0111111111111100,%1111111111111111
  1063.         dc.w    %0011111111111000,%0111111111111110
  1064.         dc.w    %0011111111111000,%0111111111111110
  1065.         dc.w    %0001111111110000,%0011111111111100
  1066.         dc.w    %0000011111000000,%0001111111111000
  1067.         dc.w    %0000000000000000,%0000011111100000
  1068.         dc.w    0,0
  1069.