home *** CD-ROM | disk | FTP | other *** search
- Section Demo,Code_C
-
- Opt C-,O+,w-
- opt d+
-
- ; CHESSFUNK, WRITTEN BY SHAGRATT/LSD.
-
- ; how chessfunk works. There is a bitmap in memory, of graduated
- ; squares one pixel high, with the processor you build a copperlist.
- ; the copperlist has a modulo of -40 (repeats the same line)
- ; and just re-sets the bitplane pointers to one of the lines
- ; on the bitmap.
-
-
- Start: lea $dff000,a5 ; hardware base address
-
- Move.w $1c(a5),OldInt ; Save Old Interupts
- Move.w $02(a5),OldDma ; Save Old DMA
-
- Move.w #$7fff,$9a(a5) ; Clear DMA
- Move.w #$7fff,$96(a5) ; Clear Interupts
- Move.w #$7fff,$9c(a5) ; Clear Interupt Requests
-
- Move.b #$7f,$bfed01 ; kill timers (rem me for disk)
- Move.l $6c.w,OldV3 ; save level 3 int
-
- Move.l #cf_level3,$6c.w ; put new copper interupt
- Move.l #cf_copper,$80(a5) ; Address of copper 1
- Move.l #dead_copper,$84(a5) ; Address of copper 1
-
- Move.w #$c010,$9a(a5) ; Start interupts
-
- Move.w #$83ef,$96(a5) ; Start DMA ( 83ff for disk dma)
- Move.w #1,$88(a5) ; Strobe for copper start
-
- move.l #chessbin+(40*0),d0
- move.w d0,temp0_lo
- swap d0
- move.w d0,temp0_hi
- swap d0
-
- add.l #40,d0
- move.w d0,temp1_lo
- swap d0
- move.w d0,temp1_hi
-
- bsr do_funk
-
- wait: btst #6,$bfe001
- bne.s wait ; wait for lmb
-
-
- lea $dff000,a5 ; hardware base address
- move.l #0,$80(a5) ; blank copper list
- move.l #0,$84(a5) ; if gfx lib not open (slayer boot)
- move.w #0,$180(a5) ; bgc to black
-
- Move.l OldV3,$6c.w ; restore old l3
-
- Lea GfxLib,a1 ; Pointer to Library Text
- move.l 4.w,a6
- jsr -132(a6) ; forbid
- Move.l 4.w,a6 ; Exec
- Moveq.l #0,d0 ; Clear D0
- Jsr -$228(a6) ; Open Library
- cmp.l #0,d0
- beq no_gfx_lib ; if gfx lib not open dont restore copper lib (slayer boot)
-
- Move.l d0,a1
- Move.l $26(a1),$80(a5) ; restore copper 1
- Move.l $32(a1),$84(a5) ; restore copper 2
- no_gfx_lib:
-
- Move.w OldInt,d0 ; start old interupts
- Or.w #$8000,d0
- Move.w d0,$9a(a5)
- Move.w OldDma,d0 ; start old DMA
- Or.w #$8000,d0
- Move.w d0,$96(a5)
- Move.b #$9b,$bfed01 ; Start Timers
- Move.l 4.w,a6 ; Close Gfx lib
- Jsr -$19e(a6)
- move.l 4.w,a6
- jsr -138(a6) ; permit
-
- move.w #0,$bfec00 ; clear kbd
-
- Moveq.l #0,d0 ; No errors
- Rts ; Exit
-
-
- cf_level3:
- Movem.l d0-d7/a0-a6,-(a7) ; New copper
- Move.w #$10,$dff09c ; Serviced Interupt
-
- btst #10,$dff016
- beq .Exit
-
- bsr do_funk
-
- ;move.w #$666,$dff180
-
- .Exit Movem.l (a7)+,d0-d7/a0-a6
- Rte ; Return from Interupt
-
- do_funk: *-------------------------*
- lea sintable,a0
- move.w funk_size2,d0
- move.w (a0,d0),d0
- muls #38,d0
- swap d0
- add.w #38/2,d0
- move.w d0,funk_size1
-
- add.w #4,funk_size2
- and.w #$1fe,funk_size2
-
- move.w funk_size4,d0
- move.w (a0,d0),d0
- muls #38,d0
- swap d0
- add.w #38/2,d0
- move.w d0,funk_size3
-
- add.w #4,funk_size4
- and.w #$1fe,funk_size4
-
- move.w funk_size1,d0
- mulu #40*2,d0
- add.l #chessbin,d0
- move.w d0,temp0_lo
- swap d0
- move.w d0,temp0_hi
- swap d0
- add.l #40,d0
- move.w d0,temp1_lo
- swap d0
- move.w d0,temp1_hi
-
- move.w funk_size3,d0
- mulu #40*2,d0
- add.l #chessbin,d0
- move.w d0,temp2_lo
- swap d0
- move.w d0,temp2_hi
- swap d0
- add.l #40,d0
- move.w d0,temp3_lo
- swap d0
- move.w d0,temp3_hi
-
- ************
-
- move.l copper2_ptr+8,a0
-
- lea funk_list,a1
- move.w funk_size1,d0
- asl.w #1,d0
- move.w (a1,d0),d5
- ext.l d5
- asl.l #8,d5
- asl.l #8,d5
- asl.l #8,d5
-
- move.w (a1,d0),d0
- ext.l d0
- asl.l #8,d0
-
- move.l #$2c01fffe,d6
-
- move.w #31,d7
-
- .loop move.l fake_copper+0,(a0)+
- move.l fake_copper+4,(a0)+
-
- bsr .nextline
- move.l d6,(a0)+
-
- move.l fake_copper+8,(a0)+
- move.l fake_copper+12,(a0)+
-
- bsr .nextline
- move.l d6,(a0)+
-
- dbf d7,.loop
-
- move.l #$fffffffe,(a0)+
-
- ************
-
- move.l copper2_ptr+12,a0
-
- lea funk_list,a1
- move.w funk_size3,d0
- asl.w #1,d0
- move.w (a1,d0),d5
- ext.l d5
- asl.l #8,d5
- asl.l #8,d5
- asl.l #8,d5
-
- move.w (a1,d0),d0
- ext.l d0
- asl.l #8,d0
-
- move.l #$2c01fffe,d6
-
- move.w #31,d7
-
- .loop2 move.l fake_copper+16,(a0)+
- move.l fake_copper+20,(a0)+
-
- bsr .nextline
- move.l d6,(a0)+
-
- move.l fake_copper+24,(a0)+
- move.l fake_copper+28,(a0)+
-
- bsr .nextline
- move.l d6,(a0)+
-
- dbf d7,.loop2
-
- move.l #$fffffffe,(a0)+
-
- *********
-
- move.l copper2_ptr+0,a0
- move.l copper2_ptr+8,a1
- move.l copper2_ptr+12,a2
-
- move.l #$01002200,(a0)+
-
- move.l 12(a2),(a0)+
- move.l 16(a2),(a0)+
- move.l 12(a1),(a0)+
- move.l 16(a1),(a0)+
-
- move.l #$2c01fffe,(a0)+
-
- .combine move.l 8(a1),d0
- and.l #$ff000000,d0
- move.l 8(a2),d1
- and.l #$ff000000,d1
-
- swap d0
- swap d1
-
- cmp.l d0,d1
- beq .bothfirst
- blt .c1first
-
- move.l 8(a1),(a0)+
- move.l 0(a1),(a0)+
- move.l 4(a1),(a0)+
- lea 12(a1),a1
-
- bra .next
-
- .c1first move.l 8(a2),(a0)+
- move.l 0(a2),(a0)+
- move.l 4(a2),(a0)+
- lea 12(a2),a2
-
- bra .next
-
- .bothfirst
-
- cmp.l #$ffe1fffe,8(a2)
- beq .xit1
-
- move.l 8(a1),(a0)+
-
- move.l 0(a2),(a0)+
- move.l 4(a2),(a0)+
- move.l 0(a1),(a0)+
- move.l 4(a1),(a0)+
-
- lea 12(a1),a1
- lea 12(a2),a2
-
- bra .next
-
- .next cmp.l #$ffe1fffe,(a1)
- bne .combine
-
- .xit1 cmp.l #$ffe1fffe,8(a1)
- beq .c1fin
-
- move.l 8(a1),(a0)+
- move.l 0(a1),(a0)+
- move.l 4(a1),(a0)+
- lea 12(a1),a1
- bra .xit1
-
- .c1fin cmp.l #$ffe1fffe,8(a2)
- beq .c2fin
-
- move.l 8(a2),(a0)+
- move.l 0(a2),(a0)+
- move.l 4(a2),(a0)+
- lea 12(a2),a2
- bra .xit1
-
- .c2fin move.l 4(a1),8(a1)
- move.l 0(a1),4(a1)
- move.l 4(a2),8(a2)
- move.l 0(a2),4(a2)
-
- lea 4(a1),a1
- lea 4(a2),a2
-
- move.l #$ffe1fffe,(a0)+
-
- .combine2 move.l 8(a1),d0
- and.l #$ff000000,d0
- move.l 8(a2),d1
- and.l #$ff000000,d1
-
- swap d0
- swap d1
-
- cmp.l d0,d1
- beq .bothfirst2
- blt .c1first2
-
- move.l 8(a1),(a0)+
- move.l 0(a1),(a0)+
- move.l 4(a1),(a0)+
- lea 12(a1),a1
-
- bra .next2
-
- .c1first2 move.l 8(a2),(a0)+
- move.l 0(a2),(a0)+
- move.l 4(a2),(a0)+
- lea 12(a2),a2
-
- bra .next2
-
- .bothfirst2
-
- move.l 8(a2),(a0)+
- move.l 0(a2),(a0)+
- move.l 4(a2),(a0)+
- move.l 0(a1),(a0)+
- move.l 4(a1),(a0)+
-
- lea 12(a1),a1
- lea 12(a2),a2
-
- move.l (a2),d0
- cmp.l #$fffffffe,d0
- beq .xit2
-
- bra .next2
-
- .next2 cmp.l #$fffffffe,(a1)
- bne .combine2
-
- .xit2
- move.l #$fffffffe,(a0)+
-
-
- move.l copper2_ptr,d0
- move.l copper2_ptr+4,copper2_ptr
- move.l d0,copper2_ptr+4
- move.l d0,$dff084
-
- *-------------------------*
-
- .exit rts
-
-
- .nextline add.l d5,d6
- bcc .ok
-
- move.l #$ffe1fffe,(a0)+
-
- .ok rts
-
- *********************************
-
- cf_copper: dc.w $100,$0200 ; 4 bp - lo res
- dc.w $104,$a ; bp control reg
- dc.w $108,-40 ; bp modulo - odd
- dc.w $10a,-40 ; bp modulo - even
- dc.w $180,0 ; colour 0 to black
- dc.w $102,0
-
- dc.w $08e,$2c81 ; bp window start left
- dc.w $090,$2cc1 ; bp window bot right
-
- dc.w $94,$d0 ; bp stop horz
- dc.w $92,$38
-
- dc.w $120,0,$122,0
- dc.w $124,0,$126,0
- dc.w $128,0,$12a,0
- dc.w $12c,0,$12e,0
- dc.w $130,0,$132,0
- dc.w $134,0,$136,0
- dc.w $138,0,$13a,0
- dc.w $13c,0,$13e,0
-
- dc.w $180,$000
- dc.w $182,$00f
- dc.w $184,$f00
- dc.w $186,$f00
-
- dc.w $1c01,$fffe
- dc.w $9c,$8010 ; irq set bits - restart copper
-
- dc.w $8a,0 ; strobe copper 2
- dc.w $ffff,$fffe ; end of copper list
-
- dead_copper:dc.w $ffff,$fffe ; end of copper list
-
-
-
- fake_copper:dc.w $e0
- temp0_hi: dc.w 0,$e2
- temp0_lo: dc.w 0,$e0
- temp1_hi: dc.w 0,$e2
- temp1_lo: dc.w 0,$e4
- temp2_hi: dc.w 0,$e6
- temp2_lo: dc.w 0,$e4
- temp3_hi: dc.w 0,$e6
- temp3_lo: dc.w 0
-
- copper2_ptr:dc.l copper_spc1
- dc.l copper_spc2
- dc.l copper_spc3
- dc.l copper_spc4
-
- funk_size1: dc.w 0
- funk_size2: dc.w 0
- funk_size3: dc.w 0
- funk_size4: dc.w 256
-
- funk_list: dc.w 78
- dc.w 76
- dc.w 74
- dc.w 72
- dc.w 70
- dc.w 68
- dc.w 66
- dc.w 64
- dc.w 62
- dc.w 60
- dc.w 58
- dc.w 56
- dc.w 54
- dc.w 52
- dc.w 50
- dc.w 48
- dc.w 46
- dc.w 44
- dc.w 42
- dc.w 40
- dc.w 38
- dc.w 36
- dc.w 34
- dc.w 32
- dc.w 30
- dc.w 28
- dc.w 26
- dc.w 24
- dc.w 22
- dc.w 20
- dc.w 18
- dc.w 16
- dc.w 14
- dc.w 12
- dc.w 10
- dc.w 08
- dc.w 06
- dc.w 04
- dc.w 02
- dc.w 00
-
- delay: dc.w 0
-
- oldint: dc.l 0
- olddma: dc.l 0
- oldv3: dc.l 0
- gfxlib: dc.b "graphics.library",0
- even
-
- chessbin: incbin "dh0:data/joes/data/chessfunk.bin"
-
- sintable: incbin "dh0:data/misc/sin.maxi"
-
- copper_spc1:ds.l 900
- copper_spc2:ds.l 900
- copper_spc3:ds.l 400
- copper_spc4:ds.l 400
-
-
-
- end
-
-
-
-
-
-
-
-