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