home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / new / 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)