*****************************************************************
** Want to use ED on those programs with binary numbers in     **
** them. Simple, Use Stripper to filter them out               **
** To make an executeable program                              **
** Assemble program                                            **
** Then link using                                             **
** Alink TWStartup.obj+Stripper.obj to Stripper lib amiga.lib  **
** If you then make an Icon for this you can use it from WB    **
** Created by John Veldthuis in an hour (or more) of need      **
*****************************************************************



   include  "exec/types.i"
   include  "libraries/dos.i"

   xdef     _main
   xdef     _TWspec

   xref     _LVODelay
   xref     _LVOOpen
   xref     _LVOClose
   xref     _LVORead
   xref     _LVOWrite
   xref     _LVOIoErr
   xref     _LVOSetSignal
   xref     _DOSBase
   xref     _SysBase
   xref     _stdin
   xref     _printf

_main    move.l   sp,SPSave      ;save SP for return
         move.l   4(sp),d0       ;arg count
         move.l   8(sp),a2       ;arg pointers
         move.l   _DOSBase,a6
         tst.l    d0
         beq      FromWB         ;arg count = NULL if from WB
         cmp.l    #3,d0
         bne      ShowUseage     ;if from CLI and not 3 args show useage
         move.l   4(a2),a0       ;a0 = pointer to source filename
         move.l   8(a2),a1       ;a1 = pointer to destination filename
Go       move.l   a0,SourceErr   ;save in case of open err
         move.l   a1,DestErr     ;as above
         move.l   a1,-(sp)       ;open trashes a1
         move.l   a0,d1          ;d1 = source
         move.l   a0,-(sp)       ;save in case of open error
         move.l   #MODE_OLDFILE,d2  ;access to already created files
         jsr      _LVOOpen(a6)
         move.l   (sp)+,a0
         tst.l    d0
         beq      OpenError      ;Show why open failed
         move.l   d0,Source      ;save filehandle
         move.l   (sp),d1        ;restore second filename
         move.l   #MODE_NEWFILE,d2  ;access any file (create if not there)
         jsr      _LVOOpen(a6)
         move.l   (sp)+,a0
         tst.l    d0
         beq      OpenError      ;Show why open failed
         move.l   d0,Destination ;save filehandle
Loop     move.l   Source,d1      ;source filehandle
         move.l   #Buffer1,d2    ;buffer address for read
         move.l   #512,d3        ;length of buffer
         jsr      _LVORead(a6)
         cmp.l    #-1,d0
         beq      ReadError      ;d0 = -1 if read error
         tst.l    d0
         beq      Finish         ;d0 = 0 if end of file
         clr.l    d1             ;zero write count
         lea      Buffer1,a0
         lea      Buffer2,a1
Loop1    move.b   (a0)+,d3       ;get byte from buffer + increase pointer
         subq.w   #1,d0          ;decrease length count
         bmi      WriteBuffer    ;if negative then buffer all read
         cmp.b    #10,d3
         beq      Ok             ;pass linefeeds
         cmp.b    #31,d3
         bls      Loop1          ;dont pass any < 30
         cmp.b    #126,d3
         bhi      Loop1          ;dont pass any > 127
Ok       move.b   d3,(a1)+       ;save in writebuffer and increase pointer
         addq.l   #1,d1          ;add 1 to write count
         bra      Loop1
WriteBuffer:
         move.l   d1,d3          ;count in d3
         move.l   #Buffer2,d2    ;address of write buffer
         move.l   Destination,d1 ;filehandle for write
         jsr      _LVOWrite(a6)
         cmp.l    #-1,d0
         beq      WriteError     ;show error if d0 = -1
         jsr      CheckBreak     ;check for break by user <crtl-c>
         tst.l    d0
         bne      Abort
         bra      Loop
ShowUseage:
         pea      UseMess        ;Message to print
         jsr      _printf        ;print it
         addq.l   #4,sp
         move.l   SPSave,sp      ;get back original SP
         moveq.l  #0,d0
         rts                     ;return to CLI



