home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #3 / amigamamagazinepolishissue1998.iso / blabla / mungfriend / source / mungfriend3.4.s < prev   
Text File  |  1998-01-24  |  16KB  |  709 lines

  1. *-----------------------*
  2. *    MungFriend
  3. *    version 3.4 (rev 14)
  4. *    © 1995-97 Szymon Pura
  5. *    KickStart 2.0 required
  6. *-----------------------*
  7.  
  8. ***************************** VERSION HISTORY ******************************
  9. **                                                                        **
  10. **  V2.0    28.02.96    Initial release                                   **
  11. **  V2.1    04.03.96    TYPE & WRITE fixed                                **
  12. **          06.03.96    REMOVE fixed                                      **
  13. **          27.03.96    WRITE fixed                                       **
  14. **          09.04.96    Minor fixes                                       **
  15. **          27.05.96    Memory allocation fixed                           **
  16. **  V2.2    26.06.96    NOBELL option added                               **
  17. **  V2.3    17.11.96    FindResNode fixed                                 **
  18. **                      Priority set to 120                               **
  19. **                      KickMemList replaces AllocAbs()'es in InitProc    **
  20. **  V3.0    19.11.96    Totally redone memory allocation                  **
  21. **                      Priority set to 0                                 **
  22. **                      INFO improved                                     **
  23. **  V3.1    24.01.97    TYPE & WRITE improved                             **
  24. **                      Cache cleared                                     **
  25. **                      ROMTag fixed                                      **
  26. **  V3.1a   22.02.97    Should work correctly under -OS3.0                **
  27. **                        'BufferSize' error fixed  **
  28. **  V3.2    01.09.97    Another bug(/strange behaviour) fixed             **
  29. **  V3.3    02.10.97                                                      **
  30. **  V3.4    18.10.97    Oops, WRITE didn't check the buffer               **
  31. **                                                                        **
  32. ****************************************************************************
  33.  
  34.  
  35.     include    EInclude.m
  36.  
  37.     EInclude    DOS,DOS
  38.     EInclude    DOS,DOSEXTENS
  39.     EInclude    DOS,DOS_LIB
  40.     EInclude    EXEC,EXECBASE
  41.     EInclude    EXEC,EXEC_LIB
  42.     EInclude    EXEC,LIBRARIES
  43.     EInclude    EXEC,MEMORY
  44.     EInclude    EXEC,RESIDENT
  45.     EInclude    EXEC,STRINGS
  46.     EInclude    EXEC,TYPES
  47.     EInclude    HARDWARE,CUSTOM
  48.  
  49. MYVERSION    equ    3
  50. MYREVISION    equ    4
  51. custombase    equ    $dff000
  52.  
  53.     ifnd    _LVORawPutChar      * not defined in exec_lib.i
  54. _LVORawPutChar    equ    -516
  55.     endc
  56.  
  57. *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
  58.  
  59.     STRUCTURE    MFResidentNode,0
  60.     APTR    mfrn_MyResident
  61.     APTR    mfrn_Succ
  62.     ULONG    mfrn_null    ; end of the array
  63.  
  64.     UWORD    mfrn_Version
  65.     UWORD    mfrn_Revision
  66.     UBYTE    mfrn_Flags
  67.     UBYTE    pad    ; unused at the moment...
  68.  
  69. ; start of Resident structure
  70.  
  71.     STRUCT    mfrn_Resident,RT_SIZE
  72.     STRUCT    mfrn_IDString,60
  73.     STRUCT    mfrn_NameString,12
  74.     STRUCT    mfrn_Reserved,20    ; unused at the moment...
  75.  
  76. ; start of the MemList structure
  77.  
  78.     LABEL    mfrn_MemList
  79.     STRUCT    mfrn_Node,LN_SIZE
  80.     UWORD    mfrn_NumEntries    ; just one entry...
  81.     APTR    mfrn_NodePtr
  82.     ULONG    mfrn_NodeSize
  83.  
  84.     ULONG    mfrn_CharsInBuff
  85.     ULONG    mfrn_BufferSize
  86.  
  87. ; special procs
  88.  
  89.     STRUCT    mfrn_InitProc,50    * only about 30 bytes needed...
  90.     STRUCT    mfrn_PatchProc,200    * only about 130 bytes needed...
  91.     APTR    mfrn_OldVector    * original _LVORawPutChar value
  92.  
  93. ; buffer starts here
  94.  
  95.     LABEL    mfrn_Buffer
  96.     LABEL    mfrn_SIZEOF
  97.  
  98. ; defs for mfrn_Flags
  99.  
  100.     BITDEF    MFRN,FLASH,0
  101.     BITDEF    MFRN,SERIAL,1
  102.     BITDEF    MFRN,TRACE,2
  103.     BITDEF    MFRN,PATCHED,3
  104.     BITDEF    MFRN,OVERFLOW,4
  105.     BITDEF    MFRN,NOBELLS,5
  106.  
  107. ****************************************************************************
  108.  
  109. Start    lea    DosLibName(pc),a1
  110.     moveq    #0,d0
  111.     CALLEXEC    OpenLibrary
  112.     move.l    d0,_DOSBase
  113.     move.l    d0,a6
  114.     JSRL    Input
  115.     move.l    d0,MyInput
  116.     JSRL    Output
  117.     move.l    d0,MyOutput
  118.     move.w    LIB_VERSION(a6),d0
  119.     cmpi.w    #35,d0
  120.     bhi    strt_0
  121.     move.l    a6,a1
  122.     CALLEXEC    CloseLibrary
  123.     moveq    #RETURN_FAIL,d0
  124.     rts
  125. strt_0    lea    MyTemplate(pc),a1
  126.     move.l    a1,d1
  127.     lea    MyArgTable,a2
  128.     move.l    a2,d2
  129.     moveq    #0,d3
  130.     JSRL    ReadArgs
  131.     move.l    d0,ArgPtr
  132.     bne    strt_1
  133.     JSRL    IoErr
  134.     moveq    #0,d2
  135.     JSRL    PrintFault
  136.     movea.l    a6,a1
  137.     CALLEXEC    CloseLibrary
  138.     moveq    #RETURN_FAIL,d0
  139.     rts
  140. strt_1    moveq    #-1,d0
  141.     moveq    #6,d1
  142.     move.l    a2,a0
  143. strt_c    tst.l    (a0)+
  144.     sne    d2
  145.     andi.b    #1,d2
  146.     add.b    d2,d0
  147.     dbf    d1,strt_c
  148.     tst.b    d0
  149.     beq    strt_2
  150.     addq.b    #1,d0
  151.     beq    strt_2
  152.     lea    TooManyCommands(pc),a0
  153. QuitStrErr
  154.     bsr    PrintString
  155. QuitErr    bsr    Quit
  156.     moveq    #RETURN_FAIL,d0
  157.     rts
  158. Quit    move.l    ArgPtr(pc),d1
  159.     CALLDOS    FreeArgs
  160.     move.l    a6,a1
  161.     CALLEXEC    CloseLibrary
  162.     rts
  163. FlagError
  164.     lea    FlagErrorTxt(pc),a0
  165.     bra    QuitStrErr
  166. strt_2    bsr    FindResNode
  167.     move.l    d0,MFNode
  168.     move.l    d0,a3
  169.     move.l    a2,a0
  170.     tst.l    36(a0)
  171.     beq    strt_3
  172.     tst.l    40(a0)
  173.     bne    FlagError
  174. strt_3    tst.l    44(a0)
  175.     beq    strt_4
  176.     tst.l    48(a0)
  177.     bne    FlagError
  178. strt_4    tst.l    52(a0)
  179.     beq    strt_5
  180.     tst.l    56(a0)
  181.     bne    FlagError
  182. strt_5    tst.l    60(a0)
  183.     beq    strt_f
  184.     tst.l    64(a0)
  185.     bne    FlagError
  186. strt_f    tst.l    MFNode
  187.     beq    strt_b
  188.     tst.l    36(a0)
  189.     beq    strt_6
  190.     bset    #MFRNB_FLASH,mfrn_Flags(a3)
  191. strt_6    tst.l    40(a0)
  192.     beq    strt_7
  193.     bclr    #MFRNB_FLASH,mfrn_Flags(a3)
  194. strt_7    tst.l    52(a0)
  195.     beq    strt_8
  196.     bset    #MFRNB_TRACE,mfrn_Flags(a3)
  197.     bset    #MFRNB_PATCHED,mfrn_Flags(a3)
  198.     bne    strt_8
  199.     movem.l    a0/a1/a6,-(sp)
  200.     movea.l    4.w,a6
  201.     lea    mfrn_PatchProc(a3),a0
  202.     move.l    a0,d0
  203.     lea    _LVORawPutChar,a0
  204.     move.l    a6,a1
  205.     JSRL    Disable
  206.     JSRL    SetFunction
  207.     JSRL    Enable
  208.     move.l    d0,mfrn_OldVector(a3)
  209.     movem.l    (sp)+,a0/a1/a6
  210. strt_8    tst.l    56(a0)
  211.     beq    strt_9
  212.     bclr    #MFRNB_TRACE,mfrn_Flags(a3)
  213. strt_9    tst.l    44(a0)
  214.     beq    strt_a
  215.     bset    #MFRNB_SERIAL,mfrn_Flags(a3)
  216. strt_a    tst.l    48(a0)
  217.     beq    strt_d
  218.     bclr    #MFRNB_SERIAL,mfrn_Flags(a3)
  219. strt_d    tst.l    60(a0)
  220.     beq    strt_e
  221.     bset    #MFRNB_NOBELLS,mfrn_Flags(a3)
  222. strt_e    tst.l    64(a0)
  223.     beq    strt_b
  224.     bclr    #MFRNB_NOBELLS,mfrn_Flags(a3)
  225. strt_b    tst.l    (a0)+
  226.     bne    f_Info
  227.     tst.l    (a0)+
  228.     bne    f_Install
  229.     tst.l    (a0)+
  230.     bne    f_Clear
  231.     tst.l    (a0)+
  232.     bne    f_Remove
  233.     tst.l    (a0)+
  234.     bne    f_Type
  235.     tst.l    (a0)+
  236.     bne    f_Write
  237.     tst.l    (a0)
  238.     bne    QuitOk
  239.     lea    NoCommand(pc),a0
  240.     bra    QuitStrErr
  241. f_Info    tst.l    MFNode
  242.     beq    NotInstalled
  243.     move.l    MFNode(pc),a2
  244.     lea    InfoFormat(pc),a0
  245.     move.l    a0,d2
  246.     move.l    MyOutput(pc),d1
  247.     lea    InfoFormatArgs(pc),a0
  248.     move.l    a0,d3
  249.     move.l    mfrn_BufferSize(a2),d0
  250.     subq.l    #4,d0
  251.     move.l    d0,(a0)+
  252.     lea    NoTraceT(pc),a1
  253.     move.l    a1,(a0)+
  254.     btst    #MFRNB_TRACE,mfrn_Flags(a2)
  255.     beq    finf_0
  256.     addq.l    #2,-4(a0)
  257. finf_0    lea    NoSerialT(pc),a1
  258.     move.l    a1,(a0)+
  259.     btst    #MFRNB_SERIAL,mfrn_Flags(a2)
  260.     beq    finf_1
  261.     addq.l    #2,-4(a0)
  262. finf_1    lea    NoFlashT(pc),a1
  263.     move.l    a1,(a0)+
  264.     btst    #MFRNB_FLASH,mfrn_Flags(a2)
  265.     beq    finf_2
  266.     addq.l    #2,-4(a0)
  267. finf_2    lea    NoBellsT(pc),a1
  268.     move.l    a1,(a0)+
  269.     btst    #MFRNB_NOBELLS,mfrn_Flags(a2)
  270.     bne    finf_3
  271.     lea    BellsT(pc),a1
  272.     move.l    a1,(a0)+
  273. finf_3    move.l    mfrn_CharsInBuff(a2),CharsInBuffSpace
  274.     CALLDOS    VFPrintf
  275.     bra    QuitOk
  276. f_Clear    tst.l    MFNode
  277.     beq    NotInstalled
  278.     move.l    MFNode(pc),a2
  279.     clr.l    mfrn_CharsInBuff(a2)
  280.     bclr    #MFRNB_OVERFLOW,mfrn_Flags(a2)
  281.     bra    QuitOk
  282. f_Remove
  283.     tst.l    MFNode
  284.     beq    NotInstalled
  285.     move.l    MFNode(pc),a2
  286.     movea.l    4.w,a6
  287.     btst    #MFRNB_PATCHED,mfrn_Flags(a2)
  288.     beq    frem_3
  289.     lea    _LVORawPutChar,a0
  290.     move.l    mfrn_OldVector(a2),d0
  291.     move.l    a6,a1
  292.     JSRL    Disable
  293.     JSRL    SetFunction
  294.     lea    mfrn_PatchProc(a2),a0
  295.     cmp.l    a0,d0
  296.     beq    frem_3
  297.     move.l    a6,a1
  298.     lea    _LVORawPutChar,a0
  299.     JSRL    SetFunction
  300.     JSRL    Enable
  301.     lea    CantQuitTxt(pc),a0
  302.     bra    QuitStrErr
  303. frem_3    JSRL    Enable
  304.     move.l    MFNode(pc),a0
  305.     JSRL    Forbid
  306.     lea    KickTagPtr(a6),a2
  307. frem_0    move.l    (a2),a1
  308.     move.l    a1,d0
  309.     beq    frem_1
  310.     cmpa.l    a0,a1
  311.     beq    frem_2
  312.     lea    4(a1),a2
  313.     bra    frem_0
  314. frem_2    move.l    4(a0),(a2)
  315. frem_1    lea    KickMemPtr(a6),a2
  316.     move.l    MFNode(pc),a0
  317.     lea    mfrn_Node(a0),a0
  318. 1$    move.l    (a2),a1
  319.     move.l    a1,d0
  320.     beq    2$
  321.     cmpa.l    a0,a1
  322.     beq    3$
  323.     move.l    (a2),a2
  324.     bra    1$
  325. 3$    move.l    (a0),(a2)
  326. 2$    JSRL    SumKickData
  327.     move.l    d0,KickCheckSum(a6)
  328.     JSRL    CacheClearU
  329.     JSRL    Permit
  330.     move.l    MFNode(pc),a0
  331.     bsr    FreeResNode
  332.     bra    QuitOk
  333. NoMemory
  334.     lea    NoMemoryTxt(pc),a0
  335.     bra    QuitStrErr
  336. NoBuffSize
  337.     lea    NoBuffSizeTxt(pc),a0
  338.     bra    QuitStrErr
  339. f_Install
  340.     tst.l    MFNode
  341.     bne    AlreadyInstalled
  342.     move.l    28(a2),d0
  343.     beq    NoBuffSize
  344.     move.l    28(a2),a0
  345.     move.l    (a0),d0
  346.     cmpi.l    #10239,d0
  347.     bhi    1$
  348.     lea    Using10KBTxt(pc),a0
  349.     bsr    PrintString
  350.     move.l    #10240,d0
  351. 1$    bsr    CreateNode
  352.     tst.l    d0
  353.     beq    NoMemory
  354.     move.l    d0,a3
  355.     move.l    d0,MFNode
  356.     tst.l    44(a2)
  357.     beq    finst_0
  358.     bset    #MFRNB_SERIAL,mfrn_Flags(a3)
  359. finst_0    tst.l    36(a2)
  360.     beq    finst_1
  361.     bset    #MFRNB_FLASH,mfrn_Flags(a3)
  362. finst_1    tst.l    52(a2)
  363.     beq    finst_2
  364.     bset    #MFRNB_TRACE,mfrn_Flags(a3)
  365.     bset    #MFRNB_PATCHED,mfrn_Flags(a3)
  366.     movea.l    4.w,a6
  367.     lea    _LVORawPutChar,a0
  368.     lea    mfrn_PatchProc(a3),a1
  369.     move.l    a1,d0
  370.     move.l    a6,a1
  371.     JSRL    SetFunction
  372.     move.l    d0,mfrn_OldVector(a3)
  373. finst_2    tst.l    60(a2)
  374.     beq    finst_3
  375.     bset    #MFRNB_NOBELLS,mfrn_Flags(a3)
  376. finst_3    movea.l    4.w,a6
  377.     JSRL    Forbid
  378.     JSRL    Disable
  379.     move.l    KickTagPtr(a6),mfrn_Succ(a3)
  380.     move.l    a3,KickTagPtr(a6)
  381.     move.l    KickMemPtr(a6),mfrn_Node(a3)
  382.     lea    mfrn_MemList(a3),a0
  383.     move.l    a0,KickMemPtr(a6)
  384.     JSRL    Enable
  385.     JSRL    SumKickData
  386.     move.l    d0,KickCheckSum(a6)
  387.     JSRL    Permit
  388.     bra    QuitOk
  389. AlreadyInstalled
  390.     lea    AlreadyInstalledTxt(pc),a0
  391.     bsr    PrintString
  392.     bra    QuitOk
  393. NotInstalled
  394.     lea    NotInstalledTxt(pc),a0
  395.     bsr    PrintString
  396. QuitOk    bsr    Quit
  397.     moveq    #RETURN_OK,d0
  398.     rts
  399. PrintString    * (string)(a0)
  400.     move.l    a6,-(sp)
  401.     move.l    a0,d1
  402.     CALLDOS    PutStr
  403.     move.l    (sp)+,a6
  404.     rts
  405. FindResNode    * () -> resnode/NULL
  406.     movem.l    a2/a6,-(sp)
  407.     CALLEXEC    Forbid
  408.     move.l    KickTagPtr(a6),a0
  409. frn_3    move.l    a0,d0
  410.     beq    frn_ex
  411. frn_0    move.l    (a0),a1
  412.     move.l    RT_NAME(a1),a1
  413.     lea    MyNameString(pc),a2
  414. frn_1    move.b    (a1)+,d0
  415.     cmp.b    (a2)+,d0
  416.     bne    frn_2
  417.     tst.b    d0
  418.     bne    frn_1
  419.     move.l    a0,d0
  420.     JSRL    Permit
  421.     movem.l    (sp)+,a2/a6
  422.     rts
  423. frn_ex    JSRL    Permit
  424.     moveq    #0,d0
  425.     movem.l    (sp)+,a2/a6
  426.     rts
  427. frn_2    move.l    4(a0),a0
  428.     bra    frn_3
  429. FreeResNode    * (node)(a0)
  430.     move.l    a6,-(sp)
  431.     move.l    mfrn_NodeSize(a0),d0
  432.     move.l    a0,a1
  433.     CALLEXEC    FreeMem
  434.     move.l    (sp)+,a6
  435.     rts
  436. crn_failed
  437.     movem.l    (sp)+,d2/a2/a3/a6
  438.     rts
  439. CreateNode    * (buffsize)(d0) -> node
  440.     movem.l    d2/a2/a3/a6,-(sp)
  441.     addq.l    #4,d0
  442.     move.l    d0,d2
  443.     move.l    #MEMF_KICK!MEMF_PUBLIC!MEMF_CLEAR!MEMF_LOCAL,d1
  444.     add.l    #mfrn_SIZEOF,d0
  445.     movea.l    4.w,a6
  446.     cmpi.w    #38,LIB_VERSION(a6)
  447.     bhi    5$
  448.     bclr    #MEMB_KICK,d1
  449. 5$    move.l    d0,-(sp)
  450.     JSRL    AllocMem
  451.     move.l    (sp)+,d1
  452.     tst.l    d0
  453.     beq    crn_failed
  454.     move.l    d0,a2
  455.     move.l    d0,mfrn_NodePtr(a2)
  456.     move.l    d1,mfrn_NodeSize(a2)
  457.     move.l    d2,mfrn_BufferSize(a2)
  458.     lea    mfrn_Resident(a2),a1
  459.     move.l    a1,mfrn_MyResident(a2)
  460.     move.w    #RTC_MATCHWORD,RT_MATCHWORD(a1)
  461.     move.b    #0,RT_PRI(a1)
  462.     move.l    a1,RT_MATCHTAG(a1)
  463.     move.b    #RTF_COLDSTART,RT_FLAGS(a1)
  464.     move.b    #MYVERSION,RT_VERSION(a1)
  465.     lea    MyNameString(pc),a0
  466.     lea    mfrn_NameString(a2),a3
  467.     move.l    a3,RT_NAME(a1)
  468. 1$    move.b    (a0)+,(a3)+
  469.     bne    1$
  470.     lea    MyIDString(pc),a0
  471.     lea    mfrn_IDString(a2),a3
  472.     move.l    a3,RT_IDSTRING(a1)
  473. 2$    move.b    (a0)+,(a3)+
  474.     bne    2$
  475.     lea    MyPatchProc(pc),a0
  476.     lea    mfrn_PatchProc(a2),a3
  477.     move.l    #MyPatchProcE-MyPatchProc-1,d0
  478. 3$    move.b    (a0)+,(a3)+
  479.     dbf    d0,3$
  480.     lea    MyInitProc(pc),a0
  481.     lea    mfrn_InitProc(a2),a3
  482.     move.l    a3,RT_INIT(a1)
  483.     move.l    #MyInitProcE-MyInitProc-1,d0
  484. 4$    move.b    (a0)+,(a3)+
  485.     dbf    d0,4$
  486.     move.w    #1,mfrn_NumEntries(a2)
  487.     move.l    a2,d0
  488.     movem.l    (sp)+,d2/a2/a3/a6
  489.     rts
  490. f_Type    tst.l    MFNode
  491.     beq    NotInstalled
  492.     move.l    MyOutput(pc),d2
  493.     bsr    DoType
  494.     moveq    #LF,d2
  495.     move.l    MyOutput(pc),d1
  496.     CALLDOS    FPutC
  497.     move.l    MFNode(pc),a2
  498.     btst    #MFRNB_OVERFLOW,mfrn_Flags(a2)
  499.     beq    QuitOk
  500.     lea    BuffOverflow(pc),a0
  501.     bsr    PrintString
  502.     bra    QuitOk
  503. BadFileName
  504.     lea    BadFileNameTxt(pc),a0
  505.     bra    QuitStrErr
  506. f_Write
  507.     tst.l    MFNode
  508.     beq    NotInstalled
  509.     move.l    32(a2),d0
  510.     beq    BadFileName
  511.     move.l    d0,d1
  512.     move.l    #MODE_NEWFILE,d2
  513.     CALLDOS    Open
  514.     move.l    d0,d7
  515.     bne    fwrt_0
  516.     CALLDOS    IoErr
  517.     move.l    d0,d1
  518.     moveq    #0,d2
  519.     CALLDOS    PrintFault
  520.     bra    QuitErr
  521. fwrt_0    move.l    d7,d2
  522.     bsr    DoType
  523.     tst.l    d0
  524.     bne    fwrt_1
  525.     move.l    MFNode(pc),a2
  526.     btst    #MFRNB_OVERFLOW,mfrn_Flags(a2)
  527.     beq    fwrt_1
  528.     lea    BuffOverflow(pc),a0
  529.     move.l    d7,d1
  530.     move.l    a0,d2
  531.     CALLDOS    FPuts
  532.     tst.l    d0
  533.     beq    fwrt_1
  534.     JSRL    IoErr
  535.     move.l    d0,d1
  536.     moveq    #0,d2
  537.     JSRL    PrintFault
  538.     bra    fwrt_2
  539. fwrt_1    move.l    d7,d1
  540.     CALLDOS    Close
  541.     bra    QuitOk
  542. fwrt_2    move.l    d7,d1
  543.     CALLDOS    Close
  544.     move.l    32+MyArgTable,d1
  545.     JSRL    DeleteFile
  546.     bra    QuitErr
  547. DoType    *    (d2-fh)
  548.     movem.l    d1-d7,-(sp)
  549.     move.l    d2,d7    ; fh
  550.     moveq    #20,d6    ; 20 bytes a time
  551.     move.l    MFNode(pc),a0
  552.     lea    mfrn_Buffer(a0),a1
  553.     move.l    a1,d5    ; buffer
  554.     move.l    mfrn_CharsInBuff(a0),d4    ; len
  555.     addq.l    #4,d5    ; let's skip some private data...
  556. 1$    tst.l    d4
  557.     beq    3$
  558.     cmp.l    d6,d4
  559.     bge    2$
  560.     move.l    d4,d6
  561. 2$    move.l    #SIGBREAKF_CTRL_C,d1
  562.     CALLDOS    CheckSignal
  563.     tst.l    d0
  564.     bne    4$
  565.     move.l    d7,d1
  566.     move.l    d5,d2
  567.     move.l    d6,d3
  568.     sub.l    d6,d4
  569.     add.l    d6,d5
  570.     move.l    d4,-(sp)
  571.     moveq    #1,d4
  572.     CALLDOS    FWrite
  573.     move.l    (sp)+,d4
  574.     subq.l    #1,d0
  575.     beq    1$
  576.     JSRL    IoErr
  577.     move.l    d0,d1
  578.     moveq    #0,d2
  579.     JSRL    PrintFault
  580.     moveq    #-1,d0
  581.     movem.l    (sp)+,d1-d7
  582.     rts
  583. 3$    moveq    #0,d0
  584.     movem.l    (sp)+,d1-d7
  585.     rts
  586. 4$    lea    BreakTxt(pc),a0
  587.     bsr    PrintString
  588.     movem.l    (sp)+,d1-d7
  589.     moveq    #-2,d0
  590.     rts
  591. BreakTxt
  592.     dc.b    LF,'*** Break',LF,0
  593.     even
  594. MyPatchProc
  595.     lea    MyPatchProc-mfrn_PatchProc(pc),a0
  596.     btst    #MFRNB_TRACE,mfrn_Flags(a0)
  597.     beq    mppr_0
  598.     btst    #MFRNB_NOBELLS,mfrn_Flags(a0)
  599.     beq    mppr_5
  600.     cmpi.b    #BELL,d0
  601.     beq    mppr_0
  602. mppr_5    move.l    mfrn_CharsInBuff(a0),d1
  603.     move.l    d2,-(sp)
  604.     move.l    mfrn_BufferSize(a0),d2
  605.     subi.l    #4,d2
  606.     cmp.l    d1,d2
  607.     beq    mppr_4
  608.     addq.l    #1,mfrn_CharsInBuff(a0)
  609.     lea    mfrn_Buffer(a0),a1
  610.     move.b    d0,4(a1,d1.l)
  611. mppr_1    move.l    (sp)+,d2
  612. mppr_0    btst    #MFRNB_FLASH,mfrn_Flags(a0)
  613.     beq    mppr_2
  614.     lea    $dff000,a1
  615.     move.w    vhposr(a1),color(a1)
  616. mppr_2    btst    #MFRNB_SERIAL,mfrn_Flags(a0)
  617.     beq    mppr_3
  618.     move.l    mfrn_OldVector(a0),a0
  619.     jmp    (a0)
  620. mppr_3    rts
  621. mppr_4    bset    #MFRNB_OVERFLOW,mfrn_Flags(a0)
  622.     bra    mppr_1
  623. MyPatchProcE
  624. MyInitProc
  625.     lea    MyInitProc-mfrn_InitProc(pc),a0
  626.     andi.b    #~(MFRNF_PATCHED!MFRNF_TRACE),mfrn_Flags(a0)
  627. NullExit
  628.     moveq    #0,d0
  629. Exit    rts
  630. MyInitProcE
  631.  
  632. ****************************************************************************
  633.  
  634. MFNode    dc.l    0
  635. _DOSBase
  636.     dc.l    0
  637. MyInput    dc.l    0
  638. MyOutput
  639.     dc.l    0
  640. ArgPtr    dc.l    0
  641. InfoFormatArgs
  642.     dc.l    0,0,0,0,0
  643. CharsInBuffSpace
  644.     dc.l    0
  645. DosLibName
  646.     DOSNAME
  647. MyNameString
  648.     dc.b    'MungFriend',0
  649.     even
  650.     dc.b    '$VER: '
  651. MyIDString
  652.     dc.b    'MungFriend 3.4  (18.10.97) BLABLA PRODUCT',CR,LF,0
  653. MyTemplate
  654.     dc.b    'INFO=I/S,INSTALL=S/S,CLEAR=C/S,REMOVE=R/S,TYPE=T/S,WRITE=W/S,UPDATE=U/S,SIZE/N/K,TO,FLASH/S,NOFLASH/S,SERIAL/S,NOSERIAL/S,TRACE/S,NOTRACE/S,NOBELLS/S,BELLS/S',0
  655. BuffOverflow
  656.     dc.b    '*** WARNING: BUFFER OVERFLOW ***',LF,0
  657. TooManyCommands
  658.     dc.b    'Bad args - only ONE command allowed',LF,0
  659. FlagErrorTxt
  660.     dc.b    'Bad args - flags are mutual exclusive',LF,0
  661. NoCommand
  662.     dc.b    $1b,'[32mMungFriend 3.4',$1b,'[31m   © 1995-97 Szymon Pura, FREEWARE - BLABLA PRODUCT',LF
  663.     dc.b    'USAGE:',LF
  664.     dc.b    '    MungFriend INFO|INSTALL|CLEAR|REMOVE|TYPE|WRITE|UPDATE [SIZE n]',LF
  665.     dc.b    '               [TO filespec] [FLASH|NOFLASH][TRACE|NOTRACE][SERIAL|NOSERIAL]',LF
  666.     dc.b    '               [BELLS|NOBELLS]',LF,LF
  667.     dc.b    '    MungFriend [<command> [<options>]]',LF,LF
  668.     dc.b    '           Where <command> is one of:',LF
  669.     dc.b    '   - info             - display some general info about current buffer',LF
  670.     dc.b    '   - install size <n> - create a new buffer (size in bytes)',LF
  671.     dc.b    '   - remove           - remove current buffer',LF
  672.     dc.b    '   - type             - type buffer contents',LF
  673.     dc.b    '   - write <filename> - write buffer contents to a file',LF
  674.     dc.b    '   - update           - update options,',LF
  675.     dc.b    '           And <options> are:',LF
  676.     dc.b    '   - serial           - allow serial output',LF
  677.     dc.b    '   - trace            - turn on exec/RawPutChar() tracing',LF
  678.     dc.b    '   - flash            - turn on flash mode',LF
  679.     dc.b    '   - bells            - allow console bells',LF,LF,0
  680. NotInstalledTxt
  681.     dc.b    'MungFriend is not installed !',LF,0
  682. InfoFormat
  683.     dc.b    'BuffSize: %ld  Options: %s  %s  %s  %s',LF
  684.     dc.b    'Characters in buffer: %ld',LF,0
  685. NoTraceT
  686.     dc.b    'NOTRACE',0
  687. NoFlashT
  688.     dc.b    'NOFLASH',0
  689. NoSerialT
  690.     dc.b    'NOSERIAL',0
  691. NoBellsT
  692.     dc.b    'NOBELLS',0
  693. BellsT    dc.b    'BELLS',0
  694. CantQuitTxt
  695.     dc.b    "Can't quit !!  Someone is using RawPutChar() vector !!",LF,0
  696. AlreadyInstalledTxt
  697.     dc.b    'MungFriend is already installed !!',LF,0
  698. NoMemoryTxt
  699.     dc.b    'Not enough memory',LF,0
  700. NoBuffSizeTxt
  701.     dc.b    'Bad args - no buffer size',LF,0
  702. BadFileNameTxt
  703.     dc.b    'Bad args - filespec required',LF,0
  704. Using10KBTxt
  705.     dc.b    'Allocated buffer: 10 KB',LF,0
  706.     section    "args",BSS
  707. MyArgTable
  708.     ds.b    68
  709.