home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / falcon / m_analyz / source / m_analyz.s < prev    next >
Encoding:
Text File  |  1995-04-27  |  51.5 KB  |  2,897 lines

  1. ;                   Music Analyzer
  2. ;               by Roel van de Kraats
  3. ;                       1995
  4. ;                   Main Program
  5.  
  6. ;tabsize=8
  7.  
  8.  
  9. len_of_scr    equ    153600
  10. len_scopebuf    equ    128*256/8*4
  11. len_vubuf    equ    60*80/8*4
  12. len_iconsbuf    equ    32/8*4*32*22
  13. len_mstxtbuf    equ    12*64/8*4
  14. len_mousedata    equ    8*256
  15. len_helpdiag    equ    256/8*4*350
  16. len_hdiagsave    equ    (256+16)/8*4*(350+8)
  17. b_line        equ    320
  18. points        equ    256
  19. x        equ    13000        ;dsp x and y memory size
  20. y        equ    8000
  21. _frclock    equ    $466
  22. _hz_200        equ    $4ba
  23.  
  24. speedtest    equ    0        ;<>0 : press ESC to show speed
  25.  
  26.         text
  27.  
  28. start:        lea.l    start-256, a1        ; Start of Basepage
  29.         move.l    12(a1), d1        ; Size of Text
  30.         add.l    20(a1), d1        ; Size of Data
  31.         add.l    28(a1), d1        ; Size of BSS
  32.         add.l    #256,    d1        ; Size of Basepage
  33.  
  34.         move.l    d1,  -(sp)
  35.         move.l    a1,  -(sp)        ; Startaddress
  36.         clr    -(sp)            ; dummy
  37.         move    #74, -(sp)        ; Mshrink
  38.         trap    #1            ; Gemdos
  39.  
  40.         add.l    a1, d1            ; new stack
  41.         and.b    #$fc, d1
  42.         move.l    d1, sp            ; Stack in BSS
  43.  
  44. clear_keys:
  45.         ; Cconis()
  46.         move    #11,-(sp)
  47.         trap    #1
  48.         addq.l    #2, sp
  49.         cmp.w    #-1,D0
  50.         bne    no_more_keys
  51.  
  52.         ; Cconin()
  53.         move    #1, -(sp)
  54.         trap    #1
  55.         addq.l    #2, sp
  56.         bra    clear_keys
  57. no_more_keys:
  58.  
  59.         ; Kbshift(-1)
  60.         move.w    #-1,-(sp)
  61.         move.w    #11,-(sp)
  62.         trap    #13
  63.         addq.l    #4,sp
  64.  
  65.         lsr.w    #4,d0
  66.         and.w    #1,d0
  67.         move.w    d0,old_capslock        ;save for restore later
  68.  
  69.         bset    #4,d0            ;capslock on
  70.  
  71.         ; Kbshift()
  72.         move.w    d0,-(sp)
  73.         move.w    #11,-(sp)
  74.         trap    #13
  75.         addq.l    #4,sp
  76.  
  77.         bsr    appl_init        ;init gem (e.g. for alerts)
  78.  
  79.         pea    check_cookies
  80.         move.w    #$26,-(sp)
  81.         trap    #14            ;Supexec()
  82.         addq.l    #6,sp
  83.  
  84.         tst.w    d0
  85.         beq    wrong_machine        ;not a falcon or compatible!
  86.  
  87.         move.w    #$59,-(sp)        ;VgetMonitor()
  88.         trap    #14
  89.         addq.l    #2,sp
  90.         move.w    d0,monitor        ;for later use
  91.         cmp.w    #0,d0
  92.         beq    wrong_scr        ;monochrome monitor
  93.  
  94.         move.l    #len_of_scr,-(SP)
  95.         move.w    #72,-(SP)
  96.         trap    #1            ;Malloc
  97.         addq.l    #6,SP
  98.         move.l    D0,scr1
  99.         beq    outofmem
  100.         move.l    d0,scr
  101.  
  102.         move.l    #len_of_scr,-(SP)
  103.         move.w    #72,-(SP)
  104.         trap    #1            ;Malloc
  105.         addq.l    #6,SP
  106.         move.l    D0,scr2
  107.         beq    outofmem
  108.  
  109.         move.l    #len_scopebuf,-(SP)
  110.         move.w    #72,-(SP)
  111.         trap    #1            ;Malloc
  112.         addq.l    #6,SP
  113.         move.l    D0,scopebuf
  114.         beq    outofmem
  115.  
  116.         move.l    #len_vubuf,-(SP)
  117.         move.w    #72,-(SP)
  118.         trap    #1            ;Malloc
  119.         addq.l    #6,SP
  120.         move.l    D0,vubuf
  121.         beq    outofmem
  122.  
  123.         move.l    #len_iconsbuf,-(SP)
  124.         move.w    #72,-(SP)
  125.         trap    #1            ;Malloc
  126.         addq.l    #6,SP
  127.         move.l    d0,icons
  128.         beq    outofmem
  129.  
  130.         move.l    #len_mstxtbuf*2,-(SP)    ;2 times: 2 texts
  131.         move.w    #72,-(SP)
  132.         trap    #1            ;Malloc
  133.         addq.l    #6,SP
  134.         move.l    d0,mstexts
  135.         beq    outofmem
  136.  
  137.         move.l    #len_mousedata,-(SP)
  138.         move.w    #72,-(SP)
  139.         trap    #1            ;Malloc
  140.         addq.l    #6,SP
  141.         move.l    d0,mousedata
  142.         beq    outofmem
  143.  
  144.         move.l    #len_helpdiag,-(SP)
  145.         move.w    #72,-(SP)
  146.         trap    #1            ;Malloc
  147.         addq.l    #6,SP
  148.         move.l    d0,helpdiag
  149.         beq    outofmem
  150.  
  151.         move.l    #len_hdiagsave,-(SP)    ;for help dialog save background
  152.         move.w    #72,-(SP)
  153.         trap    #1            ;Malloc
  154.         addq.l    #6,SP
  155.         move.l    d0,hdiagsave
  156.         beq    outofmem
  157.  
  158.         bsr    install_sound
  159.  
  160.         bsr    decode_imgs        ;XIMG -> raw data
  161.  
  162.  
  163.         move.w    #256,d0
  164.         bsr    graf_mouse        ;(vdi) mouse off
  165.  
  166.         ;Super()
  167.         move.l    #0,-(sp)
  168.         move.w    #$20,-(sp)
  169.         trap    #1
  170.         addq.l    #6,sp
  171.         move.l    d0,old_superstack
  172.  
  173.  
  174.         bsr    key_click_off        ;else problem with SAM
  175.  
  176.         ;0-1000 -> 0-255
  177.         lea    mainscrdat+22,a0    ;start of palette in img-file
  178.         lea    palet,a1
  179.         move.w    #15,d0
  180. loop_sp:    clr.b    (a1)+
  181.         clr.l    d1
  182.         move.w    (a0)+,d1
  183.         mulu.w    #255,d1
  184.         divu    #1000,d1
  185.         move.b    d1,(a1)+
  186.         clr.l    d1
  187.         move.w    (a0)+,d1
  188.         mulu.w    #255,d1
  189.         divu    #1000,d1
  190.         move.b    d1,(a1)+
  191.         clr.l    d1
  192.         move.w    (a0)+,d1
  193.         mulu.w    #255,d1
  194.         divu    #1000,d1
  195.         move.b    d1,(a1)+
  196.         dbra    d0,loop_sp
  197.  
  198.  
  199.         ;clear screen
  200.         move.l    #len_of_scr/4,d0
  201.         move.l    scr1,a1
  202. loop_clrscr:    clr.l    (a1)+
  203.         subq.l    #1,d0
  204.         bne    loop_clrscr
  205.  
  206.  
  207.         bsr    init_video
  208.  
  209.         ;copy ms texts (scope range)
  210.         move.l    scr2,a0
  211.         adda.l    #b_line*388+(144/8*4),a0
  212.         move.l    scr2,a1        
  213.         adda.l    #b_line*388+(432/8*4),a1
  214.         move.l    mstexts,a2
  215.         move.l    a2,a3
  216.         adda.l    #len_mstxtbuf,a3
  217.         move.w    #11,d0
  218. loop_cptxt:    move.l    (a0),(a2)+
  219.         move.l    4(a0),(a2)+
  220.         move.l    8(a0),(a2)+
  221.         move.l    12(a0),(a2)+
  222.         move.l    16(a0),(a2)+
  223.         move.l    20(a0),(a2)+
  224.         move.l    24(a0),(a2)+
  225.         move.l    28(a0),(a2)+
  226.         move.l    (a1),(a3)+
  227.         move.l    4(a1),(a3)+
  228.         move.l    8(a1),(a3)+
  229.         move.l    12(a1),(a3)+
  230.         move.l    16(a1),(a3)+
  231.         move.l    20(a1),(a3)+
  232.         move.l    24(a1),(a3)+
  233.         move.l    28(a1),(a3)+
  234.         add.l    #b_line,a0
  235.         add.l    #b_line,a1
  236.         dbra    d0,loop_cptxt
  237.  
  238.         clr.w    mstxtwhich        ;31.2 ms standard
  239.  
  240.         ;copy scope
  241.         move.l    scr2,a0
  242.         adda.l    #b_line*331+(48/8*4),a0
  243.         move.l    scopebuf,a1
  244.         move.w    #127,d0
  245. loop_cpsc:    move.w    #31,d1
  246. loop_cpsc2:    move.l    (a0)+,(a1)+
  247.         dbra    d1,loop_cpsc2
  248.         adda.w    #b_line-128,a0
  249.         dbra    d0,loop_cpsc
  250.  
  251.         ;copy vu
  252.         move.l    scr2,a0
  253.         adda.l    #b_line*30+(48/8*4),a0
  254.         move.l    vubuf,a1
  255.         move.w    #59,d0
  256. loop_cpvu:    move.w    #9,d1
  257. loop_cpvu2:    move.l    (a0)+,(a1)+
  258.         dbra    d1,loop_cpvu2
  259.         adda.l    #b_line-40,a0
  260.         dbra    d0,loop_cpvu
  261.  
  262.         ;copy screen
  263.         move.l    #len_of_scr/4,d0
  264.         move.l    scr2,a0
  265.         move.l    scr1,a1
  266. loop_cpyscr:    move.l    (a0)+,(a1)+
  267.         subq.l    #1,d0
  268.         bne    loop_cpyscr
  269.  
  270.  
  271.         move.l    scr2,scr        ;1st screen
  272.         move.w    #11,d0
  273.         move.w    #40,d1
  274.         move.w    lgain,d2
  275.         bsr    put_icon
  276.         move.w    #27,d0
  277.         move.w    #40,d1
  278.         move.w    rgain,d2
  279.         bsr    put_icon
  280.         move.w    #17,d1
  281.         sub.w    speaker,d1
  282.         move.w    d1,d2
  283.         move.w    #16,d0
  284.         move.w    #56,d1
  285.         bsr    put_icon
  286.  
  287.         move.l    scr1,scr
  288.         move.w    #11,d0            ;put icons on 2nd screen too
  289.         move.w    #40,d1
  290.         move.w    lgain,d2
  291.         bsr    put_icon
  292.         move.w    #27,d0
  293.         move.w    #40,d1
  294.         move.w    rgain,d2
  295.         bsr    put_icon
  296.         move.w    #17,d1
  297.         sub.w    speaker,d1
  298.         move.w    d1,d2
  299.         move.w    #16,d0
  300.         move.w    #56,d1
  301.         bsr    put_icon
  302.  
  303.         move.w    #-1,icon1x        ;no icons to put
  304.         move.w    #-1,icon2x
  305.  
  306.         clr.w    leftvu
  307.         clr.w    rightvu
  308.  
  309.         move.w    #14*2-1,d0
  310.         lea    left_bars,a0
  311. loop_clrbars:    clr.w    (a0)+
  312.         dbra    d0,loop_clrbars
  313.  
  314.         bsr    init_mouse        ;own mouse routines
  315.  
  316.         clr.w    freeze            ;freeze off
  317.         clr.w    helpdiag_on        ;help dialog not shown
  318.         clr.w    restdiag_count        ;no restore help dialog background (2: both screens, 1: one screen to go)
  319.         clr.l    old_hz200        ;for speed control
  320.  
  321.     IF    speedtest!=0
  322.         bsr    init_test
  323.     ENDIF
  324.  
  325.  
  326. ;------------------------------------------------------------------------------
  327.  
  328. main_loop:
  329.  
  330.     IF    speedtest!=0
  331.         add.l    #1,testcnt
  332.     ENDIF
  333.  
  334.         tst.w    freeze
  335.         bne    freeze1            ;don't get data from dsp
  336.  
  337.         move.l    #$123456,sendbuf    ;magic number
  338.  
  339.         move.l    #2+points*2*2,-(sp)    ;vu data + scope left+right full/small range
  340.         pea    buf
  341.         move.l    #1,-(sp)
  342.         pea    sendbuf+1        ;send lower 3 bytes of long
  343.         move.w    #96,-(sp)        ;if something goes really wrong try #97 (Dsp_BlkHandShake) here
  344.         trap    #14            ;Dsp_DoBlock
  345.         lea    18(sp),sp
  346. freeze1:
  347.  
  348.         ;clear vu background
  349.         move.l    vubuf,a0
  350.         move.l    scr,a1
  351.         adda.l    #b_line*31+(48/8*4),a1
  352.         move.w    #59,d0
  353. loop_clrvu:
  354.         movem.l (a0)+,d1-d7/a2-a4
  355.         adda.w    #40,a1
  356.         movem.l d1-d7/a2-a4,-(a1)
  357.         adda.w    #232+40,a1
  358.         movem.l d1-d7/a2-a4,-(a1)
  359.         adda.w    #b_line-232,a1
  360.         dbra    d0,loop_clrvu
  361.  
  362.  
  363.         lea    log,a0
  364.         move.w    buf,d0
  365.         lsr.w    #5,d0
  366.         move.b    (a0,d0),d1
  367.         lsl.w    #8,d1
  368.  
  369.         move.w    leftvu,d2
  370.  
  371.         tst.w    freeze
  372.         bne    freeze5
  373.  
  374.         cmp.w    d1,d2
  375.         bgt    contlvu            ;smaller than before
  376.         sub.w    d2,d1
  377.         asr.w    #1,d1            ;slow it down a little to
  378.         add.w    d1,d2            ;make it look more real
  379.         bra    contlvu2
  380. contlvu:
  381.         sub.w    #$500,d2        ;constant speed backwards
  382.         bpl    contlvu2
  383.         clr.w    d2
  384. contlvu2:    move.w    d2,leftvu
  385. freeze5:
  386.         ;and right channel
  387.  
  388.         move.w    buf+3,d0
  389.         lsr.w    #5,d0
  390.         move.b    (a0,d0),d1
  391.         lsl.w    #8,d1
  392.         move.w    rightvu,d2
  393.  
  394.         tst.w    freeze
  395.         bne    freeze6
  396.  
  397.         cmp.w    d1,d2
  398.         bgt    contrvu
  399.         sub.w    d2,d1
  400.         asr.w    #1,d1
  401.         add.w    d1,d2
  402.         bra    contrvu2
  403. contrvu:
  404.         sub.w    #$500,d2
  405.         bpl    contrvu2
  406.         clr.w    d2
  407. contrvu2:    move.w    d2,rightvu
  408. freeze6:
  409.  
  410.         move.w    #88,d0
  411.         move.w    leftvu,d1
  412.         lsr.w    #8,d1
  413.         bsr    put_vu
  414.         move.w    #552,d0
  415.         move.w    rightvu,d1
  416.         lsr.w    #8,d1
  417.         bsr    put_vu
  418.  
  419.  
  420.  
  421.         ;clear scope background
  422.         move.l    scopebuf,a0
  423.         move.l    scr,a1
  424.         adda.l    #b_line*331+(48/8*4),a1
  425.         move.w    #127,d0
  426. loop_clrsc:
  427.         movem.l (a0)+,d1-d7/a2-a6
  428.         adda.w    #48,a1
  429.         movem.l d1-d7/a2-a6,-(a1)
  430.         adda.w    #144+48,a1
  431.         movem.l d1-d7/a2-a6,-(a1)
  432.         movem.l (a0)+,d1-d7/a2-a6
  433.         suba.w    #144-(48+48),a1
  434.         movem.l d1-d7/a2-a6,-(a1)
  435.         adda.w    #144+48,a1
  436.         movem.l d1-d7/a2-a6,-(a1)
  437.         movem.l (a0)+,d1-d7/a2
  438.         suba.w    #144-(48+32),a1
  439.         movem.l d1-d7/a2,-(a1)
  440.         adda.w    #144+32,a1
  441.         movem.l d1-d7/a2,-(a1)
  442.         adda.w    #b_line+32-144-128,a1
  443.         dbra    d0,loop_clrsc
  444.  
  445.         tst.w    mstxtwhich        ;which data to put
  446.         bne    full_range
  447.  
  448.         move.w    #49,d0
  449.         lea    leftbuf,a0
  450.         bsr    put_scope
  451.  
  452.         move.w    #337,d0
  453.         lea    rightbuf,a0
  454.         bsr    put_scope
  455.  
  456.         bra    small_range
  457. full_range:
  458.         move.w    #49,d0
  459.         lea    leftbufsm,a0
  460.         bsr    put_scope
  461.  
  462.         move.w    #337,d0
  463.         lea    rightbufsm,a0
  464.         bsr    put_scope
  465. small_range:
  466.  
  467.         tst.w    helpdiag_on
  468.         beq    no_helpdiag
  469.  
  470.         ;put help dialog
  471.         move.l    helpdiag,a0
  472.         move.l    scr,a1
  473.         add.l    #65*b_line+b_line/2-(256/8*4)/2+8*4,a1
  474.         move.w    #349,d0
  475. loop_put_help:
  476.         REPT    4
  477.         movem.l    (a0)+,d1-d7/a2
  478.         movem.l    d1-d7/a2,-(a1)
  479.         adda.w    #8*4*2,a1
  480.         ENDM
  481.         adda.w    #b_line-(256/8*4),a1
  482.  
  483.         dbra    d0,loop_put_help
  484.  
  485.         ;draw left shadow, odd lines
  486.         move.l    scr,a1
  487.         add.l    #73*b_line+b_line/2-(256/8*4)/2-7,a1
  488.         move.l    a1,a2
  489.         move.b    #$55,d1
  490.         move.b    #$aa,d2
  491.         move.w    #350/2-1,d0
  492. loop_put_help2:
  493.         and.b    d1,(a1)
  494.         and.b    d1,2(a1)
  495.         and.b    d1,4(a1)
  496.         or.b    d2,6(a1)
  497.         adda.w    #b_line*2,a1
  498.         dbra    d0,loop_put_help2
  499.  
  500.         rol.b    #1,d1
  501.         rol.b    #1,d2
  502.  
  503.         ;even lines
  504.         move.l    a2,a1
  505.         add.w    #b_line,a1
  506.         move.w    #350/2-1,d0
  507. loop_put_help5:
  508.         and.b    d1,(a1)
  509.         and.b    d1,2(a1)
  510.         and.b    d1,4(a1)
  511.         or.b    d2,6(a1)
  512.         adda.w    #b_line*2,a1
  513.         dbra    d0,loop_put_help5
  514.  
  515.         ;draw lower shadow
  516.         move.l    scr,a1
  517.         add.l    #415*b_line+b_line/2-(256/8*4)/2,a1
  518.         move.w    #$5555,d1
  519.         move.w    #$aaaa,d2
  520.         move.w    #7,d0
  521. loop_put_help4:
  522.         move.w    #14,d3
  523. loop_put_help3:
  524.         and.w    d1,(a1)+
  525.         and.w    d1,(a1)+
  526.         and.w    d1,(a1)+
  527.         or.w    d2,(a1)+
  528.  
  529.         dbra    d3,loop_put_help3
  530.  
  531.         and.b    d1,(a1)
  532.         and.b    d1,2(a1)
  533.         and.b    d1,4(a1)
  534.         or.b    d2,6(a1)
  535.         rol.w    #1,d1
  536.         rol.w    #1,d2
  537.         adda.w    #b_line-128+8,a1
  538.  
  539.         dbra    d0,loop_put_help4
  540.  
  541. no_helpdiag:
  542.  
  543.         move.w    #-1,new_scr        ;new screen address has to be set in vertical blank interrupt
  544.         bsr    wait_forvbl
  545.  
  546.     IF    speedtest=0
  547.         bsr    wait_forhz200        ;not too fast on faster computers
  548.     ENDIF
  549.  
  550.  
  551.         tst.w    restdiag_count
  552.         beq    no_restorediag
  553.  
  554.         ;restore help dialog background on this screen
  555.         move.l    hdiagsave,a0
  556.         move.l    scr,a1
  557.         add.l    #65*b_line+b_line/2-(128/2+8),a1
  558.         move.w    #358-1,d0
  559. loop_restdiag:
  560.         movem.l    (a0)+,d1-d7/a2
  561.         adda.w    #8*4,a1
  562.         movem.l    d1-d7/a2,-(a1)
  563.         adda.w    #8*4*2,a1
  564.  
  565.         movem.l    (a0)+,d1-d7/a2
  566.         movem.l    d1-d7/a2,-(a1)
  567.         adda.w    #8*4*2,a1
  568.  
  569.         movem.l    (a0)+,d1-d7/a2
  570.         movem.l    d1-d7/a2,-(a1)
  571.         adda.w    #8*4,a1
  572.  
  573.         movem.l    (a0)+,d1-d7/a2-a4
  574.         adda.w    #10*4,a1
  575.         movem.l    d1-d7/a2-a4,-(a1)
  576.         adda.w    #10*4,a1
  577.  
  578.         adda.w    #b_line-(128+8),a1
  579.  
  580.         dbra    d0,loop_restdiag
  581.         subq.w    #1,restdiag_count    ;this screen done
  582. no_restorediag:
  583.  
  584.         cmp.w    #-1,icon1x        ;icon to put on this screen?
  585.         beq    no_icon1
  586.         move.w    icon1x,d0
  587.         move.w    icon1y,d1
  588.         move.w    icon1n,d2
  589.         bsr    put_icon
  590.         move.w    #-1,icon1x
  591. no_icon1:
  592.         cmp.w    #-1,icon2x        ;icon to put on this screen?
  593.         beq    no_icon2
  594.         move.w    icon2x,d0
  595.         move.w    icon2y,d1
  596.         move.w    icon2n,d2
  597.         bsr    put_icon
  598.         move.w    #-1,icon2x
  599. no_icon2:
  600.  
  601.  
  602.         ;clear spectrum analyzer bars
  603.         move.l    scr,a0
  604.         adda.l    #b_line*130+4*8+112,a0
  605.         move.l    a0,a1
  606.         adda.w    #18*8,a1
  607.         moveq    #0,d1
  608.         move.l    d1,d2
  609.         move.l    d1,d3
  610.         move.l    d1,d4
  611.         move.l    d1,d5
  612.         move.l    d1,d6
  613.         move.l    d1,d7
  614.         move.w    #143,d0
  615. loop_clrsp:    movem.l d1-d7,-(a0)
  616.         movem.l d1-d7,-(a0)
  617.         movem.l d1-d7,-(a0)
  618.         movem.l d1-d7,-(a0)
  619.         movem.l d1-d7,-(a1)
  620.         movem.l d1-d7,-(a1)
  621.         movem.l d1-d7,-(a1)
  622.         movem.l d1-d7,-(a1)
  623.         adda.w    #b_line+112,a0
  624.         adda.w    #b_line+112,a1
  625.         dbra    d0,loop_clrsp
  626.  
  627.  
  628.  
  629.         tst.w    freeze
  630.         bne    freeze2            ;don't get data from dsp
  631.  
  632.         move.l    #14*2,-(sp)
  633.         pea    buf2
  634.         move.l    #1,-(sp)
  635.         pea    sendbuf+1
  636.         move.w    #97,-(sp)
  637.         trap    #14            ;Dsp_BlkHandShake
  638.         lea    18(sp),sp
  639. freeze2:
  640.  
  641.         ;put spectrum analyzer bars
  642.         move.w    #13,d2
  643.         lea    buf2,a1
  644.         lea    left_bars,a3
  645.         lea    log2,a2
  646.         move.w    #4,d3
  647. loop_putlbars:
  648.         move.w    (a3),d1
  649.         tst.w    freeze
  650.         bne    freeze3
  651.  
  652.         move.w    (a1)+,d1
  653.         addq.l    #1,a1
  654.         and.w    #$7ff,d1
  655.         move.b    (a2,d1),d1
  656.         and.w    #$ff,d1
  657.         move.w    (a3),d4
  658.         sub.w    d4,d1
  659.         asr.w    #1,d1            ;slow it down a little
  660.         add.w    d4,d1
  661. freeze3:
  662.         move.w    d1,(a3)+
  663.  
  664.         move    d3,d0
  665.         bsr    draw_bar
  666.         addq.w    #1,d3
  667.         dbra    d2,loop_putlbars
  668.  
  669.  
  670.         move.w    #13,d2
  671.         ;lea    buf2+14*3,a1
  672.         lea    right_bars,a3
  673.         ;lea    log2,a2
  674.         move.w    #22,d3
  675. loop_putrbars:
  676.         move.w    (a3),d1
  677.         tst.w    freeze
  678.         bne    freeze4
  679.  
  680.         move.w    (a1)+,d1
  681.         addq.l    #1,a1
  682.         and.w    #$7ff,d1
  683.         move.b    (a2,d1),d1
  684.         and.w    #$ff,d1
  685.         move.w    (a3),d4
  686.         sub.w    d4,d1
  687.         asr.w    #1,d1
  688.         add.w    d4,d1
  689. freeze4:
  690.         move.w    d1,(a3)+
  691.  
  692.         move    d3,d0
  693.         bsr    draw_bar
  694.         addq.w    #1,d3
  695.         dbra    d2,loop_putrbars
  696.  
  697.  
  698.  
  699.         tst.w    mbut
  700.         bne    mb_pressed
  701.         clr.w    mouse_but
  702.         bra    mb_not_pressed
  703. mb_pressed:
  704.         add.w    #1,mouse_but        ;don't repeat too fast
  705. mb_not_pressed:
  706.  
  707.         tst.w    helpdiag_on
  708.         beq    no_help_on
  709.         tst.w    mouse_but
  710.         bgt    restore_diag
  711.  
  712.         ; Cconis()
  713.         move    #11, -(sp)
  714.         trap    #1
  715.         addq.l    #2, sp
  716.         cmp.w    #-1,D0
  717.         bne    main_loop
  718.  
  719.         ; Crawcin()
  720.         move    #7, -(sp)
  721.         trap    #1
  722.         addq.l    #2, sp
  723.  
  724. restore_diag:
  725.         clr.w    helpdiag_on
  726.         move.w    #2,restdiag_count    ;clear on both screens (later)
  727.         move.w    #-8,mouse_but
  728.         bra    main_loop
  729. no_help_on:
  730.  
  731.         move.w    #$1234,d7        ;magic number (means: no command)
  732.  
  733.         tst.w    mouse_but
  734.         ble    no_mousebut
  735.  
  736.         move.w    #-4,mouse_but        ;don't repeat too fast
  737.  
  738.         ;left channel down
  739.         move.w    #145,d0
  740.         move.w    #40,d1
  741.         move.w    #183,d2
  742.         move.w    #76,d3
  743.         bsr    test_mouse_in_box
  744.         tst.w    d0
  745.         beq    not_in_box1
  746.         move.w    #2,d7            ;scancode 2 -> key '1'
  747.         bra    no_mousebut        ;simulate keyboard
  748. not_in_box1:
  749.  
  750.         move.w    #193,d0
  751.         move.w    #50,d1
  752.         move.w    #240,d2
  753.         move.w    #76,d3
  754.         bsr    test_mouse_in_box
  755.         tst.w    d0
  756.         beq    not_in_box2
  757.         move.w    #3,d7            ;left channel up
  758.         bra    no_mousebut
  759. not_in_box2:
  760.  
  761.         move.w    #250,d0
  762.         move.w    #55,d1
  763.         move.w    #288,d2
  764.         move.w    #108,d3
  765.         bsr    test_mouse_in_box
  766.         tst.w    d0
  767.         beq    not_in_box3
  768.         move.w    #6,d7            ;speaker
  769.         bra    no_mousebut
  770. not_in_box3:
  771.  
  772.         move.w    #289,d0
  773.         move.w    #55,d1
  774.         move.w    #320,d2
  775.         move.w    #108,d3
  776.         bsr    test_mouse_in_box
  777.         tst.w    d0
  778.         beq    not_in_box4
  779.         move.w    #7,d7            ;freeze
  780.         bra    no_mousebut
  781. not_in_box4:
  782.  
  783.         move.w    #321,d0
  784.         move.w    #55,d1
  785.         move.w    #352,d2        ;icon
  786.         move.w    #108,d3
  787.         bsr    test_mouse_in_box
  788.         tst.w    d0
  789.         bne    in_box5
  790.         move.w    #47,d0
  791.         move.w    #329,d1
  792.         move.w    #305,d2        ;left scope
  793.         move.w    #459,d3
  794.         bsr    test_mouse_in_box
  795.         tst.w    d0
  796.         bne    in_box5
  797.         move.w    #335,d0
  798.         move.w    #329,d1
  799.         move.w    #593,d2        ;right scope
  800.         move.w    #459,d3
  801.         bsr    test_mouse_in_box
  802.         tst.w    d0
  803.         beq    not_in_box5
  804. in_box5:
  805.         move.w    #8,d7            ;zoom
  806.         bra    no_mousebut
  807. not_in_box5:
  808.  
  809.         move.w    #353,d0
  810.         move.w    #55,d1
  811.         move.w    #390,d2
  812.         move.w    #108,d3
  813.         bsr    test_mouse_in_box
  814.         tst.w    d0
  815.         beq    not_in_box6
  816.         move.w    #9,d7            ;quit
  817.         bra    no_mousebut
  818. not_in_box6:
  819.  
  820.         move.w    #400,d0
  821.         move.w    #50,d1
  822.         move.w    #442,d2
  823.         move.w    #76,d3
  824.         bsr    test_mouse_in_box
  825.         tst.w    d0
  826.         beq    not_in_box7
  827.         move.w    #4,d7            ;right channel down
  828.         bra    no_mousebut
  829. not_in_box7:
  830.  
  831.         move.w    #450,d0
  832.         move.w    #40,d1
  833.         move.w    #497,d2
  834.         move.w    #76,d3
  835.         bsr    test_mouse_in_box
  836.         tst.w    d0
  837.         beq    not_in_box8
  838.         move.w    #5,d7            ;right channel up
  839.         bra    no_mousebut
  840. not_in_box8:
  841.  
  842.         move.w    #440,d0
  843.         move.w    #3,d1
  844.         move.w    #610,d2
  845.         move.w    #18,d3
  846.         bsr    test_mouse_in_box
  847.         tst.w    d0
  848.         beq    not_in_box9
  849.         move.w    #98,d7            ;help
  850.         bra    no_mousebut
  851. not_in_box9:
  852.  
  853.         move.w    #217,d0
  854.         move.w    #36,d1
  855.         move.w    #250,d2
  856.         move.w    #50,d3
  857.         bsr    test_mouse_in_box
  858.         tst.w    d0
  859.         bne    in_box10
  860.         move.w    #390,d0
  861.         move.w    #36,d1
  862.         move.w    #422,d2
  863.         move.w    #50,d3
  864.         bsr    test_mouse_in_box
  865.         tst.w    d0
  866.         beq    not_in_box10
  867. in_box10:                    ;link button(s)
  868.         ; Kbshift(-1)
  869.         move.w    #-1,-(sp)
  870.         move.w    #11,-(sp)
  871.         trap    #13
  872.         addq.l    #4,sp
  873.         bchg    #4,d0            ;swap capslock
  874.         ; Kbshift(-1)
  875.         move.w    d0,-(sp)
  876.         move.w    #11,-(sp)
  877.         trap    #13
  878.         addq.l    #4,sp
  879.  
  880.         bra    no_mousebut
  881. not_in_box10:
  882.  
  883. no_mousebut:
  884.         ; Cconis()
  885.         move    #11, -(sp)
  886.         trap    #1
  887.         addq.l    #2, sp
  888.         cmp.w    #-1,D0
  889.         bne    no_key
  890.  
  891.         ; Crawcin()
  892.         move    #7, -(sp)
  893.         trap    #1
  894.         addq.l    #2, sp
  895.         swap    d0
  896.         move.w    d0,d7
  897. no_key:
  898.  
  899.         ; Kbshift(-1)
  900.         move.w    #-1,-(sp)
  901.         move.w    #11,-(sp)
  902.         trap    #13
  903.         addq.l    #4,sp
  904.         move.b    d0,d1
  905.         and.b    #%11,d0        ;shift keys
  906.         tst.b    d0
  907.         sne    d0
  908.         eor    d1,d0        ;xor with capslock
  909.         lsr.b    #4,d0
  910.         and.w    #1,d0        ;1 if shift or capslock pressed, 0 if shift and capslock pressed or no key pressed
  911.         move.w    d0,shift
  912.  
  913.         tst.w    d0
  914.         beq    link_col1
  915.         move.l    $ffff9800+11*4,link_col
  916.         bra    link_col2
  917. link_col1:
  918.         move.l    $ffff9800+3*4,link_col
  919. link_col2:
  920.  
  921.  
  922.         cmp.w    #$1234,d7        ;no command
  923.         beq    main_loop
  924.  
  925.  
  926.         move.w    d7,d0
  927.  
  928.         cmp.b    #2,d0        ; 1
  929.         beq    lgainleft
  930.         cmp.b    #109,d0        ; 1 on numeric keypad
  931.         bne    no_lgainleft
  932. lgainleft:
  933.         tst.w    lgain
  934.         beq    cont_lgl
  935.         subq.w    #1,lgain
  936.         move.w    lgain,d0
  937.         lsl.w    #4,d0
  938.  
  939.         move.w    d0,-(SP)
  940.         move.w    #2,-(SP)
  941.         move.w    #130,-(SP)    ;soundcmd()
  942.         trap    #14
  943.         addq.l    #6,SP
  944.  
  945.         move.w    #11,d0
  946.         move.w    #40,d1
  947.         move.w    lgain,d2
  948.         move.w    d0,icon1x
  949.         move.w    d1,icon1y    ;draw icon on 2nd screen later
  950.         move.w    d2,icon1n
  951.         bsr    put_icon
  952. cont_lgl:    tst.w    shift
  953.         beq    main_loop    ;no shift pressed
  954.         clr.w    shift        ;no repeat forever (l->r->l->r->...)
  955.         bra    rgainleft
  956. no_lgainleft:
  957.  
  958.         cmp.b    #3,d0        ; 2
  959.         beq    lgainright
  960.         cmp.b    #110,d0
  961.         bne    no_lgainright
  962. lgainright:
  963.         move.w    lgain,d0
  964.         cmp.w    #15,d0
  965.         beq    cont_lgr
  966.         addq.w    #1,lgain
  967.         move.w    lgain,d0
  968.         lsl.w    #4,d0
  969.  
  970.         move.w    d0,-(SP)
  971.         move.w    #2,-(SP)
  972.         move.w    #130,-(SP)    ;soundcmd()
  973.         trap    #14
  974.         addq.l    #6,SP
  975.  
  976.         move.w    #11,d0
  977.         move.w    #40,d1
  978.         move.w    lgain,d2
  979.         move.w    d0,icon1x
  980.         move.w    d1,icon1y
  981.         move.w    d2,icon1n
  982.         bsr    put_icon
  983. cont_lgr:    tst.w    shift
  984.         beq    main_loop
  985.         clr.w    shift
  986.         bra    rgainright
  987. no_lgainright:
  988.  
  989.         cmp.b    #4,d0        ; 3
  990.         beq    rgainleft
  991.         cmp.b    #111,d0
  992.         bne    no_rgainleft
  993. rgainleft:
  994.         tst.w    rgain
  995.         beq    cont_rgl
  996.         subq.w    #1,rgain
  997.         move.w    rgain,d0
  998.         lsl.w    #4,d0
  999.  
  1000.         move.w    d0,-(SP)
  1001.         move.w    #3,-(SP)
  1002.         move.w    #130,-(SP)    ;soundcmd()
  1003.         trap    #14
  1004.         addq.l    #6,SP
  1005.  
  1006.         move.w    #27,d0
  1007.         move.w    #40,d1
  1008.         move.w    rgain,d2
  1009.         move.w    d0,icon2x
  1010.         move.w    d1,icon2y
  1011.         move.w    d2,icon2n
  1012.         bsr    put_icon
  1013. cont_rgl:    tst.w    shift
  1014.         beq    main_loop
  1015.         clr.w    shift
  1016.         bra    lgainleft
  1017. no_rgainleft:
  1018.  
  1019.         cmp.b    #5,d0        ; 4
  1020.         beq    rgainright
  1021.         cmp.b    #106,d0
  1022.         bne    no_rgainright
  1023. rgainright:
  1024.         move.w    rgain,d0
  1025.         cmp.w    #15,d0
  1026.         beq    cont_rgr
  1027.         addq.w    #1,rgain
  1028.         move.w    rgain,d0
  1029.         lsl.w    #4,d0
  1030.  
  1031.         move.w    d0,-(SP)
  1032.         move.w    #3,-(SP)
  1033.         move.w    #130,-(SP)    ;soundcmd()
  1034.         trap    #14
  1035.         addq.l    #6,SP
  1036.  
  1037.         move.w    #27,d0
  1038.         move.w    #40,d1
  1039.         move.w    rgain,d2
  1040.         move.w    d0,icon2x
  1041.         move.w    d1,icon2y
  1042.         move.w    d2,icon2n
  1043.         bsr    put_icon
  1044. cont_rgr:    tst.w    shift
  1045.         beq    main_loop
  1046.         clr.w    shift
  1047.         bra    lgainright
  1048. no_rgainright:
  1049.  
  1050.         cmp.b    #6,d0        ; 5
  1051.         beq    do_speaker
  1052.         cmp.b    #107,d0
  1053.         bne    no_speaker
  1054. do_speaker:
  1055.         subq.w    #1,speaker    ;1->0/0->1
  1056.         neg.w    speaker
  1057.         bsr    set_speaker
  1058.         move.w    #17,d1
  1059.         sub.w    speaker,d1
  1060.         move.w    d1,d2
  1061.         move.w    #16,d0
  1062.         move.w    #56,d1
  1063.         move.w    d0,icon1x
  1064.         move.w    d1,icon1y
  1065.         move.w    d2,icon1n
  1066.         bsr    put_icon
  1067.         bra    main_loop
  1068. no_speaker:
  1069.  
  1070.         cmp.b    #7,d0        ; 6
  1071.         beq    do_freeze
  1072.         cmp.b    #108,d0
  1073.         bne    no_freeze
  1074. do_freeze:
  1075.         move.w    freeze,d0
  1076.         neg.w    d0
  1077.         addq.w    #1,d0
  1078.         move.w    d0,freeze
  1079.  
  1080.         move.w    #18,d2
  1081.         add.w    d0,d2
  1082.         move.w    #18,d0
  1083.         move.w    #56,d1
  1084.         move.w    d0,icon1x
  1085.         move.w    d1,icon1y
  1086.         move.w    d2,icon1n
  1087.         bsr    put_icon
  1088. no_freeze:
  1089.  
  1090.         cmp.b    #8,d0        ; 7
  1091.         beq    scopezoom
  1092.         cmp.b    #103,d0
  1093.         bne    no_scopezoom
  1094. scopezoom:
  1095.         move.w    mstxtwhich,d0
  1096.         subq.w    #1,d0
  1097.         neg.w    d0        ;1->0, 0->1
  1098.         move.w    d0,mstxtwhich
  1099.         mulu.w    #len_mstxtbuf,d0
  1100.         move.l    mstexts,a0
  1101.         add.l    d0,a0        ;start of buffer
  1102.  
  1103.         move.l    scopebuf,a1
  1104.         add.l    #57*(256/8*4)+(96/8*4),a1
  1105.  
  1106.         move.w    #11,d0
  1107. loop_cptxt2:    move.l    (a0)+,(a1)
  1108.         move.l    (a0)+,4(a1)
  1109.         move.l    (a0)+,8(a1)
  1110.         move.l    (a0)+,12(a1)
  1111.         move.l    (a0)+,16(a1)
  1112.         move.l    (a0)+,20(a1)
  1113.         move.l    (a0)+,24(a1)
  1114.         move.l    (a0)+,28(a1)
  1115.         add.l    #256/8*4,a1
  1116.         dbra    d0,loop_cptxt2
  1117.  
  1118.         move.w    #20,d2
  1119.         add.w    mstxtwhich,d2
  1120.         move.w    #20,d0
  1121.         move.w    #56,d1
  1122.         move.w    d0,icon1x
  1123.         move.w    d1,icon1y
  1124.         move.w    d2,icon1n
  1125.         bsr    put_icon
  1126.  
  1127.         bra    main_loop
  1128. no_scopezoom:
  1129.  
  1130.     IF    speedtest!=0
  1131.         cmp.w    #1,d0        ;escape
  1132.         bne    no_esc
  1133.  
  1134.         bsr    test
  1135.         bra    main_loop
  1136. no_esc:
  1137.     ENDIF
  1138.  
  1139.         cmp.b    #98,d0        ;help
  1140.         bne    no_help
  1141.  
  1142.         move.w    #-1,helpdiag_on
  1143.  
  1144.         ;save dialog background
  1145.         move.l    hdiagsave,a0
  1146.         move.l    scr,a1
  1147.         add.l    #65*b_line+b_line/2-(128/2+8),a1
  1148.         move.w    #358-1,d0
  1149. loop_savediag:
  1150.         movem.l    (a1)+,d1-d7/a2
  1151.         adda.w    #8*4,a0
  1152.         movem.l    d1-d7/a2,-(a0)
  1153.         adda.w    #8*4*2,a0
  1154.  
  1155.         movem.l    (a1)+,d1-d7/a2
  1156.         movem.l    d1-d7/a2,-(a0)
  1157.         adda.w    #8*4*2,a0
  1158.  
  1159.         movem.l    (a1)+,d1-d7/a2
  1160.         movem.l    d1-d7/a2,-(a0)
  1161.         adda.w    #8*4,a0
  1162.  
  1163.         movem.l    (a1)+,d1-d7/a2-a4
  1164.         adda.w    #10*4,a0
  1165.         movem.l    d1-d7/a2-a4,-(a0)
  1166.         adda.w    #10*4,a0
  1167.  
  1168.         adda.w    #b_line-(128+8),a1
  1169.  
  1170.         dbra    d0,loop_savediag
  1171.  
  1172.         bra    main_loop
  1173. no_help:
  1174.  
  1175.         cmp.b    #9,d0        ; 8
  1176.         beq    the_end
  1177.         cmp.b    #104,d0
  1178.         bne    main_loop
  1179.  
  1180.  
  1181. the_end:
  1182.         bsr    exit_mouse
  1183.  
  1184.         bsr    restore_video
  1185.  
  1186.         bsr    key_click_old
  1187.  
  1188.         ;Super()
  1189.         move.l    old_superstack,-(sp)
  1190.         move.w    #$20,-(sp)
  1191.         trap    #1
  1192.         addq.l    #6,sp
  1193.  
  1194.         bsr    restore_sound
  1195.  
  1196.         move.w    #257,d0
  1197.         bsr    graf_mouse        ;vdi mouse on
  1198.  
  1199.         move.w    monitor,d0
  1200.         cmp.w    #2,d0
  1201.         beq    vga
  1202.         bsr    better_buy_vga        ;put alert
  1203. vga:
  1204.         bra    exit
  1205.  
  1206.  
  1207. ;-----------------------------------------------------------------------------
  1208.  
  1209.     IF    speedtest!=0
  1210.  
  1211. init_test:
  1212.         move.l    #0,testcnt
  1213.         move.l    _hz_200,tstold200
  1214.         rts
  1215. test:
  1216.         move.l    _hz_200,d0
  1217.         sub.l    tstold200,d0
  1218.         move.l    #8,d1
  1219.         lea    tstbuf1,a0
  1220.         bsr    l_to_a
  1221.  
  1222.         move.l    testcnt,d0
  1223.         move.l    #8,d1
  1224.         lea    tstbuf2,a0
  1225.         bsr    l_to_a
  1226.  
  1227.         pea    tstbuf
  1228.         move.w    #9,-(sp)
  1229.         trap    #1
  1230.         addq.l    #6,sp
  1231.  
  1232.         clr.l    testcnt
  1233.         move.l    _hz_200,tstold200
  1234.         rts
  1235.  
  1236. ;---long to ascii---
  1237. ;value in D0.l
  1238. ;field length in D1.l
  1239. ;return address in A0.l
  1240. l_to_a:        move.l    A0,A2
  1241.         move.l    #10,D2
  1242.         sub.l    D1,D2
  1243.         bmi    bindasc5
  1244.         lsl.l    #2,D2
  1245.         move.l    #numbers,A1
  1246.         add.l    D2,A1
  1247.         move.b    #'0',D2
  1248. bindasc1:    sub.l    (A1),D0
  1249.         bcs    bindasc2
  1250.         add.w    #1,D2
  1251.         bra    bindasc1
  1252. bindasc2:    add.l    (A1)+,D0
  1253.         tst.l    (A1)
  1254.         beq    bindasc4
  1255.         move.b    D2,(A0)+
  1256.         lsl    #8,D2
  1257.         move.b    #'0',D2
  1258.         bra    bindasc1
  1259. bindasc4:    move.b    D2,(A0)+
  1260.         move.b    #' ',(A0)+
  1261. bindasc5:    cmp.b    #'0',(A2)+
  1262.         bne    bindasc6
  1263.         move.b    #' ',-1(A2)
  1264.         bra    bindasc5
  1265. bindasc6:    rts
  1266.  
  1267.         data
  1268.  
  1269. numbers:    dc.l    1000000000,100000000,10000000,1000000
  1270.         dc.l    100000,10000,1000,100,10,1,0
  1271. tstbuf:        dc.b    27,'H('
  1272. tstbuf1:    dc.b    '00000000 / 200) seconds,'
  1273. tstbuf2:    dc.b    '00000000 program loops',0
  1274.  
  1275.         bss
  1276.  
  1277. testcnt:    ds.l    1
  1278. tstold200:    ds.l    1
  1279.  
  1280.         text
  1281.  
  1282.  
  1283.     ENDIF
  1284.  
  1285.  
  1286. ;x1 in d0, y1 in d1, x2 in d2, y2 in d3
  1287. ;ret d0: in=1, out=0
  1288. test_mouse_in_box:
  1289.         move.w    mouse_x,d4
  1290.         move.w    mouse_y,d5
  1291.         cmp.w    d4,d0
  1292.         bgt    not_in_box
  1293.         cmp.w    d5,d1
  1294.         bgt    not_in_box
  1295.         cmp.w    d4,d2
  1296.         blt    not_in_box
  1297.         cmp.w    d5,d3
  1298.         blt    not_in_box
  1299.         move.w    #1,d0
  1300.         rts
  1301. not_in_box:
  1302.         clr.w    d0
  1303.         rts
  1304.  
  1305. wait_forvbl:
  1306.         move.l    _frclock,d1
  1307. wait_vbl:    cmp.l    _frclock,d1
  1308.         beq    wait_vbl
  1309.         rts
  1310.  
  1311.  
  1312. wait_forhz200:
  1313.         move.l    old_hz200,d0
  1314.         add.l    #8,d0            ;max 200/8 times a second
  1315. wait_hz200:    cmp.l    _hz_200,d0
  1316.         bgt    wait_hz200
  1317.         move.l    _hz_200,old_hz200
  1318.         rts
  1319.  
  1320.  
  1321. ;video
  1322.  
  1323. ;addr in a0
  1324. ;data in 'VgetRGB' format
  1325. set_palet:
  1326.         lea    $ffff9800,a1
  1327.         move.w    #15,d0
  1328. loop_setp:
  1329.         move.b    (a0)+,d1
  1330.         move.b    (a0)+,d1
  1331.         lsl.l    #8,d1
  1332.         move.b    (a0)+,d1
  1333.         lsl.l    #8,d1
  1334.         lsl.l    #8,d1
  1335.         move.b    (a0)+,d1
  1336.         move.l    d1,(a1)+
  1337.         dbra    d0,loop_setp
  1338.         rts
  1339.  
  1340.  
  1341. ;addr in a0
  1342. set_regs:
  1343.         bsr    wait_forvbl
  1344.  
  1345.         move.b    (a0)+,$FFFF820A
  1346.         move.b    (a0)+,$FFFF8260
  1347.         move.w    (a0)+,$FFFF8266
  1348.         move.w    (a0)+,$FFFF8282
  1349.         move.w    (a0)+,$FFFF828C
  1350.         move.w    (a0)+,$FFFF82AC
  1351.         move.w    (a0)+,$FFFF82C0
  1352.         move.w    (a0)+,$FFFF82C2
  1353.         move.w    (a0)+,$FFFF8284
  1354.         move.w    (a0)+,$FFFF8286
  1355.         move.w    (a0)+,$FFFF8288
  1356.         move.w    (a0)+,$FFFF828A
  1357.         move.w    (a0)+,$FFFF82A2
  1358.         move.w    (a0)+,$FFFF82A4
  1359.         move.w    (a0)+,$FFFF82A6
  1360.         move.w    (a0)+,$FFFF82A8
  1361.         move.w    (a0)+,$FFFF82AA
  1362.         move.w    (a0)+,$FFFF8210
  1363.         rts
  1364.  
  1365. get_regs:
  1366.         bsr    wait_forvbl
  1367.  
  1368.         move.b    $FFFF820A,(a0)+
  1369.         move.b    $FFFF8260,(a0)+
  1370.         move.w    $FFFF8266,(a0)+
  1371.         move.w    $FFFF8282,(a0)+
  1372.         move.w    $FFFF828C,(a0)+
  1373.         move.w    $FFFF82AC,(a0)+
  1374.         move.w    $FFFF82C0,(a0)+
  1375.         move.w    $FFFF82C2,(a0)+
  1376.         move.w    $FFFF8284,(a0)+
  1377.         move.w    $FFFF8286,(a0)+
  1378.         move.w    $FFFF8288,(a0)+
  1379.         move.w    $FFFF828A,(a0)+
  1380.         move.w    $FFFF82A2,(a0)+
  1381.         move.w    $FFFF82A4,(a0)+
  1382.         move.w    $FFFF82A6,(a0)+
  1383.         move.w    $FFFF82A8,(a0)+
  1384.         move.w    $FFFF82AA,(a0)+
  1385.         move.w    $FFFF8210,(a0)+
  1386.  
  1387.         rts
  1388.  
  1389. save_palette:
  1390.         lea    $ffff8240,a0
  1391.         move.w    #15,d0
  1392.         lea    old_stpalet,a1
  1393. loop_savestp:    move.w    (a0)+,(a1)+
  1394.         dbra    d0,loop_savestp
  1395.         lea    $ffff9800,a0
  1396.         move.w    #255,d0
  1397.         lea    old_palet,a1
  1398. loop_savep:    move.l    (a0)+,(a1)+
  1399.         dbra    d0,loop_savep
  1400.         rts
  1401.  
  1402. rest_palette:
  1403.         lea    $ffff8240,a0
  1404.         move.w    #15,d0
  1405.         lea    old_stpalet,a1
  1406. loop_reststp:    move.w    (a1)+,(a0)+
  1407.         dbra    d0,loop_reststp
  1408.         lea    $ffff9800,a0
  1409.         move.w    #255,d0
  1410.         lea    old_palet,a1
  1411. loop_restp:    move.l    (a1)+,(a0)+
  1412.         dbra    d0,loop_restp
  1413.         rts
  1414.  
  1415. init_video:
  1416.         bsr    save_palette
  1417.  
  1418.         move.w    #2,-(sp)
  1419.         trap    #14            ;Physbase()
  1420.         addq.l    #2,sp
  1421.         move.l    d0,old_physscr
  1422.  
  1423.         move.w    #3,-(sp)
  1424.         trap    #14            ;Logbase()
  1425.         addq.l    #2,sp
  1426.         move.l    d0,old_logscr
  1427.  
  1428.         move.w    #-1,-(sp)
  1429.         move.w    #$58,-(sp)        ;VsetMode()
  1430.         trap    #14
  1431.         addq.l    #4,sp
  1432.         move.w    d0,old_mode
  1433.  
  1434.         and.w    #$20,d0            ;PAL bit
  1435.         lsr.w    #5,d0
  1436.         move.w    d0,pal
  1437.  
  1438.         move.w    d0,-(sp)
  1439.         move.w    #$5b,-(sp)        ;VgetSize()
  1440.         trap    #14
  1441.         addq.l    #4,sp
  1442.         move.l    d0,old_scrlen
  1443.  
  1444.         cmp.l    #len_of_scr,d0
  1445.         bgt    cont_vid1
  1446.  
  1447.         move.w    #-1,-(sp)
  1448.         move.l    scr1,-(sp)
  1449.         move.l    scr1,-(sp)
  1450.         move.w    #5,-(sp)        ;Setscreen
  1451.         trap    #14
  1452.         lea    $c(sp),sp
  1453. cont_vid1:
  1454.  
  1455.         move.l    #old_regs,a0
  1456.         bsr    get_regs
  1457.  
  1458.         move.w    vga_mode,d1
  1459.         move.w    monitor,d0
  1460.         cmp.w    #2,d0
  1461.         beq    set_mode
  1462.         move.w    tv60_mode,d1
  1463.         tst.w    pal
  1464.         beq    set_mode
  1465.         move.w    tv50_mode,d1
  1466. set_mode:
  1467.         move.w    d1,-(sp)
  1468.         move.w    #$58,-(sp)        ;VsetMode()
  1469.         trap    #14
  1470.         addq.l    #4,sp
  1471.  
  1472.  
  1473.         lea.l    vidregs_vga,a0
  1474.         move.w    monitor,d0
  1475.         cmp.w    #2,d0
  1476.         beq    set_vid
  1477.         lea.l    vidregs_tv60,a0
  1478.         tst.w    pal
  1479.         beq    set_vid
  1480.         lea.l    vidregs_tv50,a0
  1481. set_vid:
  1482.         bsr    set_regs
  1483.  
  1484.         move.l    old_scrlen,d0
  1485.         cmp.l    #len_of_scr,d0
  1486.         ble    cont_vid2
  1487.  
  1488.         move.w    #-1,-(sp)
  1489.         move.l    scr1,-(sp)
  1490.         move.l    scr1,-(sp)
  1491.         move.w    #5,-(sp)        ;Setscreen
  1492.         trap    #14
  1493.         lea    $c(sp),sp
  1494. cont_vid2:
  1495.  
  1496.         lea    palet,a0
  1497.         pea    set_palet
  1498.  
  1499.         rts
  1500.  
  1501.  
  1502. restore_video:
  1503.         move.l    old_scrlen,d0
  1504.         cmp.l    #len_of_scr,d0
  1505.         ble    cont_vid3
  1506.  
  1507.         move.w    #-1,-(sp)
  1508.         move.l    old_physscr,-(sp)
  1509.         move.l    old_logscr,-(sp)
  1510.         move.w    #5,-(sp)        ;Setscreen
  1511.         trap    #14
  1512.         lea    $c(sp),sp
  1513. cont_vid3:
  1514.  
  1515.  
  1516. ;-only necessary for Screenblaster (BlowUp?) [because VsetMode()
  1517. ;doesn't work when SB installed (except when in st compatible mode)].
  1518. ;-gives problems in ST- and 4-color modes so just skip it in these modes.
  1519. ;so don't try to return to the desktop when in 4-color
  1520. ;with SB installed. (but who uses 4 colors anyway?)
  1521.  
  1522.         move.w    old_mode,d0
  1523.         btst    #7,d0            ;ST Mode?
  1524.         bne    no_setregs        ;skip it
  1525.         and.w    #7,d0
  1526.         cmp.w    #1,d0            ;4 colors?
  1527.         beq    no_setregs
  1528.  
  1529.         lea    old_regs,a0
  1530.         bsr    set_regs
  1531. no_setregs:
  1532.  
  1533.         move.w    old_mode,-(sp)
  1534.         move.w    #$58,-(sp)        ;VsetMode()
  1535.         trap    #14
  1536.         addq.l    #4,sp
  1537.  
  1538.         move.l    old_scrlen,d0
  1539.         cmp.l    #len_of_scr,d0
  1540.         bgt    cont_vid4
  1541.  
  1542.         move.w    #-1,-(sp)
  1543.         move.l    old_physscr,-(sp)
  1544.         move.l    old_logscr,-(sp)
  1545.         move.w    #5,-(sp)        ;Setscreen()
  1546.         trap    #14
  1547.         lea    $c(sp),sp
  1548. cont_vid4:
  1549.         bsr    rest_palette
  1550.  
  1551.         rts
  1552.  
  1553.  
  1554.  
  1555.  
  1556. key_click_off:
  1557.         move.b    $484,oldconterm
  1558.         move.b    #2,$484            ;conterm: repeat=on
  1559.         rts
  1560.  
  1561. key_click_old:
  1562.         move.b    oldconterm,$484
  1563.         rts
  1564.  
  1565.  
  1566. ;ret d0:0=error
  1567. check_cookies:
  1568.         move.l    #'_CPU',d0
  1569.         bsr    get_cookie
  1570.         tst.w    d0
  1571.         beq    ret_check_c0
  1572.  
  1573.         cmp.l    #30,d1
  1574.         blt    ret_check_c0
  1575.  
  1576.         move.l    #'_SND',d0
  1577.         bsr    get_cookie
  1578.         tst.w    d0
  1579.         beq    ret_check_c0
  1580.  
  1581.         and.l    #$1c,d1
  1582.         cmp.l    #$1c,d1
  1583.         blt    ret_check_c0
  1584.  
  1585.         move.w    #-1,d0
  1586.         rts
  1587.  
  1588. ret_check_c0:    clr.w    d0
  1589.         rts
  1590.  
  1591.  
  1592. ;d0:cookie
  1593. ;ret d1:value
  1594. ;ret d0:found (1) or not (0)
  1595. get_cookie:
  1596.         move.l    $5a0,a0
  1597.         beq    ret_getcookie0        ;no cookie jar installed
  1598. loop_getcookie:
  1599.         cmp.l    (a0)+,d0
  1600.         bne    wrong_cookie
  1601.         move.l    (a0),d1
  1602.         move.w    #1,d0
  1603.         rts
  1604. wrong_cookie:    addq.l    #4,a0
  1605.         tst.l    -8(a0)
  1606.         bne    loop_getcookie
  1607.  
  1608. ret_getcookie0: clr.w    d0
  1609.         rts
  1610.  
  1611.  
  1612.  
  1613. ;draw bar for spectrum analyzer
  1614. ;d0=x, d1=h
  1615. draw_bar:
  1616.         move.l    scr,a0
  1617.         adda.l    #272*b_line,a0
  1618.         lsl.w    #3,d0
  1619.         adda.w    d0,a0
  1620.         move.l    #$00000000,d4
  1621.         move.l    #$00003ffc,d5
  1622.         move.l    #$3ffc3ffc,d6
  1623.         move.l    #$3ffc0000,d7
  1624.         move.l    d5,(a0)
  1625.         move.l    d4,4(a0)
  1626.         sub.w    #b_line,a0
  1627.         tst.w    d1
  1628.         bne    cont_db
  1629.         rts
  1630. cont_db:    subq.w    #1,d1
  1631. loop_db:    move.l    d6,(a0)
  1632.         move.l    d7,4(a0)
  1633.         move.l    d5,-b_line(a0)
  1634.         move.l    d4,4-b_line(a0)
  1635.         sub.w    #b_line*2,a0
  1636.         dbra    d1,loop_db
  1637.         rts
  1638.  
  1639. ;not documented!
  1640. get_speaker:
  1641.         move.w    #14,-(sp)
  1642.         move.l    #$1c0000,-(sp)
  1643.         trap    #14
  1644.         addq.l    #6,sp
  1645.         clr.w    speaker
  1646.         btst    #6,d0
  1647.         bne    ret_gs
  1648.         move.w    #1,speaker
  1649. ret_gs:     rts
  1650.  
  1651. ;not documented!
  1652. set_speaker:
  1653.         move.w    speaker,d6
  1654.         lsl.w    #6,d6
  1655.         bchg    #6,d6
  1656.         move.w    #14,-(sp)
  1657.         move.l    #$1c0000,-(sp)
  1658.         trap    #14
  1659.         addq.l    #6,sp
  1660.         bclr    #6,d0
  1661.         or.w    d6,d0
  1662.         move.w    #$8e,-(sp)
  1663.         move.w    d0,-(sp)
  1664.         move.w    #$1c,-(sp)
  1665.         trap    #14
  1666.         addq.l    #6,sp
  1667.         rts
  1668.  
  1669. ;d0=x/16, d1=y, d2=num
  1670. put_icon:
  1671.         move.l    scr,a1
  1672.         mulu.w    #b_line,d1
  1673.         adda.l    d1,a1
  1674.         lsl.w    #3,d0
  1675.         adda.w    d0,a1
  1676.         move.l    icons,a2
  1677.         lsl.w    #1,d2
  1678.         lsl.w    #8,d2
  1679.         adda.w    d2,a2
  1680.         move.w    #31,d0
  1681. loop_pi:    move.l    (a2)+,(a1)+
  1682.         move.l    (a2)+,(a1)+
  1683.         move.l    (a2)+,(a1)+
  1684.         move.l    (a2)+,(a1)+
  1685.         adda.w    #b_line-16,a1
  1686.         dbra    d0,loop_pi
  1687.         rts
  1688.  
  1689. ;d0=start x, a0=buf
  1690. put_scope:
  1691.         move.l    scr,a2
  1692.         move.w    d0,d1
  1693.         and.b    #$f0,d1
  1694.         lsr.w    #1,d1
  1695.         add.w    d1,a2
  1696.         move.w    d0,d1
  1697.         and.w    #$f,d1
  1698.         neg.w    d1
  1699.         add.w    #15,d1
  1700.         moveq    #0,d4
  1701.         bset    d1,d4
  1702.  
  1703.         move.w    #254,d1
  1704.         move.b    (a0),d7            ;first data point
  1705.         ext.w    d7
  1706.         neg.w    d7
  1707.         add.w    #394,d7
  1708. loop_ps:
  1709.         addq.w    #3,a0
  1710.         move.b    (a0),d2            ;get next data point
  1711.         ext.w    d2
  1712.         neg.w    d2
  1713.         add.w    #394,d2
  1714.  
  1715.         move.w    #-b_line,d6
  1716.         move.w    d7,d3
  1717.         sub.w    d2,d7
  1718.         bpl    cont_ps
  1719.         neg.w    d6
  1720.         neg.w    d7
  1721. cont_ps:    move.l    a2,a1
  1722.  
  1723.         ext.l    d3
  1724.         lsl.l    #6,d3            ;
  1725.         add.l    d3,a1            ;* 320
  1726.         lsl.l    #2,d3            ;
  1727.         add.l    d3,a1
  1728.  
  1729.         move.w    d4,d5            ;with one bit set
  1730.         not.w    d5
  1731.         tst.w    d7
  1732.         beq    cont_ps4
  1733.         subq.w    #1,d7
  1734. cont_ps4:
  1735.         move.w    d7,d0
  1736.         lsr.w    #1,d7
  1737.  
  1738.         sub.w    d7,d0
  1739.  
  1740. loop_ps2:
  1741.         and.w    d5,(a1)
  1742.         ;and.w    d5,2(a1)        ;these bitplanes don't change
  1743.         or.w    d4,4(a1)
  1744.         ;and.w    d5,6(a1)        ;
  1745.         adda.w    d6,a1
  1746.         dbra    d0,loop_ps2
  1747.  
  1748.         tst.w    d1
  1749.         beq    cont_ps3        ;last datapoint
  1750.         ror.w    d4
  1751.         btst    #15,d4
  1752.         beq    cont_ps2
  1753.         addq.w    #8,a2
  1754.         addq.w    #8,a1
  1755. cont_ps2:
  1756.         move.w    d7,d0
  1757.         beq    cont_ps3
  1758.         move.w    d4,d5
  1759.         not.w    d5
  1760. loop_ps3:
  1761.         and.w    d5,(a1)
  1762.         ;and.w    d5,2(a1)
  1763.         or.w    d4,4(a1)
  1764.         ;and.w    d5,6(a1)
  1765.         adda.w    d6,a1
  1766.         dbra    d0,loop_ps3
  1767. cont_ps3:
  1768.  
  1769.         move.w    d2,d7
  1770.         dbra    d1,loop_ps
  1771.         rts
  1772.  
  1773. ;d0=x, d1=angle
  1774. put_vu:
  1775.         lea    vu_x,a0
  1776.         ext.w    d1
  1777.         move.w    (a0,d1*2),d2    ;x
  1778.         lea    vu_y,a0
  1779.         move.w    (a0,d1*2),d3    ;y
  1780.         move.w    d2,d4
  1781.         ext.l    d4
  1782.         lsl.l    #8,d4        ;x*256
  1783.         move.w    d3,d1        ;y
  1784.         neg.w    d1
  1785.         divs    d1,d4        ;dx*256/dy
  1786.         add.w    #83,d3        ;y
  1787.         move.w    d0,d2
  1788.         ext.l    d2
  1789.         lsl.l    #8,d2        ;x*256
  1790.         move.l    scr,a0
  1791.         ext.l    d4
  1792.         move.w    d3,d0
  1793.         subq.w    #1,d0    
  1794.         move.w    #83,d3
  1795. loop_pvu:
  1796.         move.l    a0,a1
  1797.         move.w    d3,d7
  1798.         mulu.w    #b_line,d7
  1799.         add.l    d7,a1
  1800.         move.l    d2,d7
  1801.         lsr.l    #8,d7
  1802.         move.w    d7,d6
  1803.         and.b    #$f0,d6
  1804.         lsr.w    #1,d6
  1805.         and.w    #$f,d7
  1806.         neg.w    d7
  1807.         add.w    #15,d7
  1808.         moveq    #0,d5
  1809.         bset    d7,d5
  1810.         or.w    d5,(a1,d6)
  1811.         or.w    d5,2(a1,d6)
  1812.         or.w    d5,4(a1,d6)
  1813.         or.w    d5,6(a1,d6)
  1814.  
  1815.         add.l    d4,d2
  1816.  
  1817.         subq.w    #1,d3
  1818.         cmp.w    d0,d3
  1819.         bne    loop_pvu
  1820.  
  1821.         rts
  1822.  
  1823. install_sound:    move.w    #128,-(SP)
  1824.         trap    #14            ;locksnd()
  1825.         addq.l    #2,SP
  1826.         tst.w    D0
  1827.         bmi    snd_locked
  1828.  
  1829.         move.w    #104,-(SP)
  1830.         trap    #14            ;Dsp_Lock()
  1831.         addq.l    #2,SP
  1832.         tst.w    D0
  1833.         bmi    dsp_locked
  1834.  
  1835.         move.w    #113,-(sp)
  1836.         trap    #14            ;Dsp_RequestUniqueAbility()
  1837.         addq.l    #2,sp
  1838.         move.w    d0,ability
  1839.  
  1840.         pea    ymem
  1841.         pea    xmem
  1842.         move.w    #106,-(sp)
  1843.         trap    #14            ;Dsp_Available()
  1844.         lea    $A(sp),sp
  1845.  
  1846.         move.l    xmem,d0
  1847.         cmp.l    #x,d0
  1848.         bmi    Flush
  1849.         move.l    ymem,d0
  1850.         cmp.l    #y,d0
  1851.         bpl    NoFlush
  1852. Flush:        move.w    #115,-(sp)
  1853.         trap    #14            ;Dsp_FlushSubroutines()
  1854.         addq.l    #2,sp
  1855. NoFlush:
  1856.  
  1857.         move.l    ymem,-(sp)
  1858.         move.l    xmem,-(sp)
  1859.         move.w    #107,-(sp)
  1860.         trap    #14            ;Dsp_Reserve()
  1861.         lea    $A(sp),sp
  1862.         tst.w    d0
  1863.         bne    OutOfDSPMem
  1864.  
  1865.         move.l    #end_of_dspbin,d0
  1866.         sub.l    #dsp_bin,d0
  1867.         divu    #3,d0            ;length in dsp-words
  1868.  
  1869.         move.w    ability,-(sp)
  1870.         move.l    d0,-(sp)
  1871.         pea    dsp_bin
  1872.         move.w    #$6d,-(sp)
  1873.         trap    #14            ;Dsp_ExecProg()
  1874.         lea    12(sp),sp
  1875.  
  1876.  
  1877.         clr.w    D4
  1878.         clr.w    D5
  1879.         lea    old_sndstate,A4
  1880. save_snd:    move.w    #-1,-(SP)
  1881.         move.w    D4,-(SP)
  1882.         move.w    #130,-(SP)        ;soundcmd()
  1883.         trap    #14
  1884.         addq.l    #6,SP
  1885.  
  1886.         move.w    D0,(A4,D5)
  1887.         addq.w    #2,D5
  1888.         addq.w    #1,D4
  1889.         cmp.w    #7,D4
  1890.         bne    save_snd
  1891.  
  1892.         bsr    get_speaker
  1893.         move.w    speaker,old_speaker
  1894.         clr.w    speaker
  1895.         bsr    set_speaker
  1896.  
  1897.     ;    move.w    #1,-(SP)
  1898.     ;    move.w    #140,-(SP)        ;sndstatus(1)
  1899.     ;    trap    #14
  1900.     ;    addq.l    #4,SP            ;gives problems sometimes, so just leave it out
  1901.  
  1902.         move.w    (A4),-(SP)
  1903.         clr.w    -(SP)
  1904.         move.w    #130,-(SP)        ;old left output level
  1905.         trap    #14            ;soundcmd()
  1906.         addq.l    #6,SP
  1907.  
  1908.         move.w    2(A4),-(SP)
  1909.         move.w    #1,-(SP)
  1910.         move.w    #130,-(SP)        ;old right output level
  1911.         trap    #14            ;soundcmd()
  1912.         addq.l    #6,SP
  1913.  
  1914.         move.w    4(a4),d0
  1915.         lsr.w    #4,d0
  1916.         move.w    d0,lgain
  1917.  
  1918.         move.w    4(A4),-(SP)
  1919.         move.w    #2,-(SP)
  1920.         move.w    #130,-(SP)        ;old left input level
  1921.         trap    #14            ;soundcmd()
  1922.         addq.l    #6,SP
  1923.  
  1924.         move.w    6(a4),d0
  1925.         lsr.w    #4,d0
  1926.         move.w    d0,rgain
  1927.  
  1928.         move.w    6(A4),-(SP)
  1929.         move.w    #3,-(SP)
  1930.         move.w    #130,-(SP)        ;old right input level
  1931.         trap    #14            ;soundcmd()
  1932.         addq.l    #6,SP
  1933.  
  1934.         move.w    #1,-(SP)
  1935.         move.w    #4,-(SP)
  1936.         move.w    #130,-(SP)        ;adder input from ADC
  1937.         trap    #14            ;soundcmd()
  1938.         addq.l    #6,SP
  1939.  
  1940.         move.w    #0,-(SP)
  1941.         move.w    #5,-(SP)
  1942.         move.w    #130,-(SP)        ;ADC input microphone
  1943.         trap    #14            ;soundcmd()
  1944.         addq.l    #6,SP
  1945.  
  1946.         move.w    #1,-(sp)
  1947.         move.w    #1,-(sp)
  1948.         move.w    #137,-(sp)        ;dsptristate(1,1);
  1949.         trap    #14
  1950.         addq.l    #6,sp
  1951.  
  1952.         move.w    #1,-(SP)
  1953.         move.w    #132,-(SP)
  1954.         trap    #14            ;setmode(1);
  1955.         addq.l    #4,SP
  1956.  
  1957.         move.w    #1,-(SP)
  1958.         move.w    #2,-(SP)
  1959.         move.w    #0,-(SP)
  1960.         move.w    #0,-(SP)
  1961.         move.w    #0,-(SP)
  1962.         move.w    #139,-(SP)
  1963.         trap    #14            ;devconnect(DMAPLAY, 0, CLK_25M, 2, 1)
  1964.         lea    $C(SP),SP        ;32780 Hz. My 'Atari Developers Documentation' says 33880 Hz,
  1965.                         ;but I think that this is an error. (25175000 Hz/256/(2+1)=32780 Hz)
  1966.  
  1967.         move.w    #1,-(SP)
  1968.         move.w    #2,-(SP)
  1969.         move.w    #0,-(SP)
  1970.         move.w    #0,-(SP)
  1971.         move.w    #1,-(SP)
  1972.         move.w    #139,-(SP)
  1973.         trap    #14            ;devconnect(DSPXMIT, 0, CLK_25M, 2, 1)
  1974.         lea    $C(SP),SP
  1975.  
  1976.         move.w    #1,-(SP)
  1977.         move.w    #2,-(SP)
  1978.         move.w    #0,-(SP)
  1979.         move.w    #0,-(SP)
  1980.         move.w    #2,-(SP)
  1981.         move.w    #139,-(SP)
  1982.         trap    #14            ;devconnect(EXTINP, 0, CLK_25M, 2, 1)
  1983.         lea    $C(SP),SP
  1984.  
  1985.         move.w    #1,-(SP)
  1986.         move.w    #2,-(SP)
  1987.         move.w    #0,-(SP)
  1988.         move.w    #2,-(SP)
  1989.         move.w    #3,-(SP)
  1990.         move.w    #139,-(SP)
  1991.         trap    #14            ;devconnect(ADC, DSPRECV, CLK_25M, 2, 1)
  1992.         lea    $C(SP),SP
  1993.  
  1994.         clr.w    -(SP)
  1995.         move.w    #136,-(SP)
  1996.         trap    #14            ;buffoper(0);
  1997.         addq.l    #4,SP
  1998.  
  1999.         rts
  2000.  
  2001. restore_sound:
  2002.  
  2003.         move.w    old_speaker,speaker
  2004.         bsr    set_speaker
  2005.  
  2006.         ;move.w #1,-(SP)
  2007.         ;move.w #140,-(SP)        ;sndstatus(1)
  2008.         ;trap    #14
  2009.         ;addq.l #4,SP
  2010.  
  2011.         move.w    #0,-(sp)
  2012.         move.w    #0,-(sp)
  2013.         move.w    #137,-(sp)        ;dsptristate(0,0);
  2014.         trap    #14
  2015.         addq.l    #6,sp
  2016.  
  2017.         clr.w    D4
  2018.         clr.w    D5
  2019.         move.l    #old_sndstate,A4
  2020. get_snd:    move.w    (A4,D5),-(SP)
  2021.         move.w    D4,-(SP)
  2022.         move.w    #130,-(SP)        ;soundcmd()
  2023.         trap    #14
  2024.         addq.l    #6,SP
  2025.  
  2026.         addq.w    #2,D5
  2027.         addq.w    #1,D4
  2028.         cmp.w    #7,D4
  2029.         bne    get_snd
  2030.  
  2031.         move.w    #105,-(SP)
  2032.         trap    #14            ;Dsp_Unlock()
  2033.         addq.l    #2,SP
  2034.  
  2035.         move.w    #129,-(SP)
  2036.         trap    #14            ;unlocksnd()
  2037.         addq.l    #2,SP
  2038.  
  2039.         rts
  2040.  
  2041. dsp_locked:
  2042.         move.w    #129,-(SP)
  2043.         trap    #14            ;unlocksnd()
  2044.         addq.l    #2,SP
  2045.  
  2046.         lea    dsp_locked_txt,a0
  2047.         bra    error
  2048.  
  2049. snd_locked:
  2050.         lea    snd_locked_txt,a0
  2051.         bra    error
  2052.  
  2053. outofmem:
  2054.         lea    outofmem_txt,a0
  2055.         bra    error
  2056.  
  2057.  
  2058. OutOfDSPMem:    move.w    #105,-(SP)
  2059.         trap    #14            ;Dsp_Unlock()
  2060.         addq.l    #2,SP
  2061.  
  2062.         move.w    #129,-(SP)
  2063.         trap    #14            ;unlocksnd()
  2064.         addq.l    #2,SP
  2065.  
  2066.         lea    outofmem_txt2,a0
  2067.         bra    error
  2068.  
  2069. wrong_machine:
  2070.         lea    wrong_mach_txt,a0
  2071.         bra    error
  2072.  
  2073. wrong_scr:
  2074.         lea    wrong_scr_txt,a0
  2075.         bra    error
  2076.  
  2077. better_buy_vga:
  2078.         move.w    #0,d0
  2079.         bsr    graf_mouse
  2080.         lea    better_vga_txt,a0
  2081.         move.w    #1,d0
  2082.         bsr    form_alert
  2083.         rts
  2084.  
  2085. exit:
  2086.         bsr    appl_exit
  2087.  
  2088.         ; Kbshift(-1)
  2089.         move.w    #-1,-(sp)
  2090.         move.w    #11,-(sp)
  2091.         trap    #13
  2092.         addq.l    #4,sp
  2093.  
  2094.         move.w    old_capslock,d1
  2095.         lsl.w    #4,d1
  2096.         bclr    #4,d0
  2097.         or.w    d1,d0
  2098.  
  2099.         ; Kbshift()
  2100.         move.w    d0,-(sp)
  2101.         move.w    #11,-(sp)
  2102.         trap    #13
  2103.         addq.l    #4,sp
  2104.  
  2105.         ; Pterm0()
  2106.         clr.w    -(SP)
  2107.         trap    #1
  2108.  
  2109. ;alert string in a0
  2110. error:
  2111.         move.l    a0,a6
  2112.         move.w    #0,d0            ;arrow
  2113.         bsr    graf_mouse
  2114.         move.l    a6,a0
  2115.         move.w    #1,d0
  2116.         bsr    form_alert
  2117.         bra    exit
  2118.  
  2119.  
  2120. appl_init:    lea    contrl,a0
  2121.         move.w    #10,(a0)
  2122.         move.w    #0,2(a0)
  2123.         move.w    #1,4(a0)
  2124.         move.w    #0,6(a0)
  2125.         move.w    #0,8(a0)
  2126.         move.l    #aespb,d1
  2127.         move.w    #200,d0            ;aes
  2128.         trap    #2            ;gem
  2129.         move.w    int_out,d0
  2130.         rts
  2131.  
  2132. appl_exit:    lea    contrl,a0
  2133.         move.w    #19,(a0)
  2134.         move.w    #0,2(a0)
  2135.         move.w    #1,4(a0)
  2136.         move.w    #0,6(a0)
  2137.         move.w    #0,8(a0)
  2138.         move.l    #aespb,d1
  2139.         move.w    #200,d0
  2140.         trap    #2
  2141.         move.w    int_out,d0
  2142.         rts
  2143.  
  2144. ;string in a0
  2145. ;def_but in d0
  2146. form_alert:    lea    contrl,a1
  2147.         move.w    #52,(a1)
  2148.         move.w    #1,2(a1)
  2149.         move.w    #1,4(a1)
  2150.         move.w    #1,6(a1)
  2151.         move.w    #0,8(a1)
  2152.         move.l    a0,addr_in
  2153.         move.w    d0,int_in
  2154.         move.l    #aespb,d1
  2155.         move.w    #200,d0
  2156.         trap    #2
  2157.         move.w    int_out,d0
  2158.         rts
  2159.  
  2160. ;mnumber in d0
  2161. graf_mouse:    lea    contrl,a0
  2162.         move.w    #78,(a0)
  2163.         move.w    #1,2(a0)
  2164.         move.w    #1,4(a0)
  2165.         move.w    #1,6(a0)
  2166.         move.w    #0,8(a0)
  2167.         move.w    d0,int_in
  2168.         move.l    #0,addr_in
  2169.         move.l    #aespb,d1
  2170.         move.w    #200,d0
  2171.         trap    #2
  2172.         move.w    int_out,d0
  2173.         rts
  2174.  
  2175.  
  2176.  
  2177. decode_imgs:
  2178.         lea    mainscrdat,a0
  2179.         move.l    scr2,dest
  2180.         bsr    dec_img
  2181.         lea    iconsdat,a0
  2182.         move.l    icons,dest
  2183.         bsr    dec_img
  2184.         lea    mousedat,a0
  2185.         move.l    mousedata,dest
  2186.         bsr    dec_img
  2187.         lea    helpdat,a0
  2188.         move.l    helpdiag,dest
  2189.         bsr    dec_img
  2190.         rts
  2191.  
  2192. dec_img:
  2193.         move.w    6(a0),patt_len
  2194.         moveq    #0,d0
  2195.         move.w    12(a0),d0
  2196.         lsr.l    #3,d0            ;bytes per line per plane
  2197.         move.l    d0,bperlineplane
  2198.         lsl.l    #2,d0            ;*planes
  2199.         move.l    d0,bytesperline
  2200.         move.w    14(a0),lines
  2201.         move.w    2(a0),d0        ;header length in words
  2202.         add.w    d0,d0            ;header length in bytes
  2203.         add.w    d0,a0
  2204.  
  2205.         move.w    #0,repeat
  2206.         move.w    lines,d7
  2207.         subq.w    #1,d7
  2208. loop_y:
  2209.         move.w    repeat,d0
  2210.         bne    do_repeat
  2211.  
  2212.         bsr    plane
  2213.         add.l    #2,dest
  2214.         bsr    plane
  2215.         add.l    #2,dest
  2216.         bsr    plane
  2217.         add.l    #2,dest
  2218.         bsr    plane
  2219.         move.l    bytesperline,d0
  2220.         subq.l    #6,d0
  2221.         add.l    d0,dest
  2222.  
  2223.         bra    no_repeat
  2224. do_repeat:
  2225.         subq.w    #1,d0
  2226.         move.w    d0,repeat
  2227.         move.l    dest,a2
  2228.         move.l    a2,a3
  2229.         sub.l    bytesperline,a3
  2230.         move.l    bytesperline,d0
  2231.         lsr.l    #1,d0
  2232.         subq.w    #1,d0
  2233. loop_rep:
  2234.         move.w    (a3)+,(a2)+
  2235.         dbra    d0,loop_rep
  2236.         move.l    bytesperline,d0
  2237.         add.l    d0,dest
  2238. no_repeat:
  2239.         dbra    d7,loop_y
  2240.  
  2241.         rts
  2242. plane:
  2243.         lea    linebuf,a1
  2244.         bsr    read_line
  2245.         move.l    dest,a2
  2246.         lea    linebuf,a1
  2247.         move.w    #39,d0
  2248. loop_x:        move.w    (a1)+,(a2)
  2249.         addq.l    #8,a2
  2250.         dbra    d0,loop_x
  2251.         rts
  2252.  
  2253. read_line:
  2254.         move.b    (a0)+,d0
  2255.         bne    no_null
  2256.  
  2257.         move.b    (a0)+,d0
  2258.         bne    pattern
  2259.  
  2260.         ;replication
  2261.         move.b    (a0)+,d0
  2262.  
  2263.         moveq    #0,d0
  2264.         move.b    (a0)+,d0
  2265.         subq.w    #1,d0
  2266.         move.w    d0,repeat
  2267.         move.l    a1,d0
  2268.         bra    read_line
  2269. no_null:
  2270.         cmp.b    #$80,d0
  2271.         bne    solid_run
  2272.  
  2273.         ;bit_string
  2274.  
  2275.         moveq    #0,d0
  2276.         move.b    (a0)+,d0
  2277.         subq.w    #1,d0
  2278. loop_bs:
  2279.         move.b    (a0)+,(a1)+
  2280.         dbra    d0,loop_bs
  2281.         bra    end_rout
  2282. solid_run:
  2283.         move.b    d0,d1
  2284.         and.b    #$80,d1
  2285.         sne    d1
  2286.         and.w    #$7f,d0
  2287.         subq.w    #1,d0
  2288. loop_sr:
  2289.         move.b    d1,(a1)+
  2290.         dbra    d0,loop_sr
  2291.         bra    end_rout
  2292. pattern:
  2293.         move.w    patt_len,d1
  2294.         subq.w    #1,d1
  2295.         and.w    #$ff,d0
  2296.         subq.w    #1,d0
  2297. loop_p1:
  2298.         move.l    a0,a2
  2299.         move.w    d1,d2
  2300. loop_p2:
  2301.         move.b    (a2)+,(a1)+
  2302.         dbra    d2,loop_p2
  2303.         dbra    d0,loop_p1
  2304.  
  2305.         addq.w    #1,d1
  2306.         add.w    d1,a0
  2307. end_rout:
  2308.         move.l    a1,d0
  2309.         sub.l    #linebuf,d0
  2310.         cmp.l    bperlineplane,d0
  2311.         blt    read_line
  2312.         rts
  2313.  
  2314.  
  2315.  
  2316. init_mouse:
  2317.         move.w    #320,mouse_x
  2318.         move.w    #240,mouse_y
  2319.         clr.w    mbut
  2320.         move.w    #-1,old_mouse_x        ;no restore 1st time
  2321.         clr.w    new_scr            ;no set screen
  2322.         clr.w    curr_mouse        ;full mouse
  2323.         move.l    $ffff9800+11*4,link_col    ;color for link buttons
  2324.  
  2325.         lea    mousemask,a0
  2326.         move.l    mousedata,a2
  2327.         move.w    #16*16-1,d0
  2328. loop_make_mask:
  2329.         move.w    (a2)+,d1
  2330.         or.w    (a2)+,d1
  2331.         or.w    (a2)+,d1
  2332.         or.w    (a2)+,d1
  2333.         move.w    d1,(a0)+
  2334.         dbra    d0,loop_make_mask
  2335.  
  2336.         move.w    #$22,-(sp)        ;Kbdvbase()
  2337.         trap    #14
  2338.         addq.l    #2,sp
  2339.         move.l    d0,a0
  2340.  
  2341.         move.l    16(a0),old_mousevec
  2342. wait_drvstat:
  2343.         tst.w    36(a0)
  2344.         bne    wait_drvstat
  2345.  
  2346.         move.l    #mousevec,16(a0)
  2347.  
  2348.         move.l    $70,old_vbl_int
  2349.         move.l    #vbl_interrupt,$70
  2350.  
  2351.         rts
  2352.  
  2353. exit_mouse:
  2354.         move.l    old_vbl_int,$70
  2355.  
  2356.         move.w    #$22,-(sp)        ;Kbdvbase()
  2357.         trap    #14
  2358.         addq.l    #2,sp
  2359.         move.l    d0,a0
  2360.  
  2361. wait_drvstat2:
  2362.         tst.w    36(a0)
  2363.         bne    wait_drvstat2
  2364.  
  2365.         move.l    old_mousevec,16(a0)
  2366.  
  2367.         rts
  2368.  
  2369. draw_mouse:
  2370.         move.w    mouse_x,d6
  2371.         move.w    mouse_y,d5
  2372.         move.w    d5,old_mouse_y
  2373.         move.w    d6,old_mouse_x
  2374.  
  2375.         move.l    mousedata,a1
  2376.         move.w    curr_mouse,d0
  2377.         lsr.w    #1,d0
  2378.         lsl.w    #7,d0            ;*16*(16/8*2)
  2379.         add.w    d0,a1
  2380.         move.l    a1,a2
  2381.  
  2382.         move.l    scr2,a0
  2383.         move.l    a0,old_mouse_scr
  2384.         move.w    d5,d0        ;my
  2385.         move.w    d0,d2
  2386.         mulu.w    #b_line,d0
  2387.         add.l    d0,a0
  2388.  
  2389.         move.w    d6,d4        ;mx
  2390.         move.w    d4,d0
  2391.         lsr.w    #4,d4        ;in words
  2392.         lsl.w    #3,d4        ;*planes *2
  2393.  
  2394.         add.w    d4,a0
  2395.  
  2396.         move.w    d0,d1
  2397.         and.b    #$f0,d1
  2398.         sub.w    d1,d0
  2399.  
  2400.         move.w    #15,d3
  2401.         add.w    #16-480,d2
  2402.         bmi    cont_m1
  2403.         sub.w    d2,d3
  2404. cont_m1:
  2405.         lea    mousemask,a2
  2406.         move.w    curr_mouse,d7
  2407.         lsr.w    #1,d7
  2408.         lsl.w    #5,d7
  2409.         add.w    d7,a2
  2410.         lea    mousesaved,a3
  2411.  
  2412.         tst.w    d0
  2413.         beq    loop_putm_noshift
  2414.  
  2415.         cmp.w    #b_line-8,d4
  2416.         bge    last_word1
  2417. loop_putm:
  2418.         REPT    4
  2419.         move.w    8(a0),d7
  2420.         swap    d7
  2421.         move.w    (a0)+,d7
  2422.         rol.l    d0,d7
  2423.         move.w    d7,(a3)+
  2424.         ENDM
  2425.         sub.w    #8,a0
  2426.  
  2427.         moveq    #0,d7
  2428.         move.w    (a2)+,d7
  2429.         ror.l    d0,d7
  2430.         not.l    d7
  2431.         and.w    d7,(a0)
  2432.         and.w    d7,2(a0)
  2433.         and.w    d7,4(a0)
  2434.         and.w    d7,6(a0)
  2435.         swap    d7
  2436.         and.w    d7,8(a0)
  2437.         and.w    d7,10(a0)
  2438.         and.w    d7,12(a0)
  2439.         and.w    d7,14(a0)
  2440.  
  2441.         REPT    4
  2442.         moveq    #0,d7
  2443.         move.w    (a1)+,d7
  2444.         ror.l    d0,d7
  2445.         or.w    d7,(a0)+
  2446.         swap    d7
  2447.         or.w    d7,6(a0)
  2448.         ENDM
  2449.  
  2450.         add.w    #b_line-8,a0
  2451.         dbra    d3,loop_putm
  2452.  
  2453.         bra    end_putm
  2454.  
  2455. last_word1:
  2456. loop_putm2:
  2457.         REPT    4
  2458.         moveq    #0,d7
  2459.         move.w    (a0)+,d7
  2460.         rol.l    d0,d7
  2461.         move.w    d7,(a3)+
  2462.         ENDM
  2463.         sub.w    #8,a0
  2464.  
  2465.         moveq    #0,d7
  2466.         move.w    (a2)+,d7
  2467.         ror.l    d0,d7
  2468.         not.l    d7
  2469.         and.w    d7,(a0)
  2470.         and.w    d7,2(a0)
  2471.         and.w    d7,4(a0)
  2472.         and.w    d7,6(a0)
  2473.  
  2474.         REPT    4
  2475.         moveq    #0,d7
  2476.         move.w    (a1)+,d7
  2477.         ror.l    d0,d7
  2478.         or.w    d7,(a0)+
  2479.         ENDM
  2480.  
  2481.         add.w    #b_line-8,a0
  2482.         dbra    d3,loop_putm2
  2483.         bra    end_putm
  2484. loop_putm_noshift:
  2485.         move.l    (a0),(a3)+
  2486.         move.l    4(a0),(a3)+
  2487.  
  2488.         move.w    (a2)+,d7
  2489.         not.w    d7
  2490.         and.w    d7,(a0)
  2491.         and.w    d7,2(a0)
  2492.         and.w    d7,4(a0)
  2493.         and.w    d7,6(a0)
  2494.  
  2495.         move.l    (a1)+,d7
  2496.         or.l    d7,(a0)+
  2497.         move.l    (a1)+,d7
  2498.         or.l    d7,(a0)+
  2499.  
  2500.         add.w    #b_line-8,a0
  2501.         dbra    d3,loop_putm_noshift
  2502.  
  2503. end_putm:
  2504.         rts
  2505.  
  2506. remove_mouse:
  2507.         move.w    old_mouse_x,d6
  2508.         move.w    old_mouse_y,d5
  2509.         cmp.w    #-1,d6
  2510.         beq    end_remm
  2511.  
  2512.         move.l    old_mouse_scr,a0
  2513.         move.w    d5,d0        ;omy
  2514.         move.w    d0,d2
  2515.         mulu.w    #b_line,d0
  2516.         add.l    d0,a0
  2517.  
  2518.         move.w    d6,d4        ;omx
  2519.         move.w    d4,d0
  2520.         lsr.w    #4,d4
  2521.         lsl.w    #2,d4        ;*planes
  2522.         add.w    d4,d4        ;in bytes
  2523.  
  2524.         add.w    d4,a0
  2525.  
  2526.         move.w    d0,d1
  2527.         and.w    #$fff0,d1
  2528.         sub.w    d1,d0
  2529.  
  2530.         move.w    #15,d3
  2531.         add.w    #16-480,d2
  2532.         bmi    cont_rm1
  2533.         sub.w    d2,d3
  2534. cont_rm1:
  2535.         lea    mousesaved,a1
  2536.         tst.w    d0
  2537.         beq    loop_remm_noshift
  2538.         move.l    #$ffff0000,d7    ;mask
  2539.         ror.l    d0,d7
  2540. loop_remm:
  2541.         and.w    d7,(a0)
  2542.         and.w    d7,2(a0)
  2543.         and.w    d7,4(a0)
  2544.         and.w    d7,6(a0)
  2545.         cmp.w    #b_line-8,d4
  2546.         bge    cont_rm3
  2547.         swap    d7
  2548.         and.w    d7,8(a0)
  2549.         and.w    d7,10(a0)
  2550.         and.w    d7,12(a0)
  2551.         and.w    d7,14(a0)
  2552.         swap    d7
  2553. cont_rm3:
  2554.         move.w    #3,d6
  2555. loop_remm2:
  2556.         moveq    #0,d5
  2557.         move.w    (a1)+,d5
  2558.         ror.l    d0,d5
  2559.         or.w    d5,(a0)+
  2560.         cmp.w    #b_line-8,d4
  2561.         bge    cont_rm2
  2562.         swap    d5
  2563.         or.w    d5,6(a0)
  2564. cont_rm2:
  2565.         dbra    d6,loop_remm2
  2566.  
  2567.         add.w    #b_line-8,a0
  2568.         dbra    d3,loop_remm
  2569.  
  2570.         bra    end_remm
  2571. loop_remm_noshift:
  2572.         move.l    (a1)+,(a0)+
  2573.         move.l    (a1)+,(a0)+
  2574.  
  2575.         add.w    #b_line-8,a0
  2576.         dbra    d3,loop_remm_noshift
  2577. end_remm:
  2578.  
  2579.         rts
  2580.  
  2581.         dc.l    'XBRA'
  2582.         dc.l    'MOUS'
  2583. old_mousevec:    ds.l    1
  2584. mousevec:
  2585.         move.w    d0,-(sp)
  2586.         move.b    1(a0),d0
  2587.         ext.w    d0
  2588.         add.w    mouse_x,d0
  2589.         bge    cont_mv1
  2590.         clr.w    d0
  2591. cont_mv1:    cmp.w    #639,d0
  2592.         ble    cont_mv2
  2593.         move.w    #639,d0
  2594. cont_mv2:    move.w    d0,mouse_x
  2595.         move.b    2(a0),d0
  2596.         ext.w    d0
  2597.         add.w    mouse_y,d0
  2598.         bge    cont_mv3
  2599.         clr.w    d0
  2600. cont_mv3:    cmp.w    #479,d0
  2601.         ble    cont_mv4
  2602.         move.w    #479,d0
  2603. cont_mv4:    move.w    d0,mouse_y
  2604.         move.b    (a0),d0
  2605.         and.w    #3,d0
  2606.         move.w    d0,mbut
  2607.         move.w    (sp)+,d0
  2608.         rts
  2609.  
  2610.         dc.l    'XBRA'
  2611.         dc.l    'MOUS'
  2612. old_vbl_int:    ds.l    1
  2613. vbl_interrupt:
  2614.         movem.l    d0-d7/a0-a3,-(sp)
  2615.  
  2616.         move.l    link_col,$ffff9800+13*4
  2617.  
  2618.         move.w    mouse_x,d6
  2619.         move.w    mouse_y,d5
  2620.  
  2621.         tst.w    mbut            ;mousebutton pressed?
  2622.         bne    m_not_same        ;don't fade out
  2623.  
  2624.         cmp.w    old_mouse_x,d6        ;
  2625.         bne    m_not_same        ;
  2626.         cmp.w    old_mouse_y,d5        ;mouse moved?
  2627.         bne    m_not_same        ;don't fade out
  2628.  
  2629.         add.w    #1,mouse_count
  2630.         move.w    mouse_count,d0
  2631.         cmp.w    #100,d0            ;100 vbl's
  2632.         ble    m_same
  2633.         move.w    curr_mouse,d0
  2634.         cmp.w    #30,d0
  2635.         beq    m_same
  2636.         add.w    #1,curr_mouse        ;fade out
  2637.  
  2638.         bra    m_same
  2639. m_not_same:
  2640.         clr.w    mouse_count        ;wait for 100 vbl's again
  2641.         clr.w    curr_mouse        ;full pointer again
  2642. m_same:
  2643.         bsr    remove_mouse
  2644.  
  2645.         tst.w    new_scr
  2646.         beq    no_new_scr
  2647.  
  2648.         move.l    scr1,A0
  2649.         move.l    scr2,scr1
  2650.         move.l    A0,scr2            ;swap pointers
  2651.         move.l    scr1,scr
  2652.  
  2653.         move.l    scr2,d0
  2654.         swap    d0
  2655.         move.b    d0,$ffff8201
  2656.         rol.l    #8,d0
  2657.         move.b    d0,$ffff8203
  2658.         rol.l    #8,d0
  2659.         move.b    d0,$ffff820d
  2660.         clr.l    new_scr            ;not again
  2661. no_new_scr:
  2662.  
  2663.         bsr    draw_mouse
  2664.  
  2665.         movem.l    (sp)+,d0-d7/a0-a3
  2666.         add.l    #1,_frclock        ;don't forget this!
  2667.         rte
  2668.  
  2669.  
  2670.  
  2671.         data
  2672.  
  2673.  
  2674. wrong_scr_txt:    dc.b    '[3][Sorry...|Music Analyzer cannot|run on a monochrome monitor][Exit]',0
  2675. snd_locked_txt: dc.b    '[3][Sound System locked !][Exit]',0
  2676. dsp_locked_txt: dc.b    '[3][DSP locked !][Exit]',0
  2677. outofmem_txt:    dc.b    '[3][Out of memory !][Exit]',0
  2678. outofmem_txt2:    dc.b    '[3][Out of DSP memory !][Exit]',0
  2679. wrong_mach_txt: dc.b    '[3][Sorry...|Music Analyzer can only run|on an Atari 680x0 (x>=3)|machine with DSP, Codec and|Connection Matrix (a Falcon!)][Exit]',0
  2680. better_vga_txt:    dc.b    '[1][If you want this program|to look even better|(or just wanna read the|texts), buy yourself a|VGA monitor !][ ... ]',0
  2681.  
  2682.         even
  2683.  
  2684.  
  2685.         ;Use the linker
  2686.         IMPORT    log, log2, dsp_bin, end_of_dspbin
  2687.         IMPORT    mainscrdat, iconsdat, mousedat, helpdat
  2688.  
  2689.         ;When you don't use a linker
  2690. ;        even
  2691. ;        include    'log_vu.s'
  2692. ;        even
  2693. ;        include    'log_spec.s'
  2694. ;        even
  2695. ;        include    'dsp_bin.s'
  2696. ;        even
  2697. ;mainscrdat:    incbin    'mainscr.img'
  2698. ;        even
  2699. ;helpdat:    incbin    'help.img'
  2700. ;        even
  2701. ;iconsdat:    incbin    'icons.img'
  2702. ;        even
  2703. ;mousedat:    incbin    'mouse.img'
  2704. ;        even
  2705.  
  2706.  
  2707. ;relative coordinates for vu
  2708. ;0 to 90 degrees
  2709. vu_x:        DC.W    -31,-31,-30,-29,-29,-28,-28,-27
  2710.         DC.W    -26,-26,-25,-25,-24,-23,-23,-22
  2711.         DC.W    -21,-21,-20,-19,-19,-18,-17,-16
  2712.         DC.W    -16,-15,-14,-14,-13,-12,-11,-11
  2713.         DC.W    -10,-9,-8,-8,-7,-6,-5,-5
  2714.         DC.W    -4,-3,-2,-2,-1, 0, 1, 2
  2715.         DC.W     2, 3, 4, 5, 5, 6, 7, 8
  2716.         DC.W     8, 9, 10, 11, 11, 12, 13, 14
  2717.         DC.W     14, 15, 16, 16, 17, 18, 19, 19
  2718.         DC.W     20, 21, 21, 22, 23, 23, 24, 25
  2719.         DC.W     25, 26, 26, 27, 28, 28, 29, 29
  2720.         DC.W     30, 31, 31
  2721. vu_y:        DC.W    -31,-32,-32,-33,-33,-34,-34,-35
  2722.         DC.W    -35,-36,-36,-36,-37,-37,-38,-38
  2723.         DC.W    -38,-39,-39,-40,-40,-40,-41,-41
  2724.         DC.W    -41,-41,-42,-42,-42,-42,-43,-43
  2725.         DC.W    -43,-43,-43,-43,-43,-44,-44,-44
  2726.         DC.W    -44,-44,-44,-44,-44,-44,-44,-44
  2727.         DC.W    -44,-44,-44,-44,-44,-44,-43,-43
  2728.         DC.W    -43,-43,-43,-43,-43,-42,-42,-42
  2729.         DC.W    -42,-41,-41,-41,-41,-40,-40,-40
  2730.         DC.W    -39,-39,-38,-38,-38,-37,-37,-36
  2731.         DC.W    -36,-36,-35,-35,-34,-34,-33,-33
  2732.         DC.W    -32,-32,-31
  2733.  
  2734.  
  2735. vga_mode:    dc.w    %111010
  2736. tv60_mode:    dc.w    %100001010
  2737. tv50_mode:    dc.w    %100101010
  2738.  
  2739. ;640*480, 16 col
  2740. ;Vsetmode(-1) =$003A %0000000000111010
  2741. vidregs_vga:
  2742.          dc.b    $02    ; (=%00000010) $FFFF820A
  2743.         dc.b    $00    ; (=%00000000) $FFFF8260
  2744.         dc.w    $0000    ; (=%0000000000000000) $FFFF8266
  2745.         dc.w    $00C6    ; (=%0000000011000110) $FFFF8282
  2746.         dc.w    $0096    ; (=%0000000010010110) $FFFF828C
  2747.         dc.w    $0415    ; (=%0000010000010101) $FFFF82AC
  2748.         dc.w    $0186    ; (=%0000000110000110) $FFFF82C0
  2749.         dc.w    $0008    ; (=%0000000000001000) $FFFF82C2
  2750.         dc.w    $008D    ; (=%0000000010001101) $FFFF8284
  2751.         dc.w    $0015    ; (=%0000000000010101) $FFFF8286
  2752.         dc.w    $02A3    ; (=%0000001010100011) $FFFF8288
  2753.         dc.w    $007C    ; (=%0000000001111100) $FFFF828A
  2754.         dc.w    $0419    ; (=%0000010000011001) $FFFF82A2
  2755.         dc.w    $03FF    ; (=%0000001111111111) $FFFF82A4
  2756.         dc.w    $003F    ; (=%0000000000111111) $FFFF82A6
  2757.         dc.w    $003F    ; (=%0000000000111111) $FFFF82A8
  2758.         dc.w    $03FF    ; (=%0000001111111111) $FFFF82AA
  2759.         dc.w    $00A0    ; (=%0000000010100000) $FFFF8210
  2760.  
  2761. ;640*480 (changed from 640*400), 16 col, 50 Hz
  2762. ;Vsetmode(-1) =$012A %0000000100101010
  2763. vidregs_tv50:
  2764.         dc.b    $02    ; (=%00000010) $FFFF820A
  2765.         dc.b    $00    ; (=%00000000) $FFFF8260
  2766.         dc.w    $0000    ; (=%0000000000000000) $FFFF8266
  2767.         dc.w    $01FE    ; (=%0000000111111110) $FFFF8282
  2768.         dc.w    $01B2    ; (=%0000000110110010) $FFFF828C
  2769.         dc.w    $026B    ; (=%0000001001101011) $FFFF82AC
  2770.         dc.w    $0181    ; (=%0000000110000001) $FFFF82C0
  2771.         dc.w    $0006    ; (=%0000000000000110) $FFFF82C2
  2772.         dc.w    $0199    ; (=%0000000110011001) $FFFF8284
  2773.         dc.w    $0050    ; (=%0000000001010000) $FFFF8286
  2774.         dc.w    $004D    ; (=%0000000001001101) $FFFF8288
  2775.         dc.w    $00FE    ; (=%0000000011111110) $FFFF828A
  2776.         dc.w    $0270    ; (=%0000001001110000) $FFFF82A2
  2777.         dc.w    $0265    ; (=%0000001001100101) $FFFF82A4
  2778.         dc.w    $002F    ; (=%0000000000101111) $FFFF82A6
  2779.         dc.w    $56   ;$007E    ; (=%0000000001111110) $FFFF82A8
  2780.         dc.w    $236  ;$020E    ; (=%0000001000001110) $FFFF82AA
  2781.         dc.w    $00A0    ; (=%0000000010100000) $FFFF8210
  2782.  
  2783. ;640*480 (changed from 640*400), 16 col, 60 Hz
  2784. ;Vsetmode(-1) =$010A %0000000100001010
  2785. vidregs_tv60:
  2786.         dc.b    $00    ; (=%00000000) $FFFF820A
  2787.         dc.b    $00    ; (=%00000000) $FFFF8260
  2788.         dc.w    $0000    ; (=%0000000000000000) $FFFF8266
  2789.         dc.w    $01FF    ; (=%0000000111111111) $FFFF8282
  2790.         dc.w    $01B4    ; (=%0000000110110100) $FFFF828C
  2791.         dc.w    $0207    ; (=%0000001000000111) $FFFF82AC
  2792.         dc.w    $0181    ; (=%0000000110000001) $FFFF82C0
  2793.         dc.w    $0006    ; (=%0000000000000110) $FFFF82C2
  2794.         dc.w    $0197    ; (=%0000000110010111) $FFFF8284
  2795.         dc.w    $0050    ; (=%0000000001010000) $FFFF8286
  2796.         dc.w    $004D    ; (=%0000000001001101) $FFFF8288
  2797.         dc.w    $00FD    ; (=%0000000011111101) $FFFF828A
  2798.         dc.w    $020C    ; (=%0000001000001100) $FFFF82A2
  2799.         dc.w    $0201    ; (=%0000001000000001) $FFFF82A4
  2800.         dc.w    $0016    ; (=%0000000000010110) $FFFF82A6
  2801.         dc.w    $24   ;$004C    ; (=%0000000001001100) $FFFF82A8
  2802.         dc.w    $204  ;$01DC    ; (=%0000000111011100) $FFFF82AA
  2803.         dc.w    $00A0    ; (=%0000000010100000) $FFFF8210
  2804.  
  2805. aespb:        dc.l    contrl,global,int_in,int_out,addr_in,addr_out
  2806.  
  2807.         bss
  2808.  
  2809. mouse_x:    ds.w    1
  2810. mouse_y:    ds.w    1
  2811. mouse_but:    ds.w    1
  2812. old_mouse_x:    ds.w    1
  2813. old_mouse_y:    ds.w    1
  2814. curr_mouse:    ds.w    1
  2815. mousedata:    ds.l    1
  2816. mousemask:    ds.w    16*16
  2817. mousesaved:    ds.w    16*4
  2818. new_scr:    ds.w    1
  2819. old_mouse_scr:    ds.l    1
  2820. mouse_count:    ds.w    1
  2821. mbut:        ds.w    1
  2822. link_col:    ds.l    1
  2823.  
  2824. linebuf:    ds.b    80
  2825. dest:        ds.l    1
  2826. patt_len:    ds.w    1
  2827. repeat:        ds.w    1
  2828. bytesperline:    ds.l    1
  2829. bperlineplane:    ds.l    1
  2830. lines:        ds.w    1
  2831.  
  2832. int_in:        ds.w    16
  2833. int_out:    ds.w    7
  2834. contrl:        ds.w    5
  2835. global:        ds.w    15
  2836. addr_in:    ds.l    2
  2837. addr_out:    ds.l    1
  2838.  
  2839. icon1x:        ds.w    1
  2840. icon1y:        ds.w    1
  2841. icon1n:        ds.w    1
  2842. icon2x:        ds.w    1
  2843. icon2y:        ds.w    1
  2844. icon2n:        ds.w    1
  2845.  
  2846. scr1:        ds.l    1
  2847. scr2:        ds.l    1
  2848. scr:        ds.l    1
  2849. scopebuf:    ds.l    1
  2850. icons:        ds.l    1
  2851. vubuf:        ds.l    1
  2852. helpdiag:    ds.l    1
  2853. helpdiag_on:    ds.w    1
  2854. hdiagsave:    ds.l    1
  2855. restdiag_count:    ds.w    1
  2856. mstexts:    ds.l    1
  2857. mstxtwhich:    ds.w    1
  2858. freeze:        ds.w    1
  2859. buf:        ds.b    6
  2860. leftbuf:    ds.b    points*3
  2861. rightbuf:    ds.b    points*3
  2862. leftbufsm:    ds.b    points*3
  2863. rightbufsm:    ds.b    points*3
  2864. buf2:        ds.b    14*3*2
  2865. left_bars:    ds.w    14
  2866. right_bars:    ds.w    14
  2867. leftvu:     ds.w    1
  2868. rightvu:    ds.w    1
  2869. old_sndstate:    ds.w    7
  2870. old_speaker:    ds.w    1
  2871. palet:        ds.l    16
  2872. old_palet:    ds.l    256
  2873. old_stpalet:    ds.w    16
  2874. ability:    ds.w    1
  2875. xmem:        ds.l    1
  2876. ymem:        ds.l    1
  2877. sendbuf:    ds.l    1
  2878. lgain:        ds.w    1
  2879. rgain:        ds.w    1
  2880. speaker:    ds.w    1
  2881. leftspect:    ds.w    14
  2882. rightspect:    ds.w    14
  2883. shift:        ds.w    1
  2884. old_mode:    ds.w    1
  2885. old_regs:    ds.w    20
  2886. old_scrlen:    ds.l    1
  2887. old_physscr:     ds.l    1
  2888. old_logscr:     ds.l    1
  2889. monitor:    ds.w    1
  2890. pal:        ds.w    1
  2891. old_hz200:    ds.l    1
  2892. oldconterm:    ds.w    1
  2893. old_superstack:    ds.l    1
  2894. old_capslock:    ds.w    1
  2895.  
  2896.         end
  2897.