home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Sound / Player / HF-AP210.LHA / APlayer / Files / Developer.lha / Examples / aaFreqAnalyzer-Scope.S next >
Encoding:
Text File  |  1996-03-21  |  16.0 KB  |  880 lines

  1. ; $VER: FreqAnalyzer-Scope.library 1.13
  2. ;
  3.  
  4.     INCDIR    "Includes3.0:Include3.0/"
  5.     INCLUDE    "Exec/Types.i"
  6.     INCLUDE    "Own/SystemBases.i"
  7.     INCLUDE    "Own/SystemStructures.i"
  8.     INCLUDE    "Own/SystemOffsets.i"
  9.     INCLUDE    "Own/AccessiblePlayer.i"
  10.     INCLUDE    "Own/IDCMP.i"
  11.     INCLUDE    "Own/Pens.i"
  12.     INCLUDE    "Own/Gadtools.i"
  13.     INCLUDE    "Own/Intuitiontags.i"
  14.  
  15.  
  16. VERSION        =    1
  17. REVISION    =    13
  18.  
  19. TRUE        =    -1
  20. FALSE        =    0
  21.  
  22. SIGBREAKB_CTRL_C=    12
  23. SIGBREAK_CTRL_C    =    1<<SIGBREAKB_CTRL_C
  24.  
  25. ; Library Data
  26.  
  27. LN_Name        =    10
  28. LN_Type        =    8
  29. NT_Library    =    9
  30.  
  31. LIBB_Summing    =    0
  32. LIBB_Changed    =    1
  33. LIBB_SumUsed    =    2
  34. LIBB_DelExp    =    3
  35.  
  36. LIBF_Summing    =    1<<LIBB_Summing
  37. LIBF_Changed    =    1<<LIBB_Changed
  38. LIBF_SumUsed    =    1<<LIBB_SumUsed
  39. LIBF_DelExp    =    1<<LIBB_DelExp
  40.  
  41. ; Macros
  42.  
  43. INBYTE    MACRO
  44.     dc.b    %11100000,0
  45.     dc.w    \1
  46.     dc.b    \2,0
  47.     ENDM
  48.  
  49. INWORD    MACRO
  50.     dc.b    %11010000,0
  51.     dc.w    \1,\2
  52.     ENDM
  53.  
  54. INLONG    MACRO
  55.     dc.b    %11000000,0
  56.     dc.w    \1
  57.     dc.l    \2
  58.     ENDM
  59.  
  60. ; Library Base Structure
  61.  
  62.     STRUCTURE LibraryStruct,0
  63.     STRUCT    LIB_Node,14
  64.     UBYTE    LIB_Flags
  65.     UBYTE    LIB_Pad
  66.     UWORD    LIB_NegSize
  67.     UWORD    LIB_PosSize
  68.     UWORD    LIB_Version
  69.     UWORD    LIB_Revision
  70.     APTR    LIB_IDString
  71.     ULONG    LIB_Sum
  72.     UWORD    LIB_OpenCnt
  73.  
  74.     LONG    LIB_SegList
  75.     APTR    LIB_DosBase
  76.     LABEL    LibraryStruct_SIZEOF
  77.  
  78.  
  79.     SECTION    FreqAnalyzer-Scope.library,CODE
  80.  
  81. START    moveq    #0,d0
  82.     rts
  83. ;------------------------------------------------------------------------------
  84. LIBNAME    dc.b    "aaFreqAnalyzer-Scope.library",0
  85.  
  86. LIBID    dc.b    "FreqAnalyzer-Scope.library 1.13 (7-March-1996)",0
  87.     even
  88. ;------------------------------------------------------------------------------
  89. ; ROMTAG Structure
  90. ;
  91.  
  92. ROMTAG    dc.w    $4afc            ;ROMTAG Indentifier
  93.     dc.l    romtag
  94.     dc.l    slut
  95.     dc.b    $80            ;Flags
  96.     dc.b    version
  97.     dc.b    $09            ;Type Of Module
  98.     dc.b    $00            ;Initialization Priority
  99.     dc.l    libname
  100.     dc.l    libid
  101.     dc.l    autinit            ;Pointer To AUTOINIT Table
  102. ;------------------------------------------------------------------------------
  103. ; AUTOINIT Table
  104. ;
  105.  
  106. AUTINIT    dc.l    LibraryStruct_SIZEOF    ;Size Of Structure AFTER Base Address
  107.     dc.l    vector            ;Pointer To Vector Table
  108.     dc.l    inittab            ;Pointer To Init Structure
  109.     dc.l    init            ;Pointer To Init Routine
  110. ;------------------------------------------------------------------------------
  111. ; Init Table
  112. ;
  113.  
  114. INITTAB    INBYTE    LN_Type,NT_Library
  115.     INBYTE    LIB_Flags,LIBF_SumUsed!LIBF_Changed
  116.     INWORD    LIB_Version,version
  117.     INWORD    LIB_Revision,revision
  118.     INLONG    LN_Name,libname
  119.     INLONG    LIB_IDString,libid
  120.     dc.l    0
  121. ;------------------------------------------------------------------------------
  122. ; Vector Table
  123. ;
  124.  
  125. VECTOR    dc.w    -1
  126.     dc.w    opnlib-vector,clslib-vector,expunge-vector,extfunc-vector
  127.     dc.w    FA_GetTags-vector
  128.     dc.w    -1
  129. ;------------------------------------------------------------------------------
  130. ; Init Routine
  131. ;
  132.  
  133. INIT    movem.l    d1-d7/a0-a6,-(sp)
  134.     move.l    d0,a4            ;Base Address
  135.     move.l    a0,LIB_SegList(a4)
  136.  
  137.     move.l    4.w,a6
  138.     lea    dosnam(pc),a1
  139.     moveq    #37,d0
  140.     jsr    OpenLibrary(a6)        ;Open Dos.library
  141.     move.l    d0,LIB_DosBase(a4)
  142.     beq.b    inito
  143.  
  144.     move.l    d0,a6
  145.     move.l    #cfgname,d1
  146.     move.l    #1005,d2
  147.     jsr    Open(a6)        ;Open Config File
  148.     move.l    d0,d7
  149.     beq.b    init1
  150.  
  151.     move.l    d7,d1
  152.     move.l    #winpos,d2
  153.     moveq    #4*2,d3
  154.     jsr    Read(a6)        ;Read Config File
  155.  
  156.     move.l    d7,d1
  157.     jsr    Close(a6)        ;Close Config File Again
  158.  
  159.     move.w    winpos(pc),wintags+6
  160.     move.w    winpos+2(pc),wintags+14
  161.     move.w    winpos+4(pc),wintags+22
  162.     move.w    winpos+6(pc),wintags+30
  163.  
  164. INIT1    move.l    a4,d0
  165. INITO    movem.l    (sp)+,d1-d7/a0-a6
  166.     rts
  167.  
  168. DOSNAM    dc.b    "dos.library",0
  169. CFGNAME    dc.b    "ENVARC:APlayer/Agents/FreqAnalyzer-Scope.cfg",0
  170.     even
  171. ;------------------------------------------------------------------------------
  172. ; Offset  -6: Open Library
  173. ;
  174.  
  175. OPNLIB    addq.w    #1,LIB_OpenCnt(a6)
  176.     bclr    #LIBB_DelExp,LIB_Flags(a6)
  177.     move.l    a6,d0
  178.     rts
  179. ;------------------------------------------------------------------------------
  180. ; Offset -12: Close Library
  181. ;
  182.  
  183. CLSLIB    moveq    #0,d0
  184.     subq.w    #1,LIB_OpenCnt(a6)
  185.     bne.b    clslibo
  186.     btst    #LIBB_DelExp,LIB_Flags(a6)
  187.     bne.b    expunge
  188. CLSLIBO    rts
  189. ;------------------------------------------------------------------------------
  190. ; Offset -18: Expunge
  191. ;
  192.  
  193. EXPUNGE    movem.l    d1-d7/a0-a6,-(sp)
  194.     move.l    a6,a4
  195.     tst.w    LIB_OpenCnt(a4)
  196.     beq.b    exp1
  197.     bset    #LIBB_DelExp,LIB_Flags(a4)
  198.     moveq    #0,d0
  199.     bra.w    expungo
  200.  
  201. EXP1    move.w    winpos(pc),d0
  202.     cmp.w    wintags+6(pc),d0    ;Left
  203.     bne.b    exp2
  204.     move.w    winpos+2(pc),d0
  205.     cmp.w    wintags+14(pc),d0    ;Top
  206.     bne.b    exp2
  207.     move.w    winpos+4(pc),d0
  208.     cmp.w    wintags+22(pc),d0    ;Width
  209.     bne.b    exp2
  210.     move.w    winpos+6(pc),d0
  211.     cmp.w    wintags+30(pc),d0    ;Height
  212.     beq.b    exp3
  213.  
  214. EXP2    move.l    LIB_DosBase(a4),a6
  215.     move.l    #cfgname,d1
  216.     move.l    #1006,d2
  217.     jsr    Open(a6)        ;Open Config File
  218.     move.l    d0,d7
  219.     beq.b    exp3
  220.  
  221.     move.w    wintags+30(pc),-(sp)
  222.     move.w    wintags+22(pc),-(sp)
  223.     move.w    wintags+14(pc),-(sp)
  224.     move.w    wintags+6(pc),-(sp)
  225.  
  226.     move.l    d7,d1
  227.     move.l    sp,d2
  228.     moveq    #4*2,d3
  229.     jsr    Write(a6)        ;Write Config File
  230.  
  231.     move.l    d7,d1
  232.     jsr    Close(a6)        ;Close Config File Again
  233.     addq.l    #4*2,sp
  234.  
  235. EXP3    move.l    4.w,a6
  236.     move.l    LIB_DosBase(a4),a1
  237.     jsr    CloseLibrary(a6)    ;Close Dos.library
  238.  
  239.     move.l    LIB_SegList(a4),d2
  240.     move.l    a4,a1
  241.     jsr    Remove(a6)
  242.  
  243.     move.l    a4,a1
  244.     moveq    #0,d0
  245.     move.w    LIB_NegSize(a4),d0
  246.     sub.l    d0,a1
  247.     add.w    LIB_PosSize(a4),d0
  248.     jsr    FreeMem(a6)
  249.     move.l    d2,d0
  250.  
  251. EXPUNGO    movem.l    (sp)+,d1-d7/a0-a6
  252.     rts
  253. ;------------------------------------------------------------------------------
  254. ; Offset -24: ExtFunc
  255. ;
  256.  
  257. EXTFUNC    moveq    #0,d0
  258.     rts
  259. ;------------------------------------------------------------------------------
  260. ;******************************************************************************
  261. ;* Freq-Analyzer Agent
  262. ;******************************************************************************
  263. ;------------------------------------------------------------------------------
  264. ; Offset -30: GetTags
  265. ;
  266. ; IN :    Nothing
  267. ;
  268. ; OUT:    A0 = Pointer To A TagList
  269. ;
  270.  
  271. FA_GetTags
  272.     lea    FA_Tags(pc),a0
  273.     rts
  274.  
  275. FA_Tags    dc.l    APT_RequestVersion,7
  276.  
  277.     dc.l    APT_AgentType,AGNT_Scope
  278.     dc.l    APT_AgentName,faname
  279.     dc.l    APT_Description,fades
  280.  
  281.     dc.l    APT_Show,FA_ShowPoi
  282.     dc.l    TAG_END
  283.  
  284. FANAME    dc.b    "Freq-Analyzer",0
  285. FADES    dc.b    "Coded by Tax.",10,10
  286.     dc.b    "This will show the different",10
  287.     dc.b    "frequencies for each channels.",0
  288.     even
  289. ;------------------------------------------------------------------------------
  290. ; Show
  291. ;
  292. ; IN :    Nothing
  293. ;
  294. ; OUT:    Nothing
  295. ;
  296.  
  297. FA_Show
  298.     move.l    glob(pc),a5
  299.  
  300.     lea    bssstr,a0
  301.     move.w    #(bssende-bssstr)/2-1,d0
  302. .CLR    clr.w    (a0)+
  303.     dbra    d0,.clr
  304.  
  305.     move.l    APG_GetScreenHD(a5),a4
  306.     jsr    (a4)
  307.     move.l    d0,scrhd+4
  308.  
  309.     bsr.w    getpens
  310.  
  311.     move.l    APG_IntBase(a5),a6
  312.     sub.l    a0,a0
  313.     lea    wintags(pc),a1
  314.     jsr    OpenWindowTagList(a6)    ;Open Our Window
  315.     move.l    d0,winhd
  316.     beq.w    .exit
  317.  
  318.     move.l    APG_GadBase(a5),a6
  319.     move.l    scrhd+4(pc),a0
  320.     sub.l    a1,a1
  321.     jsr    GetVisualInfoA(a6)
  322.     move.l    d0,bevtags+4
  323.     beq.w    .exit1
  324.  
  325.     move.l    APG_AllocScopeSignal(a5),a4
  326.     jsr    (a4)
  327.     move.l    d0,scopstr
  328.     beq.w    .exit2
  329.  
  330.     bsr.w    drwwin            ;Draw Window Box
  331.  
  332. ; Change Task Priority (This Is Important!!!!!)
  333.  
  334.     move.l    4.w,a6
  335.     sub.l    a1,a1
  336.     jsr    FindTask(a6)
  337.  
  338.     move.l    d0,a1
  339.     moveq    #-25,d0            ;New Priority
  340.     jsr    SetTaskPri(a6)
  341.  
  342. ; Message Loop
  343.  
  344. .LOOP    move.l    APG_GetScopeSignal(a5),a4
  345.     move.l    scopstr(pc),a0
  346.     jsr    (a4)
  347.  
  348.     move.l    winhd(pc),a0
  349.     move.l    Window_UserPort(a0),a0
  350.     moveq    #0,d1
  351.     moveq    #1,d2
  352.     move.b    MsgPort_SigBit(a0),d1
  353.     lsl.l    d1,d2
  354.     or.l    d2,d0            ;Window Signal
  355.     or.l    #SIGBREAK_CTRL_C,d0
  356.  
  357.     move.l    4.w,a6
  358.     jsr    Wait(a6)
  359.  
  360. ; Test For Ctrl-C Signal
  361.  
  362.     moveq    #0,d7
  363.     btst    #SIGBREAKB_CTRL_C,d0
  364.     beq.b    .noctrl
  365.     moveq    #-1,d7            ;Set Exit Flag
  366. .NOCTRL    move.l    d7,-(sp)
  367.  
  368. ; Test For Scope Signal
  369.  
  370.     move.l    APG_TestScopeSignal(a5),a4
  371.     move.l    scopstr(pc),a0
  372.     jsr    (a4)
  373.     btst    #0,d0
  374.     beq.b    .noscop
  375.     bsr.w    doscop            ;Yeah, We Got A Scope Signal
  376.  
  377. .NOSCOP    btst    #1,d0
  378.     beq.b    .novb
  379.     bsr.w    dovb
  380.  
  381. .NOVB    btst    #2,d0
  382.     beq.b    .tstwin
  383.     bsr.w    drwwin            ;Init Window
  384.  
  385. .TSTWIN    move.l    4.w,a6
  386.     move.l    winhd(pc),a0
  387.     move.l    Window_UserPort(a0),a0
  388.     jsr    GetMsg(a6)        ;Get Message From Window Port
  389.     tst.l    d0
  390.     bne.b    .msg
  391.     tst.l    (sp)+            ;Test Exit Flag
  392.     bne.b    .getout
  393.     bra.b    .loop
  394.  
  395. .MSG    move.l    d0,a1
  396.     move.l    IntuiMessage_Class(a1),d2;Get Message
  397.     jsr    ReplyMsg(a6)
  398.  
  399.     cmp.l    #IC_NewSize,d2
  400.     bne.b    .nosize
  401.     bsr.b    drwwin            ;Draw Window Again
  402.     bra.b    .tstwin
  403.  
  404. .NOSIZE    cmp.l    #IC_CloseWindow,d2
  405.     bne.b    .tstwin
  406.     moveq    #-1,d7
  407.     move.l    d7,(sp)
  408.     bra.b    .tstwin
  409.  
  410. ; Get Out
  411.  
  412. .GETOUT    move.l    APG_FreeScopeSignal(a5),a4
  413.     move.l    scopstr(pc),a0
  414.     jsr    (a4)
  415.  
  416. .EXIT2    move.l    APG_GadBase(a5),a6
  417.     move.l    bevtags+4(pc),a0
  418.     jsr    FreeVisualInfo(a6)
  419.  
  420. .EXIT1    move.l    APG_IntBase(a5),a6
  421.     move.l    winhd(pc),a0
  422.     jsr    CloseWindow(a6)        ;Close Window
  423.  
  424. .EXIT    moveq    #0,d0
  425.     rts
  426. ;------------------------------------------------------------------------------
  427. ; Get Pens
  428. ;
  429.  
  430. GETPENS    move.l    APG_IntBase(a5),a6
  431.     move.l    scrhd+4(pc),a0
  432.     jsr    GetScreenDrawInfo(a6)
  433.     move.l    d0,a1
  434.     move.l    DrawInfo_Pens(a1),a0
  435.     move.w    BACKGROUNDPEN*2(a0),backp
  436.     move.w    SHADOWPEN*2(a0),shadowp
  437.     move.w    SHINEPEN*2(a0),shinep
  438.     move.w    FILLPEN*2(a0),fillp
  439.     move.l    scrhd+4(pc),a0
  440.     jsr    FreeScreenDrawInfo(a6)
  441.     rts
  442. ;------------------------------------------------------------------------------
  443. ; Draw Window
  444. ;
  445.  
  446. DRWWIN    move.l    winhd(pc),a0
  447.     moveq    #0,d4
  448.     move.b    Window_BorderLeft(a0),d4
  449.     add.b    Window_BorderRight(a0),d4
  450.     moveq    #0,d5
  451.     move.b    Window_BorderTop(a0),d5
  452.     add.b    Window_BorderBottom(a0),d5
  453.  
  454.     move.w    Window_LeftEdge(a0),d0
  455.     move.w    Window_TopEdge(a0),d1
  456.     move.w    Window_Width(a0),d2
  457.     move.w    Window_Height(a0),d3
  458.     sub.w    d4,d2
  459.     sub.w    d5,d3
  460.  
  461.     lea    wintags(pc),a0
  462.     move.w    d0,6(a0)        ;Left
  463.     move.w    d1,14(a0)        ;Top
  464.     move.w    d2,22(a0)        ;Width
  465.     move.w    d3,30(a0)        ;Height
  466.  
  467. ; Initializing, Clear Window & Draw Bevel Box
  468.  
  469.     move.l    20(a0),d6        ;Width
  470.     move.l    28(a0),d7        ;Height
  471.  
  472.     move.l    winhd(pc),a0
  473.     moveq    #0,d4
  474.     move.b    Window_BorderLeft(a0),d4
  475.     moveq    #0,d5
  476.     move.b    Window_BorderTop(a0),d5
  477.  
  478.     move.l    Window_RPort(a0),a1
  479.     move.l    a1,-(sp)        ;Store RastPort
  480.  
  481.     move.l    APG_GfxBase(a5),a6
  482.     move.w    backp(pc),d0
  483.     jsr    SetAPen(a6)
  484.  
  485.     move.l    (sp),a1
  486.     move.w    d4,d0
  487.     move.w    d5,d1
  488.     move.w    d6,d2
  489.     add.w    d0,d2
  490.     subq.w    #1,d2
  491.     move.w    d7,d3
  492.     add.w    d1,d3
  493.     subq.w    #1,d3
  494.     jsr    RectFill(a6)        ;Clear Window
  495.  
  496.     move.l    APG_GadBase(a5),a6
  497.     move.l    (sp),a0
  498.     moveq    #4,d0
  499.     add.w    d4,d0
  500.     moveq    #2,d1
  501.     add.w    d5,d1
  502.     move.w    d6,d2
  503.     subq.w    #8,d2
  504.     move.w    d7,d3
  505.     subq.w    #4,d3
  506.     lea    bevtags(pc),a1
  507.     jsr    DrawBevelBoxA(a6)
  508.  
  509. ; Draw Channel Lines
  510.  
  511.     move.l    APG_GfxBase(a5),a6
  512.     move.l    (sp),a1
  513.     move.w    shadowp(pc),d0
  514.     jsr    SetAPen(a6)
  515.  
  516.     move.l    (sp),a1
  517.     moveq    #0,d0            ;JAM1
  518.     jsr    SetDrMd(a6)
  519.  
  520.     subq.w    #8,d7            ;Height Of BevelBox
  521.     sub.w    #11,d6
  522.     move.w    d6,width
  523.  
  524.     moveq    #0,d3
  525.     move.w    d7,d3
  526.     divu    APG_Channels(a5),d3
  527.     move.w    d3,a4            ;Integer
  528.     move.w    d3,step
  529.  
  530.     swap    d3
  531.     move.w    d3,a2            ;Remainder
  532.     move.w    d3,remain
  533.  
  534.     move.w    a4,d0
  535.     lsr.w    #1,d0
  536.     addq.w    #4,d0
  537.     move.w    d0,a3
  538.  
  539.     move.w    d4,d0
  540.     addq.w    #4+2,d0
  541.     move.w    d0,xpos
  542.  
  543.     lea    ypos,a0
  544.     move.w    APG_Channels(a5),d2
  545.     move.w    d2,d3
  546.     subq.w    #1,d3            ;Number Of Lines
  547. .LOOP    move.l    (sp),a1
  548.     moveq    #4,d0
  549.     add.w    d4,d0
  550.     move.w    a3,d1
  551.     add.w    d5,d1
  552.     move.w    d1,(a0)+
  553.     move.l    a0,-(sp)
  554.     movem.w    d0-d1,-(sp)
  555.     jsr    Move(a6)
  556.  
  557.     movem.w    (sp)+,d0-d1
  558.     add.w    d6,d0
  559.     move.l    4(sp),a1
  560.     jsr    Draw(a6)        ;Draw Line
  561.     move.l    (sp)+,a0
  562.  
  563.     add.w    a4,a3
  564.     sub.w    a2,d2
  565.     bgt.b    .skip
  566.     addq.w    #1,a3
  567.     add.w    APG_Channels(a5),d2
  568. .SKIP    dbra    d3,.loop
  569.  
  570.     lea    chntab,a0
  571.     moveq    #32-1,d0
  572. .CLRIT    clr.w    CT_YMinPos(a0)
  573.     lea    ChanTable_SIZEOF(a0),a0
  574.     dbra    d0,.clrit
  575.  
  576.     moveq    #0,d0
  577.     cmp.w    #16,APG_Channels(a5)
  578.     bgt.b    .shift
  579.     moveq    #1,d0
  580. .SHIFT    move.w    d0,shift
  581.  
  582.     move.l    #3800,minfreq
  583.     move.l    #33000,maxfreq
  584.     addq.l    #4,sp
  585.     rts
  586. ;------------------------------------------------------------------------------
  587. ; Do The Scope Thing
  588. ;
  589.  
  590. DOSCOP    movem.l    d0-d7/a0-a6,-(sp)
  591.     st    drawit
  592.     move.l    APG_ChannelInfo(a5),a0
  593.     move.l    APG_ChannelFlags(a5),a1
  594.     lea    chntab,a2
  595.  
  596.     move.w    APG_Channels(a5),d7
  597.     subq.w    #1,d7
  598. .LOOP    move.b    (a1)+,d0
  599.     beq.w    .next
  600.     cmp.b    #$ff,d0
  601.     beq.w    .end
  602.  
  603.     btst    #NPCFB_Volume,d0
  604.     beq.b    .novol
  605.     move.w    NPC_Volume(a0),d1
  606.     cmp.w    CT_Volume(a2),d1
  607.     beq.b    .novol
  608.     move.w    d1,CT_Volume(a2)
  609.     st    CT_Changed(a2)
  610.  
  611. .NOVOL    moveq    #0,d1
  612.     moveq    #0,d2
  613.     move.w    NPC_Period(a0),d1
  614.     btst    #NPCFB_Period,d0
  615.     bne.b    .gotper
  616.     btst    #NPCFB_QuadroPeriod,d0
  617.     beq.b    .noper
  618.     lsr.w    #2,d1
  619. .GOTPER    tst.w    d1
  620.     beq.b    .nulper
  621.     move.l    APG_Clock(a5),d2
  622.     divu    d1,d2
  623. .NULPER    cmp.w    CT_Freq(a2),d2
  624.     beq.b    .noper
  625.     move.w    d2,CT_Freq(a2)
  626.     st    CT_Changed(a2)
  627.     swap    d2
  628.     clr.w    d2
  629.     swap    d2
  630.     cmp.l    minfreq(pc),d2
  631.     bge.b    .nomin
  632.     sub.l    #100,d2
  633.     move.l    d2,minfreq
  634. .NOMIN    cmp.l    maxfreq(pc),d2
  635.     ble.b    .nomax
  636.     add.l    #100,d2
  637.     move.l    d2,maxfreq
  638.  
  639. .NOMAX
  640. .NOPER    moveq    #0,d2
  641.     moveq    #0,d3
  642.     moveq    #0,d4
  643.     btst    #NPCFB_Sample,d0
  644.     beq.b    .next
  645.     btst    #NPCFB_Loop,d0
  646.     beq.b    .noloop
  647.     cmp.l    #2,NPC_LoopLength(a0)
  648.     bhi.b    .gotlop
  649. .NOLOOP    move.l    NPC_Length(a0),d1
  650.     btst    #NPCFB_WordLength,d0
  651.     beq.b    .noword
  652.     add.l    d1,d1
  653. .NOWORD    tst.w    CT_Freq(a2)
  654.     beq.b    .gotlop
  655.     mulu    #50,d1
  656.     divu    CT_Freq(a2),d1        ;VB=Length*50/Freq
  657.     tst.w    d1
  658.     beq.b    .gotlop
  659.     move.w    CT_Volume(a2),d3
  660.     move.w    d3,d4
  661.     divu    d1,d3            ;Counter=Volume/VB
  662.     move.w    d3,d2
  663.     swap    d3
  664.  
  665. .GOTLOP    move.w    d2,CT_Count(a2)
  666.     move.w    d3,CT_CountR(a2)
  667.     move.w    d4,CT_RemainCount(a2)
  668.     move.w    d4,CT_RemainAdd(a2)
  669.  
  670. .NEXT    lea    NPChannel_SIZEOF(a0),a0
  671.     lea    ChanTable_SIZEOF(a2),a2
  672.     dbra    d7,.loop
  673.     bra.b    .out
  674.  
  675. .END    bsr.w    drwwin            ;Refresh Window
  676.     sf    drawit
  677. .OUT    movem.l    (sp)+,d0-d7/a0-a6
  678.     rts
  679. ;------------------------------------------------------------------------------
  680. ; Draw The Boxes
  681. ;
  682.  
  683. DOVB    movem.l    d0-d7/a0-a6,-(sp)
  684.     tst.b    drawit
  685.     beq.w    .out
  686.     move.l    APG_GfxBase(a5),a6
  687.     lea    chntab,a2
  688.  
  689.     move.l    maxfreq(pc),d6
  690.     sub.l    minfreq(pc),d6
  691.     move.l    d6,delfreq
  692.     divu    width(pc),d6
  693.  
  694.     move.w    xpos(pc),d5
  695.  
  696.     move.l    winhd(pc),a1
  697.     move.l    Window_RPort(a1),a1
  698.     move.l    a1,-(sp)        ;Store RastPort
  699.  
  700.     lea    ypos,a3
  701.     move.w    APG_Channels(a5),d7
  702.     subq.w    #1,d7
  703. .LOOP    tst.w    CT_Changed(a2)
  704.     beq.w    .next
  705.     clr.w    CT_Changed(a2)
  706.     move.l    (sp),a1
  707.     move.w    backp(pc),d0
  708.     jsr    SetAPen(a6)
  709.  
  710.     movem.w    CT_XMinPos(a2),d0-d3
  711.     tst.w    d1
  712.     beq.b    .noclr
  713.     move.l    (sp),a1
  714.     jsr    RectFill(a6)        ;Erase Old Box
  715.  
  716.     move.l    (sp),a1
  717.     move.w    shadowp(pc),d0
  718.     jsr    SetAPen(a6)
  719.  
  720.     move.w    CT_XMinPos(a2),d0
  721.     move.w    (a3),d1            ;Y Position
  722.     move.l    (sp),a1
  723.     jsr    Move(a6)
  724.  
  725.     move.w    CT_XMaxPos(a2),d0
  726.     move.w    (a3),d1            ;Y Position
  727.     move.l    (sp),a1
  728.     jsr    Draw(a6)        ;Draw Line
  729.  
  730. .NOCLR    tst.w    CT_Volume(a2)
  731.     beq.w    .novol
  732.     move.l    (sp),a1
  733.     move.w    fillp(pc),d0
  734.     jsr    SetAPen(a6)
  735.  
  736.     move.w    step(pc),d3
  737.     move.w    shift(pc),d2
  738.     lsr.w    d2,d3
  739.     mulu    CT_Volume(a2),d3
  740.     lsr.w    #6,d3
  741.     tst.w    d3
  742.     bne.b    .nonul
  743.     moveq    #1,d3
  744. .NONUL    move.w    d3,d2            ;Size Of Box
  745.  
  746.     move.w    d2,d1
  747.     lsr.w    #1,d1
  748.  
  749.     moveq    #0,d0
  750.     move.w    CT_Freq(a2),d0
  751.     sub.l    minfreq(pc),d0
  752.     cmp.l    delfreq(pc),d0
  753.     bls.b    .freqok
  754.     move.l    delfreq(pc),d0
  755. .FREQOK    divu    d6,d0
  756.     add.w    d5,d0
  757.     sub.w    d1,d0            ;XMin
  758.     cmp.w    xpos(pc),d0
  759.     bgt.b    .minok
  760.     move.w    xpos(pc),d0
  761.  
  762. .MINOK    move.w    xpos(pc),d4
  763.     add.w    width(pc),d4
  764.     subq.w    #2,d4
  765.     cmp.w    d4,d0
  766.     blt.b    .minok1
  767.     move.w    d4,d0
  768.  
  769. .MINOK1    move.w    d3,d1
  770.     lsr.w    #1,d1
  771.     neg.w    d1
  772.     add.w    (a3),d1            ;YMin
  773.  
  774.     add.w    d1,d3            ;YMax
  775.     add.w    d0,d2            ;XMax
  776.  
  777.     cmp.w    d4,d2
  778.     blt.b    .maxok
  779.     move.w    d4,d2
  780.  
  781. .MAXOK    move.w    CT_YMinPos(a2),d4
  782.     movem.w    d0-d3,CT_XMinPos(a2)    ;Store New Position & Size
  783.     tst.w    d4
  784.     beq.b    .next
  785.     move.l    (sp),a1
  786.     jsr    RectFill(a6)        ;Draw Box
  787.  
  788. .NEXT    tst.w    CT_Volume(a2)
  789.     beq.b    .novol
  790.     move.w    CT_Volume(a2),d1
  791.     move.w    CT_Count(a2),d0
  792.     sub.w    d0,CT_Volume(a2)
  793.     move.w    CT_CountR(a2),d0
  794.     sub.w    d0,CT_RemainCount(a2)
  795.     bpl.b    .chgvol
  796.     subq.w    #1,CT_Volume(a2)
  797.     move.w    CT_RemainAdd(a2),d0
  798.     add.w    d0,CT_RemainCount(a2)
  799.  
  800. .CHGVOL    tst.w    CT_Volume(a2)
  801.     bpl.b    .tstvol
  802.     clr.w    CT_Volume(a2)
  803.  
  804. .TSTVOL    cmp.w    CT_Volume(a2),d1
  805.     beq.b    .novol
  806.     st    CT_Changed(a2)
  807.  
  808. .NOVOL    lea    ChanTable_SIZEOF(a2),a2
  809.     addq.l    #2,a3
  810.     dbra    d7,.loop
  811.  
  812.     addq.l    #4,sp
  813. .OUT    movem.l    (sp)+,d0-d7/a0-a6
  814.     rts
  815. ;------------------------------------------------------------------------------
  816. ; Data Area
  817. ;
  818.  
  819. FA_ShowPoi
  820.     dc.l    FA_Show
  821. GLOB    dc.l    0
  822.  
  823. WINHD    dc.l    0
  824. SCOPSTR    dc.l    0
  825.  
  826. WINPOS    blk.w    4,0
  827.  
  828. BACKP    dc.w    0
  829. SHADOWP    dc.w    0
  830. SHINEP    dc.w    0
  831. FILLP    dc.w    0
  832.  
  833. MINFREQ    dc.l    3800
  834. MAXFREQ    dc.l    33000
  835. DELFREQ    dc.l    0
  836.  
  837. XPOS    dc.w    0
  838. STEP    dc.w    0
  839. REMAIN    dc.w    0
  840. WIDTH    dc.w    0
  841. SHIFT    dc.w    0
  842.  
  843. DRAWIT    dc.b    FALSE
  844.     even
  845.  
  846. BEVTAGS    dc.l    GT_VisualInfo,0,GTBB_Recessed,TRUE,TAG_END
  847.  
  848. WINTAGS    dc.l    WA_Left,0,WA_Top,0,WA_InnerWidth,72,WA_InnerHeight,40
  849.     dc.l    WA_MinWidth,80,WA_MinHeight,68,WA_MaxWidth,-1,WA_MaxHeight,-1
  850.     dc.l    WA_IDCMP,IC_CloseWindow!IC_NewSize,WA_Flags,$1002f
  851.     dc.l    WA_AutoAdjust,TRUE,WA_Title,wintit
  852. SCRHD    dc.l    WA_PubScreen,0,WA_PubScreenFallBack,TRUE
  853.     dc.l    TAG_END
  854.  
  855. WINTIT    dc.b    "Freq-Analyzer",0
  856.     even
  857. ;------------------------------------------------------------------------------
  858.     SECTION    BSS_Area,BSS
  859.  
  860.     STRUCTURE ChanTable,0
  861.     UWORD    CT_Changed
  862.     UWORD    CT_Freq
  863.     UWORD    CT_Volume
  864.     UWORD    CT_Count
  865.     UWORD    CT_CountR
  866.     UWORD    CT_RemainCount
  867.     UWORD    CT_RemainAdd
  868.     UWORD    CT_XMinPos
  869.     UWORD    CT_YMinPos
  870.     UWORD    CT_XMaxPos
  871.     UWORD    CT_YMaxPos
  872.     LABEL    ChanTable_SIZEOF
  873.  
  874. BSSSTR
  875. CHNTAB    ds.b    32*ChanTable_SIZEOF
  876. YPOS    ds.w    32
  877. BSSENDE
  878. ;------------------------------------------------------------------------------
  879. SLUT
  880.