home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / NOCREW / MP2_0997.ZIP / mp2_0997 / src / clock.s < prev    next >
Text File  |  1999-07-27  |  6KB  |  305 lines

  1. ;***********************
  2. ;**** CLOCK MANAGER ****
  3. ;***********************
  4. ;Copyright STGHOST/SECTOR ONE 1999
  5.  
  6. ;contains:
  7. ; - clkprobe (find frequency of all available clocks)
  8. ; - setclock (setup system for a given frequency)
  9.  
  10.     export clkprobe
  11.     export test_ext_clk
  12.  
  13.     export bufe,bufs
  14.     export type
  15.     export frq
  16.  
  17. ;****************
  18. ;*** clkprobe ***
  19. ;****************
  20. ;Find out the speed of external clock
  21. ;even for a dual external clock !!!
  22. ;(FDI supported)
  23.  
  24. _bufsize    equ    8820
  25. noextlow    equ    35    ; [1-35] U [42-50] 49 kHz (type 0)
  26. noexthi    equ    42    ; [36-38] 48 kHz (type 2)
  27. bilimit    equ    38    ; [39-41] 44.1kHz (type 1)
  28.  
  29. clkprobe:
  30.     clr.l    type
  31.     clr.w    -(sp)
  32.     pea    _bufsize.w
  33.     move.w    #68,-(sp)
  34.     trap    #1    ;Mxalloc: STRAM ONLY !
  35.     addq.l    #8,sp
  36.     tst.l    d0
  37.     beq    .error
  38.     move.l    d0,bufs
  39.     add.l    #_bufsize,d0
  40.     move.l    d0,bufe
  41.     pea    test_ext_clk(pc)
  42.     move.w    #38,-(sp)
  43.     trap    #14
  44.     addq.l    #6,sp
  45.     move.l    bufs(pc),-(sp)
  46.     move.w    #73,-(sp)
  47.     trap    #1
  48.     addq.l    #6,sp
  49. .error:
  50.     rts
  51.  
  52. ;*** test_ext_clk ***
  53. ;-external clock probing rout
  54. ;-does all setup and restore stuff
  55. ;-calls twice the test rout (for double external clocks)
  56. test_ext_clk:
  57. ;save status and setup audio system for test
  58.     lea    oldcnf(pc),a0
  59.     move.b    $ffff8900.w,(a0)+
  60.     move.b    $ffff8920.w,(a0)+
  61.     move.l    $ffff8930.w,(a0)+
  62.     move.l    $ffff8934.w,(a0)+
  63.     move.l    $ffff8938.w,(a0)+
  64.     move.b    $ffff8921.w,(a0)
  65.     clr.b    $ffff8900.w    ;no interrupt
  66.     clr.b    $ffff8920.w    ;1 track - track 0 for speaker
  67.     move.l    #$810115,$ffff8930.w    ;matrix setup for int. clock
  68.     clr.b    $ffff8901.w    ;stop all dma operations
  69.     move.b    #$83,$ffff8921.w    ;activate audio setup (mono 50kHz in STE mode)
  70.     move.l    #$01010003,$ffff8934.w    ;freqdiv=1, rec 1 trk, mat+adc
  71.     clr.w    $ffff8938.w    ;kick YAMAHA - mic input instead, gain=0
  72.  
  73. ;clean up the little buffer
  74.     move.l    bufs(pc),d0
  75.     move.l    bufe(pc),d1
  76.     move.l    d0,a1
  77.     move.w    #(_bufsize/4)-1,d2
  78. .wash:    clr.l    (a1)+
  79.     dbf    d2,.wash
  80. ;ext clock stuff
  81.     or.w    #$6222,$ffff8930.w    ;select external clock
  82.     bset    #0,$ffff8941.w    ;enable clock selection for newclock
  83.     bset    #1,$ffff8941.w    ;enable direction control for FDI
  84.     bset    #2,$ffff8941.w    ;enable reset control for FDI
  85.     bset    #1,$ffff8943.w    ;set mode to play in FDI
  86.     bclr    #2,$ffff8943.w    ;no FDI reset !
  87.  
  88. ;setup dma replay
  89.     lea    $ffff8900.w,a2
  90.     swap    d0
  91.     swap    d1
  92.     move.b    d0,$ffff8903.w
  93.     swap    d0
  94.     movep.w    d0,5(a2)
  95.     move.b    d1,$ffff890f.w
  96.     swap    d1
  97.     movep.w    d1,$11(a2)
  98.  
  99. ;now probing for both clocks (newclock)
  100. ;test clock 1
  101.     bset    #0,$ffff8943.w
  102.     bsr.s    do_test
  103.     move.w    d0,type+2
  104. ;test clock 0
  105.     bclr    #0,$ffff8943.w
  106.     bsr.s    do_test
  107.     move.w    d0,type
  108.  
  109. ;now restore original audio setup
  110.     lea    oldcnf(pc),a0
  111.     move.b    (a0)+,$ffff8900.w
  112.     move.b    (a0)+,$ffff8920.w
  113.     move.l    (a0)+,$ffff8930.w
  114.     move.l    (a0)+,$ffff8934.w
  115.     move.l    (a0)+,$ffff8938.w
  116.     move.b    (a0),$ffff8921.w
  117.  
  118. ;all done
  119.     rts
  120.  
  121. type:    ds.w    2
  122. bufs:    ds.l    1
  123. bufe:    ds.l    1
  124. oldcnf:    ds.l    4
  125.  
  126. ; * the test itself *
  127. do_test:
  128.     move.w    #$2500,sr
  129.     lea    $ffff8901.w,a2
  130.     lea    $4ba.w,a3
  131.     moveq    #2,d0
  132.     moveq    #50,d1
  133.     add.l    (a3),d0
  134.     add.l    d0,d1
  135. .tstart:    cmp.l    (a3),d0    ;time to start ?
  136.     bne.s    .tstart
  137.     move.b    #1,(a2)    ;start replay
  138.     nop
  139. .tloop:    tst.b    (a2)    ;end of buffer ?
  140.     beq.s    .tstop
  141.     cmp.l    (a3),d1    ;time limit reached ?
  142.     bne.s    .tloop
  143.     clr.b    $ffff8901.w    ;turn off replay
  144. .tstop:    move.l    (a3),d2    ;stop time
  145.     sub.l    d0,d2    ;d2 = timelength
  146.  
  147. ;now compute the clock type from the timelength
  148.     moveq    #0,d0    ;type=int49 (default)
  149.     cmp.w    #noextlow,d2
  150.     bls.s    .typ0
  151.     cmp.w    #noexthi,d2
  152.     bhs.s    .typ0
  153.     cmp.w    #bilimit,d2
  154.     bls.s    .typ2
  155.     moveq    #1,d0    ;type=ext44
  156.     bra.s    .typ0
  157. .typ2:    moveq    #2,d0    ;type=ext48
  158. .typ0:
  159.     move.w    #$2300,sr
  160.     rts
  161.  
  162.  
  163. ;******************
  164. ;***  setclock  ***
  165. ;******************
  166. ;setclock is used to setup clock according to clkprobe results
  167. ;  - select best available clock for wanted frequency
  168. ;  - stop dma activity
  169. ;  - setup system at right frequency
  170. ;  - computes relative frequency if exact frequency not available (for DSP)
  171. ;Input: d0 = wanted frequency
  172. ;Output: none
  173.  
  174. setclock:
  175. ;- Setup freq list from clkprobe output
  176.     lea    freqs(pc),a1
  177.     movem.w    type(pc),d1-d2
  178.     move.l    (a1),a2
  179.     move.l    (a1,d1.w*4),a3
  180.     move.l    (a1,d2.w*4),a4
  181.     lea    freqs2(pc),a1
  182.     movem.l    a2-a4,(a1)
  183.  
  184. ;- now get closer frequency for each clock
  185.     moveq    #2,d5
  186. .check_all:
  187.     move.l    (a1)+,a0
  188.     move.w    (a0)+,d1
  189. .gethfrq:    cmp.l    (a0),d0
  190.     bls.s    .take_it
  191.     addq.l    #8,a0
  192.     dbf    d1,.gethfrq
  193. .take_it:    move.l    d3,d2
  194.     move.l    d4,d3
  195.     move.l    (a0)+,d4
  196.     sub.l    d0,d4
  197.     bpl.s    .posi
  198.     neg.l    d4    ;get absolute value
  199. .posi:    dbf    d5,.check_all
  200.  
  201. ;- Stop all dma stuff
  202.     clr.b    $ffff8900.w    ;kick audio-dma interrupts
  203.     clr.b    $ffff8901.w    ;stop dmasound
  204.     clr.w    $ffff8934.w    ;no clock (ste mode)
  205.  
  206. ;- Select best clock
  207.     cmp.l    d2,d3
  208.     blo.s    .doclock1
  209.     cmp.l    d2,d4
  210.     blo.s    .doclock2
  211. .doclock0:
  212.     and.w    #$9DDD,$ffff8930.w    ;no ext clock
  213.     clr.b    $ffff8934.w
  214.     move.l    -12(a1),a0
  215.     bra.s    .clock_ok
  216. .doclock1:
  217.     cmp.l    d3,d4
  218.     blo.s    .doclock2
  219.     or.w    #$6222,$ffff8930.w    ;use ext clock
  220.     bclr    #0,$ffff8943.w    ;select ext clock #0
  221.     move.l    -8(a1),a0
  222.     bra.s    .clock_ok
  223. .doclock2:
  224.     or.w    #$6222,$ffff8930.w    ;use ext clock
  225.     bset    #0,$ffff8943.w    ;select ext clock #1
  226.     move.l    -(a1),a0
  227.  
  228. ;- Setup system with selected clock
  229. .clock_ok:
  230.     move.w    (a0)+,d1
  231. .getfrq:    cmp.l    (a0),d0
  232.     bls.s    .takeit
  233.     addq.l    #8,a0
  234.     dbf    d1,.getfrq
  235. .takeit:    move.l    (a0)+,d2
  236.     move.w    (a0)+,$ffff8934.w
  237.  
  238. ;- Computes relative frequency (d0/d2=>frq):
  239.     move.l    #$7fffff,d1
  240.     cmp.l    d0,d2    ;if selected freq(d2) < needed freq(d0) then frq=1.0
  241.     bls.s    .keepit
  242.     divul.l    d2,d3:d1    ;else frq=d0/d2 (0<frq<1.0)
  243.     mulu    d0,d1
  244.     mulu    d0,d3
  245.     divu    d2,d3
  246.     ext.l    d3
  247.     add.l    d3,d1
  248. .keepit:    move.l    d1,frq
  249.     rts
  250.  
  251. frq:    ds.l    1
  252. freqs:    dc.l    fal_int,fal_cd,fal_dat
  253. freqs2:    ds.l    3    ;generated from freqs and type(clkprobe)
  254. fal_int:    dc.w    7    ;nbre - 1
  255.     dc.l    8195    ;fréquence Falcon
  256.     dc.w    11,3
  257.     dc.l    9834
  258.     dc.w    9,3
  259.     dc.l    12292
  260.     dc.w    7,3
  261.     dc.l    16390
  262.     dc.w    5,3
  263.     dc.l    19668
  264.     dc.w    4,3
  265.     dc.l    24585
  266.     dc.w    3,3
  267.     dc.l    32780
  268.     dc.w    2,3
  269.     dc.l    49170
  270.     dc.w    1,3
  271. fal_cd:    dc.w    7
  272.     dc.l    7350    ;freq externe 44.1KHz
  273.     dc.w    $b0b,3
  274.     dc.l    8820
  275.     dc.w    $909,3
  276.     dc.l    11025    
  277.     dc.w    $707,3
  278.     dc.l    14700
  279.     dc.w    $505,3
  280.     dc.l    17640
  281.     dc.w    $404,3
  282.     dc.l    22050
  283.     dc.w    $303,3
  284.     dc.l    29400
  285.     dc.w    $202,3
  286.     dc.l    44100
  287.     dc.w    $101,3
  288. fal_dat:    dc.w    7
  289.     dc.l    8000    ;freq externe 48KHz
  290.     dc.w    $b0b,3
  291.     dc.l    9600
  292.     dc.w    $909,3
  293.     dc.l    12000
  294.     dc.w    $707,3
  295.     dc.l    16000
  296.     dc.w    $505,3
  297.     dc.l    19200
  298.     dc.w    $404,3
  299.     dc.l    24000
  300.     dc.w    $303,3
  301.     dc.l    32000
  302.     dc.w    $202,3
  303.     dc.l    48000
  304.     dc.w    $101,3
  305.