home *** CD-ROM | disk | FTP | other *** search
/ Falcon 030 Power 2 / F030_POWER2.iso / ST_STE / MAGS / ICTARI01.ARJ / ictari.01 / ASSEMBLY / MANDEL / MANDEL.S < prev    next >
Text File  |  1989-09-07  |  18KB  |  1,222 lines

  1.  
  2. temp    equ    $30
  3.  
  4.     move.l    4(sp),a5
  5.     move.l    #end+4096,d0
  6.     move.l    a5,d1
  7.     add.l    d0,d1
  8.     bclr    #0,d1
  9.     move.l    d1,sp
  10.     move.l    d0,-(sp)
  11.     move.l    a5,-(sp)
  12.     pea    $4a0000
  13.     trap    #1
  14.     lea    12(sp),sp
  15.     tst    d0
  16.     beq.s    okay
  17.  
  18.     lea    nomem(pc),a1
  19.     bsr    prmes
  20.     bsr    anykey
  21.     bra    exit
  22.  
  23. okay    clr.l    -(sp)
  24.     move    #32,-(sp)
  25.     trap    #1
  26.     addq.l    #6,sp
  27.     move.l    d0,oldssp
  28.  
  29.     dc.w    $a00a
  30.  
  31.     movem.l    $8240.w,d0-d7
  32.     movem.l    d0-d7,oldpal
  33.  
  34.     pea    -1.w
  35.     move.l    (sp),-(sp)
  36.     move.l    (sp),-(sp)
  37.     move    #16,-(sp)
  38.     trap    #14
  39.     lea    14(sp),sp
  40.     move.l    d0,a0
  41.     move.l    8(a0),keytable
  42.  
  43.     move    #2,-(sp)
  44.     trap    #14
  45.     addq.l    #2,sp
  46.     move.l    d0,phybase
  47.     move    #3,-(sp)
  48.     trap    #14
  49.     addq.l    #2,sp
  50.     move.l    d0,logbase
  51.  
  52.     move    #4,-(sp)
  53.     trap    #14
  54.     addq.l    #2,sp
  55.     move    d0,oldres
  56.     cmp    #2,d0
  57.     bne.s    colour
  58.  
  59.     lea    nomono(pc),a1
  60.     bsr    prmes
  61.     bsr    anykey
  62.     bra    exit1
  63.  
  64. colour    clr    -(sp)
  65.     pea    -1.w
  66.     move.l    (sp),-(sp)
  67.     move    #5,-(sp)
  68.     trap    #14
  69.     lea    12(sp),sp
  70.  
  71.     move    #$2700,sr
  72.     move.l    $fa06.w,oldier
  73.     clr.b    $fa07.w
  74.     move.b    #$40,$fa09.w
  75.     bclr    #6,$fa0d.w
  76.     bclr    #6,$fa11.w
  77.     bset    #6,$fa15.w
  78.     move.l    $118.w,oldkeyb
  79.     move.l    #keybrd,$118.w
  80.     move.l    $456.w,a0
  81.     move.l    (a0),oldvblq
  82.     move.l    #vbl,(a0)
  83.     move.l    #palette,$45a.w
  84.     move    #$2300,sr
  85.     
  86.     lea    keydat(pc),a0
  87.     moveq    #3-1,d0
  88.     bsr    sendikbd
  89.  
  90. drawfull
  91.     move.l    #$a0000000,a3
  92.     move.l    #$c0000000,a4
  93.     move.l    #$a3d70a,a1
  94.  
  95.     bsr    mandel
  96.  
  97.     bsr    mouseon
  98.  
  99. * Main loop
  100.  
  101. main    bsr    wvbl
  102.  
  103.     move    keys(pc),d0
  104.  
  105.     cmp    #$13,d0        'r' redraw current
  106.     beq    domand
  107.     cmp    #1,d0        esc exit from program
  108.     beq    desktop
  109.     cmp    #$17,d0        'i' alter iterations
  110.     bne    noti
  111.  
  112. * Alter iteration
  113.  
  114.     movem.l    a1/a3/a4,-(sp)
  115.     bsr    screendown
  116.     lea    inpmes(pc),a1
  117.     bsr    prmes
  118.  
  119. wni    cmp    #$17,keys
  120.     beq.s    wni
  121.  
  122.     lea    inpbuf(pc),a5
  123.     move.l    a5,a6
  124. nokey    move    keys(pc),d7
  125.     cmp    #$74,d7
  126.     bge.s    nokey
  127.     move.l    keytable(pc),a0
  128.     move.b    0(a0,d7),d1
  129.     beq.s    nokey
  130.     cmp.b    #13,d1
  131.     beq.s    return
  132.     cmp.b    #8,d1
  133.     beq.s    delete
  134.     cmp.l    #inpbuf+10,a6
  135.     beq.s    nokey
  136.     cmp.b    #'0',d1
  137.     blt.s    nokey
  138.     cmp.b    #'9',d1
  139.     bgt.s    nokey
  140.     move.b    d1,(a6)+
  141.     move    d1,d0
  142.     bsr    prchar
  143. waitnk    cmp    keys(pc),d7
  144.     beq.s    waitnk
  145.     bra.s    nokey
  146.  
  147. delete    cmp.l    a5,a6
  148.     beq.s    nokey
  149.     subq.l    #1,a6
  150.     lea    delmes(pc),a1
  151.     bsr    prmes
  152.     bra.s    waitnk
  153.  
  154. return    cmp.l    a5,a6        anything in the buffer?
  155.     beq.s    restscr        if not then leave iterations unchanged
  156.  
  157.     moveq    #0,d0
  158.     moveq    #0,d1
  159. nxtchar    move.b    (a5)+,d0
  160.     sub    #'0',d0
  161.     move.l    d1,d2
  162.     add.l    d1,d1
  163.     add.l    d1,d1
  164.     add.l    d2,d1
  165.     add.l    d1,d1
  166.     add.l    d0,d1
  167.     cmp.l    a5,a6
  168.     bne.s    nxtchar
  169.     move.l    d1,iterations+2
  170.  
  171. restscr    moveq    #27,d0        put screen back up
  172.     bsr    prchar
  173.     moveq    #'f',d0
  174.     bsr    prchar
  175.     bsr    screenup
  176.     movem.l    (sp)+,a1/a3/a4
  177.  
  178. noti    cmp    #$21,d0        'f' draw full set
  179.     bne.s    notf
  180.  
  181.     bsr    mouseoff
  182.     bra    drawfull
  183.  
  184. notf    cmp    #$61,d0        'undo' redraw last picture
  185.     bne.s    notundo
  186.  
  187.     movem.l    lastmand(pc),a1/a3/a4
  188.     bra    domand
  189.  
  190. notundo    cmp    #$2d,d0
  191.     bne.s    notx
  192.  
  193.     move.l    a1,-(sp)
  194.     bsr    screendown
  195.     lea    xmes(pc),a1
  196.     bsr    prmes
  197.     move.l    a3,d0
  198.     bsr    prhex32
  199.     bsr    space
  200.     move.l    a4,d0
  201.     bsr    prhex32
  202.     bsr    space
  203.     move.l    (sp),d0
  204.     bsr    prhex32
  205.     bsr    space
  206. waitnx    cmp    #$2d,keys
  207.     beq.s    waitnx
  208. waitkey    tst    keys
  209.     beq.s    waitkey
  210.     bsr    screenup
  211.     move.l    (sp)+,a1
  212.  
  213. notx    cmp    #$39,d0        space
  214.     bne    main
  215.  
  216.     moveq    #0,d4
  217.     move    box_width(pc),d4
  218.     move.l    a1,d0
  219.     move    d0,d1
  220.     mulu    d4,d1
  221.     swap    d0
  222.     mulu    d4,d0
  223.     swap    d0
  224.     clr    d0
  225.     add.l    d0,d1
  226.  
  227. * divide d1 by 200
  228.     move.l    #200,d5
  229.     moveq    #0,d2
  230.     moveq    #32-2,d3
  231.     addq    #1,d3
  232. divlp    addx.l    d1,d1
  233.     addx.l    d2,d2
  234.     sub.l    d5,d2
  235.     bcc.s    subok
  236.     add.l    d5,d2
  237. subok    eor    #$10,sr
  238.     dbra    d3,divlp
  239.     addx.l    d1,d1
  240.     tst.l    d1
  241.     bne.s    zoomok
  242.  
  243.     move    #$2700,sr
  244.     not    $8240.w
  245.     lea    $8800.w,a0
  246.     lea    beepdat(pc),a2
  247.     moveq    #7-1,d0
  248. sndlp    move    (a2)+,d1
  249.     movep    d1,0(a0)
  250.     dbra    d0,sndlp
  251.     not    $8240.w
  252.     move    #$2300,sr
  253.     bra    main
  254.  
  255. zoomok    movem.l    a1/a3/a4,lastmand
  256.  
  257.     move    mousex(pc),d2    Calculate top left corner of box, position
  258.     move    mousey(pc),d3    in d2,d3
  259.     sub    d4,d3
  260.     lsl    #3,d4
  261.     divu    #5,d4
  262.     sub    d4,d2
  263.  
  264.     move.l    a1,d4
  265.     move    d4,d5
  266.     mulu    d2,d5
  267.     swap    d4
  268.     mulu    d2,d4
  269.     swap    d4
  270.     clr    d4
  271.     add.l    d4,d5
  272.     add.l    d5,a3    a3=a3+x*a1
  273.  
  274.     move.l    a1,d4
  275.     move    d4,d5
  276.     mulu    d3,d5
  277.     swap    d4
  278.     mulu    d3,d4
  279.     swap    d4
  280.     clr    d4
  281.     add.l    d4,d5
  282.     add.l    d5,a4    a4=a4+y*a1
  283.  
  284.     move.l    d1,a1
  285.  
  286. domand    bsr    mouseoff
  287.  
  288.     bsr.s    mandel
  289.  
  290.     bsr    mouseon
  291.     bra    main
  292.  
  293. *
  294. * Display portion of Mandelbrot set with top left corner a3+a4i
  295. * height and width a1*200
  296. *
  297.  
  298. mandel    movem.l    a1/a3/a4/a7,regstor
  299.     move    #1,manding
  300.  
  301.     move.l    $44e.w,a5
  302.  
  303.     lea    200*160(a5),a6
  304.     move.l    a6,compare+2
  305.  
  306.     move.l    a4,d4        bc=sy
  307.     moveq    #2-1,d0
  308. row2lp    move    d0,-(sp)
  309.     move.l    a3,d3        ac=sx
  310.     bsr    calculate
  311.     lea    store1(pc),a2
  312.     move    d1,(a2)+    
  313.     add.l    a1,d3
  314.     bsr    calculate
  315.     move    d1,(a2)+
  316.  
  317.     move    #318/2-1,d7
  318. pairlp    add.l    a1,d3
  319.     move.l    d3,d2
  320.     add.l    a1,d3
  321.     bsr    calculate
  322.     move    d1,2(a2)
  323.     cmp    -2(a2),d1
  324.     beq.s    same
  325.     exg    d3,d2
  326.     bsr    calculate
  327.     move    d1,(a2)
  328.     move.l    d2,d3
  329.     bra.s    nxt1
  330. same    move    d1,(a2)
  331. nxt1    addq.l    #4,a2
  332.     dbra    d7,pairlp
  333.  
  334.     lea    store1(pc),a2
  335.     moveq    #20-1,d0
  336. wordlp    move    d0,-(sp)
  337.     moveq    #16-1,d2
  338. bitlp    move    (a2)+,d1
  339.     lsr    #1,d1
  340.     roxl    #1,d0
  341.     lsr    #1,d1
  342.     roxl    #1,d5
  343.     lsr    #1,d1
  344.     roxl    #1,d6
  345.     lsr    #1,d1
  346.     roxl    #1,d7
  347.     dbra    d2,bitlp
  348.     move    d0,(a5)+
  349.     move    d5,(a5)+
  350.     move    d6,(a5)+
  351.     move    d7,(a5)+
  352.     move    (sp)+,d0
  353.     dbra    d0,wordlp
  354.  
  355.     add.l    a1,d4        
  356.     move    (sp)+,d0
  357.     dbra    d0,row2lp
  358.  
  359.     lea    store2(pc),a2
  360.     lea    store1(pc),a4
  361. *
  362. * Calculate lines in pairs
  363. *
  364.  
  365. pair2lp    movem.l    d4/a2/a4,-(sp)
  366.     add.l    a1,d4
  367.  
  368.     move.l    a3,d3        ac=sx
  369.     bsr    calculate
  370.     move    d1,(a2)+    
  371.     add.l    a1,d3
  372.     bsr    calculate
  373.     move    d1,(a2)+
  374.  
  375.     move    #318/2-1,d7
  376. pairlp0    add.l    a1,d3
  377.     move.l    d3,d2
  378.     add.l    a1,d3
  379.     bsr    calculate
  380.     move    d1,2(a2)
  381.     cmp    -2(a2),d1
  382.     beq.s    same0
  383.     exg    d3,d2
  384.     bsr    calculate
  385.     move    d1,(a2)
  386.     move.l    d2,d3
  387.     bra.s    nxt10
  388. same0    move    d1,(a2)
  389. nxt10    addq.l    #4,a2
  390.     dbra    d7,pairlp0
  391.  
  392.     move.l    4(sp),a2
  393.     move.l    a5,a6
  394.     lea    160(a5),a5
  395.     moveq    #20-1,d0
  396. wordlp0    move    d0,-(sp)
  397.     moveq    #16-1,d2
  398. bitlp0    move    (a2)+,d1
  399.     lsr    #1,d1
  400.     roxl    #1,d0
  401.     lsr    #1,d1
  402.     roxl    #1,d5
  403.     lsr    #1,d1
  404.     roxl    #1,d6
  405.     lsr    #1,d1
  406.     roxl    #1,d7
  407.     dbra    d2,bitlp0
  408.     move    d0,(a5)+
  409.     move    d5,(a5)+
  410.     move    d6,(a5)+
  411.     move    d7,(a5)+
  412.     move    (sp)+,d0
  413.     dbra    d0,wordlp0
  414.  
  415.     move.l    (sp)+,d5
  416.     movem.l (sp),a2/a4
  417.     move.l    d4,-(sp)
  418.     move.l    d5,d4
  419.     move.l    a3,d3
  420.     moveq    #20-1,d0
  421. wordlp1    move    d0,-(sp)
  422.     moveq    #16-1,d2
  423. bitlp1    move    (a2)+,d1
  424.     cmp    (a4)+,d1
  425.     beq.s    same1
  426.     bsr.s    calculate
  427. same1    add.l    a1,d3
  428.     lsr    #1,d1
  429.     roxl    #1,d0
  430.     lsr    #1,d1
  431.     roxl    #1,d5
  432.     lsr    #1,d1
  433.     roxl    #1,d6
  434.     lsr    #1,d1
  435.     roxl    #1,d7
  436.     dbra    d2,bitlp1
  437.     move    d0,(a6)+
  438.     move    d5,(a6)+
  439.     move    d6,(a6)+
  440.     move    d7,(a6)+
  441.     move    (sp)+,d0
  442.     dbra    d0,wordlp1
  443.  
  444.     movem.l    (sp)+,d4/a2/a4
  445.     exg    a2,a4
  446.     add.l    a1,d4
  447.  
  448. compare    cmp.l    #0,a5
  449.     bne    pair2lp
  450.  
  451. mandout    clr    manding
  452.     movem.l    regstor(pc),a1/a3/a4/a7
  453.     rts            done mandelbrot
  454.  
  455.  
  456. * Calculate point at d3+d4i
  457.  
  458. calculate
  459.     movem.l    d0/d2-d7,-(sp)
  460.  
  461.     move.l    d3,d5
  462.     move.l    d4,d6
  463.     sub.l    a0,a0
  464.  
  465. calc    move.l    d5,d2
  466.     bsr    square
  467.     bmi.s    out_of_range
  468.     move.l    d2,(temp).w
  469.     move.l    d6,d2
  470.     bsr    square
  471.     bmi.s    out_of_range
  472.     move.l    (temp).w,d1
  473.     add.l    d2,d1
  474.     bcs.s    done
  475.     cmp.l    #$80000000,d1
  476.     bcc.s    out_of_range
  477. iterations
  478.     cmp.l    #100,a0
  479.     beq.s    done
  480.     add.l    d6,d6
  481.     bsr    multiply
  482.     add.l    d4,d6
  483.     move.l    (temp).w,d5
  484.     sub.l    d2,d5
  485.     add.l    d3,d5
  486.     addq    #1,a0
  487.     bra.s    calc
  488.  
  489. out_of_range
  490.     moveq    #0,d1
  491.     move    a0,d1
  492.     divu    #15,d1
  493.     swap    d1
  494.     addq    #1,d1
  495.     movem.l    (sp)+,d0/d2-d7
  496.     rts
  497.  
  498. done    moveq    #0,d1
  499.     movem.l    (sp)+,d0/d2-d7
  500.     rts
  501.  
  502. * Square a number in d2
  503.  
  504. square    movem.l    d3/d4,-(sp)
  505.     tst.l    d2
  506.     bpl.s    splus
  507.     neg.l    d2
  508. splus    moveq    #0,d0
  509.     moveq    #0,d1
  510.     move.l    d2,d3
  511.     moveq    #0,d4
  512.  
  513.     move    d2,d3
  514.     move    d2,d0
  515.     mulu    d2,d0
  516.     swap    d2
  517.     move    d2,d1
  518.     mulu    d2,d1
  519.     mulu    d2,d3
  520.     swap    d3
  521.     moveq    #0,d4
  522.     move    d3,d4
  523.     clr    d3
  524.     add.l    d3,d0
  525.     addx.l    d4,d1
  526.     add.l    d3,d0
  527.     addx.l    d4,d1
  528.  
  529.     rol.l    #3,d0
  530.     and    #7,d0
  531.     cmp.l    #$10000000,d1
  532.     bcc.s    overflow
  533.     lsl.l    #3,d1
  534.     or    d0,d1
  535.     move.l    d1,d2
  536.     movem.l    (sp)+,d3/d4
  537.     rts
  538.  
  539. overflow
  540.     moveq    #-1,d0
  541.     movem.l    (sp)+,d3-d4
  542.     rts
  543.     
  544. * Multiply d6 by d5
  545.  
  546. multiply
  547.     movem.l    d2-d4,-(sp)
  548.  
  549.     moveq    #0,d3
  550.     move.l    d5,d2
  551.  
  552.     tst.l    d2
  553.     bpl.s    d2plus
  554.     moveq    #1,d3
  555.     neg.l    d2
  556. d2plus    tst.l    d6
  557.     bpl.s    d6plus
  558.     eor    #1,d3
  559.     neg.l    d6
  560. d6plus    moveq    #0,d0
  561.     moveq    #0,d1
  562.     moveq    #0,d4
  563.     move    d3,-(sp)
  564.  
  565.     move    d2,d7
  566.     move    d2,d0
  567.     mulu    d6,d0
  568.     swap    d2
  569.     move    d2,d3
  570.     mulu    d6,d3
  571.     swap    d6
  572.     move    d2,d1
  573.     mulu    d6,d1
  574.     swap    d3
  575.     moveq    #0,d4
  576.     move    d3,d4
  577.     clr    d3
  578.     add.l    d3,d0
  579.     addx.l    d4,d1
  580.     mulu    d6,d7
  581.     swap    d7
  582.     move    d7,d4
  583.     clr    d7
  584.     add.l    d7,d0
  585.     addx.l    d4,d1
  586.  
  587.     rol.l    #3,d0
  588.     and    #7,d0
  589.     lsl.l    #3,d1
  590.     or    d0,d1
  591.     move.l    d1,d6
  592.     move    (sp)+,d2
  593.     tst    d2
  594.     beq.s    mokay
  595.     neg.l    d6
  596. mokay    movem.l    (sp)+,d2-d4
  597.     rts
  598.  
  599.  
  600. * Various routines
  601.  
  602. screendown
  603.     move.l    phybase(pc),a0
  604.     lea    -1280(a0),a0
  605.     move    #-1,-(sp)
  606.     pea    (a0)
  607.     pea    (a0)
  608.     move    #5,-(sp)
  609.     trap    #14
  610.     lea    12(sp),sp
  611.     rts
  612.  
  613. screenup
  614.     move    #-1,-(sp)
  615.     move.l    phybase(pc),-(sp)
  616.     move.l    (sp),-(sp)
  617.     move    #5,-(sp)
  618.     trap    #14
  619.     lea    12(sp),sp
  620.     rts
  621.  
  622. prhex32    move    d0,-(sp)
  623.     swap    d0
  624.     bsr.s    prhex16
  625.     move    (sp)+,d0
  626. prhex16    move    d0,-(sp)
  627.     lsr    #8,d0
  628.     bsr.s    prhex8
  629.     move    (sp)+,d0
  630. prhex8    move    d0,-(sp)
  631.     lsr    #4,d0
  632.     bsr.s    prhex4
  633.     move    (sp)+,d0
  634. prhex4    and    #$f,d0
  635.     move.b    hexdat(pc,d0),d0
  636.     bra.s    prchar
  637.  
  638. hexdat    dc.b    '0123456789ABCDEF'
  639.  
  640. space    moveq    #32,d0
  641. prchar    move    d0,-(sp)
  642.     pea    $30002
  643.     trap    #13
  644.     addq.l    #6,sp
  645.     rts
  646.  
  647. prmes    pea    (a1)
  648.     move    #9,-(sp)
  649.     trap    #1
  650.     addq.l    #6,sp
  651.     rts
  652.  
  653. anykey    lea    anymes(pc),a1
  654.     bsr.s    prmes
  655.     pea    $20002
  656.     trap    #13
  657.     addq.l    #4,sp
  658.     rts
  659.  
  660. sendikbd
  661. keylp    move.b    (a0)+,d1
  662.     bsr.s    sendkb
  663.     dbra    d0,keylp
  664.     rts
  665.  
  666. sendkb    btst    #1,$fc00.w
  667.     beq.s    sendkb
  668.     move.b    d1,$fc02.w
  669.     rts
  670.     
  671. wvbl    move.l    $466.w,d0
  672. waitlp    cmp.l    $466.w,d0
  673.     beq.s    waitlp
  674.     rts
  675.  
  676. mouseon    movem.l    d0-d7/a0-a6,-(sp)
  677.     bsr    drawbox
  678.     bsr    drawm
  679.     move.l    mousex(pc),nmousex
  680.     movem.l    (sp)+,d0-d7/a0-a6
  681.     move    #1,mouse
  682.     rts
  683.  
  684. mouseoff
  685.     clr    mouse
  686.     movem.l    d0-d7/a0-a6,-(sp)
  687.     bsr    undraw
  688.     bsr    undrawbox
  689.     movem.l    (sp)+,d0-d7/a0-a6
  690.     rts
  691.  
  692.  
  693. * Vertical blank handler
  694.  
  695. vbl    move    keys(pc),d0
  696.  
  697.     cmp    #$32,d0        m set multi-colours
  698.     bne.s    notm
  699.  
  700.     movem.l    palette(pc),d0-d7
  701.     movem.l    d0-d7,$8240.w
  702.  
  703. notm    cmp    #$1f,d0        s set up single colours
  704.     bne.s    nots
  705.  
  706.     lea    $8242.w,a0
  707.     move.l    #$7770606,(a0)+
  708.     move.l    #$7770606,(a0)+
  709.     move.l    #$7770606,(a0)+
  710.     move.l    #$7770606,(a0)+
  711.     move.l    #$7770606,(a0)+
  712.     move.l    #$7770606,(a0)+
  713.     move.l    #$7770606,(a0)+
  714.     move    #$777,(a0)
  715.  
  716. nots    cmp    #$2e,d0        c start cycling
  717.     bne.s    noc
  718.  
  719.     move    #1,cycle
  720.     move    #5,tmpdel
  721.  
  722. noc    cmp    #$2f,d0        v stop cycling
  723.     bne.s    notsp
  724.  
  725.     clr    cycle
  726.  
  727. notsp    tst    cycle
  728.     beq.s    nocyc
  729.  
  730.     cmp    #$4e,d0        + on keypad speed up cycling    
  731.     bne.s    notdec
  732.  
  733.     cmp    #1,delay
  734.     beq.s    notdec
  735.     subq    #1,delay
  736.  
  737. notdec    cmp    #$4a,d0        - on keypad slow down cycling
  738.     bne.s    notinc
  739.  
  740.     addq    #1,delay
  741.  
  742. notinc    subq    #1,tmpdel
  743.     bne.s    nocyc
  744.     move    delay(pc),tmpdel
  745.     lea    $8260.w,a0
  746.     lea    $825e.w,a1
  747.     move    (a1),d0
  748.     move    -(a1),-(a0)
  749.     move    -(a1),-(a0)
  750.     move    -(a1),-(a0)
  751.     move    -(a1),-(a0)
  752.     move    -(a1),-(a0)
  753.     move    -(a1),-(a0)
  754.     move    -(a1),-(a0)
  755.     move    -(a1),-(a0)
  756.     move    -(a1),-(a0)
  757.     move    -(a1),-(a0)
  758.     move    -(a1),-(a0)
  759.     move    -(a1),-(a0)
  760.     move    -(a1),-(a0)
  761.     move    -(a1),-(a0)
  762.     move    d0,(a1)
  763.  
  764. nocyc    tst    mouse
  765.     beq    nomouse
  766.  
  767.     bsr    undraw
  768.     bsr    undrawbox
  769.  
  770.     move    keys(pc),d0
  771.     move.l    nmousex(pc),d2
  772.     move.l    d2,d1
  773.     swap    d1
  774.     cmp    #$48,d0
  775.     bne.s    notup
  776.     subq    #1,d2
  777. notup    cmp    #$50,d0
  778.     bne.s    notdown
  779.     addq    #1,d2
  780. notdown    cmp    #$4b,d0
  781.     bne.s    notleft
  782.     subq    #1,d1
  783. notleft    cmp    #$4d,d0
  784.     bne.s    notrigh
  785.     addq    #1,d1
  786.  
  787. notrigh    tst    d1        make sure d1 & d2 are on screen
  788.     bpl.s    kmxok
  789.     clr    d1
  790. kmxok    cmp    #319,d1
  791.     ble.s    kmxok1
  792.     move    #319,d1
  793. kmxok1    tst    d2
  794.     bpl.s    kmyok
  795.     clr    d2
  796. kmyok    cmp    #199,d2
  797.     ble.s    kmyok1
  798.     move    #199,d2
  799. kmyok1    move    d1,mousex
  800.     move    d2,mousey    
  801.  
  802.     tst    leftbutton
  803.     beq.s    nolb
  804.     cmp    #1,box_width
  805.     beq.s    nolb
  806.     subq    #1,box_width
  807. nolb    tst    rightbutton
  808.     beq.s    norb
  809.     cmp    #100,box_width
  810.     beq.s    norb
  811.     addq    #1,box_width
  812.  
  813. norb    move    box_width(pc),d5
  814.     moveq    #0,d6
  815.     move    d5,d6
  816.     lsl    #3,d6
  817.     divu    #5,d6
  818.     cmp    mousex(pc),d6
  819.     ble.s    mxokay
  820.     move    d6,mousex
  821. mxokay    cmp    mousey(pc),d5
  822.     ble.s    myokay
  823.     move    d5,mousey
  824. myokay    bsr    drawbox
  825.     bsr    drawm
  826.     move.l    mousex(pc),nmousex
  827.  
  828. nomouse    rts
  829.  
  830.     
  831. drawm    moveq    #0,d0
  832.     move    mousey(pc),d0
  833.     move    d0,d1
  834.     add    d0,d0
  835.     add    d0,d0
  836.     add    d1,d0
  837.     lsl    #5,d0
  838.     move    mousex(pc),d1
  839.     move    d1,d2
  840.     lsr    #1,d1
  841.     and    #$fff8,d1
  842.     add    d1,d0
  843.     move.l    phybase(pc),a0
  844.     add.l    d0,a0
  845.     and    #$f,d2
  846.     lea    trash(pc),a1
  847.     move.l    mousedatapnt(pc),a2
  848.     move.l    a0,(a1)+
  849.     move    #200,d3
  850.     sub    mousey(pc),d3
  851.     cmp    #16,d3
  852.     ble.s    fulsize
  853.     moveq    #16,d3
  854. fulsize    subq    #1,d3
  855.     move    d3,(a1)+
  856.     cmp    #152,d1
  857.     beq.s    rightedge
  858. drawlp    movem.l    (a0),d4-d7
  859.     movem.l    d4-d7,(a1)
  860.     lea    16(a1),a1
  861.     moveq    #0,d0
  862.     move    (a2)+,d0
  863.     not    d0
  864.     swap    d0
  865.     lsr.l    d2,d0
  866.     not.l    d0
  867.     move.l    a0,a4
  868.     swap    d0
  869.     and    d0,(a4)+
  870.     and    d0,(a4)+
  871.     and    d0,(a4)+
  872.     and    d0,(a4)+
  873.     swap    d0
  874.     and    d0,(a4)+
  875.     and    d0,(a4)+
  876.     and    d0,(a4)+
  877.     and    d0,(a4)+
  878.     moveq    #0,d0
  879.     move    (a2)+,d0
  880.     swap    d0
  881.     lsr.l    d2,d0
  882.     or    d0,8(a0)
  883.     swap    d0
  884.     or    d0,(a0)
  885.     moveq    #0,d0
  886.     move    (a2)+,d0
  887.     swap    d0
  888.     lsr.l    d2,d0
  889.     or    d0,10(a0)
  890.     swap    d0
  891.     or    d0,2(a0)
  892.     lea    160(a0),a0
  893.     dbra    d3,drawlp
  894.     rts
  895. rightedge
  896.     movem.l    (a0),d4-d7
  897.     movem.l    d4-d7,(a1)
  898.     lea    16(a1),a1
  899.     move    (a2)+,d0
  900.     not    d0
  901.     lsr    d2,d0
  902.     not    d0
  903.     move.l    a0,a4
  904.     and    d0,(a4)+
  905.     and    d0,(a4)+
  906.     and    d0,(a4)+
  907.     and    d0,(a4)+
  908.     move    (a2)+,d0
  909.     lsr    d2,d0
  910.     or    d0,(a0)
  911.     move    (a2)+,d0
  912.     lsr    d2,d0
  913.     or    d0,2(a0)
  914.     lea    160(a0),a0
  915.     dbra    d3,rightedge
  916.     rts
  917.  
  918. undraw    lea    trash(pc),a0
  919.     move.l    (a0)+,a1
  920.     move    (a0)+,d4
  921. undrlp    movem.l    (a0)+,d0-d3
  922.     movem.l    d0-d3,(a1)
  923.     lea    160(a1),a1
  924.     dbra    d4,undrlp
  925.     rts
  926.  
  927. undrawbox
  928.     move.l    oldbxy(pc),d1
  929.     bra.s    db
  930.  
  931. drawbox    move.l    mousex(pc),d1
  932.     move.l    d1,oldbxy
  933. db    move.l    d1,d0
  934.     swap    d0
  935.     move    box_width(pc),d2
  936.     moveq    #0,d3
  937.     move    d2,d3
  938.     lsl    #3,d3
  939.     divu    #5,d3
  940.  
  941.     move    d1,d4
  942.     add    d1,d1
  943.     add    d1,d1
  944.     add    d4,d1
  945.     lsl    #5,d1
  946.     move.l    phybase(pc),a0
  947.     add    d1,a0
  948.     move    d0,d7
  949.     and    #$f,d7
  950.     eor    #$f,d7
  951.     lsr    #1,d0
  952.     and    #$fff8,d0
  953.     add    d0,a0        a0=address of bottom right corner of box
  954.     move    d2,d0
  955.     add    d0,d0
  956.     add    d0,d0
  957.     add    d2,d0
  958.     lsl    #5,d0
  959.     neg    d0
  960.     lea    0(a0,d0),a2
  961.     move    d7,d6
  962.  
  963.     moveq    #0,d1
  964. horizlp    bset    d7,d1
  965.     subq    #1,d3
  966.     bmi.s    donehor
  967.     addq    #1,d7
  968.     cmp    #16,d7
  969.     bne.s    horizlp
  970.     moveq    #0,d7
  971.     eor    d1,(a0)
  972.     eor    d1,0(a0,d0)
  973.     moveq    #0,d1
  974.     subq.l    #8,a0
  975.     bra.s    horizlp
  976.  
  977. donehor    eor    d1,(a0)
  978.     eor    d1,0(a0,d0)
  979.  
  980.     add    d0,a0
  981.     cmp    #8,d7
  982.     bge.s    upby
  983.     addq.l    #1,a0
  984.     bra.s    chkd6
  985. upby    and    #7,d7
  986. chkd6    cmp    #8,d6
  987.     bge.s    upby1
  988.     addq.l    #1,a2
  989.     bra.s    vertlp
  990. upby1    and    #7,d6
  991.  
  992. vertlp    lea    160(a0),a0
  993.     lea    160(a2),a2
  994.     subq    #1,d2
  995.     beq.s    donever
  996.     bchg    d7,(a0)
  997.     bchg    d6,(a2)
  998.     bra.s    vertlp
  999.  
  1000. donever    rts
  1001.  
  1002.  
  1003. * Keyboard handler
  1004.     
  1005. keybrd    movem.l    d0/d1/a0,-(sp)
  1006.  
  1007. again    move.b    $fc00.w,d1
  1008.     btst    #7,d1
  1009.     beq    keyout
  1010.     btst    #0,d1
  1011.     beq    keyo
  1012.  
  1013.     moveq    #0,d0
  1014.     move.b    $fc02.w,d0
  1015.     tst    length
  1016.     beq.s    nopack
  1017.  
  1018.     move.l    bufpnt(pc),a0
  1019.     move.b    d0,(a0)+
  1020.     move.l    a0,bufpnt
  1021.     subq    #1,length
  1022.     bne    keyo
  1023.  
  1024.     lea    keybuf(pc),a0
  1025.     and.b    #$fc,(a0)
  1026.     cmp.b    #$f8,(a0)+
  1027.     bne    keyo
  1028.  
  1029.     move.b    (a0)+,d0
  1030.     ext    d0
  1031.     add    d0,nmousex
  1032.     move.b    (a0)+,d0
  1033.     ext    d0
  1034.     add    d0,nmousey
  1035.     bra    keyo
  1036.  
  1037. nopack    cmp    #$f6,d0
  1038.     blt.s    akey
  1039.  
  1040.     lea    keybuf(pc),a0
  1041.     move.b    d0,(a0)+
  1042.     move.l    a0,bufpnt
  1043.     sub    #$f6,d0
  1044.     move.b    lengths(pc,d0),d0
  1045.     move    d0,length
  1046.     bra    keyo
  1047.  
  1048. lengths    dc.b    7,5,2,2,2,2,6,2,1,1
  1049.  
  1050. akey    cmp    #$52,d0        Test for mouse simulating keys
  1051.     beq.s    leftb
  1052.     cmp    #$74,d0
  1053.     bne.s    notlon
  1054. leftb    move    #1,leftbutton
  1055.     bra    keyo
  1056. notlon    cmp    #$d2,d0
  1057.     beq.s    lefto
  1058.     cmp    #$f4,d0
  1059.     bne.s    notloff
  1060. lefto    clr    leftbutton
  1061.     bra.s    keyo
  1062. notloff    cmp    #$47,d0
  1063.     beq.s    rightb
  1064.     cmp    #$75,d0
  1065.     bne.s    notron
  1066. rightb    move    #1,rightbutton
  1067.     bra.s    keyo
  1068. notron    cmp    #$c7,d0
  1069.     beq.s    righto
  1070.     cmp    #$f5,d0
  1071.     bne.s    notmkey
  1072. righto    clr    rightbutton
  1073.     bra.s    keyo
  1074.  
  1075. * if not a mouse key then it's a keyboard key
  1076.  
  1077. notmkey    tst.b    d0        Is it a on or off key
  1078.     bmi.s    keyoff
  1079.  
  1080.     move    keys(pc),lastkey
  1081.     move    d0,keys
  1082.     bra.s    keyo
  1083.  
  1084. keyoff    and    #$7f,d0
  1085.     cmp    keys(pc),d0    Is it current key going off
  1086.     bne.s    notkeys
  1087.  
  1088.     move    lastkey(pc),keys    bring lastkey into current
  1089.     clr    lastkey        current key off
  1090.     bra.s    keyo
  1091.  
  1092. notkeys    cmp    lastkey(pc),d0
  1093.     bne.s    keyo
  1094.  
  1095.     clr    lastkey        lastkey off
  1096.  
  1097. keyo    move    leftbutton(pc),d0
  1098.     and    rightbutton(pc),d0
  1099.     beq.s    noexm
  1100.  
  1101.     tst    manding
  1102.     beq.s    noexm
  1103.  
  1104.     move.l    #mandout,14(sp)
  1105.  
  1106. noexm    btst    #5,d1
  1107.     beq.s    keyout
  1108.  
  1109.     tst.b    $fc02.w
  1110.  
  1111. keyout    btst    #4,$fa01.w
  1112.     beq    again
  1113.  
  1114.     movem.l    (sp)+,d0/d1/a0
  1115.     bclr    #6,$fa11.w
  1116.     rte
  1117.  
  1118. * Return to desktop
  1119.  
  1120. desktop    move    #$2700,sr
  1121.     move.l    oldier(pc),$fa06.w
  1122.     move.l    oldkeyb(pc),$118.w
  1123.     move.l    $456.w,a0
  1124.     move.l    oldvblq(pc),(a0)
  1125.     move    #$2300,sr
  1126.  
  1127.     lea    keydat1(pc),a0
  1128.     moveq    #2-1,d0
  1129.     bsr    sendikbd
  1130.  
  1131.     movem.l    oldpal(pc),d0-d7
  1132.     movem.l    d0-d7,$8240.w
  1133.  
  1134. exit1    move    oldres(pc),-(sp)
  1135.     move.l    phybase(pc),-(sp)
  1136.     move.l    logbase(pc),-(sp)
  1137.     move    #5,-(sp)
  1138.     trap    #14
  1139.     lea    12(sp),sp
  1140.     move.l    oldssp(pc),-(sp)
  1141.     move    #32,-(sp)
  1142.     trap    #1
  1143.     addq.l    #6,sp
  1144. exit    clr    -(sp)
  1145.     trap    #1
  1146.  
  1147.  
  1148. * Various data
  1149.  
  1150. nomem    dc.b    27,'EOut of memory',0
  1151. nomono    dc.b    27,'EColour monitors only',0
  1152. anymes    dc.b    13,10,13,10,'Press any key',0
  1153. inpmes    dc.b    27,'e',27,'H',27,'b',1,27,'K'
  1154.     dc.b    'Enter number of iterations ',0
  1155. delmes    dc.b    8,32,8,0
  1156. xmes    dc.b    27,'H',27,'K',27,'b',1,0
  1157.  
  1158.     even
  1159.  
  1160. mousedatapnt
  1161.     dc.l    mousedata
  1162. mousedata
  1163.     dc.w    $7F,$FF80,0,$7F,$FF80,$7F00,$FF,$FF00
  1164.     dc.w    $7E00,$1FF,$FE00,$7C00,$3FF,$FC00,$7800,$1FF
  1165.     dc.w    $FE00,$7400,$8FF,$F700,$6200,$1C7F,$E380,$4100
  1166.     dc.w    $3E3F,$C1C0,$80,$FF1F,$E0,$40,$FF8F,$70
  1167.     dc.w    $20,$FFC7,$38,$10,$FFE3,$1C,8,$FFF1
  1168.     dc.w    14,4,$FFFB,4,0,$FFFF,0,0
  1169.  
  1170. box_width
  1171.     dc.w    60
  1172.  
  1173. mouse    dc.w    0
  1174. keys    dc.w    0
  1175. lastkey    dc.w    0
  1176. leftbutton    dc.w    0
  1177. rightbutton    dc.w    0
  1178. mousex    dc.w    120
  1179. mousey    dc.w    100
  1180. nmousex    dc.w    0
  1181. nmousey    dc.w    0
  1182. oldbxy    dc.l    0
  1183. length    dc.w    0
  1184. bufpnt    dc.l    0
  1185. keybuf    ds.b    8
  1186. keydat    dc.b    7,4,8
  1187. keydat1    dc.b    7,0
  1188.  
  1189. oldier    dc.l    0
  1190. oldkeyb    dc.l    0
  1191. oldssp    dc.l    0
  1192. oldvblq    dc.l    0
  1193. oldres    dc.w    0
  1194. phybase    dc.l    0
  1195. logbase    dc.l    0
  1196. keytable    dc.l    0
  1197.  
  1198. beepdat    dc.w    $068,$104,$b00,$c49,$d00,$810,$7fe
  1199.  
  1200. palette    dc.w    $000,$072,$062,$153,$243,$234,$324,$415
  1201.     dc.w    $414,$413,$412,$500,$410,$320,$241,$062
  1202.  
  1203. cycle    dc.w    0
  1204. delay    dc.w    5
  1205. tmpdel    dc.w    5
  1206.  
  1207. pattern    dc.w    $ffff
  1208.  
  1209. manding    dc.w    0
  1210. regstor    ds.l    4
  1211. lastmand
  1212.     dc.l    $a3d70a,$a0000000,$c0000000
  1213.  
  1214. inpbuf    ds.b    10
  1215.  
  1216. oldpal
  1217. buffer    equ    oldpal+32
  1218. trash    equ    buffer+512
  1219. store1    equ    trash+300
  1220. store2    equ    store1+640
  1221. end    equ    store2+640
  1222.