home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Amiga Demo Collection
/
TheAmigaDemoCollectionCDCUE.img
/
S
/
showtime05
/
Bonus
/
BScreen.lha
/
Blitterscreen
/
BScreenInt3.i
< prev
next >
Wrap
Text File
|
1992-12-20
|
2KB
|
102 lines
BScreenCurrentScreen ds.l 1
BScreenCurrentCop dc.w 0
BScreenCopTable ds.l 2 ;Table inizialized in BScreenInit
*** HARDWAREHACK INTERRUPT HANDLER
BScreenInt3
move.l d0,-(sp)
move.w $dff01e,d0
btst.l #6,d0
beq.s .noblit
bsr BScreenBlitInt ;<--- Blitter handling called here
bra.s BScreenInt3End
.noblit btst.l #5,d0
beq.s .novb
bsr.s BScreenVBInt ;<--- BitPlanes pointers set here
bra.s BScreenInt3End
.novb btst.l #4,d0
beq.s .nocop
bsr.s BScreenCopInt ;<--- Call here your Copper int routine
bra.s BScreenInt3End
.nocop
* huh ?
move.w #$0070,$dff09c ;kill all requests to avoid(?) delirium
BScreenInt3End
move.l (sp)+,d0
rte
;****** Handle Vertical Blanking Interrupt *******
BScreenVBInt
move.w #$0020,$dff09c ;clear VB request
movem.l d0-d1/a0-a1,-(sp)
lea.l $dff0e0,a0 ;used here
*--- Set Coplist
lea.l BScreenCopTable(PC),a1 ;table address
move.w BScreenCurrentCop(PC),d0 ;counter
move.l 0(a1,d0.w*4),$080-$0e0(a0) ;right address to register
move.w d0,$088-$0e0(a0) ;restart coplist
addq.w #1,d0 ;counter to next
andi.w #1,d0 ;modulo 2
move.w d0,BScreenCurrentCop ;store
*--- Set planes
move.l BScreenCurrentScreen(PC),d0
move.l #BScreenPlaneSize,d1
move.l d0,(a0)+ ;first and second plane
move.l d0,(a0)+
add.l d1,d0
move.l d0,(a0)+ ;third and fourth
move.l d0,(a0)+
add.l d1,d0
move.l d0,(a0)+ ;fifth and sixth
move.l d0,(a0)+
add.l d1,d0
move.l d0,(a0)+ ;seventh and eighth
move.l d0,(a0)+
*--- All Done
movem.l (sp)+,d0-d1/a0-a1
rts
;******* Handle Copper Interrupt ********
BScreenCopInt
move.w #$0010,$dff09c
rts
;****** Handle Blitter Interrupt ********
BScreenBlitInt
move.w #$0040,$dff09c ;clear blit request
movem.l d0-d1/a5-a6,-(sp)
lea.l $dff000,a5 ;Hardware Base Reg
move.l bltpc(PC),a6 ;Blitter Program Counter
.bltsetreg
move.l (a6)+,d0 ;next istr for blitter
move.w d0,d1 ;copy
beq.s .bltintend ;exit if 0
swap d0
move.w d0,0(a5,d1.w) ;put value in the right register
cmp.w #$5e,d1 ;HSize & start ???
beq.s .bltstarted ;if yes, start
cmp.w #$58,d1 ;Size & Start ???
bne.s .bltsetreg ;if no, put next
* ---
.bltstarted
move.l a6,bltpc ;Store Blitter PC
movem.l (sp)+,d0-d1/a5-a6
rts
.bltintend
clr.w bltbsy ;Blitter free for another screen
movem.l (sp)+,d0-d1/a5-a6
rts