; ; ### Print by JM v 1.11 ### ; ; - Created 880515 by JM - ; ; ; Quack! ; ; Bugs: unknown ; ; ; Edited: ; ; - 880515 by JM -> v0.00 - does not work (can't print page#) ; - 880515 by JM -> v1.00 - Works like its "C"-counterpart. ; - 890418 by JM -> v1.10 - No buffer limitations. ; - 890418 by JM -> v1.11 - Bug fixes, CTRL+C support, relativization. ; ; ;DEBUG set 1 SOURCEBUF equ 2048+16 OBUF equ 1024 NAMEBUF equ 256 TABSTEP equ 8 LINEMAX equ 58 FORMFEED equ 12 LINEFEED equ 10 LF equ 10 CR equ 13 TAB equ 9 RELATIVE set 1 include "exec.xref" include "dos.xref" include "JMPLibs.i" include "exec/types.i" include "exec/memory.i" include "dos.i" include "execlib.i" include "relative.i" include "handler.i" otxt macro push a0/d7 lea otxtdat\@,a0 otxtl\@ move.b (a0)+,d7 beq.s otxte\@ bsr ochr bra.s otxtl\@ otxtdat\@ dc.b \1 dc.b 0 cnop 0,4 otxte\@ pull a0/d7 endm .var dl _DosBase,_CMDLen,_CMDBuf dl obuf,opoi,txtpoi dl prtfile,infile,sourcepoi,namebuf dl xpos,line,pagenum,linefd Start .begin ra clear variables move.l d0,_CMDLen(a4) len of cmd line move.l a0,_CMDBuf(a4) start addr of cmd line clr.b -1(a0,d0.l) add null openlib Dos,cleanup open Dos library move.l #SOURCEBUF,d0 this many RAM bytes needed move.l #MEMF_CLEAR!MEMF_PUBLIC,d1 lib Exec,AllocMem ask for them move.l d0,sourcepoi(a4) save start addr beq mem_cleanup no mem, exit move.l #OBUF,d0 this many RAM bytes needed move.l #MEMF_CLEAR!MEMF_PUBLIC,d1 lib Exec,AllocMem ask for them move.l d0,obuf(a4) save start addr move.l d0,opoi(a4) set output buffer pointer beq mem_cleanup no mem, exit move.l #NAMEBUF,d0 this many RAM bytes needed move.l #MEMF_CLEAR!MEMF_PUBLIC,d1 lib Exec,AllocMem ask for them move.l d0,namebuf(a4) save start addr beq mem_cleanup no mem, exit bsr mkname move.l namebuf(a4),a0 tst.b (a0) bne name_not_null print <'*** No file name ***',LF> print <'Usage: print ',60,'filename',62,LF,LF> bra cleanup name_not_null move.l _CMDBuf(a4),d1 file to load move.l #MODE_OLDFILE,d2 mode: read only lib Dos,Open open it move.l d0,infile(a4) save ptr bne in_file_ok print <'*** File '> printa _CMDBuf(a4) print <' not found ***',LF> bra cleanup in_file_ok lea PRTFILE(pc),a0 move.l a0,d1 file to write move.l #MODE_NEWFILE,d2 mode: create lib Dos,Open open it move.l d0,prtfile(a4) save ptr bne out_file_ok print <'*** Cannot open printer.device ***',LF> out_file_ok print <'Files opened.',LF> otxt <27,'c',27,'#1'> reset otxt <27,'(B'> USA otxt <27,'[2w'> elite on otxt <27,'[2"z'> NLQ on print <'Printing started.',LF> clr.l pagenum(a4) bsr print_header bsr tabulate read_buf move.l infile(a4),d1 move.l sourcepoi(a4),d2 move.l #SOURCEBUF-16,d3 lib Dos,Read move.l d2,a0 clr.b 0(a0,d0) add NULL move.l d2,txtpoi(a4) tst.l d0 beq end_of_file main_loop execlib stop bne break_ed bsr chr beq.s read_buf get more data cmp.b #LINEFEED,d7 *** Handle line feeds bne.s main_1 tst.b linefd(a4) beq.s main_loop if first line of page addq.l #1,line(a4) clr.l xpos(a4) cmp.l #LINEMAX,line(a4) blt.s main_01 clr.l line(a4) otxt FORMFEED bsr print_header main_01 bsr ochr bsr tabulate bra.s main_loop main_1 cmp.b #TAB,d7 *** Handle tabulators bne.s main_2 bsr tabulate bra.s main_loop main_2 bsr ochr addq.l #1,xpos(a4) move.b #1,linefd(a4) cmp.b #CR,d7 *** Handle carriage returns bne main_loop clr.l xpos(a4) bra main_loop break_ed print <'*** User break request',LF> end_of_file move.l infile(a4),d1 lib Dos,Close otxt reset moveq.l #0,d7 bsr ochr flush buffer print <'Printing complete.',LF> bra cleanup mem_cleanup print <'*** Memory allocation failed ***',LF> cleanup move.l prtfile(a4),d1 beq clean01 lib Dos,Close clean01 move.l sourcepoi(a4),d0 if mem reserved release it beq clean02 move.l d0,a1 move.l #SOURCEBUF,d0 lib Exec,FreeMem clean02 move.l obuf(a4),d0 if mem reserved release it beq clean03 move.l d0,a1 move.l #OBUF,d0 lib Exec,FreeMem clean03 move.l namebuf(a4),d0 if mem reserved release it beq clean04 move.l d0,a1 move.l #NAMEBUF,d0 lib Exec,FreeMem clean04 closlib Dos .end mkname move.l _CMDBuf(a4),a0 move.l namebuf(a4),a1 mkname1 strcpy a0,a1 rts print_header push all otxt <27,'[4"z File: '> moveq.l #52,d0 move.l namebuf(a4),a0 print_hd1 move.b (a0)+,d7 print filename beq print_hd2 bsr ochr dbf d0,print_hd1 bra print_hd3 print_hd2 moveq.l #' ',d7 bsr ochr dbf d0,print_hd2 print_hd3 otxt <' Page: '> addq.l #1,pagenum(a4) move.l pagenum(a4),d0 bsr conv_10 otxt otxt <'=============================================='> otxt <'==',27,'[3"z',CR,LF,LF> clr.l line(a4) clr.l xpos(a4) clr.l linefd(a4) pull all rts tabulate push d0-d1/d7 move.l xpos(a4),d0 moveq.l #' ',d7 tablate1 addq.l #1,d0 bsr ochr move.l d0,d1 divu.w #TABSTEP,d1 swap d1 tst.w d1 bne tablate1 move.l d0,xpos(a4) pull d0-d1/d7 rts conv_10 push d0-d1/d6-d7 move.l #100000,d1 first sub 100000's moveq.l #' ',d6 blank leading zeros conv_10_0 move.b d6,d7 at least zero ASCII conv_10_1 cmp.w d1,d0 bcs conv_10_2 cannot subtract sub.w d1,d0 addq.l #1,d7 incr. digit moveq.l #'0',d6 or.b d6,d7 bra conv_10_1 sub again conv_10_2 bsr ochr divu.w #10,d1 next digit tst.w d1 bne conv_10_0 until all done pull d0-d1/d6-d7 rts ohex push d0/d7/a0 output a byte in d7 in hex lea hextable(pc),a0 move.b d7,d0 lsr.b #4,d7 and.w #15,d7 move.b 0(a0,d7),d7 bsr ochr and.w #15,d0 move.b 0(a0,d0),d7 bsr ochr pull d0/d7/a0 rts chr push a0 read one byte move.l txtpoi(a4),a0 moveq.l #0,d7 chrloop move.b (a0)+,d7 move.l a0,txtpoi(a4) pull a0 tst.b d7 rts ochr push d0-d3/a0-a1 * output one char. move.l obuf(a4),a1 * Uses buffering. tst.b d7 * Buffer is written to file beq ochrflush * if it becomes full or if add.l #OBUF,a1 * the character ochr'ed is move.l opoi(a4),a0 * a NULL. move.b d7,(a0)+ cmp.l a1,a0 blt ochrok1 move.l obuf(a4),a0 move.l prtfile(a4),d1 move.l a0,d2 move.l #OBUF,d3 ochrout lib Dos,Write move.l d2,a0 cmp.l d3,d0 beq ochrok1 print <'*** Error writing file ***',LF> ochrok1 move.l a0,opoi(a4) pull d0-d3/a0-a1 tst.b d7 rts ochrflush move.l opoi(a4),a0 sub.l a1,a0 move.l prtfile(a4),d1 move.l a1,d2 move.l a0,d3 bra ochrout execlib hextable dc.b '0123456789abcdef' ifd DEBUG PRTFILE dc.b 'con:0/0/640/200/OutputWindow',0 endc ifnd DEBUG PRTFILE dc.b 'prt:',0 endc libnames end