home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / chessfunk.lha / ChessFunk.s < prev    next >
Encoding:
Text File  |  1980-01-01  |  7.8 KB  |  509 lines

  1.     Section    Demo,Code_C
  2.  
  3.     Opt    C-,O+,w-
  4.     opt    d+
  5.  
  6.     ; CHESSFUNK, WRITTEN BY SHAGRATT/LSD.
  7.     
  8.     ; how chessfunk works. There is a bitmap in memory, of graduated
  9.     ; squares one pixel high, with the processor you build a copperlist.
  10.     ; the copperlist has a modulo of -40 (repeats the same line)
  11.     ; and just re-sets the bitplane pointers to one of the lines
  12.     ; on the bitmap.
  13.  
  14.         
  15. Start:    lea    $dff000,a5        ; hardware base address
  16.  
  17.     Move.w    $1c(a5),OldInt    ; Save Old Interupts
  18.     Move.w    $02(a5),OldDma    ; Save Old DMA
  19.  
  20.     Move.w    #$7fff,$9a(a5)    ; Clear DMA
  21.     Move.w    #$7fff,$96(a5)    ; Clear Interupts
  22.     Move.w    #$7fff,$9c(a5)    ; Clear Interupt Requests
  23.     
  24.     Move.b    #$7f,$bfed01    ; kill timers (rem me for disk)
  25.     Move.l    $6c.w,OldV3        ; save level 3 int
  26.  
  27.     Move.l    #cf_level3,$6c.w    ; put new copper interupt
  28.     Move.l    #cf_copper,$80(a5)     ; Address of copper 1
  29.     Move.l    #dead_copper,$84(a5)     ; Address of copper 1
  30.  
  31.     Move.w    #$c010,$9a(a5)    ; Start interupts
  32.  
  33.     Move.w    #$83ef,$96(a5)    ; Start DMA ( 83ff for disk dma)
  34.     Move.w    #1,$88(a5)        ; Strobe for copper start
  35.  
  36.     move.l    #chessbin+(40*0),d0
  37.     move.w    d0,temp0_lo
  38.     swap    d0
  39.     move.w    d0,temp0_hi
  40.     swap    d0
  41.  
  42.     add.l    #40,d0
  43.     move.w    d0,temp1_lo
  44.     swap    d0
  45.     move.w    d0,temp1_hi
  46.  
  47.     bsr    do_funk
  48.  
  49. wait:    btst    #6,$bfe001
  50.     bne.s    wait        ; wait for lmb
  51.  
  52.  
  53.     lea    $dff000,a5        ; hardware base address
  54.     move.l    #0,$80(a5)        ; blank copper list
  55.     move.l    #0,$84(a5)        ; if gfx lib not open (slayer boot)
  56.     move.w    #0,$180(a5)        ; bgc to black
  57.     
  58.     Move.l    OldV3,$6c.w        ; restore old l3
  59.     
  60.     Lea    GfxLib,a1        ; Pointer to Library Text
  61.     move.l    4.w,a6
  62.     jsr    -132(a6)        ; forbid
  63.     Move.l    4.w,a6        ; Exec
  64.     Moveq.l    #0,d0        ; Clear D0
  65.     Jsr    -$228(a6)        ; Open Library
  66.     cmp.l    #0,d0
  67.     beq    no_gfx_lib        ; if gfx lib not open dont restore copper lib (slayer boot)
  68.     
  69.     Move.l    d0,a1            
  70.     Move.l    $26(a1),$80(a5)    ; restore copper 1
  71.     Move.l    $32(a1),$84(a5)    ; restore copper 2
  72. no_gfx_lib:
  73.  
  74.     Move.w    OldInt,d0        ; start old interupts
  75.     Or.w    #$8000,d0
  76.     Move.w    d0,$9a(a5)
  77.     Move.w    OldDma,d0        ; start old DMA
  78.     Or.w    #$8000,d0
  79.     Move.w    d0,$96(a5)
  80.     Move.b    #$9b,$bfed01    ; Start Timers
  81.     Move.l    4.w,a6        ; Close Gfx lib
  82.     Jsr    -$19e(a6)
  83.     move.l    4.w,a6
  84.     jsr    -138(a6)        ; permit
  85.  
  86.     move.w    #0,$bfec00        ; clear kbd
  87.  
  88.     Moveq.l    #0,d0        ; No errors
  89.     Rts            ; Exit
  90.  
  91.  
  92. cf_level3:
  93.     Movem.l    d0-d7/a0-a6,-(a7)    ; New copper
  94.     Move.w    #$10,$dff09c    ; Serviced Interupt
  95.  
  96.     btst    #10,$dff016
  97.     beq    .Exit
  98.  
  99.     bsr    do_funk
  100.  
  101.     ;move.w    #$666,$dff180
  102.  
  103. .Exit    Movem.l    (a7)+,d0-d7/a0-a6
  104.     Rte            ; Return from Interupt
  105.  
  106. do_funk:    *-------------------------*
  107.     lea    sintable,a0
  108.     move.w    funk_size2,d0
  109.     move.w    (a0,d0),d0
  110.     muls    #38,d0
  111.     swap    d0
  112.     add.w    #38/2,d0
  113.     move.w    d0,funk_size1    
  114.  
  115.     add.w    #4,funk_size2    
  116.     and.w    #$1fe,funk_size2    
  117.  
  118.     move.w    funk_size4,d0
  119.     move.w    (a0,d0),d0
  120.     muls    #38,d0
  121.     swap    d0
  122.     add.w    #38/2,d0
  123.     move.w    d0,funk_size3    
  124.  
  125.     add.w    #4,funk_size4    
  126.     and.w    #$1fe,funk_size4
  127.  
  128.     move.w    funk_size1,d0
  129.     mulu    #40*2,d0
  130.     add.l    #chessbin,d0
  131.     move.w    d0,temp0_lo
  132.     swap    d0
  133.     move.w    d0,temp0_hi
  134.     swap    d0
  135.     add.l    #40,d0
  136.     move.w    d0,temp1_lo
  137.     swap    d0
  138.     move.w    d0,temp1_hi
  139.  
  140.     move.w    funk_size3,d0
  141.     mulu    #40*2,d0
  142.     add.l    #chessbin,d0
  143.     move.w    d0,temp2_lo
  144.     swap    d0
  145.     move.w    d0,temp2_hi
  146.     swap    d0
  147.     add.l    #40,d0
  148.     move.w    d0,temp3_lo
  149.     swap    d0
  150.     move.w    d0,temp3_hi
  151.     
  152.     ************
  153.  
  154.     move.l    copper2_ptr+8,a0
  155.     
  156.     lea    funk_list,a1
  157.     move.w    funk_size1,d0
  158.     asl.w    #1,d0
  159.     move.w    (a1,d0),d5
  160.     ext.l    d5
  161.     asl.l    #8,d5
  162.     asl.l    #8,d5
  163.     asl.l    #8,d5
  164.  
  165.     move.w    (a1,d0),d0
  166.     ext.l    d0
  167.     asl.l    #8,d0
  168.  
  169.     move.l    #$2c01fffe,d6
  170.  
  171.     move.w    #31,d7
  172.  
  173. .loop    move.l    fake_copper+0,(a0)+
  174.     move.l    fake_copper+4,(a0)+
  175.  
  176.     bsr    .nextline
  177.     move.l    d6,(a0)+
  178.  
  179.     move.l    fake_copper+8,(a0)+
  180.     move.l    fake_copper+12,(a0)+
  181.     
  182.     bsr    .nextline
  183.     move.l    d6,(a0)+
  184.  
  185.     dbf    d7,.loop    
  186.  
  187.     move.l    #$fffffffe,(a0)+
  188.  
  189.     ************
  190.  
  191.     move.l    copper2_ptr+12,a0
  192.     
  193.     lea    funk_list,a1
  194.     move.w    funk_size3,d0
  195.     asl.w    #1,d0
  196.     move.w    (a1,d0),d5
  197.     ext.l    d5
  198.     asl.l    #8,d5
  199.     asl.l    #8,d5
  200.     asl.l    #8,d5
  201.  
  202.     move.w    (a1,d0),d0
  203.     ext.l    d0
  204.     asl.l    #8,d0
  205.  
  206.     move.l    #$2c01fffe,d6
  207.  
  208.     move.w    #31,d7
  209.  
  210. .loop2    move.l    fake_copper+16,(a0)+
  211.     move.l    fake_copper+20,(a0)+
  212.  
  213.     bsr    .nextline
  214.     move.l    d6,(a0)+
  215.  
  216.     move.l    fake_copper+24,(a0)+
  217.     move.l    fake_copper+28,(a0)+
  218.     
  219.     bsr    .nextline
  220.     move.l    d6,(a0)+
  221.  
  222.     dbf    d7,.loop2
  223.  
  224.     move.l    #$fffffffe,(a0)+
  225.  
  226.     *********
  227.     
  228.     move.l    copper2_ptr+0,a0
  229.     move.l    copper2_ptr+8,a1
  230.     move.l    copper2_ptr+12,a2
  231.  
  232.     move.l    #$01002200,(a0)+
  233.  
  234.     move.l    12(a2),(a0)+    
  235.     move.l    16(a2),(a0)+    
  236.     move.l    12(a1),(a0)+    
  237.     move.l    16(a1),(a0)+    
  238.  
  239.     move.l    #$2c01fffe,(a0)+
  240.  
  241. .combine    move.l    8(a1),d0
  242.     and.l    #$ff000000,d0
  243.     move.l    8(a2),d1
  244.     and.l    #$ff000000,d1
  245.  
  246.     swap    d0
  247.     swap    d1
  248.  
  249.     cmp.l    d0,d1
  250.     beq    .bothfirst
  251.     blt    .c1first
  252.     
  253.     move.l    8(a1),(a0)+
  254.     move.l    0(a1),(a0)+    
  255.     move.l    4(a1),(a0)+    
  256.     lea    12(a1),a1
  257.     
  258.     bra    .next
  259.  
  260. .c1first    move.l    8(a2),(a0)+
  261.     move.l    0(a2),(a0)+    
  262.     move.l    4(a2),(a0)+    
  263.     lea    12(a2),a2
  264.  
  265.     bra    .next
  266.  
  267. .bothfirst    
  268.     
  269.     cmp.l    #$ffe1fffe,8(a2)
  270.     beq    .xit1
  271.  
  272.     move.l    8(a1),(a0)+
  273.     
  274.     move.l    0(a2),(a0)+    
  275.     move.l    4(a2),(a0)+    
  276.     move.l    0(a1),(a0)+    
  277.     move.l    4(a1),(a0)+    
  278.     
  279.     lea    12(a1),a1
  280.     lea    12(a2),a2
  281.  
  282.     bra    .next
  283.     
  284. .next    cmp.l    #$ffe1fffe,(a1)
  285.     bne    .combine
  286.     
  287. .xit1    cmp.l    #$ffe1fffe,8(a1)
  288.     beq    .c1fin
  289.     
  290.     move.l    8(a1),(a0)+
  291.     move.l    0(a1),(a0)+    
  292.     move.l    4(a1),(a0)+    
  293.     lea    12(a1),a1
  294.     bra    .xit1
  295.  
  296. .c1fin    cmp.l    #$ffe1fffe,8(a2)
  297.     beq    .c2fin
  298.     
  299.     move.l    8(a2),(a0)+
  300.     move.l    0(a2),(a0)+    
  301.     move.l    4(a2),(a0)+    
  302.     lea    12(a2),a2
  303.     bra    .xit1
  304.  
  305. .c2fin    move.l    4(a1),8(a1)
  306.     move.l    0(a1),4(a1)
  307.     move.l    4(a2),8(a2)
  308.     move.l    0(a2),4(a2)
  309.  
  310.     lea    4(a1),a1
  311.     lea    4(a2),a2
  312.  
  313.     move.l    #$ffe1fffe,(a0)+
  314.  
  315. .combine2    move.l    8(a1),d0
  316.     and.l    #$ff000000,d0
  317.     move.l    8(a2),d1
  318.     and.l    #$ff000000,d1
  319.  
  320.     swap    d0
  321.     swap    d1
  322.  
  323.     cmp.l    d0,d1
  324.     beq    .bothfirst2
  325.     blt    .c1first2
  326.     
  327.     move.l    8(a1),(a0)+
  328.     move.l    0(a1),(a0)+    
  329.     move.l    4(a1),(a0)+    
  330.     lea    12(a1),a1
  331.     
  332.     bra    .next2
  333.  
  334. .c1first2    move.l    8(a2),(a0)+
  335.     move.l    0(a2),(a0)+    
  336.     move.l    4(a2),(a0)+    
  337.     lea    12(a2),a2
  338.  
  339.     bra    .next2
  340.  
  341. .bothfirst2
  342.  
  343.     move.l    8(a2),(a0)+
  344.     move.l    0(a2),(a0)+    
  345.     move.l    4(a2),(a0)+    
  346.     move.l    0(a1),(a0)+    
  347.     move.l    4(a1),(a0)+    
  348.  
  349.     lea    12(a1),a1
  350.     lea    12(a2),a2
  351.  
  352.     move.l    (a2),d0
  353.     cmp.l    #$fffffffe,d0
  354.     beq    .xit2
  355.     
  356.     bra    .next2
  357.     
  358. .next2    cmp.l    #$fffffffe,(a1)
  359.     bne    .combine2
  360.  
  361. .xit2
  362.     move.l    #$fffffffe,(a0)+
  363.  
  364.  
  365.     move.l    copper2_ptr,d0
  366.     move.l    copper2_ptr+4,copper2_ptr
  367.     move.l    d0,copper2_ptr+4
  368.     move.l    d0,$dff084
  369.  
  370.     *-------------------------*
  371.  
  372. .exit    rts
  373.  
  374.  
  375. .nextline    add.l    d5,d6
  376.     bcc    .ok
  377.     
  378.     move.l    #$ffe1fffe,(a0)+
  379.     
  380. .ok    rts
  381.  
  382.     *********************************
  383.  
  384. cf_copper:    dc.w    $100,$0200        ; 4 bp - lo res
  385.     dc.w    $104,$a        ; bp control reg
  386.     dc.w    $108,-40        ; bp modulo - odd
  387.     dc.w    $10a,-40        ; bp modulo - even
  388.     dc.w    $180,0        ; colour 0 to black
  389.     dc.w    $102,0
  390.         
  391.     dc.w    $08e,$2c81        ; bp window start left
  392.     dc.w    $090,$2cc1        ; bp window bot right
  393.  
  394.     dc.w    $94,$d0        ; bp stop horz
  395.     dc.w    $92,$38
  396.         
  397.     dc.w    $120,0,$122,0
  398.     dc.w    $124,0,$126,0
  399.     dc.w    $128,0,$12a,0
  400.     dc.w    $12c,0,$12e,0
  401.     dc.w    $130,0,$132,0
  402.     dc.w    $134,0,$136,0
  403.     dc.w    $138,0,$13a,0
  404.     dc.w    $13c,0,$13e,0
  405.                 
  406.     dc.w    $180,$000
  407.     dc.w    $182,$00f
  408.     dc.w    $184,$f00
  409.     dc.w    $186,$f00
  410.  
  411.     dc.w    $1c01,$fffe
  412.     dc.w    $9c,$8010    ; irq set bits - restart copper
  413.                 
  414.     dc.w    $8a,0    ; strobe copper 2                
  415.     dc.w    $ffff,$fffe    ; end of copper list
  416.  
  417. dead_copper:dc.w    $ffff,$fffe    ; end of copper list
  418.  
  419.     
  420.  
  421. fake_copper:dc.w      $e0
  422. temp0_hi:    dc.w    0,$e2
  423. temp0_lo:    dc.w    0,$e0
  424. temp1_hi:    dc.w    0,$e2
  425. temp1_lo:    dc.w    0,$e4
  426. temp2_hi:    dc.w    0,$e6
  427. temp2_lo:    dc.w    0,$e4
  428. temp3_hi:    dc.w    0,$e6
  429. temp3_lo:    dc.w    0
  430.  
  431. copper2_ptr:dc.l    copper_spc1
  432.     dc.l    copper_spc2
  433.     dc.l    copper_spc3
  434.     dc.l    copper_spc4
  435.         
  436. funk_size1:    dc.w    0
  437. funk_size2:    dc.w    0
  438. funk_size3:    dc.w    0
  439. funk_size4:    dc.w    256
  440.  
  441. funk_list:    dc.w    78
  442.     dc.w    76
  443.     dc.w    74
  444.     dc.w    72
  445.     dc.w    70
  446.     dc.w    68
  447.     dc.w    66
  448.     dc.w    64
  449.     dc.w    62
  450.     dc.w    60
  451.     dc.w    58
  452.     dc.w    56
  453.     dc.w    54
  454.     dc.w    52
  455.     dc.w    50
  456.     dc.w    48
  457.     dc.w    46
  458.     dc.w    44
  459.     dc.w    42
  460.     dc.w    40
  461.     dc.w    38
  462.     dc.w    36
  463.     dc.w    34
  464.     dc.w    32
  465.     dc.w    30
  466.     dc.w    28
  467.     dc.w    26
  468.     dc.w    24
  469.     dc.w    22
  470.     dc.w    20
  471.     dc.w    18
  472.     dc.w    16
  473.     dc.w    14
  474.     dc.w    12
  475.     dc.w    10
  476.     dc.w    08
  477.     dc.w    06
  478.     dc.w    04
  479.     dc.w    02
  480.     dc.w    00
  481.  
  482. delay:    dc.w    0        
  483.  
  484. oldint:    dc.l    0
  485. olddma:    dc.l    0
  486. oldv3:    dc.l    0
  487. gfxlib:    dc.b    "graphics.library",0
  488.     even
  489.  
  490. chessbin:    incbin    "dh0:data/joes/data/chessfunk.bin"
  491.  
  492. sintable:    incbin    "dh0:data/misc/sin.maxi"
  493.  
  494. copper_spc1:ds.l    900
  495. copper_spc2:ds.l    900
  496. copper_spc3:ds.l    400
  497. copper_spc4:ds.l    400
  498.  
  499.         
  500.  
  501.     end
  502.     
  503.  
  504.  
  505.                 
  506.  
  507.  
  508.  
  509.