home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / prog-asm / assemtls.lzh / ASSEMTOOLS / ASOURCE / PRINT.ASM < prev    next >
Encoding:
Assembly Source File  |  1991-08-16  |  6.7 KB  |  359 lines

  1. ;
  2. ; ### Print by JM v 1.11 ###
  3. ;
  4. ; - Created 880515 by JM -
  5. ;
  6. ;
  7. ; Quack!
  8. ;
  9. ; Bugs: unknown
  10. ;
  11. ;
  12. ; Edited:
  13. ;
  14. ; - 880515 by JM -> v0.00    - does not work (can't print page#)
  15. ; - 880515 by JM -> v1.00    - Works like its "C"-counterpart.
  16. ; - 890418 by JM -> v1.10    - No buffer limitations.
  17. ; - 890418 by JM -> v1.11    - Bug fixes, CTRL+C support, relativization.
  18. ;
  19. ;
  20.  
  21. ;DEBUG        set    1
  22.  
  23. SOURCEBUF    equ    2048+16
  24. OBUF        equ    1024
  25. NAMEBUF        equ    256
  26.  
  27. TABSTEP        equ    8
  28. LINEMAX        equ    58
  29. FORMFEED    equ    12
  30. LINEFEED    equ    10
  31. LF        equ    10
  32. CR        equ    13
  33. TAB        equ    9
  34.  
  35. RELATIVE    set    1
  36.  
  37.         include    "exec.xref"
  38.         include    "dos.xref"
  39.         include "JMPLibs.i"
  40.         include "exec/types.i"
  41.         include "exec/memory.i"
  42.         include "dos.i"
  43.         include "execlib.i"
  44.         include "relative.i"
  45.         include "handler.i"
  46.  
  47.  
  48. otxt        macro
  49.         push    a0/d7
  50.         lea    otxtdat\@,a0
  51. otxtl\@        move.b    (a0)+,d7
  52.         beq.s    otxte\@
  53.         bsr    ochr
  54.         bra.s    otxtl\@
  55. otxtdat\@    dc.b    \1
  56.         dc.b    0
  57.         cnop    0,4
  58. otxte\@        pull    a0/d7
  59.         endm
  60.  
  61.  
  62.  
  63.         .var
  64.         dl    _DosBase,_CMDLen,_CMDBuf
  65.         dl    obuf,opoi,txtpoi
  66.         dl    prtfile,infile,sourcepoi,namebuf
  67.         dl    xpos,line,pagenum,linefd
  68.  
  69.  
  70. Start        .begin
  71.         ra                clear variables
  72.         move.l    d0,_CMDLen(a4)        len of cmd line
  73.         move.l    a0,_CMDBuf(a4)        start addr of cmd line
  74.         clr.b    -1(a0,d0.l)        add null
  75.         openlib Dos,cleanup        open Dos library
  76.  
  77.         move.l    #SOURCEBUF,d0        this many RAM bytes needed
  78.         move.l    #MEMF_CLEAR!MEMF_PUBLIC,d1
  79.         lib    Exec,AllocMem        ask for them
  80.         move.l    d0,sourcepoi(a4)    save start addr
  81.         beq    mem_cleanup        no mem, exit
  82.  
  83.         move.l    #OBUF,d0        this many RAM bytes needed
  84.         move.l    #MEMF_CLEAR!MEMF_PUBLIC,d1
  85.         lib    Exec,AllocMem        ask for them
  86.         move.l    d0,obuf(a4)        save start addr
  87.         move.l    d0,opoi(a4)        set output buffer pointer
  88.         beq    mem_cleanup        no mem, exit
  89.  
  90.         move.l    #NAMEBUF,d0        this many RAM bytes needed
  91.         move.l    #MEMF_CLEAR!MEMF_PUBLIC,d1
  92.         lib    Exec,AllocMem        ask for them
  93.         move.l    d0,namebuf(a4)    save start addr
  94.         beq    mem_cleanup        no mem, exit
  95.  
  96.         bsr    mkname
  97.  
  98.         move.l    namebuf(a4),a0
  99.         tst.b    (a0)
  100.         bne    name_not_null
  101.         print    <'*** No file name ***',LF>
  102.         print    <'Usage: print ',60,'filename',62,LF,LF>
  103.         bra    cleanup
  104.  
  105. name_not_null    move.l    _CMDBuf(a4),d1        file to load
  106.         move.l    #MODE_OLDFILE,d2    mode: read only
  107.         lib    Dos,Open        open it
  108.         move.l    d0,infile(a4)        save ptr
  109.         bne    in_file_ok
  110.         print    <'*** File '>
  111.         printa    _CMDBuf(a4)
  112.         print    <' not found ***',LF>
  113.         bra    cleanup
  114.  
  115. in_file_ok    lea    PRTFILE(pc),a0
  116.         move.l    a0,d1            file to write
  117.         move.l    #MODE_NEWFILE,d2    mode: create
  118.         lib    Dos,Open        open it
  119.         move.l    d0,prtfile(a4)        save ptr
  120.         bne    out_file_ok
  121.         print    <'*** Cannot open printer.device ***',LF>
  122.  
  123. out_file_ok    print    <'Files opened.',LF>
  124.         otxt    <27,'c',27,'#1'>        reset
  125.         otxt    <27,'(B'>            USA
  126.         otxt    <27,'[2w'>            elite on
  127.         otxt    <27,'[2"z'>            NLQ on
  128.         print    <'Printing started.',LF>
  129.  
  130.         clr.l    pagenum(a4)
  131.         bsr    print_header
  132.         bsr    tabulate
  133.  
  134. read_buf    move.l    infile(a4),d1
  135.         move.l    sourcepoi(a4),d2
  136.         move.l    #SOURCEBUF-16,d3
  137.         lib    Dos,Read
  138.         move.l    d2,a0
  139.         clr.b    0(a0,d0)    add NULL
  140.         move.l    d2,txtpoi(a4)
  141.         tst.l    d0
  142.         beq    end_of_file
  143.  
  144.  
  145. main_loop    execlib    stop
  146.         bne    break_ed
  147.         bsr    chr
  148.         beq.s    read_buf    get more data
  149.  
  150.         cmp.b    #LINEFEED,d7    *** Handle line feeds
  151.         bne.s    main_1
  152.         tst.b    linefd(a4)
  153.         beq.s    main_loop    if first line of page
  154.         addq.l    #1,line(a4)
  155.         clr.l    xpos(a4)
  156.         cmp.l    #LINEMAX,line(a4)
  157.         blt.s    main_01
  158.         clr.l    line(a4)
  159.         otxt    FORMFEED
  160.         bsr    print_header
  161. main_01        bsr    ochr
  162.         bsr    tabulate
  163.         bra.s    main_loop
  164.  
  165. main_1        cmp.b    #TAB,d7        *** Handle tabulators
  166.         bne.s    main_2
  167.         bsr    tabulate
  168.         bra.s    main_loop
  169.  
  170. main_2        bsr    ochr
  171.         addq.l    #1,xpos(a4)
  172.         move.b    #1,linefd(a4)
  173.  
  174.         cmp.b    #CR,d7        *** Handle carriage returns
  175.         bne    main_loop
  176.         clr.l    xpos(a4)
  177.         bra    main_loop
  178.  
  179. break_ed    print    <'*** User break request',LF>
  180. end_of_file    
  181.         move.l    infile(a4),d1
  182.         lib    Dos,Close
  183.  
  184.         otxt    <FORMFEED,27,'c',27,'#1'>    reset
  185.         moveq.l    #0,d7
  186.         bsr    ochr                flush buffer
  187.         print    <'Printing complete.',LF>
  188.         bra    cleanup
  189.  
  190.  
  191.  
  192. mem_cleanup    print    <'*** Memory allocation failed ***',LF>
  193. cleanup        move.l    prtfile(a4),d1
  194.         beq    clean01
  195.         lib    Dos,Close
  196.  
  197. clean01        move.l    sourcepoi(a4),d0    if mem reserved release it
  198.         beq    clean02
  199.         move.l    d0,a1
  200.         move.l    #SOURCEBUF,d0
  201.         lib    Exec,FreeMem
  202.  
  203. clean02        move.l    obuf(a4),d0        if mem reserved release it
  204.         beq    clean03
  205.         move.l    d0,a1
  206.         move.l    #OBUF,d0
  207.         lib    Exec,FreeMem
  208.  
  209. clean03        move.l    namebuf(a4),d0        if mem reserved release it
  210.         beq    clean04
  211.         move.l    d0,a1
  212.         move.l    #NAMEBUF,d0
  213.         lib    Exec,FreeMem
  214.  
  215. clean04        closlib    Dos
  216.         .end
  217.  
  218. mkname        move.l    _CMDBuf(a4),a0
  219.         move.l    namebuf(a4),a1
  220. mkname1        strcpy    a0,a1
  221.         rts
  222.  
  223.  
  224. print_header    push    all
  225.         otxt    <27,'[4"z        File: '>
  226.         moveq.l    #52,d0
  227.         move.l    namebuf(a4),a0
  228. print_hd1    move.b    (a0)+,d7        print filename
  229.         beq    print_hd2
  230.         bsr    ochr
  231.         dbf    d0,print_hd1
  232.         bra    print_hd3
  233. print_hd2    moveq.l    #' ',d7
  234.         bsr    ochr
  235.         dbf    d0,print_hd2
  236. print_hd3    otxt    <'       Page: '>
  237.         addq.l    #1,pagenum(a4)
  238.         move.l    pagenum(a4),d0
  239.         bsr    conv_10
  240.         otxt    <CR,LF,'        ================================'>
  241.         otxt    <'=============================================='>
  242.         otxt    <'==',27,'[3"z',CR,LF,LF>
  243.  
  244.         clr.l    line(a4)
  245.         clr.l    xpos(a4)
  246.         clr.l    linefd(a4)
  247.         pull    all
  248.         rts
  249.  
  250.  
  251. tabulate    push    d0-d1/d7
  252.         move.l    xpos(a4),d0
  253.         moveq.l    #' ',d7
  254. tablate1    addq.l    #1,d0
  255.         bsr    ochr
  256.         move.l    d0,d1
  257.         divu.w    #TABSTEP,d1
  258.         swap    d1
  259.         tst.w    d1
  260.         bne    tablate1
  261.         move.l    d0,xpos(a4)
  262.         pull    d0-d1/d7
  263.         rts
  264.  
  265.  
  266. conv_10        push    d0-d1/d6-d7
  267.         move.l    #100000,d1        first sub 100000's
  268.         moveq.l    #' ',d6            blank leading zeros
  269. conv_10_0    move.b    d6,d7            at least zero ASCII
  270. conv_10_1    cmp.w    d1,d0
  271.         bcs    conv_10_2        cannot subtract
  272.         sub.w    d1,d0
  273.         addq.l    #1,d7            incr. digit
  274.         moveq.l    #'0',d6
  275.         or.b    d6,d7
  276.         bra    conv_10_1        sub again
  277. conv_10_2    bsr    ochr
  278.         divu.w    #10,d1            next digit
  279.         tst.w    d1
  280.         bne    conv_10_0        until all done
  281.         pull    d0-d1/d6-d7
  282.         rts
  283.  
  284.  
  285.  
  286. ohex        push    d0/d7/a0        output a byte in d7 in hex
  287.         lea    hextable(pc),a0
  288.         move.b    d7,d0
  289.         lsr.b    #4,d7
  290.         and.w    #15,d7
  291.         move.b    0(a0,d7),d7
  292.         bsr    ochr
  293.         and.w    #15,d0
  294.         move.b    0(a0,d0),d7
  295.         bsr    ochr
  296.         pull    d0/d7/a0
  297.         rts
  298.  
  299.  
  300.  
  301.  
  302. chr        push    a0            read one byte
  303.         move.l    txtpoi(a4),a0
  304.         moveq.l    #0,d7
  305. chrloop        move.b    (a0)+,d7
  306.         move.l    a0,txtpoi(a4)
  307.         pull    a0
  308.         tst.b    d7
  309.         rts
  310.  
  311.  
  312. ochr        push    d0-d3/a0-a1        * output one char.
  313.         move.l    obuf(a4),a1        * Uses buffering.
  314.         tst.b    d7            * Buffer is written to file
  315.         beq    ochrflush        * if it becomes full or if
  316.         add.l    #OBUF,a1        * the character ochr'ed is
  317.         move.l    opoi(a4),a0        * a NULL.
  318.         move.b    d7,(a0)+
  319.         cmp.l    a1,a0
  320.         blt    ochrok1
  321.         move.l    obuf(a4),a0
  322.         move.l    prtfile(a4),d1
  323.         move.l    a0,d2
  324.         move.l    #OBUF,d3
  325. ochrout        lib    Dos,Write
  326.         move.l    d2,a0
  327.         cmp.l    d3,d0
  328.         beq    ochrok1
  329.         print    <'*** Error writing file ***',LF>
  330. ochrok1        move.l    a0,opoi(a4)
  331.         pull    d0-d3/a0-a1
  332.         tst.b    d7
  333.         rts
  334.  
  335. ochrflush    move.l    opoi(a4),a0
  336.         sub.l    a1,a0
  337.         move.l    prtfile(a4),d1
  338.         move.l    a1,d2
  339.         move.l    a0,d3
  340.         bra    ochrout
  341.  
  342.  
  343.         execlib
  344.  
  345.  
  346. hextable    dc.b    '0123456789abcdef'
  347.  
  348.         ifd    DEBUG
  349. PRTFILE        dc.b    'con:0/0/640/200/OutputWindow',0
  350.         endc
  351.         ifnd    DEBUG
  352. PRTFILE        dc.b    'prt:',0
  353.         endc
  354.  
  355.         libnames
  356.  
  357.         end
  358.  
  359.