CheckBreak:
         moveq.l  #0,d0
         move.l   #0,d1
         move.l   a6,-(sp)
         move.l   _SysBase,a6
         jsr      _LVOSetSignal(a6) ; get signals
         move.l   (sp)+,a6
         and.l    #$1000,d0
         sne      d1
         neg.b    d1
         ext.w    d1
         ext.l    d1
         move.l   d1,d0
         rts

CloseFiles:
         move.l   Destination,d1
         beq      Next               ;if destination file not open
         jsr      _LVOClose(a6)
Next     move.l   Source,d1
         beq      Next1              ;if source file not open
         jsr      _LVOClose(a6)
Next1    rts
                                     ;indicate from WB for close routines
FromWB   move.l   #1,FWB
         pea      InFile
         jsr      _printf
         addq.l   #4,sp
         move.l   _stdin,d1   ;filehandle
         move.l   #Name1,d2   ;name buffer
         move.l   #30,d3      ;filenames no longer than 30 chars
         jsr      _LVORead(a6)
         subq.l   #1,d0       ;adjust count back one
         lea      Name1,a0
         move.b   #0,0(a0,d0.w)     ;change LF to NULL
         pea      OutFile
         jsr      _printf
         addq.l   #4,sp
         move.l   _stdin,d1         ;filehandle
         move.l   #Name2,d2         ;name buffer
         move.l   #30,d3
         jsr      _LVORead(a6)
         subq.l   #1,d0       ;adjust count
         lea      Name1,a0
         lea      Name2,a1
         move.b   #0,0(a1,d0.w)     ;change LF to NULL
         bra      Go
Abort    pea      AbortMess
         jsr      _printf
         addq.l   #4,sp
         bra      Finish

OpenError:
         move.l   a0,-(sp)       ;save filename pointer
         jsr      _LVOIoErr(a6)  ;get error code
         move.l   (sp)+,a0       ;get pointer back
         move.l   d0,-(sp)
         move.l   a0,-(sp)
         pea      OpenErr
         jsr      _printf
         add.l    #12,sp
         bra      Finish
WriteError:
         jsr      _LVOIoErr(a6)
         move.l   d0,-(sp)
         move.l   DestErr,-(sp)
         pea      WriteErr
         jsr      _printf
         add.l    #12,sp
         bra      Finish
ReadError:
         jsr     _LVOIoErr(a6)
         move.l   d0,-(sp)
         move.l   SourceErr,-(sp)
         pea      ReadErr
         jsr      _printf
         add.l    #12,sp
Finish   jsr      CloseFiles     ;close any open files
         move.l   FWB,d0
         beq      NotFromWB
         move.l   #250,d1        ;5 secs delay to read message
         jsr      _LVODelay(a6)
NotFromWB:
         move.l   SPSave,sp
         moveq.l  #0,d0
         rts

SPSave      dc.l  0
FWB         dc.l  0
SourceErr   dc.l  0
DestErr     dc.l  0
Temp        dc.l  0
Source      dc.l  0
Destination dc.l  0
Buffer1     ds.b  512
Buffer2     ds.b  512
Name1       ds.b  35
Name2       ds.b  35
InFile      dc.b  'Please enter name of File to be Stripped: ',0
OutFile     dc.b  'Please enter Output Filename: ',0
UseMess     dc.b  'Useage: Stripper <source> <destination>',10,0
OpenErr     dc.b  'Error Opening file "%ls" Error Number %ld',10,0
ReadErr     dc.b  'Error Reading file "%ls" Error Number %ld',10,0
WriteErr    dc.b  'Error Writing file "%ls" Error Number %ld',10,0
AbortMess   dc.b  'Stripper Aborted by User',10,0
_TWspec     dc.b  'CON:0/0/640/200/Stripper',0

   end

