home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 240.lha / Tee_v1.0 / tee.asm < prev    next >
Assembly Source File  |  1989-05-01  |  8KB  |  365 lines

  1. ;
  2. ;       Sorry for the total lack of comments, but I'm too busy studying
  3. ;       for my finals to spend the time.
  4. ;
  5. ;       This program was assembled with Gibbs A68K 2.42, and linked
  6. ;       using BLink.
  7. ;
  8.         INCLUDE "exec/types.i"
  9.  
  10.         STRUCTURE Main,0                ; uninitialized data area (BSS)
  11.  
  12.         APTR    dosBase                 ; dos.library
  13.         STRUCT  FileList,384
  14.         STRUCT  Buffer,260
  15.         STRUCT  PrintableB,260
  16.         LABEL   Tee_Size
  17.  
  18. CALLSYS MACRO
  19.         XREF    _LVO\1
  20.         jsr     _LVO\1(A6)
  21.         ENDM
  22.  
  23. LINKSYS MACRO
  24.         MOVE.L  \2Base(a5),A6
  25.         CALLSYS \1
  26.         move.l  D7,A6
  27.         ENDM
  28.  
  29. OPENLIBA MACRO
  30.         lea     \1Name(pc),A1
  31.         moveq.l  #0,D0
  32.         CALLSYS OpenLibrary
  33.         move.l  D0,\1Base(a5)
  34.         beq     No\1
  35.         ENDM
  36.  
  37. CLOSELIB MACRO
  38.         move.l  \1Base(a5),A1
  39.         move.l  A1,D0
  40.         beq     No\1
  41.         CALLSYS CloseLibrary
  42. No\1:
  43.         ENDM
  44.  
  45.  
  46. _AbsExecBase(A5)    EQU     4
  47.  
  48. FLAG_Protect        EQU     1
  49. FLAG_Append         EQU     2
  50. FLAG_Filter         EQU     3
  51. FLAG_NoClose        EQU     4
  52.  
  53. FLAG_ScreenUsed     EQU     8
  54. FLAG_OpenedFile     EQU     9
  55. FLAG_InterOut       EQU    10
  56. FLAG_InterIn        EQU    11
  57. FLAG_NoOut          EQU    12
  58.  
  59. MODE_OLDFILE        EQU  1005
  60. MODE_NEWFILE        EQU  1006
  61. ACCESS_WRITE        EQU    -1
  62. OFFSET_END          EQU     1
  63.  
  64. TEE:
  65.         move.l  $4,a6           ;get execbase
  66.         move.l  A0,A4
  67.         clr.b   -1(A0,D0.l)
  68.         cmp.b   #10,-2(a0,d0.l)
  69.         bne.s   DontZero
  70.         clr.b   -2(A0,D0.l)
  71. DontZero:
  72.         move.w  #(Tee_Size/4)-1,D0
  73.         move.l  A6,D7
  74. ClrStk:
  75.         clr.l   -(a7)
  76.         dbra    D0,ClrStk
  77.         move.l  A7,A5
  78.         OPENLIBA dos
  79.         clr.l   D6
  80.         LINKSYS Input,dos
  81.         move.l  D0,D5
  82.         move.l  D5,D1
  83.         LINKSYS IsInteractive,dos
  84.         tst.l   D0
  85.         beq.s   NotInputInter
  86.         bset    #FLAG_ScreenUsed,D6
  87.         bset    #FLAG_InterIn,D6
  88. NotInputInter:
  89.         LINKSYS Output,dos
  90.         lea     FileList(A5),A0
  91.         move.l  A0,A3
  92.         addq.l  #6,A3
  93.         move.l  D0,(A0)
  94.         move.l  D0,D1
  95.         bset    #FLAG_NoClose,4(A0)
  96.         LINKSYS IsInteractive,dos
  97.         tst.l   D0
  98.         beq.s   NotOutputInter
  99.         btst    #FLAG_InterIn,D6
  100.         beq.s   O.K.IO
  101.         subq.l  #6,A3
  102.         clr.l   (A3)
  103.         bset    #FLAG_NoOut,D6
  104. O.K.IO:
  105.         bset    #FLAG_ScreenUsed,D6
  106.         bset    #FLAG_InterOut,D6
  107. NotOutputInter:
  108.         clr.l   D3
  109. Parse:
  110.         bsr     SkipSpace
  111.         tst.b   (A4)
  112.         beq     ParseDone
  113. ParseNonSpace:
  114.         cmp.b   #'-',(A4)
  115.         bne.s   NotFlag
  116.         addq.l  #1,A4
  117. ParseFlags:
  118.         move.b  (a4)+,D0
  119.         beq     ParseDone
  120.         cmp.b   #' ',D0
  121.         beq     Parse
  122.         cmp.b   #'A',D0
  123.         bne.s   NotGlobApp
  124.         bset    #FLAG_Append,D6
  125. NotGlobApp:
  126.         cmp.b   #'a',D0
  127.         bne.s   NotLocApp
  128.         bset    #FLAG_Append,D3
  129. NotLocApp:
  130.         cmp.b   #'F',D0
  131.         bne.s   NotGlobFilt
  132.         bset    #FLAG_Filter,D6
  133. NotGlobFilt:
  134.         cmp.b   #'f',D0
  135.         bne.s   NotLocFilt
  136.         bset    #FLAG_Filter,D3
  137. NotLocFilt:
  138.         cmp.b   #'P',D0
  139.         bne.s   NotGlobProt
  140.         bset    #FLAG_Protect,D6
  141. NotGlobProt:
  142.         cmp.b   #'p',D0
  143.         bne.s   NotLocProt
  144.         bset    #FLAG_Protect,D3
  145. NotLocProt:
  146.         cmp.b   #'?',D0
  147.         bne     ParseFlags
  148.         bra     Help
  149. NotFlag:
  150.         bsr     SkipSpace
  151.         or.l    D6,D3
  152.         move.l  A4,A2
  153.         moveq.b #' ',D0
  154.         cmp.b   #'"',(A4)+
  155.         bne.s   UnQuoted
  156.         move.b  #'"',D0
  157.         move.l  A4,A2
  158. UnQuoted:
  159.         cmp.b   (A4),D0
  160.         beq.s   Terminator
  161.         tst.b   (A4)+
  162.         bne     UnQuoted
  163.         subq.l  #1,A4
  164.         bra.s   Terminated
  165. Terminator:
  166.         clr.b   (A4)+
  167. Terminated:
  168.         cmp.b   #'*',(A2)
  169.         bne.s   NotScreen
  170.         bsr     OpenScreen
  171.         bra     Parse
  172. NotScreen:
  173.         cmp.b   #'?',(A2)
  174.         beq     Help
  175.         bsr     Exists
  176.         beq.s   NewMode
  177.         btst    #FLAG_Protect,D3
  178.         bne     FileError
  179.         btst    #FLAG_Append,D3
  180.         beq.s   NewMode
  181.         move.l  #MODE_OLDFILE,D2
  182.         bra.s   OpenFile
  183. NewMode:
  184.         move.l  #MODE_NEWFILE,D2
  185. OpenFile:
  186.         move.l  A2,D1
  187.         LINKSYS Open,dos
  188.         tst.l   D0
  189.         beq     FileError
  190.         move.l  D0,(A3)
  191.         move.b  D3,4(A3)
  192.         addq.l  #6,A3
  193.         btst    #FLAG_Append,D3
  194.         beq.s   NotAppendFile
  195.         move.l  D0,D1
  196.         moveq.l #0,D2
  197.         moveq.l #OFFSET_END,D3
  198.         LINKSYS Seek,dos
  199. NotAppendFile:
  200.         move.l  D6,D3
  201.         bra     Parse
  202. ;
  203. ParseDone:
  204.         btst    #FLAG_NoOut,D6
  205.         bne.s   IgnoreFlags
  206.         bset    #FLAG_NoClose,D3
  207.         move.b  D3,8(A5)
  208.         move.l  D6,D3
  209. IgnoreFlags:
  210.         lea     10(a5),A4
  211.         cmp.l   A4,A3
  212.         bne.s   ChkNoOut
  213.         bsr     OpenScreen
  214. ChkNoOut:
  215.         subq.l  #6,A4
  216.         cmp.l   A4,A3
  217.         beq     Help
  218.         lea     Buffer(A5),A2
  219.         lea     PrintableB(A5),A3
  220. TheLoop:
  221.         move.l  D5,D1
  222.         move.l  A2,D2
  223.         move.l #256,D3
  224.         LINKSYS Read,dos
  225.         move.l  D0,D4
  226.         ble     Abort
  227.         move.l  A2,A0
  228.         move.l  A3,A1
  229.         clr.l   D6
  230.         add.l   A0,D0
  231. PrintLoop:
  232.         move.b  (A0)+,D1
  233.         cmp.b   #10,D1
  234.         beq.s   Printable
  235.         cmp.b   #32,D1
  236.         bmi.s   NotPrintable
  237.         cmp.b   #127,D1
  238.         bpl.s   NotPrintable
  239. Printable:
  240.         move.b  D1,(A1)+
  241.         addq.l  #1,D6
  242. NotPrintable:
  243.         cmp.l   D0,A0
  244.         bne     PrintLoop
  245.         lea     FileList(A5),A4
  246. OutputLoop:
  247.         tst.l   (A4)
  248.         beq     TheLoop
  249.         move.l  A2,D2
  250.         move.l  D4,D3
  251.         btst    #FLAG_Filter,4(A4)
  252.         beq.s   OutPut
  253.         move.l  A3,D2
  254.         move.l  D6,D3
  255. OutPut:
  256.         move.l  (A4),D1
  257.         LINKSYS Write,dos
  258.         cmp.l   #-1,D0
  259.         beq     Abort
  260. NextOut:
  261.         addq.l  #6,A4
  262.         bra     OutputLoop
  263. ;
  264. Abort:
  265.         lea     FileList(A5),A3
  266. CloseAll:
  267.         move.l  (A3),D1
  268.         beq.s   CloseDone
  269.         btst    #FLAG_NoClose,4(A3)
  270.         bne.s   DontClose
  271.         LINKSYS Close,dos
  272. DontClose:
  273.         addq.l  #6,A3
  274.         bra     CloseAll
  275. CloseDone:
  276.         CLOSELIB dos
  277.         lea      Tee_Size(A5),A7
  278.         rts
  279.  
  280. SkipSpace:
  281.         cmp.b   #' ',(A4)+
  282.         beq     SkipSpace
  283. NonSpace:
  284.         subq.l  #1,A4
  285.         rts
  286.  
  287. OpenScreen:
  288.         btst    #FLAG_ScreenUsed,D6
  289.         bne.s   OpenSDone
  290.         lea     Screen(PC),A0
  291.         move.l  A0,D1
  292.         move.l  #MODE_OLDFILE,D2
  293.         LINKSYS Open,dos
  294.         tst.l   D0
  295.         beq.s   OpenSDone
  296.         move.l  D0,(A3)
  297.         move.b  D3,4(A3)
  298.         bset    #FLAG_ScreenUsed,D6
  299.         addq.l  #6,A3
  300. OpenSDone:
  301.         move.l  D6,D3
  302.         rts
  303.  
  304. Help:
  305.         lea     Helpmsg(PC),A0
  306.         bsr     PrintMsg
  307.         bra     Abort
  308.  
  309. Exists:
  310.         move.l  A2,D1
  311.         move.l  #ACCESS_WRITE,D2
  312.         LINKSYS Lock,dos
  313.         move.l  D0,D1
  314.         beq     NoExist
  315.         LINKSYS UnLock,dos
  316.         moveq.b #-1,D0
  317. NoExist:
  318.         rts
  319.  
  320. PrintMsg:
  321.         movem.l D0-D4/A0-A1,-(SP)
  322.         move.l  A0,D3
  323.         lea     Screen(PC),A0
  324.         move.l  A0,D1
  325.         move.l  #MODE_OLDFILE,D2
  326.         LINKSYS Open,dos
  327.         tst.l   D0
  328.         beq.s   NoWin
  329.         move.l  D0,D4
  330.         move.l  D0,D1
  331.         move.l  D3,D2
  332.         move.l  D3,A0
  333.         clr.l   D3
  334. FindEnd:
  335.         tst.b   0(A0,D3.l)
  336.         beq.s   FoundEnd
  337.         addq.l  #1,D3
  338.         bra     FindEnd
  339. FoundEnd:
  340.         LINKSYS Write,dos
  341.         move.l  D4,D1
  342.         LINKSYS Close,dos
  343. NoWin:
  344.         movem.l (SP)+,D0-D4/A0-A1
  345.         rts
  346.  
  347. FileError:
  348.         lea     FileErr(PC),A0
  349.         bsr     PrintMsg
  350.         move.l  A2,A0
  351.         bsr     PrintMsg
  352.         lea     LineFd(PC),A0
  353.         bsr     PrintMsg
  354.         bra     Abort
  355.  
  356.         EVEN
  357. dosName dc.b    "dos.library",0
  358. FileErr dc.b    "tee: Can't open ",0
  359. Helpmsg dc.b    "Usage:  tee [[-A|a|F|f|P|p] [filename]]...",10,0
  360. LineFd  dc.b    10,0
  361.         EVEN
  362. Screen  dc.b    "*",0
  363.         END
  364.  
  365.